:root {
  /* Scandinavian-minimalist palette -- warm off-white "unbleached paper"
     background, soft charcoal ink (never pure black -- Scandi design
     avoids harsh contrast), one confident muted "Nordic sky" blue as the
     primary accent, plus a sage green and a soft clay/terracotta as
     supporting accents. Kept the same variable *names* everywhere
     (--accent, --teal, --gold, --highlight, plus their *-soft tints,
     --ink, --paper) so no selector below needed to change, just what
     each name resolves to:
       --ink        soft warm charcoal text (never pure black)
       --paper      warm off-white page background
       --paper-warm a touch deeper warm neutral -- panel/card backgrounds
       --accent     muted Nordic-sky blue -- primary accent (dates,
                    buttons, the local-artist highlight)
       --teal       sage green -- secondary accent (link hovers, the
                    scrape-progress bar)
       --gold       soft clay/terracotta -- genre-tag pills
       --highlight  warm pale gold -- featured-artist spotlight wash
       --muted      warm mid-gray for secondary text
       --line       soft warm-gray hairline borders/dividers
     --font-display is Space Grotesk -- a clean geometric sans with just
     enough character to read as "young," paired with Inter for body copy
     (set on <body> below) for an overall calm, uncluttered, well-typeset
     feel rather than anything shouty or embellished. */
  --ink: #2b2a27;
  --paper: #faf9f5;
  --paper-warm: #f1efe7;
  --accent: #45688f;
  --accent-soft: #e7edf3;
  --teal: #7c9885;
  --teal-soft: #eaf0ea;
  --gold: #b8683f;
  --gold-soft: #f3e7dc;
  --highlight: #e8c988;
  --highlight-soft: #faf3e3;
  --muted: #85817a;
  --line: #e4e0d6;
  --font-display: "Space Grotesk", "Inter", -apple-system, "Segoe UI", sans-serif;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: "Inter", -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  background: var(--paper);
  color: var(--ink);
  line-height: 1.6;
}

.site-header {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: 1.75rem 1.5rem 1.1rem;
  border-bottom: 1px solid var(--line);
  gap: 0.6rem;
}

.brand {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 2.5rem;
  line-height: 1;
  letter-spacing: -0.01em;
  color: var(--ink);
  text-decoration: none;
}
.brand-logo { width: 52px; height: 52px; display: block; }

.site-header nav {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.3rem 1.3rem;
}
.site-header nav a {
  color: var(--ink);
  text-decoration: none;
  font-size: 0.95rem;
  font-weight: 500;
}

.site-header nav a:hover { color: var(--accent); }

@media (max-width: 600px) {
  .brand { font-size: 1.9rem; }
  .brand-logo { width: 40px; height: 40px; }
}

.badge {
  background: var(--accent);
  color: var(--paper);
  border-radius: 6px;
  padding: 0.05rem 0.5rem;
  font-size: 0.75rem;
  font-weight: 600;
}

.container {
  max-width: 900px;
  margin: 0 auto;
  padding: 1.5rem;
}

.site-footer {
  text-align: center;
  color: var(--muted);
  font-size: 0.85rem;
  padding: 2rem 1rem;
  border-top: 1px solid var(--line);
}
.site-footer a { color: var(--muted); }
.footer-nav {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.3rem 1.3rem;
  margin-bottom: 1rem;
}
.footer-nav a {
  font-size: 0.95rem;
  font-weight: 500;
}
.footer-nav a:hover { color: var(--accent); }
.footer-tagline { margin: 0; }
.login-wrap { max-width: 360px; margin: 2rem auto; }
.footer-form { display: inline; }
.link-button {
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  font: inherit;
  color: var(--muted);
  text-decoration: underline;
  cursor: pointer;
}

