/* ekΜάθησις — site v1 (παιδικό, marketing). Design: bright/off-white, dominant teal,
   αισθητική Stripe/Apple. Fluid type scale με clamp() — καμία σταθερή px τιμή σε heading/body.
   Τυπογραφία: Manrope (τίτλοι) + Inter (σώμα) — και τα δύο πλήρες Greek+Latin, self-hosted. */

/* ---------- Fonts (self-hosted VARIABLE, greek+latin subsets — CSP-ready, font-src 'self') ----------
   v4: όλα τα αρχεία είναι variable (τα ίδια URLs σερβίρονται από το css2 API για wght@100..900) →
   δηλώνονται με range, ξεκλειδώνοντας τα ΛΕΠΤΑ βάρη (200-400) που ζήτησε ο Αντώνης.
   Display = Commissioner (λεπτό, μοντέρνο grotesk, πλήρη ελληνικά — Κ. Μπαρτσόκας)· body = Inter. */
@font-face {
  font-family: 'Commissioner'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/commissioner-var-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+20AC, U+2122;
}
@font-face {
  font-family: 'Commissioner'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/commissioner-var-greek.woff2') format('woff2');
  unicode-range: U+0370-03FF;
}
/* Syne (variable 400-800) — διακριτικό, design-forward grotesk για τίτλους («όχι basic», αίτημα 3/7) */
@font-face {
  font-family: 'Syne'; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url('../fonts/syne-var-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+20AC, U+2122;
}
@font-face {
  font-family: 'Syne'; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url('../fonts/syne-var-greek.woff2') format('woff2');
  unicode-range: U+0370-03FF;
}
/* ═══ ACTUAL — γραμματοσειρά ΤΙΤΛΩΝ (απόφαση Αντώνη 21/8) ═══
   Πέτρος Βασιάδης, CC BY 4.0 (cynfonts.blogspot.com, 2014) — η αναφορά δημιουργού ζει στο
   privacy.html. Μονογραμμική/γεωμετρική: ομοιοκαταληκτεί με τη γραμμή του showreel (σταθερό
   πάχος, round caps), κάτι που η Inter — ουμανιστική, φτιαγμένη για UI — δεν κάνει.
   ΔΙΟΡΘΩΜΕΝΗ ΕΚΔΟΣΗ (21/8, επιτρεπτό από την άδεια): το πρωτότυπο είχε ΜΗΔΕΝ kerning και
   του έλειπαν τα – — … (7 τίτλοι χρησιμοποιούν το «—»). Προστέθηκαν: 392 ζεύγη kerning
   υπολογισμένα οπτικά πάνω στους πραγματικούς τίτλους του site, και οι 3 χαρακτήρες
   σχεδιασμένοι με το πάχος της ίδιας (πηγές/εργαλεία: assets/fonts/actual-src/).
   Ένα αρχείο ανά βάρος (100/200/400) — δεν είναι variable. Καλύπτει greek+latin μαζί. */
@font-face {
  font-family: 'Actual'; font-style: normal; font-weight: 100; font-display: swap;
  src: url('../fonts/actual-thin.woff2?v=7') format('woff2');
}
@font-face {
  font-family: 'Actual'; font-style: normal; font-weight: 200; font-display: swap;
  src: url('../fonts/actual-extralight.woff2?v=7') format('woff2');
}
@font-face {
  font-family: 'Actual'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('../fonts/actual-book.woff2?v=7') format('woff2');
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/inter-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+20AC, U+2122;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/inter-greek.woff2') format('woff2');
  unicode-range: U+0370-03FF;
}
@font-face {
  font-family: 'Manrope'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/manrope-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+20AC, U+2122;
}
@font-face {
  font-family: 'Manrope'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/manrope-greek.woff2') format('woff2');
  unicode-range: U+0370-03FF;
}
/* Roboto (variable 100-900) — κύρια γραμματοσειρά (camps), self-hosted αντί για Google Fonts
   (perf: −1 εξωτερικό round-trip· GDPR: καμία IP επισκέπτη προς Google). greek + latin subsets. */
@font-face {
  font-family: 'Roboto'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/roboto-var-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+2000-206F, U+20AC, U+2122;
}
@font-face {
  font-family: 'Roboto'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('../fonts/roboto-var-greek.woff2') format('woff2');
  unicode-range: U+0370-03FF;
}

/* ---------- Design tokens ---------- */
:root{
  /* Χρώματα — Lusion-style ουδέτερα γκρι (απόφαση 17/7: όλο γκρι, subtle διαβαθμίσεις·
     έφυγαν το off-white και οι πρασινωπές αποχρώσεις). Teal μένει ΜΟΝΟ ως brand accent σε CTAs/links. */
  /* ═══ ΠΑΛΕΤΑ v2 — ΚΛΕΙΔΩΘΗΚΕ 22/8/2026 (επιλογή Αντώνη στο _palette.html) ═══
     Η οικογένεια βγήκε από τη ΓΡΑΜΜΗ του showreel (#94FFFB → #29A8D6): ήταν ήδη το πιο
     χαρακτηριστικό στοιχείο του site και το μόνο κυανό μέσα σε τέσσερις άσχετες οικογένειες
     (teal-πράσινο 173°, λαχανί 74°, κυανό 178°, μπλε 234°). Τώρα μία οικογένεια, τρεις ρόλοι:
        ΚΥΡΙΟ    #4BECE7 (178°) — γεμίσματα (κουμπιά, σήματα) + ό,τι κάθεται σε ΣΚΟΥΡΟ
        ΚΕΙΜΕΝΟ  #00807D (179°) — το ίδιο χρώμα, αρκετά βαθύ για γράμματα σε ΑΝΟΙΧΤΟ
        ΤΟΝΙΣΜΟΣ #C6F135        — σπάνια, σε συγκεκριμένα σημεία (μένει ως --c-volt)
     ⚠ ΓΙΑΤΙ ΔΥΟ ΤΙΜΕΣ ΓΙΑ ΤΟ ΙΔΙΟ ΧΡΩΜΑ: το #4BECE7 σε ανοιχτό φόντο μετριέται 1,37:1 —
     αόρατο ως κείμενο. Σε γέμισμα όμως δίνει 12,10:1 με μαύρα γράμματα. Δεν φταίει το χρώμα,
     φταίει το έδαφος. Απόσταση απόχρωσης κυρίου↔κειμένου: 1° — το μάτι τα διαβάζει ως ένα.
     ΠΑΛΙΕΣ ΤΙΜΕΣ ΓΙΑ «ΓΥΡΝΑ ΠΙΣΩ»: bg #F0F1FA · tint #E4E6EF · ράμπα 173°:
     50 #EAF6F4 · 100 #CFEBE7 · 400 #1FA394 · 500 #0E8C7D · 600 #0B7568 · 700 #095F55 */
  --c-bg:            #F7F8FC;   /* ήταν #F0F1FA — φωτεινότητα 88,3% → 93,9%, ίδια κρύα οικογένεια */
  --c-surface:       #FFFFFF;
  --c-surface-tint:  #E4E8F5;   /* ήταν #E4E6EF (ουδέτερο γκρι, 9 μονάδες κάτω — έκανε ορατή ραφή) */
  --c-accent:        #4BECE7;   /* ΚΥΡΙΟ — μόνο σε γεμίσματα & σκούρο έδαφος */
  --c-accent-hover:  #21E8E1;   /* το ίδιο, ένα σκαλί κάτω, για hover γεμάτου κουμπιού */
  --c-teal-50:       #E4F7F6;
  --c-teal-100:      #C2EFEE;
  --c-teal-400:      #12A8A5;
  --c-teal-500:      #068B88;
  /* ═══ ΔΥΟ ΤΟΚΕΝ, ΟΧΙ ΕΝΑ (απόφαση Αντώνη 22/8) ═══
     Το χρώμα κειμένου χωρίστηκε κατά ΡΟΛΟ, όχι κατά αισθητική:
       teal-600 #00B3B0 → ΔΙΑΚΟΣΜΗΤΙΚΑ & ΜΕΓΑΛΑ (eyebrows, ρόλοι, em σε τίτλους, ο 67px
                          αριθμός στο προφίλ, tags). Μετριέται 2,45:1 — κάτω από το όριο, αλλά
                          είναι ετικέτες που ΔΕΝ κουβαλάνε λειτουργία: το νόημα το δίνει ο
                          τίτλος από κάτω. Επιλογή Αντώνη, με γνώση του αριθμού.
       cta      #00807D → ΛΕΙΤΟΥΡΓΙΚΑ (σύνδεσμοι, εικονίδιο FAQ). Εκεί η ανάγνωση δεν είναι
                          διακόσμηση: αν δεν φανεί ο σύνδεσμος, χάνεται η ενέργεια. 4,51:1.
     ⚠ Αν αλλάξει το ένα, ΔΕΝ αλλάζει το άλλο — αυτός ακριβώς είναι ο σκοπός. */
  --c-teal-600:      #00B3B0;   /* διακοσμητικό — ήταν #00807D, πριν #0B7568 */
  --c-teal-700:      #006B68;
  --c-ink:           #17191E;   /* ουδέτερο σκούρο (ήταν πρασινωπό #10201D) */
  --c-ink-soft:      #474C56;
  --c-ink-mute:      #72777F;
  --c-border:        #D7DAE0;
  --c-border-soft:   #E1E3E8;
  --c-cta:           #00807D;   /* ΛΕΙΤΟΥΡΓΙΚΟ — σύνδεσμοι & εικονίδια, 4,51:1 στο φόντο */
  --c-cta-hover:     #006B68;   /* ήταν #095F55 */
  /* ΤΟ FOCUS ΑΝΕΒΗΚΕ ΣΚΑΛΙ (μετρημένο): το teal-400 δίνει 2,76:1 στο νέο φόντο, κάτω από το
     3:1 που θέλει ένα περίγραμμα εστίασης. Το teal-500 δίνει 3,91:1. */
  --c-focus:         #068B88;

  /* Lusion accents (απόφαση 17/7 — reference lusion.co):
     electric blue = η γραμμή του hero video (ανοίγει προς το τελείωμα)·
     ribbon = η τιρκουάζ→πράσινη γραμμή πίσω από τη μεγάλη τυπογραφία. */
  --c-elec:          #2B3BFF;
  --c-elec-light:    #7A85FF;
  --c-ribbon-a:      #17D9C0;
  --c-ribbon-b:      #62E874;

  /* VOLT-style accent (lime) — ζητήθηκε ρητά για το κίτρινο shutter + giant hero wordmark accents.
     REVIEWABLE: η παλέτα δεν έχει κλειδώσει· αν αποφασιστεί άλλο accent, αλλάζει ΜΟΝΟ εδώ. */
  --c-volt:          #C6F135;
  --c-volt-ink:      #0C1400;
  /* container-aligned άκρη (ώστε το fixed wordmark να ευθυγραμμίζεται με το nav logo σε φαρδιές οθόνες) */
  --gutter:          max((100vw - var(--container-max)) / 2, 0px);
  --pad-x:           clamp(1.25rem, 1rem + 2vw, 2.5rem);

  /* Τυπογραφία — v7 (αίτημα 3/7: «όχι basic» + «ακόμα πιο λεπτή»):
     · display = Syne (διακριτικό grotesk) για τίτλους/panels/footer
     · hero = Commissioner ExtraLight (200) για την ποιητική ατάκα — πολύ λεπτή, elegant
     · body = Inter. Όλα self-hosted, πλήρη ελληνικά. Τα βάρη = tokens (αλλαγή από ΕΝΑ σημείο). */
  /* ΚΑΘΟΛΙΚΗ ΓΡΑΜΜΑΤΟΣΕΙΡΑ: Manrope (απόφαση Αντώνη 11/8) — επιλέχθηκε από δείγματα, έχει
     πραγματικά ελληνικά glyphs. Η Roboto μένει εφεδρική.
     ⚠ ΠΡΟΣ ΕΛΕΓΧΟ Β' ΦΑΣΗΣ: η Manrope δεν έχει πλάγια· όπου χρειαστεί italic ο browser θα το
     «γείρει» τεχνητά. Στο site τα <em> είναι ήδη font-style: normal (μόνο το .tl-note στο
     προφίλ είναι italic). Αν το σώμα κειμένου δεν διαβάζεται άνετα, ζευγαρώνουμε δεύτερη
     γραμματοσειρά ΜΟΝΟ για τρέχον κείμενο — τα tokens είναι ήδη χωριστά γι' αυτόν τον λόγο. */
  /* ΤΙΤΛΟΙ → INTER 200 (απόφαση Αντώνη 18/8, δοκιμή στο _font-test.html).
     Οι ΤΙΤΛΟΙ και το hero παίρνουν Inter ExtraLight· το ΚΥΡΙΩΣ ΚΕΙΜΕΝΟ μένει Manrope —
     αυτό ήταν ρητός όρος. Το Inter είναι ήδη self-hosted ΚΑΙ variable (100–900): το βάρος 200
     δεν χρειάστηκε κανένα νέο αρχείο (επαληθεύτηκε με μέτρηση πλάτους ανά βάρος).
     Το -0.02em tracking είναι απαραίτητο: χωρίς αυτό το 200 «διαλύεται» σε μεγάλο μέγεθος
     (τιμές από την πλατφόρμα, frost.css .fr-hello h1). Fallback σε Manrope, όχι Roboto,
     ώστε αν λείψει το Inter να πέσει στη γραμματοσειρά που ήδη φορτώνει η σελίδα. */
  /* 21/8 (απόφαση Αντώνη): τίτλοι → ACTUAL. Fallback: Inter (ίδιο πνεύμα, ήδη φορτωμένη) → Manrope.
     ΜΕΤΡΗΜΕΝΟ: η Actual είναι +24% φαρδύτερη από την Inter στους τίτλους του site· με το kerning
     που της χτίσαμε και tracking -0.05em η διαφορά πέφτει στο ~+9% — αποδεκτή, αλλά ΠΡΟΣΟΧΗ στα
     nowrap σημεία (λίστα προγραμμάτων: το 6.5vw έγινε 6vw, βλ. εκεί). */
  --f-display: 'Actual', 'Inter', 'Manrope', system-ui, sans-serif;
  --f-hero:    'Actual', 'Inter', 'Manrope', system-ui, sans-serif;
  /* ΓΙΑ ΤΑ ΒΑΡΙΑ display στοιχεία (600-800: μενού overlay, ΚΑΘΕ ΜΕΡΑ, ΕΤΟΙΜΟΣ…, αριθμοί
     βημάτων, FAQ). Η Actual έχει ΜΟΝΟ 100/200/400 — και το CSS ΔΕΝ πέφτει στην επόμενη
     οικογένεια όταν λείπει το βάρος (μόνο όταν λείπει ο χαρακτήρας): θα έδινε Actual 400,
     δηλαδή ΛΕΠΤΟ εκεί που το σχέδιο θέλει ΒΑΡΥ. Αυτά μένουν ρητά σε Inter. */
  --f-display-ui: 'Inter', 'Manrope', system-ui, sans-serif;
  --f-body:    'Manrope', 'Roboto', system-ui, sans-serif;   /* ΚΕΙΜΕΝΟ — δεν αλλάζει */
  /* ΑΡΙΘΜΟΙ (25/8). ΓΙΑΤΙ ΞΕΧΩΡΙΣΤΟ ΤΟΚΕΝ: η Actual έχει ΜΟΝΟ oldstyle ψηφία — το «9», το «3»,
     το «4», το «7» πέφτουν κάτω από τη γραμμή βάσης και τα ύψη διαφέρουν. Μετρήθηκε στο αρχείο:
     «9» βάθος −10 και ύψος 71, «0» βάθος 0 και ύψος 80. Και τα πρωτότυπα .otf δεν έχουν καμία
     OpenType feature, άρα ΔΕΝ διορθώνεται με font-variant-numeric.
     Όπου ένας αριθμός πρέπει να «στέκεται» (μετρητές, χρονολογίες, αρίθμηση) → --f-num. */
  --f-num:     'Manrope', 'Inter', system-ui, sans-serif;
  /* tracking τίτλων. 21/8 ΑΝΑΘΕΩΡΗΣΗ: ήταν -0.05em και ΣΤΟΙΒΑΖΟΤΑΝ πάνω στο kerning —
     το «ελ» σφιγγόταν συνολικά -141 μονάδες και τα γράμματα κολλούσαν. Το kerning διορθώνει
     πλέον ΜΟΝΟ τις εξαιρέσεις (φυσικός ρυθμός 100), οπότε εδώ αρκεί το ίδιο -0.02em που
     είχε και η Inter — καθαρός διαχωρισμός ρόλων: kerning = εξαιρέσεις, tracking = ρυθμός. */
  --ls-display: -0.02em;
  --fw-display: 200;        /* τίτλοι section — Actual ExtraLight */
  --fw-display-strong: 600; /* panel labels / footer headings — πέφτει σε Inter (η Actual δεν έχει 600) */
  --fw-hero: 200;           /* ατάκα hero — Actual ExtraLight */

  /* Fluid type scale — clamp(min, preferred-vw, max). 6 βαθμίδες: display/h1/h2/h3/body/small.
     Ref: 375px mobile → 1440px desktop viewport. */
  --fs-display: clamp(2.25rem, 1.4rem + 3.6vw, 4.5rem);   /* 36px  → 72px  */
  --fs-h1:      clamp(1.875rem, 1.3rem + 2.4vw, 3.25rem); /* 30px  → 52px  */
  --fs-h2:      clamp(1.5rem,   1.15rem + 1.5vw, 2.375rem);/* 24px  → 38px  */
  --fs-h3:      clamp(1.125rem, 0.95rem + 0.7vw, 1.5rem); /* 18px  → 24px  */
  --fs-body:    clamp(1rem,     0.94rem + 0.24vw, 1.125rem);/* 16px → 18px  */
  --fs-small:   clamp(0.8125rem,0.78rem + 0.14vw, 0.9375rem);/* 13px → 15px */

  --lh-tight: 1.15;
  --lh-snug:  1.35;
  --lh-body:  1.65;

  /* Spacing — fluid, τιμωρεί σταθερά px */
  --sp-section: clamp(3.5rem, 2.4rem + 4.4vw, 8rem);
  --sp-block:   clamp(1.75rem, 1.4rem + 1.4vw, 3rem);
  --sp-gap:     clamp(1rem, 0.85rem + 0.6vw, 1.75rem);

  --radius-sm: 10px;
  --radius-md: 16px;
  --radius-lg: 24px;

  --shadow-sm: 0 1px 2px rgba(21,23,29,.06), 0 1px 1px rgba(21,23,29,.04);
  --shadow-md: 0 8px 24px -8px rgba(21,23,29,.14);
  --shadow-lg: 0 24px 48px -12px rgba(21,23,29,.18);

  --container-max: 1180px;
  --dur-fast: 180ms;
  --dur-med:  320ms;
  --ease: cubic-bezier(.22,.61,.36,1);
}

/* ---------- Reset (thin) ---------- */
*, *::before, *::after{ box-sizing: border-box; }
html{ -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body{
  margin: 0;
  background: var(--c-bg);
  color: var(--c-ink);
  font-family: var(--f-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
}
img, video{ max-width: 100%; display: block; }
a{ color: inherit; text-decoration: none; }
button{ font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }
ul{ margin: 0; padding: 0; list-style: none; }
h1,h2,h3,p,dl,dd{ margin: 0; }
input, select{ font: inherit; }

h1,h2,h3{ font-family: var(--f-display); font-weight: var(--fw-display); line-height: var(--lh-tight); letter-spacing: var(--ls-display); }
/* ΕΞΑΙΡΕΣΗ h3 (18/8): το βάρος 200 δουλεύει σε μεγάλα μεγέθη· στα 18–24px του --fs-h3 γίνεται
   εύθραυστο, ιδίως σε tablet μέσα σε φωτεινή αίθουσα. Μένει 300. Αλλάζει από ΕΔΩ αν κριθεί. */
h3{ font-weight: 400; }  /* 21/8: η Actual δεν έχει 300· στο 18-24px το 200 είναι εύθραυστο (δίδαγμα 18/8) → Book */
.eyebrow{ font-family: var(--f-body); font-weight: 600; font-size: var(--fs-small); letter-spacing: .06em; text-transform: uppercase; color: var(--c-teal-600); }

/* Focus states — visible, ΠΟΤΕ outline:none χωρίς αντικατάσταση */
a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible, [tabindex]:focus-visible{
  outline: 2px solid var(--c-focus);
  outline-offset: 3px;
  border-radius: 4px;
}

/* ---------- Layout ---------- */
.container{
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: clamp(1.25rem, 1rem + 2vw, 2.5rem);
}
.section{ padding-block: var(--sp-section); }
.section-head{ max-width: 46rem; margin-bottom: var(--sp-block); }
.section-head h2{ font-size: var(--fs-h2); margin-top: .6rem; }

/* ---------- Header ---------- */
.site-header{
  position: sticky; top: 0; z-index: 50;
  background: rgba(237,238,241,.82);
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  border-bottom: 1px solid transparent;
  transition: background-color var(--dur-med) var(--ease), border-color var(--dur-med) var(--ease), box-shadow var(--dur-med) var(--ease);
}
.site-header.is-scrolled{ border-bottom-color: var(--c-border); box-shadow: var(--shadow-sm); }
.site-header .container{ display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding-block: .9rem; }
.site-logo{ display: flex; align-items: center; }
/* 6/8 (αίτημα Αντώνη): ο μαύρος δίσκος ΔΕΝ είναι συμπαγής — ημιδιαφανής (95%) με θόλωμα από
   πίσω (glass) και ελαφριά σκιά προς τα κάτω. */
.mu-logo{ display: inline-flex; align-items: center; justify-content: center; flex: none; border-radius: 50%;
  background: rgba(23, 25, 30, .95); -webkit-backdrop-filter: blur(12px) saturate(1.15);
  backdrop-filter: blur(12px) saturate(1.15); box-shadow: 0 6px 16px rgba(0, 0, 0, .18); overflow: hidden; }
.mu-logo__glyph{ width: 61.5%; height: auto; display: block; filter: brightness(0) invert(1); }
.site-logo .mu-logo{ width: clamp(60px, 52px + 1.6vw, 80px); height: clamp(60px, 52px + 1.6vw, 80px); }
/* ΟΡΙΖΟΝΤΙΟ NAV ΚΑΤΑΡΓΗΘΗΚΕ (απόφαση Αντώνη 19/8, ενοποίηση breakpoints): burger με τις
   3 γραμμές σε ΟΛΑ τα πλάτη, και στις εσωτερικές σελίδες — το πλήρες μενού ζει στο overlay.
   Μετρημένο πριν την απόφαση: το nav στη σειρά ήθελε 661-735px μόνο του (914px μαζί με
   λογότυπο+κουμπί) και στα 900-1010 έσπαγε ήδη σε 2 γραμμές (62px ύψος αντί 44). */

.btn{
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  padding: .75rem 1.4rem; border-radius: 999px;
  font-weight: 600; font-size: var(--fs-small);
  min-height: 44px;
  transition: transform var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
  cursor: pointer;
}
/* ΤΟ ΓΕΜΑΤΟ ΚΟΥΜΠΙ ΠΑΙΡΝΕΙ ΤΟ ΚΥΡΙΟ ΧΡΩΜΑ (22/8 — απόφαση Αντώνη στον δοκιμαστή παλέτας:
   «σε κουμπιά που έχουν έτσι μεγάλο [γέμισμα] είναι ωραίο να φαίνεται»).
   ΓΙΑΤΙ ΕΠΡΕΠΕ: με σκούρο γέμισμα το site φαινόταν ΑΜΕΤΑΒΛΗΤΟ. Το παλιό #0B7568 και το νέο
   #00807D απέχουν 6 μοίρες απόχρωσης και ΜΗΔΕΝ φωτεινότητας — ο λόγος αντίθεσης ΜΕΤΑΞΥ τους
   είναι 1,17:1, δηλαδή για το μάτι είναι το ίδιο χρώμα. Η ταυτότητα φαίνεται μόνο εκεί που το
   χρώμα μπαίνει ΑΝΟΙΧΤΟ: σε γέμισμα. Μαύρα γράμματα πάνω του: 12,10:1. */
.btn-primary{ background: var(--c-accent); color: var(--c-ink); box-shadow: var(--shadow-sm); }
.btn-primary:hover{ background: var(--c-accent-hover); box-shadow: var(--shadow-md); }
.btn-ghost{ background: var(--c-surface); color: var(--c-ink); border: 1px solid var(--c-border); }
.btn-ghost:hover{ border-color: var(--c-teal-400); color: var(--c-teal-700); }
.btn-header{ display: none; }
@media (min-width: 700px){ .btn-header{ display: inline-flex; } }

/* burger — σε ΟΛΑ τα πλάτη (19/8, μαζί με την κατάργηση του οριζόντιου nav) */
.burger{ display: inline-flex; width: 44px; height: 44px; align-items: center; justify-content: center; border-radius: 10px; }
.burger:hover{ background: var(--c-surface-tint); }
.burger span, .burger::before, .burger::after{ content: ''; display: block; width: 20px; height: 2px; background: var(--c-ink); border-radius: 2px; position: relative; }
.burger{ flex-direction: column; gap: 5px; }

.mobile-nav{
  position: fixed; inset: 0; z-index: 60; background: var(--c-bg);
  display: flex; flex-direction: column; padding: 1.1rem clamp(1.25rem,1rem + 2vw,2.5rem);
  transform: translateY(-100%); transition: transform var(--dur-med) var(--ease);
}
.mobile-nav.is-open{ transform: translateY(0); }
.mobile-nav-top{ display: flex; align-items: center; justify-content: space-between; }
.mobile-nav-top .mu-logo{ width: 56px; height: 56px; }
.mobile-nav ul{ display: flex; flex-direction: column; gap: 1.6rem; margin-top: 3rem; }
.mobile-nav a{ font-family: var(--f-display-ui); font-size: var(--fs-h2); font-weight: 700; }
.mobile-nav .btn{ margin-top: 2rem; align-self: flex-start; }

/* ---------- HERO ---------- */
.hero{ position: relative; padding-top: clamp(2rem, 1rem + 4vw, 4rem); padding-bottom: var(--sp-section); overflow: clip; }
/* Row 1: λογότυπο ΜΕΓΑΛΟ αριστερά | ατάκα δεξιά (mobile: στοίβα — λογότυπο πάνω, ατάκα κάτω, σειρά = DOM order) */
.hero-top{
  display: grid; gap: clamp(1.5rem, 1rem + 2vw, 3rem);
  grid-template-columns: 1fr;
  align-items: center;
  margin-bottom: clamp(2rem, 1.4rem + 3vw, 4rem);
}
.hero-logo-wrap{ display: flex; }
.hero-logo-wrap img{ width: clamp(160px, 100px + 22vw, 340px); height: auto; }
.hero-line{ font-family: var(--f-display); font-size: var(--fs-display); font-weight: 300; letter-spacing: -0.015em; color: var(--c-ink); }
.hero-line em{ font-style: normal; color: var(--c-teal-600); }
/* Row 2: video, full-width, κάτω από το row 1 */
.hero-media{
  position: relative; border-radius: var(--radius-lg); overflow: hidden;
  aspect-ratio: 21/9; background: linear-gradient(160deg,#12302B,#0B2320 60%,#081714);
  box-shadow: var(--shadow-lg);
}
.hero-media::after{ content:''; position:absolute; inset:0; background: linear-gradient(0deg, rgba(0,0,0,.45), rgba(0,0,0,.12) 45%, transparent 70%); }
.media-placeholder{
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  text-align: center; padding: 1.5rem; z-index: 1;
}
.media-placeholder-label{
  font-family: var(--f-body); font-size: var(--fs-small); font-weight: 600; letter-spacing: .04em;
  color: rgba(255,255,255,.92); text-transform: uppercase;
  border: 1px dashed rgba(255,255,255,.45); border-radius: var(--radius-sm);
  padding: .9rem 1.2rem; backdrop-filter: blur(2px);
}
/* πλαίσιο placeholder ΕΚΤΟΣ σκούρων media (πάνω σε ανοιχτό φόντο) */
.media-placeholder.on-light{ position: static; inset: auto; height: 100%; }
.media-placeholder.on-light .media-placeholder-label{ color: var(--c-ink-mute); border-color: var(--c-border); background: var(--c-surface-tint); }

/* ---------- Sticky-shrink λογότυπο header ----------
   Το μεγάλο λογότυπο του hero «μαζεύεται» στο μικρό sticky του header καθώς σκρολάρεις
   (GSAP ScrollTrigger τσιμπάει .is-logo-visible στο header). ΧΩΡΙΣ JS: το header logo
   είναι ΠΑΝΤΑ ορατό (no-js/no-motion fallback ασφαλές — ποτέ κρυφό brand στοιχείο). */
.site-header .site-logo{ transition: opacity var(--dur-med) var(--ease), transform var(--dur-med) var(--ease); }
/* Το header logo είναι πλέον ΠΑΝΤΑ ορατό by default (v3)· κρύβεται ΜΟΝΟ στην homepage
   (body[data-home]) όπου το ταξιδεμένο giant wordmark αναλαμβάνει τον ρόλο του — βλ. VOLT layer. */

/* ---------- Τι κάνουμε ---------- */
.intro-copy{ max-width: 42rem; }
.intro-copy h2{ font-size: var(--fs-h1); }
.intro-copy p{ margin-top: 1.25rem; color: var(--c-ink-soft); font-size: var(--fs-body); }

/* ---------- Η καθημερινή μελέτη (4 βήματα + Χάρτης Μάθησης) ---------- */
.steps-row{ display: grid; grid-template-columns: 1fr; gap: var(--sp-gap); margin-bottom: var(--sp-block); }
@media (min-width: 700px){ .steps-row{ grid-template-columns: repeat(4,1fr); } }
.step{ display: flex; flex-direction: column; gap: .6rem; }
.step-num{ font-family: var(--f-display-ui); font-weight: 800; font-size: 1.5rem; color: var(--c-teal-400); }
.step h3{ font-size: var(--fs-h3); }
.step p{ color: var(--c-ink-soft); font-size: var(--fs-small); }

.map-panel{
  display: grid; grid-template-columns: 1fr; gap: clamp(1.5rem, 1rem + 2vw, 3.5rem);
  align-items: center; margin-top: clamp(2rem, 1.5rem + 2vw, 4rem);
}
@media (min-width: 700px){ .map-panel{ grid-template-columns: 1fr 1fr; } }
.map-copy h3{ font-size: var(--fs-h2); }
.map-copy p{ margin-top: 1rem; color: var(--c-ink-soft); }
.map-bullets{ margin-top: 1.5rem; display: flex; flex-direction: column; gap: .9rem; }
.map-bullets li{ display: flex; gap: .75rem; font-size: var(--fs-small); color: var(--c-ink-soft); }
.map-bullets strong{ color: var(--c-ink); font-family: var(--f-display-ui); }
.map-bullets .dot{ flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--c-teal-500); margin-top: .55rem; }
.map-closing{ margin-top: 1.5rem; font-weight: 600; color: var(--c-teal-700); }
.map-shot{
  border-radius: var(--radius-lg); border: 1px solid var(--c-border); background: var(--c-surface);
  box-shadow: var(--shadow-md); aspect-ratio: 4/3; display: flex; align-items: center; justify-content: center;
  padding: 1.5rem;
}
.cta-row{ margin-top: var(--sp-block); }

/* ---------- Εκπαιδευτικοί ---------- */
.people-intro{ max-width: 46rem; color: var(--c-ink-soft); margin-top: .75rem; }
.people-grid{ display: grid; grid-template-columns: 1fr; gap: var(--sp-gap); margin-top: var(--sp-block); }
/* 4 στήλες από τα 700 (ίδια διάταξη με desktop, συμπιεσμένη — 19/8)· μετρημένο στα 700:
   κάρτα 147px, ονόματα/ρόλοι αναδιπλώνουν χωρίς κόψιμο. Κινητό ≤699: 1 στήλη (βάση). */
@media (min-width: 700px){ .people-grid{ grid-template-columns: repeat(4,1fr); } }
.person-card{ display: flex; flex-direction: column; gap: .9rem; }
/* momentum-hover: ο εσωτερικός wrapper είναι ο target που κινείται με inertia (x/y/rotation) */
.person-card__inner{ display: flex; flex-direction: column; gap: .9rem; will-change: transform; }
.person-photo{
  aspect-ratio: 1/1; border-radius: var(--radius-md); background: var(--c-surface-tint);
  border: 1px solid var(--c-border); display: flex; align-items: center; justify-content: center;
  overflow: hidden;
}
.person-photo .media-placeholder-label{ color: var(--c-ink-mute); border-color: var(--c-border); font-size: .7rem; padding: .6rem .8rem; }
.person-card h3{ font-size: var(--fs-h3); }
.person-role{ font-size: var(--fs-small); color: var(--c-teal-600); font-weight: 600; }
.person-bio{ font-size: var(--fs-small); color: var(--c-ink-mute); }

/* ---------- Προγράμματα ---------- */
.programs-grid{ display: grid; grid-template-columns: 1fr; gap: var(--sp-gap); margin-top: var(--sp-block); }
.program-card{
  display: flex; flex-direction: column; background: var(--c-surface); border: 1px solid var(--c-border);
  border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm);
  transition: transform var(--dur-med) var(--ease), box-shadow var(--dur-med) var(--ease);
}
.program-card:hover{ transform: translateY(-4px); box-shadow: var(--shadow-md); }
.program-media{
  aspect-ratio: 4/3; background: var(--c-surface-tint); position: relative;
  display: flex; align-items: center; justify-content: center;
}
.program-media .media-placeholder-label{ color: var(--c-ink-mute); border-color: var(--c-border); font-size: .7rem; padding: .6rem .8rem; }
.program-body{ padding: clamp(1.25rem,1rem + 1vw,1.75rem); display: flex; flex-direction: column; gap: .75rem; flex: 1; }
.program-num{ font-family: var(--f-display-ui); font-weight: 800; color: var(--c-teal-400); font-size: var(--fs-small); }
.program-body h3{ font-size: var(--fs-h3); }
.program-body p{ color: var(--c-ink-soft); font-size: var(--fs-small); flex: 1; }
.program-link{ font-size: var(--fs-small); font-weight: 600; color: var(--c-cta); display: inline-flex; align-items: center; gap: .4rem; }
.program-link svg{ transition: transform var(--dur-fast) var(--ease); }
.program-card:hover .program-link svg{ transform: translateX(3px); }

/* ---------- FAQ ---------- */
.faq-list{ margin-top: var(--sp-block); border-top: 1px solid var(--c-border); max-width: 52rem; }
.faq-item{ border-bottom: 1px solid var(--c-border); }
.faq-q{
  width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: 1.25rem 0; text-align: left; font-family: var(--f-display-ui); font-weight: 600; font-size: var(--fs-h3);
}
.faq-q .icon{ flex: none; width: 22px; height: 22px; transition: transform var(--dur-med) var(--ease); color: var(--c-cta); }
.faq-item[data-open="true"] .faq-q .icon{ transform: rotate(45deg); }
.faq-a{ overflow: hidden; height: 0; transition: height var(--dur-med) var(--ease); }
.faq-a-inner{ padding-bottom: 1.5rem; color: var(--c-ink-soft); max-width: 42rem; }

/* ---------- Φόρμα ---------- */
.form-wrap{ display: grid; grid-template-columns: 1fr; gap: clamp(2rem,1.5rem + 2vw,4rem); }
.form-copy p{ margin-top: 1rem; color: var(--c-ink-soft); }
.interest-form{
  background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--radius-lg);
  padding: clamp(1.5rem,1.2rem + 1.4vw,2.5rem); box-shadow: var(--shadow-md);
  display: grid; grid-template-columns: 1fr; gap: 1.1rem;
}
.form-field{ display: flex; flex-direction: column; gap: .4rem; }
.form-field.full{ grid-column: 1 / -1; }
.form-field label{ font-size: var(--fs-small); font-weight: 600; color: var(--c-ink-soft); }
.form-field input, .form-field select{
  border: 1px solid var(--c-border); border-radius: var(--radius-sm); padding: .8rem .9rem;
  background: var(--c-bg); font-size: var(--fs-body); min-height: 44px;
  transition: border-color var(--dur-fast) var(--ease);
}
.form-field input:focus, .form-field select:focus{ border-color: var(--c-teal-400); }
.form-submit{ grid-column: 1 / -1; margin-top: .5rem; }
.form-note{ grid-column: 1 / -1; font-size: var(--fs-small); color: var(--c-ink-mute); }
.form-note a{ color: var(--c-cta); text-decoration: underline; text-underline-offset: 2px; }
.form-status{ grid-column: 1 / -1; font-size: var(--fs-small); font-weight: 600; color: var(--c-teal-700); display: none; }
.form-status.is-visible{ display: block; }

/* ---------- Παραρτήματα ---------- */
.locations-grid{ display: grid; grid-template-columns: 1fr; gap: var(--sp-gap); margin-top: var(--sp-block); }
.location-card{
  background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--radius-md);
  padding: clamp(1.25rem,1rem + 1vw,1.75rem); display: flex; flex-direction: column; gap: .5rem;
}
.location-card h3{ font-size: var(--fs-h3); }
.location-card .addr{ color: var(--c-ink-soft); font-size: var(--fs-small); }
.location-card .tag{ font-size: var(--fs-small); color: var(--c-teal-600); font-weight: 600; }
.location-card .tel{ margin-top: .5rem; font-size: var(--fs-small); color: var(--c-ink-mute); }
.map-embed{
  margin-top: var(--sp-block); aspect-ratio: 21/9; border-radius: var(--radius-lg);
  border: 1px solid var(--c-border); background: var(--c-surface-tint);
  display: flex; align-items: center; justify-content: center;
}
.map-embed .media-placeholder-label{ color: var(--c-ink-mute); border-color: var(--c-border); }

