/* munibase-admin-scope.css
 * -----------------------------------------------------------------
 * Munibase.Admin SCOPE LAYER -- density + layout variants.
 * MudBlazor-free: this file contains ZERO .mud-* selectors.
 *
 * Munibase.Admin and Munibase.Web share one component library. Web is
 * a civic-paperwork surface read by citizens at arm's length; Admin is
 * an operator console read at a desk, where one module carries 25
 * settings. The same control sizes cannot serve both.
 *
 * This file does NOT fork the components. It scopes them.
 *
 * Load order (Admin host head):
 *   1. fonts (Typekit + Google Fonts)
 *   2. munibase-tokens.css       <- PALETTE. Required. See its header.
 *   3. muni-components.css       <- shared .muni-* base, unchanged
 *   4. munibase-civic.css        <- shared civic surfaces, unchanged
 *   5. munibase-admin.css        <- existing 34 KB, unchanged
 *   6. munibase-admin-scope.css  <- THIS FILE, Admin host only
 *
 * NB: NOT to be confused with the existing 34 KB
 * src/Munibase.Admin.Web/wwwroot/css/munibase-admin.css already in the
 * repo. Different file. Deploy alongside it, never over it.
 *
 * Conventions:
 *   - Every selector is prefixed with `.munibase-admin`, applied ONCE
 *     on the AdminMainLayout root. Nothing here can reach Munibase.Web.
 *   - Every selector targets a BEM class read from Munibase.UI source:
 *     MuniPill, MuniSwitch, MuniSaveBar, MuniSecretField, MuniLedger,
 *     MuniFormField, MuniFieldGroup, MuniSection, MuniSubTabs,
 *     MuniNoticeBanner, MuniDrawer. The ONLY button modifiers the
 *     library emits are --civic, --civic-ghost and --civic-danger;
 *     size/primary/ink/unavailable are .munibase-admin-btn--* and
 *     flagged NEW, as is .muni-form-field--dirty.
 *   - No hard-coded hex. Colour comes from the --muni-* palette
 *     tokens in munibase-tokens.css.
 *   - Admin-only components (no Web counterpart) use the
 *     .munibase-admin-* prefix rather than a --admin modifier.
 * -----------------------------------------------------------------
 */

/* --- SCOPE ROOT + DENSITY TOKENS ------------------------------- */
/* Applied on AdminMainLayout: <MudLayout Class="... munibase-admin"> */
.munibase-admin {
  /* Geometry */
  --muni-admin-gutter: 22px;
  --muni-admin-stack: 10px;
  --muni-admin-row-y: 8px;
  --muni-admin-row-x: 12px;
  /* Table cells run 2px looser than ledger/log rows -- they carry
     mixed serif+mono content and read tight at the row tokens. */
  --muni-admin-cell-y: 10px;
  --muni-admin-cell-x: 14px;
  --muni-admin-panel-y: 12px;
  --muni-admin-panel-x: 14px;
  --muni-admin-ctl-h: 28px;
  --muni-admin-ctl-h-sm: 22px;
  --muni-admin-ctl-px: 11px;
  --muni-admin-field-gap: 11px;
  --muni-admin-col-gap: 18px;

  /* Type ramp -- one to two steps below Web. 8.5px is the floor. */
  --muni-admin-fs-label: 8.5px;
  --muni-admin-fs-caption: 9.5px;
  --muni-admin-fs-ctl: 9.5px;
  --muni-admin-fs-value: 11.5px;
  --muni-admin-fs-body: 12.5px;
  --muni-admin-fs-title: 17px;
  --muni-admin-fs-crown: 27px;
  --muni-admin-ls-caps: 1.4px;

  /* Rails and overlays */
  --muni-admin-rail-w: 242px;
  --muni-admin-drawer-w: 440px;  /* passed as MuniDrawer DefaultWidth, not CSS */
  --muni-admin-commit-h: 44px;
}

/* ===============================================================
   SCOPED VARIANTS OF SHARED MUNI COMPONENTS
   Density only. Structure, colour and semantics stay with the Web
   component. Class names verified against Munibase.UI source.

   Scoped under .munibase-admin rather than the bare
   .munibase-admin root: the density ramp is written for the
   configuration surface, and the Admin shell's other seven routed
   pages have not been re-reviewed at these sizes. Widen the scope
   deliberately, one surface at a time.
   =============================================================== */

.munibase-admin .munibase-admin {
  font-size: var(--muni-admin-fs-body);
  /* Admin never paints the paper noise -- it reads as a console, not a
     document, and the texture fights dense mono rows. */
  background-image: none;
}

/* --- BUTTONS - .muni-btn--civic -------------------------------- */
/* MuniButton emits this family; MuniDrawer / MuniSaveBar / MuniSecretField
   each hand-roll their own skin, so all four are targeted here.

   EVERY DECLARATION HERE NEEDS !important, and so do the .muni-input--civic
   and .muni-ledger-table blocks below. The shared base rules for those three
   families were written to beat MudBlazor and set every property !important
   themselves, so selector specificity does nothing against them -- a scoped
   rule without !important is silently inert and the control keeps its Web
   size. The other families this file scopes carry no !important and are
   overridden on specificity alone. */
