/* ===== Portal shell styling =====
   The signed-in portal dashboard (full screen): its backdrop, every #section* panel's shared
   layout (the identity header is site_header.css and the left panel site_nav_panel.css, both
   shared with the standalone pages), and the dark-admin .btn-primary/.btn-secondary/.btn-danger button
   family used throughout it (and the legal-ack/race-tour-prompt overlays — see
   landing.css's own header comment for why those buttons live here, not with the landing
   page's own paper-themed .btn/.btn--*). index.html decomposition slice 9
   (README_BACKLOG.md) — extracted verbatim from that file's first inline <style> block's
   own PORTAL BACKDROP + PORTAL DRAWER sections. Linked by index.html, after base.css */

/* ===== DASHBOARD THEME TOKENS =====
   The --dash-* tokens (PT3, one paper/ink theme across the site) live in base.css so the
   standalone admin pages (admin-theme.css) share them. Every dashboard color goes through one;
   admin sections (.section--wide) use the same paper values as the player sections (PT4). */
/* level.css's level card, on paper (same values players/profile.html uses; the header's own XP
   bar reads the same values from site_header.css). */
#portalContainer {
  --xp-track: var(--paper-warm);
  --xp-fill: #e0a800;
  --xp-text: var(--ink);
  --xp-muted: #66625a;
}
#portalContainer [class*='xp-bar--'] {
  --rank-text: color-mix(in srgb, var(--rank-color, #666) 62%, var(--ink));
}
/* ===== PORTAL BACKDROP ===== */
#portalBackdrop {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.45);
  z-index: 990;
  display: none;
}

/* ===== PORTAL DASHBOARD =====
   Full screen (PT1/PT2: "make the dashboard full screen... open Admin as its own full page"):
   a compact identity header (site_header.css), a grouped left nav and a wide content area.
   Sections read at a comfortable max width; admin sections (.section--wide) take the whole width. Narrow viewports fold the nav into a scrollable strip under the header (same DOM,
   so tour steps that point at nav links still find them). */
