/* Clean Frost - EventFlow's design system (spec: docs/superpowers/specs/2026-09-15-clean-frost-design.md).
   Tokens first: everything below reads colours only through these variables,
   and html[data-theme="dark"] swaps them. The shop defaults to light, admin and
   check-in to dark (app.js: defaultThemeFor); the header toggle overrides both. */
:root {
  color-scheme: light;
  --bg: linear-gradient(135deg, #f8faff 0%, #eef3ff 50%, #f3eeff 100%);
  --bg-solid: #eef3ff;
  --glass: rgba(255, 255, 255, 0.72);
  --glass-strong: rgba(255, 255, 255, 0.86);
  --glass-border: rgba(18, 41, 74, 0.08);
  --glass-shadow: 0 10px 30px rgba(18, 41, 74, 0.06);
  --surface: #ffffff;
  --surface-border: #e3e8f4;
  --ink: #12294a;
  --muted: #4b5b75;
  --brand: linear-gradient(90deg, #22b8f5, #2f6bff 55%, #7b3fe4);
  --action: #2f6bff;
  --action-dark: #1f4fd6;
  /* M10 (F02-F04, F11): fills and texts that carry white or sit on the page get
     their own tokens; --action stays for borders, accent-color and bars.
     Contrast: white on --action-fill 5.51 (light) / 5.17 (dark); --action-text
     6.00 on #eef3ff / 6.60 on #111c3a; --on-tint on the filled confirm/neutral/
     soft colours >= 5.4. */
  --action-fill: #1f5bf0;
  --action-fill-hover: #1f4fd6;
  --action-text: #1f4fd6;
  --on-tint: #0b1730;
  --focus-ring: #1f4fd6;
  --accent: #7b3fe4;
  --confirm: #16a34a;
  --neutral: #0ea5e9;
  --soft: #d97706;
  --danger: #e11d48;
  --danger-dark: #be123c;
  --on-fill: #ffffff;
  --input-bg: #ffffff;
  --input-border: #c7d0e3;
  /* The mobile menu panel floats over live page content with no scrim behind
     it (unlike .confirm-dialog, which sits over a native <dialog> backdrop),
     so it needs its own near-opaque background rather than --glass-strong -
     that token is tuned for glass panels already backed by a card or dialog,
     and its dark-mode value (9% white) is close to invisible on its own. */
  --menu-panel-bg: rgba(255, 255, 255, 0.97);
  --blur: 10px;
  --radius: 16px;
  --radius-sm: 12px;
  --radius-btn: 10px;
  --scan-bg: #0a1024;
  color: var(--ink);
  background: var(--bg-solid);
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  font-synthesis: none;
}
html[data-theme="dark"] {
  color-scheme: dark;
  --bg: linear-gradient(135deg, #0f172a 0%, #111c3a 60%, #1a1638 100%);
  --bg-solid: #111c3a;
  --glass: rgba(255, 255, 255, 0.05);
  --glass-strong: rgba(255, 255, 255, 0.09);
  --glass-border: rgba(255, 255, 255, 0.12);
  --glass-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
  --surface: rgba(255, 255, 255, 0.05);
  --surface-border: rgba(255, 255, 255, 0.1);
  --ink: #e6ecfa;
  --muted: #9aa8c4;
  --action: #3b82f6;
  --action-dark: #2563eb;
  --action-fill: #2563eb;
  --action-fill-hover: #1d4ed8;
  --action-text: #60a5fa;
  --focus-ring: #93c5fd;
  --accent: #a78bfa;
  --confirm: #34d399;
  --neutral: #38bdf8;
  --soft: #f59e0b;
  --danger: #f43f5e;
  --danger-dark: #e11d48;
  --input-bg: rgba(255, 255, 255, 0.06);
  --input-border: rgba(255, 255, 255, 0.18);
  --menu-panel-bg: rgba(17, 28, 58, 0.97);
}

* { box-sizing: border-box; }
/* Author `display` declarations always beat the UA's [hidden] rule - origin
   beats specificity - so hidden elements with a display class stayed visible. */
[hidden] { display: none !important; }
html { scroll-behavior: smooth; scroll-padding-top: 6rem; }
/* M10 (final review M3): an error toast stays until closed; while it does, a focused
   control is kept above it. app.js sets --toast-clearance to its height plus margin. */
html.toast-error-open { scroll-padding-bottom: var(--toast-clearance, 8rem); }
body { min-height: 100vh; margin: 0; background: var(--bg) fixed; color: var(--ink); }
button, input, select, textarea { font: inherit; }
a { color: inherit; text-underline-offset: 0.2em; }
button, a { -webkit-tap-highlight-color: transparent; }
::selection { background: rgba(47, 107, 255, 0.25); }

/* ---------- header, brand, theme toggle ---------- */
.site-header { min-height: 4.75rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.6rem clamp(1rem, 4vw, 3.5rem); border-bottom: 1px solid var(--glass-border); background: var(--glass); backdrop-filter: blur(var(--blur)); -webkit-backdrop-filter: blur(var(--blur)); position: sticky; top: 0; z-index: 20; }
.brand { display: inline-flex; align-items: center; text-decoration: none; }
.brand-plate { display: inline-flex; align-items: center; padding: 0.2rem 0.5rem; border-radius: 10px; }
.brand-logo { height: 2.6rem; width: auto; display: block; }
.site-nav { display: flex; align-items: center; gap: clamp(0.8rem, 3vw, 2rem); }
.site-nav a { font-size: 0.84rem; font-weight: 800; text-decoration: none; text-transform: uppercase; letter-spacing: 0.08em; padding-bottom: 0.15rem; border-bottom: 2px solid transparent; }
.site-nav a:hover, .site-nav a:focus-visible { border-image: var(--brand) 1; }
.menu-trigger { display: none; }
.theme-toggle { width: 2.4rem; height: 2.4rem; display: grid; place-items: center; border: 1px solid var(--glass-border); border-radius: 999px; background: var(--surface); color: var(--ink); font-size: 1.1rem; cursor: pointer; }
.theme-toggle:hover, .theme-toggle:focus-visible { border-color: var(--action); }
/* The words only appear in the open mobile menu, where a lone moon on a wide
   white bar read like an empty input field (operator review 06.10.2026). */
.theme-toggle__label { display: none; }

/* ---------- layout ---------- */
main { min-height: calc(100vh - 9rem); }
.shell { width: min(100% - 2rem, 76rem); margin-inline: auto; padding-block: clamp(2rem, 6vw, 4.5rem); }
.narrow { width: min(100% - 2rem, 46rem); }
.flush { padding-block: 0; }
.inline-controls { display: flex; gap: 0.5rem; }
.seat-controls { margin-block: 0.6rem; }
.seat-controls select { flex: 1; min-width: 10rem; }
.seat-controls .seat-count { width: 5rem; }
.comp-block-actions { display: inline-flex; margin-left: 1rem; gap: 0.5rem; }

/* ---------- cards: one glass block per content section ---------- */
.card { position: relative; padding: clamp(1.25rem, 3vw, 2rem); margin-block: 1.5rem; border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass); box-shadow: var(--glass-shadow); backdrop-filter: blur(var(--blur)); -webkit-backdrop-filter: blur(var(--blur)); }
.card > h2:first-child, .card > h3:first-child, .card > .section-head:first-child { margin-top: 0; }
.card > h2::after, .card > h3::after, .section-head h2::after, .section-head h3::after { content: ""; display: block; width: 4rem; height: 3px; margin-top: 0.5rem; border-radius: 2px; background: var(--brand); }
.card .card, .card .shell { padding-inline: 0; }
.surface { border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); }
.hero { min-height: 60vh; display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(15rem, 0.55fr); align-items: center; gap: clamp(2rem, 7vw, 7rem); }
.hero-art { display: grid; place-items: center; padding: clamp(1rem, 4vw, 2.5rem); }
.hero-art img { width: min(100%, 22rem); height: auto; }

/* ---------- public discovery page ---------- */

/* ---------- type ---------- */
.eyebrow { margin: 0 0 0.9rem; color: var(--action-text); font-size: 0.76rem; font-weight: 900; letter-spacing: 0.16em; text-transform: uppercase; }
h1, h2, h3 { font-family: "Arial Narrow", "Bahnschrift Condensed", Impact, sans-serif; margin: 0; text-transform: uppercase; line-height: 0.94; }
h1 { max-width: 12ch; font-size: clamp(3.2rem, 9vw, 7.5rem); letter-spacing: -0.045em; }
h2 { font-size: clamp(2rem, 5vw, 4rem); letter-spacing: -0.03em; }
h3 { font-size: 1.45rem; letter-spacing: 0.01em; }
/* M10 (F12): one unbreakable German compound or venue name widened the page
   to 890 px at 320 - the legal pages' fix, now for every heading. */
h1, h2, h3, .event-stage__venue { overflow-wrap: break-word; hyphens: auto; }
.skip-link { position: absolute; left: 1rem; top: -4rem; z-index: 60; padding: .75rem 1rem; border-radius: var(--radius-btn); background: var(--surface); color: var(--ink); font-weight: 800; }
.skip-link:focus { top: .75rem; }
h2.section-title { font-size: clamp(1.8rem, 3.5vw, 2.6rem); margin-top: 2rem; }
.lead { max-width: 43rem; margin: 1.4rem 0 0; color: var(--muted); font-size: clamp(1.05rem, 2vw, 1.3rem); line-height: 1.55; }
.muted { color: var(--muted); }
.login-logo { display: block; height: auto; width: 11rem; margin: 0 0 1.5rem; }

/* ---------- buttons: colour = function ---------- */
.button { min-height: 3rem; display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.75rem 1.1rem; border: 1px solid var(--action-fill); border-radius: var(--radius-btn); background: var(--action-fill); color: var(--on-fill); font-weight: 800; text-decoration: none; cursor: pointer; transition: background-color 150ms, border-color 150ms, color 150ms, box-shadow 150ms; }
.button:hover, .button:focus-visible { background: var(--action-fill-hover); border-color: var(--action-fill-hover); }
.button:focus-visible, .theme-toggle:focus-visible, .side-nav a:focus-visible, .side-nav button:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible, summary:focus-visible,
.seat-picker__seat-btn:focus-visible, .toast button:focus-visible, .skip-link:focus-visible {
  outline: 3px solid var(--focus-ring); outline-offset: 2px; box-shadow: none;
}
.button.confirm, .button.neutral, .button.soft, .button.secondary { background: var(--surface); }
.button.confirm { border-color: var(--confirm); color: var(--confirm); }
.button.confirm:hover, .button.confirm:focus-visible { background: var(--confirm); color: var(--on-tint); }
.button.neutral, .button.secondary { border-color: var(--neutral); color: var(--neutral); }
.button.neutral:hover, .button.neutral:focus-visible, .button.secondary:hover, .button.secondary:focus-visible { background: var(--neutral); color: var(--on-tint); }
.button.soft { border-color: var(--soft); color: var(--soft); }
.button.soft:hover, .button.soft:focus-visible { background: var(--soft); color: var(--on-tint); }
.button.danger { background: var(--danger); border-color: var(--danger); color: var(--on-fill); }
.button.danger:hover, .button.danger:focus-visible { background: var(--danger-dark); border-color: var(--danger-dark); }
.button[disabled] { opacity: 0.5; cursor: not-allowed; }
html[data-theme="light"] .button.confirm { color: #15803d; } html[data-theme="light"] .button.neutral, html[data-theme="light"] .button.secondary { color: #0369a1; } html[data-theme="light"] .button.soft { color: #b45309; }
/* The light-theme text colours above out-rank the hover/focus rules, which left
   dark teal on the filled sky blue (2.1:1). Filled state = --on-tint (M10, F03). */
html[data-theme="light"] .button.confirm:hover, html[data-theme="light"] .button.confirm:focus-visible,
html[data-theme="light"] .button.neutral:hover, html[data-theme="light"] .button.neutral:focus-visible,
html[data-theme="light"] .button.secondary:hover, html[data-theme="light"] .button.secondary:focus-visible,
html[data-theme="light"] .button.soft:hover, html[data-theme="light"] .button.soft:focus-visible { color: var(--on-tint); }

/* ---------- sections, ledgers, forms ---------- */
.section-head { display: flex; align-items: end; justify-content: space-between; gap: 1rem; margin-bottom: 1.5rem; }
.section-head > .button { white-space: nowrap; flex: none; }
.ledger { border-top: 1px solid var(--surface-border); }
/* minmax(0, …) instead of a bare fr: a bare fr track never shrinks below its
   content's min-content width, and an unbroken dotted identifier (the audit
   log's "authentication.login_succeeded" - dots and underscores are not wrap
   points) forced the row wider than its own container, pushing the trailing
   pill off the edge instead of leaving it to wrap. */
.ledger-row { display: grid; grid-template-columns: minmax(0, 2.2fr) minmax(0, 1fr) auto; align-items: center; gap: 1rem; padding: 1rem 0; border-bottom: 1px solid var(--surface-border); }
.ledger-row strong { font-size: 1.04rem; overflow-wrap: break-word; }
.ledger-row small { display: block; color: var(--muted); margin-top: 0.25rem; }
.ledger-row input { flex: 1; min-width: 12rem; }
.ledger-row.inactive { opacity: 0.55; }
.holder-name.saved { outline: 2px solid var(--confirm); }
.price { font-family: "Arial Narrow", "Bahnschrift Condensed", Impact, sans-serif; font-size: 1.5rem; white-space: nowrap; background: var(--brand); -webkit-background-clip: text; background-clip: text; color: transparent; }
.quantity { width: 5rem; }
/* .ledger-row input's min-width: 12rem is sized for the name/e-mail text
   inputs of team and organizer rows - applied unscoped, it also reached
   this quantity stepper (0-100, five characters at most) and forced it to
   192px regardless of the width:5rem above, overflowing the ticket card on
   a narrow phone. Two classes beat .ledger-row's class+type selector. */
.ticket-choice .quantity { min-width: 0; }
.form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
/* Both defaults below fight the same battle: a grid/flex item's default
   min-width is "auto" (never shrink below the content's own min-content),
   and a <fieldset> additionally carries a UA-stylesheet min-width of its
   own on top of that. Neither is visible in a screenshot taken at a width
   that happens to still fit - it only pokes the fieldset's border past its
   container on a narrower real device or a font whose glyphs render wider
   (reported live: "Zusammensitzen" / "Rechtliche Hinweise" fieldsets). */
.field { display: grid; gap: 0.4rem; min-width: 0; }
.field.full { grid-column: 1 / -1; }
label, legend { font-size: 0.78rem; font-weight: 850; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); }
/* A <legend> is special-cased by the UA to straddle its fieldset's own
   border - half inside the card, half sitting outside it - regardless of
   anything else set here, and Chromium keeps applying that special case to
   a *grid* fieldset's legend specifically (every .field/.field.full
   fieldset in this app is display: grid), unlike a plain block fieldset
   where width: 100% alone is normally enough. float: left forces it into
   the same block-formatting escape hatch as the old block-fieldset fix.
   Every other card heading in the app (h3 inside .card) sits cleanly inside
   its box with normal padding; this makes a legend match it instead of
   floating ambiguously across the border. */
legend { display: block; float: left; width: 100%; padding: 0; }
input, select, textarea { width: 100%; min-height: 3rem; padding: 0.7rem 0.8rem; border: 1px solid var(--input-border); border-radius: var(--radius-btn); background: var(--input-bg); color: var(--ink); }
/* Native option popups do not consistently inherit the document colour scheme
   in Chromium. Set it on the control and its options, otherwise the dark-mode
   text is drawn on a light system popup and becomes unreadable. */
html[data-theme="dark"] select { color-scheme: dark; }
html[data-theme="dark"] select option, html[data-theme="dark"] select optgroup { background-color: #1d2944; color: #f3f6ff; }
html[data-theme="dark"] select option:checked { background-color: #2563eb; color: #ffffff; }
html[data-theme="dark"] select option:disabled { color: #b8c4dd; }
html[data-theme="light"] select { color-scheme: light; }
textarea { min-height: 6rem; resize: vertical; }
input:focus, select:focus, textarea:focus { border-color: var(--action); }
fieldset { margin: 0; padding: 1rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); min-width: 0; }
/* flex-wrap plus a wrapping span around any longer label text (see
   .legal-acceptance below) keeps a checkbox sentence from pushing the whole
   page into horizontal scroll on narrow viewports - unwrapped flex rows
   never shrink a text node or an <a> below its own content width. */
.check-line { display: flex; align-items: flex-start; gap: 0.7rem; flex-wrap: wrap; }
.check-line input { width: 1.5rem; min-height: 1.5rem; height: 1.5rem; flex-shrink: 0; margin-top: 0.15rem; accent-color: var(--action); }
.check-line > span { min-width: 0; }
.form-actions { display: flex; justify-content: flex-end; align-items: center; gap: 1rem; margin-top: 1.5rem; }
/* M10 (F05/F06): error summary, problem region and field errors. Both regions
   stay in the DOM so role="alert" announces reliably; empty, they take no room. */
.error-summary, .form-problem { overflow-wrap: break-word; margin-block: 1rem; padding: 1rem 1.15rem; border: 2px solid var(--danger); border-radius: var(--radius-sm); background: var(--surface); }
.error-summary:empty, .form-problem:empty { padding: 0; margin: 0; border: 0; }
.error-summary h2 { font-size: 1.2rem; text-transform: none; letter-spacing: 0; line-height: 1.3; }
.error-summary h2::after { display: none; }
.error-summary ul { margin: .5rem 0 0; padding-left: 1.2rem; }
.error-summary a { color: var(--ink); font-weight: 700; }
.field-error { margin: .25rem 0 0; color: var(--ink); font-weight: 700; font-size: .92rem; overflow-wrap: break-word; }
.field-error::before { content: "⚠ "; color: var(--danger); }
.ticket-choice > .field-error { grid-column: 1 / -1; }
[aria-invalid="true"]:not([type=checkbox]):not([type=radio]) { border: 2px solid var(--danger); }
.order-total { margin: 0; display: inline-flex; align-items: baseline; gap: .4rem; }
.order-total > span:first-child { color: var(--muted); font-weight: 700; }
.button[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }
/* /admin/veranstaltung/{id}: the released legal-bundle history and its
   per-document read-only text, both native <details> - no JS needed. */
.legal-document-field { margin-bottom: 1rem; }
.legal-bundle-history { margin: 1rem 0; }
.legal-bundle-history > summary { cursor: pointer; font-weight: 750; color: var(--muted); }
.legal-bundle-history-row { margin-top: 0.9rem; padding-top: 0.9rem; border-top: 1px solid var(--surface-border); }
.legal-bundle-history-doc { margin-top: 0.4rem; }
.legal-bundle-history-doc > summary { cursor: pointer; color: var(--muted); }
.legal-bundle-history-doc pre { margin: 0.5rem 0 0; padding: 0.8rem; max-height: 20rem; overflow-y: auto; white-space: pre-wrap; word-break: break-word; background: var(--surface); border: 1px solid var(--surface-border); border-radius: var(--radius-sm); font-family: inherit; font-size: 0.88rem; line-height: 1.5; }
.payment-step { margin-top: clamp(2rem, 5vw, 4rem); padding-top: clamp(2rem, 5vw, 4rem); border-top: 1px solid var(--surface-border); }
.payment-options { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: 0.75rem; }
.payment-option { min-height: 7rem; display: grid; grid-template-columns: auto 1fr; align-items: start; gap: 0.8rem; padding: 1rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); cursor: pointer; text-transform: none; letter-spacing: 0; color: var(--ink); }
.payment-option:has(input:checked) { border: 2px solid var(--action); padding: calc(1rem - 1px); }
.payment-option input { width: 1.5rem; min-height: 1.5rem; height: 1.5rem; margin-top: 0.1rem; accent-color: var(--action); }
.payment-option strong { display: block; font-size: 1rem; }
.payment-option small { display: block; margin-top: 0.45rem; color: var(--muted); font-size: 0.82rem; font-weight: 500; line-height: 1.45; }
.payment-note { margin-bottom: 0; font-size: 0.88rem; }
.legal-panel { margin-top: 1.5rem; padding: 1.25rem; }
.legal-panel h2 { font-size: clamp(1.45rem, 3vw, 2.1rem); }
.legal-panel p { max-width: 52rem; line-height: 1.55; }
.legal-links { display: flex; flex-wrap: wrap; gap: 0.25rem 0.6rem; font-weight: 750; }
.legal-version { font-size: 0.8rem; }
.legal-warning { color: var(--soft); font-weight: 750; }
.legal-acceptance { margin-top: 1.25rem; }
.event-meta { display: grid; grid-template-columns: repeat(3, 1fr); margin-top: 2rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); overflow: hidden; }
.event-meta div { padding: 1rem; border-right: 1px solid var(--surface-border); }
.event-meta div:last-child { border: 0; }
.event-meta span { display: block; color: var(--muted); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; }
.event-meta strong { display: block; margin-top: 0.25rem; }
.event-list { display: grid; gap: 1rem; margin-top: clamp(2rem, 5vw, 3.5rem); }
.event-card { display: grid; grid-template-columns: minmax(10.5rem, .75fr) minmax(11rem, 1.15fr) minmax(10rem, 1fr) auto; align-items: center; gap: clamp(.8rem, 2vw, 1.5rem); margin: 0; }
.event-card > * { min-width: 0; }
.event-card h2 { font-size: clamp(1.6rem, 3vw, 2.65rem); overflow-wrap: anywhere; }
.event-date { margin: 0; color: var(--action-text); font-size: 0.86rem; font-weight: 850; line-height: 1.4; text-transform: uppercase; letter-spacing: 0.06em; }
.event-card__identity { display: flex; align-items: center; gap: .75rem; }
.event-card__identity img { width: 5.2rem; height: 3.4rem; flex: 0 0 auto; object-fit: contain; }
.event-card__identity .event-date span { display: block; margin-top: .35rem; color: var(--muted); font-size: .68rem; letter-spacing: .04em; text-transform: none; }
.event-venue, .event-description { margin: 0.7rem 0 0; color: var(--muted); line-height: 1.5; }
.event-description { margin: 0; }
.event-card .button { justify-self: end; white-space: nowrap; }
.event-empty { max-width: 38rem; margin-inline: 0; }
/* /events: past events stay reachable but collapsed under the upcoming list (fix-wave A5, I8). */
.past-events { margin-top: clamp(2rem, 5vw, 3.5rem); }
.past-events > summary { cursor: pointer; font-weight: 750; color: var(--muted); }
.past-events .event-list { margin-top: 1rem; opacity: .85; }

/* ---------- admin layout ---------- */
.admin-layout { display: grid; grid-template-columns: 15rem minmax(0, 1fr); min-height: calc(100vh - 4.75rem); }
.side-nav { padding: 1.5rem 1rem; border-right: 1px solid var(--glass-border); background: var(--glass); backdrop-filter: blur(var(--blur)); -webkit-backdrop-filter: blur(var(--blur)); }
.side-nav a, .side-nav button { width: 100%; display: block; padding: 0.7rem 0.6rem; border: 0; border-left: 3px solid transparent; border-radius: 0 var(--radius-btn) var(--radius-btn) 0; background: none; color: var(--ink); text-align: left; font-weight: 750; cursor: pointer; text-decoration: none; }
.side-nav a:hover, .side-nav button:hover { background: var(--surface); }
.side-nav .active { border-image: var(--brand) 1; border-left-width: 3px; color: var(--action-text); }
.side-nav form { display: grid; grid-template-columns: 1fr; gap: 0.6rem; padding: 0.6rem 0; }
.side-nav form .field { grid-column: auto; }
.side-nav form input { width: 100%; min-width: 0; }
.side-nav form .button { width: 100%; background: var(--action-fill); color: var(--on-fill); border-color: var(--action-fill); text-align: center; border-radius: var(--radius-btn); }
.admin-main { padding: clamp(1.25rem, 4vw, 3rem); min-width: 0; }
.admin-main > .card:first-of-type { margin-top: 0; }
.identity-bar { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; justify-content: space-between; padding: 0.75rem clamp(1rem, 4vw, 2.5rem); border-bottom: 1px solid var(--glass-border); background: var(--glass); }
.identity-picker { display: flex; gap: 0.5rem; align-items: center; font-weight: 750; }
.identity-picker select { width: auto; min-height: 2.4rem; padding: 0.3rem 0.6rem; }
.metrics { display: grid; grid-template-columns: repeat(4, minmax(8rem, 1fr)); gap: 0.75rem; margin-block: 1.5rem; }
.metric { min-height: 7rem; padding: 1rem; display: flex; flex-direction: column; justify-content: space-between; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); }
.metric span { color: var(--muted); font-size: 0.75rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.06em; }
.metric strong { font-family: "Arial Narrow", "Bahnschrift Condensed", Impact, sans-serif; font-size: 2.6rem; }
.metric.alert { border-color: var(--soft); }
.metric.alert strong { color: var(--soft); }
.status-actions { flex-wrap: wrap; margin-top: 1rem; }