.munibase-admin .muni-btn--civic,
.munibase-admin .muni-btn--civic-ghost,
.munibase-admin .muni-btn--civic-danger,
.munibase-admin .muni-savebar__btn,
.munibase-admin .muni-secret__btn,
.munibase-admin .muni-section__edit-cancel,
.munibase-admin .muni-section__edit-save {
  min-height: var(--muni-admin-ctl-h) !important;
  padding: 6px var(--muni-admin-ctl-px) !important;
  font-family: var(--muni-mono) !important;
  font-size: var(--muni-admin-fs-ctl) !important;
  font-weight: 700 !important;
  letter-spacing: 1.1px !important;
  text-transform: uppercase !important;
  border-radius: 1px !important;
  white-space: nowrap !important;
}
/* NEW - no size modifier ships. Admin-prefixed. */
.munibase-admin .munibase-admin-btn--sm {
  min-height: var(--muni-admin-ctl-h-sm) !important;
  padding: 4px 7px !important;
  font-size: var(--muni-admin-fs-label) !important;
}
/* Row-level actions must not add row height. */
.munibase-admin .muni-ledger-table .munibase-admin-btn--sm { margin: -2px 0 !important; }
/* An action with no code path behind it is never a live button. */
/* NEW - Admin-prefixed. */
.munibase-admin .munibase-admin-btn--unavailable {
  color: var(--muni-ink-mute) !important;
  border-color: var(--muni-rule) !important;
  border-style: dashed !important;
  cursor: not-allowed !important;
}

/* --- FIELDS - .muni-form-field --------------------------------- */
/* MuniFormField wraps a label head + arbitrary child input. It emits
   __head / __required / __hint -- there is no __label or __input. */
.munibase-admin .muni-form-field { margin-bottom: var(--muni-admin-field-gap); }
.munibase-admin .muni-form-field__head {
  display: block;
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  font-weight: 700;
  letter-spacing: var(--muni-admin-ls-caps);
  text-transform: uppercase;
  color: var(--muni-ink-mute);
  margin-bottom: 3px;
}
.munibase-admin .muni-input--civic,
.munibase-admin textarea.muni-input--civic {
  width: 100% !important;
  min-height: var(--muni-admin-ctl-h) !important;
  padding: 6px 8px !important;
  font-family: var(--muni-mono) !important;
  font-size: var(--muni-admin-fs-value) !important;
  letter-spacing: .3px !important;
  border: 1px solid var(--muni-rule) !important;
  border-radius: 1px !important;
  background: var(--muni-paper) !important;
  color: var(--muni-ink) !important;
}
.munibase-admin textarea.muni-input--civic {
  line-height: 1.5 !important;
  resize: vertical !important;
}
/* Helper is a serif aside, capped at two lines. Uncapped two-line
   helpers on every field are what made the production form endless. */
.munibase-admin .muni-form-field__hint {
  font-family: var(--muni-serif);
  font-style: italic;
  font-size: 11.5px;
  line-height: 1.45;
  margin-top: 3px;
  color: var(--muni-ink-mute);
  /* MuniFormField nests __hint INSIDE __head, so it inherits the
     label's caps treatment unless explicitly reset. Without these
     three the hint renders uppercase, tracked, bold and truncated. */
  text-transform: none;
  letter-spacing: normal;
  font-weight: 400;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* Unsaved field -- brass rule on the leading edge. Pairs with the
   commit bar's named list; never colour alone. */
/* --dirty is a NEW modifier; MuniFormField has no dirty state today. */
/* !important for the same reason as the base input block above. */
.munibase-admin .muni-form-field--dirty .muni-input--civic,
.munibase-admin .muni-form-field--dirty .muni-secret__value {
  border-color: var(--muni-accent) !important;
  box-shadow: inset 3px 0 0 var(--muni-accent) !important;
}

/* Admin forms are two- and three-column. Web is single by policy.
   NEW: MuniFieldGroup is a bordered legend group, not a grid, so there
   is no shipped class for this. Admin-prefixed accordingly. */
.munibase-admin-fieldgrid--2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 var(--muni-admin-col-gap); }
.munibase-admin-fieldgrid--3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 16px; }
@media (max-width: 900px) {
  .munibase-admin-fieldgrid--2,
  .munibase-admin-fieldgrid--3 { grid-template-columns: 1fr; }
}

/* --- TABLES - .muni-ledger-table ------------------------------- */
.munibase-admin .muni-ledger-table { width: 100% !important; border-collapse: collapse !important; }
.munibase-admin .muni-ledger-table thead th {
  padding: 9px var(--muni-admin-cell-x) !important;
  font-family: var(--muni-mono) !important;
  font-size: var(--muni-admin-fs-label) !important;
  font-weight: 700 !important;
  letter-spacing: 1.5px !important;
  text-transform: uppercase !important;
  color: var(--muni-ink-mute) !important;
  text-align: left !important;
  border-bottom: 1px solid var(--muni-ink) !important;
}
.munibase-admin .muni-ledger-table tbody td {
  padding: var(--muni-admin-cell-y) var(--muni-admin-cell-x) !important;
  font-size: var(--muni-admin-fs-body) !important;
  /* Row height is driven by leading, not padding. Without this the
     serif name cell inherits 1.6 and the row inflates past Web's. */
  line-height: 1.35 !important;
  vertical-align: middle !important;
  border-bottom: 1px dashed var(--muni-rule-soft) !important;
}
.munibase-admin .muni-ledger-table tbody tr:last-child td { border-bottom: 0 !important; }
/* Row lands at ~41px vs Web's ~47px. Actions always rightmost. */

