/* Channel Schedule -- Phase 1b styles.
 * Scoped to [data-module="channel-schedule"]. All colors via tokens; both
 * themes supported via platform tokens.
 */

[data-module="channel-schedule"] .cs-root {
  display: flex;
  flex-direction: column;
  height: calc(100vh - 56px);
  background: var(--panel);
  color: var(--text-primary);
  position: relative;  /* anchor the floating dock */
}

/* Legacy top-of-grid bars are replaced by the floating dock. */
[data-module="channel-schedule"] .cs-filterbar,
[data-module="channel-schedule"] .cs-batch-bar { display: none !important; }

/* Full-bleed: dense tabular data needs every pixel. Drop the
 * .strata-content default padding (otherwise the grid sits inside the
 * platform's 16px gutter) AND zero the .strata-module-container chrome
 * so the grid edges meet the sidebar + viewport edges. Pattern matches
 * dam / ai-renderings / product-catalog (modules-lessons "Module max-
 * width: full-bleed override"). */
.strata-content:has([data-module="channel-schedule"]) { padding: 0; }
.strata-module-container[data-module="channel-schedule"] {
  max-width: none;
  margin: 0;
  padding: 0;
  height: 100%;
}

[data-module="channel-schedule"] .cs-banner {
  padding: 8px 12px;
  background: var(--panel-2);
  color: var(--text-secondary);
  font-size: 12px;
  border-bottom: 1px solid var(--border);
}

/* Toolbar */
[data-module="channel-schedule"] .cs-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
  gap: 16px;
}
[data-module="channel-schedule"] .cs-toolbar-left {
  display: flex;
  align-items: baseline;
  gap: 12px;
}
[data-module="channel-schedule"] .cs-title {
  font-size: 18px; font-weight: 600; margin: 0;
}

/* View-switch tabs -- the active module is THE title of the page, so
 * the active tab reads big-and-bold; the inactive sibling is quieter
 * but obviously a click target. A 3px accent underline sits flush
 * with the bottom of the toolbar to mark the active selection. No
 * surrounding pill-group chrome -- the toolbar itself provides the
 * border below. */