#portalContainer {
  position: fixed;
  inset: 0;
  background: var(--dash-bg);
  color: var(--dash-text);
  z-index: 995;
  display: none;
  flex-direction: column;
}
#portalContainer.portal-visitor #drawerVisitorLoginBtn {
  display: inline-flex;
}
#portalContainer.portal-visitor .drawer-identity,
#portalContainer.portal-visitor #guestUpsellBar,
#portalContainer.portal-visitor #navSidebar {
  display: none !important;
}
#portalBody {
  display: flex;
  flex: 1;
  min-height: 0;
  overflow: hidden;
}
.admin-only {
  display: none;
}
#contentArea {
  flex: 1;
  min-width: 0;
  overflow-y: auto;
  padding: 28px 40px 48px;
  background: var(--dash-bg);
  scrollbar-width: thin;
  scrollbar-color: var(--dash-control) transparent;
}
#contentArea::-webkit-scrollbar {
  width: 8px;
}
#contentArea::-webkit-scrollbar-track {
  background: transparent;
}
#contentArea::-webkit-scrollbar-thumb {
  background: var(--dash-surface-2);
  border-radius: 3px;
  border: 2px solid transparent;
  background-clip: padding-box;
}
#contentArea::-webkit-scrollbar-thumb:hover {
  background: #555;
  background-clip: padding-box;
}
.section {
  display: none;
  max-width: 1080px;
  margin: 0 auto;
}
.section.active {
  display: block;
}
/* Admin is its own full page: the whole content width, on a dark panel (its tokens above). */
.section.section--wide {
  max-width: none;
  background: var(--dash-bg);
  color: var(--dash-text);
  border-radius: 12px;
  padding: 24px 28px 32px;
}
.section h2 {
  color: var(--dash-heading);
  font-family: var(--marker);
  font-weight: 400;
  margin-bottom: 18px;
  font-size: 1.6em;
}
/* Home: Up next + shortcut tiles on the left, your numbers on the right. */
.home-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(220px, 300px);
  gap: 20px 28px;
  align-items: start;
}
.home-side {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.home-side .card {
  min-width: 0;
}
.home-tiles {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr));
  gap: 14px;
}
.home-main #homeTrainingSlot {
  max-width: none;
}
.home-tile {
  display: grid;
  grid-template-columns: 44px minmax(0, 1fr);
  grid-template-rows: auto auto;
  column-gap: 12px;
  align-items: center;
  padding: 16px;
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 10px;
  color: var(--dash-text);
  text-align: left;
  text-decoration: none;
  font: inherit;
  cursor: pointer;
  transition:
    border-color 0.12s,
    background 0.12s,
    transform 0.12s;
}
.home-tile:hover,
.home-tile:focus-visible {
  border-color: #4caf50;
  background: var(--dash-accent-bg);
  transform: translateY(-1px);
}
.home-tile img {
  grid-row: 1 / 3;
  width: 44px;
  height: 44px;
  object-fit: contain;
}
.home-tile b {
  font-family: var(--marker);
  font-weight: 400;
  font-size: 1.1rem;
  color: var(--dash-accent-text);
}
.home-tile span {
  font-size: 0.85rem;
  color: var(--dash-text-soft);
}
@media (max-width: 900px) {
  .home-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* Settings: a grid of cards instead of one tall narrow column (PT2 "pounded to the right"). */
.settings-grid {
  columns: 2 360px;
  column-gap: 16px;
}
.settings-grid > .card {
  min-width: 0;
  break-inside: avoid;
  margin-bottom: 16px;
}

/* Narrow viewports (a phone, or a narrow desktop window): the nav (a strip, site_nav_panel.css)
   stacks under the header and the content uses the whole width. */
@media (max-width: 760px) {
  #portalBody {
    flex-direction: column;
  }
  #contentArea {
    padding: 18px 16px 40px;
  }
}

/* Portal components (dark theme) */
.card-row {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  margin-top: 12px;
}
.card {
  background: var(--dash-surface);
  border-radius: 8px;
  padding: 18px;
  flex: 1;
  min-width: 180px;
  border: 1px solid var(--dash-border);
}
.card h3 {
  color: var(--dash-accent-text);
  margin-bottom: 6px;
  font-size: 0.95em;
}
.card .value {
  font-size: 1.7em;
  color: var(--dash-text);
}
/* Dudes section: one uniform block treatment so Invite / Add / Your dudes
   read as three parts of one page, not stacked unrelated edits. The rule
   sits on border-BOTTOM + :last-child so a hidden Invite block never leaves
   a stray divider above whatever renders first. */
.dudes-block {
  max-width: 560px;
  margin-bottom: 24px;
  padding-bottom: 22px;
  border-bottom: 1px solid var(--dash-border);
}
.dudes-block:last-child {
  margin-bottom: 0;
  padding-bottom: 0;
  border-bottom: 0;
}
.dudes-block > h3 {
  margin: 0 0 6px;
  font-size: 1em;
  color: var(--dash-text);
}
.dudes-block > h4 {
  margin: 16px 0 6px;
  font-size: 0.85em;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--dash-accent-text);
}
.dudes-block .block-note {
  color: var(--dash-text-soft);
  font-size: 0.9em;
  margin: 0 0 12px;
}
.dudes-inline-row {
  display: flex;
  gap: 10px;
  align-items: center;
  flex-wrap: wrap;
}
.tt-best-row {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  padding: 4px 0;
  font-size: 0.9em;
  color: var(--dash-text);
  font-variant-numeric: tabular-nums;
  border-bottom: 1px dashed var(--dash-border);
}
.tt-best-row:last-child {
  border-bottom: 0;
}
.btn-primary {
  background: #4caf50;
  color: #fff;
  border: none;
  border-radius: 6px;
  padding: 9px 18px;
  font-size: 0.9em;
  cursor: pointer;
}
.btn-primary:hover {
  background: #45a049;
}
.btn-danger {
  background: #c62828;
  color: #fff;
  border: none;
  border-radius: 6px;
  padding: 9px 18px;
  font-size: 0.9em;
  cursor: pointer;
}
.btn-danger:hover {
  background: #b71c1c;
}
.btn-secondary {
  background: var(--dash-surface-2);
  color: var(--dash-text);
  border: 1px solid var(--dash-border-strong);
  border-radius: 6px;
  padding: 9px 18px;
  font-size: 0.9em;
  cursor: pointer;
}
.btn-secondary:hover {
  background: var(--dash-control);
}
/* Club [TAG] colors on paper: the same darker tier palette players/profile.html uses (lobby.css's
   defaults are tuned for a dark surface). */