/* --- GROUPS - .muni-fieldgroup --------------------------------- */
/* There is NO MuniPanel component. Cordoned groups are MuniFieldGroup
   (bordered legend) or MuniSection with Bordered=true. */
.munibase-admin .muni-fieldgroup__body,
.munibase-admin .muni-section--bordered .muni-section__body {
  padding: var(--muni-admin-panel-y) var(--muni-admin-panel-x);
}
.munibase-admin .muni-fieldgroup { margin-bottom: var(--muni-admin-stack); }
.munibase-admin .muni-fieldgroup__legend {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-family: var(--muni-mono);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 1.6px;
  text-transform: uppercase;
  color: var(--muni-ink-mute);
  padding-bottom: 6px;
  margin-bottom: var(--muni-admin-stack);
  border-bottom: 1px solid var(--muni-rule-soft);
}

/* --- SECTION - .muni-section ----------------------------------- */
.munibase-admin .muni-section__legend {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  border-bottom: 1px solid var(--muni-ink);
  padding-bottom: 7px;
  margin-bottom: var(--muni-admin-stack);
}
.munibase-admin .muni-section__tag {
  font-family: var(--muni-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: var(--muni-admin-ls-caps);
  color: var(--muni-ink-mute);
}
.munibase-admin .muni-section__title {
  font-family: var(--muni-serif);
  font-size: var(--muni-admin-fs-title);
  font-weight: 600;
  /* The base sets mono / 10px / 2px tracking / uppercase. Overriding the
     face without also resetting the caps treatment renders a shouted serif. */
  letter-spacing: -.2px;
  text-transform: none;
}
/* MuniSection's markup is `&sect; @Tag`, with a literal space. The section
   mark reads as one unit -- close the gap here rather than change shared
   markup that Web renders differently on purpose. */
.munibase-admin .muni-section__tag { word-spacing: -0.3em; }
/* Right-hand meta on the legend: state census, scope, counts. */
.munibase-admin .muni-section__meta,
.munibase-admin .muni-section__count {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  font-weight: 700;
  letter-spacing: 1.4px;
  text-transform: uppercase;
  color: var(--muni-ink-mute);
}

/* --- PILLS - .muni-tone-pill ----------------------------------- */
.munibase-admin .muni-tone-pill {
  height: auto;
  padding: 3px 8px;
  font-size: 9px;
  letter-spacing: 1.2px;
  border-radius: 0;
}

/* --- TABS - .muni-subtabs -------------------------------------- */
/* The count rides the label as muted text. A bordered chip reads as a
   separate control and competes with the tab it belongs to. */
.munibase-admin .muni-subtabs__count {
  font-size: var(--muni-admin-fs-label);
  border: 0;
  background: none;
  padding: 0;
  margin-left: 5px;
  opacity: .7;
  color: inherit;
}
.munibase-admin .muni-subtabs__tab {
  min-height: 0;
  padding: 11px 16px;
  font-family: var(--muni-mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 1.5px;
  text-transform: uppercase;
}

/* --- SWITCH - .muni-switch ------------------------------------- */
/* Shipped MuniSwitch is a 44x22 track with an 18px square knob.
   Admin passes Dense="true" for the 26x14 variant. */
.munibase-admin .muni-switch--dense .muni-switch__track { width: 26px; height: 14px; }
.munibase-admin .muni-switch--dense .muni-switch__knob { width: 10px; height: 10px; }
.munibase-admin .muni-switch--dense.muni-switch--on .muni-switch__knob { transform: translateX(12px); }
.munibase-admin .muni-switch--dense .muni-switch__label { font-size: var(--muni-admin-fs-body); }
.munibase-admin .muni-switch--dense .muni-switch__help { font-size: 11.5px; }
/* A switch that gates other fields must render them inert. */
.munibase-admin .muni-form-field--gated { opacity: .5; pointer-events: none; }

/* --- DRAWER - .muni-drawer ------------------------------------- */
/* Do NOT set width here. MuniDrawer owns its width via DefaultWidth
   (760) / MinWidth (480) / MaxWidth (1200), writes an inline
   style="width:Npx", supports drag-to-resize and persists the result
   to localStorage per StorageKey. A CSS width would fight it.
   Admin passes DefaultWidth="440" instead. */
.munibase-admin .muni-drawer__header { padding: 14px 18px; }
.munibase-admin .muni-drawer__title { font-size: var(--muni-admin-fs-title); }
.munibase-admin .muni-drawer__eyebrow {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  font-weight: 700;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--muni-ink-mute);
}

/* --- NOTICE BANNER - .muni-notice-banner ----------------------- */
/* Variants are Default - Success - Caution - Audit. There is no
   --error; a fault uses --caution. */
.munibase-admin .muni-notice-banner {
  padding: 10px 13px;
  font-size: var(--muni-admin-fs-body);
}
.munibase-admin .muni-notice-banner__message { line-height: 1.45; }
.munibase-admin .muni-notice-banner__eyebrow {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  font-weight: 700;
  letter-spacing: var(--muni-admin-ls-caps);
  text-transform: uppercase;
}
.munibase-admin .muni-notice-banner--compact { padding: 6px 10px; }

/* --- SECRETS - .muni-secret ------------------------------------ */
.munibase-admin .muni-secret__value {
  font-family: var(--muni-mono);
  font-size: 11px;
  letter-spacing: 1px;
  min-height: var(--muni-admin-ctl-h);
  padding: 6px 8px;
}
.munibase-admin .muni-secret__rotated,
.munibase-admin .muni-secret__helper {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  letter-spacing: .4px;
  color: var(--muni-accent);
}
.munibase-admin .muni-secret__rotated--stale { color: var(--muni-stamp); }

/* --- SAVE BAR - .muni-savebar, pinned variant ------------------ */
/* MuniSaveBar ships as a per-form footer. Admin needs exactly ONE per
   SURFACE: sticky, hidden when clean, naming the changed fields.
   Same visual language, opposite cardinality. */
.munibase-admin .muni-savebar--pinned {
  position: sticky;
  bottom: 0;
  z-index: 3;
  min-height: var(--muni-admin-commit-h);
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 11px var(--muni-admin-gutter);
  background: var(--muni-ink);
  color: var(--muni-paper);
  font-family: var(--muni-mono);
  font-size: 10px;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}
.munibase-admin .muni-savebar--pinned[hidden] { display: none; }
.munibase-admin .muni-savebar--pinned .muni-savebar__count {
  flex: none;
  background: var(--muni-accent);
  color: #fff;
  padding: 3px 8px;
  font-weight: 700;
}
/* The changed list names fields rather than counting them, so it must
   be allowed to run long -- but it truncates. A commit bar that grows
   to seven lines stops being a bar. Full list behind Review diff. */
.munibase-admin .muni-savebar--pinned .muni-savebar__changed {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.munibase-admin .muni-savebar--pinned .muni-savebar__spacer { flex: 1; }
.munibase-admin .muni-savebar--pinned .muni-savebar__actions { display: flex; gap: 8px; flex: none; }
.munibase-admin .muni-savebar--pinned .muni-savebar__btn {
  background: transparent;
  border: 1px solid var(--muni-paper);
  color: var(--muni-paper);
  cursor: pointer;
}
.munibase-admin .muni-savebar--pinned .muni-savebar__btn--primary {
  background: var(--muni-paper);
  color: var(--muni-ink);
}
.munibase-admin .muni-savebar--pinned .muni-savebar__btn:disabled { opacity: .45; cursor: not-allowed; }

/* ===============================================================
   ADMIN-ONLY COMPONENTS
   No Web counterpart, so prefixed rather than modified.
   =============================================================== */

/* --- CREDENTIAL GROUP ------------------------------------------ */
/* A container around several .muni-secret fields. Secrets never
   render as ordinary inputs, and never sit inline between cosmetic
   preferences. Rotation age is on the face; reveal is audited. */
.munibase-admin-keyring {
  border: 1px solid var(--muni-accent);
  background: var(--muni-accent-soft);
  padding: 10px 12px;
}
.munibase-admin-keyring__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-family: var(--muni-mono);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: var(--muni-admin-ls-caps);
  text-transform: uppercase;
  color: var(--muni-accent);
  margin-bottom: 8px;
}
.munibase-admin-keyring__key {
  display: grid;
  grid-template-columns: 150px 1fr auto;
  gap: 10px;
  align-items: center;
  padding: 5px 0;
  border-top: 1px dashed var(--muni-accent);
}
.munibase-admin-keyring__key:first-of-type { border-top: 0; }
.munibase-admin-keyring__name {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  font-weight: 700;
  letter-spacing: .8px;
  text-transform: uppercase;
}
/* Rotation age is on the face, always -- it is the third grid column,
   so it never collapses under the value. */
.munibase-admin-keyring__age {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  letter-spacing: .4px;
  color: var(--muni-accent);
  white-space: nowrap;
}
.munibase-admin-keyring__age--stale { color: var(--muni-stamp); font-weight: 700; }
.munibase-admin-keyring__age--unset { color: var(--muni-ink-mute); font-style: italic; }
@media (max-width: 900px) {
  .munibase-admin-keyring__key { grid-template-columns: 1fr; }
}

/* --- COMPONENT HEALTH STRIP ------------------------------------ */
/* One chip per component. The roster is fixed at three by
   ComponentLifecycleService: community - munibot - discord-bot.
   Only a component in Degraded or Stopped earns an
   expanded card below. States are the ComponentState enum verbatim:
   Running - Degraded - Paused - Pending - Stopped. */
.munibase-admin-health { display: flex; flex-wrap: wrap; gap: 6px; }
.munibase-admin-health__svc {
  display: flex;
  align-items: center;
  gap: 7px;
  border: 1px solid var(--muni-rule);
  padding: 6px 10px;
  font-family: var(--muni-mono);
  font-size: 10.5px;
  background: none;
  color: inherit;
  cursor: pointer;
  text-align: left;
}
.munibase-admin-health__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--muni-primary); flex: none; }
.munibase-admin-health__meta { color: var(--muni-ink-mute); font-size: 9px; }
.munibase-admin-health__svc--degraded { border-color: var(--muni-stamp); background: var(--muni-stamp-soft); }
.munibase-admin-health__svc--degraded .munibase-admin-health__dot { background: var(--muni-stamp); }
.munibase-admin-health__svc--paused { border-color: var(--muni-accent); background: var(--muni-accent-soft); }
.munibase-admin-health__svc--paused .munibase-admin-health__dot { background: var(--muni-accent); }
.munibase-admin-health__svc--pending { border-style: dotted; }
.munibase-admin-health__svc--pending .munibase-admin-health__dot { background: var(--muni-ink-mute); }
/* Stopped = provisioned but no deployment in K8s (add-on disabled at
   the chart level). Dashed border at FULL ink -- never opacity, which
   drops the label below 3:1. */