[data-module="channel-schedule"] .cs-viewtabs {
  display: inline-flex;
  align-items: stretch;
  gap: 18px;
  background: transparent;
  border: 0;
  padding: 0;
  border-radius: 0;
  /* Same height as the toolbar so the underline lands on the toolbar
   * bottom border, reading as a tab indicator. */
  align-self: stretch;
}
[data-module="channel-schedule"] .cs-viewtab {
  display: inline-flex; align-items: center;
  padding: 0 2px;
  font-size: 17px;
  font-weight: 500;
  color: var(--text-tertiary);
  background: transparent;
  border: 0;
  border-radius: 0;
  cursor: pointer;
  font-family: inherit;
  letter-spacing: -0.01em;
  transition: color 0.12s;
  /* The underline lives in a 3px bottom border that's transparent on
   * inactive tabs. Active flips it to var(--accent). */
  border-bottom: 3px solid transparent;
  margin-bottom: -1px; /* sit on top of toolbar's bottom border */
}
[data-module="channel-schedule"] .cs-viewtab:hover {
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-viewtab-active {
  color: var(--text-primary);
  font-weight: 700;
  border-bottom-color: var(--accent);
  cursor: default;
}
[data-module="channel-schedule"] .cs-viewtab-active:hover {
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-summary {
  color: var(--text-secondary); font-size: 13px;
}

/* Visible control-system chip (Phase A). Lives in the toolbar-left row
 * next to the summary. Reads as a quiet pill that brightens on hover so
 * it's discoverable as a click target. The active "open" state (while the
 * Switch Template modal is up) tints with the accent. Token-only; both
 * themes inherit via the resolved tokens. */
[data-module="channel-schedule"] .cs-system-chip {
  display: inline-flex; align-items: center; gap: 6px;
  align-self: center;
  padding: 3px 8px 3px 10px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 999px;
  color: var(--text-secondary);
  font-size: 12px; font-weight: 500;
  font-family: inherit;
  cursor: pointer;
  white-space: nowrap;
  transition: color 0.12s, background 0.12s, border-color 0.12s;
}
[data-module="channel-schedule"] .cs-system-chip:hover {
  color: var(--text-primary);
  background: var(--row-hover);
  border-color: var(--border-strong);
}
[data-module="channel-schedule"] .cs-system-chip[aria-expanded="true"] {
  color: var(--accent);
  background: var(--accent-soft);
  border-color: var(--accent-line);
}
[data-module="channel-schedule"] .cs-system-chip-label {
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-system-chip-value {
  color: var(--text-primary); font-weight: 600;
}
[data-module="channel-schedule"] .cs-system-chip-value-tbd {
  color: var(--text-tertiary); font-weight: 500; font-style: italic;
}
[data-module="channel-schedule"] .cs-system-chip-caret {
  color: var(--text-tertiary);
  flex-shrink: 0;
}

/* First-run system prompt (Phase A). A light, dismissable banner above the
 * grid -- accent-tinted so it reads as a friendly nudge, not an error.
 * Wraps gracefully at narrow widths. Token-only; both themes inherit. */
[data-module="channel-schedule"] .cs-system-prompt {
  position: relative;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px 16px;
  margin: 12px 12px 14px;
  padding: 18px 44px 18px 20px;
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  border-radius: 8px;
}
[data-module="channel-schedule"] .cs-system-prompt-text {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 200px;
  flex: 1 1 240px;
}
[data-module="channel-schedule"] .cs-system-prompt-text strong {
  color: var(--text-primary);
  font-size: 13px; font-weight: 600;
}
[data-module="channel-schedule"] .cs-system-prompt-sub {
  color: var(--text-secondary);
  font-size: 12px;
}
[data-module="channel-schedule"] .cs-system-prompt-choices {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-system-prompt-choice {
  display: inline-flex; align-items: center;
  padding: 6px 12px;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  color: var(--text-primary);
  font-size: 12px; font-weight: 500;
  font-family: inherit;
  cursor: pointer;
  white-space: nowrap;
  transition: color 0.12s, background 0.12s, border-color 0.12s;
}
[data-module="channel-schedule"] .cs-system-prompt-choice:hover {
  color: var(--accent);
  background: var(--accent-soft);
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-system-prompt-later {
  display: inline-flex; align-items: center;
  padding: 6px 10px;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 6px;
  color: var(--text-tertiary);
  font-size: 12px; font-weight: 500;
  font-family: inherit;
  cursor: pointer;
  white-space: nowrap;
  transition: color 0.12s, background 0.12s;
}
[data-module="channel-schedule"] .cs-system-prompt-later:hover {
  color: var(--text-secondary);
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-system-prompt-dismiss {
  position: absolute;
  top: 8px; right: 8px;
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 5px;
  color: var(--text-tertiary);
  font-size: 18px; line-height: 1;
  cursor: pointer;
  font-family: inherit;
  transition: color 0.12s, background 0.12s;
}
[data-module="channel-schedule"] .cs-system-prompt-dismiss:hover {
  color: var(--text-primary);
  background: var(--row-hover);
}

/* Phone: stack the prompt choices below the text, full-width touch
 * targets, and give the dismiss button room. */
@media (max-width: 640px) {
  [data-module="channel-schedule"] .cs-system-prompt-choice,
  [data-module="channel-schedule"] .cs-system-prompt-later {
    min-height: 44px;
  }
  [data-module="channel-schedule"] .cs-system-chip {
    min-height: 32px;
  }
}
[data-module="channel-schedule"] .cs-toolbar-right {
  display: flex; align-items: center; gap: 6px;
}

/* Toolbar tier-1 ghost button (borderless, contextual management).
 * Distinct from .btn-ghost (which has a border + is used in row contexts);
 * the toolbar variant is quieter and supports an aria-expanded "open" state
 * so the Spaces / Circuits buttons can show they own an open modal. */
[data-module="channel-schedule"] .cs-tb-ghost {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 5px 10px;
  background: transparent; border: 1px solid transparent;
  color: var(--text-tertiary);
  font-size: 12px; font-weight: 500;
  border-radius: 6px;
  cursor: pointer; font-family: inherit;
  white-space: nowrap;
  transition: color 0.12s, background 0.12s, border-color 0.12s;
}
[data-module="channel-schedule"] .cs-tb-ghost:hover {
  color: var(--text-secondary);
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-tb-ghost[aria-expanded="true"] {
  color: var(--accent);
  background: var(--accent-soft);
  border-color: var(--accent-line);
}

/* Vertical divider between toolbar tiers. */
[data-module="channel-schedule"] .cs-tb-sep {
  width: 1px; height: 18px;
  background: var(--border);
  flex-shrink: 0;
}

/* Toolbar overflow trigger ("..." button). Square icon button. */
[data-module="channel-schedule"] .cs-tb-overflow {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px;
  background: transparent; border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text-tertiary);
  cursor: pointer; font-family: inherit;
  transition: color 0.12s, background 0.12s, border-color 0.12s;
}
[data-module="channel-schedule"] .cs-tb-overflow:hover {
  color: var(--text-primary);
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-tb-overflow[aria-expanded="true"] {
  color: var(--accent);
  border-color: var(--accent-line);
  background: var(--accent-soft);
}

/* Body-mounted overflow popover. Mirrors the cs-row-menu pattern (mount
 * on document.body, position: fixed) so the dual-selector below matches
 * a root that carries data-module set in JS. */
[data-module="channel-schedule"] .cs-tb-ovf-menu,
.cs-tb-ovf-menu[data-module="channel-schedule"] {
  position: fixed;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: 8px;
  box-shadow: var(--shadow-lg, 0 12px 32px rgba(0, 0, 0, 0.35));
  padding: 4px;
  min-width: 200px;
  z-index: 95; /* above dock (80), below combobox-menu (90)... actually
                  we sit at 95 alongside row-menu since this is a click-
                  triggered toolbar menu, not an inline editor. */
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-tb-ovf-item {
  display: flex; align-items: center; gap: 8px;
  width: 100%;
  padding: 7px 10px;
  background: transparent; border: 0;
  color: var(--text-primary);
  font-size: 13px; font-family: inherit;
  border-radius: 5px;
  cursor: pointer; text-align: left;
}
[data-module="channel-schedule"] .cs-tb-ovf-item:hover,
[data-module="channel-schedule"] .cs-tb-ovf-item:focus {
  background: var(--row-hover);
  outline: none;
}
[data-module="channel-schedule"] .cs-tb-ovf-item-sub {
  margin-left: auto;
  color: var(--text-tertiary);
  font-size: 11px;
}

/* Grid wrapper + cells */
[data-module="channel-schedule"] .cs-grid-wrap {
  flex: 1;
  overflow: auto;
  padding: 0 8px 96px;  /* bottom room for floating dock */
  position: relative;
  isolation: isolate;
}

/* Platform ships no .btn-ghost; define a scoped tertiary-button style
 * so category "+ Add channel" and modal Cancel buttons have proper chrome. */
[data-module="channel-schedule"] .btn-ghost {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 10px;
  font-size: 12px;
  color: var(--text-secondary);
  background: transparent;
  border: 1px solid var(--border);
  border-radius: 6px;
  cursor: pointer;
  font-family: inherit;
}
[data-module="channel-schedule"] .btn-ghost:hover {
  color: var(--accent);
  border-color: var(--accent);
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-grid {
  min-width: min-content;
  font-size: 13px;
}
/* Group band row -- sits above the column header, sticky-top alongside
 * it so both stay visible during vertical scroll. Subtle background
 * tinting on the Identity (accent-tinted) + Fixture Assignment (muted)
 * bands delineates them from the others without competing with the
 * header below. */
[data-module="channel-schedule"] .cs-grid-bandrow {
  display: flex; position: sticky; top: 0;
  background: var(--bg);
  border-bottom: 1px solid var(--border);
  z-index: 17; /* above .cs-grid-header (16) so it owns the top edge */
  height: 22px;
}
[data-module="channel-schedule"] .cs-band {
  display: flex; align-items: center;
  padding: 0 8px;
  font-size: 9px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--text-tertiary);
  border-right: 1px solid var(--border);
  white-space: nowrap; overflow: hidden;
  flex-shrink: 0;
  user-select: none;
}
[data-module="channel-schedule"] .cs-band-gutter {
  width: 36px; min-width: 36px;
  border-right: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-band-identity {
  color: color-mix(in srgb, var(--accent) 65%, var(--text-tertiary));
  background: var(--accent-soft);
  border-right-color: var(--accent-line);
}
[data-module="channel-schedule"] .cs-band-fixture {
  background: var(--row-alt);
}
[data-module="channel-schedule"] .cs-band-control {
  background: var(--row-alt);
}

[data-module="channel-schedule"] .cs-grid-header {
  display: flex; position: sticky; top: 22px;
  background: var(--panel-2);
  border-bottom: 2px solid var(--border-strong);
  /* Must sit above the frozen body cells (z:12) during vertical scroll
   * so LOCATION/CH#/CIRCUIT data cells don't stack on top of the
   * column header row as the user scrolls down. */
  z-index: 16;
}
[data-module="channel-schedule"] .cs-header {
  font-weight: 600; color: var(--text-secondary);
  padding: 8px 6px; font-size: 11px;
  text-transform: uppercase; letter-spacing: 0.04em;
  border-right: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-cell {
  padding: 6px; border-right: 1px solid var(--border);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Cell standouts -- CH# is the channel's identity and FIXT TYPE is the
 * linked-fixture identity. Both get visual weight so the row reads
 * quickly at a glance, but FIXT TYPE is the stronger anchor (chip-style)
 * since it ties the channel to a real catalog row. Header row excluded
 * via :not(.cs-header). */
[data-module="channel-schedule"] .cs-cell[data-col="number"]:not(.cs-header) {
  color: var(--accent);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  font-size: 14px;
}
[data-module="channel-schedule"] .cs-cell[data-col="fixture_code"]:not(.cs-header):not(.cs-cell-computed) {
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
  font-weight: 700;
  font-size: 14px;
  color: var(--accent);
  background: var(--accent-soft);
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
/* Computed cells: visually quieter so user-entered fields stand out.
 * Slightly smaller font + tertiary color + faint row-alt fill. */
[data-module="channel-schedule"] .cs-cell-computed {
  color: var(--text-tertiary); background: var(--row-alt);
  font-size: 12px;
}

/* Rows + channel grouping.
 * Multi-fixture channels render as a parent row (`cs-row-channel-first`)
 * plus N continuation rows; the last continuation is also `cs-row-channel-last`.
 * Single-fixture channels carry BOTH classes (first + last).
 *
 * Visual treatment ties continuations to their parent:
 *   - First row: accent-color left border + top border (start of block).
 *   - Continuations (not first): faded accent left border so the block's
 *     left edge is one continuous line; no top border (no inner split).
 *   - Last row: a single bottom border that closes the block.
 *   - Continuation gutters get a row-alt tint so the indent reads as
 *     "child of the channel above" without using actual indentation
 *     (which would break the columnar grid alignment).
 */
[data-module="channel-schedule"] .cs-row {
  display: flex; cursor: pointer;
  transition: background-color 0.1s;
  border-left: 2px solid var(--accent-line);
}
[data-module="channel-schedule"] .cs-row:hover {
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-row-channel-first {
  border-top: 1px solid var(--border);
  border-left: 2px solid var(--accent, var(--border-strong));
}
[data-module="channel-schedule"] .cs-row-channel-last {
  border-bottom: 1px solid var(--border);
}
/* Tint the gutter on continuation rows so the multi-fixture block reads
 * as parented. Stops at the gutter so data cells stay full-saturation. */
[data-module="channel-schedule"] .cs-row:not(.cs-row-channel-first) .cs-gutter:not(.cs-gutter-spacer) {
  background: var(--row-alt);
}

/* Area group header */
[data-module="channel-schedule"] .cs-area-header {
  /* flex-start so indicator + title pack on the left; actions get
   * margin-left:auto below to push to the right. (Was space-between
   * pre-redesign when there were only 2 children -- adding the new
   * 3px color indicator as a third sibling made the title float to
   * the centre of the row under space-between. flex-start fixes it.) */
  display: flex; align-items: center; justify-content: flex-start;
  background: var(--panel-2);
  padding: 10px 12px; font-weight: 600;
  border-bottom: 1px solid var(--border-strong);
  /* Sticky-top sits BELOW the bandrow (22px) + column header (~30px) so
   * area headers don't slide underneath the chrome during vertical
   * scroll. Was top:32 before the bandrow landed; +22 for the band.
   *
   * z-index: must sit ABOVE frozen body cells (z:12) so the sticky area
   * banner isn't punched through by LOCATION/CH#/CIRCUIT cells scrolling
   * underneath, but BELOW the column header row (z:16) so the header
   * still owns the top edge on vertical scroll. Was z:3, which let
   * frozen body cells overlap the banner -- the fb_1780347187 symptom. */
  position: sticky; top: 52px; z-index: 14;
}
/* The area header spans the full grid width, so on horizontal scroll
 * the title / actions would scroll off-screen with the row content.
 * Pin both ends to the viewport edges with sticky positioning + a
 * solid panel-tinted background so cells scrolling underneath don't
 * bleed through. Same pattern as the lessons-file note for the
 * group-title sticky-left fix. */
[data-module="channel-schedule"] .cs-area-title {
  color: var(--text-primary);
  position: sticky; left: 12px;
  background: var(--panel-2);
  padding-right: 10px;
  z-index: 1;
}
/* Colored area indicator strip -- thin vertical bar at the leading edge
 * of each area / typical-room header. Color comes from areas.color via
 * inline style (validated by ctx.ui.safeColor in render). */
[data-module="channel-schedule"] .cs-area-indicator {
  display: inline-block;
  width: 3px;
  align-self: stretch;
  border-radius: 2px;
  margin-right: 8px;
  flex-shrink: 0;
  /* sticky-left so the bar stays visible during horizontal scroll,
   * matching the area-title behaviour just to its right. */
  position: sticky;
  left: 8px;
}

[data-module="channel-schedule"] .cs-area-actions {
  /* margin-left: auto pushes the actions to the right end of the
   * area-header flex container (replaces the old space-between behavior
   * that broke when the indicator landed as a third sibling). */
  margin-left: auto;
  position: sticky; right: 12px;
  background: var(--panel-2);
  padding-left: 10px;
  z-index: 1;
  /* Hover-reveal: per-area Toggle / + Channel / delete only appear when
   * the user is interacting with the area header. Keyboard users still
   * see them via :focus-within when tabbing into the row. */
  opacity: 0;
  transition: opacity 0.12s;
}
[data-module="channel-schedule"] .cs-area-header:hover .cs-area-actions,
[data-module="channel-schedule"] .cs-area-header:focus-within .cs-area-actions {
  opacity: 1;
}
[data-module="channel-schedule"] .cs-area-meta {
  color: var(--text-secondary); font-weight: 400; font-size: 12px; margin-left: 8px;
}
[data-module="channel-schedule"] .cs-area-totals {
  display: flex; justify-content: space-between;
  padding: 6px 12px 6px 48px; /* indent past the gutter so the label
                                  reads as part of the area's footer */
  background: var(--row-alt);
  border-bottom: 2px solid var(--border-strong);
  font-size: 11px; color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-area-totals strong,
[data-module="channel-schedule"] .cs-area-totals-value {
  font-weight: 600; color: var(--text-secondary);
  font-variant-numeric: tabular-nums;
}

/* Stage 5 Track E: typical-room section variant. Subtle accent tint
 * on the header band so the user can distinguish at a glance from
 * regular area sections. */
[data-module="channel-schedule"] .cs-area-header.cs-typical-header {
  background: linear-gradient(var(--accent-soft), var(--accent-soft)), var(--panel-2);
  border-left: 3px solid var(--accent);
}
/* Match the sticky-left/right children to the typical-header tint so
 * they don't visually jump back to plain panel-2 once scrolled. */
[data-module="channel-schedule"] .cs-area-header.cs-typical-header .cs-area-title,
[data-module="channel-schedule"] .cs-area-header.cs-typical-header .cs-area-actions {
  background: linear-gradient(var(--accent-soft), var(--accent-soft)), var(--panel-2);
}
[data-module="channel-schedule"] .cs-typical-badge {
  display: inline-block;
  font-size: 10px; font-weight: 700;
  padding: 2px 6px; margin-right: 4px;
  background: var(--accent); color: var(--bg);
  border-radius: 3px; letter-spacing: 0.5px;
  vertical-align: middle;
}
[data-module="channel-schedule"] .cs-area-totals.cs-typical-totals {
  background: linear-gradient(var(--accent-soft), var(--accent-soft)), var(--row-alt);
}

/* Stage 5 Track E (Commit 2): inline-editable section-header inputs.
 * Borderless until focus / hover so the header reads as static text
 * by default; click reveals an input affordance. */
[data-module="channel-schedule"] .cs-inline-edit {
  background: transparent;
  border: 1px solid transparent;
  color: inherit;
  font: inherit;
  font-weight: inherit;
  padding: 2px 6px;
  border-radius: 3px;
  outline: none;
  min-width: 0;
}
[data-module="channel-schedule"] .cs-inline-edit:hover {
  border-color: var(--border);
  background: var(--input-bg);
}
[data-module="channel-schedule"] .cs-inline-edit:focus {
  border-color: var(--accent);
  background: var(--input-bg);
  box-shadow: 0 0 0 2px var(--accent-soft);
}
[data-module="channel-schedule"] .cs-h-name {
  font-weight: 600;
  font-size: 14px;
  width: auto; min-width: 120px; max-width: 280px;
}
[data-module="channel-schedule"] .cs-h-rc,
[data-module="channel-schedule"] .cs-h-sqft {
  width: 70px; font-weight: 400;
  font-size: 12px;
  text-align: right;
}
[data-module="channel-schedule"] .cs-h-unit {
  font-size: 12px; color: var(--text-tertiary);
  margin-left: 2px;
}
/* Hover-revealed delete button on section headers. Faded out until
 * the user hovers the header so the action affordance doesn't add
 * visual weight to the default state. */
[data-module="channel-schedule"] .cs-area-header .cs-h-del {
  opacity: 0.35;
  transition: opacity 0.12s ease, color 0.12s ease;
  font-size: 16px; line-height: 1; padding: 4px 10px;
}
[data-module="channel-schedule"] .cs-area-header:hover .cs-h-del {
  opacity: 0.8;
}
[data-module="channel-schedule"] .cs-area-header .cs-h-del:hover {
  opacity: 1;
  color: var(--error);
}

/* Grand totals footer -- project-level wattage + W/sqft summary above
 * the dock. Uppercase label + tabular-num strong values + sqft pinned
 * to the right edge per the redesign. */
[data-module="channel-schedule"] .cs-grand-totals {
  padding: 10px 16px;
  background: var(--panel-2);
  border-top: 1px solid var(--border-strong);
  font-size: 13px; color: var(--text-secondary);
  display: flex; gap: 12px; align-items: center;
}
[data-module="channel-schedule"] .cs-grand-totals-label {
  font-size: 10px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-grand-totals-value {
  font-size: 14px; font-weight: 700;
  color: var(--text-primary);
  font-variant-numeric: tabular-nums;
}
[data-module="channel-schedule"] .cs-grand-totals-dot {
  color: var(--border-strong);
}
[data-module="channel-schedule"] .cs-grand-totals-meta {
  margin-left: auto;
  font-size: 11px; color: var(--text-tertiary);
  font-variant-numeric: tabular-nums;
}

/* Loading placeholder (paint 1 before loadAll resolves) */
[data-module="channel-schedule"] .cs-loading {
  padding: 80px 32px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-loading p {
  margin: 0;
  font-size: 14px;
}
[data-module="channel-schedule"] .cs-loading-spinner {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 2px solid var(--border);
  border-top-color: var(--accent);
  animation: cs-spin 720ms linear infinite;
}
@keyframes cs-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  [data-module="channel-schedule"] .cs-loading-spinner { animation: none; border-top-color: var(--border-strong); }
}

/* Empty state */
[data-module="channel-schedule"] .cs-empty {
  padding: 48px; text-align: center; color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-empty p { margin-bottom: 16px; }
[data-module="channel-schedule"] .cs-empty-hint {
  color: var(--text-tertiary); font-size: 13px;
}

/* Inline project picker shown when no project is selected (ALL PROJECTS). */
[data-module="channel-schedule"] .cs-picker {
  padding: 48px 32px;
  max-width: 960px;
  margin: 0 auto;
}
[data-module="channel-schedule"] .cs-picker-header {
  text-align: center;
  margin-bottom: 28px;
}
[data-module="channel-schedule"] .cs-picker-header h2 {
  margin: 0 0 6px;
  font-size: 20px;
  font-weight: 600;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-picker-header p {
  margin: 0;
  font-size: 14px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-picker-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
}
[data-module="channel-schedule"] .cs-picker-card {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 14px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  cursor: pointer;
  font: inherit;
  text-align: left;
  transition: background 120ms ease, border-color 120ms ease, transform 120ms ease;
}
[data-module="channel-schedule"] .cs-picker-card:hover {
  background: var(--panel-2);
  border-color: var(--border-strong);
}
[data-module="channel-schedule"] .cs-picker-card:active {
  transform: scale(0.99);
}
[data-module="channel-schedule"] .cs-picker-card-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  flex-shrink: 0;
}
[data-module="channel-schedule"] .cs-picker-card-name {
  flex: 1;
  min-width: 0;
  color: var(--text-primary);
  font-weight: 500;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
[data-module="channel-schedule"] .cs-picker-card-code {
  color: var(--text-tertiary);
  font-size: 12px;
  font-variant-numeric: tabular-nums;
}

/* Spaces modal (Stage 5 Track E) -- Areas + Typical rooms in two
 * sections. Column-header row above each list so the unlabeled inputs
 * read as a table.
 *
 * Modal width: the platform caps every .strata-modal at 560px (see
 * platform/styles.css). The :has() selector below overrides that cap
 * specifically for the Spaces modal so its 660px-min content fits
 * without horizontal scroll. Specificity .strata-modal:has(.foo) >
 * .strata-modal beats the platform rule.
 *
 * Inline section-header editing in the grid (Commit 2) makes the
 * modal redundant for editing existing spaces. The modal stays as a
 * bulk-view fallback. */
/* ============================================================
 * Configure Spaces sheet (Tier 2: modal-content; classes UNSCOPED
 * because ctx.ui.modal mounts on .strata-overlay outside the
 * data-module wrapper -- see modules-lessons "modal CSS Tier 2").
 *
 * Tabbed layout: Areas | Typical Rooms. Each row has a quiet
 * "main" line (drag handle, color dot, name, meta, expand, delete)
 * plus an expanded detail panel revealing sqft / room count /
 * color picker. Inline-edit-on-type via the input listener.
 * ============================================================ */
body .strata-modal:has(.cs-spaces-modal) {
  max-width: 720px;
}
body .cs-spaces-modal {
  display: flex; flex-direction: column; gap: 16px;
  min-width: 600px; max-width: 100%;
}

/* Tab strip */
body .cs-sp-tabs {
  display: flex; gap: 0;
  border-bottom: 1px solid var(--border);
  margin-bottom: 4px;
}
body .cs-sp-tab {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 14px;
  background: transparent; border: 0;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  color: var(--text-tertiary);
  font-size: 13px; font-weight: 500;
  font-family: inherit; cursor: pointer;
  transition: color 0.12s;
  white-space: nowrap;
}
body .cs-sp-tab:hover { color: var(--text-secondary); }
body .cs-sp-tab.cs-sp-tab-active {
  color: var(--text-primary);
  font-weight: 600;
  border-bottom-color: var(--accent);
}
body .cs-sp-tab-count {
  display: inline-flex; align-items: center;
  font-size: 10px; font-weight: 600;
  padding: 1px 6px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 10px;
  color: var(--text-tertiary);
  font-variant-numeric: tabular-nums;
}
body .cs-sp-tab-active .cs-sp-tab-count {
  background: var(--accent-soft);
  border-color: var(--accent-line);
  color: var(--accent);
}

/* Tab pane */
body .cs-sp-pane {
  display: flex; flex-direction: column; gap: 8px;
}
body .cs-sp-help {
  margin: 0;
  font-size: 12px; line-height: 1.4;
  color: var(--text-secondary);
}
body .cs-sp-empty {
  margin: 0; padding: 14px 4px;
  font-size: 12px; color: var(--text-tertiary);
  font-style: italic;
  text-align: center;
}

/* List of rows */
body .cs-sp-list {
  list-style: none; padding: 0; margin: 0;
  display: flex; flex-direction: column;
  border: 1px solid var(--border);
  border-radius: 8px;
  overflow: hidden;
}
body .cs-sp-row {
  display: flex; flex-direction: column;
  border-bottom: 1px solid var(--border);
  background: var(--panel);
  transition: background 0.1s;
}
body .cs-sp-row:last-child { border-bottom: 0; }
body .cs-sp-row:hover { background: var(--row-hover); }

/* Main row -- always visible */
body .cs-sp-row-main {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px;
}
body .cs-sp-drag {
  color: var(--text-tertiary);
  opacity: 0.5;
  font-size: 14px;
  letter-spacing: -2px;
  cursor: grab;
  user-select: none;
  flex-shrink: 0;
}
body .cs-sp-color-dot {
  width: 12px; height: 12px;
  border-radius: 50%;
  border: 1px solid rgba(0, 0, 0, 0.15);
  cursor: pointer;
  padding: 0;
  flex-shrink: 0;
  transition: transform 0.12s;
}
body .cs-sp-color-dot:hover { transform: scale(1.25); }
body .cs-sp-name {
  flex: 1; min-width: 0;
  padding: 4px 8px;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 4px;
  color: var(--text-primary);
  font-size: 13px; font-family: inherit;
  font-weight: 500;
}
body .cs-sp-name:hover { border-color: var(--border); }
body .cs-sp-name:focus {
  outline: none;
  border-color: var(--accent);
  background: var(--input-bg);
}
body .cs-sp-typical-badge {
  display: inline-block;
  font-size: 9px; font-weight: 700;
  padding: 1px 5px;
  background: var(--accent); color: var(--bg);
  border-radius: 3px; letter-spacing: 0.5px;
  flex-shrink: 0;
}
body .cs-sp-meta {
  font-size: 11px; color: var(--text-tertiary);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  flex-shrink: 0;
}
body .cs-sp-pill {
  font-size: 10px; color: var(--text-tertiary);
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 1px 8px;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  flex-shrink: 0;
}
body .cs-sp-expand,
body .cs-sp-del {
  width: 22px; height: 22px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 4px;
  color: var(--text-tertiary);
  cursor: pointer; font-family: inherit;
  font-size: 14px;
  flex-shrink: 0;
  transition: color 0.12s, background 0.12s, transform 0.15s;
}
body .cs-sp-expand:hover,
body .cs-sp-del:hover {
  color: var(--text-primary);
  background: var(--row-hover);
}
body .cs-sp-row-expanded .cs-sp-expand { transform: rotate(180deg); }

/* Expanded detail panel */
body .cs-sp-row-detail {
  display: flex; flex-wrap: wrap; gap: 12px;
  align-items: flex-end;
  padding: 10px 14px 14px 32px;
  background: var(--panel-2);
  border-top: 1px solid var(--border);
}
body .cs-sp-row-detail[hidden] { display: none; }
body .cs-sp-field {
  display: flex; flex-direction: column; gap: 4px;
}
body .cs-sp-field-label {
  font-size: 10px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--text-tertiary);
}
body .cs-sp-field input {
  padding: 5px 9px;
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text-primary);
  font-size: 13px; font-family: inherit;
  font-variant-numeric: tabular-nums;
  width: 90px;
}
body .cs-sp-field input:focus {
  outline: none;
  border-color: var(--accent);
}
body .cs-sp-color-block {
  display: flex; flex-direction: column; gap: 5px;
  margin-left: auto;
}
body .cs-sp-color-picker {
  display: flex; gap: 5px;
}
body .cs-sp-swatch {
  width: 20px; height: 20px;
  border-radius: 5px;
  border: 2px solid transparent;
  background: var(--accent);
  cursor: pointer; padding: 0;
  transition: transform 0.1s;
}
body .cs-sp-swatch:hover { transform: scale(1.15); }
body .cs-sp-swatch-active {
  border-color: var(--text-primary);
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.2);
}

/* "+ Add area" / "+ Add typical room" button */
body .cs-sp-add {
  align-self: flex-start;
  display: inline-flex; align-items: center; gap: 4px;
  padding: 6px 10px;
  background: transparent;
  border: 1px dashed var(--border-strong);
  border-radius: 6px;
  color: var(--accent);
  font-size: 12px; font-weight: 500;
  font-family: inherit; cursor: pointer;
  transition: border-color 0.12s, background 0.12s;
}
body .cs-sp-add:hover {
  border-color: var(--accent-line);
  border-style: solid;
  background: var(--accent-soft);
}

/* Footer note (kept from previous design) */
body .cs-spaces-note {
  margin: 0; padding: 10px 12px;
  background: var(--panel-2); border-radius: 6px;
  font-size: 12px; line-height: 1.4; color: var(--text-secondary);
}
/* Move-to-space combobox (Stage 5 Track E Commit 3 -- inline form).
 *
 * The trigger sits inside the selection-mode dock as a styled <input>.
 * The dropdown menu is body-mounted (not a child of the dock) so it
 * can escape the dock's overflow/transform context and float above
 * the schedule grid. Both the input and the menu are styled here.
 *
 * Tier mix:
 *   - .cs-dock-mv + .cs-dock-mv-input: Tier 1 (rendered inside the dock,
 *     which is inside [data-module="channel-schedule"]).
 *   - .cs-dock-mv-menu: Tier 1 by descendant + Tier 2 by self-attribute,
 *     because we mirror data-module="channel-schedule" onto the
 *     body-mounted root. The first selector covers the (non-existent)
 *     descendant-mount path; the second covers the actual body-mount.
 *     See modules-lessons "body-mounted element + scoped descendant
 *     selector" for the comma-fallback pattern.
 */
[data-module="channel-schedule"] .cs-dock-mv {
  display: flex; align-items: stretch;
  flex: 0 0 auto;
}
[data-module="channel-schedule"] .cs-dock-mv-input {
  width: 200px; min-width: 160px;
  padding: 6px 10px;
  border: 1px solid var(--border-strong);
  background: var(--input-bg);
  color: var(--text-primary);
  border-radius: var(--button-radius);
  font-size: 13px;
  outline: none;
}
[data-module="channel-schedule"] .cs-dock-mv-input::placeholder {
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-dock-mv-input:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 2px var(--accent-soft);
}

[data-module="channel-schedule"] .cs-dock-mv-menu,
.cs-dock-mv-menu[data-module="channel-schedule"] {
  position: fixed;
  z-index: 90; /* above the dock (80), below modals (9000) */
  min-width: 240px; max-height: 320px;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: var(--button-radius);
  box-shadow: var(--shadow-lg);
  overflow-y: auto;
  padding: 4px 0;
  font-size: 13px;
}
[data-module="channel-schedule"] .cs-dock-mv-group-label {
  padding: 6px 12px 4px;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-dock-mv-option {
  display: flex; align-items: baseline; gap: 8px;
  padding: 6px 12px;
  cursor: pointer;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dock-mv-option-active {
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-dock-mv-option-label {
  flex: 1; min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
[data-module="channel-schedule"] .cs-dock-mv-option-sub {
  font-size: 11px;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-dock-mv-empty {
  padding: 10px 12px;
  font-size: 12px;
  color: var(--text-tertiary);
  font-style: italic;
}

/* iOS-zoom prevention for modal inputs (Tier-2 escape; modules.md). */
body .strata-overlay .cs-sp-name,
body .strata-overlay .cs-sp-field input { font-size: 16px; }
@media (min-width: 768px) {
  body .strata-overlay .cs-sp-name,
  body .strata-overlay .cs-sp-field input { font-size: 13px; }
}
/* iOS-zoom for the dock combobox. Tier 1 (inside data-module). */
@media (max-width: 640px) {
  [data-module="channel-schedule"] .cs-dock-mv-input { font-size: 16px; }
}
/* Phone-width: drop the meta + pill so the row fits, and let the
 * detail panel fields wrap to a single column. */
@media (max-width: 640px) {
  body .cs-spaces-modal { min-width: 0; }
  body .cs-sp-meta { display: none; }
  body .cs-sp-row-detail {
    flex-direction: column;
    align-items: stretch;
    padding-left: 14px;
  }
  body .cs-sp-color-block { margin-left: 0; }
}

/* Mobile */
@media (max-width: 1023px) {
  [data-module="channel-schedule"] .cs-mobile-banner { display: block; }
  [data-module="channel-schedule"] .cs-toolbar-right .btn-primary { display: none; }
}
@media (min-width: 1024px) {
  [data-module="channel-schedule"] .cs-mobile-banner[hidden] { display: none; }
}

/* Provenance indicators -- schema present in 1b, UI lands in 1c */
[data-module="channel-schedule"] .cs-cell.cs-prov-override { border-left: 3px solid var(--strata-provenance-override, #4b9fff); }
[data-module="channel-schedule"] .cs-cell.cs-prov-flag     { border-left: 3px solid var(--strata-provenance-flag, #ff4b4b); }
[data-module="channel-schedule"] .cs-cell.cs-prov-changed  { border-left: 3px solid var(--strata-provenance-changed, #4bff82); }

/* Grid editor states (inline cell editing, range selection). */
[data-module="channel-schedule"] .cs-root { outline: none; }
[data-module="channel-schedule"] .cs-cell { position: relative; }
[data-module="channel-schedule"] .cs-cell-active {
  outline: 2px solid var(--accent);
  outline-offset: -2px;
  z-index: 2;
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-cell-selected {
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-cell-editing {
  padding: 0 !important;
  background: var(--panel);
  /* Lift overflow clip so combobox dropdowns can extend past the cell. */
  overflow: visible !important;
  position: relative;
  z-index: 10;
}
[data-module="channel-schedule"] .cs-cell-editor {
  width: 100%;
  height: 100%;
  min-height: 28px;
  padding: 5px;
  border: 0;
  outline: 2px solid var(--accent);
  outline-offset: -2px;
  background: var(--input-bg);
  color: var(--text-primary);
  font-family: inherit;
  font-size: 13px;
  box-sizing: border-box;
}
/* Multi-line editor for NOTES. Tall enough to show two lines without
 * needing to scroll for typical entries; resize:vertical lets the user
 * stretch it manually if a long note rolls in. Shift+Enter inserts a
 * newline (handled in grid-keys); plain Enter commits. */
[data-module="channel-schedule"] .cs-cell-editor.cs-cell-editor-multiline {
  min-height: 60px;
  resize: vertical;
  white-space: pre-wrap;
}

/* Header gutter select-toggle (default mode). Small unselected
 * checkbox-styled affordance that flips into multi-select mode on
 * click. Mirrors the gutter row checkbox visually so users recognise
 * the off-state as "click here to start selecting." */
[data-module="channel-schedule"] .cs-gutter-header[data-action="cs-header-select-toggle"] {
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
[data-module="channel-schedule"] .cs-gutter-select-toggle {
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 1.5px solid var(--border-strong);
  border-radius: 3px;
  background: transparent;
  transition: border-color 0.1s, background 0.1s;
}
[data-module="channel-schedule"] .cs-gutter-header[data-action="cs-header-select-toggle"]:hover .cs-gutter-select-toggle {
  border-color: var(--accent);
  background: var(--accent-soft);
}

/* Kebab gutter icon (default mode -- when state.selectMode is false).
 * Replaces the checkbox with a vertical-three-dots glyph that opens
 * the row context menu (Insert / Add fixture / Copy / Paste / Delete /
 * Select rows...). Subdued by default; brightens on row hover. */
[data-module="channel-schedule"] .cs-gutter-kebab {
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: var(--text-tertiary);
  opacity: 0;
  transition: opacity 0.12s, color 0.12s;
}
[data-module="channel-schedule"] .cs-gutter-kebab-icon {
  font-size: 16px;
  line-height: 1;
  letter-spacing: 0;
}
/* Hover-reveal: the kebab handle stays invisible at rest and only
 * appears once the user is interacting with the row (mouse hover or
 * any descendant focused via keyboard). Checkbox mode (.cs-gutter-check)
 * is unaffected because it's a sibling element, not the kebab. */
[data-module="channel-schedule"] .cs-row:hover .cs-gutter-kebab,
[data-module="channel-schedule"] .cs-row:focus-within .cs-gutter-kebab {
  opacity: 1;
  color: var(--text-primary);
  background: linear-gradient(var(--row-hover), var(--row-hover)), var(--panel);
}

/* Bool cells (EM today) render a styled checkbox indicator instead of
 * the "Y" text. Click the cell to toggle directly -- no edit mode.
 * The indicator is a span (not <input>) so keyboard nav stays on the
 * grid root rather than focusing into individual checkboxes.
 * cs-cell-bool centers the indicator visually. */
[data-module="channel-schedule"] .cs-cell-bool {
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-bool-check {
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 1.5px solid var(--border-strong);
  border-radius: 3px;
  background: var(--input-bg);
  vertical-align: middle;
  position: relative;
  transition: background 0.1s, border-color 0.1s;
}
[data-module="channel-schedule"] .cs-bool-check.cs-bool-check-on {
  background: var(--accent);
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-bool-check.cs-bool-check-on::after {
  content: '';
  position: absolute;
  left: 3px;
  top: 0px;
  width: 4px;
  height: 8px;
  border: solid var(--bg);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
[data-module="channel-schedule"] .cs-cell-bool:hover .cs-bool-check {
  border-color: var(--accent);
}

/* Body-mounted row context menu. Two-tier scoped via the dual selector
 * since .cs-row-menu IS the body-mounted root (data-module set on
 * itself). z-index sits above the dock (z:80) and combobox (z:90) but
 * below modals (z:9000).
 *
 * Layout: a section-grouped popover. Each group can have an optional
 * muted title; items render with a left-aligned label and an optional
 * right-aligned shortcut hint. Sections are visually separated by a
 * thin rule, not bullet dividers, so the menu reads as related groups
 * rather than a long undifferentiated list. */
[data-module="channel-schedule"] .cs-row-menu,
.cs-row-menu[data-module="channel-schedule"] {
  position: fixed;
  z-index: 95;
  min-width: 240px;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: 10px;
  box-shadow: var(--shadow-lg);
  padding: 6px;
  font-size: 13px;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-row-menu-section-title {
  text-transform: uppercase;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.6px;
  color: var(--text-tertiary);
  padding: 8px 10px 4px;
}
[data-module="channel-schedule"] .cs-row-menu-item {
  display: flex; align-items: center;
  width: 100%;
  padding: 8px 10px;
  background: transparent;
  border: 0;
  border-radius: 6px;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
  gap: 12px;
}
[data-module="channel-schedule"] .cs-row-menu-item:hover,
[data-module="channel-schedule"] .cs-row-menu-item:focus {
  background: var(--row-hover);
  outline: none;
}
[data-module="channel-schedule"] .cs-row-menu-item-danger {
  color: var(--error);
}
[data-module="channel-schedule"] .cs-row-menu-item-danger:hover,
[data-module="channel-schedule"] .cs-row-menu-item-danger:focus {
  background: var(--error-soft);
}
[data-module="channel-schedule"] .cs-row-menu-item-disabled {
  cursor: default;
  color: var(--text-tertiary);
  opacity: 0.55;
}
[data-module="channel-schedule"] .cs-row-menu-item-disabled:hover {
  background: transparent;
}
[data-module="channel-schedule"] .cs-row-menu-label {
  flex: 1;
  min-width: 0;
}
[data-module="channel-schedule"] .cs-row-menu-shortcut {
  color: var(--text-tertiary);
  font-size: 11px;
  letter-spacing: 0.3px;
  font-variant-numeric: tabular-nums;
}
[data-module="channel-schedule"] .cs-row-menu-sep {
  height: 1px;
  background: var(--border);
  margin: 6px 4px;
}

/* Row-select gutter + batch action bar ----------------------------- */
[data-module="channel-schedule"] .cs-gutter {
  width: 36px;
  min-width: 36px;
  flex: 0 0 36px;
  padding: 4px 0;
  text-align: center;
  cursor: pointer;
  user-select: none;
  border-right: 1px solid var(--border);
  box-sizing: border-box;
}
[data-module="channel-schedule"] .cs-gutter-spacer {
  cursor: default;
  background: transparent;
}
[data-module="channel-schedule"] .cs-gutter-header { cursor: pointer; }
[data-module="channel-schedule"] .cs-gutter:hover .cs-gutter-check {
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-gutter-check {
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 1.5px solid var(--border-strong);
  border-radius: 3px;
  background: var(--input-bg);
  vertical-align: middle;
  position: relative;
  box-sizing: border-box;
}
[data-module="channel-schedule"] .cs-gutter-check-on {
  background: var(--accent);
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-gutter-check-on::after {
  content: '';
  position: absolute;
  left: 3px;
  top: 0px;
  width: 4px;
  height: 8px;
  border: solid white;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
[data-module="channel-schedule"] .cs-gutter-check-indeterminate {
  background: var(--accent-soft);
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-gutter-check-indeterminate::after {
  content: '';
  position: absolute;
  left: 2px;
  right: 2px;
  top: 5px;
  height: 2px;
  background: var(--accent);
}
[data-module="channel-schedule"] .cs-row-selected {
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-row-selected:hover {
  background: var(--accent-soft);
  filter: brightness(1.05);
}
[data-module="channel-schedule"] .cs-batch-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 16px;
  background: var(--accent-soft);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-batch-count {
  font-weight: 600;
  color: var(--accent);
  font-size: 13px;
}
[data-module="channel-schedule"] .cs-batch-actions {
  display: flex;
  gap: 6px;
}

/* Combobox cell editor: vocab-backed text input + filtered dropdown. */
[data-module="channel-schedule"] .cs-cb-wrap {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
}
[data-module="channel-schedule"] .cs-cb-input {
  width: 100%;
  height: 100%;
}
/* Body-mounted combobox menu. position: fixed so it escapes the
 * editing cell's overflow ancestors AND, critically, escapes the
 * sticky/transform stacking on the frozen column (LOCATION) -- a
 * position: absolute menu inherits the sticky cell's offsets and
 * renders mis-aligned during horizontal scroll. JS computes top/left
 * from the input's bounding rect on open + scroll + resize. */
[data-module="channel-schedule"] .cs-cb-menu,
.cs-cb-menu[data-module="channel-schedule"] {
  position: fixed;
  max-height: 220px;
  overflow-y: auto;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: 4px;
  box-shadow: var(--shadow);
  /* Must sit above the floating dock (z:80). */
  z-index: 90;
  font-size: 12px;
}
[data-module="channel-schedule"] .cs-cb-item {
  padding: 4px 10px;
  cursor: pointer;
  color: var(--text-primary);
  white-space: nowrap;
}
[data-module="channel-schedule"] .cs-cb-item:hover,
[data-module="channel-schedule"] .cs-cb-item-active {
  background: var(--accent-soft);
  color: var(--accent);
}
[data-module="channel-schedule"] .cs-cb-empty {
  padding: 6px 10px;
  color: var(--text-tertiary);
  font-size: 11px;
  font-style: italic;
}
@keyframes cs-cell-saved-pulse {
  0%   { background: var(--success-soft, rgba(52,211,153,0.3)); }
  100% { background: transparent; }
}
[data-module="channel-schedule"] .cs-cell.cs-cell-saved-pulse {
  animation: cs-cell-saved-pulse 600ms ease-out;
}

/* Filter bar. */
[data-module="channel-schedule"] .cs-filterbar {
  display: flex; align-items: center; gap: 12px;
  padding: 8px 16px;
  border-bottom: 1px solid var(--border);
  background: var(--panel-2);
  flex-wrap: wrap;
}
[data-module="channel-schedule"] .cs-filterbar-search {
  position: relative; flex: 1; min-width: 220px; max-width: 380px;
}
[data-module="channel-schedule"] .cs-search-input {
  width: 100%;
  padding: 6px 10px 6px 10px; padding-right: 28px;
  border: 1px solid var(--border-strong);
  background: var(--input-bg); color: var(--text-primary);
  border-radius: 6px; font-size: 13px;
}
[data-module="channel-schedule"] .cs-search-clear {
  position: absolute; top: 50%; right: 4px; transform: translateY(-50%);
  padding: 2px 6px; line-height: 1; font-size: 16px;
}
[data-module="channel-schedule"] .cs-filterbar-chips { display: flex; gap: 6px; flex-wrap: wrap; }
[data-module="channel-schedule"] .cs-chip {
  padding: 4px 10px;
  border: 1px solid var(--border-strong);
  background: var(--panel); color: var(--text-secondary);
  border-radius: 99px; font-size: 12px; cursor: pointer;
  transition: background-color 0.1s, border-color 0.1s, color 0.1s;
}
[data-module="channel-schedule"] .cs-chip:hover { border-color: var(--accent-line); color: var(--text-primary); }
[data-module="channel-schedule"] .cs-chip-active {
  background: var(--accent-soft); border-color: var(--accent);
  color: var(--accent); font-weight: 600;
}
[data-module="channel-schedule"] .cs-filterbar-spacer { flex: 1; min-width: 12px; }
[data-module="channel-schedule"] .cs-density-toggle {
  display: inline-flex; border: 1px solid var(--border-strong); border-radius: 6px; overflow: hidden;
}
[data-module="channel-schedule"] .cs-density-btn {
  background: var(--panel); color: var(--text-secondary);
  border: 0; padding: 4px 10px; font-size: 12px; cursor: pointer; line-height: 1;
}
[data-module="channel-schedule"] .cs-density-btn-active { background: var(--accent-soft); color: var(--accent); }
[data-module="channel-schedule"] .cs-density-btn:not(:last-child) { border-right: 1px solid var(--border-strong); }
[data-module="channel-schedule"] .cs-filterbar-select {
  display: flex; align-items: center; gap: 6px;
  font-size: 12px; color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-filterbar-select select {
  padding: 4px 8px;
  border: 1px solid var(--border-strong);
  background: var(--input-bg); color: var(--text-primary);
  border-radius: 6px; font-size: 13px;
}
[data-module="channel-schedule"] .cs-filter-hint {
  padding: 6px 12px; background: var(--accent-soft); color: var(--text-secondary);
  font-size: 12px; border-bottom: 1px solid var(--border);
  display: flex; align-items: center; gap: 12px;
}
[data-module="channel-schedule"] .cs-filter-hint .btn-ghost { font-size: 12px; padding: 2px 8px; }

/* Frozen columns. z-index sits ABOVE the editing-cell stacking context
 * (.cs-cell-editing is z:10) so a non-frozen cell being edited is still
 * clipped behind the frozen columns when it scrolls past them
 * horizontally. Without this, the editing outline + content overlap
 * the frozen LOCATION/CH#/CIRCUIT columns and look broken. */
[data-module="channel-schedule"] .cs-cell.cs-cell-frozen {
  position: sticky; background: var(--panel);
  z-index: 12; border-right: 1px solid var(--border-strong);
}
[data-module="channel-schedule"] .cs-grid-header .cs-cell-frozen {
  background: var(--panel-2);
  /* Header frozen cells sit at the corner of two sticky directions
   * (sticky-top + sticky-left); needs to land above both the header
   * row (z:16) and any frozen body cell. */
  z-index: 18;
}
/* Row tints (--row-hover, --row-alt) are semi-transparent rgba so
 * applying them directly as a frozen cell's background lets the cells
 * scrolling underneath show through during horizontal scroll. Layer
 * the tint OVER a solid var(--panel) so the frozen column stays fully
 * opaque. Matches the fix in fixture-list/index.css. */
[data-module="channel-schedule"] .cs-row:hover .cs-cell-frozen {
  background:
    linear-gradient(var(--row-hover), var(--row-hover)),
    var(--panel);
}
[data-module="channel-schedule"] .cs-cell.cs-cell-computed.cs-cell-frozen {
  background:
    linear-gradient(var(--row-alt), var(--row-alt)),
    var(--panel);
}

/* Sort headers */
[data-module="channel-schedule"] .cs-header { cursor: pointer; user-select: none; }
[data-module="channel-schedule"] .cs-header:hover { color: var(--text-primary); background: var(--panel-2); }
[data-module="channel-schedule"] .cs-header-sorted { color: var(--accent); }
[data-module="channel-schedule"] .cs-sort-arrow { margin-left: 4px; font-size: 10px; }

/* Density compact. */
[data-module="channel-schedule"] .cs-density-compact .cs-cell {
  padding: 2px 6px; font-size: 12px;
}
[data-module="channel-schedule"] .cs-density-compact .cs-area-header { padding: 6px 12px; }
[data-module="channel-schedule"] .cs-density-compact .cs-area-totals { padding: 4px 12px; }

/* Hover. */
[data-module="channel-schedule"] .cs-row:hover { background: var(--row-hover); }

/* ============================================================
   Floating dock: bottom-anchored command bar
   ============================================================ */
[data-module="channel-schedule"] .cs-dock {
  position: fixed;
  left: 50%;
  bottom: 24px;
  transform: translateX(-50%);
  width: calc(100% - 48px);
  max-width: 880px;
  background: color-mix(in srgb, var(--panel-2) 92%, transparent);
  backdrop-filter: saturate(1.2) blur(18px);
  -webkit-backdrop-filter: saturate(1.2) blur(18px);
  border: 1px solid color-mix(in srgb, var(--border-strong) 80%, transparent);
  border-radius: 16px;
  box-shadow:
    0 20px 60px -16px rgba(0, 0, 0, 0.55),
    0 4px 12px -2px rgba(0, 0, 0, 0.35),
    inset 0 1px 0 rgba(255, 255, 255, 0.04);
  z-index: 80;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: box-shadow 180ms ease;
}
[data-module="channel-schedule"] .cs-dock-expanded {
  box-shadow:
    0 32px 80px -20px rgba(0, 0, 0, 0.65),
    0 8px 20px -4px rgba(0, 0, 0, 0.40),
    inset 0 1px 0 rgba(255, 255, 255, 0.05);
}

/* Collapsed FAB (bottom-right corner). */
[data-module="channel-schedule"] .cs-dock-fab {
  position: fixed;
  left: auto;
  right: 24px;
  bottom: 24px;
  transform: none;
  width: 48px;
  height: 48px;
  padding: 0;
  border-radius: 50%;
  background: var(--accent);
  color: white;
  border: 0;
  box-shadow:
    0 10px 28px -6px rgba(0, 0, 0, 0.55),
    0 3px 8px -2px rgba(0, 0, 0, 0.30);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  z-index: 80;
}
[data-module="channel-schedule"] .cs-dock-fab:hover {
  filter: brightness(1.08);
  transform: scale(1.05);
  transition: transform 120ms ease;
}
[data-module="channel-schedule"] .cs-dock-fab-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  background: var(--panel);
  color: var(--accent);
  border: 2px solid var(--accent);
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  line-height: 16px;
  text-align: center;
}
[data-module="channel-schedule"] .cs-dock-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 12px;
  min-height: 48px;
}
[data-module="channel-schedule"] .cs-dock-input-row {
  background: var(--input-bg);
}
[data-module="channel-schedule"] .cs-dock-add {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent);
  border-radius: 8px;
  cursor: pointer;
  font-family: inherit;
  white-space: nowrap;
}
[data-module="channel-schedule"] .cs-dock-add:hover { filter: brightness(1.08); }
[data-module="channel-schedule"] .cs-dock-sep {
  width: 1px;
  height: 24px;
  background: var(--border);
}
[data-module="channel-schedule"] .cs-dock-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--text-secondary);
  width: 20px;
  height: 20px;
  flex: 0 0 20px;
}
[data-module="channel-schedule"] .cs-dock-input {
  flex: 1;
  min-width: 0;
  padding: 6px 4px;
  border: 0;
  background: transparent;
  color: var(--text-primary);
  font-size: 14px;
  font-family: inherit;
  outline: none;
}
[data-module="channel-schedule"] .cs-dock-input::placeholder {
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-dock-icon-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: 1px solid transparent;
  background: transparent;
  color: var(--text-secondary);
  border-radius: 8px;
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-dock-icon-btn:hover {
  background: var(--row-hover);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dock-icon-btn-active {
  background: var(--accent-soft);
  color: var(--accent);
  border-color: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-dock-dot {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
}

[data-module="channel-schedule"] .cs-dock-panel {
  padding: 12px 14px;
  border-bottom: 1px solid var(--border);
}

/* Selection mode */
[data-module="channel-schedule"] .cs-dock-selection {
  background: color-mix(in srgb, var(--accent) 15%, var(--panel-2));
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-dock-selection .cs-dock-row {
  justify-content: space-between;
  padding: 10px 14px;
}
[data-module="channel-schedule"] .cs-dock-count {
  font-size: 13px;
  color: var(--text-primary);
  font-weight: 500;
}
[data-module="channel-schedule"] .cs-dock-count-num {
  display: inline-block;
  padding: 2px 8px;
  margin-right: 4px;
  background: var(--accent);
  color: white;
  border-radius: 999px;
  font-weight: 700;
  font-size: 12px;
  min-width: 20px;
  text-align: center;
}
[data-module="channel-schedule"] .cs-dock-actions {
  display: flex;
  gap: 6px;
  flex: 1;
  justify-content: center;
}
[data-module="channel-schedule"] .cs-dock-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  font-size: 13px;
  font-weight: 500;
  color: var(--text-primary);
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: 8px;
  cursor: pointer;
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-dock-btn:hover {
  background: var(--row-hover);
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-dock-btn-danger {
  background: color-mix(in srgb, var(--error) 20%, var(--panel));
  border-color: color-mix(in srgb, var(--error) 40%, var(--border-strong));
  color: var(--error);
}
[data-module="channel-schedule"] .cs-dock-btn-danger:hover {
  background: color-mix(in srgb, var(--error) 35%, var(--panel));
  color: white;
}
[data-module="channel-schedule"] .cs-dock-btn-ghost {
  background: transparent;
  border-color: transparent;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dock-btn-ghost:hover {
  background: var(--row-hover);
  color: var(--text-primary);
}

/* Filter panel */
[data-module="channel-schedule"] .cs-dock-panel-filter {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
[data-module="channel-schedule"] .cs-dock-filter-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-dock-chip {
  padding: 4px 12px;
  font-size: 12px;
  color: var(--text-secondary);
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 999px;
  cursor: pointer;
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-dock-chip:hover {
  border-color: var(--border-strong);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dock-chip-active {
  background: var(--accent-soft);
  color: var(--accent);
  border-color: var(--accent);
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-dock-filter-view {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-top: 8px;
  border-top: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-dock-view-select {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dock-view-select select {
  padding: 4px 8px;
  background: var(--input-bg);
  color: var(--text-primary);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  font-size: 12px;
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-dock-density {
  display: inline-flex;
  gap: 2px;
  padding: 2px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 8px;
}
[data-module="channel-schedule"] .cs-dock-density-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  background: transparent;
  color: var(--text-secondary);
  border: 0;
  border-radius: 6px;
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-dock-density-btn.is-on {
  background: var(--accent-soft);
  color: var(--accent);
}

@media (max-width: 720px) {
  [data-module="channel-schedule"] .cs-dock {
    width: calc(100% - 16px);
    bottom: 12px;
    border-radius: 12px;
  }
  [data-module="channel-schedule"] .cs-dock-selection .cs-dock-row {
    flex-wrap: wrap;
  }
  [data-module="channel-schedule"] .cs-dock-actions {
    order: 3;
    width: 100%;
    justify-content: flex-start;
  }
}

/* ============================================================
   Quick-add two-panel editor. Mirrors the fixture-list .fl-lp* /
   .fl-rp* / .fl-commit-* styles with a cs- prefix so the two docks
   share a visual language without importing each other's CSS.
   On-accent foreground token reused from the FL :root block so
   toggle thumbs stay white against var(--accent) in both themes.
   ============================================================ */

@keyframes cs-qa-fade-in {
  from { opacity: 0; transform: translateY(2px); }
  to { opacity: 1; transform: translateY(0); }
}

[data-module="channel-schedule"] .cs-exp-panel {
  display: grid;
  grid-template-columns: 216px 1fr;
  animation: cs-qa-fade-in 140ms ease-out;
}

/* Panel-collapse rules:
 *   no data-panel        -> open on >=721px, hidden on <=720px
 *   data-panel="open"    -> user forced open (manual chevron click)
 *   data-panel="closed"  -> user forced closed */
@media (max-width: 720px) {
  [data-module="channel-schedule"] .cs-dock-quickadd:not([data-panel="open"]) .cs-exp-panel,
  [data-module="channel-schedule"] .cs-dock-quickadd:not([data-panel="open"]) .cs-dock-footer {
    display: none;
  }
}
[data-module="channel-schedule"] .cs-dock-quickadd[data-panel="closed"] .cs-exp-panel,
[data-module="channel-schedule"] .cs-dock-quickadd[data-panel="closed"] .cs-dock-footer {
  display: none;
}

/* LEFT panel --------------------------------------------------- */
[data-module="channel-schedule"] .cs-lp {
  padding: 13px 13px 13px 14px;
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: 10px;
}
[data-module="channel-schedule"] .cs-lp-eyebrow {
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-lp-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
  position: relative;
}
[data-module="channel-schedule"] .cs-lp-label {
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-lp-num-input {
  font-family: inherit;
  font-size: 28px;
  font-weight: 700;
  color: var(--accent);
  letter-spacing: -0.5px;
  line-height: 1;
  background: transparent;
  border: 0;
  outline: none;
  border-bottom: 2px solid transparent;
  padding: 0 0 1px;
  width: 100%;
  transition: border-color 0.15s;
  caret-color: var(--accent);
  /* Hide number-spinner on desktop; CH# is usually typed not scrolled. */
  -moz-appearance: textfield;
  appearance: textfield;
}
[data-module="channel-schedule"] .cs-lp-num-input::-webkit-inner-spin-button,
[data-module="channel-schedule"] .cs-lp-num-input::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
[data-module="channel-schedule"] .cs-lp-num-input:hover { border-bottom-color: var(--border-strong); }
[data-module="channel-schedule"] .cs-lp-num-input:focus { border-bottom-color: var(--accent); }
[data-module="channel-schedule"] .cs-lp-text {
  width: 100%;
  padding: 4px 8px;
  font-size: 13px;
  color: var(--text-primary);
  background: var(--input-bg);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  font-family: ui-monospace, monospace;
  outline: none;
  transition: border-color 0.15s;
}
[data-module="channel-schedule"] .cs-lp-text:focus { border-color: var(--accent); }
[data-module="channel-schedule"] .cs-lp-circ-badge {
  position: absolute;
  right: 6px;
  top: 22px;
  padding: 1px 6px;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--accent);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  border-radius: 4px;
  pointer-events: none;
}

/* LEFT toggles at the bottom of the left panel */
[data-module="channel-schedule"] .cs-lp-toggles {
  display: flex;
  flex-direction: column;
  gap: 7px;
  margin-top: auto;
}
[data-module="channel-schedule"] .cs-lp-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-family: inherit;
  background: transparent;
  border: 0;
  padding: 0;
  text-align: left;
}
[data-module="channel-schedule"] .cs-lp-toggle:hover .cs-toggle-track { border-color: var(--border-strong); }
[data-module="channel-schedule"] .cs-toggle-track {
  width: 28px;
  height: 16px;
  border-radius: 999px;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  position: relative;
  flex-shrink: 0;
  transition: background-color 0.15s, border-color 0.15s;
}
[data-module="channel-schedule"] .cs-lp-toggle.is-on .cs-toggle-track {
  background: var(--accent);
  border-color: var(--accent);
}
[data-module="channel-schedule"] .cs-toggle-thumb {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--text-tertiary);
  transition: transform 0.15s, background-color 0.15s;
}
[data-module="channel-schedule"] .cs-lp-toggle.is-on .cs-toggle-thumb {
  transform: translateX(12px);
  background: var(--fl-on-accent, #ffffff);
}
[data-module="channel-schedule"] .cs-toggle-label {
  font-size: 11px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-lp-toggle.is-on .cs-toggle-label { color: var(--text-primary); }

/* RIGHT panel ---------------------------------------------- */
[data-module="channel-schedule"] .cs-rp {
  display: flex;
  flex-direction: column;
  gap: 0;
}
[data-module="channel-schedule"] .cs-rp-desc-block {
  padding: 11px 14px 10px;
  border-bottom: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-rp-field-label {
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-rp-desc-input {
  width: 100%;
  padding: 5px 8px;
  font-size: 12px;
  font-weight: 500;
  color: var(--text-primary);
  background: var(--input-bg);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  font-family: inherit;
  outline: none;
  transition: border-color 0.15s;
}
[data-module="channel-schedule"] .cs-rp-desc-input:focus { border-color: var(--accent); }
[data-module="channel-schedule"] .cs-rp-suggestions {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
[data-module="channel-schedule"] .cs-rp-sug {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  border-radius: 4px;
  font-size: 10px;
  color: var(--text-tertiary);
  background: var(--panel);
  border: 1px solid var(--border);
  cursor: pointer;
  font-family: inherit;
  transition: color 120ms ease, border-color 120ms ease, background-color 120ms ease;
  white-space: nowrap;
  line-height: 1.4;
}
[data-module="channel-schedule"] .cs-rp-sug:hover {
  color: var(--text-primary);
  border-color: var(--accent);
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-rp-loc-row {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 1px;
}
[data-module="channel-schedule"] .cs-rp-loc-label {
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-tertiary);
  white-space: nowrap;
  flex-shrink: 0;
}
[data-module="channel-schedule"] .cs-rp-loc-input {
  flex: 1;
  padding: 4px 8px;
  font-size: 11px;
  color: var(--text-primary);
  background: var(--input-bg);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  font-family: inherit;
  outline: none;
  transition: border-color 0.15s;
}
[data-module="channel-schedule"] .cs-rp-loc-input:focus { border-color: var(--accent); }

/* Fixture rows list */
[data-module="channel-schedule"] .cs-rp-fixtures {
  padding: 10px 14px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-fx-row {
  display: flex;
  align-items: center;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-fx-code {
  flex: 1;
  padding: 4px 6px;
  font-size: 12px;
  color: var(--text-primary);
  background: var(--input-bg);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  font-family: ui-monospace, monospace;
  outline: none;
  transition: border-color 0.15s;
}
[data-module="channel-schedule"] .cs-fx-code:focus { border-color: var(--accent); }
[data-module="channel-schedule"] .cs-fx-x {
  font-size: 11px;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-fx-qty {
  width: 56px;
  padding: 4px 6px;
  font-size: 12px;
  color: var(--text-primary);
  background: var(--input-bg);
  border: 1px solid var(--border-strong);
  border-radius: 6px;
  font-family: ui-monospace, monospace;
  outline: none;
  text-align: right;
}
[data-module="channel-schedule"] .cs-fx-qty:focus { border-color: var(--accent); }
[data-module="channel-schedule"] .cs-fx-linear {
  font-size: 11px;
  color: var(--text-tertiary);
  margin-left: -2px;
}
[data-module="channel-schedule"] .cs-fx-remove {
  width: 20px;
  height: 20px;
  padding: 0;
  background: transparent;
  border: 0;
  color: var(--text-tertiary);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  border-radius: 4px;
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-fx-remove:hover {
  background: var(--row-hover);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-rp-add-fixture {
  align-self: flex-start;
  padding: 3px 10px;
  background: transparent;
  border: 1px dashed var(--border);
  color: var(--text-tertiary);
  border-radius: 6px;
  font-size: 11px;
  cursor: pointer;
  font-family: inherit;
  transition: color 120ms ease, border-color 120ms ease, background-color 120ms ease;
}
[data-module="channel-schedule"] .cs-rp-add-fixture:hover {
  color: var(--accent);
  border-color: var(--accent);
  border-style: solid;
  background: var(--accent-soft);
}

/* Commit footer ------------------------------------------ */
[data-module="channel-schedule"] .cs-dock-footer {
  padding: 10px 14px;
  background: var(--panel-2);
  border-top: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-commit-btn {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 9px 16px;
  background: var(--accent-soft);
  color: var(--accent);
  border: 1px solid var(--accent-line);
  border-radius: 8px;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  transition: background-color 0.12s;
  text-align: left;
}
[data-module="channel-schedule"] .cs-commit-btn:hover {
  background: color-mix(in srgb, var(--accent) 22%, transparent);
}
[data-module="channel-schedule"] .cs-commit-label { flex: 1; }
[data-module="channel-schedule"] .cs-commit-right {
  font-size: 11px;
  opacity: 0.65;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-commit-right kbd {
  padding: 2px 6px;
  background: color-mix(in srgb, var(--accent) 15%, transparent);
  border: 1px solid var(--accent-line);
  border-radius: 4px;
  font-family: ui-monospace, monospace;
  font-size: 10px;
  color: var(--accent);
  opacity: 1;
}

/* Quick-add hint panel (empty state) + parser notes */
[data-module="channel-schedule"] .cs-dock-panel-hint {
  font-size: 12px;
  color: var(--text-tertiary);
  line-height: 1.5;
  padding: 12px 14px;
}
[data-module="channel-schedule"] .cs-dock-panel-hint code {
  padding: 1px 5px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 3px;
  font-family: ui-monospace, monospace;
  font-size: 11px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dock-panel-hint kbd {
  padding: 1px 5px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 3px;
  font-family: ui-monospace, monospace;
  font-size: 11px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-qa-note {
  padding: 6px 14px;
  font-size: 11px;
  color: var(--text-tertiary);
  background: var(--panel-2);
  border-bottom: 1px solid var(--border);
  font-style: italic;
}

/* Search input kept visible next to the freeform quick-add input */
[data-module="channel-schedule"] .cs-dock-search {
  padding: 6px 10px;
  font-size: 13px;
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text-secondary);
  border-radius: 6px;
  outline: none;
  max-width: 180px;
}
[data-module="channel-schedule"] .cs-dock-search:focus {
  border-color: var(--accent);
  color: var(--text-primary);
}

/* Responsive: stack the two-panel editor at narrow widths */
@media (max-width: 560px) {
  [data-module="channel-schedule"] .cs-exp-panel {
    grid-template-columns: 1fr;
  }
  [data-module="channel-schedule"] .cs-lp {
    border-right: 0;
    border-bottom: 1px solid var(--border);
  }
  [data-module="channel-schedule"] .cs-dock-search { display: none; }
}

/* ---------------------------------------------------------------------- *
 * Subview tab strip + visibility-toggle dropdown (Stage 5 Track B).
 * Sits below the main toolbar; tabs flip between Schedule / Totals /
 * Supplier Matrix / etc. Settings dropdown lets the user hide/show
 * subviews per project (persisted via ctx.platform.activeProject.
 * setSubviewVisible).
 * ---------------------------------------------------------------------- */
[data-module="channel-schedule"] .cs-subviewbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 6px 16px 8px;
  border-bottom: 1px solid var(--border);
  gap: 12px;
  background: var(--panel);
}
[data-module="channel-schedule"] .cs-subviewtabs {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 4px;
}
[data-module="channel-schedule"] .cs-subviewtab {
  padding: 4px 12px;
  font-size: 12px;
  font-weight: 500;
  color: var(--text-secondary);
  background: transparent;
  border: 1px solid transparent;
  border-radius: 6px;
  cursor: pointer;
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-subviewtab:hover {
  color: var(--text-primary);
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-subviewtab-active {
  color: var(--text-primary);
  background: var(--accent-soft);
  border-color: var(--accent-line);
  cursor: default;
}
[data-module="channel-schedule"] .cs-subviewtab-active:hover {
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-subview-settings {
  position: relative;
}
[data-module="channel-schedule"] .cs-subview-settings-btn {
  font-size: 16px;
  line-height: 1;
  padding: 2px 10px;
  min-height: 24px;
}
[data-module="channel-schedule"] .cs-subview-settings-btn-active {
  background: var(--row-hover);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-subview-menu {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 90;
  min-width: 200px;
  padding: 8px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: var(--shadow-lg);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
[data-module="channel-schedule"] .cs-subview-menu-title {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-tertiary);
  padding: 4px 6px;
}
[data-module="channel-schedule"] .cs-subview-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border-radius: 6px;
  cursor: pointer;
  font-size: 13px;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-subview-toggle:hover {
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-subview-toggle input[type="checkbox"] {
  margin: 0;
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-subview-toggle-mandatory {
  color: var(--text-tertiary);
  cursor: not-allowed;
}
[data-module="channel-schedule"] .cs-subview-toggle-mandatory input[type="checkbox"] {
  cursor: not-allowed;
}

/* ---------------------------------------------------------------------- *
 * Totals subview (Stage 5 Track B, family spec 4.9.4).
 * Read-only summary; no editing affordances.
 * ---------------------------------------------------------------------- */
[data-module="channel-schedule"] .cs-totals {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 24px;
  max-width: 1200px;
}
[data-module="channel-schedule"] .cs-totals-empty-shell {
  padding: 40px 24px;
  text-align: center;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-totals-section {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 16px 20px;
}
[data-module="channel-schedule"] .cs-totals-section h3 {
  margin: 0 0 12px;
  font-size: 14px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-totals-section h4 {
  margin: 0 0 8px;
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-totals-grand {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 8px 16px;
  margin: 0 0 16px;
  padding: 0;
}
[data-module="channel-schedule"] .cs-totals-grand div {
  padding: 8px 12px;
  background: var(--panel-2);
  border-radius: 6px;
}
[data-module="channel-schedule"] .cs-totals-grand dt {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-totals-grand dd {
  margin: 2px 0 0;
  font-size: 16px;
  font-weight: 600;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-totals-twoup {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 16px;
}
[data-module="channel-schedule"] .cs-totals-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}
[data-module="channel-schedule"] .cs-totals-table th,
[data-module="channel-schedule"] .cs-totals-table td {
  padding: 6px 10px;
  text-align: left;
  border-bottom: 1px solid var(--border);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-totals-table th {
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-tertiary);
  background: var(--panel-2);
}
[data-module="channel-schedule"] .cs-totals-table td.cs-num,
[data-module="channel-schedule"] .cs-totals-table th.cs-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}
[data-module="channel-schedule"] .cs-totals-table tbody tr:last-child td {
  border-bottom: 0;
}
[data-module="channel-schedule"] .cs-totals-empty {
  padding: 12px;
  color: var(--text-tertiary);
  font-style: italic;
  text-align: center;
}
[data-module="channel-schedule"] .cs-pill {
  display: inline-block;
  padding: 1px 8px;
  font-size: 11px;
  font-weight: 600;
  border-radius: 999px;
  background: var(--panel-2);
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-pill-em {
  background: var(--accent-soft);
  color: var(--accent);
}
[data-module="channel-schedule"] .cs-loading-spinner {
  width: 28px;
  height: 28px;
  border: 3px solid var(--border);
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: cs-spin 0.9s linear infinite;
  margin: 24px auto 8px;
}
@keyframes cs-spin { to { transform: rotate(360deg); } }

/* ---------------------------------------------------------------------- *
 * Supplier Matrix subview (Stage 5 Track B, family spec 4.9.1) -- rev 2.
 * Column-narrative model: card per group, ordered list of entries inside.
 * Entries are draggable; inline add at the bottom of each card opens
 * an autocomplete (body-mounted) for fixture refs + freetext fallback.
 * ---------------------------------------------------------------------- */
[data-module="channel-schedule"] .cs-sm {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 1600px;
}
[data-module="channel-schedule"] .cs-sm-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
[data-module="channel-schedule"] .cs-sm-header-text { flex: 1; min-width: 240px; }
[data-module="channel-schedule"] .cs-sm-header h2 {
  margin: 0 0 4px;
  font-size: 16px;
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-sm-help {
  margin: 0;
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-sm-empty {
  padding: 32px 24px;
  text-align: center;
  background: var(--panel);
  border: 1px dashed var(--border);
  border-radius: 10px;
}
[data-module="channel-schedule"] .cs-sm-empty h3 {
  margin: 0 0 8px;
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-sm-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 12px;
  align-items: start;
}
[data-module="channel-schedule"] .cs-sm-card {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  display: flex;
  flex-direction: column;
  min-height: 120px;
}
[data-module="channel-schedule"] .cs-sm-card.cs-sm-drop-card {
  border-color: var(--accent-line);
  box-shadow: 0 0 0 2px var(--accent-soft);
}

[data-module="channel-schedule"] .cs-sm-card-head {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  padding: 10px 10px 8px;
  border-bottom: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-sm-card-titles {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
[data-module="channel-schedule"] .cs-sm-card-title {
  background: transparent;
  border: 0;
  padding: 0;
  text-align: left;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-primary);
  cursor: pointer;
  font-family: inherit;
  line-height: 1.3;
}
[data-module="channel-schedule"] .cs-sm-card-title:hover {
  color: var(--accent);
}
[data-module="channel-schedule"] .cs-sm-card-title-readonly {
  cursor: default;
}
[data-module="channel-schedule"] .cs-sm-card-title-readonly:hover {
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-sm-card-sub {
  font-size: 11px;
  color: var(--text-tertiary);
  line-height: 1.3;
}
[data-module="channel-schedule"] .cs-sm-card-menu-wrap {
  position: relative;
}
[data-module="channel-schedule"] .cs-sm-group-menu {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 90;
  min-width: 160px;
  padding: 4px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: var(--shadow-lg);
  display: flex;
  flex-direction: column;
  gap: 1px;
}
[data-module="channel-schedule"] .cs-sm-group-menu button {
  background: transparent;
  border: 0;
  padding: 6px 10px;
  text-align: left;
  font-size: 12px;
  color: var(--text-primary);
  border-radius: 4px;
  cursor: pointer;
  font-family: inherit;
}
[data-module="channel-schedule"] .cs-sm-group-menu button:hover {
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-sm-group-menu .cs-sm-menu-danger {
  color: var(--error);
}

[data-module="channel-schedule"] .cs-sm-card-head-rename {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
[data-module="channel-schedule"] .cs-sm-rename-input,
[data-module="channel-schedule"] .cs-sm-rename-sub {
  width: 100%;
  font-family: inherit;
  font-size: 13px;
  padding: 4px 8px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--input-bg);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-sm-rename-sub { font-size: 11px; }
[data-module="channel-schedule"] .cs-sm-rename-actions {
  display: flex;
  gap: 6px;
  justify-content: flex-end;
}

/* Entry list inside a card */
[data-module="channel-schedule"] .cs-sm-list {
  list-style: none;
  margin: 0;
  padding: 4px 0;
  display: flex;
  flex-direction: column;
  flex: 1;
}
[data-module="channel-schedule"] .cs-sm-entry {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 4px;
  padding: 6px 8px 6px 4px;
  border-top: 1px solid transparent;
  border-bottom: 1px solid transparent;
  font-size: 12px;
  cursor: grab;
}
[data-module="channel-schedule"] .cs-sm-entry:hover {
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-sm-entry.is-dragging {
  opacity: 0.4;
}
[data-module="channel-schedule"] .cs-sm-entry.cs-sm-drop-above {
  border-top-color: var(--accent);
}
[data-module="channel-schedule"] .cs-sm-entry.cs-sm-drop-below {
  border-bottom-color: var(--accent);
}
[data-module="channel-schedule"] .cs-sm-entry-handle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 22px;
  padding: 0;
  background: transparent;
  border: 0;
  color: var(--text-tertiary);
  cursor: grab;
}
[data-module="channel-schedule"] .cs-sm-entry-handle:active { cursor: grabbing; }
[data-module="channel-schedule"] .cs-sm-entry-body {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-sm-entry-label {
  color: var(--text-primary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-weight: 500;
}
[data-module="channel-schedule"] .cs-sm-entry-sub {
  font-size: 10px;
  color: var(--text-tertiary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
[data-module="channel-schedule"] .cs-sm-entry-freetext {
  font-style: italic;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
[data-module="channel-schedule"] .cs-sm-entry-note {
  display: inline-block;
  padding: 0 5px;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  background: var(--accent-soft);
  color: var(--accent);
  border-radius: 3px;
  vertical-align: middle;
  margin-left: 4px;
}
[data-module="channel-schedule"] .cs-sm-missing {
  color: var(--error);
  font-style: italic;
}
[data-module="channel-schedule"] .cs-sm-entry-empty {
  list-style: none;
  padding: 12px 12px;
  font-size: 11px;
  color: var(--text-tertiary);
  font-style: italic;
  text-align: center;
}
[data-module="channel-schedule"] .cs-sm-entry-empty.cs-sm-drop-card {
  background: var(--accent-soft);
  color: var(--accent);
}

/* Entry inline action buttons (move up/down/remove); reveal on hover */
[data-module="channel-schedule"] .cs-sm-entry-actions {
  display: flex;
  gap: 1px;
  opacity: 0;
  transition: opacity 0.12s ease;
}
[data-module="channel-schedule"] .cs-sm-entry:hover .cs-sm-entry-actions,
[data-module="channel-schedule"] .cs-sm-entry:focus-within .cs-sm-entry-actions {
  opacity: 1;
}
[data-module="channel-schedule"] .cs-sm-icon-btn {
  width: 22px;
  height: 22px;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 4px;
  color: var(--text-tertiary);
  cursor: pointer;
  font-size: 14px;
  line-height: 1;
}
[data-module="channel-schedule"] .cs-sm-icon-btn:hover {
  background: var(--row-hover);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-sm-icon-btn[disabled] {
  opacity: 0.3;
  cursor: default;
}
[data-module="channel-schedule"] .cs-sm-icon-btn[disabled]:hover {
  background: transparent;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-sm-icon-danger:hover {
  color: var(--error);
}

/* Inline add-entry input (anchored autocomplete is body-mounted; styles
 * for that are below in the unscoped section). */
[data-module="channel-schedule"] .cs-sm-add-row {
  padding: 8px 10px;
  border-top: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-sm-add-input {
  width: 100%;
  font-family: inherit;
  font-size: 12px;
  padding: 5px 8px;
  background: var(--input-bg);
  border: 1px dashed var(--border-strong);
  border-radius: 6px;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-sm-add-input:focus {
  outline: none;
  border-style: solid;
  border-color: var(--accent-line);
  box-shadow: 0 0 0 2px var(--accent-soft);
}

/* "+ Add group" tile after the last card */
[data-module="channel-schedule"] .cs-sm-add-group-tile {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 120px;
  padding: 12px;
  font-family: inherit;
  font-size: 13px;
  color: var(--text-tertiary);
  background: transparent;
  border: 2px dashed var(--border);
  border-radius: 10px;
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-sm-add-group-tile:hover {
  color: var(--accent);
  border-color: var(--accent-line);
  background: var(--accent-soft);
}
[data-module="channel-schedule"] .cs-sm-add-group-plus {
  font-size: 18px;
  font-weight: 700;
}

/* Body-mounted autocomplete popover (Tier 2 -- anchor input is inside
 * the module, popover is on document.body so [data-module=...]
 * descendant selectors don't reach it; use .cs-sm-ac prefix as the
 * leak guard). data-module is mirrored on the popover so tokens
 * resolve in both themes. */
.cs-sm-ac {
  position: fixed;
  z-index: 4000;
  max-height: 280px;
  overflow-y: auto;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: var(--shadow-lg);
  display: flex;
  flex-direction: column;
  padding: 4px;
}
.cs-sm-ac-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 6px 8px;
  background: transparent;
  border: 0;
  border-radius: 4px;
  text-align: left;
  font-family: inherit;
  font-size: 12px;
  color: var(--text-primary);
  cursor: pointer;
}
.cs-sm-ac-row:hover, .cs-sm-ac-row.cs-sm-ac-on {
  background: var(--accent-soft);
}
.cs-sm-ac-code {
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--text-primary);
}
.cs-sm-ac-desc {
  color: var(--text-tertiary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cs-sm-ac-freetext { border-top: 1px solid var(--border); margin-top: 4px; padding-top: 8px; }
.cs-sm-ac-empty {
  padding: 8px 10px;
  font-size: 11px;
  color: var(--text-tertiary);
  font-style: italic;
}
.cs-sm-ac-divider {
  padding: 6px 10px 4px;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  border-top: 1px solid var(--border);
  margin-top: 4px;
}
.cs-sm-ac-row-elsewhere .cs-sm-ac-code,
.cs-sm-ac-row-elsewhere .cs-sm-ac-desc {
  opacity: 0.75;
}
.cs-sm-ac-elsewhere {
  margin-left: auto;
  padding: 1px 6px;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  border-radius: 999px;
  background: var(--row-alt);
  color: var(--text-tertiary);
  white-space: nowrap;
  flex: 0 0 auto;
}

/* Entry inline-editor modal (Tier 2 -- body-mounted via ctx.ui.modal,
 * .cs-sm-edit prefix as the leak guard). */
.cs-sm-edit-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 320px;
}
.cs-sm-edit-form label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 12px;
  color: var(--text-secondary);
}
.cs-sm-edit-form label span { font-weight: 600; }
.cs-sm-edit-form input,
.cs-sm-edit-form textarea {
  font-family: inherit;
  font-size: 13px;
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--input-bg);
  color: var(--text-primary);
}
.cs-sm-edit-hint {
  margin: 0;
  font-size: 11px;
  color: var(--text-tertiary);
  line-height: 1.4;
}

/* "Bulk add" button on the per-card add row (Tier 1 -- rendered inside
 * .cs-sm-add-row, scoped). */
[data-module="channel-schedule"] .cs-sm-add-row {
  display: flex;
  gap: 6px;
  align-items: center;
}
[data-module="channel-schedule"] .cs-sm-add-row .cs-sm-add-input {
  flex: 1;
  min-width: 0;
}
[data-module="channel-schedule"] .cs-sm-bulk-btn {
  flex: 0 0 auto;
  padding: 5px 10px;
  font-size: 11px;
  font-family: inherit;
  color: var(--text-secondary);
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 6px;
  cursor: pointer;
  white-space: nowrap;
}
[data-module="channel-schedule"] .cs-sm-bulk-btn:hover {
  color: var(--text-primary);
  background: var(--row-hover);
  border-color: var(--border-strong);
}

/* Bulk-add modal (Tier 2 -- body-mounted via ctx.ui.modal, .cs-sm-bulk-
 * prefix as leak guard). Toolbar (search + filter chips) at top, list
 * scrolls in the middle, footer pinned at the bottom. */
.cs-sm-bulk {
  display: flex;
  flex-direction: column;
  min-width: 480px;
  max-width: 720px;
  height: 60vh;
  max-height: 560px;
}
.cs-sm-bulk-toolbar {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--border);
}
.cs-sm-bulk-search {
  font-family: inherit;
  font-size: 13px;
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--input-bg);
  color: var(--text-primary);
  width: 100%;
}
.cs-sm-bulk-search:focus {
  outline: none;
  border-color: var(--accent-line);
  box-shadow: 0 0 0 2px var(--accent-soft);
}
.cs-sm-bulk-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
.cs-sm-bulk-chip {
  padding: 3px 10px;
  font-family: inherit;
  font-size: 11px;
  color: var(--text-secondary);
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: 999px;
  cursor: pointer;
}
.cs-sm-bulk-chip:hover {
  color: var(--text-primary);
  background: var(--row-hover);
}
.cs-sm-bulk-chip-on {
  color: var(--accent);
  background: var(--accent-soft);
  border-color: var(--accent-line);
}
.cs-sm-bulk-list {
  flex: 1;
  overflow-y: auto;
  padding: 6px 0;
}
.cs-sm-bulk-empty {
  padding: 24px 12px;
  text-align: center;
  font-size: 12px;
  color: var(--text-tertiary);
  font-style: italic;
}
.cs-sm-bulk-footer {
  display: flex;
  align-items: center;
  gap: 12px;
  padding-top: 10px;
  border-top: 1px solid var(--border);
}
.cs-sm-bulk-link {
  background: transparent;
  border: 0;
  padding: 0;
  font-family: inherit;
  font-size: 12px;
  color: var(--accent);
  cursor: pointer;
  text-decoration: none;
}
.cs-sm-bulk-link:hover {
  text-decoration: underline;
}
.cs-sm-bulk-count {
  margin-left: auto;
  font-size: 12px;
  font-weight: 600;
  color: var(--text-primary);
}

/* Per-row layout (label wrapping a checkbox + fixture metadata). */
.cs-sm-bulk-row {
  display: grid;
  grid-template-columns: auto auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px;
  padding: 6px 10px;
  border-radius: 6px;
  cursor: pointer;
  font-size: 13px;
}
.cs-sm-bulk-row:hover {
  background: var(--row-hover);
}
.cs-sm-bulk-row input[type="checkbox"] {
  margin: 0;
  cursor: pointer;
}
.cs-sm-bulk-row-code {
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--text-primary);
}
.cs-sm-bulk-row-desc {
  color: var(--text-secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cs-sm-bulk-row-dis {
  cursor: not-allowed;
  opacity: 0.55;
}
.cs-sm-bulk-row-dis:hover {
  background: transparent;
}
.cs-sm-bulk-tag {
  display: inline-block;
  padding: 1px 6px;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.04em;
  border-radius: 999px;
  text-transform: uppercase;
}
.cs-sm-bulk-tag-decor {
  background: var(--accent-soft);
  color: var(--accent);
}
.cs-sm-bulk-tag-ingroup {
  background: var(--row-alt);
  color: var(--text-tertiary);
}
.cs-sm-bulk-tag-elsewhere {
  background: var(--accent-soft);
  color: var(--accent);
  max-width: 140px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.cs-sm-bulk-row-elsewhere .cs-sm-bulk-row-code,
.cs-sm-bulk-row-elsewhere .cs-sm-bulk-row-desc {
  opacity: 0.85;
}

/* Cross-group reassignment confirmation modal (Tier 2 -- body-mounted via
 * ctx.ui.modal, .cs-sm-conflict prefix as the leak guard). Lists fixtures
 * that are already in another group when the user attempts to add them
 * to the target group, with three actions: Move / Keep in both / Cancel. */
.cs-sm-conflict {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 360px;
  max-width: 520px;
}
.cs-sm-conflict-lead {
  margin: 0;
  font-size: 13px;
  color: var(--text-primary);
  line-height: 1.45;
}
.cs-sm-conflict-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
  max-height: 280px;
  overflow-y: auto;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--panel-2);
  padding: 6px;
}
.cs-sm-conflict-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 6px;
  font-size: 12px;
  border-radius: 4px;
}
.cs-sm-conflict-row:hover {
  background: var(--row-hover);
}
.cs-sm-conflict-code {
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--text-primary);
  flex: 0 0 auto;
}
.cs-sm-conflict-desc {
  color: var(--text-tertiary);
  flex: 1 1 auto;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cs-sm-conflict-arrow {
  color: var(--text-tertiary);
  font-size: 11px;
  flex: 0 0 auto;
}
.cs-sm-conflict-groups {
  color: var(--accent);
  font-weight: 600;
  flex: 0 0 auto;
  max-width: 200px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ---------------------------------------------------------------------- *
 * Device Matrix subview (Stage 5 Track B, family spec 4.9.3).
 * Card grid: one card per control device enclosure (D1, D2, ...).
 * Each card lists assignments (fixture x qty -> channel).
 * ---------------------------------------------------------------------- */
[data-module="channel-schedule"] .cs-dm {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 1600px;
}
[data-module="channel-schedule"] .cs-dm-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
[data-module="channel-schedule"] .cs-dm-header-text {
  flex: 1;
  min-width: 240px;
}
[data-module="channel-schedule"] .cs-dm-header h2 {
  margin: 0 0 4px;
  font-size: 16px;
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-dm-help {
  margin: 0;
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dm-header-actions {
  display: flex;
  align-items: center;
  gap: 12px;
}
[data-module="channel-schedule"] .cs-dm-count {
  font-size: 12px;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-dm-empty {
  padding: 40px 24px;
  text-align: center;
  background: var(--panel);
  border: 1px dashed var(--border);
  border-radius: 10px;
}
[data-module="channel-schedule"] .cs-dm-empty h3 {
  margin: 0 0 8px;
  font-size: 14px;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dm-empty p {
  margin: 0 0 16px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dm-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
  gap: 16px;
}
[data-module="channel-schedule"] .cs-dm-card {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 14px 16px 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
[data-module="channel-schedule"] .cs-dm-card-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: 8px;
  border-bottom: 1px solid var(--border);
  padding-bottom: 10px;
}
[data-module="channel-schedule"] .cs-dm-card-title {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
  grid-column: 1 / -1;
}
[data-module="channel-schedule"] .cs-dm-loc {
  font-size: 18px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dm-cardesc {
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dm-card-meta {
  font-size: 11px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dm-circuit {
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
[data-module="channel-schedule"] .cs-dm-empty {
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-dm-card-actions {
  display: flex;
  gap: 4px;
  justify-self: end;
}
[data-module="channel-schedule"] .cs-dm-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
[data-module="channel-schedule"] .cs-dm-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr) auto;
  align-items: center;
  gap: 8px;
  padding: 6px 8px;
  border-radius: 6px;
  font-size: 12px;
}
[data-module="channel-schedule"] .cs-dm-row:hover {
  background: var(--row-hover);
}
[data-module="channel-schedule"] .cs-dm-row-qty {
  font-weight: 600;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dm-fxcode {
  font-weight: 600;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-dm-fxdesc {
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-dm-arrow {
  color: var(--text-tertiary);
  margin-right: 2px;
}
[data-module="channel-schedule"] .cs-dm-row-channel {
  color: var(--text-primary);
  font-size: 11px;
}
[data-module="channel-schedule"] .cs-dm-row-actions {
  display: flex;
  gap: 4px;
  opacity: 0;
  transition: opacity 0.12s ease;
}
[data-module="channel-schedule"] .cs-dm-row:hover .cs-dm-row-actions,
[data-module="channel-schedule"] .cs-dm-row:focus-within .cs-dm-row-actions {
  opacity: 1;
}
[data-module="channel-schedule"] .cs-dm-empty-row {
  padding: 8px 10px;
  font-size: 12px;
  color: var(--text-tertiary);
  font-style: italic;
}
[data-module="channel-schedule"] .cs-dm-missing {
  color: var(--error, var(--text-tertiary));
  font-style: italic;
}
[data-module="channel-schedule"] .cs-dm-add-row {
  align-self: flex-start;
}

/* Form modal -- Tier 2, unscoped, .cs-dm-form prefix as the leak guard. */
.cs-dm-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 320px;
}
.cs-dm-form label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 12px;
  color: var(--text-secondary);
}
.cs-dm-form label span {
  font-weight: 600;
  color: var(--text-secondary);
}
.cs-dm-form input,
.cs-dm-form select {
  font-size: 13px;
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--input-bg);
  color: var(--text-primary);
  font-family: inherit;
}
.cs-dm-form input:focus,
.cs-dm-form select:focus {
  outline: none;
  border-color: var(--accent-line);
  box-shadow: 0 0 0 2px var(--accent-soft);
}

/* ---------------------------------------------------------------------- *
 * Power Supply Matrix subview (Stage 5 Track B, family spec 4.9.2).
 * Section per power supply (driver) with a table of outputs underneath.
 * Per-output and per-driver overload highlighted via module-local
 * tokens (defined in :root / [data-theme="light"] below).
 * ---------------------------------------------------------------------- */
[data-module="channel-schedule"] {
  /* Module-local tokens. Family spec calls these --strata-overload but
   * the platform doesn't ship those, so we keep them module-scoped. */
  --cs-overload: #e0524d;
  --cs-overload-soft: rgba(224, 82, 77, 0.12);
  --cs-overload-line: rgba(224, 82, 77, 0.42);
}
[data-theme="light"] [data-module="channel-schedule"] {
  --cs-overload: #c92a25;
  --cs-overload-soft: rgba(201, 42, 37, 0.14);
  --cs-overload-line: rgba(201, 42, 37, 0.48);
}
[data-module="channel-schedule"] .cs-pm {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 1400px;
}
[data-module="channel-schedule"] .cs-pm-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
[data-module="channel-schedule"] .cs-pm-header-text {
  flex: 1;
  min-width: 240px;
}
[data-module="channel-schedule"] .cs-pm-header h2 {
  margin: 0 0 4px;
  font-size: 16px;
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-pm-help {
  margin: 0;
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-pm-header-actions {
  display: flex;
  gap: 12px;
  align-items: center;
}
[data-module="channel-schedule"] .cs-pm-count {
  font-size: 12px;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-pm-toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--text-secondary);
  cursor: pointer;
}
[data-module="channel-schedule"] .cs-pm-empty {
  padding: 40px 24px;
  text-align: center;
  background: var(--panel);
  border: 1px dashed var(--border);
  border-radius: 10px;
}
[data-module="channel-schedule"] .cs-pm-empty h3 {
  margin: 0 0 8px;
  font-size: 14px;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-pm-empty p {
  margin: 0 0 16px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-pm-list {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
[data-module="channel-schedule"] .cs-pm-card {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  overflow: hidden;
}
[data-module="channel-schedule"] .cs-pm-card-overload {
  border-color: var(--cs-overload-line);
  box-shadow: 0 0 0 1px var(--cs-overload-line) inset;
}
[data-module="channel-schedule"] .cs-pm-card-head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: 8px 12px;
  padding: 12px 16px;
  background: var(--panel-2);
  border-bottom: 1px solid var(--border);
}
[data-module="channel-schedule"] .cs-pm-card-overload .cs-pm-card-head {
  background: var(--cs-overload-soft);
  border-bottom-color: var(--cs-overload-line);
}
[data-module="channel-schedule"] .cs-pm-card-title {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
  grid-column: 1 / -1;
}
[data-module="channel-schedule"] .cs-pm-code {
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-pm-loc {
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-pm-circuit {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-tertiary);
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 1px 6px;
}
[data-module="channel-schedule"] .cs-pm-tag {
  display: inline-block;
  padding: 1px 6px;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.04em;
  border-radius: 999px;
  text-transform: uppercase;
}
[data-module="channel-schedule"] .cs-pm-tag-dedicated {
  background: var(--row-alt);
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-pm-card-meta {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-size: 11px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-pm-model {
  font-family: ui-monospace, SFMono-Regular, monospace;
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-pm-driver-load {
  font-weight: 600;
  font-size: 12px;
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-pm-card-actions {
  display: flex;
  gap: 4px;
  justify-self: end;
}
[data-module="channel-schedule"] .cs-pm-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
[data-module="channel-schedule"] .cs-pm-table th {
  text-align: left;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-tertiary);
  padding: 6px 12px;
  border-bottom: 1px solid var(--border);
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-pm-th-num,
[data-module="channel-schedule"] .cs-pm-cell-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}
[data-module="channel-schedule"] .cs-pm-table td {
  padding: 8px 12px;
  border-bottom: 1px solid var(--border);
  vertical-align: middle;
}
[data-module="channel-schedule"] .cs-pm-table tbody tr:last-child td {
  border-bottom: 0;
}
[data-module="channel-schedule"] .cs-pm-cell-out {
  font-weight: 600;
  color: var(--text-primary);
  font-family: ui-monospace, SFMono-Regular, monospace;
  width: 80px;
}
[data-module="channel-schedule"] .cs-pm-cell-channel {
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-pm-em {
  display: inline-block;
  padding: 0 5px;
  font-size: 9px;
  font-weight: 700;
  background: var(--accent-soft);
  color: var(--accent);
  border-radius: 3px;
  margin-left: 4px;
}
[data-module="channel-schedule"] .cs-pm-chdesc {
  color: var(--text-tertiary);
  font-size: 11px;
}
[data-module="channel-schedule"] .cs-pm-load {
  font-weight: 500;
}
[data-module="channel-schedule"] .cs-pm-load-bad {
  color: var(--cs-overload);
  font-weight: 700;
}
[data-module="channel-schedule"] .cs-pm-pct {
  font-weight: 400;
  color: var(--text-tertiary);
  margin-left: 2px;
}
[data-module="channel-schedule"] .cs-pm-row-overload,
[data-module="channel-schedule"] tr.cs-pm-overload {
  background: var(--cs-overload-soft);
}
[data-module="channel-schedule"] .cs-pm-cell-actions {
  text-align: right;
  width: 1%;
  white-space: nowrap;
}
[data-module="channel-schedule"] .cs-pm-empty-row {
  font-style: italic;
  color: var(--text-tertiary);
  text-align: center;
  padding: 12px;
}
[data-module="channel-schedule"] .cs-pm-missing {
  color: var(--cs-overload);
  font-style: italic;
}
[data-module="channel-schedule"] .cs-pm-add-output {
  margin: 8px 16px 12px;
}

/* Form modal -- Tier 2 unscoped, .cs-pm-form prefix as leak guard. */
.cs-pm-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 320px;
}
.cs-pm-form label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 12px;
  color: var(--text-secondary);
}
.cs-pm-form label span {
  font-weight: 600;
}
.cs-pm-form input,
.cs-pm-form select {
  font-size: 13px;
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--input-bg);
  color: var(--text-primary);
  font-family: inherit;
}
.cs-pm-form-checkbox {
  flex-direction: row !important;
  align-items: center !important;
  gap: 8px !important;
}
.cs-pm-form-checkbox input[type="checkbox"] {
  margin: 0;
  width: auto;
}

/* ============================================================
 * Accessories subview (Stage 5 Track D, §5.2)
 * Schedule-style grid with editable cells per channel-fixture row.
 * ============================================================ */

[data-module="channel-schedule"] .cs-acc {
  padding: 16px 24px 96px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
[data-module="channel-schedule"] .cs-acc-empty-shell {
  padding: 48px 24px;
  text-align: center;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-acc-header h2 {
  font-size: 18px;
  margin: 0 0 4px 0;
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-acc-help {
  margin: 0;
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-acc-section {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
[data-module="channel-schedule"] .cs-acc-area {
  font-size: 13px;
  font-weight: 600;
  margin: 0;
  padding: 6px 10px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: var(--button-radius);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-acc-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
[data-module="channel-schedule"] .cs-acc-table thead th {
  text-align: left;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border-strong);
  font-weight: 600;
  color: var(--text-secondary);
  background: var(--panel);
  position: sticky;
  top: 0;
  z-index: 1;
}
[data-module="channel-schedule"] .cs-acc-table tbody td {
  padding: 4px 8px;
  border-bottom: 1px solid var(--border);
  vertical-align: middle;
}
[data-module="channel-schedule"] .cs-acc-row-cont .cs-acc-num,
[data-module="channel-schedule"] .cs-acc-row-cont .cs-acc-loc {
  color: var(--text-tertiary);
}
[data-module="channel-schedule"] .cs-acc-row-empty .cs-acc-empty {
  color: var(--text-tertiary);
  font-style: italic;
}
[data-module="channel-schedule"] .cs-acc-cell {
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 4px 6px;
  font-size: 12px;
  color: var(--text-primary);
  font-family: inherit;
  box-sizing: border-box;
}
[data-module="channel-schedule"] .cs-acc-cell:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 2px var(--accent-soft);
}
[data-module="channel-schedule"] .cs-acc-cell-int {
  text-align: right;
}
[data-module="channel-schedule"] .cs-acc-num,
[data-module="channel-schedule"] .cs-acc-qty {
  text-align: right;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
[data-module="channel-schedule"] .cs-acc-fixt {
  font-family: var(--font-mono, ui-monospace, SFMono-Regular, monospace);
}

/* ============================================================
 * Scenes subview (Stage 5 Track D, §5.3)
 * Matrix-style grid: rows = channels, columns = 5 scenes.
 * Tier 1 (container-rendered) + Tier 2 (label modal) sections.
 * ============================================================ */

/* Tier 1: container-rendered classes */
[data-module="channel-schedule"] .cs-sc {
  padding: 16px 24px 96px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
[data-module="channel-schedule"] .cs-sc-empty-shell {
  padding: 48px 24px;
  text-align: center;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-sc-header {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  justify-content: space-between;
}
[data-module="channel-schedule"] .cs-sc-header-text h2 {
  font-size: 18px;
  margin: 0 0 4px 0;
  font-weight: 600;
}
[data-module="channel-schedule"] .cs-sc-help {
  margin: 0;
  font-size: 12px;
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-sc-labels-btn {
  flex-shrink: 0;
  white-space: nowrap;
}
[data-module="channel-schedule"] .cs-sc-section {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
[data-module="channel-schedule"] .cs-sc-area {
  font-size: 13px;
  font-weight: 600;
  margin: 0;
  padding: 6px 10px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: var(--button-radius);
  color: var(--text-primary);
}
[data-module="channel-schedule"] .cs-sc-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}
[data-module="channel-schedule"] .cs-sc-table thead th {
  text-align: left;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border-strong);
  font-weight: 600;
  color: var(--text-secondary);
  background: var(--panel);
  position: sticky;
  top: 0;
  z-index: 1;
}
[data-module="channel-schedule"] .cs-sc-h-scene {
  text-align: center;
}
[data-module="channel-schedule"] .cs-sc-table tbody td {
  padding: 4px 8px;
  border-bottom: 1px solid var(--border);
  vertical-align: middle;
}
[data-module="channel-schedule"] .cs-sc-num {
  text-align: right;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
  width: 4em;
}
[data-module="channel-schedule"] .cs-sc-loc {
  width: 12em;
}
[data-module="channel-schedule"] .cs-sc-desc {
  color: var(--text-secondary);
}
[data-module="channel-schedule"] .cs-sc-cell-td {
  text-align: center;
  width: 6em;
}
[data-module="channel-schedule"] .cs-sc-cell {
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 4px 6px;
  font-size: 12px;
  color: var(--text-primary);
  font-family: inherit;
  text-align: right;
  width: 5em;
  box-sizing: border-box;
}
[data-module="channel-schedule"] .cs-sc-cell:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 2px var(--accent-soft);
}
[data-module="channel-schedule"] .cs-sc-cell:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Tier 2: label modal -- rendered inside ctx.ui.modal({content}) and
 * mounted on document.body (NOT inside [data-module="channel-schedule"]).
 * These rules stay UNSCOPED, with the .cs-sc- prefix as the leak guard.
 * See modules-lessons.md "Modal CSS gets the same trap".
 */
.cs-sc-label-modal {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.cs-sc-label-help {
  margin: 0 0 4px 0;
  font-size: 12px;
  color: var(--text-secondary);
}
.cs-sc-label-row {
  display: grid;
  grid-template-columns: 6em 1fr;
  align-items: center;
  gap: 10px;
}
.cs-sc-label-row-num {
  font-size: 12px;
  color: var(--text-secondary);
  font-weight: 500;
}
.cs-sc-label-input {
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 6px 8px;
  font-size: 14px;
  color: var(--text-primary);
  font-family: inherit;
}
.cs-sc-label-input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 2px var(--accent-soft);
}

/* ------------------------------------------------------------------
 * Imports subview -- importer-fidelity check family.
 * Tier 1 (container) only: every class below renders inside
 * state.rootEl, so all rules stay scoped under [data-module=...]. There
 * is no modal in this surface -- the ack note is an INLINE form inside
 * the container, deliberately, so the body-mounted-modal CSS + click-
 * delegation traps never apply here.
 * Tokens only; both themes come free from the platform token set.
 * ------------------------------------------------------------------ */

[data-module="channel-schedule"] .cs-imp {
  padding: 16px 20px 96px 20px;
  overflow-y: auto;
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-imp-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 16px;
}

[data-module="channel-schedule"] .cs-imp-title {
  margin: 0 0 4px 0;
  font-size: 17px;
  font-weight: 600;
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-imp-lede {
  margin: 0;
  max-width: 68ch;
  font-size: 12px;
  line-height: 1.5;
  color: var(--text-secondary);
}

[data-module="channel-schedule"] .cs-imp-empty {
  border: 1px dashed var(--border);
  border-radius: var(--panel-radius);
  padding: 28px 20px;
  text-align: center;
  color: var(--text-secondary);
  font-size: 13px;
}

[data-module="channel-schedule"] .cs-imp-runs {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

[data-module="channel-schedule"] .cs-imp-run {
  border: 1px solid var(--border);
  border-radius: var(--panel-radius);
  background: var(--panel-2);
  overflow: hidden;
}

[data-module="channel-schedule"] .cs-imp-run-open {
  border-color: var(--accent);
}

/* A <button> does NOT inherit the page text color (the UA ButtonText
 * system color wins), so the explicit color here is required or the row
 * renders dark-on-dark in the dark theme. */
[data-module="channel-schedule"] .cs-imp-run-head {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  padding: 10px 12px;
  background: transparent;
  border: 0;
  color: var(--text-primary);
  font-family: inherit;
  font-size: 13px;
  text-align: left;
  cursor: pointer;
}

[data-module="channel-schedule"] .cs-imp-run-head:hover {
  background: var(--row-hover);
}

[data-module="channel-schedule"] .cs-imp-run-when {
  min-width: 15ch;
  color: var(--text-primary);
  font-variant-numeric: tabular-nums;
}

[data-module="channel-schedule"] .cs-imp-run-mode {
  min-width: 9ch;
  color: var(--text-secondary);
  text-transform: uppercase;
  font-size: 11px;
  letter-spacing: 0.04em;
}

[data-module="channel-schedule"] .cs-imp-run-file {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-imp-run-sha {
  color: var(--text-tertiary);
  font-family: var(--font-mono);
  font-size: 11px;
}

[data-module="channel-schedule"] .cs-imp-chip {
  flex: 0 0 auto;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 500;
  white-space: nowrap;
  border: 1px solid var(--border);
  color: var(--text-secondary);
  background: var(--panel);
}

[data-module="channel-schedule"] .cs-imp-chip-ok {
  color: var(--success);
  background: var(--success-soft);
  border-color: var(--success);
}

[data-module="channel-schedule"] .cs-imp-chip-warn {
  color: var(--warning);
  background: var(--warning-soft);
  border-color: var(--warning);
}

[data-module="channel-schedule"] .cs-imp-chip-error {
  color: var(--error);
  background: var(--error-soft);
  border-color: var(--error);
}

[data-module="channel-schedule"] .cs-imp-chip-pending {
  color: var(--text-secondary);
  background: var(--panel);
  border-color: var(--border-strong);
}

[data-module="channel-schedule"] .cs-imp-run-body {
  padding: 4px 16px 16px 16px;
  border-top: 1px solid var(--border);
  background: var(--panel);
}

[data-module="channel-schedule"] .cs-imp-h3 {
  margin: 16px 0 8px 0;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-imp-h4 {
  margin: 14px 0 6px 0;
  font-size: 12px;
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* The scope + conventions statements are reproduced verbatim; they get a
 * quote-like treatment so a reader can see it is the run speaking. */
[data-module="channel-schedule"] .cs-imp-statement {
  border-left: 2px solid var(--accent-line);
  padding: 6px 0 6px 12px;
  margin: 8px 0;
}

[data-module="channel-schedule"] .cs-imp-statement-title {
  margin: 0 0 2px 0;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-tertiary);
}

[data-module="channel-schedule"] .cs-imp-statement-body {
  margin: 0;
  font-size: 12px;
  line-height: 1.55;
  max-width: 80ch;
  color: var(--text-secondary);
}

[data-module="channel-schedule"] .cs-imp-note {
  border: 1px solid var(--border);
  border-radius: var(--button-radius);
  padding: 8px 10px;
  margin: 8px 0;
  font-size: 12px;
  line-height: 1.5;
  max-width: 90ch;
  color: var(--text-secondary);
  background: var(--panel-2);
}

[data-module="channel-schedule"] .cs-imp-note-ok {
  border-color: var(--success);
  background: var(--success-soft);
}

[data-module="channel-schedule"] .cs-imp-note-error {
  border-color: var(--error);
  background: var(--error-soft);
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-imp-note-pending {
  border-color: var(--border-strong);
}

[data-module="channel-schedule"] .cs-imp-kvs {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 4px 16px;
  margin: 4px 0;
}

[data-module="channel-schedule"] .cs-imp-kv {
  display: flex;
  gap: 8px;
  align-items: baseline;
  min-width: 0;
  font-size: 12px;
}

[data-module="channel-schedule"] .cs-imp-kv-key {
  color: var(--text-tertiary);
  margin: 0;
}

[data-module="channel-schedule"] .cs-imp-kv-val {
  margin: 0;
  color: var(--text-primary);
  overflow-wrap: anywhere;
}

[data-module="channel-schedule"] .cs-imp-table {
  border-collapse: collapse;
  width: 100%;
  max-width: 640px;
  font-size: 12px;
}

[data-module="channel-schedule"] .cs-imp-table th,
[data-module="channel-schedule"] .cs-imp-table td {
  border-bottom: 1px solid var(--border);
  padding: 4px 8px;
  text-align: left;
  color: var(--text-primary);
}

[data-module="channel-schedule"] .cs-imp-table th {
  color: var(--text-tertiary);
  font-weight: 500;
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

[data-module="channel-schedule"] .cs-imp-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

[data-module="channel-schedule"] .cs-imp-fine {
  margin: 6px 0;
  font-size: 11px;
  line-height: 1.5;
  max-width: 90ch;
  color: var(--text-tertiary);
}

[data-module="channel-schedule"] .cs-imp-group {
  margin-bottom: 12px;
}

[data-module="channel-schedule"] .cs-imp-sub {
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-tertiary);
  font-family: var(--font-mono);
  font-size: 11px;
}

[data-module="channel-schedule"] .cs-imp-count {
  display: inline-block;
  margin-left: 6px;
  padding: 0 6px;
  border-radius: 999px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  color: var(--text-secondary);
  font-size: 11px;
}

[data-module="channel-schedule"] .cs-imp-list {
  list-style: none;
  margin: 0;
  padding: 0;
}

[data-module="channel-schedule"] .cs-imp-item {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
  padding: 5px 0;
  border-bottom: 1px solid var(--border);
}

[data-module="channel-schedule"] .cs-imp-item-line {
  display: flex;
  gap: 10px;
  align-items: baseline;
  min-width: 0;
  flex: 1 1 320px;
}

[data-module="channel-schedule"] .cs-imp-row {
  flex: 0 0 auto;
  color: var(--text-tertiary);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
  min-width: 7ch;
}

[data-module="channel-schedule"] .cs-imp-payload {
  min-width: 0;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--text-secondary);
  overflow-wrap: anywhere;
}

[data-module="channel-schedule"] .cs-imp-item-ack {
  flex: 0 1 auto;
  font-size: 11px;
}

[data-module="channel-schedule"] .cs-imp-linkbtn {
  background: transparent;
  border: 0;
  padding: 0;
  color: var(--accent);
  font-family: inherit;
  font-size: 11px;
  cursor: pointer;
  text-decoration: underline;
}

[data-module="channel-schedule"] .cs-imp-acked {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: baseline;
  color: var(--text-secondary);
}

[data-module="channel-schedule"] .cs-imp-acked-mark {
  color: var(--success);
  font-weight: 500;
}

[data-module="channel-schedule"] .cs-imp-acked-note {
  color: var(--text-primary);
  overflow-wrap: anywhere;
}

[data-module="channel-schedule"] .cs-imp-acked-by {
  color: var(--text-tertiary);
}

[data-module="channel-schedule"] .cs-imp-ackform {
  display: flex;
  flex-direction: column;
  gap: 6px;
  width: min(420px, 100%);
}

[data-module="channel-schedule"] .cs-imp-acklabel {
  font-size: 11px;
  color: var(--text-tertiary);
}

[data-module="channel-schedule"] .cs-imp-ackinput {
  background: var(--input-bg);
  border: 1px solid var(--border);
  border-radius: var(--button-radius);
  padding: 6px 8px;
  font-family: inherit;
  font-size: 12px;
  color: var(--text-primary);
  resize: vertical;
}

[data-module="channel-schedule"] .cs-imp-ackinput:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 2px var(--accent-soft);
}

[data-module="channel-schedule"] .cs-imp-ackactions {
  display: flex;
  gap: 8px;
  justify-content: flex-end;
}