.flashes { margin-bottom: 1rem; }
.flash {
  padding: 0.6rem 1rem;
  border-radius: 8px;
  margin-bottom: 0.5rem;
  font-size: 0.9rem;
}
.flash-success { background: var(--teal-soft); border: 1px solid var(--teal); color: #3f5945; }
.flash-error { background: #f7e6e2; border: 1px solid #d98b73; color: #8a4530; }

h1 { font-family: var(--font-display); font-weight: 700; font-size: 1.6rem; letter-spacing: -0.01em; margin-bottom: 0.25rem; }
h2 { font-family: var(--font-display); font-weight: 600; font-size: 1.2rem; letter-spacing: -0.01em; margin-top: 2rem; }

.page-actions { margin: 1rem 0; }

.hero {
  background: var(--paper-warm);
  border: 1px solid var(--line);
  border-top: 3px solid var(--accent);
  border-radius: 16px;
  padding: 2.25rem 2rem;
  margin: 0.5rem 0 2rem;
}
.hero h1 {
  font-size: 2rem;
  line-height: 1.2;
  margin-bottom: 0.9rem;
  /* No max-width/ch cap here -- "About this site" is now admin-editable
     HTML (see main.py's edit_about()), so a fixed character-count cap
     tuned for the old hardcoded copy left visible dead space on the
     right side of the panel for anything longer or differently
     structured. Let it fill the panel's own width instead. */
}
.hero-lede {
  font-size: 1.05rem;
  color: var(--ink);
  margin-bottom: 0.9rem;
}
.hero-note {
  font-size: 0.9rem;
  color: var(--muted);
  margin-bottom: 0;
}
.hero-note strong { color: var(--ink); }
.hero-body { margin-top: 0.25rem; }

.section-heading { margin-top: 0.5rem; }

@media (max-width: 600px) {
  .hero { padding: 1.5rem 1.25rem; border-radius: 12px; }
  .hero h1 { font-size: 1.6rem; max-width: none; }
}

/* Native <details>/<summary> collapse toggle, shared by .hero and
   .featured-artist -- no JS needed. Each summary gets an explicit round
   icon badge with the toggle glyph inside it -- a solid-colored circle
   reads clearly as a button -- plus a soft hover tint as a second cue. */
.hero > summary, .featured-artist > summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  user-select: none;
  padding: 0.3rem 0.5rem;
  margin: -0.3rem -0.5rem 0;
  border-radius: 8px;
  transition: background 0.15s ease;
}
.hero > summary:hover, .featured-artist > summary:hover {
  background: rgba(0, 0, 0, 0.04);
}
.hero > summary::-webkit-details-marker,
.featured-artist > summary::-webkit-details-marker { display: none; }
.toggle-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  color: var(--paper);
  font-size: 0.75rem;
  line-height: 1;
  transition: transform 0.15s ease;
}
.hero:not([open]) .toggle-icon, .featured-artist:not([open]) .toggle-icon {
  transform: rotate(-90deg);
}
.hero > summary { color: var(--accent); }
.hero > summary .toggle-icon { background: var(--accent); }
.hero[open] > summary { margin-bottom: 0.5rem; }
.featured-artist > summary { color: var(--accent); }
.featured-artist > summary .toggle-icon { background: var(--accent); }
.featured-artist[open] > summary { margin-bottom: 0.75rem; }

.featured-artist {
  border: 1px solid var(--line);
  border-left: 4px solid var(--accent);
  border-radius: 14px;
  padding: 1.25rem 1.5rem;
  margin: 0 0 2rem;
  background: var(--highlight-soft);
}

/* "Local Artists Playing This Week!" gallery -- a plain horizontally
   scrolling flex row with CSS scroll-snap, so swipe/trackpad scrolling
   works with zero JS; the Prev/Next buttons (see calendar.html's
   <script>) just trigger the same native scrolling programmatically. */
