/* GUI — κέλυφος και κοινά στοιχεία (GUI_SPEC §1-§3, §6). Φάση Π1.
 *
 * ΚΑΝΟΝΕΣ ΤΟΥ ΑΡΧΕΙΟΥ:
 *   1. Καμία τιμή χρώματος εδώ — μόνο `var(--…)` από το `tokens.css` (το επιβάλλει test).
 *   2. Λογικές ιδιότητες παντού (`margin-inline`, `inset-inline-end`): η αραβικά/εβραϊκά έκδοση (§B6)
 *      αλλάζει ΜΟΝΟ το `dir` του <html> — κανένα CSS δεν ξαναγράφεται.
 *   3. Ό,τι είναι ζωντανό αναπνέει, ό,τι είναι στατικό δεν κουνιέται· `prefers-reduced-motion` = όλα off.
 */

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * 🏛 Ο ΝΟΜΟΣ ΤΟΥ ΣΠΙΤΙΟΥ — ΔΙΑΒΑΣΕ ΤΟΝ ΠΡΙΝ ΦΤΙΑΞΕΙΣ ΟΘΟΝΗ (05/09)
 *
 * ΤΟ ΠΑΡΑΠΟΝΟ ΠΟΥ ΤΟΝ ΓΕΝΝΗΣΕ, ΑΥΤΟΥΣΙΟ (ιδιοκτήτης, ζωντανά μπροστά στις Μισθώσεις): «ΚΑΜΙΑ στοίχιση,
 * κανένα ωραίο design. Πες στον καλλιτέχνη να δει ΟΛΟ το site.» Ο ίδιος άνθρωπος είχε εγκρίνει το
 * φινίρισμα της «Σήμερα» — άρα το ζητούμενο ΔΕΝ είναι γούστο ανά οθόνη, είναι ΤΟ ΙΔΙΟ γούστο παντού.
 *
 * ΤΙ ΕΙΝΑΙ ΑΥΤΟ ΤΟ ΚΕΙΜΕΝΟ: η απογραφή των ΚΑΛΩΝ οθονών (Σήμερα μετά το φινίρισμα, Στόλος, μπάντα
 * υγείας) γραμμένη ως κανόνας, ώστε η επόμενη οθόνη να μη χρειαστεί να την ανακαλύψει ξανά. Δεν είναι
 * θεωρία: κάθε γραμμή του υπάρχει ήδη ΚΑΠΟΥ στο αρχείο — εδώ απλώς λέγεται μία φορά και για όλους.
 *
 * ── 1. ΚΕΦΑΛΙΔΑ ΣΕΛΙΔΑΣ — `.page-head` (το ιδίωμα του `.td-top`) ─────────────────────────────────
 *   Τίτλος αριστερά, ΨΙΛΑ ΚΑΙ ΚΥΡΙΑ ΠΡΑΞΗ δεξιά, στοίχιση ΣΤΗ ΒΑΣΗ ΤΩΝ ΓΡΑΜΜΑΤΩΝ (`baseline`, ποτέ
 *   `center`: δίπλα σε τίτλο 26 px ένα κουμπί 44 px κεντραρισμένο κάθεται ΠΑΝΤΑ λίγο πιο ψηλά απ' όσο
 *   πρέπει), και ΜΙΑ ΤΡΙΧΑ ΑΠΟ ΚΑΤΩ. Η τρίχα δεν είναι διακόσμηση: χωρίς αυτήν ο τίτλος και το πρώτο
 *   περιεχόμενο είναι δύο πράγματα που τυχαίνει να είναι κοντά — με αυτήν, η κορυφή γίνεται κεφαλίδα
 *   εργαλείου. ΕΝΑ μέγεθος τίτλου σε όλη την εφαρμογή (`h1`), όχι τρία.
 *
 * ── 2. ΕΤΙΚΕΤΑ ΟΡΓΑΝΟΥ, ΟΧΙ ΕΠΙΚΕΦΑΛΙΔΑ ΑΡΘΡΟΥ ──────────────────────────────────────────────────
 *   Κάθε κάρτα/ομάδα/πάνελ τιτλοφορείται με ΜΙΚΡΑ ΓΡΑΜΜΑΤΑ ΜΕ ΑΝΟΙΓΜΑ. ΤΡΕΙΣ βαθμίδες, και μόνο τρεις
 *   (η απογραφή της 05/09 βρήκε ΕΞΙ παραλλαγές για τρεις δουλειές — 11/12/12,5/13,5/17 px, τέσσερα
 *   διαφορετικά ανοίγματα, άλλοτε muted άλλοτε μελάνι):
 *     · ΗΣΥΧΗ (μέσα σε κάρτα)        → `.inc-label` / `.stat-label`: `--fs-xs`, `--muted`, `.04em`.
 *     · ΕΝΟΤΗΤΑ / ΛΩΡΙΔΑ (κεφαλίδα)  → `.td-h-title` / `.set-h2`: `--fs-s`, `--fw-semi`, `.05em`, `--ink`.
 *     · ΜΙΚΡΟ-ΕΤΙΚΕΤΑ ΚΕΦΑΛΑΙΩΝ (κεφαλίδα στήλης/ομάδας μενού, όπου η ΘΕΣΗ λέει ήδη τι είναι)
 *                                    → `.tt-col-h` / `.usr-perm-h` / `.side-group`: `--fs-xs`,
 *                                      `--fw-semi`, `.06em`, `uppercase`, `--muted`.
 *   `h2`/`h3` με τη ΔΙΚΗ τους κλίμακα μέσα σε κάρτα ΔΕΝ μπαίνουν: φέρνουν περιθώρια και τέταρτο μέγεθος.
 *
 * ── 3. ΓΡΑΜΜΗ ΛΙΣΤΑΣ — ΑΡΙΣΤΕΡΑ Η ΤΑΥΤΟΤΗΤΑ, ΔΕΞΙΑ ΤΑ ΨΙΛΑ ──────────────────────────────────────
 *   Στόχος αφής ≥44 px (52 στο κινητό/αυλή). Η ταυτότητα παίρνει `flex: 1 1 …; min-width: 0`· τα ψιλά
 *   πάνε δεξιά με `margin-inline-start: auto` ΚΑΙ `justify-content: flex-end` ΚΑΙ `text-align: end`
 *   (τα τρία μαζί — αλλιώς, τη στιγμή που τυλίγουν, στοιχίζονται αριστερά μέσα σε δεξιά στήλη).
 *   Όποια γραμμή σε πηγαίνει αλλού κουβαλά το ΙΔΙΟ βελάκι: το εικονίδιο `back` γυρισμένο 180°.
 *
 * ── 4. Η ΟΙΚΟΓΕΝΕΙΑ ΤΩΝ ΠΛΑΚΙΔΙΩΝ — ΔΥΟ ΣΧΗΜΑΤΑ, ΚΑΝΕΝΑ ΤΡΙΤΟ ──────────────────────────────────
 *     · `.pill` = ΕΤΙΚΕΤΑ (δεν πατιέται): `3px var(--sp-4)`, `--fs-xs`, `--fw-med`, χωρίς περίγραμμα.
 *     · `.chip` = ΦΙΛΤΡΟ (πατιέται): `5px var(--sp-5)`, `--fs-xs`, `--fw-med`, ΜΕ περίγραμμα.
 *   Ό,τι μοιάζει με πλακίδιο ΕΙΝΑΙ ένα από τα δύο. Μια τρίτη γεωμετρία («2px», «1px sp-3») δεν είναι
 *   λεπτομέρεια: δίπλα-δίπλα διαβάζεται ως δύο διαφορετικά είδη πράγματος, και δεν είναι.
 *
 * ── 5. ΑΡΙΘΜΟΙ: ΠΑΝΤΑ `.num` ────────────────────────────────────────────────────────────────────
 *   Ώρα, ημερομηνία, πλήθος, ποσό, πινακίδα, χιλιόμετρα → κλάση `.num` (`tabular-nums`). Σε λίστα, τα
 *   αναλογικά ψηφία κάνουν κάθε γραμμή να ξεκινά αλλού· αυτό ΕΙΝΑΙ η «καμία στοίχιση» που φαίνεται.
 *   Το ίδιο ισχύει και μέσα σε πρόταση («λήγει 12/07 10:00»): το κείμενο δεν χοροπηδά στην ανανέωση.
 *
 * ── 6. ΡΥΘΜΟΣ: Η ΚΛΙΜΑΚΑ, ΟΧΙ ΤΟ ΜΑΤΙ ──────────────────────────────────────────────────────────
 *   Μόνο `--sp-*`. Το μέτρο της σελίδας: κεφαλίδα→περιεχόμενο `--sp-6`, κάρτα→κάρτα `--sp-5`,
 *   γραμμή→γραμμή λίστας `--sp-3`, μέσα σε γραμμή `--sp-3`/`--sp-4`. Ωμά px μόνο για ΟΠΤΙΚΗ διόρθωση
 *   κάτω από 4 px, και με σχόλιο που λέει γιατί.
 *
 * ── 7. ΤΟ ΧΡΩΜΑ ΕΧΕΙ ΜΙΑ ΔΟΥΛΕΙΑ Η ΚΑΘΕ ΑΠΟΧΡΩΣΗ ───────────────────────────────────────────────
 *   `--accent` = ΤΑΥΤΟΤΗΤΑ ΚΑΙ ΠΛΟΗΓΗΣΗ, ΠΟΤΕ ΚΑΤΑΣΤΑΣΗ — ούτε για 200 ms σε hover. Κατάσταση =
 *   `crit`/`warn`/`ok`, ΜΙΑ ένταση (απαλό φόντο + έγχρωμο κείμενο)· το ΣΥΜΠΑΓΕΣ ανήκει ΜΟΝΟ στο
 *   κρίσιμο· κανένα bold ως τρίτος άξονας. Ο πλήρης νόμος: `components.js`, πάνω από την `vehicleCard`.
 *   Η «μπάρα προσοχής» (`border-inline-start: 3px solid var(--warn)`) είναι ΕΝΑ σχήμα με ΕΝΑ πλάτος —
 *   και ανήκει στο `warn`: το κρίσιμο το λέει το περίγραμμα + η λάμψη της `.card.crit`, όχι λωρίδα.
 *
 * ── 8. ΤΑ ΟΡΙΑ ────────────────────────────────────────────────────────────────────────────────────
 *   390 px πρώτο, δύο θέματα, `prefers-reduced-motion` = όλα off, καμία βιβλιοθήκη, κανένα χρώμα εκτός
 *   `tokens.css`. Ό,τι από τα παραπάνω κλειδώνεται δομικά, κλειδώνεται: `test_gui_house_law.py`.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */

*, *::before, *::after { box-sizing: border-box; }

/* Το `hidden` του HTML πρέπει να κερδίζει: οι δικοί μας κανόνες `#id { display: … }` έχουν μεγαλύτερη
   ειδικότητα από τον προεπιλεγμένο κανόνα του browser και θα εμφάνιζαν στοιχείο που ζητήσαμε να κρυφτεί. */
[hidden] { display: none !important; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font);
  font-size: var(--fs-m);
  line-height: var(--lh-text);
  -webkit-font-smoothing: antialiased;
}

/* Οι αριθμοί ευθυγραμμίζονται σε στήλη — ένα SoC που «χοροπηδά» καθώς ανανεώνεται φαίνεται σαν σφάλμα. */
.num, .mono, table td, input, .metric { font-variant-numeric: tabular-nums; }

a { color: var(--accent); text-decoration: none; }
a:hover { text-decoration: underline; }

:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-s); }

/* ---------------------------------------------------------------- top bar (mockup «Αιγαίο») */
#top {
  display: flex;
  align-items: center;
  gap: var(--sp-7);
  padding: var(--sp-5) var(--sp-8);
  background: var(--card);
  border-block-end: 1px solid var(--line);
  position: sticky;
  inset-block-start: 0;
  z-index: 20;
}

/* 🧷 ΤΟ ΣΥΜΒΟΛΑΙΟ ΤΗΣ ΜΠΑΡΑΣ: ΤΑ ΚΕΙΜΕΝΑ ΥΠΟΧΩΡΟΥΝ, ΟΙ ΣΤΟΧΟΙ ΑΦΗΣ ΠΟΤΕ (05/09)
 *
 * 🚨 ΤΟ ΝΑΥΑΓΙΟ ΠΟΥ ΚΛΕΙΝΕΙ ΕΔΩ: στα 390 px ΚΑΘΕ σελίδα της εφαρμογής είχε 28 px οριζόντια κύλιση
 * (`scrollWidth` 418 σε `clientWidth` 390, μετρημένο σε αληθινό Chrome). Δεν έφταιγε καμία οθόνη —
 * έφταιγε αυτή η μπάρα· γι' αυτό φαινόταν παντού και δεν κατηγορήθηκε πουθενά για εβδομάδες. Ο
 * λογαριασμός: content-box 390 − 28 padding = 362 διαθέσιμα, ενώ τα παιδιά ζητούσαν 131,9 (`.brand`)
 * + 76,6 (`.pill`) + 4 × 34 (κουμπιά) = 344,5, συν 6 κενά × 10 = 404,5. Τα δύο ΚΕΙΜΕΝΑ έχουν
 * `white-space: nowrap` ΧΩΡΙΣ `min-width: 0`, οπότε το αυτόματο `min-width: auto` του flex τα κλείδωνε
 * στο πλήρες πλάτος του κειμένου τους: τίποτα δεν μπορούσε να υποχωρήσει και η διαφορά βγήκε ως κύλιση.
 *
 * ΓΙΑΤΙ ΟΧΙ `max-width` + ΤΕΛΙΤΣΕΣ ΣΤΟ ΠΛΑΚΙΔΙΟ ΤΟΥ ΠΕΛΑΤΗ (η «γρήγορη» λύση): λύνει τα 28 px του
 * «Luna Trips» και τίποτα άλλο. Ο επόμενος πελάτης λέγεται «Mediterraneo Camper Rentals», ο
 * μεθεπόμενος δουλεύει σε iPhone SE στα 375 px — και το ίδιο σφάλμα γυρίζει, τότε όμως σε παραγωγή, σε
 * ξένη οθόνη, χωρίς αυτή τη διάγνωση. ΕΔΩ Η ΛΥΣΗ ΔΕΝ ΞΕΡΕΙ ΚΑΝΕΝΑ ΟΝΟΜΑ: τα κείμενα γίνονται ελαστικά
 * και μοιράζονται ό,τι ΠΕΡΙΣΣΕΥΕΙ από τα κουμπιά, όσο λίγο κι αν είναι αυτό. Το άθροισμα δεν μπορεί να
 * ξεπεράσει το πλάτος — με όνομα δέκα ή εξήντα χαρακτήρων, στα 390 ή στα 320 px.
 *
 * ΠΟΙΟ ΥΠΟΧΩΡΕΙ ΠΡΩΤΟ: ΤΟ ΟΝΟΜΑ ΤΟΥ ΠΡΟΪΟΝΤΟΣ. ΤΕΛΕΥΤΑΙΟ ΦΕΥΓΕΙ ΤΟΥ ΠΕΛΑΤΗ.
 *   · Ο υπάλληλος της Luna ξέρει σε ποιο προϊόν βρίσκεται — και το ΣΗΜΑ δεν φεύγει ποτέ, άρα η μάρκα
 *     μένει στην οθόνη· η λέξη δίπλα στο ίδιο της το σήμα είναι επανάληψη, όχι πληροφορία.
 *   · Το πλακίδιο του πελάτη είναι η ΜΟΝΗ ΚΑΤΑΣΤΑΣΗ που κουβαλά η μπάρα. Σε χρήστη με δύο στόλους
 *     (multi-tenant από την πρώτη μέρα) είναι ο μόνος τρόπος να μη δηλώσει έτοιμο όχημα σε ΛΑΘΟΣ
 *     στόλο, με το όχημα στην πύλη. Ένα κομμένο «WomoRe…» δεν λέει τίποτα· ένα κομμένο
 *     «Mediterraneo Camp…» εξακολουθεί να ονομάζει τον πελάτη.
 *   Η ιεραρχία γράφεται ως ΛΟΓΟΣ ΣΥΡΡΙΚΝΩΣΗΣ (100 προς 1) και όχι ως σκαλοπάτι οθόνης: η μάρκα δίνει
 *   όλο της τον χώρο πριν ο πελάτης δώσει το πρώτο pixel, σε ΚΑΘΕ πλάτος, χωρίς μαγικό αριθμό.
 *
 * ΤΟ ΠΑΤΩΜΑ ΤΟΥ ΣΗΜΑΤΟΣ ΒΓΑΙΝΕΙ ΜΟΝΟ ΤΟΥ — ΓΙ' ΑΥΤΟ ΤΟ `min-width: 0` ΜΠΑΙΝΕΙ ΣΤΟ <span> ΚΑΙ ΟΧΙ ΣΤΟ
 * `.brand`: έτσι το `min-width: auto` του `.brand` παραμένει το min-content του, δηλαδή ΑΚΡΙΒΩΣ το
 * σήμα (26 px) συν το κενό. Το σήμα δεν κόβεται ποτέ, όσο κι αν στενέψει η οθόνη, και δεν χρειάζεται
 * κανένα breakpoint για να το εγγυηθεί. Αν το `min-width: 0` έμπαινε στο `.brand`, με λόγο 100 προς 1
 * θα έτρωγε πρώτο το ΙΔΙΟ ΤΟΥ ΤΟ ΣΗΜΑ και μετά το κείμενο — ακριβώς ανάποδα. */
#top > .brand { flex-shrink: 100; }
#top > .brand > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* `display: block` και όχι το `inline-flex` του `.pill`: το `text-overflow` ισχύει σε block container —
   σε flex container το κείμενο κόβεται στη μέση γράμματος, χωρίς τελίτσες. Και τα δύο πλακίδια που
   μπαίνουν στη μπάρα (όνομα πελάτη, «εγκατάσταση») είναι σκέτο κείμενο, χωρίς κουκκίδα ή εικονίδιο. */
#top > .pill { display: block; flex-shrink: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
/* Ο επιλογέας πολλών στόλων: το `<select>` έχει ΔΙΚΟ του intrinsic πλάτος (η μακρύτερη επιλογή του),
   γι' αυτό δύο `min-width: 0` — μία για το περιτύλιγμα, μία για το ίδιο το control. Τις τελίτσες τις
   δηλώνει ήδη το `.tenant` πιο κάτω. */
#top > .tenant-wrap { flex-shrink: 1; min-width: 0; }
#top > .tenant-wrap > .tenant { min-width: 0; }

/* ΟΙ ΣΤΟΧΟΙ ΑΦΗΣ ΔΕΝ ΣΥΡΡΙΚΝΩΝΟΝΤΑΙ ΠΟΤΕ — κανόνας του σπιτιού για την αυλή (γάντια, ήλιος, όρθιος).
   ΓΡΑΜΜΕΝΟ ΑΝΑΠΟΔΑ ΚΑΙ ΕΠΙΤΗΔΕΣ: «ΟΛΑ τα παιδιά της μπάρας είναι στόχοι αφής, ΕΚΤΟΣ από τα τρία
   κείμενα από πάνω» — αντί για λίστα κουμπιών που κάποιος θα ξεχάσει να ενημερώσει. Έτσι το επόμενο
   κουμπί που θα μπει στη μπάρα είναι καρφωμένο από τη στιγμή που θα μπει, χωρίς να το θυμηθεί κανείς·
   και δεν χρειάζεται να γραφτεί εδώ η κλάση του κουμπιού του Οδηγού, που θα έσπαγε τον φρουρό «καμία
   κλάση του οδηγού έξω από το μπλοκ της» (`test_gui_guide`). Τα `.icon-btn`/`.avatar` το δήλωναν ήδη· τα
   ΠΕΡΙΤΥΛΙΓΜΑΤΑ τους το κρατούσαν κατά τύχη, από το `min-width: auto` — δηλαδή με τον ίδιο ακριβώς
   μηχανισμό που παρήγαγε το σφάλμα. Ο `.spacer` εξαιρείται γιατί είναι στρώμα κενού (`flex-basis: 0`):
   δεν ζητά ποτέ πλάτος, και καρφωμένος θα έπαυε να σπρώχνει τα κουμπιά στην άκρη. */
#top > *:not(.brand, .pill, .tenant-wrap, .spacer) { flex: none; }

.brand {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  font-weight: var(--fw-bold);
  font-size: 16px;
  letter-spacing: .01em;
  color: var(--ink);
  white-space: nowrap;
}
.brand:hover { text-decoration: none; }
.brand svg { flex: none; }
/* Το σήμα παίρνει χρώμα από τα tokens — το `icons.js` δεν ξέρει ούτε ένα hex. */
.mark-bg { fill: var(--accent); }
.mark-fg { stroke: var(--on-accent); fill: none; }
.mark-fg.solid { fill: var(--on-accent); stroke: none; }

/* 🔁 ΟΙ ΚΑΡΤΕΛΕΣ `.tabs` ΕΦΥΓΑΝ ΑΠΟ ΕΔΩ ΤΗΝ 04/09 (Μ1): η πλοήγηση είναι πλέον ΣΤΗΛΗ ΑΡΙΣΤΕΡΑ, με
   ομάδες — το CSS της ζει στο μπλοκ «Μ1» στο τέλος του αρχείου. Δεν κρύφτηκαν με media query: έντεκα
   pills σε μία οριζόντια σειρά δεν χωρούσαν ούτε στα 1100 px, και κάθε νέα οθόνη έκλεβε χώρο από τη
   μάρκα και τον επιλογέα πελάτη. */

.spacer { flex: 1; }

/* Κουμπί εικονιδίου (θέμα, ενέργειες κεφαλίδας) — 34×34 όπως στο mockup. */
.icon-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: var(--ctl);
  height: var(--ctl);
  /* ΧΩΡΙΣ ΑΥΤΟ ΤΟ ΜΗΔΕΝ το γενικό `button` έβαζε padding 8px 18px: το κουτί έμενε 34px, το περιεχόμενο
     γινόταν 0 και το εικονίδιο εξαφανιζόταν. Φάνηκε μόνο σε αληθινό browser (01/09). */
  padding: 0;
  flex: none;
  border-radius: var(--r-s);
  border: 1px solid var(--line);
  background: none;
  color: var(--muted);
  cursor: pointer;
  transition: color var(--t) var(--ease), border-color var(--t) var(--ease);
}
.icon-btn:hover { color: var(--ink); border-color: var(--muted); }
.icon-btn svg { width: 17px; height: 17px; flex: none; display: block; }

.avatar {
  width: var(--ctl);
  height: var(--ctl);
  flex: none;
  padding: 0;                          /* ίδιος λόγος με το .icon-btn */
  border: none;
  border-radius: var(--r-pill);
  background: var(--accent-dim);
  color: var(--on-accent);
  font-family: inherit;
  font-weight: var(--fw-semi);
  font-size: 14px;
  cursor: pointer;
}

/* 🖼 ΤΟ ΛΟΓΟΤΥΠΟ ΤΟΥ ΠΕΛΑΤΗ ΣΤΗ ΜΠΑΡΑ (0127) — ΤΟ AVATAR ΤΟΥ ΣΤΟΛΟΥ, ΔΙΠΛΑ ΣΤΟ ΟΝΟΜΑ ΤΟΥ.
   `object-fit: contain` ΚΑΙ ΟΧΙ `cover`: ένα λογότυπο δεν κόβεται ποτέ. Τα λογότυπα έρχονται σε κάθε
   αναλογία (τετράγωνο σήμα, φαρδύ λεκτικό, όρθιο σαν της Luna) και το `cover` θα έκοβε ακριβώς το
   μέρος που το κάνει αναγνωρίσιμο. Το κουτί μένει σταθερό (26 px, όσο και το σήμα του προϊόντος), η
   εικόνα μπαίνει μέσα του ολόκληρη — μικρότερη αν χρειαστεί.
   ΧΩΡΙΣ ΦΟΝΤΟ ΚΑΙ ΧΩΡΙΣ ΠΕΡΙΓΡΑΜΜΑ: το λογότυπο κουβαλά το δικό του (διαφάνεια ή πλακίδιο). Ένα δικό
   μας πλαίσιο γύρω από ξένη μάρκα είναι ο ασφαλέστερος τρόπος να φαίνεται φτηνό.
   Το `flex: none` το δίνει ήδη ο κανόνας «ό,τι δεν είναι κείμενο είναι στόχος αφής» πιο πάνω —
   γι' αυτό ΔΕΝ γράφεται εδώ: δύο πηγές για το ίδιο θα απέκλιναν. */
.tenant-logo {
  width: 26px;
  height: 26px;
  object-fit: contain;
  border-radius: var(--r-s);
  display: block;
}

/* Επιλογέας πελάτη: μοιάζει με chip, είναι <select> (ένα tap στο κινητό, μηδέν κώδικας popover). */
.tenant {
  font: inherit;
  font-size: var(--fs-xs);
  font-weight: var(--fw-med);
  padding: 3px var(--sp-4);
  max-width: 12rem;
  border-radius: var(--r-pill);
  border: none;
  background: var(--neutral-soft);
  color: var(--ink);
  cursor: pointer;
  appearance: none;
  text-overflow: ellipsis;
}
.tenant-wrap { position: relative; display: inline-flex; align-items: center; }
.tenant-wrap::after {
  content: '▾';
  position: absolute;
  inset-inline-end: var(--sp-4);
  font-size: 10px;
  color: var(--muted);
  pointer-events: none;
}
.tenant-wrap .tenant { padding-inline-end: var(--sp-7); }

/* Μενού λογαριασμού */
.menu-wrap { position: relative; display: flex; }
.menu {
  position: absolute;
  inset-block-start: calc(var(--ctl) + var(--sp-3));
  inset-inline-end: 0;
  min-width: 15rem;
  padding: var(--sp-2);
  background: var(--card2);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--shadow-strong);
  z-index: 30;
}
.menu .who { padding: var(--sp-3) var(--sp-4) var(--sp-2); }
.menu .who b { display: block; font-weight: var(--fw-semi); }
.menu hr { border: none; border-block-start: 1px solid var(--line); margin: var(--sp-2) 0; }
.menu button, .menu a {
  display: block;
  width: 100%;
  text-align: start;
  font: inherit;
  font-size: var(--fs-s);
  padding: var(--sp-3) var(--sp-4);
  border: none;
  border-radius: var(--r-s);
  background: none;
  color: var(--ink);
  cursor: pointer;
}
.menu button:hover, .menu a:hover { background: var(--hover); text-decoration: none; }
.menu .danger { color: var(--crit); }

/* ---------------------------------------------------------------- Επιλογέας γλώσσας (02/09)
   ΕΦΥΓΕ ΑΠΟ ΤΗ ΦΟΥΣΚΑ ΤΟΥ ΛΟΓΑΡΙΑΣΜΟΥ (εδώ ζούσαν τα παλιά κουμπάκια EL/EN/DE) ΚΑΙ ΜΠΗΚΕ ΣΤΗ ΜΠΑΡΑ:
   το avatar δεν υπάρχει πριν από το login, άρα η γλώσσα ήταν απρόσιτη ακριβώς στην οθόνη όπου κάποιος
   ανακαλύπτει ότι δεν διαβάζει τι γράφει. Ίδια γεωμετρία με το `.icon-btn` (ύψος `--ctl`), ώστε γλώσσα,
   θέμα και avatar να κάθονται σε μία γραμμή που δεν χορεύει. */
.lang-wrap { position: relative; display: flex; }
.lang-btn {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  height: var(--ctl);
  flex: none;
  padding: 0 var(--sp-3);              /* ρητό: το γενικό `button` βάζει 8/18 και ψηλώνει τη μπάρα */
  border-radius: var(--r-s);
  border: 1px solid var(--line);
  background: none;
  color: var(--muted);
  font: inherit;
  font-size: var(--fs-xs);
  font-weight: var(--fw-med);
  white-space: nowrap;
  cursor: pointer;
  transition: color var(--t) var(--ease), border-color var(--t) var(--ease);
}
.lang-btn:hover, .lang-btn.active { color: var(--ink); border-color: var(--muted); }

/* 🚩 Η ΣΗΜΑΙΑ ΕΙΝΑΙ ΔΙΚΟ ΜΑΣ SVG, ΟΧΙ EMOJI (Vassilis 02/09).
   Το emoji δούλευε παντού εκτός από τη μισή αγορά-στόχο: σε **Windows + Chrome** το 🇬🇷 δεν αποδίδεται
   και ο browser γράφει τα δύο regional indicator letters — «GR», «DE», «NL» με ΓΡΑΜΜΑΤΑ. Καμία δήλωση
   `font-family` δεν το σώζει: τα Windows δεν έχουν σημαίες σε καμία εγκατεστημένη γραμματοσειρά.
   Τώρα το σχήμα το ζωγραφίζουμε εμείς (`icons.flag`, πλέγμα 20×14) και είναι ίδιο σε κάθε λειτουργικό. */
svg.lang-flag {
  display: block;
  flex: none;
  width: 20px;
  height: 14px;
  border-radius: 2px;
}

/* 🚨 ΤΑ ΜΟΝΑ ΧΡΩΜΑΤΑ ΤΟΥ GUI ΠΟΥ ΔΕΝ ΑΛΛΑΖΟΥΝ ΜΕ ΤΟ ΘΕΜΑ — και σωστά: το μπλε της ελληνικής σημαίας
   είναι το μπλε της ελληνικής σημαίας, όχι απόχρωση της διεπαφής. Οι τιμές ζουν στο `tokens.css`
   (`--flag-*`), όπως ΚΑΘΕ χρώμα· εδώ μόνο η αντιστοίχιση σχήμα → token, ίδιο μοτίβο με τις `.mark-*`
   του σήματος. Το `.fl-edge` ΔΕΝ είναι χρώμα σημαίας: είναι το περίγραμμα, με `--line` του θέματος,
   ώστε NL/FR (λευκό στην άκρη) να μη λιώνουν στο ανοιχτό φόντο. */
.fl-w        { fill: var(--flag-white); }
.fl-gr       { fill: var(--flag-gr-blue); }
.fl-uk-navy  { fill: var(--flag-uk-navy); }
.fl-uk-red   { fill: var(--flag-uk-red); }
.fl-de-black { fill: var(--flag-de-black); }
.fl-de-red   { fill: var(--flag-de-red); }
.fl-de-gold  { fill: var(--flag-de-gold); }
.fl-nl-red   { fill: var(--flag-nl-red); }
.fl-nl-blue  { fill: var(--flag-nl-blue); }
.fl-fr-blue  { fill: var(--flag-fr-blue); }
.fl-fr-red   { fill: var(--flag-fr-red); }
.fl-es-red   { fill: var(--flag-es-red); }
.fl-es-gold  { fill: var(--flag-es-gold); }
.fl-s-w      { stroke: var(--flag-white); }
.fl-s-uk-red { stroke: var(--flag-uk-red); }
.fl-edge     { stroke: var(--line); }
/* ΕΞΙ ΓΛΩΣΣΕΣ ΧΩΡΑΝΕ, Η ΕΒΔΟΜΗ ΘΑ ΚΥΛΑΕΙ: σε κινητό ξαπλωτό (390×~350 px ωφέλιμα) έξι γραμμές των
   40 px φτάνουν ήδη τον πάτο. Χωρίς αυτό, η τελευταία γλώσσα θα ήταν κομμένη και απάτητη. */
.lang-menu { min-width: 11rem; max-height: min(60vh, 20rem); overflow-y: auto; }
.lang-menu button { display: flex; align-items: center; gap: var(--sp-3); min-height: 40px; }
.lang-menu button.active { background: var(--accent-soft); color: var(--ink); font-weight: var(--fw-semi); }

/* ΣΤΟ ΚΙΝΗΤΟ ΜΟΝΟ Η ΣΗΜΑΙΑ (390 px): η μπάρα κρατά ήδη μάρκα, πελάτη, θέμα και avatar — ένα
   «Nederlands» δίπλα τους σπρώχνει το avatar εκτός οθόνης. Το όνομα ΚΡΥΒΕΤΑΙ, δεν λείπει από το DOM:
   ο αναγνώστης οθόνης το βρίσκει, και το `aria-label` λέει τι είναι το κουμπί σε κάθε πλάτος. */
@media (max-width: 719px) {
  .lang-name { display: none; }
  .lang-btn { width: var(--ctl); padding: 0; justify-content: center; }
}

/* ---------------------------------------------------------------- μπάρα κινητού (<720px) */
#bottom {
  position: fixed;
  inset-block-end: 0;
  inset-inline: 0;
  display: none;
  background: var(--card);
  border-block-start: 1px solid var(--line);
  padding-block-end: env(safe-area-inset-bottom);
  z-index: 20;
}
#bottom a {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  height: var(--bottombar-h);
  font-size: 11px;
  color: var(--muted);
}
#bottom a:hover { text-decoration: none; }
#bottom a.active { color: var(--accent); }
#bottom svg { width: 21px; height: 21px; display: block; }

/* ---------------------------------------------------------------- σελίδα
 *
 * 🚨 ΤΟ `inline-size: 100%` ΔΕΝ ΕΙΝΑΙ ΠΛΕΟΝΑΣΜΟΣ — ΕΙΝΑΙ Η ΜΙΣΗ ΟΘΟΝΗ (05/09).
 *
 * ΤΙ ΕΓΙΝΕ: στα 1440 px το `#app` ζούσε σε κολόνα grid 1208 px και έπιανε 646. Δηλαδή κάθε σελίδα
 * ζωγραφιζόταν σε μια στενή λωρίδα στο κέντρο, με τεράστιο κενό αριστερά ΚΑΙ δεξιά. Τα πλακίδια της
 * «Σήμερα» έσπαγαν σε δύο σειρές, οι κάρτες οχημάτων έβγαιναν 2 ανά σειρά αντί για 3, και το
 * περιεχόμενο των καρτών ξεχείλιζε από το περίγραμμά τους.
 *
 * ΤΟ ΑΙΤΙΟ ΗΤΑΝ ΕΔΩ, ΟΧΙ ΣΕ ΚΑΜΙΑ ΟΘΟΝΗ: το `margin-inline: auto`. Σε ΑΠΛΟ block το `width: auto`
 * γεμίζει από μόνο του και το αυτόματο περιθώριο δεν κάνει τίποτα — γι' αυτό έμοιαζε αθώο για μήνες.
 * Μέσα όμως στο grid του `#shell.has-side` το `main` είναι GRID ITEM, και εκεί το αυτόματο περιθώριο
 * ΑΚΥΡΩΝΕΙ το stretch (CSS Grid §10.2: τα auto περιθώρια απορροφούν τον ελεύθερο χώρο ΠΡΙΝ την
 * στοίχιση): ο browser δίνει στο item το intrinsic —shrink-to-fit— πλάτος του ΠΕΡΙΕΧΟΜΕΝΟΥ του και
 * κεντράρει τα υπόλοιπα.
 *
 * ΓΙΑΤΙ ΔΕΝ ΤΟ ΕΙΔΕ ΚΑΝΕΙΣ: ο Στόλος σωζόταν ΚΑΤΑ ΤΥΧΗ — οι κάρτες του θέλουν 1136 px από μόνες τους,
 * οπότε το shrink-to-fit έβγαινε σχεδόν όσο και η κολόνα. Η πιο συχνή σελίδα έκρυβε το σφάλμα για
 * ΟΛΕΣ τις άλλες.
 *
 * ΓΙΑΤΙ ΡΗΤΟ ΠΛΑΤΟΣ ΚΑΙ ΟΧΙ ΣΚΕΤΟ `justify-self: stretch`: όσο υπάρχει auto περιθώριο το stretch
 * αγνοείται, άρα θα έπρεπε να φύγει το `margin-inline: auto` — και τότε σε οθόνη πλατύτερη από
 * `--page-max` (η κολόνα ξεπερνά τα 1440 από τα ~1672 px και πάνω) το `max-width` θα κόλλαγε το
 * περιεχόμενο ΑΡΙΣΤΕΡΑ, με ένα ολόκληρο κενό δεξιά. Με ΡΗΤΟ 100% παίρνουμε και τα δύο: το `main`
 * γεμίζει την κολόνα του, το `max-width` το κόβει στο `--page-max`, και το `margin-inline: auto`
 * κρατά ΑΚΡΙΒΩΣ τη δουλειά για την οποία μπήκε — να κεντράρει ό,τι περισσεύει, στο κινητό και στο
 * γραφείο, μέσα ΚΑΙ έξω από το grid. Φρουρός: `test_gui_main_fills_its_column.py`. */
main {
  padding: var(--sp-7) var(--sp-8) var(--sp-8);
  inline-size: 100%;
  max-width: var(--page-max);
  margin-inline: auto;
}

h1 { font-size: var(--fs-2xl); font-weight: var(--fw-semi); line-height: var(--lh-num); margin: 0 0 var(--sp-6); }
h2 { font-size: var(--fs-l); font-weight: var(--fw-semi); margin: var(--sp-8) 0 var(--sp-4); }
h3 { font-size: var(--fs-m); font-weight: var(--fw-semi); margin: var(--sp-6) 0 var(--sp-3); }
p { margin: 0 0 var(--sp-4); }

/* 🏛 ΚΕΦΑΛΙΔΑ ΣΕΛΙΔΑΣ (νόμος §1) — ΤΟ ΙΔΙΩΜΑ ΠΟΥ ΕΝΕΚΡΙΝΕ Ο ΙΔΙΟΚΤΗΤΗΣ ΣΤΗ «ΣΗΜΕΡΑ», ΓΙΑ ΟΛΟ ΤΟ ΣΠΙΤΙ.
   Εδώ ζει και όχι στην ενότητα της «Σήμερα», γιατί ΔΕΝ είναι της «Σήμερα»: είναι η κορυφή κάθε σελίδας.
   `baseline` και όχι `center`: δίπλα σε τίτλο 26 px, ένα κουμπί 44 px κεντραρισμένο κάθεται πάντα λίγο
   πιο ψηλά από τη γραμμή των γραμμάτων και όλη η κορυφή διαβάζεται στραβή. Η τρίχα από κάτω κάνει την
   κορυφή ΚΕΦΑΛΙΔΑ ΕΡΓΑΛΕΙΟΥ: χωρίς αυτήν, τίτλος και περιεχόμενο είναι δύο πράγματα που τυχαίνει να
   είναι κοντά. Τα ψιλά/η κύρια πράξη φεύγουν δεξιά με τον υπάρχοντα `.spacer` — ΟΧΙ με κανόνα
   `:last-child`, που θα κέρδιζε σε ειδικότητα τις διορθώσεις των 390 px κάθε οθόνης. */
.page-head { display: flex; align-items: baseline; gap: var(--sp-5); flex-wrap: wrap;
             padding-block-end: var(--sp-5);
             margin-block-end: var(--sp-6);
             border-block-end: 1px solid var(--line); }
.page-head h1 { margin: 0; letter-spacing: -.01em; }

/* 🏛 Η ΕΠΙΣΤΡΟΦΗ (νόμος §3) — ΜΙΑ ΓΙΑ ΟΛΟ ΤΟ ΣΠΙΤΙ. Ήταν τέσσερις: το `.rn-back` της μίσθωσης
   (εικονίδιο + λέξη, muted), το «πίσω» των Ρυθμίσεων (ίδιο σχήμα, ΜΠΛΕ), και δύο σελίδες που
   έγραφαν ωμό «← » μέσα σε `.link` — δηλαδή υπογραμμισμένο κείμενο ύψους 20 px, που δεν πιάνεται με
   γάντι και δεν μοιάζει με τίποτα άλλο στην εφαρμογή. Το βέλος είναι ΤΟ ΙΔΙΟ εικονίδιο με το βελάκι
   της πόρτας (`back`), απλώς όχι γυρισμένο: πας πίσω από εκεί που ήρθες.
   ΜΕΛΑΝΙ ΚΑΙ ΟΧΙ ACCENT: μια επιστροφή στην κορυφή κάθε σελίδας βαμμένη μπλε γίνεται το πιο δυνατό
   πράγμα της οθόνης — και η οθόνη δεν υπάρχει για να φύγεις από αυτήν. */
.back-link {
  align-self: flex-start;
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-block-size: 44px; padding: var(--sp-2) var(--sp-3);
  background: none; border: 0; border-radius: var(--r-s);
  font: inherit; font-size: var(--fs-s); font-weight: var(--fw-med);
  color: var(--muted); text-decoration: none; cursor: pointer;
}
.back-link:hover { filter: none; background: var(--hover); color: var(--ink); text-decoration: none; }
.back-link svg { flex: none; }

/* 🏛 ΤΟ ΒΕΛΑΚΙ ΤΗΣ ΠΟΡΤΑΣ (νόμος §3): ΤΟ ΙΔΙΟ ΣΧΗΜΑ ΠΑΝΤΟΥ. Ήταν δύο υλοποιήσεις της ίδιας γωνίας —
   το εικονίδιο `back` γυρισμένο 180° (`.td-caret`, `.rn-caret`, `.dfl-caret`) και το ωμό γλυφικό «›»
   σε bold (`.msg-caret`, πέντε οθόνες). Ίδιο σχέδιο, άλλο πάχος, άλλο ύψος γραμμής, άλλη στοίχιση:
   δίπλα-δίπλα (Συμβάντα: το chip «Μηνύματα ›» πάνω από λίστα με βελάκια-εικονίδια) φαινόταν. Τώρα
   είναι ένα, και ο διαφορετικός ΡΟΛΟΣ λέγεται με την ΚΙΝΗΣΗ: η πόρτα δεν γυρίζει, η αναδίπλωση
   (`.dmg-caret`) γυρίζει όταν ανοίγει. */

.muted { color: var(--muted); }
.small { font-size: var(--fs-s); }
.mono, code { font-family: var(--font-mono); font-size: .88em; }
.big { font-size: var(--fs-2xl); font-weight: var(--fw-semi); line-height: var(--lh-num); }

/* ---------------------------------------------------------------- κάρτες και διάταξη */
.card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: var(--sp-6);
  margin-block-end: var(--sp-5);
  box-shadow: var(--shadow);
}
a.card { display: block; color: inherit; transition: border-color var(--t) var(--ease); }
a.card:hover { text-decoration: none; }
/* 🚨 ΤΟ ΠΕΡΙΓΡΑΜΜΑ ΜΙΑΣ ΚΡΙΣΙΜΗΣ ΚΑΡΤΑΣ ΕΙΝΑΙ ΚΑΤΑΣΤΑΣΗ — ΑΡΑ ΤΟ HOVER ΔΕΝ ΤΟ ΒΑΦΕΙ ACCENT (05/09 β).
   ΤΟ ΖΩΝΤΑΝΟ ΕΥΡΗΜΑ ΤΟΥ ΙΔΙΟΚΤΗΤΗ, ΑΥΤΟΥΣΙΟ: «μπλε γίνεται πάλι». Ο λόγος ήταν ΕΙΔΙΚΟΤΗΤΑ, όχι σειρά:
   το `a.card:hover` είναι (0,2,1) και το `.card.crit` (0,2,0) — δηλαδή το hover κέρδιζε ΠΑΝΤΑ, όπου κι
   αν γραφόταν, και το κόκκινο δαχτυλίδι κάθε κρίσιμης κάρτας γινόταν μπλε όσο ήταν από πάνω το ποντίκι.
   Δεν ήταν σφάλμα της «Σήμερα»: είναι το ΓΕΝΙΚΟ ιδίωμα της κάρτας, άρα έσπαγε ΚΑΙ στον Στόλο — γι' αυτό
   διορθώνεται ΕΔΩ, στην πηγή, και όχι με πιο ειδικό selector μέσα σε μία οθόνη.
   Η ΚΡΙΣΙΜΗ ΚΑΡΤΑ ΔΕΝ ΜΕΝΕΙ ΧΩΡΙΣ ΑΠΑΝΤΗΣΗ ΣΤΟ ΠΟΝΤΙΚΙ: ανάβει στο ΔΙΚΟ ΤΗΣ χρώμα (`--crit-line` →
   `--crit`). Ίδια χειρονομία, ίδια πληροφορία — αλλάζει η ένταση, ποτέ η σημασία. */
a.card:not(.crit):hover { border-color: var(--accent); }
a.card.crit:hover { border-color: var(--crit); }
/* Το κρίσιμο ΔΕΝ παίρνει αριστερή χρωματιστή μπάρα (κλισέ): περίγραμμα + απαλό glow (§1). */
.card.crit { border-color: var(--crit-line); box-shadow: 0 0 0 3px var(--crit-glow), var(--shadow-strong); }

.grid { display: grid; gap: var(--sp-5); grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr)); }
.row { display: flex; gap: var(--sp-4); align-items: center; flex-wrap: wrap; }
.between { display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-4); }
.stack > * + * { margin-block-start: var(--sp-4); }
.narrow { max-width: 26rem; }

/* ---------------------------------------------------------------- chips, κουκκίδες, σοβαρότητα */
.pill {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-xs);
  font-weight: var(--fw-med);
  padding: 3px var(--sp-4);
  border-radius: var(--r-pill);
  background: var(--neutral-soft);
  color: var(--muted);
  white-space: nowrap;
}
.pill.accent { background: var(--accent-soft); color: var(--accent); }
.pill.on { background: var(--ok-soft); color: var(--ok); }
.pill.off { background: var(--crit-soft); color: var(--crit); }
/* 🚨 ΤΟ ΚΙΤΡΙΝΟ ΕΠΑΨΕ ΝΑ ΦΩΝΑΖΕΙ ΟΣΟ ΤΟ ΚΟΚΚΙΝΟ (05/09).
   ΗΤΑΝ `background: var(--warn)` — ΣΥΜΠΑΓΕΣ, δηλαδή ίδια ένταση με το κρίσιμο, σε ΔΕΚΑΠΕΝΤΕ θέσεις
   (Ζημιές, Συμβάντα, Γνώση, Πρωτόκολλα, Routers, Όχημα, Μηνύματα, Σήμερα…). Ο νόμος της σοβαρότητας
   γράφτηκε την ίδια μέρα στην `vehicleCard` και λέει το αντίθετο: ΜΙΑ ένταση (απαλό φόντο + έγχρωμο
   κείμενο), και το ΣΥΜΠΑΓΕΣ ανήκει ΜΟΝΟ στο κρίσιμο — αλλιώς η διαφορά crit/warning είναι μόνο
   απόχρωση, δηλαδή αόρατη σε αχρωματοψία, σε ήλιο και σε ασπρόμαυρη εκτύπωση. Η κάρτα οχήματος ήταν
   ήδη σωστή (`sev-warning`)· ΟΛΗ η υπόλοιπη εφαρμογή διαφωνούσε μαζί της. Τώρα είναι ΤΟ ΙΔΙΟ πλακίδιο. */
.pill.warn, .pill.sev-warning { background: var(--warn-soft); color: var(--warn); }
.pill.crit { background: var(--crit); color: var(--on-crit); }
/* ΠΡΟΤΑΣΗ ΜΕ ΤΟ ΣΧΗΜΑ ΠΛΑΚΙΔΙΟΥ: το `nowrap` του `.pill` είναι σωστό για δύο λέξεις και καταστροφικό
   για ολόκληρη πρόταση — κλειδώνει το πλάτος της στο κείμενό της και βγάζει ΟΛΗ τη σελίδα σε οριζόντια
   κύλιση (μετρημένο στα 390 px, «Σήμερα» 05/09, 7 px). Δύο ακόμα σελίδες το κάνουν σήμερα (Νομικά,
   Γνώση) με `<p class="pill">`. Ό,τι είναι παράγραφος ΔΕΝ είναι πλακίδιο: τυλίγει. */
p.pill { white-space: normal; min-inline-size: 0; }

/* ---------------------------------------------------------------- η κλίμακα σοβαρότητας (05/09)
   «Αλλού κόκκινες ειδοποιήσεις, αλλού κίτρινες, bold κίτρινα… δεν καταλαβαίνει κανείς τη σημασία των
   χρωμάτων.» Ο νόμος ζει γραμμένος στο `components.js` (πάνω από την `vehicleCard`)· εδώ είναι τα δύο
   σκαλοπάτια του:
     · ΑΠΑΛΟ (εδώ)    = «υπάρχει, κοίτα το» — απαλό φόντο, έγχρωμο κείμενο, ΕΝΑ βάρος,
     · ΣΥΜΠΑΓΕΣ (`.solid`, πιο κάτω) = «φωνάζω» — και ανήκει ΜΟΝΟ στο κρίσιμο.
   Έτσι η διαφορά crit/warning ΔΕΝ είναι μόνο απόχρωση αλλά ΕΝΤΑΣΗ: διαβάζεται σε αχρωματοψία και σε
   ασπρόμαυρη εκτύπωση. Το `info`/`customer` δεν παίρνει χρώμα ΚΑΘΟΛΟΥ — χρώμα που μπαίνει παντού παύει
   να σημαίνει κάτι. Το ρητό βάρος στο κρίσιμο ΔΕΝ είναι περιττό: ακυρώνει το `--fw-semi` που κληρονομεί
   από το σκέτο `.sev-critical` από κάτω (εκεί είναι σωστό — είναι τίτλος γραμμής, όχι πλακίδιο). */
.pill.sev-critical { background: var(--crit-soft); color: var(--crit); font-weight: var(--fw-med); }
/* (το `sev-warning` δηλώνεται μαζί με το `.pill.warn` παραπάνω: ΕΙΝΑΙ το ίδιο πλακίδιο) */
.pill.sev-info, .pill.sev-customer { background: var(--neutral-soft); color: var(--muted); }

.dot { width: 8px; height: 8px; border-radius: var(--r-pill); flex: none; background: var(--muted); }
.dot.on { background: var(--ok); box-shadow: 0 0 8px var(--ok); animation: pulse var(--pulse-dot) infinite; }
.dot.off { background: var(--crit); box-shadow: 0 0 8px var(--crit); }

.sev-critical { color: var(--crit); font-weight: var(--fw-semi); }
.sev-warning { color: var(--warn); }
.sev-info, .sev-customer { color: var(--muted); }

/* ---------------------------------------------------------------- κουμπιά και φόρμες */
button, .btn {
  font: inherit;
  font-size: var(--fs-s);
  font-weight: var(--fw-med);
  padding: var(--sp-3) var(--sp-6);
  border-radius: var(--r-s);
  border: 1px solid var(--accent);
  background: var(--accent);
  color: var(--on-accent);
  cursor: pointer;
  transition: filter var(--t) var(--ease);
}
button:hover { filter: brightness(1.08); }
button.ghost { background: none; color: var(--accent); }
button.ghost:hover { background: var(--accent-soft); }
button.link {
  background: none;
  border: none;
  color: var(--muted);
  padding: var(--sp-2) var(--sp-3);
  text-decoration: underline;
}
button.link:hover { color: var(--ink); }
button.danger { background: none; border-color: var(--crit); color: var(--crit); }
button[disabled] { opacity: .55; cursor: progress; filter: none; }

input, select, textarea {
  font: inherit;
  font-size: var(--fs-m);
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--r-s);
  border: 1px solid var(--line);
  background: var(--bg2);
  color: var(--ink);
  width: 100%;
  max-width: 22rem;
}
input:focus, select:focus, textarea:focus { border-color: var(--accent); outline: none; }
/* Το γενικό `width: 100%` είναι για πεδία κειμένου. Ένα checkbox σε πλάτος 22rem δεν είναι πεδίο, είναι
   λωρίδα — και η ετικέτα του καταλήγει στην άλλη άκρη της οθόνης (φάνηκε σε αληθινό browser, 01/09). */
input[type='checkbox'], input[type='radio'] { width: auto; max-width: none; }
input[type='number'] { max-width: 6rem; }
label.row { display: flex; align-items: center; gap: var(--sp-3); }
input::placeholder { color: var(--muted); }
label { display: block; margin: var(--sp-5) 0 var(--sp-2); font-size: var(--fs-s); color: var(--muted); }

/* ---------------------------------------------------------------- πίνακες */
table { width: 100%; border-collapse: collapse; font-size: var(--fs-s); }
td, th { text-align: start; padding: var(--sp-3) var(--sp-4); border-block-end: 1px solid var(--line); vertical-align: top; }
th { color: var(--muted); font-weight: var(--fw-med); }
tr:last-child td { border-block-end: none; }
.src { color: var(--muted); padding-inline-start: var(--sp-7); }

details.card > summary { cursor: pointer; color: var(--accent); }

/* ---------------------------------------------------------------- καταστάσεις (§6) */
#toast {
  position: fixed;
  inset-inline-start: 50%;
  transform: translateX(-50%);
  inset-block-end: calc(var(--sp-7) + env(safe-area-inset-bottom));
  background: var(--card2);
  color: var(--ink);
  border: 1px solid var(--line);
  box-shadow: var(--shadow-strong);
  padding: var(--sp-4) var(--sp-6);
  border-radius: var(--r);
  max-width: 90vw;
  /* 🚨 ΠΑΝΩ ΑΠΟ ΚΑΘΕ ΠΕΤΑΣΜΑ (05/09). Ήταν 40, δηλαδή ΚΑΤΩ από το `.rn-modal` (60): κάθε μήνυμα που
     έβγαινε από ανοιχτό popup ήταν κυριολεκτικά αόρατο — μετρημένο με `elementFromPoint` στο ζωντανό,
     «ΚΑΛΥΜΜΕΝΟ από rn-go-big», γιατί το toast κάθεται ακριβώς πίσω από το sticky footer. Ο χειριστής
     πατούσε «δες τι θα γίνει» και δεν έβλεπε τίποτα. Ένα μήνυμα που δεν φαίνεται είναι χειρότερο από
     κανένα: ο άνθρωπος ξαναπατάει, και την τρίτη φορά δεν εμπιστεύεται την οθόνη. */
  z-index: 80;
}
#toast.bad { border-color: var(--crit-line); color: var(--crit); }

/* Φόρτωση: σκελετοί, όχι spinner σε όλη τη σελίδα — η οθόνη κρατά το σχήμα της. */
.skeleton {
  background: var(--skeleton);
  border-radius: var(--r);
  animation: breathe 1.6s ease-in-out infinite;
}
.skeleton.line { height: 12px; margin-block-end: var(--sp-3); }
.skeleton.card-sk { height: 8.5rem; }

/* Κείμενο μόνο για αναγνώστες οθόνης (π.χ. «Φόρτωση…» πάνω από τους σκελετούς). */
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.empty { text-align: center; color: var(--muted); padding: var(--sp-8) var(--sp-5); }
.empty svg { width: 96px; height: 96px; color: var(--line); margin-block-end: var(--sp-5); }

@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
@keyframes breathe { 0%, 100% { opacity: 1; } 50% { opacity: .5; } }

/* ---------------------------------------------------------------- Στόλος (Π2): μπάντα υγείας */
.band {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--sp-6);
  margin-block-end: var(--sp-6);
}
.stat {
  overflow: hidden;
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
  padding: var(--sp-5) var(--sp-6);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--shadow);
  font: inherit;
  text-align: start;
  color: inherit;
}
.stat:hover { filter: none; }
.stat.clickable { cursor: pointer; transition: border-color var(--t) var(--ease); }
.stat.clickable:hover { border-color: var(--accent); }
.stat.active { border-color: var(--accent); background: var(--card2); }
.stat-label { font-size: var(--fs-xs); color: var(--muted); letter-spacing: .04em; }
.stat-main { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-4);
             flex-wrap: wrap; min-width: 0; }
.stat-main .spark { max-width: 100%; }
.stat-value { font-size: 30px; font-weight: 650; line-height: var(--lh-num); color: var(--ink); }
.stat-value.warn { color: var(--warn); }
.stat-value.crit { color: var(--crit); }
.stat-unit { font-size: var(--fs-l); font-weight: var(--fw-med); color: var(--muted); white-space: nowrap; }
.stat-sub { font-size: var(--fs-xs); color: var(--muted); }

/* ---------------------------------------------------------------- Στόλος: φίλτρα και ένδειξη ζωής */
.fleet-tools { display: flex; align-items: center; gap: var(--sp-4); margin-block-end: var(--sp-5); flex-wrap: wrap; }
.chips { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
.chip {
  font: inherit;
  font-size: var(--fs-xs);
  font-weight: var(--fw-med);
  padding: 5px var(--sp-5);
  border-radius: var(--r-pill);
  border: 1px solid var(--line);
  background: none;
  color: var(--muted);
  cursor: pointer;
}
.chip:hover { color: var(--ink); filter: none; }
.chip.active { background: var(--accent-soft); color: var(--ink); border-color: transparent; }

/* Ψαχτήρι στόλου: το γενικό `input` (22rem) θα έσπρωχνε τα φίλτρα στην επόμενη σειρά. Το πεδίο παίρνει
   ό,τι περισσεύει, μαζεύεται χωρίς να σπάει τη γραμμή, και έχει το ύψος των chip δίπλα του. */
.fleet-search {
  flex: 1 1 10rem;
  min-width: 0;
  max-width: 15rem;
  font-size: var(--fs-s);
  padding: var(--sp-2) var(--sp-4);
}
.fleet-search::-webkit-search-cancel-button { cursor: pointer; margin-inline-start: var(--sp-2); }
@media (max-width: 719px) {
  .fleet-search { flex: 1 1 100%; max-width: none; }
}
.live { display: inline-flex; align-items: center; gap: var(--sp-2); color: var(--muted); }
.live.off { color: var(--warn); }

/* ---------------------------------------------------------------- Στόλος: κάρτα οχήματος */
.cards { grid-template-columns: repeat(auto-fill, minmax(18.5rem, 1fr)); }
.vcard { display: flex; flex-direction: column; gap: var(--sp-5); padding: var(--sp-6) var(--sp-6) 13px; margin: 0; }
/* 🚨 ΤΙΠΟΤΑ ΕΞΩ ΑΠΟ ΤΟ ΠΕΡΙΓΡΑΜΜΑ (05/09): η κάρτα ζει σε κολόνα `minmax(17rem, 1fr)` — δηλαδή σε 272 px
   όταν το πλέγμα στενέψει. Χωρίς `flex-wrap`, το όνομα (κουκκίδα + κωδικός + πινακίδα) και τα πλακίδια
   κατάστασης έχουν όλα `min-width: auto`, οπότε η σειρά κλειδώνει στο άθροισμα των min-content τους και
   το τελευταίο πλακίδιο βγαίνει ΕΞΩ από την κάρτα, κομμένο στη μέση («διο…»). Η σωστή υποχώρηση είναι
   ΓΡΑΜΜΗ ΠΑΡΑΚΑΤΩ, όχι κόψιμο: το `wrap` τη δίνει, το `min-inline-size: 0` αφήνει το όνομα να στενέψει,
   και το `overflow-wrap` σώζει τον έναν κωδικό χωρίς κενά που δεν χωρά ούτε μόνος του. */
.vcard-top { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; }
.vcard-name { display: flex; align-items: center; gap: var(--sp-3); font-size: 15.5px; font-weight: var(--fw-semi); color: var(--ink);
              min-inline-size: 0; overflow-wrap: anywhere; }
/* ΚΑΙ ΤΟ ΙΔΙΟ ΤΟ ΠΛΑΚΙΔΙΟ ΤΥΛΙΓΕΙ, όταν η λέξη της κατάστασης δεν χωρά ούτε μόνη της σε μια γραμμή: το
   λεξιλόγιο έρχεται από τη ΒΑΣΗ και σε έξι γλώσσες («nicht verfügbar»), δηλαδή το πλάτος του δεν το
   ξέρουμε τη στιγμή που γράφεται το CSS. Δύο γραμμές μέσα στο πλακίδιο είναι άσχημες· μισή λέξη έξω
   από την κάρτα είναι χαλασμένη οθόνη. */
.vcard-top .pill { white-space: normal; }
.vcard-body { display: flex; align-items: center; gap: var(--sp-5); }
.vcard-side { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.vcard-extra { font-size: 12.5px; color: var(--muted); }
.vcard-extra.crit { color: var(--crit); }
.vcard-extra.warn { color: var(--warn); }
/* Η γραμμή του πελάτη (02/09, «communication first»): πρώτη στη στήλη και — ΜΟΝΟ όταν ζητά πράξη —
   έγχρωμη· η ήσυχη επαφή μένει σβηστή.
   🚨 ΤΟ ΒΑΡΟΣ ΕΦΥΓΕ (05/09, «bold κίτρινα»): ήταν ο ΤΡΙΤΟΣ άξονας έμφασης στην ίδια κάρτα (χρώμα,
   ένταση πλακιδίου, βάρος κειμένου) και κανείς δεν διάβαζε πια τι σημαίνει ο καθένας. Το επιχείρημα του
   02/09 («αλλιώς χάνεται δίπλα στο ψυγείο 4,1°») έχει λήξει: ο αριθμός του ψυγείου ΔΕΝ είναι πια σε
   αυτή τη στήλη. Η έμφαση μένει εκεί που ήταν πάντα η δυνατή — Η ΘΕΣΗ: πρώτη γραμμή, και χρώμα. */
/* Παγωμένη τιμή: γκριζάρει ΚΑΙ λέει πόσο παλιά είναι (§2). Ποτέ κρυμμένη — μια τιμή που εξαφανίζεται
   χωρίς εξήγηση είναι χειρότερη από μια τιμή που παραδέχεται την ηλικία της. */
.vcard-extra.stale { opacity: .55; text-decoration: line-through solid; text-decoration-thickness: 1px; }
.vcard-extra.stale .age { text-decoration: none; display: inline-block; }
.ring.stale { opacity: .45; }
/* Ίδιος κανόνας με το `.vcard-top`, ίδιος λόγος: «3 ειδοποιήσεις» δίπλα σε «πριν 2 ώρες» δεν χωρά σε
   στενή κολόνα, και ένα πλακίδιο μισό έξω από την κάρτα διαβάζεται ως χαλασμένη οθόνη. */
.vcard-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; font-size: var(--fs-xs); color: var(--muted); }
/* Τιμή που μόλις ενημερώθηκε: 300ms λάμψη. Ό,τι είναι ζωντανό αναπνέει (§1) — τίποτα άλλο δεν κουνιέται. */
.vcard.flash { animation: flash var(--flash) var(--ease); }
@keyframes flash { from { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); } }

/* Δαχτυλίδι SoC και γραμμούλα: χρώμα ΜΟΝΟ από κλάση, ποτέ από attribute (θέμα + αχρωματοψία). */
.ring, .spark { flex: none; }
.ring-track { fill: none; stroke: var(--line); }
.ring-value { fill: none; stroke: var(--accent); }
/* Το τόξο βάφεται από ΤΗ ΔΙΚΗ ΤΟΥ μέτρηση (κανόνας 4): κόκκινο εδώ σημαίνει «η ΜΠΑΤΑΡΙΑ είναι κρίσιμη»,
   ποτέ «το όχημα έχει κάπου αλλού κρίσιμο» — μέχρι τις 05/09 σήμαινε το δεύτερο και κατηγορούσε τον αθώο. */
.ring-value.crit { stroke: var(--crit); }
.ring-value.warn { stroke: var(--warn); }
.ring-text { fill: var(--ink); }
/* Το «%» και το εικονίδιο μπαταρίας μέσα στο δαχτυλίδι (02/09 β): ΤΟΝΟΣ κάτω από τον αριθμό, ώστε το
   μάτι να πιάνει πρώτα το «73» και μετά να καταλαβαίνει τι είναι. Ίδιο μοτίβο με το `.tile-unit`.
   Το εικονίδιο παίρνει χρώμα από `color` (το `icons.js` ζωγραφίζει με `currentColor`). */
.ring-unit { fill: var(--muted); font-weight: var(--fw-med); }
.ring-icon { color: var(--muted); }
.ring-empty {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 2px dashed var(--line);
  border-radius: var(--r-pill);
  color: var(--muted);
  font-size: 11px;
  /* ΚΥΚΛΟΣ ΚΑΙ ΟΧΙ ΕΤΙΚΕΤΑ: τη διάμετρο τη δίνει το `components.js` (ίδια με το δαχτυλίδι δίπλα).
     Το ελάχιστο εδώ δεν αλλάζει τίποτα στη ζωγραφιά — δηλώνει ΣΧΗΜΑ, ώστε να μη διαβαστεί ποτέ ως
     πλακίδιο εκτός οικογένειας (νόμος §4, `test_gui_house_law`). */
  min-inline-size: 1em;
}

/* ---------------------------------------------------------------- το σήμα του μεγέθους που φταίει (05/09)
   Ίδια θέση και ίδιο μέγεθος με το δαχτυλίδι, ΑΛΛΗ ΥΠΟΣΧΕΣΗ: το τόξο λέει «τόσο τοις εκατό», και τα
   10,1 °C δεν είναι ποσοστό — ένα τόξο στο 10 % του κύκλου θα ήταν κυριολεκτικά ψέμα. Εδώ ο δίσκος είναι
   ΓΕΜΑΤΟΣ (απαλό χρώμα σοβαρότητας) με συμπαγές περίγραμμα: σήμα, όχι μετρητής.
   Η σοβαρότητα δεν κρέμεται από το χρώμα — τη λένε ήδη το περίγραμμα της κάρτας, το πλακίδιο των
   ειδοποιήσεων και το `aria-label`/tooltip του ίδιου του σήματος, με λέξη («ΚΡΙΣΙΜΟ»). */
.mdial { flex: none; }
.mdial-face { fill: var(--crit-soft); stroke: var(--crit); }
.mdial.warn .mdial-face { fill: var(--warn-soft); stroke: var(--warn); }
.mdial-text { fill: var(--crit); font-weight: var(--fw-semi); }
.mdial.warn .mdial-text { fill: var(--warn); }
.mdial-unit { font-weight: var(--fw-med); opacity: .78; }
.mdial-icon { color: var(--crit); }
.mdial.warn .mdial-icon { color: var(--warn); }
/* Η μπαταρία που υποχώρησε: εικονίδιο + αριθμός σε μία ψιλή γραμμή, στον τόνο των υπόλοιπων «έξτρα».
   Το εικονίδιο ΔΕΝ συρρικνώνεται όταν στενέψει η κολόνα — αλλιώς γίνεται μουτζούρα δίπλα στο «98 %». */
.vcard-extra.soc { display: flex; align-items: center; gap: 5px; color: var(--muted); }
.vcard-extra.soc svg { flex: none; }

.spark polyline { stroke: var(--accent); }
.spark-end { fill: var(--accent); }
.spark.crit polyline { stroke: var(--crit); }
.spark.crit .spark-end { fill: var(--crit); }

@media (max-width: 1100px) { .band { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* ---------------------------------------------------------------- Στόλος: ο χάρτης (Π2, 02/09)
 *
 * Ο χάρτης δεν έχει βιβλιοθήκη — άρα ΟΛΟ το σχήμα του είναι εδώ (`map.js` γράφει μόνο θέσεις σε pixel).
 * ΚΑΝΕΝΑ ΧΡΩΜΑ ΣΤΟ SVG: οι πινέζες παίρνουν χρώμα από κλάση, όπως το δαχτυλίδι SoC — αλλιώς στο δεύτερο
 * θέμα βγαίνουν αόρατες. Τα ΠΛΑΚΙΔΙΑ έρχονται όπως είναι από τον OSM (φωτεινά και στα δύο θέματα)· το
 * πλαίσιο, οι πινέζες και τα κουμπιά είναι δικά μας και ακολουθούν το θέμα.
 */
.map-card { margin-block-end: var(--sp-5); }
.map-view {
  position: relative;
  height: 420px;
  margin-block-start: var(--sp-4);
  border: 1px solid var(--line);
  border-radius: var(--r);
  overflow: hidden;
  background: var(--card2);
  cursor: grab;
  user-select: none;
  /* Το σύρσιμο ΜΕΤΑΚΙΝΕΙ ΤΟΝ ΧΑΡΤΗ — δεν σκρολάρει τη σελίδα. Ίδια σύμβαση με κάθε χάρτη· χωρίς αυτό, σε
     κινητό ο χάρτης είναι εικόνα που δεν πιάνεται. Η σελίδα σκρολάρει από παντού αλλού. */
  touch-action: none;
}
.map-view.dragging { cursor: grabbing; }
.map-tiles, .map-marks { position: absolute; inset: 0; }
.map-marks { pointer-events: none; }        /* το κενό ανάμεσα στις πινέζες ανήκει στο σύρσιμο */
.map-tile {
  position: absolute;
  top: 0;
  left: 0;
  width: 256px;
  height: 256px;
  display: block;
  background: var(--card2);                 /* γκρι τετράγωνο όσο φορτώνει */
}
/* Πλακίδιο που δεν ήρθε: ΕΞΑΦΑΝΙΖΕΤΑΙ, δεν γίνεται σπασμένη εικόνα. Από κάτω είναι το ίδιο γκρι της
   κάρτας, οπότε η τρύπα δεν φαίνεται· το εικονίδιο «broken image» του browser φαινόταν από χιλιόμετρα. */
.map-tile.missing { visibility: hidden; }

/* Πινέζα οχήματος: η ΜΥΤΗ είναι η θέση, γι' αυτό το -100 % στον κατακόρυφο άξονα. */
.map-mark {
  position: absolute;
  top: 0;
  left: 0;
  padding: 0;
  border: none;
  background: none;
  line-height: 0;
  cursor: pointer;
  pointer-events: auto;
  transform: translate(-50%, -100%);
}
.map-mark:hover { filter: none; }
/* Πινέζα ΧΩΡΙΣ σύννεφο (σελίδα οχήματος): σχήμα, όχι κουμπί — δεν πιάνει τον δείκτη, ώστε το σύρσιμο του
   χάρτη να δουλεύει και πάνω της. Σε κάρτα 260px η πινέζα και η αυλή σκεπάζουν το μισό κάδρο. */
.map-mark.static { pointer-events: none; }
.map-mark.site { transform: translate(-50%, -50%); }
/* Παλιά θέση: ξεθωριάζει, ΔΕΝ εξαφανίζεται — «δεν ξέρω πού είναι» δεν γράφεται ποτέ ως κενός χάρτης. */
.map-mark.stale { opacity: .45; }
.map-mark:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--r-s); }
.mk-pin { fill: var(--muted); stroke: var(--card); stroke-width: 1.5; }
.mk-eye { fill: var(--card); }
.map-mark.out .mk-pin { fill: var(--accent); }        /* σε μίσθωση = έξω, με το χρώμα ταυτότητας */
.map-mark.crit .mk-pin { fill: var(--crit); }
/* ΣΗΜΕΙΑ ΕΞΥΠΗΡΕΤΗΣΗΣ (0071): κύκλος με το ΚΕΝΤΡΟ του πάνω στη θέση — γι' αυτό -50 % και στους δύο άξονες,
   όπως η αυλή και όχι όπως η πινέζα οχήματος (που έχει μύτη). Μικρότερα και πιο ήσυχα από το όχημα: είναι
   το πλαίσιο της απάντησης, όχι η απάντηση. Το `pointer-events` ΜΕΝΕΙ ενεργό ακόμα και σε χάρτη χωρίς
   σύννεφα (σελίδα οχήματος): μια πινέζα POI χωρίς όνομα και απόσταση δεν λέει τίποτα, άρα πρέπει να
   πατιέται — το `map.js` της δίνει `<button>` ανά σημείο, όχι ανά χάρτη. */
.map-mark.poi { transform: translate(-50%, -50%); }
.mk-poi { fill: var(--card); stroke: var(--accent); stroke-width: 1.3; }
/* ΤΟ ΣΧΗΜΑ ΞΕΧΩΡΙΖΕΙ ΤΑ ΕΙΔΗ, ΟΧΙ ΤΟ ΧΡΩΜΑ (§2, αχρωματοψία): ένα χρώμα για όλα τα POI — λέει μόνο «αυτό
   δεν είναι όχημα». Βέλος = εκκένωση, τρίγωνο = camping, σταγόνα = νερό, φιάλη = υγραέριο. */
.mk-poi-glyph { fill: none; stroke: var(--accent); stroke-width: 1.5; stroke-linecap: round;
                stroke-linejoin: round; }
.mk-site { fill: var(--card); stroke: var(--ink); stroke-width: 1.6; }
.mk-roof { fill: none; stroke: var(--ink); stroke-width: 1.6; stroke-linejoin: round; stroke-linecap: round; }
/* Οι ετικέτες των αυλών ζωγραφίζονται μόνο όταν ο χάρτης είναι αρκετά κοντά (`named`, βλ. map.js). */
.map-marks:not(.named) .map-label { display: none; }
.map-label {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  margin-block-start: 4px;
  /* Η ΓΕΩΜΕΤΡΙΑ ΤΟΥ `.pill` (νόμος §4): ήταν `1px var(--sp-3)`, δηλαδή τρίτο ύψος πλακιδίου — και
     φαίνεται ακριβώς εκεί που πρέπει, γιατί πάνω από τον ίδιο χάρτη κάθονται τα κανονικά chip. */
  padding: 3px var(--sp-4);
  white-space: nowrap;
  line-height: 1.35;
  font-size: var(--fs-xs);
  font-weight: var(--fw-semi);
  color: var(--ink);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r-pill);
}

.map-pop {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 6;
  transform: translate(-50%, -100%);
  margin-block-start: -34px;
  min-width: 9rem;
  max-width: 15rem;
  padding: var(--sp-4) var(--sp-5);
  display: flex;
  flex-direction: column;
  gap: 2px;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--shadow-strong);
  pointer-events: auto;
}
/* Πινέζα κοντά στην κορυφή: το σύννεφο πέφτει από κάτω αντί να κοπεί στο περιθώριο της κάρτας. */
.map-pop.below { transform: translate(-50%, 0); margin-block-start: 14px; }
.map-pop-top { display: flex; align-items: baseline; gap: var(--sp-3); }
.map-pop a { display: inline-block; margin-block-start: var(--sp-2); }

.map-zoom {
  position: absolute;
  inset-block-start: var(--sp-4);
  inset-inline-end: var(--sp-4);
  z-index: 5;
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
}
.map-btn {
  width: 30px;
  height: 30px;
  padding: 0;
  font-size: var(--fs-l);
  line-height: 1;
  color: var(--ink);
  background: var(--card);
  border: 1px solid var(--line);
  box-shadow: var(--shadow);
}
.map-btn:hover { filter: none; border-color: var(--accent); }

/* ΥΠΟΧΡΕΩΤΙΚΗ, ΟΧΙ ΔΙΑΚΟΣΜΗΤΙΚΗ: η άδεια των πλακιδίων (ODbL) ζητά ορατή αναφορά. Μένει μόνιμα. */
.map-attr {
  position: absolute;
  inset-block-end: 0;
  inset-inline-end: 0;
  z-index: 5;
  padding: 1px var(--sp-3);
  font-size: var(--fs-xs);
  color: var(--muted);
  background: var(--card);
  border-start-start-radius: var(--r-s);
}
.map-attr a { color: var(--muted); }

@media (max-width: 719px) { .map-view { height: 260px; } }

/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   «ΣΗΜΕΡΑ» (απόφαση μ, 04/09 · ιδίωμα Splynx, 05/09) — ΠΛΑΚΙΔΙΑ ΑΠΟ ΠΑΝΩ, ΠΑΝΕΛ ΑΠΟ ΚΑΤΩ
   ══════════════════════════════════════════════════════════════════════════════════════════════════
   ΤΙ ΑΛΛΑΞΕ ΚΑΙ ΓΙΑΤΙ (η κριτική του ιδιοκτήτη, ρητή: «απαράδεκτο»): η πρώτη εκδοχή ήταν ΜΙΑ ΚΑΘΕΤΗ
   ΣΤΟΙΒΑ από κάρτες με λίστες μέσα — λειτουργική, αλλά διαβαζόταν σαν ΑΝΑΦΟΡΑ. Ένας πίνακας ελέγχου
   έχει ΔΥΟ ΕΠΙΠΕΔΑ: μια σειρά πλακίδια-αριθμούς που σκανάρονται σε ΕΝΑ δευτερόλεπτο, και από κάτω τα
   πάνελ με τη λεπτομέρεια. Το πρώτο απαντά «πού να κοιτάξω», το δεύτερο «τι ακριβώς».

   ΠΥΚΝΟΤΗΤΑ: είναι ΕΡΓΑΛΕΙΟ ΕΡΓΑΣΙΑΣ, όχι σελίδα προϊόντος. Ο υπάλληλος θέλει να δει τα πάντα χωρίς
   κύλιση στο desktop — γι' αυτό ο τίτλος και η μέρα μοιράζονται ΜΙΑ γραμμή, τα πλακίδια είναι χαμηλά
   και οι γραμμές των πάνελ μονόσειρες όπου χωρούν.

   ΤΟ ΜΕΤΡΟ ΤΗΣ ΟΘΟΝΗΣ ΣΤΟ ΚΙΝΗΤΟ ΕΙΝΑΙ ΤΟ ΔΑΧΤΥΛΟ, ΟΧΙ ΤΟ ΠΟΝΤΙΚΙ: κάθε κεφαλίδα, κάθε γραμμή και κάθε
   πλακίδιο είναι ΟΛΟΚΛΗΡΟ στόχος αφής — ≥52 px στο κινητό (ο κανόνας του πεδίου, 02/09), ≥44 px στο
   desktop όπου το χέρι δεν φοράει γάντι και το κέρδος σε ύψος είναι μία γραμμή δουλειάς παραπάνω.

   ΚΑΝΕΝΑ ΧΡΩΜΑ ΕΚΤΟΣ TOKENS, και κάθε κουμπί που σβήνει φόντο ΞΑΝΑΔΗΛΩΝΕΙ ΤΟ ΜΕΛΑΝΙ (`color: inherit`):
   χωρίς αυτό κληρονομεί το λευκό `--on-accent` του γενικού `button` και εξαφανίζεται στο ανοιχτό θέμα —
   το λάθος που το έδειξε μόνο το PNG, 02/09 (`test_bare_buttons_restore_the_ink_they_dropped`).

   🚨 ΤΟ `--accent` ΔΕΝ ΕΜΦΑΝΙΖΕΤΑΙ ΕΔΩ ΩΣ ΚΑΤΑΣΤΑΣΗ (γραμμένο στο ίδιο το token): μόνο ως εστίαση και ως
   περίγραμμα «με το ποντίκι από πάνω». Η κατάσταση μιλά με `--ok` / `--warn` / `--crit` — και ΠΑΝΤΑ
   μαζί με λέξη, ποτέ μόνο με χρώμα.

   ── ΤΟ ΦΙΝΙΡΙΣΜΑ (05/09 β) — ΤΙ ΑΓΓΙΧΤΗΚΕ ΚΑΙ ΓΙΑΤΙ ────────────────────────────────────────────────
   Η οθόνη ΛΕΙΤΟΥΡΓΟΥΣΕ ήδη σωστά· αυτό το πέρασμα είναι ΜΟΝΟ μορφή — καμία λέξη, κανένας προορισμός,
   κανένα δεδομένο δεν άλλαξε. Έξι πράγματα, με τη σειρά που τα βλέπει το μάτι:

     1. **ΟΛΑ ΤΑ ΠΛΑΚΙΔΙΑ ΣΕ ΜΙΑ ΣΕΙΡΑ ΣΤΟ ΓΡΑΦΕΙΟ** (`minmax(7.5rem)` αντί για `8rem`). Στα 1440 px με
        ανοιχτή τη στήλη πλοήγησης το `main` έχει 1152 px· με ελάχιστο 128 px χωρούσαν ΟΚΤΩ κολόνες, άρα
        ο ιδιοκτήτης (εννιά πλακίδια) έβλεπε το ένατο ΜΟΝΟ ΤΟΥ σε δεύτερη σειρά — ορφανό κουτί κάτω από
        μια γεμάτη γραμμή, το πιο φανερό ελάττωμα της σύνθεσης. Με 120 px χωρούν εννιά (9×120 + 8×8 =
        1144 ≤ 1152). ΤΟ ΤΙΜΗΜΑ, ΓΡΑΜΜΕΝΟ ΤΙΜΙΑ: η κολόνα πέφτει από 137 σε 121 px, δηλαδή η ετικέτα
        χάνει ~8 px και καμιά δυο λέξεις («Αναπάντητα») σπάνε σε δεύτερη γραμμή. Το πληρώνουμε: μια
        καθαρή σειρά από εννιά όργανα διαβάζεται με μια ματιά, ένα ορφανό πλακίδιο ποτέ. Και το σπάσιμο
        ΔΕΝ ξεχαρβαλώνει τη σειρά — η σημείωση κολλάει στον πάτο (βλ. `.td-tile-note`), οπότε αριθμοί και
        σημειώσεις κάθονται στην ίδια γραμμή σε ΟΛΑ τα πλακίδια, όσες σειρές κι αν πιάσει η ετικέτα.
        Στα 390 px μένουν ΑΚΡΙΒΩΣ δύο στήλες (τρεις θα ήθελαν 376 > 362 ωφέλιμα). Το `auto-fit` κρατά την
        άλλη άκρη: ο θεατής με ΟΚΤΩ πλακίδια αφήνει την ένατη κολόνα ΕΝΤΕΛΩΣ άδεια, οπότε μαζεύεται στο
        μηδέν και τα οκτώ ξαναπιάνουν 137 px — καμία απώλεια εκεί που δεν χρειάζεται.
     2. **Ο ΑΡΙΘΜΟΣ ΕΙΝΑΙ Ο ΗΡΩΑΣ**: ίδιο μέγεθος, αλλά ελαφρύ αρνητικό tracking (μεγάλα ψηφία θέλουν
        σφίξιμο για να μη μοιάζουν αραιά) και η μονάδα «/39» με ΜΗΔΕΝΙΚΟ tracking, ώστε να μην το
        κληρονομήσει. Η ετικέτα παίρνει το ΑΝΤΙΘΕΤΟ (θετικό tracking): μικρό κείμενο αναπνέει.
     3. **Η ΡΑΧΗ ΚΑΤΑΣΤΑΣΗΣ ΛΕΠΤΥΝΕ (3 px → 2 px) ΚΑΙ ΤΟ ΚΡΙΣΙΜΟ ΑΠΕΚΤΗΣΕ ΕΣΩΤΕΡΙΚΗ ΛΑΜΨΗ.** Η γραμμή
        3 px διάβαζε σαν «ταινία», η 2 px σαν όργανο· και το `inset` κάτω από τη ράχη δίνει στο κρίσιμο
        ΒΑΘΟΣ αντί για ακόμα ένα επίπεδο χρώμα. Μόνο στο `crit`: αν λάμπουν και τα τρία, δεν λάμπει κανένα.
     4. **ΤΟ HOVER ΕΠΑΨΕ ΝΑ ΣΒΗΝΕΙ ΤΗΝ ΚΑΤΑΣΤΑΣΗ.** Ήταν `border-color: var(--accent)` — δηλαδή το ποντίκι
        πάνω σε κρίσιμο πλακίδιο έβαφε ΜΠΛΕ την κόκκινη ράχη του. Τώρα το accent πιάνει μόνο τις τρεις
        ουδέτερες πλευρές· η ράχη μένει πάντα το χρώμα της κατάστασης. Αυτό ΔΕΝ είναι διακόσμηση: ήταν ο
        κανόνας «accent ποτέ κατάσταση» σπασμένος για 200 ms κάθε φορά.
     5. **ΡΥΘΜΟΣ ΣΕ ΚΛΙΜΑΚΑ**: τίτλος → πλακίδια → πάνελ σε `--sp-6` / `--sp-7` / `--sp-6` αντί για τυχαία
        νούμερα, και μια ΤΡΙΧΑ κάτω από τον τίτλο που κάνει την κορυφή «κεφαλίδα εργαλείου» αντί για
        αιωρούμενο h1. Οι κεφαλίδες των πάνελ μίκρυναν και άνοιξαν (13,5 px + `.05em`): ετικέτα οργάνου,
        όχι επικεφαλίδα άρθρου — το ίδιο ιδίωμα με το `.stat-label` της μπάντας υγείας.
     6. **ΤΟ ΠΑΝΕΛ ΤΩΝ ΟΧΗΜΑΤΩΝ ΕΓΙΝΕ ΒΥΘΙΣΜΕΝΟΣ ΔΙΣΚΟΣ** (`--bg2`) και οι κάρτες πατούν επάνω του — η
        ίδια σχέση βάθους που έχει ήδη η σελίδα με τις κάρτες της. Και το «όλα ήσυχα» έπαψε να είναι δύο
        γραμμές κειμένου: μισός ήλιος πάνω από τον ορίζοντα σε ήρεμο πράσινο δίσκο, δηλαδή η ΚΑΛΗ είδηση
        με σχήμα. (Το ίδιο εικονίδιο με τη γραμμή του μενού — δεν εφευρίσκεται δεύτερο σύμβολο.)

   Ό,τι κινείται εδώ είναι `transition`, άρα σβήνει ΟΛΟ από το καθολικό `prefers-reduced-motion` του
   αρχείου· κανένα `animation`, καμία μετατόπιση περιεχομένου.

   ── ΤΑ ΔΥΟ ΠΟΥ ΒΡΗΚΕ Ο ΙΔΙΟΚΤΗΤΗΣ ΖΩΝΤΑΝΑ (05/09 γ) ───────────────────────────────────────────────
     α. **«Μπλε γίνεται πάλι.»** ΔΕΝ ήταν το πλακίδιο — ήταν η ΚΑΡΤΑ ΟΧΗΜΑΤΟΣ μέσα στο πάνελ προσοχής.
        Το γενικό `a.card:hover` (0,2,1) κέρδιζε το `.card.crit` (0,2,0) ΣΤΗΝ ΕΙΔΙΚΟΤΗΤΑ, άρα το κόκκινο
        δαχτυλίδι γινόταν μπλε σε κάθε hover — και στον Στόλο. Διορθώθηκε ΣΤΗΝ ΠΗΓΗ (`.card`, πιο πάνω
        στο αρχείο), όχι εδώ. Ο φρουρός δεν κοιτά πια έναν selector: υπολογίζει ΤΟΝ ΝΙΚΗΤΗ ανά πλευρά
        περιγράμματος για κάθε στοιχείο της οθόνης που φέρει κατάσταση.
     β. **«Τα εικονίδια πάνε πάνω-κάτω.»** Λύθηκε δομικά με τις τρεις δεσμευμένες ζώνες του πλακιδίου
        (βλ. το μπλοκ μεταβλητών στο `.td-tile`). */

/* ---------------------------------------------------------------- ο τίτλος και η μέρα, σε μία γραμμή
 * Η ΤΡΙΧΑ ΑΠΟ ΚΑΤΩ ΚΑΝΕΙ ΤΗΝ ΚΟΡΥΦΗ ΚΕΦΑΛΙΔΑ: χωρίς αυτή, ο τίτλος και τα πλακίδια είναι δύο πράγματα
 * που τυχαίνει να είναι κοντά. Η μέρα φεύγει ΔΕΞΙΑ στο γραφείο (μεταδεδομένο, δεν διαβάζεται πρώτο) και
 * ξαναγυρίζει δίπλα στον τίτλο στο κινητό, όπου δεν υπάρχει πλάτος να χωριστούν. */
/* 🚨 ΠΡΟΤΑΣΗ, ΟΧΙ ΠΛΑΚΙΔΙΟ ΔΥΟ ΛΕΞΕΩΝ (05/09): η γραμμή «Δείχνει την ημέρα …» δανείζεται το `.pill`
   για το σχήμα της, και μαζί κληρονομούσε το `white-space: nowrap` του. Σε ένα πλακίδιο δύο λέξεων
   αυτό είναι σωστό· σε ΟΛΟΚΛΗΡΗ πρόταση με ημερομηνία κλειδώνει το πλάτος της στο κείμενό της και
   έδινε 7 px οριζόντια κύλιση σε όλη τη σελίδα στα 390 px. Το `min-inline-size: 0` είναι το άλλο μισό:
   χωρίς αυτό, το flex item του `.td-top` δεν επιτρέπεται να πέσει κάτω από το min-content του. */
.td-otherday { margin: 0; margin-inline-start: auto; white-space: normal; min-inline-size: 0; }
/* Η ΗΣΥΧΗ ΕΚΔΟΧΗ (σκέτη ημερομηνία, όχι «μέρα-βιτρίνα»): μικρότερη και αραιωμένη — υπογραφή, όχι τίτλος. */
.td-otherday:not(.pill) { font-size: var(--fs-s); letter-spacing: .03em; }

/* ---------------------------------------------------------------- 1ο ΕΠΙΠΕΔΟ: Η ΣΕΙΡΑ ΤΩΝ ΠΛΑΚΙΔΙΩΝ
 *
 * ΠΥΚΝΑ, ΙΣΟΥ ΥΨΟΥΣ, ΣΕ ΠΛΕΓΜΑ: το `stretch` του grid κάνει όλα τα πλακίδια της σειράς ίσα ακόμα κι όταν
 * το ένα έχει σημείωση και το άλλο όχι — μια σειρά με ανισοϋψή κουτιά διαβάζεται ως τυχαία, όχι ως όργανα.
 * `minmax(7.5rem, 1fr)`: στα 1440 και τα ΕΝΝΙΑ σε ΜΙΑ σειρά (η αριθμητική, ολόκληρη, στο §1 του
 * φινιρίσματος)· στα 390 ακριβώς ΔΥΟ στήλες. `auto-fit` και όχι σταθερός αριθμός: τα πλακίδια είναι 4-9
 * ανάλογα με τον ρόλο και τις ενότητες του πελάτη — και οι άδειες κολόνες μαζεύονται μόνες τους.
 * 🚨 ΤΟ `--sp-3` ΤΟΥ ΚΕΝΟΥ ΕΙΝΑΙ ΜΕΡΟΣ ΤΗΣ ΑΡΙΘΜΗΤΙΚΗΣ, ΟΧΙ ΓΟΥΣΤΟ: με `--sp-4` (10 px) οι κολόνες
 * ξαναπέφτουν σε οκτώ και το ένατο πλακίδιο ξαναμένει ορφανό. */
.td-tiles {
  display: grid;
  gap: var(--sp-3);
  grid-template-columns: repeat(auto-fit, minmax(7.5rem, 1fr));
  margin-block-end: var(--sp-7);
}
.td-tile {
  /* 🚨 ΤΡΕΙΣ ΖΩΝΕΣ ΜΕ ΔΕΣΜΕΥΜΕΝΟ ΥΨΟΣ — Ο ΛΟΓΟΣ, ΑΥΤΟΥΣΙΟΣ ΑΠΟ ΤΟΝ ΙΔΙΟΚΤΗΤΗ (05/09 β): «τα πλακίδια,
     ανάλογα με τις λέξεις, πάνε τα εικονίδια πάνω-κάτω — δεν είναι ομοιόμορφα». Με ελεύθερο ύψος, μια
     ετικέτα δύο γραμμών («Εκτός σύνδεσης») κατέβαζε τη σημείωση ΜΟΝΟ του δικού της πλακιδίου, και η
     σειρά έμοιαζε ξεκούρδιστη — διαφορετικά σε κάθε γλώσσα, αφού τα γερμανικά έχουν άλλα μήκη από τα
     ελληνικά. Οι τρεις μεταβλητές παρακάτω κλειδώνουν τις ζώνες σε ΑΡΙΘΜΟ, όχι σε περιεχόμενο:
     ο αριθμός μία γραμμή, η ετικέτα ΠΑΝΤΑ δύο (ακόμα κι όταν γράφει μία), η σημείωση μία. Έτσι και οι
     τρεις σειρές της σάρωσης —ψηφία, εικονίδια, ψιλά— πέφτουν στο ΙΔΙΟ ύψος σε ΟΛΑ τα πλακίδια και σε
     ΟΛΕΣ τις γλώσσες. Ζουν εδώ και όχι στο `tokens.css`: είναι η αριθμητική ΑΥΤΗΣ της σειράς οργάνων,
     όχι μέγεθος του συστήματος. Φρουρός ότι δύο γραμμές ΦΤΑΝΟΥΝ και στις έξι γλώσσες:
     `test_every_tile_label_of_every_language_fits_in_the_two_lines_the_grid_reserves`. */
  --td-l-lines: 2;
  --td-l-lh: 1.25;
  --td-l-h: calc(var(--td-l-lines) * var(--td-l-lh) * var(--fs-s));
  --td-n-h: calc(var(--fs-3xl) * var(--lh-num));
  --td-note-h: calc(var(--td-l-lh) * var(--fs-xs));
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  gap: 2px;
  min-height: 52px;
  padding: var(--sp-4);
  background: var(--card);
  border: 1px solid var(--line);
  /* Η ΡΑΧΗ ΕΙΝΑΙ ΣΧΗΜΑ, ΟΧΙ ΜΟΝΟ ΧΡΩΜΑ: λεπτή γραμμή πάνω-πάνω, ώστε η κατάσταση να φαίνεται και με το
     πλάι του ματιού και να ΥΠΑΡΧΕΙ για όποιον δεν διακρίνει την απόχρωση. Ουδέτερο = η γραμμή του κουτιού. */
  border-block-start: 2px solid var(--line);
  border-radius: var(--r);
  box-shadow: var(--shadow);
  font: inherit;
  color: inherit;
  text-align: start;
  cursor: pointer;
  transition: border-color var(--t) var(--ease);
}
/* Ο ΑΡΙΘΜΟΣ: το `.num` δίνει ήδη `tabular-nums` (ένα «6» και ένα «11» πιάνουν το ίδιο πλάτος, άρα η
   σειρά δεν «χοροπηδά» στην ανανέωση). Το αρνητικό tracking είναι για το ΜΕΓΕΘΟΣ: στα 34 px τα
   προεπιλεγμένα κενά της γραμματοσειράς διαβάζονται ως χαλαρά. */
.td-tile-n { block-size: var(--td-n-h); white-space: nowrap;
             font-size: var(--fs-3xl); font-weight: var(--fw-bold); line-height: var(--lh-num);
             letter-spacing: -.02em; color: var(--ink); }
/* Το «/8» τονισμένο κάτω από τον αριθμό (ίδιο μοτίβο με το `.stat-unit` της μπάντας υγείας): το μάτι
   πιάνει πρώτα το «6» και μετά καταλαβαίνει «από 8». ΡΗΤΟ μηδενικό tracking: αλλιώς κληρονομεί το
   σφίξιμο του μεγάλου αριθμού, που σε 17 px κολλάει τα ψηφία. */
.td-tile-u { font-size: var(--fs-l); font-weight: var(--fw-med); color: var(--muted);
             letter-spacing: 0; margin-inline-start: 1px; }
/* Η ΕΤΙΚΕΤΑ: δευτερεύουσα σε μέγεθος, ΠΡΩΤΕΥΟΥΣΑ σε σημασία (αυτή είναι η ΛΕΞΗ της κατάστασης — το
   χρώμα μόνο ενισχύει). ΤΟ ΩΦΕΛΙΜΟ ΠΛΑΤΟΣ ΤΗΣ, ΣΤΟ ΓΡΑΦΕΙΟ: 121 px κολόνα − 2 περίγραμμα − 20 περιθώριο
   − 14 εικονίδιο − 4 κενό = **80,9 px**. ΤΟ ΚΕΝΟ ΕΙΝΑΙ `--sp-1` ΚΑΙ ΟΧΙ `--sp-2` ΓΙΑ ΜΕΤΡΗΜΕΝΟ ΛΟΓΟ: το
   «Αναπάντητα» βγαίνει 76,1 px, δηλαδή με κενό 6 px θα κρεμόταν 0,8 px κάτω από το όριο — μέσα στο
   σφάλμα της εκτίμησης, άρα ρίψη νομίσματος για το αν θα έσπαγε «Αναπάντητ|α» στην οθόνη ΤΟΥ ΙΔΙΟΚΤΗΤΗ.
   Δύο pixel λιγότερο κενό ανάμεσα σε εικονίδιο και λέξη δεν φαίνονται· μια λέξη κομμένη στη μέση
   φαίνεται. ΓΙΑ ΤΟΝ ΙΔΙΟ ΛΟΓΟ Η ΕΤΙΚΕΤΑ ΕΧΕΙ ΡΗΤΟ `letter-spacing: 0`: το άνοιγμα .015em που είχε στην
   πρώτη εκδοχή κοστίζει 2 px στη δεκαγράμματη λέξη — δηλαδή ακριβώς όσο ήταν το περιθώριο. Το tracking
   μένει εκεί που κερδίζει χωρίς να κοστίζει (σημείωση, κεφαλίδες πάνελ, ημερομηνία). ΚΑΜΙΑ ΛΕΞΗ ΔΕΝ ΣΠΑΕΙ ΠΙΑ ΣΤΗ ΜΕΣΗ (05/09 γ): πέντε ετικέτες
   που δεν χωρούσαν ούτε μόνες τους κόντυναν στο ΛΕΞΙΚΟ, με απόφαση ανθρώπου — «Νοικιασμένα»→«Μισθωμένα»
   (δένει και με το όνομα της οθόνης «Μισθώσεις»), «Unanswered»→«No reply», «Unbeantwortet»→«Ohne
   Antwort», «Onbeantwoord»→«Geen antwoord», «Devoluciones»→«Entradas» (ζευγάρι με «Salidas»). Το
   `overflow-wrap: anywhere` + `min-inline-size: 0` μένουν ως δίχτυ για την ΕΠΟΜΕΝΗ μετάφραση: η σωστή
   υποχώρηση είναι ΣΠΑΣΙΜΟ ΜΕΣΑ στο πλακίδιο, όχι μισή λέξη έξω από το περίγραμμα (ίδιος κανόνας με το
   `.vcard-name`). Το `overflow: hidden` της ζώνης είναι το ΤΕΛΕΥΤΑΙΟ δίχτυ, όχι ο σχεδιασμός: το test
   των έξι γλωσσών εγγυάται ότι καμία ετικέτα δεν φτάνει τρίτη γραμμή, ώστε να μην κόβεται ποτέ. */
.td-tile-l { display: flex; align-items: flex-start; gap: var(--sp-1);
             block-size: var(--td-l-h); overflow: hidden;
             margin-block-start: var(--sp-1);
             min-inline-size: 0; overflow-wrap: anywhere;
             font-size: var(--fs-s); font-weight: var(--fw-med); line-height: var(--td-l-lh);
             letter-spacing: 0; color: var(--ink); }
/* ΤΟ ΕΙΚΟΝΙΔΙΟ ΚΕΝΤΡΑΡΕΤΑΙ ΣΤΗΝ ΠΡΩΤΗ ΓΡΑΜΜΗ, ΟΧΙ ΣΤΗ ΖΩΝΗ: με `align-items: center` θα καθόταν στη
   μέση των δύο γραμμών, δηλαδή θα κουνιόταν πάνω-κάτω ανάλογα με το αν η ετικέτα τύλιξε — ακριβώς το
   παράπονο. Το περιθώριο είναι το μισό της διαφοράς ύψους γραμμής και εικονιδίου: υπολογισμός, όχι
   νούμερο στο μάτι, ώστε να ακολουθεί αν αλλάξει το `--fs-s`. */
.td-tile-l svg { flex: none; color: var(--muted);
                 margin-block-start: calc((var(--td-l-lh) * var(--fs-s) - 14px) / 2); }
/* Η ΤΡΙΤΗ ΖΩΝΗ: ΜΙΑ γραμμή, δεσμευμένη ΚΑΙ ΟΤΑΝ Η ΣΗΜΕΙΩΣΗ ΛΕΙΠΕΙ — αλλιώς το πλακίδιο χωρίς «κανένα»
   θα ήταν 15 px κοντύτερο από τα διπλανά του. Το `margin-block-start: auto` μένει ως ΔΕΥΤΕΡΟ δίχτυ: αν
   κάποια μέρα μια ζώνη μεγαλώσει, η σημείωση θα παραμείνει κολλημένη στον πάτο αντί να παρασυρθεί.

   🚨 ΚΑΙ ΑΝ ΔΕΝ ΧΩΡΕΣΕΙ, ΚΟΒΕΤΑΙ ΜΕ ΑΠΟΣΙΩΠΗΤΙΚΑ — ΠΟΤΕ ΣΙΩΠΗΛΑ. Δεσμευμένο ύψος σημαίνει ότι μια
   μακριά φράση θα τύλιγε σε δεύτερη γραμμή που το `overflow` θα έκρυβε ΟΛΟΚΛΗΡΗ: ο αναγνώστης δεν θα
   μάθαινε ποτέ ότι λείπει κάτι. Με `nowrap` + `ellipsis` το κόψιμο ΦΑΙΝΕΤΑΙ, και η πληροφορία είναι ένα
   tap μακριά — το πλακίδιο ανοίγει ακριβώς αυτή τη λίστα. ΣΗΜΕΡΑ ΔΕΝ ΤΟ ΧΡΕΙΑΖΕΤΑΙ ΚΑΝΕΝΑ ΚΕΙΜΕΝΟ: το
   `td.tasks_all` ήταν «{n} ανοιχτές συνολικά» (~138 px σε ζώνη 98,9) και έγινε «{n} συνολικά» σε όλες
   τις γλώσσες (05/09 γ) — το «ανοιχτές» ήταν πλεονασμός δίπλα σε πλακίδιο που ήδη λέγεται εκκρεμότητες.
   Ο μηχανισμός μένει για την επόμενη φράση που θα μακρύνει, και το test τον κρατά ζωντανό. */
.td-tile-note { block-size: var(--td-note-h); margin-block-start: auto;
                white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
                font-size: var(--fs-xs); line-height: var(--td-l-lh); color: var(--muted);
                letter-spacing: .01em; }

/* ΟΙ ΤΡΕΙΣ ΤΟΝΟΙ, ΚΑΙ ΜΟΝΟ ΤΡΕΙΣ (ίδιο λεξιλόγιο με το `stat()` του Στόλου: `ok` / `warn` / `crit`).
   Ο αριθμός παίρνει το χρώμα, η ράχη το επαναλαμβάνει ως σχήμα, και η ετικέτα το λέει με λέξη.
   Η ΕΣΩΤΕΡΙΚΗ ΛΑΜΨΗ ΜΟΝΟ ΣΤΟ ΚΡΙΣΙΜΟ: είναι το ΕΝΑ πλακίδιο που πρέπει να το πιάσει το μάτι πριν
   διαβάσει· αν λάμπουν και τα τρία, δεν λάμπει κανένα. Κρέμεται κάτω από τη ράχη (`inset 0 2px`) και
   σβήνει μέσα σε 12 px — φωτισμός, όχι δεύτερο φόντο. */
.td-tile.ok { border-block-start-color: var(--ok); }
.td-tile.ok .td-tile-n { color: var(--ok); }
.td-tile.warn { border-block-start-color: var(--warn); background: var(--warn-soft); }
.td-tile.warn .td-tile-n { color: var(--warn); }
.td-tile.crit { border-block-start-color: var(--crit); background: var(--crit-soft);
                box-shadow: inset 0 2px 12px -4px var(--crit), var(--shadow); }
.td-tile.crit .td-tile-n { color: var(--crit); }

/* 🚨 ΤΟ HOVER ΔΕΝ ΑΚΟΥΜΠΑ ΤΗ ΡΑΧΗ — ΓΡΑΦΕΤΑΙ ΜΕΤΑ ΤΟΥΣ ΤΟΝΟΥΣ ΚΑΙ ΜΟΝΟ ΣΕ ΤΡΕΙΣ ΠΛΕΥΡΕΣ. Το παλιό
   `border-color: var(--accent)` έβαφε ΚΑΙ το πάνω περίγραμμα, δηλαδή έσβηνε το κόκκινο του κρίσιμου όσο
   το ποντίκι ήταν από πάνω: το `--accent` έλεγε κατάσταση, ακριβώς αυτό που το token απαγορεύει.
   Το `filter: none` ακυρώνει το `brightness()` του γενικού `button:hover` — ένα πλακίδιο δεν είναι
   κουμπί ενέργειας, δεν «ανάβει». */
.td-tile:hover { border-inline-color: var(--accent); border-block-end-color: var(--accent); filter: none; }

/* ---------------------------------------------------------------- 2ο ΕΠΙΠΕΔΟ: ΤΑ ΠΑΝΕΛ
 *
 * `auto-fit` και ΟΧΙ σταθερό `1fr 1fr`: μια ήσυχη μέρα αφήνει ένα μόνο ορατό πάνελ, και μια άδεια κολόνα
 * δίπλα του διαβάζεται ως «λείπει κάτι». `align-items: start`: κάθε πάνελ έχει το ΔΙΚΟ του ύψος — δύο
 * κουτιά τεντωμένα στο ίδιο ύψος με μισό κενό μέσα είναι το σήμα κατατεθέν της αδιάφορης οθόνης. */
.td-panels {
  display: grid;
  gap: var(--sp-6);
  grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
  align-items: start;
}
/* Πλήρες πλάτος: το πάνελ των οχημάτων, που φιλοξενεί ΤΙΣ ΚΑΡΤΕΣ ΤΟΥ ΣΤΟΛΟΥ — σε μισή στήλη θα έδειχνε
   μία κάρτα ανά σειρά, δηλαδή θα ήταν λίστα, ενώ ο σκοπός του είναι «δες τα οχήματά σου με μια ματιά». */
.td-card.td-wide { grid-column: 1 / -1; }

/* Η ΚΑΡΤΑ ΧΩΡΙΣ ΕΣΩΤΕΡΙΚΟ ΠΕΡΙΘΩΡΙΟ, ώστε η κεφαλίδα να είναι ΛΩΡΙΔΑ από άκρη σε άκρη (ιδίωμα πίνακα
   ελέγχου): η τιτλοφορημένη κεφαλίδα λέει «εδώ αρχίζει άλλο πράγμα» πριν καν διαβαστεί ο τίτλος. */
.card.td-card { margin: 0; padding: 0; overflow: hidden; }

.td-head {
  width: 100%;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  min-height: 44px;
  padding: var(--sp-3) var(--sp-5);
  background: var(--card2);
  border: 0;
  border-block-end: 1px solid var(--line);
  color: inherit;
  border-radius: 0;
  text-align: start;
  transition: background var(--t) var(--ease);
}
.td-head:hover { background: var(--hover); }
/* ΕΤΙΚΕΤΑ ΟΡΓΑΝΟΥ, ΟΧΙ ΕΠΙΚΕΦΑΛΙΔΑ ΑΡΘΡΟΥ: μικρή, με βάρος και με ΑΝΟΙΓΜΑ — το ίδιο ιδίωμα με το
   `.stat-label` της μπάντας υγείας. Σε πίνακα ελέγχου ο τίτλος του πάνελ είναι ΤΑΜΠΕΛΑ: πρέπει να
   λέει «εδώ αρχίζει άλλο πράγμα» και μετά να κάνει στην άκρη για το περιεχόμενο. */
.td-h-title { font-size: var(--fs-s); font-weight: var(--fw-semi); letter-spacing: .05em; color: var(--ink); }
/* Το μέτρημα δίπλα στον τίτλο δεν συρρικνώνεται ποτέ: ένα «12» μισό είναι χειρότερο από κανένα. */
.td-head .pill { flex: none; }
/* Το ίδιο βελάκι με την πλοήγηση, ΓΥΡΙΣΜΕΝΟ: «μπες μέσα» — ίδιο σχήμα με τις ομάδες των Ζημιών. Στο
   hover παίρνει το accent και γέρνει δύο pixel προς την έξοδο: η μόνη κίνηση της οθόνης, και είναι
   ΑΠΑΝΤΗΣΗ σε πρόθεση του χρήστη — όχι διακόσμηση που τρέχει μόνη της. */
.td-caret { display: flex; color: var(--muted); transform: rotate(180deg);
            transition: color var(--t) var(--ease), transform var(--t) var(--ease); }
.td-head:hover .td-caret { color: var(--accent); transform: rotate(180deg) translateX(-2px); }

.td-rows { display: flex; flex-direction: column; }
.td-row {
  width: 100%;
  display: flex;
  align-items: baseline;
  gap: var(--sp-3) var(--sp-5);
  min-height: 44px;
  padding: var(--sp-4) var(--sp-5);
  background: none;
  border: 0;
  color: inherit;
  border-radius: 0;
  text-align: start;
  transition: background var(--t) var(--ease);
}
.td-row + .td-row { border-block-start: 1px solid var(--line); }
.td-row:hover { background: var(--hover); }
/* ΑΡΙΣΤΕΡΑ Η ΤΑΥΤΟΤΗΤΑ, ΔΕΞΙΑ ΤΑ ΨΙΛΑ — μία γραμμή αντί για δύο, όσο υπάρχει πλάτος. Αυτό είναι το
   μεγαλύτερο κέρδος πυκνότητας της οθόνης: δέκα γεγονότα της μέρας χωρούν χωρίς κύλιση.
   Το `flex-end` της δεξιάς στήλης είναι για τη ΣΤΙΓΜΗ ΠΟΥ ΤΥΛΙΓΕΙ: χωρίς αυτό, δύο ψιλά που δεν χωρούν
   μαζί πέφτουν το ένα κάτω από το άλλο ΑΡΙΣΤΕΡΑ μέσα σε μια δεξιά στήλη — δηλαδή ξεχαρβαλωμένα. */
.td-line { flex: 1 1 14rem; min-width: 0; gap: var(--sp-3); }
.td-sub { flex: 0 1 auto; margin-inline-start: auto; gap: var(--sp-3);
          justify-content: flex-end; text-align: end; }
/* Η ΩΡΑ ΣΕ ΔΙΚΗ ΤΗΣ ΣΤΗΛΗ, όπως στην Προετοιμασία: ο διάδρομος της μέρας διαβάζεται κατακόρυφα. Μελάνι
   και όχι μουτ — η ώρα ΕΙΝΑΙ η πληροφορία της γραμμής, όχι υποσημείωσή της. */
.td-time { flex: none; min-width: 3.6rem; font-weight: var(--fw-semi); color: var(--ink);
           letter-spacing: .01em; }
.td-code { font-weight: var(--fw-semi); letter-spacing: .01em; }
/* `anywhere`: ένας τίτλος συμβάντος χωρίς κενά (όνομα κανόνα από τη βάση) δεν επιτρέπεται να σπρώξει
   το πλάτος της στήλης — στα 390 px αυτό θα γινόταν ΟΡΙΖΟΝΤΙΑ ΚΥΛΙΣΗ ολόκληρης της σελίδας. */
.td-alert-title { font-weight: var(--fw-med); min-width: 0; overflow-wrap: anywhere; }
.td-note { margin: 0; padding: var(--sp-4) var(--sp-5); border-block-start: 1px solid var(--line);
           letter-spacing: .01em; }

/* ΤΟ ΠΑΝΕΛ ΤΩΝ ΟΧΗΜΑΤΩΝ: μέσα του ζουν ΟΙ ΙΔΙΕΣ κάρτες με τον Στόλο (`vehicleCard`) — ίδιο πλέγμα, ίδιο
   ελάχιστο πλάτος με το `.grid`, ώστε η αρχική και ο Στόλος να «κόβουν» στα ίδια σημεία.
   ΒΥΘΙΣΜΕΝΟΣ ΔΙΣΚΟΣ (`--bg2`): οι κάρτες είναι ΑΝΤΙΚΕΙΜΕΝΑ και θέλουν επιφάνεια να πατήσουν — πάνω στο
   ίδιο `--card` του πάνελ κρέμονταν στο κενό, με το περίγραμμά τους να κάνει όλη τη δουλειά. Το ίδιο
   ζευγάρι βάθους που έχει ήδη η σελίδα (`--bg` πίσω από `--card`), μια στάθμη πιο μέσα. */
.td-vgrid { display: grid; gap: var(--sp-5); grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
            padding: var(--sp-5); background: var(--bg2); }
.td-vgrid .td-note { grid-column: 1 / -1; padding: 0; border: 0; }

/* «Όλα ήσυχα»: ΕΙΔΗΣΗ, όχι σφάλμα — κεντραρισμένη και ήρεμη, ώστε ο άνθρωπος να φύγει από την οθόνη
   σίγουρος ότι δεν του ξέφυγε τίποτα (και όχι να αναρωτιέται αν φόρτωσε η σελίδα). Τα πλακίδια από πάνω
   λένε ήδη ΓΙΑΤΙ είναι ήσυχα, οπότε εδώ αρκεί μία πρόταση — αλλά η καλή είδηση θέλει ΣΧΗΜΑ: δύο σειρές
   κείμενο στο κέντρο μιας άδειας κάρτας διαβάζονται ως «δεν φόρτωσε». Ο μισός ήλιος πάνω από τον
   ορίζοντα είναι ΤΟ ΙΔΙΟ εικονίδιο με τη γραμμή «Σήμερα» του μενού (κανένα δεύτερο σύμβολο για το ίδιο
   πράγμα) και ο δίσκος από κάτω είναι `--ok-soft`: η ησυχία λέγεται με τον τόνο της, όχι με το accent. */
.td-quiet { display: flex; flex-direction: column; align-items: center; gap: var(--sp-3);
            text-align: center; padding: var(--sp-8) var(--sp-6); }
.td-quiet-mark { display: flex; align-items: center; justify-content: center;
                 inline-size: 54px; block-size: 54px; border-radius: var(--r-pill);
                 background: var(--ok-soft); color: var(--ok); margin-block-end: var(--sp-2); }
.td-quiet strong { font-size: var(--fs-l); letter-spacing: .01em; }
.td-quiet p { margin: 0; max-width: 32rem; }

/* ---------------------------------------------------------------- 390 px: Η ΑΥΛΗ
 * ΔΥΟ ΣΤΗΛΕΣ ΠΛΑΚΙΔΙΑ (το `minmax(7.5rem)` το δίνει μόνο του), ΠΑΝΕΛ ΣΤΟΙΒΑΓΜΕΝΑ (το `minmax(20rem)` το
 * δίνει μόνο του), και ΠΙΣΩ ΣΤΑ 52 px στόχους αφής: εδώ το χέρι φοράει γάντι. Η δεξιά στήλη των ψιλών
 * πέφτει από κάτω — καμία οριζόντια κύλιση, ποτέ.
 *
 * ΤΟ ΙΔΙΟ ΦΙΝΙΡΙΣΜΑ, ΟΧΙ ΥΠΟΒΑΘΜΙΣΜΕΝΗ ΕΚΔΟΧΗ: ο αριθμός ΔΕΝ μικραίνει (στα 2×4 πλακίδια είναι όλη η
 * απάντηση της οθόνης) — μικραίνουν μόνο τα ΚΕΝΑ, γιατί εκεί πληρώνεται η κύλιση. Η μέρα ξαναγυρίζει
 * δίπλα στον τίτλο: με 358 px δεν υπάρχει «δεξιά άκρη» να σταθεί, και ένα δεξιά-στοιχισμένο κομμάτι
 * κειμένου κάτω από τον τίτλο διαβάζεται ως λάθος. */
@media (max-width: 719px) {
  .page-head { padding-block-end: var(--sp-4); margin-block-end: var(--sp-5); }
  .td-otherday { margin-inline-start: 0; }
  .td-tiles { margin-block-end: var(--sp-6); }
  .td-tile { min-height: 76px; }
  .td-head { min-height: 52px; }
  .td-row {
    flex-direction: column;
    align-items: stretch;
    gap: var(--sp-2);
    min-height: 52px;
    padding-block: var(--sp-4);
  }
  .td-sub { margin-inline-start: 0; justify-content: flex-start; text-align: start; }
  .td-vgrid { padding: var(--sp-4); gap: var(--sp-4); }
  .td-quiet { padding: var(--sp-7) var(--sp-5); }
}

/* ---------------------------------------------------------------- Συμβάντα (Π3): λίστα + καρτέλα */
.inc { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.45fr); gap: var(--sp-6); align-items: start; }
.inc-list { display: flex; flex-direction: column; gap: var(--sp-5); }
.stack-tight { display: flex; flex-direction: column; gap: var(--sp-3); }

.inc-row {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  width: 100%;
  padding: var(--sp-5);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  font: inherit;
  color: inherit;
  text-align: start;
  cursor: pointer;
}
.inc-row:hover { filter: none; border-color: var(--accent); }
.inc-row.active { border-color: var(--accent); background: var(--card2); }
/* Κλεισμένο = ιστορικό: φαίνεται, δεν φωνάζει. */
.inc-row.closed { opacity: .62; }
.inc-row.closed:hover { opacity: 1; }
.inc-row-top { display: flex; align-items: center; gap: var(--sp-3); }
.inc-row-sub { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.inc-title { font-weight: var(--fw-semi); font-size: var(--fs-s); flex: 1; min-width: 0; }
/* Σοβαρότητα: χρώμα ΚΑΙ θέση ΚΑΙ λέξη (§2 — αχρωματοψία). Η κουκκίδα δεν είναι η μόνη πληροφορία. */
.sev-dot { width: 8px; height: 8px; border-radius: var(--r-pill); flex: none; background: var(--muted); }
.sev-dot.critical { background: var(--crit); box-shadow: 0 0 8px var(--crit); }
.sev-dot.warning { background: var(--warn); }
.sev-dot.info, .sev-dot.customer { background: var(--accent); }
/* 🚨 ΤΟ ΣΥΜΠΑΓΕΣ ΕΧΕΙ ΕΝΑΝ ΚΑΤΟΧΟ (γραμματική σοβαρότητας, `components.js` — κανόνας 2).
   ΕΦΥΓΑΝ ΟΙ ΔΥΟ ΓΡΑΜΜΕΣ ΠΟΥ ΕΔΙΝΑΝ ΣΥΜΠΑΓΕΣ ΚΙΤΡΙΝΟ ΚΑΙ ΣΥΜΠΑΓΕΣ ACCENT: όσο υπήρχαν, ήταν πρόσκληση
   — και δύο οθόνες (Συμβάντα, Σήμερα) την είχαν ήδη δεχτεί γράφοντας `' solid'` με το χέρι. Ένα
   `info` με συμπαγές accent σημαίνει «ενημέρωση με το χρώμα της ταυτότητας», δηλαδή τίποτα.
   Το `.pill.solid` σκέτο μένει: είναι το μελάνι πάνω στο κόκκινο. */
.pill.solid { color: var(--on-crit); }
.pill.sev-critical.solid { background: var(--crit); color: var(--on-crit); }

.inc-detail { display: flex; flex-direction: column; gap: var(--sp-5); }
.inc-detail .card { margin: 0; }
.inc-head { display: flex; flex-direction: column; gap: var(--sp-3); }
/* Η ΠΡΩΤΗ ΓΡΑΜΜΗ ΤΗΣ ΚΑΡΤΕΛΑΣ ΣΤΟΙΧΙΖΕΤΑΙ ΣΤΗ ΒΑΣΗ ΤΩΝ ΓΡΑΜΜΑΤΩΝ (νόμος §1): πλακίδιο σοβαρότητας +
   τίτλος 20 px + πόρτα οχήματος ύψους 44 px. Με `center` (η προεπιλογή του `.row`) το πλακίδιο και ο
   τίτλος κρέμονταν από το ύψος της πόρτας, δηλαδή η γραμμή διαβαζόταν στραβή σε κάθε συμβάν. */
.inc-head-top { align-items: baseline; }
.inc-h1 { font-size: var(--fs-xl); margin: 0; }
.inc-body { margin: 0; color: var(--muted); }
.inc-label { font-size: var(--fs-xs); color: var(--muted); letter-spacing: .04em; margin-block-end: var(--sp-3); }
.inc-measure { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-6); margin-block-start: var(--sp-5); flex-wrap: wrap; }
.inc-value { font-size: var(--fs-3xl); font-weight: 650; line-height: var(--lh-num); }
.inc-unit { font-size: var(--fs-l); font-weight: var(--fw-med); color: var(--muted); }
.inc-chart { flex: 1; min-width: 12rem; }
.chart { width: 100%; height: 90px; display: block; }
.chart polyline { stroke: var(--accent); vector-effect: non-scaling-stroke; }
.chart.crit polyline { stroke: var(--crit); }
.chart.crit .spark-end { fill: var(--crit); }
.chart-threshold { stroke: var(--muted); vector-effect: non-scaling-stroke; }

.inc-renter .inc-phone { font-size: var(--fs-l); font-weight: var(--fw-semi); }
.inc-templates { display: flex; flex-direction: column; gap: var(--sp-4); margin-block-start: var(--sp-5); }
.inc-template { border: 1px solid var(--line); border-radius: var(--r); padding: var(--sp-5); background: var(--bg2); }
.inc-template p { margin: var(--sp-3) 0; }
/* Πρότυπο χωρίς έγκριση ανθρώπου: φαίνεται, ΔΕΝ στέλνεται (§B6) — και ο server το αρνείται ούτως ή άλλως. */
.inc-template.unreviewed { opacity: .7; border-style: dashed; }

/* Χρονογραμμή: μία στήλη με κουκκίδες — η ιστορία του συμβάντος από πάνω προς τα κάτω. */
.tl { display: flex; flex-direction: column; }
.tl-item { display: flex; gap: var(--sp-4); padding-block: var(--sp-3); font-size: var(--fs-s); position: relative; }
.tl-item + .tl-item { border-block-start: 1px solid var(--line); }
.tl-dot { width: 8px; height: 8px; margin-block-start: 6px; border-radius: var(--r-pill); background: var(--line); flex: none; }
.tl-item.opened .tl-dot, .tl-item.escalated .tl-dot { background: var(--crit); }
.tl-item.acked .tl-dot, .tl-item.assigned .tl-dot { background: var(--ok); }
.tl-item.notified .tl-dot { background: var(--accent); }
.tl-item.now .tl-dot { background: var(--warn); animation: pulse var(--pulse-dot) infinite; }
.tl-time { display: inline-block; min-width: 4.6rem; margin-inline-end: var(--sp-4); color: var(--muted); }
.inc-note { margin: 0; }
.inc-note input { flex: 1; max-width: none; }

@media (max-width: 899px) {
  .inc { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------------------- Όχημα (Π4): σκίτσο, hero, πλακίδια */
.veh { display: flex; flex-direction: column; gap: var(--sp-5); }
.veh .card { margin: 0; }
/* Η ΚΕΦΑΛΙΔΑ ΤΟΥ ΟΧΗΜΑΤΟΣ (και όσων τη δανείζονται: Ζημιές, Πρωτόκολλο, Ρυθμίσεις οχήματος) παίρνει τη
   ΤΡΙΧΑ του νόμου §1 — ήταν τίτλος που αιωρούνταν πάνω από κάρτες. ΣΤΟΙΧΙΣΗ ΣΤΟ ΚΕΝΤΡΟ και όχι στη
   βάση, επίτηδες: η γραμμή ΑΡΧΙΖΕΙ με τετράγωνο κουμπί εικονιδίου, που δεν έχει βάση γραμμάτων να
   στοιχιστεί — εκεί το `baseline` θα κρέμαγε το κουμπί, όχι θα το ίσιωνε. */
.veh-head { padding-block-end: var(--sp-5); margin-block-end: var(--sp-6);
            border-block-end: 1px solid var(--line); }
.veh-head .row { gap: var(--sp-4); }
.veh-h1 { font-size: var(--fs-2xl); margin: 0; }
.veh-cols { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: var(--sp-5); align-items: start; }
.veh-left, .veh-right { display: flex; flex-direction: column; gap: var(--sp-5); min-width: 0; }
.veh-left { position: sticky; inset-block-start: 84px; }   /* το όχημα μένει στο μάτι όσο διαβάζεις δεξιά */
.veh-h2 { margin: 0; }
.veh-sketch { padding: var(--sp-4) var(--sp-5); }

/* ΚΑΡΤΑ «ΘΕΣΗ» (02/09 β): ο ΙΔΙΟΣ viewer του στόλου, σε ένα όχημα. Χαμηλότερη από τον χάρτη στόλου —
   δείχνει δύο σημεία, όχι έναν στόλο, και η αριστερή στήλη είναι ήδη μια οθόνη ψηλή (σκίτσο + hero +
   ενοικιαστής). Το ύψος ζει ΕΔΩ και όχι στο `map.js`: το πόσο ψηλή είναι μια κάρτα το λέει το CSS. */
.veh-map .map-view { height: 260px; }
.veh-map-when { margin-block-start: var(--sp-3); }
/* Η ΕΤΙΚΕΤΑ ΤΗΣ ΑΥΛΗΣ ΦΕΥΓΕΙ ΕΔΩ: το όνομα της έδρας το γράφει ήδη η κεφαλίδα της κάρτας, μια ανάσα πιο
   πάνω. Δύο φορές το ίδιο όνομα δεν είναι έμφαση — και στο μικρό κάδρο το πλακάκι έπεφτε πάνω στα κουμπιά
   του ζουμ (φάνηκε στο πρώτο στιγμιότυπο, όχι στον κώδικα). Στον στόλο μένει: εκεί οι αυλές είναι τρεις. */
.veh-map .map-label { display: none; }
/* ΤΑ CHIP ΤΩΝ ΣΗΜΕΙΩΝ (0071) ΠΑΝΩ ΑΠΟ ΤΟΝ ΧΑΡΤΗ, ΟΧΙ ΜΕΣΑ ΤΟΥ: μέσα στο κάδρο των 260 px θα έτρωγαν το
   ένα πέμπτο της εικόνας και θα έπεφταν πάνω στα κουμπιά του ζουμ. Ίδια όψη με τα φίλτρα του στόλου —
   ένας διακόπτης, μία εμφάνιση σε όλο το GUI. */
.poi-chips { margin-block-start: var(--sp-4); }
/* ΕΞΟΔΟΣ, ΟΧΙ ΔΙΑΚΟΠΤΗΣ (park4night, 02/09): ίδιο σχήμα με τα chip δίπλα του — ίδια οικογένεια στοιχείων —
   αλλά στην ΑΛΛΗ ΑΚΡΗ της γραμμής και με το χρώμα του συνδέσμου. Αν έμοιαζε ακριβώς με τα τέσσερα φίλτρα,
   ο χρήστης θα περίμενε πινέζες στον ίδιο χάρτη· εδώ ανοίγει άλλη καρτέλα, και αυτό πρέπει να φαίνεται. */
.chip-out { margin-inline-start: auto; color: var(--accent); }
.chip-out:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; }
/* Το σκίτσο δεν μεγαλώνει άλλο: πάνω από ~640px γίνεται αφίσα, όχι πληροφορία. */
.sketch { width: 100%; max-width: 640px; height: auto; display: block; margin-inline: auto; }

@media (max-width: 1099px) {
  .veh-cols { grid-template-columns: 1fr; }
  .veh-left { position: static; }
}

/* Το σκίτσο παίρνει ΟΛΑ τα χρώματά του από tokens: στο σκούρο θέμα οι ίδιες γραμμές, άλλο μελάνι. */
.sk-body { fill: var(--sk-body); }
.sk-line { fill: none; stroke: var(--ink); stroke-width: 3; stroke-linejoin: round; }
.sk-line.thin { stroke-width: 2.4; }
.sk-line.cap { stroke-linecap: round; }
.sk-ground { stroke: var(--line); stroke-width: 2; stroke-linecap: round; }
.sk-glass { fill: var(--accent); fill-opacity: .10; stroke: var(--ink); stroke-width: 2.4; stroke-linejoin: round; }
.sk-panel { fill: var(--accent); fill-opacity: .22; stroke: var(--ink); stroke-width: 2; }
.sk-hair { stroke: var(--ink); stroke-width: 1.4; opacity: .55; fill: none; }
.sk-wheel { fill: var(--card); stroke: var(--ink); stroke-width: 3; }
.sk-dot-solid { fill: var(--ink); }
.sk-leader { stroke: var(--line); stroke-width: 1.3; fill: none; }
/* Το σκίτσο ζωγραφίζεται σε ~600px (δύο στήλες), όχι σε 760 όπως το mockup: τα γράμματα του
   viewBox μεγαλώνουν αναλόγως, αλλιώς οι ετικέτες βγαίνουν 9px στην οθόνη. */
.sk-cap { fill: var(--muted); font-size: 15px; letter-spacing: .06em; }
.sk-value { fill: var(--ink); font-size: 21px; font-weight: 600; }
/* Ζωντανό σημείο = αναπνέει· σιωπηλό = γκρι και ακίνητο· κρίσιμο = κόκκινο (§1, §5). */
.sk-dot { fill: var(--accent); }
.sk-halo { fill: var(--accent); opacity: .14; animation: breathe var(--pulse-marker) ease-in-out infinite; }
.sk-marker.quiet .sk-dot { fill: var(--muted); }
.sk-marker.quiet .sk-halo { display: none; }
.sk-marker.quiet .sk-value { fill: var(--muted); }
.sk-marker.crit .sk-dot, .sk-marker.crit .sk-halo { fill: var(--crit); }
.sk-marker.crit .sk-value { fill: var(--crit); }
.sk-marker[role='button'] { cursor: pointer; }
.sk-marker[role='button']:hover .sk-halo { opacity: .3; }


.tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: var(--sp-5); }
.tile {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  padding: var(--sp-5);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  font: inherit;
  color: inherit;
  text-align: start;
  cursor: pointer;
}
.tile:hover { filter: none; border-color: var(--accent); }
.tile.open { border-color: var(--accent); background: var(--card2); }
.tile-label { font-size: var(--fs-xs); color: var(--muted); letter-spacing: .04em; }
.tile-value { font-size: var(--fs-xl); font-weight: 650; line-height: var(--lh-num); }
.tile-value.crit { color: var(--crit); }
.tile-value.stale { opacity: .5; }
.tile-unit { font-size: var(--fs-s); font-weight: var(--fw-med); color: var(--muted); }
.tile-src { display: flex; justify-content: space-between; gap: var(--sp-3); }

/* Το πλέγμα 2×2 των τροχών (`.wheels`/`.wheel`) ΕΦΥΓΕ (01/09): τη διάταξη τη λέει πλέον η ίδια η κάτοψη
   (`.ty-*`, στο τέλος του αρχείου) — τέσσερα κουτιά με γραμμένη τη θέση τους ήταν η ίδια πληροφορία δύο
   φορές, στον διπλάσιο χώρο. */
.bar { height: 6px; border-radius: var(--r-pill); background: var(--bg2); overflow: hidden; }
.bar span { display: block; height: 100%; background: var(--accent); }
/* ---------------------------------------------------------------- Γράφημα ιστορικού (`gui/chart.js`)
   Το γράφημα ζωγραφίζεται σε ΠΡΑΓΜΑΤΙΚΑ pixel (1 μονάδα viewBox = 1 px, μετρημένο πλάτος κάρτας), γι'
   αυτό εδώ δεν ορίζεται ούτε πλάτος ούτε ύψος του SVG — μόνο ΧΡΩΜΑ και τυπογραφία, όπως και στο σκίτσο.
   Το `.veh-history .chart` έφυγε μαζί με το `lineChart` από τη σελίδα οχήματος (το `lineChart` ζει ακόμα
   στα συμβάντα, με τα δικά του μέτρα στο `.inc-chart`). */
.hc-sum { display: flex; gap: var(--sp-5); flex-wrap: wrap; margin-block-end: var(--sp-3); }
.hc-plot { min-height: 180px; }
.hc-svg { display: block; touch-action: pan-y; }   /* pan-y: κάθετο σκρολ ΝΑΙ, οριζόντιο σύρσιμο = δείκτης */
.hc-grid { stroke: var(--line); stroke-width: 1; }
.hc-vgrid { opacity: .55; }                        /* οι ώρες πιο αχνά από τις τιμές: δευτερεύων άξονας */
.hc-axis { fill: var(--muted); font-size: 11px; }
.hc-unit { fill: var(--muted); font-size: 11px; letter-spacing: .04em; }
/* Η ζώνη min/max ΗΠΙΑ: αν τη δεις πριν από τη γραμμή, έχει αποτύχει. Η γραμμή είναι η απάντηση· η ζώνη
   λέει «πόσο κουνήθηκε μέσα στην ώρα» — δηλαδή αν άνοιξε η πόρτα του ψυγείου. */
.hc-band { fill: var(--accent); fill-opacity: .15; stroke: none; }
.hc-line { fill: none; stroke: var(--accent); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.hc-dot { fill: var(--accent); }
.hc-cline { stroke: var(--accent); stroke-width: 1; stroke-dasharray: 3 3; }
.hc-cdot { fill: var(--accent); stroke: var(--card); stroke-width: 2; }
.hc-cbox { fill: var(--card2); stroke: var(--line); }
.hc-cval { fill: var(--ink); font-size: 12.5px; font-weight: 650; }
.hc-ctime { fill: var(--muted); font-size: 11px; }

/* Λίστα συσκευών: γραμμές με ανθρώπινο όνομα, όχι πίνακας με κωδικούς θέσης. */
.dev-row { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-3) var(--sp-4); padding-block: var(--sp-3); }
.dev-row + .dev-row { border-block-start: 1px solid var(--line); }
.dev-name { font-weight: var(--fw-semi); font-size: var(--fs-s); }

/* ΣΥΣΚΕΥΕΣ ΚΑΙ ROUTER ΣΤΟ ΚΙΝΗΤΟ (02/09) — η δεύτερη γραμμή που ξεχείλιζε, μετά τους χρήστες.
 *
 * Στα 390 px η `.dev-row` είχε μέχρι ΟΚΤΩ αδέλφια στη σειρά (όνομα, μοντέλο, διεύθυνση, δύο pill, ώρα,
 * και τα κουμπιά «Αντικατάσταση / Επεξεργασία / αφαίρεση»): τα τελευταία έβγαιναν ΕΞΩ από την κάρτα,
 * μισοκομμένα στην άκρη της οθόνης. Ένα κουμπί που δεν φαίνεται ολόκληρο δεν είναι κουμπί — και εδώ το
 * τελευταίο σβήνει συσκευή από όχημα.
 *
 * ΙΔΙΟ ΜΟΤΙΒΟ ΜΕ ΤΟ `.usr-row`, ΕΠΙΤΗΔΕΣ: δύο ομάδες που τυλίγονται (`dev-who` = ποια συσκευή είναι,
 * `dev-acts` = τι της κάνω), όχι έξι κανόνες ανά οθόνη. Ο τεχνικός που έμαθε τη λίστα χρηστών ξέρει ήδη
 * πώς διαβάζεται αυτή. */
.dev-who { display: flex; flex-direction: column; gap: 2px; flex: 1 1 auto; min-width: 0; }
/* Το MAC/serial ΔΕΝ σπρώχνει τη γραμμή: σπάει οπουδήποτε αν χρειαστεί, αλλά — επειδή δεν συμμετέχει πια
   στο ελάχιστο πλάτος — στην πράξη δεν χρειάζεται. */
.dev-who .mono { overflow-wrap: anywhere; }
.dev-acts { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3);
            margin-inline-start: auto; }

@media (max-width: 719px) {
  /* Δύο γραμμές, ρητά: ταυτότητα πάνω, ενέργειες κάτω — όλα μέσα στην κάρτα. */
  .dev-who, .dev-acts { flex-basis: 100%; }
  .dev-acts { margin-inline-start: 0; }
  /* ΣΤΟΧΟΙ ΑΦΗΣ, ΟΧΙ ΔΙΑΚΟΣΜΗΣΗ: 44 px είναι το ελάχιστο που πιάνεται με τον αντίχειρα σε αυλή, όρθιος.
     Τα κουμπιά μοιράζονται τη γραμμή ισομερώς αντί να στοιβάζονται σε τρεις σειρές των 2 cm. */
  .dev-acts button { flex: 1 1 8rem; min-height: 44px; }
  /* Η ΚΑΤΑΣΤΡΟΦΙΚΗ ΠΡΑΞΗ ΤΕΛΕΥΤΑΙΑ ΚΑΙ ΜΟΝΗ ΤΗΣ: δεν την πατάς περνώντας το δάχτυλο προς την
     «Επεξεργασία» (ίδιος κανόνας με το `.usr-revoke`).
     ΔΥΟ ΚΛΑΣΕΙΣ ΚΑΙ ΟΧΙ ΜΙΑ: το `.dev-acts button` από πάνω ορίζει ήδη `flex-basis: 8rem` με ίδια
     ειδικότητα — σκέτο `.dev-remove` θα έχανε, και το «αφαίρεση» θα καθόταν δίπλα στο «Επεξεργασία». */
  .dev-acts .dev-remove { flex-basis: 100%; }
}

/* ΧΡΗΣΤΕΣ ΣΤΟ ΚΙΝΗΤΟ (02/09) — η γραμμή που ξεχείλιζε.
 *
 * Στα 390 px η `.dev-row` (flex χωρίς wrap) δεν είχε πού να σπάσει: τα pill και το «ανάκληση» βγαίναν
 * ΕΞΩ από την κάρτα, μισοκομμένα στην άκρη της οθόνης, και το email έσπαγε στη μέση («gui-» / «check@…»)
 * προσπαθώντας να κάνει χώρο. Ένα κουμπί που δεν φαίνεται ολόκληρο δεν είναι κουμπί.
 *
 * ΔΥΟ ΟΜΑΔΕΣ ΠΟΥ ΤΥΛΙΓΟΝΤΑΙ, ΟΧΙ MEDIA QUERY ΜΕ ΠΛΑΤΗ: «ποιος είναι» και «τι μπορεί» σπάνε η καθεμιά
 * μόνη της. Σε φαρδιά οθόνη μένουν στην ίδια γραμμή· σε στενή γίνονται δύο καθαρές γραμμές. */
.usr-row { flex-wrap: wrap; }
.usr-who { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-1) var(--sp-4); flex: 1 1 auto; min-width: 0; }
/* Το email ΔΕΝ σπρώχνει: `anywhere` το αφήνει να σπάσει οπουδήποτε αν χρειαστεί, αλλά — επειδή δεν
   συμμετέχει πια στο ελάχιστο πλάτος της γραμμής — στην πράξη δεν χρειάζεται. */
.usr-email { overflow-wrap: anywhere; }
.usr-meta { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-3) var(--sp-4); margin-inline-start: auto; }
/* Το πεδίο παίρνει ό,τι περισσεύει (το γενικό `input { width: 100% }` έπαιρνε ΟΛΗ τη γραμμή και έστελνε
   ρόλο και κουμπί από μία σειρά ο καθένας)· ο ρόλος πλαταίνει όσο θέλει το κείμενό του, όχι 22rem. */
.usr-invite input { flex: 1 1 11rem; min-width: 0; }
.usr-invite select { flex: 0 1 auto; width: auto; }
.usr-invite button { flex: none; }
@media (max-width: 719px) {
  /* Δύο γραμμές, ρητά: όνομα+email πάνω, ρόλος/κατάσταση και η ανάκληση από κάτω — όλα μέσα στην κάρτα.
     Το `row-gap` μικρότερο από την απόσταση δύο χρηστών: αλλιώς οι δύο γραμμές του ΙΔΙΟΥ ανθρώπου
     απομακρύνονται όσο και δύο διαφορετικοί, και η ομάδα διαλύεται. */
  .usr-row { row-gap: var(--sp-3); }
  .usr-row > * { flex-basis: 100%; }
  .usr-meta { margin-inline-start: 0; }
  /* Η καταστροφική πράξη στην αντίθετη άκρη από τις ετικέτες: δεν την πατάς περνώντας το δάχτυλο. */
  .usr-revoke { margin-inline-start: auto; }
  /* Το email θέλει ολόκληρη τη γραμμή· ρόλος και «πρόσκληση» χωράνε άνετα μαζί στην επόμενη. */
  .usr-invite input { flex-basis: 100%; }
}

/* Η ΤΙΜΙΑ ΓΡΑΜΜΗ ΤΗΣ ΕΙΣΟΔΟΥ (02/09): «δεν στέλνουμε email — ζήτησε τον κωδικό από τον διαχειριστή».
   ΔΕΝ είναι `muted`: δεν είναι υποσημείωση, είναι Η ΟΔΗΓΙΑ — ό,τι πρέπει να κάνει ο άνθρωπος μετά. Ένα
   γκρίζο ψιλό κείμενο κάτω από ένα πεδίο δεν διαβάζεται· γι' αυτό ακριβώς πέρασε απαρατήρητο το ψέμα. */
.login-nomail {
  color: var(--ink);
  background: var(--card2);
  border-inline-start: 3px solid var(--warn);
  border-radius: var(--r-s);
  padding: var(--sp-3) var(--sp-4);
  font-size: var(--fs-s);
}

/* Η ΓΡΗΓΟΡΗ ΚΑΤΑΓΡΑΦΗ ΖΗΜΙΑΣ ΑΠΟ ΤΗΝ ΑΥΛΗ: ίδια φόρμα με τη σελίδα ζημιών, χωρίς σκίτσο και χωρίς λίστα.
   Κεντραρισμένη και στενή — είναι μία εργασία, δεν είναι πίνακας ελέγχου. */
.dmg-quick { max-width: 34rem; margin-inline: auto; }
/* Το «Ζημιά» ΔΕΝ μοιάζει με το «Έγινε»: άλλη φύση πράξης (καταγράφω κάτι στραβό, δεν κλείνω δουλειά).
   Το περίγραμμα το ξεχωρίζει χωρίς να το κάνει κόκκινο συναγερμό — δεν είναι επείγον, είναι διαφορετικό. */
/* `button.` και όχι σκέτο `.yd-damage`: το `button.ghost` (πιο πάνω) έχει την ίδια ειδικότητα και θα
   ξανάβαφε το κείμενο accent. Ίδια ειδικότητα + πιο κάτω = αυτό νικά, ρητά. */
button.yd-damage { border-color: var(--warn); color: var(--warn); }
button.yd-damage:hover { background: var(--card2); }

/* Φόρμα εξοπλισμού: πεδία σε πλέγμα, όχι μία στήλη που σε βάζει να σκρολάρεις για πέντε αριθμούς. */
.eq-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); gap: var(--sp-4) var(--sp-5); align-items: end; }
.eq-grid input, .eq-grid select { max-width: none; }
.eq-grid label { margin-block-start: 0; }

/* ---------------------------------------------------------------- Ρυθμίσεις (Π5) */
.set { display: grid; grid-template-columns: 13rem minmax(0, 1fr); gap: var(--sp-6); align-items: start; }
.set-nav { display: flex; flex-direction: column; gap: var(--sp-1); position: sticky; inset-block-start: 84px; }
.set-nav-item {
  font: inherit;
  font-size: var(--fs-s);
  text-align: start;
  padding: var(--sp-3) var(--sp-4);
  border: none;
  border-radius: var(--r-s);
  background: none;
  color: var(--muted);
  cursor: pointer;
}
.set-nav-item:hover { background: var(--hover); color: var(--ink); filter: none; }
.set-nav-item.active { background: var(--accent-soft); color: var(--ink); font-weight: var(--fw-semi); }
/* ΒΑΘΜΙΔΑ «ΕΝΟΤΗΤΑ» (νόμος §2) — ΤΟ ΙΔΙΟ ΙΔΙΩΜΑ ΜΕ ΤΗΝ ΕΓΚΕΚΡΙΜΕΝΗ ΚΕΦΑΛΙΔΑ ΠΑΝΕΛ ΤΗΣ «ΣΗΜΕΡΑ».
   Ήταν `--fs-l` (17 px) χωρίς άνοιγμα: επικεφαλίδα άρθρου μέσα σε πίνακα ελέγχου, σε 40+ κάρτες
   (Ρυθμίσεις, Χρήστες, Routers, Γνώση, Εξοπλισμός) — δηλαδή η ΜΙΣΗ εφαρμογή μιλούσε άλλη γλώσσα από
   την άλλη μισή. Σε εργαλείο ο τίτλος ενότητας είναι ΤΑΜΠΕΛΑ: λέει «εδώ αρχίζει άλλο πράγμα» και
   κάνει στην άκρη για το περιεχόμενο. */
.set-h2 { margin: 0; font-size: var(--fs-s); font-weight: var(--fw-semi);
          letter-spacing: .05em; color: var(--ink); }
.set-body .card { margin: 0; }
/* Η ΜΙΚΡΗ ΕΠΙΚΕΦΑΛΙΔΑ ΜΕΣΑ ΣΕ ΚΑΡΤΑ («Από την πλατφόρμα» / «Δικά σας»): ένα σκαλί κάτω από το
   `.set-h2`, ίδια οικογένεια. Χωρίς αυτήν, δύο λίστες στην ίδια κάρτα διαβάζονται ως μία μεγάλη. */
.set-h3 { margin: var(--sp-3) 0 0; font-size: var(--fs-xs); font-weight: var(--fw-semi);
          letter-spacing: .05em; text-transform: uppercase; color: var(--muted); }

/* ---------------------------------------------------------------- 🧭 «Πώς να…» (ιε, 06/09 β)
 * ΤΟ ΒΗΜΑ ΕΙΝΑΙ ΔΥΟ ΠΕΔΙΑ ΣΕ ΜΙΑ ΓΡΑΜΜΗ (κείμενο + θέση) ΚΑΙ ΣΠΑΕΙ ΜΟΝΟ ΤΟΥ ΣΤΟ ΚΙΝΗΤΟ: ο υπάλληλος
 * γράφει σε desktop, αλλά ο ιδιοκτήτης διορθώνει από το τηλέφωνο — και δύο μισά πεδία δίπλα-δίπλα στα
 * 390 px δεν συμπληρώνονται. Το κείμενο τρώει τον χώρο, το dropdown κρατά όσο θέλει.
 * ΤΟ ΚΡΥΜΜΕΝΟ ΠΛΑΤΦΟΡΜΙΚΟ ΞΕΘΩΡΙΑΖΕΙ, ΔΕΝ ΦΕΥΓΕΙ: πρέπει να μένει μπροστά στα μάτια για να ξαναναφθεί. */
.hw-steps { margin-block-start: var(--sp-2); }
.hw-step { flex-wrap: wrap; align-items: center; }
.hw-step input[type="text"] { flex: 1 1 14rem; min-inline-size: 0; }
.hw-step select { flex: 0 1 12rem; min-inline-size: 0; }
.hw-plat { padding: var(--sp-2) 0; border-block-end: 1px solid var(--line); }
.hw-plat:last-child { border-block-end: 0; }
.hw-off { opacity: .55; }
.hw-preview { margin: var(--sp-1) 0 0; padding-inline-start: var(--sp-6); color: var(--muted);
              font-size: var(--fs-s); }

/* ---------------------------------------------------------------- Είσοδος (Π6): μία στήλη, ήρεμη */
.auth { max-width: 26rem; margin-inline: auto; padding-block-start: 8vh; }
.auth .card { margin-block-end: var(--sp-5); }
.auth input { max-width: none; font-size: var(--fs-l); }
.auth-brand { display: flex; align-items: center; gap: var(--sp-4); margin-block-end: var(--sp-6);
              font-size: var(--fs-xl); font-weight: var(--fw-bold); color: var(--accent); }
.auth-form input { max-width: none; font-size: var(--fs-l); }

/* ---------------------------------------------------------------- Οθόνη τοίχου (Π6) */
/* ×1.4 στα ΙΔΙΑ τα tokens: αλλιώς κάθε component που δηλώνει `var(--fs-s)` αγνοεί το μεγάλωμα του body
   και η οθόνη τοίχου διαβάζεται από ένα μέτρο, όχι από τρία. */
body.kiosk {
  --fs-xs: 16px; --fs-s: 18px; --fs-m: 21px; --fs-l: 24px; --fs-xl: 28px; --fs-2xl: 36px; --fs-3xl: 48px;
  --ctl: 44px;
  font-size: var(--fs-m);
}
body.kiosk main { max-width: none; padding: var(--sp-6) var(--sp-7); }
.tv { display: flex; flex-direction: column; gap: var(--sp-6); }
.tv-top { display: flex; align-items: baseline; gap: var(--sp-5); }
.tv-brand { font-size: var(--fs-xl); font-weight: var(--fw-bold); color: var(--accent); }
.tv-clock { font-size: var(--fs-xl); font-weight: var(--fw-semi); }
body.kiosk .stat-value { font-size: 52px; }
body.kiosk .stat-label, body.kiosk .stat-sub { font-size: var(--fs-s); }
body.kiosk .cards { grid-template-columns: repeat(3, minmax(0, 1fr)); }
body.kiosk .vcard-name { font-size: var(--fs-xl); }
body.kiosk .vcard-extra, body.kiosk .vcard-foot { font-size: var(--fs-m); }

/* ---------------------------------------------------------------- κινητό: η μισή χρήση είναι στην αυλή */
@media (max-width: 719px) {
  #top { gap: var(--sp-4); padding: var(--sp-4) var(--sp-5); }
  /* ΤΟ ΟΝΟΜΑ ΤΟΥ ΠΡΟΪΟΝΤΟΣ ΦΕΥΓΕΙ, ΤΟ ΣΗΜΑ ΜΕΝΕΙ — το πρότυπο κάθε mobile app, και εδώ έχει και
     αριθμούς: στα 390 px, μετά τα τέσσερα κουμπιά και τα κενά, περισσεύουν 166 px για δύο κείμενα. Με
     τη λέξη παρούσα ο πελάτης χωράει μεν, αλλά η μάρκα διαβάζεται «WomoRe…» — κομμένη λέξη δίπλα στο
     ίδιο της το σήμα, δηλαδή θόρυβος. Χωρίς αυτήν, το πλακίδιο του πελάτη παίρνει 140 px: ολόκληρο το
     «Luna Trips», ή «Mediterraneo Camp…» για τον επόμενο. Η ΕΓΓΥΗΣΗ κατά της κύλισης ΔΕΝ είναι αυτός ο
     κανόνας — είναι το συμβόλαιο πιο πάνω, που ισχύει σε κάθε πλάτος· εδώ κερδίζουμε ΑΝΑΓΝΩΣΙΜΟΤΗΤΑ.
     🚨 ΚΡΥΨΙΜΟ ΠΡΟΣΒΑΣΙΜΟ, ΟΧΙ `display: none`: το `brandMark()` είναι `aria-hidden="true"`
     (icons.js), άρα ΟΛΟ το προσβάσιμο όνομα του συνδέσμου προς την αρχική είναι αυτό το <span>. Με
     `display: none` ο αναγνώστης οθόνης θα διάβαζε «σύνδεσμος» χωρίς όνομα. Ίδια συνταγή με το
     `.sr-only` πιο πάνω. Το `position: absolute` το βγάζει ΚΑΙ από τη ροή: παιδί εκτός ροής δεν είναι
     flex item, άρα δεν μετρά ούτε το `gap` — το `.brand` γίνεται ακριβώς 26 px και, με min-content ίσο
     με το basis του, παύει να συρρικνώνεται καθόλου. */
  #top > .brand > span {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
  }
  /* Το σκίτσο συρρικνώνεται με το πλάτος: τα γράμματά του ΜΕΓΑΛΩΝΟΥΝ μέσα στο viewBox για να μένουν
     αναγνώσιμα στο κινητό (η μισή χρήση είναι στην αυλή, με τον ήλιο πάνω στην οθόνη). */
  .sk-value { font-size: 30px; }
  .sk-cap { font-size: 22px; }
  /* Η ΕΜΦΑΝΙΣΗ ΤΗΣ ΚΑΤΩ ΜΠΑΡΑΣ ΜΕΤΑΚΟΜΙΣΕ ΣΤΑ 900 px (Μ1, τέλος αρχείου): το σκαλοπάτι της ΠΛΟΗΓΗΣΗΣ
     δεν είναι το ίδιο με το σκαλοπάτι του ΠΕΡΙΕΧΟΜΕΝΟΥ. Εδώ μένει ό,τι αφορά το ΣΤΕΝΟ σώμα (κάρτες,
     γραμμές, μεγέθη αφής)· εκεί ζει το «πού μπαίνει το μενού». */
  main { padding: var(--sp-5) var(--sp-5) calc(var(--bottombar-h) + var(--sp-7)); }
  h1 { font-size: var(--fs-xl); margin-block-end: var(--sp-5); }
  /* Στην αυλή, με γάντια και ήλιο: μεγαλύτερα σημεία αφής. */
  button, .btn { padding: var(--sp-4) var(--sp-6); font-size: var(--fs-m); }
  .card { padding: var(--sp-5); }
  /* Δύο στήλες, όχι μία: με τέσσερις κάρτες σε στήλη το πρώτο ΟΧΗΜΑ πέφτει κάτω από την οθόνη — και το
     «είναι καλά ο στόλος μου;» παύει να απαντιέται χωρίς scroll (§2). */
  .band { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-4); }
  .stat { padding: var(--sp-4); }
  .set { grid-template-columns: 1fr; }
  .set-nav { position: static; flex-direction: row; flex-wrap: wrap; }
  .stat-value { font-size: 26px; }
  .cards { grid-template-columns: 1fr; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}


/* ΣΥΝΟΜΙΛΙΑ — «όπως το iMessage ή η οθόνη των SMS» (Vassilis 03/09).
 *
 * ΤΙ ΑΛΛΑΞΕ ΚΑΙ ΓΙΑΤΙ: ήταν κάρτες με κεφαλίδα («Εμείς · SMS · 29/08, 17:54») πάνω από κάθε πρόταση.
 * Σε κινητό, τα μεταδεδομένα έπιαναν όσο χώρο και η κουβέντα — και έλεγαν πράγματα που τα λέει ήδη η
 * ΘΕΣΗ (ποιος μιλά) ή τα επαναλάμβαναν σε κάθε γραμμή (κανάλι, ημερομηνία).
 *
 * ΟΙ ΤΕΣΣΕΡΙΣ ΚΑΝΟΝΕΣ:
 *   1. ΔΙΚΑ ΜΑΣ ΔΕΞΙΑ ΜΕ ACCENT, ΤΟΥ ΠΕΛΑΤΗ ΑΡΙΣΤΕΡΑ ΓΚΡΙ. Ίδια σύμβαση με κάθε εφαρμογή μηνυμάτων
 *      που έχει ανοίξει ποτέ αυτός ο άνθρωπος — δεν την εφευρίσκουμε, τη δανειζόμαστε.
 *   2. ΩΡΑ ΚΑΤΩ ΑΠΟ ΤΗ ΦΟΥΣΚΑ, μικρή και μουτ. Υποσημείωση, όχι τίτλος.
 *   3. ΗΜΕΡΟΜΗΝΙΑ ΜΙΑ ΦΟΡΑ ΑΝΑ ΜΕΡΑ, κεντραρισμένη.
 *   4. ΚΑΝΑΛΙ ΜΟΝΟ ΟΠΟΥ ΑΛΛΑΖΕΙ (το κρίνει το `rentals.thread`).
 *
 * ΛΟΓΙΚΕΣ ΙΔΙΟΤΗΤΕΣ ΠΑΝΤΟΥ, ΚΑΙ `flex-end` ΓΙΑ ΤΗΝ ΠΛΕΥΡΑ: και τα δύο ακολουθούν το `direction`, ώστε
 * σε γλώσσα RTL (§B6: he/ar) το νήμα να γυρίσει μόνο του — «δεξιά» σημαίνει «η πλευρά μας», όχι «right».
 *
 * TOKENS ONLY: το φόντο των δικών μας φουσκών είναι `--accent` και το κείμενο `--on-accent`, που είναι
 * ορισμένα και στα δύο θέματα. Καμία σταθερή τιμή χρώματος — αλλιώς η μία από τις δύο όψεις θα έσπαγε. */
.conv { display: flex; flex-direction: column; gap: var(--sp-3); }

/* Ο ΔΙΑΧΩΡΙΣΤΗΣ ΗΜΕΡΑΣ: κεντραρισμένος, ήσυχος, με τον αέρα του από πάνω για να «κόβει» οπτικά. */
.conv-day { display: flex; justify-content: center; margin-block-start: var(--sp-5); }
.conv-day:first-child { margin-block-start: 0; }
.conv-day > span {
  font-size: var(--fs-xs); color: var(--muted); font-weight: var(--fw-med);
  padding: 3px var(--sp-4); border-radius: var(--r-pill); background: var(--card2);
}

/* Η γραμμή ενός μηνύματος: φούσκα + υποσημείωση + ό,τι κρέμεται από κάτω (ανάληψη), στην ίδια πλευρά. */
.conv-row { display: flex; flex-direction: column; max-width: 100%; }
.conv-row.out { align-items: flex-end; }
.conv-row.in { align-items: flex-start; }
.conv-row + .conv-row { margin-block-start: var(--sp-3); }

.conv-msg {
  max-width: min(42rem, 88%);
  padding: var(--sp-3) var(--sp-4);
  border: 1px solid transparent;
  border-radius: 18px;
  background: var(--card2);
  /* Η ΑΝΤΙΔΡΑΣΗ ΚΑΘΕΤΑΙ ΠΑΝΩ ΤΗΣ (`position: absolute` παρακάτω) — ίδιο ακριβώς με τη φυσαλίδα της
     σελίδας του ενοικιαστή (`renter.css: .rn-b`). Μία ιδιότητα, καμία άλλη αλλαγή στη διάταξη. */
  position: relative;
}
/* Η «ουρίτσα»: η γωνία που κοιτά προς τα μέσα κόβεται — μία ιδιότητα, καμία ψευδο-στοιχείο ακροβασία. */
.conv-row.out .conv-msg {
  background: var(--accent); color: var(--on-accent); border-end-end-radius: var(--r-s);
}
.conv-row.in .conv-msg {
  background: var(--card2); border-color: var(--line); border-end-start-radius: var(--r-s);
}
/* Μέσα στη γεμάτη φούσκα ΟΛΑ κληρονομούν το χρώμα του κειμένου: το `--muted` πάνω σε accent θα ήταν
   αδιάβαστο. Η ιεραρχία μένει, με διαφάνεια αντί για δεύτερο χρώμα. */
.conv-row.out .conv-msg .muted,
.conv-row.out .conv-msg summary { color: inherit; opacity: .82; }
.conv-row.out .conv-msg a { color: inherit; text-decoration: underline; }
/* «ΔΕΝ ΣΤΑΛΘΗΚΕ» ΜΕΣΑ ΣΕ ΓΕΜΑΤΗ ΦΟΥΣΚΑ: το `--crit` πάνω σε `--accent` δεν διαβάζεται. Γίνεται ΠΛΑΚΙΔΙΟ
   με φόντο `--card` — δηλαδή το κόκκινο επιστρέφει πάνω στο δικό του φόντο, με tokens και στα δύο θέματα.
   Το να το κάναμε απλώς «λευκό σαν το υπόλοιπο κείμενο» θα έσβηνε ακριβώς την προειδοποίηση (0060). */
.conv-row.out .conv-msg .conv-warn {
  background: var(--card); padding: 2px var(--sp-3);
  border-radius: var(--r-s); display: inline-block;
}

/* Η υποσημείωση κάτω από τη φούσκα: ώρα, κανάλι (όπου αλλάζει), σύνδεσμος συμβάντος, ✨. */
.conv-foot {
  display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  margin-block-start: 2px; padding-inline: var(--sp-3);
}
.conv-ch {
  font-weight: var(--fw-med); font-size: var(--fs-xs);
  padding: 0 var(--sp-2); border-radius: var(--r-s); background: var(--card2); color: var(--muted);
}
.conv-body { white-space: pre-wrap; line-height: var(--lh-text); }
/* 👻 ΤΟ ΜΗΝΥΜΑ ΠΟΥ ΑΠΕΣΥΡΕ Ο ΠΕΛΑΤΗΣ (05/09): πλάγια και σβησμένα — ΦΑΙΝΕΤΑΙ ότι κάτι ειπώθηκε εκεί,
   αλλά δεν διεκδικεί το μάτι όπως τα ζωντανά λόγια. Η φούσκα μένει στη θέση της για να μη σπάσει η ροή. */
.conv-gone { font-style: italic; color: var(--muted); }
/* 👍/👎 ΤΟΥ ΠΕΛΑΤΗ: CHIP ΣΤΗΝ ΑΚΡΗ ΤΗΣ ΦΥΣΑΛΙΔΑΣ, ΕΚΤΟΣ ΤΟΥ ΚΕΙΜΕΝΟΥ ΤΗΣ (Vassilis 06/09: «μπορείς να
   το βάλεις εκτός κειμένου bubble;»).
   ΤΙ ΗΤΑΝ ΚΑΙ ΓΙΑΤΙ ΑΛΛΑΞΕ: ήταν ΓΡΑΜΜΗ μέσα στη φούσκα, κάτω από τα λόγια μας — δηλαδή διαβαζόταν σαν
   να το γράψαμε ΕΜΕΙΣ, και μεγάλωνε τη φυσαλίδα κατά μία σειρά για ένα σύμβολο. Το ιδίωμα που ξέρει
   κάθε άνθρωπος από WhatsApp/Telegram είναι ΚΥΚΛΟΣ ΠΑΝΩ ΣΤΗΝ ΑΚΡΗ: μισός μέσα, μισός έξω, με δικό του
   φόντο και περίγραμμα ώστε να «κάθεται» πάνω στη φυσαλίδα αντί να ανήκει σε αυτήν.
   ΣΤΗΝ ΕΞΩ ΑΚΡΗ, όπως και στη σελίδα του ενοικιαστή (`renter.css: .rn-react`): εκεί δεν σκεπάζει ούτε
   λέξη ούτε το ✓ της υποσημείωσης. Λογικές ιδιότητες, ώστε σε RTL να γυρίσει μόνο του (§B6). */
.conv-react {
  position: absolute;
  inset-block-end: -.6rem;
  inset-inline-end: var(--sp-4);
  display: inline-flex; align-items: center; justify-content: center;
  min-inline-size: 1.4rem; block-size: 1.4rem; padding-inline: 3px;
  border-radius: var(--r-pill);
  background: var(--card); border: 1px solid var(--line); box-shadow: var(--shadow);
  /* ΣΒΗΝΕΙΣ ΤΟ ΦΟΝΤΟ ⇒ ΞΑΝΑΔΗΛΩΝΕΙΣ ΤΟ ΜΕΛΑΝΙ (κανόνας του σπιτιού): μέσα σε δική μας φούσκα όλα
     κληρονομούν `--on-accent`, που πάνω σε `--card` δεν διαβάζεται. Το `warn-text` του 👎 δηλώνεται
     αργότερα στο αρχείο, άρα κερδίζει — ο τόνος του μένει. */
  color: var(--ink);
  font-size: var(--fs-s); line-height: 1;
}
/* Στη μεριά του πελάτη (αριστερά) η «έξω άκρη» είναι η άλλη. Σήμερα ΔΕΝ συμβαίνει — η βάση δέχεται
   αντίδραση μόνο σε ΔΙΚΟ ΜΑΣ μήνυμα (CHECK του 0122) — και είναι μία γραμμή: την ημέρα που θα αλλάξει
   αυτό, το chip δεν θα κρέμεται από τη λάθος γωνία. Ίδιος καθρέφτης με το `.rn-them .rn-react`. */
.conv-row.in .conv-msg .conv-react { inset-inline-end: auto; inset-inline-start: var(--sp-4); }
/* ΤΟ 👎 ΚΡΑΤΑ ΤΟΝ ΤΟΝΟ ΤΟΥ: ξαναβάζει το νήμα στα αναπάντητα, δεν είναι σχόλιο. Το `warn-text` βάφει
   ήδη το μελάνι — εδώ μπαίνει και το περίγραμμα, γιατί το ίδιο το emoji δεν παίρνει χρώμα. */
.conv-react.warn-text { border-color: var(--warn); }
/* Ο ΑΕΡΑΣ ΚΑΤΩ ΑΠΟ ΜΙΑ ΦΥΣΑΛΙΔΑ ΜΕ CHIP: χωρίς αυτόν το chip πατά την ώρα της υποσημείωσης (και, σε
   πυκνό νήμα, το επόμενο μήνυμα). Μπαίνει από την JS (`has-react`) και όχι με `:has()`: το ίδιο
   αποτέλεσμα, χωρίς εξάρτηση από υποστήριξη browser σε οθόνη που ζει σε κινητά της αυλής. */
.conv-msg.has-react { margin-block-end: var(--sp-3); }
/* Η ΦΩΤΟΓΡΑΦΙΑ ΤΟΥ ΠΕΛΑΤΗ ΜΕΣΑ ΣΤΗ ΦΥΣΑΛΙΔΑ (0118): μπαίνει ΠΑΝΩ από το κείμενο, γιατί αυτή είναι το
   μήνυμα («να τι βλέπω») και η λεζάντα το συνοδεύει. Ταβάνι ύψους ώστε μια κατακόρυφη λήψη κινητού να
   μην πιάνει ολόκληρη την οθόνη και να κρύψει τη ροή· ό,τι θέλει μεγέθυνση ανοίγει σε νέα καρτέλα.
   Ζει ΕΔΩ και όχι στο μπλοκ των Μισθώσεων: η ίδια φυσαλίδα ζωγραφίζεται και στη σελίδα οχήματος και
   στα Μηνύματα — μία εμφάνιση για τη συνομιλία, όπου κι αν τη δει ο χειριστής. */
.conv-media {
  display: block; max-width: 100%; max-height: 320px;
  border-radius: var(--r-s); margin-block-end: var(--sp-2);
}
/* 📍 ΟΙ ΘΕΣΕΙΣ ΠΟΥ ΔΕΙΧΝΕΙ ΤΟ ΜΗΝΥΜΑ (ιστ.7, 06/09): κάρτες ΚΑΤΩ από το κείμενο, με λεζάντα.
   ΓΙΑΤΙ ΚΑΤΩ ΚΑΙ ΟΧΙ ΠΑΝΩ (σε αντίθεση με τη φωτό ΤΟΥ ΠΕΛΑΤΗ): εκείνη ΕΙΝΑΙ το μήνυμα («να τι βλέπω»)·
   αυτή είναι το ΣΥΝΟΔΕΥΤΙΚΟ της απάντησης («ο μοχλός είναι εδώ») και διαβάζεται ΜΕΤΑ τη φράση που τη
   ζήτησε. Η λεζάντα δεν είναι διακόσμηση: χωρίς αυτήν ο χειριστής βλέπει ένα ντουλάπι και δεν ξέρει
   ποιο έστειλε. Το `<figure>` δίνει τη σχέση εικόνας-λεζάντας και στον αναγνώστη οθόνης. */
.conv-spots { display: flex; flex-direction: column; gap: var(--sp-2); margin-block-start: var(--sp-2); }
.conv-spot { margin: 0; }
.conv-spot .conv-media { margin-block-end: 2px; }

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * ΤΟ ΧΑΡΤΑΚΙ ΤΗΣ ΕΣΩΤΕΡΙΚΗΣ ΣΗΜΕΙΩΣΗΣ (0091 · διόρθωση όψης 04/09 β)
 *
 * 🚨 ΤΙ ΗΤΑΝ ΚΑΙ ΓΙΑΤΙ ΗΤΑΝ ΕΠΙΚΙΝΔΥΝΟ: η σημείωση έπαιρνε ΤΗΝ ΙΔΙΑ φούσκα με τα εξερχόμενα — `--accent`,
 * δεξιά πλευρά, στρογγυλή — και η μόνη διαφορά ήταν η ωμή λέξη «internal» δίπλα στην ώρα. Ο χειριστής
 * δεν μπορούσε να ξεχωρίσει τι έχει δει ο πελάτης, δηλαδή έχανε ΑΚΡΙΒΩΣ την πληροφορία για την οποία
 * υπάρχει η σημείωση — και μπορούσε να φύγει νομίζοντας ότι απάντησε.
 *
 * ΤΟ ΣΧΗΜΑ ΚΑΝΕΙ ΤΗ ΔΟΥΛΕΙΑ, ΟΧΙ ΤΟ ΧΡΩΜΑ: πλήρες πλάτος (δεν διαλέγει πλευρά — δεν είναι κουβέντα με
 * κανέναν), μικρή ακτίνα αντί για 18px φούσκα, ΔΙΑΚΕΚΟΜΜΕΝΟ περίγραμμα και ράχη στην αρχή της γραμμής.
 * Έτσι ξεχωρίζει και σε ασπρόμαυρη εκτύπωση, και σε οθόνη κάτω από τον ήλιο της αυλής, και για όποιον
 * δεν ξεχωρίζει χρώματα. Το χρώμα είναι ΟΥΔΕΤΕΡΟ (`--neutral-soft`, `--muted`) επίτηδες: μια σημείωση
 * ΔΕΝ είναι κατάσταση, και το `--warn` σημαίνει ήδη κάτι άλλο σε τρεις οθόνες (§2: μία σημασία, ένα χρώμα).
 *
 * ΛΟΓΙΚΕΣ ΙΔΙΟΤΗΤΕΣ ΠΑΝΤΟΥ (`border-inline-start`, `margin-block-*`): όταν έρθει RTL, η ράχη γυρίζει μόνη
 * της στη σωστή άκρη — ο ίδιος κανόνας με τις φυσαλίδες από πάνω.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */
/* Η σειρά της σημείωσης ΔΕΝ στοιχίζεται σε πλευρά: απλώνεται. Η κλάση `out` μένει πάνω της (ο server τη
   γράφει ως εξερχόμενη γραμμή του μητρώου) — γι' αυτό το `stretch` πρέπει να είναι πιο ειδικό. */
.conv-row.note { align-items: stretch; }
.conv-note {
  padding: var(--sp-4);
  border: 1px dashed var(--line);
  border-inline-start: 3px solid var(--muted);
  border-radius: var(--r-s);
  background: var(--neutral-soft); color: var(--ink);
}
/* Η ΕΤΙΚΕΤΑ: εικονίδιο + «Νίκος Τεχνικός · Εσωτερικό» — μικρή και έντονη, ώστε να διαβάζεται ως ΣΗΜΑΝΣΗ
   και όχι ως πρώτη πρόταση του κειμένου.
   ⚠ ΧΩΡΙΣ `text-transform: uppercase`, ΕΠΙΤΗΔΕΣ: μέσα στην ετικέτα υπάρχει ΟΝΟΜΑ ΑΝΘΡΩΠΟΥ, και τα
   ελληνικά κεφαλαία είναι λάθος πεδίο μάχης για ένα διακοσμητικό (τόνοι, ς/Σ, ονόματα που φωνάζουν). */
.note-head { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; color: var(--muted); }
.note-head svg { flex: none; }
.note-tag { font-size: var(--fs-xs); font-weight: var(--fw-semi); letter-spacing: .02em; color: var(--ink); }
/* «Δεν το βλέπει ο πελάτης»: ΠΑΝΩ από το κείμενο και με κανονικό μελάνι, όχι υποσημείωση 12px στο τέλος.
   Είναι η υπόσχεση πάνω στην οποία ο τεχνικός γράφει ό,τι δεν θα έγραφε σε μήνυμα. */
.note-hint { color: var(--muted); margin-block: var(--sp-1) var(--sp-3); }
.conv-note .conv-body { font-size: var(--fs-s); }
/* «έκλεισε την εκκρεμότητα»: ΔΙΑΚΡΙΤΙΚΟ — είναι επιβεβαίωση, όχι είδηση. Πράσινο γιατί σημαίνει
   «τελείωσε», η ίδια σημασία που έχει το `--ok` σε κάθε άλλη οθόνη. */
.note-closed { color: var(--ok); margin-block-start: var(--sp-3); }

/* Η ΦΟΡΜΑ ΤΗΣ ΣΗΜΕΙΩΣΗΣ — κλειστή όταν υπάρχει και composer, ανοιχτή όταν είναι η ΜΟΝΗ πράξη (ο τεχνικός
   χωρίς `renter.contact`). Παίρνει τη διακεκομμένη ράχη της φούσκας ώστε το μάτι να δει με τη μία ότι
   γράφει στο ΙΔΙΟ πράγμα που διάβασε πιο πάνω, όχι στον πελάτη. */
.note-box { border-style: dashed; }
/* ΣΤΟΧΟΣ ΑΦΗΣ ≥44 px: το ανοίγει τεχνικός με γάντι, όρθιος δίπλα στο όχημα (κανόνας οθονών πεδίου). */
.note-sum {
  cursor: pointer; min-block-size: 44px;
  display: flex; align-items: center; gap: var(--sp-3);
  font-weight: var(--fw-semi); color: var(--muted);
}
.note-sum svg { flex: none; }
.note-sum::marker { color: var(--muted); }
/* Το πεδίο της σημείωσης δεν ψηλώνει μόνο του (καμία JS από πίσω): ξεκινά δύο σειρές και σκρολάρει. */
.note-text { min-height: 72px; max-height: 12rem; }

/* ⚠ Η ΠΑΛΙΑ, ΕΠΙΠΕΔΗ ΜΟΡΦΗ (`.conv > .conv-msg.in/.out`) ΖΕΙ ΑΚΟΜΑ ΣΕ ΜΙΑ ΟΘΟΝΗ: τη συνομιλία ΜΕΣΑ
   στο συμβάν (`incidents.js`), που δεν διαβάζει το νήμα της μίσθωσης αλλά τη ΧΡΟΝΟΓΡΑΜΜΗ του alert —
   άλλο σχήμα δεδομένων, χωρίς `id`/ανάληψη/πρωτότυπο. Παίρνει τα ΙΔΙΑ χρώματα και τις ίδιες πλευρές
   ώστε η ίδια κουβέντα να μη μοιάζει με δύο διαφορετικά προϊόντα σε δύο οθόνες. Ο κοινός renderer
   (`rentals.thread`) θα την καταπιεί όταν έρθει η σειρά της χρονογραμμής — τότε αυτό το μπλοκ φεύγει. */
.conv > .conv-msg { margin-block-end: var(--sp-3); }
.conv > .conv-msg.out {
  margin-inline-start: auto; background: var(--accent); color: var(--on-accent);
  border-end-end-radius: var(--r-s);
}
.conv > .conv-msg.in {
  margin-inline-end: auto; background: var(--card2); border-color: var(--line);
  border-end-start-radius: var(--r-s);
}
.conv > .conv-msg.out .muted { color: inherit; opacity: .82; }
.conv > .conv-msg.out .conv-warn { color: inherit; }
.conv > .conv-msg .conv-meta { display: flex; gap: var(--sp-3); align-items: baseline;
                               margin-block-end: var(--sp-2); }

/* ΚΑΡΤΑ ΕΤΟΙΜΟΤΗΤΑΣ (§6) — λίστα «τι λείπει», όχι πίνακας: κάθε γραμμή είναι μία εκκρεμότητα με ένα
   σημάδι, ένα όνομα και μία ενέργεια. Ο σκοπός της είναι να ΑΔΕΙΑΣΕΙ και μετά να εξαφανιστεί. */
/* GRID, ΟΧΙ FLEX: με flex, σε στενή οθόνη το «Μοντέλο (μετασκευή)» τυλιγόταν σε δύο γραμμές και η τιμή
   γραφόταν ΠΑΝΩ του — δύο κείμενα στο ίδιο σημείο. Το grid δίνει σε κάθε κομμάτι δικό του κελί, οπότε
   κανένα δεν μπορεί να πατήσει το άλλο· στο κινητό η τιμή κατεβαίνει σε δική της γραμμή. */
.rdy-row { display: grid; grid-template-columns: 1em minmax(0, 1fr) auto; gap: var(--sp-2) var(--sp-4);
           align-items: baseline; }
.rdy-mark { color: var(--crit); font-weight: var(--fw-bold); }
.rdy-row.ok .rdy-mark { color: var(--ok); }
.rdy-val { display: flex; gap: var(--sp-3); align-items: baseline; justify-content: end;
           flex-wrap: wrap; text-align: end; }
@media (max-width: 719px) {
  .rdy-row { grid-template-columns: 1em minmax(0, 1fr); }
  .rdy-row > :last-child { grid-column: 2; justify-content: start; text-align: start; }
}
.rdy-missing { color: var(--crit); }
.rdy-optional { margin-block-start: var(--sp-5); padding-block-start: var(--sp-4);
                border-block-start: 1px solid var(--line); opacity: .72; }

/* Σήμα προέλευσης: διακριτικό επίτηδες. Λέει «το βρήκε το σύστημα» — δεν διεκδικεί την προσοχή, γιατί το
   κανονικό είναι να μη χρειάζεται να κάνεις τίποτα με αυτό. */
.src-badge {
  font-size: var(--fs-xs);
  color: var(--muted);
  background: var(--neutral-soft);
  padding: 3px var(--sp-4);
  border-radius: var(--r-pill);
  white-space: nowrap;
}

/* Ταυτότητα οχήματος: δύο στήλες στο desktop, μία στο κινητό. Το `auto-fit` το κάνει μόνο του — καμία
   media query για κάτι που είναι απλώς «χώρεσε όσα χωράνε». */
.vid-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: var(--sp-4); }
/* ΔΥΟ ΓΡΑΜΜΕΣ ΠΑΝΤΑ: η ετικέτα με το σήμα προέλευσης δίπλα («Μοντέλο (μετασκευή)» + «από RentSyst») δεν
   χωράει σε μία γραμμή — και όταν τυλιγόταν, έσπρωχνε ΜΟΝΟ το δικό της πεδίο κάτω και η σειρά έβγαινε
   σκαλωτή. Στα γερμανικά τυλίγονται τα μισά. Σταθερό ύψος = τα πεδία ευθυγραμμίζονται σε κάθε γλώσσα. */
.vid-field label {
  display: flex;
  align-items: start;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-3);
  min-block-size: 2.9em;
  line-height: 1.3;
}

/* Βιβλιοθήκη εγχειριδίων: γραμμή = ένα έγγραφο + η διαγραφή του. Η διαγραφή δεξιά και μικρή — υπάρχει,
   αλλά δεν είναι το πρώτο πράγμα που πατάς. */
.man-row { display: flex; align-items: center; gap: var(--sp-4); }
.man-main { flex: 1; min-width: 0; }
/* «Ο ΒΟΗΘΟΣ ΔΕΝ ΤΟ ΔΙΑΒΑΖΕΙ» (0092): ΔΥΟ ΚΟΜΜΑΤΙΑ ΣΤΗΝ ΙΔΙΑ ΡΟΗ — η ετικέτα με το κεχριμπαρένιο της
   προσοχής, και ΑΜΕΣΩΣ ΜΕΤΑ το γιατί, με ήσυχο μελάνι. Το «γιατί» ΔΕΝ μπαίνει σε `title`: σε κινητό
   δεν υπάρχει hover, και αυτή η γραμμή τη διαβάζει ο ιδιοκτήτης της rental στην αυλή. Τυλίγεται μόνη
   της — σε στενή οθόνη γίνονται δύο σειρές, που είναι το σωστό: δύο πράγματα λέει. */
.man-nosearch { display: flex; flex-wrap: wrap; gap: 0 var(--sp-3); align-items: baseline;
                margin-block-start: var(--sp-1); line-height: var(--lh-text); }
.man-nosearch-tag { flex: none; color: var(--warn); font-weight: var(--fw-med); }
.add-vehicle { margin-block-end: var(--sp-6); }

/* Η κάρτα στην οποία προσγειώνεσαι από «λείπει →» αναβοσβήνει μία φορά: αλλιώς, σε μια σελίδα με εννιά
   ίδιες κάρτες, δεν ξέρεις πού σε έστειλε ο σύνδεσμος. */
.anchor-flash { animation: anchor-flash 1.6s var(--ease); }
@keyframes anchor-flash {
  0%, 100% { box-shadow: none; }
  15%, 60% { box-shadow: 0 0 0 2px var(--accent); }
}
@media (prefers-reduced-motion: reduce) { .anchor-flash { animation: none; box-shadow: 0 0 0 2px var(--accent); } }

/* Η φόρμα επεξεργασίας συσκευής ανοίγει κάτω από τη γραμμή της — δεν ανοίγει διάλογος: ο τεχνικός
   συνήθως διορθώνει δύο-τρεις στη σειρά, και ένα modal ανά συσκευή είναι τρία κλικ παραπάνω το καθένα. */
.dev-edit { padding: var(--sp-4); background: var(--card2); border-radius: var(--r); }

/* Η ετικέτα του πλακιδίου γίνεται γραμμή «εικονίδιο + λέξη». Το εικονίδιο παίρνει το χρώμα του κειμένου
   (currentColor) και σβήνει μαζί του όταν η τιμή είναι παλιά — μία αλήθεια, όχι δύο. */
.tile-label { display: flex; align-items: center; gap: var(--sp-3); }
.tile-label svg { flex: none; opacity: .85; }
.veh-h2.row { gap: var(--sp-3); }
.veh-h2.row svg { flex: none; color: var(--muted); }

/* «ΔΕΝ ΣΤΑΛΘΗΚΕ»: κόκκινο μέσα στη φούσκα, όχι διακριτικό γκρι. Ο operator πρέπει να το δει χωρίς να το
   ψάξει — αλλιώς φεύγει νομίζοντας ότι ειδοποίησε τον πελάτη. */
.conv-warn { color: var(--crit); font-weight: var(--fw-med); margin-block-start: var(--sp-2); }
/* Η «ανάληψη» κρέμεται ΚΑΤΩ από τη φούσκα (03/09), όχι μέσα: είναι δική μας δουλειά, όχι λόγια του
   πελάτη. Μικρή, στην πλευρά του μηνύματος, χωρίς να διεκδικεί την προσοχή της κουβέντας. */
.conv-row .conv-ack { margin-block-start: 2px; padding-inline: var(--sp-3); }

/* ΑΝΑΛΗΨΗ ΕΙΣΕΡΧΟΜΕΝΟΥ (0069): το κουμπί κάθεται ΜΕΣΑ στη φούσκα, κάτω από το κείμενο — η πράξη ανήκει
   σε ΑΥΤΟ το μήνυμα, όχι στην κάρτα. Όταν το έχει κάποιος, η γραμμή γίνεται ήσυχο κείμενο με ένα μικρό
   link δίπλα: η σκυτάλη αλλάζει χέρια χωρίς να διεκδικεί την προσοχή όσο δεν χρειάζεται. */
.conv-ack { display: flex; align-items: baseline; gap: var(--sp-3); flex-wrap: wrap;
            margin-block-start: var(--sp-3); }
.conv-ack button.ghost { padding: 2px var(--sp-4); font-size: var(--fs-xs); }
.conv-ack button.link { font-size: var(--fs-xs); }

/* Τιμή που την ξέρει ήδη το σύστημα: διαβάζεται σαν κείμενο, όχι σαν άδειο κουτί που σε καλεί να
   ξαναγράψεις το ίδιο πράγμα. Η «διόρθωση» υπάρχει αλλά δεν διεκδικεί την προσοχή. */
.eq-known { min-block-size: var(--ctl); gap: var(--sp-4); }

/* ---------------------------------------------------------------- Ελαστικά: η κάτοψη (01/09) */
/* ΓΙΑΤΙ ΜΙΚΡΗ ΚΑΙ ΚΕΝΤΡΑΡΙΣΜΕΝΗ: η κάτοψη είναι ΣΗΜΑ, όχι αφίσα. Τεντωμένη στο πλάτος της κάρτας (η δεξιά
   στήλη είναι ~745px) έπιανε μισή οθόνη για τέσσερις αριθμούς — το ίδιο μάθημα που έβαλε όριο 640px στο
   `.sketch`. Το `max-width` ορίζει ΚΑΙ το ύψος (η αναλογία το ακολουθεί), γι' αυτό μένει στο κάτω άκρο του
   εύρους που ζητήθηκε: 240px → ~266px ύψος σχεδίου. Σε στενή οθόνη μικραίνει κανονικά (width: 100%). */
.ty-top { display: block; width: 100%; max-width: 240px; height: auto; margin-inline: auto; }
/* Μέσα στο πλακίδιο (Vassilis: «μικρό, σαν τα άλλα»): πιο σφιχτό cap, αλλιώς το ψηλό SVG τεντώνει όλη
   τη σειρά του πλέγματος. Τα νούμερα του SVG κλιμακώνονται μαζί του — στα 10rem μένουν αναγνώσιμα. */
.tile-tyres .ty-top { max-width: 10rem; }
/* «Υποστήριξη οχήματος»: μία γραμμή που ανοίγει τη λίστα εγχειριδίων επιτόπου. Ο δείκτης του browser
   (τρίγωνο) μένει — λέει «ανοίγει» χωρίς δικό μας εικονίδιο. */
.man-support summary { cursor: pointer; }
.man-support summary::marker { color: var(--muted); }
.man-support > p, .man-support > .stack-tight { margin-top: var(--sp-4); }
/* Το αμάξωμα: ίδιο token με το σκίτσο (--sk-body), αλλά ΓΡΑΜΜΗ και όχι μάζα — εδώ οι ήρωες είναι τα
   λάστιχα και τα νούμερα, το περίγραμμα απλώς λέει «αυτό είναι το όχημα». */
.ty-body { fill: var(--sk-body); fill-opacity: .07; stroke: var(--sk-body); stroke-width: 1.6; }
/* Το παρμπρίζ: πιο αχνό ΚΑΙ πιο λεπτό από το περίγραμμα — αν το δεις πριν από τα νούμερα, έχει αποτύχει. */
.ty-glass { fill: none; stroke: var(--sk-body); stroke-width: 1.3; stroke-linecap: round; opacity: .55; }
.ty-steer-rim, .ty-steer-spoke, .ty-steer-col { fill: none; stroke: var(--sk-body); stroke-linecap: round; }
.ty-steer-rim { stroke-width: 2; }
.ty-steer-spoke { stroke-width: 1.6; }
.ty-steer-col { stroke-width: 3; }
.ty-steer-hub { fill: var(--sk-body); }
.ty-tyre { fill: var(--ink); }
.ty-val { fill: var(--ink); font-size: 15px; font-weight: 650; }
.ty-unit { fill: var(--muted); font-size: 11px; letter-spacing: .06em; }
/* Σιωπηλός ή χωρίς αισθητήρα τροχός: υπάρχει, δεν φωνάζει. Κρίσιμος: κόκκινο ΚΑΙ στο λάστιχο ΚΑΙ στο
   νούμερο — φαίνεται από την άκρη του ματιού, πριν διαβαστεί (GUI_SPEC §5). */
.ty-wheel.quiet .ty-tyre { fill: var(--muted); opacity: .45; }
.ty-wheel.quiet .ty-val { fill: var(--muted); }
.ty-wheel.crit .ty-tyre { fill: var(--crit); }
.ty-wheel.crit .ty-val { fill: var(--crit); }
/* Επιλεγμένος/από κάτω το ιστορικό: περίγραμμα accent — ΠΟΤΕ αλλαγή γεμίσματος, γιατί το γέμισμα λέει
   κατάσταση (ok/σιωπηλό/κρίσιμο) και ένα hover δεν επιτρέπεται να τη σβήσει. */
.ty-wheel[role='button'] { cursor: pointer; }
.ty-wheel[role='button']:hover .ty-tyre,
.ty-wheel[role='button']:focus-visible .ty-tyre,
.ty-wheel.open .ty-tyre { stroke: var(--accent); stroke-width: 2; }
.ty-wheel[role='button']:focus-visible { outline: none; }
/* Επιφάνεια αφής: αόρατη αλλά υπαρκτή για τον δείκτη — ο τροχός μόνος του είναι πολύ μικρός για δάχτυλο. */
.ty-hit { fill: var(--ink); fill-opacity: 0; pointer-events: all; }
/* 🛞 ΤΟ ΣΗΜΑ ΤΟΥ ΤΥΠΟΥ ΕΛΑΣΤΙΚΩΝ (0134): ΓΡΑΜΜΗ, ΟΧΙ ΜΑΖΑ. Στο χρώμα του κειμένου ώστε να διαβάζεται
   με μια ματιά, αλλά χωρίς γέμισμα — οι ήρωες της κάτοψης μένουν τα τέσσερα νούμερα. Το ίδιο σχήμα
   δουλεύει και στα δύο θέματα γιατί το `--ink` γυρίζει μαζί τους· ένα hex εδώ θα ήταν αόρατο στο ένα.
   Το σήμα ΔΕΝ πατιέται (καμία ενέργεια πίσω του): `pointer-events: none` ώστε να μην κλέβει το κλικ
   από την αόρατη επιφάνεια αφής των τροχών, που περνά από πάνω του στο κινητό. */
.ty-fit { pointer-events: none; }
.ty-fit-mark { fill: none; stroke: var(--ink); stroke-width: 1.5;
               stroke-linecap: round; stroke-linejoin: round; }
.ty-fit-when { fill: var(--muted); font-size: 10px; }

/* SMS/WhatsApp προθήκες στην κάρτα ενοικιαστή (02/09): διακριτά χρώματα ώστε τα τρία κανάλια να
   διαβάζονται με μια ματιά — SMS στο πράσινο του συστήματος, WhatsApp στο δικό του πράσινο (brand,
   μοναδική επώνυμη απόχρωση του GUI — δικαιολογημένη: το κουμπί ΕΙΝΑΙ το σήμα). */
.btn.btn-sms { background: var(--ok); }
.btn.btn-wa { background: var(--wa); color: var(--wa-ink); }

/* Ανακάλυψη αισθητήρων — ζωντανή (02/09). Το «ανοιχτό» δεν είναι ετικέτα, είναι κατάσταση που τρέχει: η
   κουκκίδα χτυπά όπως το `.dot.on` του στόλου, ώστε το μάτι να το πιάνει από την άκρη πριν διαβάσει το
   ρολόι. Σε `prefers-reduced-motion` σβήνει ο παλμός (global κανόνας πιο πάνω) — η κουκκίδα μένει. */
.disc-open { display: inline-flex; align-items: center; gap: var(--sp-2); }
.disc-open::before {
  content: '';
  inline-size: 7px; block-size: 7px; border-radius: var(--r-pill);
  background: currentColor;
  animation: pulse var(--pulse-dot) infinite;
}
/* Το εικονίδιο πηγής: σιωπηλό (χρώμα `--muted`), σταθερού μεγέθους, δεν συμπιέζεται από το flex. */
.disc-src-wrap { display: inline-flex; color: var(--muted); flex: none; }
.disc-src { inline-size: 18px; block-size: 18px; }
/* Το δείγμα paths του Venus: ζευγάρια «path → τιμή», με το path σε mono ώστε να διαβάζεται σαν διαδρομή. */
.disc-details > summary { cursor: pointer; color: var(--accent); }
.disc-sample { display: flex; flex-direction: column; gap: var(--sp-1); margin-block-start: var(--sp-3); }
.disc-sample .row { gap: var(--sp-3); }

/* ════════════════════════════════════════════════════════════════ ΠΑΡΑΛΑΒΗ / ΕΠΙΣΤΡΟΦΗ, ΖΗΜΙΕΣ, ΑΥΛΗ
   (0072/0073, 02/09) — όλες οι οθόνες της αυλής. ΚΙΝΗΤΟ ΠΡΩΤΑ: ο άνθρωπος που τις χρησιμοποιεί στέκεται
   όρθιος δίπλα στο όχημα. Ό,τι πατιέται είναι ≥44px, ό,τι διαβάζεται με τον ήλιο πάνω στην οθόνη είναι
   ≥13,5px, και κανένα χρώμα δεν γράφεται εδώ — μόνο tokens. */

/* ---- κοινά: κείμενο που προειδοποιεί χωρίς να είναι pill (μέσα σε παράγραφο, όχι δίπλα σε τίτλο) */
.warn-text { color: var(--warn); }
.crit-text { color: var(--crit); font-weight: var(--fw-med); }

/* ---- ΖΗΜΙΕΣ ΠΑΝΩ ΣΤΟ ΣΚΙΤΣΟ: το σχήμα λέει «ζημιά» και το χρώμα λέει «πόσο» — ποτέ μόνο το χρώμα (§2) */
.sk-dmg-dot { fill: var(--warn); }
.sk-dmg-halo { fill: var(--warn); opacity: .18; }
.sk-dmg-x { stroke: var(--on-warn); stroke-width: 1.8; stroke-linecap: round; fill: none; }
.sk-damage.critical .sk-dmg-dot, .sk-damage.functional .sk-dmg-dot { fill: var(--crit); }
.sk-damage.critical .sk-dmg-halo, .sk-damage.functional .sk-dmg-halo { fill: var(--crit); opacity: .2; }
.sk-damage.critical .sk-dmg-x, .sk-damage.functional .sk-dmg-x { stroke: var(--on-crit); }
/* Η κρίσιμη αναπνέει, όπως κάθε τι ζωντανό στο σκίτσο — η αισθητική δεν χρειάζεται να τραβήξει το μάτι. */
.sk-damage.critical .sk-dmg-halo { animation: breathe var(--pulse-marker) ease-in-out infinite; }
.sk-place { fill: var(--accent); fill-opacity: 0; cursor: crosshair; }

/* ---- η γραμμή «2 ανοιχτές ζημιές →» κάτω από το σκίτσο */
.dmg-line {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  width: 100%;
  background: none;
  border: none;
  border-block-start: 1px solid var(--line);
  border-radius: 0;
  padding: var(--sp-4) var(--sp-1) 0;
  color: var(--crit);
  font-weight: var(--fw-semi);
  text-align: start;
}
.dmg-line:hover { filter: none; color: var(--crit); }
.dmg-caret { margin-inline-start: auto; display: inline-flex; flex: none;
             transform: rotate(180deg); transition: transform var(--t) var(--ease); }
.dmg-line.open .dmg-caret { transform: rotate(270deg); }
/* Το «Ιστορικό» της ζημιάς: κείμενο + το ΙΔΙΟ βελάκι, που γυρίζει όταν ανοίγει. Δεν είναι λωρίδα —
   είναι σύνδεσμος μέσα σε κάρτα, άρα το βελάκι κάθεται δίπλα στη λέξη και δεν φεύγει δεξιά. */
.dmg-hist-btn { display: inline-flex; align-items: center; gap: var(--sp-2); }
.dmg-hist-btn .dmg-caret { margin-inline-start: 0; }
.dmg-hist-btn.open .dmg-caret { transform: rotate(270deg); }
.dmg-box { display: flex; flex-direction: column; gap: var(--sp-4); }
/* ΠΛΕΓΜΑ ΚΑΙ ΟΧΙ FLEX: κείμενο | μικρογραφία, και οι ενέργειες σε δική τους γραμμή από κάτω. Με flex, τα
   κουμπιά κατάστασης (τρία chips) διεκδικούσαν πλάτος από τον τίτλο και ο τίτλος έσπαγε κάθετα, μία λέξη
   ανά γραμμή — φάνηκε σε αληθινό browser, όχι στον κώδικα (02/09). */
.dmg-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--sp-2) var(--sp-4);
           align-items: start; padding-block: var(--sp-4); }
.dmg-row + .dmg-row { border-block-start: 1px solid var(--line); }
.dmg-main { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.dmg-sev { width: 10px; height: 10px; border-radius: var(--r-pill); flex: none; background: var(--warn); }
.dmg-sev.functional, .dmg-sev.critical { background: var(--crit); }
.dmg-thumb { width: 64px; height: 64px; object-fit: cover; border-radius: var(--r-s); flex: none;
             border: 1px solid var(--line); }
.dmg-act { grid-column: 1 / -1; }

/* ---- τα κουμπιά «Παραλαβή / Επιστροφή» στη σελίδα οχήματος */
.veh-ho .ho-go-row { gap: var(--sp-4); }
.ho-go {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  flex: 1 1 12rem;
  padding: var(--sp-4) var(--sp-6);
  font-size: var(--fs-m);
  font-weight: var(--fw-semi);
}
/* Η ΕΠΙΣΤΡΟΦΗ ΔΕΝ ΕΙΝΑΙ ΤΟ ΙΔΙΟ ΚΟΥΜΠΙ ΜΕ ΤΗΝ ΠΑΡΑΛΑΒΗ: όταν φαίνονται και τα δύο (μισοτελειωμένο
   πρωτόκολλο), το χρώμα ξεχωρίζει ποιο πάτησες πριν από πέντε λεπτά. */
.ho-go.checkout { background: none; color: var(--accent); }
.ho-go.checkout:hover { background: var(--accent-soft); }
.ho-go.resumed { border-color: var(--warn); }
.ho-go-sub { font-size: var(--fs-xs); font-weight: var(--fw-reg); opacity: .85; }

/* ---- ο οδηγός: βήματα */
.ho { display: flex; flex-direction: column; gap: var(--sp-5); }
.ho .card { margin: 0; }
.ho-resumed { align-self: flex-start; }
.ho-steps { display: flex; gap: var(--sp-2); overflow-x: auto; padding-block-end: var(--sp-1); }
.ho-step {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex: 1 1 auto;
  white-space: nowrap;
  background: none;
  border: 1px solid var(--line);
  color: var(--muted);
  font-size: var(--fs-s);
  padding: var(--sp-3) var(--sp-4);
}
.ho-step:hover { filter: none; color: var(--ink); }
.ho-step.active { border-color: var(--accent); background: var(--accent-soft); color: var(--ink);
                  font-weight: var(--fw-semi); }
.ho-step.done { color: var(--ink); }
.ho-step-n {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: var(--r-pill);
  background: var(--neutral-soft);
  font-size: var(--fs-xs);
  flex: none;
}
.ho-step.active .ho-step-n { background: var(--accent); color: var(--on-accent); }
.ho-step.done .ho-step-n { background: var(--ok-soft); color: var(--ok); }
.ho-nav { justify-content: space-between; }
.ho-nav button { min-width: 8rem; }

/* ---- οι όψεις: πλέγμα καρτών, μία ανά όψη */
.ho-slots { display: grid; grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr)); gap: var(--sp-5); }
.ho-slot {
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: var(--sp-4);
}
.ho-slot.has { border-color: var(--ok); }
.ho-slot-head { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.ho-slot-name { font-size: var(--fs-s); font-weight: var(--fw-semi); }
.ho-tick { color: var(--ok); font-weight: var(--fw-bold); }
.ho-slot-act { gap: var(--sp-3); }
/* Το πεδίο αρχείου δεν φαίνεται ΠΟΤΕ: το κουμπί από δίπλα το πατά. Ένα `<input type=file>` με τη δική του
   ετικέτα («Δεν επιλέχθηκε αρχείο») σε ελληνικό κινητό είναι τρεις λέξεις θόρυβος ανά όψη — δέκα φορές. */
.ho-file { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.ho-pair { display: flex; flex-direction: column; gap: var(--sp-3); }
.ho-side { display: flex; flex-direction: column; gap: var(--sp-1); }
.ho-side-label { font-size: var(--fs-xs); color: var(--muted); letter-spacing: .04em; }
.ho-shot { position: relative; aspect-ratio: 4 / 3; border-radius: var(--r-s); overflow: hidden;
           background: var(--bg2); }
/* «ΧΩΡΙΣ ΦΩΤΟΓΡΑΦΙΑ» ΓΡΑΜΜΕΝΟ, ΟΧΙ ΚΕΝΟ ΚΟΥΤΙ: η απουσία ΕΙΝΑΙ η πληροφορία (0072) — ένα άδειο πλαίσιο
   διαβάζεται ως «δεν φόρτωσε», και ο υπεύθυνος δεν μαθαίνει ποτέ ότι κανείς δεν φωτογράφισε την πίσω δεξιά. */
.ho-shot.empty { display: flex; align-items: center; justify-content: center;
                 border: 1px dashed var(--line); background: none; }
.ho-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ho-del { position: absolute; inset-block-start: var(--sp-2); inset-inline-end: var(--sp-2);
          background: var(--card); }

/* ---- κοντέρ και στάθμες */
.ho-odo { max-width: 9rem; font-size: var(--fs-xl); font-weight: var(--fw-semi); }
.ho-level + .ho-level { margin-block-start: var(--sp-5); padding-block-start: var(--sp-4);
                        border-block-start: 1px solid var(--line); }
.ho-level-k { font-weight: var(--fw-semi); }
.ho-level-v { color: var(--muted); }
input[type='range'].ho-range {
  width: 100%;
  max-width: none;
  height: 32px;                      /* στόχος αφής, όχι διακοσμητικό ύψος */
  padding: 0;
  border: none;
  background: none;
  accent-color: var(--accent);
}

/* ---- ζημιές μέσα στον οδηγό */
.ho-sketch { padding: var(--sp-4) var(--sp-5); }
.ho-sketch.placing { border-color: var(--accent); }
.ho-place-hint { text-align: center; color: var(--accent); font-size: var(--fs-s); margin-block-start: var(--sp-3); }
.ho-dmg-form textarea, .ho-dmg-form input[type='text'] { max-width: none; }

/* ---- υπογραφή */
.ho-sum-row { align-items: baseline; }
.ho-sign { width: 100%; padding: var(--sp-5); font-size: var(--fs-l); font-weight: var(--fw-semi); }
.ho-done { border-color: var(--ok); }
.ho-warns { border-color: var(--warn); }

/* ════════════════════════════════════════════════════════════════ Η ΑΥΛΗ */
.yd { display: flex; flex-direction: column; gap: var(--sp-5); }
.yd .card { margin: 0; }
/* ΤΥΛΙΓΕΙ (05/09): με τον επιλογέα προβολής η κεφαλίδα απέκτησε πέμπτο παιδί, και στα 390 px ο
   επιλογέας παίρνει ολόκληρη τη δική του σειρά (`.yd-span { flex: 1 0 100% }`). Χωρίς `flex-wrap`
   αυτό θα ήταν ΑΚΡΙΒΩΣ η οριζόντια κύλιση της σελίδας που μόλις διορθώθηκε παντού. */
.yd-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); }
.yd-day { display: flex; flex-direction: column; min-width: 0; }
/* Ο ΑΡΙΘΜΟΣ ΤΗΣ ΜΕΡΑΣ ΩΣ ΣΗΜΑ (03/09, idiom του iOS Calendar): σκέτος αριθμός για κάθε μέρα, ΚΟΚΚΙΝΟΣ
   ΓΕΜΑΤΟΣ ΔΙΣΚΟΣ για τη σημερινή. Το μάτι βρίσκει το σχήμα πριν διαβάσει λέξη — σε έξι γλώσσες το ίδιο.

   ΖΕΙ ΜΕΣΑ ΣΤΟΝ ΤΙΤΛΟ, ΩΣ INLINE ΣΤΟΙΧΕΙΟ (03/09 β): η θέση του μέσα στη φράση τη δίνει το locale
   (`Intl.formatToParts` στη JS) — «Πέμπτη 3 Σεπτεμβρίου», «Donnerstag, 3. September», «Thursday,
   September 3». Ως ξεχωριστό κουτί δίπλα στον τίτλο (όπως ήταν το πρωί) ο αριθμός καθόταν ΠΑΝΤΑ πρώτος,
   δηλαδή έξω από τη σειρά της γλώσσας.
   ΜΕΓΕΘΗ ΣΕ em ΚΑΙ ΟΧΙ ΣΕ rem: ο δίσκος πρέπει να μεγαλώνει ΜΕ ΤΟΝ ΤΙΤΛΟ, όχι με τη ρίζα.
   `min-width` = το «30» δεν σπάει τον κύκλο, το «3» δεν τον στενεύει σε ελλειψοειδές. */
.yd-dnum {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 1.55em; height: 1.55em; padding-inline: .18em;
  border-radius: var(--r-pill); vertical-align: middle;
  font-weight: var(--fw-semi); line-height: 1; color: inherit;
}
/* ΔΥΟ ΑΓΚΙΣΤΡΑ, ΙΔΙΟ ΑΠΟΤΕΛΕΣΜΑ: η κλάση βάφει, το `aria-current` βάφει ΚΑΙ το ανακοινώνει. Ένα σήμα
   που λείπει δεν βγάζει σφάλμα πουθενά — γι' αυτό δεν κρέμεται από μία μόνο λέξη. */
.yd-dnum.today, .yd-dnum[aria-current='date'] { background: var(--crit); color: var(--on-crit); }
.yd-h1 { font-size: var(--fs-xl); margin: 0; text-transform: capitalize; line-height: 1.3; }
.yd-fwd svg { transform: rotate(180deg); }        /* ένα εικονίδιο, δύο κατευθύνσεις */
.yd-conflicts { display: flex; flex-direction: column; gap: var(--sp-4); }
.yd-conflict { display: flex; flex-direction: column; gap: var(--sp-2); }
.yd-tools { justify-content: space-between; }
.yd-list { display: flex; flex-direction: column; padding: var(--sp-3) var(--sp-5); }
.yd-row { display: flex; gap: var(--sp-5); align-items: flex-start; padding-block: var(--sp-4); }
.yd-row + .yd-row { border-block-start: 1px solid var(--line); }
/* Η ΩΡΑ ΣΕ ΔΙΚΗ ΤΗΣ ΣΤΗΛΗ: ο διάδρομος της μέρας διαβάζεται κατακόρυφα, με μία ματιά — γι' αυτό σταθερό
   πλάτος και ίδια στοίχιση για γεγονότα και εργασίες. */
.yd-time { flex: none; width: 4.2rem; font-weight: var(--fw-semi); font-size: var(--fs-m); }
.yd-time.planned { color: var(--muted); font-weight: var(--fw-reg); }   /* «≈» = δεν υπάρχει ραντεβού */
.yd-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.yd-sub { gap: var(--sp-3); }
.yd-code { font-weight: var(--fw-semi); }
.pill.yd-out { background: var(--accent-soft); color: var(--accent); }
.pill.yd-in { background: var(--ok-soft); color: var(--ok); }
.yd-row.task .yd-main { opacity: 1; }
.yd-row.task.done { opacity: .62; }
.yd-row.task.overdue .yd-time { color: var(--crit); }
.yd-task-title { font-weight: var(--fw-med); }
.yd-task-pill { background: var(--neutral-soft); }
.yd-act { gap: var(--sp-3); }
.yd-act button { padding: var(--sp-2) var(--sp-5); }
.yd-empty { padding: var(--sp-8) 0; text-align: center; }

/* ---- η λίστα της καθαρίστριας: μεγάλα γράμματα, μεγάλα κουμπιά, τίποτα άλλο */
/* ΣΤΗΛΗ ΠΛΑΤΟΥΣ ΚΙΝΗΤΟΥ ΑΚΟΜΑ ΚΑΙ ΣΕ ΟΘΟΝΗ: η λίστα της καθαρίστριας διαβάζεται στην αυλή, από τηλέφωνο.
   Απλωμένη σε 1400 px, το κουμπί «Έγινε» γίνεται λωρίδα ενός μέτρου και η κάρτα χάνει το σχήμα της. */
.yd-my { display: flex; flex-direction: column; gap: var(--sp-5); max-width: 34rem; }
.yd-my-card { display: flex; flex-direction: column; gap: var(--sp-3); margin: 0; }
.yd-my-card.done { opacity: .6; }
.yd-my-card.overdue { border-color: var(--crit-line); }
.yd-my-code { font-size: var(--fs-xl); font-weight: var(--fw-bold); }
.yd-my-title { font-size: var(--fs-l); }
.yd-my-act { gap: var(--sp-4); margin-block-start: var(--sp-2); }
.yd-big { flex: 1 1 8rem; max-width: 16rem; padding: var(--sp-5); font-size: var(--fs-l);
          font-weight: var(--fw-semi); }
.yd-my-done { margin-block-start: var(--sp-6); }

@media (max-width: 719px) {
  /* Μία ΟΨΗ ανά γραμμή (όχι δύο κάρτες δίπλα-δίπλα: θα ήταν 80px η καθεμία, δηλαδή τίποτα) — αλλά ΜΕΣΑ
     στην όψη, οι δύο φωτογραφίες πάνε δίπλα-δίπλα: σε πλήρες πλάτος είναι ~165px η καθεμία, αρκετά για να
     δεις τη διαφορά, και η σύγκριση γίνεται χωρίς scroll ανάμεσα στο «τότε» και στο «τώρα». */
  .ho-slots { grid-template-columns: 1fr; }
  .ho-pair { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-3); }
  .ho-nav button { min-width: 6rem; }
  .ho-step span:not(.ho-step-n) { display: none; }   /* στο κινητό μένουν οι αριθμοί: 1 2 3 4 */
  .ho-step { flex: 1 1 0; justify-content: center; }
  .ho-go { flex-basis: 100%; }
  .yd-row { gap: var(--sp-4); }
  .yd-time { width: 3.4rem; font-size: var(--fs-s); }
  .yd-list { padding: var(--sp-2) var(--sp-4); }
  .dmg-thumb { width: 52px; height: 52px; }
}

/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   0075 (02/09) — ΠΕΔΙΟ: ΡΟΗ ΚΑΜΕΡΑΣ, ΣΕΛΙΔΑ ΖΗΜΙΩΝ, ΕΝΤΟΛΗ ΕΠΙΣΚΕΥΗΣ, ΜΕΡΑ ΤΟΥ ΧΩΡΟΥ PARKING
   ══════════════════════════════════════════════════════════════════════════════════════════════════
   Η ΑΡΧΗ ΤΗΣ ΕΝΟΤΗΤΑΣ, ΑΥΤΟΛΕΞΕΙ ΑΠΟ ΤΟΝ VASSILIS (02/09): «στις εργασίες που κάνουν με το κινητό στο
   πεδίο είναι πολύ βασικό το mobile friendly και τα μεγάλα ξεκάθαρα πλήκτρα, χωρίς πολλά πολλά — απλά,
   γρήγορα, user friendly· το desktop είναι πιο άνετο».

   Σε πράξη: μία κύρια ενέργεια ανά οθόνη, σε ΠΛΗΡΕΣ ΠΛΑΤΟΣ και ≥52 px ύψος (δάχτυλο με γάντι), οι
   δευτερεύουσες μικρές και χαμηλά, οι ενέργειες των λιστών ΚΡΥΜΜΕΝΕΣ μέχρι το tap στην κάρτα. Στο
   desktop οι ίδιες οθόνες απλώνονται και δείχνουν περισσότερα ταυτόχρονα — εκεί υπάρχει χώρος.

   ΚΑΝΕΝΑ ΧΡΩΜΑ ΕΚΤΟΣ TOKENS σε ολόκληρη την ενότητα (το φυλάει το test_api.py). */

/* ---------------------------------------------------------------- το ΜΕΓΑΛΟ κουμπί του πεδίου */
.ho-big {
  min-height: 52px;
  padding: var(--sp-5) var(--sp-6);
  font-size: var(--fs-l);
  font-weight: var(--fw-semi);
  border-radius: var(--r);
}
.ho-shoot { width: 100%; }

/* ---------------------------------------------------------------- ΡΟΗ ΚΑΜΕΡΑΣ (κινητό) */
.ho-cam { gap: var(--sp-4); }
.ho-cam-top { align-items: baseline; }
.ho-cam-slot { font-size: var(--fs-l); font-weight: var(--fw-semi); }
.ho-cam-count { color: var(--muted); font-size: var(--fs-m); }
/* Οι κουκκίδες του γύρου: στόχος 44 px ο καθένας, ό,τι λέει και ο κανόνας προσβασιμότητας για δάχτυλο. */
.ho-dots { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
.ho-dot {
  width: 44px; height: 30px; padding: 0; border-radius: var(--r-pill);
  background: var(--neutral-soft); border: 1px solid var(--line);
  color: var(--ink);                    /* άδειο σήμερα — αλλά η επόμενη ετικέτα μέσα του δεν θα είναι λευκή */
}
.ho-dot.has { background: var(--ok-soft); border-color: var(--ok); }
.ho-dot.now { outline: 2px solid var(--accent); outline-offset: 1px; }
.ho-cam-stage .ho-shot { aspect-ratio: 4 / 3; }
.ho-cam-nav { gap: var(--sp-3); }
.ho-cam-nav button { flex: 1 1 0; min-height: 44px; }
.ho-cam-sum { text-align: center; }
/* Το «στην παραλαβή» σε κινητό: ΑΝΑΦΟΡΑ, όχι δεύτερη στήλη — μικρογραφία που ανοίγει με tap. */
.ho-then-line {
  display: flex; align-items: center; gap: var(--sp-4); width: 100%;
  padding: var(--sp-3); border: 1px solid var(--line); border-radius: var(--r-s);
  background: var(--card2); text-align: start;
  color: var(--ink);                    /* ΙΔΙΟ ΛΑΘΟΣ, ΙΔΙΑ ΑΙΤΙΑ: κουμπί χωρίς accent χωρίς μελάνι */
}
.ho-then-thumb { width: 56px; height: 42px; object-fit: cover; border-radius: var(--r-s); flex: none; }
.ho-shot.tap { cursor: zoom-in; }

/* ---------------------------------------------------------------- πλήρης οθόνη: προεπισκόπηση/μεγέθυνση */
.ho-full {
  position: fixed; inset: 0; z-index: 50;
  display: flex; flex-direction: column; gap: var(--sp-4);
  padding: var(--sp-5); background: var(--bg);
}
.ho-full-head { display: flex; align-items: center; gap: var(--sp-3); }
.ho-full-name { font-size: var(--fs-l); font-weight: var(--fw-semi); }
/* Η ΣΚΗΝΗ ΤΗΣ ΛΗΨΗΣ, ΟΧΙ ΑΔΕΙΟ ΧΑΡΤΙ (02/09, από PNG στα 390 px). Χωρίς δικό της φόντο και ύψος, η
   περιοχή προεπισκόπησης έβγαινε ένα τεράστιο ανοιχτό ορθογώνιο — και όταν η εικόνα αργεί ή αποτυγχάνει,
   ο υπάλληλος δεν ξέρει αν τράβηξε λευκό τοίχο ή αν χάλασε κάτι. Κάθε camera preview στον κόσμο βάζει
   ΣΚΟΥΡΟ ΠΕΡΙΓΡΑΜΜΑ γύρω από τη φωτογραφία: το `--overlay` είναι σκούρο ΚΑΙ στα δύο θέματα (είναι το
   token του καλύμματος), άρα η φωτό ξεχωρίζει είτε είναι φωτεινή είτε σκοτεινή.
   Η αναλογία 4:3 είναι το «δάπεδο» για κοντές οθόνες· σε ψηλές, το `flex` το μεγαλώνει. */
.ho-full-stage {
  flex: 1 1 auto; min-height: 0; aspect-ratio: 4 / 3;
  display: flex; align-items: center; justify-content: center;
  background: var(--overlay); border-radius: var(--r-s); overflow: hidden;
}
.ho-full-img { max-width: 100%; max-height: 100%; display: block; object-fit: contain; }
/* ΔΥΟ ΚΟΥΜΠΙΑ, ΤΙΠΟΤΑ ΑΛΛΟ: «Κράτα» και «Ξανά». Ίσο πλάτος, ώστε να μη μαντεύει κανείς ποιο πατά. */
.ho-full-act { display: flex; gap: var(--sp-4); }
.ho-full-act .ho-big { flex: 1 1 0; }

/* ---------------------------------------------------------------- τεμπέλικο draft + ακύρωση */
.ho-lazy { display: block; }
.ho-cancel-row { display: flex; justify-content: center; margin-block-start: var(--sp-6); }

/* ---------------------------------------------------------------- ΣΕΛΙΔΑ ΖΗΜΙΩΝ */
.dmg-page { display: flex; flex-direction: column; gap: var(--sp-5); }
.dmg-filters { margin-block: 0; }
.dmg-list { padding: var(--sp-3) var(--sp-5); }
.dmg-empty { padding: var(--sp-8) 0; text-align: center; }
.dmg-tools { display: flex; flex-direction: column; gap: var(--sp-3); }
/* ΟΛΟΚΛΗΡΗ Η ΓΡΑΜΜΗ ΕΙΝΑΙ Ο ΣΤΟΧΟΣ ΕΠΙΛΟΓΗΣ: checkbox 16 px δίπλα σε κείμενο δεν πιάνεται με γάντι, και
   το λάθος tap εδώ στέλνει λάθος ζημιά στο συνεργείο. */
.dmg-row.pick {
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: start; cursor: pointer; border-radius: var(--r-s);
  padding-inline: var(--sp-3); margin-inline: calc(-1 * var(--sp-3));
}
.dmg-row.pick:hover { background: var(--hover); }
.dmg-row.picked { background: var(--accent-soft); }
.dmg-check { width: 26px; height: 26px; margin: var(--sp-2) 0 0 0; flex: none; accent-color: var(--accent); }
.dmg-row.fresh { border-inline-start: 3px solid var(--warn); padding-inline-start: var(--sp-4); }
.dmg-order { gap: var(--sp-4); }
.dmg-line.has { color: var(--crit); }

/* ---------------------------------------------------------------- ΕΝΤΟΛΗ ΕΠΙΣΚΕΥΗΣ (οθόνη + χαρτί) */
.ro { display: flex; flex-direction: column; gap: var(--sp-5); }
.ro-tools { align-items: center; }
.ro-sheet {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r);
  padding: var(--sp-7); display: flex; flex-direction: column; gap: var(--sp-6);
  max-width: 52rem;
}
.ro-head { align-items: flex-start; gap: var(--sp-5); }
.ro-title { font-size: var(--fs-2xl); font-weight: var(--fw-bold); letter-spacing: .02em; }
/* 🖼 ΤΟ ΛΟΓΟΤΥΠΟ ΣΤΗΝ ΚΕΦΑΛΙΔΑ ΤΟΥ ΧΑΡΤΙΟΥ (0127) — ΠΑΝΩ ΑΠΟ ΤΟΝ ΤΙΤΛΟ, ΟΧΙ ΔΙΠΛΑ ΤΟΥ.
   Δίπλα θα ανταγωνιζόταν τη δεξιά στήλη (ημερομηνία/προθεσμία/ανάδοχος) για τον ίδιο χώρο σε A4 και θα
   στρίμωχνε τον τίτλο σε δύο σειρές με το πρώτο μακρύ λογότυπο. Από πάνω, το χαρτί διαβάζεται όπως κάθε
   επιστολόχαρτο: ποιος στέλνει, μετά τι στέλνει.
   ΥΨΟΣ ΣΕ ΧΙΛΙΟΣΤΑ ΚΑΙ ΟΧΙ ΣΕ px: αυτό είναι χαρτί (`@page A4`), και το χαρτί δεν έχει pixel.

   🚨 22 mm ΚΑΙ ΟΧΙ 14 — ΔΙΟΡΘΩΣΗ ΑΠΟ ΠΡΑΓΜΑΤΙΚΗ ΕΚΤΥΠΩΣΗ (ιδιοκτήτης 05/09: «στο PDF πάντως είναι πολύ
   μικρό»). Ο λόγος που τα 14 mm βγήκαν μικροσκοπικά ΔΕΝ ήταν το νούμερο αλλά Η ΑΝΑΛΟΓΙΑ: το λογότυπο
   της Luna είναι ΚΑΘΕΤΟ (716×1095), οπότε με `contain` δεσμεύει το ΥΨΟΣ και το πλάτος βγαίνει 0,65× —
   14 mm ύψος έδιναν σφραγίδα 9×14 mm δίπλα σε τίτλο 24 px. Το `max-width: 60 mm` δεν έπαιζε ΚΑΝΕΝΑ
   ρόλο για αυτό το σχήμα· παίζει για το ΟΡΙΖΟΝΤΙΟ λεκτικό λογότυπο (4:1), που πιάνει το πλάτος πρώτο
   και βγαίνει 60×15 mm. ΤΑ ΔΥΟ ΟΡΙΑ ΜΑΖΙ καλύπτουν και τα δύο σχήματα, και δοκιμάστηκαν και τα δύο σε
   αληθινό Chromium με `--print-to-pdf` (κάθετο δείγμα: το σήμα της Luna· οριζόντιο: 1200×300).
   22 mm είναι το ύψος ενός λογοτύπου σε επιστολόχαρτο — αναγνωρίσιμο από απόσταση χεριού, χωρίς να
   ανταγωνίζεται τον τίτλο της εντολής. */
.ro-logo { max-height: 22mm; max-width: 60mm; object-fit: contain; display: block; }
.ro-sub { font-size: var(--fs-l); }
.ro-meta { text-align: end; }
.ro-intro { margin: 0; }
.ro-block { display: flex; flex-direction: column; gap: var(--sp-3); }
.ro-id { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: 0 var(--sp-6); }
.ro-id-row { padding-block: var(--sp-2); border-block-end: 1px solid var(--line); }
.ro-sketch { max-width: 34rem; }
.ro-list { display: flex; flex-direction: column; }
.ro-item { display: flex; gap: var(--sp-4); padding-block: var(--sp-4); align-items: flex-start; }
.ro-item + .ro-item { border-block-start: 1px solid var(--line); }
.ro-n { font-size: var(--fs-l); font-weight: var(--fw-bold); width: 1.6rem; flex: none; }
.ro-photos { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: var(--sp-4); }
.ro-figure { margin: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.ro-photo { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--r-s); }
.ro-signs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-6);
            margin-block-start: var(--sp-8); }
.ro-sign { display: flex; flex-direction: column; gap: var(--sp-2); }
.ro-line { border-block-end: 1px solid var(--ink); height: var(--sp-8); }

/* ΤΟ ΧΑΡΤΙ. Ο browser κάνει το PDF (Ctrl+P) — καμία εξάρτηση PDF στον server (απόφαση 02/09). Το θέμα
   γυρίζει σε ανοιχτό από το `damages.js` πριν το `print()`: σκούρο θέμα σε χαρτί είναι είτε μαύρη σελίδα
   είτε λευκό σε λευκό. */
@page { size: A4; margin: 14mm; }
@media print {
  #top, #bottom, #toast, .no-print, .ho-full { display: none !important; }
  body { background: var(--card); }
  .ro-sheet { border: 0; padding: 0; max-width: none; }
  /* 🖨 ΤΟ ΛΟΓΟΤΥΠΟ ΤΥΠΩΝΕΤΑΙ ΜΕ ΤΑ ΧΡΩΜΑΤΑ ΤΟΥ. Οι browsers κόβουν εξ ορισμού φόντα και «βαριά» χρώματα
     στην εκτύπωση (οικονομία μελανιού) — και ένα λογότυπο λευκό-σε-μαύρο (όπως της Luna) θα έβγαινε
     λευκό σε λευκό, δηλαδή κενό. Δηλώνεται ΜΟΝΟ για την εικόνα, όχι για όλη τη σελίδα: το υπόλοιπο
     χαρτί οφείλει να μείνει ασπρόμαυρο και φθηνό. */
  .ro-logo { print-color-adjust: exact; -webkit-print-color-adjust: exact; }
  .ro-block, .ro-item, .ro-figure { break-inside: avoid; }
  .ro-signs { break-inside: avoid; }
  .ro-photos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ---------------------------------------------------------------- Ο ΧΩΡΟΣ PARKING: «ποια είναι μέσα» */
.yd-parking { display: flex; flex-direction: column; gap: var(--sp-3); }
.yd-parking-top { align-items: baseline; }
.yd-parking-list { margin-block: 0; }
.yd-parking-chip { font-weight: var(--fw-semi); }
.yd-parking-sum { gap: var(--sp-3); }

/* ---------------------------------------------------------------- Η ΜΕΡΑ: ΚΑΡΤΕΣ, ΟΧΙ ΓΡΑΜΜΕΣ
   Με 22 οχήματα η Luna βγάζει 20+ γραμμές την ημέρα. Η παλιά λίστα είχε 4-5 pills και μόνιμα κουμπιά ανά
   γραμμή — σε 390 px τσαλακωνόταν σε τρεις σειρές η καθεμία και δεν διαβαζόταν τίποτα («για φάπες»).
   Τώρα: ΩΡΑ μεγάλη αριστερά, ΜΙΑ γραμμή τίτλου, το πολύ μία σημαία, και οι ενέργειες ΜΕ TAP. */
/* ---- ΟΙ ΣΥΓΚΡΟΥΣΕΙΣ: ΜΙΑ ΓΡΑΜΜΗ ΛΙΣΤΑΣ Η ΚΑΘΕΜΙΑ, ΚΛΕΙΣΤΕΣ (Vassilis 03/09: «βγάζεις κάτι τεράστια
   κουτιά, ειδικά όταν έχει καθυστέρηση»). ΕΝΑ κουτί με χωρίστρες αντί για στοίβα από κάρτες: τέσσερις
   κάρτες με δικό τους περίγραμμα η καθεμία διαβάζονταν σαν τέσσερα ΔΙΑΦΟΡΕΤΙΚΑ προβλήματα, ενώ είναι
   τέσσερις φορές το ίδιο — και το ίδιο θέλει σάρωση, όχι ανάγνωση.
   Η ΣΟΒΑΡΟΤΗΤΑ ΜΕ ΧΡΩΜΑ, ΠΟΤΕ ΜΕ ΟΓΚΟ: κουκκίδα 8 px και μια λέξη στην απόχρωσή της — όχι pill, όχι
   κόκκινο περίγραμμα γύρω από ολόκληρη τη γραμμή. Το ύψος μένει 44 px (ο κανόνας του πεδίου). */
.yd-conflicts { gap: var(--sp-2); margin-block-end: var(--sp-2); }
.yd-c-list {
  border: 1px solid var(--line); border-radius: var(--r-s); background: var(--card); overflow: hidden;
}
.yd-c + .yd-c { border-block-start: 1px solid var(--line); }
.yd-c-head {
  display: flex; align-items: center; gap: var(--sp-3); width: 100%;
  padding: var(--sp-2) var(--sp-4); background: none; border: 0; text-align: start; min-height: 44px;
  color: var(--ink);
}
.yd-c-head:hover { background: var(--hover); }
/* Η κουκκίδα ΕΙΝΑΙ η σοβαρότητα — και δεν είναι μόνη της: η λέξη δίπλα της (και το `aria-label`) λένε
   το ίδιο με γράμματα, γιατί χρώμα χωρίς λέξη δεν είναι πληροφορία για όλους. */
.yd-c-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--warn); }
.yd-c.crit .yd-c-dot { background: var(--crit); }
.yd-c-code { flex: none; }
.yd-c-deg {
  flex: none; font-size: var(--fs-xs); font-weight: var(--fw-semi); color: var(--warn);
  text-transform: uppercase; letter-spacing: .06em;
}
.yd-c.crit .yd-c-deg { color: var(--crit); }
.yd-c-gap { margin-inline-start: auto; white-space: nowrap; }
.yd-c.open .dmg-caret { transform: rotate(270deg); }
/* ΓΙΑΤΙ ΕΙΝΑΙ ΚΟΚΚΙΝΟ, ΜΕ ΛΕΞΕΙΣ (Vassilis 04/09: «μια κοκκινίλα παντού χωρίς να μπορώ να καταλάβω
   τίποτα»). ΜΙΑ ΓΡΑΜΜΗ, ΠΑΝΤΑ ΟΡΑΤΗ, ΧΩΡΙΣ ΧΡΩΜΑ: «Atlas: γυρίζει 13:00, φεύγει 16:00 — 3,0 ω για γύρο
   5,0 ω». Η σοβαρότητα τη λένε ήδη η κουκκίδα και η λέξη από πάνω· εδώ μιλά μόνο η αιτία, και μια
   δεύτερη κόκκινη επιφάνεια θα την έπνιγε. Στοιχισμένη με τον κωδικό (κουκκίδα 8 px + το gap της
   κεφαλίδας), ώστε να διαβάζεται ως συνέχεια της γραμμής και όχι ως νέο αντικείμενο. */
.yd-c-why {
  padding: 0 var(--sp-4) var(--sp-2);
  padding-inline-start: calc(var(--sp-4) + 8px + var(--sp-3));
  margin-block-start: calc(var(--sp-2) * -1);
  font-size: var(--fs-s); color: var(--muted);
}
/* Το σώμα κρατά ΟΛΟ το περιεχόμενο της παλιάς κάρτας — απλώς πιο σφιχτά, και μόνο όταν το ζητήσεις. */
.yd-c-body { padding: 0 var(--sp-4) var(--sp-4); padding-inline-start: calc(var(--sp-4) + 8px + var(--sp-3)); }

.yd-list { display: flex; flex-direction: column; gap: var(--sp-2); padding: 0; }
.yd-card { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-s); }
/* Οπτικός ρυθμός σε desktop: εναλλαγή φόντου, ώστε το μάτι να μη χάνει γραμμή σε λίστα 20 στοιχείων. */
.yd-card:nth-child(even) { background: var(--card2); }
.yd-card.open { border-color: var(--accent); }
.yd-card.task.done { opacity: .6; }
.yd-card.task.overdue .yd-time { color: var(--crit); }
/* 🚨 ΤΟ `color` ΔΕΝ ΕΙΝΑΙ ΠΡΟΑΙΡΕΤΙΚΟ ΟΤΑΝ ΣΒΗΝΕΙΣ ΤΟ ΦΟΝΤΟ ΕΝΟΣ ΚΟΥΜΠΙΟΥ (μάθημα 02/09, από PNG).
   Το γενικό `button` είναι γεμάτο με accent και βάφει το κείμενό του `--on-accent` = ΛΕΥΚΟ — και το
   `--on-accent` ορίζεται ΜΙΑ φορά, χωρίς παραλλαγή ανοιχτού θέματος: είναι λευκό ΚΑΙ στα δύο θέματα.
   Βάζοντας `background: none` χωρίς `color`, η κεφαλίδα κράτησε το λευκό: στο ανοιχτό θέμα η ΩΡΑ, ο
   ΚΩΔΙΚΟΣ ΟΧΗΜΑΤΟΣ και ο ΤΙΤΛΟΣ ΕΡΓΑΣΙΑΣ έγιναν λευκά πάνω σε λευκή/γκρι κάρτα — αόρατα. Στο σκούρο
   έδειχναν μια χαρά, γι' αυτό δεν φάνηκε στην ανάγνωση του κώδικα.
   ΓΙΑΤΙ ΤΟ ΞΕΦΥΓΕ ΚΑΙ ΑΠΟ ΤΟ TEST: το `--on-accent` ΕΙΝΑΙ token. Ο έλεγχος «κανένα χρώμα εκτός tokens»
   πιάνει το hex, όχι το ΛΑΘΟΣ token. Το πιάνει πλέον το `test_bare_buttons_restore_the_ink_they_dropped`.
   Ο κανόνας του σπιτιού, όπως τον τηρούν ήδη `.chip`, `.dmg-line`, `.icon-btn`, `button.ghost`:
   ΣΒΗΝΕΙΣ ΤΟ ΦΟΝΤΟ ⇒ ΞΑΝΑΔΗΛΩΝΕΙΣ ΤΟ ΜΕΛΑΝΙ. Το `--ink` είναι σωστό και στα δύο θέματα, γιατί ακριβώς
   αυτό είναι το ζευγάρι κάθε κανονικής κάρτας (`--card`/`--card2`). */
.yd-card-head {
  display: flex; align-items: center; gap: var(--sp-4); width: 100%;
  padding: var(--sp-4) var(--sp-4); background: none; border: 0; text-align: start; min-height: 56px;
  color: var(--ink);
}
.yd-card-head:hover { background: var(--hover); }
.yd-card.open .dmg-caret { transform: rotate(270deg); }
.yd-card-head .yd-time { font-size: var(--fs-l); }
.yd-line { gap: var(--sp-3); flex-wrap: nowrap; min-width: 0; }
.yd-line .yd-code, .yd-line .yd-task-title, .yd-who {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.yd-flag { flex: none; }
.yd-card-body { padding: 0 var(--sp-4) var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-4); }
.yd-card-body .yd-act { display: flex; gap: var(--sp-3); flex-wrap: wrap; }
.yd-card-body .yd-act .ho-big { flex: 1 1 10rem; }
.yd-del { align-self: flex-start; }
.yd-tools { justify-content: flex-start; }

/* ---------------------------------------------------------------- ΙΣΤΟΡΙΚΟ ΠΡΩΤΟΚΟΛΛΩΝ */
.hh { display: flex; flex-direction: column; gap: var(--sp-5); }
.hh-group .yd-card-head { min-height: 60px; }
.hh-ho { margin: 0; }
.hh-thumbs { display: grid; grid-template-columns: repeat(auto-fill, minmax(5.5rem, 1fr)); gap: var(--sp-3); }
.hh-thumb { padding: 0; border: 0; background: none; border-radius: var(--r-s); overflow: hidden;
            color: var(--ink); }
.hh-thumb img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; display: block; }

/* ---------------------------------------------------------------- ΚΙΝΗΤΟ: μία ενέργεια, πλήρες πλάτος */
@media (max-width: 719px) {
  .ho-big, .dmg-tools .ho-big, .dmg-order .ho-big, .ho-dmg-form .ho-big { width: 100%; }
  .ho-sign { width: 100%; min-height: 56px; font-size: var(--fs-l); }
  .ho-nav { gap: var(--sp-3); }
  .ho-nav button { flex: 1 1 0; min-height: 48px; }
  .yd-card-head { gap: var(--sp-3); padding-inline: var(--sp-3); }
  .yd-card-head .yd-time { width: 3.6rem; }
  .yd-card-body .yd-act .ho-big { flex: 1 1 100%; }
  .yd-who { display: none; }              /* σε 390 px το όνομα του πελάτη ζει στο ανοιχτό σώμα, όχι στον τίτλο */
  .ro-sheet { padding: var(--sp-5); }
  .ro-signs { grid-template-columns: 1fr; }
  .dmg-row.pick { grid-template-columns: auto minmax(0, 1fr); }
  .dmg-row.pick .dmg-thumb { display: none; }
}


/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   0077 (02/09) — ΤΟ TIMETABLE ΤΗΣ ΗΜΕΡΑΣ, Η ΚΟΙΝΗ ΚΑΜΕΡΑ, ΤΑ ΧΕΙΡΙΣΤΗΡΙΑ ΥΙΟΘΕΤΗΣΗΣ
   ══════════════════════════════════════════════════════════════════════════════════════════════════
   «Φτιάξε ένα όμορφο timetable της ημέρας, αυτό είναι πολύ χύμα» (Vassilis 02/09).

   Ο άξονας είναι ΑΠΟΛΥΤΗ ΤΟΠΟΘΕΤΗΣΗ πάνω σε τμηματικά γραμμική κλίμακα: τα px τα δίνει η JS
   (`dayBands`/`bandY`), το CSS δίνει ΜΟΝΟ όψη. Γι' αυτό δεν υπάρχει εδώ ούτε ένα ύψος ώρας — θα ήταν
   δεύτερη αλήθεια, και οι γραμμές των ωρών θα ξέφευγαν από τις κουκκίδες χωρίς κανένα σφάλμα πουθενά. */

/* ---- ΤΟ ΠΑΡΑΘΥΡΟ ΤΟΥ ΑΞΟΝΑ (03/09): ΣΤΑΘΕΡΟ ΥΨΟΣ, ΕΣΩΤΕΡΙΚΟ ΣΚΡΟΛ, ΚΕΦΑΛΙΔΕΣ ΚΑΡΦΩΜΕΝΕΣ.
   «Να σκρολάρει το timeline, όχι όλη η σελίδα» (Vassilis). Το ύψος το δίνει η JS σε vh (`TT_H`) γιατί
   το κριτήριο είναι Η ΟΘΟΝΗ, όχι το πλήθος των γεγονότων· εδώ ζει μόνο η συμπεριφορά του κουτιού.
   ΚΑΘΕΤΟ ΣΚΡΟΛ ΜΟΝΟ: με `overflow-x: hidden` η λωρίδα των ωρών δεν φεύγει ΠΟΤΕ αριστερά — μένει
   καρφωμένη δίπλα στα γεγονότα που ονομάζει, χωρίς κόλπο sticky πάνω σε απόλυτη τοποθέτηση. */
.tt-wrap { margin-block: var(--sp-6) var(--sp-5); }
.tt-scroll {
  position: relative;
  overflow-y: auto; overflow-x: hidden;
  border: 1px solid var(--line); border-radius: var(--r);
  background: var(--bg);
  /* Η γραμμή κύλισης δεν είναι έκπληξη: το κουτί ΔΗΛΩΝΕΙ ότι κρύβει κι άλλα. */
  scrollbar-gutter: stable;
}
/* Οι ΟΝΟΜΑΤΑ ΤΩΝ ΣΤΗΛΩΝ, καρφωμένα στην κορυφή του κουτιού. Χωρίς αυτά, τρία σκρολ παρακάτω καμία
   στήλη δεν έχει όνομα — και οι τρεις μοιάζουν με τυχαία πλάτη. */
.tt-head {
  position: sticky; inset-block-start: 0; z-index: 4;
  height: 2rem;
  /* ΔΙΑΚΡΙΤΙΚΕΣ (03/09): ίδιο φόντο με τον καμβά, όχι λωρίδα κάρτας από πάνω του. Οι κεφαλίδες είναι
     ΥΠΟΤΙΤΛΟΣ, όχι μπάρα εργαλείων — αλλά ΟΠΑΚΟ φόντο μένει υποχρεωτικό: sticky πάνω από ένα κουτί που
     σκρολάρει, με διάφανο φόντο, γράφει τις ώρες πάνω στις ετικέτες. */
  background: var(--bg); border-block-end: 1px solid var(--line);
  /* Η ΛΩΡΙΔΑ ΤΩΝ ΩΡΩΝ ΔΕΝ ΞΑΝΑΓΡΑΦΕΤΑΙ ΕΔΩ: οι ετικέτες ζουν μέσα σε `.tt-lanes`, στο ΙΔΙΟ κουτί με
     τα γεγονότα που ονομάζουν (και το κινητό το στενεύει σε ένα σημείο, πιο κάτω). Ένα δεύτερο
     `padding-inline-start` θα ήταν δεύτερη αλήθεια — και δεν θα έπιανε καν: τα ποσοστά ενός απόλυτα
     τοποθετημένου παιδιού μετριούνται στο PADDING BOX, δηλαδή ΑΓΝΟΟΥΝ το padding του γονέα. */
}
.tt-col-h {
  position: absolute; inset-block: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: var(--fs-xs); font-weight: var(--fw-semi); color: var(--muted);
  text-transform: uppercase; letter-spacing: .06em;
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}

.tt {
  position: relative;
  /* Ο ΑΕΡΑΣ ΕΙΝΑΙ ΕΔΩ, ΟΧΙ ΣΤΗΝ ΚΛΙΜΑΚΑ: η ετικέτα της πρώτης ώρας κρέμεται λίγο πάνω από το κουτί
     (`inset-block-start: -0.6em`) και χρειάζεται περιθώριο για να μην κοπεί. Μια «κενή ώρα» στην αρχή
     του άξονα θα ήταν ψέμα κλίμακας — ριγέ ζώνη που λέει «εδώ πέρασε χρόνος» ενώ δεν πέρασε τίποτα. */
  margin-block: var(--sp-6) var(--sp-5);
  padding-inline-start: 3.4rem;          /* η λωρίδα των ωρών */
}
.tt-bands { position: absolute; inset: 0; }
.tt-band {
  position: absolute; inset-inline: 0;
  border-block-start: 1px solid var(--line);
}
/* Η ΗΣΥΧΗ ΖΩΝΗ ΔΕΝ ΕΙΝΑΙ ΑΔΕΙΑ — ΕΙΝΑΙ ΣΥΜΠΙΕΣΜΕΝΗ, και το δηλώνει: ρίγες αντί για κενό, ώστε το μάτι
   να μη διαβάσει δύο μακρινά γεγονότα ως γειτονικά. Το χρώμα από token, η ρίγα από gradient του ίδιου. */
.tt-band.gap {
  background: repeating-linear-gradient(135deg, var(--neutral-soft) 0 6px, transparent 6px 12px);
}
/* Η ΩΡΑ ΑΡΙΣΤΕΡΑ, ΜΙΚΡΗ ΚΑΙ ΑΧΝΗ (03/09): ο καμβάς είναι για τα γεγονότα — ο άξονας απλώς τα κρατά.
   Στοιχειώδη μεγέθη, tabular αριθμοί (η κλάση `num` του JS), χωρίς βάρος. */
.tt-band-h {
  position: absolute; inset-inline-start: 0; inset-block-start: -0.6em;
  width: 3rem; text-align: end;
  font-size: 11px; color: var(--muted); letter-spacing: .02em;
}
.tt-band.gap .tt-band-h {
  inset-block-start: 50%; transform: translateY(-50%);
  width: auto; inset-inline-end: var(--sp-4); text-align: start;
  inset-inline-start: 3.6rem;
}

.tt-lanes { position: absolute; inset-block: 0; inset-inline-start: 3.4rem; inset-inline-end: 0; }
/* Η ΛΕΠΤΗ ΓΡΑΜΜΗ ΣΕ ΚΑΘΕ ΟΡΙΟ ΣΤΗΛΗΣ (03/09): Check-in │ Check-out │ Εργασίες. Χωρίς αυτήν, τρεις
   στήλες με ίδιο φόντο διαβάζονται ως ένα πλάτος — και η στοίχιση που μόλις κερδίσαμε δεν φαίνεται. */
.tt-split { position: absolute; inset-block: 0; width: 0; border-inline-start: 1px dashed var(--line); }

/* ΟΛΑ ΤΑ ΣΤΟΙΧΕΙΑ ΤΟΥ ΑΞΟΝΑ ΤΟΠΟΘΕΤΟΥΝΤΑΙ ΑΠΟΛΥΤΑ και παίρνουν `top/height/inset-inline-start/width` από
   τη JS. Εδώ ζει ΜΟΝΟ η όψη. Γυμνό φόντο σε κουμπί ⇒ ξαναδηλώνεται το μελάνι (ο κανόνας του σπιτιού). */

/* ---- Η ΜΠΑΡΑ: ΤΟ ΣΧΗΜΑ ΕΙΝΑΙ ΠΑΝΤΑ ΤΟ ΙΔΙΟ, ΤΟ ΜΕΛΑΝΙ ΟΧΙ.
   Η μπάρα καλύπτει τις ώρες που είναι πιασμένο το όχημα (πλάτος λωρίδας, όχι γραμμή 3 px — αυτό ήταν
   το λάθος της 01/09). ΤΟ ΓΕΜΙΣΜΑ ΟΜΩΣ ΔΕΝ ΕΙΝΑΙ ΔΩΡΕΑΝ: με τρία-τέσσερα ζεύγη τη μέρα, γεμάτα
   πεντάωρα ορθογώνια έκαναν το ημερολόγιο σεντόνι χρώματος και έπνιγαν το ΕΝΑ πράγμα που έπρεπε να
   φωνάζει (Vassilis 03/09). Γι' αυτό η βάση είναι ΑΧΡΩΜΗ και το χρώμα το ζητά η ΚΑΤΑΣΤΑΣΗ. */
.tt-bar {
  position: absolute;
  padding: 0; margin: 0; text-align: start;
  color: var(--ink);
  background: none;
  border: 1px solid transparent;
  border-radius: var(--r-s);
  transition: box-shadow var(--t) var(--ease);
}
/* ΤΟ HOVER ΔΕΝ ΠΕΙΡΑΖΕΙ ΠΛΕΟΝ ΤΗ ΔΙΑΦΑΝΕΙΑ (03/09): με απαλά tints, το `opacity` έσβηνε ακριβώς την
   απόχρωση που κουβαλά τη σοβαρότητα. Ένα δαχτυλίδι ΜΕΣΑ στο ίδιο σχήμα λέει «αυτό πατιέται» χωρίς να
   αγγίξει ούτε ένα χρώμα — και δουλεύει το ίδιο πάνω σε ουδέτερη, warn ή crit ζώνη. */
.tt-bar:hover { box-shadow: inset 0 0 0 1px var(--line); }
.tt-bar.sel { outline: 2px solid var(--accent); outline-offset: 1px; }

/* ---- ΟΙ ΤΡΕΙΣ ΚΑΤΑΣΤΑΣΕΙΣ ΤΟΥ ΓΥΡΟΥ — «Η ΣΟΒΑΡΟΤΗΤΑ ΜΕ ΧΡΩΜΑ, ΠΟΤΕ ΜΕ ΟΓΚΟ» (Vassilis 03/09).
   Ο γύρος είναι ΓΕΦΥΡΑ πάνω στις δύο στήλες κίνησης, κάτω από τα chips τους· η σειρά στο DOM (μπάρες →
   οδηγοί → chips) ΕΙΝΑΙ η στοίβαξη, δεν χρειάζεται `z-index`.

   ΤΙ ΑΛΛΑΞΕ ΑΠΟ ΤΟ ΠΡΩΙ ΤΗΣ 03/09, ΚΑΙ ΓΙΑΤΙ: οι τρεις καταστάσεις ήταν διακεκομμένη κλωστή → warn
   περίγραμμα → γεμάτο warn ορθογώνιο. Δηλαδή η σοβαρότητα άλλαζε ΚΑΙ χρώμα ΚΑΙ ΟΓΚΟ: το «δεν χωράει»
   έμπαινε στην οθόνη ως μάζα, και η μέρα με τα περισσότερα προβλήματα γινόταν τοίχος. Τώρα και οι
   τρεις έχουν ΤΟ ΙΔΙΟ σχήμα — απαλή ζώνη πλάτους λωρίδας, όπως τα events του iOS Calendar — και
   αλλάζει ΜΟΝΟ η απόχρωση: ουδέτερη → warn → crit. Το χρώμα διαβάζεται με ένα βλέμμα· ο όγκος μετριέται. */

/* (α) ΧΩΡΑΕΙ ΑΝΕΤΑ: πολύ απαλή ΟΥΔΕΤΕΡΗ ΖΩΝΗ. Λέει «εδώ είναι πιασμένο το όχημα» και τίποτα άλλο —
   φόντο, όχι πρωταγωνιστής. (Η παλιά διακεκομμένη «κλωστή» ήταν ΚΑΙ αδύναμη ΚΑΙ θορυβώδης: 2 px
   διακοπτόμενου μελανιού σε ύψος 400 px διαβάζονταν ως χάραξη σχεδίου, όχι ως ήσυχο διάστημα.) */
.tt-bar.roomy { background: var(--neutral-soft); }

/* (β) ΧΩΡΑΕΙ ΟΡΙΑΚΟΣ (λιγότερο από μία ώρα αέρα — `TIGHT_SLACK_H`, το ίδιο μέγεθος με το
   `ops_yard.TIGHT_GRACE_H`): ΙΔΙΟ ΣΧΗΜΑ, απαλή warn ζώνη. Δεν είναι πρόβλημα — είναι «μη χάσεις την
   ώρα σου», και ΔΕΝ παίρνει ρίγα: η ρίγα φυλάγεται για το πραγματικό «δεν βγαίνει». */
.tt-bar.snug { background: var(--warn-soft); }

/* (γ) ΔΕΝ ΧΩΡΑΕΙ: απαλή crit ζώνη ΚΑΙ ΛΕΠΤΗ crit ρίγα στην αρχή — η ρίγα είναι η μόνη κλιμάκωση, και
   είναι 3 px. Γεμάτο κόκκινο ορθογώνιο πλάτους λωρίδας θα ήταν πάλι «σοβαρότητα με όγκο». */
.tt-bar.short { background: var(--crit-soft); border-inline-start: 3px solid var(--crit); }

/* ΤΟ ΕΛΛΕΙΜΜΑ: ξεκάθαρο ΤΜΗΜΑ της ίδιας μπάρας, σε crit. Δεν είναι διακόσμηση — είναι κυριολεκτικά
   «να πού δεν χωράει», στη σωστή θέση και στο σωστό μήκος. Κάθεται ΠΑΝΩ στη μπάρα `short`, άρα το
   crit tint διπλασιάζεται εκεί και μόνο εκεί: πυκνότερο χρώμα, ΙΔΙΟ πλάτος. Η διακεκομμένη κορυφή
   δείχνει το ακριβές σημείο όπου τελείωσε ο χρόνος. */
.tt-bar-short {
  position: absolute;
  background: var(--crit-soft);
  border-inline-start: 3px solid var(--crit);
  border-block-start: 1px dashed var(--crit);
  border-radius: var(--r-s);
  pointer-events: none;
}
/* Η ΑΝΑΜΟΝΗ μετά τον γύρο: ενώνει τα δύο άκρα του ίδιου οχήματος χωρίς να διεκδικεί βάρος. ΜΕΝΕΙ
   ΚΛΩΣΤΗ — και σωστά: δεν είναι δουλειά που «κάθεται» στη μέρα, είναι το νήμα «ίδιο όχημα». */
.tt-bar-idle {
  position: absolute;
  border-inline-start: 2px dashed var(--line);
  margin-inline-start: 6px;
  pointer-events: none;
}
/* Η γραμμή-οδηγός ενός chip που σπρώχτηκε: από την ΑΛΗΘΙΝΗ ώρα ως το κουτάκι του. */
.tt-lead {
  position: absolute;
  border-inline-start: 1px dotted var(--muted);
  margin-inline-start: 6px;
  pointer-events: none;
}
/* Μοναχικό γεγονός: αόρατη περιοχή αφής κάτω από το chip του. */
.tt-hit { position: absolute; padding: 0; background: none; border: 0; color: var(--ink); }
.tt-hit.sel { outline: 2px solid var(--accent); outline-offset: 1px; border-radius: var(--r-s); }

/* ---- ΤΟ CHIP = EVENT ΤΟΥ iOS CALENDAR (Vassilis 03/09: «στο ίδιο πνεύμα με macOS/iPhone Calendar»).
   ΤΡΙΑ ΠΡΑΓΜΑΤΑ, ΚΑΙ ΤΑ ΤΡΙΑ ΣΤΗΝ ΙΔΙΑ ΑΠΟΧΡΩΣΗ: απαλό tinted φόντο, λεπτή ΕΝΤΟΝΗ ρίγα 3 px στην
   inline-start πλευρά, κείμενο στην έντονη εκδοχή. Η απόχρωση λέει ΤΙ ΕΙΝΑΙ το γεγονός — και μόνο αυτό.
   Το tint ΔΕΝ διαλέγεται ανά θέμα εδώ: τα `*-soft` tokens είναι ήδη ημιδιαφανή πάνω στον καμβά, δηλαδή
   στο σκούρο σκουραίνουν μόνα τους και στο ανοιχτό ανοίγουν — ένα σημείο αλήθειας, το `tokens.css`.
   Η ΛΕΠΤΗ ΟΥΔΕΤΕΡΗ ΓΡΑΜΜΗ ΓΥΡΩ ΜΕΝΕΙ (και η σκιά έφυγε): το chip κάθεται ΠΑΝΩ σε ζώνη γύρου που μπορεί
   να έχει την ΙΔΙΑ απόχρωση (κόκκινο chip πάνω σε κόκκινη ζώνη) — χωρίς περίγραμμα θα εξαφανιζόταν
   μέσα της. Η σκιά, αντίθετα, ήταν ανάγλυφο που κανένα ημερολόγιο δεν έχει. */
.tt-chip {
  position: absolute;
  display: flex; align-items: center; gap: var(--sp-2);
  padding: 0 var(--sp-3);
  background: var(--card);
  border: 1px solid var(--line);
  border-inline-start: 3px solid var(--tt-tone, var(--accent));
  border-radius: var(--r-s);
  color: var(--tt-tone, var(--ink));
  text-align: start;
  overflow: hidden;
}
.tt-chip:hover { box-shadow: inset 0 0 0 1px var(--tt-tone, var(--accent)); }
.tt-chip.sel { outline: 2px solid var(--accent); outline-offset: 1px; }
.tt-time { font-size: var(--fs-xs); font-weight: var(--fw-semi); color: var(--tt-tone, var(--accent)); flex: none; }
/* ΟΧΗΜΑ + ΟΝΟΜΑ ΣΕ ΕΝΑ ΚΟΥΤΙ (04/09): στα 390 px το chip στοιβάζεται σε ΔΥΟ σειρές μέσα σε 32 px —
   τρίτη δεν υπάρχει. Έτσι το όνομα δεν γίνεται ποτέ δική του σειρά· μοιράζεται τη δεύτερη με τον κωδικό
   και κόβεται πριν από αυτόν. Η ΩΡΑ μένει `flex: none` και δεν κόβεται ΠΟΤΕ. */
.tt-label { display: flex; align-items: baseline; gap: var(--sp-2); min-width: 0; max-width: 100%; }
/* `min-width: 0` = ΤΟ ΚΛΕΙΔΙ ΤΟΥ ELLIPSIS ΣΕ FLEX: χωρίς αυτό το στοιχείο δεν συρρικνώνεται κάτω από το
   περιεχόμενό του και το «Da Vinci 4» ξεχειλίζει αντί να κοπεί — ΠΟΤΕ δεύτερη γραμμή που φουσκώνει το
   μπλοκ (ο κανόνας του κινητού, 03/09). */
.tt-code { font-size: var(--fs-xs); font-weight: var(--fw-semi); min-width: 0;
           overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ΤΟ ΟΝΟΜΑ ΤΟΥ ΠΕΛΑΤΗ: ταυτότητα, όχι δουλειά — άρα ΔΕΥΤΕΡΗ φωνή (muted, κανονικό βάρος) και ο πρώτος
   που υποχωρεί όταν στενεύει η λωρίδα (`flex-shrink: 3`). Ό,τι κοπεί ζει ολόκληρο στο `title` και στο
   πανελ κάτω από τον άξονα. ΤΗΛΕΦΩΝΟ ΔΕΝ ΥΠΑΡΧΕΙ ΕΔΩ — ούτε το στέλνει ο server (§B9). */
.tt-who { font-size: var(--fs-xs); color: var(--muted); flex: 1 3 auto; min-width: 0;
          overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Η ΑΝΑΜΕΝΟΜΕΝΗ ΩΡΑ ΕΠΙΣΤΡΟΦΗΣ («≈17:40») δεξιά, ΜΕΣΑ στο ίδιο chip: καμία επιπλέον μπάρα για ένα
   χονδρικό νούμερο. Στα 390 px κρύβεται (βλ. media query) — εκεί μιλά το crit tint. */
.tt-eta { font-size: var(--fs-xs); font-weight: var(--fw-semi); color: var(--crit);
          flex: none; margin-inline-start: auto; }

/* Το χρώμα λέει ΤΙ ΕΙΝΑΙ — ένα σημείο αλλαγής ανά είδος, πάντα από tokens.
   🚨 Η ΑΝΤΙΣΤΟΙΧΙΑ ΕΙΝΑΙ Η ΙΔΙΑ ΜΕ ΤΑ PILLS ΤΟΥ ΠΑΝΕΛ (`.pill.yd-in` / `.pill.yd-out`, πιο πάνω):
   ΕΠΙΣΤΡΟΦΗ (check-out, γυρίζει στην αυλή) = πράσινο, ΠΑΡΑΛΑΒΗ (check-in, φεύγει) = μπλε. Δύο
   αντιστοιχίες για την ίδια πράξη σε δύο σημεία της ΙΔΙΑΣ οθόνης θα ήταν το «παράδοση» ξανά. */
.tt-chip.checkout { --tt-tone: var(--ok); background: var(--ok-soft); }
.tt-chip.checkin { --tt-tone: var(--accent); background: var(--accent-soft); }
.tt-chip.late { --tt-tone: var(--crit); background: var(--crit-soft); }
.tt-chip.task { --tt-tone: var(--muted); background: var(--neutral-soft); }

/* ---- ΟΙ ΕΡΓΑΣΙΕΣ: ίδιο μπλοκ, ουδέτερο tint, ρίγα ανά είδος (η επισκευή δεν ζωγραφίζεται πια στον
   άξονα — ο κανόνας μένει για ό,τι κατεβάσει αύριο ο server). Η εκπρόθεσμη περνά σε crit: καθυστέρηση
   = crit, ίδια λέξη με τα chips και τις μπάρες. */
.tt-bar.task { background: var(--neutral-soft); border-color: var(--line);
               border-inline-start: 3px solid var(--muted); }
.tt-bar.task.cleaning { border-inline-start-color: var(--accent); }
.tt-bar.task.preparation { border-inline-start-color: var(--warn); }
.tt-bar.task.repair { border-inline-start-color: var(--warn); }
.tt-bar.task.done { opacity: .45; }
.tt-bar.task.overdue { background: var(--crit-soft); border-inline-start-color: var(--crit); }

/* ---- «ΤΩΡΑ»: ΓΡΑΜΜΗ 1 px ΜΕ ΓΕΜΑΤΗ ΚΟΥΚΚΙΔΑ ΣΤΗΝ ΑΡΧΗ — το σήμα του Apple Calendar (03/09).
   Ήταν 2 px χωρίς κουκκίδα: πάχος που τη διάβαζες ως ΟΡΙΟ ΖΩΝΗΣ ανάμεσα σε δύο ώρες. Η κουκκίδα είναι
   που λέει «αυτή η γραμμή δείχνει ΣΤΙΓΜΗ, όχι όριο» — γι' αυτό λεπταίνει η γραμμή και μπαίνει το
   σημείο. ΜΟΝΟ ΣΤΗ ΣΗΜΕΡΙΝΗ ΜΕΡΑ (ο φρουρός είναι στη JS)· η ώρα έρχεται από τον server (`data.at`)
   και ανανεώνεται με τη ζωγραφιά της μέρας — κανένα δικό μας χρονόμετρο.
   Η ΚΟΥΚΚΙΔΑ ΚΑΘΕΤΑΙ ΟΠΟΥ ΑΡΧΙΖΟΥΝ ΤΑ ΓΕΓΟΝΟΤΑ (μετά τη λωρίδα των ωρών): στο μηδέν θα έπεφτε πάνω
   στην ώρα δίπλα της. Το `z-index` την ανεβάζει πάνω από μπάρες και chips — γραμμή «τώρα» κάτω από ένα
   event δεν λέει τίποτα. */
.tt-now {
  position: absolute; inset-inline: 0; height: 0; z-index: 3;
  border-block-start: 1px solid var(--crit);
  pointer-events: none;
}
.tt-now::before {
  content: ''; position: absolute;
  inset-inline-start: 3.4rem; inset-block-start: -5px; margin-inline-start: -5px;
  width: 10px; height: 10px; border-radius: 50%;
  background: var(--crit);
}
.tt-now-label {
  position: absolute; inset-inline-start: 0; inset-block-start: -0.65em;
  width: 3rem; text-align: end;
  font-size: 11px; font-weight: var(--fw-semi); color: var(--crit);
}

/* ---- Το πανελ της πράξης, κάτω από τον άξονα. */
.yd-detail { display: flex; flex-direction: column; gap: var(--sp-4); }
.yd-detail .yd-act { display: flex; gap: var(--sp-3); flex-wrap: wrap; }
.yd-detail .yd-act .ho-big { flex: 1 1 10rem; }
.yd-detail-sep { border-block-start: 1px solid var(--line); }
/* ---- ΟΙ ΔΥΟ ΛΙΣΤΕΣ ΚΑΤΩ ΑΠΟ ΤΗ ΜΕΡΑ: «ΚΑΘΥΣΤΕΡΗΜΕΝΑ» και «ΧΩΡΙΣ ΩΡΑ» (04/09).
   ΙΔΙΑ ΓΡΑΜΜΗ ΚΑΙ ΓΙΑ ΤΙΣ ΔΥΟ (`yd-loose-row`): δύο σχεδόν ίδιες όψεις θα απέκλιναν, και ο χρήστης θα
   έβλεπε δύο λίστες που μοιάζουν αλλά δεν συμπεριφέρονται ίδια. Η ΚΑΘΥΣΤΕΡΗΜΕΝΗ ΔΕΝ ΠΑΙΡΝΕΙ ΚΟΚΚΙΝΟ
   ΦΟΝΤΟ: τη λέει το pill «εκπρόθεσμη» και η ώρα δίπλα — χρώμα ΚΑΙ λέξη, ποτέ όγκος (κανόνας 03/09). */
.yd-late, .yd-loose { display: flex; flex-direction: column; }
/* Η ΠΡΟΘΕΣΜΙΑ ΠΟΥ ΠΕΡΑΣΕ, ΣΤΟ ΤΕΛΟΣ ΤΗΣ ΓΡΑΜΜΗΣ: «άργησε λίγο» και «κάθεται μια βδομάδα» είναι δύο
   διαφορετικές δουλειές, και η διαφορά φαίνεται μόνο με ημερομηνία. Στα στενά κόβεται πριν από τον τίτλο. */
.yd-late-due { flex: none; margin-inline-start: auto; white-space: nowrap; }
/* Ο ΤΙΤΛΟΣ ΕΙΝΑΙ ΑΥΤΟΣ ΠΟΥ ΥΠΟΧΩΡΕΙ: το pill, ο κωδικός και η ώρα είναι σταθερού πλάτους και δεν
   επιτρέπεται να σπάσουν σε δεύτερη σειρά — «Καθαρισμός μετά…» διαβάζεται, μια γραμμή σε τρεις σειρές όχι. */
.yd-loose-row .yd-task-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.yd-loose-row .pill, .yd-loose-row .yd-code { flex: none; }
.yd-loose-row {
  display: flex; align-items: center; gap: var(--sp-3); width: 100%;
  padding: var(--sp-3); background: none; border: 0; color: var(--ink); text-align: start;
  min-height: 44px;
}
.yd-loose-row:hover { background: var(--hover); }

/* ---- Η ΓΡΑΜΜΗ ΤΩΝ ΕΠΙΣΚΕΥΩΝ (03/09): οι επισκευές έφυγαν από το ημερολόγιο και ζουν στις Ζημιές.
   ΓΡΑΜΜΗ ΚΑΙ ΟΧΙ ΚΑΡΤΑ: δεν είναι είδηση της μέρας — είναι υπενθύμιση ότι υπάρχει και άλλη οθόνη. */
.yd-repairs {
  display: flex; align-items: center; gap: var(--sp-3); width: 100%;
  min-height: 44px; padding: var(--sp-2) var(--sp-4);
  background: none; border: 0; border-block-start: 1px solid var(--line);
  color: var(--muted); text-align: start; font-size: var(--fs-s);
}
.yd-repairs:hover { background: var(--hover); color: var(--ink); }
.yd-repairs-go { margin-inline-start: auto; display: inline-flex; align-items: center; gap: var(--sp-2);
                 color: var(--accent); font-weight: var(--fw-semi); }

/* ---- 🔔 Η ΚΟΥΚΚΙΔΑ ΤΩΝ ΑΝΑΠΑΝΤΗΤΩΝ ΣΤΟ ΜΕΝΟΥ (03/09) — «communication first» ως το μενού.
   Ίδιο μελάνι με το `crit` γιατί λέει ακριβώς το ίδιο πράγμα με μια κρίσιμη ειδοποίηση: κάποιος
   περιμένει και δεν του απάντησε κανείς. Στο desktop κάθεται δίπλα στην ετικέτα, στο κινητό πάνω στο
   εικονίδιο (`.tab-ico`) — εκεί δεν υπάρχει πλάτος για δεύτερη λέξη. */
.tab-badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 1.15rem; height: 1.15rem; padding-inline: .3rem;
  margin-inline-start: var(--sp-2);
  border-radius: 999px;
  background: var(--crit); color: var(--card);
  font-size: 11px; font-weight: var(--fw-bold); line-height: 1;
}
.tab-ico { position: relative; display: inline-flex; }
.tab-ico .tab-badge {
  position: absolute; inset-block-start: -4px; inset-inline-start: 60%;
  margin-inline-start: 0;
  /* Δαχτυλίδι στο χρώμα της μπάρας: η κουκκίδα ξεχωρίζει ακόμα κι όταν πέφτει πάνω στο εικονίδιο. */
  box-shadow: 0 0 0 2px var(--card);
}

/* ---- ΤΑ ΕΙΣΕΡΧΟΜΕΝΑ (03/09): ο διακόπτης των δύο ενοτήτων και η γραμμή μιας συνομιλίας. */
.inc-page { display: flex; flex-direction: column; gap: var(--sp-4); }
.inc-sections { margin-block-end: 0; }
/* Το chip των εισερχομένων όταν κάποιος περιμένει απάντηση. Λεγόταν `warn` και βαφόταν ΚΟΚΚΙΝΟ —
   το όνομα και το χρώμα διαφωνούσαν, και ο επόμενος που θα διάβαζε τη γραμμή θα «διόρθωνε» το λάθος.
   Κόκκινο είναι το σωστό (ίδιο `--crit` με την κουκκίδα του μενού και το πλακίδιο αναπάντητων)· άρα
   αλλάζει το ΟΝΟΜΑ, όχι η απόχρωση. */
.inc-sections .chip.crit { border-color: var(--crit-line); color: var(--crit); }
/* (Οι κλάσεις `.ibx*` της παλιάς λίστας συνομιλιών ΕΦΥΓΑΝ την 03/09 μαζί με τη λίστα: οι κουβέντες
   ζουν πλέον στην οθόνη «Μηνύματα» με δικές τους κλάσεις `.msg-*`, στο τέλος αυτού του αρχείου.) */

/* ---- Τα χειριστήρια υιοθέτησης σε ΜΙΑ γραμμή (Vassilis 02/09: «το κουμπί τυλίγει κάτω από τα dropdowns»).
   ΑΙΤΙΑ: το γενικό `select` είναι `width: 100%` — μέσα σε flex γραμμή κάθε select ζητά όλο το πλάτος.
   Εδώ τα τρία μπαίνουν σε δικό τους κουτί με ΔΙΚΟ ΤΟΥΣ πλάτος, και τυλίγουν ως ομάδα μόνο στο κινητό. */
.vq-adopt { display: flex; align-items: center; gap: var(--sp-3); flex: 0 0 auto; }
.vq-adopt select { width: auto; min-width: 8.5rem; max-width: 12rem; }
.vq-adopt button { white-space: nowrap; }

/* ---- Η φωτογραφία της ζημιάς εκτός πρωτοκόλλου (0077). */
.dmg-shot-row { gap: var(--sp-3); }
.dmg-shot-thumb {
  padding: 0; border: 1px solid var(--line); background: none; color: var(--ink);
  border-radius: var(--r-s); overflow: hidden; flex: none; width: 64px; height: 48px;
}
.dmg-shot-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.dmg-thumb.tap { cursor: zoom-in; }

/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   ΤΟ ΠΑΡΑΘΥΡΟ ΤΩΝ ΤΡΙΩΝ ΗΜΕΡΩΝ (05/09) — «να έχουμε και 3d view (default) και 1 day όπως τώρα»
   ══════════════════════════════════════════════════════════════════════════════════════════════════
   ΓΡΑΦΕΙΟ: πλέγμα ισομερών στηλών, η σημερινή πρώτη. ΚΙΝΗΤΟ: Η ΙΔΙΑ ΛΩΡΙΔΑ ΟΛΙΣΘΑΙΝΕΙ ΟΡΙΖΟΝΤΙΑ, μία
   μέρα ανά οθόνη, με καρτέλες από πάνω. Ένα DOM, δύο συμπεριφορές — καμία δεύτερη ζωγραφιά στη JS.

   🚨 Η ΟΛΙΣΘΗΣΗ ΖΕΙ ΜΕΣΑ ΣΤΟ ΔΙΚΟ ΤΗΣ ΔΟΧΕΙΟ. Η σελίδα ΔΕΝ κυλά ποτέ οριζόντια (`scrollWidth >
   clientWidth`): μόλις διορθώθηκε παντού (05/09, το `#top`) και δεν την ξαναφέρνουμε από την πίσω
   πόρτα. Γι' αυτό ΚΑΝΕΝΑ αρνητικό περιθώριο εδώ μέσα — μια λωρίδα που «ξεχειλίζει όμορφα» πέρα από τα
   περιθώρια της σελίδας είναι ακριβώς ο τρόπος που επιστρέφει το σφάλμα.

   ΚΑΙ ΚΑΝΕΝΑ ΣΤΑΘΕΡΟ ΠΛΑΤΟΣ ΣΤΗΛΗΣ: `minmax(0, 1fr)` ώστε ο άξονας (που είναι απόλυτη τοποθέτηση σε
   ποσοστά) να μη σπρώχνει τη στήλη πλατύτερα από το μερίδιό της. Χωρίς το `0`, το `min-width: auto`
   του grid item θα άφηνε το περιεχόμενο να διογκώσει τη στήλη — και τότε ΝΑΙ, θα κυλούσε η σελίδα.
   `grid-auto-flow: column` και όχι `repeat(N, …)`: το πλήθος των ημερών το ξέρει η JS, όχι το CSS —
   και μια σταθερή τριάδα εδώ θα έσπαγε σιωπηλά την ημέρα που το `SPANS` αποκτήσει τέταρτη επιλογή. */
.yd-w { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: var(--sp-4); }
.yd-w-col { display: flex; flex-direction: column; gap: var(--sp-4); min-width: 0; }
.yd-col-h {
  display: flex; align-items: baseline; gap: var(--sp-3); flex-wrap: wrap;
  padding-block-end: var(--sp-2); border-block-end: 1px solid var(--line);
}
.yd-col-d { font-weight: var(--fw-semi); text-transform: capitalize; min-width: 0;
            overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Η ΣΗΜΕΡΙΝΗ ΣΤΗΛΗ ΞΕΧΩΡΙΖΕΙ ΜΕ ΤΡΙΑ ΑΝΕΞΑΡΤΗΤΑ ΣΗΜΑΔΙΑ, γιατί κανένα δεν αρκεί μόνο του: είναι ΠΡΩΤΗ,
   γράφει τη ΛΕΞΗ «σήμερα» (`aria-current` για τη φωνή), και η υπογράμμιση της κεφαλίδας της παίρνει το
   χρώμα ταυτότητας. Χρώμα ΜΟΝΟ του θα ήταν αόρατο σε ασπρόμαυρη εκτύπωση και σε δαλτωνισμό. */
.yd-w-col.today .yd-col-h { border-block-end-color: var(--accent); }
.yd-col-now, .yd-col-x { flex: none; }
.yd-col-empty { padding: var(--sp-7) var(--sp-3); text-align: center; }

/* ---- ΟΙ ΚΑΡΤΕΛΕΣ ΗΜΕΡΑΣ: ΜΟΝΟ ΣΤΟ ΚΙΝΗΤΟ (στο γραφείο οι τρεις στήλες φαίνονται ήδη ολόκληρες, και
   μια δεύτερη σειρά κουμπιών θα ήταν θόρυβος που επαναλαμβάνει τις κεφαλίδες από κάτω). */
.yd-tabs { display: none; }

/* ---- Ο ΕΠΙΛΟΓΕΑΣ ΠΡΟΒΟΛΗΣ (3 ημέρες / 1 ημέρα), δίπλα στην πλοήγηση ημερομηνίας. */
.yd-span { display: flex; flex: none; gap: 0; border: 1px solid var(--line); border-radius: var(--r-s);
           overflow: hidden; }
.yd-span-b {
  min-height: 34px; padding: var(--sp-2) var(--sp-4); border: 0; border-radius: 0;
  background: none; color: var(--muted); font-size: var(--fs-s); font-weight: var(--fw-med);
  white-space: nowrap;
}
.yd-span-b + .yd-span-b { border-inline-start: 1px solid var(--line); }
.yd-span-b:hover { background: var(--hover); color: var(--ink); }
.yd-span-b.on { background: var(--accent-soft); color: var(--ink); font-weight: var(--fw-semi); }

/* ---- ΤΟ ΤΡΙΗΜΕΡΟ ΣΤΕΝΕΥΕΙ ΤΟΝ ΑΞΟΝΑ ΚΑΙ ΣΤΟ ΓΡΑΦΕΙΟ, ΚΑΙ ΕΙΝΑΙ ΑΡΙΘΜΗΤΙΚΗ, ΟΧΙ ΓΟΥΣΤΟ: σε 1440 px η
   στήλη βγαίνει ~340 px· βγάλε τη λωρίδα των ωρών (3,4rem) και μοίρασε στις τρεις υπο-στήλες του άξονα
   (παραλαβές │ επιστροφές │ εργασίες) — ~95 px η καθεμία. Εκεί το chip σε ΜΙΑ σειρά («13:00 · Atlas ·
   Familie Hoffmann») κόβεται στη δεύτερη λέξη. Τα ίδια μέτρα που παίρνει ήδη το κινητό: ώρα πάνω,
   όχημα και όνομα κάτω, λωρίδα ωρών στενή. ΤΟ ΚΡΙΤΗΡΙΟ ΕΙΝΑΙ Η ΣΤΗΛΗ, ΟΧΙ ΤΟ VIEWPORT — γι' αυτό ζει
   κάτω από το `.yd-w` και όχι σε media query: η μονοήμερη σε 1440 px δεν το θέλει, το τριήμερο σε
   1920 px το θέλει ακόμα. */
.yd-w .tt { padding-inline-start: 2.8rem; }
.yd-w .tt-lanes { inset-inline-start: 2.8rem; }
.yd-w .tt-band-h { width: 2.4rem; }
.yd-w .tt-band.gap .tt-band-h { inset-inline-start: 3rem; }
.yd-w .tt-now-label { width: 2.4rem; }
.yd-w .tt-now::before { inset-inline-start: 2.8rem; }
.yd-w .tt-chip {
  flex-direction: column; align-items: flex-start; justify-content: center;
  gap: 0; padding-inline: var(--sp-2); line-height: 1.15;
}
.yd-w .tt-time, .yd-w .tt-code, .yd-w .tt-who { font-size: 11px; max-width: 100%; }
.yd-w .tt-eta { display: none; }          /* τρίτη θέση σε chip 32 px δεν υπάρχει· το λέει το `title` */
.yd-w .tt-col-h { font-size: 11px; letter-spacing: .03em; }
/* Η ΛΕΞΗ ΤΗΣ ΣΟΒΑΡΟΤΗΤΑΣ ΦΕΥΓΕΙ ΑΠΟ ΤΗ ΓΡΑΜΜΗ ΣΥΓΚΡΟΥΣΗΣ ΜΕΣΑ ΣΕ ΣΤΗΛΗ: μιλούν η κουκκίδα, το
   `aria-label` και η γραμμή εξήγησης από κάτω — που εδώ είναι το ζητούμενο, όχι το πλεόνασμα. */
.yd-w .yd-c-deg { display: none; }
.yd-w .yd-c-head { gap: var(--sp-2); padding-inline: var(--sp-3); }

@media (max-width: 719px) {
  /* ΣΤΑ 390 px ΤΡΕΙΣ ΣΤΗΛΕΣ ΔΕΝ ΧΩΡΑΝΕ — ΜΕΤΡΗΜΕΝΟ: ο άξονας ΜΙΑΣ μέρας έχει ήδη τρεις υπο-στήλες και
     η καθεμία βγαίνει ~55 px, που είναι το κάτω όριο για να διαβαστεί «13:00 Atlas» σε δύο σειρές.
     Διαίρεση διά τρία ξανά = 18 px· δεν είναι πυκνό, είναι κενό.
     ΜΙΑ ΜΕΡΑ ΑΝΑ ΟΘΟΝΗ, ΜΕ ΣΥΡΣΙΜΟ ΚΑΙ ΚΟΥΜΠΩΜΑ. Η εναλλακτική (στοίβα τριών αξόνων) θα ήταν 3 × 60vh
     σκρολ πριν φτάσεις στις συγκρούσεις — δηλαδή ακριβώς το ατέλειωτο σκρολ που σκότωσε το σταθερό
     ύψος του άξονα την 03/09 — και θα ζητούσε από τον άνθρωπο να ΘΥΜΑΤΑΙ τι είδε τρεις οθόνες πάνω. */
  .yd-w {
    display: flex; gap: var(--sp-4);
    overflow-x: auto; overflow-y: hidden;
    scroll-snap-type: x mandatory; overscroll-behavior-x: contain;
  }
  .yd-w-col { flex: 0 0 100%; scroll-snap-align: start; }

  /* ΚΑΡΤΕΛΕΣ ΜΕ ΟΝΟΜΑ ΜΕΡΑΣ, ΟΧΙ ΚΟΥΚΚΙΔΕΣ: η κουκκίδα λέει «2 από 3»· ο υπεύθυνος της αυλής ρωτά «τι
     γίνεται την ΚΥΡΙΑΚΗ». Και κουβαλούν το σήμα της σύγκρουσης, ώστε το πρόβλημα να φαίνεται ΧΩΡΙΣ να
     συρθεί τίποτα — αυτό είναι όλο το κέρδος του τριημέρου σε κινητό. */
  .yd-tabs { display: flex; gap: var(--sp-2); }
  .yd-tab {
    flex: 1 1 0; min-width: 0; min-height: 44px;
    display: flex; align-items: center; justify-content: center; gap: var(--sp-2);
    padding: var(--sp-2) var(--sp-3);
    background: none; color: var(--muted);
    border: 1px solid var(--line); border-radius: var(--r-s);
    font-size: var(--fs-s); font-weight: var(--fw-med);
  }
  .yd-tab.on { background: var(--accent-soft); border-color: var(--accent); color: var(--ink);
               font-weight: var(--fw-semi); }
  .yd-tab-d { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
              text-transform: capitalize; }
  .yd-tab-x { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--crit); }
  /* Ο ΕΠΙΛΟΓΕΑΣ ΠΡΟΒΟΛΗΣ ΠΑΙΡΝΕΙ ΟΛΗ ΤΗ ΣΕΙΡΑ ΤΟΥ: σε 390 px η κεφαλίδα έχει ήδη δύο βελάκια και μια
     ημερομηνία — τα δύο κουμπιά θα στρίμωχναν σε 40 px το καθένα, δηλαδή κάτω από τον στόχο αφής. */
  .yd-span { flex: 1 0 100%; }
  .yd-span-b { flex: 1 1 0; min-height: 44px; }
}

@media (max-width: 719px) {
  /* ΙΔΙΑ ΛΟΓΙΚΗ, ΛΙΤΟΤΕΡΗ ΟΨΗ: η λωρίδα ωρών στενεύει, η ετικέτα κρατά ΩΡΑ + ΟΧΗΜΑ (αυτά διαβάζει ο
     υπάλληλος), και ο στόχος αφής μένει ολόκληρο το αντικείμενο — ποτέ η κουκκίδα των 10 px. */
  .tt { padding-inline-start: 2.8rem; }
  .tt-lanes { inset-inline-start: 2.8rem; }       /* ΚΑΙ οι κεφαλίδες μαζί: ζουν στο ίδιο κουτί */
  .tt-band-h { width: 2.4rem; }
  .tt-band.gap .tt-band-h { inset-inline-start: 3rem; }
  .tt-now-label { width: 2.4rem; }
  .tt-now::before { inset-inline-start: 2.8rem; }   /* η κουκκίδα ακολουθεί τη στενή λωρίδα των ωρών */
  /* ΤΟ CHIP ΣΤΟΙΒΑΖΕΤΑΙ: ΩΡΑ πάνω, ΟΧΗΜΑ κάτω. Με τέσσερις ταυτόχρονες κινήσεις (συμβαίνει: 13:45 στη
     Luna) κάθε λωρίδα είναι ~55 px — σε ΜΙΑ σειρά δεν χωράει ούτε «13:00 Atlas», σε ΔΥΟ χωράνε και τα δύο.
     ΔΕΝ ΦΟΥΣΚΩΝΕΙ ΤΟ ΜΠΛΟΚ: το chip έχει ΣΤΑΘΕΡΟ ύψος (`CHIP_PX`, από τη JS) και οι δύο σειρές των
     11 px με line-height 1,15 χωρούν μέσα του — η στοίβαξη είναι ΜΕΣΑ στο κουτί, όχι επέκτασή του.
     Το ίδιο κάνει κάθε ημερολόγιο κινητού, και για τον ίδιο ακριβώς λόγο. */
  .tt-chip {
    flex-direction: column; align-items: flex-start; justify-content: center;
    gap: 0; padding-inline: var(--sp-2); line-height: 1.15;
  }
  .tt-time, .tt-code { font-size: 11px; max-width: 100%; }
  .tt-who { font-size: 11px; }
  /* Το «≈17:40» δεν έχει τρίτη θέση σε chip 32 px: το κόκκινο tint λέει «αργεί», το `title` και η
     γραμμή της σύγκρουσης λένε πόσο. Καλύτερα λιγότερο, παρά τρεις σειρές μέσα σε δύο. */
  .tt-eta { display: none; }
  /* Οι στήλες στενεύουν, τα μπλοκ πυκνώνουν: ένα chip που ακουμπά το επόμενο διαβάζεται χειρότερα από
     ένα chip που κόβεται με ellipsis. */
  .tt-col-h { font-size: 11px; letter-spacing: .03em; }
  /* Η ΣΥΓΚΡΟΥΣΗ ΣΕ ΜΙΑ ΓΡΑΜΜΗ ΚΑΙ ΣΤΑ 390 px: η λέξη της σοβαρότητας φεύγει (η κουκκίδα και το
     `aria-label` τη λένε), ώστε ΚΩΔΙΚΟΣ + «λείπουν 1,4 ω» να μη σπάσουν σε δεύτερη σειρά. */
  .yd-c-deg { display: none; }
  .yd-c-head { gap: var(--sp-2); padding-inline: var(--sp-3); }
  .yd-detail .yd-act .ho-big { flex: 1 1 100%; }
  .vq-adopt { flex-wrap: wrap; }
  .vq-adopt select { min-width: 0; flex: 1 1 8rem; max-width: none; }
  .vq-adopt button { flex: 1 1 100%; }
}

/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   Η ΖΩΝΗ ΤΗΣ ΚΑΤΩ ΜΠΑΡΑΣ ΔΕΝ ΕΙΝΑΙ ΟΘΟΝΗ (05/09) — ΚΑΘΕ ΚΥΛΙΣΗ ΤΗΝ ΑΦΑΙΡΕΙ
   ══════════════════════════════════════════════════════════════════════════════════════════════════
   🚨 ΤΙ ΕΓΙΝΕ, ΣΕ ΑΛΗΘΙΝΟ CHROME ΣΤΑ 390 px: στο τριήμερο, μετά από tap σε καρτέλα ημέρας, το πρώτο
   chip εργασίας («07:00 Προετοιμασία») προσγειωνόταν ΑΚΡΙΒΩΣ πίσω από το `#bottom`. Το
   `elementFromPoint` στο σημείο του chip γύριζε `.more-btn`: το tap το κατάπινε η μπάρα, καμία ένδειξη,
   το chip έμοιαζε νεκρό. Ο ιδιοκτήτης το έζησε ως «η Προετοιμασία δεν έχει τα checkbox» — δηλαδή το
   σφάλμα ΑΚΥΡΩΝΕ τη λειτουργία, χωρίς εξαίρεση πουθενά και χωρίς μία γραμμή κόκκινη στην κονσόλα.

   Η ΑΙΤΙΑ ΔΕΝ ΕΙΝΑΙ ΤΟ PADDING ΤΗΣ ΣΕΛΙΔΑΣ — ΕΙΝΑΙ ΟΤΙ Ο ΑΞΟΝΑΣ ΕΙΝΑΙ ΔΕΥΤΕΡΟ SCROLLPORT ΜΕΣΑ ΣΤΟ ΠΡΩΤΟ.
   Το `main { padding-block-end: calc(var(--bottombar-h) + var(--sp-7)) }` προστατεύει ΤΟ ΤΕΛΟΣ ΤΟΥ
   ΕΓΓΡΑΦΟΥ: στη μέγιστη κύλιση τίποτα δεν μένει κάτω από τη μπάρα. Ο άξονας όμως δεν είναι το τέλος του
   εγγράφου — είναι κουτί ΣΤΑΘΕΡΟΥ ύψους (`TT_H_NARROW = 60vh`, από το `yard.js`) με ΔΙΚΟ του σκρολ,
   καρφωμένο κάτω από κεφαλίδα μέρας + λωρίδα parking + καρτέλες ημερών. Η αριθμητική στα 390×844:
     • ό,τι είναι ΠΑΝΩ από το κουτί (topbar 65 + padding 14 + `.yd-head` δύο σειρές + κάρτα parking +
       καρτέλες 44 + `.yd-col-h`) δίνει κορυφή κουτιού ≥ ~430 px, τυπικά ~500 με ελληνική ημερομηνία
       που τυλίγεται σε δύο σειρές·
     • το κουτί ζητά 60vh = 506 px, άρα τελειώνει στα ~940-1010 — ΠΟΛΥ κάτω από την κορυφή της μπάρας
       (844 − 58 = 786). Το ορατό του μερίδιο είναι ~300 px από τα 506·
     • και το `keepScroll` παρκάρει το γεγονός-εστία σε `box.clientHeight / 3` = 169 px ΜΕΣΑ στο κουτί
       (+32 sticky κεφαλίδα +18 margin ≈ 220 px) — δηλαδή σε συντεταγμένη μετρημένη πάνω σε ύψος 506 px
       που ο άνθρωπος ΔΕΝ βλέπει ολόκληρο. 430+220 = 650 (γλιτώνει), 500+220 = 720, 566+220 = 786
       (ΑΚΡΙΒΩΣ στη μπάρα). Γι' αυτό φαινόταν τυχαίο: η προσγείωση εξαρτιόταν από το ΥΨΟΣ ΤΗΣ ΚΕΦΑΛΙΔΑΣ,
       δηλαδή από τα δεδομένα της μέρας και το μήκος της ημερομηνίας στη γλώσσα της οθόνης.
   Με δυο λόγια: το `vh` μετρά οθόνη που η εφαρμογή έχει ΗΔΗ ξοδέψει (65 sticky πάνω + 58 fixed κάτω),
   και η πλοήγηση σε μέρα ΔΕΝ έφερνε ποτέ τον άξονα μέσα στη ζώνη που περισσεύει.

   Η ΔΙΟΡΘΩΣΗ ΕΙΝΑΙ ΔΗΛΩΣΗ, ΟΧΙ ΜΠΑΛΩΜΑ: το scroll root δηλώνει ΜΙΑ ΦΟΡΑ ότι το ωφέλιμο scrollport του
   είναι μικρότερο από το viewport κατά τις δύο σταθερές μπάρες. Από εκεί και πέρα ΚΑΘΕ κύλιση του
   browser (`scrollIntoView`, άγκυρα, μετακίνηση εστίασης) σέβεται το όριο — και το `showDayCol` του
   `yard.js` φέρνει πια τη στήλη της μέρας μέσα σε αυτή τη ζώνη αντί να ολισθαίνει μόνο οριζόντια.
   ΤΟ ΙΔΙΟ ΓΙΑ ΤΟ ΕΣΩΤΕΡΙΚΟ ΚΟΥΤΙ: το `.tt-scroll` δεν αφήνει το ΤΕΛΟΣ του άξονα κολλητά στην κάτω ακμή
   του — μια ακμή που μπορεί να βρίσκεται πίσω από τη μπάρα. Το τελευταίο chip της μέρας ελευθερώνεται
   με το ΔΙΚΟ του σκρολ, χωρίς να χρωστά κύλιση ολόκληρης σελίδας.

   ΓΙΑΤΙ ΣΤΑ 899 px ΚΑΙ ΟΧΙ ΣΤΑ 719: το όριο είναι ΤΟ ΙΔΙΟ με το «πού εμφανίζεται το `#bottom`» (Μ1,
   τέλος αρχείου). Δεύτερο, δικό μας breakpoint θα άφηνε ακάλυπτα τα 720-899 px — ακριβώς εκεί όπου η
   μπάρα υπάρχει και οι καρτέλες ημερών δεν φαίνονται, δηλαδή εκεί που κανείς δεν θα κοιτούσε ξανά. */
@media (max-width: 899px) {
  :root { scroll-padding-block: var(--topbar-h) calc(var(--bottombar-h) + var(--sp-5)); }
  .tt-scroll {
    padding-block-end: var(--bottombar-h);
    scroll-padding-block-end: var(--bottombar-h);
  }
}

/* ================================================================ ΖΗΜΙΕΣ ΣΤΟΛΟΥ + «ΠΕΡΙΣΣΟΤΕΡΑ» (0078)
   Προσθήκη ΜΟΝΟ: καμία υπάρχουσα γραμμή δεν αλλάζει — οι νέοι κανόνες έχουν δικά τους ονόματα, και όπου
   πατούν πάνω σε παλιό (`#bottom a`) το κάνουν με μεγαλύτερη ειδικότητα, όχι με ξαναγράψιμο. */
.dfl-page { display: flex; flex-direction: column; gap: var(--sp-5); }
.dfl-page h1 { margin: 0; }
.dfl-group { padding: 0; overflow: hidden; }

/* Η κεφαλίδα της ομάδας ΕΙΝΑΙ ο σύνδεσμος του οχήματος: ολόκληρη, σε ύψος δαχτύλου. */
.dfl-head {
  display: flex; align-items: center; gap: var(--sp-3); width: 100%;
  min-height: 52px; padding: var(--sp-3) var(--sp-5);
  background: none; border: 0; color: var(--ink); text-align: start;
  border-block-end: 1px solid var(--line);
}
.dfl-head:hover { background: var(--hover); filter: none; }
.dfl-caret { display: flex; color: var(--muted); transform: rotate(180deg); }
.dfl-rows { padding: var(--sp-2) var(--sp-5) var(--sp-4); }
.dfl-rows .dmg-row { padding-block: var(--sp-3); }

/* Οι εντολές σε εξέλιξη: κάρτα-κουμπί, ίδια λογική με την κεφαλίδα ομάδας. */
.dfl-orders { display: flex; flex-direction: column; }
.dfl-order {
  display: flex; align-items: center; gap: var(--sp-4); width: 100%;
  min-height: 52px; padding: var(--sp-4) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-s);
  color: var(--ink); text-align: start;
}
.dfl-order:hover { background: var(--hover); filter: none; }
.dfl-order-main { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-2); flex: 1; }
.dfl-print { color: var(--accent); white-space: nowrap; }
.dfl-late { color: var(--crit); }
/* 🪜 Η ΚΕΦΑΛΙΔΑ ΣΤΑΔΙΟΥ (0125) δανείζεται ΟΛΟ το σχήμα της κεφαλίδας-γραμμής των Μισθώσεων
   (`.rn-group`) — ίδια υπόσχεση, ίδιο σχήμα. Εδώ μπαίνει μόνο ο αέρας που τη χωρίζει από την
   προηγούμενη ομάδα: χωρίς αυτόν κολλάει στην τελευταία κάρτα και διαβάζεται ως μέρος της. */
.dfl-stage + .card { margin-block-start: 0; }
.card + .dfl-stage { margin-block-start: var(--sp-4); }
/* 0126 β: ανάμεσα στην τελευταία κάρτα ενός σταδίου και στην κεφαλίδα του επόμενου παρεμβάλλεται
   πλέον ο ΠΙΝΑΚΑΣ (κρυμμένος στο κινητό, αλλά ΑΔΕΛΦΟΣ κόμβος πάντα) — άρα ο κανόνας από πάνω δεν
   πιάνει πια και το κενό θα εξαφανιζόταν ΣΤΟ ΚΙΝΗΤΟ, εκεί που δεν φαίνεται καν ο πίνακας. */
.dfl-desk + .dfl-stage { margin-block-start: var(--sp-4); }

/* ---- Το φύλλο «Περισσότερα» της μπάρας κινητού. Ζει ΜΕΣΑ στο `#bottom`, γι' αυτό κάθε κανόνας του
   ξεκινά από εκεί: έτσι ακυρώνει το `#bottom a` (στήλη, 11 px, ύψος μπάρας) χωρίς `!important`. */
#bottom .sheet-wrap { flex: 1; display: flex; position: relative; }
#bottom .more-btn {
  flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 3px; height: var(--bottombar-h); padding: 0;
  background: none; border: 0; border-radius: 0; font-size: 11px; color: var(--muted);
  /* 🚨 ΠΑΝΩ ΑΠΟ ΤΟ ΠΕΤΑΣΜΑ, ΑΛΛΙΩΣ ΤΟ ΚΟΥΜΠΙ ΔΕΝ ΞΑΝΑΠΑΤΙΕΤΑΙ (04/09, iPhone). Το `.sheet-back` είναι
     `fixed` σε ΟΛΟ το viewport — σκεπάζει και την ίδια τη μπάρα — και έρχεται ΜΕΤΑ στο DOM· χωρίς
     `z-index` εδώ, το δεύτερο tap στο «Περισσότερα» έπεφτε στο πέτασμα και το φύλλο έμοιαζε κολλημένο.
     Το `#bottom` είναι `fixed` με `z-index: 20`, δηλαδή ΔΙΚΟ του stacking context: πέτασμα (1), κουμπί
     και φύλλο (2) συγκρίνονται μόνο μεταξύ τους. Ίδιος αριθμός με το `.sheet` επίτηδες — δεν
     επικαλύπτονται ποτέ (το φύλλο κάθεται ΠΑΝΩ από τη μπάρα, `inset-block-end: 100%`). */
  position: relative; z-index: 2;
}
#bottom .more-btn:hover { filter: none; color: var(--ink); }
#bottom .more-btn.active { color: var(--accent); }
#bottom .more-btn svg { width: 21px; height: 21px; display: block; }
/* Το πέτασμα ΕΙΝΑΙ κουμπί «κλείσε» (ο handler του ζει στο `moreControl`). Το `cursor: pointer` δεν είναι
   διακόσμηση: είναι το δεύτερο σημάδι που ψάχνει το iOS Safari για να στείλει `click` σε σκέτο div. */
#bottom .sheet-back {
  position: fixed; inset: 0; background: var(--overlay); z-index: 1; cursor: pointer;
}
/* 🔁 ΤΟ ΦΥΛΛΟ ΕΓΙΝΕ ΣΥΡΤΑΡΙ (Μ1, 04/09): ΑΠΟ ΤΑ ΔΕΞΙΑ ΤΗΣ ΜΠΑΡΑΣ, ΣΤΟ ΠΛΑΙ ΤΗΣ ΟΘΟΝΗΣ.
   Ήταν ένα κουτί 12 rem πάνω από το «Περισσότερα», με ό,τι δεν χώρεσε κάτω. Τώρα κρατά ΟΛΟ το μενού με
   τις ομάδες του — δηλαδή την ίδια στήλη του γραφείου — και για να χωρέσει θέλει ΥΨΟΣ ΟΘΟΝΗΣ και δικό
   του scroll. `fixed` και όχι `absolute`: το `#bottom` είναι ήδη `fixed` στο κάτω μέρος, άρα το
   `absolute` θα κρεμόταν από μια λωρίδα 58 px. Ο ΜΗΧΑΝΙΣΜΟΣ (πέτασμα, z-index, ποιος κλείνει τι) ΔΕΝ
   άλλαξε ούτε κατά κανόνα — μας κόστισε μία μέρα σε iPhone και μένει όπως είναι. */
#bottom .sheet {
  position: fixed; inset-block: 0; inset-inline-start: 0; inset-inline-end: auto; z-index: 2;
  inline-size: min(82vw, 19rem);
  display: flex; flex-direction: column; gap: var(--sp-4);
  padding: var(--sp-5) var(--sp-3) calc(var(--sp-6) + env(safe-area-inset-bottom));
  overflow-y: auto; overscroll-behavior: contain;
  background: var(--card); border: 0; border-inline-end: 1px solid var(--line);
  box-shadow: var(--shadow-strong);
}
#bottom .sheet a {
  flex: none; flex-direction: row; justify-content: flex-start; gap: var(--sp-4);
  height: auto; min-height: 52px; padding: var(--sp-3) var(--sp-5);
  border-radius: var(--r-s);
  font-size: var(--fs-m); color: var(--ink);
}
#bottom .sheet a:hover { background: var(--hover); }
/* ΙΔΙΑ ΕΝΔΕΙΞΗ ΜΕ ΤΗ ΣΤΗΛΗ ΤΟΥ ΓΡΑΦΕΙΟΥ (tint + accent): είναι το ΙΔΙΟ μενού σε άλλο σώμα, και δύο
   διαφορετικές «ενεργές» εικόνες θα ήταν δύο πράγματα να μάθει ο ίδιος άνθρωπος. */
#bottom .sheet a.active { background: var(--accent-soft); color: var(--accent); font-weight: var(--fw-semi); }
/* Το «ΝΕΟ» του Οδηγού μέσα σε γραμμή, όχι πάνω σε κουμπί: εδώ υπάρχει πλάτος — πάει στην άκρη. */
#bottom .sheet .new-dot { position: static; margin-inline-start: auto; }

@media (max-width: 719px) {
  .dfl-head, .dfl-order { padding-inline: var(--sp-4); }
  .dfl-rows { padding-inline: var(--sp-4); }
  /* Στα 390 px το «Εντολή →» δεν χωράει δίπλα σε τίτλο δύο σειρών: πέφτει κάτω, σε δική του γραμμή. */
  .dfl-order { flex-wrap: wrap; }
  .dfl-print { margin-inline-start: auto; }
}

/* ---------------------------------------------------------------- ΕΝΟΤΗΤΕΣ ΑΝΑ ΠΕΛΑΤΗ (02/09 ιθ)
 *
 * Δύο πράγματα ζωγραφίζονται εδώ: ο ΠΙΝΑΚΑΣ της πλατφόρμας (Ρυθμίσεις → Ενότητες) και η ΦΙΛΙΚΗ ΣΕΛΙΔΑ
 * που βλέπει ο πελάτης όταν ανοίξει σύνδεσμο ενότητας που δεν έχει.
 *
 * ΓΙΑΤΙ CHIPS ΚΑΙ ΟΧΙ ΠΙΝΑΚΑΣ: επτά στήλες × Ν πελάτες δεν χωρούν στα 390 px, και ένας πίνακας με
 * οριζόντιο scroll δίνει κουτάκια χωρίς κεφαλίδα — δηλαδή διακόπτες χωρίς όνομα. Το chip κουβαλά ΠΑΝΤΑ
 * το όνομά του δίπλα στο κουτάκι, σε κάθε πλάτος. */
.mod-row {
  display: flex; flex-direction: column; gap: var(--sp-3);
  padding-block: var(--sp-4); border-block-start: 1px solid var(--line);
}
.mod-row:first-of-type { border-block-start: 0; padding-block-start: 0; }
.mod-grid { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.mod-chip {
  display: flex; align-items: center; gap: var(--sp-2);
  min-height: 44px; padding: var(--sp-2) var(--sp-4);
  background: var(--card2); border: 1px solid var(--line); border-radius: var(--r);
  font-size: var(--fs-s); font-weight: var(--fw-med); cursor: pointer;
}
/* ΤΟ ΑΝΑΜΜΕΝΟ ΕΧΕΙ ΠΕΡΙΓΡΑΜΜΑ, ΟΧΙ ΜΟΝΟ ΑΠΟΧΡΩΣΗ: ίδιος λόγος με το `.rn-opt.picked` — σε φως ημέρας
   η διαφορά φόντου χάνεται, και ο διαχειριστής δεν πρέπει ποτέ να μαντεύει τι είναι ανοιχτό.
   🏷 ΚΑΙ ΓΙ' ΑΥΤΟ ΛΕΓΕΤΑΙ `picked` ΚΑΙ ΟΧΙ `on` (05/09): στο λεξιλόγιο του σπιτιού το `on` είναι ΤΟΝΟΣ
   ΚΑΤΑΣΤΑΣΗΣ («καλά», πράσινο) — και κατάσταση δεν βάφεται ΠΟΤΕ με accent. Εδώ όμως δεν λέγεται
   κατάσταση: λέγεται ΕΠΙΛΟΓΗ, ακριβώς όπως στο `.rn-opt.picked` και στο `.chip.active`, και εκεί το
   accent είναι το σωστό χρώμα. Σωστό χρώμα, λάθος λέξη — και η λάθος λέξη είναι που κάνει τον επόμενο
   να «διορθώσει» το σωστό χρώμα. */
.mod-chip.picked { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
.mod-chip.locked { cursor: default; opacity: .8; }

/* Η σελίδα «δεν είναι ενεργή στο πακέτο σας»: ΗΡΕΜΗ, στο κέντρο, με έναν δρόμο πίσω. Δεν είναι σφάλμα
   και δεν ζωγραφίζεται σαν σφάλμα — κανένα κόκκινο, καμία θαυμαστική. */
.mod-off { max-width: 34rem; margin-inline: auto; text-align: center; }
.mod-off h1 { font-size: var(--fs-xl); margin: 0; }
.mod-off button { min-height: 44px; }

/* ================================================================ ΜΙΣΘΩΣΕΙΣ: λίστα + καρτέλα (0079)
   Προσθήκη ΜΟΝΟ: καμία υπάρχουσα γραμμή δεν αλλάζει. Ό,τι επαναχρησιμοποιείται (`.card`, `.inc-renter`,
   `.conv`, `.dmg-row`, `.tl`) μπαίνει ΩΣ ΕΧΕΙ — η κάρτα ενοικιαστή εδώ πρέπει να είναι οπτικά
   ΤΑΥΤΟΣΗΜΗ με εκείνη της σελίδας οχήματος, αλλιώς το ίδιο κουμπί κλήσης μοιάζει με άλλο κουμπί. */
.rn-page, .rn-card-page { display: flex; flex-direction: column; gap: var(--sp-5); }
.rn-page h1 { margin: 0; }
.rn-list { display: flex; flex-direction: column; gap: var(--sp-3); }

/* Η ΓΡΑΜΜΗ ΕΙΝΑΙ ΟΛΟΚΛΗΡΗ ΚΟΥΜΠΙ (≥64 px): με γάντι στην αυλή, ένα όνομα δέκα χαρακτήρων δεν πιάνεται —
   και η μόνη ενέργεια της γραμμής είναι «άνοιξέ τη», άρα δεν υπάρχει λόγος να μοιραστεί ο στόχος. */
.rn-row {
  display: flex; align-items: center; gap: var(--sp-4); width: 100%;
  min-height: 64px; padding: var(--sp-4) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-s);
  color: var(--ink); text-align: start;
}
.rn-row:hover { background: var(--hover); filter: none; }
/* 🏛 ΣΤΗΛΕΣ, ΟΧΙ ΣΕΙΡΑ ΑΠΟ ΠΛΑΚΙΔΙΑ (ιδιοκτήτης 05/09, ζωντανά — και σε στιγμιότυπο)
 *
 * ΤΟ ΠΑΡΑΠΟΝΟ, ΑΥΤΟΥΣΙΟ: «τα bubble όχι μόνο δεν είναι στοιχισμένα — πάνε όλα αριστερά-δεξιά ανάλογα με
 * τους χαρακτήρες.» Και ήταν ακριβώς έτσι: η γραμμή ήταν flex, δηλαδή ΣΕΙΡΑ, και το πρώτο της στοιχείο
 * (το πλακίδιο του οχήματος) έχει πλάτος ΟΣΗ Η ΛΕΞΗ ΤΟΥ — «Atlas» 60 px, «Grey Matter» 85. Άρα η
 * πινακίδα και οι ώρες ξεκινούσαν σε ΑΛΛΟ x σε κάθε γραμμή. Ο νόμος §3 (ταυτότητα αριστερά, ψιλά δεξιά)
 * είχε ήδη ταχτοποιήσει τις ΑΚΡΕΣ· αυτό που έλειπε ήταν οι ΕΝΔΙΑΜΕΣΕΣ στήλες, και το μάτι χανόταν εκεί.
 *
 * Η ΔΙΟΡΘΩΣΗ: πλέγμα με ΣΤΑΘΕΡΕΣ ΖΩΝΕΣ — [πελάτης+κατάσταση | ΟΧΗΜΑ | πινακίδα | ώρες | ψιλά δεξιά].
 *
 * 🚨 ΚΑΜΙΑ ΖΩΝΗ ΔΕΝ ΜΕΤΡΙΕΤΑΙ ΑΠΟ ΤΟ ΠΕΡΙΕΧΟΜΕΝΟ. Κάθε γραμμή είναι ΔΙΚΟ ΤΗΣ grid (το `.rn-main` της),
 * άρα ένα `auto`/`max-content` οπουδήποτε θα ξαναγεννούσε ακριβώς το σφάλμα: κάθε γραμμή θα μετρούσε τα
 * ΔΙΚΑ ΤΗΣ γράμματα. Επιτρέπονται μόνο ΣΤΑΘΕΡΑ μήκη (οι δύο ζώνες ταυτότητας οχήματος) και `fr` με
 * `min` = 0 (οι τρεις ελαστικές) — και τα δύο δίνουν ΤΟ ΙΔΙΟ πλάτος σε κάθε γραμμή κάθε ομάδας, χωρίς
 * να κοιτάξουν το κείμενο. Γι' αυτό η στοίχιση δεν σπάει ούτε ανάμεσα στις τέσσερις ομάδες της σελίδας
 * (τρέχουσες / στον δρόμο / επερχόμενες / ιστορικό), που είναι ΞΕΧΩΡΙΣΤΕΣ λίστες.
 *
 * ΤΑ ΔΥΟ ΠΛΑΤΗ ΔΗΛΩΝΟΝΤΑΙ ΜΙΑ ΦΟΡΑ, ΣΤΗ ΣΕΛΙΔΑ (`.rn-page`), και τα διαβάζουν και οι τέσσερις ομάδες
 * ΚΑΙ η λωρίδα των προτάσεων: μια δεύτερη τιμή κάπου αλλού θα ήταν δύο στήλες που «σχεδόν» συμπίπτουν.
 *
 * ΤΟ ΠΛΑΤΟΣ ΤΗΣ ΣΤΗΛΗΣ ΟΧΗΜΑΤΟΣ ΕΙΝΑΙ ΥΠΟΛΟΓΙΣΜΟΣ, ΟΧΙ ΓΟΥΣΤΟ: το πλακίδιο είναι 12 px (`--fs-xs`) με
 * 10 px padding σε κάθε πλευρά. Το μακρύτερο όνομα του στόλου («Grey Matter», 11 χαρακτήρες) ζητά ~65
 * px κειμένου + 20 padding = 85 px· τα 7 rem (112 px) χωρούν ~14 χαρακτήρες, δηλαδή και το «Grey
 * Matter» και δύο-τρία γράμματα παραπάνω για τον επόμενο στόλο. Ό,τι ξεπερνά κόβεται με «…» ΚΑΙ κρατά
 * το πλήρες όνομα σε `title` (το βάζει το `rentals.js`) — καλύτερα μια στήλη που κρατιέται με ένα
 * κομμένο όνομα, παρά μια στήλη που σπάει για όλους εξαιτίας ενός.
 * Η πινακίδα: 8 χαρακτήρες tabular στα 13,5 px («XHB 5558», «ΧΡΚ 7020») ≈ 63 px → 5 rem με αέρα. */
.rn-page {
  --rn-veh-col: 7rem;
  --rn-plate-col: 5rem;
}
.rn-main {
  min-width: 0; flex: 1;
  display: grid;
  grid-template-columns: var(--rn-veh-col) minmax(0, 1fr);
  column-gap: var(--sp-3); row-gap: var(--sp-2);
  align-items: center;
}
/* ΤΟ ΚΙΝΗΤΟ ΑΝΑΔΙΠΛΩΝΕΙ ΕΛΕΓΧΟΜΕΝΑ, ΔΕΝ ΤΥΛΙΓΕΙ ΕΛΕΥΘΕΡΑ: πελάτης (όλο το πλάτος), μετά όχημα+πινακίδα
   στις δύο στήλες, μετά οι ώρες ΟΛΟΚΛΗΡΕΣ. Στα 390 px οι τρεις μαζί θέλουν ~400 px και δεν χωρούν με
   κανένα κόλπο — αλλά η ΑΡΧΗ κάθε κομματιού είναι η ίδια σε κάθε γραμμή, που ήταν και το ζητούμενο. */
.rn-line1 { display: flex; align-items: center; gap: var(--sp-3); min-width: 0; grid-column: 1 / -1; }
/* Η δεύτερη «σειρά» ΔΕΝ είναι κουτί: τα τρία παιδιά της είναι ΤΑ ΙΔΙΑ κελιά του πλέγματος (`contents`).
   Με ενδιάμεσο κουτί, οι στήλες θα ζούσαν μέσα του — δηλαδή θα ξαναμετρούσαν ανά γραμμή. */
.rn-line2 { display: contents; }
.rn-veh { grid-column: 1; min-width: 0; display: flex; }
/* Το πλακίδιο κρατά ΤΟ ΔΙΚΟ του πλάτος μέσα στη σταθερή ζώνη (δεν τεντώνεται σε κουμπί) και κόβεται με
   «…» μόνο στην υπερβολή. `block` γιατί το `text-overflow` δεν πιάνει σε flex container (`.pill`). */
.rn-veh > .pill { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.rn-plate { grid-column: 2; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Η ΙΔΙΑ ΖΩΝΗ ΚΑΙ ΕΞΩ ΑΠΟ ΤΗ ΛΙΣΤΑ: η πρόταση προς το τμήμα κρατήσεων (0113) είναι κι αυτή «πλακίδιο
   οχήματος + όνομα», με ΤΗΝ ΙΔΙΑ αρρώστια — το όνομα ξεκινούσε αλλού σε κάθε πρόταση. Εκεί η γραμμή
   είναι flex και όχι grid, άρα η ζώνη λέγεται `flex-basis`: ΙΔΙΟ νούμερο, ΜΙΑ δήλωση, δύο διατάξεις. */
.rn-opt .rn-veh { flex: 0 0 var(--rn-veh-col); }
/* Το όνομα δεν σπρώχνει έξω το badge: κόβεται με «…» και το πλήρες μένει στην καρτέλα. */
.rn-who { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rn-when { grid-column: 1 / -1; color: var(--muted); }
.rn-line3 { grid-column: 1 / -1; }
.rn-src { display: inline-flex; color: var(--muted); flex: none; }
.rn-caret { display: flex; color: var(--muted); transform: rotate(180deg); flex: none;
             transition: color var(--t) var(--ease), transform var(--t) var(--ease); }
.rn-row:hover .rn-caret, .rn-go:hover .rn-caret {
  color: var(--accent); transform: rotate(180deg) translateX(-2px);
}
.rn-empty { margin: 0; }

/* ---- η καρτέλα (η επιστροφή της είναι το κοινό `.back-link`) */
.rn-card-page .card { margin: 0; }

/* ΓΡΑΜΜΗ ΕΝΕΡΓΕΙΩΝ: λωρίδα που τυλίγει και κάθε κουμπί μεγαλώνει όσο χρειάζεται. Σήμερα ένα («στο
   όχημα»)· η ΜΕΤΑΦΟΡΑ ΣΕ ΑΛΛΟ ΟΧΗΜΑ μπαίνει δίπλα χωρίς αλλαγή διάταξης. Στα 390 px το `flex-basis`
   των 12rem σπρώχνει το δεύτερο κουμπί σε δική του γραμμή — δύο μισά κουμπιά δεν πατιούνται. */
.rn-actions { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.rn-act {
  flex: 1 1 12rem; display: inline-flex; align-items: center; justify-content: center;
  gap: var(--sp-3); min-height: 52px; padding: var(--sp-3) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-s); color: var(--ink);
}
.rn-act:hover { background: var(--hover); filter: none; }

/* Χρονογραμμή μίσθωσης: ο ΙΔΙΟΣ άξονας με τη χρονογραμμή του συμβάντος (`.tl`), με δύο ώρες ανά βήμα. */
.rn-step-main { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.rn-step.done .tl-dot { background: var(--ok); }
.rn-tick { color: var(--ok); font-weight: var(--fw-semi); }

.rn-ho { display: flex; flex-direction: column; gap: var(--sp-2); }
.rn-ho + .rn-ho { border-block-start: 1px solid var(--line); padding-block-start: var(--sp-3); }
/* ΙΔΙΑ ΑΡΡΩΣΤΙΑ, ΔΥΟ ΓΡΑΜΜΕΣ ΜΟΝΟ — ΑΛΛΑ ΔΙΠΛΑ-ΔΙΠΛΑ (05/09): «Παραλαβή» + πλακίδιο κατάστασης έχουν
   άλλο μήκος από «Επιστροφή» + το δικό της, άρα οι δύο ημερομηνίες ξεκινούσαν σε άλλο x η καθεμιά. Δεν
   αξίζει τρίτη στήλη για δύο γραμμές: η ημερομηνία είναι ΨΙΛΑ και πάει δεξιά (νόμος §3). */
.rn-ho-when { margin-inline-start: auto; text-align: end; }

/* «Πάμε αλλού» μέσα σε κάρτα: ίδια γεωμετρία με το `.dmg-line` του οχήματος, χρώμα ΠΛΟΗΓΗΣΗΣ (accent)
   και όχι `--crit` — εδώ δεν λέει «έχεις πρόβλημα», λέει «η συνέχεια είναι εκεί». */
.rn-go {
  display: flex; align-items: center; gap: var(--sp-3); width: 100%;
  min-height: 44px; margin-block-start: var(--sp-4);
  background: none; border: 0; border-block-start: 1px solid var(--line); border-radius: 0;
  padding: var(--sp-4) var(--sp-1) 0;
  color: var(--accent); font-weight: var(--fw-med); text-align: start;
}
.rn-go:hover { filter: none; color: var(--accent); background: none; }
.rn-go-caret { margin-inline-start: auto; }

@media (max-width: 719px) {
  .rn-row { padding-inline: var(--sp-4); }
}

/* ΣΕ ΟΘΟΝΗ ΓΡΑΦΕΙΟΥ Η ΓΡΑΜΜΗ ΓΙΝΕΤΑΙ ΜΙΑ (Vassilis 03/09: «πιάνουν χώρο οπτικά»).
 *
 * ΤΟ ΔΙΩΡΟΦΟ ΕΙΝΑΙ ΣΩΣΤΟ ΣΤΑ 390 px ΚΑΙ ΣΠΑΤΑΛΗ ΣΤΑ 1400: στο κινητό οι ώρες δεν χωράνε δίπλα στον
 * κωδικό· στο desktop περισσεύουν 700 px και η ίδια πληροφορία τρώει τριπλάσιο ύψος — δηλαδή δώδεκα
 * μισθώσεις αντί για τριάντα σε μια οθόνη. ΙΔΙΑ ΣΤΟΙΧΕΙΑ, ΙΔΙΟ DOM, μόνο άλλη ροή: `.rn-main` γίνεται
 * οριζόντιο, η υποσημείωση πάει δεξιά και το ύψος πέφτει στο ελάχιστο μιας σειράς με στόχο αφής 44 px.
 * Καμία απόκρυψη: ό,τι φαίνεται στο κινητό φαίνεται και εδώ (δύο διατάξεις, ΜΙΑ αλήθεια). */
@media (min-width: 720px) {
  .rn-row { min-height: 52px; padding-block: var(--sp-3); }
  /* ΠΕΝΤΕ ΖΩΝΕΣ, ΚΑΜΙΑ ΤΟΥΣ ΜΕΤΡΗΜΕΝΗ ΑΠΟ ΚΕΙΜΕΝΟ. Οι τρεις ελαστικές είναι `fr` με ελάχιστο 0, δηλαδή
     μοιράζονται ΑΝΑΛΟΓΙΚΑ ό,τι περισσεύει και ΔΕΝ κοιτούν τι γράφει η κάθε γραμμή. Ο λογαριασμός σε
     οθόνη γραφείου 1280 px (με την πλαϊνή στήλη): μένουν ~690 px μετά τις δύο σταθερές ζώνες και τα
     κενά → ταυτότητα ~235, ώρες ~235 (η μακρύτερη συμβολοσειρά «≈ 12/07 10:00 → ≈ 15/07 18:00» θέλει
     ~205), ψιλά ~205. Σε στενό γραφείο (720-1000 px) μαζεύονται όλες μαζί και τα κείμενα τυλίγουν —
     αλλά ΙΔΙΑ σε κάθε γραμμή, που είναι το ζητούμενο.
     🚨 ΓΙΑΤΙ ΟΧΙ ΤΟ ΠΑΛΙΟ `22rem` ΤΗΣ ΤΑΥΤΟΤΗΤΑΣ: ως `flex-basis` συρρικνωνόταν, ως ΖΩΝΗ ΠΛΕΓΜΑΤΟΣ όχι
     — το σταθερό μήκος σερβίρεται ΠΡΙΝ από τα `fr`, οπότε στα 900 px θα έτρωγε ΟΛΟΝ τον χώρο και οι
     ώρες με τα ψιλά θα μηδενίζονταν. Σταθερό μήκος επιτρέπεται μόνο εκεί που το πλάτος ΕΙΝΑΙ η
     απαίτηση (οι δύο ζώνες ταυτότητας του οχήματος), και είναι μικρό. */
  .rn-main {
    grid-template-columns: minmax(0, 1.5fr) var(--rn-veh-col) var(--rn-plate-col)
                           minmax(0, 1.5fr) minmax(0, 1.3fr);
    column-gap: var(--sp-5);
  }
  .rn-line1 { grid-column: 1; }
  .rn-veh { grid-column: 2; }
  .rn-plate { grid-column: 3; }
  .rn-when { grid-column: 4; }
  /* Η υποσημείωση (τηλέφωνο, γλώσσα, μηνύματα) στοιχίζεται ΔΕΞΙΑ: είναι μετα-πληροφορία, και η στήλη
     της γίνεται σαρώσιμη με το μάτι από πάνω προς τα κάτω αντί να σπρώχνει τη γραμμή σε τρίτη σειρά.
     Στο πλέγμα το «δεξιά» λέγεται `justify-self: end` + `text-align: end` (νόμος §3: και τα δύο — το
     ένα στοιχίζει ΤΟ ΚΟΥΤΙ, το άλλο το κείμενο όταν τυλίξει σε δεύτερη γραμμή). */
  .rn-line3 { grid-column: 5; justify-self: end; text-align: end; }
}

/* ---------------------------------------------------------------- ΚΥΚΛΟΣ ΖΩΗΣ: popup, προτάσεις, «θα γίνουν»
 *
 * ΣΦΡΑΓΙΣΜΕΝΗ ΠΡΟΣΘΗΚΗ, ΟΠΩΣ ΚΑΙ Η ΠΡΟΗΓΟΥΜΕΝΗ: κάθε κανόνας ξεκινά από `.rn-`. Ένα `.card { … }` εδώ θα
 * άλλαζε σιωπηλά δεκαπέντε σελίδες — και το test το φυλάει επιλογέα-προς-επιλογέα.
 *
 * ΤΟ POPUP ΕΙΝΑΙ ΦΥΛΛΟ ΚΑΤΩ ΣΤΟ ΚΙΝΗΤΟ ΚΑΙ ΚΑΡΤΑ ΣΤΟ ΚΕΝΤΡΟ ΣΤΗΝ ΟΘΟΝΗ: η αλλαγή οχήματος γίνεται στην
 * αυλή, με το ένα χέρι, ενώ ο γερανός περιμένει. Ο αντίχειρας φτάνει το κάτω μέρος της οθόνης, όχι το
 * κέντρο — γι' αυτό η κύρια ενέργεια είναι η ΤΕΛΕΥΤΑΙΑ γραμμή και το φύλλο κολλάει κάτω.
 */
/* Η ΚΥΡΙΑ ΠΡΑΞΗ ΤΗΣ ΚΕΦΑΛΙΔΑΣ. Ήταν το ΜΟΝΟ στρογγυλό (`--r-pill`) κουμπί ολόκληρης της εφαρμογής —
   δίπλα στα φίλτρα, που ΕΙΝΑΙ στρογγυλά επειδή είναι chips, διαβαζόταν σαν τέταρτο chip και όχι σαν η
   πράξη της σελίδας. Ίδια γωνία με κάθε άλλο κουμπί του σπιτιού (νόμος §4). */
.rn-new {
  min-height: 44px; padding-inline: var(--sp-6); border-radius: var(--r-s);
  font-weight: var(--fw-semi); flex: none;
}
.rn-act-off { color: var(--crit); }

.rn-modal {
  position: fixed; inset: 0; z-index: 60;
  display: flex; align-items: flex-end; justify-content: center;
  /* ΤΟ ΙΔΙΟ ΠΕΤΑΣΜΑ ΜΕ ΤΟ ΦΥΛΛΟ «Περισσότερα» ΤΟΥ ΚΕΛΥΦΟΥΣ (`--overlay`): ένα δεύτερο, γραμμένο εδώ,
     θα ήταν χρώμα εκτός tokens — δηλαδή χρώμα που ΔΕΝ αλλάζει με το θέμα (GUI_SPEC §1). */
  background: var(--overlay);
}
.rn-modal-card {
  background: var(--card); border: 1px solid var(--line);
  border-start-start-radius: var(--r); border-start-end-radius: var(--r);
  box-shadow: var(--shadow-strong);
  width: min(46rem, 100%); max-height: 92vh;
  display: flex; flex-direction: column;
}
.rn-modal-head {
  align-items: center; gap: var(--sp-3);
  padding: var(--sp-5) var(--sp-6); border-block-end: 1px solid var(--line);
}
/* Το «×» είναι ΔΕΥΤΕΡΗ έξοδος (υπάρχουν και Escape και κλικ έξω) αλλά πρέπει να πιάνεται με γάντι. */
.rn-modal-x {
  background: none; border: 0; color: var(--muted);
  min-width: 44px; min-height: 44px; font-size: var(--fs-xl); line-height: 1;
}
.rn-modal-x:hover { background: none; color: var(--ink); filter: none; }
.rn-modal-body { padding: var(--sp-6); overflow-y: auto; }
/* Η ΚΥΡΙΑ ΕΝΕΡΓΕΙΑ ΜΕΝΕΙ ΟΡΑΤΗ ΟΣΟ ΣΚΡΟΛΑΡΕΙ Η ΛΙΣΤΑ: με δώδεκα προτάσεις και μια λίστα συνεπειών, το
   κουμπί «Επιβεβαίωση» θα ήταν αλλιώς δύο οθόνες πιο κάτω από το σημείο που κοιτάει ο άνθρωπος. */
.rn-modal-foot {
  position: sticky; bottom: calc(-1 * var(--sp-6)); gap: var(--sp-4); align-items: center;
  background: var(--card); padding-block: var(--sp-4);
  border-block-start: 1px solid var(--line); margin-block-start: var(--sp-5);
}
.rn-go-big {
  min-height: 52px; flex: 1 1 12rem; border-radius: var(--r);
  font-size: var(--fs-l); font-weight: var(--fw-semi);
}
.rn-danger { background: var(--crit); border-color: var(--crit); color: var(--on-crit); }

/* Η ΠΡΟΤΑΣΗ ΟΧΗΜΑΤΟΣ: ολόκληρη η κάρτα είναι το κουμπί (στόχος αφής), το επιλεγμένο έχει ΠΕΡΙΓΡΑΜΜΑ και
   όχι μόνο χρώμα — σε ήλιο, η διαφορά απόχρωσης δεν φαίνεται. */
.rn-opt {
  display: flex; flex-direction: column; gap: var(--sp-2); width: 100%; text-align: start;
  min-height: 56px; padding: var(--sp-4) var(--sp-5);
  background: var(--card2); border: 1px solid var(--line); border-radius: var(--r);
  color: inherit; font-weight: var(--fw-med);
}
.rn-opt:hover { background: var(--hover); filter: none; }
.rn-opt.picked { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
.rn-opt.off { opacity: .75; }
.rn-why { color: var(--crit); font-size: var(--fs-xs); text-align: end; }

/* Οι λίστες «γιατί καλό / τι θα σου κοστίσει / τι θα γίνει»: ΚΟΥΚΚΙΔΕΣ ΜΕ ΧΡΩΜΑ, μία γραμμή η καθεμιά.
   Το χρώμα είναι στην ΚΟΥΚΚΙΔΑ και όχι στο κείμενο — κόκκινο κείμενο σε τρεις σειρές δεν διαβάζεται. */
.rn-bullets { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.rn-bullets li { position: relative; padding-inline-start: var(--sp-5); font-size: var(--fs-s); }
.rn-bullets li::before {
  content: ''; position: absolute; inset-inline-start: 0; top: .55em;
  width: 6px; height: 6px; border-radius: 50%; background: var(--muted);
}
.rn-bullets.ok li::before { background: var(--ok); }
.rn-bullets.warn li::before { background: var(--warn); }
.rn-bullets.off li::before { background: var(--crit); }
.rn-plan { margin: 0; display: flex; flex-direction: column; gap: var(--sp-5); background: var(--card2); }
.rn-check { align-items: center; gap: var(--sp-3); min-height: 44px; }

@media (min-width: 720px) {
  /* Στην οθόνη γραφείου το φύλλο γίνεται κάρτα στο κέντρο — εκεί ο δείκτης φτάνει παντού. */
  .rn-modal { align-items: center; }
  .rn-modal-card { border-radius: var(--r); }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
   Ο COMPOSER ΜΗΝΥΜΑΤΟΣ + Η ΧΡΗΣΗ AI (02/09, αποφάσεις ιστ/ιθ)

   ΠΡΟΣΘΗΚΗ ΜΟΝΟ: καμία υπάρχουσα γραμμή δεν αλλάζει, κανένα χρώμα εκτός `tokens.css`. Ό,τι μπορούσε να
   επαναχρησιμοποιηθεί (`.card`, `.stack`, `.conv-body`, `.btn`) μπήκε ως έχει — η φόρμα εδώ πρέπει να
   είναι οπτικά ΤΟ ΙΔΙΟ πράγμα με τη συνομιλία από πάνω της, όχι μια δεύτερη γλώσσα σχεδίασης.
   ════════════════════════════════════════════════════════════════════════════════════════════════════ */
/* ΜΠΑΡΑ MESSENGER, ΟΧΙ ΠΛΑΙΣΙΟ ΕΚΘΕΣΗΣ (03/09 β, Vassilis: «όλο το κουτί δεν εξυπηρετεί»).
   ΤΙ ΑΛΛΑΞΕ: ήταν `min-height: 84px` — τρεις σειρές ΠΑΝΤΑ ανοιχτές, ακόμα και για ένα «ok». Μαζί με τον
   τίτλο, την ετικέτα «Κανάλι» και δύο μεγάλα κουμπιά, η φόρμα σε ηρεμία έπιανε πάνω από το ένα τρίτο
   της οθόνης ενός κινητού — δηλαδή έκρυβε τη ΣΥΝΟΜΙΛΙΑ, που είναι το προϊόν.
   ΤΩΡΑ: μία σειρά που ψηλώνει με το κείμενο (το ύψος το γράφει η JS, `composer.grow`), ταβάνι πέντε
   σειρές και μετά σκρολάρει μέσα της. ΤΟ `max-width: none` ΕΙΝΑΙ ΑΠΑΡΑΙΤΗΤΟ: το γενικό `textarea` του
   αρχείου κόβει στα 22rem, που σε οθόνη γραφείου άφηνε μισοάδεια λωρίδα δίπλα στο νήμα.
   ΤΟ `resize: none` ΔΕΝ ΑΦΑΙΡΕΙ ΔΥΝΑΤΟΤΗΤΑ: η λαβή θα πάλευε με το αυτόματο ύψος σε κάθε πλήκτρο. */
.cmp-text {
  width: 100%; max-width: none;
  min-height: 44px; max-height: 8.5rem; overflow-y: auto; resize: none;
  padding: var(--sp-3) var(--sp-5); border-radius: var(--r);
  background: var(--card2); border: 1px solid var(--line); color: var(--ink);
  font-family: var(--font); font-size: var(--fs-m); line-height: var(--lh-text);
}
.cmp-text:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.cmp-acts { display: flex; gap: var(--sp-4); flex-wrap: wrap; }
/* ΜΙΑ ΚΥΡΙΑ ΕΝΕΡΓΕΙΑ ΑΝΑ ΒΗΜΑ, ΣΕ ΠΛΗΡΕΣ ΠΛΑΤΟΣ ΚΑΙ ≥52 px: το δάχτυλο με γάντι δεν στοχεύει. */
.cmp-go, .cmp-send { min-height: 52px; flex: 1 1 12rem; font-size: var(--fs-l); font-weight: var(--fw-semi); }
.cmp-acts .ghost { min-height: 52px; flex: 0 1 8rem; }

/* 🚨 Η ΓΡΑΜΜΗ ΤΗΣ ΣΥΝΘΕΣΗΣ: ΔΙΠΛΑ-ΔΙΠΛΑ ΟΣΟ ΧΩΡΑΝΕ ΟΙ ΛΕΞΕΙΣ ΟΛΟΚΛΗΡΕΣ, ΑΛΛΙΩΣ Ο ΕΝΑΣ ΚΑΤΩ ΑΠΟ ΤΟΝ
   ΑΛΛΟΝ ΣΕ ΠΛΗΡΕΣ ΠΛΑΤΟΣ (03/09 β). ΧΩΡΙΣ BREAKPOINT, ΕΠΙΤΗΔΕΣ: το κριτήριο δεν είναι «πόσα px έχει η
   οθόνη» αλλά «χωράει η ΛΕΞΗ» — και η λέξη αλλάζει με τη γλώσσα («Mit KI schreiben» δεν είναι
   «Βελτίωσέ το») και με το πλάτος της στήλης (η οθόνη Μηνύματα έχει άλλη από την καρτέλα μίσθωσης).
   Ένα `@media` θα ήταν μια σταθερή απάντηση σε ερώτηση που έχει έξι διαφορετικές απαντήσεις.

   `flex-shrink: 0` = ΠΟΤΕ ΣΤΡΙΜΩΓΜΑ: ένα κουμπί που στενεύει σπάει την ετικέτα του σε δύο σειρές, που
   είναι ο άλλος τρόπος να γίνει δυσανάγνωστη. Έτσι η γραμμή ή τα κρατά ολόκληρα δίπλα-δίπλα, ή τα
   τυλίγει — και τότε το `flex-grow: 1` δίνει σε καθένα ΟΛΟ το πλάτος της σειράς του.
   ΜΟΝΟ ΓΙΑ ΤΗ ΣΥΝΘΕΣΗ (`.cmp-acts-write`): η προεπισκόπηση και η πρόταση του βοηθού έχουν τρία κουμπιά
   με άλλη ιεραρχία, και δεν τα ξαναστήνουμε επειδή άλλαξε το βήμα της γραφής. */
.cmp-acts.cmp-acts-write > button { flex: 1 0 auto; }
/* ΤΟ ✨ ΜΕΣΑ ΣΤΗ ΓΡΑΜΜΗ ΕΝΕΡΓΕΙΩΝ ΔΕΝ ΕΙΝΑΙ ΤΟ ΜΙΚΡΟ ✨ ΤΗΣ ΦΥΣΑΛΙΔΑΣ: εκεί κάθεται μέσα σε γραμμή
   μεταδεδομένων 12 px, εδώ δίπλα σε κουμπί 52 px. Με το μέγεθος της φυσαλίδας διαβαζόταν ως διακοσμητικό. */
.cmp-acts .cp-spark { font-size: var(--fs-s); }

/* Η ΥΠΟΣΗΜΕΙΩΣΗ ΠΟΥ ΑΝΤΙΚΑΤΕΣΤΗΣΕ ΤΟ ΔΙΔΑΚΤΙΚΟ PLACEHOLDER: η πληροφορία «μεταφράζεται πριν φύγει» δεν
   χάθηκε — έπαψε απλώς να καταλαμβάνει δύο σειρές ΜΕΣΑ στο πεδίο όπου ο άνθρωπος θέλει να γράψει. */
.cmp-hint { margin: 0; line-height: var(--lh-text); }

/* ---- Η ΓΡΑΜΜΗ ΤΗΣ ΟΔΗΓΙΑΣ («τι θέλεις να πεις;»), 03/09 β → μετακόμισε ΜΕΣΑ στην πρόταση (04/09).
   ΤΟ ΞΕΧΩΡΙΣΤΟ ΠΛΑΙΣΙΟ (`.cmp-ask-panel`) ΚΑΤΑΡΓΗΘΗΚΕ: ήταν ένα δεύτερο, ισότιμο μονοπάτι στην ίδια
   οθόνη — «ζήτα απάντηση» ή «πες τι να γράψει», με το ίδιο εικονίδιο και άλλο αποτέλεσμα. Έμεινε ΜΟΝΟ
   η γραμμή (πεδίο + βέλος), και ζει πλέον στο κάτω μέρος του πανελ της πρότασης: εκεί η οδηγία έχει
   κάτι συγκεκριμένο να κατευθύνει («κάν' το πιο αυστηρό»), αντί να ξεκινά από το τίποτα. */
.cmp-ask-row { display: flex; gap: var(--sp-3); align-items: center; }
/* ΤΟ ΒΕΛΟΣ: στρογγυλό, γεμάτο, δίπλα στο πεδίο — ένα σχήμα που δεν διαβάζεται, αναγνωρίζεται. 44 px
   γιατί είναι εικονίδιο χωρίς λέξη: ό,τι δεν έχει ετικέτα ΟΦΕΙΛΕΙ τουλάχιστον να πιάνεται. */
.cmp-arrow {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  inline-size: 44px; block-size: 44px; padding: 0; border-radius: var(--r-pill);
}
.cmp-arrow svg { inline-size: 20px; block-size: 20px; display: block; }

/* ΤΑ ΔΥΟ ΚΕΙΜΕΝΑ: στο κινητό το ένα κάτω από το άλλο (το πρωτότυπο πρώτο, όπως γράφτηκε), σε οθόνη
   γραφείου δίπλα-δίπλα — εκεί η αντιπαραβολή γίνεται με μια ματιά. */
.cmp-pair { display: flex; flex-direction: column; gap: var(--sp-4); }
.cmp-side {
  padding: var(--sp-4) var(--sp-5); border-radius: var(--r);
  background: var(--card2); border: 1px solid var(--line);
}
/* ΑΥΤΟ ΕΙΝΑΙ ΠΟΥ ΦΕΥΓΕΙ: παίρνει το accent, όπως και οι δικές μας φυσαλίδες στη συνομιλία. */
.cmp-side.out { border-color: var(--accent); }
.cmp-body { margin-block-start: var(--sp-2); white-space: pre-wrap; line-height: var(--lh-text); }
.cmp-note {
  margin: 0; padding: var(--sp-3) var(--sp-4); border-radius: var(--r-s);
  background: var(--warn-soft); border-inline-start: 3px solid var(--warn);
}
/* Το «Πρωτότυπο» μέσα στη φυσαλίδα: κλειστό από προεπιλογή, ώστε το νήμα να διαβάζεται σαν κουβέντα.
   ΙΣΧΥΕΙ ΚΑΙ ΠΡΟΣ ΤΙΣ ΔΥΟ ΚΑΤΕΥΘΥΝΣΕΙΣ (03/09): στα δικά μας κρύβει τα ελληνικά του χειριστή, στα
   εισερχόμενα τα γαλλικά του πελάτη — ίδιο σχήμα (0080), ίδιο στοιχείο, ανάποδοι ρόλοι. */
.conv-orig { margin-block-start: var(--sp-2); }
.conv-orig > summary { cursor: pointer; font-size: var(--fs-xs); }

/* ---------------------------------------------------------------- Το πεδίο της οδηγίας (03/09 → 04/09)
   «Τι θέλεις να πεις;»: παίρνει ό,τι περισσεύει στη γραμμή του βέλους. Το `max-width: none` ακυρώνει το
   γενικό όριο των 22rem, που εδώ θα άφηνε το βέλος να αιωρείται στη μέση της γραμμής.
   Ζει πλέον ΜΕΣΑ στο πανελ της πρότασης (`.cp-sug-ask`), όχι σε δικό του πανελ κάτω από τη φόρμα. */
.cmp-ask { flex: 1 1 auto; min-inline-size: 0; max-width: none; min-height: 44px; }


/* Η ΜΠΑΡΑ ΤΟΥ ΠΡΟΫΠΟΛΟΓΙΣΜΟΥ: το χρώμα λέει «πόσο κοντά», όχι το νούμερο. */
.ai-bar { height: 10px; border-radius: var(--r-pill); background: var(--neutral-soft); overflow: hidden; }
.ai-bar-fill { height: 100%; border-radius: var(--r-pill); background: var(--ok); }
.ai-bar-fill.warn { background: var(--warn); }
.ai-bar-fill.off { background: var(--crit); }
.ai-spent { font-size: var(--fs-l); }
.ai-kind { gap: var(--sp-4); }

@media (min-width: 720px) {
  .cmp-pair { flex-direction: row; }
  .cmp-pair > .cmp-side { flex: 1 1 0; }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
   Ο ΒΟΗΘΟΣ (copilot, Φάση 1 — 03/09)

   ΠΡΟΣΘΗΚΗ ΜΟΝΟ: καμία υπάρχουσα γραμμή δεν αλλάζει, κανένα χρώμα εκτός `tokens.css`. Η πρόταση
   απάντησης ΔΑΝΕΙΖΕΤΑΙ αυτούσια τα `.cmp-pair`/`.cmp-side`/`.cmp-body`/`.cmp-acts` του composer: είναι
   το ίδιο πράγμα (δύο κείμενα δίπλα-δίπλα πριν από μία απόφαση) και πρέπει να ΦΑΙΝΕΤΑΙ ίδιο.
   ════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* Το ✨ — ένα γλυφικό, όχι εικονίδιο SVG. Το μέγεθος κλειδώνεται ώστε να μη «χορεύει» η γραμμή όταν ο
   browser του χρήστη έχει άλλη γραμματοσειρά emoji (το μάθημα των σημαιών, 02/09). */
.cp-spark-ico { font-size: var(--fs-m); line-height: 1; flex: none; }
.cp-btn { font-size: var(--fs-m); line-height: 1; }

/* ΤΟ ΚΟΥΜΠΙ ΤΗΣ ΦΥΣΑΛΙΔΑΣ: μικρό, μέσα στη γραμμή των μεταδεδομένων — αλλά με στόχο αφής ≥32 px, γιατί
   κάθεται δίπλα σε σύνδεσμο και ένα λάθος tap ανοίγει άλλη σελίδα. */
.cp-spark {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  /* ΠΑΤΙΕΤΑΙ ΚΑΙ ΕΧΕΙ ΠΕΡΙΓΡΑΜΜΑ ⇒ ΕΙΝΑΙ `chip`, ΑΡΑ ΦΟΡΑΕΙ ΤΗ ΓΕΩΜΕΤΡΙΑ ΤΟΥ (νόμος §4). Ήταν
     `2px var(--sp-3)`: τέταρτο ύψος πλακιδίου, δίπλα ακριβώς σε chips καναλιού στην ίδια γραμμή. */
  min-height: 32px; padding: 5px var(--sp-5);
  border-radius: var(--r-pill); border: 1px solid var(--line);
  background: transparent; color: var(--muted); font-size: var(--fs-xs); cursor: pointer;
}
.cp-spark:hover { color: var(--ink); border-color: var(--accent); background: var(--accent-soft); }
.cp-spark[disabled] { opacity: .6; cursor: default; }
/* Στα 390 px το ✨ ΤΗΣ ΦΥΣΑΛΙΔΑΣ μένει σκέτο εικονίδιο: η γραμμή μεταδεδομένων έχει ήδη ώρα, κανάλι και
   «ποιος» — μια τέταρτη ετικέτα την έσπρωχνε σε δεύτερη σειρά κάτω από ΚΑΘΕ εισερχόμενο μήνυμα. Το
   κείμενο μένει στο `title`/`aria-label`, όχι εκτός DOM, και το κουμπί κάθεται κολλητά στο μήνυμα που
   ρωτά — δηλαδή έχει τα συμφραζόμενά του.
   ΔΥΟ ΡΗΤΕΣ ΕΞΑΙΡΕΣΕΙΣ (03/09 β), γιατί εκεί το ίδιο κόλπο έβγαζε ανώνυμο κουμπί:
     `.cp-spark-wide`  — το ✨ ΤΟΥ COMPOSER, που στέκεται σε γραμμή ενεργειών δίπλα σε άλλο κουμπί και
                         δεν έχει κανένα συμφραζόμενο να το εξηγήσει· εκεί η ετικέτα δεν κρύβεται ΠΟΤΕ.
     `.cp-spark-busy`  — όσο τρέχει το αίτημα: το «Σκέφτομαι…» είναι Η ΑΠΟΚΡΙΣΗ στο tap, και ένα κρυμμένο
                         «Σκέφτομαι…» είναι κουμπί που «δεν κάνει τίποτα» για δύο ολόκληρα δευτερόλεπτα. */
@media (max-width: 519px) {
  .cp-spark:not(.cp-spark-wide):not(.cp-spark-busy) .cp-spark-txt { display: none; }
}

/* Η ΠΡΟΤΑΣΗ ΜΕΣΑ ΣΤΟΝ COMPOSER: δικό της πλαίσιο, ώστε να διαβάζεται ως «κάτι που πρότεινε μηχανή»
   και όχι ως κείμενο που έγραψε ο χειριστής. Διακεκομμένο περίγραμμα = προσχέδιο, όχι απόφαση. */
.cp-sug {
  display: flex; flex-direction: column; gap: var(--sp-4);
  padding: var(--sp-5); border-radius: var(--r);
  border: 1px dashed var(--accent-dim); background: var(--card2);
}
.cp-sug-head { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
/* 🚨 ΤΑ ΚΟΥΜΠΙΑ ΤΗΣ ΠΡΟΤΑΣΗΣ ΔΕΝ ΦΕΥΓΟΥΝ ΚΑΤΩ ΑΠΟ ΤΗΝ ΟΘΟΝΗ (04/09 — «νόμιζα ότι έστειλα»).
   ΤΙ ΕΓΙΝΕ: στα 390 px η πρόταση είναι ψηλή (κείμενο, σημείωση, κόστος, μέτρημα). Ο χειριστής διάβαζε
   «Θα σταλεί στα Ελληνικά», θεωρούσε ότι τελείωσε, και το «Αποστολή» καθόταν εκατόν πενήντα pixel πιο
   κάτω — αόρατο. Το μήνυμα δεν έφυγε ποτέ, και δεν υπήρχε τίποτα στην οθόνη να το πει.
   ΤΟ `sticky` ΤΑ ΚΡΑΤΑ ΣΤΟ ΚΑΤΩ ΑΚΡΟ ΤΟΥ ΟΡΑΤΟΥ ΠΕΔΙΟΥ όσο το πανελ είναι στην οθόνη — και δεν κάνει
   ΤΙΠΟΤΑ όταν το πανελ χωράει ολόκληρο (τότε τα κουμπιά είναι ήδη ορατά). Το φόντο είναι απαραίτητο:
   χωρίς αυτό το κείμενο που περνά από κάτω τους διαβάζεται μέσα από τα γράμματά τους.
   ΔΕΥΤΕΡΗ ΓΡΑΜΜΗ ΑΜΥΝΑΣ, ΟΧΙ ΠΡΩΤΗ: την πρώτη την κάνει η JS (`composer.revealActs`), γιατί το sticky
   σπάει σιωπηλά κάτω από οποιονδήποτε πρόγονο με `overflow: hidden` — και δεν το μαθαίνουμε ποτέ.
   ΜΟΝΟ ΣΤΟ ΚΙΝΗΤΟ: σε οθόνη γραφείου το πανελ χωράει, και ένα κολλημένο πλαίσιο θα ήταν διακόσμηση. */
@media (max-width: 719px) {
  .cp-sug > .cmp-acts {
    position: sticky; inset-block-end: var(--sp-3); z-index: 1;
    background: var(--card2); padding-block: var(--sp-3);
  }
}
/* Ο ΦΡΟΥΡΟΣ ΤΗΣ ΑΝΑΛΥΣΗΣ: η πρόταση φαίνεται, αλλά σημαδεμένη — και χωρίς «Χρήση ως έχει». */
.cp-sug.warn { border-color: var(--warn); }
.cp-flag {
  padding: var(--sp-3) var(--sp-4); border-radius: var(--r-s);
  background: var(--warn-soft); border-inline-start: 3px solid var(--warn);
}
/* Η ΓΡΑΜΜΗ ΤΗΣ ΟΔΗΓΙΑΣ, ΚΑΤΩ ΑΠΟ ΤΙΣ ΕΝΕΡΓΕΙΕΣ (04/09): δανείζεται το `.cmp-ask-row` και το `.cmp-arrow`
   του composer — είναι το ΙΔΙΟ πεδίο με το ίδιο βέλος, σε νέα θέση. Λεπτή διαχωριστική γραμμή από πάνω:
   δευτερεύουσα ενέργεια («κάν' το πιο αυστηρό»), όχι εναλλακτική της αποστολής. */
.cp-sug-ask { border-block-start: 1px solid var(--line); padding-block-start: var(--sp-4); }
.cp-meta { display: flex; gap: var(--sp-3); flex-wrap: wrap; }
/* Η ΓΡΑΜΜΗ ΠΗΓΩΝ («από πού το ξέρει αυτό;», 04/09): ίδια διακριτική γραμμή με το κόστος, αλλά κάθε πηγή
   είναι ΕΝΑ αντικείμενο — τίτλος και σήμα προέλευσης κολλητά, ώστε δύο πηγές να μη διαβάζονται ως μία.
   Στο κινητό σπάει σε σειρές (`flex-wrap` του `.cp-meta`): το `row-gap` δίνει ανάσα ανάμεσά τους. */
.cp-src { align-items: center; row-gap: var(--sp-2); }
.cp-src-one { display: inline-flex; align-items: center; gap: var(--sp-2); }
.cp-src-sep { opacity: .5; }
/* ✨ Η ΟΡΑΤΗ ΣΙΩΠΗ (05/09 δ): ίδια «ψιλή» γραμμή με τις πηγές — ΕΠΙΤΗΔΕΣ. Δεν είναι πρόταση, δεν έχει
   πράξη, και δεν επιτρέπεται να μοιάζει με κάρτα που περιμένει κάτι από τον χειριστή. */
.cp-none { align-items: center; row-gap: var(--sp-2); }

/* ---------------------------------------------------------------- ΤΟ ΡΑΦΙ ΤΗΣ ΣΚΙΑΣ (0088, 05/09)
   ΙΔΙΟ ΠΛΑΙΣΙΟ ΜΕ ΤΗΝ ΠΡΟΤΑΣΗ ΤΟΥ ✨ (`.cp-sug`) ΚΑΙ ΟΧΙ ΔΕΥΤΕΡΗ ΓΛΩΣΣΑ: είναι το ίδιο πράγμα — κείμενο
   που πρότεινε μηχανή και περιμένει ανθρώπινο tap. Δύο διαφορετικά κουτιά για την ίδια έννοια θα
   δίδασκαν τον χειριστή ότι το ένα από τα δύο «φεύγει μόνο του». Εδώ αλλάζει ΜΟΝΟ ό,τι επιβάλλει η
   θέση: στέκεται μόνο του στη στήλη (δεν έχει τα margin του composer γύρω του) και η γραμμή «δεν έχει
   σταλεί» δεν χρειάζεται δικό της κενό — το δίνει το `gap` του πλαισίου. */
.cp-draft .note-hint { margin-block: 0; }

/* ---------------------------------------------------------------- ΤΟ ΠΑΝΕΛ ΤΩΝ ΕΡΩΤΗΣΕΩΝ
   ΚΙΝΗΤΟ: φύλλο ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ — η απάντηση θέλει χώρο και το πληκτρολόγιο τρώει τη μισή οθόνη.
   ΓΡΑΦΕΙΟ: στήλη δεξιά, ώστε να μένει ορατό ΑΥΤΟ που ρωτήθηκε. */
.cp-wrap { position: fixed; inset: 0; z-index: 60; display: flex; justify-content: flex-end; }
.cp-back { position: absolute; inset: 0; background: var(--overlay); }
.cp-panel {
  position: relative; display: flex; flex-direction: column;
  width: 100%; max-width: 100%; height: 100%;
  background: var(--bg); border-inline-start: 1px solid var(--line); box-shadow: var(--shadow-strong);
}
.cp-head {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-5) var(--sp-6); border-block-end: 1px solid var(--line); flex: none;
}
.cp-x { font-size: var(--fs-xl); line-height: 1; }
.cp-log {
  flex: 1 1 auto; overflow-y: auto; padding: var(--sp-6);
  display: flex; flex-direction: column; gap: var(--sp-6);
}
.cp-q { padding: var(--sp-4) var(--sp-5); border-radius: var(--r); background: var(--card2); }
.cp-q-body { margin-block-start: var(--sp-2); white-space: pre-wrap; }
.cp-a { display: flex; flex-direction: column; gap: var(--sp-3); }
.cp-rich { display: flex; flex-direction: column; gap: var(--sp-4); line-height: var(--lh-text); }
.cp-rich p { margin: 0; }
.cp-rich ul { margin: 0; padding-inline-start: var(--sp-6); display: flex; flex-direction: column; gap: var(--sp-2); }
.cp-err {
  padding: var(--sp-4) var(--sp-5); border-radius: var(--r-s);
  background: var(--crit-soft); border-inline-start: 3px solid var(--crit); color: var(--ink);
}
.cp-form {
  flex: none; display: flex; gap: var(--sp-4); align-items: stretch;
  padding: var(--sp-5) var(--sp-6) 0; border-block-start: 1px solid var(--line);
}
.cp-input {
  flex: 1 1 auto; min-height: 52px; resize: vertical;
  padding: var(--sp-4) var(--sp-5); border-radius: var(--r);
  background: var(--card2); border: 1px solid var(--line); color: var(--ink);
  font-family: var(--font); font-size: var(--fs-m); line-height: var(--lh-text);
}
.cp-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.cp-go { min-height: 52px; flex: 0 0 auto; font-weight: var(--fw-semi); }
.cp-foot { flex: none; padding: var(--sp-3) var(--sp-6) var(--sp-6); margin: 0; }

/* ΟΙ ΠΟΡΤΕΣ ΤΗΣ ΑΠΑΝΤΗΣΗΣ (05/09): «Άνοιξε το νήμα ›», «Νέα κράτηση ›». ΚΑΤΩ από το κείμενο και ΠΑΝΩ
   από τη γραμμή κόστους — η σειρά είναι η ίδια με κάθε άλλη οθόνη του προϊόντος: τι έγινε, πού πάω,
   τι κόστισε. Τυλίγονται μόνες τους: στα 390 px δύο πόρτες δεν χωρούν δίπλα-δίπλα. */
.cp-doors { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.cp-door { text-align: start; }

/* ΤΟ ΙΣΤΟΡΙΚΟ ΤΩΝ ΔΙΚΩΝ ΜΟΥ ΕΡΩΤΗΣΕΩΝ (0110): κάθεται ΠΑΝΩ από το πεδίο γραφής, γιατί εκεί
   χρησιμοποιείται — ένα tap ξαναγράφει την ερώτηση στο πεδίο. Δικό του scroll και χαμηλό ταβάνι:
   δεν επιτρέπεται να σπρώξει το πεδίο και το κουμπί κάτω από το κάτω άκρο της οθόνης (το λάθος που
   κόστισε ένα μήνυμα την 04/09). */
.cp-hist {
  flex: none; max-height: 34vh; overflow-y: auto;
  display: flex; flex-direction: column; gap: var(--sp-2);
  padding: var(--sp-4) var(--sp-6) 0;
}
.cp-hist-row {
  text-align: start; padding: var(--sp-3) var(--sp-4); border-radius: var(--r-s);
  background: var(--card2); border: 1px solid var(--line); color: var(--ink);
  font-family: var(--font); font-size: var(--fs-s); line-height: var(--lh-text); cursor: pointer;
}
.cp-hist-row:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

@media (min-width: 720px) {
  .cp-panel { width: 460px; max-width: 92vw; }
}


/* ════════════════════════════════════════════════════════════════════════════════════════════════════
   ΟΙ ΕΚΚΡΕΜΟΤΗΤΕΣ ΤΟΥ ΝΗΜΑΤΟΣ (0087 — η οθόνη τους, 05/09)

   ΟΥΔΕΤΕΡΟ ΧΡΩΜΑ, ΕΠΙΤΗΔΕΣ. Το `--crit` σημαίνει ήδη «κάποιος περιμένει απάντηση» (πλακίδιο λίστας,
   κουκκίδα μενού, κάρτα στόλου) και το `--warn` «κάτι χρειάζεται προσοχή». Μια εκκρεμότητα τμήματος δεν
   είναι τίποτα από τα δύο: είναι ΟΡΓΑΝΩΣΗ ΔΟΥΛΕΙΑΣ, και ένα τρίτο κόκκινο στην ίδια οθόνη θα έκανε τα
   άλλα δύο να μη διαβάζονται (GUI_SPEC §2: μία σημασία, ένα χρώμα). Το ΤΙ είναι το λέει ο τίτλος
   «Εκκρεμεί» από πάνω· η ράχη δίνει μόνο το σχήμα, όπως στο χαρτάκι της σημείωσης.

   ΚΙΝΗΤΟ: κάθε εκκρεμότητα είναι ΜΙΑ στήλη (ποιος → τι → πράξεις), ποτέ γραμμή που στριμώχνει τρία
   πράγματα δίπλα-δίπλα στα 390 px. Τα κουμπιά δανείζονται τα `.cmp-acts` του composer, άρα έχουν ήδη
   ύψος ≥52 px και τυλίγονται μόνα τους — καμία οριζόντια κύλιση.
   ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.tk-row {
  display: flex; flex-direction: column; gap: var(--sp-3);
  padding: var(--sp-4); border-radius: var(--r-s);
  background: var(--neutral-soft); border-inline-start: 3px solid var(--line);
}
.tk-head { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
/* Το κομμάτι της ερώτησης που αφορά ΑΥΤΟ το τμήμα — αυτό είναι η αξία της ανάθεσης, όχι υποσημείωση. */
.tk-note { font-size: var(--fs-s); color: var(--ink); }
.tk-acts { margin-block-start: var(--sp-1); }
/* Ο επιλογέας «Σε ποιον;» παίρνει το μέγεθος ΚΥΡΙΟΥ κουμπιού: στο κινητό είναι ο στόχος αφής που
   ανοίγει το φύλλο επιλογής του browser, και ένα κοντό select δίπλα σε κουμπιά 52 px μοιάζει σπασμένο. */
.tk-pick { flex: 1 1 12rem; min-height: 52px; }


/* ════════════════════════════════════════════════════════════════════════════════════════════════════
   ΠΑΚΕΤΟ 03/09 — ΚΑΝΑΛΙ ΜΗΝΥΜΑΤΟΣ, ΠΡΟΘΕΣΜΙΕΣ, ΑΞΙΟΛΟΓΗΣΗ, «ΝΕΟ»
   ════════════════════════════════════════════════════════════════════════════════════════════════════
   ΣΦΡΑΓΙΣΜΕΝΗ ΠΡΟΣΘΗΚΗ, ΟΠΩΣ ΚΑΘΕ ΠΡΟΗΓΟΥΜΕΝΗ: κάθε κανόνας ξεκινά από `.cmp-`, `.dmg-`, `.rn-` ή
   `.new-`. Καμία υπάρχουσα γραμμή δεν αλλάζει, κανένα χρώμα δεν γράφεται με το χέρι — όλα από
   `tokens.css`, αλλιώς δεν αλλάζουν με το θέμα και λείπουν από το ένα από τα δύο. */

/* Η ΕΠΙΛΟΓΗ ΚΑΝΑΛΙΟΥ: chips ΠΑΝΩ από το πεδίο, με τον ίδιο σκελετό `.chip` που ξέρει ήδη ο χειριστής
   από τα φίλτρα. Δεύτερη εμφάνιση για «διάλεξε ένα από δύο» θα ήταν δεύτερο πράγμα να μάθει. */
.cmp-ch { margin-block-end: var(--sp-2); }

/* ---- Η ΠΙΕΣΗ ΤΗΣ ΠΡΟΘΕΣΜΙΑΣ: δύο τόνοι, οι ίδιοι με την αυλή. Κόκκινο = πέρασε, κεχριμπαρένιο = αύριο.
   Ένα τρίτο χρώμα για «έχει χρόνο» δεν υπάρχει επίτηδες: το ήσυχο δεν χρειάζεται σήμα. */
.dmg-due.late { background: var(--crit-soft); color: var(--crit); }
.dmg-due.soon { background: var(--warn-soft); color: var(--warn); }
/* Η αιτιολόγηση της προτεινόμενης προθεσμίας, κάτω από το πεδίο: διαβάζεται ΜΑΖΙ με την ημερομηνία. */
.dmg-due-why { margin-block-start: var(--sp-2); line-height: var(--lh-text); }

/* ---- ΑΝΑΞΙΟΛΟΓΗΤΗ ΖΗΜΙΑ: δικό της χρώμα κουκκίδας. ΔΕΝ δανείζεται το ήπιο («cosmetic») — το «δεν
   ξέρω ακόμα» δεν επιτρέπεται να μοιάζει με «ασήμαντο»: μπορεί να είναι ραγισμένο παρμπρίζ. */
.dmg-sev.triage { background: var(--muted); }

/* Η ΟΘΟΝΗ ΤΗΣ ΑΞΙΟΛΟΓΗΣΗΣ: η φωτογραφία είναι το ΜΕΓΑΛΥΤΕΡΟ πράγμα, γιατί είναι το μόνο δεδομένο που
   έχει ο τεχνικός. Μικρογραφία δίπλα σε δύο πεδία θα σήμαινε ότι κρίνει χωρίς να βλέπει. */
.dmg-assess-shot {
  width: 100%; max-height: 46vh; object-fit: contain; border-radius: var(--r-s);
  background: var(--card2); cursor: zoom-in;
}

/* ---- ΟΙ ΚΕΦΑΛΙΔΕΣ ΟΜΑΔΩΝ ΤΩΝ ΜΙΣΘΩΣΕΩΝ: κάνουν ΟΡΑΤΗ τη σειρά που ήδη υπάρχει.
 *
 * 🚨 ΔΥΟ ΣΦΑΛΜΑΤΑ ΠΟΥ ΖΟΥΣΑΝ ΜΑΖΙ, ΚΑΙ ΜΑΖΙ ΕΔΙΝΑΝ ΤΟ «ΚΑΜΙΑ ΣΤΟΙΧΙΣΗ» (05/09):
 *   α. Ο κόμβος ΔΕΝ ήταν ποτέ γραμμή. `align-items`/`gap` σε στοιχείο `display: block` δεν κάνουν
 *      απολύτως τίποτα — άρα η ετικέτα και το πλήθος έβγαιναν κολλητά, «Στον δρόμο τώρα6». Η κλάση
 *      `.row` μπήκε στο `rentals.js`· εδώ μένουν μόνο οι ΔΙΑΦΟΡΕΣ από αυτήν (βάση αντί για κέντρο,
 *      πιο σφιχτό κενό).
 *   β. Η κεφαλίδα ΙΣΑΠΕΙΧΕ από τη λίστα της και από την προηγούμενη (14 px και 20 px): ένας τίτλος που
 *      δεν είναι φανερά ΠΑΝΩ ΣΕ ΚΑΤΙ διαβάζεται ως αιωρούμενη λέξη. Το παλιό σχόλιο έλεγε «αρνητικό
 *      κενό δεν χρειάζεται — το `.rn-page` έχει ήδη gap»· ακριβώς αυτό το gap ήταν το πρόβλημα, γιατί
 *      εφαρμόζεται ΚΑΙ ΣΤΙΣ ΔΥΟ πλευρές. Τώρα: αέρας από πάνω, κολλητά από κάτω.
 * Και το `:first-of-type` έφυγε επειδή δεν έπιανε ποτέ: πρώτο `div` της σελίδας είναι η κεφαλίδα. */
.rn-group { align-items: baseline; gap: var(--sp-3);
            margin-block-start: var(--sp-6); margin-block-end: calc(-1 * var(--sp-3)); }
/* Η ετικέτα οργάνου κουβαλά περιθώριο για να στέκεται ΠΑΝΩ από κάρτα· μέσα σε γραμμή το περιθώριο αυτό
   είναι ένα κενό που κανείς δεν ζήτησε και ρίχνει τη βάση της από το πλήθος δίπλα της. */
.rn-group .inc-label { margin-block-end: 0; }
/* «Μόνο οι μισθώσεις του Atlas» + έξοδος με ένα tap. */
.rn-only { align-items: baseline; gap: var(--sp-3); }
/* Οι ζώνες/κρεβάτια κάτω από την επιλογή οχήματος στη «Νέα κράτηση». */
.rn-seats { margin-block-start: var(--sp-2); }
/* ΤΟ ΣΦΑΛΜΑ ΜΕΝΕΙ ΣΤΗΝ ΟΘΟΝΗ: ίδιο σχήμα με το `.cp-err` του βοηθού — φόντο, κόκκινο περίγραμμα
   αριστερά, κείμενο στο κανονικό χρώμα. Ένα toast που σβήνει σε τρία δευτερόλεπτα δεν είναι οδηγία. */
.rn-err {
  padding: var(--sp-4) var(--sp-5); border-radius: var(--r-s);
  background: var(--crit-soft); border-inline-start: 3px solid var(--crit); color: var(--ink);
}

/* ---- ΤΟ «ΝΕΟ» ΠΑΝΩ ΣΤΟ ✨: μικρό, πάνω δεξιά, χωρίς να μεγαλώσει τον στόχο αφής του κουμπιού.
 *
 * ΓΙΑΤΙ ΠΕΡΙΤΥΛΙΓΜΑ ΚΑΙ ΟΧΙ `position: relative` ΣΤΟ ΙΔΙΟ ΤΟ `.cp-btn`: εκείνη η κλάση ανήκει στο
 * τμήμα του βοηθού και οι προσθήκες εδώ είναι ΣΦΡΑΓΙΣΜΕΝΕΣ — δεν πειράζουμε κανόνα άλλης οθόνης για
 * να χωρέσει ένα κιτρινάκι. Το `.new-wrap` είναι δικό μας, και το ίδιο μοτίβο με το `.lang-wrap`.
 *
 * `pointer-events: none` ώστε το tap να φτάνει ΠΑΝΤΑ στο κουμπί — ένα badge που «τρώει» το κλικ είναι
 * ακριβώς ο τρόπος να μη σβήσει ποτέ. */
.new-wrap { position: relative; display: inline-flex; }
.new-dot {
  position: absolute; inset-block-start: -2px; inset-inline-end: -4px;
  padding: 0 4px; border-radius: 999px;
  background: var(--accent); color: var(--on-accent);
  font-size: 9px; font-weight: var(--fw-semi); line-height: 14px; letter-spacing: .04em;
  pointer-events: none;
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * ΡΟΛΟΙ ΚΑΙ ΚΑΤΗΓΟΡΙΕΣ ΕΡΓΑΣΙΩΝ (0082) — η οθόνη «Χρήστες» με δύο καρτέλες.
 *
 * ΤΟ ΚΡΙΤΗΡΙΟ ΕΙΝΑΙ ΤΑ 390 px: δεκατέσσερα κουτάκια με τίτλο ΚΑΙ εξήγηση το καθένα είναι η πιο πυκνή
 * λίστα του προϊόντος. Στο κινητό διαβάζονται μόνο αν κάθε κουτάκι είναι ΜΙΑ ΣΕΙΡΑ ΑΓΓΙΓΜΑΤΟΣ σε πλήρες
 * πλάτος (≥44 px), με το τετραγωνάκι αριστερά και το κείμενο να τυλίγεται δίπλα του — ποτέ από κάτω του.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.usr-tabs { margin-block-end: var(--sp-2); }

/* Ο επιλογέας χρώματος κατηγορίας: πλάτος ΟΣΟ ΤΟ ΠΕΡΙΕΧΟΜΕΝΟ (το γενικό `select { width: 100% }` θα τον
   έκανε να καταπίνει ολόκληρη τη γραμμή και θα έσπρωχνε τις πράξεις σε τρίτη σειρά). */
.usr-color { width: auto; max-width: 12rem; }

/* ---------------------------------------------------------------- 👥 ΟΙ ΟΜΑΔΕΣ ΤΟΥ ΑΝΘΡΩΠΟΥ (06/09)
 *
 * ΜΙΑ ΓΡΑΜΜΗ ΑΝΑ ΑΝΘΡΩΠΟ, ΟΣΕΣ ΟΜΑΔΕΣ ΘΕΛΕΙ. Καμία νέα γεωμετρία πλακιδίου (νόμος §4): η ομάδα ΕΙΝΑΙ
 * το υπάρχον `.pill` — ταυτότητα, όχι φίλτρο — και το × μέσα του είναι κουμπί χωρίς δικό του φόντο.
 * Το «+» ΕΙΝΑΙ κουμπί και όχι σύνδεσμος 12 px: με γάντια, ένα link μέσα σε πλακίδια δεν πατιέται.
 * Τυλίγουν μόνα τους (`flex-wrap`), άρα στα 390 px τρεις ομάδες γίνονται τρεις σειρές — όχι κύλιση. */
.usr-groups { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); min-width: 0; }
.usr-chip { min-block-size: 32px; max-inline-size: 100%; white-space: normal; }
.usr-chip-name { min-width: 0; overflow-wrap: anywhere; }
/* Το × ζει ΜΕΣΑ στο πλακίδιο: δικό του φόντο θα ήταν τρίτο σχήμα δίπλα σε `.pill` και `.chip`. */
.usr-chip-x {
  font: inherit; font-size: var(--fs-s); line-height: 1;
  min-inline-size: 24px; min-block-size: 24px; padding: 0;
  border: 0; border-radius: var(--r-pill); background: none; color: inherit; cursor: pointer;
}
/* ΤΟ ΚΟΚΚΙΝΟ ΤΗΣ ΑΝΑΚΛΗΣΗΣ ΔΕΝ ΧΑΘΗΚΕ, ΜΕΤΑΚΟΜΙΣΕ: ο κανόνας του σπιτιού λέει ότι η καταστροφική πράξη
   φαίνεται πριν πατηθεί. Σβηστό σε ηρεμία (δέκα κόκκινα × σε μια λίστα είναι θόρυβος, όχι προειδοποίηση)
   και ΚΡΙΣΙΜΟ μόλις το πλησιάσει το δάχτυλο ή το πληκτρολόγιο — η επιβεβαίωση λέει μετά το όνομα. */
.usr-chip-x:hover, .usr-chip-x:focus-visible { background: var(--crit-soft); color: var(--crit); }
.usr-group-add { min-width: 44px; min-height: 44px; padding: 0 var(--sp-4); line-height: 1; }
/* Η λίστα «σε ποια ομάδα ακόμα;»: πλήρες πλάτος κάτω από τα πλακίδια, με κουμπιά που πατιούνται.
   ΟΧΙ αιωρούμενο popover: στα 390 px θα κάθεται πάνω στη γραμμή που μόλις πάτησε ο χειριστής. */
.usr-pick { width: 100%; display: flex; flex-direction: column; gap: var(--sp-3); }
.usr-pick-one { min-block-size: 44px; }

/* Η γραμμή ενός ρόλου/κατηγορίας: ίδιος σκελετός με το `.usr-row` (ταυτότητα αριστερά, ενέργειες δεξιά,
   και οι δύο ομάδες τυλίγονται μόνες τους) — μία γλώσσα για όλες τις λίστες αυτής της οθόνης. */
.usr-role-row, .usr-type-row { flex-wrap: wrap; }

.usr-field { display: flex; flex-direction: column; gap: var(--sp-2); }
.usr-actions { gap: var(--sp-4); flex-wrap: wrap; }
.usr-actions button { flex: 1 1 12rem; }

.usr-perm-group + .usr-perm-group { margin-block-start: var(--sp-5); }
/* ΒΑΘΜΙΔΑ «ΜΙΚΡΟ-ΕΤΙΚΕΤΑ ΚΕΦΑΛΑΙΩΝ» (νόμος §2): ήταν `--fs-s`, δηλαδή ΙΣΟ με τον τίτλο της κάρτας από
   πάνω της — μια ομάδα κουτακιών φώναζε όσο η ενότητα που τη φιλοξενεί. */
.usr-perm-h {
  margin: 0 0 var(--sp-2); font-size: var(--fs-xs); font-weight: var(--fw-semi);
  text-transform: uppercase; letter-spacing: .06em; color: var(--muted);
}

/* ΤΟ ΚΟΥΤΑΚΙ: ολόκληρη η σειρά είναι στόχος αφής (είναι `<label>`, άρα το tap οπουδήποτε πάνω της
   γυρίζει τον διακόπτη). `align-items: flex-start` ώστε το τετραγωνάκι να μένει στη γραμμή του ΤΙΤΛΟΥ
   όταν η εξήγηση τυλίγεται σε δύο σειρές — αλλιώς «βουλιάζει» στο κέντρο και δεν διαβάζεται ως ζευγάρι. */
.usr-perm {
  display: flex; align-items: flex-start; gap: var(--sp-4);
  min-height: 44px; padding: var(--sp-3) var(--sp-2);
  border-radius: var(--r-s); cursor: pointer;
}
.usr-perm:hover { background: var(--hover); }
.usr-perm input { flex: none; width: 20px; height: 20px; margin-block-start: 2px; accent-color: var(--accent); }
.usr-perm-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.usr-perm-name { display: flex; align-items: center; gap: var(--sp-3); font-weight: var(--fw-med); }
.usr-perm-why { line-height: var(--lh-text); }
/* ΣΒΗΣΤΟ = «υπάρχει, αλλά δεν είναι δικό σου να το μοιράσεις» (φρουρός ανόδου δικαιωμάτων). ΟΧΙ
   κρυμμένο: ο διαχειριστής πρέπει να βλέπει ότι το δικαίωμα υπάρχει, αλλιώς θα το ψάχνει ή θα τηλεφωνεί. */
.usr-perm.locked { opacity: .5; cursor: not-allowed; }

/* Η ΚΟΥΚΚΙΔΑ ΧΡΩΜΑΤΟΣ ΚΑΤΗΓΟΡΙΑΣ. Πέντε tokens, ΚΑΝΕΝΑΣ κωδικός χρώματος: ό,τι διαλέγει ο πελάτης
   πρέπει να δουλεύει και στα δύο θέματα — ένας ωμός κωδικός χρώματος από color picker είναι τυφλωτικός στο ανοιχτό
   και αόρατο στο σκούρο, και τα δύο θέματα υπάρχουν και τα δύο χρησιμοποιούνται. */
.ty-dot { flex: none; width: 10px; height: 10px; border-radius: 50%; background: var(--muted); }
.ty-neutral { background: var(--muted); }
.ty-accent  { background: var(--accent); }
.ty-ok      { background: var(--ok); }
.ty-warn    { background: var(--warn); }
.ty-crit    { background: var(--crit); }
/* Το ίδιο token πάνω στο πλακίδιο της εργασίας (λίστα αυλής, timetable): απαλό φόντο + περίγραμμα, ώστε
   να ξεχωρίζει η κατηγορία χωρίς να φωνάζει πάνω από την κατάσταση («εκπρόθεσμη»), που είναι κόκκινη. */
.yd-task-pill.ty-accent { background: var(--accent-soft); }
.yd-task-pill.ty-ok     { background: var(--ok-soft); }
.yd-task-pill.ty-warn   { background: var(--warn-soft); }
.yd-task-pill.ty-crit   { background: var(--crit-soft); }
/* 📈 Η ΕΝΔΕΙΞΗ ΤΗΛΕΜΕΤΡΙΑΣ ΔΙΠΛΑ ΣΕ TICKBOX (0120): αριθμός σε στήλες σταθερού πλάτους, ώστε τρεις
   γραμμές με νούμερα να διαβάζονται ως στήλη και όχι ως ζιγκ-ζαγκ. Το χρώμα το δίνει το `pill on/warn`
   — εδώ μόνο η μορφή του αριθμού. */
.yd-reading { font-variant-numeric: tabular-nums; }

/* ════════ 📋 Η ΛΙΣΤΑ ΕΛΕΓΧΟΥ ΤΗΣ ΚΑΤΗΓΟΡΙΑΣ (0120)
   Ζει ΜΕΣΑ στην κάρτα των κατηγοριών, αμέσως κάτω από τη γραμμή της δικής της κατηγορίας. Η κάθετη
   γραμμή στην αρχή είναι η ΙΔΙΑ χειρονομία με το `.inline-edit`: «αυτό που βλέπεις ανήκει στη γραμμή
   από πάνω». Χωρίς αυτήν, οκτώ γραμμές πρωτοκόλλου διαβάζονται ως νέα, ανεξάρτητη λίστα. */
.usr-check-panel {
  border-inline-start: 3px solid var(--line);
  padding: var(--sp-3) 0 var(--sp-4) var(--sp-4);
  margin-block-end: var(--sp-3);
}
.usr-check-panel > p { margin: 0; }
.usr-check-row { flex-wrap: wrap; gap: var(--sp-3); }
.usr-check-tags { gap: var(--sp-3); }
.usr-check-btn.active { border-color: var(--accent); color: var(--accent); }
/* ΤΑ ΒΕΛΑΚΙΑ ΕΙΝΑΙ ΣΤΟΧΟΙ ΑΦΗΣ, ΟΧΙ ΕΙΚΟΝΙΔΙΑ: 44 px ακόμα κι όταν το κείμενό τους είναι ένας
   χαρακτήρας — αλλιώς ο υπεύθυνος που ταξινομεί τη λίστα από tablet πατά τρεις φορές το ίδιο. */
.usr-move { min-width: 44px; min-height: 44px; }
/* Τα δύο νούμερα του εύρους δίπλα στον επιλογέα μετρικής: στενά επίτηδες, ώστε να χωρούν στην ίδια
   σειρά στο γραφείο και να τυλίγονται μόνα τους στα 390 px. */
.usr-num { width: auto; max-width: 7rem; }
.usr-check-form { width: 100%; min-width: 0; }
.usr-check-form input:not([type='checkbox']), .usr-check-form select, .usr-check-form button {
  min-height: 44px;
}

@media (max-width: 719px) {
  .usr-role-row > *, .usr-type-row > * { flex-basis: 100%; }
  .usr-color { max-width: none; flex: 1 1 auto; }
  /* ΣΤΟ ΚΙΝΗΤΟ ΤΑ ΠΛΑΚΙΔΙΑ ΠΙΑΝΟΝΤΑΙ ΜΕ ΓΑΝΤΙ: το πλακίδιο ψηλώνει και το × γίνεται πραγματικός
     στόχος αφής. Στο γραφείο (ποντίκι) μένει διακριτικό — ο κανόνας του δαχτύλου δεν ισχύει εκεί. */
  .usr-chip { min-block-size: 40px; }
  .usr-chip-x { min-inline-size: 32px; min-block-size: 32px; }
  /* Στο κινητό η λίστα ελέγχου παίρνει όλο το πλάτος και τα νούμερα του εύρους μοιράζονται τη σειρά. */
  .usr-check-panel { padding-inline-start: var(--sp-3); }
  .usr-num { max-width: none; flex: 1 1 6rem; }
  /* Στο κινητό η εξήγηση κάθε δικαιώματος ΜΕΝΕΙ: είναι ο λόγος που ο διαχειριστής ξέρει τι τικάρει.
     Ό,τι κόβεται είναι το padding, όχι το νόημα. */
  .usr-perm { padding: var(--sp-3) 0; }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * ΜΗΝΥΜΑΤΑ (03/09) — η λίστα «Chats» και το νήμα δίπλα της (Vassilis: «κάνε το WhatsApp style»)
 *
 * ΤΟ ΝΗΜΑ ΔΕΝ ΕΧΕΙ CSS ΕΔΩ: οι φυσαλίδες, οι διαχωριστές ημέρας και η φόρμα είναι οι ΙΔΙΕΣ κλάσεις
 * (`.conv*`, `.cmp*`) με την καρτέλα μίσθωσης και τη σελίδα οχήματος. Ό,τι γράφεται εδώ αφορά ΜΟΝΟ τη
 * λίστα και την κεφαλίδα — δηλαδή ό,τι δεν υπήρχε πουθενά αλλού.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.msg-page { display: grid; gap: var(--sp-5); align-items: start; }
.msg-one { grid-template-columns: minmax(0, 1fr); }
/* ΣΤΟ ΓΡΑΦΕΙΟ ΔΥΟ ΣΤΗΛΕΣ, ΜΕ ΤΗ ΛΙΣΤΑ ΣΤΑΘΕΡΗ: διαβάζεις μια κουβέντα και οι υπόλοιπες μένουν στο μάτι.
   Το σκαλοπάτι (900 px) είναι ΤΟ ΙΔΙΟ με το `WIDE_PX` του `messages.js` — αλλιώς θα υπήρχε πλάτος όπου
   η JS ζωγραφίζει «κινητό» και το CSS στοιχίζει «γραφείο». */
.msg-split { grid-template-columns: minmax(0, 23rem) minmax(0, 1fr); }
.msg-list { display: flex; flex-direction: column; gap: var(--sp-3); min-width: 0; }
.msg-split .msg-list {
  position: sticky; inset-block-start: 84px;
  max-block-size: calc(100vh - 104px); overflow-y: auto;
}
.msg-search { max-width: none; }
.msg-filters { margin-block-end: 0; }
.msg-rows { display: flex; flex-direction: column; gap: var(--sp-3); }

/* Η ΓΡΑΜΜΗ: ΟΛΟΚΛΗΡΗ στόχος αφής (≥64 px — δύο σειρές κειμένου), ίδιο μέτρο με τη λίστα μισθώσεων. */
.msg-row {
  display: flex; align-items: center; gap: var(--sp-4);
  width: 100%; min-block-size: 64px;
  padding: var(--sp-4) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r);
  font: inherit; color: inherit; text-align: start; cursor: pointer;
}
.msg-row:hover { filter: none; border-color: var(--accent); }
.msg-row.active { border-color: var(--accent); background: var(--card2); }
/* Περασμένη μίσθωση = ιστορικό: φαίνεται, δεν φωνάζει (ίδιο μέτρο με το `.inc-row.closed`). */
.msg-row.past { opacity: .62; }
.msg-row.past:hover { opacity: 1; }
.msg-row-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-1); }
.msg-row-top { display: flex; align-items: baseline; gap: var(--sp-3); }
.msg-name {
  flex: 1; min-width: 0; font-weight: var(--fw-semi); font-size: var(--fs-s);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Η ώρα/μέρα δεν επιτρέπεται να φάει το όνομα: το «Παρασκευή 29/08» είναι μακρύ και στα 390 px θα
   έσπρωχνε τον «Χ» σε τρία γράμματα. Παίρνει όσο χρειάζεται, με ταβάνι. */
.msg-when {
  flex: none; font-size: var(--fs-xs); max-inline-size: 8rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.msg-row-bot { display: flex; align-items: center; gap: var(--sp-3); min-width: 0; }
.msg-code { flex: none; }
/* Το τελευταίο μήνυμα σε ΜΙΑ γραμμή: η λίστα υπάρχει για να ΔΙΑΛΕΞΕΙΣ, όχι για να διαβάσεις. */
.msg-last {
  flex: 1; min-width: 0; font-size: var(--fs-s); color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Το ταίριασμα της αναζήτησης δεν είναι «το τελευταίο που ειπώθηκε»: γράφεται με το κανονικό μελάνι
   ώστε να φαίνεται ότι ΑΥΤΟ βρέθηκε — αλλιώς ο χειριστής ρωτά «γιατί βγήκε αυτή η συνομιλία;». */
.msg-last.hit { color: var(--ink); }
.msg-tick { flex: none; font-size: var(--fs-xs); color: var(--muted); }
/* ΤΟ ✨ ΤΗΣ ΓΡΑΜΜΗΣ («υπάρχει έτοιμη απάντηση», 0088): ΔΙΑΚΡΙΤΙΚΟ ΚΑΙ ΑΜΕΤΑΚΙΝΗΤΟ. Δεν συρρικνώνεται
   ποτέ (`flex: none`) γιατί το διπλανό κείμενο του μηνύματος παίρνει όλο τον χώρο και θα το έλιωνε· και
   δεν παίρνει χρώμα κατάστασης — δεν είναι «επείγον», είναι «εδώ θα τελειώσεις γρήγορα». */
.msg-draft { flex: none; font-size: var(--fs-s); }
/* 🚨 ΤΟ ΔΙΠΛΟ ΤΣΕΚ ΕΙΝΑΙ ΚΑΤΑΣΤΑΣΗ — ΚΑΙ Η ΚΑΤΑΣΤΑΣΗ ΔΕΝ ΒΑΦΕΤΑΙ ΠΟΤΕ ΜΕ ΤΟ ΧΡΩΜΑ ΤΗΣ ΤΑΥΤΟΤΗΤΑΣ
   (νόμος §7, γραμμένος μέσα στο ίδιο το token). Ήταν `--accent`, δανεισμένο από το μπλε του WhatsApp:
   δηλαδή στην ίδια γραμμή το ΙΔΙΟ μπλε σήμαινε «πάτησέ με» (κωδικός οχήματος, πόρτα) και «διαβάστηκε».
   Το «έφτασε/διαβάστηκε» είναι καλή είδηση: το λέει ο τόνος της, `--ok`. */
.msg-tick.seen { color: var(--ok); }
.msg-tick.bad { color: var(--crit); font-weight: var(--fw-med); }
.msg-who { flex: none; }
/* ΤΟ ΠΛΑΚΙΔΙΟ ΤΩΝ ΑΝΑΠΑΝΤΗΤΩΝ: ΣΧΗΜΑ του WhatsApp, ΧΡΩΜΑ του προϊόντος (`--crit`, το ίδιο με την
   κουκκίδα του μενού και την κάρτα στόλου). Πράσινο εδώ θα σήμαινε «όλα καλά» σε μια οθόνη που λέει
   «κάποιος περιμένει» — και θα ήταν τέταρτο χρώμα για την ίδια έννοια. */
.msg-badge {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  min-inline-size: 1.35rem; block-size: 1.35rem; padding-inline: .35rem;
  border-radius: var(--r-pill);
  background: var(--crit); color: var(--card);
  font-size: var(--fs-xs); font-weight: var(--fw-bold); line-height: 1;
}

/* ---- ΤΟ AVATAR: αρχικά σε κύκλο, ΕΝΑ χρώμα και έξι στροφές απόχρωσης.
   ΓΙΑΤΙ `hue-rotate` ΚΑΙ ΟΧΙ ΠΑΛΕΤΑ ΑΠΟ HEX: ο κανόνας του σπιτιού είναι ότι ΚΑΝΕΝΑ χρώμα δεν ζει έξω
   από το `tokens.css` (το φυλάει test). Έξι νέα hex εδώ θα ήταν έξι χρώματα που δεν ξέρουν από θέμα.
   Έτσι, το χρώμα είναι πάντα το `--accent` της ταυτότητας — αλλάζει μόνο η γωνία, και ακολουθεί μόνη
   της το ανοιχτό/σκούρο θέμα. ΟΙ ΓΩΝΙΕΣ ΜΕΝΟΥΝ ΣΤΗΝ ΨΥΧΡΗ ΖΩΝΗ (πράσινο → μπλε → βιολετί): μια στροφή
   ως το κόκκινο θα έβαφε ένα πρόσωπο σαν συναγερμό. */
.av {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  inline-size: 40px; block-size: 40px; border-radius: var(--r-pill);
  background: var(--accent-soft); color: var(--accent);
  font-size: var(--fs-s); font-weight: var(--fw-semi); letter-spacing: .02em;
}
.av-lg { inline-size: 46px; block-size: 46px; font-size: var(--fs-m); }
.av.t1 { filter: hue-rotate(-35deg); }
.av.t2 { filter: hue-rotate(-70deg); }
.av.t3 { filter: hue-rotate(-105deg); }
.av.t4 { filter: hue-rotate(30deg); }
.av.t5 { filter: hue-rotate(60deg); }

/* ---- Η κεφαλίδα του νήματος: ποιος, με ποιο όχημα, και ο δρόμος προς τα συμφραζόμενα. */
.msg-thread { display: flex; flex-direction: column; gap: var(--sp-5); min-width: 0; }
.msg-head {
  display: flex; align-items: center; gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r);
}
.msg-head-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.msg-head-name {
  font-weight: var(--fw-semi); font-size: var(--fs-l);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Το «πίσω» του κινητού: 44 px στόχος αφής, χωρίς φόντο — το μελάνι δηλώνεται ρητά (κανόνας του σπιτιού:
   σβήνεις το φόντο ⇒ ξαναδηλώνεις το μελάνι). */
.msg-back {
  display: inline-flex; align-items: center; justify-content: center;
  min-inline-size: 44px; min-block-size: 44px; padding: 0;
  background: none; border: 0; border-radius: var(--r-s);
  color: var(--ink); cursor: pointer;
}
.msg-back:hover { filter: none; background: var(--hover); color: var(--ink); }
.msg-go {
  flex: none;
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-block-size: 44px; padding: var(--sp-2) var(--sp-4);
  background: none; border: 0; border-radius: var(--r-s);
  color: var(--accent); font-weight: var(--fw-med); cursor: pointer;
}
.msg-go:hover { filter: none; background: var(--accent-soft); color: var(--accent); }
.msg-caret { display: inline-flex; flex: none; transform: rotate(180deg); }
.msg-empty { border: 1px dashed var(--line); border-radius: var(--r); }
/* Η παραπομπή των Συμβάντων προς αυτή την οθόνη: chip που ΦΕΥΓΕΙ, γι' αυτό κουβαλά βελάκι. */
.inc-to-msg { display: inline-flex; align-items: center; gap: var(--sp-2); }

@media (max-width: 899px) {
  /* ΚΙΝΗΤΟ: μία στήλη, καμία κολλημένη λίστα — η οθόνη είναι ΜΙΑ κάθε φορά (λίστα Ή νήμα). */
  .msg-split { grid-template-columns: minmax(0, 1fr); }
  .msg-split .msg-list { position: static; max-block-size: none; overflow: visible; }
}

/* ---------------------------------------------------------------- Ρυθμίσεις hub (Ο0, 04/09)
 *
 * ΤΟ ΠΡΟΒΛΗΜΑ: δεκατρείς ενότητες σε μία σελίδα. Στο γραφείο τη σώζει η στήλη (`.set`, πιο πάνω — ΔΕΝ
 * ξαναγράφεται εδώ)· στο κινητό γινόταν μια σειρά από chips πάνω από μια φόρμα, δηλαδή δεκατρία
 * ουσιαστικά χωρίς εξήγηση και μια φόρμα που δεν ξέρεις γιατί άνοιξε.
 *
 * Η ΛΥΣΗ ΕΙΝΑΙ Η ΓΡΑΜΜΗ: όνομα, μία φράση «τι θα βρεις μέσα», βελάκι — ΟΛΟΚΛΗΡΗ στόχος αφής. Ίδιο μέτρο
 * με τη λίστα συνομιλιών (`.msg-row`) και με τη λίστα μισθώσεων: ο χειριστής μαθαίνει ΕΝΑ σχήμα λίστας.
 *
 * ΤΟ ΣΚΑΛΟΠΑΤΙ (900 px) ΕΙΝΑΙ ΤΟ ΙΔΙΟ με το `WIDE_PX` του `settings.js` — και δεν γράφεται εδώ ως media
 * query: ΤΗ ΔΙΑΤΑΞΗ ΤΗΝ ΕΠΙΛΕΓΕΙ Η JS (hub Ή ενότητα, ποτέ και τα δύο), οπότε το CSS ντύνει ό,τι
 * ζωγραφίστηκε. Δύο νούμερα θα σήμαιναν πλάτος όπου η JS νομίζει «κινητό» και το CSS στοιχίζει «γραφείο».
 */
.stg-hub { display: flex; flex-direction: column; gap: var(--sp-5); }
/* ≥44 px ΣΤΟΧΟΣ ΑΦΗΣ (μνήμη 02/09: οι οθόνες πεδίου δουλεύονται όρθιος, με το κινητό στο ένα χέρι) —
   56 px επειδή η γραμμή έχει δύο σειρές κειμένου, όχι μία. */
.stg-hub-row {
  display: flex; align-items: center; gap: var(--sp-4);
  width: 100%; min-block-size: 56px;
  padding: var(--sp-4) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r);
  font: inherit; color: inherit; text-align: start; cursor: pointer;
}
.stg-hub-row:hover { filter: none; border-color: var(--accent); }
.stg-hub-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-1); }
.stg-hub-name { font-weight: var(--fw-semi); }
.stg-hub-desc { color: var(--muted); font-size: var(--fs-s); }
.stg-hub-go { flex: none; display: inline-flex; color: var(--muted); transform: rotate(180deg); }

/* Η ΚΕΦΑΛΙΔΑ ΤΗΣ ΥΠΟ-ΣΕΛΙΔΑΣ ΣΤΟ ΚΙΝΗΤΟ: ο δρόμος πίσω ΠΑΝΩ από τον τίτλο, με το όνομα του προορισμού
   δίπλα στο βέλος — ένα σκέτο εικονίδιο στην κορυφή δεν λέει πού πας. Στο γραφείο δεν υπάρχει: εκεί η
   στήλη των ενοτήτων είναι μονίμως στο μάτι, και ένα «πίσω» θα ήταν κουμπί που δεν κάνει τίποτα. */
/* Η κεφαλίδα της υπο-σελίδας παίρνει και αυτή τη ΤΡΙΧΑ του νόμου §1: είναι κεφαλίδα σελίδας, απλώς με
   τον δρόμο πίσω από πάνω. Χωρίς αυτήν, ο τίτλος της ενότητας αιωρούνταν πάνω από την πρώτη κάρτα. */
.stg-side-head { display: flex; flex-direction: column; gap: var(--sp-2);
                 padding-block-end: var(--sp-5); margin-block-end: var(--sp-6);
                 border-block-end: 1px solid var(--line); }
.stg-side-head h1 { margin: 0; }
/* Η επιστροφή της υπο-σελίδας ΕΙΝΑΙ το κοινό `.back-link` — ίδιο σχήμα με κάθε άλλη οθόνη (ήταν το
   μόνο «πίσω» βαμμένο accent). Εδώ μένει ΜΟΝΟ το μέτρο του δαχτύλου, και μένει επίτηδες: ο φρουρός
   αυτής της οθόνης (`test_gui_settings_hub`) μετρά τον στόχο αφής ΕΔΩ, δηλαδή πάνω σε ό,τι ζωγραφίζει
   ΑΥΤΗ η σελίδα — κι έτσι θα τον πιάσει ακόμα κι αν αύριο κάποιος ελαφρύνει το κοινό. */
.stg-side-back { min-block-size: 44px; }

/* 🖼 ΤΑΥΤΟΤΗΤΑ: Η ΠΡΟΕΠΙΣΚΟΠΗΣΗ ΤΟΥ ΛΟΓΟΤΥΠΟΥ (0127)
   ΤΟ ΚΟΥΤΙ ΕΧΕΙ ΤΟ ΦΟΝΤΟ ΤΟΥ ΧΑΡΤΙΟΥ (`--card`) ΚΑΙ ΟΧΙ ΤΟ ΘΕΜΑ ΤΗΣ ΟΘΟΝΗΣ: ο διαχειριστής πρέπει να
   δει ΕΔΩ αυτό που θα δει στον εκτυπωτή — ένα λογότυπο με διαφάνεια, φτιαγμένο για λευκό, εξαφανίζεται
   πάνω σε σκούρο θέμα και θα το ανέβαζε ξανά και ξανά νομίζοντας ότι κάτι χάλασε.
   ΥΨΟΣ ΣΤΑΘΕΡΟ, ΠΛΑΤΟΣ ΕΛΕΥΘΕΡΟ, `contain`: ίδιος κανόνας με τη μπάρα και το χαρτί — κανένα λογότυπο
   δεν κόβεται, όποια αναλογία κι αν έχει. */
.stg-logo-box {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--sp-5);
  min-block-size: 96px;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r-s);
}
.stg-logo-img { max-height: 72px; max-width: 100%; object-fit: contain; display: block; }
/* Το πεδίο αρχείου είναι ΑΟΡΑΤΟ αλλά ΥΠΑΡΚΤΟ (το πατά το κουμπί δίπλα του) — ίδια τεχνική με το
   `.ho-file` του πρωτοκόλλου: `display: none` θα το έβγαζε από το accessibility tree σε κάποιους
   browsers, ενώ εδώ μένει ζωντανό και προσβάσιμο. */
.stg-file { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * ΙΔΙΟΚΤΗΤΕΣ (Ο1, 04/09) — Η ΔΕΥΤΕΡΗ ΚΑΡΤΕΛΑ ΤΩΝ ΜΗΝΥΜΑΤΩΝ ΚΑΙ ΤΟ ΜΗΤΡΩΟ ΤΩΝ ΡΥΘΜΙΣΕΩΝ
 *
 * ΚΑΝΕΝΑ ΝΕΟ ΣΧΗΜΑ, ΚΑΝΕΝΑ ΝΕΟ ΧΡΩΜΑ: το νήμα, οι φυσαλίδες, ο composer, οι γραμμές της λίστας και τα
 * chips είναι ΤΑ ΙΔΙΑ με του ενοικιαστή (`.conv-*`, `.msg-*`, `.cmp-*`, `.chip`) — μία υλοποίηση, δύο
 * κόσμοι. Ό,τι υπάρχει εδώ είναι ΜΟΝΟ τα τρία πράγματα που δεν υπάρχουν στην άλλη πλευρά: ποιος μίλησε
 * μέσα σε μια παρέα, σε ποιους έφτασε, και για ποιο όχημα.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* Οι δύο καρτέλες, πάνω από τη λίστα. Ίδιο `chip` με κάθε άλλο φίλτρο της εφαρμογής — δεν είναι νέο
   στοιχείο, είναι η υπάρχουσα επιλογή σε νέα θέση. */
.own-tabs { margin-block-end: var(--sp-3); }
/* Το πλακίδιο των αναπάντητων ΜΕΣΑ στην καρτέλα: το ίδιο `--crit` με την κουκκίδα του μενού και με το
   πλακίδιο της γραμμής (§2: μία σημασία, ένα χρώμα). */
.own-tab-badge { margin-inline-start: var(--sp-2); }

/* ΠΟΙΟΣ ΜΙΛΑΕΙ, όταν στην απέναντι πλευρά κάθονται δύο άνθρωποι. Μικρό, πάνω από τη φούσκα και στην
   ίδια στοίχιση με αυτήν — όχι μέσα της: η φούσκα είναι τα λόγια του, όχι το όνομά του. */
.own-from { padding-inline: var(--sp-3); margin-block-end: 2px; font-weight: var(--fw-med); }

/* ΟΙ ΑΠΟΔΕΙΞΕΙΣ ΤΟΥ FAN-OUT: «Νίκος ✓ · Βασίλης ✓✓» / «προωθήθηκε σε Βασίλη ✓». Υποσημείωση κάτω από
   τη φυσαλίδα, με το ίδιο περιθώριο που έχει ήδη η γραμμή ανάληψης (`.conv-ack`) — δύο διαφορετικά
   περιθώρια για δύο υποσημειώσεις της ίδιας φυσαλίδας θα διαβάζονταν σαν λάθος. */
.own-receipts { padding-inline: var(--sp-3); margin-block-start: 2px; }
.conv-row.out .own-receipts { text-align: end; }

/* Το chip του οχήματος μέσα στο υποσέλιδο της φυσαλίδας: ΠΛΑΙΣΙΟ, όχι τίτλος — γι' αυτό μένει στο
   μέγεθος του υποσέλιδου και δεν διεκδικεί το μάτι πριν από το κείμενο. */
.own-veh { font-size: var(--fs-xs); }

/* Ο επιλογέας οχήματος του composer: μία γραμμή πάνω από το πεδίο, ετικέτα + λίστα. Ο επιλογέας
   παίρνει ό,τι μένει (`flex: 1`) ώστε στα 390 px ο κωδικός να μη κόβεται στη μέση. */
.own-veh-row { display: flex; align-items: center; gap: var(--sp-3); margin-block-end: var(--sp-3); }
.own-veh-pick { flex: 1; min-width: 0; }

/* Κάθε γλώσσα του fan-out ως δικό της μπλοκ μέσα στην προεπισκόπηση, με το ίδιο περίγραμμα accent που
   έχει ήδη το «ό,τι θα φύγει» (`.cmp-side.out`). */
.own-target + .own-target { margin-block-start: var(--sp-3); }

/* ---- ΤΟ ΜΗΤΡΩΟ ΣΤΙΣ ΡΥΘΜΙΣΕΙΣ (γραφείο, desktop άνετο — ΟΧΙ οθόνη πεδίου) */
/* Οι γραμμές ιδιοκτητών/ομάδων: υπάρχουσα `.row` με διαχωριστικό, ώστε δέκα επαφές να διαβάζονται ως
   λίστα και όχι ως τοίχος κειμένου. */
.own-list > .row + .row { border-block-start: 1px solid var(--line); padding-block-start: var(--sp-3); }
/* Η φόρμα ανοίγει ΣΤΗ ΘΕΣΗ ΤΗΣ ΓΡΑΜΜΗΣ, ΜΕΣΑ στη λίστα — ο νόμος της θέσης (`settings.js`, 05/09):
   η απόκριση εμφανίζεται εκεί που έγινε η ενέργεια. Ως σήμερα άνοιγε κάτω από την κάρτα, δηλαδή
   εκτός οθόνης, και ο ιδιοκτήτης ξαναπατούσε νομίζοντας ότι το κουμπί δεν κάνει τίποτα. */
.own-form { margin-block-start: var(--sp-3); }

/* ΤΟ ΠΕΡΙΒΛΗΜΑ ΤΗΣ ΦΟΡΜΑΣ ΠΟΥ ΠΗΡΕ ΤΗ ΘΕΣΗ ΜΙΑΣ ΓΡΑΜΜΗΣ. Δεν είναι νέο είδος κάρτας: είναι η ίδια
   `.own-form` μέσα στη λίστα, με μια accent ένδειξη στο πλάι ώστε το μάτι να δει ΑΜΕΣΩΣ ποια γραμμή
   άνοιξε — αλλιώς, με δώδεκα extras, η φόρμα μοιάζει να ήρθε από το πουθενά.
   `min-width: 0` και πλήρες πλάτος: στα 390 px παίρνει ό,τι έχει η λίστα, χωρίς οριζόντια κύλιση. */
.inline-edit { width: 100%; min-width: 0; border-inline-start: 3px solid var(--accent);
               padding-inline-start: var(--sp-3); }
/* ΜΗΔΕΝ ΠΕΡΙΘΩΡΙΟ: μέσα στη λίστα η απόσταση τη δίνει το `gap` του `.stack` — το `margin-block-end`
   της `.card` θα άνοιγε δεύτερο κενό ακριβώς κάτω από τη φόρμα, σαν να τελείωσε η λίστα εκεί. */
.inline-edit > .own-form { margin: 0; }
/* Στόχος αφής με γάντι μέσα στη φόρμα (44 px, ο ίδιος κανόνας με `.dev-acts` και `.usr-link-x`): η
   «Αποθήκευση» και το «Άκυρο» πατιούνται τώρα στη ΜΕΣΗ της λίστας, με γραμμές από πάνω και από κάτω —
   ένα κουμπί 34 px εκεί είναι λάθος πάτημα, όχι απλώς άβολο. Έξω τα κουτάκια: το `width: auto` τους
   (γρ. 456) θα γινόταν ψηλόλιγνο ορθογώνιο, και ο στόχος τους είναι ΟΛΗ η ετικέτα τους ούτως ή άλλως. */
.inline-edit button,
.inline-edit select,
.inline-edit input:not([type='checkbox']):not([type='radio']) { min-height: 44px; }
/* Το διαχωριστικό της λίστας δεν χάνεται επειδή παρεμβλήθηκε φόρμα ανάμεσα σε δύο γραμμές. */
.own-list > .inline-edit + .row { border-block-start: 1px solid var(--line); padding-block-start: var(--sp-3); }
/* Τα κουτάκια των μελών: μία επιλογή ανά γραμμή, στόχος αφής ολόκληρη η ετικέτα. */
.own-picks { gap: var(--sp-2); }
.own-pick { cursor: pointer; }

/* ---- ❓ ΟΙ ΣΥΧΝΕΣ ΕΡΩΤΗΣΕΙΣ ΤΗΣ ΚΡΑΤΗΣΗΣ (0129): σειρά με ΣΥΡΣΙΜΟ, πεδία ανά γλώσσα κρυμμένα
   Οθόνη ΓΡΑΦΕΙΟΥ (desktop άνετο), όχι πεδίου: το σύρσιμο είναι native HTML5 dnd — και γι' αυτό ΔΙΠΛΑ
   του υπάρχουν πάντα τα βελάκια ↑↓ (κινητό/πληκτρολόγιο, βλ. `settings.js`). */
.faq-row { cursor: grab; align-items: flex-start; }
/* Η ΛΑΒΗ ΕΙΝΑΙ ΣΗΜΑΝΣΗ, ΟΧΙ ΚΟΥΜΠΙ: λέει «πιάσε με», ενώ σέρνεται ΟΛΗ η γραμμή (μεγαλύτερος στόχος).
   `pointer-events: none` ώστε να μη μοιάζει ποτέ με κουμπί που δεν κάνει τίποτα. */
.faq-grip { color: var(--muted); flex: none; padding-block-start: 2px; pointer-events: none; }
.faq-main { min-width: 0; }
/* Η γραμμή που σέρνεται ξεθωριάζει (το «την κρατάω»), ο στόχος δείχνει ΠΟΥ θα πέσει με γραμμή accent
   στην κορυφή του — όχι πλαίσιο γύρω-γύρω, που διαβάζεται ως «επιλεγμένο» και όχι ως «εδώ». */
.faq-dragging { opacity: .45; }
.faq-over { box-shadow: inset 0 3px 0 0 var(--accent); }
.faq-nudge { min-width: 34px; }
/* Τα πεδία ανά γλώσσα: ΚΡΥΜΜΕΝΑ ως προεπιλογή (ο ιδιοκτήτης δεν θέλει να τα βλέπει), και όταν ανοίγουν
   ξεχωρίζουν ως δικά τους μπλοκ — αλλιώς δώδεκα πεδία στη σειρά είναι ένας τοίχος. */
.faq-auto { margin-block-start: var(--sp-2); }
.faq-langs { margin-block-start: var(--sp-2); }
.faq-lang { display: grid; gap: var(--sp-2); padding: var(--sp-3);
            border: 1px solid var(--line); border-radius: var(--r-2, 10px); }
.faq-lang textarea, .faq-lang input { width: 100%; }

/* ---------------------------------------------------------------- Σύνδεσμος εισόδου χρήστη (04/09)
   Ό,τι χρειάζεται ένα πλαίσιο που ανοίγει ΚΑΤΩ από τη γραμμή ενός ανθρώπου και δίνει ένα κλειδί μιας
   χρήσης — τίποτα παραπάνω. Δεν είναι νέο είδος κάρτας: είναι η υπάρχουσα `.card` με πλήρες πλάτος
   μέσα στη λίστα, ώστε στα 390 px ο σύνδεσμος να χωρά ολόκληρος και να πιάνεται με ένα tap. */
.usr-link-box { width: 100%; display: flex; flex-direction: column; gap: var(--sp-3); }
.usr-link-head { align-items: center; justify-content: space-between; gap: var(--sp-3); }
/* Το × είναι στόχος αφής, όχι διακοσμητικό: 44 px ο κανόνας του δαχτύλου, ίδιος με τις κουκκίδες του γύρου. */
.usr-link-x { min-width: 44px; min-height: 44px; line-height: 1; font-size: var(--fs-l); }
/* Ο ίδιος ο σύνδεσμος: ΟΛΟΚΛΗΡΟΣ και επιλέξιμος. `text-overflow` θα έκρυβε ακριβώς το κομμάτι που
   μετράει (τον κωδικό στο τέλος) — εδώ προτιμάται μεγάλο πεδίο από όμορφη γραμμή. */
.usr-link-url { width: 100%; min-width: 0; }
.usr-link-warn { align-self: flex-start; white-space: normal; }
/* Το κουμπί της γραμμής («Σύνδεσμος εισόδου») μένει δίπλα στα υπόλοιπα· στα στενά πηγαίνει στη σειρά
   του με τα ίδια περιθώρια που έχει ήδη η `.usr-meta` — καμία νέα διάταξη, μόνο στόχος αφής. */
.usr-link-btn { min-height: 44px; }

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * ΟΔΗΓΟΣ ΛΕΙΤΟΥΡΓΙΩΝ (κζ, 04/09) — Η ΜΟΝΗ ΣΕΛΙΔΑ ΠΟΥ ΔΙΑΒΑΖΕΤΑΙ ΑΝΤΙ ΝΑ ΧΕΙΡΙΖΕΤΑΙ
 *
 * ΚΑΝΕΝΑ ΝΕΟ ΧΡΩΜΑ, ΚΑΝΕΝΑ ΝΕΟ ΣΧΗΜΑ: τα πλακίδια ημερομηνίας είναι τα υπάρχοντα `.pill.accent`, οι
 * σκιές και οι γραμμές τα ίδια tokens με τις κάρτες. Ό,τι υπάρχει εδώ κάτω αφορά ΜΟΝΟ αυτό που δεν
 * υπάρχει πουθενά αλλού στην εφαρμογή: μεγάλα μπλοκ κειμένου προς ανάγνωση, και στιγμιότυπα οθονών.
 *
 * ΤΟ ΜΗΚΟΣ ΤΗΣ ΓΡΑΜΜΗΣ ΕΙΝΑΙ ΤΟ ΘΕΜΑ ΤΗΣ ΣΕΛΙΔΑΣ. Κάθε άλλη οθόνη είναι πίνακες και κάρτες, όπου το
 * φαρδύ βοηθά· εδώ ένα κείμενο στα 1440 px θα ήταν γραμμές των 200 χαρακτήρων, που το μάτι χάνει στην
 * επιστροφή. Οι παράγραφοι κόβονται στα ~46rem· τα στιγμιότυπα ΟΧΙ — αυτά θέλουν όλο το πλάτος.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.guide { max-inline-size: 64rem; }
.guide-lead { max-inline-size: 46rem; margin: 0 0 var(--sp-4); font-size: var(--fs-l); line-height: var(--lh-text); }
.guide-note { max-inline-size: 46rem; margin: 0; }

.guide-sec { margin-block-start: var(--sp-8); }
.guide-sec-title { margin: 0 0 var(--sp-2); }
.guide-sec-intro { max-inline-size: 46rem; margin: 0 0 var(--sp-6); }

/* Κάθε σκηνή ξεκινά με μια γραμμή: είναι η ίδια σιωπηλή στίξη που έχει ήδη η λίστα ιδιοκτητών
   (`.own-list > .row + .row`) — δώδεκα σκηνές χωρίς αυτήν διαβάζονται ως τοίχος. */
.guide-scene { padding-block-start: var(--sp-6); border-block-start: 1px solid var(--line); }
.guide-scene + .guide-scene { margin-block-start: var(--sp-6); }
.guide-scene-title { margin: 0 0 var(--sp-2); font-size: var(--fs-m); font-weight: var(--fw-semi); }
.guide-scene-body { max-inline-size: 46rem; margin: 0; color: var(--muted); line-height: var(--lh-text); }

/* ΤΑ ΔΥΟ ΣΩΜΑΤΑ ΔΙΠΛΑ-ΔΙΠΛΑ: κινητό αριστερά (στενό, σταθερό), γραφείο δεξιά (παίρνει ό,τι μένει). Στο
   κινητό μπαίνει ΜΟΝΟ το πρώτο — και δεν είναι CSS απόφαση: το `guide.js` δεν το βάζει καν στο DOM,
   αλλιώς το 4G της αυλής θα κατέβαζε δεκατρείς εικόνες γραφείου για να τις κρύψει. */
.guide-shots { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--sp-5); margin-block-start: var(--sp-5); }
.guide-frame {
  margin: 0;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--card2);
  box-shadow: var(--shadow);
}
.guide-frame.m { inline-size: 100%; max-inline-size: 18rem; }
.guide-frame.d { flex: 1; min-inline-size: 0; }
.guide-img { display: block; inline-size: 100%; block-size: auto; }

/* ΤΟ ΠΛΑΚΙΔΙΟ ΤΗΣ ΣΚΗΝΗΣ: ό,τι βλέπει ο αναγνώστης ΠΡΙΝ έρθουν τα PNG (ή αν λείπουν εντελώς). Δεν είναι
   σκελετός φόρτωσης — γράφει το ΟΝΟΜΑ της σκηνής, ώστε η σελίδα να διαβάζεται ολόκληρη χωρίς εικόνες. */
.guide-ph {
  display: flex; align-items: center; justify-content: center;
  min-block-size: 9rem; padding: var(--sp-6);
  background: var(--skeleton);
  color: var(--muted); font-size: var(--fs-s); text-align: center;
}

/* ΣΤ. Έρχεται — ΑΛΛΟ ΣΧΗΜΑ ΑΠΟ ΤΙΣ ΣΚΗΝΕΣ, ΕΠΙΤΗΔΕΣ: ημερομηνία μπροστά, καμία εικόνα. Δεν υπάρχει
   οθόνη να δείξει, και μια γραμμή που μοιάζει με τις από πάνω διαβάζεται ως κάτι που ήδη υπάρχει. */
.guide-soon-row { display: flex; gap: var(--sp-4); padding-block-start: var(--sp-5); border-block-start: 1px solid var(--line); }
.guide-soon-row + .guide-soon-row { margin-block-start: var(--sp-5); }
.guide-when { flex: none; align-self: flex-start; }
.guide-soon-main { min-inline-size: 0; }

@media (min-width: 900px) {
  /* Δίπλα-δίπλα: το κινητό κρατά σταθερό στενό πλάτος ώστε οι δεκατρείς σκηνές να ευθυγραμμίζονται
     κάθετα — μια στήλη που «χοροπηδά» κάνει τη σελίδα να φαίνεται πρόχειρη. */
  .guide-frame.m { inline-size: 13rem; }
  .guide-frame.d { min-inline-size: 22rem; }
}

/* ΤΟ ΚΟΥΜΠΙ ΤΟΥ ΟΔΗΓΟΥ ΦΕΥΓΕΙ ΑΠΟ ΤΗ ΜΠΑΡΑ ΣΤΟ ΙΔΙΟ ΣΚΑΛΟΠΑΤΙ ΜΕ ΤΗ ΣΤΗΛΗ (900, Μ1 04/09) — όχι στα
   719: κάτω από τα 900 η πλοήγηση είναι το συρτάρι του ☰, και ο Οδηγός είναι Η ΤΕΛΕΥΤΑΙΑ ΓΡΑΜΜΗ ΤΟΥ.
   Με δύο διαφορετικά σκαλοπάτια, στα 800 px ο οδηγός θα υπήρχε ΚΑΙ στη μπάρα ΚΑΙ στο συρτάρι. */
@media (max-width: 899px) {
  .guide-btn-wrap { display: none; }
}

@media (max-width: 719px) {
  /* Οι γραμμές του «Έρχεται» σπάνε σε δύο σειρές: ημερομηνία από πάνω, κείμενο από κάτω — στα 390 px
     ένα «Νοέμβριος 2026» δίπλα σε τίτλο αφήνει έξι χαρακτήρες ανά γραμμή στο κείμενο. */
  .guide-soon-row { flex-direction: column; gap: var(--sp-2); }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * Μ1 · Η ΠΛΟΗΓΗΣΗ ΣΕ ΣΤΗΛΗ ΑΡΙΣΤΕΡΑ (Vassilis 04/09) — ΔΥΟ ΔΙΑΤΑΞΕΙΣ, ΕΝΑ ΜΕΝΟΥ
 *
 * ≥900 px: κάθετη στήλη δίπλα στο περιεχόμενο, εικονίδιο + ετικέτα, ομαδοποιημένη, με σύμπτυξη σε
 *          icon-only. Sticky κάτω από τη μπάρα, με δικό της scroll όταν δεν χωρά.
 * <900 px: ΚΑΜΙΑ στήλη. Μένει η κάτω μπάρα με τον αντίχειρα, και το ☰ ανοίγει την ΙΔΙΑ στήλη ως συρτάρι
 *          (το CSS του ζει πιο πάνω, στο `#bottom .sheet` — είναι το ίδιο DOM με άλλη γεωμετρία).
 *
 * ΓΙΑΤΙ 900 ΚΑΙ ΟΧΙ 720: το tablet σε αυλή, όρθιο, με γάντια, ΕΙΝΑΙ κινητό — και μια στήλη 232 px δίπλα
 * σε περιεχόμενο 480 px είναι δύο μισές οθόνες και καμία ολόκληρη. Τα 900 είναι ήδη το σκαλοπάτι των
 * Ρυθμίσεων (Ο0) και των Μηνυμάτων: συνέπεια, όχι νέος αριθμός.
 *
 * ΤΑ ΜΕΤΡΑ ΕΙΝΑΙ TOKENS (`--side-w`, `--side-w-min`, `--topbar-h` στο `tokens.css`): το πλάτος της
 * στήλης το ζητούν τέσσερις κανόνες εδώ, και ένα px σκορπισμένο σε τέσσερα σημεία είναι τρία σημεία να
 * ξεχαστεί την επόμενη φορά.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* Ο ΣΚΕΛΕΤΟΣ: απλό block ΚΑΙ ΠΑΝΤΑ, εκτός από τη μία περίπτωση που υπάρχει στήλη σε φαρδιά οθόνη.
   Χωρίς το `.has-side` το `main` θα καθόταν στη ΣΤΕΝΗ πρώτη κολόνα ενός grid χωρίς πλοήγηση — δηλαδή η
   οθόνη εισόδου και η οθόνη τοίχου θα ζωγραφίζονταν σε 232 px. */
#shell { display: block; }

@media (min-width: 900px) {
  #shell.has-side { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: start; }

  /* STICKY ΚΑΙ ΜΕ ΔΙΚΟ ΤΗΣ SCROLL: με έντεκα γραμμές + τέσσερις επικεφαλίδες η στήλη ξεπερνά το ύψος
     ενός laptop· χωρίς `overflow-y` οι τελευταίες γραμμές θα ήταν απάτητες σε κάθε μακριά σελίδα. */
  #side {
    inline-size: var(--side-w);
    position: sticky;
    inset-block-start: var(--topbar-h);
    /* ΟΛΟ ΤΟ ΥΨΟΣ ΤΗΣ ΟΘΟΝΗΣ ΚΑΙ ΟΧΙ «ΟΣΟ ΤΟ ΠΕΡΙΕΧΟΜΕΝΟ»: μια στήλη που τελειώνει στη μέση της σελίδας
       διαβάζεται ως κάρτα που κάποιος ξέχασε εκεί, όχι ως πλοήγηση. Και μόνο έτσι ο Οδηγός μπορεί να
       κάτσει στον πάτο της (`.nav-guide { margin-block-start: auto }`) αντί να κολλάει στα Συμβάντα. */
    block-size: calc(100vh - var(--topbar-h));
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: var(--sp-5);
    padding: var(--sp-5) var(--sp-4) var(--sp-6);
    background: var(--card);
    border-inline-end: 1px solid var(--line);
  }

  /* ΣΥΜΠΤΥΓΜΕΝΗ: μόνο εικονίδια, με tooltip. Οι επικεφαλίδες φεύγουν (μια λέξη 11 px κομμένη στη μέση
     δεν είναι επικεφαλίδα) και τη δουλειά τους την κάνει μια λεπτή γραμμή ανάμεσα στις ομάδες. */
  #side.min { inline-size: var(--side-w-min); padding-inline: var(--sp-3); }
  #side.min .nav-h, #side.min .side-label { display: none; }
  #side.min .side-link { justify-content: center; padding-inline: 0; }
  #side.min .nav-group + .nav-group {
    margin-block-start: var(--sp-4);
    padding-block-start: var(--sp-4);
    border-block-start: 1px solid var(--line);
  }
  /* Η κουκκίδα και το «ΝΕΟ» δεν έχουν πια ετικέτα να σταθούν δίπλα της: κάθονται πάνω στο εικονίδιο,
     όπως ακριβώς στη μπάρα του κινητού (`.tab-ico`) — ίδιο πρόβλημα, ίδια λύση. */
  #side.min .side-link .tab-badge, #side.min .side-link .new-dot {
    position: absolute; inset-block-start: 2px; inset-inline-end: 6px; margin-inline-start: 0;
  }
  /* ΣΥΜΠΤΥΓΜΕΝΗ ΣΤΗΛΗ = ΚΑΝΕΝΑ ΔΕΝΤΡΟ: οι υπο-γραμμές είναι ΜΟΝΟ ετικέτα (χωρίς εικονίδιο, με λόγο —
     δες `subLink`), άρα σε 60 px θα ήταν πέντε κομμένες λέξεις κάτω από ένα κλειδί. Ο άνθρωπος που
     μάζεψε τη στήλη ζήτησε εικονίδια· του τα δίνουμε, χωρίς παραφωνία. */
  #side.min .nav-sub { display: none; }

  /* 🌳 ΤΟ ΔΕΝΤΡΟ ΑΚΥΡΩΝΕΙ ΤΙΣ ΚΑΡΤΕΛΕΣ ΤΗΣ ΟΘΟΝΗΣ, ΚΑΙ ΜΟΝΟ ΟΠΟΥ ΥΠΑΡΧΕΙ (0125). Το `#shell.has-side`
     δεν είναι διακόσμηση στον επιλογέα: η στήλη λείπει και πάνω από 900 px όταν ο ρόλος δεν έχει ούτε
     μία γραμμή μενού (`hideSide`) — και τότε οι καρτέλες είναι ο ΜΟΝΟΣ δρόμος προς τις άλλες όψεις.
     Κάτω από 900 px μένουν πάντα: εκεί δεν υπάρχει ούτε στήλη ούτε δέντρο. */
  #shell.has-side .mnt-tabs { display: none; }
}

/* ΚΑΤΩ ΑΠΟ ΤΑ 900: ΚΑΜΙΑ ΣΤΗΛΗ, ΚΑΜΙΑ ΕΞΑΙΡΕΣΗ. Το `#side` μένει στο DOM (το γεμίζει το `shell.js`
   ούτως ή άλλως) και κρύβεται εδώ: έτσι η JS δεν μετρά ποτέ πλάτη παραθύρου — ο browser ξέρει καλύτερα,
   και μια περιστροφή συσκευής δεν χρειάζεται listener για να διορθωθεί. */
@media (max-width: 899px) {
  #side { display: none; }
  #bottom { display: flex; }
  /* Η μπάρα σκεπάζει τα τελευταία 58 px κάθε σελίδας: χωρίς αυτό, το τελευταίο κουμπί κάθε οθόνης στα
     720-899 px θα ήταν από κάτω της — ορατό, και απάτητο. */
  main { padding-block-end: calc(var(--bottombar-h) + var(--sp-7)); }
}

/* ---- Οι ομάδες: η επικεφαλίδα είναι ΤΟΝΟΣ, όχι τίτλος. Πρέπει να διαβάζεται όταν τη ψάχνεις και να
   εξαφανίζεται όταν σαρώνεις τις γραμμές — γι' αυτό μικρή, αραιή και σβηστή. */
.nav-group { display: flex; flex-direction: column; gap: 2px; }
.nav-h {
  padding: 0 var(--sp-4) var(--sp-2);
  /* ΒΑΘΜΙΔΑ «ΜΙΚΡΟ-ΕΤΙΚΕΤΑ ΚΕΦΑΛΑΙΩΝ» (νόμος §2): ήταν 11 px / `.07em` — τέταρτο μέγεθος και τρίτο
     άνοιγμα για την ίδια ακριβώς δουλειά που κάνουν η κεφαλίδα στήλης του άξονα και η ομάδα
     δικαιωμάτων. Η θέση λέει ήδη τι είναι· το μέγεθος δεν χρειάζεται να το ξαναπεί. */
  font-size: var(--fs-xs);
  font-weight: var(--fw-semi);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--muted);
}
/* Ο Οδηγός είναι εκτός ομάδων και το δείχνει: σπρώχνεται στον πάτο της στήλης όταν περισσεύει ύψος,
   με μια γραμμή από πάνω. Στο συρτάρι του κινητού το `margin-block-start: auto` δεν κάνει τίποτα
   κακό — εκεί η στοίβα κυλάει, και η γραμμή αρκεί. */
.nav-guide { margin-block-start: auto; padding-block-start: var(--sp-4); border-block-start: 1px solid var(--line); }

/* ---- Η γραμμή της στήλης. */
.side-link {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  min-block-size: 38px;
  padding: var(--sp-2) var(--sp-4);
  border-radius: var(--r-s);
  font-size: var(--fs-s);
  color: var(--muted);
  transition: background var(--t) var(--ease), color var(--t) var(--ease);
}
.side-link:hover { background: var(--hover); color: var(--ink); text-decoration: none; }
.side-link svg { inline-size: 19px; block-size: 19px; flex: none; display: block; }
/* Η ετικέτα κόβεται με «…» αντί να σπρώξει τη στήλη: ένα «Voorbereiding» δεν επιτρέπεται να αλλάξει το
   πλάτος της πλοήγησης — η στήλη θα «ανέπνεε» σε κάθε αλλαγή γλώσσας. */
.side-label { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Η ΕΝΕΡΓΗ ΓΡΑΜΜΗ: ρίγα αριστερά + tint. Η ρίγα είναι που κάνει τη δουλειά σε σάρωση από πάνω προς τα
   κάτω (το μάτι πιάνει την άκρη, όχι το φόντο)· το tint κρατά τη σχέση με το ύφος του σπιτιού, όπου
   «επιλεγμένο» είναι πάντα `--accent-soft`. */
.side-link.active { background: var(--accent-soft); color: var(--ink); font-weight: var(--fw-semi); }
.side-link.active::before {
  content: '';
  position: absolute;
  inset-block: 6px;
  inset-inline-start: 0;
  inline-size: 3px;
  border-radius: var(--r-pill);
  background: var(--accent);
}
/* Η κουκκίδα των αναπάντητων και το «ΝΕΟ» πάνε στην ΑΚΡΗ της γραμμής, όχι κολλητά στην ετικέτα: εκεί
   τα βρίσκει το μάτι χωρίς να διαβάσει, και εκεί κάθονται σε κάθε λίστα του προϊόντος. */
.side-link .tab-badge { margin-inline-start: auto; }
.side-link .new-dot { position: static; margin-inline-start: auto; }

/* ---- 🌳 ΤΟ ΥΠΟ-ΜΕΝΟΥ ΤΗΣ ΕΝΕΡΓΗΣ ΓΡΑΜΜΗΣ (0125)
   ΤΗΝ ΙΕΡΑΡΧΙΑ ΤΗ ΛΕΕΙ Η ΕΣΟΧΗ ΜΕ ΤΟΝ ΧΑΡΑΚΑ, ΟΧΙ ΔΕΥΤΕΡΗ ΓΕΩΜΕΤΡΙΑ: ίδιο ιδίωμα με το `.prt-target`
   των ανταλλακτικών — μία λεπτή γραμμή στην αρχή δηλώνει «αυτά ανήκουν από πάνω» φθηνότερα από κάθε
   πλαίσιο, και σε ΛΟΓΙΚΗ ιδιότητα ώστε να γυρίσει μόνη της σε RTL (§2 του GUI_SPEC).
   Η εσοχή είναι στοιχισμένη με την ΕΤΙΚΕΤΑ της γονικής γραμμής (19 px εικονίδιο + `--sp-4` κενό), όχι
   με το εικονίδιό της: το δέντρο πρέπει να διαβάζεται ως συνέχεια της λέξης, όχι του σχήματος. */
.nav-sub {
  display: flex; flex-direction: column; gap: 1px;
  margin-block: var(--sp-1);
  margin-inline-start: calc(var(--sp-4) + 19px);
  padding-inline-start: var(--sp-3);
  border-inline-start: 1px solid var(--line);
}
/* ΙΔΙΑ ΓΡΑΜΜΑΤΟΣΕΙΡΑ ΚΑΙ ΙΔΙΟ ΧΡΩΜΑ ΜΕ ΤΗ ΓΟΝΙΚΗ, ΜΙΚΡΟΤΕΡΟΣ ΣΤΟΧΟΣ: 32 px αντί για 38 — είναι
   πλοήγηση ΜΕΣΑ σε οθόνη που έχεις ήδη ανοίξει, με ποντίκι (κάτω από 900 px δεν υπάρχει καν). */
.side-sub {
  display: flex; align-items: center;
  min-block-size: 32px;
  padding: var(--sp-1) var(--sp-4);
  border-radius: var(--r-s);
  font-size: var(--fs-s);
  color: var(--muted);
  transition: background var(--t) var(--ease), color var(--t) var(--ease);
}
.side-sub:hover { background: var(--hover); color: var(--ink); text-decoration: none; }
/* Η ΕΝΕΡΓΗ ΥΠΟ-ΟΨΗ: ΜΟΝΟ μελάνι και βάρος, ΧΩΡΙΣ το tint της γονικής. Δύο `--accent-soft` φόντα το ένα
   μέσα στο άλλο (γραμμή «Συντήρηση» + κλαδί) διαβάζονται ως δύο επιλεγμένα πράγματα — και επιλεγμένο
   είναι ένα. Η ρίγα ανήκει στο πρώτο επίπεδο, όπου σαρώνει το μάτι από πάνω προς τα κάτω. */
.side-sub.active { color: var(--ink); font-weight: var(--fw-semi); }

/* ---- Το κουμπί σύμπτυξης: στην κορυφή, στην άκρη, και ΜΙΚΡΟ. Δεν είναι πράξη της ημέρας — είναι
   ρύθμιση που κάποιος πατά μία φορά και την ξεχνά. Το βελάκι γυρίζει: «‹» μαζεύει, «›» ανοίγει. */
.side-toggle {
  align-self: flex-end;
  display: flex; align-items: center; justify-content: center;
  inline-size: var(--ctl); block-size: var(--ctl);
  flex: none; padding: 0;
  border: 1px solid var(--line); border-radius: var(--r-s);
  background: none; color: var(--muted); cursor: pointer;
  transition: color var(--t) var(--ease), border-color var(--t) var(--ease);
}
.side-toggle:hover { color: var(--ink); border-color: var(--muted); filter: none; }
.side-toggle svg { inline-size: 17px; block-size: 17px; display: block; }
#side.min .side-toggle { align-self: center; }
#side.min .side-toggle svg { transform: rotate(180deg); }


/* ════════════════════════════════════════════════════════════════════════════════════════════════════
   Η ΑΝΑΘΕΣΗ ΤΗΣ ΣΥΝΟΜΙΛΙΑΣ — ΔΕΥΤΕΡΗ ΣΕΙΡΑ ΤΗΣ ΙΔΙΑΣ ΚΕΦΑΛΙΔΑΣ (0102, Vassilis 05/09)

   ΓΙΑΤΙ ΜΕΣΑ ΣΤΗΝ ΚΕΦΑΛΙΔΑ ΚΑΙ ΟΧΙ ΣΕ ΔΙΚΗ ΤΗΣ ΚΑΡΤΑ: «ποιος το έχει» είναι ιδιότητα ΑΥΤΗΣ της
   κουβέντας, όπως το όνομα και ο κωδικός οχήματος από πάνω. Ένα δεύτερο πλαίσιο θα έσπρωχνε το νήμα
   μισή οθόνη πιο κάτω στα 390 px — για μια πληροφορία τριών λέξεων.

   Η ΚΕΦΑΛΙΔΑ ΜΑΘΑΙΝΕΙ ΝΑ ΤΥΛΙΓΕΤΑΙ (`flex-wrap`) ΚΑΙ Η ΓΡΑΜΜΗ ΠΙΑΝΕΙ ΠΛΗΡΕΣ ΠΛΑΤΟΣ (`flex: 1 0 100%`):
   αλλιώς στα 390 px θα στρίμωχνε το όνομα του ενοικιαστή σε δύο γράμματα ανά σειρά. Η λεπτή γραμμή από
   πάνω λέει «άλλο πράγμα, ίδιο αντικείμενο» — χωρίς δεύτερο φόντο και χωρίς δεύτερο περίγραμμα.

   ΣΤΟΧΟΙ ΑΦΗΣ 44 px ΚΑΙ ΟΧΙ 52: ίδιο ύψος με τα δύο κουμπιά που ΗΔΗ ζουν σε αυτή την κεφαλίδα
   (`.msg-back`, `.msg-go`). Τα 52 px είναι το μέγεθος της ΚΥΡΙΑΣ ενέργειας του composer· εδώ η κύρια
   ενέργεια είναι το να διαβάσεις και να απαντήσεις, όχι να αναθέσεις.

   ΤΟ ΧΡΩΜΑ ΤΟΥ ΟΝΟΜΑΤΟΣ ΔΕΝ ΔΗΛΩΝΕΤΑΙ ΕΔΩ, ΕΠΙΤΗΔΕΣ: όταν δεν το έχει κανείς, η JS βάζει `muted` — και
   μια δική μας δήλωση χρώματος θα νικούσε (ίδια ειδικότητα, πιο κάτω στο αρχείο) ακριβώς τη διάκριση
   που θέλουμε να φαίνεται. Και τα δύο θέματα δουλεύουν, γιατί κανένα χρώμα δεν γράφεται με το χέρι.
   ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.msg-head { flex-wrap: wrap; }
/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   «ΠΑΕΙ ΣΥΝΕΡΓΕΙΟ» (0116, 05/09) — τρεις ΜΙΚΡΕΣ προσθήκες, καμία νέα οπτική γλώσσα.

   Ο,τι ζωγραφίζει αυτή η ροή ΕΙΝΑΙ ΗΔΗ γνωστό σχήμα: κάρτα (`.card`), λίστα κωδικών (`.rn-plan` /
   `.rn-bullets`), κουμπιά επιλογής (`.rn-opt`), chips. Εδώ μπαίνει μόνο ο ΧΩΡΟΣ και το ΒΑΡΟΣ που
   χρειάζονται οι τρεις νέες θέσεις — ένα δικό τους «θέμα» θα ήταν δεύτερη γλώσσα για το ίδιο πράγμα.
   ══════════════════════════════════════════════════════════════════════════════════════════════════ */
/* Η κάρτα «τι κάνει το όχημα εκτός» στη σελίδα οχήματος: μπάρα προσοχής όπως το μπλοκαρισμένο
   check-in, ώστε το μάτι να την πιάνει πριν διαβάσει λέξη. */
.sv-card { border-inline-start: 3px solid var(--warn); }
.sv-card .link { text-align: start; }

/* 🚨 Η ΛΙΣΤΑ ΤΩΝ ΠΑΡΑΘΥΡΩΝ ΠΡΕΠΕΙ ΝΑ ΜΟΙΑΖΕΙ ΜΕ ΕΠΙΛΟΓΕΣ — ΔΕΥΤΕΡΗ ΦΟΡΑ ΤΟ ΙΔΙΟ ΣΚΟΝΤΑΜΜΑ (06/09).
   Την πρώτη φορά ο χειριστής πάτησε «δες τι θα γίνει» χωρίς να διαλέξει, και ο server σχεδίασε «τώρα».
   Μπήκε φρουρός: το κουμπί γκριζάρει. Τη ΔΕΥΤΕΡΗ φορά ο ίδιος άνθρωπος είδε το γκρίζο κουμπί και είπε
   «κόλλησε» — γιατί οι γραμμές των κενών διαβάζονταν ως ΠΛΗΡΟΦΟΡΙΑ, όχι ως κουμπιά. Το `.rn-opt` το
   έλεγε μόνο με περίγραμμα, και περίγραμμα έχει και μια απλή κάρτα.

   ΤΟ ΜΟΝΟ ΣΧΗΜΑ ΠΟΥ ΔΕΝ ΠΑΡΕΞΗΓΕΙΤΑΙ ΕΙΝΑΙ Ο ΚΥΚΛΟΣ ΤΟΥ RADIO: κενός = «διάλεξε», γεμάτος = «διάλεξα».
   Δεν είναι νέα οπτική γλώσσα — είναι Η ΓΛΩΣΣΑ ΠΟΥ ΞΕΡΕΙ ΗΔΗ ΚΑΘΕ ΑΝΘΡΩΠΟΣ, και μπαίνει ΩΣ ΤΡΟΠΟΠΟΙΗΤΗΣ
   (`.rn-pick`) πάνω στο υπάρχον `.rn-opt`: οι προτάσεις οχημάτων της μεταφοράς ΔΕΝ αλλάζουν όψη από εδώ. */
.rn-pick { flex-direction: row; align-items: center; gap: var(--sp-4); }
.rn-pick::before {
  content: ''; flex: 0 0 auto; inline-size: 20px; block-size: 20px; border-radius: 50%;
  border: 2px solid var(--line); background: var(--card);
  transition: border-color var(--t) var(--ease), box-shadow var(--t) var(--ease);
}
/* Ο κύκλος απαντά ΠΡΙΝ το πάτημα: με το δάχτυλο/ποντίκι πάνω, το περίγραμμα γίνεται accent — αυτό είναι
   που λέει «είμαι πατήσιμο» σε ποντίκι, ενώ σε αφή το λέει το ίδιο το σχήμα. */
.rn-pick:hover::before { border-color: var(--accent); }
/* ΚΛΑΣΙΚΟ ΓΕΜΙΣΜΑ, ΟΧΙ ΓΕΜΑΤΟΣ ΔΙΣΚΟΣ: το πρώτο inset ζωγραφίζει το κενό δαχτυλίδι (χρώμα του κύκλου),
   το δεύτερο γεμίζει ό,τι μένει μέσα. Έτσι βγαίνει η κουκκίδα που όλοι αναγνωρίζουν ως «επιλεγμένο». */
.rn-pick[aria-checked='true']::before {
  border-color: var(--accent);
  box-shadow: inset 0 0 0 3px var(--card), inset 0 0 0 10px var(--accent);
}
/* Το επιλεγμένο έχει ΚΑΙ εντονότερο περίγραμμα από το `.rn-opt.picked`: σε ήλιο, ένα 1px accent σε
   λίστα τεσσάρων γραμμών χάνεται — και τότε ο χειριστής ξαναπατά αυτό που έχει ήδη πατήσει. */
.rn-pick[aria-checked='true'] { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent) inset; }
.rn-pick-body { display: flex; flex-direction: column; gap: var(--sp-2); min-inline-size: 0; flex: 1 1 auto; }

/* Οι δύο ενέργειες κάτω από μια ΑΝΟΙΧΤΗ ζημιά. Τυλίγονται στα 390 px (δύο κουμπιά με λέξεις δεν
   χωρούν σε μία σειρά σε κινητό) και ο στόχος αφής μένει ≥44 px — κανόνας των οθονών πεδίου. */
.dmg-service { grid-column: 1 / -1; flex-wrap: wrap; gap: var(--sp-2); margin-block-start: var(--sp-2); }
.dmg-service > button { min-height: 44px; }

/* Η ενότητα «χωρίς όχημα» στις Μισθώσεις: σπάνια και σοβαρή. ΠΑΙΡΝΕΙ ΤΟ ΣΧΗΜΑ ΤΗΣ ΚΡΙΣΙΜΗΣ ΚΑΡΤΑΣ
   (`.card.crit`: περίγραμμα + απαλή λάμψη) και όχι δική της κόκκινη λωρίδα — το ίδιο κλισέ που το
   `.card.crit` απορρίπτει ρητά δεκαπέντε σελίδες πιο πάνω. Η λωρίδα μένει το σχήμα του `warn` μέσα σε
   κάρτα (`.sv-card`, `.ho-blocked`), ώστε τα δύο επίπεδα να ΜΗΝ έχουν το ίδιο περίγραμμα (νόμος §7).
   Εδώ μένει μόνο ό,τι είναι πραγματικά δικό της: κάθε γραμμή χωρισμένη από την επόμενη, γιατί
   καθεμιά είναι ΕΝΑΣ πελάτης που θέλει τηλέφωνο. */
.rn-nv-row + .rn-nv-row { border-block-start: 1px solid var(--line); padding-block-start: var(--sp-3); }

.msg-assign {
  flex: 1 0 100%;
  display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap;
  padding-block-start: var(--sp-3);
  border-block-start: 1px solid var(--line);
}
.msg-hold { font-size: var(--fs-s); }
/* Οι πράξεις στην ΑΚΡΗ της γραμμής: το μάτι βρίσκει πρώτα το όνομα (η πληροφορία) και μετά τα κουμπιά. */
.msg-assign .cmp-acts { flex: 1 1 auto; justify-content: flex-end; gap: var(--sp-3); }
.msg-assign .cmp-acts .ghost { min-height: 44px; flex: 0 1 auto; }
/* Ο επιλογέας παίρνει ό,τι χώρο βρει: στο κινητό είναι ο στόχος που ανοίγει το φύλλο του browser. */
.msg-assign-pick { flex: 1 1 12rem; min-height: 44px; }

/* ══════════════════════════════════════════════════════════════════════════════════════════════════
   0103 (05/09) — ΤΟ CHECK-IN ΠΟΥ ΔΕΝ ΓΙΝΕΤΑΙ

   Στη θέση του κουμπιού «Παραλαβή» μπαίνει Ο ΛΟΓΟΣ και ΜΙΑ έξοδος. Καμία απενεργοποιημένη επιλογή:
   ένα γκρι κουμπί το πατά κανείς τρεις φορές πριν καταλάβει, και μετά ρωτά το γραφείο.

   ΜΠΑΡΑ ΑΝΤΙ ΓΙΑ ΠΛΑΙΣΙΟ, ΓΙΑΤΙ ΖΕΙ ΜΕΣΑ ΣΕ ΚΑΡΤΑ: στην καρτέλα του οχήματος η εξήγηση κάθεται μέσα
   στην κάρτα «ΠΡΩΤΟΚΟΛΛΟ ΟΧΗΜΑΤΟΣ» — δεύτερο περίγραμμα εκεί μέσα θα διαβαζόταν ως δεύτερη ενότητα.
   Στη σελίδα του πρωτοκόλλου στέκεται μόνη της και κρατά την κάρτα της. Ένας κανόνας, δύο θέσεις.
   ══════════════════════════════════════════════════════════════════════════════════════════════════ */
.ho-blocked {
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  border-inline-start: 3px solid var(--warn);
}
.ho-blocked p { margin: 0; }
.ho-bl-what { font-weight: var(--fw-semi); }
/* Μέσα στην κάρτα του οχήματος: χωρίς δικό της φόντο, περίγραμμα και σκιά — μόνο η μπάρα και ο χώρος. */
.veh-ho .ho-blocked {
  margin: 0;
  padding: var(--sp-3) var(--sp-5);
  background: none;
  border-block: 0;
  border-inline-end: 0;
  box-shadow: none;
}
/* Η ΜΙΑ ΕΞΟΔΟΣ ΕΙΝΑΙ ΜΕΓΑΛΟΣ ΣΤΟΧΟΣ: πατιέται με γάντια, από κινητό, στην αυλή (κανόνας 02/09). */
.ho-blocked .ho-go { flex: 0 1 auto; align-items: center; min-height: 48px; margin-block-start: var(--sp-2); }


/* ================================================================ ΣΥΝΤΗΡΗΣΗ: Η ΠΥΛΗ ΚΑΙ ΤΟ ΡΟΛΟΙ (0121)
   Προσθήκη ΜΟΝΟ, με δικά της ονόματα (`mnt-*`): καμία υπάρχουσα γραμμή δεν αλλάζει — η καρτέλα των
   Ζημιών μένει ακριβώς όπως ήταν, και η νέα απλώς κάθεται δίπλα της κάτω από την ίδια μπάρα καρτελών.
   ΤΑ ΠΛΑΚΙΔΙΑ ΚΑΙ ΤΑ CHIPS ΕΙΝΑΙ ΤΑ ΥΠΑΡΧΟΝΤΑ (`.pill`, `.chip`): δύο γεωμετρίες σε όλο το σπίτι, και
   καμία τρίτη γεννιέται εδώ (νόμος του σπιτιού §4). */
.mnt-page { display: flex; flex-direction: column; gap: var(--sp-5); }
.mnt-page h1 { margin: 0; }

/* Η ΓΡΑΜΜΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΕΙΝΑΙ ΟΛΟΚΛΗΡΗ ΚΟΥΜΠΙ, σε ύψος δαχτύλου — ίδια γεωμετρία με την κεφαλίδα
   ομάδας των Ζημιών (`.dfl-head`): ο ίδιος άνθρωπος, το ίδιο γάντι, η ίδια αυλή. */
.mnt-row {
  display: flex; align-items: center; gap: var(--sp-4); width: 100%;
  min-height: 52px; padding: var(--sp-4) var(--sp-5);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-s);
  color: var(--ink); text-align: start;
}
.mnt-row:hover { background: var(--hover); filter: none; }
.mnt-row-main { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-2); flex: 1; }
.mnt-caret { display: flex; color: var(--muted); transform: rotate(180deg); }

/* Η ΕΝΟΤΗΤΑ ΤΟΥ ΟΧΗΜΑΤΟΣ: κάρτες μέσα σε κάρτα, όπως ο εξοπλισμός. Κάθε ρολόι είναι ΔΙΚΟ του κουτί,
   γιατί κουβαλά ΔΙΚΕΣ του πράξεις — μια πυκνή λίστα με τρία κουμπιά ανά γραμμή δεν πατιέται. */
.mnt-item { display: flex; flex-direction: column; gap: var(--sp-2); }
.mnt-act { gap: var(--sp-3); flex-wrap: wrap; margin-block-start: var(--sp-2); }
.mnt-known { margin-block-end: var(--sp-2); }
.mnt-log { margin-block-start: var(--sp-5); }
.mnt-log-row { display: flex; flex-direction: column; gap: var(--sp-1); }
.mnt-field { display: flex; flex-direction: column; gap: var(--sp-2); }
.mnt-field .inc-label { margin-block-end: 0; }
.mnt-field input { width: 100%; }

@media (max-width: 719px) {
  .mnt-row { padding-inline: var(--sp-4); }
  /* Στα 390 px τα τρία κουμπιά δεν χωρούν σε σειρά: γεμίζουν πλάτος, ένα ανά γραμμή (κανόνας 02/09). */
  .mnt-act .ho-big, .mnt-act .ghost { flex: 1 1 100%; }
}

/* ================================================================ ΣΤΟ ΣΥΝΕΡΓΕΙΟ (0125): «ΤΙ ΜΟΥ ΛΕΙΠΕΙ»
   Προσθήκη ΜΟΝΟ, με δικά της ονόματα (`asv-*`). Η κεφαλίδα του οχήματος, οι κεφαλίδες-γραμμές των
   ενοτήτων και τα πλακίδια είναι ΤΑ ΥΠΑΡΧΟΝΤΑ (`.dfl-head`, `.rn-group`, `.pill`): η οθόνη κάθεται
   δίπλα στις Ζημιές κάτω από το ίδιο δέντρο, και δεν επιτρέπεται να μοιάζει με άλλο προϊόν. */
.asv-page { display: flex; flex-direction: column; gap: var(--sp-5); }
.asv-page h1 { margin: 0; }
.asv-sect { display: flex; flex-direction: column; gap: var(--sp-3); }
/* Η κάρτα του οχήματος: κεφαλίδα-κουμπί επάνω (δικό της padding), σώμα από κάτω — ίδια δομή με τις
   ομάδες των Ζημιών, ώστε οι δύο όψεις να διαβάζονται ως μία οικογένεια. */
.asv-card { padding: 0; overflow: hidden; }
.asv-body { display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-4) var(--sp-5); }
/* Οι δουλειές της εντολής: εσοχή με χάρακα — ίδιο ιδίωμα με το `.prt-target` και το `.nav-sub`. */
.asv-work { margin-block-start: var(--sp-2); padding-inline-start: var(--sp-4);
            border-inline-start: 2px solid var(--line);
            display: flex; flex-direction: column; gap: var(--sp-2); }
.asv-job { gap: var(--sp-3); }
.asv-act { gap: var(--sp-3); flex-wrap: wrap; margin-block-start: var(--sp-3); }
.asv-empty { margin: 0; }

/* ================================================================ ΚΑΛΥΨΗ (0125): ΣΤΟΛΟΣ × ΕΙΔΗ
   ΔΥΟ ΣΩΜΑΤΑ, ΕΝΑ ΣΚΑΛΟΠΑΤΙ (900 — το ΙΔΙΟ με τη στήλη πλοήγησης): πίνακας στο γραφείο, λίστα «τι
   λείπει» στο κινητό. Τα ΔΥΟ υπάρχουν πάντα στο DOM και τα διαλέγει ΕΔΩ ο browser: η JS δεν μετρά
   πλάτη παραθύρου (Μ1) — μια περιστροφή συσκευής δεν χρειάζεται listener για να δείξει τη σωστή. */
.cov-page { display: flex; flex-direction: column; gap: var(--sp-5); }
.cov-page h1 { margin: 0; }
.cov-why, .cov-count, .cov-empty { margin: 0; }
.cov-count { font-weight: var(--fw-semi); }

/* ΚΑΤΩ ΑΠΟ 900: Η ΛΙΣΤΑ. Ο πίνακας στα 390 px είναι δύο κελιά ορατά και οκτώ έξω από την οθόνη. */
.cov-scroll { display: none; }
.cov-list { display: flex; flex-direction: column; gap: var(--sp-3); }
.cov-row { padding: 0; overflow: hidden; }
/* ΔΥΟ ΟΜΑΔΕΣ ΚΕΝΩΝ ΜΕ ΤΗΝ ΕΤΙΚΕΤΑ ΤΟΥΣ («δεν παρακολουθούνται» / «θέλουν πρώτη καταχώριση»): δύο
   διαφορετικές δουλειές, δύο διαφορετικές φόρμες — μία λίστα θα ζητούσε από τον άνθρωπο να τις
   ξεχωρίσει μόνος του. Ομάδα που αδειάζει ΔΕΝ ζωγραφίζεται (κανόνας όλου του προϊόντος). */
.cov-body { display: flex; flex-direction: column; gap: var(--sp-4);
            padding: var(--sp-3) var(--sp-5) var(--sp-4); }
.cov-group { display: flex; flex-direction: column; gap: var(--sp-2); }
.cov-group .inc-label { margin-block-end: 0; }

@media (min-width: 900px) {
  .cov-list { display: none; }
  /* Η ΟΡΙΖΟΝΤΙΑ ΚΥΛΙΣΗ ΖΕΙ ΜΕΣΑ ΣΤΟ ΔΙΚΟ ΤΗΣ ΔΟΧΕΙΟ, ΠΟΤΕ ΣΤΗ ΣΕΛΙΔΑ (νόμος §8): με δώδεκα είδη ο
     πίνακας ξεπερνά την οθόνη, αλλά το σώμα της σελίδας δεν επιτρέπεται να κουνηθεί δεξιά-αριστερά.
     ΚΑΙ ΜΕ ΔΙΚΟ ΤΗΣ ΥΨΟΣ, ΓΙΑΤΙ ΑΛΛΙΩΣ ΟΙ ΚΕΦΑΛΙΔΕΣ ΔΕΝ ΚΟΛΛΑΝΕ: το `sticky` χρειάζεται ΤΟΝ ΔΙΚΟ ΤΟΥ
     κύλινδρο — χωρίς όριο ύψους το δοχείο μεγαλώνει όσο ο πίνακας και δεν κυλά ποτέ κάθετα, οπότε η
     κεφαλίδα «κολλάει» σε κάτι που δεν κινείται. Τα 68vh είναι το υπόλοιπο μιας οθόνης γραφείου αφού
     φύγουν μπάρα (65) + κεφαλίδα + καρτέλες + η γραμμή του πλήθους· ό,τι περισσεύει το παίρνει ο
     πίνακας, και σε μικρό στόλο δεν ενεργοποιείται καν (είναι ΑΝΩΤΑΤΟ, όχι ύψος). */
  .cov-scroll {
    display: block; overflow: auto; max-block-size: 68vh; overscroll-behavior: contain;
    border: 1px solid var(--line); border-radius: var(--r-s); background: var(--card);
  }
  /* 🏛 ΣΤΑΘΕΡΕΣ ΖΩΝΕΣ, ΚΑΜΙΑ ΜΕΤΡΗΜΕΝΗ ΑΠΟ ΚΕΙΜΕΝΟ — το μάθημα των Μισθώσεων (`--rn-veh-col`), εδώ ως
     `table-layout: fixed`: χωρίς αυτό η στήλη «Ιμάντας εκκεντροφόρου» θα ήταν διπλάσια από τη στήλη
     «ΚΤΕΟ», και το πλάτος κάθε στήλης θα άλλαζε σε κάθε αλλαγή γλώσσας. */
  .cov-table {
    --cov-veh-col: 10rem;
    --cov-col: 10rem;
    table-layout: fixed; border-collapse: separate; border-spacing: 0; min-inline-size: 100%;
    font-size: var(--fs-s);
  }
  .cov-table th, .cov-table td {
    padding: var(--sp-2) var(--sp-3); border-block-end: 1px solid var(--line);
    vertical-align: middle; text-align: start; font-weight: var(--fw-reg);
  }
  .cov-table tbody tr:last-child th, .cov-table tbody tr:last-child td { border-block-end: 0; }
  /* 🗂 Η ΙΔΙΑ ΟΠΤΙΚΗ ΓΛΩΣΣΑ ΜΕ ΤΟΝ ΠΙΝΑΚΑ-ΕΡΓΑΛΕΙΟ (0126 β): η Κάλυψη ΗΤΑΝ ήδη πίνακας με τις ίδιες
     μικρο-ετικέτες και το ίδιο δοχείο — της έλειπαν τρία πράγματα που έχει κάθε `.dt`: το μέγεθος
     γραμματοσειράς της πυκνής λίστας, η κάθετη στοίχιση στη ΜΕΣΗ (με `top` το πλακίδιο του οχήματος
     κάθεται ψηλότερα από το κελί δίπλα του) και το hover ΟΛΟΚΛΗΡΗΣ της γραμμής. Το τελευταίο δεν είναι
     καλλωπισμός: σε πίνακα 22×10 το μάτι χάνει τη σειρά του ανάμεσα στο όχημα και το δέκατο κελί.
     Η κολλημένη στήλη ταυτότητας βάφεται ΡΗΤΑ, γιατί έχει δικό της αδιαφανές φόντο (`--card`) —
     χωρίς αυτή τη γραμμή θα ήταν η μόνη που δεν ανάβει. ΚΑΜΙΑ ΑΛΛΑΓΗ ΛΟΓΙΚΗΣ: ίδια κελιά, ίδιες
     πόρτες, ίδιο `cov-gap`. */
  .cov-table tbody tr:hover td, .cov-table tbody tr:hover .cov-veh { background: var(--hover); }
  .cov-ty-h { inline-size: var(--cov-col); }
  /* Η ΚΕΦΑΛΙΔΑ ΤΗΣ ΣΤΗΛΗΣ ΕΙΝΑΙ «ΜΙΚΡΟ-ΕΤΙΚΕΤΑ ΚΕΦΑΛΑΙΩΝ» (νόμος §2): η ΘΕΣΗ λέει ήδη τι είναι. */
  .cov-veh-h, .cov-ty-h {
    position: sticky; inset-block-start: 0; z-index: 2; background: var(--card);
    font-size: var(--fs-xs); font-weight: var(--fw-semi); letter-spacing: .06em;
    text-transform: uppercase; color: var(--muted);
    box-shadow: inset 0 -1px 0 var(--line);
  }
  .cov-ty-h { display: table-cell; }
  /* Η ΤΑΥΤΟΤΗΤΑ ΤΟΥ ΟΧΗΜΑΤΟΣ ΜΕΝΕΙ ΣΤΟ ΜΑΤΙ ΟΣΟ ΚΥΛΑΣ ΔΕΞΙΑ — αλλιώς στη δέκατη στήλη δεν ξέρεις πια
     ποιανού αμαξιού είναι το κενό που κοιτάς. Η γωνία (κεφαλίδα × όχημα) πρέπει να είναι ΠΑΝΩ κι από
     τα δύο, γι' αυτό της δίνεται μεγαλύτερο z. */
  .cov-veh, .cov-veh-h {
    position: sticky; inset-inline-start: 0; z-index: 1; inline-size: var(--cov-veh-col);
    background: var(--card); box-shadow: inset -1px 0 0 var(--line);
  }
  .cov-veh-h { z-index: 3; }
  .cov-veh { display: table-cell; white-space: nowrap; }
  .cov-veh .pill { display: inline-block; max-inline-size: 100%; overflow: hidden;
                   text-overflow: ellipsis; vertical-align: middle; }
  .cov-veh .num { margin-inline-start: var(--sp-2); }
}

/* ΤΟ ΚΕΛΙ ΕΙΝΑΙ ΟΛΟΚΛΗΡΟ ΣΤΟΧΟΣ ΑΦΗΣ (44 px), ΚΑΙ ΤΟ ΚΕΝΟ ΕΙΝΑΙ ΤΟ ΚΟΥΜΠΙ: «ένα click από το κενό στο
   γεμάτο» ήταν ολόκληρο το αίτημα. Το `—` κεντράρεται ώστε η στήλη των κενών να διαβάζεται κατακόρυφα
   με μια ματιά — εκεί ζει η απάντηση «ποια ΔΕΝ έχουν ΚΤΕΟ». */
.cov-cell {
  display: flex; align-items: center; inline-size: 100%; min-block-size: 44px;
  padding: 0; background: none; border: 0; border-radius: var(--r-s);
  color: var(--ink); text-align: start;
}
.cov-cell:hover { filter: none; }
.cov-gap { justify-content: center; color: var(--muted); }
/* Το κενό ΠΟΥ ΠΑΤΙΕΤΑΙ το λέει με χρώμα ΠΛΟΗΓΗΣΗΣ (accent = ταυτότητα/πλοήγηση, ποτέ κατάσταση):
   «εδώ λείπει κάτι» το λέει ήδη το ίδιο το `—`, και δεν είναι σφάλμα — είναι δουλειά που δεν έγινε. */
button.cov-gap:hover { background: var(--hover); color: var(--accent); }

/* ================================================================ ΑΝΤΑΛΛΑΚΤΙΚΑ: Η ΟΜΑΔΟΠΟΙΗΣΗ (0124)
   Προσθήκη ΜΟΝΟ, με δικά της ονόματα (`prt-*`) — καμία υπάρχουσα γραμμή δεν αλλάζει. Τα πλακίδια, τα
   chips και το checkbox επιλογής είναι ΤΑ ΥΠΑΡΧΟΝΤΑ (`.pill`, `.chip`, `.dmg-check`): δύο γεωμετρίες
   σε όλο το σπίτι και καμία τρίτη γεννιέται εδώ (νόμος του σπιτιού §4).

   ΤΡΙΑ ΕΠΙΠΕΔΑ ΧΩΡΙΣ ΤΡΙΑ ΚΟΥΤΙΑ: ο κατασκευαστής είναι ΚΑΡΤΑ, το όχημα και η δουλειά είναι ΕΣΟΧΕΣ με
   μία γραμμή-χάρακα. Τρεις εμφωλευμένες κάρτες στα 390 px αφήνουν 40 % του πλάτους σε περιθώρια. */
.prt-page { gap: var(--sp-5); }
.prt-groups { gap: var(--sp-4); }
.prt-group { gap: var(--sp-3); }
.prt-group-head { align-items: baseline; gap: var(--sp-3); }
.prt-veh { display: flex; flex-direction: column; gap: var(--sp-2); }
.prt-veh-head { align-self: flex-start; font-weight: var(--fw-semi); }
/* Η ΕΣΟΧΗ ΕΙΝΑΙ Ο ΧΑΡΑΚΑΣ: μία λεπτή γραμμή στην αρχή δηλώνει «αυτά ανήκουν από πάνω» φθηνότερα από
   κάθε πλαίσιο — και σε λογική ιδιότητα, ώστε να γυρίσει μόνη της σε RTL όταν έρθει (§2 GUI_SPEC). */
.prt-target { padding-inline-start: var(--sp-4); border-inline-start: 2px solid var(--line);
              display: flex; flex-direction: column; gap: var(--sp-2); }
.prt-target-head { font-weight: var(--fw-semi); }
.prt-row { display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0; }
/* ΟΛΟΚΛΗΡΗ Η ΓΡΑΜΜΗ ΕΙΝΑΙ Ο ΣΤΟΧΟΣ ΑΦΗΣ, όχι το κουτάκι: 44 px ύψος, όπως κάθε πράξη του πεδίου. */
.prt-row.pick { flex-direction: row; align-items: flex-start; gap: var(--sp-3); cursor: pointer;
                min-height: 44px; padding: var(--sp-2) var(--sp-3); border-radius: var(--r-s);
                border: 1px solid transparent; }
.prt-row.pick:hover { background: var(--hover); }
.prt-row.picked { border-color: var(--accent); background: var(--hover); }
.prt-main { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-1); flex: 1; }
.prt-act { gap: var(--sp-3); flex-wrap: wrap; margin-block-start: var(--sp-2); }
.prt-empty { margin-block-start: var(--sp-5); }

/* Η ΕΝΟΤΗΤΑ ΜΕΣΑ ΣΤΗΝ ΚΑΡΤΑ ΤΗΣ ΖΗΜΙΑΣ: ψιλά γράμματα, χάρακας, και ΠΟΤΕ δικό της περίγραμμα — αλλιώς
   διαβάζεται ως δεύτερη κάρτα μέσα στην κάρτα, δηλαδή ως δεύτερο πρόβλημα. */
.prt-block { margin-block-start: var(--sp-4); padding-inline-start: var(--sp-4);
             border-inline-start: 2px solid var(--line); display: flex; flex-direction: column;
             gap: var(--sp-2); }
.prt-list { gap: var(--sp-3); }
.prt-form { gap: var(--sp-3); }
.prt-field { display: flex; flex-direction: column; gap: var(--sp-2); }
.prt-field .inc-label { margin-block-end: 0; }
.prt-field input { width: 100%; }
/* ΔΥΟ ΜΙΚΡΑ ΠΕΔΙΑ ΣΕ ΜΙΑ ΣΕΙΡΑ ΣΤΟ DESKTOP, ΕΝΑ-ΕΝΑ ΣΤΟ ΚΙΝΗΤΟ: «SKU» και «Κωδικός» δίπλα-δίπλα
   διαβάζονται ως ζευγάρι· στα 390 px το ίδιο ζευγάρι είναι δύο πεδία των 150 px που δεν πατιούνται. */
.prt-pair { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }

.prt-will { padding: var(--sp-3) var(--sp-4); border-radius: var(--r-s); background: var(--hover); }
.prt-orders { margin-block-start: var(--sp-6); gap: var(--sp-3); }
.prt-order { display: flex; flex-direction: column; gap: var(--sp-2); }

/* Η ΜΙΑ ΕΝΕΡΓΕΙΑ ΤΗΣ ΟΘΟΝΗΣ, ΕΚΕΙ ΠΟΥ ΦΤΑΝΕΙ Ο ΑΝΤΙΧΕΙΡΑΣ. Ίδιο μοτίβο με τη μπάρα της αυλής: κολλάει
   στο κάτω μέρος ΤΗΣ ΣΕΛΙΔΑΣ (sticky, όχι fixed) ώστε να μη σκεπάζει την τελευταία γραμμή της λίστας. */
.prt-bar { position: sticky; inset-block-end: var(--sp-4); display: flex; padding-block-start: var(--sp-4); }
.prt-bar .ho-big { flex: 1; }

/* ΤΟ ΧΑΡΤΙ ΤΗΣ ΠΑΡΑΓΓΕΛΙΑΣ δανείζεται ΟΛΟ το `.ro-*` της εντολής επισκευής — ίδιο σχήμα, ίδιο
   `@media print`. Εδώ μόνο η γραμμή, που έχει μια πράξη παραπάνω («ήρθε»). */
.prt-line { break-inside: avoid; }
.prt-sheet .ro-tools a { text-decoration: none; }

@media (max-width: 719px) {
  .prt-pair { grid-template-columns: minmax(0, 1fr); }
  .prt-act .ho-big, .prt-act .ghost { flex: 1 1 100%; }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * 🗂 Ο ΠΙΝΑΚΑΣ-ΕΡΓΑΛΕΙΟ (`.dt-*`) — Η ΟΨΗ ΓΡΑΦΕΙΟΥ ΤΩΝ ΠΥΚΝΩΝ ΛΙΣΤΩΝ (0126)
 *
 * ΤΟ ΑΙΤΗΜΑ, ΑΥΤΟΥΣΙΟ (ιδιοκτήτης 05/09, με δύο στιγμιότυπα δίπλα-δίπλα): «Δες πόσο πιο ωραίο το
 * Splynx». Στο δικό του: ΜΙΑ γραμμή ανά είδος, στήλες που ταξινομούν, φίλτρα και ψαχτήρι από πάνω,
 * λεπτές γραμμές, εκατό εγγραφές σε μια οθόνη. Στο δικό μας «Ανταλλακτικά»: οκτώ γραμμές σε τρεις
 * κάρτες με τεράστια κενά — δηλαδή τρία scroll για να δεις ό,τι χωρούσε σε μισή οθόνη.
 *
 * ΓΙΑΤΙ ΔΕΝ ΕΙΝΑΙ «ΑΛΛΟ ΓΟΥΣΤΟ» ΑΛΛΑ ΑΛΛΗ ΔΟΥΛΕΙΑ: η κάρτα απαντά «τι συμβαίνει σε ΑΥΤΟ», ο πίνακας
 * απαντά «τι συμβαίνει σε ΟΛΑ, και ποια ξεχωρίζουν». Το δεύτερο είναι δουλειά ΓΡΑΦΕΙΟΥ — γίνεται με
 * ποντίκι, σε 1440 px, από κάποιον που συγκρίνει. Γι' αυτό ο πίνακας ΔΕΝ αντικαθιστά τις κάρτες:
 * κάθεται δίπλα τους, ΚΑΙ ΤΑ ΔΥΟ ΣΩΜΑΤΑ ΥΠΑΡΧΟΥΝ ΠΑΝΤΑ ΣΤΟ DOM και τα διαλέγει ΕΔΩ ο browser στα 900
 * (ίδιο σκαλοπάτι και ίδιος λόγος με την Κάλυψη: η JS δεν μετρά πλάτη παραθύρου, άρα μια περιστροφή
 * συσκευής δεν χρειάζεται listener για να δείξει τη σωστή όψη).
 *
 * 🏛 ΤΙ ΔΑΝΕΙΖΕΤΑΙ ΑΠΟ ΤΟΝ ΝΟΜΟ, ΓΡΑΜΜΗ-ΓΡΑΜΜΗ:
 *   §2 οι κεφαλίδες στηλών είναι ΜΙΚΡΟ-ΕΤΙΚΕΤΕΣ ΚΕΦΑΛΑΙΩΝ (η ΘΕΣΗ λέει ήδη τι είναι), οι κεφαλίδες
 *      ομάδας είναι ΕΤΙΚΕΤΕΣ ΛΩΡΙΔΑΣ (`--fs-s`, semi, .05em, μελάνι) — καμία τέταρτη βαθμίδα.
 *   §4 κανένα νέο σχήμα πλακιδίου: το όχημα φοράει το ΥΠΑΡΧΟΝ `.pill`, τα φίλτρα τα ΥΠΑΡΧΟΝΤΑ `.chip`.
 *   §5 κάθε αριθμός/ημερομηνία/κωδικός φοράει `.num` — σε στήλη πενήντα γραμμών, τα αναλογικά ψηφία
 *      ΕΙΝΑΙ η «καμία στοίχιση» που πιάνει το μάτι πριν διαβάσει λέξη.
 *   §7 η ΕΠΙΛΟΓΗ βάφεται accent (επιλογή, όχι κατάσταση — ίδιο λεξιλόγιο με `.chip.active` και
 *      `.mod-chip.picked`)· καμία κατάσταση δεν μπαίνει σε περίγραμμα γραμμής.
 *   §8 η οριζόντια κύλιση ζει ΜΕΣΑ στο δοχείο του πίνακα, ποτέ στη σελίδα.
 *
 * 🚨 ΚΑΜΙΑ ΣΤΗΛΗ ΔΕΝ ΜΕΤΡΙΕΤΑΙ ΑΠΟ ΤΟ ΚΕΙΜΕΝΟ ΤΗΣ — το μάθημα των Μισθώσεων, εδώ ως `table-layout:
 * fixed` + `<colgroup>` με ΔΗΛΩΜΕΝΑ πλάτη. Χωρίς αυτό, η στήλη «Πάνελ πλευρικής πόρτας οικίσκου»
 * γίνεται διπλάσια από τη «Ποσ.» και όλες οι υπόλοιπες μετακινούνται σε κάθε αλλαγή δεδομένων ή
 * γλώσσας. Τα πλάτη δηλώνονται ΣΕ ΠΟΣΟΣΤΟ (όχι `auto`, όχι `max-content`): στο fixed layout το
 * ποσοστό μετριέται από το ΠΛΑΤΟΣ ΤΟΥ ΠΙΝΑΚΑ, δηλαδή δίνει ΤΟ ΙΔΙΟ πλάτος σε κάθε γραμμή κάθε ομάδας
 * χωρίς να κοιτάξει ούτε ένα γράμμα. Το πάτωμα το βάζει το `min-inline-size` της κάθε οθόνης.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* ---- η μπάρα εργαλείων: τα ΥΠΑΡΧΟΝΤΑ chips + δύο κόσκινα + το πλήθος. Ίδιο σχήμα με το `.fleet-tools`. */
.dt-tools { display: flex; align-items: center; gap: var(--sp-4); flex-wrap: wrap; }
/* Το γενικό `select` πιάνει 22rem και θα έσπρωχνε το ψαχτήρι στην επόμενη σειρά — εδώ είναι κόσκινο
   δίπλα σε κόσκινα, και έχει το ύψος των chip που στέκονται αριστερά του. */
.dt-pick {
  flex: 0 1 12rem; min-width: 0; max-width: 14rem;
  font-size: var(--fs-s); padding: var(--sp-2) var(--sp-4);
}
.dt-search {
  flex: 1 1 10rem; min-width: 0; max-width: 16rem;
  font-size: var(--fs-s); padding: var(--sp-2) var(--sp-4);
}
.dt-search::-webkit-search-cancel-button { cursor: pointer; margin-inline-start: var(--sp-2); }
/* Το πλήθος είναι ΨΙΛΑ: δεξιά, και με τα τρία μαζί του νόμου §3 ώστε να μη γυρίσει αριστερά όταν τυλίξει. */
.dt-count {
  margin-inline-start: auto; text-align: end;
  color: var(--muted); font-size: var(--fs-s);
}

@media (max-width: 719px) {
  .dt-pick, .dt-search { flex: 1 1 100%; max-width: none; }
  .dt-count { margin-inline-start: 0; text-align: start; }
}

/* ---- το δοχείο: ΔΙΚΗ ΤΟΥ ΚΥΛΙΣΗ ΚΑΙ ΔΙΚΟ ΤΟΥ ΥΨΟΣ.
   Και τα δύο είναι απαίτηση, όχι γούστο: το `sticky` της κεφαλίδας χρειάζεται ΤΟΝ ΔΙΚΟ ΤΟΥ κύλινδρο —
   χωρίς όριο ύψους το δοχείο μεγαλώνει όσο ο πίνακας, δεν κυλά ποτέ, και η κεφαλίδα «κολλάει» σε κάτι
   ακίνητο. Και χωρίς `overflow` η οριζόντια κύλιση θα έβγαινε στη ΣΕΛΙΔΑ (νόμος §8). Τα 68vh είναι
   ΑΝΩΤΑΤΟ: σε μικρή λίστα δεν ενεργοποιείται καν. */
.dt-wrap {
  overflow: auto; max-block-size: 68vh; overscroll-behavior: contain;
  border: 1px solid var(--line); border-radius: var(--r-s); background: var(--card);
}
.dt {
  inline-size: 100%; min-inline-size: var(--dt-min, 0);
  table-layout: fixed; border-collapse: separate; border-spacing: 0;
  font-size: var(--fs-s);
}
/* ΜΙΑ ΓΡΑΜΜΗ ΑΝΑ ΕΙΔΟΣ ΣΗΜΑΙΝΕΙ ΜΙΑ ΓΡΑΜΜΗ: ό,τι δεν χωρά κόβεται με «…» ΚΑΙ κρατά το πλήρες κείμενο
   σε `title` (το βάζει η οθόνη). Δύο σειρές μέσα σε κελί χαλάνε τον ρυθμό ΟΛΟΥ του πίνακα — και ο
   πίνακας υπάρχει ακριβώς για τον ρυθμό. */
.dt th, .dt td {
  padding: var(--sp-2) var(--sp-3);
  border-block-end: 1px solid var(--line);
  vertical-align: middle; text-align: start; font-weight: var(--fw-reg);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dt tbody tr:last-child td { border-block-end: 0; }
.dt-end, .dt-end .dt-sort { text-align: end; justify-content: flex-end; }

/* Η ΚΕΦΑΛΙΔΑ ΜΕΝΕΙ ΣΤΟ ΜΑΤΙ ΟΣΟ ΚΥΛΑΣ: στην πεντηκοστή γραμμή κανείς δεν θυμάται ποια στήλη είναι η
   τρίτη. Η τρίχα της μπαίνει με `inset box-shadow` και όχι με `border`: το περίγραμμα ενός `sticky`
   κελιού ξεκολλά και ζωγραφίζεται λάθος κατά την κύλιση (το ίδιο που έμαθε ο πίνακας της Κάλυψης). */
.dt thead th {
  position: sticky; inset-block-start: 0; z-index: 2;
  padding: 0; background: var(--card); border-block-end: 0;
  box-shadow: inset 0 -1px 0 var(--line);
}
.dt-sort {
  display: flex; align-items: center; gap: var(--sp-2);
  inline-size: 100%; min-block-size: 36px; padding: var(--sp-2) var(--sp-3);
  background: none; border: 0; border-radius: 0;
  font: inherit; font-size: var(--fs-xs); font-weight: var(--fw-semi); letter-spacing: .06em;
  text-transform: uppercase; color: var(--muted); text-align: start; cursor: pointer;
}
.dt-sort:hover { filter: none; background: var(--hover); color: var(--ink); }
.dt-sort.on { color: var(--ink); }
/* Κεφαλίδα στήλης ΠΟΥ ΔΕΝ ΤΑΞΙΝΟΜΕΙ (0126 β): ίδια μικρο-ετικέτα, καμία υπόσχεση πατήματος. Υπάρχει
   επειδή μια στήλη μπορεί να μη ΣΥΓΚΡΙΝΕΤΑΙ — π.χ. «Απομένει», που γράφει άλλοτε χιλιόμετρα και
   άλλοτε μέρες. Ένα βελάκι εκεί θα υποσχόταν σειρά που δεν υπάρχει. */
.dt-sort.dt-fixed { cursor: default; }
.dt-sort.dt-fixed:hover { background: none; color: var(--muted); }
.dt-sort-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
/* ΤΟ ΒΕΛΑΚΙ ΤΟΥ ΣΠΙΤΙΟΥ, ΓΥΡΙΣΜΕΝΟ (νόμος §3): σβηστό στις στήλες που δεν ταξινομούν τώρα, μισό στο
   ποντίκι («πατιέμαι»), ολόκληρο και σε accent στην ενεργή — accent γιατί εδώ λέει ΠΛΟΗΓΗΣΗ μέσα στα
   δεδομένα, όχι κατάσταση των δεδομένων. */
.dt-caret { display: flex; flex: none; color: var(--muted); opacity: 0;
            transition: opacity var(--t) var(--ease); }
.dt-sort:hover .dt-caret { opacity: .45; }
.dt-sort.on .dt-caret { opacity: 1; color: var(--accent); }
.dt-caret.up { transform: rotate(90deg); }
.dt-caret.down { transform: rotate(-90deg); }

/* ---- οι γραμμές */
.dt-row { background: var(--card); }
.dt-row:hover { background: var(--hover); }
.dt-row.picked, .dt-row.picked:hover { background: var(--accent-soft); }
/* ΤΟ ΚΕΛΙ ΕΙΝΑΙ Ο ΣΤΟΧΟΣ, ΟΧΙ ΤΟ ΚΟΥΤΑΚΙ ΤΩΝ 16 px: το `<label>` γεμίζει το κελί σε ύψος δαχτύλου.
   (Στο κινητό ΟΛΟΚΛΗΡΗ η γραμμή είναι ο στόχος — αλλά εκεί ζουν οι κάρτες, όχι ο πίνακας.) */
.dt-tick {
  display: flex; align-items: center; justify-content: center;
  inline-size: 100%; min-block-size: 36px; margin: 0; padding: 0; cursor: pointer;
}

/* ---- η κεφαλίδα ομάδας ΜΕΣΑ στον πίνακα: ίδια υπόσχεση με το `.rn-group` των Μισθώσεων, ίδιο σχήμα.
   Κρατά την ομαδοποίηση που ΔΕΝ επιτρέπεται να χαθεί («ό,τι χρωστάω στη Dometic, τώρα» = ένα tap) και
   κουβαλά το «Επιλογή όλων» της ομάδας εκεί που το έψαχνε ήδη το χέρι. */
.dt-grouprow > td { padding: 0; background: var(--card2); }
.dt-group {
  display: flex; align-items: baseline; gap: var(--sp-3);
  min-block-size: 32px; padding: var(--sp-2) var(--sp-3);
}
.dt-group-name { font-size: var(--fs-s); font-weight: var(--fw-semi); letter-spacing: .05em;
                 color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.dt-group .link { margin-inline-start: auto; flex: none; }

/* ---- η ζώνη ταυτότητας οχήματος μέσα σε κελί: το πλακίδιο κρατά ΤΟ ΔΙΚΟ του πλάτος και κόβεται με «…»
   μόνο στην υπερβολή. `block` γιατί το `text-overflow` δεν πιάνει σε flex container (`.pill`). */
/* ΣΒΗΝΕΙΣ ΤΟ ΦΟΝΤΟ ⇒ ΞΑΝΑΔΗΛΩΝΕΙΣ ΤΟ ΜΕΛΑΝΙ (κανόνας του σπιτιού): χωρίς `color`, το κουμπί κληρονομεί
   το λευκό `--on-accent` και εξαφανίζεται στο ανοιχτό θέμα. Το χρώμα το δίνει ούτως ή άλλως το πλακίδιο
   μέσα του — αλλά η δήλωση είναι που το κρατά αληθινό όταν αύριο μπει και μια λέξη δίπλα. */
button.dt-veh {
  display: flex; align-items: center; inline-size: 100%; min-block-size: 30px;
  padding: 0; background: none; border: 0; border-radius: var(--r-s);
  color: var(--ink); text-align: start;
}
button.dt-veh:hover { filter: none; }
button.dt-veh .pill { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
button.dt-veh:hover .pill { background: var(--accent-soft); color: var(--accent); }

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * ΑΝΤΑΛΛΑΚΤΙΚΑ · ΟΙ ΔΙΚΕΣ ΤΟΥΣ ΣΤΗΛΕΣ (0126)
 *
 * ΤΑ ΠΛΑΤΗ ΕΙΝΑΙ ΥΠΟΛΟΓΙΣΜΟΣ, ΟΧΙ ΓΟΥΣΤΟ. Στο πάτωμα των 58rem (928 px) βγαίνουν: επιλογή 37,
 * περιγραφή 213, κωδικοί 121, όχημα 102 (όσο και η ζώνη `--rn-veh-col` των Μισθώσεων, με τον ίδιο
 * λογαριασμό: «Grey Matter» ≈ 85 px + αέρας), αφορά 148, κατασκευαστής 102, ποσότητα 46, κατάσταση 93,
 * άφιξη 65. Κάτω από αυτό το πάτωμα ο πίνακας κυλά ΜΕΣΑ ΣΤΟ ΔΟΧΕΙΟ ΤΟΥ — ποτέ η σελίδα.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.prt-table { --dt-min: 58rem; }
.prt-c-tick  { inline-size: 4%; }
.prt-c-what  { inline-size: 23%; }
.prt-c-code  { inline-size: 13%; }
.prt-c-veh   { inline-size: 11%; }
.prt-c-for   { inline-size: 16%; }
.prt-c-maker { inline-size: 11%; }
.prt-c-qty   { inline-size: 5%; }
.prt-c-st    { inline-size: 10%; }
.prt-c-eta   { inline-size: 7%; }

/* ΔΥΟ ΣΩΜΑΤΑ, ΜΙΑ ΑΛΗΘΕΙΑ: κάρτες στο πεδίο (ο τεχνικός με το γάντι), πίνακας στο γραφείο (ο υπεύθυνος
   που παραγγέλνει). Και τα δύο δείχνουν ΤΟ ΙΔΙΟ φιλτραρισμένο σύνολο — δύο διαφορετικά σύνολα στην ίδια
   οθόνη είναι ο πιο σίγουρος τρόπος να παραγγείλει κάποιος λάθος γραμμή. */
.prt-desk { display: none; }
@media (min-width: 900px) {
  .prt-cards { display: none; }
  .prt-desk { display: block; }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * 🗂 ΤΟ ΙΔΙΟ ΠΙΝΑΚΟΕΙΔΕΣ ΣΕ ΟΛΗ ΤΗΝ ΠΥΛΗ ΣΥΝΤΗΡΗΣΗΣ, ΣΤΟΝ ΣΤΟΛΟ ΚΑΙ ΣΤΙΣ ΜΙΣΘΩΣΕΙΣ (0126 β)
 *
 * ΤΟ ΑΙΤΗΜΑ, ΑΥΤΟΥΣΙΟ (ιδιοκτήτης 05/09, αφού είδε τα Ανταλλακτικά): «ναι ρε ναι, αυτό είναι!» — και
 * αμέσως μετά: «σε ΟΛΗ τη Συντήρηση». Άρα εδώ δεν γεννιέται δεύτερο ιδίωμα: κάθε οθόνη φέρνει ΜΟΝΟ
 * ΤΙΣ ΔΙΚΕΣ ΤΗΣ ΣΤΗΛΕΣ (πλάτος + όνομα), και όλα τα υπόλοιπα — δοχείο, κεφαλίδα που κολλάει, βελάκι,
 * γραμμή, hover, κεφαλίδα ομάδας — τα δίνουν οι κοινές `.dt-*` από πάνω.
 *
 * 🚨 ΚΑΙ ΤΟ ΣΚΑΛΟΠΑΤΙ ΕΙΝΑΙ ΕΝΑ ΚΑΙ ΤΟ ΙΔΙΟ: 900 px, στο CSS. Στο κινητό μένουν ΠΑΝΤΑ οι υπάρχουσες
 * κάρτες/λίστες, αυτούσιες — ο πίνακας στα 390 px είναι δύο κελιά ορατά και έξι έξω από την οθόνη.
 * Καμία οθόνη δεν μετρά `innerWidth`: μια περιστροφή συσκευής δεν επιτρέπεται να χρειάζεται listener.
 *
 * ΤΑ ΠΛΑΤΗ ΕΙΝΑΙ ΠΟΣΟΣΤΑ (νόμος του `.dt`, `table-layout: fixed`): μετριούνται από το πλάτος ΤΟΥ
 * ΠΙΝΑΚΑ, άρα δίνουν το ΙΔΙΟ πλάτος σε κάθε γραμμή κάθε ομάδας χωρίς να διαβάσουν ούτε ένα γράμμα.
 * Το πάτωμα το βάζει το `--dt-min` της κάθε οθόνης, και κάτω από αυτό κυλά ΤΟ ΔΟΧΕΙΟ — ποτέ η σελίδα.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */

/* ---- ΠΡΟΓΡΑΜΜΑ ΣΥΝΤΗΡΗΣΗΣ · μία γραμμή ανά ρολόι.
   Πάτωμα 56rem (896 px): όχημα 108, είδος 215, τελευταία 161, λήξη 117, απομένει 135, κατάσταση 90,
   ραντεβού 72. Η ζώνη του οχήματος είναι η ΙΔΙΑ των Μισθώσεων και των Ανταλλακτικών, με τον ίδιο
   λογαριασμό («Grey Matter» ≈ 85 px + αέρας). */
.mnt-table   { --dt-min: 56rem; }
.mnt-c-veh   { inline-size: 12%; }
.mnt-c-what  { inline-size: 24%; }
.mnt-c-last  { inline-size: 18%; }
.mnt-c-due   { inline-size: 13%; }
.mnt-c-left  { inline-size: 15%; }
.mnt-c-st    { inline-size: 10%; }
.mnt-c-act   { inline-size: 8%; }

/* ---- ΖΗΜΙΕΣ ΣΤΟΛΟΥ · μία γραμμή ανά ζημιά, ΜΕΣΑ στο στάδιό της (οι κεφαλίδες σταδίου μένουν έξω,
   ως `.rn-group`, ακριβώς όπως χθες). */
.dfl-table   { --dt-min: 58rem; }
.dfl-c-veh   { inline-size: 12%; }
.dfl-c-what  { inline-size: 30%; }
.dfl-c-sev   { inline-size: 12%; }
.dfl-c-st    { inline-size: 26%; }
.dfl-c-when  { inline-size: 20%; }

/* ---- ΣΤΟ ΣΥΝΕΡΓΕΙΟ · μία γραμμή ανά όχημα που λείπει (ή που φεύγει). */
.asv-table   { --dt-min: 56rem; }
.asv-c-veh   { inline-size: 13%; }
.asv-c-kind  { inline-size: 22%; }
.asv-c-left  { inline-size: 16%; }
.asv-c-back  { inline-size: 29%; }
.asv-c-work  { inline-size: 10%; }
.asv-c-act   { inline-size: 10%; }

/* ---- ΣΤΟΛΟΣ · η ΕΝΑΛΛΑΚΤΙΚΗ όψη, δίπλα στις κάρτες (οι κάρτες μένουν ΠΡΟΕΠΙΛΟΓΗ: η εποπτεία των
   δαχτυλιδιών δεν αντικαθίσταται από στήλη αριθμών). Εννιά στήλες θέλουν πάτωμα 62rem. */
.flt-table   { --dt-min: 62rem; }
.flt-c-veh   { inline-size: 13%; }
.flt-c-plate { inline-size: 10%; }
.flt-c-st    { inline-size: 11%; }
.flt-c-batt  { inline-size: 9%; }
.flt-c-water { inline-size: 9%; }
.flt-c-gas   { inline-size: 9%; }
.flt-c-on    { inline-size: 12%; }
.flt-c-al    { inline-size: 9%; }
.flt-c-next  { inline-size: 18%; }

/* Η ΚΟΥΚΚΙΔΑ ΤΗΣ ΣΥΝΔΕΣΗΣ ΜΕΣΑ ΣΕ ΚΕΛΙ: το ΥΠΑΡΧΟΝ `.dot` της κάρτας, με τη λέξη δίπλα του — χρώμα
   ΚΑΙ λέξη, ποτέ μόνο χρώμα (§2 του GUI_SPEC: διαβάζεται και ασπρόμαυρο). */
.dt-on { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; }
.dt-on > span:last-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* ---- ΤΑ ΔΥΟ ΣΩΜΑΤΑ ΚΑΘΕ ΟΘΟΝΗΣ, ΜΕ ΤΟ ΕΝΑ ΣΚΑΛΟΠΑΤΙ. Ίδιος κανόνας, τέσσερις φορές — γραμμένος
   ρητά ανά οθόνη ώστε καμία να μη χάσει το σώμα της αν αύριο φύγει μια από τις υπόλοιπες. */
.mnt-desk, .dfl-desk, .asv-desk, .flt-desk, .usr-desk { display: none; }
@media (min-width: 900px) {
  .mnt-cards, .dfl-cards, .asv-cards, .usr-cards { display: none; }
  .mnt-desk, .dfl-desk, .asv-desk, .flt-desk, .usr-desk { display: block; }
  /* Ο ΣΤΟΛΟΣ ΕΙΝΑΙ Η ΕΞΑΙΡΕΣΗ, ΚΑΙ ΕΙΝΑΙ ΑΠΟΦΑΣΗ: εκεί οι κάρτες ΔΕΝ σβήνουν από το σκαλοπάτι αλλά
     από ΕΠΙΛΟΓΗ του ανθρώπου (`?view=table`) — γι' αυτό το `off` το βάζει η οθόνη. Στο κινητό ο
     κανόνας δεν ισχύει καθόλου: ό,τι κι αν λέει η διεύθυνση, κάτω από τα 900 px βλέπεις κάρτες. */
  .flt-cards.off { display: none; }
}

/* ---- ΧΡΗΣΤΕΣ · μία γραμμή ανά άνθρωπο. Πάτωμα 56rem: όνομα 161, email 197, ομάδες 197 (χωρούν δύο
   πλακίδια και το «+»), κατάσταση 81, όχημα 81, πρόσβαση 90, ενέργειες 90 (ένας σύνδεσμος).
   ΤΟ ΠΛΑΤΟΣ ΜΕΤΑΚΙΝΗΘΗΚΕ ΑΠΟ ΤΙΣ ΕΝΕΡΓΕΙΕΣ ΣΤΙΣ ΟΜΑΔΕΣ (06/09) και είναι απόφαση: η ανάκληση έφυγε από
   τη στήλη πράξεων (ζει στο × κάθε πλακιδίου), ενώ οι ομάδες είναι πια ΠΟΛΛΕΣ ανά άνθρωπο. */
.usr-table   { --dt-min: 56rem; }
.usr-c-who   { inline-size: 18%; }
.usr-c-mail  { inline-size: 22%; }
.usr-c-role  { inline-size: 22%; }
.usr-c-st    { inline-size: 9%; }
.usr-c-veh   { inline-size: 9%; }
.usr-c-since { inline-size: 10%; }
.usr-c-act   { inline-size: 10%; }
/* Τα πλακίδια ΤΥΛΙΓΟΥΝ ΜΕΣΑ ΣΤΟ ΚΕΛΙ, κι ας είναι το `.dt td` σε `nowrap`: το `flex-wrap` δεν το ρωτά,
   αλλά το κείμενο ΜΕΣΑ στο πλακίδιο το κληρονομεί — γι' αυτό λέγεται ρητά εδώ. Χωρίς αυτό, τρεις ομάδες
   με μεγάλα ονόματα σπρώχνουν τον πίνακα σε οριζόντια κύλιση αντί να πιάσουν δύο σειρές. */
.usr-table .usr-groups { white-space: normal; }
.usr-acts { gap: var(--sp-3); justify-content: flex-end; flex-wrap: nowrap; }

/* ΜΙΑ ΣΕΙΡΑ ΠΟΥ ΑΝΑΠΝΕΕΙ, ΜΕΣΑ ΣΕ ΠΙΝΑΚΑ ΠΟΥ ΔΕΝ ΤΥΛΙΓΕΙ (0126 β): ο σύνδεσμος εισόδου ζει ΚΑΤΩ ΑΠΟ
   ΤΗ ΓΡΑΜΜΗ ΤΟΥ ΑΝΘΡΩΠΟΥ ΤΟΥ (04/09) και είναι μακρύ URL — με το `nowrap` του `.dt td` θα κοβόταν
   ακριβώς το πράγμα που ήρθε να αντιγραφεί. Ο κανόνας είναι κοινός: κάθε πίνακας που θα χρειαστεί
   αύριο μια σειρά-πλαίσιο (προεπισκόπηση, σφάλμα, φόρμα) τη βρίσκει έτοιμη. */
.dt-wide > td { white-space: normal; overflow: visible; padding: var(--sp-3); background: var(--card2); }

/* ---- ΜΙΣΘΩΣΕΙΣ · Η ΚΕΦΑΛΙΔΑ ΠΟΥ ΤΑΞΙΝΟΜΕΙ, ΠΑΝΩ ΑΠΟ ΤΙΣ ΟΜΑΔΕΣ (0126 β)
 *
 * ΕΔΩ ΔΕΝ ΜΠΑΙΝΕΙ `<table>`, ΚΑΙ ΕΙΝΑΙ ΑΠΟΦΑΣΗ: η λίστα των Μισθώσεων ΕΙΝΑΙ ΗΔΗ πίνακας — πέντε ζώνες
 * πλέγματος από τις 05/09, με τα ίδια πλάτη σε κάθε ομάδα. Ό,τι της έλειπε ήταν ΤΑ ΟΝΟΜΑΤΑ ΤΩΝ ΣΤΗΛΩΝ
 * και το βελάκι που ταξινομεί. Ένας πίνακας από την αρχή θα ξανάγραφε μια γραμμή που μόλις δούλεψε.
 *
 * Η ΚΕΦΑΛΙΔΑ ΦΟΡΑΕΙ ΤΟ ΙΔΙΟ ΠΛΕΓΜΑ ΜΕ ΤΗ ΓΡΑΜΜΗ (ίδιες μεταβλητές, ίδια σειρά ζωνών) και το ΙΔΙΟ
 * padding — αλλιώς οι λέξεις θα κάθονταν δύο-τρία pixel αριστερότερα από τα δεδομένα τους, που είναι
 * χειρότερο από καθόλου κεφαλίδα. Το `.rn-caret` της γραμμής αντισταθμίζεται με ίσο κενό στο τέλος. */
.rn-head { display: none; }
@media (min-width: 900px) {
  .rn-head {
    display: grid;
    grid-template-columns: minmax(0, 1.5fr) var(--rn-veh-col) var(--rn-plate-col)
                           minmax(0, 1.5fr) minmax(0, 1.3fr);
    column-gap: var(--sp-5);
    align-items: center;
    /* Το τελευταίο κενό είναι το βελάκι της γραμμής (18 px) + το `gap` της (`--sp-4`). */
    padding: 0 calc(var(--sp-5) + 18px + var(--sp-4)) 0 var(--sp-5);
    margin-block-end: calc(-1 * var(--sp-2));
  }
  .rn-head .dt-sort { padding-inline: 0; min-block-size: 32px; }
  /* Οι δύο ώρες μοιράζονται ΤΗ ΜΙΑ ζώνη της γραμμής (`.rn-when` γράφει «παραλαβή → επιστροφή»): δύο
     κεφαλίδες μέσα της, με το ίδιο βελάκι η καθεμιά. */
  .rn-head-when { display: flex; align-items: center; gap: var(--sp-3); min-width: 0; }
  .rn-head-when .dt-sort { inline-size: auto; }
}

/* ══════════════════════════════════════════════════════════════════════════════════════════════════
 * 💶 ΚΟΣΤΟΣ AI — Η ΔΙΑΣΤΑΥΡΩΣΗ ΜΕ ΤΟΝ ΛΟΓΑΡΙΑΣΜΟ ΤΟΥ ΠΑΡΟΧΟΥ (0130, 05/09)
 *
 * ΔΥΟ ΣΩΜΑΤΑ, ΜΙΑ ΑΛΗΘΕΙΑ (κανόνας πεδίου 02/09): πίνακας στο γραφείο, κάρτες στο κινητό — και τα
 * ΔΙΑΛΕΓΕΙ ΤΟ CSS, όχι η JS (μια περιστροφή συσκευής δεν επιτρέπεται να χρειάζεται listener).
 * Το σκαλοπάτι είναι το ίδιο 900 px που χρησιμοποιούν οι Ρυθμίσεις και τα Μηνύματα: εννιά στήλες
 * κάτω από αυτό είναι δύο κελιά ορατά και επτά έξω από την οθόνη, δηλαδή καμία απάντηση.
 * ══════════════════════════════════════════════════════════════════════════════════════════════════ */
.aic-big { font-size: var(--fs-xl); }
.aic-sums { gap: var(--sp-5); }
.aic-chip { display: flex; flex-direction: column; gap: var(--sp-1); }
.aic-bar { margin-block: var(--sp-4); }
.aic-bar .picked { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }

/* ΤΟ ΟΡΙΖΟΝΤΙΟ ΣΚΡΟΛ ΖΕΙ ΜΕΣΑ ΣΤΟ ΚΟΥΤΙ ΤΟΥ ΠΙΝΑΚΑ, ΠΟΤΕ ΣΤΗ ΣΕΛΙΔΑ: μια σελίδα που κουνιέται
   πλάγια σπάει κάθε άλλη οθόνη του προϊόντος. */
.aic-wrap { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--r);
            background: var(--card); }
.aic-table { min-width: 62rem; }
.aic-table th, .aic-table td { white-space: nowrap; }
.aic-table .num { text-align: end; }
.aic-sub th { font-size: var(--fs-xs); padding-block: 0 var(--sp-2); border-block-end: 1px solid var(--line); }
.aic-model { color: var(--muted); }
/* Η ΓΡΑΜΜΗ ΜΕ ΑΠΟΚΛΙΣΗ ΞΕΧΩΡΙΖΕΙ ΑΠΟ ΤΗΝ ΑΚΡΗ, ΟΧΙ ΑΠΟ ΓΕΜΙΣΜΑ: ο άνθρωπος σκανάρει την αριστερή
   στήλη, και ένα βαμμένο φόντο σε δέκα γραμμές είναι θόρυβος αντί για σήμα. */
.aic-warn td:first-child { box-shadow: inset 3px 0 0 var(--warn); }
.aic-day { background: none; border: 0; padding: 0; display: flex; align-items: center; gap: var(--sp-2);
           color: inherit; cursor: pointer; font: inherit; min-height: 2.75rem; }
.aic-caret { color: var(--muted); }
.aic-kids td { background: var(--hover); }

.aic-list { display: none; }
.aic-tri { gap: var(--sp-3); }
.aic-list .aic-warn { border-color: var(--warn); }

@media (max-width: 899px) {
  .aic-wrap { display: none; }
  .aic-list { display: flex; flex-direction: column; }
}

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * 🗂 ΟΙ ΡΥΘΜΙΣΕΙΣ ΣΕ ΟΜΑΔΕΣ — ΤΟ ΠΡΟΤΥΠΟ ΤΟΥ SPLYNX (Vassilis 05/09)
 *
 * ΤΟ ΠΑΡΑΠΟΝΟ, ΑΥΤΟΥΣΙΟ: «όλα χύμα χωρίς λογική» — και δίπλα του το Splynx Config, όπου κάθε ομάδα
 * (System / Main / Finance) είναι ΕΝΑ πάνελ με χρωματιστή ράβδο αριστερά και μέσα ένα πλέγμα από
 * συνδέσμους με εικονίδια. Ο άνθρωπος σαρώνει ΤΙΤΛΟΥΣ ΟΜΑΔΩΝ, όχι δεκαεννιά ουσιαστικά στη σειρά.
 *
 * Η ΡΑΒΔΟΣ ΕΙΝΑΙ ACCENT ΚΑΙ ΟΧΙ ΕΠΤΑ ΧΡΩΜΑΤΑ: το accent είναι ΤΑΥΤΟΤΗΤΑ ΚΑΙ ΠΛΟΗΓΗΣΗ (νόμος §7), και
 * αυτό ακριβώς είναι μια ομάδα του καταλόγου. Επτά διαφορετικά χρώματα θα δανείζονταν το κεχριμπαρένιο
 * και το κόκκινο — δηλαδή τη γλώσσα της ΚΑΤΑΣΤΑΣΗΣ — για να πουν «άλλη ομάδα», και μετά κανείς δεν θα
 * διάβαζε το κόκκινο ως κίνδυνο. Η ΜΟΝΗ εξαίρεση είναι τα δικά μας εργαλεία (`.stg-grp-ours`, μουντό:
 * δεν είναι ρύθμιση του πελάτη) και η επικίνδυνη ζώνη του οχήματος (`.stg-grp-danger`).
 *
 * ΤΟ ΠΛΕΓΜΑ ΕΙΝΑΙ ΤΟ ΚΟΙΝΟ `.grid` ΤΟΥ ΣΠΙΤΙΟΥ, ΟΧΙ ΔΕΥΤΕΡΟ: `auto-fill` με ελάχιστο 17rem δίνει
 * τέσσερις στήλες στο γραφείο και ΜΙΑ στα 390 px, χωρίς media query και χωρίς listener στη JS —
 * ακριβώς όπως κάθε άλλο πλέγμα πλακιδίων του προϊόντος.
 * ════════════════════════════════════════════════════════════════════════════════════════════════════ */
.stg-grp {
  display: flex; flex-direction: column; gap: var(--sp-4);
  background: var(--card); border: 1px solid var(--line);
  border-inline-start: 3px solid var(--accent); border-radius: var(--r);
  padding: var(--sp-5) var(--sp-6) var(--sp-6);
}
/* ΤΟ ΚΕΝΟ ΤΟ ΔΙΝΕΙ ΤΟ `gap` ΤΟΥ ΠΑΝΕΛ ΚΑΙ ΟΧΙ ΤΟ ΠΕΡΙΘΩΡΙΟ ΤΟΥ ΤΙΤΛΟΥ: έτσι το ίδιο πάνελ κρατά τον
   ίδιο ρυθμό είτε από κάτω του κάθεται πλέγμα πλακιδίων (κατάλογος) είτε κάρτες (ρυθμίσεις οχήματος). */
.stg-grp-title { margin: 0; font-size: var(--fs-l); font-weight: var(--fw-semi); }
.stg-grp-ours { border-inline-start-color: var(--muted); }
/* Η ΕΠΙΚΙΝΔΥΝΗ ΖΩΝΗ ΤΟΥ ΟΧΗΜΑΤΟΣ: το κόκκινο εδώ ΔΕΝ είναι κατάσταση («κάτι χάλασε») — είναι
   προειδοποίηση για το ΤΙ ΘΑ ΚΑΝΕΙ ο άνθρωπος αν πατήσει μέσα. Γι’ αυτό μένει ράβδος και δεν βάφει
   ούτε φόντο ούτε κείμενο: μια κόκκινη κάρτα σε σελίδα ρυθμίσεων διαβάζεται ως βλάβη. */
.stg-grp-danger { border-inline-start-color: var(--crit); }
/* Το εικονίδιο μπροστά από το όνομα — μουντό, γιατί το σήμα είναι το ΣΧΗΜΑ του, όχι το χρώμα του. */
.stg-hub-ico { flex: none; display: inline-flex; color: var(--muted); }

/* Η ΕΠΙΚΕΦΑΛΙΔΑ ΟΜΑΔΑΣ ΜΕΣΑ ΣΤΗ ΣΤΗΛΗ ΤΟΥ ΓΡΑΦΕΙΟΥ: ίδια τάξη με το hub, ένα σκαλί πιο ήσυχη — δεν
   πατιέται, άρα δεν έχει ούτε ύψος δαχτύλου ούτε περίγραμμα. */
.stg-nav-grp {
  font-size: var(--fs-xs); font-weight: var(--fw-semi); color: var(--muted);
  text-transform: uppercase; letter-spacing: .04em;
  padding: var(--sp-5) var(--sp-4) var(--sp-2);
}
.stg-nav-grp:first-child { padding-block-start: 0; }

/* ---------------------------------------------------------------- «λείπουν στοιχεία επιχείρησης» (κβ, 06/09)
 * Η ΜΠΑΡΑ ΠΡΟΣΟΧΗΣ ΤΟΥ ΣΠΙΤΙΟΥ, ΑΥΤΟΥΣΙΑ (`border-inline-start: 3px solid var(--warn)` + απαλό φόντο) —
 * ίδιο σχήμα με το `.cmp-note` και το `.ho-blocked`, και ΟΧΙ `.card.crit`: δεν χάλασε τίποτα και δεν
 * περιμένει κανείς. Λείπουν στοιχεία που κάποια μέρα θα χρειαστούν σε τιμολόγιο· αυτό είναι `warn`.
 * ΔΕΝ είναι κάρτα: κάθεται ΠΑΝΩ από τις κάρτες, μέσα στη ροή της σελίδας, και το κουμπί της είναι το
 * ίδιο `ghost` με κάθε δευτερεύουσα πράξη — 44 px, γιατί το μισό γραφείο ανοίγει ρυθμίσεις από κινητό. */
.stg-todo {
  display: flex; flex-direction: column; align-items: flex-start; gap: var(--sp-2);
  margin-block-end: var(--sp-5);
  padding: var(--sp-4) var(--sp-5); border-radius: var(--r);
  background: var(--warn-soft); border-inline-start: 3px solid var(--warn);
}
.stg-todo p { margin: 0; }
.stg-todo-what { font-weight: var(--fw-semi); }
.stg-todo button { min-height: 44px; }

/* Η ΤΙΜΗ ΠΟΥ ΔΕΝ ΑΛΛΑΖΕΙ ΑΠΟ ΕΔΩ (σήμερα: η ζώνη ώρας χώρας με ΜΙΑ ζώνη). Κείμενο και όχι κλειδωμένο
   πεδίο: ένα `disabled input` μοιάζει με χαλασμένο πεδίο — ο άνθρωπος το πατάει και δεν γίνεται τίποτα.
   Το βάρος του τίτλου, ώστε να διαβάζεται ως ΑΠΑΝΤΗΣΗ στην ετικέτα από πάνω και όχι ως σχόλιο. */
.stg-ro { font-weight: var(--fw-semi); margin: 0; }

/* ---------------------------------------------------------------- Ρυθμίσεις οχήματος: το μενού αγκύρων
 * ΓΙΑΤΙ ΑΓΚΥΡΕΣ ΚΑΙ ΟΧΙ ΥΠΟ-ΣΕΛΙΔΕΣ (σε αντίθεση με τις Ρυθμίσεις του πελάτη): εδώ ΟΛΑ τα δεδομένα
 * ήρθαν ΗΔΗ με ΕΝΑ αίτημα (`/api/vehicles/<id>`), και ο τεχνικός στην αυλή δουλεύει τη σελίδα από πάνω
 * μέχρι κάτω — μια υπο-σελίδα ανά ομάδα θα ήταν επτά φορτώσεις για μία δουλειά.
 * ΤΟ ΜΕΝΟΥ ΚΥΛΑΕΙ ΜΕΣΑ ΣΤΟΝ ΕΑΥΤΟ ΤΟΥ, ΠΟΤΕ Η ΣΕΛΙΔΑ: μια σελίδα που κουνιέται πλάγια σπάει κάθε άλλη
 * οθόνη του προϊόντος. Και ο στόχος αφής είναι 44 px — γάντι, όρθιος, Ιούλιο (μνήμη 02/09). */
.vst-menu {
  display: flex; gap: var(--sp-2); flex-wrap: nowrap;
  overflow-x: auto; -webkit-overflow-scrolling: touch;
  padding-block-end: var(--sp-1);
}
.vst-menu .chip { flex: none; min-block-size: 44px; }

/* ---------------------------------------------------------------- 📍 ΘΕΣΕΙΣ: ΦΩΤΟ & ΚΛΙΠ (ιστ, 06/09)
 *
 * ΟΘΟΝΗ ΠΕΔΙΟΥ, ΟΧΙ ΟΘΟΝΗ ΓΡΑΦΕΙΟΥ (μνήμη 02/09: «mobile-first, μεγάλα πλήκτρα»): αυτός που τη
 * χρησιμοποιεί στέκεται ΜΕΣΑ στο όχημα με το κινητό στο ένα χέρι και τον φακό στο άλλο. Γι' αυτό:
 *   • ΟΛΟΚΛΗΡΗ Η ΓΡΑΜΜΗ ΕΙΝΑΙ ΚΟΥΜΠΙ, ≥48 px — όχι ένα «επεξεργασία» στην άκρη·
 *   • ΜΙΑ ΘΕΣΗ ΑΝΑ ΟΘΟΝΗ όταν ανοίξει, με ΕΝΑ κουμπί πλήρους πλάτους·
 *   • η κατάσταση λέγεται με ΛΕΞΗ («φωτό» / «κλιπ 12΄΄» / «λείπει») και όχι με τικ: ο τεχνικός πρέπει
 *     να ξέρει ΑΝ αξίζει να ξανατραβήξει, και ένα ✓ δεν το λέει αυτό.
 * ΚΑΝΕΝΑ ΧΡΩΜΑ ΓΡΑΜΜΕΝΟ ΕΔΩ — όλα tokens, όπως όλο το αρχείο. */
.spot-grp { display: flex; flex-direction: column; gap: var(--sp-2); margin-block-start: var(--sp-3); }
.spot-grp-head { align-items: baseline; }
.spot-list { display: flex; flex-direction: column; gap: var(--sp-1); }
.spot-row {
  display: flex; align-items: center; gap: var(--sp-3);
  inline-size: 100%; min-block-size: 48px;
  padding: var(--sp-2) var(--sp-3);
  border: 1px solid var(--line); border-radius: var(--r-s);
  background: var(--card2); color: var(--ink);
  font: inherit; text-align: start; cursor: pointer;
}
.spot-row:hover { background: var(--hover); filter: none; }
/* Η ΣΥΜΠΛΗΡΩΜΕΝΗ ΘΕΣΗ ΞΕΧΩΡΙΖΕΙ ΜΕ ΔΑΧΤΥΛΙΔΙ ΑΠΟ ΜΕΣΑ, ΟΧΙ ΜΕ ΠΕΡΙΓΡΑΜΜΑ ΤΟΝΟΥ: το `--ok` σε border
   είναι κατάσταση, και η γραμμή έχει ΗΔΗ πλακίδιο που λέει τι έχει. Το δαχτυλίδι λέει μόνο «γεμάτο». */
.spot-row.on { box-shadow: inset 2px 0 0 var(--ok); }
.spot-row[disabled] { cursor: default; opacity: .6; }
.spot-row-name { flex: 1; min-inline-size: 0; }
.spot-one { display: flex; flex-direction: column; gap: var(--sp-3); }
.spot-back { align-self: flex-start; }
.spot-name { font-weight: var(--fw-semi); font-size: var(--fs-l); }
.spot-shot {
  display: block; inline-size: 100%; max-inline-size: 28rem; max-block-size: 60vh;
  border-radius: var(--r-s); background: var(--card2);
}
.spot-shot.spot-empty {
  display: flex; align-items: center; justify-content: center;
  min-block-size: 8rem; border: 1px dashed var(--line);
}
/* Το `<input type=file>` δεν στυλίζεται· το κρύβουμε και το πατά η ετικέτα από πάνω του (ίδιο μοτίβο
   με το πρωτόκολλο και με τη μπάρα γραφής του ενοικιαστή). */
.spot-file { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.spot-pick { display: flex; }
.spot-go {
  flex: 1; display: inline-flex; align-items: center; justify-content: center;
  min-block-size: 52px; cursor: pointer;
}
.spot-drop { align-self: flex-start; min-block-size: 44px; }
.spot-up { display: flex; flex-direction: column; gap: var(--sp-1); }
/* Η ΜΠΑΡΑ ΕΙΝΑΙ ΑΛΗΘΙΝΗ ΠΡΟΟΔΟΣ (XHR `upload.onprogress`), ΟΧΙ ΨΕΥΤΙΚΟ ΚΙΝΟΥΜΕΝΟ: ένα κλιπ 30΄΄ πάνω
   από 4G μέσα σε γκαράζ κρατά λεπτά, και ένα spinner που γυρίζει χωρίς να λέει «πόσο ακόμα» είναι ο
   λόγος που ο άνθρωπος πατά δεύτερη φορά. */
.spot-bar { block-size: 8px; border-radius: 999px; background: var(--neutral-soft); overflow: hidden; }
.spot-bar-fill { block-size: 100%; inline-size: 0; background: var(--accent); transition: inline-size var(--t) var(--ease); }

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * «Η ΔΙΚΗ ΜΟΥ ΔΙΑΤΑΞΗ» (0135, DECISIONS 06/09 η) — καρτέλα οχήματος + «Σήμερα», ΕΝΑ σύνολο κανόνων
 * ════════════════════════════════════════════════════════════════════════════════════════════════════
 *
 * ΤΙ ΕΙΝΑΙ ΤΙ: `.arr-item` = ένα κουτί ΟΣΟ ΤΑΚΤΟΠΟΙΟΥΜΕ (μπάρα χειρισμού + το ίδιο το κουτί) ·
 * `.arr-fold` = η γραμμή τίτλου μιας ΣΥΜΠΤΥΓΜΕΝΗΣ ενότητας · `.arr-end` = «πήγαινε στο τέλος», το
 * φοράνε ΟΛΕΣ οι συμπτυγμένες · `.arr-bar` = η μπάρα του edit mode με τη «Ροή στο κινητό».
 *
 * ΚΑΝΕΝΑ ΧΡΩΜΑ ΕΔΩ ΔΕΝ ΕΙΝΑΙ ΓΡΑΜΜΕΝΟ: όλα από tokens, όπως όλο το αρχείο (φρουρός στο `test_api`).
 */

/* Το κουμπί της κεφαλίδας: ghost όπως τα διπλανά του, απλώς δεν μεγαλώνει σε στενή οθόνη. */
.arr-open-b { flex: none; }

/* ---------------------------------------------------------------- η μπάρα του edit mode
 * ΚΟΛΛΑΕΙ ΨΗΛΑ: σε καρτέλα οχήματος τριών οθονών, το «Τέλος» δεν επιτρέπεται να είναι κύλιση μακριά —
 * ο άνθρωπος που τακτοποίησε το κάτω μέρος πρέπει να μπορεί να αποθηκεύσει από εκεί που στέκεται. */
.arr-bar {
  position: sticky;
  /* ΙΔΙΟ ΥΨΟΣ ΜΕ ΤΗ ΣΤΗΛΗ ΤΟΥ ΟΧΗΜΑΤΟΣ (`.veh-left`): κάτω από τη μπάρα κορυφής, όχι από πίσω της.
     Το `z-index` μένει ΚΑΤΩ από το 20 του `#top` — η κεφαλίδα της εφαρμογής δεν σκεπάζεται ποτέ. */
  inset-block-start: 84px;
  z-index: 3;
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
  border-color: var(--accent);
  box-shadow: var(--shadow);
}
.arr-bar-top { gap: var(--sp-4); flex-wrap: wrap; }

/* Η ΡΟΗ ΣΤΟ ΚΙΝΗΤΟ: αριθμημένη λίστα ΜΟΝΟ με ονόματα — ό,τι αποθηκεύεται, τίποτα παραπάνω. Δύο στήλες
   στο γραφείο, γιατί δώδεκα ονόματα σε μία στήλη σπρώχνουν τη σελίδα· μία στο κινητό. */
.arr-flow { border-block-start: 1px solid var(--line); padding-block-start: var(--sp-4); }
.arr-flow-l {
  margin: var(--sp-3) 0 0;
  padding-inline-start: var(--sp-7);
  columns: 2;
  column-gap: var(--sp-6);
  font-size: var(--fs-s);
}
.arr-flow-l li { break-inside: avoid; margin-block-end: var(--sp-1); }
.arr-flow-l li > span + span { margin-inline-start: var(--sp-3); }
.arr-mini { font-size: var(--fs-xs); }

/* Τα κρυμμένα ως chips: πατιούνται και γυρίζουν πίσω. Η ΜΟΝΗ πόρτα επιστροφής — γι' αυτό δεν κρύβεται
   πίσω από «περισσότερα» ούτε όταν είναι πολλά. */
.arr-gone { display: flex; flex-direction: column; gap: var(--sp-3); }

/* ---------------------------------------------------------------- ένα κουτί υπό τακτοποίηση */
.arr-item {
  border: 1px dashed var(--accent);
  border-radius: var(--r);
  padding: var(--sp-2);
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  background: var(--neutral-soft);
}
.arr-item.dragging { opacity: .5; }
.arr-item.over { border-style: solid; box-shadow: 0 0 0 2px var(--accent-soft); }
/* 🚨 ΤΟ ΠΕΡΙΕΧΟΜΕΝΟ ΔΕΝ ΠΑΤΙΕΤΑΙ ΟΣΟ ΤΑΚΤΟΠΟΙΟΥΜΕ: ένα λάθος πάτημα σε κάρτα-σύνδεσμο θα έφευγε από
   τη σελίδα και θα έπαιρνε μαζί του όλη την ατακτοποίητη δουλειά (αποθηκεύεται μόνο στο «Τέλος»).
   Ζωντανή μένει ΜΟΝΟ η μπάρα χειρισμού. */
.arranging .arr-item > :not(.arr-grip) { pointer-events: none; user-select: none; }

.arr-grip {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex-wrap: wrap;
  padding: var(--sp-1) var(--sp-2);
  min-block-size: 36px;
}
.arr-h { display: inline-flex; color: var(--muted); cursor: grab; }
.arr-t {
  flex: 1;
  min-inline-size: 0;
  font-size: var(--fs-s);
  font-weight: var(--fw-semi);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.arr-b {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  min-inline-size: 36px;
  min-block-size: 36px;
  padding-inline: var(--sp-3);
  background: var(--card2);
  border: 1px solid var(--line);
  border-radius: var(--r-s);
  color: inherit;
  font: inherit;
  font-size: var(--fs-xs);
}
.arr-b:hover { border-color: var(--accent); }
/* «ΠΑΤΗΜΕΝΟ» = ΕΠΙΛΟΓΗ, ΟΧΙ ΤΑΥΤΟΤΗΤΑ — ίδιο λεξιλόγιο με το `.chip.active`: soft φόντο, μελάνι,
   ΔΙΑΦΑΝΟ περίγραμμα. Ο νόμος §4 το έπιασε στον πρώτο κύκλο VM (06/09): accent σε border = κατάσταση. */
.arr-b.on { background: var(--accent-soft); color: var(--ink); border-color: transparent; }
/* ΕΝΑ ΣΧΗΜΑ ΒΕΛΟΥΣ ΣΕ ΟΛΟ ΤΟ ΣΠΙΤΙ (νόμος §3): το `back` του `icons.js`, γυρισμένο. Κανένα ▲/▼. */
.arr-up svg { transform: rotate(90deg); }
.arr-down svg { transform: rotate(-90deg); }
.arr-foldb svg { transform: rotate(-90deg); }
.arr-hideb { font-weight: var(--fw-med); }
.arr-lock { flex: none; }

/* ---------------------------------------------------------------- η συμπτυγμένη ενότητα
 * ΓΡΑΜΜΗ ΤΙΤΛΟΥ ΜΕ ⌄ — ΟΛΟΚΛΗΡΗ ΚΟΥΜΠΙ, 44 px: με γάντι, μια σειρά κειμένου δεν πιάνεται (νόμος των
 * οθονών πεδίου). Το πάτημα ανοίγει ΜΟΝΟ για αυτή την επίσκεψη — δεν γράφει τίποτα στον server. */
.arr-fold {
  inline-size: 100%;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  min-block-size: 44px;
  padding: var(--sp-3) var(--sp-5);
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  color: var(--muted);
  font: inherit;
  font-size: var(--fs-s);
  font-weight: var(--fw-semi);
  letter-spacing: .03em;
  text-align: start;
}
.arr-fold:hover { background: var(--hover); color: var(--ink); }
.arr-fold-t { flex: 1; min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.arr-fold-c { flex: none; display: inline-flex; transform: rotate(-90deg); transition: transform var(--t) var(--ease); }
/* Ανοιχτή = «κολλάει» στο σώμα που μόλις εμφανίστηκε από κάτω της (λογικές γωνίες, όπως όλο το αρχείο:
   η διεπαφή γυρίζει σε RTL χωρίς δεύτερο stylesheet). */
.arr-fold.open { color: var(--ink); border-end-start-radius: 0; border-end-end-radius: 0; }
.arr-fold.open .arr-fold-c { transform: rotate(90deg); }
/* Η «ματιά»: ο τίτλος και από κάτω η ίδια η κάρτα, ενωμένα σε ένα σώμα. */
.arr-wrap { display: flex; flex-direction: column; gap: var(--sp-3); }

/* ΟΙ ΣΥΜΠΤΥΓΜΕΝΕΣ ΠΑΝΤΑ ΤΕΛΕΥΤΑΙΕΣ. Σε στήλη (flex) και σε πλέγμα (grid) το `order` λέει το ίδιο
   πράγμα· ο κώδικας τις βάζει ήδη τελευταίες στο DOM, και αυτή η γραμμή το κρατά αληθινό ΚΑΙ όταν οι
   δύο στήλες συρράπτονται σε μία στο κινητό (βλ. το σκαλοπάτι παρακάτω). */
.arr-end { order: 1; }
/* Στο πλέγμα των πάνελ του «Σήμερα» μια συμπτυγμένη γραμμή δεν κρατά μισή στήλη: πιάνει όλο το πλάτος,
   αλλιώς δίπλα της μένει τρύπα 20rem που διαβάζεται ως «λείπει κάτι». */
.td-panels > .arr-end { grid-column: 1 / -1; }

/* ---------------------------------------------------------------- τα δύο ΝΕΑ κουτιά του οχήματος
   Δεν είναι καινούργια όψη: είναι τα ΙΔΙΑ στοιχεία που ήταν αδέλφια στη δεξιά στήλη, τυλιγμένα ώστε να
   έχουν ΕΝΑ όνομα στη διάταξη. Το κενό μέσα τους είναι το κενό που είχε η στήλη — μηδέν οπτική αλλαγή. */
.veh-instr, .veh-inc { display: flex; flex-direction: column; gap: var(--sp-5); min-inline-size: 0; }

/* 📱 ΤΟ ΚΙΝΗΤΟ: ΜΙΑ ΡΟΗ, ΚΑΙ ΟΙ ΣΥΜΠΤΥΓΜΕΝΕΣ ΟΛΩΝ ΤΩΝ ΣΤΗΛΩΝ ΣΤΟ ΤΕΛΟΣ ΤΗΣ.
 *
 * Το ίδιο σκαλοπάτι (1099px) με τη μονόστηλη καρτέλα οχήματος — δεύτερο σκαλοπάτι θα σήμαινε ένα
 * ενδιάμεσο πλάτος όπου η ροή λέει άλλα από την οθόνη. Το `display: contents` λύνει τις δύο στήλες σε
 * κόμβους ΤΟΥ ΙΔΙΟΥ πλέγματος, ώστε το `order` των συμπτυγμένων να μετράει ΣΕ ΟΛΗ τη ροή και όχι μέσα
 * σε κάθε στήλη χωριστά — αυτό ακριβώς υπόσχεται η ένδειξη «Ροή στο κινητό». */
@media (max-width: 1099px) {
  .veh-left, .veh-right { display: contents; }
}

/* 📱 ΣΤΕΝΗ ΟΘΟΝΗ: 44 px παντού, όπως κάθε άλλη οθόνη πεδίου — εδώ το χέρι φοράει γάντι. */
@media (max-width: 719px) {
  .arr-b { min-inline-size: 44px; min-block-size: 44px; }
  .arr-grip { min-block-size: 44px; }
  .arr-flow-l { columns: 1; }
}

/* ================================================================ Η ΚΑΡΤΑ ΤΗΣ ΕΝΤΟΛΗΣ (0133, 06/09 γ)
 *
 * ΚΑΜΙΑ ΝΕΑ ΓΕΩΜΕΤΡΙΑ: η κεφαλίδα είναι η ΥΠΑΡΧΟΥΣΑ `.dfl-head` (52 px, ολόκληρη κουμπί), τα πλακίδια
 * είναι τα υπάρχοντα `.pill`, το κουμπί είναι το υπάρχον `.ho-big`. Εδώ μπαίνει ΜΟΝΟ ο χώρος του
 * σώματος — ό,τι άλλο θα ήταν τρίτη οικογένεια σχημάτων για κάτι που ήδη υπάρχει δύο φορές.
 */
.sv-order { padding: 0; overflow: hidden; }
.sv-order-body { display: flex; flex-direction: column; gap: var(--sp-2);
                 padding: var(--sp-4) var(--sp-5); min-inline-size: 0; }
/* Η ΚΑΡΤΑ ΠΟΥ ΑΡΓΗΣΕ ΠΑΙΡΝΕΙ ΤΟ ΥΠΑΡΧΟΝ ΚΟΚΚΙΝΟ ΠΕΡΙΓΡΑΜΜΑ ΤΩΝ ΚΑΡΤΩΝ (`.card.crit`) — καμία νέα
   απόχρωση: το κόκκινο του σπιτιού είναι ΕΝΑ. */
.sv-order-act { gap: var(--sp-3); flex-wrap: wrap; margin-block-start: var(--sp-2); }
/* Το ΕΝΑ κουμπί πιάνει όλο το πλάτος στο κινητό (κανόνας οθονών πεδίου) και μαζεύεται στο γραφείο. */
.sv-order-act .ho-big { flex: 1 1 auto; }
@media (min-width: 720px) { .sv-order-act .ho-big { flex: 0 0 auto; } }

/* Το chip της φάσης και το πλακίδιο του εκπρόθεσμου δεν σπάνε ποτέ στη μέση μιας λέξης: είναι ΣΗΜΑΤΑ,
   και ένα σήμα σε δύο σειρές παύει να σκανάρεται. */
.sv-ph, .sv-late { white-space: nowrap; }

/* «ΠΟΥ ΘΑ ΓΙΝΕΙ;» — ΤΟ ΙΔΙΟ ΙΔΙΩΜΑ ΜΕ ΤΑ ΠΑΡΑΘΥΡΑ ΕΠΙΣΚΕΥΗΣ (`.rn-pick`: κύκλος μπροστά, επικεφαλίδα
   πάνω, συνέπεια από κάτω). Δεν προστίθεται τίποτα οπτικά — μόνο το όνομα, ώστε οι φρουροί να μπορούν
   να ξεχωρίσουν τις δύο ομάδες radio του ίδιου φύλλου. */
.sv-site, .sv-win { min-block-size: 52px; }

/* ---------------------------------------------------------------- «Ν προς αξιολόγηση» (06/09 στ)
 *
 * PUSH-LITE, ΟΧΙ ΕΚΚΡΕΜΟΤΗΤΑ ΑΝΑ ΖΗΜΙΑ: ΕΝΑΣ μετρητής με πόρτα, πάνω από τα φίλτρα. Ο αριθμός είναι
 * το πρώτο πράγμα που σκανάρει το μάτι (ίδια γεωμετρία με τα πλακίδια της «Σήμερα»: μεγάλος αριθμός,
 * λέξη δίπλα), και ΟΛΟΚΛΗΡΟ το πλακίδιο είναι ο στόχος αφής — 52 px, με γάντι.
 * ΚΙΤΡΙΝΟ ΚΑΙ ΟΧΙ ΚΟΚΚΙΝΟ: είναι ουρά που περιμένει άνθρωπο, όχι βλάβη. Το κόκκινο του σπιτιού είναι
 * για ό,τι έχει ήδη πάει στραβά.
 */
.dfl-triage {
  display: flex; align-items: center; gap: var(--sp-4); width: 100%;
  min-height: 52px; padding: var(--sp-3) var(--sp-5);
  background: var(--warn-soft); border: 1px solid var(--warn); border-radius: var(--r-s);
  color: var(--ink); text-align: start;
}
.dfl-triage:hover { filter: none; background: var(--warn-soft); border-color: var(--ink); }
.dfl-triage-n { font-size: var(--fs-xl); font-weight: 700; color: var(--warn); line-height: 1; }

/* ---------------------------------------------------------------- «Ανά όχημα» στο Πρόγραμμα (06/09)
   Η κεφαλίδα είναι Η ΥΠΑΡΧΟΥΣΑ `.rn-group` (ίδια υπόσχεση: «εδώ αρχίζει άλλο αμάξι»). Εδώ μόνο ο
   αέρας που τη χωρίζει από την προηγούμενη γραμμή — ίδιο μοτίβο με το `.dfl-stage` των Ζημιών. */
.mnt-row + .mnt-group, .stack-tight > .mnt-group:not(:first-child) { margin-block-start: var(--sp-4); }

/* ---------------------------------------------------------------- ΑΠΟΘΕΜΑΤΑ: «πόσο ακόμα;» (06/09 ιδ)
   ΙΔΙΑ ΓΕΩΜΕΤΡΙΑ ΜΕ ΤΑ ΟΡΓΑΝΑ, ΕΠΙΤΗΔΕΣ: η κάρτα κάθεται ακριβώς από κάτω τους και δείχνει ΤΙΣ ΙΔΙΕΣ
   τρεις στάθμες με άλλη ερώτηση. Δύο διαφορετικά μεγέθη πλακιδίου δίπλα-δίπλα θα διάβαζαν ως δύο
   διαφορετικά είδη δεδομένων — δεν είναι. Γι' αυτό ξαναχρησιμοποιείται το `.tile` αυτούσιο και εδώ
   μπαίνει μόνο ό,τι ΔΕΝ έχει: το πλέγμα (λίγο στενότερο, τρία αντικείμενα το πολύ), η γραμμή των
   ημερών και ο αέρας γύρω από τα chip της βάσης.
   ΤΟ `.res-tile` ΔΕΝ ΕΙΝΑΙ ΚΟΥΜΠΙ (div, όπως η κάτοψη ελαστικών): δεν ανοίγει γράφημα — το γράφημα της
   ΣΤΑΘΜΗΣ ανοίγει από το πλακίδιο των οργάνων, και δύο πόρτες προς την ίδια οθόνη είναι μία περιττή. */
.veh-res { display: flex; flex-direction: column; gap: var(--sp-5); min-inline-size: 0; }
.res-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); gap: var(--sp-5); }
.res-tile { cursor: default; }
.res-tile:hover { border-color: var(--line); }
/* Ο ΑΡΙΘΜΟΣ ΤΩΝ ΗΜΕΡΩΝ ΕΙΝΑΙ Η ΑΠΑΝΤΗΣΗ, ΟΧΙ ΥΠΟΣΗΜΕΙΩΣΗ: μεγαλύτερος από τα chip και στο κανονικό
   χρώμα του κειμένου — η στάθμη από πάνω είναι το δεδομένο, αυτό εδώ είναι αυτό που ρώτησε ο άνθρωπος. */
.res-days { font-size: var(--fs-s); font-weight: var(--fw-med); margin-block-start: var(--sp-2); }
.res-tile .pill { align-self: flex-start; }

/* ---------------------------------------------------------------- 🎨 Ο ΕΠΙΛΟΓΕΑΣ ΘΕΜΑΤΟΣ (ιγ)
 *
 * Μία κάρτα ανά θέμα, μία μικρογραφία, ένα radio. Η ΜΙΚΡΟΓΡΑΦΙΑ ΕΙΝΑΙ ΖΩΓΡΑΦΙΣΜΕΝΗ ΜΕ TOKENS ΚΑΙ ΟΧΙ
 * ΕΙΚΟΝΑ: το `.thm-prev` φοράει `data-rn-theme`, οπότε μέσα του ισχύουν ΑΚΡΙΒΩΣ τα χρώματα, οι ακτίνες
 * και οι κλίσεις που θα δει ο ενοικιαστής (τα μπλοκ ζουν στο `tokens.css` και γράφουν και τον σκέτο
 * επιλογέα, ειδικά γι' αυτή τη χρήση). Άρα η προεπισκόπηση ΔΕΝ γερνά ποτέ: αλλάζει μόνη της την ημέρα
 * που θα αλλάξει το πράσινο.
 *
 * 🚨 ΚΑΜΙΑ ΤΙΜΗ ΧΡΩΜΑΤΟΣ ΕΔΩ ΜΕΣΑ — ούτε καν «γκρι για το ψεύτικο κείμενο»: ό,τι φαίνεται στη
 * μικρογραφία είναι `var(--…)` του θέματος. Ένα σκέτο γκρι θα ήταν το ένα πράγμα της οθόνης που δεν
 * αλλάζει με το θέμα, δηλαδή ακριβώς το ψέμα που ο επιλογέας υπάρχει για να μην πει. (Και γι' αυτό η
 * μικρογραφία του «Νυχτερινού» βγαίνει ΣΚΟΥΡΗ μέσα στην ανοιχτή κονσόλα: αυτό ακριβώς θα δει ο πελάτης.)
 *
 * ΚΛΙΜΑΚΑ: οι ακτίνες μπαίνουν ΜΙΣΕΣ (`calc(var(--rn-r) / 2)`). Σε φυσαλίδα ύψους 13 px, τα 14 px του
 * παιχνιδιάρικου θα έδιναν κάψουλα και τα 4 px του Ελεγκάν σχεδόν τετράγωνο — η ΔΙΑΦΟΡΑ των δύο είναι η
 * πληροφορία, και στο μισό διαβάζεται σωστά (το Νυχτερινό πέφτει ανάμεσά τους, στα 5 px). */
.thm-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: var(--sp-5); }
.thm-card {
  display: grid; gap: var(--sp-3);
  padding: var(--sp-3);
  border: 1px solid var(--line); border-radius: var(--r);
  background: var(--card); cursor: pointer;
}
.thm-card:hover { border-color: var(--ink); }
/* ΔΙΠΛΗ ΕΝΔΕΙΞΗ ΤΟΥ ΕΝΕΡΓΟΥ, ΚΑΙ ΤΗ ΧΡΕΙΑΖΕΤΑΙ: σε πλέγμα τριών εικόνων ένα γεμάτο radio 16 px χάνεται,
   ενώ ένα σκέτο περίγραμμα διαβάζεται ως hover. Μαζί δεν αφήνουν αμφιβολία ποιο ισχύει τώρα.
   🚨 ΔΑΧΤΥΛΙΔΙ (`box-shadow: inset`) ΚΑΙ ΟΧΙ `border-color`, ΚΑΙ ΤΟ ΕΠΙΒΑΛΛΕΙ ΦΡΟΥΡΟΣ: το `--accent`
   δεν βάφει ΠΟΤΕ περίγραμμα που κουβαλά κατάσταση (`test_gui_house_law` §7 — το `.on` μετρά ως τόνος).
   Εδώ η «κατάσταση» είναι ΕΠΙΛΟΓΗ, όχι σοβαρότητα, αλλά ο κανόνας δεν κάνει εξαιρέσεις κατά περίπτωση:
   το δαχτυλίδι λέει το ίδιο πράγμα, με 2 px, χωρίς να μετακινήσει ούτε ένα pixel της διάταξης.
   Το hover παίρνει `--ink` — ίδιο μοτίβο με το `.dfl-triage:hover` των Ζημιών. */
.thm-card.on { box-shadow: inset 0 0 0 2px var(--accent); background: var(--accent-soft); }
.thm-pick { display: flex; align-items: center; gap: var(--sp-3); font-weight: var(--fw-semi); }

.thm-prev {
  display: grid; gap: 6px;
  padding: 8px;
  border-radius: var(--r-s);
  background: var(--bg);
  border: 1px solid var(--line);
}
/* Η γραμμή των καρτελών, σε κλίμακα: το ενεργό λέει με μια ματιά «γεμάτο χρώμα» (παιχνιδιάρικα) ή
   «χρυσή υπογράμμιση» (Ελεγκάν) — που είναι ακριβώς η διαφορά τους στην αληθινή οθόνη.
   🃏 ΚΑΙ ΣΤΑ ΔΥΟ ΠΑΙΧΝΙΔΙΑΡΙΚΑ ΔΕΝ ΕΙΝΑΙ ΠΙΑ ΡΑΓΑ ΑΛΛΑ ΤΡΙΑ ΑΥΤΟΚΟΛΛΗΤΑ (06/09 γ): αυτό ακριβώς
   άλλαξε στη σελίδα του πελάτη — τρία χωριστά χαρτάκια με δικό τους χρώμα και δική τους γωνία. Μια
   μικρογραφία που έδειχνε ακόμα βουλιαγμένη ράγα θα υποσχόταν κάτι που δεν υπάρχει πια.
   🚨 ΔΑΧΤΥΛΙΔΙ (`box-shadow: inset`) ΚΑΙ ΟΧΙ `border`: το ενεργό γεμίζει με `--accent`, και το accent
   δεν βάφει ΠΟΤΕ περίγραμμα στοιχείου που κουβαλά κατάσταση (`test_gui_house_law` §7 — το `.on` μετρά
   ως τόνος). Με inset ring το σχήμα είναι ίδιο, το πλάτος δεν αλλάζει, και ο φρουρός μένει ήσυχος. */
.thm-tabs {
  display: flex; gap: 3px;
  padding: 2px;
  border-radius: var(--r-s);
  background: var(--bg2); border: 1px solid var(--line);
}
.thm-tab { flex: 1; height: 10px; border-radius: calc(var(--rn-r) / 2); }
.thm-tab.on { background: var(--accent); background-image: var(--rn-sheen); }
[data-rn-theme='postcard'] .thm-tabs,
[data-rn-theme='open_road'] .thm-tabs { background: transparent; border: 0; border-radius: 0; padding: 0; gap: 4px; }
[data-rn-theme='postcard'] .thm-tab,
[data-rn-theme='open_road'] .thm-tab { background: var(--card); box-shadow: inset 0 0 0 1.5px var(--accent); }
[data-rn-theme='postcard'] .thm-tab:nth-child(1),
[data-rn-theme='open_road'] .thm-tab:nth-child(1) { box-shadow: inset 0 0 0 1.5px var(--rn-tab1); transform: rotate(calc(-1 * var(--rn-tilt))); }
[data-rn-theme='postcard'] .thm-tab:nth-child(3),
[data-rn-theme='open_road'] .thm-tab:nth-child(3) { box-shadow: inset 0 0 0 1.5px var(--rn-tab3); transform: rotate(calc(var(--rn-tilt) * .7)); }
/* ΜΕΤΑ ΤΑ `:nth-child` ΚΑΙ ΜΕ ΤΗΝ ΙΔΙΑ ΕΙΔΙΚΟΤΗΤΑ: τη σειρά την κρίνει η θέση στο αρχείο. */
[data-rn-theme='postcard'] .thm-tab.on,
[data-rn-theme='open_road'] .thm-tab.on { background: var(--accent); box-shadow: none; transform: rotate(var(--rn-tilt)); }
/* ΤΟ ΕΛΕΓΚΑΝ ΚΑΙ ΤΟ ΝΥΧΤΕΡΙΝΟ ΜΟΙΡΑΖΟΝΤΑΙ ΤΗ ΧΕΙΡΟΝΟΜΙΑ, ΟΧΙ ΤΗΝ ΠΑΛΕΤΑ: και τα δύο λένε «εδώ είσαι»
   με ΥΠΟΓΡΑΜΜΙΣΗ αντί για γέμισμα — άρα ίδιος κανόνας, δύο ονόματα. Τα χρώματα (ιβουάρ/χρυσό έναντι
   ανθρακί/teal) τα φέρνει το `data-rn-theme` του κουτιού, όπως σε όλη τη μικρογραφία. */
[data-rn-theme='elegant'] .thm-tabs,
[data-rn-theme='night'] .thm-tabs { background: transparent; border: 0; border-bottom: 1px solid var(--line); border-radius: 0; padding: 0 0 2px; }
[data-rn-theme='elegant'] .thm-tab.on,
[data-rn-theme='night'] .thm-tab.on { background: transparent; box-shadow: inset 0 -2px 0 var(--accent); }

.thm-b { height: 13px; border-radius: calc(var(--rn-r) / 2); }
.thm-them { width: 72%; background: var(--card2); border: var(--rn-bw) solid var(--rn-them-line); }
.thm-mine { width: 58%; margin-inline-start: auto; background: var(--rn-mine); background-image: var(--rn-sheen); }
.thm-short { width: 46%; }
.thm-in { height: 14px; border-radius: 999px; background: var(--bg2); border: var(--rn-bw) solid var(--line); }

/* ---------------------------------------------------------------- 📶 SIM M2M (0141, 07/09)
 *
 * ΔΥΟ ΠΡΑΓΜΑΤΑ ΚΑΙ ΤΙΠΟΤΑ ΑΛΛΟ: ένας πίνακας που ΔΕΝ σπρώχνει τη σελίδα πλάγια (ο στόχος είναι
 * desktop — απόφαση 07/09 — αλλά στα 390 px πρέπει να ΚΥΛΑΕΙ, όχι να σπάει· ίδιο μοτίβο με το
 * `.aic-wrap` του «Κόστος AI») και μια μπάρα quota που το χρώμα της το λέει Ο SERVER.
 *
 * 🚨 ΤΟ ΧΡΩΜΑ ΤΗΣ ΜΠΑΡΑΣ ΔΕΝ ΥΠΟΛΟΓΙΖΕΤΑΙ ΑΠΟ ΠΟΣΟΣΤΟ ΣΤΟ CSS: η κλάση `.warn`/`.bad` μπαίνει από τη
 * ΣΗΜΑΙΑ (`low_quota`, `expired`), που ξέρει το κατώφλι της ρύθμισης. Ένα δεύτερο κατώφλι εδώ μέσα θα
 * διαφωνούσε με την ειδοποίηση που μόλις έφυγε με email.
 */
.sim-wrap { overflow-x: auto; }
.sim-table { width: 100%; min-width: 56rem; border-collapse: collapse; }
.sim-table th, .sim-table td { padding: var(--sp-2) var(--sp-3); text-align: start; vertical-align: middle;
                               border-block-end: 1px solid var(--line); }
.sim-table th { font-size: var(--fs-xs); color: var(--muted); white-space: nowrap; }
.sim-table tbody tr:hover { background: var(--hover); }
.sim-cell { display: flex; flex-direction: column; gap: 2px; }
.sim-big { font-size: var(--fs-xl); }
/* Τα έξι τελευταία ψηφία είναι ΚΟΥΜΠΙ ΑΝΤΙΓΡΑΦΗΣ (το πλήρες ICCID ζει στο `title`): δεκαεννιά ψηφία δεν
   τα διαβάζει άνθρωπος από στήλη, αλλά τα ΧΡΕΙΑΖΕΤΑΙ ολόκληρα όταν ανοίγει το portal της 1NCE. */
.sim-iccid { cursor: copy; white-space: nowrap; }
.sim-quota { display: flex; flex-direction: column; gap: 2px; min-width: 8rem; }
.sim-quota-bar { height: 6px; border-radius: 3px; background: var(--line); overflow: hidden; }
.sim-quota-fill { height: 100%; background: var(--ok); }
.sim-quota.warn .sim-quota-fill { background: var(--warn); }
.sim-quota.bad .sim-quota-fill { background: var(--crit); }