#portalContainer .club-tag--group {
  color: #8a4a1d;
}
#portalContainer .club-tag--club {
  color: #5b6b78;
  text-shadow: 0 0 6px rgba(91, 107, 120, 0.35);
}
#portalContainer .club-tag--clan {
  color: #a8790a;
}
#portalContainer .club-tag--guild {
  color: #0b7a45;
}
.btn-primary:disabled,
.btn-secondary:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
/* Shared pill toggle switch (the Settings section's toggle cards) — same structure/animation as players/profile.html's
   own .toggle-switch, just re-colored for this page's dark background instead
   of that page's paper-theme --ink/--lime tokens (which aren't meaningful here). */
.toggle-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  gap: 8px;
}
.toggle-switch {
  position: relative;
  display: inline-block;
  width: 38px;
  height: 22px;
  flex-shrink: 0;
}
.toggle-switch input {
  opacity: 0;
  width: 0;
  height: 0;
  position: absolute;
}
.toggle-switch .toggle-track {
  position: absolute;
  inset: 0;
  background: var(--dash-control);
  border: 2px solid var(--dash-border-strong);
  border-radius: 999px;
  cursor: pointer;
  transition:
    background 0.2s,
    border-color 0.2s;
}
.toggle-switch .toggle-track::after {
  content: '';
  position: absolute;
  left: 2px;
  top: 50%;
  transform: translateY(-50%);
  width: 13px;
  height: 13px;
  background: var(--dash-text-mute);
  border-radius: 50%;
  transition:
    transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1),
    background 0.2s;
}
.toggle-switch input:checked + .toggle-track {
  background: rgba(76, 175, 80, 0.35);
  border-color: #4caf50;
}
.toggle-switch input:checked + .toggle-track::after {
  transform: translateY(-50%) translateX(16px);
  background: #4caf50;
}
.toggle-switch input:focus-visible + .toggle-track {
  outline: 2px solid #4caf50;
  outline-offset: 2px;
}
/* Tours section: a card grid of replayable walkthroughs, two groups. */
.tour-group {
  margin-bottom: 30px;
}
.tour-group-title {
  color: var(--dash-accent-text);
  font-size: 0.85em;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  margin-bottom: 12px;
}
.tour-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 12px;
  max-width: 780px;
}
.tour-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 6px;
  text-align: left;
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 8px;
  padding: 14px 58px 14px 16px;
  color: var(--dash-text);
  font: inherit;
  cursor: pointer;
  transition:
    border-color 0.12s,
    background 0.12s;
}
.tour-card:hover {
  border-color: #4caf50;
  background: var(--dash-hover);
}
.tour-card-title {
  font-size: 0.98em;
  font-weight: 700;
}
.tour-card-title .tour-card-icon {
  width: 3em;
  height: 3em;
  object-fit: contain;
  vertical-align: middle;
  margin-right: 8px;
}
.tour-card-blurb {
  color: var(--dash-text-soft);
  font-size: 0.85em;
  line-height: 1.4;
}
.tour-card-xp {
  position: absolute;
  top: 8px;
  right: 10px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 0.72em;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: #14141a;
  background: #f4c12a;
}
.tour-card-seen {
  margin-top: 4px;
  font-size: 0.75em;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--dash-text-mute);
}
.tour-card-seen.is-seen {
  color: var(--dash-accent-text);
}
/* A tour that isn't reachable yet (e.g. "Your club" before joining/founding one) —
   same greyed-out, non-interactive treatment as a locked Bike Shop piece, so a rider
   still sees the card exists instead of it just being absent. */