.artist-week-gallery-wrap { margin-top: 0.25rem; }
.artist-week-gallery {
  display: flex;
  gap: 1rem;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding-bottom: 0.5rem;
  margin: 0 -0.25rem;
}
.artist-week-card {
  flex: 0 0 auto;
  scroll-snap-align: start;
  width: min(320px, 85vw);
  /* Fixed height (not just equal-stretch) plus a column flex layout --
     card content varies a lot (no photo/no tags/no embed on some cards),
     so a fixed height + overflow:hidden is what actually keeps every
     card the same size regardless of content, and margin-top: auto on
     the "View artist profile" link (below) pins it to the same spot at
     the bottom of every card instead of trailing right after whatever
     content happens to be shortest. */
  height: 480px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 12px;
  background: var(--paper);
  padding: 1rem 1.1rem;
}
.artist-week-card h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.05rem;
  margin: 0.3rem 0;
}
.artist-week-card .meta { margin: 0; }
.artist-week-card .artist-embed { margin: 0.5rem 0; }
.artist-week-card .btn-small { margin-top: auto; }
/* Rectangular (not round) photo, just for this gallery -- .artist-thumb's
   shared base style (used elsewhere: the artist list/detail pages) is
   circular, but a wide banner-style photo reads more like a show flyer
   and suits a fixed-height card better than a small circular avatar
   would. */
.artist-week-card .featured-artist-thumb {
  width: 100%;
  height: 140px;
  border-radius: 8px;
  margin-bottom: 0.6rem;
  flex-shrink: 0;
}
.artist-week-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  margin-top: 0.5rem;
}
.artist-week-count { font-size: 0.85rem; color: var(--muted); min-width: 5ch; text-align: center; }