.munibase-admin-health__svc--stopped { border-style: dashed; }
.munibase-admin-health__svc--stopped .munibase-admin-health__dot { background: var(--muni-ink-mute); }
.munibase-admin-health__svc--selected { outline: 2px solid var(--muni-ink); outline-offset: 1px; }

/* --- LOG TAIL -------------------------------------------------- */
.munibase-admin-log {
  border: 1px solid var(--muni-rule);
  background: var(--muni-paper);
  max-height: 320px;
  overflow-y: auto;
}
.munibase-admin-log__line {
  display: grid;
  grid-template-columns: 78px 54px 76px 1fr;
  gap: 9px;
  align-items: baseline;
  padding: 4px var(--muni-admin-row-x);
  border-bottom: 1px dashed var(--muni-rule-soft);
  font-family: var(--muni-mono);
  font-size: 10.5px;
}
.munibase-admin-log__line:last-child { border-bottom: 0; }
.munibase-admin-log__sev {
  font-size: var(--muni-admin-fs-label);
  font-weight: 700;
  letter-spacing: 1.1px;
  text-align: center;
  padding: 1px 4px;
  border: 1px solid transparent;
  text-transform: uppercase;
}
.munibase-admin-log__sev--error,
.munibase-admin-log__sev--alert { color: var(--muni-stamp); border-color: var(--muni-stamp); background: var(--muni-stamp-soft); }
.munibase-admin-log__sev--warn { color: var(--muni-accent); border-color: var(--muni-accent); background: var(--muni-accent-soft); }
.munibase-admin-log__sev--info,
.munibase-admin-log__sev--debug { color: var(--muni-ink-mute); }
.munibase-admin-log__svc {
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  color: var(--muni-ink);
  cursor: pointer;
  text-align: left;
  text-decoration: underline;
  text-underline-offset: 2px;
}
/* Message ellipsises to one line -- a log that reflows is unscannable. */
.munibase-admin-log__msg { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--muni-ink-mute); }
.munibase-admin-log__empty {
  font-family: var(--muni-mono);
  font-size: 10.5px;
  color: var(--muni-ink-mute);
  padding: 14px var(--muni-admin-row-x);
}