/* ---------- Footer ---------- */
.site-footer{ border-top: 1px solid var(--c-border); background: var(--c-surface); padding-block: var(--sp-block); }
.footer-top{ display: grid; grid-template-columns: 1fr; gap: 2.5rem; }
.footer-brand img{ height: 30px; margin-bottom: .9rem; }
.footer-brand p{ color: var(--c-ink-mute); font-size: var(--fs-small); max-width: 22rem; }
.footer-col h4{ font-family: var(--f-body); font-size: var(--fs-small); font-weight: 600; color: var(--c-ink-mute); text-transform: uppercase; letter-spacing: .05em; margin-bottom: .9rem; }
.footer-col ul{ display: flex; flex-direction: column; gap: .65rem; }
.footer-col a{ font-size: var(--fs-small); color: var(--c-ink-soft); transition: color var(--dur-fast) var(--ease); }
.footer-col a:hover{ color: var(--c-teal-600); }
.footer-bottom{
  margin-top: 3rem; padding-top: 1.5rem; border-top: 1px solid var(--c-border-soft);
  display: flex; flex-wrap: wrap; gap: .75rem 1.5rem; justify-content: space-between; align-items: center;
  font-size: var(--fs-small); color: var(--c-ink-mute);
}

/* ---------- Skeleton pages (meleti/protypa/κλπ) ---------- */
.page-hero{ padding-block: clamp(3rem,2rem + 5vw,6rem); background: var(--c-surface-tint); border-bottom: 1px solid var(--c-border); }
.page-hero h1{ font-size: var(--fs-h1); max-width: 40rem; }
.page-hero p{ margin-top: 1rem; color: var(--c-ink-soft); max-width: 34rem; }
.page-body{ padding-block: var(--sp-section); }
.placeholder-block{
  border: 1px dashed var(--c-border); border-radius: var(--radius-md); background: var(--c-surface-tint);
  padding: clamp(2rem,1.5rem + 2vw,4rem); text-align: center; color: var(--c-ink-mute); font-size: var(--fs-small);
}

/* ---------- Scroll reveal (GSAP τσιμπάει .is-visible· CSS = fallback/no-js state) ---------- */
[data-reveal]{ opacity: 0; transform: translateY(18px); }
[data-reveal].is-visible{ opacity: 1; transform: none; transition: opacity 700ms var(--ease), transform 700ms var(--ease); }

/* ---------- prefers-reduced-motion: ΟΛΑ τα εφέ off ---------- */
@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior: auto; }
  [data-reveal]{ opacity: 1 !important; transform: none !important; transition: none !important; }
  .program-card, .btn, .faq-q .icon, .mobile-nav, .site-header{ transition: none !important; }
  .program-card:hover{ transform: none !important; }
}

/* No-JS fallback: αν δεν τρέξει καθόλου JS, δείξε τα πάντα (μη κρύβεις περιεχόμενο) */
.no-js [data-reveal]{ opacity: 1; transform: none; }

/* ════════════════════════════════════════════════════════════════════════════
   VOLT-STYLE LAYER v3 (3/7/2026) — πιστότερη αναπαραγωγή voltlites.com
   Μοτίβα αλληλεπίδρασης (full-bleed hero, logo-travel, shutter, expanding cards)
   με ΔΙΚΟ ΜΑΣ λογότυπο/κείμενα/χρώματα. Χρώματα ΜΟΝΟ από tokens.
   ════════════════════════════════════════════════════════════════════════════ */

/* ---------- Header v7 — ΜΑΥΡΟ nav (αίτημα 3/7) ----------
   Homepage: ΟΛΟ το nav κρύβεται όσο παίζει το hero (motion.js: yPercent -100)· εμφανίζεται στο τέλος
   (αφού φύγει το βίντεο) με εφέ + pop του στρογγυλού «Μ». Χωρίς JS / reduced-motion = ΠΑΝΤΑ ορατό. */
.site-header{ position: fixed; left: 0; right: 0; top: 0; z-index: 50; background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none;
   border-bottom: 1px solid transparent; box-shadow: none; will-change: transform; }