.btn {
  display: inline-block;
  padding: 0.5rem 1rem;
  border-radius: 8px;
  background: var(--accent);
  color: var(--paper);
  text-decoration: none;
  border: none;
  font-size: 0.9rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s ease;
}
.btn:hover { background: #34506d; }
.btn-secondary { background: transparent; color: var(--ink); border: 1px solid var(--line); }
.btn-secondary:hover { background: var(--teal-soft); border-color: var(--teal); }
.btn-danger { background: transparent; color: var(--gold); border: 1px solid var(--gold); }
.btn-danger:hover { background: var(--gold); color: var(--paper); }
.btn-small { padding: 0.3rem 0.7rem; font-size: 0.8rem; border-radius: 6px; }

.filters {
  display: flex;
  gap: 0.75rem;
  margin: 1rem 0 1.5rem;
  flex-wrap: wrap;
  align-items: center;
}
.filters select {
  padding: 0.4rem 0.6rem;
  font-size: 0.9rem;
  background: var(--paper);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 8px;
  font-family: inherit;
}
.filters a.clear {
  padding: 0.35rem 0.5rem;
  font-size: 0.9rem;
  color: var(--accent);
  text-decoration: underline;
}
.recurring-toggle {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.9rem;
  color: var(--muted);
  cursor: pointer;
}

.event-list { list-style: none; padding: 0; margin: 0; }
.day-header {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1rem;
  letter-spacing: -0.005em;
  margin: 1.5rem 0 0.25rem;
  padding-bottom: 0.35rem;
  border-bottom: 2px solid var(--ink);
}
.day-header:first-child { margin-top: 0; }
.event-card {
  display: flex;
  gap: 1rem;
  padding: 0.9rem 0;
  border-bottom: 1px solid var(--line);
}
.event-card-local {
  border-left: 3px solid var(--accent);
  padding-left: 0.75rem;
  background: var(--accent-soft);
}
.local-artist-badge {
  display: inline-block;
  font-size: 0.68rem;
  font-weight: 600;
  color: var(--paper);
  background: var(--accent);
  border-radius: 999px;
  padding: 0.1rem 0.5rem;
  margin-left: 0.5rem;
  vertical-align: middle;
}
.event-date {
  min-width: 68px;
  color: var(--accent);
  font-weight: 600;
  font-size: 0.9rem;
  white-space: nowrap;
}
.event-thumb {
  width: 64px;
  height: 64px;
  flex-shrink: 0;
  border-radius: 8px;
  overflow: hidden;
  background: var(--line);
  /* Now a link (to the show's own Event Details page), not just a plain
     div -- these two rules keep it looking exactly like the old
     non-clickable thumbnail rather than picking up default <a> styling. */
  display: block;
  text-decoration: none;
}
.event-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.event-thumb-fallback {
  background: var(--paper-warm);
  padding: 8px;
  box-sizing: border-box;
}
.event-thumb-fallback img { object-fit: contain; }
.event-main { flex: 1; }
.event-title { font-weight: 600; }
.genre-tag {
  display: inline-block;
  font-size: 0.7rem;
  font-weight: 500;
  color: var(--gold);
  border: 1px solid var(--gold);
  background: var(--gold-soft);
  border-radius: 999px;
  padding: 0.05rem 0.55rem;
  margin-left: 0.5rem;
  vertical-align: middle;
}
.type-tag {
  display: inline-block;
  font-size: 0.7rem;
  font-weight: 500;
  color: var(--teal);
  border: 1px solid var(--teal);
  background: var(--teal-soft);
  border-radius: 999px;
  padding: 0.05rem 0.55rem;
  margin-left: 0.5rem;
  vertical-align: middle;
}
.recurring-badge {
  display: inline-block;
  font-size: 0.7rem;
  font-weight: 500;
  color: var(--muted);
  border: 1px solid var(--muted);
  background: transparent;
  border-radius: 999px;
  padding: 0.05rem 0.55rem;
  margin-left: 0.5rem;
  vertical-align: middle;
}
.event-venue { color: var(--muted); font-size: 0.9rem; }
.event-artists { font-size: 0.85rem; color: var(--muted); }
.has-description {
  cursor: help;
  border-bottom: 1px dotted var(--muted);
}
.event-link { font-size: 0.85rem; margin-top: 0.25rem; }
.event-link a { color: var(--accent); text-decoration: none; }
.event-link a:hover { text-decoration: underline; }

/* Single-show page (events/detail.html) -- unlike every thumbnail
   elsewhere on the site (calendar card, weekly-artist-gallery card),
   this is the one place meant to show a flyer/image at genuine, uncropped
   size, since the whole point of clicking through here is to actually
   see it. object-fit: contain (not cover) + no fixed height is
   deliberate: a fixed-crop thumbnail would cut off exactly the content
   someone came here to see. */
.event-detail-image { margin: 1rem 0; }
.event-detail-image img { max-width: 100%; max-height: 70vh; border-radius: 8px; display: block; }
.event-detail-description {
  white-space: pre-line;
  line-height: 1.5;
  margin: 1rem 0;
}
.event-actions { font-size: 0.8rem; margin-top: 0.25rem; }
.event-actions form { display: inline; }
.event-actions a, .event-actions button {
  color: var(--muted);
  text-decoration: none;
  background: none;
  border: none;
  cursor: pointer;
  font-size: 0.8rem;
  padding: 0;
  margin-right: 0.75rem;
}
.event-actions a:hover, .event-actions button:hover { color: var(--accent); }

.empty-state { color: var(--muted); padding: 2rem 0; }

.view-toggle { margin: 0.25rem 0 1.25rem; display: flex; gap: 0.5rem; }

.artist-embed { margin: 0.75rem 0 0.5rem; }
.artist-embed iframe { max-width: 100%; display: block; }
/* The gap after the embed on an artist's profile page was still reading as
   "a lot of white space" even after the first pass at this -- the previous
   fix only reduced each side's margin, but adjacent margins in normal flow
   *collapse* to whichever single one is largest rather than adding up, so
   trimming both sides only helps as much as the smaller of the two actually
   was. Zeroing out margin-top entirely on the heading that follows (instead
   of just shrinking it) makes the preceding block's own margin-bottom the
   *only* thing controlling the gap -- deterministic and not dependent on
   whether the admin-only Edit/Delete buttons (.page-actions) happen to sit
   in between artist.embed_code and "Upcoming shows" or not. h2's normal
   2rem top margin (further down this file) is left alone everywhere else
   it's used. */
.artist-embed + h2,
.page-actions + h2 { margin-top: 0 !important; }
.artist-embed + .page-actions { margin-top: 0.5rem; }

table.plain { width: 100%; border-collapse: collapse; }
table.plain th, table.plain td {
  text-align: left;
  padding: 0.5rem 0.4rem;
  border-bottom: 1px solid var(--line);
  font-size: 0.9rem;
  vertical-align: top;
}
table.plain th { font-weight: 600; font-size: 0.8rem; color: var(--muted); }

form.stacked label {
  display: block;
  font-size: 0.85rem;
  font-weight: 600;
  margin: 0.9rem 0 0.25rem;
}
form.stacked input[type=text],
form.stacked input[type=url],
form.stacked input[type=email],
form.stacked input[type=datetime-local],
form.stacked select,
form.stacked textarea {
  width: 100%;
  padding: 0.55rem;
  background: var(--paper);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 8px;
  font-size: 0.95rem;
  font-family: inherit;
}
form.stacked input[type=file] {
  display: block;
  width: 100%;
  padding: 0.4rem 0;
  font-size: 0.9rem;
}
form.stacked textarea { resize: vertical; }
form.stacked .hint { color: var(--muted); font-size: 0.8rem; margin-top: 0.2rem; }
form.stacked .checkbox-row { display: flex; align-items: center; gap: 0.4rem; }
form.stacked .checkbox-row label { display: inline; margin: 0; }
form.stacked .actions { margin-top: 1.5rem; }
.hp-field { position: absolute; left: -9999px; top: -9999px; }

/* Flyer thumbnail in the Gig Submissions review table (gigs/review.html)
   -- rectangular (a flyer is a poster/flyer image, not a headshot),
   fixed small size so a very tall or very wide upload doesn't blow out
   the table row. */
.flyer-thumb { width: 70px; height: 90px; overflow: hidden; border-radius: 4px; background: var(--line); }
.flyer-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }

.artist-checks {
  max-height: 180px;
  overflow-y: auto;
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 0.5rem;
}
.artist-checks label {
  display: block;
  font-weight: 400 !important;
  font-size: 0.9rem !important;
  margin: 0.15rem 0 !important;
}

.venue-card, .artist-card {
  border-bottom: 1px solid var(--line);
  padding: 0.8rem 0;
}
.venue-card .meta, .artist-card .meta { color: var(--muted); font-size: 0.85rem; }
.artist-card { display: flex; gap: 0.9rem; align-items: center; }
.artist-card-main { flex: 1; }
.artist-thumb {
  width: 56px;
  height: 56px;
  flex-shrink: 0;
  border-radius: 50%;
  overflow: hidden;
  background: var(--line);
}
.artist-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.artist-thumb-fallback-img { object-fit: contain !important; padding: 10px; box-sizing: border-box; background: var(--paper-warm); }
.artist-thumb-large {
  width: 160px;
  height: 160px;
  border-radius: 50%;
  overflow: hidden;
  margin-bottom: 0.75rem;
}
.artist-thumb-large img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* .featured-artist-thumb is still used (each artist-week-card's photo) --
   .featured-artist-body (the old single-spotlight's side-by-side layout)
   was removed along with it, since the new gallery stacks each card's
   photo/text vertically instead. */
.featured-artist-thumb { width: 84px; height: 84px; margin-bottom: 0.5rem; }
@media (max-width: 600px) {
  .featured-artist-thumb { width: 64px; height: 64px; }
}
/* Random-local-artist spotlight at the top of the artists index (see
   list_artists()'s hero_artist) -- same accent-left-border + warm-gold
   wash as .featured-artist above, so it reads as the same "spotlight"
   visual language rather than a third unrelated look. */
.artist-hero {
  display: flex;
  gap: 1.25rem;
  align-items: center;
  border: 1px solid var(--line);
  border-left: 4px solid var(--accent);
  border-radius: 14px;
  padding: 1.25rem 1.5rem;
  margin: 1.25rem 0;
  background: var(--highlight-soft);
}
.artist-hero-thumb {
  width: 120px;
  height: 120px;
  flex-shrink: 0;
  border-radius: 50%;
  overflow: hidden;
  background: var(--line);
}
.artist-hero-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.artist-hero-body h2 { margin: 0.1rem 0 0.3rem; }
.artist-hero-body .meta { margin: 0.2rem 0; }
.artist-hero-kicker {
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.75rem !important;
  color: var(--accent) !important;
  font-weight: 600;
}
@media (max-width: 600px) {
  .artist-hero { flex-direction: column; align-items: flex-start; text-align: left; }
  .artist-hero-thumb { width: 96px; height: 96px; }
}

.artist-search {
  display: block;
  width: 100%;
  max-width: 360px;
  padding: 0.5rem 0.7rem;
  margin: 0 0 1rem;
  font-size: 0.9rem;
  font-family: inherit;
  background: var(--paper);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 8px;
}

/* A-Z jump bar -- every letter always renders (even ones with no
   artist) so the row's width/spacing is stable as the roster grows;
   .az-disabled letters are just unclickable placeholders. */
.az-jump {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem;
  margin: 0 0 1.25rem;
  font-size: 0.8rem;
}
.az-jump a, .az-disabled {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.6rem;
  height: 1.6rem;
  border-radius: 6px;
}
.az-jump a {
  color: var(--accent);
  background: var(--accent-soft);
  text-decoration: none;
  font-weight: 600;
}
.az-jump a:hover { background: var(--accent); color: var(--paper); }
.az-disabled { color: var(--muted); opacity: 0.4; }
.artist-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 1rem;
}
/* Occupies its own grid cell right before each new letter's first tile --
   both the A-Z jump bar's scroll target and a visible "you're now in the
   G's" marker, so that cell shows something instead of sitting empty.
   Grid items stretch to the row's full height by default, so this
   matches whatever height the tallest tile in its row happens to be;
   min-height is just a floor for the rare case it ends up alone in a row
   with nothing taller next to it. */
.artist-letter-marker {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 160px;
  border-radius: 10px;
  background: var(--accent-soft);
  color: var(--accent);
  font-size: 3rem;
  font-weight: 800;
  line-height: 1;
  user-select: none;
}
.artist-tile {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--line);
  border-radius: 10px;
  overflow: hidden;
  background: var(--paper-warm);
  text-decoration: none;
  color: inherit;
  transition: transform 0.15s ease, border-color 0.15s ease;
}
.artist-tile:hover { transform: translateY(-2px); border-color: var(--accent); }
.artist-tile-photo { position: relative; width: 100%; aspect-ratio: 1 / 1; background: var(--line); }
.artist-tile-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.artist-tile-fallback-img { object-fit: contain !important; padding: 20%; box-sizing: border-box; background: var(--paper-warm); }
.artist-tile-badge { position: absolute; top: 0.4rem; right: 0.4rem; margin: 0; }
.artist-tile-body { padding: 0.6rem 0.7rem; }
.artist-tile-body strong { display: block; font-size: 0.95rem; margin-bottom: 0.25rem; }
.artist-tile-body .meta { margin: 0.2rem 0 0; font-size: 0.78rem; }
.artist-tile-next { color: var(--muted); }