.tour-card--locked {
  cursor: default;
  opacity: 0.5;
}
.tour-card--locked:hover {
  border-color: var(--dash-border);
  background: var(--dash-surface);
}
.tour-card--locked .tour-card-seen {
  color: var(--dash-text-mute);
  text-transform: none;
  letter-spacing: normal;
}
.event-card {
  position: relative;
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 8px;
  padding: 14px;
  margin-bottom: 10px;
}
.event-card h3 {
  color: var(--dash-text);
  margin-bottom: 5px;
}
/* The portal drawer card has no art header to anchor to (unlike .event-poster__art),
   so the stamp perches on the card's top-right corner instead. */
.event-card .event-prize-stamp {
  top: -12px;
  right: 14px;
}
/* Dude names in the friends/invites lists link out to their profile. */
.friend-profile-link {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px dotted var(--dash-border-strong);
}
.friend-profile-link:hover {
  color: var(--dash-info-text);
  border-bottom-color: var(--dash-info-text);
}
/* Corner "remove" affordance on a friend card — kept off the .event-actions
   row since removing a friend is a distinct, higher-stakes action than the
   row's own buttons (e.g. Join Lobby). */
.friend-remove-btn {
  position: absolute;
  top: 8px;
  right: 10px;
  width: 22px;
  height: 22px;
  line-height: 20px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 50%;
  background: transparent;
  color: var(--dash-danger-text);
  font-size: 1.05em;
  text-align: center;
  cursor: pointer;
}
.friend-remove-btn:hover {
  background: #ef5350;
  border-color: #ef5350;
  color: #fff;
}
.event-meta {
  color: var(--dash-text-mute);
  font-size: 0.9em;
  margin-bottom: 8px;
}
.event-actions {
  display: flex;
  gap: 8px;
  align-items: center;
  flex-wrap: wrap;
}
.event-primary-details {
  color: var(--dash-text);
  font-size: 0.9em;
  line-height: 1.5;
}
.event-description-copy {
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--dash-border);
  color: var(--dash-text-soft);
  font-size: 0.9em;
  line-height: 1.6;
  /* Preserve line breaks from the description textarea (e.g. prize breakdown). */
  white-space: pre-line;
}
.event-timing-note {
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--dash-border);
  color: var(--dash-accent-text);
  line-height: 1.5;
}
.event-actions.lobby-actions-incoming {
  flex-direction: column;
  align-items: stretch;
}
.lobby-accept-main {
  width: 100%;
  padding: 12px;
  font-size: 1em;
  font-weight: 700;
  text-align: center;
}
.lobby-decline-secondary {
  align-self: center;
}
.spots-badge {
  background: var(--dash-surface-2);
  padding: 3px 8px;
  border-radius: 10px;
  font-size: 0.82em;
  color: var(--dash-accent-text);
}
.spots-badge.full {
  color: var(--dash-danger-text);
}
.profile-form label {
  display: block;
  margin-bottom: 10px;
  color: var(--dash-text-mute);
  font-size: 0.88em;
}
.profile-form input[type='text'],
.profile-form input[type='email'],
.profile-form input[type='date'],
.profile-form select {
  display: block;
  width: 100%;
  max-width: 360px;
  margin-top: 4px;
  padding: 7px 10px;
  background: var(--dash-input);
  border: 1px solid var(--dash-border-strong);
  border-radius: 4px;
  color: var(--dash-text);
  font-size: 0.9em;
}
.profile-form select option {
  background: var(--dash-surface-2);
  color: var(--dash-text);
}
.profile-form input:read-only {
  opacity: 0.6;
}
.profile-photo {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  margin-bottom: 14px;
}
.admin-form {
  max-width: 460px;
}
.admin-form label {
  display: block;
  margin-bottom: 10px;
  color: var(--dash-text-mute);
  font-size: 0.88em;
}
.admin-form input,
.admin-form textarea,
.admin-form select {
  display: block;
  width: 100%;
  margin-top: 4px;
  padding: 7px 10px;
  background: var(--dash-input);
  border: 1px solid var(--dash-border-strong);
  border-radius: 4px;
  color: var(--dash-text);
  font-size: 0.9em;
}
.admin-form textarea {
  resize: vertical;
  min-height: 56px;
}
.admin-event-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  /* flex-wrap lets .admin-event-actions (Edit/Delete) drop to its own line
     instead of overflowing past a narrow (portrait phone) screen edge — a
     long event title/meta line had no wrap partner to yield space to. */
  flex-wrap: wrap;
  gap: 8px;
  background: var(--dash-surface);
  padding: 10px;
  margin-bottom: 6px;
  border-radius: 6px;
  border: 1px solid var(--dash-border);
}
.admin-event-item .event-info {
  /* Basis 240px (not a bare `flex: 1`) so flex-wrap drops .admin-event-actions
     below on a narrow screen instead of squeezing this column to a sliver —
     same fix as .admin-news-item .news-info. */
  flex: 1 1 240px;
  min-width: 0;
}
.admin-event-item .event-info strong {
  color: var(--dash-text);
}
.admin-event-item .event-info span {
  color: var(--dash-text-mute);
  font-size: 0.83em;
  margin-left: 8px;
}
.admin-event-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.legal-paragraph {
  color: var(--dash-text);
  line-height: 1.6;
  margin-top: 8px;
}
.legal-updated-at {
  color: var(--dash-text-mute);
  margin-top: 5px;
  line-height: 1.5;
}
.legal-section-heading {
  margin-top: 12px;
  color: var(--dash-accent-text);
}
.legal-list {
  margin: 5px 0 0 20px;
  color: var(--dash-text);
  line-height: 1.6;
}
.legal-document-card {
  max-width: 840px;
  margin-top: 14px;
  line-height: 1.6;
}
.legal-company-card {
  max-width: 380px;
}
.legal-version-block {
  margin-top: 14px;
}
.legal-version-value {
  color: var(--dash-text-soft);
  margin-top: 6px;
  font-family: monospace;
  font-size: 0.83em;
}
.about-careers-card {
  max-width: 840px;
  margin-top: 18px;
}
.about-careers-copy {
  color: var(--dash-text);
  line-height: 1.7;
}
#legalAckOverlay {
  position: fixed;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.95);
  z-index: 1200;
  padding: 24px;
}
.legal-ack-dialog {
  width: min(980px, 100%);
  max-height: min(88vh, 900px);
  display: flex;
  flex-direction: column;
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 12px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.45);
}
.legal-ack-header,
.legal-ack-footer {
  padding: 16px 20px;
  border-bottom: 1px solid var(--dash-border);
}
.legal-ack-footer {
  border-bottom: none;
  border-top: 1px solid var(--dash-border);
}
.legal-ack-header h2 {
  margin-bottom: 6px;
  color: var(--dash-text);
}
.legal-ack-scroll {
  overflow-y: auto;
  padding: 0 20px 20px;
}
.legal-ack-copy {
  color: var(--dash-text-soft);
  line-height: 1.6;
}
.legal-ack-checkbox {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  color: var(--dash-text);
  line-height: 1.5;
}
.legal-ack-checkbox input {
  margin-top: 4px;
}
#legalAckStatus {
  min-height: 18px;
  margin-top: 8px;
  color: var(--dash-text-mute);
}
/* #equipmentTestPromptOverlay (portal.js's maybeOfferEquipmentTest) shares this
   exact dialog shape — same overlay/dialog/actions classes, offered on the same
   Host/Join/Sign-Up schedule, just in front of the race-tour prompt. */