/* ---------- tables, pills ---------- */
.table-wrap { overflow-x: auto; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); }
table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
th, td { padding: 0.8rem 0.7rem; border-bottom: 1px solid var(--surface-border); text-align: left; vertical-align: middle; white-space: nowrap; }
.table-tools { display: flex; align-items: end; flex-wrap: wrap; gap: 0.65rem 1rem; margin: 0.75rem 0; padding: 0.7rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); }
.table-tools label { display: grid; gap: 0.25rem; color: var(--muted); font-size: 0.78rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
.table-tools input, .table-tools select { min-height: 2.1rem; font: inherit; letter-spacing: normal; text-transform: none; }
.table-tools #groups-filter { min-width: min(16rem, 72vw); }
.table-tools #groups-count { margin-left: auto; padding-bottom: 0.35rem; }
.compact-table table { font-size: 0.82rem; }
.compact-table th, .compact-table td { padding: 0.4rem 0.5rem; }
.compact-table td.actions { min-width: 7.5rem; width: 8.5rem; }
.group-actions { min-width: 6.8rem; }
.group-actions > summary { display: inline-flex; align-items: center; min-height: 2rem; padding: 0.15rem 0.45rem; border: 1px solid var(--surface-border); border-radius: 0.45rem; color: var(--brand); cursor: pointer; font-weight: 700; }
.group-actions[open] { min-width: 17rem; }
.group-actions[open] > summary { margin-bottom: 0.45rem; }
.group-actions .ledger-row { padding: 0.35rem 0; }
tr:last-child td { border-bottom: 0; }
th { color: var(--muted); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.06em; }
.pill { display: inline-flex; align-items: center; vertical-align: middle; padding: 0.15rem 0.6rem; border: 1px solid currentColor; border-radius: 999px; font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap; }
.pill.good { color: var(--confirm); } .pill.warn { color: var(--soft); } .pill.bad { color: var(--danger); } .pill.off { color: var(--muted); }
html[data-theme="light"] .pill.good { color: #15803d; } html[data-theme="light"] .pill.warn { color: #b45309; }
.cell-edit { display: inline-flex; gap: 0.4rem; align-items: center; }
.cell-edit input { width: 6.5rem; min-width: 0; }
.groups-table td { white-space: normal; }
.groups-table td code { white-space: nowrap; }
td.actions { min-width: 18rem; width: 38%; }
td.actions .seat-controls { flex-wrap: wrap; }
td.actions .seat-controls select { min-width: 8rem; }
td.actions .ledger-row { grid-template-columns: 1fr auto; padding: 0.5rem 0; gap: 0.5rem; }
td.actions .ledger-row input { min-width: 0; }
.team-row { grid-template-columns: minmax(12rem, 2fr) auto auto auto; }
.team-row .inline-controls { flex-wrap: wrap; }
.team-row .check-line input, .org-row .check-line input { min-width: 0; flex: none; }
.org-row .org-form { grid-column: 1 / -1; }

/* ---------- notifications page ---------- */
/* `minmax(0, 1fr)` rather than the implicit `auto` track: an auto track grows
   to max-content, so one unbreakable compound ("Zahlungserinnerung") widens
   every item in the card and pushes the lot past the edge, where nothing can
   scroll to it. Identical on a wide screen, where the track is full width
   either way. */
.notification-card { padding: clamp(1.25rem, 3vw, 1.75rem); margin-block: 1rem; display: grid; grid-template-columns: minmax(0, 1fr); gap: 1rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); }
.notification-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 0.6rem; }
/* A flex item defaults to `min-width: auto` and so refuses to go below its
   min-content width - which for "Zahlungserinnerung" is wider than the card
   on a narrow phone. Zero lets the inherited break-word do its work. */
