/* Shared presentation layer. Tenant /tenant.css supplies --brand and --accent.
   Keep route markup, module layouts, authorization and print behavior in style.css. */
body.portal-ui {
  --ui-radius: 4px;
  --ui-space: 16px;
  --ui-shadow: 0 6px 18px rgb(28 39 51 / 7%);
  /* Responsive page width (breiten-konzept-responsive.md): one width for all pages. */
  --page-max: 1600px;
  font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
  line-height: 1.5;
  background: #f7f8fa;
}
.portal-ui header {
  background: #fff;
  border-bottom: 1px solid var(--line);
  box-shadow: 0 1px 8px rgb(28 39 51 / 4%);
}
@media (min-width: 721px) {
  .portal-ui header { height: auto; min-height: 76px; gap: 12px 24px; padding-block: 10px; }
  /* Header content runs flush with main (same width formula, centred). */
  .portal-ui header { padding-inline: max(clamp(14px, 2.5vw, 40px), calc((100% - var(--page-max)) / 2)); }
  .portal-ui header nav { align-items: center; justify-content: flex-end; gap: 6px 18px; }
}
.portal-ui main { width: min(var(--page-max), calc(100% - 2 * clamp(14px, 2.5vw, 40px))); margin-top: clamp(20px, 3vw, 36px); }
/* main-wide (/maintainer) keeps its class but is no wider than every other page. */
.portal-ui main.main-wide { width: min(var(--page-max), calc(100% - 2 * clamp(14px, 2.5vw, 40px))); }
.portal-ui .site-footer { width: min(var(--page-max), calc(100% - 2 * clamp(14px, 2.5vw, 40px))); }
.portal-ui :is(button, input, select, textarea) { font: inherit; }
.portal-ui h1 { line-height: 1.12; letter-spacing: -.02em; font-weight: 600; }
.portal-ui h2 { line-height: 1.25; letter-spacing: -.012em; }
.portal-ui p, .portal-ui li { line-height: 1.55; }
.portal-ui .page-head { margin-bottom: 20px; }
.portal-ui .eyebrow { letter-spacing: .13em; font-size: .74rem; }
.portal-ui label { font-size: .86rem; letter-spacing: .02em; color: #3d4650; }
.portal-ui :is(input, select, textarea) { font-size: 1rem; letter-spacing: normal; }
.portal-ui :is(input, select, textarea) { font-weight: 700; }
.portal-ui header nav a { border-bottom: 3px solid transparent; }
@media (min-width: 721px) {
  .portal-ui header nav a:hover { color: var(--brand); border-bottom-color: var(--brand); }
}
.portal-ui .panel { border-top: 0; border-bottom: 3px solid var(--brand); }
.portal-ui .panel:has(> details:only-child) { border-bottom-width: 1px; border-bottom-color: var(--line); }
.portal-ui .panel, .portal-ui .auth-card {
  border: 1px solid var(--line);
  border-radius: var(--ui-radius);
  background: #fff;
  box-shadow: var(--ui-shadow);
}
.portal-ui .subpanel, .portal-ui .catalog-block, .portal-ui .ticket-row,
.portal-ui .link-tree-item, .portal-ui .ticket-info-item {
  border-radius: var(--ui-radius);
  background: #fff;
}
.portal-ui .subpanel { background: #fbfcfd; }
.portal-ui .button, .portal-ui button:not(.ticket-tab-close) {
  min-height: 42px;
  border-radius: 8px;
  font-family: inherit;
  font-weight: 700;
  line-height: 1.25;
  transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}
.portal-ui .button:not(.primary), .portal-ui button:not(.primary):not(.ticket-tab-close) {
  border-color: var(--line);
}
.portal-ui :is(.button, button) { font-size: .92rem; }
/* Venue: compact uppercase actions with slight tracking. */
.portal-ui :is(.button, button):not(.ticket-tab-close):not(.nav-toggle):not(.suggestions button):not(.choice-card):not(.choice):not(.pager-address-result) {
  text-transform: uppercase;
  letter-spacing: .05em;
  border-radius: var(--ui-radius);
}
.portal-ui .button.primary, .portal-ui button.primary {
  border-color: var(--brand);
  background: var(--brand);
  color: #fff;
  box-shadow: none;
}
.portal-ui .button.primary:hover, .portal-ui button.primary:hover {
  border-color: var(--brand);
  background: var(--brand);
  filter: brightness(.88);
}
/* Keep established secondary states after the shared button base. */
.portal-ui .button-small { min-height: 34px; padding: 0 11px; font-size: .92rem; }
/* Compact Venue action (also on native <button>, which otherwise wins via button:not(...)). */
.portal-ui :is(button, .button).button-small { min-height: 34px; padding: 0 12px; font-size: .82rem; }
.portal-ui :is(.button, button).danger { border-color: #d7a3a0; background: #fff5f4; color: #8f0f13; }
.portal-ui :is(.button, button).danger:hover { border-color: #b4232c; background: #ffeceb; }
.portal-ui :is(button, .button, a, input, select, textarea, summary):focus-visible {
  outline: 2px solid var(--brand);
  outline-offset: 3px;
}
.portal-ui :is(button, input, select, textarea):disabled,
.portal-ui .button[aria-disabled="true"] { opacity: .56; cursor: not-allowed; }
.portal-ui :is(input:not([type="checkbox"]):not([type="radio"]):not([type="color"]), select, textarea) {
  border: 1px solid var(--line);
  border-radius: var(--ui-radius);
  background: #fff;
  font-family: inherit;
  line-height: 1.4;
}
.portal-ui :is(input, select, textarea):focus-visible { border-color: var(--brand); }
.portal-ui input[aria-invalid="true"] {
  border-color: var(--accent);
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--brand) 14%, transparent);
}
.portal-ui :is(input[type="checkbox"], input[type="radio"]) { accent-color: var(--brand); }
.portal-ui label { line-height: 1.4; }
.portal-ui .subnav, .portal-ui .ticket-tab-bar { border-radius: var(--ui-radius); }
.portal-ui .subnav a.active { background: var(--brand); }
.portal-ui .ticket-app-tab { border: 0; border-bottom: 3px solid transparent; border-radius: 0; background: transparent; }
.portal-ui .ticket-app-tab.active { border-bottom-color: var(--brand); background: transparent; color: var(--ink); }
.portal-ui .ticket-app-tab > button { border-radius: 0; }
.portal-ui .ticket-row.selected { border-color: var(--brand); background: color-mix(in srgb, var(--brand) 4%, #fff); }
.portal-ui .ticket-info-grid { background: #f7f8fa; border-radius: var(--ui-radius); }
.portal-ui .ticket-tab-panel-content { background: #fff; }
.portal-ui .ticket-preview-panel { border-radius: var(--ui-radius); }
.portal-ui :is(.badge, .priority, .ticket-info-chip) { line-height: 1.35; }
.portal-ui th { font-weight: 700; }
.portal-ui :is(.important-note, .notice, .flash, .alert) { border-radius: var(--ui-radius); line-height: 1.5; }
/* Entry surfaces use the same light shell; no marketing image or competing blue. */
.portal-ui .hero, .portal-ui .auth-visual {
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--ui-radius);
  box-shadow: var(--ui-shadow);
  color: var(--ink);
}
.portal-ui .auth-visual { border-bottom: 3px solid var(--brand); }
.portal-ui .hero h1, .portal-ui .hero p, .portal-ui .hero .eyebrow,
.portal-ui .auth-visual p { color: var(--ink); }
.portal-ui .hero .eyebrow { color: var(--brand); }
.portal-ui .hero-card { border-color: var(--line); background: #f7f8fa; }
.portal-ui .hero-metrics div, .portal-ui .feature-grid div {
  border-color: var(--line); background: #fff;
}
.portal-ui .hero-metrics span, .portal-ui .feature-grid span { color: var(--muted); }
.portal-ui .hero .button:not(.primary) { border-color: var(--line); background: #fff; color: var(--ink); }
.portal-ui .hero .button.primary { border-color: var(--brand); background: var(--brand); color: #fff; }
/* ---- Venue banner: only rendered by / and /login --------------------- */
.portal-ui main:has(> .venue-hero) { width: 100%; margin-top: 0; }
.portal-ui .venue-hero {
  position: relative;
  display: grid;
  min-height: clamp(300px, 46vh, 460px);
  overflow: hidden;
  color: #fff;
  background: #1d232a;
}
.portal-ui .venue-hero-slides { position: absolute; inset: 0; display: grid; }
.portal-ui .venue-slide {
  grid-area: 1 / 1;
  background-size: cover;
  background-repeat: no-repeat;
}
.portal-ui .venue-slide-1 { background-image: url('/static/img/hero-hauptwache.jpg'); background-position: 50% 62%; }
.portal-ui .venue-slide-2 { background-image: url('/static/img/hero-velpe.jpg'); background-position: 50% 60%; animation: venue-fade 14s ease-in-out infinite; }
@keyframes venue-fade {
  0%, 42% { opacity: 0; }
  50%, 92% { opacity: 1; }
  100% { opacity: 0; }
}
.portal-ui .venue-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(95deg, rgb(13 18 24 / 78%) 0%, rgb(13 18 24 / 45%) 55%, rgb(13 18 24 / 18%) 100%);
}
.portal-ui .venue-hero-copy {
  position: relative;
  z-index: 1;
  align-self: center;
  width: min(var(--page-max), calc(100% - 2 * clamp(14px, 2.5vw, 40px)));
  margin: 0 auto;
  padding: 40px 0 96px;
}
.portal-ui .venue-hero-line { display: block; width: 76px; height: 3px; margin-bottom: 18px; background: var(--brand); }
.portal-ui .venue-hero .eyebrow { color: #fff; opacity: .9; }
.portal-ui .venue-hero h1 { max-width: 760px; margin: 0 0 10px; color: #fff; font-size: clamp(2rem, 4.2vw, 3.3rem); font-weight: 500; }
.portal-ui .venue-hero h1 span { display: block; }
.portal-ui .venue-hero p:not(.eyebrow) { max-width: 600px; margin: 0; color: #e8edf2; font-size: 1.08rem; }
.portal-ui .venue-overlap {
  position: relative;
  z-index: 2;
  width: min(var(--page-max), calc(100% - 2 * clamp(14px, 2.5vw, 40px)));
  margin: -64px auto 0;
}
.portal-ui .venue-overlap .login-panel, .portal-ui .venue-overlap .start-links {
  box-shadow: 0 14px 30px rgb(0 0 0 / 13%);
}
.portal-ui .login-simple.venue-overlap { width: min(720px, calc(100% - 28px)); }
.portal-ui .venue-overlap :is(.login-panel, .auth-card) :is(h1, h2) { font-size: clamp(1.45rem, 2.4vw, 1.9rem); line-height: 1.12; letter-spacing: -.02em; font-weight: 600; margin: 0 0 14px; }
.portal-ui .login-simple.venue-overlap .auth-card { width: 100%; }
/* User /login only: narrower content, horizontal centering; card/vertical geometry unchanged. */
.portal-ui .login-simple .login-panel > :is(.eyebrow, h2, form) {
  width: min(480px, 100%);
  margin-inline: auto;
}
/* Login entries share the Fachbereich card (720px) and form (480px). */
.portal-ui .login-entry-grid.venue-overlap {
  width: min(1104px, calc(100% - 28px));
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: 24px;
  align-items: start;
}
.portal-ui .login-entry-grid .login-panel { width: 100%; margin: 0; min-width: 0; }
.portal-ui .login-entry-grid .login-panel > :is(.eyebrow, h2, form, details) {
  width: min(480px, 100%);
  margin-inline: auto;
}
.portal-ui .login-entry-grid .start-links { min-width: 0; }
.portal-ui .login-entry-grid .link-tree-item { overflow-wrap: anywhere; }
.portal-ui .login-entry-grid .admin-password-login { margin-top: 20px; }
.portal-ui .login-entry-grid .admin-password-login summary { cursor: pointer; }
.portal-ui .login-entry-grid .ticket-action-bar {
  position: static; margin: 0; padding: 0; border: 0; box-shadow: none; background: transparent;
}
.portal-ui .login-entry-grid .ticket-action-bar > .primary { flex: 1; }
.portal-ui .start-page.venue-overlap { align-items: start; }
.portal-ui main:has(> .venue-hero) > .start-footer { width: min(var(--page-max), calc(100% - 2 * clamp(14px, 2.5vw, 40px))); }
/* Reusable page schema (user dashboard first): page header, KPI strip, quick tiles,
   view tabs, user ticket cards, empty state. Markup helpers live in web.py. */
.portal-ui .page-header {
  display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end;
  gap: 16px 24px; margin-bottom: 22px;
}
.portal-ui .page-header-text { min-width: 0; flex: 1 1 320px; }
.portal-ui .page-header h1 { margin: 0 0 8px; }
.portal-ui .page-header-subtitle { margin: 0; color: var(--muted); max-width: 62ch; }
.portal-ui .page-header-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px;
  margin-top: 10px; color: var(--muted); font-size: .88rem;
}
.portal-ui .page-header-meta a { color: var(--ink); text-underline-offset: 3px; }
.portal-ui .page-header-settings { display: inline-flex; align-items: center; gap: 6px; text-decoration: none; }
.portal-ui .page-header-settings:hover span { text-decoration: underline; }
.portal-ui .page-header-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.portal-ui .kpi-strip { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; margin-bottom: 18px; }
.portal-ui .kpi-tile {
  display: grid; gap: 4px; padding: 16px 18px; min-width: 0;
  background: #fff; color: var(--ink); text-decoration: none;
  border: 1px solid var(--line); border-bottom: 3px solid var(--brand);
  border-radius: var(--ui-radius); box-shadow: var(--ui-shadow);
  transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.portal-ui a.kpi-tile:hover { border-color: var(--brand); box-shadow: 0 10px 24px rgb(28 39 51 / 11%); }
.portal-ui .kpi-label { color: var(--muted); font-size: .74rem; font-weight: 700; letter-spacing: .13em; text-transform: uppercase; }
.portal-ui .kpi-value { font-size: clamp(1.8rem, 4vw, 2.4rem); line-height: 1.05; font-weight: 700; }
.portal-ui .quick-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; margin-bottom: 26px; }
.portal-ui .quick-tile {
  display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; min-width: 0;
  background: #fff; color: var(--ink); text-decoration: none;
  border: 1px solid var(--line); border-radius: var(--ui-radius);
  transition: border-color .15s ease, box-shadow .15s ease;
}
.portal-ui .quick-tile:hover { border-color: var(--brand); box-shadow: var(--ui-shadow); }
.portal-ui .quick-tile .icon { flex: 0 0 auto; color: var(--brand); }
.portal-ui .quick-tile-text { display: grid; gap: 3px; min-width: 0; }
.portal-ui .quick-tile-text strong { font-size: .95rem; }
.portal-ui .quick-tile-text small { color: var(--muted); line-height: 1.4; overflow-wrap: anywhere; }
.portal-ui .view-tabs { display: flex; flex-wrap: wrap; gap: 4px 22px; margin-bottom: 14px; border-bottom: 1px solid var(--line); }
.portal-ui .view-tab {
  margin-bottom: -1px; padding: 8px 2px 9px; color: var(--muted); text-decoration: none;
  font-size: .82rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  border-bottom: 3px solid transparent; transition: color .15s ease, border-color .15s ease;
}
.portal-ui .view-tab:hover { color: var(--ink); }
.portal-ui .view-tab[aria-current="page"] { border-bottom-color: var(--brand); color: var(--ink); }
.portal-ui .user-ticket-list { display: grid; gap: 10px; }
.portal-ui .user-ticket-card {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px 18px; align-items: center;
  padding: 14px 16px; background: #fff; color: var(--ink); text-decoration: none;
  border: 1px solid var(--line); border-radius: var(--ui-radius);
  transition: border-color .15s ease, box-shadow .15s ease;
}
.portal-ui .user-ticket-card:hover { border-color: var(--brand); box-shadow: var(--ui-shadow); }
.portal-ui .user-ticket-main { display: grid; gap: 2px; min-width: 0; }
.portal-ui .user-ticket-code { color: var(--muted); font-size: .76rem; font-weight: 700; letter-spacing: .06em; }
.portal-ui .user-ticket-title { font-size: 1.02rem; overflow-wrap: anywhere; }
.portal-ui .user-ticket-meta { color: var(--muted); }
.portal-ui .strecke-location { margin-top: 1px; }
.portal-ui .response-chips { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 3px; }
.portal-ui .response-chip {
  display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: .76rem; font-weight: 700;
  background: #eef2f7; color: var(--muted);
}
.portal-ui .response-chip-ja { background: #e9f6ee; color: #1f7a3a; }
.portal-ui .response-chip-nein { background: #fdeceb; color: #b42318; }
.portal-ui .response-chip-freitext { background: #eaf1fb; color: #1f4f8a; }
.portal-ui .response-chip-offen { background: #fff3e0; color: #92510b; }
.portal-ui .user-ticket-side { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 6px 12px; text-align: right; }
.portal-ui .user-ticket-side time { flex-basis: 100%; color: var(--muted); font-size: .8rem; }
.portal-ui .user-ticket-status { display: inline-flex; align-items: center; gap: 7px; font-weight: 700; font-size: .88rem; }
.portal-ui .status-dot { width: 10px; height: 10px; border-radius: 50%; flex: 0 0 auto; }
.portal-ui .status-dot-open { background: #1f6fd1; }
.portal-ui .status-dot-progress { background: #e07b00; }
.portal-ui .status-dot-closed { background: #23883d; }
.portal-ui .user-ticket-side .priority { padding: 2px 8px; font-size: .78rem; }
.portal-ui .user-ticket-side .priority-urgent { border-color: var(--brand); background: var(--brand); color: #fff; }
.portal-ui .user-ticket-new {
  display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px;
  background: color-mix(in srgb, var(--brand) 10%, #fff); color: var(--brand);
  font-size: .76rem; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
}
.portal-ui .empty-state {
  padding: 30px 24px; text-align: center; background: #fff;
  border: 1px dashed var(--line); border-radius: var(--ui-radius);
}
.portal-ui .empty-state h2 { margin: 0 0 6px; font-size: 1.2rem; }
.portal-ui .empty-state p { margin: 0 auto; max-width: 52ch; color: var(--muted); }
.portal-ui .empty-state-actions { margin-top: 16px; }
.portal-ui .quick-tile-group { display: grid; min-width: 0; }
.portal-ui .quick-tile-group .quick-tile { border-radius: var(--ui-radius) var(--ui-radius) 0 0; }
.portal-ui .quick-tile-extra {
  padding: 7px 16px 8px; border: 1px solid var(--line); border-top: 0;
  border-radius: 0 0 var(--ui-radius) var(--ui-radius); background: #fafbfc;
  color: var(--brand); font-size: .82rem; font-weight: 700; text-underline-offset: 3px;
}
.portal-ui .quick-tile-extra:hover { background: color-mix(in srgb, var(--brand) 6%, #fff); }
/* Ticket form (same schema): module tiles as radios, numbered step cards, required markers,
   uniform hints/errors, file chooser and a bottom action bar (sticky on phones). */
.portal-ui .ticket-form { gap: 18px; }
/* Several step forms on one settings page keep the step rhythm (18 px). */
.portal-ui .ticket-form + .ticket-form { margin-top: 18px; }
.portal-ui .form-step {
  display: grid; gap: 16px; min-width: 0; padding: 20px 22px;
  background: #fff; border: 1px solid var(--line); border-radius: var(--ui-radius); box-shadow: var(--ui-shadow);
}
.portal-ui .form-step-title { display: flex; align-items: center; gap: 10px; margin: 0; font-size: 1.12rem; }
.portal-ui .step-badge {
  display: inline-grid; place-items: center; flex: 0 0 auto; width: 26px; height: 26px;
  border-radius: 50%; background: var(--brand); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: 0;
}
.portal-ui .area-tiles {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 240px), 1fr)); gap: 12px;
  min-width: 0; margin: 0; padding: 0; border: 0;
}
.portal-ui .area-tiles legend { margin-bottom: 10px; padding: 0; color: #3d4650; font-size: .86rem; font-weight: 700; letter-spacing: .02em; }
.portal-ui .area-tile { position: relative; display: block; min-width: 0; font-weight: 400; letter-spacing: normal; }
.portal-ui .area-tile input { position: absolute; top: 12px; left: 12px; width: 1px; height: 1px; margin: 0; opacity: 0; }
.portal-ui .area-tile-box {
  display: flex; align-items: flex-start; gap: 12px; height: 100%; min-width: 0; padding: 14px 40px 14px 16px;
  background: #fff; color: var(--ink); cursor: pointer;
  border: 1px solid var(--line); border-radius: var(--ui-radius);
  transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
.portal-ui .area-tile-box .icon { flex: 0 0 auto; color: var(--brand); }
.portal-ui .area-tile-text { display: grid; gap: 3px; min-width: 0; }
.portal-ui .area-tile-text strong { font-size: .95rem; overflow-wrap: anywhere; }
.portal-ui .area-tile-text small { color: var(--muted); line-height: 1.4; overflow-wrap: anywhere; }
.portal-ui .area-tile-text small:empty { display: none; }
.portal-ui .area-tile-check {
  position: absolute; top: 10px; right: 10px; display: none; place-items: center; width: 22px; height: 22px;
  border-radius: 50%; background: var(--brand); color: #fff; font-size: .8rem; font-weight: 800;
}
.portal-ui .area-tile:hover .area-tile-box { border-color: var(--brand); box-shadow: var(--ui-shadow); }
.portal-ui .area-tile input:checked + .area-tile-box {
  border-color: var(--brand); box-shadow: inset 0 0 0 1px var(--brand);
  background: color-mix(in srgb, var(--brand) 5%, #fff);
}
.portal-ui .area-tile input:checked + .area-tile-box .area-tile-check { display: grid; }
.portal-ui .area-tile input:focus-visible + .area-tile-box { outline: 2px solid var(--brand); outline-offset: 3px; }
.portal-ui .ticket-form label:has(> :required) > .field-label::after,
.portal-ui .ticket-form .area-tiles:has(:required) > legend::after { content: " *"; color: var(--brand); font-weight: 800; }
.portal-ui .required-note { margin: 0; color: var(--muted); font-size: .84rem; }
.portal-ui .required-note span { color: var(--brand); font-weight: 800; }
.portal-ui .field-hint { display: block; margin: -4px 0 10px; color: var(--muted); font-size: .84rem; font-weight: 400; line-height: 1.4; }
.portal-ui .gastro-settle-hint { margin-top: 10px; }
.portal-ui .gastro-payment-history-actions {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
}
.portal-ui .gastro-payment-history-actions > p { margin: 0; }
.portal-ui .field-error { display: block; margin: 6px 0 0; color: #b42318; font-size: .84rem; font-weight: 700; line-height: 1.4; }
.portal-ui .ticket-form :is(input, select, textarea)[aria-invalid="true"] { border-color: #b42318; }
.portal-ui .file-drop {
  position: relative; display: grid; gap: 6px; justify-items: start; padding: 16px;
  background: #fff; border: 2px dashed var(--line); border-radius: var(--ui-radius); cursor: pointer;
  transition: border-color .15s ease, background-color .15s ease;
}
.portal-ui .file-drop:hover { border-color: var(--brand); background: color-mix(in srgb, var(--brand) 3%, #fff); }
.portal-ui .file-drop:has(input:focus-visible) { border-color: var(--brand); outline: 2px solid var(--brand); outline-offset: 3px; }
.portal-ui .file-drop input[type="file"] { position: absolute; inset: 0; width: 100%; height: 100%; padding: 0; border: 0; opacity: 0; cursor: pointer; }
.portal-ui .file-drop-text { color: var(--brand); font-size: .86rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; }
.portal-ui .file-drop-name { color: var(--ink); font-size: .88rem; overflow-wrap: anywhere; }
.portal-ui .file-drop-name:empty { display: none; }
.portal-ui .file-drop:has(input:disabled) { opacity: .56; cursor: not-allowed; }
.portal-ui .ticket-action-bar { justify-content: space-between; align-items: center; margin-top: 0; }
.portal-ui .ticket-action-bar :is(.button, button) { min-width: 150px; }
.portal-ui .ticket-action-bar button.primary { margin-left: auto; }
/* ---- Ticket detail (same schema): header, stepper, details, messenger chat, Verlauf ---- */
.portal-ui .ticket-detail-venue { grid-template-columns: minmax(0, 1fr) minmax(340px, 400px); }
.portal-ui .ticket-detail-venue :is(.ticket-chat-panel, .ticket-work-card, .ticket-measures-panel) { border-top: 0; }
.portal-ui .ticket-detail-venue .panel h2 { font-size: 1.12rem; }
.portal-ui .page-header-meta :is(.ticket-meta-status) { display: inline-flex; align-items: center; gap: 7px; color: var(--ink); font-weight: 700; }
.portal-ui .page-header-meta .priority { padding: 2px 8px; font-size: .78rem; }
.portal-ui .page-header-meta .priority-urgent { border-color: var(--brand); background: var(--brand); color: #fff; }
.portal-ui .ticket-closed-notice {
  margin: 0 0 16px; padding: 12px 16px; border: 1px solid #a6d8b4; border-left: 4px solid #23883d;
  background: #eff9f1; color: #17602b; font-weight: 700;
}
.portal-ui .ticket-progress-card h2, .portal-ui .ticket-facts-card h2 { margin-bottom: 12px; }
.portal-ui .ticket-stepper { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
.portal-ui .ticket-step { position: relative; display: flex; align-items: flex-start; gap: 12px; padding-bottom: 16px; }
.portal-ui .ticket-step:last-child { padding-bottom: 0; }
.portal-ui .ticket-step:not(:last-child)::after {
  content: ""; position: absolute; left: 13px; top: 28px; bottom: 2px; width: 2px; background: var(--line);
}
.portal-ui .ticket-step-done:not(:last-child)::after { background: var(--brand); }
.portal-ui .ticket-step-marker {
  display: inline-grid; place-items: center; flex: 0 0 auto; width: 28px; height: 28px; border-radius: 50%;
  border: 2px solid var(--line); background: #fff; color: var(--muted); font-size: .82rem; font-weight: 800;
}
.portal-ui .ticket-step-text { display: grid; gap: 2px; padding-top: 3px; min-width: 0; }
.portal-ui .ticket-step-label { font-weight: 700; color: var(--muted); }
.portal-ui .ticket-step-detail { color: var(--ink); font-size: .84rem; overflow-wrap: anywhere; }
.portal-ui .ticket-step-done .ticket-step-marker { border-color: var(--brand); color: var(--brand); }
.portal-ui .ticket-step-done .ticket-step-label { color: var(--ink); }
.portal-ui .ticket-step-current .ticket-step-marker { border-color: var(--brand); background: var(--brand); color: #fff; }
.portal-ui .ticket-step-current .ticket-step-label { color: var(--ink); }
.portal-ui .ticket-description-text { white-space: pre-wrap; overflow-wrap: anywhere; max-width: 75ch; margin: 0 0 16px; line-height: 1.55; }
.portal-ui .ticket-facts { display: grid; grid-template-columns: minmax(110px, max-content) minmax(0, 1fr); gap: 8px 16px; margin: 0; }
.portal-ui .ticket-facts dt { color: var(--muted); font-size: .82rem; font-weight: 700; letter-spacing: .04em; }
.portal-ui .ticket-facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; font-weight: 600; }
.portal-ui .ticket-details-card .ticket-facts { padding-top: 14px; border-top: 1px solid var(--line); }
.portal-ui .ticket-files { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line); }
.portal-ui .ticket-files h3 { margin: 0 0 10px; color: var(--muted); font-size: .82rem; letter-spacing: .1em; text-transform: uppercase; }
.portal-ui .ticket-file-list { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; padding: 0; list-style: none; }
.portal-ui .ticket-file-list li { min-width: 0; max-width: 100%; }
.portal-ui .ticket-file {
  display: inline-flex; align-items: center; gap: 8px; max-width: 100%; padding: 8px 12px;
  border: 1px solid var(--line); border-radius: var(--ui-radius); background: #fff; color: var(--ink); text-decoration: none;
}
.portal-ui .ticket-file:hover { border-color: var(--brand); }
.portal-ui .ticket-file-icon { flex: 0 0 auto; color: var(--brand); }
.portal-ui .ticket-file-name { min-width: 0; overflow-wrap: anywhere; font-size: .9rem; font-weight: 600; }
.portal-ui .chat-thread { display: grid; gap: 10px; margin-bottom: 16px; }
.portal-ui .chat-thread .chat-message { max-width: min(82%, 75ch); padding: 10px 14px; border: 1px solid var(--line); border-radius: var(--ui-radius); }
.portal-ui .chat-message.chat-own { justify-self: end; background: #f1f3f5; border-color: #e1e5e9; }
.portal-ui .chat-message.chat-other { border-left: 3px solid var(--brand); justify-self: start; background: #fff; }
.portal-ui .chat-meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin-bottom: 4px; font-size: .8rem; color: var(--muted); }
.portal-ui .chat-author { color: var(--ink); font-size: .84rem; }
.portal-ui .chat-role {
  padding: 1px 7px; border-radius: 999px; background: color-mix(in srgb, var(--brand) 10%, #fff);
  color: var(--brand); font-size: .7rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
}
.portal-ui .chat-text { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
.portal-ui .chat-empty { margin: 0 0 16px; }
.portal-ui .chat-composer { display: grid; gap: 10px; padding-top: 14px; border-top: 1px solid var(--line); }
.portal-ui .chat-composer button { justify-self: end; min-width: 120px; }
.portal-ui .ticket-timeline .timeline-list { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
.portal-ui .timeline-entry { position: relative; display: flex; gap: 12px; padding: 0 0 14px; }
.portal-ui .timeline-entry:not(:last-child)::before {
  content: ""; position: absolute; left: 4px; top: 14px; bottom: 0; width: 2px; background: var(--line);
}
.portal-ui .timeline-dot { flex: 0 0 auto; width: 10px; height: 10px; margin-top: 6px; border-radius: 50%; background: var(--brand); }
.portal-ui .timeline-location .timeline-dot { background: #5f6b76; }
.portal-ui .timeline-body { display: grid; gap: 2px; min-width: 0; }
.portal-ui .timeline-body strong { font-size: .9rem; overflow-wrap: anywhere; }
.portal-ui .timeline-note { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-size: .88rem; }
.portal-ui .timeline-body small { color: var(--muted); font-size: .8rem; }
@media (max-width: 900px) {
  .portal-ui .login-entry-grid.venue-overlap {
    width: min(720px, calc(100% - 28px));
    grid-template-columns: minmax(0, 1fr);
    gap: 22px;
  }
  .portal-ui .ticket-detail-venue { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .ticket-detail-venue .ticket-detail-primary, .portal-ui .ticket-detail-venue .ticket-detail-sidebar { display: contents; }
  .portal-ui .ticket-progress-card { order: -1; }
  .portal-ui .ticket-detail-venue .ticket-timeline-panel { order: 10; }
}
/* Gerätewart tabs: style.css stacks the detail inside the tab panel up to 1450px. */
@media (max-width: 1450px) {
  .portal-ui .ticket-tab-panel-content .ticket-detail-venue { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .ticket-tab-panel-content .ticket-detail-venue :is(.ticket-detail-primary, .ticket-detail-sidebar) { display: contents; }
  .portal-ui .ticket-tab-panel-content .ticket-progress-card { order: -1; }
  .portal-ui .ticket-tab-panel-content .ticket-timeline-panel { order: 10; }
}
/* ---- Gerätewart tools (Bearbeitung, Maßnahmen, Notizen): compact, never full width on desktop ---- */
.portal-ui .ticket-work-card > .ticket-status-form {
  display: grid; grid-template-columns: minmax(150px, 220px) minmax(0, 1fr) auto; align-items: end; gap: 10px; margin-top: 12px;
}
.portal-ui .ticket-work-card .ticket-status-form label { display: grid; gap: 4px; margin: 0; min-width: 0; }
.portal-ui .ticket-work-card .ticket-status-form :is(select, input) { width: 100%; min-height: 38px; max-width: none; }
.portal-ui .ticket-work-card :is(.ticket-status-form, .ticket-assign-self, .ticket-assignee-editor) button { width: auto; }
.portal-ui .ticket-tool-label { margin: 0 0 6px; color: var(--muted); font-size: .74rem; font-weight: 700; letter-spacing: .13em; text-transform: uppercase; }
.portal-ui .ticket-assignees { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--line); }
.portal-ui .ticket-assignee-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
.portal-ui .ticket-assignee-chip {
  padding: 3px 10px; border: 1px solid var(--line); border-radius: 999px; background: #f7f8fa;
  font-size: .86rem; font-weight: 700;
}
.portal-ui .ticket-assignee-actions { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 12px; margin-top: 10px; }
.portal-ui .ticket-assign-self { margin: 0; }
.portal-ui .ticket-assignee-editor { flex: 1 1 260px; min-width: 0; margin: 0; }
.portal-ui .ticket-assignee-editor > summary {
  display: inline-flex; align-items: center; min-height: 34px; padding: 0 11px; cursor: pointer;
  border: 1px solid var(--line); border-radius: var(--ui-radius); background: #fff;
  font-size: .82rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
}
.portal-ui .ticket-assignee-editor[open] > summary { border-color: var(--brand); color: var(--brand); }
.portal-ui .ticket-assignee-editor > form { margin-top: 10px; gap: 10px; }
.portal-ui .ticket-assignee-editor > form > button { justify-self: end; }
.portal-ui .ticket-work-card .people-list { max-height: 240px; }
.portal-ui :is(.ticket-measures-panel, .ticket-internal-notes) { border-left: 1px solid var(--line); background: #fff; }
.portal-ui .ticket-measure-list { margin: 12px 0; }
.portal-ui .ticket-entry-list { display: grid; gap: 0; margin: 12px 0; padding: 0; list-style: none; }
.portal-ui .ticket-entry { position: relative; display: flex; gap: 12px; padding: 0 0 14px; }
.portal-ui .ticket-entry:not(:last-child)::before {
  content: ""; position: absolute; left: 4px; top: 14px; bottom: 0; width: 2px; background: var(--line);
}
.portal-ui .ticket-internal-notes .ticket-entry .timeline-dot { background: #b54708; }
.portal-ui .ticket-entry-body { display: grid; gap: 2px; min-width: 0; }
.portal-ui .ticket-entry-meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 10px; color: var(--muted); font-size: .8rem; }
.portal-ui .ticket-entry-author { color: var(--ink); font-size: .86rem; }
.portal-ui .ticket-entry-text { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
.portal-ui .ticket-tool-composer { display: grid; gap: 8px; padding-top: 12px; border-top: 1px solid var(--line); }
.portal-ui .ticket-tool-composer label { display: grid; gap: 4px; margin: 0; }
.portal-ui .ticket-tool-composer button { justify-self: end; width: auto; }
/* ---- Gerätewart page: header actions, KPI strip, filter bar, ticket cards, Venue tabs ---- */
.portal-ui .page-header-actions .action-menu { position: relative; }
.portal-ui .page-header-actions .action-menu > summary { min-height: 42px; border-radius: var(--ui-radius); }
.portal-ui .maintainer-kpis .kpi-strip { margin-bottom: 14px; }
.portal-ui .maintainer-kpis .kpi-tile { padding: 10px 14px; }
.portal-ui .maintainer-kpis .kpi-value { font-size: 1.6rem; }
.portal-ui .maintainer-workspace > h2 { font-size: 1.12rem; }
.portal-ui .ticket-filter-dropdown > summary { min-height: 44px; border-radius: var(--ui-radius); }
.portal-ui .ticket-filter-dropdown > summary > span { font-size: .72rem; font-weight: 700; letter-spacing: .13em; }
.portal-ui .ticket-filter-dropdown[open] > summary { border-color: var(--brand); }
.portal-ui .ticket-filter-popover { border-radius: var(--ui-radius); box-shadow: var(--ui-shadow); }
.portal-ui .ticket-filter { border-radius: var(--ui-radius); }
.portal-ui .ticket-filter-actions :is(.button, button) { min-height: 38px; padding: 0 14px; }
.portal-ui .ticket-result-count { font-size: .78rem; letter-spacing: .1em; text-transform: uppercase; }
.portal-ui .maintainer-ticket-card {
  border: 1px solid var(--line); border-left: 4px solid var(--line); border-radius: var(--ui-radius);
  transition: border-color .15s ease, box-shadow .15s ease;
}
.portal-ui .maintainer-ticket-card:hover { border-color: var(--brand); border-left-color: var(--brand); box-shadow: var(--ui-shadow); }
.portal-ui .maintainer-ticket-card.selected {
  border-color: var(--brand); border-left-color: var(--brand); box-shadow: none;
  background: color-mix(in srgb, var(--brand) 5%, #fff);
}
.portal-ui .maintainer-ticket-badges { align-items: center; }
.portal-ui .maintainer-ticket-status { display: inline-flex; align-items: center; gap: 7px; font-size: .86rem; font-weight: 700; white-space: nowrap; }
.portal-ui .maintainer-ticket-badges .priority { padding: 2px 8px; font-size: .76rem; }
.portal-ui .maintainer-ticket-badges .priority-urgent { border-color: var(--brand); background: var(--brand); color: #fff; }
.portal-ui .maintainer-ticket-summary { font-weight: 600; }
.portal-ui .maintainer-ticket-overview .empty-state { padding: 24px 18px; }
.portal-ui .ticket-tab-bar { gap: 4px; min-height: 44px; padding: 0 8px; overflow-y: hidden; background: #fff; border-bottom: 1px solid var(--line); }
.portal-ui .ticket-app-tab > button[role="tab"] { min-height: 42px; padding: 0 8px; color: var(--muted); font-size: .8rem; letter-spacing: .08em; }
.portal-ui .ticket-app-tab.active > button[role="tab"] { color: var(--ink); }
.portal-ui .ticket-app-tab > .ticket-tab-close { width: 30px; min-height: 30px; border-radius: var(--ui-radius); color: var(--muted); }
.portal-ui .ticket-app-tab > .ticket-tab-close:hover { color: var(--brand); background: color-mix(in srgb, var(--brand) 8%, #fff); }
.portal-ui .ticket-app-tab > :is(button):focus-visible { outline-offset: -2px; }
/* Stepper/status tones for decided requests (approved green, rejected/canceled red). */
.portal-ui .status-dot-rejected { background: #b42318; }
.portal-ui .ticket-step-approved .ticket-step-marker { border-color: #23883d; background: #23883d; color: #fff; }
.portal-ui :is(.ticket-step-rejected, .ticket-step-canceled) .ticket-step-marker { border-color: #b42318; background: #b42318; color: #fff; }
.portal-ui .ticket-step-approved .ticket-step-label { color: #17602b; }
.portal-ui :is(.ticket-step-rejected, .ticket-step-canceled) .ticket-step-label { color: #8f1d14; }
/* Titled groups of list cards (web.list_group), e.g. one day in a calendar list. */
.portal-ui .list-group { display: grid; gap: 10px; margin-bottom: 18px; }
.portal-ui .list-group-title {
  margin: 6px 0 0; padding-bottom: 6px; border-bottom: 1px solid var(--line);
  color: var(--muted); font-size: .74rem; font-weight: 700; letter-spacing: .13em; text-transform: uppercase;
}
/* Inline reason inputs and edit grids inside list-card actions (shared, all modules). */
.portal-ui .user-ticket-actions :is(.inline-form, form) input:not([type="hidden"]) {
  flex: 1 1 200px; width: auto; min-width: 0; min-height: 34px; height: 34px; padding-block: 4px;
}
.portal-ui .user-ticket-actions > .grid-form { flex: 1 1 100%; min-width: 0; }
.portal-ui :is(button, .button)[hidden] { display: none !important; }
.portal-ui .ticket-form .subpanel > h3 > button { margin-left: auto; }
/* Management uses shared cards, steps and tiles; only location grouping is domain-specific. */
.portal-ui .management-home, .portal-ui .management-team-page { display: grid; gap: 16px; min-width: 0; }
.portal-ui .management-home > .user-ticket-list { grid-template-columns: minmax(0, 1fr); width: 100%; min-width: 0; }
.portal-ui .management-home .management-module-actions { width: 100%; min-width: 0; }
.portal-ui .management-home .management-module-actions .button { max-width: 100%; white-space: normal; overflow-wrap: anywhere; text-align: center; }
.portal-ui .management-team-page .ticket-facts { margin-bottom: 18px; }
.portal-ui .team-person-list { display: grid; gap: 18px; min-width: 0; }
.portal-ui .team-location-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr)); gap: 12px; min-width: 0; }
.portal-ui .team-location { min-width: 0; }
.portal-ui .team-location select { display: block; width: 100%; min-width: 0; }
.portal-ui .team-permission-options { display: grid; gap: 12px; margin-top: 16px; }
.portal-ui .team-person-extras { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); gap: 12px; margin-top: 16px; }
.portal-ui .team-filter-form { display: flex; flex-wrap: wrap; align-items: end; gap: 8px; }
.portal-ui .team-filter-form > label { flex: 1 1 100%; }
.portal-ui .team-appointment-steps { display: flex; flex-wrap: wrap; gap: 8px 24px; padding-left: 24px; }
.portal-ui .team-appointment-steps li { flex: 1 1 190px; min-width: 0; }
@media (max-width: 760px) {
  .portal-ui .team-person-extras { grid-template-columns: minmax(0,1fr); }
  .portal-ui .team-filter-form > label { width: 100%; }
}
/* ---- Choice cards (Standort-/Bereichswahl, Versandweg): one schema ---- */
.portal-ui .narrow-page { width: min(560px, 100%); margin-inline: auto; }
.portal-ui .narrow-page > .page-header { flex-wrap: wrap; }
.portal-ui .choice-panel { padding: 18px; }
.portal-ui .choice-list { display: grid; gap: 10px; }
.portal-ui .choice-card, .portal-ui .choice {
  display: flex; align-items: center; gap: 14px; width: 100%; min-height: 64px; padding: 12px 16px;
  border: 1px solid var(--line); border-radius: var(--ui-radius); background: #fff; color: var(--ink);
  text-align: left; cursor: pointer;
}
.portal-ui .choice-card { text-transform: none; letter-spacing: normal; font-weight: 400; }
.portal-ui .choice { text-transform: none; letter-spacing: normal; justify-content: flex-start; font-weight: 700; }
.portal-ui :is(.choice-card, .choice):hover { border-color: var(--brand); box-shadow: var(--ui-shadow); background: #fff; }
.portal-ui .choice:has(input:checked) { border-color: var(--brand); box-shadow: inset 0 0 0 1px var(--brand); background: color-mix(in srgb, var(--brand) 5%, #fff); }
.portal-ui .choice input[type="radio"] { width: auto; margin: 0; }
.portal-ui .choice small { display: block; margin-top: 3px; color: var(--muted); font-weight: 400; }
.portal-ui .choice-card-text { display: grid; gap: 2px; min-width: 0; flex: 1 1 auto; }
.portal-ui .choice-card-name { font-size: 1.05rem; font-weight: 700; overflow-wrap: anywhere; }
.portal-ui .choice-card-meta { color: var(--muted); font-size: .84rem; letter-spacing: .08em; }
.portal-ui .choice-card-tags { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; }
.portal-ui .choice-card-tag {
  padding: 2px 8px; border: 1px solid var(--line); border-radius: 999px; color: var(--muted);
  font-size: .72rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
}
.portal-ui .choice-card-current { border-color: var(--brand); color: var(--brand); }
.portal-ui .choice-card-arrow { flex: 0 0 auto; color: var(--brand); font-size: 1.6rem; line-height: 1; }
.portal-ui .choice-detail { margin-left: auto; color: var(--muted); font-size: .84rem; font-weight: 600; }
.portal-ui .switch-row {
  display: flex; align-items: flex-start; gap: 10px; margin: 16px 0 0; padding-top: 14px;
  border-top: 1px solid var(--line); font-weight: 600; font-size: .92rem; letter-spacing: normal; cursor: pointer;
}
.portal-ui .switch-row input { width: 18px; height: 18px; margin: 2px 0 0; flex: 0 0 auto; }
.portal-ui .switch-row small { display: block; margin-top: 2px; color: var(--muted); font-weight: 400; font-size: .84rem; }
/* Central notice/error pages (web.page_card): narrow page type, one card, button row. */
.portal-ui .notice-page-card > :first-child { margin-top: 0; }
.portal-ui .notice-page-card > :last-child { margin-bottom: 0; }
.portal-ui .notice-page-card p:has(> .button) { display: flex; flex-wrap: wrap; gap: 10px; }
/* Shared data table (web.data_table) for real tabular data; scroll wrapper, never page overflow. */
.portal-ui .data-table-card h2 { font-size: 1.12rem; }
.portal-ui .data-table-wrap {
  max-width: 100%; overflow-x: auto; background: #fff;
  border: 1px solid var(--line); border-radius: var(--ui-radius);
}
.portal-ui .data-table-wrap:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; }
.portal-ui .data-table { display: table; width: 100%; margin: 0; border-collapse: collapse; background: #fff; white-space: normal; }
.portal-ui .data-table th {
  padding: 10px 14px; border-bottom: 1px solid var(--line); background: #f7f8fa; text-align: left; white-space: nowrap;
  color: var(--muted); font-size: .74rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
}
.portal-ui .data-table td { padding: 10px 14px; border-bottom: 1px solid var(--line); vertical-align: middle; overflow-wrap: anywhere; min-width: 7em; }
.portal-ui .data-table tbody tr:last-child td { border-bottom: 0; }
.portal-ui .data-table tbody tr:hover td { background: color-mix(in srgb, var(--brand) 3%, #fff); }
.portal-ui .data-table .data-table-empty { color: var(--muted); text-align: center; }
/* Admin-only form controls inside the shared list-card surface. */
.portal-ui .admin-maintainer-fields {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px; width: 100%; min-width: 0; align-items: start;
}
.portal-ui .admin-maintainer-fields > * { min-width: 0; }
.portal-ui .admin-maintainer-fields .area-tiles { grid-column: 1 / -1; }
.portal-ui .admin-maintainer-fields .area-tile-box { min-width: 0; }
.portal-ui .user-ticket-actions > .area-tiles { width: 100%; min-width: 0; }
.portal-ui .user-ticket-actions > .area-tiles .area-tile { min-width: 0; }
.portal-ui main:has(form[action="/admin/settings"]) form[action="/admin/settings"].grid-form > .form-step {
  grid-column: 1 / -1; min-width: 0;
}
.portal-ui main:has(form[action^="/admin/people/"]) .ticket-detail-venue > :is(.ticket-detail-primary, .ticket-detail-sidebar),
.portal-ui main:has(form[action^="/admin/people/"]) .ticket-detail-sidebar > .panel {
  min-width: 0;
}
.portal-ui main:has(form[action^="/admin/people/"]) .ticket-detail-sidebar .area-tiles {
  grid-template-columns: minmax(0, 1fr);
}
/* Ticket details: plain module sections, shared choice tiles. */
.portal-ui .ticket-module-fields {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: 18px;
  min-width: 0;
}
.portal-ui #ticketDetailsStep > .ticket-module-fields { grid-column: 1 / -1; }
.portal-ui .ticket-module-fields > :is(h2, div),
.portal-ui .ticket-module-fields .atemschutz-block > :is(div, .file-drop, small, p),
.portal-ui .ticket-module-fields .stack > :is(div, .file-drop, small, p) { grid-column: 1 / -1; }
.portal-ui .ticket-module-fields > h2 { margin: 0; font-size: 18px; }
.portal-ui .ticket-module-fields .atemschutz-block {
  background: transparent;
  border: 0;
  border-radius: 0;
  padding: 0;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: 18px;
}
.portal-ui #ticketDetailsStep .clothing-items { grid-template-columns: minmax(0, 1fr); gap: 0; }
.portal-ui #ticketDetailsStep :is(.area-tiles, .area-tile, .area-tile-box) { min-width: 0; }
.portal-ui #ticketDetailsStep .area-tile-text strong { overflow-wrap: anywhere; }
.portal-ui #ticketDetailsStep [data-booking-window] {
  background: transparent;
  border: 0;
  border-top: 1px solid var(--line);
  border-radius: 0;
  padding: 18px 0 0;
}

@media (max-width: 720px) {
  .portal-ui .choice-card { flex-wrap: wrap; }
  .portal-ui .choice-card-tags { order: 3; width: 100%; justify-content: flex-start; }
  .portal-ui main { margin-top: 18px; }
  .portal-ui main, .portal-ui main.main-wide { width: calc(100% - 16px); }
  .portal-ui .site-footer { width: calc(100% - 28px); }
  .portal-ui .page-header { align-items: stretch; }
  .portal-ui .page-header-actions { width: 100%; }
  .portal-ui .page-header-actions .button { flex: 1 1 auto; }
  .portal-ui .kpi-strip { grid-template-columns: 1fr; }
  .portal-ui .quick-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .portal-ui .area-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .portal-ui .form-step { padding: 16px; }
  .portal-ui .ticket-action-bar { position: sticky; bottom: 0; z-index: 5; flex-wrap: nowrap; margin: 0; padding: 10px 0 calc(10px + env(safe-area-inset-bottom)); background: #fff; border-top: 1px solid var(--line); box-shadow: 0 -6px 16px rgb(28 39 51 / 8%); }
  .portal-ui .ticket-action-bar :is(.button, button) { flex: 1 1 0; min-width: 0; }
  /* Washing board has a selector plus two actions, unlike the two-action form bar. */
  .portal-ui .wash-move-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .portal-ui .wash-move-actions > select { grid-column: 1 / -1; width: 100%; min-width: 0; }
  .portal-ui .wash-move-actions > button { width: 100%; min-width: 0; overflow-wrap: anywhere; }
  .portal-ui .user-ticket-card { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .user-ticket-side { justify-content: flex-start; text-align: left; }
  .portal-ui .panel { padding: 16px; }
  .portal-ui .hero, .portal-ui .auth-visual { padding: 20px; }
  .portal-ui .ticket-app-tab > button { min-height: 38px; }
  .portal-ui .venue-hero { min-height: 280px; }
  .portal-ui .venue-hero-copy { padding: 28px 0 78px; }
  .portal-ui .venue-overlap { margin-top: -52px; }
  .portal-ui .start-page.venue-overlap { grid-template-columns: 1fr; }
  .portal-ui .chat-thread .chat-message { max-width: 100%; }
  .portal-ui .ticket-facts { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .portal-ui .ticket-facts dd { margin-bottom: 8px; }
  .portal-ui .page-header-actions:has(> :only-child) .button { flex: 0 1 auto; }
  .portal-ui .ticket-work-card > .ticket-status-form { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .ticket-work-card :is(.ticket-status-form, .ticket-assign-self, .ticket-assignee-editor) button { width: 100%; }
  .portal-ui .ticket-assign-self { flex: 1 1 100%; }
  .portal-ui .ticket-tool-composer button { justify-self: stretch; width: 100%; }
  .portal-ui .maintainer-kpis .kpi-strip { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
  .portal-ui .maintainer-kpis .kpi-tile { padding: 8px 10px; }
  .portal-ui .maintainer-kpis .kpi-label { font-size: .64rem; letter-spacing: .08em; }
  .portal-ui .data-table :is(th, td) { padding: 8px 10px; }
  .portal-ui .data-table td { min-width: 0; }
  .portal-ui .data-table th { white-space: normal; hyphens: auto; letter-spacing: .06em; }
  .portal-ui .admin-maintainer-fields { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 420px) {
  .portal-ui .quick-tiles { grid-template-columns: 1fr; }
  .portal-ui .area-tiles { grid-template-columns: 1fr; }
}
/* List cards: two columns once the content area reaches about 1360 px (viewport >= 1436 px). */
@media (min-width: 1436px) {
  .portal-ui .user-ticket-list { grid-template-columns: repeat(auto-fit, minmax(min(100%, 560px), 1fr)); align-items: start; }
}
/* Shared list-card actions, tile extras, hidden tiles and notices (web.list_card/choice_tile/notice). */
.portal-ui .user-ticket-card.has-actions:hover { border-color: var(--line); box-shadow: none; }
.portal-ui .user-ticket-title a { color: inherit; text-decoration: none; }
.portal-ui .user-ticket-title a:hover { color: var(--brand); text-decoration: underline; text-underline-offset: 3px; }
.portal-ui .user-ticket-actions {
  grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding-top: 10px; border-top: 1px solid var(--line);
}
.portal-ui .user-ticket-actions :is(.inline-form, form) { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0; }
.portal-ui .user-ticket-actions :is(.button, button) { width: auto; white-space: nowrap; }
.portal-ui :is(.area-tiles, .area-tile, .subpanel, [data-event-participant-group], .atemschutz-participant-row, .atemschutz-participant-section)[hidden] { display: none !important; }
.portal-ui .atemschutz-participant-section > [data-event-participant-group] { margin-top: 12px; }
.portal-ui .atemschutz-participant-section > [data-event-participant-group]:first-of-type { margin-top: 8px; }
.portal-ui .area-tile-text .ticket-info-chips { margin-top: 4px; }
.portal-ui .area-tile input:disabled + .area-tile-box { opacity: .56; cursor: not-allowed; }
/* Fixed (pre-selected, read-only) tile, e.g. the area on /tickets/<id>/edit: selected look, no dimming. */
.portal-ui .area-tile input:disabled:checked + .area-tile-box { opacity: 1; cursor: default; }
.portal-ui .area-tile:has(input:disabled:checked):hover .area-tile-box { box-shadow: inset 0 0 0 1px var(--brand); }
/* Ordered status preview (/maintainer/statuses) reuses the ticket stepper markers. */
.portal-ui .status-order-list .ticket-step-label { color: var(--ink); }
.portal-ui .notice-success {
  margin: 0 0 16px; padding: 12px 16px; border: 1px solid #a6d8b4; border-left: 4px solid #23883d;
  background: #eff9f1; color: #17602b; font-weight: 700;
}
.portal-ui .notice-danger {
  margin: 0 0 16px; padding: 12px 16px; border: 1px solid #f1b8b4; border-left: 4px solid #b42318;
  background: #fff4f3; color: #8f1d14; font-weight: 700;
}
.portal-ui .ticket-form .subpanel > h3 { display: flex; align-items: baseline; gap: 10px; margin: 0; font-size: 1rem; }
.portal-ui .ticket-form .subpanel > h3 small { font-size: .8rem; font-weight: 700; }
.portal-ui .ticket-form .actions { margin-top: 0; align-items: center; }
.portal-ui .ticket-detail-sidebar .ticket-facts small { font-weight: 400; }
.portal-ui .ticket-facts + .ticket-description-text { margin-top: 14px; }
.portal-ui .ticket-detail-venue .ticket-files > summary { color: var(--brand); }
/* Catalog rows: column count matches each row's controls (shared .catalog-item-form). */
.portal-ui #reparaturgegenstaende .catalog-item-form { grid-template-columns: minmax(0, 1fr) max-content max-content max-content; }
.portal-ui #ausruestung .catalog-item-form { grid-template-columns: minmax(0, 1fr) max-content max-content; }
.portal-ui #reparaturorte .catalog-item-form { grid-template-columns: minmax(0, 1fr) max-content max-content; }
.portal-ui :is(#ausruestung, #reparaturgegenstaende, #reparaturorte) .catalog-item-form > input { min-width: 0; width: 100%; }
.portal-ui .form-step[id] { scroll-margin-top: 96px; }
/* Genuinely module-specific content: aPager message preview (same tokens). */
.portal-ui .atemschutz-native-feedback-info { border-radius: var(--ui-radius); padding: 14px 16px; }
.portal-ui .atemschutz-native-feedback-info h2 { font-size: 1rem; }
.portal-ui .atemschutz-native-feedback-info p { font-size: .86rem; }
.portal-ui .atemschutz-feedback-result { border-radius: var(--ui-radius); }
.portal-ui .atemschutz-summary-text { max-width: none; margin: 10px 0 0; border-radius: var(--ui-radius); font-size: .8rem; }
/* Getränke/Speisen: the quantity editor is a genuine four-column input grid. */
.portal-ui .gastro-product-grid {
  display: grid; min-width: 0; overflow: hidden; border: 1px solid var(--line);
  border-radius: var(--ui-radius); background: #fff;
}
.portal-ui :is(.gastro-product-head, .gastro-product-row) {
  display: grid; grid-template-columns: minmax(110px, .7fr) minmax(180px, 1.7fr) minmax(78px, .55fr) minmax(110px, .65fr);
  gap: 12px; align-items: center; min-width: 0; padding: 10px 14px;
}
.portal-ui .gastro-product-head {
  border-bottom: 1px solid var(--line); background: #f7f8fa; color: var(--muted);
  font-size: .74rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
}
.portal-ui .gastro-product-row + .gastro-product-row { border-top: 1px solid var(--line); }
.portal-ui .gastro-product-row > * { min-width: 0; overflow-wrap: anywhere; }
.portal-ui .gastro-product-name { display: grid; gap: 3px; }
.portal-ui .gastro-product-name small { color: var(--muted); }
.portal-ui .gastro-product-chip {
  display: inline-block; width: fit-content; padding: 1px 7px; margin-bottom: 2px;
  border: 1px solid var(--line); border-radius: 999px; font-size: .68rem; font-weight: 700;
  letter-spacing: .02em; text-transform: uppercase; color: var(--muted); background: #f7f8fa;
}
.portal-ui .gastro-product-price { font-weight: 750; }
.portal-ui .gastro-product-quantity { margin: 0; }
.portal-ui .gastro-product-quantity .field-label {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
.portal-ui .gastro-product-quantity input { width: 100%; min-width: 0; text-align: center; }
.portal-ui .gastro-qty-stepper { display: flex; align-items: stretch; gap: 4px; width: 100%; }
.portal-ui .gastro-qty-stepper input { flex: 1 1 auto; min-width: 48px; width: auto; height: auto; }
.portal-ui .gastro-qty-step-col { flex: 0 0 auto; display: grid; grid-template-rows: 1fr 1fr; gap: 3px; }
.portal-ui .gastro-qty-step {
  width: 34px; height: 100%; min-height: 0; padding: 0; border-radius: 4px;
  border: 1px solid var(--line); background: #fff; font-size: 1rem; font-weight: 700; line-height: 1;
}
.portal-ui .gastro-qty-step:active { background: var(--soft); }
.portal-ui .gastro-kiosk-form .gastro-qty-step { width: 44px; font-size: 1.1rem; }
.portal-ui .gastro-product-empty { margin: 10px 0 0; color: var(--muted); }
.portal-ui .gastro-public-page .ticket-action-bar { margin-bottom: 0; }
.portal-ui .gastro-kiosk-form :is(input, select) { min-height: 52px; }
.portal-ui .gastro-kiosk-form .gastro-product-quantity input { min-height: 58px; font-size: 1.15rem; font-weight: 800; }
.portal-ui .gastro-pin-field { display: grid; justify-items: center; gap: 14px; text-align: center; }
.portal-ui .gastro-pin-field .field-label { text-align: center; }
.portal-ui .gastro-pin-display { display: flex; gap: 14px; }
.portal-ui .gastro-pin-dot {
  width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--line); background: #fff;
}
.portal-ui .gastro-pin-dot.is-filled { background: var(--brand); border-color: var(--brand); }
.portal-ui .gastro-pin-keypad {
  display: grid; grid-template-columns: repeat(3, 64px); gap: 10px; justify-content: center;
}
.portal-ui .gastro-pin-key {
  width: 64px; height: 64px; min-height: 0; padding: 0; border-radius: 8px; border: 1px solid var(--line);
  background: #fff; font-size: 1.4rem; font-weight: 700; line-height: 1;
}
.portal-ui .gastro-pin-key:active { background: var(--soft); }
.portal-ui .gastro-pin-key-back { font-size: 1.1rem; color: var(--muted); }

@media (max-width: 720px) {
  .portal-ui #ausruestung .grid-form, .portal-ui #reparaturgegenstaende .grid-form,
  .portal-ui #reparaturorte .grid-form { grid-template-columns: minmax(0, 1fr); }
  .portal-ui #ausruestung .catalog-item-form, .portal-ui #reparaturgegenstaende .catalog-item-form,
  .portal-ui #reparaturorte .catalog-item-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .portal-ui :is(#ausruestung, #reparaturgegenstaende, #reparaturorte) .catalog-item-form > :is(input, .checkline) { grid-column: 1 / -1; min-width: 0; }
  .portal-ui :is(#ausruestung, #reparaturgegenstaende, #reparaturorte) .catalog-item-form > button { width: 100%; min-width: 0; padding-inline: 6px; }
  .portal-ui .user-ticket-actions > :is(.button, button, form) { flex: 1 1 calc(50% - 4px); }
  .portal-ui .user-ticket-actions :is(.button, button) { width: 100%; white-space: normal; }
  .portal-ui .user-ticket-actions > form:has(input:not([type="hidden"])) { flex-basis: 100%; }
  .portal-ui .user-ticket-actions > form:has(input:not([type="hidden"])) button { flex: 0 0 auto; width: auto; }
  .portal-ui .gastro-product-head { display: none; }
  .portal-ui .gastro-product-grid { gap: 10px; border: 0; overflow: visible; background: transparent; }
  .portal-ui .gastro-product-row {
    grid-template-columns: minmax(0, 1fr) max-content; gap: 8px 12px; padding: 14px;
    border: 1px solid var(--line) !important; border-bottom: 3px solid var(--brand) !important;
    border-radius: var(--ui-radius); background: #fff;
  }
  .portal-ui .gastro-product-name { grid-column: 1 / -1; grid-row: 1; }
  .portal-ui .gastro-product-category { grid-column: 1; grid-row: 2; color: var(--muted); }
  .portal-ui .gastro-product-price { grid-column: 2; grid-row: 2; }
  .portal-ui .gastro-product-quantity { grid-column: 1 / -1; grid-row: 3; }
  .portal-ui .gastro-product-quantity .field-label {
    position: static; width: auto; height: auto; margin: 0 0 5px; overflow: visible;
    clip: auto; white-space: normal; border: 0;
  }
}
@media (prefers-reduced-motion: reduce) {
  .portal-ui .venue-hero-slides { grid-template-columns: 1fr 1fr; }
  .portal-ui .venue-slide-1 { grid-area: 1 / 1; }
  .portal-ui .venue-slide-2 { grid-area: 1 / 2; animation: none; opacity: 1; }
  .portal-ui .button, .portal-ui button { transition: none; }
  .portal-ui :is(.kpi-tile, .quick-tile, .user-ticket-card, .view-tab) { transition: none; }
  .portal-ui .maintainer-ticket-card { transition: none; }
  .portal-ui :is(.area-tile-box, .file-drop) { transition: none; }
}
@media print {
  body.portal-ui { background: #fff; color: #000; font-size: 11pt; }
  .portal-ui main { width: 100%; }
  .portal-ui .panel, .portal-ui .auth-card, .portal-ui .ticket-row {
    box-shadow: none; border-color: #000;
  }
  .portal-ui header, .portal-ui nav, .portal-ui .actions,
  .portal-ui .button, .portal-ui button, .portal-ui .venue-hero { display: none !important; }
  .portal-ui :is(.kpi-strip, .quick-tiles, .view-tabs, .page-header-meta) { display: none !important; }
  .portal-ui .user-ticket-card { border-color: #000; break-inside: avoid; }
  .portal-ui :is(.ticket-action-bar, .required-note, .file-drop-text) { display: none !important; }
  .portal-ui .area-tile:not(:has(input:checked)) { display: none !important; }
  .portal-ui :is(.form-step, .area-tile-box, .file-drop) { box-shadow: none; border-color: #000; break-inside: avoid; }
  .portal-ui .chat-composer { display: none !important; }
}
/* ---- Final QA: shared layout rhythm, field grid, in-card action rows (all modules) ---- */
/* Shared section rhythm: consecutive top-level cards/lists/forms are 18 px apart like the
   new-ticket steps (margins collapse, so larger existing gaps such as the page header stay). */
.portal-ui main > .panel { margin-bottom: 18px; }
.portal-ui main > :is(section, form, details, .panel, .user-ticket-list, .stack, .list-section) + :is(section, form, details, .panel, .user-ticket-list, .stack, .list-section, .form-step) { margin-top: 18px; }
.portal-ui main > :is(.form-step, .panel, .list-section, .data-table-card) + :is(div, p) { margin-top: 18px; }
/* Two-column field grid (web.form_grid); one column on phones. */
.portal-ui .form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); gap: 14px 16px; align-items: start; min-width: 0; width: 100%; }
.portal-ui .form-grid > * { min-width: 0; }
.portal-ui .form-grid > :is(.form-grid-full, .area-tiles, .field-hint, .file-drop, p, .notice, .data-table-wrap) { grid-column: 1 / -1; }
.portal-ui .form-grid label:has(> textarea) { grid-column: 1 / -1; }
/* Form steps: single fields (label, or a plain wrapper around one label) form a raster;
   textareas, file choice, tile groups, hints, tables, sub-panels and actions span the row. */
.portal-ui :is(.form-step, .form-step > form:is(:not([class]), .stack), .form-step > .subpanel) {
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); align-items: start;
}
.portal-ui :is(.form-step, .form-step > form:is(:not([class]), .stack), .form-step > .subpanel) > * { grid-column: 1 / -1; min-width: 0; }
.portal-ui :is(.form-step, .form-step > form:is(:not([class]), .stack), .form-step > .subpanel) > :is(label:not([class]), div:not([class]):has(> label:only-child)):not(:has(textarea, .file-drop, fieldset, .area-tiles)) { grid-column: auto; }
/* A single input that spans a whole row (form_grid full item, team search) stays at two raster columns. */
.portal-ui :is(.form-grid-full, .team-filter-form, .team-location-body) > label > :is(input:not([type="checkbox"]):not([type="radio"]):not([type="color"]):not([type="file"]), select) { max-width: 576px; }
.portal-ui .team-location-body select { max-width: 576px; }
/* Team search: field plus compact buttons in one row (the generic step-form grid made them full-width bars). */
@media (min-width: 761px) {
  .portal-ui .form-step form.team-filter-form:not(.inline-form):not(.location-switcher) { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px; }
  .portal-ui .form-step form.team-filter-form > label { flex: 0 1 576px; min-width: 0; }
}
.portal-ui .form-step :is(label:not([class]), div:not([class]) > label:only-child) > :is(input:not([type="checkbox"]):not([type="radio"]):not([type="color"]), select) { width: 100%; min-width: 0; }
/* Running text keeps a readable line length on wide screens. */
.portal-ui :is(.notice, .field-hint, .list-section-hint, .form-step > p, .detail-card > p, .ticket-entry-text, .timeline-note, .chat-text) { max-width: 75ch; }
.portal-ui .form-grid :is(input:not([type="checkbox"]):not([type="radio"]):not([type="color"]), select) { width: 100%; height: auto; min-height: 46px; flex: none; }
.portal-ui .form-grid input[type="color"] { width: 100%; min-height: 46px; padding: 4px; }
.portal-ui .form-grid .area-tiles { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
/* In-card action row (web.row_actions): right-aligned like the form bar, never sticky. */
.portal-ui .form-row-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; margin: 0; padding: 0; border: 0; box-shadow: none; position: static; }
.portal-ui .date-quick-picks { display: inline-flex; gap: 8px; margin-right: auto; }
.portal-ui .form-row-actions-start { justify-content: flex-start; }
.portal-ui .form-row-actions-split { justify-content: space-between; }
.portal-ui .form-row-actions > form { margin: 0; }
.portal-ui .form-row-actions select { width: auto; min-width: 200px; }
.portal-ui .narrow-content { width: 100%; min-width: 0; }
.portal-ui :is(.management-team-page, .funk-settings-form) .ticket-action-bar { position: static; z-index: auto; margin: 0; padding: 0; background: transparent; border: 0; box-shadow: none; }
.portal-ui .team-location-grid { grid-template-columns: minmax(0, 1fr); }
.portal-ui .team-location { min-width: 0; border: 1px solid var(--line); border-radius: var(--ui-radius); background: #fff; }
.portal-ui .team-location > summary { cursor: pointer; padding: 12px 16px; font-weight: 700; }
.portal-ui .team-location > summary:focus-visible, .portal-ui .management-settings > summary:focus-visible { outline: 3px solid var(--brand); outline-offset: 2px; }
.portal-ui .team-location-summary { float: right; margin-left: 10px; color: var(--muted); font-size: .82rem; font-weight: 400; }
.portal-ui .team-location-body { padding: 0 16px 16px; min-width: 0; }
.portal-ui .management-settings { min-width: 0; width: 100%; }
.portal-ui .management-settings > summary { cursor: pointer; font-weight: 700; }
.portal-ui .management-settings nav { display: flex; flex-wrap: wrap; gap: 6px 18px; padding-top: 12px; }
.portal-ui .management-settings nav a { overflow-wrap: anywhere; }
.portal-ui :is(#ausruestung, #reparaturorte) .catalog-item-form { grid-template-columns: minmax(0, 1fr) auto; }
.portal-ui #reparaturgegenstaende .catalog-item-form { grid-template-columns: minmax(0, 1fr) auto auto; }
.portal-ui .catalog-item-form > .form-row-actions { min-width: 0; }
.portal-ui .catalog-item-form > .form-row-actions button { padding-inline: 10px; }
.portal-ui .form-step > form, .portal-ui .form-step form:not(.inline-form):not(.location-switcher) { display: grid; gap: 14px; min-width: 0; }
/* Titled plain list (web.list_section): heading + cards, no surrounding frame. */
.portal-ui .list-section { display: grid; gap: 12px; min-width: 0; }
.portal-ui .list-section-head { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end; gap: 8px 16px; }
.portal-ui .list-section-head h2 { margin: 0; font-size: 1.12rem; }
.portal-ui .list-section-head .eyebrow { margin: 0 0 4px; }
.portal-ui .list-section-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.portal-ui .list-section-hint { margin: -4px 0 0; }
.portal-ui .list-section > .panel { margin: 0; }
.portal-ui .data-table-head { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end; gap: 8px 16px; margin-bottom: 12px; }
.portal-ui .data-table-head h2 { margin: 0; }
.portal-ui .data-table-actions { display: flex; flex-wrap: wrap; gap: 8px; }
/* Filter card above a list (Getränke Buchungen/Salden, Audit-Log). */
.portal-ui .filter-panel { display: grid; gap: 14px; padding: 16px 18px; border-bottom-width: 1px; border-bottom-color: var(--line); }
/* Location picker (Getränke admin, module settings): compact field + small button. */
.portal-ui .location-switcher { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; max-width: 460px; margin: 0 0 14px; }
.portal-ui .location-switcher > label { flex: 1 1 220px; margin: 0; }
.portal-ui .location-switcher select { width: 100%; }
/* Collapsed edit form inside a list card (Artikel, Personen-Zuständigkeiten). */
.portal-ui .list-card-edit { display: contents; }
.portal-ui .list-card-edit > summary { list-style: none; cursor: pointer; display: inline-flex; align-items: center; }
.portal-ui .list-card-edit > summary::-webkit-details-marker { display: none; }
.portal-ui .list-card-edit[open] { display: block; flex: 1 1 100%; order: 10; }
.portal-ui .list-card-edit[open] > summary { margin-bottom: 12px; border-color: var(--brand); color: var(--brand); }
.portal-ui .list-card-edit > :not(summary) { display: grid; gap: 12px; padding: 14px; border: 1px solid var(--line); border-radius: var(--ui-radius); background: #fbfcfd; }
.portal-ui .list-card-edit form { display: grid; gap: 12px; }
.portal-ui .user-ticket-actions .gastro-booking-details { flex: 1 1 100%; order: 10; }
/* Sub-headings and compact add forms inside a step (Atemschutz-Katalog, Getränke-Standorte). */
.portal-ui .form-subtitle { margin: 0 0 8px; color: var(--muted); font-size: .74rem; font-weight: 700; letter-spacing: .13em; text-transform: uppercase; }
.portal-ui .form-subsection { display: grid; gap: 10px; padding-top: 14px; border-top: 1px solid var(--line); }
.portal-ui .form-subsection:first-child { padding-top: 0; border-top: 0; }
.portal-ui .catalog-add-form { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: end; gap: 10px 12px; }
.portal-ui .switch-inline { display: inline-flex; align-items: center; gap: 8px; min-height: 46px; font-weight: 600; letter-spacing: normal; }
.portal-ui .switch-inline input { width: 18px; height: 18px; margin: 0; flex: 0 0 auto; }
.portal-ui .filter-empty { margin: 0; color: var(--muted); }
.portal-ui .tag-filter-toolbar { display: flex; flex-wrap: wrap; align-items: end; gap: 10px 16px; margin-bottom: 14px; }
.portal-ui .tag-filter-toolbar > label { flex: 1 1 260px; }
.portal-ui .tag-filter-count { margin: 0 0 11px; color: var(--muted); font-weight: 650; white-space: nowrap; }
.portal-ui .admin-logo-preview { display: block; max-width: 320px; max-height: 100px; width: auto; height: auto; }
.portal-ui .strecke-search { display: block; margin-bottom: 14px; }
.portal-ui .atemschutz-participant-section { margin-bottom: 10px; }
.portal-ui .atemschutz-participant-section summary { cursor: pointer; list-style: none; padding: 4px 0; }
.portal-ui .atemschutz-participant-section summary::-webkit-details-marker { display: none; }
.portal-ui .atemschutz-participant-section summary h3 { display: inline-flex; align-items: center; gap: 8px; margin: 0; }
.portal-ui .atemschutz-participant-section summary h3::before { content: "▸"; color: var(--muted); font-size: .8rem; }
.portal-ui .atemschutz-participant-section[open] summary h3::before { content: "▾"; }
.portal-ui .atemschutz-participant-rows { display: grid; gap: 4px; }
.portal-ui .atemschutz-participant-row {
  display: grid; grid-template-columns: auto minmax(0, 1.4fr) minmax(0, 1fr) auto; align-items: center; gap: 10px;
  padding: 6px 10px; border: 1px solid var(--line); border-radius: 4px; background: #fff; cursor: pointer;
}
.portal-ui .atemschutz-participant-row input { margin: 0; accent-color: var(--brand); }
.portal-ui .atemschutz-participant-row.is-selected, .portal-ui .atemschutz-participant-row:has(input:checked) { border-color: var(--brand); box-shadow: inset 0 0 0 1px var(--brand); }
.portal-ui .atemschutz-participant-name { font-weight: 650; overflow-wrap: anywhere; }
.portal-ui .atemschutz-participant-group { color: var(--muted); font-size: .84rem; overflow-wrap: anywhere; }
@media (max-width: 640px) {
  .portal-ui .atemschutz-participant-row { grid-template-columns: auto 1fr; }
  .portal-ui .atemschutz-participant-group, .portal-ui .atemschutz-participant-row .ticket-info-chips { grid-column: 2; }
}
.portal-ui .atemschutz-strecke-columns { display: grid; grid-template-columns: minmax(280px, 0.8fr) minmax(0, 1.2fr); gap: 20px; align-items: start; }
.portal-ui .atemschutz-strecke-columns > .form-step { margin: 0; }
@media (max-width: 900px) {
  .portal-ui .atemschutz-strecke-columns { grid-template-columns: minmax(0, 1fr); }
}
.portal-ui .schedule-list { display: grid; gap: 10px; margin-bottom: 10px; }
.portal-ui .schedule-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; align-items: end; }
.portal-ui .schedule-row-remove { flex: 0 0 auto; }
@media (max-width: 560px) {
  .portal-ui .schedule-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .portal-ui .schedule-row-remove { grid-column: 1 / -1; width: 100%; }
}

/* Washing board: person groups and in-card action row. */
.portal-ui .wash-person-group { display: grid; gap: 8px; }
.portal-ui .wash-group-toggle { display: flex; align-items: center; gap: 10px; padding-top: 10px; border-top: 1px solid var(--line); font-weight: 700; letter-spacing: normal; }
.portal-ui .wash-group-toggle input { width: 18px; height: 18px; margin: 0; }
.portal-ui .wash-group-toggle small { color: var(--muted); font-weight: 400; }
.portal-ui .wash-cycle { display: grid; gap: 12px; }
.portal-ui .wash-cycle > :is(h2, p) { margin: 0; }
/* Four KPI tiles share one row instead of wrapping a single tile (Getränke overview). */
.portal-ui .kpi-strip:has(> :nth-child(4):last-child) { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (min-width: 721px) {
  .portal-ui .kpi-strip:has(> :nth-child(5)) { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
}
@media screen {
  .portal-ui .wash-print-header { display: none; }
}
@media (max-width: 720px) {
  .portal-ui .form-grid { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .catalog-add-form { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .form-row-actions { justify-content: stretch; }
  .portal-ui .form-row-actions > :is(.button, button, form) { flex: 1 1 calc(50% - 4px); }
  .portal-ui .form-row-actions > form > :is(.button, button) { width: 100%; }
  .portal-ui .form-row-actions-split > span { flex-basis: 100%; }
  .portal-ui .form-row-actions select { flex: 1 1 100%; width: 100%; min-width: 0; }
  .portal-ui :is(#ausruestung, #reparaturgegenstaende, #reparaturorte) .catalog-item-form > :is(input, .switch-inline) { grid-column: 1 / -1; }
  .portal-ui :is(#ausruestung, #reparaturgegenstaende, #reparaturorte) .catalog-item-form > .form-row-actions { grid-column: 1 / -1; }
  .portal-ui .catalog-item-form > .form-row-actions > button { flex: 1 1 calc(50% - 4px); }
  .portal-ui .management-home .management-module-actions .button { flex: 1 1 100%; width: 100%; }
  .portal-ui .team-location-summary { float: none; display: block; margin-left: 0; }
  .portal-ui :is(.management-team-page, .funk-settings-form) .ticket-action-bar { position: static; bottom: auto; z-index: auto; padding: 0; border: 0; flex-wrap: wrap; }
  .portal-ui .wash-move-actions > [data-print-page] { flex-basis: 100%; }
  .portal-ui .location-switcher { max-width: none; }
  .portal-ui .list-section-actions, .portal-ui .data-table-actions { width: 100%; }
  .portal-ui .kpi-strip:has(> :nth-child(4):last-child) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .portal-ui .user-ticket-actions > .list-card-edit > summary { flex: 1 1 calc(33.333% - 6px); justify-content: center; min-width: 0; }
  .portal-ui .user-ticket-actions:has(> .list-card-edit) > form { flex: 1 1 calc(33.333% - 6px); margin: 0; }
}

/* Admin page-type layouts: no changes to shared ticket/detail components. */
.portal-ui .admin-module-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 440px), 1fr)); gap: 14px; }
.portal-ui .admin-module-grid .user-ticket-card { align-content: start; min-width: 0; }
.portal-ui .admin-module-grid .user-ticket-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.portal-ui .admin-module-grid .user-ticket-actions .button { white-space: normal; text-align: center; }
.portal-ui .admin-form-column { width: 100%; min-width: 0; display: grid; gap: 18px; }
.portal-ui .admin-form-column .form-step, .portal-ui .admin-form-column .panel { min-width: 0; margin: 0; }
.portal-ui main > .admin-form-column + :is(section, form, details, div) { margin-top: 18px; }
.portal-ui .admin-person-top > .ticket-detail-venue { display: grid; grid-template-columns: minmax(0, 1fr) minmax(340px, 400px); gap: 18px; align-items: start; }
.portal-ui .admin-person-top .ticket-detail-primary, .portal-ui .admin-person-top .ticket-detail-sidebar { display: contents; }
.portal-ui .admin-person-top .ticket-detail-primary > .form-step:first-child { grid-column: 1; grid-row: 1; }
.portal-ui .admin-person-top .ticket-detail-sidebar > .panel { grid-column: 2; grid-row: 1; min-width: 0; }
.portal-ui .admin-person-top .form-step:nth-child(2) { grid-column: 1 / -1; grid-row: 2; }
.portal-ui .admin-person-top .ticket-detail-primary > .panel { grid-column: 1 / -1; grid-row: 3; }
.portal-ui .admin-area-disclosure { border: 1px solid var(--line); background: #fff; border-bottom: 3px solid var(--brand); min-width: 0; }
.portal-ui .admin-area-disclosure > summary, .portal-ui .admin-person-disclosure > summary { padding: 14px 18px; cursor: pointer; display: flex; flex-wrap: wrap; gap: 6px 18px; align-items: center; }
.portal-ui .admin-area-disclosure > summary span { color: var(--muted); font-size: .85rem; }
.portal-ui .admin-area-disclosure > .list-section { padding: 16px; }
.portal-ui .admin-person-disclosure { border: 1px solid var(--line); min-width: 0; background: #fff; }
.portal-ui .admin-person-disclosure > .user-ticket-card { border: 0; border-top: 1px solid var(--line); margin: 0; }
.portal-ui .admin-area-disclosure > summary:focus-visible, .portal-ui .admin-person-disclosure > summary:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.portal-ui .admin-rule-table { min-width: 760px; table-layout: auto; }
.portal-ui .admin-rule-table :is(th, td) { overflow-wrap: normal; white-space: nowrap; min-width: 90px; }
.portal-ui .admin-rule-table :is(th, td):nth-child(3) { min-width: 180px; }
.portal-ui .admin-rule-table :is(th, td):last-child { min-width: 110px; }
.portal-ui .admin-rule-table button { white-space: nowrap; width: auto; }
.portal-ui .admin-stats-table { min-width: 740px; table-layout: auto; }
.portal-ui .admin-stats-table :is(th, td) { overflow-wrap: normal; white-space: nowrap; min-width: 85px; }
.portal-ui .admin-stats-table :is(th, td):first-child { min-width: 150px; }
.portal-ui .admin-stats-panels { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; }
.portal-ui .admin-stats-panels > .panel { min-width: 0; margin: 0; }
.portal-ui .admin-home .user-ticket-actions { gap: 8px; }
.portal-ui .admin-home .user-ticket-actions .button { max-width: 100%; white-space: normal; text-align: left; }
.portal-ui .admin-home #alamos-sync .form-row-actions { justify-content: flex-start; }
.portal-ui .admin-module-nav { flex-wrap: nowrap; overflow-x: auto; max-width: 100%; }
.portal-ui .admin-module-nav .view-tab { flex: 0 0 auto; white-space: nowrap; }
@media (max-width: 900px) {
 .portal-ui .admin-stats-panels { grid-template-columns: minmax(0, 1fr); }
 .portal-ui .admin-person-top > .ticket-detail-venue { grid-template-columns: minmax(0, 1fr); }
 .portal-ui .admin-person-top .ticket-detail-primary > .form-step:first-child { grid-column: 1; grid-row: 1; }
 .portal-ui .admin-person-top .ticket-detail-sidebar > .panel { grid-column: 1; grid-row: 2; }
 .portal-ui .admin-person-top .form-step:nth-child(2) { grid-column: 1; grid-row: 3; }
 .portal-ui .admin-person-top .ticket-detail-primary > .panel { grid-column: 1; grid-row: 4; }
}
@media (max-width: 420px) {
 .portal-ui .admin-module-grid { grid-template-columns: minmax(0, 1fr); }
 .portal-ui .admin-module-grid .user-ticket-actions { grid-template-columns: minmax(0, 1fr); }
 .portal-ui .admin-area-disclosure > summary, .portal-ui .admin-person-disclosure > summary { padding: 12px; }
 .portal-ui .admin-home #alamos-sync .form-row-actions > * { flex: 1 1 100%; }
}

/* Getränke-only composition: keep shared components untouched. */
.portal-ui .gastro-admin-nav { position: relative; min-width: 0; margin-bottom: 18px; }
/* Six tabs fit: wrap instead of a horizontal scroll container (no scrollbar). */
.portal-ui .gastro-admin-nav .view-tabs { flex-wrap: wrap; overflow: visible; padding-right: 0; }
.portal-ui .gastro-admin-nav .view-tab { flex: 0 0 auto; white-space: nowrap; }
.portal-ui .gastro-admin-content { min-width: 0; }
.portal-ui .gastro-admin-content > :is(section, form, details, .panel, .user-ticket-list, .stack, .list-section) + :is(section, form, details, .panel, .user-ticket-list, .stack, .list-section, .form-step) { margin-top: 18px; }
.portal-ui .gastro-admin-content.gastro-admin-settings .ticket-action-bar { position: static; box-shadow: none; padding: 0; border: 0; }
.portal-ui .gastro-overview-lower { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); align-items: start; gap: 20px; }
.portal-ui .gastro-overview-lower > * { min-width: 0; }
.portal-ui .gastro-admin-entries .user-ticket-list { grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: start; }
.portal-ui .gastro-admin-entries .user-ticket-card { min-width: 0; }
.portal-ui .gastro-secondary-actions { flex: 1 1 100%; min-width: 0; }
.portal-ui .gastro-secondary-actions > summary { cursor: pointer; color: var(--brand); font-weight: 700; padding: 7px 0; }
.portal-ui .gastro-secondary-actions[open] { display: flex; flex-wrap: wrap; gap: 8px; }
.portal-ui .gastro-secondary-actions[open] > summary { flex-basis: 100%; }
.portal-ui .gastro-admin-entries .gastro-booking-details { flex: 1 1 100%; }
.portal-ui .gastro-admin-entries .gastro-booking-details .inline-form { margin-top: 12px; }
.portal-ui .gastro-admin-settlements .data-table-wrap, .portal-ui .gastro-admin-products .data-table-wrap { max-width: 100%; overflow-x: auto; }
.portal-ui .gastro-admin-settlements .data-table, .portal-ui .gastro-admin-products .data-table { min-width: 720px; }
/* Artikel: one table per present type, with a sub-heading row per self-defined category
   (rows without a category just continue, grouped under a heading-less tbody). Each type
   is its own <table>, so columns must get fixed widths — otherwise every table sizes its
   columns independently from its own content and e.g. the price column drifts between
   Getränke and Speisen. Percentage widths (not px) so the four columns stay evenly spread
   whatever the available width is; only the Artikel-Tabellen get this (not Preishistorie,
   which needs its name column to show the full text). */
.portal-ui [data-article-table] { table-layout: fixed; }
.portal-ui [data-article-table] th, .portal-ui [data-article-table] td { width: 25%; }
.portal-ui .gastro-admin-products .data-table-subhead th { background: #f7f8fa; text-align: left; font-weight: 600; font-size: .82rem; color: var(--muted); padding: 8px 12px; }
.portal-ui .list-section-count { margin: 0 0 10px; font-weight: 700; }
/* Article hint runs on its own line below the name (same as Salden/Buchungen), so every
   type's table looks the same whether or not individual articles carry a hint. */
.portal-ui .gastro-admin-products .data-table td small { display: block; color: var(--muted); font-size: .82rem; }
.portal-ui .gastro-admin-settlements .data-table td, .portal-ui .gastro-admin-products .data-table td { min-width: 90px; overflow-wrap: normal; }
.portal-ui .gastro-admin-settlements .data-table th, .portal-ui .gastro-admin-products .data-table th { white-space: nowrap; }
.portal-ui .gastro-product-group > h3 { padding: 9px 14px; margin: 0; font-size: .85rem; background: #f7f8fa; }
.portal-ui .gastro-product-group + .gastro-product-group { border-top: 1px solid var(--line); margin-top: 6px; }
.portal-ui .gastro-product-group .gastro-product-row { grid-template-columns: minmax(0, 1fr) 95px 120px; }
.portal-ui .gastro-product-subgroup { padding: 10px 14px 2px; margin: 0; font-size: .78rem; font-weight: 600; color: var(--muted); }
.portal-ui .gastro-product-subgroup:first-of-type { padding-top: 6px; }
.portal-ui .gastro-product-selection { margin: 8px 0 0; font-size: .85rem; color: var(--muted); }
.portal-ui .gastro-recent-people { display: flex; flex-wrap: wrap; gap: 8px; align-content: flex-start; }
.portal-ui .gastro-recent-people .field-label { flex-basis: 100%; }
.portal-ui .gastro-recent-person {
  display: grid; gap: 2px; padding: 10px 14px; min-width: 128px; min-height: 52px;
  border: 1px solid var(--line); border-radius: 4px; background: #fff; text-align: left; cursor: pointer;
}
.portal-ui .gastro-recent-person small { color: var(--muted); }
.portal-ui .gastro-recent-person:hover { border-color: var(--brand); }
.portal-ui .gastro-recent-person.is-selected { border-color: var(--brand); border-width: 2px; background: var(--soft); }
.portal-ui .gastro-public-balance { margin: 0 0 14px; color: var(--muted); font-weight: 650; }
.portal-ui .gastro-station-picker { display: grid; gap: 18px; grid-template-columns: minmax(0, 1fr); }
@media (min-width: 640px) {
  .portal-ui .gastro-station-picker { grid-template-columns: minmax(0, .9fr) minmax(0, 1.3fr); align-items: start; }
}
@media (min-width: 721px) {
 .portal-ui .gastro-product-group { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr)); }
 .portal-ui .gastro-product-group .gastro-product-row { grid-template-columns: minmax(0, 1fr) max-content 120px; }
 .portal-ui .gastro-product-group > h3 { grid-column: 1 / -1; }
 .portal-ui .gastro-product-subgroup { grid-column: 1 / -1; }
 .portal-ui .gastro-product-group .gastro-product-row { box-shadow: inset -1px 0 0 var(--line); border-top: 1px solid var(--line); }
}
@media (max-width: 720px) {
 .portal-ui .gastro-admin-content:is(.gastro-admin-products, .gastro-admin-entries) .user-ticket-list { grid-template-columns: minmax(0, 1fr); }
 .portal-ui .gastro-admin-products .user-ticket-card { padding: 10px 12px; gap: 4px; }
 .portal-ui .gastro-admin-products .user-ticket-actions { padding-top: 5px; flex-wrap: wrap; }
 .portal-ui .gastro-admin-products .gastro-secondary-actions { flex: 1 1 45%; }
 .portal-ui .gastro-admin-products .user-ticket-actions > .list-card-edit > summary { flex: 1 1 45%; }
 .portal-ui .gastro-admin-products .user-ticket-side { gap: 6px; }
 .portal-ui .gastro-overview-lower { grid-template-columns: minmax(0, 1fr); }
 .portal-ui .gastro-product-grid { gap: 0; border: 1px solid var(--line); background: #fff; }
 .portal-ui .gastro-product-group > h3 { position: sticky; top: 0; z-index: 1; }
 .portal-ui .gastro-product-group .gastro-product-row { grid-template-columns: minmax(0, 1fr) 150px; grid-template-rows: auto auto; gap: 3px 8px; padding: 8px 10px; border: 0 !important; border-bottom: 1px solid var(--line) !important; box-shadow: none; }
 .portal-ui .gastro-product-name { grid-column: 1; grid-row: 1 / 3; }
 .portal-ui .gastro-product-name small { font-size: .76rem; line-height: 1.25; }
 .portal-ui .gastro-product-price { grid-column: 2; grid-row: 1; text-align: center; font-size: .84rem; }
 .portal-ui .gastro-product-quantity { grid-column: 2; grid-row: 2; display: flex; align-items: center; gap: 4px; }
 .portal-ui .gastro-product-quantity .field-label { position: static; width: auto; height: auto; padding: 0; margin: 0; overflow: visible; clip: auto; white-space: nowrap; border: 0; font-size: .72rem; }
 .portal-ui .gastro-product-quantity input { min-height: 46px; width: 48px; }
 .portal-ui .gastro-kiosk-form .gastro-product-quantity input { min-height: 52px; }
 .portal-ui .gastro-qty-step { width: 30px; height: 30px; }
 .portal-ui .gastro-kiosk-form .gastro-qty-step { width: 38px; height: 38px; }
 .portal-ui .gastro-admin-settings .ticket-action-bar { display: flex; flex-direction: column-reverse; align-items: stretch; }
 .portal-ui .gastro-admin-settings .ticket-action-bar button.primary { width: 100%; }
 .portal-ui .gastro-admin-settings .ticket-action-bar a.button { border: 0; box-shadow: none; text-align: center; }
 .portal-ui .gastro-admin-balances .user-ticket-actions > form:has(input:not([type=hidden])) { flex-basis: 100%; }
 .portal-ui .kpi-strip:has(> :nth-child(4):last-child) .kpi-tile { padding: 12px 12px; }
 .portal-ui .kpi-strip:has(> :nth-child(4):last-child) .kpi-label { letter-spacing: .04em; overflow-wrap: anywhere; }
}

/* Melder nicht ausgelöst: address search above the location map. */
.portal-ui .pager-address-search { display: grid; gap: 6px; min-width: 0; }
.portal-ui .pager-address-search-row { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }
.portal-ui .pager-address-search-row input { flex: 1 1 240px; min-width: 0; }
.portal-ui .pager-address-search-row button { flex: 0 0 auto; }
.portal-ui .pager-address-results { list-style: none; margin: 0; padding: 0; display: grid; border: 1px solid var(--line); border-radius: var(--ui-radius); background: #fff; overflow: hidden; }
.portal-ui .pager-address-results[hidden] { display: none; }
.portal-ui .pager-address-results li + li { border-top: 1px solid var(--line); }
.portal-ui .pager-address-results li button.pager-address-result { width: 100%; min-height: 42px; padding: 9px 12px; border: 0; border-radius: 0; background: transparent; color: inherit; text-align: left; text-transform: none; letter-spacing: 0; font-weight: 600; white-space: normal; overflow-wrap: anywhere; box-shadow: none; justify-content: flex-start; }
.portal-ui .pager-address-results li button.pager-address-result:is(:hover, :focus-visible) { background: #f7f8fa; color: var(--brand); }

/* Mein Verzehr: last bookings left, new booking right (as before), balance full width below. */
.portal-ui .gastro-user-columns { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 20px; align-items: start; }
.portal-ui .gastro-user-columns > * { min-width: 0; margin: 0; }
.portal-ui .gastro-user-columns .user-ticket-list { grid-template-columns: minmax(0, 1fr); }
.portal-ui .gastro-user-history .list-group { margin-bottom: 8px; }
.portal-ui .gastro-user-history .list-group:last-child { margin-bottom: 0; }
.portal-ui .gastro-user-entry .ticket-action-bar { position: static; }
/* Compact payment card: short balance, transfer details, QR. */
.portal-ui .gastro-user-payment { display: grid; grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr); gap: 20px; align-items: stretch; }
.portal-ui .gastro-user-payment > .panel, .portal-ui .gastro-user-correction > .panel { margin: 0; height: 100%; }
.portal-ui .gastro-user-payment > *, .portal-ui .gastro-user-correction { min-width: 0; }
.portal-ui .gastro-user-correction > .panel { display: flex; flex-direction: column; }
.portal-ui .gastro-user-correction .form-row-actions { margin-top: auto; padding-top: 16px; }
@media (max-width: 1000px) {
  .portal-ui .gastro-user-payment { grid-template-columns: minmax(0, 1fr); }
}

.portal-ui .gastro-payment-body { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 24px; align-items: start; }
.portal-ui .gastro-payment-body:has(.gastro-payment-qr) { grid-template-columns: 150px minmax(0, 1fr) 132px; }
.portal-ui .gastro-payment-body > div { min-width: 0; }
.portal-ui .gastro-payment-transfer { display: grid; gap: 14px; }
.portal-ui .gastro-payment-bank { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr) minmax(0, .8fr); gap: 16px; }
.portal-ui .gastro-payment-body .ticket-facts { display: block; margin: 0; }
.portal-ui .gastro-payment-body .ticket-facts dt { margin: 0 0 5px; }
.portal-ui .gastro-payment-body .ticket-facts dd { margin: 0; overflow-wrap: anywhere; }
.portal-ui .gastro-payment-summary dd { font-size: 2rem; font-weight: 800; line-height: 1.2; }
@media (max-width: 1100px) {
  .portal-ui .gastro-payment-bank { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .portal-ui .gastro-payment-bank > .ticket-facts:first-child { grid-column: 1 / -1; }
}
@media (max-width: 640px) {
  .portal-ui .gastro-payment-body, .portal-ui .gastro-payment-body:has(.gastro-payment-qr) { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  .portal-ui .gastro-payment-bank { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .gastro-payment-qr { justify-self: start; }
}
.portal-ui .gastro-payment-qr { display: grid; gap: 6px; justify-items: center; margin: 0; }
.portal-ui .gastro-payment-qr figcaption { color: var(--muted); font-size: .82rem; font-weight: 700; }
@media (max-width: 900px) {
  .portal-ui .gastro-user-columns { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .gastro-user-entry { order: -1; }
}

/* Equal-height booking/history panels; the history scrolls within its card. */
.portal-ui .gastro-user-history > .panel { display: flex; flex-direction: column; gap: 14px; margin: 0; overflow: hidden; }
.portal-ui .gastro-user-history > .panel > h2 { margin: 0; }
.portal-ui .gastro-history-scroll { min-height: 0; overflow-y: auto; scrollbar-gutter: stable; flex: 1; padding-right: 4px; }
.portal-ui .gastro-receipt-period { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr) auto; gap: 10px; align-items: end; }
.portal-ui .gastro-receipt-period label { min-width: 0; }
.portal-ui .gastro-receipt-period input { min-width: 0; width: 100%; }
.portal-ui .gastro-user-entry > .panel { margin: 0; }
@media (min-width: 901px) {
  .portal-ui .gastro-user-history { position: relative; align-self: stretch; }
  .portal-ui .gastro-user-history > .panel { position: absolute; inset: 0; }
}
@media (max-width: 900px) {
  .portal-ui .gastro-user-history > .panel { height: 520px; }
  .portal-ui .gastro-receipt-period { grid-template-columns: minmax(0,1fr) minmax(0,1fr); }
  .portal-ui .gastro-receipt-period button { grid-column: 1 / -1; }
}

.portal-ui .gastro-user-columns { margin-bottom: 18px; }

/* Small dialogs: fields directly in the dialog instead of nested cards. */
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-section { display: grid; gap: 12px; padding: 0 0 18px; margin: 0 0 18px; border-bottom: 1px solid var(--line, #e5e7eb); }
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-section h3 { margin: 0; font-size: 1rem; }
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-section .ticket-facts { margin: 0; }
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-form { display: grid; gap: 14px; margin: 0; padding: 0; border: 0; box-shadow: none; background: none; }
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-section .dialog-flat-form .form-row-actions { border: 0; padding-top: 0; }
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-form .form-row-actions { margin: 4px 0 0; }
.portal-ui :is(.wash-dialog, .gastro-flat-page) .dialog-flat-note { margin: 0 0 16px; color: var(--muted); }

.portal-ui .gastro-user-entry .ticket-action-bar { margin-top: 16px; }

/* Getränkewart overview: work place (to-do + quick start), compact tables. */
.portal-ui .gastro-admin-subtabs { margin: -6px 0 18px; }
.portal-ui .gastro-overview-top { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 20px; align-items: stretch; margin-bottom: 18px; }
.portal-ui .gastro-overview-top > * { min-width: 0; margin: 0; }
.portal-ui .gastro-overview-top .quick-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); align-content: start; margin: 0; }
.portal-ui .gastro-overview-todo > .panel { height: 100%; margin: 0; }
.portal-ui .gastro-todo-list { list-style: none; margin: 0; padding: 0; display: grid; }
.portal-ui .gastro-todo-item { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 16px; padding: 12px 0; border-top: 1px solid var(--line); }
.portal-ui .gastro-todo-item:first-child { border-top: 0; padding-top: 4px; }
.portal-ui .gastro-todo-text { display: grid; gap: 2px; min-width: 0; flex: 1 1 260px; color: var(--muted); }
.portal-ui .gastro-todo-text strong { color: var(--text, #111); }
.portal-ui .gastro-todo-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.portal-ui .gastro-todo-actions .inline-form { margin: 0; }
.portal-ui .gastro-todo-done { margin: 0; color: var(--muted); }
.portal-ui .gastro-overview-lower > .panel { margin: 0; }
@media (max-width: 1000px) {
  .portal-ui .gastro-overview-top { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 520px) {
  .portal-ui .gastro-overview-top .quick-tiles { grid-template-columns: minmax(0, 1fr); }
}
.portal-ui .gastro-overview-lower .data-table td { padding-top: 10px; padding-bottom: 10px; }
.portal-ui .gastro-overview-lower .data-table td:first-child, .portal-ui .gastro-overview-lower .data-table td:nth-child(4) { white-space: nowrap; }
@media (max-width: 720px) {
  .portal-ui .gastro-admin-nav .view-tabs { row-gap: 2px; }
  .portal-ui .gastro-overview-lower .data-table { min-width: 0; }
  .portal-ui .gastro-recent-table .data-table { min-width: 0; }
  .portal-ui .gastro-recent-table .data-table thead { display: none; }
  .portal-ui .gastro-recent-table .data-table tr { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 12px; padding: 10px 12px; border-top: 1px solid var(--line); }
  .portal-ui .gastro-recent-table .data-table tr:first-child { border-top: 0; }
  .portal-ui .gastro-recent-table .data-table td { display: block; padding: 0; border: 0; white-space: normal; }
  .portal-ui .gastro-recent-table .data-table td:first-child { color: var(--muted); font-size: .82rem; white-space: nowrap; }
  .portal-ui .gastro-recent-table .data-table td:nth-child(2) { grid-row: 2; font-weight: 700; }
  .portal-ui .gastro-recent-table .data-table td:nth-child(3) { grid-row: 3; color: var(--muted); }
  .portal-ui .gastro-recent-table .data-table td:nth-child(4) { grid-column: 2; grid-row: 1 / span 2; align-self: center; text-align: right; font-weight: 700; }
  .portal-ui .gastro-recent-table .data-table td:nth-child(5) { grid-column: 2; grid-row: 3; text-align: right; }
  .portal-ui .gastro-recent-table .data-table td.data-table-empty { grid-column: 1 / -1; grid-row: auto; }
}

/* Getränkewart dialogs (Gerätehaus, Einstellungen) and their fallback pages. */
.portal-ui .gastro-admin-dialog { width: min(1000px, calc(100vw - 24px)); }
.portal-ui .gastro-admin-dialog .dialog-body { max-height: min(78vh, 900px); overflow-y: auto; }
.portal-ui .dialog-flat-section.dialog-flat-top { border-top: 1px solid var(--line); padding-top: 18px; margin-top: 18px; }
.portal-ui .dialog-flat-section.dialog-flat-last { border-bottom: 0; margin-bottom: 0; padding-bottom: 0; }
.portal-ui .gastro-inline-setting { display: flex; flex-wrap: wrap; align-items: end; gap: 10px 14px; }
.portal-ui .gastro-inline-setting > span { flex: 1 1 260px; }
.portal-ui .gastro-inline-setting > label { flex: 1 1 260px; margin: 0; }
.portal-ui .gastro-reason-list { list-style: none; margin: 0; padding: 0; display: grid; }
.portal-ui .gastro-reason-list li { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 0; border-top: 1px solid var(--line); }
.portal-ui .gastro-reason-list li:first-child { border-top: 0; }
.portal-ui .gastro-reason-list .inline-form { margin: 0; }
.portal-ui .gastro-flat-page { margin: 0; }
.portal-ui .wash-dialog .dialog-flat-form.gastro-inline-setting, .portal-ui .gastro-flat-page .dialog-flat-form.gastro-inline-setting { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; }
.portal-ui .gastro-inline-setting button { width: auto; flex: 0 0 auto; }
.portal-ui .gastro-inline-setting:has(> label) { align-items: end; }
.portal-ui .gastro-reason-list .inline-form, .portal-ui .gastro-todo-actions .inline-form { display: flex; margin: 0; }
.portal-ui .gastro-reason-list .inline-form button, .portal-ui .gastro-todo-actions .inline-form button { width: auto; }
.portal-ui .gastro-reason-list + .dialog-flat-form { margin-top: 12px; }

/* Clearly separated dialog areas: title/intro left, content right; stacked below 760 px. */
.portal-ui .gastro-dialog-section { display: grid; grid-template-columns: minmax(180px, 240px) minmax(0, 1fr); gap: 16px 32px; padding: 22px 0; border-top: 1px solid var(--line); }
.portal-ui .gastro-dialog-section:first-child { border-top: 0; padding-top: 4px; }
.portal-ui .gastro-dialog-section:last-child { padding-bottom: 4px; }
.portal-ui .gastro-dialog-section-head h3 { margin: 0 0 6px; font-size: 1.05rem; }
.portal-ui .gastro-dialog-section-head p { margin: 0; color: var(--muted); font-size: .9rem; line-height: 1.45; }
.portal-ui .gastro-dialog-section-body { display: grid; gap: 16px; min-width: 0; }
.portal-ui .gastro-dialog-section-body > .dialog-flat-note { margin: 0; }
.portal-ui .gastro-dialog-subblock { display: grid; gap: 10px; padding: 14px 16px; border: 1px solid var(--line); border-radius: 4px; background: var(--surface-muted, #f7f7f8); }
.portal-ui .gastro-dialog-subblock .dialog-flat-form .form-row-actions { margin-top: 0; }
.portal-ui .gastro-dialog-label { margin: 0; font-weight: 800; }
@media (max-width: 760px) {
  .portal-ui .gastro-dialog-section { grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 18px 0; }
}
.portal-ui .wash-dialog :is(.gastro-reason-list, .gastro-todo-actions) .inline-form { padding: 0; }
.portal-ui .gastro-reason-list li { padding: 10px 0; }

/* Getränkewart „Buchen“: two white cards like Mein Verzehr, equal height via grid
   stretch to the taller card's own natural content height (normally the article
   list) — no fixed/clamped height and no inner scroll, so the article list is
   always shown in full. */
.portal-ui .gastro-booking-form { margin: 0 0 18px; }
.portal-ui .gastro-booking-columns { display: grid; grid-template-columns: minmax(300px, 0.8fr) minmax(0, 1.2fr); gap: 20px; align-items: stretch; }
.portal-ui .gastro-booking-columns > .panel { margin: 0; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.portal-ui .gastro-target-kinds { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.portal-ui .gastro-target-kind, .portal-ui .gastro-person-option { position: relative; display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px; border: 1px solid var(--line); border-radius: 4px; background: #fff; cursor: pointer; }
.portal-ui .gastro-target-kind span, .portal-ui .gastro-person-option span { display: grid; gap: 2px; min-width: 0; }
.portal-ui .gastro-target-kind small, .portal-ui .gastro-person-option small { color: var(--muted); font-size: .82rem; overflow-wrap: anywhere; }
.portal-ui .gastro-target-kind input, .portal-ui .gastro-person-option input { margin-top: 3px; accent-color: var(--brand); }
.portal-ui .gastro-target-kind:has(input:checked), .portal-ui .gastro-person-option:has(input:checked), .portal-ui .gastro-person-option.is-selected { border-color: var(--brand); box-shadow: inset 0 0 0 1px var(--brand); }
.portal-ui .gastro-person-picker { display: grid; gap: 10px; }
.portal-ui .gastro-person-picker[hidden] { display: none; }
/* The article (products) card dictates the overall box height; the person panel must
   never grow it further for a long roster, so it is excluded from the grid row's
   auto-sizing (contain: size) and only stretches to match via align-items: stretch.
   overflow: hidden clips the panel to exactly that stretched height so a long roster
   cannot visually spill past the box; the inner person list scrolls for the rest. */
.portal-ui .gastro-booking-columns > .panel:has(.gastro-person-list) { contain: size; overflow: hidden; }
.portal-ui .gastro-booking-scroll:has(.gastro-person-picker) { display: flex; flex-direction: column; min-height: 0; }
.portal-ui .gastro-person-picker { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.portal-ui .gastro-person-list { display: grid; gap: 6px; flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 4px; scrollbar-gutter: stable; }
.portal-ui .gastro-booking-scroll { flex: 1 1 auto; }
.portal-ui .gastro-booking-sum { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 16px; padding: 12px 0 2px; margin-top: auto; border-top: 1px solid var(--line); background: #fff; }
.portal-ui .gastro-booking-sum [data-booking-total] { font-weight: 800; font-size: 1.05rem; }
.portal-ui .gastro-booking-sum-actions { display: flex; flex-wrap: wrap; gap: 8px; }
@media (max-width: 900px) {
  .portal-ui .gastro-booking-columns { grid-template-columns: minmax(0, 1fr); }
  /* Stacked single-column layout: each card sizes to its own content again. */
  .portal-ui .gastro-booking-columns > .panel:has(.gastro-person-list) { contain: none; }
}
@media (max-width: 480px) {
  .portal-ui .gastro-target-kinds { grid-template-columns: minmax(0, 1fr); }
  .portal-ui .gastro-booking-sum-actions { width: 100%; }
  .portal-ui .gastro-booking-sum-actions > * { flex: 1 1 0; }
}
.portal-ui .gastro-booking-form :is(.gastro-target-kind, .gastro-person-option) input[type="radio"] { flex: 0 0 auto; width: 18px; min-width: 18px; height: 18px; min-height: 0; padding: 0; margin: 2px 0 0; box-shadow: none; }
.portal-ui .gastro-booking-form :is(.gastro-target-kind, .gastro-person-option) span { flex: 1 1 auto; text-align: left; }
.portal-ui .gastro-cancel-form { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; }
.portal-ui .gastro-cancel-form input { width: 140px; min-width: 0; }
@media (max-width: 900px) {
  .portal-ui .gastro-booking-sum { position: static; box-shadow: none; }
}

/* Getränkewart „Salden“. */
.portal-ui .gastro-admin-balances > .kpi-strip { margin-bottom: 18px; }
.portal-ui .gastro-balance-card { display: grid; gap: 14px; }
.portal-ui .gastro-balance-card > h2 { margin: 0; }
.portal-ui .gastro-balance-toolbar { display: flex; flex-wrap: wrap; align-items: end; gap: 12px 20px; }
.portal-ui .gastro-balance-toolbar > label { flex: 1 1 260px; max-width: 420px; margin: 0; }
.portal-ui .gastro-balance-sort { flex-wrap: wrap; align-items: center; border-bottom: 0; margin: 0; }
.portal-ui .gastro-balance-sort-label { color: var(--muted); font-size: .85rem; font-weight: 700; margin-right: 4px; }
.portal-ui .gastro-balance-exports { display: flex; gap: 8px; margin-left: auto; }
.portal-ui .gastro-balance-card .data-table td { vertical-align: middle; }
.portal-ui .gastro-balance-card .data-table td small { display: block; color: var(--muted); font-size: .82rem; }
.portal-ui .gastro-balance-card .data-table .gastro-num { text-align: right; white-space: nowrap; }
.portal-ui .gastro-credit { color: #1f7a3a; }
.portal-ui .gastro-row-actions { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-start; }
.portal-ui .gastro-row-actions .inline-form { display: flex; margin: 0; padding: 0; }
.portal-ui .gastro-row-actions button { width: auto; }
.portal-ui .gastro-method { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: .82rem; font-weight: 700; background: #eef2f7; }
.portal-ui .gastro-method-cash { background: #e9f6ee; color: #1f7a3a; }
.portal-ui .gastro-method-transfer { background: #eaf1fb; color: #1f4f8a; }
.portal-ui .gastro-small-dialog { width: min(620px, calc(100vw - 24px)); }
.portal-ui .small-dialog { width: min(620px, calc(100vw - 24px)); }
.portal-ui .gastro-payment-form, .portal-ui :is(.gastro-small-dialog, .small-dialog) .dialog-flat-form { display: grid; gap: 14px; padding: 0; }
.portal-ui .gastro-payment-person { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 6px 16px; margin: 0; padding: 12px 14px; border-radius: 4px; background: var(--surface-muted, #f7f7f8); }
.portal-ui .gastro-method-choice { border: 0; margin: 0; padding: 0; min-width: 0; }
.portal-ui .gastro-method-choice legend { margin-bottom: 6px; padding: 0; }
.portal-ui .gastro-small-dialog :is(.gastro-target-kind) input[type="radio"] { flex: 0 0 auto; width: 18px; min-width: 18px; height: 18px; min-height: 0; padding: 0; margin: 2px 0 0; box-shadow: none; }
.portal-ui .gastro-small-dialog .gastro-target-kind span { flex: 1 1 auto; text-align: left; }
@media (max-width: 720px) {
  .portal-ui .gastro-balance-exports { margin-left: 0; }
  .portal-ui .gastro-balance-card .data-table thead { display: none; }
  .portal-ui .gastro-balance-card .data-table, .portal-ui .gastro-balance-card .data-table tbody, .portal-ui .gastro-balance-card .data-table tr, .portal-ui .gastro-balance-card .data-table td { display: block; width: 100%; }
  .portal-ui .gastro-balance-card .data-table tr { padding: 12px 0; border-bottom: 1px solid var(--line); }
  .portal-ui .gastro-balance-card .data-table td { border: 0; padding: 2px 0; }
  .portal-ui .gastro-balance-card .data-table td.gastro-num { text-align: left; }
  .portal-ui .gastro-balance-card .data-table td[data-label]::before { content: attr(data-label) ": "; color: var(--muted); font-size: .85rem; }
  .portal-ui .gastro-row-actions { justify-content: flex-start; margin-top: 6px; }
}

/* Getränkewart booking groups: compact full-width list and shared native dialogs. */
.portal-ui .gastro-entries-table { min-width: 0; }
.portal-ui .gastro-entries-table .panel { width: 100%; }
.portal-ui .gastro-entries-table td { vertical-align: middle; }
.portal-ui .gastro-entries-table td:first-child { white-space: nowrap; }
.portal-ui .gastro-entries-table .form-row-actions { margin: 0; gap: 6px; }
.portal-ui .gastro-entries-table #gastroEntriesFilters + p + .form-row-actions { margin-block: 12px; }
.portal-ui .gastro-entry-actions { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
.portal-ui .gastro-entry-articles { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.portal-ui .gastro-entry-article { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
/* Same wrap rule as Salden's Person/Ziel: full article names on their own, never mid-word. */
.portal-ui .gastro-entry-article > span:last-child { min-width: 0; overflow-wrap: break-word; word-break: normal; hyphens: manual; }
.portal-ui .gastro-entry-quantity { flex: 0 0 auto; white-space: nowrap; }
@media (min-width: 721px) {
  .portal-ui .gastro-entries-table td:is([data-label="Betrag"], [data-label="Status"]) { white-space: nowrap; overflow-wrap: normal; }
  .portal-ui .gastro-entries-table td[data-label="Aktionen"] .button { white-space: nowrap; }
}

.portal-ui .gastro-entry-pagination { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; padding-top: 14px; }
.portal-ui #gastroEntryDetails, .portal-ui #gastroEntryCancel { width: min(1000px, calc(100vw - 24px)); max-width: calc(100vw - 24px); }
.portal-ui #gastroEntryDetails .dialog-body, .portal-ui #gastroEntryCancel .dialog-body { min-width: 0; }
.portal-ui #gastroEntryDetails .gastro-dialog-section > *, .portal-ui #gastroEntryDetails .ticket-facts dd { min-width: 0; overflow-wrap: anywhere; }
.portal-ui [data-entry-export][aria-disabled="true"] { opacity: .5; cursor: wait; }
@media (max-width: 720px) {
  .portal-ui .gastro-entries-table .data-table-wrap { overflow: visible; }
  .portal-ui .gastro-entries-table table, .portal-ui .gastro-entries-table tbody, .portal-ui .gastro-entries-table tr, .portal-ui .gastro-entries-table td { display: block; width: 100%; }
  .portal-ui .gastro-entries-table thead { display: none; }
  .portal-ui .gastro-entries-table tbody tr { border-bottom: 1px solid var(--line); padding-block: 10px; }
  .portal-ui .gastro-entries-table td { border: 0; padding: 4px 0; white-space: normal; }
  .portal-ui .gastro-entries-table td[data-label]::before { content: attr(data-label) ": "; font-weight: 700; }
  .portal-ui .gastro-entries-table td[data-label="Aktionen"]::before { display: none; }
  .portal-ui .gastro-entries-table .form-row-actions { justify-content: flex-start; }
  .portal-ui #gastroEntryDetails .gastro-entry-products .data-table-wrap { overflow: visible; }
  .portal-ui #gastroEntryDetails .gastro-entry-products :is(table, tbody, tr, td) { display: block; width: 100%; }
  .portal-ui #gastroEntryDetails .gastro-entry-products thead { display: none; }
  .portal-ui #gastroEntryDetails .gastro-entry-products tr { padding-block: 10px; border-bottom: 1px solid var(--line); }
  .portal-ui #gastroEntryDetails .gastro-entry-products td { border: 0; padding: 3px 0; overflow-wrap: anywhere; }
  .portal-ui #gastroEntryDetails .gastro-entry-products td[data-label]::before { content: attr(data-label) ": "; font-weight: 700; }
}

/* Buchungen: same table card as Salden (toolbar with search, status tabs, exports; compact extra filters). */
.portal-ui .gastro-entries-card .gastro-balance-sort label { position: relative; cursor: pointer; }
.portal-ui .gastro-entries-card .gastro-balance-sort label input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.portal-ui .gastro-entries-card .gastro-balance-sort label:has(input:checked) { color: var(--ink, #1f2328); border-bottom-color: var(--brand); box-shadow: inset 0 -3px 0 var(--brand); }
.portal-ui .gastro-entries-card .gastro-balance-sort label:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }
.portal-ui .gastro-entries-filters { display: grid; grid-template-columns: repeat(4, minmax(140px, 1fr)) auto; gap: 10px 14px; align-items: end; margin-top: 4px; }
.portal-ui .gastro-entries-filters > label { margin: 0; min-width: 0; }
.portal-ui .gastro-entries-filters :is(input, select) { min-height: 38px; }
.portal-ui .gastro-entries-filter-actions { display: flex; gap: 8px; }
.portal-ui .gastro-entries-card #gastroEntriesFilters { display: grid; gap: 12px; }
.portal-ui .gastro-entries-card .data-table td small { display: block; color: var(--muted); font-size: .82rem; }
.portal-ui .gastro-entries-card .data-table td { vertical-align: middle; }
.portal-ui .gastro-entries-card .data-table td[data-label="Datum"] { white-space: nowrap; }
.portal-ui .gastro-entry-status { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: .82rem; font-weight: 700; background: #eef0f3; color: #3b4048; white-space: nowrap; }
.portal-ui .gastro-entry-status-open { background: #fdecec; color: #a61b1b; }
.portal-ui .gastro-entry-status-partial { background: #fff4dd; color: #8a5a00; }
.portal-ui .gastro-entry-status-settled { background: #e6f4ea; color: #1f7a3a; }
.portal-ui .gastro-entry-status-canceled { background: #eef0f3; color: #6b7280; text-decoration: line-through; }
@media (max-width: 900px) {
  .portal-ui .gastro-entries-filters { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .portal-ui .gastro-entries-filter-actions { grid-column: 1 / -1; }
}
@media (max-width: 720px) {
  .portal-ui .gastro-entries-card .data-table td.gastro-num { text-align: left; }
  .portal-ui .gastro-entries-card .data-table td small { display: inline; margin-left: 6px; }
}
.portal-ui .gastro-entries-card .data-table td[data-label="Person/Ziel"] { overflow-wrap: break-word; word-break: normal; hyphens: manual; }
@media (min-width: 721px) {
  .portal-ui .gastro-entries-table .gastro-entries-card .data-table th:first-child { width: 120px; }
  .portal-ui .gastro-entries-table .gastro-entries-card .data-table th:nth-child(2) { width: clamp(200px, 17vw, 300px); }
}