/* --- PERMISSION MARKER ----------------------------------------- */
/* Staff-only rows stay visible to owners but read-only. Never hide a
   setting whose effects the owner can see in-world. */
.munibase-admin .munibase-admin-staff {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  font-weight: 700;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--muni-stamp);
  border: 1px solid var(--muni-stamp);
  padding: 1px 4px;
  vertical-align: middle;
}
.munibase-admin [data-staff-locked="true"] { opacity: .55; pointer-events: none; }

/* ===============================================================
   PAGE COMPOSITION -- community configuration
   The companion scope file covers component density. These rules are
   the page-level composition the handoff specifies but no shipped
   class family covers: the crown, the plan strip, the capability
   matrix and its expansion row.
   =============================================================== */

/* --- CROWN ----------------------------------------------------- */
.munibase-admin-crown {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 16px;
  padding: 4px 0 12px;
  border-bottom: 1px solid var(--muni-ink);
}
.munibase-admin-crown__eyebrow {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  font-weight: 700;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--muni-ink-mute);
}
.munibase-admin-crown__title {
  font-family: var(--muni-serif);
  font-size: var(--muni-admin-fs-crown);
  font-weight: 600;
  letter-spacing: -.5px;
  margin: 2px 0 4px;
}
.munibase-admin-crown__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  font-family: var(--muni-mono);
  font-size: 10px;
  color: var(--muni-ink-mute);
}
.munibase-admin-crown__meta .sep { opacity: .5; }
/* The label words are scaffolding; the values are what is being read. */
.munibase-admin-crown__meta b { color: var(--muni-ink); font-weight: 700; }
.munibase-admin-crown__meta .muni-tone-pill { margin-left: 2px; }
/* The qualifier on the build. Ochre ink rather than an ochre field: the crown is a
   line of facts, and a filled chip here would outweigh the status pill beside it. */
.munibase-admin-crown__qualifier { color: var(--muni-accent); font-weight: 700; }
.munibase-admin-crown__actions { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; flex-shrink: 0; }