.notification-head h3 { margin: 0; min-width: 0; }
.notification-desc { margin: 0; color: var(--muted); font-size: 0.9rem; }
.badge-group { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.badge { display: inline-flex; align-items: center; padding: 0.2rem 0.6rem; border: 1px solid currentColor; border-radius: 999px; font-size: 0.68rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.05em; }
.badge.on { color: var(--confirm); } .badge.off { color: var(--muted); } .badge.soon { color: var(--soft); }
html[data-theme="light"] .badge.on { color: #15803d; } html[data-theme="light"] .badge.soon { color: #b45309; }
.notification-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1rem; }
.channel-options { display: flex; flex-wrap: wrap; gap: 1rem; }
.channel-options label { display: flex; align-items: center; gap: 0.5rem; text-transform: none; font-weight: 600; letter-spacing: 0; font-size: 0.95rem; color: var(--ink); }
.channel-options input { width: 1.2rem; min-height: 1.2rem; accent-color: var(--action); }
.recipient-note { margin: 0; padding: 0.85rem 1rem; border: 1px solid var(--surface-border); border-radius: var(--radius-btn); background: var(--glass); color: var(--muted); font-size: 0.88rem; }
.notification-actions { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 0.25rem; }
.notification-actions .button { flex: 1 1 12rem; }
.test-result { margin: 0; padding: 0.85rem 1rem; border: 1px solid var(--surface-border); border-radius: var(--radius-btn); font-size: 0.88rem; }
.test-result.ok { border-color: var(--confirm); color: var(--confirm); }
.test-result.fail { border-color: var(--danger); color: var(--danger); }

/* ---------- check-in ---------- */
.scan-shell { min-height: calc(100vh - 4.75rem); display: grid; grid-template-rows: auto 1fr; background: var(--scan-bg); color: #eaf0ff; }
.scan-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1rem; padding: 1rem; border-bottom: 1px solid rgba(255, 255, 255, 0.12); background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(var(--blur)); }
.scan-toolbar select { width: auto; min-width: 12rem; max-width: 100%; min-height: 2.6rem; padding: 0.4rem 0.6rem; background: rgba(255, 255, 255, 0.06); border-color: rgba(255, 255, 255, 0.2); color: #eaf0ff; }
.scan-main { width: min(100% - 2rem, 48rem); margin: 0 auto; padding-block: 2rem; }
.scan-main input { background: rgba(255, 255, 255, 0.06); border-color: rgba(255, 255, 255, 0.2); color: #eaf0ff; }
.scan-main label { color: #b8c4dd; }
.scan-result { min-height: 13rem; margin-block: 1.5rem; padding: 1.5rem; border: 1px solid rgba(255, 255, 255, 0.15); border-radius: var(--radius); background: rgba(255, 255, 255, 0.05); display: grid; align-content: center; }
.scan-result.valid { background: #16a34a; border-color: #16a34a; color: #fff; }
.scan-result.invalid { background: #e11d48; border-color: #e11d48; color: #fff; }
.scan-result h2 { font-size: clamp(3rem, 10vw, 6rem); }
.scan-result p { margin-bottom: 0; }
.scan-result .eyebrow { color: inherit; opacity: 0.85; }
.camera { width: 100%; max-height: 55vh; background: #000; object-fit: cover; border: 1px solid rgba(255, 255, 255, 0.2); border-radius: var(--radius-sm); }
.search-results button { position: relative; overflow: hidden; width: 100%; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 1rem; padding: 0.9rem 0; border: 0; border-bottom: 1px solid rgba(255, 255, 255, 0.12); background: transparent; color: #eaf0ff; text-align: left; cursor: pointer; touch-action: manipulation; -webkit-user-select: none; user-select: none; }
.search-results button small { display: block; margin-top: 0.2rem; color: #b8c4dd; overflow-wrap: anywhere; }
.search-results button[disabled] { opacity: 0.55; cursor: default; }
/* wireLongPressConfirm's hold-to-arm feedback: fills over the same 3s the
   hold takes, snaps back in 150ms on release/cancel/pointer-move (a scroll,
   not a press) instead of visibly reversing the 3s transition. Placed
   first in the DOM as a background layer; the two content spans get their
   own stacking order below so the fill never paints over the text. */
.search-results button .press-fill { position: absolute; inset: 0; z-index: 0; width: 0%; background: var(--confirm); opacity: .3; transition: width 3000ms linear; pointer-events: none; }
.search-results button.is-pressing .press-fill { width: 100%; }
.search-results button .press-fill ~ span { position: relative; z-index: 1; }
.search-results .pill.good { color: #6ee7b7; } .search-results .pill.bad { color: #fda4af; }
.search-result-group + .search-result-group { margin-top: .75rem; }
.search-result-group > summary { cursor: pointer; padding: .5rem 0; font-weight: 750; color: var(--muted); list-style: none; }
.search-result-group > summary::-webkit-details-marker { display: none; }
.search-result-group > summary::before { content: "▸ "; }
.search-result-group[open] > summary::before { content: "▾ "; }

/* ---------- order, tickets, bank transfer ---------- */
.order-success { border-left: 4px solid var(--confirm); }
.group-box { padding-block: 1.5rem; }
.code { letter-spacing: 0.1em; }
.code-big { font-size: 2.5rem; letter-spacing: 0.2em; font-weight: 700; background: var(--brand); -webkit-background-clip: text; background-clip: text; color: transparent; }
.bank-instructions { margin-block: 2rem; padding: clamp(1.25rem, 4vw, 2rem); border: 1px solid var(--surface-border); border-radius: var(--radius); background: var(--surface); }
.bank-instructions h2 { font-size: clamp(2rem, 6vw, 3.6rem); }
.bank-instructions dl { margin: 1.5rem 0 0; border-top: 1px solid var(--surface-border); }
.bank-instructions dl div { display: grid; grid-template-columns: minmax(8rem, 0.7fr) 1.3fr; gap: 1rem; padding: 0.75rem 0; border-bottom: 1px solid var(--surface-border); }
.bank-instructions dt { color: var(--muted); font-size: 0.75rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.06em; }
.bank-instructions dd { margin: 0; overflow-wrap: anywhere; }
.ticket-line { display: flex; justify-content: space-between; align-items: center; gap: 1rem; padding: 1rem 0; border-bottom: 1px solid var(--surface-border); }
.error-box { padding: 1rem; border: 1px solid var(--danger); border-radius: var(--radius-sm); color: var(--danger); background: var(--surface); }
.loading { width: min(100% - 2rem, 76rem); margin: 6rem auto; color: var(--muted); }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* ---------- password box, webhook line, dialog, toast, footer ---------- */
.password-box { position: relative; padding: 1rem; margin: 1rem 0; border-radius: var(--radius-sm); background: var(--surface); border: 1.5px solid transparent; background-image: linear-gradient(var(--surface), var(--surface)), var(--brand); background-origin: border-box; background-clip: padding-box, border-box; }
.password-box code { font-size: 1.2rem; user-select: all; }
.webhook-line { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
#webhook-url { overflow-wrap: anywhere; min-width: 0; }
.confirm-dialog { width: min(100% - 2rem, 32rem); padding: 0; border: 2px solid var(--danger); border-radius: var(--radius); background: var(--glass-strong); color: var(--ink); backdrop-filter: blur(var(--blur)); -webkit-backdrop-filter: blur(var(--blur)); box-shadow: var(--glass-shadow); }
.confirm-dialog::backdrop { background: rgba(15, 23, 42, 0.6); backdrop-filter: blur(4px); }
.confirm-form { padding: 1.5rem; }
.confirm-form h3 { margin-bottom: 0.75rem; }
.confirm-form p { margin: 0 0 0.9rem; line-height: 1.5; }
.confirm-form .field { margin-top: 1rem; }
.confirm-form .form-actions { margin-top: 1.25rem; flex-wrap: wrap; }
/* P2-SEAT-FLEX: a question without danger - same frame, calm border. */
.choice-dialog { border-color: var(--accent); }
.choice-dialog select { width: 100%; }
.toast { position: fixed; left: 50%; bottom: 1.25rem; transform: translateX(-50%); max-width: min(26rem, calc(100% - 2rem)); padding: 0.9rem 1.1rem; border-radius: var(--radius-sm); border: 1px solid var(--glass-border); border-left: 4px solid var(--confirm); background: var(--glass-strong); color: var(--ink); box-shadow: var(--glass-shadow); backdrop-filter: blur(var(--blur)); -webkit-backdrop-filter: blur(var(--blur)); z-index: 50; }
.toast.error { border-left-color: var(--danger); }
footer { display: flex; justify-content: space-between; gap: 1rem; padding: 1.5rem clamp(1rem, 4vw, 3.5rem); border-top: 1px solid var(--glass-border); color: var(--muted); font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.08em; }

/* ---------- mobile ---------- */
@media (max-width: 760px) {
  /* This used to force position: static here, predating the mobile dropdown
     menu by six days (it's from the very first commit). Two problems came
     from it, both reported live: with the header no longer a positioned
     element, it stops being a stacking context of its own, so .site-nav's
     z-index only gets compared inside whatever ancestor context it escapes
     to - and the old start page's hero (`isolation: isolate`, an unrelated, self-
     contained decorative effect) ends up winning that comparison and
     painting over the open menu. And a static header isn't sticky, so it
     scrolls away instead of staying reachable. Inheriting the base rule's
     `position: sticky; top: 0;` fixes both: the header becomes its own
     stacking context again (containing the menu safely above anything
     a page section does internally), and it stays pinned while scrolling.
     (That hero went with the old start page in P2-LND.) */
  .brand-logo { height: 2.2rem; }
  .hero { grid-template-columns: 1fr; min-height: auto; }
  .hero-art { width: min(76vw, 21rem); justify-self: center; grid-row: 1; }
  .form-grid { grid-template-columns: 1fr; }
  .field.full { grid-column: auto; }
  .event-meta { grid-template-columns: 1fr; }
  .event-meta div { border-right: 0; border-bottom: 1px solid var(--surface-border); }
  .event-card { grid-template-columns: 1fr; gap: 0.8rem; }
  .event-description { margin-top: 0.2rem; }
  .event-card .button { justify-self: start; margin-top: 0.25rem; }
  .admin-layout { grid-template-columns: 1fr; }
  .side-nav { border-right: 0; border-bottom: 1px solid var(--glass-border); }
  /* A bare `1fr` is `minmax(auto, 1fr)` and never shrinks below the item's
     min-content width, so a wide figure ("27.000,00 EUR") pushed the whole
     grid past the card - and `#app > .admin-layout` clips, so the part that
     stuck out was simply gone, with nothing to scroll. */
  .metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .metric { min-width: 0; }
  /* 2.6rem needs 224px for "27.000,00 EUR" - more than a half-width tile has
     on a phone, and Intl's non-breaking space makes the amount one unbreakable
     word, so it would break mid-number. Scaling the figure with the viewport
     keeps it on one line; `anywhere` stays as the last resort for a six-figure
     total. */
  .metric strong { font-size: clamp(1.5rem, 7vw, 2.6rem); overflow-wrap: anywhere; }
  .ledger-row { grid-template-columns: minmax(0, 1fr) auto; }
  /* Two columns only fit a two-cell row. The lists inside a card carry three
     and four (name, ticket, the table picker plus its button), so the extra
     cells wrapped into the narrow first column - a 10rem <select> in 24px of
     space, clipped away with the "Setzen" button on it. Outside a
     `.table-wrap` there is nothing to scroll, so they stack instead. */
  .card .ledger .ledger-row { grid-template-columns: minmax(0, 1fr); gap: 0.35rem; }
  /* `min-width: 0` is what lets the inherited `break-word` above actually
     fire: a grid item defaults to `min-width: auto`, so an unbreakable token
     ("authentication.login_succeeded") widens the track instead of wrapping,
     and the row overflows a box that has nothing to scroll. Note there is no
     `justify-self: start` here: that sizes the item to max-content, so the
     token would never overflow its own box and `break-word` would never fire.
     Stretching to the track and aligning the text is the same result. */
  .card .ledger .ledger-row > * { text-align: left; min-width: 0; }
  .seat-controls select { min-width: 0; }
  .ledger-row .price { grid-column: 1; }
  .team-row { grid-template-columns: 1fr; }
  td.actions { min-width: 14rem; }
  .table-tools { align-items: stretch; }
  .table-tools label { flex: 1 1 10rem; min-width: 0; }
  /* The filter's own `min-width: min(16rem, 72vw)` measures against the
     viewport while the label it sits in is a good deal narrower than that
     (245px inside the card at 375px), so it pushed past the edge. Full width
     of whatever the label has is what a phone wants anyway. */
  .table-tools input,
  .table-tools select,
  .table-tools #groups-filter { min-width: 0; }

  /* No sideways scrolling on a phone, by operator ruling: a table has nowhere
     to go and every control in it has to stay tappable where it is, so each
     row becomes its own stacked block and each cell is labelled with the
     column heading it lost (`data-label`, written by `labelTableCells()` in
     app.js). This is why `th, td { white-space: nowrap }` can stay for the
     desktop table it was written for. */
  .table-wrap table,
  .table-wrap tbody,
  .table-wrap tfoot,
  .table-wrap tr,
  .table-wrap td { display: block; width: auto; }
  .table-wrap thead { display: none; }
  .table-wrap tr { padding: 0.65rem 0.8rem; border-bottom: 1px solid var(--surface-border); }
  .table-wrap tr:last-child { border-bottom: 0; }
  .table-wrap td {
    display: grid;
    grid-template-columns: minmax(0, 6.5rem) minmax(0, 1fr);
    align-items: start;
    gap: 0.2rem 0.75rem;
    padding: 0.3rem 0;
    border: 0;
    white-space: normal;
  }
  .table-wrap td::before {
    content: attr(data-label);
    padding-top: 0.15rem;
    color: var(--muted);
    font-size: 0.68rem;
    font-weight: 800;
    letter-spacing: 0.05em;
    text-transform: uppercase;
  }
  /* The action cell and the "nothing here yet" row carry no heading: they get
     the full width instead of an empty label column. */
  .table-wrap td:not([data-label]) { display: block; padding-top: 0.5rem; }
  .table-wrap td:not([data-label])::before { content: none; }
  /* The ticket-type sum row's empty price column has nothing to stack. */
  .table-wrap .ticket-type-sum td:empty { display: none; }
  .table-wrap td.actions,
  .compact-table td.actions { min-width: 0; width: auto; }
  /* A cell holding a control needs the full width, not what is left beside a
     label column - an input plus its "Speichern" button does not fit there.
     The label moves above it instead. `.cell-edit` wrapping is the fallback
     for a browser without `:has()`. */
  .table-wrap td:has(input, select, button, textarea) { display: block; }
  .table-wrap td:has(input, select, button, textarea)::before {
    display: block;
    margin-bottom: 0.3rem;
  }
  .cell-edit { flex-wrap: wrap; }
  .cell-edit input { width: 100%; }
  /* A cell that *is* the pill would draw its outline around the whole stacked
     row, so only the colour survives - the label says what the value means. */
  .table-wrap td.pill {
    border: 0;
    border-radius: 0;
    padding: 0.3rem 0;
    font-size: 0.9rem;
    letter-spacing: 0;
    text-transform: none;
  }
  .compact-table table { font-size: 0.9rem; }
  .compact-table th,
  .compact-table td { padding: 0.3rem 0; }
  .table-tools #groups-count { flex-basis: 100%; margin-left: 0; }
  footer { align-items: flex-start; flex-direction: column; }
  .inline-controls { align-items: stretch; flex-direction: column; }
  .form-actions { flex-wrap: wrap; }
  .section-head { flex-wrap: wrap; align-items: start; }
  .payment-options { grid-template-columns: 1fr; }
  .bank-instructions dl div { grid-template-columns: 1fr; gap: 0.25rem; }
}

@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } .button, .theme-toggle { transition: none; } }

/* ---------- public event atmosphere ----------
   A dependency-free interpretation of the ReactBits background treatments.
   It deliberately lives only on the discovery page: purchasing remains clear,
   while the first impression feels like arriving at a venue after dark. */

@media (prefers-reduced-motion: reduce) {
}

/* Spec §7 (Clean Frost): no animation beyond hover/focus transitions. The
   featured ticket keeps a static emphasis border; the pulsing border glow,
   the cursor halo, the marquee and the ambient drifts were removed in
   fix-wave A5 - none of them told the visitor anything. */

/* Staggered Menu is intentionally mobile-only; desktop navigation stays fast. */
@media (max-width: 760px) {
  .menu-trigger { min-height: 2.6rem; display: inline-flex; align-items: center; gap: .65rem; margin-left: auto; padding: .45rem .65rem; border: 1px solid var(--glass-border); border-radius: 999px; background: var(--surface); color: var(--ink); font-weight: 800; cursor: pointer; }
  .menu-trigger i, .menu-trigger i::before { display: block; width: 1rem; height: 2px; border-radius: 2px; background: currentColor; content: ""; transition: transform 220ms ease; }
  .menu-trigger i::before { transform: translateY(-.28rem); box-shadow: 0 .56rem 0 currentColor; }
  .site-header[data-menu-open="true"] .menu-trigger i { background: transparent; }
  .site-header[data-menu-open="true"] .menu-trigger i::before { transform: rotate(45deg); box-shadow: 0 0 0 transparent; }
  .site-nav { position: absolute; top: calc(100% + .5rem); right: 1rem; left: 1rem; display: grid; gap: .7rem; padding: 1.25rem; border: 1px solid var(--glass-border); border-radius: 1.25rem; background: var(--menu-panel-bg); box-shadow: var(--glass-shadow); backdrop-filter: blur(calc(var(--blur) * 1.6)); opacity: 0; transform: translateY(-.75rem) scale(.98); pointer-events: none; transition: opacity 180ms ease, transform 220ms ease; z-index: 30; }
  /* M10 (F01): opacity alone left five invisible links in the tab order.
     visibility follows the fade: hidden after it on close, visible at once on open. */
  .site-nav { visibility: hidden; transition: opacity 180ms ease, transform 220ms ease, visibility 0s linear 220ms; }
  .site-header[data-menu-open="true"] .site-nav { visibility: visible; transition-delay: 0s; }
  .site-nav a, .site-nav .theme-toggle { opacity: 0; transform: translateY(-.45rem); transition: opacity 200ms ease, transform 240ms ease; }
  .site-header[data-menu-open="true"] .site-nav { opacity: 1; transform: none; pointer-events: auto; }
  .site-header[data-menu-open="true"] .site-nav a, .site-header[data-menu-open="true"] .site-nav .theme-toggle { opacity: 1; transform: none; }
  .site-header[data-menu-open="true"] .site-nav > :nth-child(1) { transition-delay: 55ms; }
  .site-header[data-menu-open="true"] .site-nav > :nth-child(2) { transition-delay: 105ms; }
  .site-header[data-menu-open="true"] .site-nav > :nth-child(3) { transition-delay: 155ms; }
  .site-nav .theme-toggle { width: 100%; min-height: 2.75rem; display: flex; align-items: center; justify-content: center; gap: .6rem; border-radius: var(--radius-btn); font-size: .95rem; font-weight: 700; }
  .site-nav .theme-toggle__label { display: inline; }
}

@media (prefers-reduced-motion: reduce) {
  .menu-trigger i, .menu-trigger i::before, .site-nav, .site-nav a, .site-nav .theme-toggle { transition: none; }
}

/* ---------- EventFlow rect system ----------
   One composed surface language for every screen: event discovery can glow,
   while operating screens use the same geometry at a quieter intensity. */
:root {
  --rect-radius: 1.25rem;
  --rect-outline: linear-gradient(135deg, rgba(34, 184, 245, .52), rgba(255, 255, 255, .08) 42%, rgba(123, 63, 228, .42));
  --rect-fill: linear-gradient(145deg, rgba(255, 255, 255, .9), rgba(244, 247, 255, .76));
  --rect-shadow: 0 1rem 2.75rem rgba(18, 41, 74, .09);
}
html[data-theme="dark"] {
  --rect-outline: linear-gradient(135deg, rgba(34, 184, 245, .38), rgba(255, 255, 255, .08) 42%, rgba(167, 139, 250, .38));
  --rect-fill: linear-gradient(145deg, rgba(29, 48, 84, .86), rgba(20, 31, 64, .76));
  --rect-shadow: 0 1rem 2.75rem rgba(0, 0, 0, .28);
}
.card,
.surface,
.notification-card,
.bank-instructions,
.payment-option,
.metric,
.scan-result,
.table-wrap {
  border: 1px solid transparent;
  border-radius: var(--rect-radius);
  background: var(--rect-fill) padding-box, var(--rect-outline) border-box;
  box-shadow: var(--rect-shadow);
}
.card,
.notification-card,
.bank-instructions,
.scan-result { position: relative; }
.card::before,
.notification-card::before,
.bank-instructions::before,
.scan-result::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  pointer-events: none;
  background: linear-gradient(110deg, rgba(255, 255, 255, .3), transparent 28%);
}
html[data-theme="dark"] .card::before,
html[data-theme="dark"] .notification-card::before,
html[data-theme="dark"] .bank-instructions::before,
html[data-theme="dark"] .scan-result::before { background: linear-gradient(110deg, rgba(255, 255, 255, .08), transparent 28%); }
.card > *,
.notification-card > *,
.bank-instructions > *,
.scan-result > * { position: relative; }
.metric { min-height: 7.25rem; }
.payment-option { transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease; }
.payment-option:hover,
.payment-option:focus-within { transform: translateY(-2px); box-shadow: 0 1.15rem 2.3rem rgba(47, 107, 255, .13); }
/* No `overflow: hidden` here, however tidy the rounded corner looks with it:
   `th, td { white-space: nowrap }` makes every table wider than a phone, and
   `#app > .admin-layout { overflow: hidden }` below means the page cannot be
   pushed sideways either - so clipping the box is clipping the columns away
   for good, with no way to reach them. The base rule's `overflow-x: auto`
   (see "tables, pills") is what makes them scrollable, and a scroll container
   clips to the border-radius just the same. */
.scan-result.valid { background: #16a34a; border-color: #16a34a; }
.scan-result.invalid { background: #e11d48; border-color: #e11d48; }
@media (prefers-reduced-motion: reduce) {
  .payment-option { transition: none; }
  .payment-option:hover, .payment-option:focus-within { transform: none; }
}

/* The less prominent surfaces are still part of the same product. */
.shell.narrow,
.legal-document,
.admin-main,
.side-nav,
.identity-bar,
.event-meta,
.table-tools,
.recipient-note,
.test-result,
.password-box,
.error-box,
.confirm-dialog,
.toast,
.order-success,
.event-empty,
.scan-toolbar,
.camera,
.search-results,
fieldset {
  border: 1px solid transparent;
  border-radius: var(--rect-radius);
  background: var(--rect-fill) padding-box, var(--rect-outline) border-box;
  box-shadow: var(--rect-shadow);
}
.shell.narrow,
.legal-document { margin-top: clamp(1.5rem, 5vw, 4rem); margin-bottom: clamp(2rem, 5vw, 4rem); padding: clamp(1.5rem, 4vw, 3rem); }
.legal-document { max-width: 52rem; }
/* The global h1 rule caps width at 12ch for short poster-style phrases
   ("MACH PLATZ FÜR..."), which always wrap at a space. A legal document's
   title is a single long German compound noun with no space at all
   ("Datenschutzerklärung", the second word of "Ticket- und
   Teilnahmebedingungen") - without a wrap point, max-width doesn't stop it
   overflowing, it just widens the whole page into horizontal scroll. */
.legal-document h1,
.legal-document h2 { overflow-wrap: break-word; hyphens: auto; }
.legal-document h2 { margin-top: 2.4rem; padding-top: 1rem; border-top: 1px solid var(--surface-border); }
.legal-document p { max-width: 68ch; line-height: 1.65; }
/* The same unbreakable-compound case the legal pages hit, all over the admin
   surface: "Agentenvorschlag", "Zahlungseingänge", "authentication.login_
   succeeded" have no wrap point, and `#app > .admin-layout` clips - so what
   sticks out is gone, with nothing to scroll to reach it. `overflow-wrap`
   inherits, so one declaration covers every heading, cell and note here, and
   `break-word` (not `anywhere`) leaves intrinsic sizing alone: it breaks a
   word only when it would otherwise overflow. */
.admin-main { margin: clamp(1rem, 2vw, 2rem); padding: clamp(1.25rem, 3vw, 2.5rem); overflow-wrap: break-word; }
.admin-main h2,
.admin-main h3 { hyphens: auto; }
.side-nav { margin: 1rem 0 1rem 1rem; padding: 1rem; }
.identity-bar { margin: 1rem 1rem 0; }
.event-meta { overflow: hidden; }
.event-meta div { background: transparent; }
.table-tools,
.recipient-note,
.test-result,
.password-box,
.error-box,
.order-success { padding: 1rem 1.15rem; }
.event-empty { border-style: solid; }
.scan-toolbar { margin: 1rem; }
.scan-main { padding: 1rem; border: 1px solid transparent; border-radius: var(--rect-radius); background: var(--rect-fill) padding-box, var(--rect-outline) border-box; box-shadow: var(--rect-shadow); }
.camera { overflow: hidden; }
.search-results { padding: .5rem 1rem; }
.search-results button { border-radius: .75rem; }
.confirm-dialog { overflow: hidden; }
.toast { border-left-width: 1px; }
@media (max-width: 760px) {
  .shell.narrow,
  .legal-document { width: min(100% - 1rem, 46rem); padding: 1.25rem; }
  .admin-main { margin: .75rem; padding: 1rem; }
  .side-nav { margin: .75rem; }
  .identity-bar { margin: .75rem .75rem 0; }
  .scan-toolbar { margin: .75rem; }
  .scan-main { width: min(100% - 1rem, 48rem); }
}

/* Shared background and page frame: no route may opt out of the EventFlow stage. */
body { position: relative; isolation: isolate; }
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  opacity: .62;
  background:
    radial-gradient(ellipse 46% 54% at 5% 12%, rgba(34, 184, 245, .13), transparent 72%),
    radial-gradient(ellipse 42% 56% at 93% 78%, rgba(123, 63, 228, .16), transparent 72%),
    radial-gradient(circle at 15% 26%, rgba(255, 255, 255, .7) 0 1px, transparent 1.7px),
    radial-gradient(circle at 62% 71%, rgba(34, 184, 245, .72) 0 1px, transparent 1.8px),
    radial-gradient(circle at 88% 18%, rgba(196, 181, 253, .72) 0 1px, transparent 1.8px);
  background-size: auto, auto, 15rem 18rem, 20rem 19rem, 17rem 21rem;
}
#app > .shell,
#app > .admin-layout,
#app > .scan-shell {
  border: 1px solid transparent;
  border-radius: var(--rect-radius);
  background: var(--rect-fill) padding-box, var(--rect-outline) border-box;
  box-shadow: var(--rect-shadow);
}
#app > .shell { margin-top: clamp(1rem, 3vw, 2.5rem); margin-bottom: clamp(1rem, 3vw, 2.5rem); }
#app > .shell.event-page {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
}
#app > .card.ticket-section {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
#app > .card.ticket-section::before { display: none; }
.ticket-section .card.order-details {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.ticket-section .card.order-details::before { display: none; }

/* Page chrome stays intentionally transparent.  Cards below it retain the
   visual hierarchy for tasks, forms and status information. */
#app > .shell,
#app > .admin-layout,
#app > .scan-shell,
.shell.narrow,
.legal-document,
.admin-main,
.side-nav,
.identity-bar,
.scan-main {
  border-color: transparent;
  background: transparent;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
#app > .admin-layout { margin: 1rem; overflow: hidden; }
#app > .scan-shell { margin: 1rem; min-height: calc(100vh - 6.75rem); overflow: hidden; }
@media (max-width: 760px) {
  #app > .admin-layout,
  #app > .scan-shell { margin: .5rem; }
}
/* ---------- public event stage ----------
   The public path gets a real arrival moment: stage light and a ticket edge,
   both static. Operational pages remain deliberately restrained. */
.event-stage {
  position: relative;
  isolation: isolate;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  min-height: 15rem;
  margin-top: 2rem;
  padding: clamp(1.4rem, 4vw, 2.8rem);
  overflow: hidden;
  border: 1px solid transparent;
  border-radius: calc(var(--rect-radius) + .35rem);
  background:
    linear-gradient(140deg, rgba(8, 19, 49, .94), rgba(22, 35, 83, .88) 52%, rgba(87, 48, 178, .82)) padding-box,
    linear-gradient(120deg, #22b8f5, rgba(255, 255, 255, .48) 44%, #a78bfa 72%, #ec4899) border-box;
  color: #fff;
  box-shadow: 0 1.7rem 4.5rem rgba(18, 23, 69, .38);
}
.event-stage::before,
.event-stage::after { content: ""; position: absolute; z-index: -1; pointer-events: none; }
.event-stage::before { inset: -30% 26% -35% -18%; background: conic-gradient(from 238deg at 50% 100%, transparent 0 13deg, rgba(34, 184, 245, .28) 15deg 30deg, transparent 33deg 68deg, rgba(196, 181, 253, .22) 70deg 84deg, transparent 86deg); filter: blur(2px); }
.event-stage::after { inset: 0; opacity: .6; background-image: radial-gradient(circle, rgba(255,255,255,.95) 0 1px, transparent 1.8px), radial-gradient(circle, rgba(34,184,245,.9) 0 1.2px, transparent 2px); background-size: 10rem 12rem, 16rem 14rem; background-position: 2rem 1rem, 7rem 4rem; }
.event-stage__copy,
.event-stage__ticket { position: relative; z-index: 1; }
.event-stage__copy .eyebrow { color: #9ce8ff; }
.event-stage__venue { max-width: 15ch; margin: 0; font-family: "Arial Narrow", "Bahnschrift Condensed", Impact, sans-serif; font-size: clamp(2.2rem, 6vw, 5rem); line-height: .86; letter-spacing: -.03em; text-transform: uppercase; }
.event-stage__details { max-width: 35rem; margin: 1rem 0 0; color: #dbeafe; line-height: 1.5; }
.event-countdown { display: inline-grid; gap: .45rem; margin-top: 1.25rem; }
.event-countdown__label { color: #9ce8ff; font-size: .64rem; font-weight: 900; letter-spacing: .15em; text-transform: uppercase; }
.event-countdown__units { display: flex; gap: .45rem; }
.event-countdown__units > div { min-width: 3.85rem; padding: .48rem .55rem; border: 1px solid rgba(156, 232, 255, .32); border-radius: .7rem; background: rgba(3, 12, 38, .28); box-shadow: inset 0 1px rgba(255,255,255,.12); text-align: center; }
.event-countdown__units strong { display: block; color: #fff; font-family: "Arial Narrow", "Bahnschrift Condensed", Impact, sans-serif; font-size: 1.55rem; line-height: 1; letter-spacing: .03em; }
.event-countdown__units span { display: block; margin-top: .18rem; color: #c4b5fd; font-size: .57rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
.event-stage__organizer { display: flex; align-items: center; gap: .65rem; margin-top: 1.1rem; color: #dbeafe; font-size: .72rem; font-weight: 700; }
.event-stage__organizer img { width: 4.3rem; height: 2.3rem; object-fit: contain; }
.organizer-brand-settings__preview { width: 8rem; height: 4rem; object-fit: contain; border: 1px solid var(--input-border); border-radius: .65rem; background: rgba(11, 28, 67, .92); }
.event-stage__ticket { width: clamp(8.5rem, 20vw, 12rem); display: grid; place-items: center; gap: .35rem; padding: 1.1rem; border: 1px solid rgba(255,255,255,.42); border-radius: 1rem; background: linear-gradient(145deg, rgba(255,255,255,.22), rgba(255,255,255,.06)); box-shadow: inset 0 1px rgba(255,255,255,.35); transform: rotate(5deg); }
.event-stage__ticket span, .event-stage__ticket small { font-size: .63rem; font-weight: 900; letter-spacing: .16em; }
.event-stage__ticket strong { font-family: Georgia, serif; font-size: 3.5rem; line-height: .8; }
.ticket-choice { position: relative; margin-block: .7rem; padding: 1rem; border: 1px solid transparent; border-radius: 1rem; background: var(--rect-fill) padding-box, var(--rect-outline) border-box; box-shadow: 0 .8rem 1.8rem rgba(8, 29, 78, .08); transition: transform 180ms ease, box-shadow 180ms ease; }
.ticket-choice:hover, .ticket-choice:focus-within { transform: translateX(.35rem); box-shadow: 0 1.1rem 2.3rem rgba(34, 184, 245, .16); }
/* The ticket-stub tear line used to be a `right: 7.1rem` guess on an
   absolutely positioned ::after - it assumed a fixed quantity-column width
   that the actual grid track (sized "auto" around the number input's own
   min-width) rarely matched, so the line drifted into the input instead of
   sitting at the real column boundary. A border on the column that actually
   starts there tracks the boundary exactly, at any viewport or input width. */
.ticket-choice label { border-left: 1px dashed var(--input-border); padding-left: 1rem; }
.ticket-choice > * { position: relative; z-index: 1; }
@media (max-width: 760px) {
  .event-stage { grid-template-columns: 1fr; gap: 1.5rem; min-height: 19rem; }
  .event-stage__ticket { justify-self: end; }
  .ticket-choice { grid-template-columns: 1fr auto; gap: .6rem; }
  .ticket-choice .price { grid-column: auto; }
  .ticket-choice label { grid-column: 2; grid-row: 1 / span 2; align-self: center; }
}
@media (prefers-reduced-motion: reduce) {
  .ticket-choice { transition: none; }
  .ticket-choice:hover, .ticket-choice:focus-within { transform: none; }
}

/* ---------- seating-plan editor (P1-SEAT-02, Task 9) ---------- */
/* Three columns on desktop: tools, canvas, properties. Under 760px they
   stack into one column (tools -> canvas -> properties); nothing may ever
   need horizontal scrolling, so every track is minmax(0, …) and every
   control carries min-width: 0. */
.layout-header { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem 1rem; margin-bottom: 1rem; padding: 1rem; border: 1px solid var(--glass-border); border-radius: var(--radius-sm); background: var(--glass); }
.layout-header .title-block { flex: 1 1 16rem; min-width: 0; }
.layout-header .title-block h2 { margin: 0; overflow-wrap: break-word; }
.layout-header .title-block .muted { display: block; margin-top: 0.2rem; font-size: 0.82rem; }
.layout-editor { display: grid; grid-template-columns: minmax(0, 14rem) minmax(0, 1fr) minmax(0, 18rem); gap: 1rem; align-items: start; }
/* The canvas is the point of the page: below 1500px the properties move under
   it instead of squeezing it between two side columns (browser check, 26.09.2026). */
@media (max-width: 1500px) {
  .layout-editor { grid-template-columns: minmax(0, 12rem) minmax(0, 1fr); }
  .layout-properties { grid-column: 1 / -1; }
}
.layout-tools, .layout-properties { min-width: 0; padding: 1rem; border: 1px solid var(--glass-border); border-radius: var(--radius-sm); background: var(--glass); }
.layout-tools h3, .layout-properties h3, .layout-barrierfree summary { margin: 0; font-size: 0.82rem; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
.layout-tools .tool-block { margin-top: 0.6rem; }
.layout-tools .tool-block > button { width: 100%; justify-content: flex-start; }
.layout-tools form { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0.5rem; padding: 0.7rem; margin-top: 0.4rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); }
.layout-tools form .field { grid-column: 1; }
.layout-tools form input, .layout-tools form select { width: 100%; min-width: 0; }
.layout-canvas { min-width: 0; }
#layout-stage { position: relative; width: 100%; height: min(70vh, 720px); border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); overflow: hidden; }
.layout-stage-tools { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 0.6rem; align-items: center; }
.layout-stage-tools button { min-height: 2.3rem; padding: 0.3rem 0.75rem; }
.layout-barrierfree, .layout-findings { margin-top: 1rem; padding: 0.8rem 1rem; border: 1px solid var(--glass-border); border-radius: var(--radius-sm); background: var(--glass); }
.layout-barrierfree .barrierfree-list { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.6rem; }
.barrierfree-item { min-height: 2.2rem; padding: 0.3rem 0.7rem; border: 1px solid var(--surface-border); border-radius: var(--radius-btn); background: var(--surface); color: var(--ink); cursor: pointer; font: inherit; }
.barrierfree-item[aria-pressed="true"] { border-color: var(--accent); color: var(--accent); font-weight: 800; }
.layout-findings h3 { margin: 0 0 0.6rem; font-size: 0.82rem; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
.finding { width: 100%; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.5rem 1rem; align-items: baseline; padding: 0.55rem 0.6rem; margin-top: 0.4rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink); text-align: left; cursor: pointer; }
.finding strong { display: block; margin-bottom: 0.15rem; overflow-wrap: anywhere; }
.finding small { color: var(--muted); overflow-wrap: anywhere; }
.finding .pill { justify-self: end; }
.finding--error { border-left: 3px solid var(--danger); }
.finding--warning { border-left: 3px solid var(--soft); }
.layout-properties .prop-block { margin-top: 0.8rem; }
.layout-properties form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.6rem; }
.layout-properties form .field { grid-column: auto; }
.layout-properties form .field.full { grid-column: 1 / -1; }
.layout-properties form input, .layout-properties form select { width: 100%; min-width: 0; }
.layout-properties .multi-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.layout-properties .category-card { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--surface-border); }
/* Name and ticket type each get a whole line: side by side in the 15rem
   properties column both were squeezed to a few pixels ("Ka", 28.09.2026). */
.category-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "dot name remove" "ticket ticket ticket"; gap: 0.4rem 0.5rem; align-items: center; margin-top: 0.75rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--surface-border); }
.category-row .color-dot { grid-area: dot; }
.category-row .cat-name { grid-area: name; }
.category-row .cat-ticket { grid-area: ticket; font-size: 0.85rem; }
.category-row .cat-remove { grid-area: remove; }
.category-row .color-dot { width: 1.1rem; height: 1.1rem; border-radius: 50%; border: 1px solid var(--surface-border); }
.category-row select { width: 100%; min-width: 0; }
.category-row input { width: 100%; min-width: 0; }
.category-row button { min-height: 2.1rem; padding: 0.2rem 0.6rem; }
.layout-header .mode-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; }
.layout-header .toolbar-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.layout-header .toolbar-actions button { min-height: 2.5rem; padding: 0.4rem 0.85rem; }
@media (max-width: 760px) {
  .layout-editor { grid-template-columns: minmax(0, 1fr); }
  .layout-header { align-items: stretch; }
  .layout-header .title-block { flex-basis: 100%; }
}

/* Seat editor: the bar next to a selection (size while resizing, copy, rotate,
   delete) and the same actions in the properties panel (26.09.2026). The bar is
   positioned through the CSSOM from layout-editor.js, never an inline style. */
.layout-selection-bar { position: absolute; z-index: 5; display: flex; flex-wrap: wrap; align-items: center; gap: 0.3rem; max-width: calc(100% - 8px); padding: 0.3rem; border: 1px solid var(--glass-border); border-radius: var(--radius-sm); background: var(--menu-panel-bg); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25); }
.layout-selection-bar[hidden] { display: none; }
.layout-selection-bar button { min-height: 2rem; padding: 0.2rem 0.6rem; border: 1px solid var(--surface-border); border-radius: var(--radius-btn); background: var(--surface); color: var(--ink); font: inherit; font-size: 0.85rem; font-weight: 700; cursor: pointer; }
.layout-selection-bar button.danger { color: var(--danger, #e5484d); }
.layout-selection-size { padding: 0 0.4rem; font-size: 0.85rem; font-weight: 800; color: var(--ink); white-space: nowrap; }
.layout-selection-size[hidden] { display: none; }
.prop-actions { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.8rem; }

/* Planning workspace: keep the canvas and its context visible together. */
:root { --plan-surface: #fff; }
html[data-theme="dark"] { --plan-surface: #19263b; }
.layout-view-controls { display: flex; flex-wrap: wrap; align-items: center; gap: .55rem 1rem; margin-bottom: .75rem; }
.layout-view-controls label { display: inline-flex; align-items: center; gap: .4rem; font-size: .85rem; }
.layout-view-controls input[type="checkbox"] { width: 1.1rem; min-height: 1.1rem; height: 1.1rem; margin: 0; }
.layout-view-controls select { width: auto; min-height: 2rem; padding: .2rem .5rem; }
.layout-view-controls .button, .layout-stage-tools .button { min-height: 2.25rem; padding: .3rem .65rem; }
.layout-view-controls [aria-pressed="true"], .layout-stage-tools [aria-pressed="true"] { outline: 2px solid var(--accent); outline-offset: -2px; }
.layout-layer-menu { position: relative; font-size: .85rem; }
.layout-layer-menu summary { cursor: pointer; padding: .5rem; }
.layout-layer-menu > div { position: absolute; right: 0; z-index: 20; width: 15rem; padding: .75rem; background: var(--plan-surface); border: 1px solid var(--surface-border); border-radius: var(--radius-sm); box-shadow: var(--glass-shadow); display: grid; gap: .65rem; }
.layout-metrics { display: flex; flex-wrap: wrap; gap: .5rem 1.5rem; margin: .5rem 0 1rem; }
.layout-metrics .metric { display: flex; flex-direction: row; justify-content: flex-start; align-items: baseline; min-height: 0; gap: .5rem; padding: 0; border: 0; background: transparent; box-shadow: none; }
.layout-metrics .metric span { text-transform: none; letter-spacing: normal; }
.layout-metrics .metric strong { font-size: 1.15rem; }
.layout-editor { grid-template-columns: minmax(0, 10rem) minmax(0, 1fr) minmax(0, 16.5rem); gap: .7rem; }
.layout-properties { grid-column: auto; }
.layout-tools, .layout-properties { padding: .7rem; max-height: 78vh; overflow-y: auto; scrollbar-width: thin; }
.layout-tools h3, .layout-properties h3 { text-transform: none; letter-spacing: normal; }
.layout-header .title-block h2 { font-family: inherit; font-size: 1.4rem; font-weight: 700; line-height: 1.2; text-transform: none; letter-spacing: normal; }
.layout-header .eyebrow { margin: 0 0 .25rem; }
.layout-editor .button { min-height: 2.25rem; padding: .35rem .6rem; font-size: .85rem; font-weight: 600; }
.layout-editor label, .layout-view-controls label { text-transform: none; letter-spacing: normal; font-weight: 600; }
.layout-editor.hide-tools { grid-template-columns: minmax(0, 1fr) minmax(0, 16.5rem); }
.layout-editor.hide-props { grid-template-columns: minmax(0, 10rem) minmax(0, 1fr); }
.layout-editor.hide-tools.hide-props { grid-template-columns: minmax(0, 1fr); }
.layout-editor.hide-tools .layout-tools, .layout-editor.hide-props .layout-properties { display: none; }
#layout-stage { background: var(--plan-surface); border-radius: 4px; height: max(420px, 65vh); touch-action: none; }
#layout-stage:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.layout-stage-tools { margin: .4rem 0; }
#lp-placement { font-size: .78rem; color: var(--muted); flex: 1 1 12rem; }
.layout-scale { display: inline-flex; flex-direction: column; align-items: center; font-size: .8rem; margin: 0 .65rem; }
.layout-scale::before { content: ""; display: block; width: var(--scale-width, 60px); height: 5px; border: solid var(--ink); border-width: 0 1px 2px; }
.layout-focus:has(.layout-editor) > .site-header, .layout-focus:has(.layout-editor) > footer,
.layout-focus:has(.layout-editor) .admin-sidebar { display: none; }
.layout-focus:has(.layout-editor) #app { max-width: none; width: auto; padding: .75rem; margin: 0; }
.layout-focus:has(.layout-editor) .admin-layout { grid-template-columns: minmax(0, 1fr); }
.layout-focus:has(.layout-editor) #app > .admin-layout { margin: 0; }
.layout-focus:has(.layout-editor) .admin-main { margin: 0; padding: .5rem; }
.layout-focus:has(.layout-editor) .admin-layout > :not(.admin-main) { display: none; }
.layout-focus:has(.layout-editor) #layout-stage { height: max(420px, calc(100dvh - 250px)); }
@media (max-width: 1100px) {
  .layout-editor, .layout-editor.hide-tools { grid-template-columns: minmax(0, 1fr) minmax(0, 14rem); }
  .layout-tools { grid-column: 1 / -1; max-height: 13rem; }
  #layout-tools { display: flex; flex-wrap: wrap; gap: .4rem; align-items: flex-start; }
  .layout-tools .tool-block { margin: 0; flex: 0 1 auto; }
  .layout-tools .tool-block:has(form:not([hidden])) { flex-basis: 15rem; }
  .layout-editor.hide-props { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 760px) {
  .layout-editor, .layout-editor.hide-tools, .layout-editor.hide-props { grid-template-columns: minmax(0, 1fr); }
  .layout-properties { max-height: 22rem; }
  #layout-stage { height: 58vh; min-height: 340px; }
  .layout-focus:has(.layout-editor) #layout-stage { height: 58dvh; }
  .layout-layer-menu > div { right: auto; left: 0; }
}
.ticket-personalization { margin-block: 2rem; padding-block: 1.5rem; border-block: 1px solid var(--surface-border); }
.ticket-personalization .section-head { flex-wrap: wrap; gap: .75rem; }
.ticket-name-group { min-width: 0; margin: 1.25rem 0 0; padding: 1rem; border: 1px solid var(--surface-border); border-radius: 12px; }
.ticket-name-group legend { float: none; width: auto; padding-inline: .5rem; font-weight: 600; }
.ticket-name-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
.ticket-holder-name { margin: .4rem 0; overflow-wrap: anywhere; }
@media (max-width: 640px) { .ticket-name-grid { grid-template-columns: minmax(0, 1fr); } }

/* ---------- public seat picker (P1-SEAT-03) ---------- */
/* The buyer's seat selection on /event/{slug}. The SVG map scales to the card
   width (viewBox in mm, width:100%, height auto) so a phone never scrolls
   sideways; the list below it is the full keyboard/reader path. Colours come
   from the API, validated in JS and applied through the CSSOM / SVG
   presentation attributes - no inline style attributes (CSP script-src 'self'). */
.seat-picker { display: grid; gap: 1rem; min-width: 0; }
.seat-picker__bar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem 1rem; }
.seat-picker__status { flex: 1 1 12rem; min-width: 0; font-weight: 700; color: var(--ink); }
.seat-picker__countdown { font-variant-numeric: tabular-nums; font-weight: 900; font-size: 1.2rem; color: var(--accent); white-space: nowrap; }
.seat-picker__countdown[hidden] { display: none; }
.seat-picker__zoom { display: flex; gap: 0.4rem; }
.seat-picker__bar .button { min-height: 2.4rem; padding: 0.35rem 0.8rem; }
.seat-picker__map { width: 100%; overflow: hidden; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--plan-surface); }
.seat-picker__map svg { display: block; width: 100%; height: auto; touch-action: pan-y pinch-zoom; }
/* Panning by drag only while zoomed in; at "fit" the page must still scroll. */
.seat-picker__map--zoomed svg { touch-action: none; }
.seat-picker__legend { display: flex; flex-wrap: wrap; gap: 0.4rem 1rem; font-size: 0.8rem; color: var(--muted); }
.seat-picker__legend-item { display: inline-flex; align-items: center; gap: 0.4rem; }
.seat-picker__swatch { width: 0.95rem; height: 0.95rem; border: 1px solid var(--surface-border); border-radius: 3px; flex: 0 0 auto; }
.seat-picker__swatch--mine { position: relative; border: 1px solid var(--ink); background: var(--accent); }
.seat-picker__swatch--mine::after { content: "✓"; position: absolute; inset: 0; display: grid; place-items: center; font-size: 0.6rem; font-weight: 900; line-height: 1; color: #ffffff; }
.seat-picker__swatch--unavailable { background: var(--muted); opacity: 0.5; }
.seat-picker__swatch--ours { background: transparent; border: 3px solid var(--accent); }
.reservation-code-box { display: grid; gap: 0.35rem; margin: 0 0 1rem; }
.reservation-code-box .inline-controls { flex-wrap: wrap; }
.reservation-code-box input { min-width: 0; flex: 1 1 12rem; text-transform: uppercase; }
.res-list { display: grid; gap: 0.75rem; }
.res-item { display: grid; gap: 0.5rem; padding: 0.75rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); min-width: 0; }
.res-item small { display: block; overflow-wrap: anywhere; }
.res-code { display: grid; gap: 0.5rem; min-width: 0; }
.res-code code { overflow-wrap: anywhere; font-size: 1.05rem; }
.res-code .inline-controls { flex-wrap: wrap; }
.seat-picker__filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.6rem; }
.seat-picker__filters select { min-width: 0; max-width: 100%; }
.seat-picker__list details { margin-block: 0.4rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--glass); }
.seat-picker__list summary { cursor: pointer; padding: 0.6rem 0.8rem; font-weight: 700; color: var(--ink); }
.seat-picker__seat-list { display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.6rem; }
.seat-picker__seat-btn { min-width: 0; display: inline-flex; flex-direction: column; align-items: flex-start; gap: 0.2rem; padding: 0.5rem 0.7rem; border: 1px solid var(--surface-border); border-radius: var(--radius-btn); background: var(--surface); color: var(--ink); text-align: left; cursor: pointer; font: inherit; }
.seat-picker__seat-btn[aria-pressed="true"] { border: 2px solid var(--accent); }
.seat-picker__seat-btn:disabled { opacity: 1; border-style: dashed; color: var(--muted); cursor: not-allowed; }
.seat-picker__extend { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem; padding: .75rem 1rem; border: 2px solid var(--soft); border-radius: var(--radius-sm); }
.seat-picker__extend[hidden] { display: none; }
.hold-extension { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem 1rem; margin-block: 1rem; padding: .75rem 1rem; border: 2px solid var(--soft); border-radius: var(--radius-sm); }
.hold-extension[hidden] { display: none; }
.hold-extension:focus, .hold-extension p:focus, .seat-picker__extend p:focus { outline: 3px solid var(--focus-ring); outline-offset: 2px; }
.seat-picker__hold-note { margin: .25rem 0; }
@media (forced-colors: active) {
  .seat-picker__swatch { forced-color-adjust: none; border: 1px solid CanvasText; }
  .seat-picker__seat-btn[aria-pressed="true"] { border: 3px solid Highlight; }
  .seat-picker__seat-btn:disabled { border: 1px dashed GrayText; }
}
.seat-picker__seat-label { display: inline-flex; align-items: center; gap: 0.4rem; font-weight: 700; overflow-wrap: anywhere; }
.seat-picker__seat-label .seat-picker__swatch { width: 0.8rem; height: 0.8rem; }
.seat-picker__seat-meta { font-size: 0.78rem; color: var(--muted); overflow-wrap: anywhere; }
/* The whole picker sits inside the step-1 card, so a long unbreakable seat
   label must wrap rather than widen the page (mobile rule: no sideways scroll). */
.seat-picker__list, .seat-picker__seat-list, .seat-picker__legend { min-width: 0; }
/* Seated-checkout summary ("Ihre Auswahl") and the seat label on an order page. */
.seat-selection-summary { margin-block: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--surface-border); }
.seat-selection-summary:empty { display: none; }
.seat-summary-row { grid-template-columns: minmax(0, 2.2fr) minmax(0, 1fr) auto; }
.seat-summary-row > span:first-of-type { color: var(--ink); }
.ticket-seat-label { margin: 0.2rem 0 0.4rem; color: var(--muted); font-size: 0.85rem; overflow-wrap: anywhere; }
@media (max-width: 760px) { .seat-summary-row { grid-template-columns: minmax(0, 1fr); } }

/* ---------- payment choice with known brands (26.09.2026) ---------- */
/* Acceptance marks instead of "Stripe"; a fee method shows its rule and, once
   chosen, a box the buyer must tick (services/payment_fees.py). */
.payment-brands { display: flex; flex-wrap: wrap; gap: 0.3rem; margin-bottom: 0.45rem; }
.payment-brands svg { width: 2.6rem; height: auto; flex: 0 0 auto; }
.payment-fee-rule { color: var(--ink) !important; font-weight: 700 !important; }
.payment-unavailable { color: var(--danger, #b42318) !important; }
.payment-option--disabled { opacity: 0.6; cursor: not-allowed; }
.payment-fee { margin-top: 1rem; padding: 1rem; border: 2px solid var(--accent); border-radius: var(--radius-sm); background: var(--surface); }
.payment-fee p { margin: 0 0 0.6rem; overflow-wrap: break-word; }
/* A sentence the buyer agrees to reads as a sentence, not as a field label. */
.payment-fee .check-line { font-size: 0.95rem; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--ink); }
/* Order page: continue or discard an unpaid order, give up a bank transfer. */
.order-actions { border: 2px solid var(--accent); }
.order-actions .inline-controls { display: flex; flex-wrap: wrap; gap: 0.6rem; }
/* Event cancelled or postponed: the public banner and the admin forms. */
.event-change-banner { border: 2px solid var(--accent); margin: 1.25rem 0; }
.event-change-form { margin-top: 1rem; }
.event-change-form > summary { cursor: pointer; font-weight: 750; }

/* Event feedback (P1-FBK): the public rating page and the admin card. Every
   grid track is minmax(0, ...) and every item may shrink - no sideways scroll. */
.feedback-head { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; margin-bottom: 1rem; }
.feedback-head > div { min-width: 0; }
.feedback-logo { max-height: 56px; max-width: 140px; object-fit: contain; }
.stars { border: 0; padding: 0; margin: 0; min-width: 0; }
.stars legend { font-weight: 750; margin-bottom: 0.25rem; }
.star-row { display: flex; flex-wrap: wrap; gap: 0.15rem; }
.star-row input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.star-row label { font-size: 2.1rem; line-height: 1; min-width: 44px; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; color: var(--input-border); border-radius: var(--radius-btn); }
.star-row label.on { color: #f5b400; }
.star-row input:focus-visible + label { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.feedback-card h4 { margin: 1.25rem 0 0.5rem; }
.feedback-url { overflow-wrap: anywhere; }
.feedback-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr)); gap: 1rem; }
.feedback-source { min-width: 0; }
.feedback-average { font-size: 1.8rem; font-weight: 800; margin: 0.25rem 0; }
.feedback-bar { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 0.5rem; align-items: center; font-size: 0.9rem; }
.feedback-bar-track { height: 0.5rem; border-radius: 999px; background: var(--surface-border); overflow: hidden; }
.feedback-bar-track > span { display: block; height: 100%; background: var(--action); }
.feedback-categories { padding-left: 1.1rem; margin: 0.5rem 0 0; }
.feedback-comments { list-style: none; padding: 0; margin: 0; display: grid; gap: 0.75rem; }
.feedback-comment { min-width: 0; border-top: 1px solid var(--surface-border); padding-top: 0.5rem; }
.feedback-comment p { margin: 0.35rem 0 0; overflow-wrap: break-word; white-space: pre-line; }
/* The "Bewertungen" page: one collapsible row per rated event. */
.feedback-events { display: grid; gap: 0.5rem; }
.feedback-event { border-top: 1px solid var(--surface-border); padding-top: 0.5rem; min-width: 0; }
.feedback-event > summary { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0.25rem 1rem; cursor: pointer; }
.feedback-event-title, .feedback-event-figures { display: grid; min-width: 0; }
.feedback-event-figures { text-align: right; }
.feedback-event-detail { padding: 0.75rem 0; }
@media (max-width: 760px) { .feedback-event-figures { text-align: left; } }
.feedback-card .section-head { flex-wrap: wrap; gap: 0.75rem; }
.feedback-card .section-head > div { min-width: 0; }
.feedback-card .section-head .button { white-space: normal; max-width: 100%; }
/* Vouchers (P2-VCH): the checkout field and the admin list. */
.voucher-box { display: grid; gap: 0.35rem; margin-bottom: 1rem; min-width: 0; }
.voucher-box .inline-controls { flex-wrap: wrap; }
.voucher-box input { min-width: 0; flex: 1 1 10rem; text-transform: uppercase; }
.voucher-list { display: grid; gap: 0.5rem; }
.voucher-row { border-top: 1px solid var(--surface-border); padding-top: 0.5rem; min-width: 0; }
.voucher-row > summary { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0.25rem 1rem; cursor: pointer; }
.voucher-row-title, .voucher-row-figures { display: grid; min-width: 0; }
.voucher-row-figures { justify-items: end; text-align: right; }
.voucher-row-detail { padding: 0.75rem 0; }
/* P2-WL: a sold-out row offers the waitlist instead of a quantity; the offer
   banner names what is held for the invitee. Both wrap on a phone. */
.sold-out-cell { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 0.4rem; min-width: 0; }
.waitlist-offer-banner { border: 1px solid var(--accent); border-radius: 12px; padding: 0.75rem 1rem; margin-bottom: 1rem; overflow-wrap: break-word; }
.waitlist-card { margin-top: 1rem; }
/* P2-TRF: the handover controls under a ticket line; they wrap on a phone. */
.transfer-box { margin-top: 0.5rem; min-width: 0; }
.transfer-box > summary { cursor: pointer; color: var(--accent); }
.transfer-open { margin: 0.5rem 0 0; overflow-wrap: break-word; }
.ticket-line > div { min-width: 0; }
/* P2-SER: series admin cards and the public series page; all wrap on a phone. */
.series-row > summary { display: flex; flex-wrap: wrap; align-items: center; gap: 0.35rem 1rem; cursor: pointer; }
.series-title { display: grid; min-width: 0; overflow-wrap: anywhere; }
.series-date-list { display: grid; gap: 0.5rem; }
.series-link { margin-top: -0.5rem; }
.series-events { display: grid; gap: 0.75rem; }
.series-event { display: grid; gap: 0.25rem; text-decoration: none; color: inherit; min-width: 0; overflow-wrap: break-word; }
.voucher-card .section-head { flex-wrap: wrap; gap: 0.75rem; }
@media (max-width: 760px) { .voucher-row-figures { justify-items: start; text-align: left; } }

/* P1-SEAT-06: the organizer's seat chooser (seat-admin.js) on "Platzvergabe"
   and in the Freikarten form of a seated event. Map above a grouped list; on a
   phone the list is the way to pick (large targets), the map only orients. */
.seat-admin { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0.8rem; min-width: 0; }
.seat-admin__map { width: 100%; max-height: 60vh; background: var(--plan-surface, var(--surface)); border: 1px solid var(--surface-border); border-radius: var(--radius-sm); }
.seat-admin__room { fill: none; stroke: var(--surface-border); stroke-width: 40; }
/* --rect-fill is a gradient, which SVG cannot paint - a plain tint instead. */
.seat-admin__table rect, .seat-admin__table circle { fill: rgba(140, 150, 175, 0.28); stroke: var(--muted); stroke-width: 20; }
.seat-admin__seat { cursor: pointer; }
.seat-admin__seat rect { fill: var(--seat-color); stroke: var(--ink); stroke-width: 12; }
.seat-admin__seat[data-state="RESERVED"] rect { stroke: #d4a017; stroke-width: 70; }
.seat-admin__seat[data-state="ASSIGNED"] rect { fill: #2f9e5b; }
.seat-admin__seat[data-state="HELD"] rect { fill: #8894a8; opacity: 0.55; }
.seat-admin__seat[data-state="BLOCKED"] rect { fill: #8894a8; opacity: 0.3; cursor: not-allowed; }
.seat-admin__seat[data-selected="true"] rect { stroke: var(--accent); stroke-width: 90; }
.seat-admin__legend { display: flex; flex-wrap: wrap; gap: 0.4rem 1rem; margin: 0; padding: 0; list-style: none; font-size: 0.85rem; }
.seat-admin__legend li { display: inline-flex; align-items: center; gap: 0.35rem; }
.seat-admin__swatch { width: 0.9rem; height: 0.9rem; border-radius: 0.2rem; border: 1px solid var(--ink); background: var(--surface); }
.seat-admin__swatch[data-state="RESERVED"] { border: 3px solid #d4a017; }
.seat-admin__swatch[data-state="ASSIGNED"] { background: #2f9e5b; }
.seat-admin__swatch[data-state="HELD"] { background: #8894a8; opacity: 0.55; }
.seat-admin__swatch[data-state="BLOCKED"] { background: #8894a8; opacity: 0.3; }
.seat-admin__list { display: grid; gap: 0.5rem; min-width: 0; }
.seat-admin__group summary { cursor: pointer; font-weight: 700; }
.seat-admin__buttons { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.4rem; }
.seat-admin__seat-btn { min-width: 0; min-height: 44px; display: inline-flex; flex-direction: column; align-items: flex-start; gap: 0.1rem; padding: 0.4rem 0.6rem; border: 1px solid var(--surface-border); border-radius: var(--radius-btn); background: var(--surface); color: var(--ink); text-align: left; cursor: pointer; font: inherit; font-size: 0.85rem; overflow-wrap: anywhere; }
.seat-admin__seat-btn em { font-style: normal; font-size: 0.72rem; color: var(--muted); }
.seat-admin__seat-btn small { font-size: 0.72rem; }
.seat-admin__seat-btn[data-state="RESERVED"] { border: 2px solid #d4a017; }
.seat-admin__seat-btn[data-state="ASSIGNED"] { border-left: 6px solid #2f9e5b; }
.seat-admin__seat-btn[aria-pressed="true"] { outline: 3px solid var(--accent); outline-offset: 1px; }
.seat-admin__seat-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.unseated-order { min-width: 0; margin: 0 0 0.6rem; padding: 0.5rem 0.8rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); }
/* The global legend floats (width 100%); beside a float a flex label shrinks
   to nothing - the first ticket of each order measured 0 px wide. */
.unseated-order legend { float: none; width: auto; padding: 0 0.3rem; }
.unseated-order label { text-transform: none; letter-spacing: normal; font-size: 0.9rem; font-weight: 500; color: var(--ink); }
.sa-actions { flex-wrap: wrap; }
.comp-seat-line { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: 0.5rem; align-items: center; margin: 0.25rem 0; }
@media (max-width: 760px) {
  .seat-admin__map { max-height: 40vh; }
  .comp-seat-line { grid-template-columns: minmax(0, 1fr); }
}

/* Seat overview: a fill bar under every table row (28.09.2026). The area row
   drops its border so row and bar read as one entry. */
.seat-overview tr.seat-area-row td { border-bottom: 0; padding-bottom: 0.35rem; }
.seat-overview tr.seat-fill-row td { padding-top: 0; white-space: normal; }
/* The category list is the one open-ended cell; it wraps instead of widening the table. */
.seat-overview tr.seat-area-row td:last-child { white-space: normal; min-width: 9rem; }
.seat-fill { display: flex; align-items: center; gap: 0.75rem; min-width: 0; }
.seat-fill__track { flex: 1 1 auto; min-width: 0; height: 0.6rem; border-radius: 999px; background: var(--surface-border); overflow: hidden; }
.seat-fill__count { flex: none; font-size: 0.78rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.seat-fill__legend { display: flex; flex-wrap: wrap; gap: 0.35rem 1rem; margin: 0 0 0.6rem; font-size: 0.78rem; color: var(--muted); }
.seat-fill__legend span { display: inline-flex; align-items: center; gap: 0.35rem; }
.seat-fill__swatch { display: inline-block; width: 0.75rem; height: 0.75rem; border-radius: 3px; background: var(--surface-border); }
.seat-fill__part[data-state="sold"] { fill: #22c55e; } .seat-fill__swatch[data-state="sold"] { background: #22c55e; }
.seat-fill__part[data-state="reserved"] { fill: #f97316; } .seat-fill__swatch[data-state="reserved"] { background: #f97316; }
.seat-fill__part[data-state="held"] { fill: #38bdf8; } .seat-fill__swatch[data-state="held"] { background: #38bdf8; }
.seat-fill__part[data-state="set_aside"] { fill: #d4a017; } .seat-fill__swatch[data-state="set_aside"] { background: #d4a017; }
.seat-fill__part[data-state="blocked"] { fill: #6b7280; } .seat-fill__swatch[data-state="blocked"] { background: #6b7280; }
@media (max-width: 760px) {
  .seat-overview .table-wrap tr.seat-area-row { border-bottom: 0; padding-bottom: 0; }
  .seat-overview .table-wrap tr.seat-fill-row { padding-top: 0.25rem; }
}

/* Admin menu (28.09.2026): one <details> in four groups. On a wide screen it
   is always open and its summary hidden; on a phone it is a closed
   "Admin-Menü · <Seite>" line that opens into a full-width list. */
.side-nav .nav-menu > summary { display: none; }
.side-nav .nav-group { padding: 0.5rem 0 0.75rem; border-bottom: 1px solid var(--surface-border); }
.side-nav .nav-group:last-of-type { border-bottom: 0; }
.side-nav .nav-heading { margin: 0.35rem 0 0.35rem 0.6rem; color: var(--muted); font-size: 0.7rem; font-weight: 850; letter-spacing: 0.08em; text-transform: uppercase; }
.side-nav a, .side-nav button:not(.button) { padding: 0.5rem 0.6rem; }
.side-nav .nav-event { display: grid; gap: 0.25rem; margin: 0 0 0.5rem 0.6rem; }
.side-nav .nav-event-title { overflow-wrap: anywhere; line-height: 1.3; }
.side-nav .nav-event small { font-size: 0.78rem; }
.side-nav #event-select { min-height: 2.4rem; margin-top: 0.3rem; padding: 0.35rem 0.6rem; font-size: 0.85rem; }
.side-nav .nav-actions { display: flex; flex-wrap: wrap; gap: 0.4rem; margin: 0.5rem 0 0 0.6rem; }
.side-nav .nav-actions .button { width: auto; min-height: 2.2rem; padding: 0.3rem 0.7rem; font-size: 0.82rem; text-align: center; border-left: 1px solid; border-radius: var(--radius-btn); }
.side-nav .nav-logout { margin-top: 0.5rem; }
@media (max-width: 760px) {
  .side-nav { margin: 0.75rem; padding: 0; }
  .side-nav .nav-menu { border: 1px solid var(--input-border); border-radius: var(--radius-btn); background: var(--surface); }
  .side-nav .nav-menu > summary { display: flex; align-items: center; gap: 0.5rem; min-height: 3rem; padding: 0.6rem 0.9rem; font-weight: 800; cursor: pointer; list-style: none; }
  .side-nav .nav-menu > summary::after { content: "▾"; margin-left: auto; color: var(--muted); }
  .side-nav .nav-menu[open] > summary::after { content: "▴"; }
  .side-nav .nav-menu > summary::-webkit-details-marker { display: none; }
  .side-nav .nav-menu[open] > summary { border-bottom: 1px solid var(--surface-border); }
  .side-nav .nav-menu[open] { padding-bottom: 0.5rem; }
  .side-nav .nav-group { padding: 0.5rem 0.75rem 0.75rem; }
  .side-nav a, .side-nav button:not(.button) { padding: 0.7rem 0.6rem; }
  .side-nav .nav-logout { margin: 0.25rem 0.75rem 0; width: calc(100% - 1.5rem); }
}

/* Admin tables wrap instead of running past their card (28.09.2026): with the
   grouped menu beside them, "Ticketarten" was 198px wider than its box. A
   control and its button may wrap onto two lines; a figure never breaks. */
@media (min-width: 761px) {
  .admin-main .table-wrap th, .admin-main .table-wrap td { white-space: normal; }
  .admin-main .table-wrap .cell-edit { flex-wrap: wrap; }
  .admin-main .table-wrap .cell-edit input { width: 7rem; min-width: 0; }
  .admin-main .table-wrap .inline-controls { flex-wrap: wrap; }
  .seat-overview .table-wrap td:first-child { white-space: nowrap; }
}

/* GiroCode on the order page (bank transfer). White quiet zone in both
   themes - a dark background around the code stops bank apps reading it. */
.girocode { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; margin: 1rem 0; }
.girocode img { background: #fff; padding: 10px; border-radius: 12px; width: 180px; height: 180px; flex-shrink: 0; }
.girocode figcaption { flex: 1 1 14rem; min-width: 0; }

/* ---------- Planung (P2-PLN) ---------- */
/* A pasted meeting summary is plain text: line breaks kept, nothing rendered.
   An unbroken line must wrap instead of widening the card (no sideways scroll). */
.planning-text { margin: 0.5rem 0; white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; }
/* Titles and names wrap in the planning lists; the table default is nowrap. */
.planning-table td { white-space: normal; overflow-wrap: anywhere; }
.planning-detail > td { background: var(--glass); }
.planning-comments { display: grid; gap: 0.6rem; margin-top: 1rem; }
.planning-comment { padding: 0.6rem 0.8rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); overflow-wrap: anywhere; }
.planning-step .planning-step-title { margin: 0.4rem 0; font-size: 1.35rem; overflow-wrap: anywhere; }
.planning-actions { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 1rem; }
/* The text side of a planning card head: a flex item must be allowed to shrink
   below its longest word, or a long meeting title widens the page. */
.planning-head { min-width: 0; overflow-wrap: anywhere; }
/* Planning copy, step 3 (P2-PLN C): a plain list that wraps long titles. */
.planning-copy-list { margin: 0.4rem 0 1rem; padding-left: 1.2rem; display: grid; gap: 0.5rem; overflow-wrap: anywhere; }
.toast-action { margin-left: 0.75rem; padding: 0.25rem 0.7rem; }
.toast-close { margin-left: 0.75rem; }
.toast:not([hidden]) { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
/* Readable audit (/admin/audit, P2-AUD): day headings, one entry per action, wrapping text. */
.audit-filter { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr)); gap: 0.75rem; align-items: end; }
.audit-list { display: grid; gap: 0.6rem; }
.audit-day { margin: 1rem 0 0.2rem; font-size: 1rem; }
.audit-entry { padding: 0.7rem 0.9rem; border: 1px solid var(--surface-border); border-radius: var(--radius-sm); background: var(--surface); min-width: 0; overflow-wrap: anywhere; }
.audit-head { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; }
.audit-head time { font-variant-numeric: tabular-nums; color: var(--muted); }
.audit-sentence { margin: 0.35rem 0 0; }
.audit-details summary { cursor: pointer; color: var(--muted); margin-top: 0.3rem; }
.audit-details ul { margin: 0.4rem 0; padding-left: 1.2rem; }

/* Door sale (P2-DOOR, /admin/veranstaltung/{id}/abendkasse): big tap targets, no sideways scroll. */
.door-types { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 10rem), 1fr)); gap: 0.6rem; }
.door-type { display: grid; gap: 0.2rem; min-width: 0; padding: 0.9rem; border-radius: var(--radius-sm); border: 1px solid var(--glass-border); background: var(--surface); color: var(--ink); text-align: left; font: inherit; cursor: pointer; overflow-wrap: break-word; }
.door-type.active { outline: 2px solid var(--accent); outline-offset: 1px; }
.door-type:disabled { opacity: 0.45; cursor: not-allowed; }
.door-qty { display: flex; align-items: center; gap: 0.6rem; }
.door-qty output { min-width: 2ch; text-align: center; font-size: 1.4rem; font-weight: 700; }
.door-kind { display: flex; flex-wrap: wrap; gap: 1rem; border: 0; padding: 0; }
.door-submit { width: 100%; min-height: 3.2rem; font-size: 1.1rem; }
.door-value { display: grid; gap: 0.2rem; margin: 1rem 0 0.4rem; }
.door-value strong { font-size: clamp(1.6rem, 6vw, 2.4rem); }
.door-last { display: grid; gap: 0.6rem; margin-top: 1rem; padding: 0.9rem; border-radius: var(--radius-sm); background: var(--glass-strong); }
.door-sale summary { cursor: pointer; overflow-wrap: break-word; }
.door-ticket { grid-template-columns: minmax(0, 1fr); }
.door-void-form { display: flex; flex-wrap: wrap; gap: 0.5rem; min-width: 0; }
.door-void-form select, .door-void-form input { min-width: 0; flex: 1 1 10rem; }

/* P2-COMP: /freikarten cards and the admin block list - stacked, no sideways scroll. */
.comp-cards { list-style: none; padding: 0; margin: 1rem 0 0; display: grid; gap: 0.75rem; }
.comp-card { display: grid; gap: 0.5rem; min-width: 0; padding: 0.85rem; border: 1px solid var(--glass-border); border-radius: 0.9rem; }
.comp-card-head { overflow-wrap: break-word; }
.comp-blocks { display: grid; gap: 0.5rem; margin-bottom: 1rem; }
.comp-block .ledger-row { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
@media (max-width: 760px) { .comp-block .ledger-row { grid-template-columns: minmax(0, 1fr); } }

/* P2-CTR: contract pages. The signing page is for non-technical board members: big type, one step at a time. */
.contract-banner { display: flex; flex-wrap: wrap; gap: 0.4rem 1rem; align-items: center; padding: 0.7rem 1rem; margin: 0 0 0.75rem; border-radius: var(--radius-sm); border: 1px solid var(--glass-border); background: var(--glass-strong); overflow-wrap: break-word; }
.contract-banner span { flex: 1 1 18rem; min-width: 0; }
.contract-people { list-style: none; padding: 0; margin: 0.5rem 0; display: grid; gap: 0.5rem; }
.contract-people li { display: flex; flex-wrap: wrap; gap: 0.4rem 0.75rem; align-items: center; min-width: 0; overflow-wrap: break-word; }
.contract-people li > span { flex: 1 1 14rem; min-width: 0; }
.contract-fields, .contract-fields fieldset { min-width: 0; }
.contract-signatory { min-width: 0; }
/* M02: the address OneMillion confirmed is shown, not edited - make that visible. */
.contract-signatory input[readonly] { border-style: dashed; background: transparent; cursor: default; }
.contract-sign { font-size: 1.1rem; max-width: 46rem; display: grid; gap: 1rem; grid-template-columns: minmax(0, 1fr); }
.contract-sign h1 { max-width: none; font-size: clamp(1.7rem, 6vw, 2.5rem); overflow-wrap: break-word; hyphens: auto; }
.contract-sign h2 { font-size: 1.35rem; }
.contract-sign .card { min-width: 0; }
.contract-big { width: 100%; min-height: 3.4rem; font-size: 1.15rem; margin-top: 0.5rem; }
.contract-code { width: 100%; min-width: 0; font-size: 2rem; letter-spacing: 0.35em; text-align: center; padding: 0.6rem; font-variant-numeric: tabular-nums; }
.contract-summary ul { margin: 0.5rem 0 0; padding-left: 1.2rem; display: grid; gap: 0.5rem; }
.contract-result.good { outline: 2px solid var(--accent); }
.contract-doc-box { margin: 0.6rem 0; border: 1px solid var(--glass-border); border-radius: var(--radius-sm); padding: 0.4rem 0.8rem; min-width: 0; }
.contract-doc-box > summary { cursor: pointer; font-weight: 700; padding: 0.5rem 0; overflow-wrap: break-word; }
.contract-doc { overflow-wrap: break-word; font-size: 1rem; line-height: 1.5; min-width: 0; }
.contract-doc h3, .contract-doc h4, .contract-doc h5 { max-width: none; margin: 1.1rem 0 0.3rem; }
.contract-doc p { margin: 0.4rem 0; }
.contract-item { padding-left: 0.5rem; }
.contract-table { overflow-wrap: break-word; }
.contract-table table, .contract-table tbody, .contract-table tr, .contract-table td, .contract-table th { display: block; white-space: normal; border: 0; padding: 0; }
.contract-table thead { display: none; }
.contract-table tr { padding: 0.35rem 0; border-bottom: 1px solid var(--glass-border); }
.contract-table td:first-child { font-weight: 700; }
.contract-table td[data-label]::before { content: attr(data-label) ": "; font-weight: 400; color: var(--muted); }
@media (min-width: 761px) {
  .contract-table table { display: table; width: 100%; border-collapse: collapse; }
  .contract-table thead { display: table-header-group; }
  .contract-table tbody { display: table-row-group; }
  .contract-table tr { display: table-row; }
  .contract-table td[data-label]::before { content: none; }
  .contract-table td, .contract-table th { display: table-cell; padding: 0.35rem 0.5rem; border-bottom: 1px solid var(--glass-border); text-align: left; vertical-align: top; }
}

/* M08 part B: second factor - setup, recovery codes, login step (/admin, /admin/sicherheit). */
.mfa-steps { padding-left: 1.2rem; }
.mfa-qr-row { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 1rem; align-items: center; margin: 1rem 0; }
/* White plate in both themes: a QR code needs a light quiet zone to scan. */
.mfa-qr { display: block; width: 220px; height: 220px; max-width: 100%; image-rendering: pixelated; background: #fff; border-radius: var(--radius-sm); padding: 0.4rem; }
.mfa-key { min-width: 0; }
.mfa-key code { display: inline-block; font-size: 1.05rem; letter-spacing: 0.04em; overflow-wrap: anywhere; user-select: all; margin: 0.3rem 0.4rem 0.3rem 0; }
.mfa-code { font-size: 1.4rem; letter-spacing: 0.2em; max-width: 14rem; }
.mfa-recovery-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.35rem 1.5rem; padding-left: 1.8rem; }
.mfa-recovery-list code { font-size: 1.05rem; letter-spacing: 0.05em; user-select: all; overflow-wrap: anywhere; }
@media (max-width: 760px) {
  .mfa-qr-row { grid-template-columns: minmax(0, 1fr); justify-items: start; }
  .mfa-recovery-list { grid-template-columns: minmax(0, 1fr); }
}
/* Printing the recovery codes prints nothing else of the page. */
@media print {
  body.print-recovery-codes .site-header,
  body.print-recovery-codes footer,
  body.print-recovery-codes .toast,
  body.print-recovery-codes .no-print,
  body.print-recovery-codes .side-nav,
  body.print-recovery-codes .identity-bar,
  body.print-recovery-codes .mfa-banner,
  body.print-recovery-codes .admin-main > :not(#mfa-status),
  body.print-recovery-codes #mfa-status > :not(#mfa-codes-box):not(#mfa-enrol) { display: none !important; }
}

/* ---------- Public landing page (P2-LND, 06.10.2026) ----------
   Everything below is scoped to .landing or to the landing links of the shared
   header, so the shop, the admin and the check-in screens keep their look. It
   reads colours only through the Clean Frost tokens, so the stored light/dark
   choice applies here too. The global h1-h3 rule is a condensed uppercase
   poster face; the landing sets its own, calmer heading style inside .landing. */
.site-nav .site-nav__cta { min-height: 2.6rem; padding: .55rem 1rem; border: 1px solid var(--action-fill); border-image: none; color: var(--on-fill); font-size: .9rem; letter-spacing: 0; text-transform: none; }
.site-nav .site-nav__cta:hover, .site-nav .site-nav__cta:focus-visible { border-image: none; }
.site-nav .site-nav__guest { color: var(--muted); }
.site-nav a:focus-visible { outline: 3px solid var(--accent); outline-offset: 4px; }
/* Signed-in screens keep the header for the theme switch and the working links;
   the marketing links and the contact button stay on the public pages. */
.site-header[data-area="work"] [data-public-nav] { display: none; }
/* Between the mobile menu and a wide desktop the bar has no room for every
   link; the two in-page anchors go first (both sections stay reachable from
   the page itself), so a signed-in header with Admin and Einlass still fits. */
@media (min-width: 761px) and (max-width: 1180px) {
  .site-nav .site-nav__anchor { display: none; }
}
@media (max-width: 760px) {
  /* With a session the open menu holds up to six entries; on a phone in
     landscape that is taller than the screen, and the sticky header cannot be
     scrolled away - so the panel itself scrolls (vertically only). */
  .site-nav { max-height: calc(100dvh - 6rem); overflow-y: auto; overscroll-behavior: contain; }
  .site-nav .site-nav__cta { width: 100%; }
  .site-nav .site-nav__guest { padding-top: .7rem; border-top: 1px solid var(--glass-border); }
}

.landing { --landing-link: var(--action-dark); --landing-ok: #166534; color: var(--ink); background: var(--bg-solid); }
/* The opaque page colour above is deliberate: the decorative glow dots of
   body::before (z-index -1) would otherwise shine through the translucent
   demo and strip surfaces and drop text contrast below AA in places. */
/* The shared dark --action (#3b82f6) reaches about 3.1:1 as text and 3.7:1
   under white text; the landing uses its own darker fill and lighter text in
   dark mode (>= 4.5:1) without touching the tokens the other screens read. */
html[data-theme="dark"] .landing { --landing-link: #93c5fd; --landing-ok: #86efac; }
.landing .landing-cta:not(.landing-cta--inverse),
.site-nav .site-nav__cta { border-color: var(--action-dark); background: var(--action-dark); }
.landing .landing-cta:not(.landing-cta--inverse):hover,
.landing .landing-cta:not(.landing-cta--inverse):focus-visible,
.site-nav .site-nav__cta:hover,
.site-nav .site-nav__cta:focus-visible { border-color: #183fae; background: #183fae; }
html[data-theme="dark"] .landing .landing-cta:not(.landing-cta--inverse),
html[data-theme="dark"] .site-nav .site-nav__cta { border-color: #2563eb; background: #2563eb; }
html[data-theme="dark"] .landing .landing-cta:not(.landing-cta--inverse):hover,
html[data-theme="dark"] .landing .landing-cta:not(.landing-cta--inverse):focus-visible,
html[data-theme="dark"] .site-nav .site-nav__cta:hover,
html[data-theme="dark"] .site-nav .site-nav__cta:focus-visible { border-color: #1d4ed8; background: #1d4ed8; }
.landing-wrap { width: min(100% - 2rem, 72rem); margin-inline: auto; }
.landing h1, .landing h2, .landing h3 { font-family: Bahnschrift, "Segoe UI", Inter, ui-sans-serif, system-ui, sans-serif; text-transform: none; font-weight: 700; line-height: 1.1; letter-spacing: -.02em; overflow-wrap: break-word; hyphens: auto; }
.landing h1 { max-width: 13ch; font-size: clamp(2.5rem, 5.4vw, 4.1rem); letter-spacing: -.035em; line-height: 1.03; }
.landing h2 { max-width: 22ch; font-size: clamp(1.75rem, 3.3vw, 2.6rem); }
.landing h3 { font-size: 1.3rem; }
.landing :where(p) { margin: 0; line-height: 1.6; }
.landing a:focus-visible, .landing button:focus-visible, .landing summary:focus-visible, .landing [role="tabpanel"]:focus-visible { outline: 3px solid var(--accent); outline-offset: 4px; }
.landing-cta { font-size: 1rem; }

.landing-hero { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: clamp(2rem, 5vw, 4rem); align-items: center; padding-block: clamp(2.25rem, 6vw, 4.5rem); }
.landing-kicker { display: flex; align-items: center; gap: .6rem; margin-bottom: 1.25rem; color: var(--muted); font-size: .9rem; font-weight: 700; }
.landing-kicker::before { content: ""; width: .55rem; height: .55rem; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
.landing-lead { max-width: 46ch; margin-top: 1.4rem; color: var(--muted); font-size: clamp(1.02rem, 1.6vw, 1.12rem); }
.landing-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 1.4rem; margin-top: 1.75rem; }
/* M10 (F18): targets of at least 24 x 24 px (WCAG 2.2 2.5.8). The SVG seats stay
   small - the seat list is the equivalent control. */
summary { min-height: 1.5rem; }
.landing-textlink { display: inline-block; padding-block: .25rem; font-weight: 700; text-decoration: underline; text-decoration-color: var(--input-border); text-underline-offset: .35em; }
.landing-textlink:hover { text-decoration-color: var(--action); }
.landing-contact-note { margin-top: .55rem; color: var(--muted); font-size: .8rem; }
.landing-audience-line { margin-top: 1.4rem; color: var(--muted); font-size: .88rem; }
.landing-guest { margin-top: .6rem; font-size: .88rem; }
.landing-guest a { font-weight: 700; color: var(--landing-link); }

.landing-demo { position: relative; margin: 0; padding: 1.25rem; border-radius: 1.75rem 1.75rem 4rem 1.75rem; background: var(--glass-strong); border: 1px solid var(--glass-border); }
.landing-demo__tag { margin: 0 0 .75rem .25rem; color: var(--muted); font-size: .78rem; }
.landing-demo__card { overflow: hidden; border: 1px solid var(--surface-border); border-radius: 14px; background: var(--surface); box-shadow: var(--glass-shadow); }
.landing-demo__top { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: 1.1rem 1.25rem; background: #172c4d; color: #fff; }
.landing-demo__event { display: flex; align-items: center; gap: .75rem; min-width: 0; }
.landing-demo__icon { display: grid; place-items: center; width: 2.4rem; height: 2.7rem; border: 1px solid #7389aa; border-radius: 7px; flex-shrink: 0; }
.landing-demo__icon svg { width: 1.4rem; fill: none; stroke: currentColor; stroke-width: 1.6; }
.landing-demo__event > div { min-width: 0; }
.landing-demo__title { font-weight: 700; font-size: 1.15rem; line-height: 1.25; overflow-wrap: break-word; hyphens: auto; }
.landing-demo__subtitle { color: #c2d2eb; font-size: .78rem; }
.landing-demo__badge { flex-shrink: 0; border: 1px solid #627798; border-radius: 4px; padding: .15rem .45rem; color: #dae4f5; font-size: .72rem; }
.landing-tabs { display: flex; gap: .3rem; padding: 0 .9rem; border-bottom: 1px solid var(--surface-border); }
.landing-tab { flex: 1; min-height: 2.9rem; padding: .7rem .2rem .55rem; border: 0; border-bottom: 3px solid transparent; background: transparent; color: var(--muted); font-size: .85rem; font-weight: 700; cursor: pointer; }
.landing-tab[aria-selected="true"] { color: var(--landing-link); border-bottom-color: var(--landing-link); }
.landing-panel { min-height: 14rem; padding: 1.4rem 1.5rem; }
.landing-metric__label { color: var(--muted); font-size: .82rem; }
.landing-metric { display: flex; flex-wrap: wrap; align-items: baseline; gap: .45rem; margin: .25rem 0 .75rem; }
.landing-metric strong { font-size: 2.6rem; line-height: 1.1; letter-spacing: -.03em; }
.landing-metric span { color: var(--muted); font-size: .88rem; }
.landing-progress { height: .5rem; border-radius: 999px; background: var(--input-border); overflow: hidden; }
.landing-progress span { display: block; width: 77.5%; height: 100%; border-radius: inherit; background: var(--action); }
.landing-demo__ledger { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .75rem; margin-top: 1.1rem; padding-top: .9rem; border-top: 1px solid var(--surface-border); font-size: .82rem; }
.landing-panel small { display: block; color: var(--muted); font-size: .76rem; }
.landing-demo__row { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: .75rem 0; border-bottom: 1px solid var(--surface-border); font-size: .85rem; }
.landing-demo__row:last-child { border-bottom: 0; }
.landing-pill { flex-shrink: 0; border-radius: 4px; padding: .15rem .45rem; background: rgba(22, 163, 74, .12); color: var(--landing-ok); font-size: .72rem; font-weight: 700; }
.landing-check { display: flex; align-items: center; gap: .75rem; margin-bottom: .9rem; padding: .85rem; border-radius: 8px; background: rgba(22, 163, 74, .12); color: var(--landing-ok); }
.landing-check small { color: inherit; }
.landing-check__icon { display: grid; place-items: center; width: 1.9rem; height: 1.9rem; border: 1px solid currentColor; border-radius: 50%; flex-shrink: 0; }
.landing-check strong { display: block; }
.landing-demo__note { color: var(--muted); font-size: .78rem; }
.landing-demo__foot { display: flex; justify-content: space-between; gap: .75rem; padding: .8rem 1.5rem; border-top: 1px dashed var(--input-border); color: var(--muted); font-size: .72rem; }
.landing-demo__hint { margin-top: .8rem; color: var(--muted); font-size: .78rem; text-align: center; }

.landing-strip { border-block: 1px solid var(--glass-border); background: var(--glass); }
.landing-strip__list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.5rem; margin-block: 0; padding-block: 1.25rem; padding-inline: 0; list-style: none; }
.landing-strip__list li { display: flex; align-items: center; gap: .75rem; font-size: .92rem; }
.landing-strip__list svg { width: 1.45rem; height: 1.45rem; flex-shrink: 0; fill: none; stroke: var(--action); stroke-width: 1.7; }

.landing-section { padding-block: clamp(3rem, 7vw, 5rem); }
.landing-intro { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: clamp(1.25rem, 5vw, 4.5rem); align-items: end; margin-bottom: 2.5rem; }
.landing-intro p { color: var(--muted); }
.landing-benefits { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(1.5rem, 3vw, 2.3rem); }
.landing-benefit { padding-top: 1.35rem; border-top: 3px solid var(--action); }
.landing-benefit:nth-child(2) { border-top-color: var(--accent); }
.landing-benefit:nth-child(3) { border-top-color: var(--neutral); }
.landing-benefit svg { width: 1.8rem; height: 1.8rem; fill: none; stroke: var(--ink); stroke-width: 1.55; }
.landing-benefit h3 { margin: 1rem 0 .7rem; }
.landing-benefit p { color: var(--muted); font-size: .95rem; }
.landing-benefit .landing-benefit__detail { margin-top: 1rem; color: var(--ink); font-size: .85rem; font-weight: 700; }

.landing-audiences { padding-block: clamp(3rem, 6vw, 4.5rem); background: var(--glass-strong); border-block: 1px solid var(--glass-border); }
.landing-audience-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 2rem; }
.landing-audience { padding-right: clamp(1.5rem, 4vw, 3rem); }
.landing-audience + .landing-audience { padding: 0 0 0 clamp(1.5rem, 4vw, 3rem); border-left: 1px solid var(--surface-border); }
.landing-audience h3 { margin-bottom: .85rem; }
.landing-audience p { color: var(--muted); font-size: .95rem; }
.landing-audience .landing-audience__note { margin-top: 1rem; color: var(--ink); font-size: .85rem; }

.landing-support { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: clamp(2rem, 7vw, 5.5rem); }
.landing-support__intro { margin-top: 1.35rem; color: var(--muted); }
.landing-signature { display: flex; align-items: center; gap: .8rem; margin-top: 1.6rem; }
/* OneMillion Digital's mark is black on white, so it keeps its own white tile in both themes. */
.landing-signature__logo { width: 4.25rem; height: auto; flex-shrink: 0; padding: .3rem; border: 1px solid var(--surface-border); border-radius: 12px; background: #fff; }
.landing-signature p strong { display: block; font-size: .9rem; }
.landing-signature p span { display: block; color: var(--muted); font-size: .8rem; }
.landing-steps { margin: 0; padding: 0; list-style: none; }
.landing-steps li { display: grid; grid-template-columns: 1.75rem minmax(0, 1fr); gap: 1.1rem; padding-block: 1.5rem; border-top: 1px solid var(--surface-border); }
.landing-steps li:first-child { padding-top: 0; border-top: 0; }
.landing-step__number { color: var(--landing-link); font-size: 1.25rem; font-weight: 800; line-height: 1.3; }
.landing-steps h3 { margin-bottom: .45rem; font-size: 1.2rem; }
.landing-steps p { color: var(--muted); font-size: .92rem; }

.landing-faq { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: clamp(1.5rem, 7vw, 5.5rem); padding-top: 0; }
.landing-faq details { padding-block: 1.05rem; border-bottom: 1px solid var(--surface-border); }
.landing-faq details:first-child { padding-top: 0; }
.landing-faq summary { min-height: 2.75rem; display: flex; align-items: center; position: relative; padding-right: 2rem; font-weight: 700; list-style: none; cursor: pointer; }
.landing-faq summary::-webkit-details-marker { display: none; }
.landing-faq summary::after { content: "+"; position: absolute; top: 50%; transform: translateY(-50%); right: 0; color: var(--landing-link); font-size: 1.4rem; line-height: 1; }
.landing-faq details[open] summary::after { content: "−"; }
.landing-faq details p { padding-top: .75rem; color: var(--muted); font-size: .92rem; }

.landing-contact { padding-block: clamp(2.75rem, 6vw, 3.5rem); background: #172c4d; color: #fff; }
.landing-contact__inner { display: flex; align-items: center; justify-content: space-between; gap: clamp(1.5rem, 5vw, 4rem); }
.landing-contact p { max-width: 58ch; margin-top: .9rem; color: #d0dcee; }
.landing-contact__actions { flex-shrink: 0; text-align: center; }
.landing-contact .landing-contact-note { color: #d0dcee; }
.landing .landing-cta--inverse { border-color: #fff; background: #fff; color: #172c4d; }
.landing .landing-cta--inverse:hover, .landing .landing-cta--inverse:focus-visible { border-color: #e9efff; background: #e9efff; color: #172c4d; }
.landing-contact a:focus-visible { outline-color: #fff; }

@media (max-width: 860px) {
  .landing-hero, .landing-intro, .landing-support, .landing-faq { grid-template-columns: minmax(0, 1fr); }
  .landing-demo { width: min(100%, 34rem); justify-self: center; }
  .landing-contact__inner { flex-direction: column; align-items: flex-start; }
  .landing-contact__actions { text-align: left; }
}
@media (max-width: 600px) {
  .landing-strip__list, .landing-benefits, .landing-audience-grid { grid-template-columns: minmax(0, 1fr); }
  .landing-audience { padding: 0; }
  .landing-audience + .landing-audience { margin-top: 1.75rem; padding: 1.75rem 0 0; border-left: 0; border-top: 1px solid var(--surface-border); }
  .landing-demo { padding: .85rem; border-radius: 1.25rem 1.25rem 2.5rem 1.25rem; }
  .landing-panel { padding: 1.15rem; }
  .landing-tab { font-size: .8rem; }
  .landing-actions .landing-cta { width: 100%; }
}
/* M16: the unclassified-withdrawal hint wraps like text; a nowrap pill would run past a phone. */
.withdrawal-notice { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.75rem; margin: 1rem 0; border-left: 4px solid var(--soft); }
.withdrawal-notice p { margin: 0; min-width: 0; }
.withdrawal-hint { font-weight: 800; color: var(--soft); }
html[data-theme="light"] .withdrawal-hint { color: #b45309; }
.withdrawal-note { margin: 0.75rem 0; font-weight: 700; }

/* Premium phase (spec docs/superpowers/specs/2026-10-07-premium-phase-design.md):
   the band is plain text, not a live region; colours only through tokens. The
   price cell wraps the later price under the paid one rather than widen the
   row - no sideways scrolling at 320 px. */
.premium-band { border: 2px solid var(--accent); border-radius: var(--radius-sm); padding: 0.75rem 1rem; margin: 0 0 1rem; overflow-wrap: break-word; }
.premium-band strong { font-weight: 750; }
/* P2-SEAT-FLEX: the gap hint under the picker bar, the placement notice and the
   short line before the buy button. Tokens only; wraps on any width. */
.seat-picker__gap { margin: .5rem 0; padding: .6rem .8rem; border: 2px solid var(--danger); border-radius: var(--radius-sm); overflow-wrap: anywhere; }
.placement-note { border: 2px solid var(--accent); border-radius: var(--radius-sm); padding: .75rem 1rem; margin: 0 0 1rem; overflow-wrap: break-word; }
.placement-short { margin: .5rem 0 0; overflow-wrap: break-word; }
.price-cell { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: flex-end; column-gap: 0.4rem; min-width: 0; }
.price-later { color: var(--muted); font-size: 0.9rem; overflow-wrap: anywhere; }
/* Premium phase on a seated event: read-only "Preise" list above the seat picker. */
.seated-prices { margin: 0 0 1rem; }
.seated-prices h3 { margin: 0 0 0.25rem; font-size: 1rem; }
.seated-prices ul { list-style: none; margin: 0; padding: 0; }
.seated-prices .seated-price-row { grid-template-columns: minmax(0, 1fr) auto; padding: 0.5rem 0; }
@media (max-width: 760px) {
  .seated-prices .seated-price-row .price-cell { justify-content: flex-start; }
}
@media (max-width: 760px) {
  .ticket-choice .price-cell { grid-column: auto; justify-content: flex-start; }
}

/* Handbook (P2-HB): table of contents beside the chapter on a wide screen,
   one column below 760px; tables stack instead of scrolling sideways. */
.handbook { max-width: 1180px; }
.handbook-layout { display: grid; grid-template-columns: minmax(220px, 280px) minmax(0, 1fr); gap: 1.5rem; align-items: start; }
.handbook-toc { position: sticky; top: 1rem; max-height: calc(100vh - 2rem); overflow-y: auto; padding: 1rem; border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass); }
.handbook-toc > summary { font-weight: 600; cursor: pointer; }
.handbook-toc ul { list-style: none; margin: 0 0 1rem; padding: 0; }
.handbook-toc li { margin: .15rem 0; }
.handbook-toc a { display: block; padding: .3rem .5rem; border-radius: var(--radius-btn); color: var(--ink); text-decoration: none; }
.handbook-toc a.active, .handbook-toc a:hover { background: var(--glass-strong); color: var(--action-text); }
.handbook-snippet { display: block; padding: 0 .5rem .4rem; color: var(--muted); overflow-wrap: anywhere; }
.handbook-snippet mark { background: color-mix(in srgb, var(--soft) 30%, transparent); color: inherit; border-radius: 3px; }
.handbook-article { min-width: 0; overflow-wrap: anywhere; line-height: 1.6; }
.handbook-article h1 { margin-top: 0; }
.handbook-article h2 { margin-top: 2rem; padding-top: .5rem; border-top: 1px solid var(--glass-border); }
.handbook-article code { padding: 0 .3rem; border-radius: 4px; background: var(--glass-strong); }
.handbook-version { margin-top: -.5rem; }
.handbook-callout { margin: 1rem 0; padding: .75rem 1rem; border-left: 4px solid var(--neutral); border-radius: var(--radius-sm); background: var(--glass-strong); }
.handbook-callout-label { display: inline-block; margin-right: .35rem; }
.handbook-callout--geht-nicht { border-left-color: var(--danger); }
.handbook-callout--beispiel { border-left-color: var(--confirm); }
.handbook-callout--achtung { border-left-color: var(--soft); }
.handbook-callout--tipp { border-left-color: var(--accent); }
.handbook-table table { width: 100%; border-collapse: collapse; }
.handbook-table th, .handbook-table td { padding: .45rem .6rem; border-bottom: 1px solid var(--glass-border); text-align: left; vertical-align: top; }
.help-link { display: inline-flex; align-items: center; justify-content: center; width: 1.6rem; height: 1.6rem; margin-left: .5rem; border: 1px solid var(--glass-border); border-radius: 50%; font-size: .9rem; font-weight: 700; text-decoration: none; vertical-align: middle; color: var(--action-text); background: var(--glass-strong); }
.scan-help { color: inherit; }
@media (max-width: 760px) {
  .handbook-layout { grid-template-columns: 1fr; }
  .handbook-toc { position: static; }
  .handbook-table thead { display: none; }
  .handbook-table table, .handbook-table tbody, .handbook-table tr, .handbook-table td { display: block; width: 100%; }
  .handbook-table tr { padding: .5rem 0; border-bottom: 1px solid var(--glass-border); }
  .handbook-table td { border: 0; padding: .2rem 0; }
  .handbook-table td::before { content: attr(data-label); display: block; font-weight: 600; color: var(--muted); }
}

/* Arbeitsplatz Eingang (P2-ENT): full screen, thumb-sized targets, no sideways scroll. */
.entrance-shell { max-width: 900px; margin: 0 auto; padding: 12px 16px 32px; box-sizing: border-box; }
.entrance-title { max-width: none; font-size: clamp(1.5rem, 6vw, 2.2rem); line-height: 1.15; overflow-wrap: normal; word-break: normal; hyphens: manual; }
.entrance-head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: space-between; }
.entrance-head strong { font-size: 1.1rem; min-width: 0; overflow-wrap: anywhere; }
.entrance-live { display: flex; flex-wrap: wrap; gap: 6px 16px; margin: 10px 0; padding: 8px 12px; border-radius: 10px; background: var(--glass-strong); }
.entrance-live b { font-size: 1.15rem; }
.entrance-live.stale { opacity: 0.7; }
.entrance-tabs { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 10px; }
.entrance-tab { min-height: 56px; font-size: 1.15rem; font-weight: 700; border-radius: 10px; }
.entrance-tab[aria-selected="true"] { background: var(--action-fill); color: var(--on-fill); }
.entrance-modes { display: grid; gap: 10px; margin-top: 12px; }
.entrance-mode { display: block; width: 100%; min-height: 72px; text-align: left; padding: 14px 16px; border-radius: 12px; font-size: 1.15rem; }
.entrance-mode small { display: block; font-weight: 400; opacity: 0.8; margin-top: 4px; }
.entrance-card { padding: 12px; border-radius: 12px; }
.entrance-big { display: block; width: 100%; min-height: 56px; font-size: 1.15rem; text-align: center; box-sizing: border-box; }
@media (min-width: 700px) { .entrance-modes { grid-template-columns: repeat(3, 1fr); } }
.entrance-camera video { width: 100%; max-height: 38vh; object-fit: cover; border-radius: 12px; background: #000; }
.entrance-result { margin: 10px 0; padding: 14px 16px; border-radius: 12px; color: #fff; background: #3a4660; }
.entrance-result h2 { margin: 0 0 4px; font-size: 1.6rem; }
.entrance-result.tone-ok { background: #12823b; }
.entrance-result.tone-bad, .entrance-result.tone-forbidden { background: #b3261e; }
.entrance-result.tone-unclear, .entrance-result.tone-wait { background: #b26a00; }
.entrance-actions { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px; }
.entrance-actions .button { min-height: 52px; }
.entrance-hit { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid rgba(127, 127, 127, 0.25); }
.entrance-hit span { min-width: 0; overflow-wrap: anywhere; }
.entrance-hit small { display: block; opacity: 0.8; }
.entrance-hit .button { min-height: 48px; max-width: 100%; white-space: normal; overflow-wrap: anywhere; }
#entrance-search input, #entrance-token input { width: 100%; min-height: 48px; box-sizing: border-box; font-size: 1.1rem; }

/* Door-sale receipt (P2-ENT stage 2) */
.receipt-title { max-width: none; font-size: clamp(1.6rem, 6vw, 2.4rem); overflow-wrap: anywhere; }
.receipt-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; }
.receipt-facts dd { margin: 0; font-weight: 700; overflow-wrap: anywhere; }
.receipt-tickets { list-style: none; padding: 0; display: grid; gap: 8px; }
.receipt-tickets li { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; justify-content: space-between; }
.receipt-tickets small { display: block; opacity: 0.8; }

/* Arbeitsplatz Eingang, Kasse (P2-ENT stage 2) */
.entrance-kinds, .entrance-types { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px; margin: 8px 0; }
.entrance-kind, .entrance-type { min-height: 64px; padding: 10px 12px; border-radius: 12px; text-align: left; font-size: 1.05rem; overflow-wrap: anywhere; }
.entrance-type small { display: block; opacity: 0.85; }
.entrance-kind[aria-pressed="true"], .entrance-type[aria-pressed="true"] { background: var(--action-fill); color: var(--on-fill); }
.entrance-qty { display: flex; align-items: center; justify-content: center; gap: 16px; margin: 8px 0; }
.entrance-qty .button { min-width: 64px; min-height: 56px; font-size: 1.6rem; }
.entrance-qty output { font-size: 1.8rem; font-weight: 800; min-width: 2ch; text-align: center; }
.entrance-receipt { margin: 12px auto; text-align: center; }
.entrance-receipt img { width: min(220px, 70vw); height: auto; background: #fff; padding: 8px; border-radius: 8px; }
.entrance-send { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: end; }
.entrance-send label { grid-column: 1 / -1; }
.entrance-send input { min-height: 48px; min-width: 0; }
.entrance-locked { pointer-events: none; opacity: 0.55; }
.entrance-voucher-row { display: grid; grid-template-columns: 1fr auto; gap: 8px; }
.entrance-voucher-row input { min-width: 0; }
