/* ============================================================
   File:        batches.css
   Project:     StudioFlow (Grace Aerobics & Fitness Center)
   Developer:   Janvi Vakhariya — V Techno Labs
   Created:     2026-09-01  (updated 2026-09-07)
   Purpose:     Design system for Batches — three screens, one family:
                1) Batches list  2) Add Batch  3) Edit Batch.
                ONE list pattern (.sf-batch-row under session groups,
                timetable-aligned times) and ONE form pattern
                (.sf-batch-form-card) shared by screens 2-3.
   Copyright:   © 2026 V Techno Labs. All rights reserved.
                Proprietary software developed by V Techno Labs.
   ============================================================

   Same "Sunset" language as the other final screens: sunset wash ground,
   white glass cards with soft pink shadows, 20px radius, Archivo,
   wing-gradient ribbon on form cards.

   THE TIMETABLE PROBLEM — the same times repeat across activities: times sit
   in ONE fixed-width left column (tabular numerals, start over end) so they
   align down the page, and activity is a coloured spine + tinted chip on
   every row. Time reads down, activity reads by colour — the two never blur.

   Prefix: sf-batch-, and nothing else. Never sf-dash- / sf-idash- / sf-dev- /
   sf-user- / sf-plan-. The only non-prefixed selectors are the .sf-app shell
   overrides and the validation classes the Razor tag helpers emit — see
   note 7.

   ============================================================
   IMPORTANT — four of these class names ALREADY EXIST in site.css, and one
   of them is still in live use by another module:

     .sf-batch-card   site.css gives it border-left: 4px solid var(--primary),
                      and Views/Members/Details.cshtml STILL USES IT on the
                      member's batch card. The design's .sf-batch-card is the
                      timetable's glass card, so defining it globally here
                      would have re-skinned a Members screen. Every rule for
                      it below is therefore scoped as `.sf-batch .sf-batch-card`
                      — inside this module's root container and nowhere else.
                      Do not un-scope it.

     .sf-batch        site.css gives it border-left: 4px solid var(--primary).
                      No view carries it any more, so this file's root
                      container safely overrides it — cancelled with border: 0.

     .sf-batch-stopped   unused by any view; this design says
                         .sf-batch-row--stopped instead. Left alone.
     .sf-batch-note      still used by Members Renew and _MemberFields; this
                         design never uses the name. Left alone.
   ============================================================

   Seven things this file does differently from the supplied design, all of
   them because it now lives inside the StudioFlow app shell:

   1. --sf-batch-photo points at /img/mats-rolled.png, which now ships in
      wwwroot/img. It is written root-relative rather than relative: this file
      lives in /css/, so a bare url("img/x.png") would resolve to /css/img/x.png
      and 404. Lowercase and space-free for the same reason it is root-relative
      — Windows would forgive a mis-cased name and a Linux host would not, so
      the bug would only appear once deployed.

   2. The bar variables are bound to the shell's real bar heights
      (--appbar-h 56px, --tabbar-h 64px, from site.css :root) and then zeroed
      inside .sf-app, which already pads the body past both fixed bars.
      Batches is a main tabbed page, so the bottom bar really is there.

   3. The ground is painted by a fixed backdrop behind the whole page rather
      than as a block behind the column, so the wash reaches the screen edges
      and the design's background-attachment: fixed keeps working inside a
      scrolling shell.

   4. container-type: inline-size is not declared. The design set it, but no
      @container query in this file reads it, and containment would make
      .sf-batch the containing block for the fixed backdrop in note 3.

   5. The instructor <select> keeps its native caret. The design hid it with
      appearance: none and slotted a 16×16 chevron in its place, but
      wwwroot/icons has no chevron — hiding the native arrow with nothing to
      replace it would leave a dropdown that does not look like one.

   6. .sf-batch-actform lets a POST button sit in the row's action strip: Stop
      and Restart are forms carrying the antiforgery token, not bare buttons.

   7. .sf-batch-empty, .sf-batch-alert and .sf-batch-error are additions. The
      list has an empty state and the forms have validation; the design's
      three screens show neither, and a form that cannot report an error is
      not finished.

   The footer here is the rainbow rule only. The tagline and the credit under
   it come from the shared _SiteFooter partial the layout already renders, so
   the design's .sf-batch-foot-tag / -credit rules are left out — keeping them
   would say "Music on. Chaos off." twice on one screen.

   Icons: every .sf-batch-ico is a 20×20 slot for the app's own SVGs (24×24
   inside activity tiles, 14×14 in the row chip). The three activity marks are
   finished coloured tiles, so they are placed as <img> and never masked or
   recoloured. Archivo 400/600/700/800 is loaded once by _PwaHead.
   ============================================================ */

