/* ============================================================================
   voucher.css — ΤΟ ΠΡΩΤΟΤΥΠΟ VOUCHER, ΜΕΤΑΦΕΡΜΕΝΟ ΑΥΤΟΥΣΙΟ.

   Δεν το ξαναγράψαμε. Είναι ακριβώς οι κανόνες .esvsheet από το combined.html,
   με δύο μόνο αλλαγές, και τις δύο για μέγεθος:
     • το λογότυπο βγήκε από base64 σε assets/img/logo-voucher.png
     • η γραμματοσειρά υπογραφής βγήκε σε assets/font/signature.ttf

   ΜΗΝ «ΤΑΚΤΟΠΟΙΗΣΕΙΣ» ΑΥΤΟ ΤΟ ΑΡΧΕΙΟ. Είναι σχέδιο πελάτη, δουλεμένο, και
   τυπώνεται σε χαρτί. Κάθε αλλαγή εδώ φαίνεται στον τελικό πελάτη.
   ========================================================================== */

@font-face{
    font-family:'Signature';
    src:url('../font/signature.ttf') format('truetype');
    font-weight:normal;font-style:normal;font-display:swap;
  }

.esvsheet{--ink:#0C2230;
    --ink-soft:#13313f;
    --paper:#F6F2EA;
    --stone:#EFE9DC;
    --stone-line:#E2DAC9;
    --brass:#B08D2F;
    --brass-deep:#8C6C28;
    --brass-lt:#C9A84C;
    --sea:#2E6E7E;
    --text:#1C2A30;
    --muted:#5C6A6E;
    --muted-on-ink:#A9BCC3;}
.esvsheet *{box-sizing:border-box;margin:0;padding:0}
.esvsheet{-webkit-text-size-adjust:100%}
.esvsheet{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
    background:linear-gradient(180deg,#F7F4EE 0%,#F1EDE3 100%);
    color:var(--text);
    line-height:1.55;
    font-size:13.5px;
    -webkit-font-smoothing:antialiased;}
.esvsheet h1,.esvsheet h2,.esvsheet h3{font-family:Georgia,'Times New Roman',serif;font-weight:500;line-height:1.12;}
.esvsheet /* ---------- PAGE + BORDERED SHEET (gold double-line,.esvsheet house signature) ---------- */
  .page{min-height:100vh;padding:22px;display:flex;align-items:flex-start}
.esvsheet .sheet{position:relative;flex:1 1 auto;display:flex;flex-direction:column;
    border:1.4px solid rgba(176,137,76,.85);border-radius:8px;
    padding:30px 34px 26px;}
.esvsheet .sheet:before{content:"";position:absolute;inset:4px;
    border:1px solid rgba(176,137,76,.40);border-radius:5px;pointer-events:none;}
.esvsheet /* ---------- HEADER (navy band) ---------- */
  .head{background:linear-gradient(180deg, var(--ink) 0%, var(--ink-soft) 100%);
    color:#fff;border-radius:11px;
    padding:24px 30px 25px;
    display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:0;
    position:relative;overflow:hidden;}
.esvsheet .head:before{content:"";position:absolute;right:-30px;top:-60px;width:230px;height:200px;
    background:radial-gradient(circle at 70% 30%, rgba(176,137,76,.22), transparent 62%);
    pointer-events:none;}
.esvsheet .head:after{content:"";position:absolute;left:0;right:0;bottom:0;height:1.5px;
    background:linear-gradient(90deg,transparent,var(--brass) 22%,var(--brass-lt) 50%,var(--brass) 78%,transparent);
    opacity:.9;}
.esvsheet .es-logo{background:url('../img/logo-voucher.png') center/contain no-repeat;display:block;flex:0 0 auto}
.esvsheet .head-logo{width:97px;height:113px;position:relative;z-index:1;justify-self:center;margin:0 16px}
/* ⚠ 16px ΚΑΙ ΟΧΙ 26 (15.09.2026). ΜΕΤΡΗΘΗΚΕ: ο τίτλος «Διατακτική Ταξιδίου /
   Μεταφοράς» θέλει 220px στα 14px Georgia και η στήλη έδινε ΑΚΡΙΒΩΣ 220px.
   Μηδενικό περιθώριο — οπότε σε άλλη συσκευή, άλλη γραμματοσειρά ή άλλη
   στρογγυλοποίηση έβγαινε «…Μεταφορ…». Δέκα πίξελ φτάνουν και δεν αγγίζουν
   ούτε το μέγεθος ούτε το σχέδιο. */
.esvsheet .head-titles{min-width:0;position:relative;z-index:1;align-self:stretch;display:flex;flex-direction:column;justify-content:center;padding-right:16px}
.esvsheet .head .eyebrow{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    text-transform:uppercase;letter-spacing:.24em;font-size:9.5px;color:#d8b377;white-space:nowrap;}
.esvsheet .head h1{font-size:35px;color:#fff;margin:5px 0 5px;letter-spacing:.03em}
/* ⚠ ΧΩΡΙΣ `white-space:nowrap` (15.09.2026). Μαζί με το `text-overflow:ellipsis`
   πιο κάτω, ο τίτλος έβγαινε «Διατακτική Ταξιδίου / Μεταφορ…» — ο ιδιοκτήτης
   το ανέφερε ρητά. Η κεφαλίδα είναι πλέγμα τριών στηλών με το σήμα 97px στη
   μέση, οπότε η αριστερή στήλη δεν χωρά τη φράση σε ΜΙΑ γραμμή στα 794px.
   Λύση: του επιτρέπεται να πάει σε δεύτερη γραμμή. Η μπλε κεφαλίδα έχει ύψος
   από το σήμα (113px) και σηκώνει άνετα δύο σειρές των 17px. */
.esvsheet .head .gtitle{font-family:Georgia,'Times New Roman',serif;
    font-size:14px;color:var(--muted-on-ink);letter-spacing:.012em;line-height:1.2;
    /* Χωρίς `text-wrap:balance`: εκείνο μοιράζει τις λέξεις σε δύο ίσες
       σειρές ΑΚΟΜΗ ΚΑΙ ΟΤΑΝ χωράνε σε μία, αφήνοντας ορφανό το «/ Μεταφοράς».
       Τώρα η αναδίπλωση είναι μόνο δίχτυ ασφαλείας: κανονικά χωράει σε μία. */
    white-space:normal;}
.esvsheet .company{text-align:right;line-height:1.5;padding-left:26px;position:relative;z-index:1;
    align-self:stretch;
    display:flex;flex-direction:column;justify-content:center;}
.esvsheet .company .co{font-family:Georgia,'Times New Roman',serif;font-size:15px;color:#fff;font-weight:500}
.esvsheet .company .co-tag{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    font-size:8.5px;letter-spacing:.2em;text-transform:uppercase;color:#d8b377;margin:3px 0 7px;}
.esvsheet .company .line{font-size:11.5px;color:var(--muted-on-ink)}
.esvsheet .company .ph{font-size:11.5px;color:#fff;margin-top:3px}
.esvsheet .company .ph b{font-weight:600;letter-spacing:.01em}
.esvsheet /* ---------- CLIENT / REFERENCE ROW ---------- */
  .meta{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;
    margin:22px 2px 0;padding-bottom:18px;border-bottom:1px solid var(--stone-line);}
.esvsheet .lab{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    text-transform:uppercase;letter-spacing:.16em;font-size:9.5px;color:var(--sea);}
.esvsheet .meta .client .nm{font-family:Georgia,'Times New Roman',serif;font-size:21px;color:var(--ink);margin-top:6px}
.esvsheet .meta .client .ph{font-size:12px;color:var(--muted);margin-top:3px}
.esvsheet .meta .client .ph .pn{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;color:var(--text)}
.esvsheet .meta .ref{text-align:right}
.esvsheet .meta .ref .lab{color:var(--brass-deep)}
.esvsheet .meta .ref .dt{font-family:Georgia,'Times New Roman',serif;font-size:20px;color:var(--ink);margin-top:6px}
.esvsheet .meta .ref .enq{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;font-size:12.5px;color:var(--muted);margin-top:3px;letter-spacing:.02em}
.esvsheet .meta>div{flex:1 1 0;min-width:0}
.esvsheet .meta .pdt{text-align:left}
.esvsheet .meta .client{text-align:center}
.esvsheet .meta .pdt .dt{font-family:Georgia,'Times New Roman',serif;font-size:20px;color:var(--ink);margin-top:6px;white-space:nowrap}
.esvsheet .meta .pdt .enq{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;font-size:12px;color:var(--muted);margin-top:3px;letter-spacing:.02em}
.esvsheet .meta .room{text-align:right}
.esvsheet .meta .room-inner{display:inline-block;text-align:center}
.esvsheet .meta .room .lab{color:var(--brass-deep)}
.esvsheet .meta .room .rv{display:inline-block;font-family:Georgia,'Times New Roman',serif;font-size:22px;color:var(--ink);margin-top:8px;border:1.5px solid var(--brass);border-radius:8px;padding:3px 16px;background:linear-gradient(180deg,#fffdf8,#fff)}
.esvsheet /* ---------- DETAILS CARD ---------- */
  .details{border:1px solid var(--stone-line);border-radius:12px;background:#fff;
    margin-top:20px;padding:5px 26px;
    box-shadow:0 1px 2px rgba(12,34,48,.04);}
.esvsheet .row{display:flex;gap:22px;align-items:baseline;padding:12px 0;border-top:1px solid var(--stone-line)}
.esvsheet .row:first-child{border-top:none}
.esvsheet .row .k{flex:0 0 150px;
    font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass-deep);
    padding-top:3px;}
.esvsheet .row .v{flex:1 1 auto;font-size:15px;color:var(--text);line-height:1.4}
.esvsheet .row .v .em{font-family:Georgia,'Times New Roman',serif;font-size:16.5px;color:var(--ink)}
.esvsheet .row .v .seg{color:var(--muted)}
.esvsheet .row .v .num{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;font-size:13.5px;color:var(--text)}
.esvsheet .row .v .dash{color:var(--muted)}
.esvsheet .ic{color:var(--brass);font-size:11.5px;margin-right:2px;position:relative;top:.5px}
.esvsheet .row.media{align-items:center}
.esvsheet .row.media .k{padding-top:0}
.esvsheet .v.veh{display:flex;align-items:center;gap:14px}
.esvsheet .veh-img{height:26px;width:auto;border-radius:4px;border:1px solid var(--stone-line);background:#fff;display:block}
.esvsheet .plate{height:26px;width:auto;display:block}
.esvsheet .v.veh .vmodel{font-size:15px}
.esvsheet .v.chauf{display:flex;align-items:center;gap:11px;white-space:nowrap}
.esvsheet .drv-img{width:38px;height:38px;border-radius:50%;object-fit:cover;border:2px solid var(--brass);flex:0 0 auto}
.esvsheet .v.chauf .cinfo{white-space:nowrap}
.esvsheet .v.chauf .em{font-size:14px}
.esvsheet .v.chauf .dot{color:var(--muted);margin:0 5px}
.esvsheet .v.chauf .cd{white-space:nowrap}
.esvsheet .v.chauf .ce{font-size:11.5px;vertical-align:-2px;margin-right:3px}
.esvsheet .v.chauf .tag{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;font-size:8.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--brass-deep);margin-right:3px}
.esvsheet .v.chauf .cn{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;font-size:10px;color:var(--text)}
.esvsheet /* ---------- LEGAL (full width,.esvsheet fine print) ---------- */
  .legal{border-left:2px solid var(--brass);padding:1px 0 1px 16px;margin-top:22px}
.esvsheet .legal p{font-size:9.5px;color:var(--muted);line-height:1.6;margin-bottom:7px}
.esvsheet .legal p:last-child{margin-bottom:0}
.esvsheet .legal strong{color:var(--text);font-weight:600}
.esvsheet .legal .attn{color:var(--brass-deep);font-weight:700;letter-spacing:.02em}
.esvsheet /* ---------- SIGNATURE + PAYMENT (separate,.esvsheet side by side) ---------- */
  /* ⚠ `minmax(0,1fr)` ΚΑΙ ΟΧΙ `1fr` (15.09.2026). Το σκέτο `1fr` σημαίνει
     `minmax(auto,1fr)`: η στήλη ΔΕΝ επιτρέπεται να γίνει μικρότερη από το
     περιεχόμενό της. Η υπογραφή είχε `white-space:nowrap` στα 44px, οπότε ένα
     μεγάλο όνομα («Salman Yusuf Salman Al Mulla») έδινε τεράστιο ελάχιστο
     πλάτος, ΦΟΥΣΚΩΝΕ τη δεξιά στήλη και ΣΤΡΑΓΓΑΛΙΖΕ την αριστερή: το «Office /
     Agency» έσπαγε σε ΤΡΕΙΣ σειρές και το «881,40 €» σε ΔΥΟ — και η υπογραφή
     έβγαινε ΚΑΙ έξω από το χαρτί. Ένα αίτιο, δύο συμπτώματα. */
  /* ⚠ ΤΟ ΚΟΥΤΙ ΠΛΗΡΩΜΗΣ ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ ΤΟ ΜΙΣΟ ΧΑΡΤΙ. ΜΕΤΡΗΘΗΚΕ: το πλατύτερο
     περιεχόμενό του είναι το «Client — Card (POS)» με 173px, δηλαδή 217px με το
     γέμισμα. Τα 240px του αρκούν με περιθώριο και χαρίζουν 89px στην υπογραφή —
     που τα χρειάζεται, γιατί τα ονόματα των πελατών μας είναι μακριά:
     «Salman Yusuf Salman Al Mulla» περνά από 22px σε 28px, «Princess Sarah Al
     Saud» από 30px σε 40px. Πλατύτερο κουτί υπογραφής είναι άλλωστε ο κανόνας
     σε κάθε αληθινή διατακτική. */
  .signpay{display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);gap:22px;margin-top:20px;align-items:stretch}
.esvsheet .box{border:1px solid var(--stone-line);border-radius:12px;background:#fff;
    padding:16px 22px 18px;display:flex;flex-direction:column;
    box-shadow:0 1px 2px rgba(12,34,48,.04);}
/* ⚠ `normal` ΚΑΙ ΟΧΙ `nowrap` ΩΣ ΠΡΟΕΠΙΛΟΓΗ. Το `fitSignature()` του voucher.js
   βάζει `nowrap` και ΜΙΚΡΑΙΝΕΙ τη γραμματοσειρά μετρώντας, ώστε το όνομα να
   μένει σε μία σειρά. Αν για οποιονδήποτε λόγο δεν τρέξει η JS, το όνομα
   ΑΝΑΔΙΠΛΩΝΕΤΑΙ αντί να βγει έξω από τη σελίδα — δύο σειρές είναι άσχημες,
   κομμένο όνομα σε χαρτί πελάτη είναι λάθος. */
.esvsheet .box .sig{font-family:'Signature',Georgia,cursive;
    font-size:44px;line-height:.9;color:#3f73a8;margin-top:14px;
    padding-left:4px;white-space:normal;}
.esvsheet .pay-pill{display:inline-block;align-self:flex-start;margin-top:9px;white-space:nowrap;
    font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    font-size:11px;letter-spacing:.08em;color:var(--brass-deep);
    border:1px solid var(--brass);border-radius:20px;padding:5px 14px;
    background:linear-gradient(180deg,#fffdf8,#fff);}
.esvsheet /* ---------- FOOTER ---------- */
  .foot{margin-top:auto;padding-top:16px;border-top:1px solid var(--stone-line);
    display:flex;justify-content:space-between;align-items:flex-end;gap:16px;}
.esvsheet .foot .mark{display:flex;align-items:center;gap:9px}
.esvsheet .foot .mark .es-logo{width:22px;height:23px;opacity:.92}
.esvsheet .foot .url{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    font-size:9.5px;color:var(--muted);letter-spacing:.01em;word-break:break-all;}
.esvsheet .foot .stamp{text-align:right;flex:0 0 auto;
    font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    font-size:9.5px;color:var(--muted);line-height:1.55;}
.esvsheet .pay-price{font-family:Georgia,'Times New Roman',serif;font-size:22px;font-weight:600;color:var(--ink);margin-top:12px;letter-spacing:.01em}
.esvsheet{width:794px}
.esvsheet .page{min-height:0;display:block;padding:22px}
.esvsheet .head{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);overflow:hidden}
.esvsheet .head-titles,.esvsheet .company{min-width:0}
/* Το `.gtitle` ΒΓΗΚΕ από εδώ: αναδιπλώνεται, δεν κόβεται. Το `.eyebrow`
   («Exclusive Services») μένει μονόγραμμο — είναι επωνυμία, δεν σπάει. */
.esvsheet .head .eyebrow{overflow:hidden;text-overflow:ellipsis}
.esvsheet .company .co,.esvsheet .company .co-tag,.esvsheet .company .line,.esvsheet .company .ph{overflow:hidden;text-overflow:ellipsis}
.esvsheet .row .v{min-width:0}
.esvsheet .v.chauf{gap:8px;overflow:hidden}
.esvsheet .v.chauf .drv-img{width:32px;height:32px}
.esvsheet .v.chauf .em{font-size:12px}
.esvsheet .v.chauf .cn{font-size:8px}
.esvsheet .v.chauf .tag{font-size:7px}
.esvsheet .v.chauf .ce{font-size:9.5px}
.esvsheet .v.chauf .dot{margin:0 3px}
/* ⚠ ΜΑΚΡΥ ΟΝΟΜΑ ΟΔΗΓΟΥ → ΔΥΟ ΣΕΙΡΕΣ (05.10.2026). Ιδιοκτήτης: «the driver
   dimitris megkrelisvili that has a long name, his drivers license is not fully
   visible». Η γραμμή είναι μονόγραμμη (`nowrap` + `overflow:hidden`) και ό,τι
   περίσσευε κοβόταν ΣΙΩΠΗΛΑ δεξιά — πρώτα ο αριθμός άδειας. Ο `fitChauffeur()`
   του voucher.js ΜΕΤΡΑ και, ΜΟΝΟ αν δεν χωρά, βάζει `.two`: όνομα στην πρώτη
   σειρά, τηλέφωνο · ΑΔΤ · άδεια στη δεύτερη. Τα κανονικά ονόματα μένουν ακριβώς
   όπως είναι. Κάθε `.cd` μένει `nowrap` — ένας αριθμός δεν σπάει ποτέ στη μέση·
   αν ούτε η δεύτερη σειρά χωρά, πάει σε τρίτη, ολόκληρος. */
.esvsheet .v.chauf.two{white-space:normal}
.esvsheet .v.chauf.two .cinfo{display:flex;flex-wrap:wrap;align-items:baseline;row-gap:3px;white-space:normal;min-width:0}
.esvsheet .v.chauf.two .cinfo>.em{flex:0 0 100%;line-height:1.2}
.esvsheet .v.chauf.two .cinfo>.em+.dot{display:none}

/* ── Μόνωση από το υπόλοιπο CSS ─────────────────────────────────────────────
   Το φύλλο μοιράζεται ονόματα κλάσεων με την εφαρμογή (.seg, .row, .box, .lab,
   .top, .head, .price). Το voucher ήταν αυτόνομο αρχείο· τώρα ζει μέσα στην
   εφαρμογή και οι κανόνες των components του διαρρέουν — π.χ. το «/ V-Class»
   έπαιρνε το πλαίσιο του segmented control.

   Εδώ μηδενίζουμε ό,τι μπορεί να πέσει πάνω του. Οι κανόνες .esvsheet …
   που ακολουθούν στο ίδιο αρχείο έχουν μεγαλύτερη ειδικότητα και ξαναγράφουν
   ό,τι πρέπει να δείχνει το φύλλο.                                          */
.esvsheet .seg,
.esvsheet .row,
.esvsheet .box,
.esvsheet .lab,
.esvsheet .top,
.esvsheet .card,
.esvsheet .price,
.esvsheet .chip {
  all: unset;
  display: revert;
  font-family: inherit;
  box-sizing: border-box;
}

/* Ξαναγράφουμε τους πραγματικούς κανόνες του φύλλου, μετά το reset. */
.esvsheet .lab{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    text-transform:uppercase;letter-spacing:.16em;font-size:9.5px;color:var(--sea);}
.esvsheet .meta .ref .lab{color:var(--brass-deep)}
.esvsheet .meta .room .lab{color:var(--brass-deep)}
.esvsheet .row{display:flex;gap:22px;align-items:baseline;padding:12px 0;border-top:1px solid var(--stone-line)}
.esvsheet .row:first-child{border-top:none}
.esvsheet .row .k{flex:0 0 150px;
    font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;
    font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass-deep);
    padding-top:3px;}
.esvsheet .row .v{flex:1 1 auto;font-size:15px;color:var(--text);line-height:1.4}
.esvsheet .row .v .em{font-family:Georgia,'Times New Roman',serif;font-size:16.5px;color:var(--ink)}
.esvsheet .row .v .seg{color:var(--muted)}
.esvsheet .row .v .num{font-family:ui-monospace,Menlo,Consolas,'DejaVu Sans Mono',monospace;font-size:13.5px;color:var(--text)}
.esvsheet .row .v .dash{color:var(--muted)}
.esvsheet .row.media{align-items:center}
.esvsheet .row.media .k{padding-top:0}
.esvsheet .box{border:1px solid var(--stone-line);border-radius:12px;background:#fff;
    padding:16px 22px 18px;display:flex;flex-direction:column;
    box-shadow:0 1px 2px rgba(12,34,48,.04);}
/* ⚠ `normal` ΚΑΙ ΟΧΙ `nowrap` ΩΣ ΠΡΟΕΠΙΛΟΓΗ. Το `fitSignature()` του voucher.js
   βάζει `nowrap` και ΜΙΚΡΑΙΝΕΙ τη γραμματοσειρά μετρώντας, ώστε το όνομα να
   μένει σε μία σειρά. Αν για οποιονδήποτε λόγο δεν τρέξει η JS, το όνομα
   ΑΝΑΔΙΠΛΩΝΕΤΑΙ αντί να βγει έξω από τη σελίδα — δύο σειρές είναι άσχημες,
   κομμένο όνομα σε χαρτί πελάτη είναι λάθος. */
.esvsheet .box .sig{font-family:'Signature',Georgia,cursive;
    font-size:44px;line-height:.9;color:#3f73a8;margin-top:14px;
    padding-left:4px;white-space:normal;}
.esvsheet .row .v{min-width:0}

/* ── ΕΚΤΥΠΩΣΗ / ΑΠΟΘΗΚΕΥΣΗ ΩΣ PDF ──────────────────────────────────────────
   Το voucher πρέπει να βγαίνει ΑΚΡΙΒΩΣ όπως φαίνεται στην οθόνη.

   Γιατί δεν έβγαινε: ο browser ΠΕΤΑΕΙ φόντα και εικόνες-φόντο όταν τυπώνει,
   εκτός αν του το απαγορεύσεις ρητά. Στο voucher και τα δύο κρίσιμα στοιχεία
   είναι background:
     • το μπλε πλαίσιο της κεφαλίδας → linear-gradient
     • το λογότυπο → background:url(logo-voucher.png)
   Γι' αυτό το PDF έβγαινε λευκό στην κορυφή και χωρίς σήμα. Ένας κανόνας τα
   φέρνει και τα δύο πίσω.
   ========================================================================== */
@media print {
  .esvsheet,
  .esvsheet *,
  .esvsheet *:before,
  .esvsheet *:after {
    -webkit-print-color-adjust: exact !important;
    print-color-adjust: exact !important;
  }

  /* Σελίδα Α4 χωρίς περιθώρια του browser: το φύλλο ΕΙΝΑΙ ήδη Α4 (794px στα
     96dpi = 210mm) και έχει το δικό του γέμισμα. Με τα προεπιλεγμένα
     περιθώρια έμπαινε δεύτερη κενή σελίδα και κοβόταν η χρυσή διπλή γραμμή. */
  /* ⚠ ΤΟ `@page` ΕΦΥΓΕ (10.09.2026) — είναι ΚΑΘΟΛΙΚΟ και μηδένιζε το
     περιθώριο σε ΚΑΘΕ εκτύπωση. Μπαίνει δυναμικά από τον `printSheet()`
     (views/voucher.js) μόνο όση ώρα τυπώνεται φύλλο. ΜΗΝ ΤΟ ΞΑΝΑΒΑΛΕΙΣ. */

  html, body { background: #fff !important; margin: 0 !important; padding: 0 !important; }

  /* ⚠⚠ ΤΟ ΚΑΜΒΑ ΤΗΣ ΣΕΛΙΔΑΣ, ΓΙΑ ΟΛΕΣ ΤΙΣ ΣΕΛΙΔΕΣ (15.09.2026).
     Το `min-height: 296mm` πιο κάτω είναι ΠΑΤΩΜΑ, όχι ταβάνι: μόλις το φύλλο
     ξεπεράσει το Α4 κατακερματίζεται, και η ΔΕΥΤΕΡΗ σελίδα ξαναγίνεται λευκή.
     ΜΕΤΡΗΘΗΚΕ (794px, 3,7795 px/mm), αλλάζοντας μόνο το σχόλιο της κράτησης:
       0-1 γραμμές σχολίου → 274,3mm → 1 σελίδα
       4 γραμμές ........... 292,7mm → 1 σελίδα
       5 γραμμές ........... 298,8mm → ΔΥΟ σελίδες, η δεύτερη σχεδόν όλη λευκή
     Κάθε γραμμή σχολίου κοστίζει 6,1mm — και η νέα γραμμή «Service» έφαγε
     12,7mm από το περιθώριο. Δηλαδή η διόρθωση χωρίς αυτό εδώ θα κρατούσε
     ΜΟΝΟ όσο το voucher χωρά σε μία σελίδα.

     ΚΑΘΕ ΚΟΜΜΑΤΙ ΕΙΝΑΙ ΑΠΑΡΑΙΤΗΤΟ:
     • `#F1EDE3` = ΑΚΡΙΒΩΣ το κάτω στοπ του ντεγκραντέ του φύλλου, ώστε η ένωση
       στο τέλος του χαρτιού να μη φαίνεται.
     • `print-color-adjust` ΚΑΙ ΕΔΩ: ο υπάρχων κανόνας πιάνει `.esvsheet` και
       τα ΠΑΙΔΙΑ του· τα html/body είναι ΠΡΟΓΟΝΟΙ, δεν τα καλύπτει, και ο
       browser πετάει τα φόντα στην εκτύπωση αν δεν του το απαγορεύσεις.
     • `:has()` ΚΑΙ ΟΧΙ σκέτο `html, body`: το `contract.css` (γρ. 111) και το
       `chauffeur-card.css` (γρ. 288) ξαναδηλώνουν `background:#fff !important`
       και φορτώνουν ΜΕΤΑ από εδώ (index.html 27 και 29) — μόνο η μεγαλύτερη
       ειδικότητα νικά. Το `:has()` χρησιμοποιείται ήδη σε base/components/views.
     • ΚΑΙ ΤΑ ΔΥΟ, html ΚΑΙ body: η `base.css` τους δίνει `height:100%`, οπότε
       το body πιάνει ακριβώς μία σελίδα και το λευκό του θα ξανάβαφε την πρώτη.
     • Η εμβέλεια είναι στενή: `.esvsheet.printing` υπάρχει ΜΟΝΟ όσο τυπώνεται
       voucher. Συμφωνητικά (.escontract), κάρτες οδηγού (.eschauffeur) και
       Reports μένουν λευκά, όπως πρέπει. */
  html:has(.esvsheet.printing),
  body:has(.esvsheet.printing) {
    background: #F1EDE3 !important;
    -webkit-print-color-adjust: exact !important;
            print-color-adjust: exact !important;
  }

  .esvsheet.printing {
    width: 210mm !important; max-width: 210mm !important;
    margin: 0 !important; box-shadow: none !important;
    break-inside: avoid; page-break-inside: avoid;
    /* ⚠ ΓΕΜΙΖΕΙ ΤΗ ΣΕΛΙΔΑ ΜΕΧΡΙ ΚΑΤΩ (15.09.2026). Το φύλλο τελειώνει εκεί που
       τελειώνει το περιεχόμενο· από κάτω φαινόταν το `background:#fff` του
       `body` — ένα λευκό κενό που ο ιδιοκτήτης ζήτησε να γίνει κρεμ.
       Το ίδιο το `.esvsheet` έχει ήδη το κρεμ ντεγκραντέ, οπότε αρκεί να
       ΕΚΤΑΘΕΙ ως το τέλος της σελίδας.
       ⚠ 296mm ΚΑΙ ΟΧΙ 297: το A4 είναι 297mm και οποιαδήποτε στρογγυλοποίηση
       προς τα πάνω γεννά ΔΕΥΤΕΡΗ, ΚΕΝΗ σελίδα. Το χιλιοστό που λείπει δεν
       φαίνεται· η κενή σελίδα φαίνεται. */
    min-height: 296mm;
  }
  /* Ό,τι δεν είναι το φύλλο δεν τυπώνεται — ούτε ως κενή σελίδα. */
  .esvsheet.printing ~ *, .no-print { display: none !important; }

  /* ⚠ ΤΑ ΓΚΡΙ ΚΟΜΜΑΤΙΑ ΛΕΓΟΝΤΑΙ `.seg` (05.10.2026). Η `base.css` κρύβει στην
     εκτύπωση ΚΑΘΕ `.seg` με `!important` — είναι ο διακόπτης Ημέρα/Διάστημα της
     εφαρμογής — και το «· Drop-off 17:00 · 9 hours total» και το «/ V-Class»
     ΕΛΕΙΠΑΝ από κάθε τυπωμένο voucher, και στον υπολογιστή. Μεγαλύτερη
     ειδικότητα με `!important` νικά. Είναι `<span>` μέσα σε γραμμή: inline. */
  .esvsheet .seg { display: inline !important; }

  /* Η απαλή σκιά των λευκών κουτιών (λεπτομέρειες, πληρωμή, υπογραφή) βγαίνει
     στο PDF του Chrome ως θαμπό ΟΡΘΟΓΩΝΙΟ γύρω τους (μετρημένο 05.10). Στο
     χαρτί αρκεί η λεπτή γραμμή τους. */
  .esvsheet.printing .details, .esvsheet.printing .box { box-shadow: none !important; }

  /* ── Η «ΚΡΑΤΗΣΗ» ΤΟΥ `printVoucher` (views/voucher.js, 05.10.2026) ───────
     Όσο το <html> έχει `.vp-hold`, στο χαρτί υπάρχει ΜΟΝΟ το voucher — ό,τι κι
     αν έχει γίνει στη σελίδα στο μεταξύ (το iOS/Android ξαναστήνει την
     εκτύπωση από τη ζωντανή σελίδα σε κάθε αλλαγή επιλογής). Το ύψος των
     html/body ελευθερώνεται: η `base.css` τους δίνει `height:100%`. */
  html.vp-hold, html.vp-hold body {
    height: auto !important;
    background: #F1EDE3 !important;
    -webkit-print-color-adjust: exact !important;
            print-color-adjust: exact !important;
  }
  html.vp-hold body > :not(.vp-holder) { display: none !important; }
  html.vp-hold .vp-holder { display: block !important; }

  /* ── Η «ΚΡΑΤΗΣΗ» ΤΟΥ `printSheet` ΣΕ iPhone/iPad (views/voucher.js `printSheetIOS`, 05.10.2026) ──
     Ίδια ιδέα με το `.vp-hold` από πάνω, για ΚΑΘΕ άλλο έγγραφο (αποδείξεις, συγκεντρωτικό, συμφωνητικά,
     κάρτες οδηγού, Bonus Cards) — αλλά ΛΕΥΚΟ: το κρεμ ανήκει μόνο στο voucher. Το πλαίσιο `.is-fit`
     (κάρτα οδηγού) παίρνει ύψος inline (968px) και το φύλλο μέσα του σμικρυμένο/γυρισμένο. */
  html.ps-hold, html.ps-hold body { height: auto !important; background: #fff !important; }
  html.ps-hold body > :not(.ps-holder) { display: none !important; }
  html.ps-hold .ps-holder { display: block !important; }
  .ps-holder.is-fit .ps-page {
    position: relative; width: 794px; overflow: hidden; margin: 0 auto;
    break-inside: avoid; page-break-inside: avoid;
  }

  /* ── ΜΙΑ σελίδα (`.is-fit`) ───────────────────────────────────────────────
     iPhone / iPad ΠΑΝΤΑ: το iOS αγνοεί το `@page { margin: 0 }` και τυπώνει σε
     ~181,6 × 232,7mm (λόγος 1,28 — μνήμη ios-print-behaviour), οπότε πλαίσιο
     794 × 968px = 210 × 256mm (λόγος 1,22, όπως οι αποδείξεις).
     Chrome υπολογιστή / Android ΜΟΝΟ όταν το φύλλο ξεπερνά το Α4 (μεγάλο
     σχόλιο): πλαίσιο 794 × 1118px = 210 × 296mm.
     Το ΥΨΟΣ το δίνει ο `printVoucher` (inline). Μέσα του το φύλλο, σμικρυμένο
     με `transform` ώστε να χωρά ολόκληρο, στο κέντρο — το `overflow:hidden`
     κρύβει το ασμίκρυντο ύψος της διάταξης. Το δικό του ντεγκραντέ γίνεται
     διάφανο: το κουβαλά πλέον το πλαίσιο, χωρίς ραφή στα πλάγια. */
  .vp-holder.is-fit .vp-page {
    width: 794px; overflow: hidden; margin: 0 auto;
    background: linear-gradient(180deg, #F7F4EE 0%, #F1EDE3 100%);
    -webkit-print-color-adjust: exact; print-color-adjust: exact;
    break-inside: avoid; page-break-inside: avoid;
  }
  .vp-holder.is-fit .esvsheet.printing {
    width: 794px !important; max-width: 794px !important;
    min-height: 0 !important; margin: 0 auto !important;
    background: transparent !important;
  }
  /* ⚠ iPhone / iPad: ΤΟ ΚΡΕΜ ΓΕΜΙΖΕΙ ΟΛΗ ΤΗΝ ΕΚΤΥΠΩΣΙΜΗ ΣΕΛΙΔΑ (05.10.2026).
     Ιδιοκτήτης, PDF από iPhone: «the background is white, it shouldnt be». Το
     πλαίσιο των 968px (λόγος 1,22) σταματούσε ~4εκ. πριν το τέλος: ΜΕΤΡΗΜΕΝΟ
     από τα ίδια τα PDF (το πρώτο `re W n` = η εκτυπώσιμη περιοχή) — Chrome iOS
     27: 559,3 × 761,4pt, Safari iOS 26.5: 515,3 × 704,8pt, δηλαδή λόγος ≈1,36
     και ΟΧΙ 1,28 (≈1081px ύψος στα 794px πλάτους). Και το φόντο html/body ΔΕΝ
     τυπώνεται στο iOS — κάτω από το πλαίσιο έμενε χαρτί.
     ⚠ ΓΙΑΤΙ `position: fixed` ΚΑΙ ΟΧΙ ΨΗΛΟΤΕΡΟ ΠΛΑΙΣΙΟ / `100vh`:
     • ψηλότερο πλαίσιο = ψηλότερο έγγραφο: με αληθινό εκτυπωτή (άλλα
       περιθώρια) θα έβγαινε ΔΕΥΤΕΡΗ σελίδα, ολόκληρη κρεμ — μελάνι για το τίποτα·
     • `100vh`: στην προεπισκόπηση σωστό, αλλά στην «Αποθήκευση στα Αρχεία» το
       iOS ξαναστήνει τη σελίδα με το ύψος της ΟΘΟΝΗΣ — δοκιμάστηκε, ίδιο λευκό.
     Ένα `fixed` στρώμα ΔΕΝ μεγαλώνει το έγγραφο (καμία δεύτερη σελίδα) και το
     WebKit το τυπώνει μία φορά, στην πρώτη σελίδα· ό,τι περισσεύει κόβεται στο
     όριο της σελίδας. Κάθεται ΠΙΣΩ από το voucher (z-index −1), με το κάτω
     χρώμα του ντεγκραντέ — η ένωση δεν φαίνεται.
     ⚠ Το λεπτό λευκό ΓΥΡΩ-ΓΥΡΩ (≈6–14mm) είναι το περιθώριο χαρτιού του ίδιου
     του iPhone: εκεί η σελίδα δεν ζωγραφίζει τίποτα — δεν διορθώνεται από εδώ. */
  .vp-holder.is-ios::before {
    content: ''; display: block;
    position: fixed; left: 0; top: 0; z-index: -1;
    width: 794px; height: 1500px;
    background: #F1EDE3;
    -webkit-print-color-adjust: exact; print-color-adjust: exact;
  }
  /* ⚠ ΔΕΥΤΕΡΟ, ΑΝΕΞΑΡΤΗΤΟ ΔΙΧΤΥ (05.10.2026): το iPhone του ιδιοκτήτη είναι
     Chrome σε iOS 27 — δεν υπάρχει στον προσομοιωτή για δοκιμή. Ένα περίγραμμα
     (`outline`) στο χρώμα του χαρτιού γύρω από το πλαίσιο: είναι ΟΠΤΙΚΗ
     υπερχείλιση — δεν μεγαλώνει το έγγραφο (καμία δεύτερη σελίδα, μετρημένο)
     — και κόβεται στο όριο της σελίδας. Ζωγραφίζεται ΜΟΝΟ έξω από το πλαίσιο,
     άρα δεν σκεπάζει ποτέ το voucher. Αν δουλεύει το ένα από τα δύο, φτάνει. */
  .vp-holder.is-ios .vp-page { outline: 1000px solid #F1EDE3; outline-offset: 0; }
  /* ⚠ ΤΟ ΧΡΥΣΟ ΘΑΜΠΟ ΤΗΣ ΚΕΦΑΛΙΔΑΣ ΓΙΝΟΤΑΝ ΜΑΥΡΟ ΚΟΥΤΙ ΣΤΟ iOS. Μετρημένο: το
     `radial-gradient` με διαφάνεια (χρυσό 22% → transparent) τυπωνόταν ΧΩΡΙΣ
     τη διαφάνεια — αδιαφανές χρυσό που σβήνει σε ΜΑΥΡΟ, ένα μαύρο ορθογώνιο
     πάνω στη διεύθυνση της εταιρείας. Στο χαρτί του iOS φεύγει (ήταν θάμπος
     22%)· η χρυσή γραμμή από κάτω σβήνει στο ναυτικό μπλε, όχι στο «διάφανο». */
  .vp-holder.is-ios .esvsheet .head:before { display: none !important; }
  .vp-holder.is-ios .esvsheet .head:after {
    background: linear-gradient(90deg, var(--ink-soft), var(--brass) 22%, var(--brass-lt) 50%, var(--brass) 78%, var(--ink-soft));
    opacity: 1;
  }
}

/* Στην οθόνη το αντίγραφο του χαρτιού δεν φαίνεται ποτέ. */
@media screen {
  .vp-holder, .ps-holder { display: none !important; }
}

/* Η ΠΙΝΑΚΙΔΑ ΑΦΙΞΗΣ ΔΕΝ ΕΧΕΙ ΠΙΑ ΣΤΥΛ ΕΔΩ. Ανοίγει σε ΔΙΚΟ ΤΗΣ παράθυρο
   (views/arrival-sign.js) με ενσωματωμένο CSS, επειδή τότε υπήρχε εδώ στατικό
   `@page … A4 portrait`: δύο κανόνες `@page` στο ίδιο έγγραφο παλεύουν και η
   πινακίδα τυπωνόταν κάθετη. **Ένα έγγραφο, ένας κανόνας.**

   ⚠ Ο ΚΑΝΟΝΑΣ ΙΣΧΥΕΙ ΑΚΟΜΗ, ΑΠΛΩΣ ΛΥΘΗΚΕ ΑΛΛΙΩΣ (10.09.2026): πλέον ΚΑΝΕΝΑ
   φύλλο στυλ δεν γράφει `@page` εκτός από τη `base.css` (12mm). Το μηδενικό
   περιθώριο των full-bleed χαρτιών το βάζει δυναμικά ο `printSheet()` και το
   αφαιρεί μετά. Το ξεχωριστό παράθυρο της πινακίδας ΔΕΝ χρειάζεται πια για
   αυτόν τον λόγο — αλλά ΜΕΝΕΙ: δουλεύει, και δεν το πειράζουμε χωρίς αφορμή. */