#raceTourPromptOverlay,
#equipmentTestPromptOverlay {
  position: fixed;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.75);
  z-index: 1300;
  padding: 24px;
}
.race-tour-prompt-dialog {
  width: min(420px, 100%);
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 12px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.45);
  padding: 20px 22px;
}
.race-tour-prompt-dialog h2 {
  margin-bottom: 8px;
  color: var(--dash-text);
}
.race-tour-prompt-dialog p {
  color: var(--dash-text-soft);
  line-height: 1.5;
  margin-bottom: 16px;
}
.race-tour-prompt-actions {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
/* Guest Mode conversion: moment-triggered prompt — same dialog shape as
   #raceTourPromptOverlay above, a separate overlay since it's offered on its
   own schedule (first badge / first race), not tied to a race start. */
#guestUpsellPromptOverlay {
  position: fixed;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.75);
  z-index: 1300;
  padding: 24px;
}
.guest-upsell-prompt-dialog {
  width: min(420px, 100%);
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 12px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.45);
  padding: 20px 22px;
}
.guest-upsell-prompt-dialog h2 {
  margin-bottom: 8px;
  color: var(--dash-text);
}
.guest-upsell-prompt-dialog h2 .ui-icon-img.guest-upsell-prompt-icon {
  display: inline-block;
  width: 1.3em;
  height: 1.3em;
  vertical-align: -0.28em;
  margin-right: 4px;
}
.guest-upsell-prompt-dialog p {
  color: var(--dash-text-soft);
  line-height: 1.5;
  margin-bottom: 16px;
}
.guest-upsell-prompt-actions {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
/* Guest Mode conversion: on-page confirm for the anonymous-upgrade merge-conflict case —
   same dialog shape as the two overlays above, in place of window.confirm(). */
#anonUpgradeConflictOverlay {
  position: fixed;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.75);
  z-index: 1300;
  padding: 24px;
}
.anon-upgrade-conflict-dialog {
  width: min(420px, 100%);
  background: var(--dash-surface);
  border: 1px solid var(--dash-border);
  border-radius: 12px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.45);
  padding: 20px 22px;
}
.anon-upgrade-conflict-dialog h2 {
  margin-bottom: 8px;
  color: var(--dash-text);
}
.anon-upgrade-conflict-dialog p {
  color: var(--dash-text-soft);
  line-height: 1.5;
  margin-bottom: 16px;
}
.anon-upgrade-conflict-actions {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
#graphicsModeOptions {
  margin-top: 10px;
  display: flex;
  flex-direction: column;
  gap: 7px;
}
#graphicsModeOptions label {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  cursor: pointer;
  color: var(--dash-text-soft);
  font-size: 0.9em;
}
#graphicsModeOptions input {
  margin-top: 3px;
}
#graphicsModeStatus {
  margin-top: 8px;
  font-size: 0.85em;
  color: var(--dash-accent-text);
  min-height: 16px;
}
#stravaStatusText {
  margin-top: 8px;
  font-size: 0.9em;
  color: var(--dash-text-soft);
}
#stravaActions {
  margin-top: 10px;
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}
#stravaMsg {
  margin-top: 6px;
  font-size: 0.85em;
  min-height: 16px;
}
#dudesAddInput {
  padding: 7px 8px;
  background: var(--dash-input);
  border: 1px solid var(--dash-border-strong);
  color: var(--dash-text);
  border-radius: 4px;
}

/* A phone held sideways (short touch screen, too wide for the strip above): the header
   (site_header.css) and nav column (site_nav_panel.css) slim down so the section keeps most of the
   screen; the content follows. */
@media (hover: none) and (pointer: coarse) and (max-height: 500px) and (min-width: 761px) {
  #contentArea {
    padding: 16px 20px 32px;
  }
}