/* --- PLAN STRIP - five cells ----------------------------------- */
/* Four cells, not five: the Monthly cell was removed with the placeholder
   pricing it rendered. */
.munibase-admin-plan {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--muni-rule);
  border: 1px solid var(--muni-rule);
  margin: 14px 0 18px;
}
.munibase-admin-plan__cell {
  background: var(--muni-paper);
  padding: 11px 13px;
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}
.munibase-admin-plan__cell--actions { justify-content: center; gap: 6px; }
.munibase-admin-plan__label {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  letter-spacing: var(--muni-admin-ls-caps);
  text-transform: uppercase;
  color: var(--muni-ink-mute);
}
.munibase-admin-plan__value {
  font-family: var(--muni-serif);
  font-size: 20px;
  line-height: 1.15;
  color: var(--muni-ink);
}
.munibase-admin-plan__value--mono { font-family: var(--muni-mono); font-size: 16px; }
.munibase-admin-plan__sub {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  color: var(--muni-ink-mute);
  overflow: hidden;
  text-overflow: ellipsis;
}
@media (max-width: 1100px) {
  .munibase-admin-plan { grid-template-columns: repeat(2, 1fr); }
}

/* --- CAPABILITY MATRIX ----------------------------------------- */
/* Column widths per the handoff: 250 / 140 / 170 / 1fr / 110. */
.munibase-admin-matrix { table-layout: fixed; }
.munibase-admin-matrix col.c-name { width: 250px; }
.munibase-admin-matrix col.c-tier { width: 140px; }
.munibase-admin-matrix col.c-state { width: 170px; }
.munibase-admin-matrix col.c-config { width: auto; }
.munibase-admin-matrix col.c-action { width: 110px; }