.sf-batch {
  /* NO PAGE BACKGROUND IMAGE HERE. site.css declares the one background the
     whole signed-in app uses, on .sf-frame. A second photo in this sheet is
     how the app ended up with a different ground on every screen. */
  --sf-batch-wing: linear-gradient(90deg,#43a047,#d4b91e,#f57c00,#e53957,#c2185b,#7e57c2,#5c6f91);

  /* The wash alone now. It used to sit over /img/mats-rolled.png, which was
     this screen's own full-page photo -- a different ground from every other
     screen's, and a second 637 KB image on top of the shared one. */
  --sf-batch-ground:
    linear-gradient(178deg, rgba(255,250,252,.56) 0%, rgba(255,248,242,.48) 40%, rgba(250,246,253,.54) 100%);
  /* Muted deepened from #6d6b58, which measured 4.05:1 against the darkest
     part of the shared ball-pit ground -- under the 4.5:1 minimum for any
     muted line that sits on the ground rather than inside a card. #615F4E
     measures 4.85:1 there and 6.45:1 on white. Deepening the ink was the fix,
     not a panel behind the text. */
  --sf-batch-ink: #2b2a1f; --sf-batch-muted: #615F4E;
  --sf-batch-pink: #c2185b; --sf-batch-pink-deep: #98123f;
  --sf-batch-card: #ffffff;   /* solid: the scrim is the only translucency */ --sf-batch-edge: rgba(255,255,255,.92);
  --sf-batch-line: rgba(43,42,31,.12);
  --sf-batch-good: #1d7a3f; --sf-batch-good-tint: #e3f3e8;
  --sf-batch-warn: #9a5b00; --sf-batch-warn-tint: #fdf0d7;
  --sf-batch-bad: #b3261e; --sf-batch-bad-tint: #fdecea;

  --sf-batch-aer: #0f766e; --sf-batch-aer-mid: #17a89a; --sf-batch-aer-tint: #dff1ef;
  --sf-batch-yog: #c96a00; --sf-batch-yog-mid: #f08a1d; --sf-batch-yog-tint: #fdeedd;
  --sf-batch-dan: #6d28d9; --sf-batch-dan-mid: #9d76e8; --sf-batch-dan-tint: #efe8fa;

  --sf-batch-radius: 20px; --sf-batch-tap: 48px;

  /* The shell's real fixed bars, read from site.css :root. The fallbacks are
     the same 56/64 the design shipped with, so a standalone use of .sf-batch
     outside the shell still clears them. Zeroed below — see note 2. */
  --sf-batch-top-bar: var(--appbar-h, 56px); --sf-batch-bottom-bar: var(--tabbar-h, 64px);

  box-sizing: border-box; max-width: 640px; margin: 0 auto;
  border: 0;                             /* cancels site.css's leftover stripe */
  display: flex; flex-direction: column; gap: 16px;
  padding: calc(var(--sf-batch-top-bar) + 14px) 16px calc(var(--sf-batch-bottom-bar) + 26px + env(safe-area-inset-bottom, 0px));
  background: var(--sf-batch-ground);
  color: var(--sf-batch-ink);
  font-family: "Archivo", system-ui, sans-serif; font-size: 15px; line-height: 1.5;
  -webkit-tap-highlight-color: transparent;
}

/* Inside the app shell the layout has already done the spacing: .sf-app pads
   the body past both fixed bars, and .sf-content supplies the 1rem side gutter
   and caps the column at 640px. Repeating either would double it. */
.sf-app .sf-batch {
  --sf-batch-top-bar: 0px;
  --sf-batch-bottom-bar: 0px;
  padding-left: 0; padding-right: 0;
  background: none;
}

/* The wash, painted across the whole viewport rather than behind the column
   (note 3). Fixed and out of flow, so it is not a flex item and does not
   scroll away on a long timetable. It sits above the body's grey and below
   every card; the app bar and tab bar are fixed at z-index 20 with their own
   navy, so neither is touched. */
/* No page backdrop here any more. site.css paints ONE background on .sf-app for
   every signed-in page, so this sheet no longer paints its own: four stylesheets
   each drawing their own ground is exactly how Plans ended up tiled while Users
   ended up plain. The --sf-batch-ground variable above is kept for the standalone,
   outside-the-shell case documented at the top of this file. */

.sf-batch *, .sf-batch *::before, .sf-batch *::after { box-sizing: border-box; }
:where(.sf-batch a) { color: inherit; text-decoration: none; }
.sf-batch :focus-visible { outline: 2px solid var(--sf-batch-pink); outline-offset: 2px; }
.sf-batch-ico { display: inline-block; width: 20px; height: 20px; flex: none; }
.sf-batch-go { display: inline-block; width: 16px; height: 16px; flex: none; opacity: .7; }

/* ---------- shared: back link, intro, add ---------- */
.sf-batch-back {
  display: inline-flex; align-items: center; gap: 7px; align-self: flex-start;
  min-height: 44px; margin: -6px 0 -10px;
  font-size: 14px; font-weight: 800; color: var(--sf-batch-pink);
}
.sf-batch-back:active { text-decoration: underline; text-underline-offset: 3px; }
.sf-batch-back .sf-batch-go { transform: rotate(180deg); opacity: 1; }

.sf-batch-intro { margin: 0 2px; }
.sf-batch-title { margin: 0; font-size: 22px; font-weight: 800; letter-spacing: -.01em; }
.sf-batch-sub { margin: 2px 0 0; font-size: 14px; color: var(--sf-batch-muted); text-wrap: pretty; }
.sf-batch-sub strong { color: var(--sf-batch-ink); font-weight: 700; }

.sf-batch-add {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; min-height: 52px; border: 0; border-radius: 16px; cursor: pointer;
  background: linear-gradient(155deg, #e0447a, var(--sf-batch-pink-deep));
  color: #fff; font-family: inherit; font-size: 15px; font-weight: 800;
  box-shadow: 0 12px 24px -12px rgba(194,24,91,.7);
}
.sf-batch-add:active { transform: translateY(1px); filter: brightness(.95); }

/* ============================================================
   LIST PATTERN — the timetable
   Session label, then one glass card whose rows share a fixed
   66px time column: every start time sits on the same vertical
   line, so the schedule reads at a glance.
   ============================================================ */
.sf-batch-session {
  display: flex; align-items: center; gap: 8px;
  margin: 2px 2px -8px;
  font-size: 12px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: var(--sf-batch-muted);
}
.sf-batch-session .sf-batch-ico { width: 18px; height: 18px; }
.sf-batch-session-rule { flex: 1; height: 2px; border: 0; margin: 0; border-radius: 999px; background: var(--sf-batch-line); }

/* SCOPED ON PURPOSE — see the note at the top of this file. Members/Details
   still wears a bare .sf-batch-card from site.css, and must keep its own look. */
.sf-batch .sf-batch-card {
  background: var(--sf-batch-card);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
  border: 1.5px solid var(--sf-batch-edge);
  border-radius: var(--sf-batch-radius);
  box-shadow: 0 14px 30px -16px rgba(194,24,91,.4);
  padding: 2px 14px;
}

/* one batch row */
.sf-batch-row {
  display: grid; grid-template-columns: 66px minmax(0,1fr) auto;
  grid-template-areas: "time main chip" "time meter meter" "acts acts acts";
  align-items: center; column-gap: 12px; row-gap: 8px;
  padding: 13px 0 13px 10px;
  border-top: 1px solid var(--sf-batch-line);
  position: relative;
}
.sf-batch-row:first-child { border-top: 0; }
/* activity spine */
.sf-batch-row::before { content: ""; position: absolute; left: 0; top: 13px; bottom: 13px; width: 4px; border-radius: 999px; background: var(--sf-batch-spine, var(--sf-batch-pink)); }
.sf-batch-row--aer { --sf-batch-spine: var(--sf-batch-aer-mid); }
.sf-batch-row--yog { --sf-batch-spine: var(--sf-batch-yog-mid); }
.sf-batch-row--dan { --sf-batch-spine: var(--sf-batch-dan-mid); }

/* THE time column — fixed width, tabular, start over end */
.sf-batch-time {
  grid-area: time; align-self: start;
  display: flex; flex-direction: column;
  font-variant-numeric: tabular-nums; line-height: 1.2; white-space: nowrap;
}
.sf-batch-time-start { font-size: 17px; font-weight: 800; }
.sf-batch-time-end { font-size: 12.5px; font-weight: 700; color: var(--sf-batch-muted); }

.sf-batch-row-main { grid-area: main; min-width: 0; }
/* The name line wraps rather than starving the name.
   The middle column is what is left after the activity chip, and a wide chip
   ("AEROBICS") leaves about 94px at 360px. A Stopped or Full tag sharing that
   line then took most of it and the name truncated to a single letter -- which
   is what a stopped Morning Aerobics looked like. Wrapping lets the tag drop to
   its own line and gives the name the column back; the floor stops it being
   squeezed to nothing in the first place. */
.sf-batch-row-name { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 15px; font-weight: 800; }
.sf-batch-row-name-text { flex: 1 1 8ch; min-width: 8ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sf-batch-row-sub { margin: 1px 0 0; font-size: 12.5px; color: var(--sf-batch-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sf-batch-row-sub strong { color: var(--sf-batch-ink); font-weight: 700; text-transform: capitalize; }

/* activity chip, right-aligned — colour + icon + name */
.sf-batch-chip {
  grid-area: chip; justify-self: end;
  display: inline-flex; align-items: center; gap: 5px;
  min-height: 26px; padding: 0 10px; border-radius: 999px;
  font-size: 11px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; white-space: nowrap;
  color: #fff;
}
.sf-batch-chip .sf-batch-ico { width: 14px; height: 14px; }
.sf-batch-row--aer .sf-batch-chip { background: linear-gradient(150deg, var(--sf-batch-aer-mid), var(--sf-batch-aer)); }
.sf-batch-row--yog .sf-batch-chip { background: linear-gradient(150deg, var(--sf-batch-yog-mid), var(--sf-batch-yog)); }
.sf-batch-row--dan .sf-batch-chip { background: linear-gradient(150deg, var(--sf-batch-dan-mid), var(--sf-batch-dan)); }

/* capacity meter + count */
.sf-batch-meter { grid-area: meter; display: flex; align-items: center; gap: 10px; }
.sf-batch-meter-bar { flex: 1; position: relative; height: 6px; border-radius: 999px; background: rgba(43,42,31,.12); overflow: hidden; }
.sf-batch-meter-bar::before { content: ""; position: absolute; inset: 0 auto 0 0; width: var(--sf-batch-fill, 0%); border-radius: 999px; background: var(--sf-batch-spine, var(--sf-batch-pink)); }
.sf-batch-meter-count { font-size: 12.5px; font-weight: 800; font-variant-numeric: tabular-nums; color: var(--sf-batch-muted); white-space: nowrap; }
.sf-batch-meter-count strong { color: var(--sf-batch-ink); font-size: 13.5px; }

/* full batch: meter + tag go pink */
.sf-batch-row--full .sf-batch-meter-bar::before { background: linear-gradient(90deg, #e0447a, var(--sf-batch-pink-deep)); }
.sf-batch-tag {
  flex: none; display: inline-flex; align-items: center;
  min-height: 22px; padding: 0 8px; border-radius: 999px;
  font-size: 11px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase; white-space: nowrap;
}
.sf-batch-tag--full { background: #fce8f0; color: var(--sf-batch-pink); }
/* Past the limit, not merely at it. Red rather than the pink of "Full": full is
   a class working as intended, over is a deliberate override the owner may want
   to see and undo. */
.sf-batch-tag--over { background: var(--sf-batch-bad-tint); color: var(--sf-batch-bad); }
.sf-batch-tag--stopped { background: var(--sf-batch-warn-tint); color: var(--sf-batch-warn); }

/* row actions */
.sf-batch-row-acts { grid-area: acts; display: flex; flex-wrap: wrap; gap: 8px; padding-top: 2px; }
.sf-batch-act {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  min-height: 44px; padding: 0 14px; border-radius: 12px; cursor: pointer;
  border: 1.5px solid var(--sf-batch-line); background: transparent;
  color: var(--sf-batch-ink); font-family: inherit; font-size: 13.5px; font-weight: 800; white-space: nowrap;
}
.sf-batch-act:active { background: rgba(43,42,31,.06); }
.sf-batch-act--stop { border-color: rgba(154,91,0,.4); color: var(--sf-batch-warn); }
.sf-batch-act--stop:active { background: var(--sf-batch-warn-tint); }
.sf-batch-act--start { border-color: rgba(29,122,63,.4); color: var(--sf-batch-good); }
.sf-batch-act--start:active { background: var(--sf-batch-good-tint); }
/* Stop/Restart is a POST, so its button arrives wrapped in a form carrying the
   antiforgery token. The form shrinks to the button inside it (note 6). */
.sf-batch-actform { margin: 0; display: inline-flex; }

/* stopped batch: visible, stood down, dashed spine */
.sf-batch-row--stopped .sf-batch-time,
.sf-batch-row--stopped .sf-batch-row-name-text { color: var(--sf-batch-muted); }
.sf-batch-row--stopped::before { background: transparent; border: 1.5px dashed var(--sf-batch-spine, var(--sf-batch-muted)); width: 2.5px; }
.sf-batch-row--stopped .sf-batch-chip { opacity: .55; }
.sf-batch-row--stopped .sf-batch-meter-bar::before { background: rgba(43,42,31,.3); }

/* Empty state (note 7): no batches on the timetable at all. */
/* ---------- activity filter -------------------------------------------------
   The same control the Membership Plans list carries -- same order, same
   counts, same lit-in-its-own-colour selection -- so the two screens teach one
   filter rather than two that nearly match.

   One deliberate difference: this row SCROLLS rather than wrapping. Plans wraps
   its four chips onto two lines, which is fine there; here the header already
   carries a title, a running/stopped line and an Add Batch button above the
   timetable, and a second wrapped line would push the first batch off a 360px
   screen. The row scrolls sideways on its own; the page never does. */
.sf-batch-filters {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding-bottom: 2px;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
  max-width: 100%;
}
.sf-batch-filters::-webkit-scrollbar { display: none; }

.sf-batch-filter {
  flex: none;
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 44px;                 /* a full thumb target, not a 40px chip */
  padding: 0 14px; border-radius: 999px;
  border: 1.5px solid var(--sf-batch-edge);
  background: var(--sf-batch-card);
  color: var(--sf-batch-ink);
  font-family: inherit; font-size: 13.5px; font-weight: 800; white-space: nowrap;
}
.sf-batch-filter small { font-weight: 700; color: var(--sf-batch-muted); font-variant-numeric: tabular-nums; }
.sf-batch-filter-ico { display: block; width: 20px; height: 20px; border-radius: 5px; }
.sf-batch-filter:active { filter: brightness(.95); }

/* The selection has to be obvious at a glance: filled, in the class type's own
   colour, with the count carried through in white. */
.sf-batch-filter.is-on { border-color: transparent; color: #fff; background: linear-gradient(155deg, #e0447a, var(--sf-batch-pink-deep)); }
.sf-batch-filter.is-on small { color: rgba(255,255,255,.82); }
.sf-batch-filter--aer.is-on { background: linear-gradient(155deg, var(--sf-batch-aer-mid), var(--sf-batch-aer)); }
.sf-batch-filter--yog.is-on { background: linear-gradient(155deg, var(--sf-batch-yog-mid), var(--sf-batch-yog)); }
.sf-batch-filter--dan.is-on { background: linear-gradient(155deg, var(--sf-batch-dan-mid), var(--sf-batch-dan)); }

/* What stopping a batch actually did, said on the row rather than only in the
   confirmation that appeared once, days ago. Muted and small: it explains the
   state above it, it is not news. */
.sf-batch-row-note {
  margin: 3px 0 0;
  font-size: 11.5px;
  line-height: 1.45;
  color: var(--sf-batch-muted);
  text-wrap: pretty;
}

/* The way back out of a filter that matched nothing. */
.sf-batch-empty-go {
  margin-top: 10px;
  display: inline-flex; align-items: center;
  min-height: 44px; padding: 0 16px;
  border-radius: 999px;
  border: 1.5px solid rgba(194,24,91,.35);
  color: var(--sf-batch-pink);
  font-size: 13.5px; font-weight: 800;
  text-decoration: none;
}

.sf-batch-empty {
  background: #ffffff;            /* solid over the shared background */
  border: 2px dashed rgba(43,42,31,.22); border-radius: var(--sf-batch-radius);
  padding: 28px 18px; text-align: center;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
}
.sf-batch-empty-title { margin: 0; font-size: 16px; font-weight: 800; }
.sf-batch-empty-sub { margin: 0; max-width: 32ch; font-size: 13.5px; color: var(--sf-batch-muted); text-wrap: pretty; }

/* ============================================================
   FORM PATTERN — screens 2 & 3
   ============================================================ */
.sf-batch-form-card {
  background: var(--sf-batch-card);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
  border: 1.5px solid var(--sf-batch-edge);
  border-radius: var(--sf-batch-radius);
  box-shadow: 0 14px 30px -16px rgba(194,24,91,.4);
  padding: 16px; position: relative; overflow: hidden;
  display: flex; flex-direction: column; gap: 14px;
}
.sf-batch-form-card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 5px; background: var(--sf-batch-wing); }

.sf-batch-field { display: flex; flex-direction: column; gap: 6px; }
.sf-batch-label { font-size: 13px; font-weight: 800; letter-spacing: .02em; }
.sf-batch-label small { font-weight: 600; color: var(--sf-batch-muted); }

.sf-batch-input {
  width: 100%; min-height: 52px; padding: 0 14px;
  border: 1.5px solid rgba(43,42,31,.2); border-radius: 14px;
  background: #fff; color: var(--sf-batch-ink);
  font-family: inherit; font-size: 16px; font-weight: 600;
}
.sf-batch-input::placeholder { color: rgba(43,42,31,.35); font-weight: 400; }
.sf-batch-input:focus { border-color: var(--sf-batch-pink); outline: none; box-shadow: 0 0 0 3px rgba(194,24,91,.15); }
/* The design hid the native caret and slotted its own chevron here. There is
   no chevron in wwwroot/icons, so the select keeps the one the browser draws
   — a dropdown has to look like a dropdown (note 5). */
select.sf-batch-input { padding-right: 40px; }

.sf-batch-hint { margin: 0; font-size: 12.5px; color: var(--sf-batch-muted); text-wrap: pretty; }

/* activity picker — same trio as Plans */
.sf-batch-activities { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 10px; }
.sf-batch-activity { position: relative; display: block; min-width: 0; }
.sf-batch-activity input { position: absolute; opacity: 0; inset: 0; pointer-events: none; }
.sf-batch-activity-card {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  min-height: 72px; padding: 8px 6px; border-radius: 14px; cursor: pointer;
  border: 1.5px solid rgba(43,42,31,.18); background: #fff;
  font-size: 13px; font-weight: 800; text-align: center;
}
.sf-batch-activity-card .sf-batch-ico { width: 24px; height: 24px; }
.sf-batch-activity--aer .sf-batch-activity-card { color: var(--sf-batch-aer); }
.sf-batch-activity--yog .sf-batch-activity-card { color: var(--sf-batch-yog); }
.sf-batch-activity--dan .sf-batch-activity-card { color: var(--sf-batch-dan); }
.sf-batch-activity--aer input:checked + .sf-batch-activity-card { border-color: var(--sf-batch-aer); background: var(--sf-batch-aer-tint); box-shadow: 0 0 0 3px rgba(15,118,110,.18); }
.sf-batch-activity--yog input:checked + .sf-batch-activity-card { border-color: var(--sf-batch-yog); background: var(--sf-batch-yog-tint); box-shadow: 0 0 0 3px rgba(201,106,0,.18); }
.sf-batch-activity--dan input:checked + .sf-batch-activity-card { border-color: var(--sf-batch-dan); background: var(--sf-batch-dan-tint); box-shadow: 0 0 0 3px rgba(109,40,217,.18); }
.sf-batch-activity input:focus-visible + .sf-batch-activity-card { outline: 2px solid var(--sf-batch-pink); outline-offset: 2px; }

/* start + end time — one pair, joined by an en dash */
.sf-batch-times { display: grid; grid-template-columns: minmax(0,1fr) 14px minmax(0,1fr); align-items: center; gap: 6px; }
.sf-batch-times-dash { text-align: center; font-weight: 800; color: var(--sf-batch-muted); }
input[type="time"].sf-batch-input { padding: 0 10px; font-variant-numeric: tabular-nums; }

/* session picker — two radio tiles */
.sf-batch-sessions { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 10px; }
.sf-batch-sesopt { position: relative; display: block; min-width: 0; }
.sf-batch-sesopt input { position: absolute; opacity: 0; inset: 0; pointer-events: none; }
.sf-batch-sesopt-card {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 52px; padding: 0 10px; border-radius: 14px; cursor: pointer;
  border: 1.5px solid rgba(43,42,31,.18); background: #fff;
  font-size: 14.5px; font-weight: 800;
}
.sf-batch-sesopt input:checked + .sf-batch-sesopt-card { border-color: var(--sf-batch-pink); background: #fce8f0; color: var(--sf-batch-pink); box-shadow: 0 0 0 3px rgba(194,24,91,.15); }
.sf-batch-sesopt input:focus-visible + .sf-batch-sesopt-card { outline: 2px solid var(--sf-batch-pink); outline-offset: 2px; }

/* capacity affix */
.sf-batch-affix { position: relative; }
.sf-batch-affix .sf-batch-input { padding-right: 84px; }
.sf-batch-affix-unit { position: absolute; right: 14px; top: 50%; transform: translateY(-50%); font-size: 13px; font-weight: 700; color: var(--sf-batch-muted); pointer-events: none; }

/* which batch is being edited */
.sf-batch-whom {
  display: flex; align-items: center; gap: 12px;
  padding: 12px; border-radius: 16px;
  border: 1.5px solid rgba(43,42,31,.14);
}
.sf-batch-whom--aer { background: var(--sf-batch-aer-tint); border-color: rgba(15,118,110,.3); }
.sf-batch-whom--yog { background: var(--sf-batch-yog-tint); border-color: rgba(201,106,0,.3); }
.sf-batch-whom--dan { background: var(--sf-batch-dan-tint); border-color: rgba(109,40,217,.3); }
.sf-batch-whom-time {
  flex: none; display: flex; flex-direction: column; align-items: center; justify-content: center;
  min-width: 64px; min-height: 54px; padding: 4px 8px; border-radius: 14px; background: #fff;
  font-variant-numeric: tabular-nums; line-height: 1.2;
}
.sf-batch-whom--aer .sf-batch-whom-time { color: var(--sf-batch-aer); }
.sf-batch-whom--yog .sf-batch-whom-time { color: var(--sf-batch-yog); }
.sf-batch-whom--dan .sf-batch-whom-time { color: var(--sf-batch-dan); }
.sf-batch-whom-time strong { font-size: 15px; font-weight: 800; }
.sf-batch-whom-time small { font-size: 11px; font-weight: 700; }
.sf-batch-whom-name { margin: 0; font-size: 15px; font-weight: 800; }
.sf-batch-whom-sub { margin: 0; font-size: 13px; color: var(--sf-batch-muted); }

/* stop / restart block on Edit — with the reassurance line */
.sf-batch-stop {
  border: 1.5px solid rgba(154,91,0,.35); border-radius: 16px;
  background: var(--sf-batch-warn-tint); padding: 14px;
}
.sf-batch-stop--restart { border-color: rgba(29,122,63,.35); background: var(--sf-batch-good-tint); }
.sf-batch-stop-title { margin: 0 0 4px; display: flex; align-items: center; gap: 8px; font-size: 14.5px; font-weight: 800; color: var(--sf-batch-warn); }
.sf-batch-stop--restart .sf-batch-stop-title { color: var(--sf-batch-good); }
.sf-batch-stop-sub { margin: 0 0 12px; font-size: 13px; font-weight: 600; color: #6b4a00; text-wrap: pretty; }
.sf-batch-stop--restart .sf-batch-stop-sub { color: #1d5c33; }
.sf-batch-stop-form { margin: 0; }
.sf-batch-stop-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; min-height: var(--sf-batch-tap); border-radius: 13px; cursor: pointer;
  border: 1.5px solid rgba(154,91,0,.5); background: #fff;
  color: var(--sf-batch-warn); font-family: inherit; font-size: 14.5px; font-weight: 800;
}
.sf-batch-stop-btn:active { filter: brightness(.95); }
.sf-batch-stop--restart .sf-batch-stop-btn { border-color: rgba(29,122,63,.5); color: var(--sf-batch-good); }

/* submit + cancel */
.sf-batch-submit {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; min-height: 52px; margin-top: 2px;
  border: 0; border-radius: 16px; cursor: pointer;
  background: linear-gradient(155deg, #e0447a, var(--sf-batch-pink-deep));
  color: #fff; font-family: inherit; font-size: 16px; font-weight: 800;
  box-shadow: 0 12px 24px -12px rgba(194,24,91,.7);
}
.sf-batch-submit:active { transform: translateY(1px); filter: brightness(.95); }

.sf-batch-cancel {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; min-height: var(--sf-batch-tap);
  border: 1.5px solid var(--sf-batch-edge); border-radius: 14px; cursor: pointer;
  background: var(--sf-batch-card); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  color: var(--sf-batch-ink); font-family: inherit; font-size: 15px; font-weight: 700;
}
.sf-batch-cancel:active { filter: brightness(.96); }

/* ---------- validation (note 7) ----------
   The summary the view prints when the server rejects a post, and the
   per-field message the asp-validation-for span carries. The span keeps its
   own .sf-field-error class from site.css and wears .sf-batch-error as well,
   so the tag helper's markup is untouched and this file only recolours it.
   input-validation-error is jQuery Validate's own class, put on the input
   itself, so a wrong field looks wrong and not just its message. */
.sf-batch-alert {
  display: flex; flex-direction: column; gap: 4px;
  margin: 0; padding: 12px 14px; border-radius: 14px;
  background: var(--sf-batch-bad-tint); color: #8c1d17;
  border: 1.5px solid rgba(179,38,30,.3);
  font-size: 13.5px; font-weight: 600; text-wrap: pretty;
}
.sf-batch-error { font-size: 12.5px; font-weight: 700; color: var(--sf-batch-bad); }
.sf-batch-error:empty { display: none; }
.sf-batch-input.input-validation-error { border-color: var(--sf-batch-bad); background: #fffafa; }

/* ---------- footer ---------- */
.sf-batch-foot { text-align: center; padding: 2px 2px 0; }
.sf-batch-wingbar { height: 4px; border: 0; width: 132px; margin: 0 auto 12px; border-radius: 999px; background: var(--sf-batch-wing); }