.site-header.is-nav-solid{ background: rgba(237,238,241,.6); backdrop-filter: blur(10px) saturate(140%); -webkit-backdrop-filter: blur(10px) saturate(140%); border-bottom-color: rgba(21,23,29,.08); box-shadow: 0 6px 22px -14px rgba(21,23,29,.14); }
.site-header .site-nav a{ color: var(--c-ink); }
.site-header .site-nav a:hover{ color: var(--c-teal-600); }
.site-header .burger span, .site-header .burger::before, .site-header .burger::after{ background: var(--c-ink); }
.site-header .btn-header{ background: var(--c-volt); color: var(--c-volt-ink); box-shadow: none; }
.site-header .btn-header:hover{ background: #d4fb52; }
.site-header .site-logo .mu-logo{ width: clamp(64px, 56px + 1.6vw, 80px); height: clamp(64px, 56px + 1.6vw, 80px); }   /* «Μ»+κύκλος */
/* Full-width nav (Volt): το logo στοιχίζεται στην ΑΡΙΣΤΕΡΗ άκρη του ΠΑΡΑΘΥΡΟΥ (pad-x), όχι σε
   κεντραρισμένο container — ώστε να ταιριάζει με το viewport-aligned giant wordmark (handoff). */
.site-header .container{ max-width: none; }
/* Σκελετοί (χωρίς hero): header ορατό εξ αρχής + padding ώστε το περιεχόμενο να μη μπαίνει από κάτω. */
body:not([data-home="true"]){ padding-top: 6.75rem; }
body:not([data-home="true"]) .site-header{ background: rgba(237,238,241,.6); backdrop-filter: blur(10px) saturate(140%); -webkit-backdrop-filter: blur(10px) saturate(140%); border-bottom-color: rgba(21,23,29,.08); box-shadow: 0 6px 22px -14px rgba(21,23,29,.14); }

/* Tablet/mobile perf: κάτω από 1024px (όλο το tablet — 19/8) το fixed header ΧΩΡΙΣ backdrop-blur
   (ακριβό ανά scroll frame σε αδύναμα tablets) — αντ' αυτού πιο αδιαφανές solid bg ώστε να
   παραμένει αναγνώσιμο. */
@media (max-width: 1023.98px){
  .site-header.is-nav-solid,
  body:not([data-home="true"]) .site-header{
    backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(237,238,241,.94);
  }
}

/* ---------- HERO full-bleed (viewport) ----------
   v6: pinned scrollytelling — το βίντεο κάνει zoom-out & στο τέλος ανεβαίνει/φεύγει (motion.js initHeroTravel).
   Το bg = off-white ώστε η αποκάλυψη στο τέλος (όταν ανεβαίνει το βίντεο) να ενώνεται με τις Υπηρεσίες. */
/* ΣΤΑΘΕΡΟ HERO (απόφαση Αντώνη 15/8): το βίντεο ΔΕΝ φεύγει και ΔΕΝ κουνιέται — μένει κολλημένο
   στην κορυφή και το επόμενο μπλοκ ανεβαίνει και το ΚΑΛΥΠΤΕΙ. Γι' αυτό sticky και όχι pin:
   με sticky η σελίδα συνεχίζει κανονικά να κυλάει (καμία αίσθηση κολλήματος στην αφή), ενώ με
   pin το scroll «σταματούσε». Επιβεβαιώθηκε ότι κανένας πρόγονος (html/body/main) δεν έχει
   overflow — αλλιώς το sticky θα ήταν άκυρο. */
.vhero{ position: sticky; top: 0; z-index: 0; height: 100svh; min-height: 34rem; overflow: clip; background: var(--c-bg); }
.vhero__media{ position: absolute; inset: 0; z-index: 0; }
/* φύλλο βάθους: 110% ύψος (5% τζόγος πάνω-κάτω) ώστε το parallax drift να μην ξεσκεπάζει ποτέ κενό */
.vhero__medial{ position: absolute; left: 0; right: 0; top: -5%; height: 110%; will-change: transform; }
.vhero__media video, .vhero__media img{ width: 100%; height: 100%; object-fit: cover; }
/* ΠΡΟΣΩΡΙΝΟ hero video — overlay πάνω από το gradient placeholder· ελαφρύ σκούρο φίλτρο (brightness)
   για αναγνωσιμότητα λογοτύπου/ατάκας (πέρα από το scrim). Ρύθμισε το brightness για πιο σκούρο/φωτεινό. */
.vhero__video{ position: absolute; inset: 0; z-index: 1; filter: brightness(.8) saturate(1.03); }
/* placeholder μέχρι να μπει πραγματικό video */
.vhero__ph{ position: absolute; inset: 0; background:
   radial-gradient(120% 90% at 65% 25%, #1b6f63 0%, #0d3b34 45%, #06110E 80%),
   linear-gradient(180deg, rgba(0,0,0,.15), rgba(0,0,0,.55)); }
.vhero__ph-label{ position: absolute; top: 42%; left: 50%; transform: translate(-50%,-50%); text-align: center;
   font-family: var(--f-body); font-size: var(--fs-small); font-weight: 600; letter-spacing: .04em; text-transform: uppercase;
   color: rgba(255,255,255,.6); border: 1px dashed rgba(255,255,255,.3); border-radius: var(--radius-sm); padding: .9rem 1.2rem; }
/* σκίαση για αναγνωσιμότητα — v4: ΕΛΑΦΡΥΤΕΡΗ (αίτημα 3/7: «να μην είναι πάρα πολύ σκοτεινό») */
.vhero__scrim{ position: absolute; inset: 0; z-index: 1; pointer-events: none;
   background: linear-gradient(180deg, rgba(4,10,8,.38) 0%, rgba(4,10,8,.03) 24%, rgba(4,10,8,.06) 58%, rgba(4,10,8,.55) 100%); }

/* Tagline block — δεξιά, εμφανίζεται καθώς μικραίνει το wordmark (scrubbed από motion.js· #heroTagline = το wrapper) */
.vhero__copy{ position: absolute; z-index: 2; right: var(--pad-x); bottom: clamp(7rem, 6rem + 8vh, 12rem);
   left: auto; max-width: min(50vw, 40rem); text-align: right; }
.vhero__tagline{ margin: 0; font-family: var(--f-hero); font-weight: var(--fw-hero); line-height: 1.14; letter-spacing: -0.02em;
   font-size: clamp(1.7rem, 1rem + 3.8vw, 3.9rem); color: #fff; text-shadow: 0 2px 24px rgba(0,0,0,.35); letter-spacing: var(--ls-display); }
/* «μάθηση» / «γνώση»: από λαχανί (74°) σε ΚΥΡΙΟ (178°) — 104° μετακίνηση, η μεγαλύτερη
   αλλαγή της παλέτας. Κάθεται σε βίντεο, δηλαδή σκούρο έδαφος: 9,27:1. */
.vhero__tagline em{ font-style: normal; font-weight: 400; color: var(--c-accent); }
/* (22/8) ΤΡΕΙΣ ΣΤΑΘΕΡΕΣ ΓΡΑΜΜΕΣ — ίδιες παντού. ΑΡΙΣΤΕΡΗ στοίχιση ΜΕΣΑ στο μπλοκ ακόμη κι όταν
   το μπλοκ κάθεται δεξιά: μόνο έτσι μπορούν τα δύο «μάθηση» να πέσουν το ένα κάτω από το άλλο
   (με δεξιά στοίχιση κάθε γραμμή θα τελείωνε στο ίδιο σημείο και οι λέξεις δεν θα ευθυγραμμίζονταν).
   nowrap: η γραμμή ΔΕΝ σπάει ποτέ — προσαρμόζεται το μέγεθος, όχι η δομή. */
.vhero__tagline .vh-line{ display: block; white-space: nowrap; text-align: left; }
/* ΤΟ ΤΑΒΑΝΙ ΠΛΑΤΟΥΣ ΦΕΥΓΕΙ: με nowrap, το max-width δεν αναδιπλώνει — απλώς ΞΕΧΕΙΛΙΖΕΙ. Μετρήθηκε
   σε 1440: η γραμμή «Η καθημερινή μελέτη» έβγαινε έξω από την οθόνη δεξιά. Το μπλοκ μαζεύεται
   στο πλάτος της μακρύτερης γραμμής, και το ΜΕΓΕΘΟΣ το προσαρμόζει το JS (χώρεσεΑτάκα). */
/* ΤΟ ΠΛΑΤΟΣ ΤΟΥ ΜΠΛΟΚ ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΕΞΑΡΤΑΤΑΙ ΑΠΟ ΤΗ ΘΕΣΗ ΤΟΥ (22/8 — αιτία σφάλματος):
   με shrink-to-fit και δεξιά αγκύρωση, κάθε φορά που το JS μετακινούσε το μπλοκ δεξιά, ΜΙΚΡΑΙΝΕ
   ο διαθέσιμος χώρος και άλλαζε το πλάτος του — ο βρόχος κυνηγούσε την ουρά του και σταματούσε
   στα 34px αντί για 10. Με width: max-content στην ατάκα, το πλάτος ορίζεται ΜΟΝΟ από το κείμενο
   και η θέση γίνεται ανεξάρτητη μεταβλητή. */
.vhero__tagline{ width: max-content; }
.vhero__copy{ display: inline-block; max-width: none; }
/* Ο υπότιτλος ΔΕΝ επεκτείνει το μπλοκ: δένεται στο πλάτος της ατάκας και μοιράζεται την ίδια
   αριστερή ακμή με τις τρεις γραμμές. */
/* 30px αέρας ανάμεσα στο «γνώση» και τον υπότιτλο (22/8, εντολή Αντώνη) — ήταν 13,6px */
.vhero__subtitle{ text-align: left; max-width: 100%; }
.vhero__subtitle .vs-line{ display: block; }
/* Η ΠΡΩΤΗ ΓΡΑΜΜΗ ΣΕ ΜΙΑ ΣΕΙΡΑ — ΑΛΛΑ ΟΧΙ ΣΕ ΚΙΝΗΤΟ (22/8, μετρημένο): σε 390px, για να χωρέσει
   ολόκληρη («…Δημοτικού και Γυμνασίου.», 64 χαρακτήρες) χρειάζεται 11px γραμματοσειρά — κάτω από
   το αναγνώσιμο. Από 700px και πάνω υπάρχει χώρος και μένει μία σειρά, όπως ζητήθηκε. */
@media (min-width: 700px){ .vhero__subtitle .vs-nowrap{ white-space: nowrap; } }
/* Υπότιτλος — μικρότερος, κάτω από την ατάκα (κείμενο κλειδωμένο από chat) */
.vhero__subtitle{ margin: 30px 0 0; font-family: var(--f-body); font-weight: 400;
   font-size: clamp(.9rem, .78rem + .6vw, 1.2rem); line-height: 1.42; color: rgba(255,255,255,.9);
   text-shadow: 0 1px 12px rgba(0,0,0,.4); }
@media (max-width: 699.98px){ .vhero__copy{ left: var(--pad-x); right: var(--pad-x); max-width: none; text-align: left; bottom: 9rem; } }

/* Giant wordmark — fixed, κάτω-αριστερά· ταξιδεύει στο nav με scroll (motion.js).
   v9: ΑΡΙΣΤΕΡΗ ΣΤΟΙΧΙΣΗ στο ΠΑΡΑΘΥΡΟ (left = pad-x, όχι container gutter) — αυτό ήταν το ζητούμενο.
   Το ΜΕΓΕΘΟΣ επέστρεψε στο προηγούμενο («ωραίο») min(82vw, 44rem) — το 88vw ήταν υπερβολικό & χάλαγε
   το μίκρυναμα. Μικραίνει/μεγαλώνει με το πλάτος όπως πριν, απλά στοιχισμένο στο παράθυρο. */
/* v10 (17/7): ΑΝΑΛΟΓΙΚΟ πλάτος (48vw) ώστε σε κάθε μέγεθος παραθύρου να πιάνει το ίδιο ποσοστό —
   πριν κλείδωνε στα 48.4rem πολύ νωρίς και σε maximized φαινόταν ΜΙΚΡΟΤΕΡΟ αναλογικά.
   Κλειδώνει πλέον ΜΟΝΟ σε πολύ φαρδιές οθόνες (>~2060px → 62rem cap). */
.vhero__wordmark{ position: fixed; z-index: 60; left: var(--pad-x); bottom: clamp(1.5rem, 1rem + 3vh, 3rem);
   width: clamp(18rem, 48vw, 62rem); will-change: transform; pointer-events: none; }
.vhero__wordmark .wm-full{ position: relative; z-index: 2; width: 100%; height: auto; display: block; filter: brightness(0) invert(1); }
.vhero__wordmark .wm-mu{ position: absolute; inset: 0; z-index: 3; width: 100%; height: auto; display: block; filter: brightness(0) invert(1); clip-path: inset(0% 61% 0% 23.4%); }
.vhero__wordmark .wm-disc{ position: absolute; z-index: 1; left: 31.2%; top: 35.7%; height: 112%; aspect-ratio: 1 / 1;
  border-radius: 50%; background: rgba(23, 25, 30, .95);
  -webkit-backdrop-filter: blur(12px) saturate(1.15); backdrop-filter: blur(12px) saturate(1.15);
  box-shadow: 0 6px 16px rgba(0, 0, 0, .18); transform: translate(-50%, -50%); }
/* όταν έχει «προσγειωθεί» πάνω στο φωτεινό nav (motion.js τσιμπάει .is-dark) → μαύρο ξανά */
.vhero__wordmark.is-dark img{ filter: none; }

/* (21/8) Η δοκιμή «μαύρο λογότυπο σε όλο το hero» ΑΠΟΣΥΡΘΗΚΕ — μετρήθηκε: σε 8/10 πλάνα του
   κάθετου βίντεο το μαύρο έσβηνε (αντίθεση 0,9–1,7:1 στη ζώνη του λογοτύπου). Απόφαση Αντώνη:
   ΛΕΥΚΟ στην αρχή, και γίνεται ΜΑΥΡΟ μόλις μείνει μόνο του (φύγει η ατάκα) — το κάνει το
   motion.js με την κλάση .is-dark (βλ. initHeroTravel). Η λευκή εκδοχή + σκίαση ισχύουν ξανά. */
/* Χωρίς JS (fallback): το giant wordmark είναι motion-only (travel) → κρύψ' το· φαίνεται
   το κανονικό μικρό nav logo, ώστε το brand να υπάρχει πάντα στη μπάρα. */
html:not(.js) .vhero__wordmark, html:not(.js) .wm-darklayer{ display: none; }
html:not(.js) body[data-home="true"] .site-header .site-logo{ opacity: 1; }

/* ---------- METHOD mini-FAQ (17/7): απορίες της μεθόδου, κάτω από τα 4 βήματα ---------- */
.method-faq{ max-width: 46rem; margin: clamp(2.5rem, 2rem + 2vw, 4.5rem) auto 0; }
.method-faq__head{ font-family: var(--f-display); font-weight: var(--fw-display); font-size: var(--fs-h3);
   color: var(--c-ink-soft); margin-bottom: .75rem; }

/* ---------- CONFETTI playground (Lusion, 17/7): σχήματα πίσω από τη φόρμα ----------
   Layer z-0 πίσω από το container (z-1)· τα σχήματα γεννιούνται από το motion.js (initConfetti).
   Διακοσμητικό: χωρίς JS δεν υπάρχει καθόλου — καμία επίπτωση σε περιεχόμενο/προσβασιμότητα. */
.section--confetti{ position: relative; overflow: clip; }
.section--confetti .container{ position: relative; z-index: 1; }
.confetti{ position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.confetti i{ position: absolute; display: block; will-change: transform; }
.confetti svg{ display: block; width: 100%; height: 100%; }

/* ---------- SHOWREEL (Lusion, 17/7 — ΞΕΧΩΡΙΣΤΟ section): βίντεο μικρό→fullscreen ----------
   Pinned scrub (motion.js initShowreel): το frame μεγαλώνει από καρτάκι σε πλήρη οθόνη, η μπλε
   γραμμή «γυρίζει» γύρω του. Placeholder = ΜΠΛΕ (lusion) — όχι το πράσινο του hero.
   Χωρίς JS / reduced-motion: στατικό κεντραρισμένο καρτάκι + πλήρης γραμμή (τίποτα κρυφό). */
/* overflow-y: visible ώστε η ΠΡΟΕΚΤΑΣΗ της μπλε γραμμής να μπορεί να φανεί πάνω από το section.
   Το οριζόντιο κλιπ (ο λόγος που υπήρχε το overflow) μένει αυτούσιο. Έγκυρος συνδυασμός.
   Σημ.: η προέκταση φαίνεται ΜΟΝΟ πριν πιάσει το καρφίτσωμα — μόλις καρφιτσωθεί, η κορυφή του
   section είναι στην κορυφή της οθόνης κι ό,τι είναι πιο πάνω βρίσκεται εκτός οθόνης. */
/* z-index: 2 στο ΙΔΙΟ ΤΟ SECTION — Η ΡΙΖΑ ΤΟΥ ΣΦΑΛΜΑΤΟΣ (βρέθηκε 15/8 με απομόνωση).
   Αφού ενεργοποιηθεί ΜΙΑ φορά το καρφίτσωμα, το GSAP αφήνει στο section
   transform: matrix(1,0,0,1,0,0). ΟΠΟΙΟΔΗΠΟΤΕ transform — ακόμη και ταυτοτικό — δημιουργεί
   στοίβα σχεδίασης (stacking context). Έτσι το z-index της γραμμής εγκλωβιζόταν ΜΕΣΑ στο
   section, και το section (z-index auto = 0) ζωγραφιζόταν ΚΑΤΩ από την .proglist-sec που έχει
   z-index 1 και αδιαφανές φόντο. Αποτέλεσμα: το κομμάτι της γραμμής που περνά στα προγράμματα
   κρυβόταν — ΜΟΝΟ αφού είχες περάσει μία φορά από το καρφίτσωμα, δηλαδή μόνο στο ανέβασμα.
   Αυτό εξηγεί γιατί κάθε μέτρηση (dasharray, γεωμετρία, θέση) έβγαινε ΣΩΣΤΗ ενώ τα pixel
   έλειπαν, και γιατί στη γυμνή σελίδα χωρίς άλλο section δεν αναπαραγόταν ποτέ.
   Δεν σκεπάζει τα προγράμματα: τα δύο sections δεν επικαλύπτονται ποτέ στη ροή. */
.showreel{ position: relative; z-index: 2; height: 100svh; min-height: 30rem;
   overflow-x: clip; overflow-y: visible;
   background: var(--c-bg); display: grid; place-items: center; }
/* z-σειρά (lusion): γράμματα 0 (πίσω) → γραμμή 1 (ΠΙΣΩ από το βίντεο) → βίντεο 2 (μπροστά) */
/* overflow: visible στο ΙΔΙΟ το <svg> (15/8 — μετρημένη αιτία):
   ένα <svg> κόβει ΕΞ ΟΡΙΣΜΟΥ ό,τι ξεφεύγει από το πλαίσιό του. Μετρήθηκε ότι η αρχή της
   διαδρομής βρισκόταν 72px ΠΑΝΩ από το κουτί του svg — άρα κοβόταν. Οι μετρήσεις γεωμετρίας
   έβγαιναν σωστές (το path ΥΠΑΡΧΕΙ εκεί), αλλά τα pixel δεν ζωγραφίζονταν. */
/* z-index 2 και ΟΧΙ 1 (15/8 — Η ΑΙΤΙΑ ΤΟΥ ΣΦΑΛΜΑΤΟΣ, βρέθηκε με απομόνωση):
   η .proglist-sec έχει z-index 1 και ΑΔΙΑΦΑΝΟ φόντο (το χρειάζεται για να σκεπάζει το sticky
   hero). Η γραμμή είχε ΚΑΙ ΑΥΤΗ z-index 1, οπότε το κομμάτι της που περνά μέσα στα προγράμματα
   ζωγραφιζόταν ΠΙΣΩ από εκείνο το φόντο και ήταν αόρατο. Επιβεβαιώθηκε πειραματικά: με
   background: transparent στη .proglist-sec η γραμμή εμφανίστηκε ΟΛΟΚΛΗΡΗ, χωρίς καμία άλλη
   αλλαγή. Γι' αυτό όλες οι μετρήσεις (dasharray, γεωμετρία, θέση) έβγαιναν ΣΩΣΤΕΣ ενώ τα pixel
   έλειπαν — το σχέδιο υπήρχε, απλώς ήταν από κάτω.
   Το 2 δεν το φέρνει μπροστά από το βίντεο: ο καμβάς και το κάδρο έχουν επίσης 2 και έρχονται
   ΜΕΤΑ στο DOM, άρα ζωγραφίζονται από πάνω — η γραμμή μένει πίσω τους, όπως ήταν πάντα. */
.showreel__line{ position: absolute; inset: 0; width: 100%; height: 100%; z-index: 1;
   pointer-events: none; overflow: visible; }
/* ΠΑΧΟΣ (μόνη αλλαγή που ζητήθηκε, 15/8): 30 → 22. Το attribute stroke-width="30" μένει στο
   HTML ως fallback· το CSS υπερισχύει, ώστε η τιμή να ζει σε ΕΝΑ σημείο. Ρύθμιση: ?tune=line */
.showreel__line [data-showreel-line]{ stroke-width: var(--line-w, 22); }
.showreel__canvas{ position: absolute; inset: 0; z-index: 2; pointer-events: none; }
/* Τεράστια «PLAY REEL»-style γράμματα — λευκά, πίσω από το βίντεο */
.showreel__word{ position: absolute; z-index: 0; top: 50%; transform: translateY(-50%);
   font-family: var(--f-display-ui); font-weight: 700; text-transform: uppercase; color: #fff;
   font-size: clamp(3.5rem, 2rem + 12vw, 15rem); line-height: .85; letter-spacing: -0.01em;
   pointer-events: none; user-select: none; }
.showreel__word--l{ left: clamp(1rem, 3vw, 4rem); }
.showreel__word--r{ right: clamp(1rem, 3vw, 4rem); }
/* Κείμενο πάνω-δεξιά (lusion «We combine design...») — z-1 (πάνω από γράμματα, ΠΙΣΩ από βίντεο)·
   φεύγει προς τα πάνω μαζί με τη γραμμή όταν ξεδιπλώνει το βίντεο (motion.js). */
.showreel__copy{ position: absolute; z-index: 1; top: clamp(7rem, 17vh, 11rem); right: clamp(1.25rem, 4vw, 4.5rem);  /* 18/7: πιο χαμηλά (αίτημα Αντώνη) */
   max-width: 26rem; margin: 0; font-family: var(--f-body); font-size: clamp(.95rem, .85rem + .35vw, 1.1rem);
   line-height: 1.55; }
@media (max-width: 699.98px){ .showreel__copy{ display: none; } }  /* κινητό: δικό του σχέδιο, χωρίς copy (19/8: το GL gate 900 καταργήθηκε — tablet+desktop το δείχνουν) */
/* Το frame = ΣΤΑΤΙΚΟ fallback (χωρίς JS / reduced-motion)· με JS το κρύβει το initShowreel
   και τη δουλειά κάνει το canvas (κυματιστό ξεδίπλωμα, φόρμουλα videoVert). */
.showreel__frame{ position: relative; z-index: 2; width: min(80vw, 70rem); aspect-ratio: 16 / 9;
   border-radius: 20px; /* lusion --global-border-radius */ overflow: clip;
   box-shadow: var(--shadow-lg); }
/* ΚΑΘΕΤΟ ΚΑΔΡΟ ΣΕ ΚΙΝΗΤΟ (Αντώνης 15/8): το 16:9 είναι σχεδιασμένο για οθόνη υπολογιστή·
   στο τηλέφωνο το βίντεο θέλει portrait. 4:5 και όχι 9:16 — αφήνει χώρο να φανεί το εφέ
   ξεδιπλώματος γύρω του και δεν γεμίζει όλη την οθόνη. */
@media (max-width: 699.98px){
  .showreel__frame{ width: 62vw; aspect-ratio: 9 / 16; }   /* 15/8: πλήρες κάθετο, όπως reel */
  .showreel__word{ font-size: clamp(3rem, 12vw, 6rem); }
}
/* Ο καμβάς WebGL ΤΡΕΧΕΙ πλέον και σε κινητό (15/8): ο Αντώνης ζήτησε το πραγματικό
   ξεδίπλωμα, όχι προσέγγιση. Χωρίς καρφίτσωμα — βλ. SHOWREEL_NOPIN στο motion.js.
   Ο παλιός κανόνας που τον έκρυβε κάτω από 700px αφαιρέθηκε. */
.showreel__frame video, .showreel__frame img{ width: 100%; height: 100%; object-fit: cover; display: block; }
/* ΑΟΡΑΤΟ ΑΛΛΑ ΖΩΝΤΑΝΟ (26/8). Οταν τρεχει ο WebGL, το καδρο δεν χρειαζεται να φαινεται —
   ομως το <video> μεσα του ΤΡΟΦΟΔΟΤΕΙ τον shader. Με display: none ο browser το βγαζει απο
   το δεντρο αποδοσης και μπορει να σταματησει την αποκωδικοποιηση: η εικονα θα παγωνε.
   Με opacity 0 μενει ενεργο. Το visibility ΔΕΝ κανει — εχει το ιδιο προβλημα. */
.showreel__frame.is-gl{ opacity: 0; pointer-events: none; }
/* Μπλε placeholder — «ανοίγει» πάνω-δεξιά, όπως το gradient της γραμμής */
.showreel__ph{ position: absolute; inset: 0; background:
   radial-gradient(120% 95% at 62% 22%, #2436E8 0%, #1A24A8 45%, #070B33 85%); }
.showreel__ph .media-placeholder-label{ position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
   text-align: center; font-family: var(--f-body); font-size: var(--fs-small); font-weight: 600;
   letter-spacing: .04em; text-transform: uppercase; color: rgba(255,255,255,.65);
   border: 1px dashed rgba(255,255,255,.3); border-radius: var(--radius-sm); padding: .9rem 1.2rem; }

/* ---------- RIBBON interlude (Lusion, 17/7 — FULL-BLEED φαρδύ): γραμμή πίσω από μεγάλη τυπογραφία ----------
   Όλο το πλάτος, στη ροή του κειμένου (όπως στο lusion)· η γραμμή (SVG, z-0) ΠΙΣΩ από τα γράμματα (z-1)·
   ζωγραφίζεται με scroll (motion.js initRibbon). Χωρίς JS / reduced-motion: γραμμή ΠΛΗΡΗΣ στατικά. */
/* 18/7: ΨΗΛΟΤΕΡΟ (120svh) ώστε η γραμμή να ζωγραφίζεται σε ΟΛΗ τη διέλευση (~2 οθόνες scroll,
   όπως lusion goal scrollToRatioFactors [1.2,2]) — τέλος στο «πάει γρήγορα / χάνεται μεσοδρομής». */
.ribbon-sec{ position: relative; overflow: clip; background: var(--c-bg); min-height: 120svh;
   display: flex; flex-direction: column; justify-content: center;
   padding: clamp(5rem, 3.5rem + 8vw, 11rem) var(--pad-x); }
.ribbon-sec__svg{ position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; }
/* Τυπογραφία στο ύφος του lusion «STEP INTO A NEW WORLD»: ΚΕΦΑΛΑΙΑ, βαριά, σφιχτά, τεράστια·
   3 γραμμές με εναλλαγή στοίχισης (αριστερά / δεξιά / αριστερά) — η γραμμή περνά από πίσω. */
.ribbon-sec__line{ position: relative; z-index: 1; font-family: var(--f-display-ui); font-weight: 800;
   text-transform: uppercase; color: var(--c-ink);
   font-size: clamp(2.6rem, .9rem + 8.4vw, 9.5rem); line-height: .98; letter-spacing: -0.03em; }
.ribbon-sec__line--mid{ text-align: right; }
.ribbon-sec__line--bottom{ text-align: left; }

/* ---------- SERVICES section v5: αμέσως μετά το hero, τεράστιος λεπτός τίτλος (Volt «Services») ---------- */
/* overflow: clip → το φύλλο βάθους (.vservices-depth) μπορεί να ξεχειλίσει χωρίς να πατήσει το επόμενο section */
.vservices-sec{ background: var(--c-bg); padding-top: clamp(1.5rem, 1rem + 2vw, 3.25rem); overflow: clip; }
.vservices-depth{ will-change: transform; }
.vservices-title{
  font-family: var(--f-display); font-weight: 300; letter-spacing: -0.03em; line-height: .95;
  font-size: clamp(3.25rem, 1.8rem + 7.5vw, 8rem); color: var(--c-ink);
  margin-bottom: clamp(1.5rem, 1rem + 2vw, 3rem); }

/* ---------- SERVICES — expanding accordion (01-04, τύπου Volt cards) ---------- */
.vservices{ display: grid; grid-template-columns: repeat(4, 1fr); gap: 2px; background: var(--c-border);
   min-height: clamp(22rem, 16rem + 22vh, 34rem); }
.vpanel{ position: relative; overflow: hidden; display: flex; flex-direction: column; justify-content: space-between;
   padding: clamp(1.25rem, 1rem + 1vw, 2rem); text-decoration: none; isolation: isolate;
   transition: flex-grow var(--dur-med) var(--ease), background-color var(--dur-med) var(--ease); }
.vservices{ grid-auto-flow: column; }
/* βάθος πράσινου ανά κάρτα (teal palette) */
.vpanel--1{ background: var(--c-teal-400); }
.vpanel--2{ background: var(--c-teal-500); }
.vpanel--3{ background: var(--c-teal-600); }
.vpanel--4{ background: var(--c-teal-700); }
/* Το περιτύλιγμα που κινείται στο parallax: παίρνει ΟΛΟ το ύψος του panel, άρα η ίδια ποσοστιαία
   μετατόπιση δίνει ΙΔΙΑ px σε όλα τα panels (οι ετικέτες μόνες τους έχουν ύψη 33-137px λόγω
   accordion → άνιση κλιμάκωση· εντοπίστηκε 10/8 στον πραγματικό browser). Το φόντο ΔΕΝ κινείται. */
.vpanel__inner{ display: flex; flex-direction: column; justify-content: space-between;
   flex: 1 1 auto; width: 100%; will-change: transform; }
.vpanel__bg{ position: absolute; inset: 0; z-index: -1; opacity: 0; transition: opacity var(--dur-med) var(--ease); }
.vpanel__bg::after{ content:''; position:absolute; inset:0; background: linear-gradient(180deg, rgba(6,17,14,.15), rgba(6,17,14,.55)); }
.vpanel__bg .media-placeholder-label{ position: absolute; inset: auto auto 50% 50%; transform: translate(-50%,50%); }
.vpanel.is-active .vpanel__bg{ opacity: 1; }
.vpanel__num{ font-family: var(--f-display); font-weight: var(--fw-display-strong); font-size: var(--fs-h3); color: rgba(255,255,255,.7); }
.vpanel__label{ font-family: var(--f-display); font-weight: var(--fw-display-strong); font-size: clamp(1.15rem, .9rem + 1vw, 1.85rem); color: #fff;
   display: flex; align-items: center; gap: .6rem; letter-spacing: -0.01em; }
.vpanel__label svg{ flex: none; opacity: .8; transition: transform var(--dur-fast) var(--ease); }
.vpanel:hover .vpanel__label svg{ transform: translate(3px,-3px); }
/* Τα @media του accordion (860/859) ΑΦΑΙΡΕΘΗΚΑΝ 19/8 — η .vservices δεν υπάρχει σε
   καμία σελίδα (επαληθευμένα νεκρός κώδικας)· έμειναν μόνο οι βασικοί κανόνες. */

/* ---------- FORM + MAP (Volt-style footer block, δίπλα-δίπλα) ---------- */
.vcontact{ display: grid; grid-template-columns: 1fr; gap: clamp(1.5rem,1rem+2vw,3rem); align-items: stretch; }
@media (min-width: 700px){ .vcontact{ grid-template-columns: 1.05fr .95fr; } }
/* v5: διαδραστικός SVG χάρτης (zoom in/out στα παραρτήματα — motion.js initBranchMap) */
.vmap{ display: flex; flex-direction: column; gap: 1rem; }
.vmap__stage{ position: relative; border-radius: var(--radius-lg); overflow: hidden; border: 1px solid var(--c-border); background: var(--c-teal-50); }
.vmap__svg{ display: block; width: 100%; height: auto; }
.vmap__sea{ fill: var(--c-teal-50); }
.vmap__land{ fill: var(--c-surface); stroke: var(--c-teal-400); stroke-width: 2; }
.vmap__road{ fill: none; stroke: var(--c-border); stroke-width: 2.5; }
.vmap__pin{ cursor: pointer; outline: none; }
.vmap__pin-halo{ fill: var(--c-volt); opacity: 0; transition: opacity var(--dur-med) var(--ease); }
.vmap__pin-dot{ fill: var(--c-ink); stroke: var(--c-bg); stroke-width: 2.5; }
.vmap__pin-label{ font-family: var(--f-body); font-size: 17px; font-weight: 500; fill: var(--c-ink-soft); text-anchor: middle; }
.vmap__pin.is-active .vmap__pin-halo, .vmap__pin:hover .vmap__pin-halo, .vmap__pin:focus-visible .vmap__pin-halo{ opacity: .55; }
.vmap__pin:focus-visible .vmap__pin-dot{ stroke: var(--c-focus); }
.vmap__card{ position: absolute; top: .9rem; left: .9rem; background: var(--c-surface); border: 1px solid var(--c-border);
  border-radius: var(--radius-sm); padding: .7rem .95rem; box-shadow: var(--shadow-md);
  display: flex; flex-direction: column; gap: .1rem; pointer-events: none; }
.vmap__card strong{ font-family: var(--f-display); font-weight: var(--fw-display-strong); font-size: var(--fs-small); }
.vmap__card span{ font-size: .78rem; color: var(--c-ink-mute); }
.vmap__chips{ display: grid; grid-template-columns: repeat(3, 1fr); gap: .6rem; }
.vmap__chip{ text-align: left; border: 1px solid var(--c-border); border-radius: var(--radius-sm); background: var(--c-surface);
  padding: .7rem .9rem; display: flex; flex-direction: column; gap: .15rem; cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease); }
.vmap__chip:hover{ border-color: var(--c-teal-400); }
.vmap__chip.is-active{ border-color: var(--c-ink); background: var(--c-teal-50); }
.vmap__chip strong{ font-family: var(--f-display); font-weight: var(--fw-display-strong); font-size: var(--fs-small); color: var(--c-ink); }
.vmap__chip span{ font-size: .75rem; color: var(--c-ink-mute); }

/* ---------- SPIRAL page transition (DrawSVG path-draw, χωρίς Barba· ex-shutter) ----------
   Το path «ζωγραφίζεται» κατά μήκος της οθόνης, παχαίνει, και ένα συμπαγές fill πλημμυρίζει
   την οθόνη με κίτρινο (var(--c-volt)) — προσαρμογή του camps wipe. Markup από motion.js. */
.transition{ position: fixed; inset: 0; z-index: 200; pointer-events: none; overflow: hidden; opacity: 0; }
/* ═══ ΤΟ ΧΡΩΜΑ ΤΗΣ ΜΕΤΑΒΑΣΗΣ — ΔΥΟ ΕΚΔΟΧΕΣ (26/8) ═══
   Ο Αντώνης ζήτησε να δει το εφέ «στο κυρίαρχο χρώμα ή στο κίτρινο».
   ΔΟΚΙΜΗ ΧΩΡΙΣ ΚΩΔΙΚΑ: βάλε ?fx=teal ή ?fx=volt στη διεύθυνση· μένει ενεργό
   στις επόμενες σελίδες (sessionStorage), όπως και ο επεξεργαστής.
   ΠΡΟΕΠΙΛΟΓΗ: κίτρινο — είναι ήδη το χρώμα του shutter από παλιά. */
/* ΑΠΟΦΑΣΗ ΑΝΤΩΝΗ 26/8: teal, όχι κίτρινο. Το κίτρινο μένει ως εναλλακτική με ?fx=volt.
   Η μετάβαση παίζει σε ΚΑΘΕ αλλαγή σελίδας — αρχική→υποσελίδα ΚΑΙ υποσελίδα→αρχική. */
:root{ --c-transition: var(--c-accent); }
html[data-fx="volt"]{ --c-transition: var(--c-volt); }
.transition__fill{ position: fixed; inset: 0; background: var(--c-transition); box-shadow: 0 0 0 100vmax var(--c-transition); opacity: 0; pointer-events: none; will-change: opacity; }
.transition__shape{ color: var(--c-transition); position: absolute; inset: 0; }
.transition__svg{ width: 130%; height: 130%; position: absolute; top: -15%; left: -15%; display: block; }
.transition__path{ fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; }
html:not(.js) .transition{ display: none; }

/* ---------- prefers-reduced-motion (VOLT layer) ---------- */
@media (prefers-reduced-motion: reduce){
  .vhero__wordmark, .wm-darklayer{ display: none !important; }
  .vhero__tagline{ opacity: 1 !important; }
  .site-header{ transform: none !important; }               /* nav ΠΑΝΤΑ ορατό (το JS δεν τρέχει) */
  body[data-home="true"] .site-header .site-logo{ opacity: 1 !important; }
  .transition{ display: none !important; }
  .vpanel__bg{ opacity: 1 !important; }
}

/* ════════════════════════════════════════════════════════════════════════════
   VOLT LAYER v4 (3/7/2026) — grain texture · Noomo φόρμα · zoom-through sequence ·
   μαύρο footer. Χρώματα ΜΟΝΟ από tokens.
   ════════════════════════════════════════════════════════════════════════════ */

/* ---------- Grain / noise texture (Volt-style «ζωντανή» υφή) ----------
   SVG feTurbulence ως data-URI (self-contained, CSP-safe img-src data:). Το «τρεμόπαιγμα»
   γίνεται με steps() εναλλαγή θέσης — φθηνό (καμία repaint του turbulence). Desktop μόνο. */
.grain{ position: fixed; inset: -100px; z-index: 90; pointer-events: none; opacity: .07;
   background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
   background-size: 240px 240px; }
@media (min-width: 1024px){ html.js .grain{ animation: grainShift 900ms steps(3) infinite; } }
@keyframes grainShift{
  0%{ transform: translate(0,0); }
  33%{ transform: translate(-40px,30px); }
  66%{ transform: translate(30px,-50px); }
  100%{ transform: translate(0,0); }
}
@media (max-width: 1023.98px){ .grain{ opacity: .05; } } /* πιο διακριτικό σε mobile, στατικό */
@media (prefers-reduced-motion: reduce){ .grain{ animation: none !important; } } /* pure-CSS animation → θέλει δικό του guard */

/* ---------- Φόρμα Noomo-style: underline πεδία, uppercase labels, pills, κυκλικό SEND ---------- */
.nform{ display: flex; flex-direction: column; gap: clamp(2rem, 1.6rem + 1.6vw, 3.25rem); }
.nfield{ display: flex; flex-direction: column; gap: .35rem; }
.nfield > label, .nfield > .nlabel{
  font-family: var(--f-body); font-weight: 500; font-size: var(--fs-small);
  letter-spacing: .08em; text-transform: uppercase; color: var(--c-ink-soft); }
.nfield input, .nfield select{
  border: 0; border-bottom: 1px solid var(--c-ink); border-radius: 0; background: transparent;
  padding: .55rem 0 .8rem; font-size: clamp(1.05rem, 1rem + .3vw, 1.25rem); font-family: var(--f-body); font-weight: 300;
  color: var(--c-ink); min-height: 44px; transition: border-color var(--dur-fast) var(--ease); }
.nfield input:focus, .nfield select:focus{ outline: none; border-bottom-color: var(--c-teal-500); }
.nfield.is-invalid input, .nfield.is-invalid select{ border-bottom-color: var(--c-ink-mute); border-bottom-style: dashed; }
.nfield select{ appearance: none; -webkit-appearance: none; cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' fill='none'%3E%3Cpath d='M1 1l6 6 6-6' stroke='%2310201D' stroke-width='1.5'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right .2rem center; }
/* pills (παράρτημα) */
.npills{ display: flex; flex-wrap: wrap; gap: .6rem; padding-top: .35rem; }
.npill{ position: relative; }
.npill input{ position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.npill span{
  display: inline-flex; align-items: center; justify-content: center; min-height: 44px;
  padding: .55rem 1.35rem; border: 1.5px solid var(--c-ink); border-radius: 999px;
  font-size: var(--fs-small); font-weight: 500; color: var(--c-ink); cursor: pointer;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
.npill input:checked + span{ background: var(--c-ink); color: var(--c-bg); }
.npill input:focus-visible + span{ outline: 2px solid var(--c-focus); outline-offset: 3px; }
.npill:hover span{ background: var(--c-teal-50); }
.npill input:checked:hover + span{ background: var(--c-ink); }
/* κυκλικό SEND */
.nsubmit-row{ display: flex; align-items: center; justify-content: space-between; gap: 1.5rem; flex-wrap: wrap; }
.nsend{
  display: inline-flex; align-items: center; justify-content: center; gap: .45rem;
  width: 5.5rem; height: 5.5rem;   /* v5: μικρότερο, όπως το Noomo SEND — όχι «κιλό» */
  border-radius: 50%; background: var(--c-ink); color: var(--c-bg);
  font-family: var(--f-body); font-weight: 500; font-size: .78rem; letter-spacing: .06em; text-transform: uppercase;
  transition: background var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease); cursor: pointer; }
.nsend:hover{ background: var(--c-teal-700); }
.nsend svg{ transition: transform var(--dur-fast) var(--ease); }
.nsend:hover svg{ transform: translateX(3px); }

/* ---------- ZOOM-THROUGH sequence (pinned): μέσα από το λογότυπο → lime ατάκα → λωρίδες ---------- */
.vzoom{ position: relative; height: 100svh; overflow: clip; background: var(--c-bg); }
.vzoom__logo-wrap{ position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; z-index: 1; }
/* v5: το «βιβλίο» (Μ) ως inline SVG — vector, μηδέν pixel σε οποιοδήποτε zoom.
   Origin = το άνοιγμα των σελίδων (x 240/480, y 252/360 → 50% / 70%). */
.vzoom__book{ width: min(62vw, 32rem); height: auto; color: var(--c-ink); will-change: transform;
  transform-origin: 50% 70%; }
.vzoom__blackout{ position: absolute; inset: 0; z-index: 2; background: var(--c-ink); opacity: 0; pointer-events: none; }
.vzoom__statement{
  position: absolute; inset: 0; z-index: 3; display: flex; align-items: center; justify-content: center;
  background: var(--c-volt); opacity: 0; pointer-events: none; padding: var(--pad-x); }
.vzoom__statement p{
  max-width: 22ch; text-align: center; font-family: var(--f-hero); font-weight: 300;
  font-size: clamp(1.9rem, 1.2rem + 3.4vw, 4rem); line-height: 1.18; letter-spacing: -0.01em; color: var(--c-volt-ink); }
.vzoom__statement em{ font-style: normal; font-weight: 500; }
.vzoom__stripes{ position: absolute; inset: 0; z-index: 4; display: flex; flex-direction: column; pointer-events: none; }
.vzoom__stripe{ flex: 1 1 0; background: var(--c-ink); transform: scaleY(0); transform-origin: center; will-change: transform; }
/* ΚΙΝΗΤΟ <700 (15/8, βλ. handoff/audit-motion.md): καμία καρφίτσωση — μετρήθηκαν 2.111px
   καρφιτσωμένου scroll στα 375px. Ίδια ακριβώς στατική κατάσταση με το no-JS fallback από κάτω:
   φαίνεται μόνο η lime ατάκα, τίποτα δεν κρύβεται. Το motion.js δεν καλεί καν το initZoomSequence. */
@media (max-width: 699.98px){
  .vzoom{ height: auto; }
  .vzoom__logo-wrap, .vzoom__blackout, .vzoom__stripes{ display: none; }
  .vzoom__statement{ position: static; opacity: 1; pointer-events: auto; padding-block: var(--sp-section); }
}

/* Χωρίς JS / reduced-motion: η sequence δεν τρέχει — δείξε ΜΟΝΟ τη στατική lime ατάκα (όχι κρυφό περιεχόμενο) */
html:not(.js) .vzoom{ height: auto; }
html:not(.js) .vzoom__logo-wrap, html:not(.js) .vzoom__blackout, html:not(.js) .vzoom__stripes{ display: none; }
html:not(.js) .vzoom__statement{ position: static; opacity: 1; pointer-events: auto; padding-block: var(--sp-section); }
@media (prefers-reduced-motion: reduce){
  .vzoom{ height: auto !important; }
  .vzoom__logo-wrap, .vzoom__blackout, .vzoom__stripes{ display: none !important; }
  .vzoom__statement{ position: static !important; opacity: 1 !important; pointer-events: auto !important; padding-block: var(--sp-section); }
}

/* ---------- FOOTER v5 — μαύρο· wordmark ΜΙΚΡΟ πάνω-αριστερά, στήλες δεξιά του, social icons ---------- */
.site-footer{ background: var(--c-ink); color: var(--c-bg); border-top: 0; padding-block: clamp(2.5rem, 2rem + 2vw, 4.5rem) 1.5rem; }
/* ΤΟ FOOTER ΠΙΑΝΕΙ ΟΛΟ ΤΟ ΥΨΟΣ ΤΟΥ ΠΑΡΑΘΥΡΟΥ (22/8, εντολή Αντώνη). Ισχύει σε κινητό, tablet
   και desktop, όποιο κι αν είναι το ύψος της συσκευής — γι' αυτό svh και όχι σταθερός αριθμός:
   το 100svh είναι το «μικρό» ύψος του κινητού (με ορατή τη μπάρα του browser), οπότε το footer
   δεν πηδάει όταν εκείνη κρύβεται. min-height, όχι height: αν το περιεχόμενο χρειαστεί
   παραπάνω (στενή οθόνη, μεγάλη γραμματοσειρά), το footer μεγαλώνει αντί να κοπεί.
   Το περιεχόμενο κεντράρεται κάθετα μέσα στο κενό που περισσεύει. */
.site-footer{ min-height: 100svh; display: flex; flex-direction: column; justify-content: center; }
.footer-grid{ display: grid; grid-template-columns: 1fr; gap: 2.5rem; align-items: start; }
/* 4 στήλες από τα 700 (ίδια διάταξη, συμπιεσμένη — 19/8): μετρημένο στα 700 δίνει στήλες
   289/108/95/101 με κανένα κομμένο κείμενο. Στο desktop ≥1024 οι παλιές τιμές, αμετάβλητες. */
@media (min-width: 700px){ .footer-grid{ grid-template-columns: minmax(140px, 300px) 1.2fr 1fr .6fr; gap: 1rem; } }
@media (min-width: 1024px){ .footer-grid{ grid-template-columns: minmax(200px, 300px) 1.2fr 1fr .6fr; gap: clamp(2rem, 1.5rem + 2vw, 4rem); } }
.footer-wordmark{ display: block; }
.footer-wordmark img{ width: 100%; height: auto; filter: brightness(0) invert(1); display: block; }

/* ═══ ΑΝΑΔΙΑΤΑΞΗ FOOTER (26/8, εντολή Αντώνη) ═══
   «Το ekΜάθησις στο footer το θέλω πολύ μεγαλύτερο και από κάτω την ατάκα.»
   ΠΡΙΝ: το λογότυπο ήταν μία από τέσσερις στήλες, κλειδωμένο στα 280px — δηλαδή έμοιαζε
   με ετικέτα, όχι με υπογραφή. ΤΩΡΑ πιάνει ΟΛΟ το πλάτος σαν ταμπέλα, η ατάκα κάθεται
   από κάτω του, και οι τρεις στήλες συνδέσμων πάνε σε δική τους σειρά.
   ΧΩΡΙΣ ΑΛΛΑΓΗ ΣΤΟ HTML: το ίδιο πλέγμα, απλώς το λογότυπο και η ατάκα πιάνουν όλες τις
   στήλες (grid-column: 1 / -1) και οι υπόλοιπες μοιράζονται τη σειρά από κάτω. */
@media (min-width: 700px){
  /* ═══ ΙΣΟΜΕΡΕΣ FOOTER (26/8, δεύτερο πέρασμα) ═══
     ΠΡΩΤΗ ΕΚΔΟΧΗ: λογότυπο σε ΟΛΟ το πλάτος (992px) και ατάκα από κάτω. Ο Αντώνης:
     «είναι τεράστιο, δεν χρειάζεται τόσο, ούτε στο κέντρο· βάλ' το αριστερά ή δεξιά και
     την ατάκα απέναντι, να είναι ισομερές, να μην είναι το ένα κάτω από το άλλο».
     ΤΩΡΑ: μία σειρά με δύο βάρη — λογότυπο αριστερά, ατάκα δεξιά, στοιχισμένα στη ΒΑΣΗ
     τους ώστε να «κάθονται» στην ίδια γραμμή. Οι τρεις στήλες συνδέσμων από κάτω. */
  .footer-grid{ grid-template-columns: repeat(3, 1fr); row-gap: clamp(2rem, 1rem + 3vw, 3.5rem); }
  .footer-wordmark{ grid-column: 1 / 2; align-self: end; max-width: min(100%, 21rem); }
  .footer-ataka{ grid-column: 2 / -1; align-self: end; justify-self: end;
     text-align: right; max-width: 26ch; margin-top: 0; }
}
@media (min-width: 1024px){
  .footer-grid{ grid-template-columns: repeat(3, 1fr); }
}
/* 🐛 ΜΕΤΡΗΘΗΚΕ: το λογότυπο έβγαινε 544px αντί 992. ΑΙΤΙΑ: αυτός ο κανόνας ήταν ΧΩΡΙΣ
   media query και ΜΕΤΑ τα breakpoints — ίδια ειδικότητα, οπότε κέρδιζε ο τελευταίος και
   κάρφωνε το desktop στα 34rem. Τώρα ισχύει ΜΟΝΟ σε κινητό. */
@media (max-width: 699.98px){
  .footer-wordmark{ max-width: min(100%, 34rem); }
}
.site-footer .footer-col h4{ color: rgba(251,252,252,.5); }
.site-footer .footer-col a{ color: rgba(251,252,252,.85); }
.site-footer .footer-col a:hover{ color: var(--c-volt); }
.footer-social{ display: flex; gap: .8rem; }
.footer-social a{
  display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px;
  border: 1px solid rgba(251,252,252,.28); border-radius: 50%; color: rgba(251,252,252,.85);
  transition: border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease); }
.footer-social a:hover{ color: var(--c-volt-ink); background: var(--c-volt); border-color: var(--c-volt); }
.site-footer .footer-bottom{ border-top-color: rgba(251,252,252,.14); color: rgba(251,252,252,.5); margin-top: clamp(2rem, 1.5rem + 2vw, 3.5rem); }


/* ═══════════ ΘΕΣΕΙΣ ΕΡΓΑΣΙΑΣ — φόρμα αίτησης συνεργασίας (synergasia.html) ═══════════
   Επεκτείνει το Noomo form language (.nfield/.npill/.nsend) με κάθετα radio, checkboxes,
   textarea, file input, section groups, required markers, error slots. ΜΟΝΟ :root tokens. */
[hidden]{ display: none !important; }
.container--narrow{ max-width: 46rem; }

.synergasia-hero .synergasia-intro{
  margin-top: clamp(1rem, .8rem + 1vw, 1.5rem); max-width: 40rem;
  font-family: var(--f-body); font-weight: 300; color: var(--c-ink-soft);
  font-size: clamp(1.05rem, 1rem + .4vw, 1.3rem); line-height: 1.6; }

.synergasia-form{ margin-top: clamp(2rem, 1.5rem + 2vw, 3.5rem); }
.form-legend{ font-size: var(--fs-small); color: var(--c-ink-soft); }
.req{ color: var(--c-teal-500); font-weight: 600; }

.nform-section{ border: 0; padding: 0; margin: 0; display: flex; flex-direction: column;
  gap: clamp(1.5rem, 1.2rem + 1.2vw, 2.5rem);
  padding-top: clamp(1.75rem, 1.2rem + 1.6vw, 2.75rem); border-top: 1px solid var(--c-border); }
.nform-section:first-of-type{ border-top: 0; padding-top: 0; }
.nform-section__title{ font-family: var(--f-display-ui); font-weight: var(--fw-display-strong);
  letter-spacing: -.01em; font-size: clamp(1.15rem, 1rem + .8vw, 1.6rem); color: var(--c-ink); padding: 0; }

/* textarea — ίδιο underline ύφος με τα inputs */
.nfield textarea{ border: 0; border-bottom: 1px solid var(--c-ink); border-radius: 0; background: transparent;
  padding: .55rem 0 .8rem; font-size: clamp(1.05rem, 1rem + .3vw, 1.25rem); font-family: var(--f-body);
  font-weight: 300; color: var(--c-ink); line-height: 1.5; resize: vertical; min-height: 3.25rem;
  transition: border-color var(--dur-fast) var(--ease); }
.nfield textarea:focus{ outline: none; border-bottom-color: var(--c-teal-500); }

/* κάθετη λίστα radio (μεγάλες επιλογές) */
.nradio, .ncheck{ display: flex; flex-direction: column; gap: .6rem; padding-top: .3rem; }
.nradio__opt, .ncheck__opt{ position: relative; display: flex; align-items: flex-start; gap: .8rem;
  padding: .9rem 1.1rem; border: 1.5px solid var(--c-border); border-radius: 14px; cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease); }
.nradio__opt:hover, .ncheck__opt:hover{ border-color: var(--c-teal-400); background: var(--c-teal-50); }
.nradio__opt:has(input:checked), .ncheck__opt:has(input:checked){ border-color: var(--c-ink); background: var(--c-teal-50); }
.nradio__opt input, .ncheck__opt input{ position: absolute; opacity: 0; width: 1px; height: 1px; }
.nradio__text, .ncheck__text{ font-size: clamp(.98rem, .95rem + .2vw, 1.1rem); line-height: 1.45; color: var(--c-ink); }

.nradio__dot{ flex: none; width: 20px; height: 20px; margin-top: .12rem; border-radius: 50%;
  border: 1.5px solid var(--c-ink-mute); position: relative; transition: border-color var(--dur-fast) var(--ease); }
.nradio__dot::after{ content: ''; position: absolute; inset: 3px; border-radius: 50%; background: var(--c-ink);
  transform: scale(0); transition: transform var(--dur-fast) var(--ease); }
.nradio__opt input:checked + .nradio__dot{ border-color: var(--c-ink); }
.nradio__opt input:checked + .nradio__dot::after{ transform: scale(1); }
.nradio__opt input:focus-visible + .nradio__dot{ outline: 2px solid var(--c-focus); outline-offset: 3px; }

.ncheck__box{ flex: none; width: 20px; height: 20px; margin-top: .12rem; border-radius: 6px;
  border: 1.5px solid var(--c-ink-mute); position: relative; transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease); }
.ncheck__box::after{ content: ''; position: absolute; left: 6px; top: 2px; width: 5px; height: 10px;
  border: solid var(--c-bg); border-width: 0 2px 2px 0; transform: rotate(45deg) scale(0);
  transition: transform var(--dur-fast) var(--ease); }
.ncheck__opt input:checked + .ncheck__box{ border-color: var(--c-ink); background: var(--c-ink); }
.ncheck__opt input:checked + .ncheck__box::after{ transform: rotate(45deg) scale(1); }
.ncheck__opt input:focus-visible + .ncheck__box{ outline: 2px solid var(--c-focus); outline-offset: 3px; }

/* file input */
.nfield input[type="file"]{ font-family: var(--f-body); font-size: var(--fs-small); color: var(--c-ink-soft); padding: .3rem 0; }
.nfield input[type="file"]::file-selector-button{ font-family: var(--f-body); font-weight: 500; font-size: var(--fs-small);
  letter-spacing: .04em; margin-right: 1rem; padding: .7rem 1.3rem; min-height: 44px; border: 1.5px solid var(--c-ink);
  border-radius: 999px; background: transparent; color: var(--c-ink); cursor: pointer;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
.nfield input[type="file"]:hover::file-selector-button{ background: var(--c-ink); color: var(--c-bg); }
.nfile__hint{ font-size: var(--fs-small); color: var(--c-ink-soft); margin-top: .1rem; }

/* error slots — κείμενο + dashed border (όχι μόνο χρώμα, a11y) */
.nfield__err{ font-size: var(--fs-small); font-weight: 500; color: var(--c-ink); margin-top: .3rem; display: none; }
.nfield.is-invalid .nfield__err{ display: block; }
.nfield.is-invalid textarea, .nfield.is-invalid input:not([type=radio]):not([type=checkbox]):not([type=file]),
.nfield.is-invalid select{ border-bottom-color: var(--c-ink-mute); border-bottom-style: dashed; }
.nfield.is-invalid .nradio__opt, .nfield.is-invalid .ncheck__opt{ border-color: var(--c-ink-mute); border-style: dashed; }

/* GDPR consent */
.nfield--consent .ncheck__opt{ border: 0; padding: 0; }
.nfield--consent .ncheck__opt:hover{ background: transparent; }
.nfield--consent .ncheck__text{ font-size: var(--fs-small); color: var(--c-ink-soft); line-height: 1.5; }
.nfield--consent a{ color: var(--c-cta); text-decoration: underline; text-underline-offset: 2px; }

/* submit status */
.synergasia-form .form-status{ display: none; font-size: 1rem; font-weight: 500; color: var(--c-teal-700); }
.synergasia-form .form-status.is-visible{ display: block; }
.synergasia-form .form-status.is-error{ color: var(--c-ink); }


/* ═══════════ Nav dropdown «Προφίλ» (submenu → Θέσεις εργασίας) ═══════════ */
.site-nav .has-submenu{ position: relative; }
.site-nav .submenu-toggle{ display: inline-flex; align-items: center; gap: .3rem; background: none; border: 0;
  cursor: pointer; font-family: var(--f-hero); font-size: clamp(1.05rem, .95rem + .4vw, 1.3rem); font-weight: 300;
  letter-spacing: .005em; color: var(--c-ink-soft); padding: 0; min-height: 44px;
  transition: color var(--dur-fast) var(--ease); }
.site-header .site-nav .submenu-toggle{ color: var(--c-ink); }
.site-nav .submenu-toggle:hover{ color: var(--c-teal-600); }
.submenu-caret{ transition: transform var(--dur-fast) var(--ease); }
.has-submenu.is-open .submenu-caret{ transform: rotate(180deg); }
.site-nav .submenu{ position: absolute; top: calc(100% + .5rem); left: 50%; transform: translate(-50%, 6px);
  min-width: 12.5rem; padding: .45rem; margin: 0; list-style: none; z-index: 60;
  background: var(--c-surface); border: 1px solid var(--c-border); border-radius: 14px;
  box-shadow: 0 14px 34px rgba(21,23,29,.14); opacity: 0; visibility: hidden;
  transition: opacity var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease), visibility 0s var(--dur-fast); }
.has-submenu.is-open .submenu{ opacity: 1; visibility: visible; transform: translate(-50%, 0);
  transition: opacity var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease), visibility 0s 0s; }
.site-nav .submenu li{ list-style: none; }
.site-nav .submenu a{ display: block; padding: .6rem .85rem; border-radius: 9px; color: var(--c-ink);
  font-size: var(--fs-small); font-weight: 400; white-space: nowrap;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
.site-nav .submenu a:hover{ background: var(--c-teal-50); color: var(--c-teal-700); }
/* mobile group */
.mobile-nav .mobile-group__label{ display: block; font-size: var(--fs-small); text-transform: uppercase;
  letter-spacing: .1em; color: var(--c-ink-mute); margin-bottom: .2rem; }

/* ═══════════ ΣΕΛΙΔΑ ΠΡΟΦΙΛ (profil.html) — Εισαγωγή / Timeline / Φιλοσοφία ═══════════
   Φάση Α: δομή & περιεχόμενο. Φάση Β: η ζικ-ζακ γραμμή (SVG overlay) περνά ανάμεσα στους σταθμούς. */
.profil-intro{ padding-top: clamp(7rem, 6rem + 8vh, 11rem); }
.profil-intro__inner{ max-width: 54rem; }
.profil-intro__title{ font-family: var(--f-hero); font-weight: var(--fw-hero); letter-spacing: -0.02em;
  font-size: clamp(2rem, 1.2rem + 4vw, 4rem); line-height: 1.1; margin: .7rem 0 1.4rem; }
.profil-intro__title em{ font-style: normal; color: var(--c-teal-600); }
.profil-intro__lead{ font-size: clamp(1.05rem, 1rem + .4vw, 1.35rem); line-height: 1.65; color: var(--c-ink-soft); margin: 0; }

/* ---- Timeline ----
   ΤΡΕΙΣ κολόνες: κείμενο | ΔΙΑΔΡΟΜΟΣ (εδώ κινείται η ζικ-ζακ γραμμή) | κείμενο.
   Ο μεσαίος διάδρομος είναι φαρδύς επίτηδες, ώστε η γραμμή να έχει χώρο να «ταξιδεύει». */
.profil-timeline{ position: relative; }
.timeline{ list-style: none; margin: var(--sp-block) 0 0; padding: 0; position: relative; z-index: 1; }
.tl-item{ display: grid; grid-template-columns: 1fr clamp(6rem, 18vw, 15rem) 1fr; gap: 0;
  margin-bottom: clamp(3.5rem, 4rem + 6vh, 9rem); }
.tl-item:last-child{ margin-bottom: 0; }
.tl-item--right .tl-body{ grid-column: 3; }
/* 6/8 (αίτημα Αντώνη): ΑΡΙΣΤΕΡΗ στοίχιση παντού — και στους αριστερούς σταθμούς (ήταν text-align:right) */
.tl-item--left  .tl-body{ grid-column: 1; text-align: left; }
.tl-body{ max-width: 30rem; }
.tl-item--left .tl-body{ margin-left: auto; }
/* ΙΔΙΟ ΘΕΜΑ (25/8): οι χρονολογίες του Προφίλ (2003, 2014, 2017) και η αρίθμηση των
   προγραμμάτων (01-04) είναι κι αυτές αριθμοί σε Actual — δηλαδή με το ίδιο «πεσμένο» 9/3/4/7.
   Περνούν στο --f-num για να στέκονται όλα τα ψηφία στην ίδια γραμμή. Αν στο Προφίλ σου άρεσε
   το παλιό ύφος, αυτή η μία γραμμή το γυρίζει πίσω. */
.tl-year{ display: block; font-family: var(--f-num); font-weight: 300; line-height: 1;
  font-size: clamp(2.2rem, 1.4rem + 3.2vw, 4.2rem); color: var(--c-teal-600); letter-spacing: -0.02em; }
.tl-item--now .tl-year{ color: var(--c-teal-400); }
.tl-title{ font-size: var(--fs-h3); margin: .5rem 0 .6rem; }
.tl-desc{ color: var(--c-ink-soft); line-height: 1.6; margin: 0; }
/* λίστα μέσα σε σταθμό (π.χ. 2010 — συνεργασίες διά βίου μάθησης) */
.tl-list{ margin: .7rem 0 0; padding-left: 1.15rem; color: var(--c-ink-soft); line-height: 1.6; }
.tl-list li{ margin-bottom: .35rem; }
.tl-desc + .tl-desc{ margin-top: .8rem; }
.tl-photo{ margin-top: 1.1rem; aspect-ratio: 16 / 10; border-radius: var(--radius-md);
  background: var(--c-surface-tint); border: 1px solid var(--c-border); display: flex;
  align-items: center; justify-content: center; overflow: hidden; }
.tl-photo{ position: relative; }
/* η πραγματική φωτογραφία (όταν υπάρχει) καλύπτει τη θέση & κρύβει τον placeholder */
.tl-photo img{ position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 1; }
.tl-note{ margin: .6rem 0 0; font-size: var(--fs-small); color: var(--c-ink-mute); font-style: italic; }
@media (max-width: 699.98px){
  .tl-item{ grid-template-columns: 1fr; }
  .tl-item--left .tl-body, .tl-item--right .tl-body{ grid-column: 1; text-align: left; margin-left: 0; }
}

/* ---- Η ΓΡΑΜΜΗ-ΥΠΟΓΡΑΦΗ (ζικ-ζακ) ----
   Ένα SVG overlay που καλύπτει ΟΛΗ τη ροή (τίτλος → timeline → φιλοσοφία). Το path χτίζεται
   δυναμικά από JS (initProfilLine) με βάση τις πραγματικές θέσεις των σταθμών, και ζωγραφίζεται
   με DrawSVG στο scroll. Ίδιο πάχος/στυλ με τη γραμμή του showreel (stroke 30, round caps). */
.profil-flow{ position: relative; }
/* τα sections πάνω από τη γραμμή· ΕΞΑΙΡΕΙΤΑΙ το SVG (αλλιώς χάνει το absolute → μπαίνει στη ροή) */
.profil-flow > section{ position: relative; z-index: 1; }
.profil-flow > .profil-flow__svg{ position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0;
  pointer-events: none; overflow: visible; }
@media (max-width: 699.98px){ .profil-flow__svg{ display: none; } }   /* κινητό: χωρίς γραμμή (καθαρή στοίβα) */

/* ---- Line-reveal εφέ (OSMO): οι γραμμές κειμένου ανεβαίνουν μέσα από μάσκα ---- */
.text-line-mask{ padding-bottom: .18em; margin-bottom: -.18em; }
/* Εικόνες: circular clip-path reveal (τίθεται από JS· εδώ μόνο ομαλή βάση) */
[data-img-reveal]{ will-change: clip-path; }

/* ---- Φιλοσοφία ---- */
/* padding-bottom: χώρος για να «κλείσει» ομαλά η γραμμή κάτω από το κείμενο (χωρίς απότομη στροφή) */
.profil-philosophy{ background: var(--c-surface-tint); border-block: 1px solid var(--c-border);
  padding-bottom: clamp(6rem, 5rem + 6vw, 11rem); }
.profil-philosophy__inner{ max-width: 50rem; }
.profil-philosophy__title{ font-family: var(--f-hero); font-weight: var(--fw-hero); letter-spacing: -0.02em;
  font-size: clamp(1.8rem, 1.2rem + 3vw, 3.2rem); line-height: 1.15; margin: .7rem 0 1.2rem; }
.profil-philosophy__body{ font-size: clamp(1.05rem, 1rem + .4vw, 1.3rem); line-height: 1.7; color: var(--c-ink); }
.profil-philosophy__body p{ margin: 0 0 1rem; }
.profil-philosophy__body p:last-child{ margin-bottom: 0; }

/* ---- Κλείσιμο: μεγάλη ατάκα + CTA ---- */
.profil-close{ text-align: center; }
.profil-close__inner{ max-width: 44rem; }
.profil-close__line{ font-family: var(--f-hero); font-weight: var(--fw-hero); letter-spacing: -0.02em;
  font-size: clamp(1.7rem, 1.1rem + 3.2vw, 3.4rem); line-height: 1.15; margin: 0 0 var(--sp-block); }
.profil-close .cta-row{ justify-content: center; }

/* ═══════════ ΧΑΡΤΗΣ ΠΑΡΑΡΤΗΜΑΤΩΝ (11/8) ═══════════
   Ο χάρτης είναι ΑΚΙΝΗΤΟΣ και η σελίδα περνάει από πάνω του:
     · το προηγούμενο section (.section--covers) τον σκεπάζει και φεύγοντας τον αποκαλύπτει
     · το επόμενο (.section--overmap) τραβιέται πάνω του και τον ξανασκεπάζει
   Τα αρνητικά margin είναι αυτά που τα βάζουν στο ίδιο ύψος. Η ακινησία βγαίνει από
   το position: sticky — ΟΧΙ από JS pin (μηδέν ρίσκο λανθασμένων μετρήσεων).            */
.section--covers{ position: relative; z-index: 2; background: var(--c-bg); }
/* 500svh, ΟΧΙ 400 (22/8): έφυγε το κλείδωμα της σελίδας που κρατούσε τον χάρτη ~7 κινήσεις.
   Χωρίς αυτό ο χάρτης θα περνούσε αστραπιαία και οι τρεις κάρτες δεν θα προλάβαιναν να φανούν.
   Ανάλυση: 100 αποκάλυψη + 200 ορατό παράθυρο (εδώ βγαίνουν οι κάρτες) + 100 σκέπασμα + 100 το
   ίδιο το πλαίσιο. Το ορατό παράθυρο είναι λοιπόν η πρόοδος 0,25...0,75 — από εκεί βγήκαν τα
   κατώφλια στο branchmap.js. Αν αλλάξει αυτό το ύψος, ΠΡΕΠΕΙ να ξαναβγούν κι εκείνα. */
.mapsec{ position: relative; z-index: 1; margin-top: -100svh;
   /* 500 → 320svh (26/8, ΜΕΤΡΗΘΗΚΕ): ο χάρτης έπιανε 5 ΟΘΟΝΕΣ κύλισης και από την αρχή του
      ως το footer χρειάζονταν ~40 κλικ ροδέλας.
      🔴 ΔΕΥΤΕΡΟ ΠΕΡΑΣΜΑ (εντολή Αντώνη): «μη μου πειράξεις τους χρονισμούς των τριών
      κέντρων — μόνο τα κλικ ΜΕΤΑ την τελευταία κάρτα, 4 αντί 10».
      Ο ΥΠΟΛΟΓΙΣΜΟΣ: η διαδρομή είναι height − 100svh. Με 500svh ήταν 400svh, και τα κατώφλια
      0,31/0,36/0,41 έβαζαν τις κάρτες στα 124/144/164svh. Μετά την τρίτη έμεναν 236svh ουρά.
      ΤΩΡΑ 300svh → διαδρομή 200svh: 164 ως την τελευταία κάρτα + 36svh ουρά (≈4 κλικ).
      ⚠ ΤΑ ΚΑΤΩΦΛΙΑ ΑΝΑΠΡΟΣΑΡΜΟΣΤΗΚΑΝ ΑΝΑΛΟΓΑ στο branchmap.js, ώστε οι κάρτες να πέφτουν
      στην ΙΔΙΑ ΑΚΡΙΒΩΣ απόσταση κύλισης με πριν. Αν αλλάξει το ένα, αλλάζει και το άλλο. */
   height: 406svh; }
.mapsec__stage{ position: sticky; top: 0; height: 100svh; overflow: hidden; background: var(--c-bg); }
/* ⚠ Η ΕΙΔΙΚΟΤΗΤΑ ΕΧΕΙ ΣΗΜΑΣΙΑ: το maplibre-gl.css φορτώνεται ΜΕΤΑ από εμάς και ορίζει
   `.maplibregl-map{ position: relative }`. Με σκέτο `.mapsec__canvas` (ίδια ειδικότητα, πιο πριν
   στη σειρά) κέρδιζε ΕΚΕΙΝΟ — το inset:0 αγνοούνταν κι ο χάρτης έβγαινε ΜΗΔΕΝ ύψος, δηλαδή κενός.
   Το `.mapsec .mapsec__canvas` (δύο κλάσεις) κερδίζει ανεξάρτητα από σειρά φόρτωσης.
   Το ρητό height είναι ζώνη ασφαλείας: ακόμη κι αν κάποτε χαθεί το absolute, ο χάρτης φαίνεται. */
.mapsec .mapsec__canvas{ position: absolute; inset: 0; width: 100%; height: 100%;
   background: var(--c-bg); }
.mapsec .mapsec__canvas .maplibregl-ctrl-attrib,
.mapsec .mapsec__canvas .maplibregl-ctrl-bottom-right{ display: none; }

/* ΘΕΣΗ ΤΙΤΛΟΥ — ΜΕΤΡΗΜΕΝΗ, ΟΧΙ ΕΠΙΛΕΓΜΕΝΗ (22/8).
   Ο Αντώνης ζήτησε «λίγο πιο ψηλά». ΔΕΝ γίνεται πιο ψηλά από εδώ: το σταθερό «Μ» της σελίδας
   κάθεται πάνω-αριστερά και πιάνει τη ζώνη 10-133px. Μέχρι σήμερα ΔΕΝ φαινόταν εκεί, γιατί
   ήταν λευκό πάνω σε ανοιχτό χάρτη (το σφάλμα του clip που διορθώθηκε την ίδια μέρα) — γι'
   αυτό ο τίτλος «χωρούσε». Τώρα που το «Μ» είναι μαύρο και ορατό, ο τίτλος ΠΡΕΠΕΙ να ξεκινά
   κάτω από τα 133px, αλλιώς γράφουν το ένα πάνω στο άλλο. 9,2rem = 147px, με 14px αέρα.
   Ο «αέρας από πάνω» που ζητήθηκε έρχεται από το top padding του κάδρου (branchmap.js:κάδρο),
   που σπρώχνει τις καρφίτσες χαμηλά και αφήνει γυμνό χάρτη πίσω από τον τίτλο.
   Σε κινητό το σταθερό λογότυπο είναι το μικρό 44px της μπάρας (ζώνη 14-58px), οπότε εκεί ο
   τίτλος ανεβαίνει κανονικά — βλ. @media παρακάτω. */
/* ΔΕΞΙΑ ΚΑΙ ΨΗΛΑ, ΔΙΠΛΑ ΣΤΟ ΜΕΝΟΥ (23/8, εντολή Αντώνη — «έτσι λύνει και πολλά προβλήματα»).
   Και όντως τα λύνει: αριστερά κάθονται οι κάρτες των παραρτημάτων και το σταθερό «Μ» της
   σελίδας· η δεξιά-πάνω γωνία είναι το μόνο σημείο που μένει ελεύθερο σε κάθε κάδρο.
   Το δεξί περιθώριο (5,5rem) αφήνει χώρο για το κουμπί του μενού. */
/* 23/8, γ΄ πέρασμα — Ο ΤΙΤΛΟΣ ΣΕ ΜΙΑ ΓΡΑΜΜΗ, ΣΤΗΝ ΙΔΙΑ ΣΕΙΡΑ ΜΕ ΤΟ «Μ».
   Διευκρίνιση Αντώνη: τα θέλει ΣΤΗΝ ΙΔΙΑ γραμμή — όχι χωριστά. Το λογότυπο πιάνει
   τη ζώνη 14–94px (κέντρο 54). Με top .25rem ο τίτλος κάθεται 24–94 (κέντρο 59) —
   5px διαφορά, δηλαδή οπτικά ίδια σειρά. Κάτω από 0 δεν πάει: το eyebrow θέλει
   20px πάνω από τον τίτλο. (Προηγούμενη εκδοχή: κατεβασμένος στα 4,9rem.)
   Η κεφαλή κατεβαίνει από ~31px σε ~78px για ΜΕΤΡΗΜΕΝΟ λόγο: το σταθερό «Μ» της σελίδας
   πιάνει τη ζώνη 14–94px. Με τον τίτλο σε ΜΙΑ γραμμή και το κενό μηδενισμένο, η γραμμή του
   ξεκινούσε στα 57px — δηλαδή ΜΕΣΑ στη ζώνη του λογοτύπου (επικάλυψη 36px), και τα δύο
   διάβαζαν ως «μία σειρά». Το σφίξιμο του κενού ΤΟ ΕΝΤΕΙΝΕΙ (ανεβάζει τον τίτλο), άρα
   το λύνει μόνο το κατέβασμα του μπλοκ. Σε rem (όχι vh) επίτηδες: το λογότυπο δΕΝ μικραίνει
   σε κοντό παράθυρο, οπότε ένα vh-κλειδωμένο top θα ξανέφερνε την επικάλυψη στα 700px ύψος. */
/* ΔΕΞΙΑ ΚΑΙ ΨΗΛΑ (23/8) — αριστερά κάθονται οι κάρτες και το «Μ»· το δεξί περιθώριο
   (5,5rem) αφήνει χώρο για το κουμπί του μενού. */
/* Το eyebrow παίρνει το μικρότερο δυνατό ύψος (ήταν inline με line-height 24px):
   κάθε px που πιάνει σπρώχνει τον τίτλο πιο κάτω από τη γραμμή του «Μ». */
.mapsec__head .eyebrow{ display: block; line-height: 1; }
/* ΚΟΙΝΗ ΒΑΣΙΚΗ ΓΡΑΜΜΗ ΜΕ ΤΟ «Μ» (23/8, διευκρίνιση Αντώνη): δΕΝ ευθυγραμμίζονται
   τα κουτιά αλλά οι ΓΡΑΜΜΕΣ ΠΟΥ ΠΑΤΟΥΝ τα γράμματα. Μετρημένα στη σελίδα:
   το μελάνι του «Μ» τελειώνει στα 92,4px (το βρήκα ζωγραφίζοντας το PNG σε καμβά και
   ψάχνοντας την τελευταία μη-διάφανη γραμμή), ενώ η βασική γραμμή του τίτλου ήταν στα 74,9.
   Διαφορά 17,5px — γι’ αυτό το top από .3rem πάει στα 1.4rem (22,4px).
   Η ουρά του «ρ» πέφτει 25px κάτω από τη γραμμή — ακριβώς όπως το ζήτησε.
   Σε rem και όχι σε vh/vw: η διαφορά που χρειάζεται στα 706px είναι 19,5px — 3px
   απόκλιση σε όλο το εύρος tablet→desktop, δηλαδή αόρατη. */
/* 23/8, δ΄ πέρασμα — 1.4rem → 1.7rem (+4,8px). ΜΕΤΡΗΜΕΝΟ στο ΣΩΣΤΟ «Μ»:
   το ορατό «Μ» ΔΕΝ είναι το λογότυπο της κεφαλίδας (εκείνο είναι ΚΡΥΦΟ στην αρχική) —
   είναι το μεγάλο wordmark του hero κομμένο με clip-path, που πατάει 40px ΧΑΜΗΛΟΤΕΡΑ. */
.mapsec__head{ position: absolute; z-index: 3; top: 1.7rem;
   right: calc(var(--pad-x) + 5.5rem); left: auto; text-align: right;
   max-width: min(60rem, calc(100vw - 17rem)); pointer-events: none; }
/* ΜΙΑ ΓΡΑΜΜΗ (23/8, εντολή Αντώνη). Στα 4,4rem το «3 κέντρα στο Ηράκλειο» θέλει
   840px — ΜΕΤΡΗΜΕΝΟ στη σελίδα, όχι εκτιμημένο — δηλαδή 12,3× το μέγεθος γραμματοσειράς.
   Για να μην ξεχειλίζει σε στενό παράθυρο, το μέγεθος δένεται και στον διαθέσιμο χώρο:
   100vw μείον 17rem (περιθώρια + κουμπί μενού + ζώνη λογοτύπου + ανάσα), δια 12,3.
   Το κενό προς το «ΠΟΥ ΘΑ ΜΑΣ ΒΡΕΙΤΕ» μηδενίζεται (ήταν 0,2rem). */
.mapsec__head h2{ margin: 0; white-space: nowrap;
   font-size: min(clamp(2.2rem, 1.4rem + 3.2vw, 4.4rem), calc((100vw - 17rem) / 12.3));
   line-height: 1.02; }
/* ΚΥΡΙΟ ΧΡΩΜΑ, ΜΕΓΑΛΟ PILL (23/8, β΄ πέρασμα). Το λαχανί δοκιμάστηκε και δεν έπεισε — το
   κύριο #4BECE7 είναι σωστότερο: είναι γέμισμα, δηλαδή ακριβώς εκεί που ζει το χρώμα της
   ταυτότητας, και δίνει 12,10:1 με μαύρα γράμματα. Το λαχανί μένει για τον σπάνιο τονισμό.
   Μεγαλύτερο: 56px ύψος αντί 44 — είναι η ΜΟΝΗ έξοδος από το ζουμ, δεν πρέπει να ψάχνεται. */
.mapsec__back{ position: absolute; z-index: 4; left: 50%; bottom: 1.6rem; transform: translateX(-50%);
   display: inline-flex; align-items: center; gap: .6rem;
   border: 0; background: var(--c-accent); color: var(--c-ink);
   border-radius: 999px; padding: 0 1.6rem 0 1.3rem; font: inherit; font-size: .95rem; font-weight: 700;
   letter-spacing: .01em; cursor: pointer; box-shadow: 0 12px 34px rgba(10,20,40,.20);
   opacity: 0; visibility: hidden; min-height: 56px; }
.mapsec__back:hover{ background: var(--c-accent-hover); }
.mapsec__back:focus-visible{ outline: 3px solid var(--c-ink); outline-offset: 3px; }

/* ΕΙΚΟΝΙΔΙΟ «ΠΛΗΡΗΣ ΠΡΟΒΟΛΗ» — ΤΡΕΙΣ ΚΟΥΚΚΙΔΕΣ ΠΟΥ ΦΟΥΣΚΩΝΟΥΝ ΜΙΑ-ΜΙΑ (23/8).
   Ο Αντώνης περιέγραψε το Lottie που δεν μπορούσε να κατεβάσει: «σαν να φουσκώνουν ένα-ένα
   κουκίδες, είναι και τα location». Το αναπαράγω με τρία σημεία-τοποθεσίας που ανάβουν με τη
   σειρά — και ταιριάζει με το νόημα του κουμπιού: γυρνάς πίσω στα ΤΡΙΑ κέντρα. Η διάταξή τους
   (δύο πάνω, ένα κάτω-δεξιά) είναι η πραγματική διάταξη των παραρτημάτων στον χάρτη.
   Κάθε σημείο: μια κουκκίδα που «σκάει» και ένας δακτύλιος που ανοίγει και σβήνει γύρω της —
   ο κύκλος του σήματος. Βρόχος 2,4s, με 0,3s καθυστέρηση ανά σημείο. */
.mapsec__back .fsico{ width: 24px; height: 24px; flex: none; overflow: visible; }
.fsico__dot{ fill: currentColor; transform-box: fill-box; transform-origin: 50% 50%; }
.fsico__ring{ fill: none; stroke: currentColor; stroke-width: 1.6;
   transform-box: fill-box; transform-origin: 50% 50%; }
.fsico__p--1{ --d: 0s; } .fsico__p--2{ --d: .3s; } .fsico__p--3{ --d: .6s; }
.fsico__p .fsico__dot{ animation: fsdot 2.4s ease-in-out infinite; animation-delay: var(--d); }
.fsico__p .fsico__ring{ animation: fsring 2.4s ease-out infinite; animation-delay: var(--d); }
@keyframes fsdot{
  0%, 70%, 100%{ transform: scale(.45); opacity: .45; }
  12%{ transform: scale(1.15); opacity: 1; }
  22%{ transform: scale(1);    opacity: 1; }
}
@keyframes fsring{
  0%{ transform: scale(.35); opacity: 0; }
  10%{ opacity: .85; }
  40%{ transform: scale(1);  opacity: 0; }
  100%{ transform: scale(1); opacity: 0; }
}
.mapsec__back:hover .fsico__p .fsico__dot,
.mapsec__back:hover .fsico__p .fsico__ring{ animation-duration: 1.4s; }
@media (prefers-reduced-motion: reduce){
  .fsico__p .fsico__dot{ animation: none; opacity: 1; }
  .fsico__p .fsico__ring{ animation: none; opacity: .5; } }

/* ΣΤΟ ΖΟΥΜ Ο ΤΙΤΛΟΣ ΦΕΥΓΕΙ (23/8): «δεν χρειάζεται να φαίνονται τα 3 κέντρα όταν κάνω ζουμ —
   μόνο το κουμπί». Σωστό: ο τίτλος περιγράφει την ΕΠΟΠΤΕΙΑ· μέσα σε ένα παράρτημα είναι
   θόρυβος, και πιάνει το πάνω μισό της οθόνης. */
/* ΕΜΦΑΝΙΣΗ ΜΕ ΤΗΝ ΚΥΛΙΣΗ (23/8, εντολή Αντώνη). Πριν, ο τίτλος ήταν εκεί από
   το πρώτο καρέ και το μόνο που έκανε η κύλιση ήταν να ξαναπαίξει το εφέ των καρφιτσών —
   δηλαδή «φαίνονται κατευθείαν και μετά γίνεται το εφέ». Τώρα μπαίνει πρώτος ο τίτλος. */
.mapsec__head{ opacity: 0; transform: translateY(18px);
   transition: opacity .55s var(--ease), transform .55s var(--ease), visibility .45s var(--ease); }
.mapsec__head.is-in{ opacity: 1; transform: none; }
.mapsec.is-zoomed .mapsec__head{ opacity: 0; visibility: hidden; }
@media (prefers-reduced-motion: reduce){ .mapsec__head{ transform: none; } }

/* ═══ ΤΟ ΒΕΛΟΣ ΤΗΣ ΜΕΤΑΚΟΜΙΣΗΣ (23/8) ═══
   Κόκκινο, διακεκομμένο, με χειρόγραφη καμπύλη — «από εδώ ήρθαμε εκεί». Ζωγραφίζεται με
   κίνηση (το dashoffset τρέχει), δηλαδή ο επισκέπτης βλέπει τη διαδρομή να χαράζεται.
   Το χρώμα είναι ΕΚΤΟΣ παλέτας επίτηδες: δεν είναι στοιχείο ταυτότητας, είναι σημείωση —
   πρέπει να διαβάζεται ως «σημείωση με κόκκινο στυλό πάνω στον χάρτη». */
/* ⚠ ΤΟ width/height ΕΙΝΑΙ ΑΠΑΡΑΙΤΗΤΟ: το <svg> είναι replaced element — με σκέτο inset:0 ο
   browser του δίνει το ΠΡΟΚΑΘΟΡΙΣΜΕΝΟ 300×150 και ό,τι ζωγραφίζεται πιο έξω ΚΟΒΕΤΑΙ.
   Μετρήθηκε: η καμπύλη ήταν στο x 725-772 και δεν φαινόταν καθόλου. */
.movearrow{ position: absolute; inset: 0; width: 100%; height: 100%; z-index: 3;
   pointer-events: none; color: #D64541; opacity: 0; transition: opacity .3s var(--ease); }
.movearrow.is-on{ opacity: 1; }
.movearrow__line{ stroke-dashoffset: calc(var(--len) * 1px); }
.movearrow.is-on .movearrow__line{ animation: mvdraw 1.5s cubic-bezier(.22,.61,.36,1) forwards; }
@keyframes mvdraw{ from{ stroke-dashoffset: calc(var(--len) * 1px); } to{ stroke-dashoffset: 0; } }

/* ═══ ΚΑΡΤΑ ΠΑΛΙΟΥ ΧΩΡΟΥ (23/8 δ΄, ιδέα Αντώνη) ═══
   Ηταν μικρή κόκκινη ετικέτα· γίνεται κάρτα σαν των παραρτημάτων: ΜΑΥΡΑ γράμματα,
   φωτογραφία από κάτω. Το «Χ» της διαγραφής μένει κόκκινο — είναι το μόνο που λέει
   «δεν ισχύει πια» — αλλά περνάει μόνο πάνω από το κείμενο. */
.movearrow__label{ position: absolute; z-index: 4; pointer-events: none;
   /* 23/8 ζ΄: πιάνεται από την ΚΑΤΩ-ΑΡΙΣΤΕΡΗ γωνία (εντολή Αντώνη) — ήταν
      κεντραρισμένη. Το left/top τα γράφει το branchmap.js. */
   transform: translate(0, -100%); width: 13rem; max-width: 60vw;
   font-size: .8rem; text-align: left; line-height: 1.3; color: var(--c-ink);
   background: rgba(255,255,255,.96); border: 1px solid rgba(255,255,255,.92);
   border-radius: 12px; padding: .6rem .65rem;
   box-shadow: 0 12px 32px rgba(10,20,40,.18);
   opacity: 0; transition: opacity .35s var(--ease) .25s; }
.movearrow__txt{ position: relative; display: block; }
.movearrow__photo{ display: block; width: 100%; height: auto; aspect-ratio: 4 / 3;
   object-fit: cover; border-radius: 8px; margin-top: .5rem;
   border: 1px solid rgba(21,23,29,.08); }
.movearrow__label.is-on{ opacity: 1; }
/* ΜΑΥΡΑ ΓΡΑΜΜΑΤΑ (εντολή Αντώνη) — κόκκινο μένει μόνο το «Χ» */
.movearrow__label b{ display: inline; font-weight: 700; font-size: .84rem;
   color: var(--c-ink); letter-spacing: -.01em; }
/* δεύτερη σειρά: ελαφρύτερη — λέει ΤΙ έγινε, δεν είναι το όνομα της διεύθυνσης */
/* 23/8 στ΄: ΙΝΛΑΙΝ — ο Αντώνης το ζήτησε «δίπλα, σε παύλα», όχι σε δεύτερη
   σειρά. Θα αναδιπλωθεί μόνο αν δεν χωράει. */
.movearrow__label i{ display: inline; font-style: normal; font-weight: 500;
   color: var(--c-ink-soft, #5C646F); }
/* (το κόκκινο «Χ» της διαγραφής αφαιρέθηκε 23/8 — εντολή Αντώνη) */
 }

/* ΣΤΟ ΖΟΥΜ ΤΑ ΔΡΟΜΩΝΥΜΑ ΔΥΝΑΜΩΝΟΥΝ (23/8: «τόνισε την Παπαναστασίου και την Κνωσσού»).
   Εκεί υπάρχει χώρος και ο επισκέπτης ψάχνει «από ποιον δρόμο θα έρθω» — άρα τα ονόματα
   των δρόμων παύουν να είναι υπόβαθρο και γίνονται πληροφορία. */
.mapsec.is-zoomed .mlabel--map{ font-size: .82rem; font-weight: 600; color: #5C646F; }

@media (prefers-reduced-motion: reduce){
  .movearrow.is-on .movearrow__line{ animation: none; stroke-dashoffset: 0; } }

/* Η ΚΑΡΤΑ ΚΑΘΕΤΑΙ ΠΑΝΩ ΣΤΟ ΠΑΡΑΡΤΗΜΑ (22/8, «θα εμφανίζονται οι κάρτες στα παραρτήματα»).
   Δεν είναι πια απόλυτα τοποθετημένη σε γωνία της οθόνης: την παίρνει ο χάρτης ως marker και
   την κουβαλάει μαζί του, οπότε δείχνει πάντα ΠΟΙΟ παράρτημα περιγράφει. Άρα ΟΧΙ position/left/
   bottom εδώ — τη θέση την ορίζει το maplibre. Μικρότερη από πριν: στο κάδρο της εποπτείας
   χωράνε τρεις ταυτόχρονα χωρίς να πατάει η μία την άλλη. */
/* ΓΥΑΛΙ + ΠΑΛΛΟΜΕΝΟ ΔΑΧΤΥΛΙΔΙ (23/8, β΄ πέρασμα — διορθώσεις Αντώνη).
   ΤΡΕΙΣ ΑΛΛΑΓΕΣ ΑΠΟ ΤΗΝ ΠΡΟΗΓΟΥΜΕΝΗ ΕΚΔΟΧΗ:
   1) ΠΙΟ ΔΙΑΦΑΝΗΣ: φόντο 72% → 58%. Για να μην χαθεί η αναγνωσιμότητα, το θόλωμα
      ανεβαίνει 14 → 20px: όσο πιο θολό το από πίσω, τόσο λιγότερο πολτό κάτω από τα γράμματα.
      (Το θόλωμα μετρήθηκε ότι ΔΕΝ κοστίζει — βλ. σημείωση πιο κάτω.)
   2) ΤΟ ΚΥΑΝΟ ΦΕΥΓΕΙ ΤΕΛΕΙΩΣ: ο Αντώνης δεν το ήθελε εδώ. Καμία χρωματιστή λάμψη·
      μόνο ουδέτερο σκούρο στο χρώμα του μελανιού, που πάνω σε ανοιχτό χάρτη ξεχωρίζει πιο καθαρά.
   3) ΤΟ ΓΛΟΥ ΓΙΝΕΤΑΙ ΔΑΧΤΥΛΙΔΙ ΠΟΥ ΠΑΛΛΕΙ ΓΥΡΩ-ΓΥΡΩ (::after, ΕΞΩ από την κάρτα,
      όχι μέσα της): ανοίγει και σβήνει σαν κύμα. Λέει «πάτησέ με» χωρίς να χρειάζεται
      δείκτης — σημασία σε tablet, όπου hover ΔΕΝ υπάρχει.
      ΠΑΛΛΕΙ ΜΟΝΟ ΣΤΗΝ ΠΛΗΡΗ ΠΡΟΒΟΛΗ — εκεί οι κάρτες είναι πράγματι πατήσιμες.
      Μέσα στο ζουμ σταματάει: η κάρτα δεν οδηγεί πουθενά και θα ήταν ψέμα — επιπλέον,
      εκεί ακριβώς πετάει η κάμερα, που είναι και η μόνη στιγμή που τα καρέ ζορίζουν. */
/* το transform-origin κάτω-δεξιά: η κάρτα είναι αγκυρωμένη εκεί πάνω στην
   καρφίτσα, άρα μεγαλώνει ΠΡΟΣ ΤΑ ΠΑΝΩ-ΑΡΙΣΤΕΡΑ και δεν πέφτει πάνω της. */
/* 24/8: πλάτος 15,5→17rem. Η κάρτα ήταν σχεδιασμένη να «σωστεύει» στο hover (+4,5%)·
   τώρα που η μεγέθυνση έφυγε, το κανονικό μέγεθος πρέπει να στέκει μόνο του. */
.mapcard{ transform-origin: 100% 100%; position: relative; width: 17rem; max-width: 62vw;
   /* 23/8, γ΄ πέρασμα: ακόμη πιο διάφανη (44% → 32%) και με ΑΚΡΗ ΓΥΑΛΙΟΥ:
      φωτεινή γραμμή στην πάνω πλευρά και σκοτεινή στην κάτω (inset). Γιατί: στην
      πλήρη προβολή οι κάρτες πέφτουν πάνω από θάλασσα και άδειο χάρτη — που είναι
      σχεδόν λευκός. Διαφάνεια πάνω σε λευκό ΔΕΝ ΦΑΙΝΕΤΑΙ — το μόνο που την κάνει
      αναγνωρίσιμη εκεί είναι η άκρη. */
   /* ⚠ ΔΙΔΑΓΜΑ 23/8 — ΤΟ ΠΟΛΥ ΘΟΛΩΜΑ ΚΡΥΒΕΙ ΤΗ ΔΙΑΦΑΝΕΙΑ, ΔΕΝ ΤΗΝ ΔΕΙΧΝΕΙ.
      Ο Αντώνης έλεγε τρεις φορές «δεν βλέπω τίποτα από πίσω» κι εγώ ανέβαζα το blur.
      Η δοκιμή το έδειξε: με τελείως διάφανο φόντο, το blur(26) έκανε τον χάρτη
      ΑΔΙΑΦΟΡΟΠΟΙΗΤΟ γκρι-λευκό — που μοιάζει ακριβώς με αδιάφανο λευκό.
      Με blur(10) ξεχωρίζουν οι δρόμοι και τα τετράγωνα — τΟΤΕ διαβάζεται ως γυαλί.
      Κανόνας: για να ΦΑΙΝΕΤΑΙ το γυαλί, χρειάζεται ΛΙΓΟ θόλωμα και ΛΙΓΟ λευκό. */
   background: rgba(255,255,255,.30); border-radius: 14px;
   /* 23/8: ΧΩΡΙΣ ΘΟΛΩΜΑ (δοκιμή Αντώνη) — μόνο διαφάνεια. */
   box-shadow: 0 14px 38px rgba(10,20,40,.14),
               inset 0 1px 0 rgba(255,255,255,.95),
               inset 0 -1px 0 rgba(21,23,29,.06); padding: .85rem .95rem;
   /* 23/8: ΛΕΥΚΟ ΠΕΡΙΓΡΑΜΜΑ (εντολή Αντώνη) — ήταν .45, σχεδόν αόρατο
      πάνω σε διάφανο φόντο. Κλείνει το σχήμα της κάρτας πάνω στον χάρτη. */
   border: 1px solid rgba(255,255,255,.92); cursor: pointer;
   opacity: 0; visibility: hidden; pointer-events: none;
   transition: box-shadow .25s var(--ease), background-color .25s var(--ease); }
.mapcard.is-on{ pointer-events: auto; }

/* ═══ ΦΩΤΟΓΡΑΦΙΑ ΚΤΙΡΙΟΥ ΜΕΣΑ ΣΤΗΝ ΚΑΡΤΑ (23/8) ═══
   Κρυμμένη παντού — εμφανίζεται ΜΟΝΟ όταν είμαστε ζουμαρισμένοι ΚΑΙ στην κάρτα
   του Κέντρου. Στην πλήρη προβολή οι κάρτες είναι μικρές και τρεις μαζί — δεν χωράει. */
.mapcard__photo{ display: none; margin: .7rem 0 0; }
/* 23/8 στ΄: όχι μόνο το Κέντρο — όποια κάρτα είναι ανοιχτή στο ζουμ
   δείχνει το δικό της κτίριο. Στο ζουμ είναι πάντα μία ανοιχτή. */
.mapsec.is-zoomed .mapcard.is-on .mapcard__photo{ display: block; }
.mapcard__photo img{ display: block; width: 100%; height: auto; aspect-ratio: 4 / 3;
   object-fit: cover; border-radius: 10px;
   border: 1px solid rgba(21,23,29,.08);
   box-shadow: 0 4px 14px rgba(10,20,40,.12); }
/* αν η εικόνα δεν φορτώσει, κρύβουμε το πλαίσιο αντί να μείνει σπασμένη */
.mapcard__photo.is-failed{ display: none !important; }

/* ΔΥΟ ΔΙΑΦΟΡΕΤΙΚΕΣ ΚΑΡΤΕΣ, ΑΝΑ ΚΑΤΑΣΤΑΣΗ (23/8, αίτημα Αντώνη).
   ΣΤΗΝ ΠΛΗΡΗ ΠΡΟΒΟΛΗ το γυαλί έχει νόημα: οι τρεις κάρτες καλύπτουν μεγάλο
   μέρος του χάρτη και θέλουμε να φαίνεται τι κρύβουν. 20% λευκό και μόλις 8px
   θόλωμα — οι δρόμοι παραμένουν αναγνωρίσιμοι (βλ. δίδαγμα παραπάνω).
   ΣΤΟ ΖΟΥΜ ΔΕΝ το χρειάζεται: μία κάρτα, πολύς χάρτης γύρω, και μετράει να
   διαβάζεται η διεύθυνση — γυρίζει στο λευκό που είχαμε αρχικά. */
/* 23/8: διαφάνεια 20% → 70% → 60% → 55% → 60% → 65% και θόλωμα 8 → 4 → 3 → 2px πίσω (εντολή Αντώνη).
   Το θόλωμα δεν είναι για να κρύψει τον χάρτη — είναι για να σβήσει τα ΓΡΑΜΜΑΤΑ του
   (ονόματα χωριών/δρόμων) ώστε να μην συναγωνίζονται το κείμενο της κάρτας. */
.mapsec:not(.is-zoomed) .mapcard{ background: rgba(255,255,255,.65);
   -webkit-backdrop-filter: blur(2px) saturate(1.4); backdrop-filter: blur(2px) saturate(1.4); }
.mapsec.is-zoomed .mapcard{ background: rgba(255,255,255,.96); }

/* ΣΚΙΑ ΠΟΥ ΠΑΛΛΕΤΑΙ ΑΠΟ ΠΙΣΩ (23/8, διόρθωση Αντώνη — η γραμμή δεν άρεσε).
   Το ψευδο-στοιχείο ΔΕΝ έχει ούτε περίγραμμα ούτε γέμισμα — μόνο μια απαλή εξωτερική
   σκιά. Το CSS κόβει την εξωτερική σκιά μέσα από το κουτί του στοιχείου, άρα φαίνεται
   ΜΟΝΟ γύρω-γύρω και ποτέ πάνω από την κάρτα — γι' αυτό δεν χρειάζεται z-index (το
   backdrop-filter φτιάχνει δικό του επίπεδο και ένα z-index:-1 θα έσκαζε).
   pointer-events: none — να μην κλέβει το άγγιγμα από την κάρτα. */
.mapcard::after{ content: ''; position: absolute; inset: 0; border-radius: 14px;
   box-shadow: 0 9px 30px 8px rgba(21,23,29,.26);
   opacity: 0; pointer-events: none; transform-origin: 50% 50%; }
.mapsec:not(.is-zoomed) .mapcard.is-on::after{ animation: cardpulse 3.2s ease-in-out infinite; }
/* μικρή κλιμάκωση ανά κάρτα: τρεις ταυτόχρονοι παλμοί διαβάζονται ως μηχανή */
/* με data-card και όχι nth-of-type: στην οθόνη κάθε κάρτα μετακομίζει μέσα στο
   δικό της περίβλημα δείκτη, άρα είναι πάντα η «πρώτη» — το nth-of-type δεν θα έπιανε ποτέ. */
/* ΤΟ ΚΥΜΑ: Γάζι (0) → Κέντρο (1) → Ούλωφ Πάλμε (2), με 0,5s διαφορά. */
.mapsec:not(.is-zoomed) .mapcard.is-on[data-card="1"]::after{ animation-delay: .5s; }
.mapsec:not(.is-zoomed) .mapcard.is-on[data-card="2"]::after{ animation-delay: 1s; }
/* ΕΝΔΙΑΜΕΣΟ (23/8, γ΄ ρύθμιση): σκιά .17 → .25 και κορύφωση 62% → 80%
   — ακριβώς στη μέση ανάμεσα στο πολύ αχνό και στο πολύ σκούρο. Η διάρκεια μένει 4s.
   Με ease-in-out και πλατιά κορύφωση, ώστε να «αναπνέει» αντί να χτυπάει. */
@keyframes cardpulse{
  0%   { transform: scale(.99);  opacity: 0; }
  45%  { transform: scale(1.022); opacity: .82; }
  100% { transform: scale(1.04); opacity: 0; }
}

/* Στο άγγιγμα/δείκτη: σταματάει ο παλμός (δεν χρειάζεται πλέον να σου τραβήξει το
   μάτι), μπαίνει σταθερό περίγραμμα, και το φόντο πυκνώνει για καθαρή ανάγνωση. */
/* 23/8: ΧΩΡΙΣ μαύρο περίγραμμα στο hover (εντολή Αντώνη).
   Μόνο πιο πυκνό φόντο + βαθύτερη σκιά. Η ΜΕΓΕΘΥΝΣΗ γίνεται με gsap στο
   branchmap.js — ΟΧΙ με CSS: το transform της κάρτας το γράφει ήδη το gsap
   (εμφάνιση/απόκρυψη) και ένα CSS transition θα το πατούσε. */
.mapsec:not(.is-zoomed) .mapcard:hover, .mapsec:not(.is-zoomed) .mapcard:focus-visible,
.mapsec:not(.is-zoomed) .mapcard:active{
   background: rgba(255,255,255,.84);
   box-shadow: 0 20px 48px rgba(10,20,40,.24); }
.mapcard:hover::after, .mapcard:focus-visible::after{ animation: none; opacity: 0; }

@media (prefers-reduced-motion: reduce){
  .mapsec:not(.is-zoomed) .mapcard.is-on::after{ animation: none; opacity: .5; transform: none; }
}
/* (η εφεδρεία για browsers χωρίς θόλωμα αφαιρέθηκε — δεν χρησιμοποιούμε πια θόλωμα) */

}
}
.mapcard:focus-visible{ outline: 2px solid var(--c-ink); outline-offset: 3px; }
/* ΣΤΕΝΗ ΟΘΟΝΗ — Η ΚΑΡΤΑ ΞΑΝΑΚΑΘΕΤΑΙ ΚΑΤΩ, ΜΙΑ ΚΑΘΕ ΦΟΡΑ (22/8, μετρημένο):
   τρεις κάρτες των 200px δεν χωράνε σε πλάτος 390 — επικαλύπτονταν και η μία έβγαινε 90px
   έξω από την οθόνη. Την κλάση is-stacked τη βάζει το branchmap.js όταν innerWidth < 700. */
/* ΜΟΝΟ ΣΤΟ ΖΟΥΜ πάει η κάρτα κάτω (26/8). Στην επισκόπηση κάθεται στην καρφίτσα της. */
.mapsec.is-stacked.is-zoomed .mapcard{ position: absolute; z-index: 3;
   left: var(--pad-x); right: var(--pad-x); bottom: clamp(1.6rem, 6vh, 3rem);
   width: auto; max-width: none; padding: 1rem 1.1rem; }
.mapsec.is-stacked.is-zoomed .mapcard__name{ font-size: 1.3rem; }
.mapsec.is-stacked.is-zoomed .mapcard__addr{ font-size: .95rem; }
.mapsec.is-stacked.is-zoomed .mapcard__meta{ font-size: .8rem; }

/* ═══ ΚΙΝΗΤΟ: ΤΡΕΙΣ ΚΑΡΤΕΣ ΣΤΟΙΒΑΓΜΕΝΕΣ, ΣΑΝ ΚΟΥΜΠΙΑ (27/8) ═══
   ΤΙ ΖΗΤΗΘΗΚΕ: «τη μία κάτω από την άλλη, από το σημείο που λέει προς Βασιλειές και κάτω,
   να φαίνονται 3 κουμπιά».
   ΓΙΑΤΙ ΟΧΙ ΠΑΝΩ ΣΤΙΣ ΚΑΡΦΙΤΣΕΣ (η προηγούμενη προσπάθεια): το maplibre τοποθετεί τους
   markers με position:absolute πάνω στο ίδιο το στοιχείο. Όταν του άλλαξα τη θέση σε
   relative για να μετρήσω από εκεί, ο marker βγήκε από τον έλεγχό του και οι κάρτες
   πετάχτηκαν εκτός οθόνης. Εδώ δεν ακουμπάμε καθόλου το maplibre.
   ΣΤΟΙΒΑ ΑΠΟ ΤΟΝ ΠΑΤΟ: η τελευταία κάθεται χαμηλά και οι προηγούμενες ανεβαίνουν από πάνω
   της, ώστε να μη χοροπηδά η διάταξη καθώς εμφανίζονται μία-μία με την κύλιση. */
.mapsec.is-stacked:not(.is-zoomed) .mapcard{
  position: static; width: auto; max-width: none;
  padding: .7rem .85rem; border-radius: 12px; min-height: 56px; }
.mapsec.is-stacked:not(.is-zoomed) .mapcard__eyebrow{ font-size: .6rem; letter-spacing: .09em; }
.mapsec.is-stacked:not(.is-zoomed) .mapcard__name{ font-size: 1.08rem; margin: .05rem 0 .12rem; }
.mapsec.is-stacked:not(.is-zoomed) .mapcard__addr{ font-size: .78rem; margin: 0; }
.mapsec.is-stacked:not(.is-zoomed) .mapcard__meta,
.mapsec.is-stacked:not(.is-zoomed) .mapcard__photo,
.mapsec.is-stacked:not(.is-zoomed) .mapcard__btn{ display: none !important; }

/* Η ΣΤΟΙΒΑ. Κάθεται στον πάτο και απλώνεται προς τα πάνω· το gap είναι μικρό ώστε τα τρία
   να διαβάζονται ως ΟΜΑΔΑ κουμπιών, όχι ως τρεις άσχετες κάρτες. */
.mapsec__stack{ display: none; }
.mapsec.is-stacked:not(.is-zoomed) .mapsec__stack{
  display: flex; flex-direction: column; justify-content: flex-end; gap: .5rem;
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 3;
  padding: 0 var(--pad-x) calc(1.1rem + env(safe-area-inset-bottom, 0px));
  pointer-events: none; }
.mapsec.is-stacked:not(.is-zoomed) .mapsec__stack > .mapcard{ pointer-events: auto; }

/* ═══ ΤΟ ΖΟΥΜ ΣΕ ΚΙΝΗΤΟ ΕΠΝΙΓΕ ΤΟΝ ΧΑΡΤΗ (26/8 — φωτογραφίες Αντώνη) ═══
   Η κάρτα έπιανε πάνω από τα δύο τρίτα της οθόνης: η φωτογραφία σε 4:3 πλήρους πλάτους είναι
   μόνη της ~290px. «Δεν μπορώ να δω κάτι» — και είχε δίκιο, ο χάρτης από κάτω εξαφανιζόταν.
   ΤΟ ΟΡΙΟ ΕΙΝΑΙ ΣΕ ΥΨΟΣ ΟΘΟΝΗΣ, ΟΧΙ ΣΕ ΠΛΑΤΟΣ: 22svh για τη φωτογραφία κρατά την κάρτα κάτω
   από το μισό της οθόνης σε κάθε τηλέφωνο. Το object-fit: cover κόβει, δεν παραμορφώνει. */
@media (max-width: 699.98px){
  .mapsec.is-stacked.is-zoomed .mapcard__photo img{ height: 22svh; aspect-ratio: auto;
     object-fit: cover; }
  .mapsec.is-stacked.is-zoomed .mapcard__photo{ margin-top: .5rem; }
  .mapsec.is-stacked.is-zoomed .mapcard__meta{ line-height: 1.3; }
}
/* 24/8 (εντολή Αντώνη: «φαίνονται πολύ μικρά»). Το eyebrow ήταν δηλωμένο ΔΥΟ ΦΟΡΕΣ —
   .72rem και αμέσως μετά .64rem, οπότε κέρδιζε το μικρό. Έμεινε ΕΝΑ, στο μεγάλο.
   Τα υπόλοιπα ανέβηκαν ~10%, στα μεγέθη που ήδη χρησιμοποιεί η στοιβαγμένη μορφή. */
.mapcard__eyebrow{ font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
   font-weight: 700; color: var(--c-teal-500); }
.mapcard__name{ font-family: var(--f-hero); font-weight: 300; letter-spacing: -.01em;
   font-size: 1.4rem; line-height: 1.12; margin: .1rem 0 .25rem; }
.mapcard__addr{ color: var(--c-ink); line-height: 1.35; margin: 0 0 .2rem; font-size: .96rem;
   font-weight: 600; }
.mapcard__meta{ color: var(--c-ink-mute); font-size: .82rem; line-height: 1.35; margin: 0 0 .55rem; }
/* Οι σειρές του meta ως ξεχωριστές γραμμές (22/8, εντολή Αντώνη). Οι δύο τελευταίες
   (νέος χώρος / μεταφορά) ΔΕΝ σπάνε — ζητήθηκε ρητά «σε μία γραμμή». */
.mapcard__meta span{ display: block; }
.mapcard__meta .mc-nw{ white-space: nowrap; }
/* ΟΒΑΛ ΚΟΥΜΠΙ ΚΑΤΩ ΑΠΟ ΤΗ ΦΩΤΟΓΡΑΦΙΑ (24/8, εντολή Αντώνη — ήταν υπογραμμισμένο κείμενο).
   Γιατί γεμάτο πλάτος και όχι στενό οβάλ γύρω από τις λέξεις: η κάρτα είναι 15,5rem και
   δουλεύεται με ΔΑΧΤΥΛΟ σε tablet. Γεμάτο πλάτος = στόχος αφής όλη η βάση της κάρτας,
   αντί για ένα λεπτό κείμενο 12px. Ύψος 44px — το κατώφλι αφής, όχι στρογγυλοποίηση. */
/* ΤΟ ΚΟΥΜΠΙ ΜΟΝΟ ΜΕΣΑ ΣΤΟ ΖΟΥΜ (24/8, εντολή Αντώνη). Στην επισκόπηση οι τρεις κάρτες
   είναι μικρές και η ίδια η κάρτα ΕΙΝΑΙ το κουμπί (πατάς και ζουμάρει) — δεύτερο κουμπί
   εκεί μέσα θα ήταν θόρυβος. Ίδιος κανόνας με τη φωτογραφία, ακριβώς από πάνω. */
.mapcard__btn{ display: none; }
.mapsec.is-zoomed .mapcard.is-on .mapcard__btn{ display: flex; align-items: center; justify-content: center; gap: .4rem;
   width: 100%; min-height: 44px; margin-top: .7rem; padding: .5rem .9rem;
   background: var(--c-surface-tint); color: var(--c-ink);
   border: 1px solid var(--c-border-soft); border-radius: 999px;
   font-weight: 600; font-size: .82rem; letter-spacing: .01em;
   text-decoration: none; text-align: center;
   transition: background-color .2s var(--ease), border-color .2s var(--ease); }
.mapcard__btn:hover, .mapcard__btn:focus-visible{
   background: var(--c-ink); color: #fff; border-color: var(--c-ink); outline: none; }
.mapcard__btn:focus-visible{ box-shadow: 0 0 0 3px var(--c-accent); }
/* ΖΟΥΜΑΡΙΣΜΕΝΗ ΚΑΡΤΑ: ΔΕΝ ΠΑΤΙΕΤΑΙ (24/8, εντολή Αντώνη).
   Στην επισκόπηση η κάρτα είναι κουμπί που ζουμάρει. Μέσα στο ζουμ δεν έχει πού να πάει,
   οπότε το χεράκι ήταν ψεύτικη υπόσχεση — έμενε μόνο το «Άνοιγμα στους χάρτες».
   ⚠ ΓΙΑΤΙ ΟΧΙ pointer-events:none ΣΤΗΝ ΚΑΡΤΑ: από πίσω της περνάει η ενότητα «Στην
   εκπαίδευση από το 2010» με το CTA προς profil.html (οι δύο ενότητες επικαλύπτονται
   με margin-top:-100svh). Αν η κάρτα γινόταν διάφανη στα κλικ, το πάτημα θα περνούσε
   από κάτω και θα σε πήγαινε στο προφίλ. Άρα: η κάρτα ΠΙΑΝΕΙ το κλικ και δεν κάνει τίποτα. */
.mapsec.is-zoomed .mapcard.is-on{ cursor: default; }
.mapsec.is-zoomed .mapcard.is-on .mapcard__btn{ cursor: pointer; }

/* ═══ ΣΗΜΑ ΚΥΛΙΣΗΣ ΣΤΟ HERO (24/8) ═══
   Πιστή μεταφορά του scroll-down.lottie σε SVG. Το «Trim Paths» του Lottie ΕΙΝΑΙ
   stroke-dasharray: η γραμμή μεγαλώνει από 0 σε 6 (ζωγραφίζεται κάτω), μετά ολισθαίνει
   κατά -6 (σβήνει από πάνω). Χρονισμός ίδιος με το πρωτότυπο: 3 δευτ., 1/3 ανά φάση.
   ΣΒΗΝΕΙ ΜΟΛΙΣ ΚΥΛΙΣΕΙ ο επισκέπτης — η οδηγία έχει νόημα μόνο πριν την ακολουθήσει. */
/* ═══ ΘΕΣΗ: ΠΕΝΤΕ ΕΤΟΙΜΕΣ ΕΠΙΛΟΓΕΣ (25/8) ═══
   Άλλαξε ΜΟΝΟ την κλάση στο index.html και δες την:
     scrollhint--kentro    → νεκρό κέντρο του hero            (η τρέχουσα επιλογή)
     scrollhint--pano      → κέντρο, ψηλά (κάτω από το μενού)
     scrollhint--dexia     → δεξιά άκρη, στο μέσο του ύψους
     scrollhint--kato-aris → κάτω αριστερά (η δική μου πρόταση — βλ. σχόλιο παρακάτω)
     (καμία)               → κάτω κέντρο, όπως ήταν αρχικά
   Η ΘΕΣΗ ΗΡΕΜΙΑΣ ζει στη μεταβλητή --sh-t. Το .is-gone τη διαβάζει και προσθέτει μόνο τη
   μετατόπιση φυγής — γι' αυτό γράφεται μία φορά και ισχύει παντού. */
.scrollhint{ position: absolute; z-index: 4; display: block; width: 32px; height: 32px;
   color: #fff; opacity: .78; transition: opacity .45s var(--ease), transform .45s var(--ease);
   --sh-t: translateX(-50%);
   left: 50%; bottom: clamp(1.1rem, 3vh, 2.2rem); transform: var(--sh-t); }

/* ΝΕΚΡΟ ΚΕΝΤΡΟ. ⚠ ΤΟ ΡΙΣΚΟ ΤΟΥ: το hero ΕΙΝΑΙ βίντεο. Ένα στρογγυλό εικονίδιο ακριβώς στο
   κέντρο ενός βίντεο το διαβάζει ο κόσμος ως ΚΟΥΜΠΙ PLAY και το πατάει περιμένοντας
   αναπαραγωγή. Είναι η μόνη θέση με αυτό το πρόβλημα. */
.scrollhint--kentro{ --sh-t: translate(-50%, -50%);
   left: 50%; top: 50%; bottom: auto; transform: var(--sh-t); }

/* ΨΗΛΑ ΣΤΟ ΚΕΝΤΡΟ. Το clamp το κρατά κάτω από τη σταθερή μπάρα του μενού σε κάθε ύψος. */
.scrollhint--pano{ --sh-t: translateX(-50%);
   left: 50%; top: clamp(5.5rem, 14vh, 9rem); bottom: auto; transform: var(--sh-t); }

/* ΔΕΞΙΑ ΑΚΡΗ, ΣΤΟ ΜΕΣΟ ΤΟΥ ΥΨΟΥΣ. Μακριά από την ατάκα, που κάθεται κάτω δεξιά. */
.scrollhint--dexia{ --sh-t: translateY(-50%);
   right: var(--pad-x); left: auto; top: 50%; bottom: auto; transform: var(--sh-t); }

/* ΔΙΠΛΑ ΣΤΟ ΛΟΓΟΤΥΠΟ — η δική σου δεύτερη σκέψη («δεξιά από το λογότυπο, πριν έρθουν τα
   άλλα γράμματα»). ΜΕΤΡΗΜΕΝΟ: το λογότυπο πιάνει x 40-119 και το μενού x 1365-1417· η λωρίδα
   ανάμεσά τους (x 120-1365, y 0-100) είναι εντελώς άδεια. */
.scrollhint--dipla-logo{ --sh-t: translateX(0);
   left: clamp(8.5rem, 11vw, 11rem); top: clamp(1.4rem, 2.6vh, 2.4rem);
   right: auto; bottom: auto; transform: var(--sh-t); }

/* ΚΑΤΩ ΑΡΙΣΤΕΡΑ — Η ΠΡΟΤΑΣΗ ΜΟΥ. Η ατάκα είναι κάτω ΔΕΞΙΑ και το λογότυπο πάνω αριστερά·
   η κάτω αριστερή γωνία είναι η μόνη πραγματικά άδεια. Μένει και χαμηλά, που είναι το
   νόημα ενός σήματος κύλισης: «υπάρχει κι άλλο από κάτω». */
/* ⚠ ΟΧΙ «--sh-t: none». ΤΟ ΜΕΤΡΗΣΑ: το .is-gone γράφει «var(--sh-t) translateY(10px)» — με
   τιμή «none» αυτό γίνεται «none translateY(10px)», που είναι ΑΚΥΡΗ δήλωση, ο browser την
   πετάει ολόκληρη και το εικονίδιο έφευγε 0px αντί για 10px. Το translateX(0) είναι ουδέτερο
   και έγκυρο σε σύνθεση. */
.scrollhint--kato-aris{ --sh-t: translateX(0);
   left: var(--pad-x); right: auto; bottom: clamp(1.6rem, 4vh, 3rem); top: auto; transform: var(--sh-t); }
.scrollhint svg{ display: block; width: 100%; height: 100%; overflow: visible;
   /* Το βίντεο του hero αλλάζει καρέ: σε ανοιχτό πεζοδρόμιο το λευκό εικονίδιο χανόταν.
      Απαλή σκιά ώστε να διαβάζεται σε ΚΑΘΕ καρέ, χωρίς να γίνεται βαρύ. */
   filter: drop-shadow(0 1px 3px rgba(0,0,0,.55)); }
.scrollhint__mouse{ fill: none; stroke: currentColor; stroke-width: 2; }
.scrollhint__wheel{ fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round;
   animation: scrollwheel 3s cubic-bezier(.4,0,.6,1) infinite; }
@keyframes scrollwheel{
  0%   { stroke-dasharray: 0 6; stroke-dashoffset: 0; }
  33%  { stroke-dasharray: 6 6; stroke-dashoffset: 0; }
  66%  { stroke-dasharray: 6 6; stroke-dashoffset: -6; }
  100% { stroke-dasharray: 6 6; stroke-dashoffset: -6; }
}
.scrollhint:hover{ opacity: 1; }
/* ΜΙΑ ΓΡΑΦΗ ΓΙΑ ΟΛΕΣ ΤΙΣ ΘΕΣΕΙΣ: κρατά τη θέση ηρεμίας και προσθέτει 10px προς τα κάτω.
   Χωρίς το --sh-t, το εικονίδιο θα «πηδούσε» στη γωνία τη στιγμή που φεύγει. */
.scrollhint.is-gone{ opacity: 0; transform: var(--sh-t, none) translateY(10px); pointer-events: none; }
@media (prefers-reduced-motion: reduce){
  .scrollhint__wheel{ animation: none; stroke-dasharray: 6 6; stroke-dashoffset: 0; }
}

.section--overmap{ position: relative; z-index: 2; margin-top: -100svh; }

/* καρφίτσα παραρτήματος */
/* ΚΑΡΦΙΤΣΑ ΠΑΡΑΡΤΗΜΑΤΟΣ (22/8, εντολή Αντώνη - αντικατέστησε τον πράσινο κύκλο):
   μαύρος στρογγυλός δίσκος με το «Μ» μέσα, πιο μεγάλος για να διαβάζεται, και από κάτω λεπτό
   στέλεχος που καταλήγει σε κουκκίδα. Η ΚΟΥΚΚΙΔΑ είναι το ακριβές σημείο - όχι ο δίσκος
   (γι αυτό ο marker αγκυρώνεται bottom με 5px μετατόπιση: μισή κουκκίδα). */
.bpin{ display: flex; flex-direction: column; align-items: center; line-height: 0;
   filter: drop-shadow(0 8px 18px rgba(10,20,40,.28)); }
/* ΤΟ ΕΣΩΤΕΡΙΚΟ ΠΟΥ ΚΙΝΕΙΤΑΙ — το εξωτερικό .bpin το κρατά το maplibre για τη θέση. */
/* ΞΕΚΙΝΑ ΑΟΡΑΤΟ (23/8 — το λάθος που εντόπισε ο Αντώνης): χωρίς αυτό, οι τρεις
   καρφίτσες ήταν ήδη στη θέση τους από το πρώτο καρέ και το bpinpop έπαιζε από πάνω τους.
   Το animation είναι «both», άρα τελειώνοντας κρατάει opacity 1. */
.bpin__in{ display: flex; flex-direction: column; align-items: center;
   transform-origin: 50% 100%; opacity: 0; }

/* ═══ ΕΙΣΟΔΟΣ ΚΑΡΦΙΤΣΑΣ — ΑΝΤΙΓΡΑΦΗ ΑΠΟ ΤΟ .lottie ΤΟΥ ΑΝΤΩΝΗ (23/8) ═══
   Η πρώτη μου εκδοχή ήταν ΠΤΩΣΗ με ζούληγμα. Λάθος: άνοιξα το αρχείο «Living location.lottie»
   (είναι zip — μέσα του animations/12345.json) και διάβασα τα πραγματικά keyframes του layer
   «Locator», στα 60 καρέ/δευτ.:
       κλίμακα    καρέ 0 → 16   : 0% → 100%
       περιστροφή καρέ 0        : −61,91°
                  καρέ 29       : +17,265°
                  καρέ 55       : −4,635°
                  καρέ 66       : 0°
       κέντρο περιστροφής: anchor [0, 84.696] — δηλαδή ΚΑΤΩ από το σχήμα, στη μύτη.
   Δεν είναι πτώση· είναι ΕΚΚΡΕΜΕΣ: πετάγεται από το σημείο γερμένη αριστερά, γυρίζει δεξιά
   και ταλαντεύεται ώσπου να ισορροπήσει. Τα καρέ 28-76 (οι τρεις «φούσκες» L/M/R) ΔΕΝ
   αντιγράφηκαν — ο Αντώνης τις εξαίρεσε ρητά.
   Διάρκεια: 66 καρέ / 60fps = 1,1s. Τα ποσοστά είναι τα καρέ διαιρεμένα με το 66. */
@keyframes bpinpop{
  0%   { opacity: 0; transform: scale(0)  rotate(-61.91deg); animation-timing-function: cubic-bezier(.18,.7,.3,1); }
  24%  { opacity: 1; transform: scale(1)  rotate(-18.8deg);  animation-timing-function: cubic-bezier(.35,0,.25,1); }
  44%  {             transform: scale(1)  rotate(17.27deg);  animation-timing-function: cubic-bezier(.4,0,.3,1); }
  83%  {             transform: scale(1)  rotate(-4.64deg);  animation-timing-function: cubic-bezier(.4,0,.2,1); }
  100% { opacity: 1; transform: scale(1)  rotate(0deg); }
}
.bpin__in.is-drop{ animation: bpinpop 1.1s linear both; }
@media (prefers-reduced-motion: reduce){
  .bpin__in.is-drop{ animation: none; opacity: 1; } }
.bpin__disc{ width: 46px; height: 46px; border-radius: 50%; background: var(--c-ink);
   display: grid; place-items: center;
   transition: transform .4s cubic-bezier(.2,.8,.2,1); }
.bpin__disc img{ width: 23px; height: auto; display: block; }
.bpin__stem{ width: 2px; height: 13px; background: var(--c-ink); }
.bpin__dot{ width: 9px; height: 9px; border-radius: 50%; background: var(--c-ink);
   box-shadow: 0 0 0 3px rgba(255,255,255,.9); }
.bpin.is-active .bpin__disc{ transform: scale(1.12); }

/* ΕΤΙΚΕΤΕΣ ΣΗΜΕΙΩΝ ΑΝΑΦΟΡΑΣ (Βενιζέλειο, «προς Βασιλειές»). Το style δείχνει τα δικά του POI
   μόνο από ζουμ 13,5 - η εποπτεία είναι ~12,4, οπότε τα γράφουμε εμείς. Διακριτικά: είναι
   σημεία προσανατολισμού, δεν ανταγωνίζονται τα παραρτήματα. */
.mlabel{ white-space: nowrap; font-size: .74rem; letter-spacing: .01em; color: var(--c-ink-soft);
   background: rgba(240,241,250,.82); padding: .18rem .42rem; border-radius: 6px;
   -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); pointer-events: none; }
/* ΔΙΚΗ ΜΑΣ ΕΝΔΕΙΞΗ ΚΑΤΕΥΘΥΝΣΗΣ — κρατάει πλαίσιο, γιατί ΔΕΝ είναι όνομα του χάρτη:
   είναι σχόλιο δικό μας («ο δρόμος πάει προς...»), και πρέπει να ξεχωρίζει ως τέτοιο. */
.mlabel--note{ font-style: italic; color: var(--c-ink-mute); background: rgba(240,241,250,.7);
   display: inline-flex; align-items: center; gap: .3rem; }
.mlabel__arrow{ width: 13px; height: 13px; flex: none; }
/* 23/8 (εντολή Αντώνη): «κάν' τα όπως το προς Βασιλειές» — με το ίδιο απαλό
   πλαίσιο και πλάγια γράμματα. Γίνεται με ΠΡΟΣΘΕΤΗ κλάση ώστε να ΜΗΝ αλλάξει
   τίποτα στη θέση ή την κλίση τους — μόνο η όψη. */
/* ΤΟΝΙΣΜΕΝΟ ΣΧΟΛΕΙΟ — ίδια όψη με τα τονισμένα σχολεία του χάρτη (23/8 γ΄),
   για όσα δεν υπάρχουν στα δεδομένα και τα βάζουμε εμείς (π.χ. το 17ο). */
.mapsec.is-zoomed .mlabel--school{ font-weight: 700; color: #3C4350; font-size: .86rem; }
.mlabel--soft{ font-style: italic; color: var(--c-ink-mute);
   background: rgba(240,241,250,.7); padding: .18rem .42rem; border-radius: 6px;
   -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
   text-shadow: none; }
.mapsec.is-zoomed .mlabel--soft{ font-size: .8rem; font-weight: 500;
   color: var(--c-ink-mute); }
.mlabel--note .mlabel__arrow:first-child{ margin-right: .1rem; }

/* ΕΤΙΚΕΤΑ «ΤΟΥ ΧΑΡΤΗ» (22/8, αίτημα Αντώνη: «βάλ' το σαν να φαίνεται στον χάρτη, όχι σε
   πλαίσιο»). Οι τιμές ΔΕΝ είναι διαλεγμένες με το μάτι — διαβάστηκαν από το ίδιο το style
   των πλακιδίων: text-color #989EAA, λευκό περίγραμμα 1px, μέγεθος 11-12px. Έτσι τα ονόματα
   που προσθέτουμε εμείς κάθονται δίπλα στα ονόματα του OpenStreetMap χωρίς να ξεχωρίζουν. */
/* ΣΗΜΕΙΑ ΑΝΑΦΟΡΑΣ — ΤΟΝΙΣΜΕΝΑ (23/8, εντολή Αντώνη: «τόνισε τη ΔΕΗ, τον Σκλαβενίτη, το
   Βενιζέλειο, το Κηποθέατρο — με πλαίσιο, πιο μεγάλα γράμματα»).
   ΓΙΑΤΙ ΞΕΧΩΡΙΖΟΥΝ ΑΠΟ ΤΑ ΔΡΟΜΩΝΥΜΑ: δεν είναι ισότιμη πληροφορία. Τα ονόματα δρόμων είναι
   ΥΠΟΒΑΘΡΟ — βοηθούν όποιον ήδη ξέρει την περιοχή. Τα σημεία αναφοράς είναι ΟΔΗΓΙΑ: «είμαστε
   δίπλα στον Σκλαβενίτη». Άρα τα δρομώνυμα μένουν διακριτικά, σαν του χάρτη· τα σημεία
   αναφοράς φωνάζουν. */
/* ΕΠΟΠΤΕΙΑ: ΜΟΝΟ ΕΛΑΦΡΥ ΥΠΟΒΑΘΡΟ (23/8, διόρθωση Αντώνη). Ίδιο μέγεθος και βάρος γραμμάτων
   με τα δρομώνυμα — αλλάζει ΜΟΝΟ ότι αποκτούν φόντο, όπως το «προς Βασιλειές». Έτσι ξεχωρίζουν
   από το υπόβαθρο του χάρτη χωρίς να μεγαλώνουν και χωρίς να χρειάζεται να μετακινηθούν από τη
   θέση τους. Η προηγούμενη εκδοχή (μεγάλα γράμματα + λευκό πλαίσιο) έπιανε ~50×29px και τα
   τρία σημεία του Γαζιού, που απέχουν 17-65px, δεν χωρούσαν — αναγκαζόμουν να τα μετακινήσω
   μακριά από τις κουκκίδες τους. Λάθος ανταλλαγή. */
.mlabel--place{ font-size: .74rem; letter-spacing: .01em; color: var(--c-ink-soft);
   background: rgba(240,241,250,.82); padding: .18rem .42rem; border-radius: 6px;
   -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px); }

/* ΣΤΟ ΖΟΥΜ ΟΜΩΣ, ΤΟ ΔΥΝΑΤΟ (ρητό αίτημα): εκεί υπάρχει άπλετος χώρος — δύο-τρεις ετικέτες σε
   ολόκληρη οθόνη — και το σημείο αναφοράς είναι η ΧΡΗΣΙΜΗ πληροφορία («είμαστε δίπλα στη ΔΕΗ»).
   Την κλάση is-zoomed τη βάζει το branchmap.js όταν κάνεις κλικ σε κάρτα. */
.mapsec.is-zoomed .mlabel--place{ font-size: .86rem; font-weight: 600; color: var(--c-ink);
   background: rgba(255,255,255,.92); padding: .24rem .55rem; border-radius: 8px;
   border: 1px solid var(--c-border-soft); box-shadow: 0 4px 14px rgba(10,20,40,.10);
   -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.mlabel--map{ background: none; -webkit-backdrop-filter: none; backdrop-filter: none;
   padding: 0; border-radius: 0; color: #989EAA; font-size: .72rem; font-weight: 500;
   letter-spacing: .015em;
   text-shadow: 0 0 2px #fff, 0 0 2px #fff, 0 0 4px #fff, 1px 0 1px #fff, -1px 0 1px #fff,
                0 1px 1px #fff, 0 -1px 1px #fff; }
.mlabel__dot{ width: 6px; height: 6px; border-radius: 50%; background: var(--c-ink-mute);
   box-shadow: 0 0 0 2px rgba(255,255,255,.85); pointer-events: none; }
/* ...αλλά στο ζουμ μεγαλώνει μαζί με την ετικέτα, για να μη μοιάζει ξεχασμένη */
.mapsec.is-zoomed .mlabel__dot{ width: 8px; height: 8px; background: var(--c-ink);
   box-shadow: 0 0 0 2.5px rgba(255,255,255,.95); }

@media (max-width: 699.98px){
  /* σε κινητό το σταθερό λογότυπο είναι το 44px της μπάρας (ζώνη 14-58px) — ο τίτλος ανεβαίνει */
  .mapsec__head{ left: var(--pad-x); right: var(--pad-x); top: clamp(4.6rem, 9vh, 6rem);
     max-width: none; text-align: left; }
  /* σε κινητό δΕΝ χωράει μία γραμμή (θέλει ~430px στα 375) — ξανασπάει κανονικά */
  .mapsec__head h2{ white-space: normal; font-size: clamp(2.2rem, 1.4rem + 3.2vw, 4.4rem); }
  .mapcard{ width: 12.5rem; padding: .7rem .8rem; }
  .mapcard__name{ font-size: 1.05rem; }
  .mapcard__addr{ font-size: .8rem; }
  .bpin__disc{ width: 38px; height: 38px; }
  .bpin__disc img{ width: 19px; }
}
/* Ο χάρτης είναι ΦΟΝΤΟ (interactive:false, 22/8) - δεν αγγίζει καθόλου την κύλιση, οπότε
   δεν χρειάζεται ούτε το «cooperative gestures» μήνυμα ούτε ο δείκτης-χεράκι. */
.mapsec .maplibregl-cooperative-gesture-screen{ display: none !important; }

/* ═══════════ ΕΚΠΑΙΔΕΥΤΙΚΑ ΠΡΟΓΡΑΜΜΑΤΑ — μεγάλη τυπογραφική λίστα (11/8) ═══════════
   Manrope Light. Το μπλοκ των ονομάτων κάθεται ΔΕΞΙΑ (justify-self: end), τα κείμενα
   είναι ΑΡΙΣΤΕΡΑ στοιχισμένα μέσα του, και καμία λέξη δεν σπάει (nowrap).
   Η υπογράμμιση μπαίνει στο <a> — άρα έχει το πλάτος της κάθε λέξης, όπως στο πρότυπο. */
/* Το μπλοκ που ΚΑΛΥΠΤΕΙ το σταθερό hero (15/8):
   • z-index 1 πάνω από το sticky hero (z-0) — χωρίς αυτό το hero, ως positioned, θα ζωγραφιζόταν από πάνω.
   • αδιαφανές φόντο — αλλιώς θα φαινόταν το βίντεο από πίσω.
   • margin-top = ο «διάδρομος»: όσο διαρκεί αυτό το κενό, το hero μένει κολλημένο και τρέχει
     το ταξίδι του λογοτύπου + η ατάκα. Μόλις τελειώσει, αρχίζει η κάλυψη. Ίδια τιμή με το
     end του ScrollTrigger στο initHeroTravel (60svh) — αν αλλάξει το ένα, αλλάζει και το άλλο. */
/* ═══ Η ΓΡΑΜΜΗ ΠΕΡΝΑ ΠΙΣΩ ΑΠΟ ΤΟΥΣ ΤΙΤΛΟΥΣ (απόφαση Αντώνη 19/8) ═══
   ΤΟ ΠΡΟΒΛΗΜΑ: η γραμμή ζει μέσα στο .showreel (z-index 2) και ξεχειλίζει προς τα ΠΑΝΩ,
   μέσα σε αυτό εδώ το section. Με z-index 1 εδώ, όλο το section — φόντο ΚΑΙ τίτλοι μαζί —
   έμπαινε κάτω από το 2 του showreel, άρα η γραμμή ζωγραφιζόταν πάνω στα γράμματα.
   ΓΙΑΤΙ ΔΕΝ ΑΡΚΕΙ ΤΟ z-index ΣΤΟΥΣ ΤΙΤΛΟΥΣ: το z-index εδώ έφτιαχνε ΣΤΟΙΒΑ (stacking
   context) — ό,τι τιμή κι αν έπαιρναν τα παιδιά, έμεναν παγιδευμένα κάτω από το 2.
   ΓΙΑΤΙ ΔΕΝ ΑΡΚΕΙ ΝΑ ΓΙΝΕΙ ΔΙΑΦΑΝΕΣ ΤΟ ΦΟΝΤΟ: το αδιαφανές φόντο είναι που ΚΑΛΥΠΤΕΙ το
   κολλημένο βίντεο του hero (z-0) — χωρίς αυτό ξαναφαίνεται το βίντεο από πίσω (bug 15/8).
   Η ΛΥΣΗ: z-index:auto εδώ (δεν φτιάχνει πια στοίβα) και τα δύο πράγματα σε ΞΕΧΩΡΙΣΤΑ
   επίπεδα που ανταγωνίζονται ελεύθερα το showreel:
     hero 0  <  φόντο 1  <  γραμμή/showreel 2  <  τίτλοι 3                                */
.proglist-sec{ position: relative; z-index: auto; margin-top: 60svh; background: transparent; }
/* το φόντο που καλύπτει το hero — δικό του επίπεδο, ΚΑΤΩ από τη γραμμή */
.proglist-sec::before{ content: ''; position: absolute; inset: 0; z-index: 1; background: var(--c-bg); }
/* ═══ ΤΟΞΟ ΣΤΗΝ ΠΑΝΩ ΑΚΜΗ — «arc scroll transition» (21/8, αίτημα Αντώνη με βίντεο αναφοράς Osmo) ═══
   ΤΙ ΚΑΝΕΙ: καθώς το λευκό πλαίσιο ανεβαίνει πάνω από το hero, η πάνω ακμή του δεν είναι ευθεία —
   είναι ΜΙΣΗ ΕΛΛΕΙΨΗ με την κορυφή στο κέντρο και τις άκρες στις γωνίες της οθόνης. Όσο ανεβαίνει,
   το τόξο χαμηλώνει, κι όταν το πλαίσιο φτάσει στην κορυφή είναι ευθεία (μετρήθηκε στο βίντεο:
   μεγάλο τόξο στην είσοδο, μικρότερο στη μέση, επίπεδο στο τέλος).
   ΠΩΣ: ένα ψευδο-στοιχείο ΠΑΝΩ από το πλαίσιο, ίδιο χρώμα, ύψος = το βέλος του τόξου (--arc-h),
   κομμένο με clip-path σε ΚΥΚΛΙΚΟ τόξο (--arc-path, το γράφει το motion.js): από την κάτω-αριστερή
   γωνία, πάνω από την κορυφή στο κέντρο, στην κάτω-δεξιά. Ακτίνα από χορδή (πλάτος) και βέλος:
   R = (W²/4 + S²) / 2S. ΟΧΙ border-radius: δοκιμάστηκε (21/8) και οι άκρες έπεφταν κατακόρυφα,
   σαν ταφόπλακα — το Osmo ακουμπά τις γωνίες με κλίση, δηλαδή κύκλος, όχι έλλειψη.
   Το βέλος --arc-h το γράφει το motion.js (syncHeroExit) από τη θέση του πλαισίου: πλήρες όταν
   μπαίνει από κάτω, μηδέν όταν φτάνει πάνω. 1px επικάλυψη για να μη φαίνεται ραφή. Ίδιο z (1) με
   το φόντο: κάτω από τη γραμμή (2) και τους τίτλους (3). ΚΟΣΤΟΣ: ένα clip-path, καμία σκίαση/
   θόλωση — φθηνό και σε αδύναμο tablet. */
.proglist-sec{ --arc-h: 0px; --arc-path: none; }
.proglist-sec::after{ content: ''; position: absolute; left: 0; right: 0; z-index: 1; pointer-events: none;
   top: calc(1px - var(--arc-h)); height: calc(var(--arc-h) + 1px); background: var(--c-bg);
   clip-path: var(--arc-path); }
/* οι τίτλοι — ΠΑΝΩ από τη γραμμή */
.proglist{ position: relative; z-index: 3; }
.proglist{ display: grid; grid-template-columns: 1fr auto; align-items: start;
   gap: clamp(1rem, 3vw, 2.5rem);
   /* 15/8: μικρότερο section (αίτημα «μείωσε λίγο, να μην είναι τόσο μεγάλο»).
      Μετρημένο 1440x900: ήταν 63px πάνω / 72 κάτω σε section 678px. */
   padding: clamp(1.5rem, 4vh, 3.5rem) var(--pad-x) clamp(1.5rem, 4vh, 3.5rem); }
.proglist__label{ font-family: 'Manrope', var(--f-body), sans-serif; font-weight: 500;
   font-size: clamp(.7rem, .64rem + .2vw, .82rem); letter-spacing: .14em;
   text-transform: uppercase; white-space: nowrap;
   color: var(--c-ink-mute); margin: 0; padding-top: 1.1rem; }
.proglist__items{ list-style: none; margin: 0; padding: 0; justify-self: end; text-align: left; }
.proglist__items a{ display: inline-block; text-decoration: none; color: var(--c-ink);
   /* 18/8: ήταν καρφωμένο σε Manrope και έμεινε πίσω όταν οι τίτλοι πήγαν σε Inter — ήταν το
      μόνο «τιτλικό» κείμενο της σελίδας που δεν άλλαξε. Τώρα ακολουθεί το token των τίτλων.
      ΠΡΟΣΟΧΗ στο μέγεθος παρακάτω: το Inter είναι 3,2% πιο φαρδύ από το Manrope στο ίδιο
      βάρος («Ενισχυτικά Μαθήματα»: 9,913em έναντι 9,603em). Με nowrap, αν δεν χωρέσει
      ΞΕΧΕΙΛΙΖΕΙ — μετρήθηκε ότι στα 360px θέλει 300px σε 320px διαθέσιμα. */
   font-family: var(--f-display); font-weight: 200;
   white-space: nowrap;                       /* καμία λέξη δεν κόβεται σε δεύτερη γραμμή */
   /* Το μέγεθος δένεται στο πλάτος της οθόνης ώστε η ΜΕΓΑΛΥΤΕΡΗ λέξη να χωράει πάντα.
      Μετρήθηκε: «Ενισχυτικά Μαθήματα» = το πιο φαρδύ, ~9,9em σε Inter ExtraLight (18/8). */
   /* 60px στη μεγάλη οθόνη (απόφαση Αντώνη 11/8). Ο μεσαίος όρος σε vw είναι υπολογισμένος
      ώστε η ΠΙΟ ΦΑΡΔΙΑ λέξη («Ενισχυτικά Μαθήματα» ≈ 9,5em) να χωράει σε ΜΙΑ γραμμή
      ακόμη και σε οθόνη 360px — γι' αυτό δεν είναι απλώς «60px παντού». */
   font-size: clamp(1.45rem, 8.4vw, 4.375rem);          /* 70px — όπως στην αρχή */
   /* πιο κοντά μεταξύ τους: το κενό γύρω από κάθε γραμμή σχεδόν στο μισό */
   /* 15/8, β΄ σφίξιμο (μετρημένο στα 1440, τίτλος 70px): με .2em/.24em το κενό ήταν 44px κάτω
      από τον τίτλο και 18px κάτω από τον υπότιτλο σε hover — η γραμμή «κρεμόταν» μακριά.
      Τώρα .1em/.08em → 7px/5,6px, δηλαδή σε hover η γραμμή σχεδόν ακουμπά τον υπότιτλο. */
   line-height: 1.06; letter-spacing: -.018em; padding: .1em 0 .08em;
   /* 1px. Πήγε 1→2 στις 22/8 και ξαναγύρισε σε 1 στις 23/8 («μειώσαμε κατά 1 pixel»): με 2px
      και χρωματιστές γραμμές το βάρος έπεφτε στην υπογράμμιση κι όχι στο όνομα. Το χρώμα το
      δίνει κάθε γραμμή χωριστά παρακάτω· εδώ μένει το ουδέτερο ως ασφαλής βάση, αν κάποτε
      προστεθεί γραμμή χωρίς data-pl. */
   /* 24/8 (εντολή Αντώνη): η υπογράμμιση παίρνει ΤΟ ΧΡΩΜΑ ΤΩΝ ΓΡΑΜΜΑΤΩΝ και πάει 1px πιο χοντρή.
      currentColor και όχι καρφωτό --c-ink: έτσι η γραμμή ακολουθεί τον τίτλο σε ΚΑΘΕ κατάσταση —
      όταν αχνιάζει ο τίτλος, αχνιάζει μαζί του, χωρίς δεύτερο κανόνα να το θυμάται.
      Το transition από κάτω κινεί ήδη το color, οπότε η γραμμή ακολουθεί και στη μετάβαση. */
   border-bottom: 2px solid currentColor;
   transition: color var(--dur-med) var(--ease), transform var(--dur-med) var(--ease); }
/* Η επεξήγηση. ΒΑΣΙΚΗ ΚΑΤΑΣΤΑΣΗ = ΟΡΑΤΗ — αυτό βλέπουν κινητά και tablet, όπου ΔΕΝ ΥΠΑΡΧΕΙ
   hover. Το κρύψιμο μπαίνει παρακάτω ΜΟΝΟ για ποντίκι. Ποτέ το αντίστροφο: αν έκρυβα εξ ορισμού
   και αποκάλυπτα με hover, στην αφή η πληροφορία θα ήταν ΑΠΡΟΣΙΤΗ. */
/* ═══ ΜΙΑ ΓΡΑΜΜΗ, ΕΝΑ ΧΡΩΜΑ (22/8, εντολή Αντώνη) ═══
   Η ταυτότητα μπαίνει στο HTML (data-pl), ΟΧΙ σε :nth-child — αν κάποτε αλλάξει η σειρά ή
   μπει πρόγραμμα ανάμεσα, τα χρώματα δεν θα μετακινηθούν σιωπηλά σε λάθος γραμμή.
   Τα τέσσερα είναι επίτηδες στο ΙΔΙΟ επίπεδο φωτεινότητας/κορεσμού, ώστε να διαβάζονται ως
   σετ και όχι ως τέσσερα άσχετα χρώματα:
     κυανό  #4BECE7  HSL(178, 81, 61)   ← το κύριο της παλέτας
     μωβ    #9452E0  HSL(268, 70, 60)
     μπλε   #29A8D6  HSL(196, 68, 50)   ← ΤΟ ΙΔΙΟ με το σκούρο άκρο της γραμμής του showreel
     λαχανί #C6F135  HSL( 74, 87, 58)   ← ο «τονισμός» της παλέτας
   ⚠ Το μπλε και το μωβ βγήκαν από τις εικόνες που έστειλε ο Αντώνης· το μπλε ταυτίστηκε με
     χρώμα που ήδη υπάρχει στο site (γραμμή showreel), το μωβ ΤΑΙΡΙΑΣΤΗΚΕ κατ' εκτίμηση —
     αν δοθεί ακριβής κωδικός, αλλάζει ΜΟΝΟ εδώ. */
/* ΑΦΑΙΡΕΘΗΚΑΝ 24/8 — η υπογράμμιση ακολουθεί πλέον το χρώμα των γραμμάτων (currentColor).
   ΓΙΑ «ΓΥΡΝΑ ΠΙΣΩ», τα τέσσερα χρώματα που ίσχυαν:
     meleti #4BECE7 · protypa #9452E0 · enisxytika #29A8D6 · camps #C6F135
   (τα δύο πρώτα από την παλέτα, το μπλε ίδιο με τη γραμμή του showreel, το μωβ κατ' εκτίμηση) */

.proglist__items .pl-note{ display: block; white-space: normal;
   font-family: 'Manrope', var(--f-body), sans-serif; font-weight: 250;   /* λεπτότερος */
   /* ~30px — αισθητά ελαφρύτερος δίπλα στον τίτλο των 70px */
   font-size: clamp(.95rem, 4.2vw, 1.875rem); line-height: 1.35;
   letter-spacing: -.005em; color: var(--c-ink-mute); margin-top: .18em; max-width: 34ch; }
/* ═══════ ΚΙΝΗΤΟ: ΚΕΝΗ ΛΩΡΙΔΑ 1/4 ΑΡΙΣΤΕΡΑ (18/8, αίτημα Αντώνη) ═══════
   Οι τίτλοι πιάνουν τα δεξιά 3/4 της στήλης, στοιχισμένοι αριστερά· το αριστερό 1/4 μένει
   κενό ΓΙΑ ΝΑ ΠΕΡΑΣΕΙ ΑΠΟ ΕΚΕΙ Η ΓΡΑΜΜΗ.
   ΤΟ ΜΕΓΕΘΟΣ ΠΡΕΠΕΙ ΝΑ ΠΕΣΕΙ ΜΑΖΙ: με nowrap, αν ο φαρδύτερος τίτλος δεν χωρέσει,
   ΞΕΧΕΙΛΙΖΕΙ. Μετρημένο στα 390px: «Ενισχυτικά Μαθήματα» = 325px σε 342px ωφέλιμα.
   Με 25% κενό μένουν 257px, άρα το 8.4vw πρέπει να γίνει 6.5vw (325 × 6.5/8.4 = 251px). */
@media (max-width: 699.98px){
  .proglist__items{ padding-left: 25%; }
  /* 21/8: 6.5vw → 6vw. Η Actual με tracking -0.05em είναι ~+9% φαρδύτερη από την Inter·
     στα 390px το «Ενισχυτικά Μαθήματα» θα πήγαινε ~274px σε 257px ωφέλιμα (nowrap = υπερχείλιση).
     Με 6vw μετρήθηκε 252px — χωράει με ανάσα 5px. */
  .proglist__items a{ font-size: clamp(1.05rem, 6vw, 3.3rem); }
}

/* ── Η ΚΙΝΗΣΗ (διόρθωση 11/8): ΚΛΕΙΣΤΟ = φαίνεται σαν να μην υπάρχει υπότιτλος, ο τίτλος
   κάθεται κεντραρισμένος πάνω στη γραμμή. ΑΝΟΙΧΤΟ = ο ΤΙΤΛΟΣ ΣΗΚΩΝΕΤΑΙ και από κάτω του
   βγαίνει ο υπότιτλος σαν συρτάρι. Κλείνοντας, το συρτάρι ξανακατεβαίνει και ο τίτλος
   ξανακάθεται στη θέση του.
   Το ύψος της γραμμής ΔΕΝ αλλάζει ποτέ — αλλιώς το άνοιγμα του ενός θα μετακινούσε τα
   υπόλοιπα και θα άλλαζε ποιος είναι κοντύτερα στη «γραμμή ανάγνωσης» → τρεμόπαιγμα.
   ΒΑΣΙΚΗ ΚΑΤΑΣΤΑΣΗ = ΑΝΟΙΧΤΗ: χωρίς JS και χωρίς ποντίκι, όλα φαίνονται. Το κλείσιμο το
   επιβάλλουν μόνο (α) το hover-media για ποντίκι και (β) η κλάση js-scrollnotes για αφή. */
.proglist__items .pl-title{ display: block; }
.proglist__items .pl-note{ overflow: hidden; }
.proglist__items .pl-note > i{ font-style: normal; display: block; }
/* (21/8, Αντώνης «δεν θέλω δύο σειρές — σε κινητό δεν έχουμε χώρο») ΔΥΟ ΕΚΔΟΧΕΣ υποτίτλου:
   η πλήρης (.pl-long) παντού, η σύντομη (.pl-short) ΜΟΝΟ ≤699.98 — «Προετοιμασία Εξετάσεων»,
   «Ιούνιος, Ιούλιος». Η κρυφή είναι display:none, άρα δεν πιάνει ύψος ούτε μπαίνει στην κίνηση. */
.proglist__items .pl-note > i.pl-short{ display: none; }
@media (max-width: 699.98px){
  .proglist__items .pl-note > i.pl-long{ display: none; }
  .proglist__items .pl-note > i.pl-short{ display: block; }
}

/* ΚΛΕΙΣΤΗ κατάσταση — κοινή για ποντίκι και αφή */
@media (hover: hover) and (pointer: fine){
  .proglist__items .pl-title{ transform: translateY(.29em); }
  .proglist__items .pl-note > i{ transform: translateY(115%); opacity: 0; }
}
.js-scrollnotes .proglist__items .pl-title{ transform: translateY(.29em); }
.js-scrollnotes .proglist__items .pl-note > i{ transform: translateY(115%); opacity: 0; }

/* ΑΝΟΙΧΤΗ κατάσταση */
@media (hover: hover) and (pointer: fine){
  .proglist__items a:hover .pl-title,
  .proglist__items a:focus-visible .pl-title{ transform: none; }
  .proglist__items a:hover .pl-note > i,
  .proglist__items a:focus-visible .pl-note > i{ transform: none; opacity: 1; }
  /* ΤΟ ΟΝΟΜΑ ΜΕΝΕΙ ΜΑΥΡΟ ΣΤΟ HOVER (23/8, εντολή Αντώνη: «μην τα χρωματίζεις με το κυρίαρχο
     χρώμα· άσ' τα μαύρα, να διατηρούν μόνο το εφέ»). Άρα ΜΟΝΟ η μετακίνηση — καμία αλλαγή
     χρώματος. Το χρώμα το κουβαλάει πλέον η υπογράμμιση, που είναι διαφορετική ανά πρόγραμμα:
     αν άλλαζε και το όνομα, θα είχαμε δύο χρωματικά σήματα για το ίδιο πράγμα. */
  .proglist__items a:hover{ transform: translateX(.4rem); }
  .proglist__items a:hover .pl-note{ color: var(--c-ink-soft); }
}
.js-scrollnotes .proglist__items a.is-open .pl-title{ transform: none; }
.js-scrollnotes .proglist__items a.is-open .pl-note > i{ transform: none; opacity: 1; }

/* Η ΤΑΧΥΤΗΤΑ: 0,75δ που μπαίνει, ΠΟΛΥ πιο αργά που φεύγει. (21/8, εντολή Αντώνη «να φεύγουν
   πιο αργά — να φαίνεται ότι φεύγουν»): το κλείσιμο πήγε 0,9 → 1,8δ η κίνηση και 0,6 → 1,4δ το
   σβήσιμο, ώστε το κείμενο να φαίνεται να κατεβαίνει σχεδόν ως το τέλος αντί να χάνεται στη
   μέση της διαδρομής. Ο τίτλος επιστρέφει στη θέση του με τον ίδιο χρόνο (1,8δ) — αλλιώς θα
   «έφευγε» πριν από τον υπότιτλό του. Το άνοιγμα μένει ζωηρό (0,75/0,5δ παρακάτω). Ο κανόνας
   εδώ είναι ο ΒΑΣΙΚΟΣ, άρα ισχύει όταν το στοιχείο επιστρέφει στην κλειστή του θέση. */
/* ΜΕΤΡΗΘΗΚΕ (21/8): με ease-out και 1,4δ, η αδιαφάνεια ήταν ήδη 0,4 στα 0,4δ και 0,1 στα 0,8δ —
   δηλαδή το μάτι το έχανε στο πρώτο μισό, όσο μεγάλη κι αν ήταν η διάρκεια. Για να ΦΑΙΝΕΤΑΙ
   ότι φεύγει, το σβήσιμο πρέπει να είναι ease-IN (μένει ορατό ως αργά) και η κίνηση ease-in-out. */
.proglist__items .pl-title{ transition: transform 1.8s cubic-bezier(.45,.05,.55,.95); }
.proglist__items .pl-note > i{ transition: transform 1.8s cubic-bezier(.45,.05,.55,.95),
                                           opacity 1.4s cubic-bezier(.6,0,.85,.3); }
.proglist__items a:hover .pl-title,
.proglist__items a.is-open .pl-title,
.proglist__items a:hover .pl-note > i,
.proglist__items a.is-open .pl-note > i{ transition-duration: .75s, .5s;
   /* το άνοιγμα κρατά την ΓΡΗΓΟΡΗ καμπύλη (ease-out) — η αργή ease-in είναι μόνο για το φεύγω */
   transition-timing-function: cubic-bezier(.22,.61,.36,1), cubic-bezier(.22,.61,.36,1); }
.proglist__items a:focus-visible{ outline: 2px solid var(--c-teal-500); outline-offset: 4px; }
/* ΜΕΤΡΗΜΕΝΟ, ΟΧΙ ΕΙΚΑΖΟΜΕΝΟ (12/8): οι δύο στήλες θέλουν ≈890px για να χωρέσουν —
   λίστα 620px (τόσο πιάνει το max-width:34ch του υπότιτλου) + ετικέτα ~180px + κενό + περιθώρια.
   Με το παλιό όριο των 720px, στα 768 (tablet) η σελίδα κυλούσε ΟΡΙΖΟΝΤΙΑ 129px. */
@media (max-width: 1023.98px){
  /* σε κινητό & tablet η ετικέτα πάει από πάνω και η λίστα πιάνει όλο το πλάτος */
  .proglist{ grid-template-columns: 1fr; gap: .8rem; }
  .proglist__label{ padding-top: 0; }
  .proglist__items{ justify-self: stretch; }
}
/* δίχτυ ασφαλείας: ό,τι κι αν γίνει με τα ch, ο υπότιτλος δεν ξεπερνά ποτέ τη στήλη του */
.proglist__items{ min-width: 0; }
.proglist__items .pl-note{ max-width: min(34ch, 100%); }

.section--overmap{ position: relative; z-index: 2; margin-top: -100svh; }

/* (η καρφίτσα ορίζεται πια ΜΙΑ φορά, πιο πάνω - 22/8) */

/* (Το διπλότυπο mapsec block που ζούσε εδώ — ίδιο @media + ίδιοι 4 κανόνες με το πρωτότυπο
   πιο πάνω — αφαιρέθηκε 19/8 κατά την ενοποίηση breakpoints.) */

/* ═══════════ ΜΑΥΡΟΠΙΝΑΚΑΣ ΣΤΟ FOOTER (11/8) ═══════════
   Ίδιο χρώμα με πριν — απλά αποκτά «υφή πίνακα»: κόκκος φιλμ + μια πολύ ελαφριά βαθύτητα
   στις άκρες, ώστε να μοιάζει με επιφάνεια και όχι με σκέτο μαύρο ορθογώνιο.
   Ο κόκκος παράγεται από SVG turbulence — καμία εικόνα, καμία εξωτερική εξάρτηση. */
.site-footer{ position: relative; isolation: isolate; overflow: hidden; }
.site-footer > .container{ position: relative; z-index: 2; }

.chalk{ position: absolute; inset: 0; z-index: 1; pointer-events: none; }
.chalk__svg{ position: absolute; width: 0; height: 0; overflow: hidden; }
/* ο κόκκος: δύο στρώσεις θα ήταν βαρύ σε φθηνή συσκευή· μία με χαμηλή διαφάνεια αρκεί */
.chalk__grain{ position: absolute; inset: -12%; filter: url('#chalkGrain');
   opacity: .16; mix-blend-mode: overlay; }
html.js .chalk__grain{ animation: chalkGrain 1.1s steps(4, end) infinite; }
@keyframes chalkGrain{
  0%{ transform: translate(0,0) } 25%{ transform: translate(-2%,1.5%) }
  50%{ transform: translate(1.5%,-2%) } 75%{ transform: translate(-1%,-1.5%) } }
/* λεπτή βαθύτητα στις άκρες — δίνει την αίσθηση επιφάνειας */
.site-footer::before{ content:''; position:absolute; inset:0; z-index:1; pointer-events:none;
   background: radial-gradient(120% 90% at 50% 30%, transparent 55%, rgba(0,0,0,.35) 100%); }


/* Ο ΚΟΚΚΟΣ ΚΙΝΕΙΤΑΙ ΚΑΙ ΣΕ ΚΙΝΗΤΟ (διόρθωση 11/8). Τον είχα παγώσει «για οικονομία», αλλά
   είναι ένα transform σε ένα στοιχείο — δεν κοστίζει τίποτα, και ακίνητος δεν μοιάζει με φιλμ. */
@media (max-width: 1023.98px){ .chalk__grain{ opacity: .13; } }
@media (prefers-reduced-motion: reduce){ .chalk__grain{ animation: none !important; } }

/* Η χειρόγραφη υπογράμμιση των συνδέσμων: στο σκούρο footer γίνεται ΛΕΥΚΗ και λίγο πιο χοντρή,
   ώστε να διαβάζεται σαν γραμμή πάνω σε πίνακα. Το stroke-width από CSS υπερισχύει του
   attribute (6) που γράφει το motion.js όταν φτιάχνει το SVG. */
.site-footer [data-draw-line-box] svg{ color: #fff; }
.site-footer [data-draw-line-box] svg path{ stroke-width: 9; }

/* ═══════════ ΜΠΑΡΑ ΜΟΝΟ ΜΕ ΛΟΓΟΤΥΠΟ (αρχική, 11/8) ═══════════
   Χωρίς οριζόντιους συνδέσμους και χωρίς κουμπί: μένουν το «Μ» αριστερά και το hamburger δεξιά.
   Το hamburger γίνεται ορατό ΚΑΙ σε υπολογιστή — αλλιώς, με φευγάτο το μενού, η αρχική δεν θα
   είχε καμία πλοήγηση σε μεγάλη οθόνη. */
/* (19/8: οι κανόνες που εμφάνιζαν το burger στο minimal header αφαιρέθηκαν —
   το burger είναι πλέον ορατό παντού από τη βάση του.) */
.site-header[data-nav-minimal] .container{ justify-content: space-between; }

/* ═══════════ ΛΟΓΟΤΥΠΟ ΑΝΑ ΣΥΣΚΕΥΗ (12/8 · όρια ενοποιήθηκαν 19/8: κινητό ≤699, tablet 700-1023) ═══════════
   ΚΙΝΗΤΟ (≤699): αρχικά το giant wordmark δεν υπήρχε καν — θα ήταν 288px δίπλα σε στόχο 64px,
   δηλαδή καμία σμίκρυνση. Φαίνεται απευθείας το λογότυπο της μπάρας (το κάνει το motion.js).
   TABLET (700-1023): μένει το ταξίδι, αλλά το wordmark μεγαλώνει και ο στόχος μικραίνει,
   ώστε η σμίκρυνση να διαβάζεται όπως στον υπολογιστή. */
/* ΚΙΝΗΤΟ (18/8, αίτημα Αντώνη): το ταξίδι ΞΑΝΑΜΠΑΙΝΕΙ. Είχε κλείσει στις 12/8 επειδή με
   width 48vw το wordmark ήταν 288px δίπλα σε στόχο 64px → σμίκρυνση 1,00×, δηλαδή καμία.
   Η λύση είναι ίδια με του tablet: ΠΟΛΥ μεγαλύτερη αφετηρία + μικρότερος στόχος.
   ΤΙΜΙΟ ΟΡΙΟ: σε 390px οθόνη το «Μ» ξεκινά ~56px και καταλήγει 44px → σμίκρυνση 0,79×.
   Είναι ορατή, αλλά ΔΕΝ φτάνει το 0,59× του desktop — δεν χωράει μεγαλύτερη αφετηρία σε
   τηλέφωνο χωρίς να πέσει ο στόχος αφής κάτω από τα 44px. */
@media (max-width: 699.98px){
  .vhero__wordmark{ width: min(92vw, 26rem); }
  .site-header .site-logo .mu-logo{ width: 44px; height: 44px; }   /* ελάχιστος στόχος αφής */
}
@media (min-width: 700px) and (max-width: 1023.98px){
  .vhero__wordmark{ width: min(74vw, 40rem); }     /* 48vw → 74vw: πολύ μεγαλύτερη αφετηρία */
  /* ΤΡΙΠΛΟΣ επιλογέας ΕΠΙΤΗΔΕΣ: η γραμμή 476 (.site-header .site-logo .mu-logo) είναι πιο
     ειδική — με δύο κλάσεις η ρύθμιση αγνοούνταν σιωπηλά (μετρήθηκε 68px αντί για 44px). */
  .site-header .site-logo .mu-logo{ width: 48px; height: 48px; }  /* μικρότερος στόχος → μεγαλύτερη διαδρομή· 48 και όχι 44 = άνετος στόχος αφής */
}

/* ══════════════════════════════════════════════════════════════════════════════════════════
   NAVPOD — «scaling hamburger navigation» (21/8, αίτημα Αντώνη με βίντεο αναφοράς Osmo)
   + Η ΓΥΑΛΙΝΗ ΜΠΑΡΑ ΦΕΥΓΕΙ: «μόνο το λογότυπο σκέτο».
   ΤΙ ΚΑΝΕΙ: πάνω δεξιά κάθεται ΕΝΑ χάπι 52px. Με το πάτημα ΜΕΓΑΛΩΝΕΙ σε πλαίσιο με τους
   συνδέσμους — και ξαναμαζεύεται. Δεν είναι δεύτερο στοιχείο που εμφανίζεται: είναι ΤΟ ΙΔΙΟ
   κουτί που αλλάζει μέγεθος, όπως στο βίντεο.
   ΓΙΑΤΙ ΟΧΙ transform: scale: θα παραμόρφωνε τα γράμματα (θα «τεντώνονταν» κατά το άνοιγμα).
   Αντ' αυτού αλλάζουν ΠΛΑΤΟΣ/ΥΨΟΣ με overflow: hidden, και το περιεχόμενο είναι absolute
   αγκυρωμένο πάνω-δεξιά — μένει ακίνητο στο σωστό του μέγεθος όσο το κουτί ανοίγει από γύρω του.
   Τις φυσικές διαστάσεις τις μετράει το JS μία φορά (και σε resize) — height:auto δεν κινείται.
   ΚΟΣΤΟΣ: μία θόλωση σε στοιχείο 52px όταν είναι κλειστό. Σε tablet αμελητέο. */

/* ① Η ΜΠΑΡΑ ΓΥΜΝΗ — μένει μόνο το λογότυπο (κανένα φόντο/θόλωση/γραμμή/σκιά) */
.site-header.is-nav-solid{ background: none; backdrop-filter: none; -webkit-backdrop-filter: none;
   border-bottom-color: transparent; box-shadow: none; }
@media (max-width: 1023.98px){
  .site-header.is-nav-solid, body:not([data-home="true"]) .site-header{ background: none; }
}

/* ② Το χάπι/πλαίσιο */
.navpod{ position: fixed; top: clamp(.9rem, .6rem + 1vw, 1.5rem); right: clamp(.9rem, .6rem + 1vw, 1.5rem);
   z-index: 70; }
.navpod__box{
  position: relative; width: 52px; height: 52px; border-radius: 26px; overflow: hidden;
  background: rgba(240, 241, 250, .72);
  -webkit-backdrop-filter: blur(14px) saturate(150%); backdrop-filter: blur(14px) saturate(150%);
  border: 1px solid rgba(21, 23, 29, .07);
  box-shadow: 0 10px 30px -14px rgba(21, 23, 29, .28);
  transition: width .55s cubic-bezier(.16,1,.3,1), height .55s cubic-bezier(.16,1,.3,1),
              border-radius .55s cubic-bezier(.16,1,.3,1), background-color .3s;
}
.navpod.is-open .navpod__box{ border-radius: 22px; background: rgba(240, 241, 250, .9); }
/* το περιεχόμενο: ΑΓΚΥΡΩΜΕΝΟ πάνω-δεξιά, σταθερού πλάτους → δεν αναδιπλώνεται όσο ανοίγει */
.navpod__inner{ position: absolute; top: 0; right: 0; width: 15rem; padding: 1.05rem 1.15rem 1.15rem;
   box-sizing: border-box; opacity: 0; transition: opacity .3s ease; pointer-events: none; }
.navpod.is-open .navpod__inner{ opacity: 1; transition: opacity .4s ease .12s; pointer-events: auto; }
.navpod__label{ display: block; font-family: var(--f-body); font-size: .68rem; font-weight: 700;
   letter-spacing: .16em; text-transform: uppercase; color: var(--c-ink-mute); margin-bottom: .7rem; }
.navpod__list{ list-style: none; margin: 0 0 .9rem; padding: 0; display: flex; flex-direction: column; gap: .42rem; }
.navpod__list a{ display: block; font-family: var(--f-display-ui); font-size: 1.02rem; font-weight: 600;
   color: var(--c-ink); text-decoration: none; padding: .2rem 0; transition: color .2s, transform .2s; }
.navpod__list a:hover, .navpod__list a:focus-visible{ color: var(--c-teal-600); transform: translateX(.25rem); }
.navpod__cta{ display: block; text-align: center; font-family: var(--f-body); font-size: .86rem; font-weight: 700;
   background: var(--c-volt); color: var(--c-volt-ink); text-decoration: none;
   padding: .7rem .9rem; border-radius: 10px; transition: background-color .2s; }
.navpod__cta:hover{ background: #d4fb52; }

/* ③ Το κουμπί — ΠΑΝΩ από το κουτί, στη γωνία· δύο γραμμές που γίνονται × */
.navpod__btn{ position: absolute; top: 0; right: 0; width: 52px; height: 52px; padding: 0;
   display: inline-flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px;
   background: none; border: 0; cursor: pointer; color: var(--c-ink); }
.navpod__btn span{ display: block; width: 18px; height: 2px; border-radius: 2px; background: currentColor;
   transition: transform .4s cubic-bezier(.16,1,.3,1); }
.navpod.is-open .navpod__btn span:first-child{ transform: translateY(3.5px) rotate(45deg); }
.navpod.is-open .navpod__btn span:last-child{ transform: translateY(-3.5px) rotate(-45deg); }
.navpod__btn:focus-visible{ outline: 2px solid var(--c-teal-500); outline-offset: 3px; border-radius: 26px; }

@media (prefers-reduced-motion: reduce){
  .navpod__box, .navpod__inner, .navpod__btn span{ transition: none; }
}

/* ══ ΤΟ «Μ» ΔΙΧΡΩΜΟ ΠΑΝΩ ΣΤΗΝ ΚΑΜΠΥΛΗ (22/8, αίτημα Αντώνη) ═════════════════════════════════
   «Όσο είναι σε φάση hero να μένει λευκό· καθώς έρχεται το oval από πίσω να γίνεται μαύρο,
    αλλά να ακολουθεί τη γραμμή του oval — το ιδανικό, μισό μαύρο μισό λευκό.»
   ΔΟΜΗ: εξωτερικό στρώμα fixed σε ΟΛΗ την οθόνη (εκεί μπαίνει το clip-path του oval, σε
   συντεταγμένες οθόνης — καμία μετατροπή) · εσωτερικό που αντιγράφει θέση+transform του
   wordmark · μέσα του το ΜΑΥΡΟ «Μ» (το PNG είναι φυσικά μαύρο, δεν παίρνει το φίλτρο invert).
   ΓΙΑΤΙ ΟΧΙ mix-blend-mode: θα αντέστρεφε το «Μ» και πάνω στο βίντεο, δίνοντας τυχαία χρώματα —
   εδώ θέλουμε ακριβώς δύο χρώματα.
   z-index 61 = ΑΚΡΙΒΩΣ πάνω από το wordmark (60) και κάτω από το navpod (70). */
.wm-darklayer{ position: fixed; inset: 0; z-index: 61; pointer-events: none;
   clip-path: path('M 0 0 Z'); }
/* ΘΕΣΗ/ΜΕΓΕΘΟΣ: ΔΕΝ γράφονται εδώ — τα ΑΝΤΙΓΡΑΦΕΙ το JS από το ίδιο το .vhero__wordmark σε κάθε
   καρέ. Η πρώτη εκδοχή τα επαναλάμβανε και έσπασε: το wordmark έχει ΤΡΕΙΣ υπερβάσεις πλάτους σε
   media queries, που έρχονται ΝΩΡΙΤΕΡΑ στο αρχείο — άρα ο κανόνας εδώ (τελευταίος) τις νικούσε
   και σε κινητό το μαύρο «Μ» έβγαινε 288px ενώ το λευκό 359px (μετρήθηκε). Με αντιγραφή,
   ό,τι κι αν αλλάξει εκεί, εδώ ακολουθεί μόνο του. */
.wm-darkinner{ position: fixed; transform-origin: 31.2% 35.7%; will-change: transform; }
.wm-darkinner img{ width: 100%; height: auto; display: block;
   filter: none;                                   /* το PNG είναι ήδη μαύρο */
   clip-path: inset(0% 61% 0% 23.4%); }            /* ίδιο κόψιμο με το .wm-mu — μόνο το «Μ» */

/* ═══════════ ΧΕΙΡΟΠΟΙΗΤΗ ΥΠΟΓΡΑΜΜΙΣΗ ΛΕΞΗΣ (23/8) ═══════════
   ΓΙΑΤΙ ΧΕΙΡΟΠΟΙΗΤΗ ΚΑΙ ΟΧΙ ΙΣΙΑ: το ίδιο το λογότυπο είναι πινελιά — το «Μ» έχει ορατές
   τρίχες βούρτσας. Είναι το ΜΟΝΟ χειροποίητο στοιχείο μέσα σε ένα κατά τα άλλα γεωμετρικό
   σύστημα (Actual μονογραμμική, σωληνωτή γραμμή showreel, κύκλοι). Μια υπογράμμιση με ίχνος
   χεριού ομοιοκαταληκτεί με το λογότυπο, αντί να εφευρίσκει τρίτη φωνή.
   ΠΟΥ ΟΧΙ: στη ΔΟΜΗ (υπογραμμίσεις της λίστας προγραμμάτων, περιγράμματα, διαχωριστικά) η
   γραμμή μένει ΙΣΙΑ. Τέσσερις κυματιστές γραμμές η μία κάτω από την άλλη δεν διαβάζονται ως
   ζεστασιά — διαβάζονται ως προχειρότητα.
   Ο ΚΑΝΟΝΑΣ: χειροποίητο = ο άνθρωπος που μιλάει · ίσιο = το σύστημα.

   ΤΕΧΝΙΚΑ: background-image, ΟΧΙ ψευδο-στοιχείο. Λόγος: με box-decoration-break: clone η
   υπογράμμιση σπάει ΣΩΣΤΑ όταν η φράση πέσει σε δεύτερη γραμμή — κάθε κομμάτι παίρνει τη δική
   του πινελιά. Με absolute ψευδο-στοιχείο θα τραβούσε μία ενιαία γραμμή κάτω από όλο το κουτί.
   Το preserveAspectRatio="none" τεντώνει την πινελιά στο πλάτος της λέξης. */
.uline{
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% .34em;
  padding-bottom: .16em;
  -webkit-box-decoration-break: clone; box-decoration-break: clone;
}
.uline[data-uline="teal"]{ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 13' preserveAspectRatio='none'%3E%3Cpath d='M4 8.6 C 26 5.4 48 10.6 72 7.6 C 96 4.8 118 10.2 142 7.4 C 162 5.1 180 9.4 196 7.0' fill='none' stroke='%234BECE7' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }   /* κύριο κυανό */
.uline[data-uline="purple"]{ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 13' preserveAspectRatio='none'%3E%3Cpath d='M4 8.6 C 26 5.4 48 10.6 72 7.6 C 96 4.8 118 10.2 142 7.4 C 162 5.1 180 9.4 196 7.0' fill='none' stroke='%239452E0' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }   /* μωβ — Πρότυπα & Ωνάσεια */
.uline[data-uline="blue"]{ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 13' preserveAspectRatio='none'%3E%3Cpath d='M4 8.6 C 26 5.4 48 10.6 72 7.6 C 96 4.8 118 10.2 142 7.4 C 162 5.1 180 9.4 196 7.0' fill='none' stroke='%2329A8D6' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }   /* μπλε — Ενισχυτικά */
.uline[data-uline="volt"]{ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 13' preserveAspectRatio='none'%3E%3Cpath d='M4 8.6 C 26 5.4 48 10.6 72 7.6 C 96 4.8 118 10.2 142 7.4 C 162 5.1 180 9.4 196 7.0' fill='none' stroke='%23C6F135' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }   /* λαχανί — Camps */

/* Σε μικρές οθόνες η πινελιά χάνει το κυμάτισμα (λίγα διαθέσιμα pixel) — λίγο παχύτερη. */
@media (max-width: 699.98px){ .uline{ background-size: 100% .4em; padding-bottom: .18em; } }
/* Χωρίς κίνηση/διακόσμηση: πέφτει σε κανονική υπογράμμιση, δεν χάνεται η έμφαση. */
@media (prefers-reduced-motion: reduce){ .uline{ background-image: none; text-decoration: underline;
  text-decoration-thickness: 2px; text-underline-offset: 3px; } }

/* ═══ ΟΙ ΛΟΓΟΙ — απλό πλέγμα (η βάση· η καρφιτσωμένη εκδοχή ζει στο motion.css) ═══
   Το .steps-row ήταν φτιαγμένο για ΤΕΣΣΕΡΑ (repeat(4,1fr)). Με δέκα, οι στήλες θα έβγαιναν
   ~10rem και οι τίτλοι θα έσπαγαν σε τέσσερις γραμμές. Εδώ γίνεται auto-fit. */
.steps-row--reasons{ grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
@media (min-width: 700px){ .steps-row--reasons{ grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); } }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   ΤΑ ΠΡΟΓΡΑΜΜΑΤΑ — εναλλάξ, με κάθετη γραμμή (24/8)
   Η ΔΙΑΤΑΞΗ ΕΙΝΑΙ ΤΟΥ ΠΡΟΦΙΛ, αυτούσια (.timeline/.tl-item — βλ. παραπάνω). Εδώ μόνο το
   περιτύλιγμα που φιλοξενεί τη γραμμή και μικρές προσαρμογές. Το svg είναι διάφανο στα κλικ
   και κάθεται ΠΙΣΩ από τις κάρτες: η γραμμή δεν πρέπει ποτέ να περνά πάνω από γράμματα.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.progline__wrap{ position: relative; }
.progline__svg{ position: absolute; inset: 0; width: 100%; height: 100%;
   pointer-events: none; z-index: 0; overflow: visible; }
.progline{ position: relative; z-index: 1; margin-top: 0; }
.progline .tl-item{ margin-bottom: clamp(3rem, 7vw, 6rem); }
.progline .tl-year{ font-size: clamp(1.6rem, 3.4vw, 2.6rem); color: var(--c-teal-400); }
.progline .tl-desc{ margin-bottom: 1.15rem; }
/* Στόχος αφής: το κουμπί κάθε προγράμματος δεν κολλάει στο κείμενο και μένει ≥44px. */
.progline .cta-row{ margin-top: 1.1rem; }

@media (max-width: 759.98px){
  /* Σε κινητό η γραμμή κρύβεται από το JS (μία στήλη — δεν υπάρχει εναλλαγή να ακολουθήσει). */
  .progline__svg{ display: none; }
}

@media (prefers-reduced-motion: reduce){
  .progline__svg path{ stroke-dasharray: none !important; stroke-dashoffset: 0 !important; }
}

/* ═══ ΣΕΛΙΔΑ ΝΟΜΙΚΟΥ ΚΕΙΜΕΝΟΥ (26/8) ═══
   ΜΗΚΟΣ ΓΡΑΜΜΗΣ: 68ch. Νομικό κείμενο διαβάζεται με κόπο· πάνω από ~75 χαρακτήρες το μάτι
   χάνει τη σειρά επιστρέφοντας αριστερά. ΠΙΝΑΚΕΣ: κυλάνε μέσα στο δικό τους κουτί — σε
   κινητό ένας πίνακας 4 στηλών δεν χωράει και θα έσπρωχνε ΟΛΗ τη σελίδα οριζόντια. */
.legal-doc .container{ max-width: 52rem; }
.legal-doc h2{ font-size: var(--fs-h3); margin: 2.6rem 0 .8rem; scroll-margin-top: 6rem; }
.legal-doc h3{ font-size: 1.05rem; font-weight: 400; margin: 1.8rem 0 .6rem; }
.legal-doc h4{ font-size: .96rem; font-family: var(--f-body); font-weight: 600; margin: 1.3rem 0 .5rem; }
.legal-doc p, .legal-doc li{ color: var(--c-ink-soft); line-height: 1.7; max-width: 68ch; }
.legal-doc p{ margin: 0 0 .9rem; }
.legal-doc ul, .legal-doc ol{ margin: 0 0 1.1rem; padding-left: 1.3rem; }
.legal-doc li{ margin-bottom: .4rem; }
.legal-doc a{ color: var(--c-cta); text-decoration: underline; text-underline-offset: 2px; }
.legal-doc strong{ color: var(--c-ink); font-weight: 600; }
.legal-doc code{ font-size: .9em; background: var(--c-surface-tint); padding: .1em .35em; border-radius: 4px; }
.legal-doc hr{ border: 0; border-top: 1px solid var(--c-border); margin: 2.2rem 0; }
.legal-doc blockquote{ margin: 1.2rem 0; padding: .9rem 1.1rem; background: var(--c-surface-tint);
   border-left: 3px solid var(--c-cta); border-radius: 0 10px 10px 0; }
.legal-doc blockquote p{ margin: 0; }
.legal-meta{ font-size: var(--fs-small); color: var(--c-ink-mute); margin: 0 0 2rem !important; }
.legal-table{ overflow-x: auto; margin: 0 0 1.4rem; -webkit-overflow-scrolling: touch; }
.legal-table table{ border-collapse: collapse; width: 100%; min-width: 30rem; font-size: .9rem; }
.legal-table th, .legal-table td{ border: 1px solid var(--c-border); padding: .55rem .7rem;
   text-align: left; vertical-align: top; color: var(--c-ink-soft); line-height: 1.5; }
.legal-table th{ background: var(--c-surface-tint); color: var(--c-ink); font-weight: 600; }

/* ═══════════════════════════════════════════════════════════════════════════════════════
   ΤΟ ΤΕΛΟΣ ΤΗΣ ΣΕΛΙΔΑΣ — αλλαγές 26/8
   ═══════════════════════════════════════════════════════════════════════════════════════ */

/* #14 — Η ΑΤΑΚΑ ΧΩΡΙΣ ΤΗ ΓΡΑΜΜΗ. Το section κρατούσε ύψος για την καμπύλη που ζωγραφιζόταν·
   τώρα κρατά μόνο τα τρία λόγια, με αέρα γύρω τους ώστε να λειτουργούν ως ανάσα. */
.ribbon-sec--plain{ position: relative; z-index: 2; min-height: auto;
   padding: clamp(5rem, 14vh, 9rem) var(--pad-x); display: grid; place-content: center;
   text-align: center; background: var(--c-bg); }
.ribbon-sec--plain .ribbon-sec__line{ position: static; margin: 0; }

/* #23 — ΚΑΛΕΣΜΑ ΜΕΣΑ ΣΤΗ ΡΟΗ. Στόχος αφής 44px στο κουμπί (ΑΡΧΗ #1 TABLET FIRST). */
.cta-strip{ padding-block: clamp(2.5rem, 6vh, 4rem); background: transparent;   /* 26/8: ενιαίο φόντο — καμία λωρίδα άλλης απόχρωσης */
   border-block: 1px solid var(--c-border); }
.cta-strip__in{ display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
   gap: 1.2rem 2rem; }
.cta-strip__txt{ margin: 0; font-family: var(--f-hero); font-weight: var(--fw-hero);
   font-size: clamp(1.15rem, .9rem + 1.1vw, 1.75rem); line-height: 1.25; max-width: 32ch; }
.cta-strip .btn{ min-height: 44px; display: inline-grid; place-items: center; }
@media (max-width: 600px){ .cta-strip__in{ flex-direction: column; align-items: stretch; text-align: left; } }

/* #16 — ΤΟ FOOTER ΩΣ ΣΥΡΤΑΡΙ ΠΑΝΩ ΑΠΟ ΤΟΝ ΑΚΙΝΗΤΟ ΧΑΡΤΗ.
   Ο χάρτης έχει 500svh με κολλημένη σκηνή. Ό,τι ΕΠΕΤΑΙ με -100svh ανεβαίνει από πάνω του
   ενώ εκείνος μένει ακίνητος. Αυτό το έκανε η φόρμα πριν μετακομίσει· τώρα το footer. */
.site-footer--overmap{ position: relative; z-index: 3; margin-top: -100svh; }

/* #29 — ΟΡΙΖΟΝΤΙΟ ΣΚΟΥΠΙΣΜΑ ΣΤΙΣ ΚΑΡΤΕΣ ΤΩΝ ΕΚΠΑΙΔΕΥΤΙΚΩΝ.
   Η κάρτα ΔΕΝ μετακινείται — αποκαλύπτεται από αριστερά προς τα δεξιά. Παίρνει την οριζόντια
   κατεύθυνση που ζήτησε ο Αντώνης, κρατά τη γλώσσα «αποκαλύπτω, δεν σπρώχνω», και ακολουθεί
   τον άξονα της ίδιας της σειράς. Μία-μία, 90ms απόσταση. */
.js .people-grid .person-card{ clip-path: inset(0 100% 0 0); }
.js .people-grid.is-revealed .person-card{
   clip-path: inset(0 0 0 0);
   transition: clip-path .72s cubic-bezier(.22,1,.36,1); }
.js .people-grid.is-revealed .person-card:nth-child(2){ transition-delay: .09s; }
.js .people-grid.is-revealed .person-card:nth-child(3){ transition-delay: .18s; }
.js .people-grid.is-revealed .person-card:nth-child(4){ transition-delay: .27s; }

/* #30 + #37 — ΤΟ ΜΟΝΟ ΣΚΟΥΡΟ, ΠΛΗΡΟΥΣ ΠΛΑΤΟΥΣ SECTION.
   ΤΟ ΠΡΟΒΛΗΜΑ: σχεδόν κάθε ενότητα ήταν ανοιχτή, μέσα σε πλαίσιο, κείμενο αριστερά — το
   μόνο τονικό σπάσιμο ήταν το footer. Εδώ σπάει η μονοτονία, όπου έχει και νόημα (η
   πλατφόρμα είναι το «τεχνολογικό» κομμάτι). ΟΧΙ ΣΚΕΤΟ ΜΑΥΡΟ (αίτημα Αντώνη): φωτεινή
   κηλίδα από πάνω δίνει βάθος, όπως το φόντο του footer. */
.section--dark{ position: relative; background: var(--c-ink); color: #fff;
   padding-block: clamp(3.5rem, 9vh, 6.5rem); overflow: clip; }
.section--dark::before{ content: ''; position: absolute; inset: -30% -10% auto -10%; height: 90%;
   background: radial-gradient(60% 70% at 30% 0%, rgba(75,236,231,.16) 0%, transparent 70%);
   pointer-events: none; }
.section--dark > *{ position: relative; z-index: 1; }
.section--dark h2, .section--dark h3{ color: #fff; }
.section--dark p{ color: rgba(255,255,255,.72); }
.section--dark .eyebrow{ color: var(--c-accent); }

/* #42 — ΤΟ ΚΟΥΜΠΙ ΤΟΥ ΜΕΝΟΥ: ΜΕΓΑΛΥΤΕΡΟ ΚΑΙ ΕΥΘΥΓΡΑΜΜΙΣΜΕΝΟ ΜΕ ΤΟ «Μ».
   ΜΕΤΡΗΜΕΝΟ: το λογότυπο κάθεται σε y 14-93 (79px ύψος). Για να πέφτει η ΚΑΤΩ ακμή του
   κουμπιού στην ίδια γραμμή με την κάτω ακμή του «Μ», το κουμπί (πλέον 64px) χρειάζεται
   top = 93 − 64 = 29px. Σε ταμπλέτα/υπολογιστή μόνο· σε κινητό μένει όπως ήταν. */
@media (min-width: 768px){
  .navpod__box{ width: 64px; height: 64px; }
  .navpod{ top: 29px; }
}

/* ═══ ΚΑΡΤΕΣ ΠΑΡΑΡΤΗΜΑΤΩΝ — σελίδα Επικοινωνίας (26/8) ═══
   ΑΡΧΗ #1 TABLET FIRST: ο σύνδεσμος «Άνοιγμα στους χάρτες» είναι στόχος αφής 44px.
   Ο αριθμός σε --f-num (Manrope) — η Actual έχει oldstyle ψηφία που «πέφτουν». */
.branch-list{ list-style: none; margin: var(--sp-block) 0 0; padding: 0;
   display: grid; gap: var(--sp-gap); grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); }
.branch-card{ background: var(--c-surface); border: 1px solid var(--c-border);
   border-radius: var(--radius-lg); padding: 1.5rem; display: flex; flex-direction: column; gap: .3rem; }
.branch-card__num{ font-family: var(--f-num); font-weight: 300; font-size: 2rem; line-height: 1;
   font-variant-numeric: tabular-nums lining-nums; color: var(--c-ink);
   width: fit-content; padding-bottom: .12em; border-bottom: 4px solid var(--c-volt);
   margin-bottom: .7rem; }
.branch-card__name{ font-size: var(--fs-h3); margin: 0; }
.branch-card__addr{ margin: 0; color: var(--c-ink-soft); }
.branch-card__note{ margin: 0; color: var(--c-ink-mute); font-size: var(--fs-small); }
.branch-card__map{ margin-top: auto; padding-top: 1rem; min-height: 44px; display: inline-flex;
   align-items: center; color: var(--c-cta); font-weight: 600; font-size: var(--fs-small);
   text-decoration: underline; text-underline-offset: 3px; }

/* ═══ ΣΤΟΧΟΙ ΑΦΗΣ ΣΤΟ ΜΕΝΟΥ (26/8) — ΑΡΧΗ #1 TABLET FIRST ═══
   ΜΕΤΡΗΘΗΚΕ σε 375px: οι σύνδεσμοι του μενού είχαν ύψος 33px. Το ελάχιστο για δάχτυλο
   είναι 44px — και το μενού είναι ΑΚΡΙΒΩΣ το σημείο όπου δεν επιτρέπεται αστοχία, γιατί
   είναι ο μόνος τρόπος πλοήγησης σε κινητό. Δεν μεγαλώνει η γραμματοσειρά, μόνο ο
   στόχος: το κείμενο κεντράρεται μέσα σε 44px. */
.navpod__list a{ min-height: 44px; display: flex; align-items: center; }
.navpod__list{ gap: 0; }

/* ═══ Ο ΟΜΙΛΟΣ — πέντε σημεία (26/8) ═══
   Ίδια τυπογραφία αριθμών με τους λόγους: --f-num (η Actual έχει oldstyle ψηφία) και
   κίτρινη υπογράμμιση. Έτσι ο επισκέπτης αναγνωρίζει το μοτίβο. */
.omilos-sec .cta-row{ margin-top: clamp(2rem, 5vh, 3rem); }
/* 🔴 ΤΟ ΜΑΞΙΛΑΡΙ ΤΟΥ ΧΑΡΤΗ (διορθώθηκε 26/8 — ΜΕΤΡΗΘΗΚΕ).
   ΤΙ ΕΣΠΑΣΕ: η .mapsec έχει margin-top: -100svh — τραβιέται ΜΙΑ ΟΘΟΝΗ πάνω και σκεπάζει
   ό,τι προηγείται (έτσι «αναλαμβάνει» ο χάρτης). Μέχρι τις 26/8 το απορροφούσε η ενότητα
   της ατάκας («Έτοιμος για την επόμενη μέρα»), που καθόταν ακριβώς ανάμεσα.
   Όταν βγήκε η ατάκα (εντολή Αντώνη — πήγε στο footer), έφυγε ΚΑΙ το μαξιλάρι: ο χάρτης
   ξεκινούσε στο 16033 ενώ το ιστορικό στο 16217, δηλαδή το ΚΑΤΑΠΙΝΕ ΟΛΟΚΛΗΡΟ.
   ΔΙΟΡΘΩΣΗ: η ενότητα του Ομίλου κρατά μία οθόνη κενό από κάτω της. Ο χάρτης γλιστράει
   πάνω σε ΑΥΤΟ, όχι πάνω στα κείμενα. Κανένα κενό δεν φαίνεται — ο χάρτης το καλύπτει.
   ⚠ ΑΝ ΞΑΝΑΜΠΕΙ ΕΝΟΤΗΤΑ ΑΝΑΜΕΣΑ, αυτό το padding πρέπει να φύγει. */
/* ═══ Ο ΧΑΡΤΗΣ ΜΕΝΕΙ ΣΤΑΘΕΡΟΣ, Η ΣΕΛΙΔΑ ΞΕΔΙΠΛΩΝΕΤΑΙ ΑΠΟ ΠΑΝΩ ΤΟΥ (26/8, εντολή Αντώνη) ═══
   ΤΙ ΕΚΑΝΑ ΛΑΘΟΣ ΠΡΙΝ: ο χάρτης τραβιέται μία οθόνη πάνω και —με ίδιο z-index— ζωγραφιζόταν
   ΠΑΝΩ από την προηγούμενη ενότητα, καταπίνοντας το ιστορικό. Το «έλυσα» βάζοντας μια οθόνη
   κενό γέμισμα. Μπάλωμα: έσπρωχνε το πρόβλημα, δεν το έλυνε.
   ΣΩΣΤΟ: η προηγούμενη ενότητα πάει ΜΠΡΟΣΤΑ από τον χάρτη, με το ΙΔΙΟ ανοιχτό φόντο —
   άρα οπτικά ενιαία, αλλά αδιαφανής. Ο χάρτης μένει καρφωμένος από πίσω και ΑΠΟΚΑΛΥΠΤΕΤΑΙ
   καθώς η ενότητα ανεβαίνει. Ακριβώς όπως μετά κάνει και το footer.
   ΤΟ ΚΕΝΟ ΓΕΜΙΣΜΑ ΕΦΥΓΕ — δεν χρειάζεται πια. */
/* 🔴 ΤΟ ΚΑΠΑΚΙ ΤΟΥ ΧΑΡΤΗ — ΠΡΕΠΕΙ ΝΑ ΕΙΝΑΙ 100svh (26/8, ΜΕΤΡΗΘΗΚΕ).
   ΤΙ ΕΓΙΝΕ: ο χάρτης έχει margin-top: −100svh (κάθεται ΑΚΙΝΗΤΟΣ και η σελίδα περνάει από
   πάνω του). Αυτό το «−100svh» πρέπει να το ΚΑΤΑΠΙΕΙ η ενότητα ακριβώς από πάνω, αλλιώς ο
   χάρτης ξεκινά ΨΗΛΟΤΕΡΑ από αυτήν και ξεπροβάλλει σαν λωρίδα.
   Η ενότητα το έκανε ΚΑΤΑ ΤΥΧΗ: με τους πέντε αριθμημένους σταθμούς ήταν ~950px, δηλαδή
   περίπου μία οθόνη. Μόλις οι σταθμοί έφυγαν (εντολή Αντώνη), έπεσε στα 551 — 403px λιγότερα
   από την οθόνη — και ο χάρτης φάνηκε ακριβώς σε αυτή τη λωρίδα, πάνω από τους εκπαιδευτικούς.
   ΤΩΡΑ ΕΙΝΑΙ ΡΗΤΟ, ΟΧΙ ΤΥΧΑΙΟ: min-height 100svh, με το περιεχόμενο κεντραρισμένο κάθετα
   ώστε το ύψος να μη γίνει νεκρό κενό στον πάτο.
   ⚠ ΜΗΝ ΤΟ ΜΕΙΩΣΕΙΣ. Ό,τι κι αν μπει ή βγει από την ενότητα, το 100svh μένει. */
.omilos-sec{ position: relative; z-index: 2; background: var(--c-bg);
   min-height: 100svh; display: grid; align-content: center; }

/* ═══ #46 — ΤΟ FOOTER ΑΝΕΒΑΙΝΕΙ ΜΕ ΚΑΜΠΥΛΗ ═══
   Ο Αντώνης: «όπως το εφέ που ανεβαίνει την καμπύλη από το hero». Εκεί η καμπύλη είναι
   ΔΥΝΑΜΙΚΗ (το motion.js γράφει --arc-path καθώς κυλάς). Εδώ αρκεί ΣΤΑΘΕΡΗ: το footer
   ανεβαίνει ήδη σαν συρτάρι πάνω από τον χάρτη, οπότε η καμπυλωμένη πάνω ακμή φαίνεται
   να «σκάβει» τον χάρτη καθώς έρχεται. Μηδέν επιπλέον JavaScript.
   ΤΟ ΜΕΓΕΘΟΣ: 50% οριζόντια / 100px κάθετα — πλατύ και χαμηλό τόξο, όχι μισοφέγγαρο. */
/* ═══ Η ΠΑΝΩ ΑΚΜΗ ΤΟΥ FOOTER ═══
   ΒΑΣΗ ΧΩΡΙΣ JAVASCRIPT: σταθερό τόξο με border-radius. Ό,τι έβλεπε ο επισκέπτης μέχρι
   σήμερα. Μένει ΩΣ ΕΧΕΙ ώστε, αν το motion.js δεν φορτώσει ή ο επισκέπτης έχει ζητήσει
   λιγότερη κίνηση, να μη δει κοφτή γωνία. */
.site-footer--overmap{ border-top-left-radius: 50% 100px; border-top-right-radius: 50% 100px;
   overflow: hidden; }
@media (max-width: 700px){
  .site-footer--overmap{ border-top-left-radius: 50% 48px; border-top-right-radius: 50% 48px; }
}

/* ═══ ΖΩΝΤΑΝΗ ΚΑΜΠΥΛΗ (26/8, εντολή Αντώνη: «ό,τι κάνεις πάνω, θέλω να κάνεις και κάτω») ═══
   Το ίδιο εφέ με το hero (.proglist-sec::after), ΑΝΑΠΟΔΑ: εκεί η ακμή φουσκώνει ΠΡΟΣ ΤΑ ΕΞΩ,
   εδώ βουλιάζει ΠΡΟΣ ΤΑ ΜΕΣΑ, προς το footer.

   ΓΙΑΤΙ clip-path ΚΑΙ ΟΧΙ ΧΡΩΜΑΤΙΣΤΗ ΛΩΡΙΔΑ: πάνω, η καμπύλη ζωγραφίζεται ως λωρίδα στο
   χρώμα του φόντου — γίνεται γιατί το φόντο είναι ΜΟΝΟΧΡΩΜΟ. Κάτω, από πάνω κάθεται ο
   ΖΩΝΤΑΝΟΣ ΧΑΡΤΗΣ (καμβάς MapLibre): δεν υπάρχει χρώμα να μιμηθούμε. Άρα το footer πρέπει
   να ΚΟΠΕΙ αληθινά, για να φανεί ο χάρτης μέσα από την κοιλιά της καμπύλης.

   Ο «ΧΩΡΟΣ» (--fa-room): το clip-path δεν μπορεί να ζωγραφίσει ΕΞΩ από το κουτί του
   στοιχείου. Αν θέλαμε ποτέ θόλο (καμπύλη προς τα ΠΑΝΩ), δεν θα υπήρχε υλικό να δείξουμε.
   Γι' αυτό το footer ανεβαίνει κατά --fa-room και παίρνει ισόποσο γέμισμα: το περιεχόμενο
   μένει ακριβώς εκεί που ήταν, αλλά αποκτάμε βαφόμενη ζώνη από πάνω. Έτσι ο ρυθμιστής
   μπορεί να περάσει από «μέσα» σε «έξω» χωρίς να αλλάξει τίποτε άλλο.

   ΜΕ ΤΟ ΠΟΔΙ ΚΑΤΩ: το .has-arc το βάζει το motion.js ΜΟΝΟ όταν αναλάβει πραγματικά. */
.site-footer--overmap.has-arc{
  --fa-room: 220px;
  --fa-clip: inset(var(--fa-room) 0 0 0);
  /* ═══ Η ΑΓΚΥΡΩΣΗ (26/8) — ΤΟ ΣΗΜΕΙΟ ΠΟΥ ΖΗΤΗΣΕ Ο ΑΝΤΩΝΗΣ ═══
     🔴 ΤΙ ΒΡΕΘΗΚΕ ΜΕΤΡΩΝΤΑΣ: στο τέρμα της σελίδας η ορατή ακμή του footer κάθεται στο
     screen Y = 0. Δηλαδή ΠΑΝΩ ΤΗΣ ΥΠΑΡΧΟΥΝ ΜΗΔΕΝ PIXEL. Κάθε θόλος —το μισό κάθε
     ταλάντωσης— ήταν ΕΚΤΟΣ ΟΘΟΝΗΣ. Ο επισκέπτης έβλεπε μόνο τη μισή χορδή, γι' αυτό
     φαινόταν «παράταιρο».
     Η ΛΥΣΗ: το footer σταματά --fa-anchor ΠΡΙΝ την κορυφή. Εκεί ακριβώς κουμπώνει και
     εκεί μένει· η κορυφή της καμπύλης έχει πλέον χώρο να παλέψει και να αναπηδήσει.
     ΤΟ ΤΕΛΟΣ ΤΗΣ ΣΕΛΙΔΑΣ ΔΕΝ ΜΕΤΑΚΙΝΕΙΤΑΙ: ό,τι κατεβαίνει το περιθώριο, το αφαιρεί το
     ύψος — αλλιώς θα ξανάνοιγε το κενό που κλείσαμε.
     ⚠ ΣΥΝΕΠΕΙΑ: στο τέρμα φαίνεται μια λωρίδα χάρτη --fa-anchor πάνω από το footer.
     Με --fa-anchor: 0 επιστρέφει ακριβώς στη σημερινή συμπεριφορά (και χάνεται ο θόλος). */
  /* 0 = ΤΟ FOOTER ΚΟΛΛΑΕΙ ΣΤΗΝ ΚΟΡΥΦΗ (26/8: «δεν χρειάζεται αυτό το κενό»).
     Ο θόλος χρειάζεται χώρο για να φανεί — αλλά ΔΕΝ χρειάζεται να τον έχει στο ΤΕΡΜΑ.
     Λύση: το τσίμπημα γίνεται ΝΩΡΙΤΕΡΑ (χορδήΣημείο 0,90 → 0,70), όσο η ακμή είναι ακόμη
     στο ένα τρίτο της οθόνης και έχει άπλετο χώρο. Ως το τέρμα έχει ήδη ησυχάσει ίσια,
     οπότε το footer κάθεται κολλητά πάνω και δεν φαίνεται λωρίδα χάρτη. */
  /* 🔴 ΤΟ ΠΕΡΙΘΩΡΙΟ ΕΙΝΑΙ ΤΟ ΕΦΕ — ΜΗΝ ΤΟ ΜΗΔΕΝΙΣΕΙΣ (26/8, δίδαγμα).
     Το δοκιμάσαμε στο 0 για να φύγει η λωρίδα χάρτη πάνω. Αποτέλεσμα: η κορυφή της
     καμπύλης δεν είχε πού να αγκυρωθεί —ΟΛΟΣ ο θόλος έπεφτε εκτός οθόνης— και ο Αντώνης
     το περιέγραψε ως «χάθηκε το εφέ». Αυτά τα pixel ΔΕΝ είναι κενό: είναι ο χώρος μέσα
     στον οποίο ζει η χορδή. */
  --fa-anchor: 0px;    /* το κενό πάνω φεύγει· τα άκρα φτάνουν στην κορυφή */
  /* ═══ ΠΟΣΟ ΨΗΛΟΤΕΡΑ ΞΕΚΙΝΑΕΙ ΤΟ FOOTER (26/8, εντολή Αντώνη) ═══
     «Το footer τραβιέται κάτω και φαίνεται το προηγούμενο λευκό section.»
     Το footer ανέβαινε ακριβώς μία οθόνη· μέσα από την κοιλιά της καμπύλης ξεπρόβαλλε ό,τι
     ήταν από πάνω. Τώρα ξεκινά --fa-lift ΨΗΛΟΤΕΡΑ, άρα καλύπτει περισσότερο.
     ⚠ ΤΟ ΥΨΟΣ ΜΕΓΑΛΩΝΕΙ ΙΣΟΠΟΣΑ: ό,τι ανεβαίνει η αρχή, προστίθεται στο ύψος — αλλιώς το
     τέλος της σελίδας μετακινείται και ξανανοίγει το κενό κάτω από το footer. */
  /* 🔴 0 — Η ΚΟΡΥΦΗ ΤΟΥ ARC ΠΡΕΠΕΙ ΝΑ ΚΑΘΕΤΑΙ ΣΤΟ ΠΑΝΩ ΑΚΡΟ (26/8, ΜΕΤΡΗΘΗΚΕ).
     Με 25svh η ακμή κατέληγε στα −279px, δηλαδή ΠΑΝΩ ΑΠΟ ΤΗΝ ΟΘΟΝΗ. Ο Αντώνης δεν έβλεπε
     ποτέ «τα πλαϊνά να κατεβαίνουν γύρω από ακίνητο κέντρο», επειδή το κέντρο ήταν εκτός
     κάδρου και ο θόλος σχηματιζόταν αόρατος.
     Με 0 η ακμή κουμπώνει στο screen Y = 0: η κορυφή είναι ΑΚΡΙΒΩΣ στο πάνω άκρο, και
     ανεβαίνοντας τα πλαϊνά κατεβαίνουν γύρω της — ορατά.
     ⚠ Το κόστος: το footer ξεκινά 279px αργότερα, οπότε η ουρά του χάρτη κόπηκε ισόποσα
     (431 → 406svh) με ΞΑΝΑΫΠΟΛΟΓΙΣΜΕΝΑ κατώφλια, ώστε οι κάρτες να μείνουν στα ίδια pixel. */
  --fa-lift: 0svh;
  margin-top: calc(-100svh - var(--fa-room) + var(--fa-anchor) - var(--fa-lift));
  padding-top: calc(clamp(2.5rem, 2rem + 2vw, 4.5rem) + var(--fa-room));
  /* 🔴 ΤΟ ΥΨΟΣ ΠΡΕΠΕΙ ΝΑ ΜΕΓΑΛΩΣΕΙ ΟΣΟ ΚΑΙ Η ΑΝΟΔΟΣ (διορθώθηκε 26/8 — ΜΕΤΡΗΘΗΚΕ).
     ΤΙ ΕΣΠΑΣΕ: το footer ανέβηκε κατά --fa-room, αλλά το ύψος του το κρατούσε το
     min-height: 100svh — άρα ΤΕΛΕΙΩΝΕ 221px ΝΩΡΙΤΕΡΑ και από κάτω του ξέμενε λωρίδα
     χάρτη. Ο Αντώνης το φωτογράφισε: «σκρολάρεις και χαλάει».
     Η άνοδος και το ύψος πρέπει ΠΑΝΤΑ να αλλάζουν μαζί — αλλιώς μετακινείται το τέλος
     της σελίδας. Αν ξαναπειράξεις το ένα, πείραξε και το άλλο. */
  min-height: calc(100svh + var(--fa-room) - var(--fa-anchor) + var(--fa-lift));
  border-radius: 0;
  clip-path: var(--fa-clip);
  will-change: clip-path;
}

/* ═══ ΠΛΟΗΓΗΣΗ ΣΕΛΙΔΑΣ (26/8) ═══
   ΑΡΧΗ #1 TABLET FIRST: 48px ύψος και στα δύο, με αρκετό γέμισμα για δάχτυλο.
   Σε κινητό στοιβάζονται και πιάνουν όλο το πλάτος — δεν στριμώχνονται σε μία σειρά. */
.pagenav{ border-top: 1px solid var(--c-border); background: var(--c-surface-tint);
   padding-block: 1.1rem; }
.pagenav__in{ display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.pagenav a{ display: inline-flex; align-items: center; gap: .5rem; min-height: 48px;
   padding: 0 1.1rem; border-radius: 999px; font: 600 .9rem/1 var(--f-body);
   text-decoration: none; color: var(--c-ink); border: 1px solid var(--c-border);
   background: var(--c-surface); transition: border-color .2s ease, color .2s ease; }
.pagenav a:hover, .pagenav a:focus-visible{ border-color: var(--c-cta); color: var(--c-cta); }
.pagenav svg{ width: 17px; height: 17px; flex: none; }
.pagenav__next{ margin-left: auto; }
@media (max-width: 600px){
  .pagenav__in{ flex-direction: column; align-items: stretch; }
  .pagenav a{ justify-content: center; }
  .pagenav__next{ margin-left: 0; }
}

/* ═══ Η ΑΤΑΚΑ ΣΤΟ FOOTER (26/8) ═══ */
.footer-ataka{ font-family: var(--f-hero); font-weight: var(--fw-hero);
   font-size: clamp(1.25rem, 1rem + 1.4vw, 2.1rem); line-height: 1.25;
   margin: .9rem 0 0; color: rgba(255,255,255,.82); max-width: 24ch; }
.footer-ataka em{ font-style: normal; color: var(--c-accent); }

/* ═══ ΨΙΧΟΥΛΑ / BREADCRUMBS (26/8) ═══
   Στόχοι αφής 44px στους συνδέσμους — είναι πλοήγηση, όχι διακόσμηση (ΑΡΧΗ #1).
   Σε κινητό κυλάνε οριζόντια αντί να σπάνε σε δύο γραμμές: μια διαδρομή που τυλίγεται
   παύει να διαβάζεται ως διαδρομή. */
.crumbs{ border-bottom: 1px solid var(--c-border-soft); background: var(--c-bg); }
.crumbs__list{ list-style: none; margin: 0; padding: 0; display: flex; align-items: center;
   flex-wrap: nowrap; overflow-x: auto; gap: .1rem; font-size: var(--fs-small);
   scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.crumbs__list::-webkit-scrollbar{ display: none; }
.crumbs__list li{ display: flex; align-items: center; white-space: nowrap; }
.crumbs__list li + li::before{ content: '/'; color: var(--c-ink-mute); margin: 0 .1rem;
   opacity: .6; }
.crumbs a, .crumbs span{ display: inline-flex; align-items: center; min-height: 44px;
   padding: 0 .5rem; color: var(--c-ink-mute); text-decoration: none; }
.crumbs a{ color: var(--c-cta); }
.crumbs a:hover, .crumbs a:focus-visible{ text-decoration: underline; text-underline-offset: 3px; }
.crumbs [aria-current="page"]{ color: var(--c-ink); font-weight: 600; }

/* ═══ ΧΑΡΤΗΣ ΣΕ ΣΤΑΘΕΡΟ ΥΨΟΣ — σελίδα Επικοινωνίας (26/8) ═══
   Στην αρχική ο χάρτης πιάνει 500svh με κολλημένη σκηνή, γιατί εκεί είναι ΕΜΠΕΙΡΙΑ.
   Εδώ είναι ΠΛΗΡΟΦΟΡΙΑ: ένα κουτί που το βλέπεις και προχωράς. */
.mapsec--static{ height: auto; margin-top: 0; z-index: auto; }
.mapsec--static .mapsec__stage{ position: relative; height: clamp(20rem, 55svh, 34rem);
   border-radius: var(--radius-lg); overflow: hidden; border: 1px solid var(--c-border); }

/* τηλέφωνο στην κάρτα παραρτήματος */
.branch-card__tel{ display: inline-flex; align-items: center; gap: .5rem; min-height: 44px;
   color: var(--c-cta); font-weight: 600; font-size: var(--fs-small); text-decoration: none;
   margin-top: .6rem; }
.branch-card__tel svg{ width: 17px; height: 17px; flex: none; }
.branch-card__tel-empty{ color: var(--c-ink-mute); font-weight: 400; font-style: italic; }

/* τηλέφωνο μέσα στην κάρτα του χάρτη (26/8) — στόχος αφής 44px */
.mapcard__tel{ display: inline-flex; align-items: center; gap: .45rem; min-height: 44px;
   color: var(--c-cta); font-weight: 600; font-size: var(--fs-small); text-decoration: none; }
.mapcard__tel svg{ width: 16px; height: 16px; flex: none; }
.mapcard__tel span:only-of-type{ font-weight: 400; }
.mapcard__tel[href="tel:"] span{ color: var(--c-ink-mute); font-weight: 400; font-style: italic; }

/* ═══ ΚΙΤΡΙΝΗ ΥΠΟΓΡΑΜΜΙΣΗ ΜΕΣΑ ΣΕ ΚΕΙΜΕΝΟ (26/8, αίτημα Αντώνη) ═══
   Το ίδιο σχήμα με την υπογράμμιση του μετρητή των λόγων — εκείνη είναι border κάτω από
   έναν αριθμό· εδώ χρειάζεται text-decoration, γιατί μια φράση μέσα σε παράγραφο μπορεί να
   σπάσει σε δύο γραμμές και το border θα ζωγράφιζε λάθος.
   ΠΑΧΟΣ 3px ΚΑΙ ΟΧΙ 5: ο μετρητής είναι 48px, δηλαδή το 5px είναι το 10% του ύψους του.
   Το ίδιο ποσοστό σε κείμενο 18px βγάζει 1,9px — πολύ αδύναμο για το κίτρινο σε ανοιχτό
   φόντο (σημειωμένο ήδη στον κώδικα του μετρητή). Τα 3px είναι το σημείο όπου διαβάζεται
   ως σχήμα χωρίς να πνίγει τη γραμμή.
   skip-ink: none → ενιαία μπάρα, όπως του μετρητή, αντί για γραμμή με κενά. */
/* ΜΑΡΚΑΔΟΡΟΣ, ΟΧΙ ΓΡΑΜΜΗ (διόρθωση 26/8): είχα καταλάβει «υπογράμμιση» κυριολεκτικά και
   έβαλα γραμμή από κάτω. Ο Αντώνης εννοούσε γεμάτο φόντο πίσω από τις λέξεις.
   ΧΡΩΜΑ ΓΡΑΜΜΑΤΩΝ: --c-volt-ink και όχι το κανονικό μελάνι του κειμένου. Το ζευγάρι
   volt/volt-ink υπάρχει ΗΔΗ στο site (κουμπί κεφαλίδας) — δεν εισάγεται νέος συνδυασμός.
   box-decoration-break: clone → αν η φράση σπάσει σε δύο γραμμές, καθεμιά παίρνει δικές της
   γωνίες και δικό της γέμισμα, αντί για ένα κομμένο ορθογώνιο.
   Το κάθετο γέμισμα είναι .1em (≈2px στα 18): βάφει, χωρίς να ανοίγει τις γραμμές. */
.u-volt{ background: var(--c-volt); color: var(--c-volt-ink);
   padding: .1em .25em; border-radius: .2em;
   -webkit-box-decoration-break: clone; box-decoration-break: clone; }

/* ═══ ΤΟ ΚΟΥΜΠΙ ΤΟΥ ΒΙΝΤΕΟ + ΤΟ ΠΛΗΡΕΣ ΒΙΝΤΕΟ (26/8) ═══
   ΤΟ ΚΟΥΜΠΙ: κεντραρισμένο πάνω στο κάδρο, εμφανίζεται σταδιακά μαζί με το ξεδίπλωμα
   (τη διαφάνεια τη γράφει το motion.js). ΣΤΟΧΟΣ ΑΦΗΣ 64px — ΑΡΧΗ #1: ταμπλέτα, με δάχτυλο,
   πάνω από το ελάχιστο 44. Λευκό σε βίντεο: σκιά για να διαβάζεται σε ανοιχτά καρέ. */
.showreel__play{
  position: absolute; z-index: 3; left: 50%; top: 50%; transform: translate(-50%,-50%);
  display: inline-flex; align-items: center; gap: .7rem;
  min-height: 64px; padding: 0 1.6rem 0 1.1rem;
  border: 0; border-radius: 999px; cursor: pointer;
  background: rgba(12,20,0,.42); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  color: #fff; font-family: var(--f-display-ui); font-weight: 600; font-size: 1rem;
  letter-spacing: .01em; text-shadow: 0 1px 12px rgba(0,0,0,.45);
  opacity: 0; pointer-events: none;   /* τα ανοίγει το motion.js όταν ξεδιπλώσει */
  transition: background var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
}
.showreel__play svg{ width: 34px; height: 34px; flex: none; }
.showreel__play:hover{ background: rgba(12,20,0,.62); }
.showreel__play:focus-visible{ outline: 3px solid var(--c-volt); outline-offset: 3px; }
@media (max-width: 699.98px){ .showreel__play span{ display: none; } .showreel__play{ padding: 0 1.1rem; } }

/* ΤΟ ΠΛΗΡΕΣ — απλό, σκούρο, χωρίς εφέ: εδώ ο επισκέπτης ήρθε να ΔΕΙ, όχι να εντυπωσιαστεί. */
.vmodal{ position: fixed; inset: 0; z-index: 200; display: grid; place-items: center; padding: clamp(1rem,4vw,3rem); }
.vmodal[hidden]{ display: none; }
.vmodal__back{ position: absolute; inset: 0; background: rgba(6,10,16,.92); }
.vmodal__box{ position: relative; width: min(100%, 1400px); }
.vmodal__video{ width: 100%; max-height: 84vh; display: block; border-radius: 14px; background: #000; }
.vmodal__close{
  position: absolute; right: 0; top: -3.2rem;
  width: 48px; height: 48px; display: grid; place-items: center;
  border: 0; border-radius: 999px; cursor: pointer;
  background: rgba(255,255,255,.14); color: #fff;
}
.vmodal__close:hover{ background: rgba(255,255,255,.26); }
.vmodal__close:focus-visible{ outline: 3px solid var(--c-volt); outline-offset: 3px; }
.vmodal__close svg{ width: 22px; height: 22px; }

/* ΟΣΟ ΕΙΝΑΙ ΑΝΟΙΧΤΟ ΤΟ ΒΙΝΤΕΟ, ΦΕΥΓΟΥΝ ΤΑ ΣΤΑΘΕΡΑ ΣΤΟΙΧΕΙΑ (26/8 — ΤΟ ΕΙΔΑ ΣΕ ΦΩΤΟΓΡΑΦΙΑ).
   Το ✕ κάθεται πάνω δεξιά και έπεφτε ΑΚΡΙΒΩΣ πάνω στο κουμπί του μενού: δύο στρογγυλά
   κουμπιά κολλητά, με το ένα να σκεπάζει το άλλο. Το z-index δεν το έλυνε — το ✕ ήταν ήδη
   από πάνω· το πρόβλημα ήταν οπτικό, όχι σειράς. Όσο παίζει το βίντεο, τίποτε άλλο δεν έχει
   δουλειά στην οθόνη: κρύβονται και το μενού και το ταξιδεμένο «Μ». */
html.is-vmodal .site-header,
html.is-vmodal .burger,
html.is-vmodal .vhero__wordmark,
html.is-vmodal .wm-darklayer{ visibility: hidden; }

/* ═══ «ΠΛΗΡΗΣ ΠΡΟΒΟΛΗ» ΕΠΕΦΤΕ ΠΑΝΩ ΣΤΟ «ΑΝΟΙΓΜΑ ΣΤΟΥΣ ΧΑΡΤΕΣ» (26/8 — φωτογραφίες Αντώνη) ═══
   ΓΙΑΤΙ: και τα δύο ήταν αγκυρωμένα στον ΠΑΤΟ. Το «Πλήρης προβολή» είναι absolute στο
   bottom: 1,6rem της ενότητας· το «Άνοιγμα στους χάρτες» ζει ΜΕΣΑ στην κάρτα, που σε κινητό
   με ζουμ κάθεται κι αυτή στον πάτο. Σε φαρδιά οθόνη δεν συναντιούνται ποτέ, γιατί η κάρτα
   είναι δίπλα στην καρφίτσα — γι' αυτό δεν είχε φανεί.
   ΓΙΑΤΙ ΠΑΝΩ-ΑΡΙΣΤΕΡΑ: δεξιά κάθεται η καρτέλα «Επεξεργασία», κάτω η κάρτα. Πάνω-αριστερά
   είναι το μόνο σημείο που μένει ελεύθερο σε κάθε ύψος οθόνης.
   Ο στόχος αφής μένει 56px — δεν μικραίνει επειδή μετακινήθηκε. */
@media (max-width: 699.98px){
  .mapsec.is-zoomed .mapsec__back{
    left: var(--pad-x); right: auto; bottom: auto; top: clamp(.9rem, 2.5vh, 1.6rem);
    transform: none; padding: 0 1.15rem 0 .95rem; font-size: .85rem; }
  .mapsec.is-zoomed .mapsec__back .fsico{ width: 20px; height: 20px; }
}

/* ΑΝΑΣΑ ΑΝΑΜΕΣΑ ΣΤΟ «ΠΟΥ ΘΑ ΜΑΣ ΒΡΕΙΤΕ» ΚΑΙ ΣΤΟΝ ΤΙΤΛΟ (27/8 — φωτογραφία Αντώνη).
   Η κορυφή του «3» ακουμπούσε το eyebrow από πάνω. Δεν είναι επικάλυψη, είναι έλλειψη
   περιθωρίου: ο τίτλος είναι πολύ μεγάλος και το ύψος γραμμής τον σφίγγει προς τα πάνω.
   Μόνο σε κινητό — σε φαρδιά οθόνη η απόσταση είναι ήδη σωστή. */
@media (max-width: 699.98px){
  .mapsec__head h2{ margin-top: .55rem; }
}

/* ═══ ΟΙ ΤΡΕΙΣ ΧΩΡΟΙ — σελίδα Επικοινωνίας (27/8) ═══
   ΤΙ ΑΠΑΝΤΑ Η ΣΕΛΙΔΑ: όχι «πού είναι στον χάρτη» (αυτό το κάνει η αρχική), αλλά
   «τι ώρα ανοίγουν» και «πώς τους παίρνω τηλέφωνο». Γι' αυτό τα στοιχεία είναι λίστα
   ορισμών, όχι παράγραφος: ο γονιός σαρώνει, δεν διαβάζει.
   ΤΡΕΙΣ ΣΤΗΛΕΣ ΜΟΝΟ ΑΠΟ 900px: στα 768 (ταμπλέτα κάθετα) τρεις στήλες αφήνουν ~220px
   ανά κάρτα — η διεύθυνση σπάει σε τέσσερις γραμμές. Στα 900 βγαίνουν ~270px και δουλεύει. */
.venues{ display: grid; grid-template-columns: 1fr; gap: clamp(1.2rem, .9rem + 1.4vw, 2rem);
   margin-top: var(--sp-block); }
@media (min-width: 620px){ .venues{ grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px){ .venues{ grid-template-columns: repeat(3, 1fr); } }

.venue{ display: flex; flex-direction: column;
   background: var(--c-surface); border: 1px solid var(--c-border-soft);
   border-radius: var(--radius-lg); overflow: clip; }
/* 4:3 και cover: οι τρεις φωτογραφίες δεν έχουν ίδιες διαστάσεις — χωρίς σταθερή αναλογία
   οι κάρτες θα έβγαιναν άνισες και η σειρά θα «σκάλωνε». */
.venue__photo img{ display: block; width: 100%; height: auto; aspect-ratio: 4 / 3;
   object-fit: cover; background: var(--c-surface-tint); }
.venue__body{ padding: clamp(1rem, .8rem + .8vw, 1.4rem); }
.venue__eyebrow{ font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
   font-weight: 700; color: var(--c-teal-500); }
.venue__name{ font-family: var(--f-hero); font-weight: 300; letter-spacing: -.01em;
   font-size: 1.5rem; line-height: 1.1; margin: .15rem 0 .8rem; }

/* Ετικέτα-τιμή σε δύο στήλες: η ετικέτα μικρή και ξεθωριασμένη, η τιμή δυνατή.
   Το «Ωράριο» και το «Τηλέφωνο» είναι ο λόγος που ήρθε εδώ ο επισκέπτης. */
.venue__info{ display: grid; grid-template-columns: auto 1fr; gap: .35rem .9rem;
   margin: 0; font-size: .95rem; }
.venue__info dt{ color: var(--c-ink-soft); font-size: .8rem; letter-spacing: .04em;
   text-transform: uppercase; align-self: baseline; padding-top: .12em; }
.venue__info dd{ margin: 0; font-weight: 600; line-height: 1.35; }
.venue__note{ display: block; font-weight: 400; font-size: .8rem; color: var(--c-ink-soft); }
/* ΑΡΧΗ #1 — ΤΑΜΠΛΕΤΑ, ΜΕ ΔΑΧΤΥΛΟ: το τηλέφωνο είναι σύνδεσμος κλήσης· 44px στόχος αφής. */
.venue__info a{ display: inline-block; min-height: 44px; line-height: 44px;
   color: var(--c-ink); text-decoration: underline; text-decoration-thickness: 2px;
   text-underline-offset: .18em; }
.venue__info a:hover, .venue__info a:focus-visible{ color: var(--c-teal-500); }

.venues__central{ margin-top: clamp(1.4rem, 1rem + 1.5vw, 2.2rem);
   color: var(--c-ink-soft); font-size: 1rem; }
.venues__central a{ color: var(--c-ink); font-weight: 600;
   text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: .18em;
   display: inline-block; min-height: 44px; line-height: 44px; }
.venues__central a:hover, .venues__central a:focus-visible{ color: var(--c-teal-500); }

/* ---------- «Έχω κι άλλο παιδί» (27/8) ----------
   ΑΡΧΗ #1 TABLET FIRST: το κουμπι και το «−» ειναι 44px υψος — πιανονται με δαχτυλο.
   Γραμμικο εικονιδιο σε currentColor, χωρις χρωματα. */
.nadd{ display:inline-flex; align-items:center; gap:.5rem; min-height:44px; padding:0 1rem;
  margin-top:.35rem; border:1px dashed currentColor; border-radius:999px; background:none;
  color:var(--c-brand,#00807D); font:inherit; font-size:.92rem; cursor:pointer;
  align-self:flex-start;   /* να μην τεντωνεται σε ολο το πλατος της φορμας */
  /* ⚠ ΚΑΜΙΑ μεταβαση στο opacity: το animation αποκαλυψης της φορμας (GSAP) γραφει
     opacity σε καθε καρε — η CSS transition το κυνηγαει και κολλαει στο 0,14.
     Μετρημενο 27/8 με getAnimations(). */
  transition:background .2s ease; }
.nadd:hover,.nadd:focus-visible{ background:rgba(0,128,125,.07); }
.nadd[hidden]{ display:none; }
.nadd svg{ width:18px; height:18px; flex:none; }
/* ιδια αναπνοη με τα υπολοιπα πεδια της φορμας */
.nfield--kid{ margin-top:1.15rem; }
.nkid-row{ display:flex; align-items:center; gap:.5rem; }
.nkid-row select{ flex:1 1 auto; min-width:0; }
.nkid-remove{ flex:none; width:44px; height:44px; display:inline-flex; align-items:center;
  justify-content:center; border:1px solid rgba(0,0,0,.18); border-radius:50%;
  background:none; color:inherit; cursor:pointer; }
.nkid-remove:hover,.nkid-remove:focus-visible{ background:rgba(0,0,0,.05); }
.nkid-remove svg{ width:18px; height:18px; }

/* ---------- Διεύθυνση παραρτήματος στη φόρμα (27/8) ----------
   ΜΙΑ γραμμή σε desktop/tablet, με το κουμπί στο τέλος. Σε στενή οθόνη σπάει και
   το κουμπί πέφτει από κάτω — 44px ύψος, πιάνεται με δάχτυλο (ΑΡΧΗ #1). */
.nbranch{ display:flex; align-items:center; flex-wrap:wrap; gap:.45rem .7rem;
  margin:.15rem 0 0; padding:.55rem .8rem; border-radius:12px;
  background:rgba(0,128,125,.06); font-size:.9rem; line-height:1.4; }
.nbranch[hidden]{ display:none; }
.nbranch__pin{ width:18px; height:18px; flex:none; opacity:.75; }
.nbranch__map{ display:inline-flex; align-items:center; gap:.4rem; min-height:44px;
  margin-left:auto; padding:0 .85rem; border-radius:999px;
  border:1px solid currentColor; color:var(--c-brand,#00807D);
  font-size:.86rem; font-weight:600; text-decoration:none; white-space:nowrap;
  transition:background .2s ease; }
.nbranch__map:hover,.nbranch__map:focus-visible{ background:rgba(0,128,125,.1); }
.nbranch__map svg{ width:16px; height:16px; flex:none; }
@media (max-width:560px){ .nbranch__map{ margin-left:0; width:100%; justify-content:center; } }