.munibase-admin-matrix__name {
  font-family: var(--muni-serif);
  font-weight: 600;
  color: var(--muni-ink);
}
.munibase-admin-matrix__row--off .munibase-admin-matrix__name { font-weight: 400; color: var(--muni-ink-soft); }
.munibase-admin-matrix__tier {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  letter-spacing: 1px;
  color: var(--muni-ink-mute);
}
.munibase-admin-matrix__state { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.munibase-admin-matrix__config {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  color: var(--muni-ink-mute);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.munibase-admin-matrix__action { text-align: right; }
.munibase-admin-matrix__dash { color: var(--muni-ink-mute); }
/* The open row takes paper-soft so the expansion below reads as its
   continuation rather than as a sibling row. */
.munibase-admin-matrix__row--open > td { background: var(--muni-paper-soft); }

/* --- MODULE EXPANSION ------------------------------------------ */
/* A sibling <tr><td colspan="5"> directly below its capability row,
   with a 3px ink left rule so the association is unambiguous. */
.munibase-admin-matrix__expansion > td {
  background: var(--muni-paper-soft);
  border-left: 3px solid var(--muni-ink);
  padding: var(--muni-admin-panel-y) var(--muni-admin-panel-x) 16px;
}
.munibase-admin-expansion__panels { display: grid; grid-template-columns: 1fr 1fr; gap: var(--muni-admin-col-gap); align-items: start; }
.munibase-admin-expansion__panels > .munibase-admin-expansion--full { grid-column: 1 / -1; }
@media (max-width: 1000px) {
  .munibase-admin-expansion__panels { grid-template-columns: 1fr; }
}

/* --- ALERTS TABLE ---------------------------------------------- */
/* Discord's five alert routes were five identical toggle-plus-URL
   pairs. As one table each row is a route, not a section. */
.munibase-admin-alerts { width: 100%; border-collapse: collapse; table-layout: fixed; }
.munibase-admin-alerts col.c-on { width: 40px; }
.munibase-admin-alerts col.c-event { width: 92px; }
.munibase-admin-alerts col.c-url { width: auto; }
.munibase-admin-alerts col.c-delivery { width: 78px; }
.munibase-admin-alerts th {
  padding: 5px 8px;
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  font-weight: 700;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--muni-ink-mute);
  text-align: left;
  border-bottom: 1px solid var(--muni-ink);
}
.munibase-admin-alerts td {
  padding: 5px 8px;
  border-bottom: 1px dashed var(--muni-rule-soft);
  vertical-align: middle;
  font-size: var(--muni-admin-fs-body);
}
.munibase-admin-alerts tr:last-child td { border-bottom: 0; }
.munibase-admin-alerts__event { font-family: var(--muni-serif); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* MuniSecretField is a three-column grid of value + Show + Copy. In a table
   cell this narrow the two buttons take their intrinsic width and the value
   column collapses to nothing -- measured at 18px, which shows neither the
   URL nor its mask. Give the value column the slack and let the buttons
   shrink instead: the field is the point of the cell, the buttons are not. */
.munibase-admin-alerts__url .muni-secret {
  margin: 0;
  grid-template-columns: minmax(0, 1fr) auto auto !important;
}
.munibase-admin-alerts__url .muni-secret__value {
  min-width: 0 !important;
  width: 100% !important;
}
.munibase-admin-alerts__url .muni-secret__btn {
  padding: 4px 6px !important;
  font-size: var(--muni-admin-fs-label) !important;
  min-height: var(--muni-admin-ctl-h-sm) !important;
}
/* Copy is dropped inside the alerts table, leaving Show. Two buttons plus a
   value do not fit a ~190px cell -- measured, the value column collapsed to
   45px, which shows neither the URL nor a readable mask. A webhook in a row
   is scanned rather than copied, and the column the row budget was drawn for
   is Test, not Copy. Copy stays everywhere else the field is used.
   nth-of-type counts buttons only, so this is Copy and not the Rotate
   anchor, which this call site does not render anyway. */
.munibase-admin-alerts__url .muni-secret__btn:nth-of-type(2) { display: none !important; }
.munibase-admin-alerts__unset { font-family: var(--muni-serif); font-style: italic; color: var(--muni-ink-mute); }
.munibase-admin-alerts__delivery { font-family: var(--muni-mono); font-size: var(--muni-admin-fs-label); color: var(--muni-ink-mute); white-space: nowrap; }
.munibase-admin-alerts__delivery--failed { color: var(--muni-stamp); font-weight: 700; }

/* --- DEPLOYS --------------------------------------------------- */
.munibase-admin-deploy__svc { font-family: var(--muni-mono); font-size: 11px; font-weight: 700; color: var(--muni-ink); }
.munibase-admin-deploy__foot {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  padding: 7px 12px;
  border-top: 1px solid var(--muni-rule);
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  color: var(--muni-ink-mute);
  letter-spacing: .4px;
}
.munibase-admin-deploy__foot b { color: var(--muni-ink); }

/* --- INCIDENT CARD --------------------------------------------- */
/* The single unhealthy component, expanded. Stamp border with a heavy
   leading rule so it reads as a fault rather than as another status card. */
.munibase-admin-incident {
  border: 1px solid var(--muni-stamp);
  border-left-width: 3px;
  background: var(--muni-stamp-soft);
  padding: 13px 16px;
  margin-top: var(--muni-admin-stack);
}
.munibase-admin-incident__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 14px;
}
.munibase-admin-incident__ref {
  font-family: var(--muni-mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 1.2px;
  color: var(--muni-stamp);
}
.munibase-admin-incident__title {
  font-family: var(--muni-serif);
  font-size: var(--muni-admin-fs-title);
  font-weight: 600;
  letter-spacing: -.3px;
  margin-top: 4px;
}
.munibase-admin-incident__body {
  font-size: var(--muni-admin-fs-body);
  color: var(--muni-ink-soft);
  margin-top: 3px;
  line-height: 1.5;
  max-width: 820px;
}
.munibase-admin-incident__metrics {
  display: grid;
  grid-template-columns: repeat(5, auto) 1fr;
  gap: 22px;
  margin-top: 12px;
  padding-top: 11px;
  border-top: 1px dashed var(--muni-rule);
  align-items: end;
}
.munibase-admin-incident__k {
  display: block;
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  font-weight: 700;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--muni-ink-mute);
}
.munibase-admin-incident__v {
  display: block;
  font-family: var(--muni-mono);
  font-size: 13px;
  margin-top: 2px;
  color: var(--muni-ink);
  white-space: nowrap;
}
.munibase-admin-incident__v--flag { color: var(--muni-accent); font-weight: 700; }
.munibase-admin-incident__v--id { font-size: 11px; margin-top: 3px; }
.munibase-admin-incident__actions {
  display: flex;
  gap: 6px;
  justify-content: flex-end;
  align-items: center;
}
@media (max-width: 1100px) {
  .munibase-admin-incident__metrics { grid-template-columns: repeat(3, auto); }
  .munibase-admin-incident__actions { grid-column: 1 / -1; justify-content: flex-start; }
}

/* --- ACTION ROW ------------------------------------------------ */
/* Trailing actions on a panel or an inline editor. */
.munibase-admin-actions { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }

/* --- SEGMENTED FILTER (log tail / deploy scope) ---------------- */
.munibase-admin-seg { display: flex; flex-wrap: wrap; gap: 0; }
.munibase-admin-seg__p {
  border: 1px solid var(--muni-rule);
  border-right-width: 0;
  background: var(--muni-paper);
  color: var(--muni-ink-mute);
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-label);
  font-weight: 700;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  padding: 4px 8px;
  cursor: pointer;
}
.munibase-admin-seg__p:last-child { border-right-width: 1px; }
.munibase-admin-seg__p[aria-pressed="true"] { background: var(--muni-ink); color: var(--muni-paper); border-color: var(--muni-ink); }

/* Unsaved-count mark on a capability row. Pairs with the commit bar's
   named list so a change in THIS row can be reconciled with it. */
.munibase-admin-matrix__dirty { border-style: dashed; }

/* --- REVIEW DIFF ----------------------------------------------- */
.munibase-admin-diff {
  margin: 0;
  padding: 0;
  list-style: none;
  columns: 2;
  column-gap: var(--muni-admin-col-gap);
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  color: var(--muni-ink-soft);
}
.munibase-admin-diff li {
  break-inside: avoid;
  padding: 2px 0;
  border-bottom: 1px dashed var(--muni-rule-soft);
}
@media (max-width: 900px) {
  .munibase-admin-diff { columns: 1; }
}

