/* Reihenfolge der Ebenen – in jeder CSS-Datei gleich deklariert, damit es
   egal ist, welche Datei der Browser zuerst sieht. */
@layer tokens, stil, hilfsklassen;

/* Ansichtsspezifisches: Startseite (Neuheiten, Schätze), Erfassen
   (ISBN, Scanner, Modals), Buchdetail, Bild-Zoom, Verwaltungslisten. */
@layer stil{
/* Schätze und Neuzugänge stehen unter dem Suchfeld (renderShop) */
#startLeisten{margin-top:26px}
#neuheiten{margin-bottom:22px}
/* Abschnittstitel wie ein Regalschild: Cinzel, dahinter eine Messinglinie */
#neuheiten h2,#teureBuecher h2,.aehnliche h2{font-size:18px;margin-bottom:12px;display:flex;align-items:center;gap:12px}
#neuheiten h2::after,#teureBuecher h2::after,.aehnliche h2::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--gold,var(--messing-dunkel)),transparent)}
/* Hauptüberschrift der Startseite (startTitelText): klein über der Begrüssung */
.startTitel{margin:10px 0 0;text-align:center;font-size:14px;line-height:1.4;letter-spacing:.1em;color:var(--messing-hell)}
/* „Das könnte dir auch gefallen“ unter der Buchseite (aehnlicheEinsetzen):
   Karten wie bei den Neuzugängen, 6 Spalten = 12 Bücher in zwei vollen
   Zeilen; Handy 3 Spalten, nur 6 */
.aehnliche{margin:26px 0 10px}
.aehnlicheRaster{display:grid;grid-template-columns:repeat(6,1fr);gap:16px 12px}
@media (max-width:560px){
  .aehnlicheRaster{grid-template-columns:repeat(3,1fr)}
  .aehnlicheRaster>.neuCard:nth-child(n+7){display:none}
}
/* Immer 2 volle Zeilen, kein Scrollbalken – die Cover skalieren mit der
   Spaltenbreite statt eine feste Breite zu erzwingen. renderNeuheiten()
   liefert bis 24 Bücher; je nach Fensterbreite 6, 8, 10 oder 12 Spalten
   (eher wenige, damit Cover und Titel gross bleiben – gut lesbar auch für
   ältere Augen), die Bücher über zwei Zeilen hinaus werden ausgeblendet. */
.neuScroll{display:grid;grid-template-columns:repeat(6,1fr);gap:16px 12px;min-width:0}
.neuScroll>.neuCard:nth-child(n+13){display:none}
@media (min-width:1400px){
  .neuScroll{grid-template-columns:repeat(8,1fr)}
  .neuScroll>.neuCard:nth-child(n+13){display:block}
  .neuScroll>.neuCard:nth-child(n+17){display:none}
}
@media (min-width:1800px){
  .neuScroll{grid-template-columns:repeat(10,1fr)}
  .neuScroll>.neuCard:nth-child(n+17){display:block}
  .neuScroll>.neuCard:nth-child(n+21){display:none}
}
@media (min-width:2200px){
  .neuScroll{grid-template-columns:repeat(12,1fr)}
  .neuScroll>.neuCard:nth-child(n+21){display:block}
}
.neuCard{min-width:0;width:100%}
.neuCard .cover,.neuCard .spine{width:100%;height:auto;aspect-ratio:88/126;font-size:20px}
/* Titel und Preis unter den Covers (Schätze, Neu eingetroffen, Zufallsfunde):
   Public Sans statt der feinen Buchschrift – grosse Kleinbuchstaben, gut
   lesbar auch für ältere Menschen; bis 3 Zeilen. Preis in hellem Messing
   (5,7:1 auf dem Grün; Messing allein wären nur 3,8:1). */
.neuCard .titel{
  margin-top:7px;font-family:var(--schrift-text);font-size:15px;font-weight:500;line-height:1.3;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere;
}
.neuCard .preis{font-family:var(--schrift-text);font-size:15px;font-weight:700;margin-top:3px;color:var(--gold,var(--ink));font-variant-numeric:lining-nums}
body[data-ansicht="shop"] .neuCard .preis{color:var(--messing-hell)}
/* Die mittelgrossen Bilder haben keinen weissen Rand mehr (server.js,
   /bilder-mittel): das ganze Bild, unten bündig (in den Schätzen steht das
   Buch auf dem Brett), daneben der Hintergrund. Schatten als drop-shadow,
   damit er dem Bild folgt und nicht dem leeren Rahmen. */
.neuCard .cover{object-fit:contain;object-position:50% 100%;background:none;box-shadow:none;filter:drop-shadow(2px 2px 4px rgba(0,0,0,.45))}
/* Mobil: 2 Zeilen à 3 Bücher – 6 Spalten wären zu klein zum Erkennen,
   die übrigen 6 der 12 Karten werden ausgeblendet. */
@media (max-width:560px){
  .neuScroll{grid-template-columns:repeat(3,1fr);gap:14px 8px}
  .neuScroll>.neuCard:nth-child(n+7){display:none}
  .neuCard .titel,.neuCard .preis{font-size:14px}
}
/* Streifen mit zufälligen Büchern über CHF 50 über dem Begrüssungstext – läuft endlos
   nach links (Liste ist im JS verdoppelt, bei -50% ist man wieder exakt am
   Anfang der zweiten, identischen Hälfte). Pausiert bei Hover/Touch-Fokus und
   respektiert die Betriebssystem-Einstellung "Bewegung reduzieren". */
#teureBuecher{margin-bottom:22px;overflow:hidden}
/* Die Bücher stehen auf einem Holzbrett: Cover sind 120px breit im
   Format 88/126, also ~172px hoch – genau dort liegt das Brett
   (Hintergrund des Streifens, läuft daher nicht mit). Titel und Preis
   stehen darunter wie ein Schild an der Regalkante. */
.teureScrollAussen{overflow:hidden;width:100%;
  background:
    linear-gradient(rgba(0,0,0,.35),transparent) 0 184px / 100% 8px no-repeat,
    linear-gradient(180deg,var(--holz-hell),var(--holz) 45%,var(--holz-dunkel)) 0 172px / 100% 12px no-repeat}
.teureScroll .neuCard .titel{margin-top:20px}
.teureScroll{display:flex;gap:10px;width:max-content;animation:teureLauf 38s linear infinite}
.teureScrollAussen:hover .teureScroll{animation-play-state:paused}
.teureScroll .neuCard{width:120px;flex:0 0 auto}
@keyframes teureLauf{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion: reduce){.teureScroll{animation:none}}
.isbnZeile{display:flex;gap:8px;flex-wrap:wrap;min-width:0;width:100%}
.isbnZeile input{flex:1 1 140px;min-width:0}
.isbnZeile button{flex:0 0 auto;white-space:nowrap}
/* Zoom-Schieber im Scanner: nur sichtbar, wenn die Kamera Zoom kann (JS
   setzt dann hidden=false). :not([hidden]), damit display:flex das
   hidden-Attribut nicht aushebelt – vorher stand display:flex inline und
   die Zeile war deshalb immer sichtbar. */
.zoomZeile:not([hidden]){display:flex;align-items:center;gap:10px}
.scan-overlay{position:fixed;inset:0;background:rgba(0,0,0,.85);z-index:20;display:flex;align-items:center;justify-content:center;padding:16px}
.scan-overlay[hidden]{display:none}
.scan-box{background:#000;border-radius:10px;padding:14px;max-width:420px;width:100%}
.scan-box #scanReader{border-radius:6px;overflow:hidden}
.scan-box #scanReader video{width:100%;display:block}
.scan-box p{color:#fff;margin:10px 0}
.scan-box .btn{width:100%}
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:30;display:flex;align-items:center;justify-content:center;padding:16px}
.modal-overlay[hidden]{display:none}
.modal-box{background:var(--surface);border:1px solid var(--messing-dunkel);border-radius:4px;padding:20px;max-width:480px;width:100%;max-height:85vh;overflow-y:auto}
.modal-box h2{margin-bottom:6px}
.modal-box .kategorieGruppe{margin-bottom:14px}
.modal-box .kategorieGruppe h3{font-size:15px;margin-bottom:6px}
.modal-box .kategorieAktionen{display:flex;gap:10px;margin-top:16px}
.modal-box .kategorieAktionen .btn{flex:1}
label.chipCheck{border:1px solid var(--line);background:var(--bg);padding:6px 12px;border-radius:3px;cursor:pointer;font-size:14px;display:inline-flex;align-items:center;gap:6px}
label.chipCheck:has(input:checked){background:var(--ink);color:var(--bg);border-color:var(--ink)}
.bildVorschau{display:flex;gap:12px;align-items:flex-start;margin-top:8px}
/* Erfassen: Trefferliste der Titelsuche (Bücher ohne ISBN) – eine Ausgabe
   anklicken übernimmt ihre Daten ins Formular. */
.ausgabenListe{list-style:none;margin:0;padding:0;display:grid;gap:6px;max-height:340px;overflow-y:auto}
.ausgabeTreffer{display:grid;gap:2px;width:100%;text-align:left;padding:8px 10px;border:1px solid var(--line);border-radius:4px;background:var(--surface);color:var(--ink);font:inherit;cursor:pointer}
.ausgabeTreffer:hover,.ausgabeTreffer:focus-visible{border-color:var(--messing-dunkel)}
.ausgabeTreffer.gewaehlt{border-color:var(--ink);box-shadow:inset 3px 0 0 var(--ink)}
.ausgabeTitel{font-weight:600}
.ausgabeAngaben,.ausgabeQuelle{font-size:13px;color:var(--muted)}
/* Erfassen: Treffer der Archiv-Suche, mit kleinem Cover links */
.archivTreffer{grid-template-columns:auto 1fr;align-items:center;column-gap:12px}
.archivText{display:grid;gap:2px;min-width:0}
/* Verwaltung → Kategorien: Übersicht mit Suche, je Hauptkategorie eine
   Gruppe, pro Unterkategorie eine Zeile mit Schalter (.schalter) */
.katUebersicht{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px}
.katUebersicht input[type="search"]{flex:1 1 220px;min-width:0;padding:8px 10px;border:1px solid var(--line);border-radius:3px;background:var(--bg);color:var(--ink);font:inherit;font-size:15px}
.katGruppeKopf{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 14px;margin-bottom:6px}
.katGruppeKopf h3{font-size:19px}
.katZeilen{list-style:none;margin:0;padding:0}
.katZeile{display:grid;grid-template-columns:1fr auto 150px;align-items:center;gap:4px 16px;padding:8px 0;border-top:1px solid var(--line)}
.katZeile.aus .katName{color:var(--muted);text-decoration:line-through;text-decoration-color:rgba(110,42,42,.5)}
.katZahl{font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums;text-align:right}
@media (max-width:560px){
  .katZeile{grid-template-columns:1fr auto}
  .katZahl{grid-column:1;grid-row:2;text-align:left}
  .katZeile .schalter{grid-row:1 / span 2;grid-column:2}
}
/* Verwaltung → Nachrecherche und Vorschlag in "Artikel bearbeiten" */
.nrText{margin-top:6px;padding:6px 10px;border-left:3px solid var(--line);font-size:14px;line-height:1.5}
.nrText p+p{margin-top:.6em}
.nrTitel{font-weight:600;text-decoration:underline;text-underline-offset:2px}
.bildVorschau img{width:100px;height:auto;border-radius:4px;box-shadow:0 1px 4px rgba(0,0,0,.25)}
.quelleHinweis{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:4px 0 0}
/* Bildspalte wächst im breiten Shop mit (--buchBildBreite gilt auch für
   .buchDetailBild/.buchDetailSpine in hilfsklassen.css) */
.buchDetail{--buchBildBreite:160px;display:grid;grid-template-columns:var(--buchBildBreite) 1fr;gap:20px;align-items:start}
body[data-ansicht="shop"] .buchDetail{--buchBildBreite:clamp(160px,16vw,320px)}
/* Breite Fenster: Angaben und Beschreibung nebeneinander */
@media (min-width:1100px){
  .buchSeite{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 20px;align-items:start}
}
@media (max-width:560px){
  /* Mobil: Bild oben (zentriert), Daten darunter statt nebeneinander –
     die Beschreibung ist ohnehin schon ein eigenes Panel darunter. */
  .buchDetail{grid-template-columns:1fr}
  .buchDetail>img,.buchDetail>.spine{justify-self:center}
}
/* Buchdetail: Titel in Garamond (lange Titel wären in Cinzel schwer
   lesbar), Angaben-Bezeichnungen als kleine Kapitälchen-Etiketten,
   Beschreibung mit Initiale wie im alten Buchsatz. */
.panel .buchTitel{font-family:var(--schrift-buch);font-weight:600;font-size:28px;line-height:1.2;letter-spacing:0}
body[data-ansicht="shop"] .buchAngaben dt{font-family:var(--schrift-titel);font-size:11.5px;letter-spacing:.06em;align-self:baseline}
body[data-ansicht="shop"] .buchAngaben dd{font-size:16px}
body[data-ansicht="shop"] .buchDetailBild{border:1px solid var(--messing-dunkel);box-shadow:3px 4px 12px rgba(0,0,0,.35)}
.beschreibung h2{font-size:19px}
.beschreibung p{line-height:1.6;max-width:75ch}
.beschreibung p+p{margin-top:.8em}
/* Initiale nur im ersten Absatz */
.beschreibung p:first-of-type::first-letter{float:left;font-family:var(--schrift-titel);font-weight:700;font-size:3.1em;line-height:.85;padding:5px 8px 0 0;color:var(--leder)}
.bildZoomBtn{cursor:zoom-in;border:0;background:none;padding:0;display:block}
.bildZoomOverlay{position:fixed;inset:0;background:rgba(0,0,0,.85);z-index:40;display:flex;align-items:center;justify-content:center;padding:24px;cursor:zoom-out}
.bildZoomOverlay[hidden]{display:none}
.bildZoomOverlay img{max-width:92vw;max-height:88vh;border-radius:4px;box-shadow:0 4px 24px rgba(0,0,0,.5)}
.bildZoomSchliessen{position:fixed;top:16px;right:16px;background:rgba(0,0,0,.55);color:#fff;border:1px solid rgba(255,255,255,.4);border-radius:50%;width:36px;height:36px;font-size:18px;cursor:pointer;line-height:1}
}