.source-tag {
  display: inline-block;
  font-size: 0.75rem;
  background: var(--line);
  color: var(--ink);
  padding: 0.05rem 0.45rem;
  border-radius: 6px;
  margin-left: 0.4rem;
}

.raw-sample {
  background: var(--paper-warm);
  color: var(--ink);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 0.75rem;
  font-family: ui-monospace, Menlo, Consolas, monospace;
  font-size: 0.78rem;
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 400px;
  overflow-y: auto;
}

.pending-tag {
  display: inline-block;
  font-size: 0.75rem;
  color: var(--gold);
  background: var(--gold-soft);
  border: 1px solid var(--gold);
  padding: 0.05rem 0.45rem;
  border-radius: 999px;
  margin-left: 0.4rem;
}

.scan-bar-track {
  width: 100%;
  height: 14px;
  background: var(--line);
  border-radius: 999px;
  overflow: hidden;
  margin: 0.75rem 0 0.5rem;
}
.scan-bar-fill {
  height: 100%;
  width: 0%;
  background: var(--teal);
  transition: width 0.2s ease;
}
.scan-status { font-size: 0.9rem; color: var(--muted); min-height: 1.3em; }
.scan-log {
  list-style: none;
  padding: 0;
  margin: 1rem 0 0;
  font-size: 0.85rem;
  max-height: 280px;
  overflow-y: auto;
}
.scan-log li {
  padding: 0.3rem 0;
  border-bottom: 1px solid var(--line);
}
.scan-log li.scan-log-error { color: var(--gold); }