/* --- MISC ------------------------------------------------------ */
.munibase-admin-note {
  font-family: var(--muni-mono);
  font-size: var(--muni-admin-fs-caption);
  color: var(--muni-ink-mute);
  padding: 6px 0;
}
.munibase-admin-config__body { padding-top: 14px; }

/* --- PRINT ----------------------------------------------------- */
@media print {
  .munibase-admin .muni-savebar--pinned { display: none; }
}

/* --- PUBLIC NOTICE BAR ------------------------------------------ */
/* Rendered outside the authorised shell so signed-out visitors can reach the
   privacy notice. Scoped like every other rule in this file: the markup carries its
   own .munibase-admin root, because the root on MudLayout sits inside the authorised
   branch and never wraps this element. Deliberately plain -- a footer link is not a
   place to spend design budget. */
.munibase-admin .muni-public-notice-bar {
  padding: 1.25rem 1rem 2rem;
  text-align: center;
  font-size: 0.8125rem;
}

.munibase-admin .muni-public-notice-bar a {
  color: inherit;
  opacity: 0.75;
  text-decoration: underline;
}

.munibase-admin .muni-public-notice-bar a:hover,
.munibase-admin .muni-public-notice-bar a:focus-visible {
  opacity: 1;
}

/* Compound, not descendant: PublicLayout puts this class on the SAME element as the
   scope root, so a descendant selector would never match it. */
.munibase-admin.muni-public-shell {
  padding-block: 2rem;
}

/* --- ROLLOUT CONDITION BAND ------------------------------------- */
/* The qualifier on the build the crown prints. Ochre, never stamp: a community
   that is behind is Active with every pod Running, so the stamp tone would state
   something false about the pods. Ochre is already the tone the health strip
   gives a component that is deliberately not running, which is the same claim.

   Three columns: a rule-width edge that carries the tone, the body, and the
   action. The edge is a block rather than a border-left so the tone survives the
   band's own background changing between readings. */
.munibase-admin-rollout {
  display: grid;
  grid-template-columns: 3px minmax(0, 1fr) auto;
  border-bottom: 1px solid var(--muni-rule);
  background: var(--muni-accent-soft);
}
.munibase-admin-rollout__edge { background: var(--muni-accent); }
.munibase-admin-rollout__body { padding: 12px 16px; min-width: 0; }
.munibase-admin-rollout__action {
  padding: 12px 16px 12px 0;
  display: flex;
  align-items: flex-start;
  gap: 8px;
}
.munibase-admin-rollout__head {
  display: block;
  margin-bottom: 5px;
  font-family: var(--muni-mono);
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 1.4px;
  text-transform: uppercase;
  color: var(--muni-ink);
}
.munibase-admin-rollout__lede {
  margin: 0;
  font-size: 0.9rem;
  line-height: 1.55;
  color: var(--muni-ink);
  max-width: 76ch;
  text-wrap: pretty;
}
.munibase-admin-rollout__line {
  font-size: 0.82rem;
  line-height: 1.5;
  color: var(--muni-ink-soft);
}
.munibase-admin-rollout__meta {
  display: block;
  margin-top: 6px;
  font-family: var(--muni-mono);
  font-size: 0.72rem;
  color: var(--muni-ink-soft);
}
.munibase-admin-rollout__sep { color: var(--muni-ink-mute); }

/* The deployment tool's own output. Clamped to two rendered lines here and shown
   whole on the deploy ledger. It reads as machine output because it is machine
   output -- an operator is going to copy it into a search. */
.munibase-admin-rollout__reason {
  margin: 8px 0 0;
  font-family: var(--muni-mono);
  font-size: 0.74rem;
  line-height: 1.5;
  color: var(--muni-ink);
  background: var(--muni-paper);
  border: 1px solid var(--muni-rule-soft);
  padding: 8px 10px;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: anywhere;
}

/* A ten-minute wait after a merge is not a notice. No tone, no colour. */
.munibase-admin-rollout--quiet { background: var(--muni-paper-soft); }
.munibase-admin-rollout--quiet .munibase-admin-rollout__edge { background: var(--muni-rule); }

/* Something is actually happening, or about to. Lighter than a condition that
   wants a person, still clearly not the resting state. */
.munibase-admin-rollout--work {
  background: color-mix(in srgb, var(--muni-accent) 10%, var(--muni-paper));
}

/* The stored failure in full, on the deploy ledger's failed row. Wrapped, never
   reflowed as prose: curating it would imply somebody had. */
.munibase-admin-deploy__output {
  margin: 8px 0 2px;
  font-family: var(--muni-mono);
  font-size: 0.74rem;
  line-height: 1.5;
  color: var(--muni-ink);
  background: var(--muni-paper);
  border: 1px solid var(--muni-rule-soft);
  padding: 8px 10px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  max-height: 22em;
  overflow-y: auto;
}
.munibase-admin-deploy__disclose {
  font-family: var(--muni-mono);
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 1.1px;
  text-transform: uppercase;
  color: var(--muni-ink-soft);
  cursor: pointer;
}
.munibase-admin-deploy__disclose:hover { color: var(--muni-ink); }
