/* ============================================================
   Inter — self-hosted (public/fonts/), ΟΧΙ Google Fonts CDN (offline-first, ίδιο "όλα
   τοπικά" convention με React/Babel/dnd-kit στο index.html). Επιλέχθηκε αντί για την
   Hanken Grotesk του "Luminous Retail" design system γιατί η Hanken Grotesk δεν έχει
   ελληνικούς χαρακτήρες στο Google Fonts — το ελληνικό κείμενο (η πλειοψηφία της
   εφαρμογής) θα έπεφτε στο system fallback ούτως ή άλλως. Δύο αρχεία ανά βάρος (greek +
   latin, ίδιο unicode-range split που χρησιμοποιεί ΚΑΙ η ίδια η Google) — ο browser
   κατεβάζει μόνο το subset που πραγματικά χρειάζεται για το κείμενο της σελίδας.
   ============================================================ */
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 300; font-display: swap;
  src: url('/fonts/inter-light-greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 300; font-display: swap;
  src: url('/fonts/inter-light-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/fonts/inter-regular-greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/fonts/inter-regular-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap;
  src: url('/fonts/inter-semibold-greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap;
  src: url('/fonts/inter-semibold-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/fonts/inter-bold-greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
  font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/fonts/inter-bold-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ============================================================
   Design tokens — Light (default) + Dark (data-theme="dark") overrides.
   Το topbar/nav-trigger/auth screens/tooltip ΜΕΝΟΥΝ σκούρα ανεξαρτήτου theme (μόνιμο
   "chrome", ίδιο μοτίβο συνέπειας παντού) — δικά τους fixed tokens, δεν ακολουθούν το toggle.
   Categorical/status χρώματα (πχ domain, division, pending-state) είναι named pairs
   (bg/fg) ώστε μία αλλαγή τιμής να ενημερώνει ΟΛΕΣ τις χρήσεις τους μαζί.
   ============================================================ */
:root {
  /* surfaces — "Luminous Retail" design system (redesign platform/luminous_retail/DESIGN.md),
     Material-3-style surface/on-surface roles. "Airy" αισθητική: vast off-white foundation,
     tonal shifts αντί για heavy borders. */
  --bg: #f8f9fa;                /* surface/background */
  --panel: #ffffff;             /* surface-container-lowest */
  --panel-2: #f3f4f5;           /* surface-container-low — nested/header/sticky/zebra surfaces */
  --panel-3: #edeeef;           /* surface-container — hover tint of panel-2 */
  /* text */
  --ink: #191c1d;               /* on-surface */
  --ink-soft: #4b4542;          /* on-surface-variant, ελαφρώς πιο ουδέτερο από το raw token
                                    (#5b403a ήταν πολύ καφέ για σώμα κειμένου) */
  --muted: #5d5e61;             /* secondary */
  /* borders — σκόπιμα πολύ χαμηλής αντίθεσης (DESIGN.md: "λειτουργούν σαν οδηγός, όχι τοίχος") */
  --line: #e7e8e9;              /* surface-container-high */
  --line-soft: #f3f4f5;
  /* brand — "Public Orange" #F05023 (DESIGN.md prose) — ίδια οικογένεια με το ήδη υπάρχον
     brand orange, ενοποιημένο accent/brand σε ένα seed αντί για δύο κοντινές αποχρώσεις. */
  --accent: #f05023;
  --accent-d: #ae2a00;
  --accent-tint: #ffdbd1;
  --brand: #f05023;
  --brand-d: #ae2a00;
  /* semantic status */
  --ok: #12915a;
  --ok-bg: #e3f6ec;
  --danger: #c23a2e;
  --danger-bg: #fbeae8;
  --amber: #a5700f;
  --amber-bg: #fdf1de;
  --warn-bg: #fbeae8;
  --teal: #0a7a7a;
  --teal-bg: #e0f2f1;
  /* categorical pairs — domain/division/status chips, reused across pills/borders/headers.
     *-light variants: μεσαία απόχρωση για border-left accents (request-card) όπου το πλήρες
     -bg (πολύ ανοιχτό) ή -fg (πολύ σκούρο/κορεσμένο) δεν έχουν αρκετή διαβάθμιση μεταξύ τους. */
  --cat-blue-bg: #e5edfd; --cat-blue-fg: #2a52c9; --cat-blue-light: #7ea3ee;
  --cat-orange-bg: #fdeee0; --cat-orange-fg: #b4620f; --cat-orange-light: #eda85f;
  --cat-purple-bg: #f1e9fb; --cat-purple-fg: #7938c4;
  --cat-teal-bg: #dff3f1; --cat-teal-fg: #0a7a72;
  --cat-amber-bg: #fdf3da; --cat-amber-fg: #8a6608;
  --cat-gray-bg: #eef0f4; --cat-gray-fg: #667089;
  /* domain (display/feed) inline swatches — approvalPill gradient text, ξεχωριστά από τα
     cat-blue/cat-orange παραπάνω γιατί οι αποχρώσεις είναι σκόπιμα λίγο πιο σκούρες
     (χρειάζονται αντίθεση πάνω σε λευκό ως solid gradient background, όχι text-on-tint). */
  --domain-display-fg: #2f52b3;
  --domain-feed-fg: #b56419;
  /* ομάδα καταστήματος (Orange/Orange+/White/White+, βλ. STORE_GROUP_COLOR στο app.jsx) —
     4 σταθερά, διακριτά χρώματα, άσχετα με τα cat-* tokens παραπάνω (διαφορετική έννοια). */
  --store-orange-fg: #e07b1a;
  --store-orangeplus-fg: #d9b100;
  --store-white-fg: #3f6fd1;
  --store-whiteplus-fg: #8a4fd1;
  /* pending/highlight matrix states — hand-picked, must stay distinct + legible */
  --pending-bg: #fef2df;
  --pending-row-hover: #fbe8c8;
  --pending-submitted-bg: #e5edfd;
  --pending-submitted-row-hover: #d5e2fa;
  --pending-feed-bg: #fdeee0;
  --pending-feed-row-hover: #fbdfc2;
  --cluster-highlight-bg: #f1e9fb;
  --cluster-highlight-fg: #7938c4;
  /* overlay/shadow — "Ambient Shadows" (DESIGN.md Elevation & Depth): πολύ diffused, χαμηλής
     έντασης, όχι σκληρή άκρη — level 1 (cards) πολύ ήπιο, level 2 (overlays/drawers) πιο
     αισθητό. full box-shadow value strings ώστε opacity/color να διαφέρουν ανά theme. */
  --overlay: rgba(25, 28, 29, 0.45);
  --shadow-sm: 0 1px 2px rgba(25, 28, 29, 0.05);
  --shadow-md: 0 8px 30px -6px rgba(25, 28, 29, 0.08);
  --shadow-lg: 0 20px 60px -12px rgba(25, 28, 29, 0.16);
  --shadow-drawer: -16px 0 48px rgba(25, 28, 29, 0.12);
  /* fixed-dark tokens — chrome that never flips (tooltips, auth hero) — ΠΙΑ ΟΧΙ το topbar,
     το νέο sidebar/header ακολουθούν κανονικά το theme (βλ. §3 του πλάνου). */
  --ink-fixed: #12161f;
  --ink-fixed-2: #1b202e;
  /* type + spacing — Inter, self-hosted (βλ. @font-face block στην κορυφή του αρχείου) — ΟΧΙ
     Hanken Grotesk (η DESIGN.md επιλογή) γιατί δεν έχει ελληνικούς χαρακτήρες στο Google Fonts.
     System-font stack μένει ως fallback chain, όχι αντικαθίσταται. */
  --mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
  --sans: 'Inter', system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  /* shapes — "Soft Roundedness" (DESIGN.md Shapes): 12px standard (ήταν 10), 16px μεγάλα
     containers (ίδιο), + νέο xl (24px) και pill (999px, buttons/badges). */
  --radius-sm: 8px;
  --radius-md: 12px;
  --radius-lg: 16px;
  --radius-xl: 24px;
  --radius-pill: 999px;
  /* spacing scale — 4px base unit, + νέο 10/16 (40px/64px) για τα "airy" section gaps
     (DESIGN.md spacing.lg/xl) που δεν υπήρχαν πριν. */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --space-10: 40px;
  --space-16: 64px;
}

/* Dark overrides — :root:not([data-theme="light"]) καλύπτει το "system" resolution
   (prefers-color-scheme) όταν δεν έχει γίνει καμία ρητή επιλογή· :root[data-theme="dark"]
   κερδίζει πάντα όταν ο χρήστης έχει επιλέξει ρητά dark, ανεξαρτήτου OS setting. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) { color-scheme: dark; }
  :root:not([data-theme="light"]) {
    /* "Luminous Retail" dark — σκούρο μπλε (variant 1/default, ζητήθηκε ρητά συγκεκριμένη
       απόχρωση, όχι ουδέτερο γκρι — το γκρι ζει τώρα ως variant 3, βλ. [data-variant] blocks
       πιο κάτω). --accent (Public Orange, primary-fixed-dim #ffb5a1) μένει ίδιο σε κάθε variant. */
    --bg: #0a1420;
    --panel: #101d2e;
    --panel-2: #172940;
    --panel-3: #1f3652;
    --ink: #eef4fb;
    --ink-soft: #b6c7dc;
    --muted: #7f93ad;
    --line: #28405e;
    --line-soft: #182940;
    --accent: #ffb5a1;
    --accent-d: #ff9272;
    --accent-tint: #3c1f16;
    --brand: #ffb5a1;
    --brand-d: #ff9272;
    --ok: #3ecb84;
    --ok-bg: #16321f;
    --danger: #ff6b5c;
    --danger-bg: #3a1c18;
    --amber: #e0ab4f;
    --amber-bg: #3a2c11;
    --warn-bg: #3a1c18;
    --teal: #3fd3c8;
    --teal-bg: #123230;
    --cat-blue-bg: #1c2b4d; --cat-blue-fg: #8fb0ff; --cat-blue-light: #5c85dd;
    --cat-orange-bg: #402a15; --cat-orange-fg: #f5aa62; --cat-orange-light: #d18a42;
    --cat-purple-bg: #2c1f45; --cat-purple-fg: #c8a3f5;
    --cat-teal-bg: #0f2e2b; --cat-teal-fg: #5fe0d3;
    --cat-amber-bg: #362a10; --cat-amber-fg: #f0c374;
    --cat-gray-bg: #232a3a; --cat-gray-fg: #8b94a8;
    --domain-display-fg: #7ea3ee;
    --domain-feed-fg: #eda85f;
    --store-orange-fg: #e0973f;
    --store-orangeplus-fg: #e0c74a;
    --store-white-fg: #7ea3ee;
    --store-whiteplus-fg: #b48ceb;
    --pending-bg: #362a10; --pending-row-hover: #453411;
    --pending-submitted-bg: #1c2b4d; --pending-submitted-row-hover: #24355e;
    --pending-feed-bg: #402a15; --pending-feed-row-hover: #4d331a;
    --cluster-highlight-bg: #2c1f45; --cluster-highlight-fg: #c8a3f5;
    --overlay: rgba(3, 4, 8, 0.68);
    --shadow-sm: 0 1px 3px rgba(0, 0, 0, .5);
    --shadow-md: 0 10px 28px rgba(0, 0, 0, .55);
    --shadow-lg: 0 24px 64px rgba(0, 0, 0, .6);
    --shadow-drawer: -12px 0 40px rgba(0, 0, 0, .55);
  }
}
:root[data-theme="dark"] {
  color-scheme: dark;
  --bg: #0a1420;
  --panel: #101d2e;
  --panel-2: #172940;
  --panel-3: #1f3652;
  --ink: #eef4fb;
  --ink-soft: #b6c7dc;
  --muted: #7f93ad;
  --line: #28405e;
  --line-soft: #182940;
  --accent: #ffb5a1;
  --accent-d: #ff9272;
  --accent-tint: #3c1f16;
  --brand: #ffb5a1;
  --brand-d: #ff9272;
  --ok: #3ecb84;
  --ok-bg: #16321f;
  --danger: #ff6b5c;
  --danger-bg: #3a1c18;
  --amber: #e0ab4f;
  --amber-bg: #3a2c11;
  --warn-bg: #3a1c18;
  --teal: #3fd3c8;
  --teal-bg: #123230;
  --cat-blue-bg: #1c2b4d; --cat-blue-fg: #8fb0ff; --cat-blue-light: #5c85dd;
  --cat-orange-bg: #402a15; --cat-orange-fg: #f5aa62; --cat-orange-light: #d18a42;
  --cat-purple-bg: #2c1f45; --cat-purple-fg: #c8a3f5;
  --cat-teal-bg: #0f2e2b; --cat-teal-fg: #5fe0d3;
  --cat-amber-bg: #362a10; --cat-amber-fg: #f0c374;
  --cat-gray-bg: #232a3a; --cat-gray-fg: #8b94a8;
  --domain-display-fg: #7ea3ee;
  --domain-feed-fg: #eda85f;
  --store-orange-fg: #e0973f;
  --store-orangeplus-fg: #e0c74a;
  --store-white-fg: #7ea3ee;
  --store-whiteplus-fg: #b48ceb;
  --pending-bg: #362a10; --pending-row-hover: #453411;
  --pending-submitted-bg: #1c2b4d; --pending-submitted-row-hover: #24355e;
  --pending-feed-bg: #402a15; --pending-feed-row-hover: #4d331a;
  --cluster-highlight-bg: #2c1f45; --cluster-highlight-fg: #c8a3f5;
  --overlay: rgba(3, 4, 8, 0.68);
  --shadow-sm: 0 1px 3px rgba(0, 0, 0, .5);
  --shadow-md: 0 10px 28px rgba(0, 0, 0, .55);
  --shadow-lg: 0 24px 64px rgba(0, 0, 0, .6);
  --shadow-drawer: -12px 0 40px rgba(0, 0, 0, .55);
}

/* ---------- theme variants (3 βασικά χρώματα ανά mode, ζητήθηκε ρητά — genuinely distinct
   hues, όχι απλά διαφορετική φωτεινότητα: light = λευκό (variant 1)/μπλε pop (2)/πράσινο pop
   (3), dark = μπλε (variant 1, ήδη το base παραπάνω)/κυπαρίσι (2)/γκρι (3). ---------- */
/* [data-variant] υπάρχει μόνο μαζί με ρητό [data-theme] (applyThemeAttr στο app.jsx) — δεν
   χρειάζεται να καλυφθεί το 'system' εδώ. Μόνο surface/text/border tokens αλλάζουν ανά variant
   — accent (Public Orange) και semantic/status χρώματα (ok, danger, amber, teal, cat-x, domain-x,
   store-x, pending-x) μένουν ΙΔΙΑ σε όλα τα variants, ίδιο brand identity/ήδη-συντονισμένη
   παλέτα. variant 1 = χωρίς override (ήδη το base :root/[data-theme="dark"] παραπάνω). */
:root[data-theme="light"][data-variant="2"] {
  --bg: #eaf2fc; --panel: #ffffff; --panel-2: #dbe9f8; --panel-3: #c2daf2;
  --ink: #0f2038; --ink-soft: #35507a; --muted: #5c7aa3;
  --line: #b3d0ec; --line-soft: #dbe9f8;
}
:root[data-theme="light"][data-variant="3"] {
  /* "Πράσινο" (κυπαρίσι, ανοιχτό) */
  --bg: #eaf6ee; --panel: #ffffff; --panel-2: #dbefe0; --panel-3: #c0e3c9;
  --ink: #0e2418; --ink-soft: #2f5940; --muted: #547d63;
  --line: #aedbba; --line-soft: #dbefe0;
}
:root[data-theme="dark"][data-variant="2"] {
  /* "Κυπαρίσι" (σκούρο πράσινο) */
  --bg: #0a160f; --panel: #0f2016; --panel-2: #16301f; --panel-3: #1e4029;
  --ink: #edf7ef; --ink-soft: #b3ccb9; --muted: #7d9a84;
  --line: #2a4a34; --line-soft: #183622;
}
:root[data-theme="dark"][data-variant="3"] {
  /* "Γκρι" — ουδέτερο, χωρίς hue tint (αντίθετα με τα άλλα δύο dark variants) */
  --bg: #17181a; --panel: #1e2021; --panel-2: #26282a; --panel-3: #2e3133;
  --ink: #f0f1f2; --ink-soft: #c7cacc; --muted: #999c9e;
  --line: #35383a; --line-soft: #27292b;
}

* { box-sizing: border-box; }
html, body { margin: 0; height: 100%; }
body {
  font-family: var(--sans);
  color: var(--ink);
  background: var(--bg);
  font-size: 14px;
  line-height: 1.45;
  letter-spacing: -.005em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  transition: background-color .15s ease, color .15s ease;
}
h1, h2, h3 { font-weight: 700; letter-spacing: -.01em; margin: 0; }
::selection { background: var(--accent-tint); color: var(--accent-d); }
/* Γενικό utility — δευτερεύον/λιγότερο σημαντικό κείμενο (hints, disabled-reasons, notes),
   used ελεύθερα σε drawers/pages χωρίς να χρειάζεται τοπικό scoped rule ανά χρήση. */
.muted { color: var(--muted); }
.boot { padding: 40px; color: var(--muted); }
/* Λεπτότερη, πιο σύγχρονη scrollbar σε webkit browsers — αφήνει το native OS scrollbar σε
   Firefox/άλλα (καμία JS custom-scrollbar βιβλιοθήκη, καθαρό CSS-only enhancement). */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--line); border-radius: 8px; border: 2px solid var(--bg); background-clip: padding-box; }
::-webkit-scrollbar-thumb:hover { background: var(--muted); background-clip: padding-box; }

/* ---------- desktop-only gate ---------- */
#root { display: none; }
.desktop-gate { display: none; }
@media (min-width: 900px) {
  #root { display: block; }
  .desktop-gate { display: none; }
}
@media (max-width: 899px) {
  .desktop-gate {
    display: flex; min-height: 100vh; align-items: center; justify-content: center;
    text-align: center; padding: 32px;
    background: linear-gradient(135deg, var(--ink-fixed) 0%, var(--ink-fixed-2) 100%);
    color: #fff;
  }
  .desktop-gate-inner { max-width: 360px; }
  .desktop-gate-icon { font-size: 40px; margin-bottom: 14px; }
  .desktop-gate-inner b { display: block; font-size: 18px; margin-bottom: 8px; }
  .desktop-gate-inner p { font-size: 13.5px; line-height: 1.6; color: #c3ccdd; margin: 0; }
}

/* ---------- wordmark logo (μονοχρωματικό SVG, CSS mask αντί για <img>) ---------- */
/* Το /wordmark.svg είναι ένα ενιαίο path — με CSS mask (background-color: currentColor) το
   χρώμα ελέγχεται 100% από το CSS `color` ανά context/theme, όχι δεμένο στο δικό του fill.
   Πλατύ layout (viewBox ~4.67:1, wordmark όχι τετράγωνο icon) — width/height ρυθμίζονται
   ξεχωριστά ανά χρήση (sidebar vs login hero) αντί για ένα κοινό μέγεθος. */
.wordmark {
  display: inline-block; flex: none;
  background-color: currentColor;
  -webkit-mask-image: url(/wordmark.svg); mask-image: url(/wordmark.svg);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-position: left center; mask-position: left center;
}
/* Dedicated "P" glyph (δικό του καθαρό SVG, όχι crop του wordmark — βλ. .sidebar-logo-crop
   παρακάτω) για το collapsed sidebar. */
.wordmark-p {
  -webkit-mask-image: url(/logo-p.svg); mask-image: url(/logo-p.svg);
}

/* ---------- app shell: sidebar + header ---------- */
/* Κάθετο icon-rail sidebar αριστερά (collapsed 64px → expand σε 240px on hover, βλ. πλάνο §3)
   αντί για το παλιό οριζόντιο .topbar. `position: fixed` + `overflow: hidden`· το expand ΔΕΝ
   κάνει reflow στο περιεχόμενο, επικαλύπτει σαν flyout (ίδιο μοτίβο με τα mockups). Σε
   αντίθεση με το παλιό μόνιμα-σκούρο topbar chrome, sidebar+header ακολουθούν τα ίδια tokens
   με την υπόλοιπη σελίδα — ζητήθηκε ρητά "κράτα το dark mode", άρα πρέπει να το σέβονται
   πλήρως, όχι να μείνουν fixed-dark. */
.app-shell { display: flex; min-height: 100vh; }

/* Καμία overflow:hidden στο .sidebar — το "κρύψιμο" των labels όταν το sidebar είναι collapsed
   γίνεται ΣΤΟ ΙΔΙΟ το .sidebar-label (max-width 0 + overflow hidden, βλ. παρακάτω), όχι σε
   κάποιον πρόγονο — έτσι δεν μένει ούτε αόρατο clickable dead-zone πάνω από το περιεχόμενο
   (opacity:0 μόνο δεν θα αρκούσε, το layout box θα παρέμενε πλήρους πλάτους). */
/* Fixed, overlaps τη σελίδα κατά τα ~176px όταν είναι expanded on hover. */
.sidebar {
  position: fixed; top: 0; left: 0; bottom: 0; z-index: 40;
  width: 64px;
  background: var(--panel);
  border-right: 1px solid var(--line);
  display: flex; flex-direction: column;
  transition: width .16s ease, box-shadow .16s ease;
}
.sidebar:hover, .sidebar:focus-within { width: 240px; box-shadow: var(--shadow-lg); }
/* Edit mode (βλ. sidebar-brand long-press στο app.jsx): ζωγραφισμένο σαν να είναι πάντα σε
   hover/expanded state (ίδιες τιμές με .sidebar:hover παραπάνω) — τα labels/drag handles/✕
   χρειάζονται χώρο για να διαβαστούν, δεν έχει νόημα να μένουν κρυμμένα πίσω από ένα ξεχωριστό
   hover ενώ ο χρήστης προσπαθεί να αναδιατάξει το μενού. */
.sidebar-editing { width: 240px; box-shadow: var(--shadow-lg); }
.sidebar-editing .sidebar-label { max-width: 160px; opacity: 1; }
@media (prefers-reduced-motion: reduce) { .sidebar { transition: none; } }

.sidebar-brand {
  display: flex; align-items: center; flex: none; gap: 10px;
  height: 64px; padding: 0 20px; cursor: pointer;
  border-bottom: 1px solid var(--line-soft);
}
/* Collapsed: δικό του καθαρό "P" glyph (.sidebar-logo-p, βλ. .wordmark-p) — ΟΧΙ πια crop του
   πλατιού wordmark.svg (viewBox ~4.67:1, "Public" ολόκληρο), που ζορισμένο σε στενό κουτί έδειχνε
   crop artifacts. Expanded (hover/focus-within/editing): cross-fade στο πλήρες wordmark (ίδιο
   "cross-fade, όχι slide" micro-interaction convention με το υπόλοιπο app, βλ. π.χ. .autherr).
   Τα δύο logos επικαλύπτονται absolute μέσα στο ίδιο σταθερού-ύψους "παραθυράκι". */
.sidebar-logo-crop { position: relative; overflow: hidden; height: 24px; width: 23px; flex: none; transition: width .2s ease; }
.sidebar:hover .sidebar-logo-crop, .sidebar:focus-within .sidebar-logo-crop, .sidebar-editing .sidebar-logo-crop { width: 112px; }
@media (prefers-reduced-motion: reduce) { .sidebar-logo-crop { transition: none; } }
.sidebar-logo-p, .sidebar-logo { position: absolute; top: 0; left: 0; height: 24px; color: var(--brand); flex: none; transition: opacity .15s ease; }
.sidebar-logo-p { width: 23px; }
.sidebar-logo { width: 112px; opacity: 0; }
.sidebar:hover .sidebar-logo-p, .sidebar:focus-within .sidebar-logo-p, .sidebar-editing .sidebar-logo-p { opacity: 0; }
.sidebar:hover .sidebar-logo, .sidebar:focus-within .sidebar-logo, .sidebar-editing .sidebar-logo { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .sidebar-logo-p, .sidebar-logo { transition: none; } }

/* overflow-y:auto — το μενού είναι πλέον ΕΝΑ επίπεδο flat nav (δεν χωρίζεται πια σε κύριο +
   "Διαχείριση" dropdown), άρα μπορεί να έχει ως 11 items για super_admin· σε κοντό viewport
   αυτό δεν πρέπει να κόβεται σιωπηλά. */
.sidebar-nav {
  flex: 1; display: flex; flex-direction: column; gap: 2px;
  padding: 10px; overflow-y: auto; overflow-x: hidden;
}
/* Δεύτερο .sidebar-nav (flex:none, μετά το πρώτο flex:1) — η Τεκμηρίωση μένει ΕΞΩ από το
   reorder/hide pool (ζητήθηκε ρητά "να πάει κάτω στο μενού"), πάντα τελευταία, οπτικά
   ξεχωριστή με ένα πάνω περίγραμμα. */
.sidebar-nav-bottom { flex: none; border-top: 1px solid var(--line-soft); padding-top: 10px; overflow: visible; }
.sidebar-item {
  display: flex; align-items: center; gap: 14px; width: 100%; flex: none;
  height: 40px; padding: 0 12px; border-radius: var(--radius-md);
  border: none; background: none; cursor: pointer;
  font-family: var(--sans); font-size: 13.5px; color: var(--ink-soft); white-space: nowrap;
  text-decoration: none;
  transition: background-color .12s ease, color .12s ease;
}
.sidebar-item:hover { background: var(--panel-2); color: var(--ink); }
.sidebar-item.active { background: var(--accent-tint); color: var(--accent-d); font-weight: 600; }
.sidebar-item-icon { position: relative; display: flex; flex: none; align-items: center; justify-content: center; width: 20px; }
.sidebar-label {
  display: inline-block; max-width: 0; overflow: hidden; opacity: 0;
  transition: max-width .16s ease, opacity .1s ease;
}
.sidebar:hover .sidebar-label, .sidebar:focus-within .sidebar-label { max-width: 160px; opacity: 1; }
@media (prefers-reduced-motion: reduce) { .sidebar-label { transition: none; } }
.navdrop-caret { margin-left: auto; font-size: 10px; }
/* Badge πάνω στη γωνία του icon (όχι δίπλα στο label) ώστε να μένει ορατό ΚΑΙ όταν το sidebar
   είναι collapsed — πριν (οριζόντιο topbar) το badge ήταν πάντα ορατό μέσα στο tab, το ίδιο
   πρέπει να ισχύει και εδώ χωρίς να χρειάζεται hover. */
.sidebar-badge { position: absolute; top: -6px; right: -9px; margin-left: 0; }

/* ---------- sidebar edit mode (reorder/hide, βλ. SidebarNavList/SidebarNavItem στο app.jsx) ---------- */
.sidebar-edit-hint {
  flex: none; font-size: 11px; line-height: 1.5; color: var(--muted);
  padding: 8px 14px; border-bottom: 1px solid var(--line-soft);
}
.sidebar-edit-hint b { color: var(--ink-soft); }
.sidebar-item-editable { cursor: default; gap: 10px; }
.sidebar-item-editable .sidebar-label { flex: 1; max-width: none; opacity: 1; overflow: hidden; text-overflow: ellipsis; }
.sidebar-item-editable.dragging { opacity: .5; background: var(--panel-2); }
.sidebar-draghandle {
  flex: none; cursor: grab; color: var(--muted); font-size: 14px; line-height: 1;
  padding: 2px; border-radius: 4px; touch-action: none; user-select: none;
}
.sidebar-draghandle:hover { color: var(--ink); }
.sidebar-draghandle:active { cursor: grabbing; }
.sidebar-item-hide {
  flex: none; width: 20px; height: 20px; border-radius: 50%; border: none;
  background: none; color: var(--muted); cursor: pointer; font-size: 11px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  transition: background-color .12s ease, color .12s ease;
}
.sidebar-item-hide:hover { background: var(--danger-bg); color: var(--danger); }
.sidebar-hidden-tray {
  flex: none; display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  padding: 10px 12px; border-top: 1px solid var(--line-soft);
}
.sidebar-hidden-tray-label { width: 100%; font-size: 11px; color: var(--muted); }

.app-main { flex: 1; min-width: 0; margin-left: 64px; display: flex; flex-direction: column; min-height: 100vh; }

.app-header {
  display: flex; align-items: center; justify-content: space-between; gap: 16px; flex: none;
  height: 64px; padding: 0 28px;
  background: var(--panel);
  border-bottom: 1px solid var(--line);
  position: sticky; top: 0; z-index: 20;
}
.app-header-title { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--muted); }
.app-header-title b { font-size: 15px; color: var(--ink); font-weight: 600; }
.app-header-actions { display: flex; align-items: center; gap: 10px; }
.header-iconbtn {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 36px; height: 36px; border-radius: 999px; border: none; background: none;
  color: var(--ink-soft); cursor: pointer; transition: background-color .12s ease, color .12s ease;
}
.header-iconbtn:hover { background: var(--panel-2); color: var(--ink); }
.header-badge { position: absolute; top: 2px; right: 2px; margin-left: 0; }

.app-content { flex: 1; min-width: 0; min-height: 0; }

.pill.role { background: var(--panel-3); color: var(--ink-soft); }

/* ---------- avatar + profile dropdown ---------- */
.avatar {
  border-radius: 50%; overflow: hidden; display: flex; align-items: center; justify-content: center;
  flex: none; font-weight: 700; color: #fff; letter-spacing: .3px; user-select: none;
}
.avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.profilemenu { position: relative; }
.profilemenu-trigger {
  border: none; background: none; padding: 4px 12px 4px 16px; border-radius: 999px; cursor: pointer;
  display: flex; align-items: center; gap: 10px; transition: background-color .12s ease;
}
.profilemenu-trigger:hover { background: var(--panel-2); }
.profilemenu-trigger-text { display: flex; flex-direction: column; align-items: flex-end; line-height: 1.3; }
.profilemenu-trigger-name {
  font-size: 13px; font-weight: 600; color: var(--ink); max-width: 160px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.profilemenu-trigger-role { font-size: 11px; color: var(--muted); }
@keyframes profilemenu-in { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
.profilemenu-popover {
  position: absolute; top: calc(100% + 10px); right: 0; width: 230px; z-index: 50;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-md); box-shadow: var(--shadow-md);
  padding: 6px; display: flex; flex-direction: column; gap: 2px;
  animation: profilemenu-in .15s cubic-bezier(.16, 1, .3, 1);
}
.profilemenu-header { display: flex; align-items: center; gap: 10px; padding: 8px 8px 10px; border-bottom: 1px solid var(--line-soft); margin-bottom: 4px; }
.profilemenu-header-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.profilemenu-header-text b { font-size: 13px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.profilemenu-header .pill.role { background: var(--teal-bg); color: var(--teal); }
.profilemenu-item {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  width: 100%; text-align: left; border: none; background: none; cursor: pointer;
  padding: 8px; border-radius: 6px; font-size: 13px; color: var(--ink-soft); font-family: var(--sans);
  transition: background-color .1s ease;
}
button.profilemenu-item:hover { background: var(--panel-3); }
.profilemenu-item.profilemenu-logout { color: var(--danger); }
.profilemenu-theme { cursor: default; }

/* ---------- notification bell (καμπανάκι, ίδιο open/close/position pattern με .profilemenu) ---------- */
.notifbell { position: relative; }
.notif-popover {
  position: absolute; top: calc(100% + 10px); right: 0; width: 320px; z-index: 50;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-md); box-shadow: var(--shadow-md);
  display: flex; flex-direction: column;
  animation: profilemenu-in .15s cubic-bezier(.16, 1, .3, 1);
}
.notif-popover-head {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 10px 12px; border-bottom: 1px solid var(--line-soft);
}
.notif-list { max-height: 360px; overflow-y: auto; padding: 4px; }
.notif-empty { padding: 20px; text-align: center; color: var(--muted); font-size: 13px; }
.notif-item {
  display: flex; align-items: flex-start; gap: 8px; padding: 9px 8px; border-radius: 6px;
  cursor: pointer; transition: background-color .1s ease;
}
.notif-item:hover { background: var(--panel-3); }
.notif-item.unread { background: var(--accent-tint); }
.notif-item.unread:hover { background: color-mix(in srgb, var(--accent-tint) 80%, var(--panel-3)); }
.notif-dot { flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); margin-top: 5px; }
.notif-dot-default { background: var(--accent); }
.notif-dot-ok { background: var(--ok); }
.notif-dot-bad { background: var(--danger); }
.notif-dot-warn { background: var(--amber); }
.notif-item-text { min-width: 0; font-size: 12.5px; color: var(--ink-soft); line-height: 1.4; }
.notif-item.unread .notif-item-text { color: var(--ink); font-weight: 600; }
.notif-item-time { font-size: 11px; color: var(--muted); font-weight: 400; margin-top: 2px; }
/* Σταθερό κάτω-κάτω (ζητήθηκε ρητά) — sibling του .notif-list, ΕΞΩ από το scrollable, ίδιο
   "fixed footer κάτω από scrollable body" μοτίβο με .drawer-foot. */
.notif-popover-foot { flex: none; padding: 8px; border-top: 1px solid var(--line-soft); }
.notif-popover-foot .btn { width: 100%; }

/* ---------- drawer section (βλ. ProfileDrawer ρυθμίσεις ειδοποιήσεων) ---------- */
.drawer-section { border-top: 1px solid var(--line-soft); padding-top: 14px; margin-top: 4px; width: 100%; }
.drawer-section-title { font-size: 12px; font-weight: 700; color: var(--ink); margin-bottom: 6px; }
.drawer-section .toggle { display: flex; width: 100%; padding: 6px 0; }
.drawer-section .toggle:not(:last-child) { border-bottom: 1px solid var(--line-soft); }

/* ---------- theme toggle (μέσα στο profile popover) ---------- */
.theme-toggle {
  display: inline-flex; border: 1px solid var(--line); border-radius: 999px;
  padding: 2px; background: var(--panel-2); gap: 1px;
}
.theme-toggle-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border: none; border-radius: 999px; background: none;
  color: var(--muted); cursor: pointer; line-height: 1; transition: background-color .12s ease, color .12s ease;
}
.theme-toggle-btn:hover { color: var(--ink); }
.theme-toggle-btn.active { background: var(--panel-3); color: var(--ink); }
.theme-toggle-btn svg { width: 14px; height: 14px; }

/* ---------- theme variant picker (3 βασικά χρώματα ανά mode, μέσα στο profile popover) ---------- */
/* Στατικά preview χρώματα (ΟΧΙ var(--x) — θα έδειχναν πάντα το ΤΡΕΧΟΝ theme, όχι μια
   προεπισκόπηση της επιλογής), ίδιες τιμές με τα αντίστοιχα [data-variant] token overrides. */
.variant-picker { display: inline-flex; gap: 6px; }
.variant-swatch {
  width: 22px; height: 22px; border-radius: 50%; cursor: pointer;
  border: 2px solid transparent; padding: 0; box-shadow: inset 0 0 0 1px var(--line);
  transition: border-color .12s ease, transform .1s ease;
}
.variant-swatch:hover { transform: scale(1.08); }
.variant-swatch.active { border-color: var(--accent); }
.variant-swatch-light-1 { background: linear-gradient(135deg, #f8f9fa 50%, #ffffff 50%); }
.variant-swatch-light-2 { background: linear-gradient(135deg, #eaf2fc 50%, #c2daf2 50%); }
.variant-swatch-light-3 { background: linear-gradient(135deg, #eaf6ee 50%, #c0e3c9 50%); }
.variant-swatch-dark-1 { background: linear-gradient(135deg, #0a1420 50%, #1f3652 50%); }
.variant-swatch-dark-2 { background: linear-gradient(135deg, #0a160f 50%, #1e4029 50%); }
.variant-swatch-dark-3 { background: linear-gradient(135deg, #17181a 50%, #2e3133 50%); }

/* ---------- layout ---------- */
.page { padding: 20px 24px 64px; }
.toolbar {
  display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-md); padding: 12px 14px; margin-bottom: 14px;
  box-shadow: var(--shadow-sm);
}
.toolbar .grow { flex: 1; }
.toolbar.toolbar-toggles { margin-top: -8px; gap: 18px; }

/* "Clusters σε αναμονή δημιουργίας" (βλ. PendingClusterCreationsSection) — πάνω από τον κύριο
   πίνακα Clusters, ίδια δομή/columns αλλά ξεχωριστό οπτικά ώστε να μη μπερδεύεται με τον κύριο
   πίνακα (accent-colored border + τίτλος, ίδιο "κάτι εκκρεμεί εδώ" language με το accent-tint
   background που ήδη χρησιμοποιείται αλλού για unread/pending state). */
.cluster-pending-section {
  border: 1px solid var(--accent); border-radius: var(--radius-md);
  background: var(--accent-tint); padding: 14px; margin-bottom: 20px;
}
.cluster-pending-section .toolbar, .cluster-pending-section .tablewrap { background: var(--panel); }
.cluster-pending-title { margin: 0 0 10px; font-size: 14px; color: var(--accent-d); }

/* ---------- Cluster ανά κατάστημα: head row πάνω από το matrix ---------- */
/* Τα φίλτρα/toggles ζουν πλέον σε modal drawer (.drawer-backdrop/.drawer, ίδιο με κάθε άλλο
   drawer — ζητήθηκε ρητά "να βγαίνει πάνω από το περιεχόμενο και όχι να το πιέζει", ΟΧΙ docked
   sidebar). Εδώ μένει μόνο η πάνω σειρά: "← Πίσω" / active cluster-filter chip αριστερά, το
   "Φίλτρα & προβολή" trigger κουμπί δεξιά (ζητήθηκε ρητά η θέση).*/
.stores-main-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.stores-main-head-left { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.stores-filter-divider { height: 1px; background: var(--line-soft); margin: 2px 0; }
.stores-filter-toggles { display: flex; flex-direction: column; gap: 10px; }
.field { display: flex; flex-direction: column; gap: 3px; }
.field label { font-size: 10px; text-transform: uppercase; letter-spacing: .6px; color: var(--muted); }
input, select, textarea {
  font-family: var(--sans); font-size: 13px; color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--radius-md); padding: 8px 12px;
  background: var(--panel); min-height: 36px;
  transition: border-color .12s ease, box-shadow .12s ease;
}
textarea { resize: vertical; }
input:focus, select:focus, textarea:focus { outline: none; box-shadow: 0 0 0 3px var(--accent-tint); border-color: var(--accent); }
input.mono { font-family: var(--mono); }
.search { min-width: 240px; }

/* ImportPage CSV/JSON textarea — πριν δεν είχε όριο ύψους (μόνο rows=8 attribute) και ο
   browser default resize:both επέτρεπε να τραβηχτεί αυθαίρετα ψηλό/πλατύ, "σπάζοντας" τη
   σελίδα (ζητήθηκε ρητά να διορθωθεί). Standard, οθόνη-σχετικό ύψος (vh) + resize:vertical
   μόνο μέσα σε λογικό max-height, πλάτος πάντα 100% του container (όχι πλατύτερο). */
textarea.import-textarea {
  display: block; width: 100%; box-sizing: border-box;
  font-family: var(--mono); font-size: 12.5px; color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--radius-md); padding: 10px 12px;
  background: var(--panel);
  height: 32vh; min-height: 140px; max-height: 60vh;
  resize: vertical; overflow-y: auto;
}
textarea.import-textarea:focus { outline: none; box-shadow: 0 0 0 3px var(--accent-tint); border-color: var(--accent); }

/* Full-pill κουμπιά (Luminous Retail design system, "Components: Buttons: pill Public Orange
   primary + ghost/soft-accent secondary") — ίδιο σχήμα σε primary/ghost/danger/sm, μόνο
   χρώμα/βάρος διαφέρει ανά variant. */
button.btn {
  font-family: var(--sans); font-size: 13px; font-weight: 600; cursor: pointer;
  border: 1px solid var(--line); background: var(--panel); color: var(--ink-soft);
  border-radius: var(--radius-pill); padding: 8px 16px; min-height: 34px;
  transition: border-color .12s ease, background-color .12s ease, box-shadow .12s ease, transform .06s ease;
}
button.btn:hover { border-color: var(--muted); background: var(--panel-2); }
button.btn:active { transform: translateY(1px); }
button.btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; box-shadow: var(--shadow-sm); }
button.btn.primary:hover { background: var(--accent-d); border-color: var(--accent-d); }
button.btn.ghost { background: none; font-weight: 500; }
button.btn.ghost:hover { background: var(--panel-2); }
button.btn.danger { color: #fff; background: var(--danger); border-color: var(--danger); }
button.btn.danger:hover { filter: brightness(0.9); }
/* Πράσινο, ίδιο pattern με .danger — χρήση: εικονίδιο ενέργειας "ενεργοποίηση" (βλ. Χρήστες). */
button.btn.success { color: #fff; background: var(--ok); border-color: var(--ok); }
button.btn.success:hover { filter: brightness(0.9); }
button.btn.sm { padding: 5px 12px; min-height: 28px; font-size: 12px; }
/* ΜΕΤΑ το .sm (ίδια specificity, το source order αποφασίζει) — αλλιώς το .sm's padding
   νικάει το padding:0 εδώ, "σκάει" ένα icon-only button σε μη-τετράγωνο σχήμα. */
button.btn.icon-only {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0; width: 30px; flex: none;
}
button.btn.icon-only svg { flex: none; }
button.btn.icon-only.sm { width: 28px; }
button.btn:disabled { opacity: .5; cursor: default; transform: none; }

.info-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; min-height: 0; padding: 0; margin: 0 0 -3px;
  border: 1px solid var(--line); border-radius: 50%; background: var(--panel);
  color: var(--muted); font-size: 11px; line-height: 1; cursor: pointer;
}
.info-btn:hover { border-color: var(--accent); color: var(--accent); }

.count { font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums; }
.chip {
  display: inline-block; font-family: var(--mono); font-size: 12px;
  background: var(--teal-bg); color: var(--teal); border-radius: 5px;
  padding: 2px 7px; font-weight: 600;
}
.seg { display: inline-flex; border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; width: fit-content; }
.seg-btn {
  font-family: var(--sans); font-size: 12px; cursor: pointer; padding: 6px 12px;
  border: none; border-right: 1px solid var(--line); background: var(--panel); color: var(--ink-soft);
}
.seg-btn:last-child { border-right: none; }
.seg-btn.active { background: var(--accent); color: #fff; }

/* ---------- toggle switch ---------- */
.toggle { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; }
.toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.toggle-track {
  width: 34px; height: 20px; border-radius: 20px; background: var(--line);
  position: relative; transition: background .15s; flex-shrink: 0;
}
.toggle-thumb {
  position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%;
  background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.25); transition: transform .15s;
}
.toggle input:checked + .toggle-track { background: var(--accent); }
.toggle input:checked + .toggle-track .toggle-thumb { transform: translateX(14px); }
.toggle-label { font-size: 12px; color: var(--ink-soft); }

.pill { display:inline-block; font-size: 11px; padding: 3px 10px; border-radius: var(--radius-pill); font-weight: 600; }
/* Clickable pill (RequestBadgesRow) — ίδια εμφάνιση με ένα κανονικό .pill, μόνο reset των
   browser-default <button> στυλ (border/font) ώστε να μη φαίνεται σαν κουμπί. */
.pill-btn { border: none; cursor: pointer; font: inherit; }
.pill-btn:hover { filter: brightness(0.94); }
.pill.gr { background: var(--cat-blue-bg); color: var(--cat-blue-fg); }
.pill.cy { background: var(--cat-orange-bg); color: var(--cat-orange-fg); }
.pill.dual { background: linear-gradient(90deg, var(--cat-blue-bg) 50%, var(--cat-orange-bg) 50%); color: var(--ink-soft); font-weight: 700; margin-left: 6px; }
.pill.ok { background: var(--ok-bg); color: var(--ok); }
.pill.no { background: var(--danger-bg); color: var(--danger); }
.pill.wait { background: var(--cat-gray-bg); color: var(--muted); }
/* gradient-wait (ClustersPage, στήλη Έγκριση) — υπολογισμένο status από pending display/feed
   change_requests, background = inline gradient των 2 domain χρωμάτων (ή πράσινο+domain χρώμα
   όταν μόνο το ένα εκκρεμεί) — λευκό κείμενο γιατί τα stops είναι κορεσμένα χρώματα, όχι παστέλ
   όπως το .pill.dual. */
.pill.gradient-wait { color: #fff; font-weight: 700; }
/* domain-pill (RequestsPage) — ίδιο μπλε/πορτοκαλί axis με .request-card.domain-* — ρητή
   ετικέτα κειμένου πέρα από το χρώμα του border, για accessibility/σαφήνεια. */
.pill.domain-pill.display { background: var(--cat-blue-bg); color: var(--cat-blue-fg); }
.pill.domain-pill.feed { background: var(--cat-orange-bg); color: var(--cat-orange-fg); }
.pill.domain-pill.spacegroup { background: var(--ok-bg); color: var(--ok); }

/* ---------- table ---------- */
.tablewrap {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg); overflow: auto; max-height: calc(100vh - 210px);
  box-shadow: var(--shadow-sm);
}
table { border-collapse: collapse; width: 100%; font-size: 13px; }
thead th {
  position: sticky; top: 0; z-index: 5;
  background: var(--panel-2); color: var(--ink-soft);
  text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: .5px;
  padding: 11px 14px; border-bottom: 1px solid var(--line); white-space: nowrap;
}
thead tr.filter-row th {
  top: 33px; z-index: 4; background: var(--panel); padding: 4px 6px;
  border-bottom: 1px solid var(--line);
}
thead tr:not(.filter-row) th:hover { background: var(--panel-3); }
.sortarrow { color: var(--accent); font-size: 10px; }
/* :not(.picker-check *) — το .filter-row input στοχεύει τα δικά του text/select filter
   inputs μέσα σε κάθε <th>, ΟΧΙ τα checkbox inputs μέσα στο popover ενός MultiSelectDropdown
   (που ζει ΚΙ ΑΥΤΟ μέσα σε .filter-row th, βλ. MultiSelectFilterTh) — χωρίς αυτό, width:100%
   τεντώνει το <input type=checkbox> σε όλο το πλάτος της γραμμής και σπρώχνει το label έξω
   από το ορατό popover. */
.filter-row select, .filter-row input:not(.picker-check *) {
  width: 100%; min-height: 26px; font-size: 11px; padding: 2px 5px;
  text-transform: none; letter-spacing: 0; font-weight: 400;
}
tbody td {
  padding: 10px 14px; border-bottom: 1px solid var(--line-soft);
  max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Inline-editable inputs/selects μέσα σε tbody td (π.χ. Title/Phone/Email/Team Email στο
   Users admin, name/division/family/spacegroupCode στο Spacegroups admin) δεν είχαν δικό τους
   width — έπαιρναν το browser-default πλάτος ενός γυμνού <input>, που δεν ταίριαζε πάντα στο
   διαθέσιμο πλάτος του cell και "κοβόταν" οπτικά από το overflow:hidden παραπάνω. width:100%
   τα κάνει να γεμίζουν ακριβώς το content-box του cell τους, ομοιόμορφα σε όλα τα πεδία. */
tbody td input, tbody td select { width: 100%; }
/* Χωρίς transition (ζητήθηκε ρητά "πιο άμεσο και γρήγορο") — σε πυκνούς πίνακες με γρήγορη
   κίνηση ποντικιού πάνω από πολλές γραμμές, το animated background-color μαζί με το ξεχωριστό
   repaint του .sticky-actions (βλ. παρακάτω) έδειχνε καθυστερημένο/ασύγχρονο χρώμα. */
tbody tr:hover { background: var(--panel-2); }
td.num { text-align: center; font-variant-numeric: tabular-nums; font-family: var(--mono); max-width: none; }
td.code { font-family: var(--mono); color: var(--ink-soft); }
td.empty-cell { text-align: center; color: var(--muted); padding: 24px; white-space: normal; }
.w60 { width: 66px; } .w90 { width: 96px; } .w120 { width: 120px; }

/* Κεντραρισμένο (όχι αριστερά), ώστε η ετικέτα "ΕΝΕΡΓΕΙΕΣ" στο header να ευθυγραμμίζεται με τα
   icon κουμπιά της γραμμής από κάτω (ζητήθηκε ρητά — πριν η στενότερη ετικέτα "κρεμόταν"
   αριστερά μέσα σε ένα πλατύτερο κελί, αφού το κελί παίρνει το πλάτος του φαρδύτερου: των
   κουμπιών). Ίδιο κεντράρισμα ΚΑΙ στα δύο (header + body) ώστε να ευθυγραμμίζονται πάντα.
   align-items:center (ΟΧΙ το flex default "stretch") — χωρίς αυτό τα κουμπιά τεντώνονταν σε
   όλο το ύψος του (padded) κελιού, κάνοντας τα στρογγυλά icon-only κουμπιά οβάλ αντί για
   κύκλους και "κρεμώντας" τα ασύμμετρα μέσα στη γραμμή (ζητήθηκε ρητά να διορθωθεί, ισχύει σε
   κάθε πλάτος οθόνης αφού είναι flexbox, όχι fixed pixel τιμές). */
.actions { display: flex; align-items: center; gap: 6px; justify-content: center; }
/* ΠΡΟΣΟΧΗ: όχι background:inherit — inherit-άρει από .tr (transparent by default), αφήνοντας
   την ΑΠΟ ΚΑΤΩ στήλη (π.χ. PM) να "περνάει" μέσα από το sticky-pinned κελί κατά το οριζόντιο
   scroll (bug: φαινόταν σαν "σκισμένο" κείμενο πίσω από τα action icons). Ρητό, αδιαφανές
   background ανά context (κανονική γραμμή / hover / header label-row / header filter-row) —
   ίδιο background με το αντίστοιχο μη-sticky κελί δίπλα του, ώστε να μη φαίνεται η ραφή. */
.sticky-actions { position: sticky; right: 0; max-width: none; white-space: nowrap; background: var(--panel); }
/* Ταιριάζει το background του hover ΑΚΡΙΒΩΣ με το .tr:hover παρακάτω, ΧΩΡΙΣ transition σε
   κανένα από τα δύο (βλ. tbody tr) — αλλάζουν μαζί, στο ίδιο frame, οπότε ΔΕΝ ξαναφέρνει το
   παλιό bug (εκείνο ήταν ΤΟ transition duration mismatch μεταξύ ξεχωριστών layers, όχι απλά
   το ότι άλλαζε το χρώμα) — χωρίς αυτό, μια hover γραμμή άφηνε τη sticky στήλη Ενέργειες σε
   διαφορετικό χρώμα από την υπόλοιπη γραμμή, άσχημη "ραφή" στο hover (ζητήθηκε ρητά να
   διορθωθεί). */
tbody tr:hover .sticky-actions { background: var(--panel-2); }
thead tr:not(.filter-row) th.sticky-actions { background: var(--panel-2); text-align: center; }
thead tr.filter-row th.sticky-actions { background: var(--panel); }

/* ---------- pagination ---------- */
/* Numbered pager (βλ. Pager component, app.jsx) — "Εμφάνιση X–Y από Z" αριστερά + windowed
   αριθμημένα κουμπιά δεξιά, αντί για το παλιό "Σελίδα X/Y" + 4 βέλη. */
.pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 14px; }
.pager-summary { font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }
.pager-pages { display: flex; align-items: center; gap: 4px; }
.pager-btn {
  min-width: 30px; height: 30px; padding: 0 8px; display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--sans); font-size: 12.5px; font-weight: 600; color: var(--ink-soft);
  border: 1px solid var(--line); background: var(--panel); border-radius: var(--radius-pill); cursor: pointer;
  transition: border-color .12s ease, background-color .12s ease, color .12s ease;
}
.pager-btn:hover:not(:disabled) { border-color: var(--muted); background: var(--panel-2); }
.pager-btn:disabled { opacity: .4; cursor: default; }
.pager-btn.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.pager-ellipsis { padding: 0 4px; color: var(--muted); font-size: 12.5px; }

/* ---------- matrix (page 2) ---------- */
.matrix-note { font-size: 12px; color: var(--muted); margin: 2px 0 10px; }
table.matrix td, table.matrix th { border-right: 1px solid var(--line-soft); }
table.matrix tbody td { padding: 2px 3px; }
table.matrix tbody td.storecell { padding: 4px 6px; }
/* Πιο compact από τον γενικό πίνακα — έως ~491 spacegroups σαν στήλες, το πλάτος ανά
   στήλη πολλαπλασιάζεται γρήγορα (βλ. σχόλιο στο app.jsx για το μέγεθος). */
table.matrix thead th { padding: 4px 4px; }
table.matrix th.storehdr, table.matrix td.storecell {
  position: sticky; left: 0; z-index: 6; background: var(--panel-2); text-align: left;
  width: 1px; /* + white-space:nowrap κάτω -> το tbody (table-layout: auto) γεμίζει τη
                 στήλη στο πλάτος του πλατύτερου πραγματικού περιεχομένου της, όχι fixed */
  max-width: 260px; box-shadow: 1px 0 0 var(--line);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: 12px;
}
table.matrix tbody td.storecell { background: var(--panel); font-weight: 500; }
table.matrix thead th { text-align: center; }
table.matrix .sgid { font-family: var(--mono); font-size: 9px; color: var(--muted); display:block; }
table.matrix .sgname {
  font-size: 9px; color: var(--ink-soft); max-width: 74px; white-space: normal;
  line-height: 1.1; margin: 0 auto; display: -webkit-box; -webkit-line-clamp: 2;
  -webkit-box-orient: vertical; overflow: hidden;
  /* Πάντα κρατάει το ύψος 2 γραμμών (1.1 line-height × 2), ακόμα κι όταν το πραγματικό
     κείμενο χωράει σε 1 — αλλιώς κοντά ονόματα κάνουν το header cell πιο κοντό από τα
     διπλανά με μεγάλα ονόματα, σπάζοντας το alignment της σειράς header (ζητήθηκε ρητά:
     "aligned όλα μεταξύ τους τα headers"). */
  min-height: calc(1.1em * 2);
}
/* width:auto (ΟΧΙ 100%, βλ. base "table" rule) — width:100% ζόρι-τεντωνε τον πίνακα να γεμίσει
   όλο το container ακόμα κι όταν το πραγματικό περιεχόμενο (λίγα ορατά divisions μέσω του
   .division-filterbar) είναι στενό, μοιράζοντας τον χώρο εξίσου σε τεράστια χρωματιστά panels. */
table.matrix { width: auto; }

/* division header row (row 1 of 2) — πάντα δείχνει όλα τα (ήδη επιλεγμένα από το quick-filter
   πάνω από τον πίνακα, βλ. .division-filterbar) divisions πλήρως ανοιχτά ταυτόχρονα, όχι πια
   accordion ένα-τη-φορά (το collapse/click state μετακόμισε στα κουμπιά του filterbar). Row 2
   (μεμονωμένα sg columns) χρειάζεται δικό της sticky offset κάτω από το row 1. Στυλ σκόπιμα
   διακριτικό (λεπτό χρωματιστό περίγραμμα, ΟΧΙ συμπαγές γέμισμα χρώματος). */
table.matrix thead tr:nth-child(2) th { position: sticky; top: 29px; z-index: 4; }
.divhdr {
  user-select: none; font-weight: 600; font-size: 11px;
  letter-spacing: .2px; background: var(--panel-2); color: var(--ink-soft);
  text-align: left; padding: 6px 10px;
  border-bottom: 2px solid var(--muted);
}
.divhdr.div-tech { border-color: var(--cat-blue-fg); color: var(--cat-blue-fg); }
.divhdr.div-ent { border-color: var(--cat-amber-fg); color: var(--cat-amber-fg); }
.divhdr.div-home { border-color: var(--cat-teal-fg); color: var(--cat-teal-fg); }
.divhdr.div-other { border-color: var(--muted); }
.divcount { font-weight: 400; opacity: .65; }

/* Division quick-filter bar (πάνω από το matrix, αντικαθιστά το παλιό click-to-expand πάνω
   στα ίδια τα table headers — ζητήθηκε ρητά "να φύγουν απο εκεί ... και να μπουν σε μορφή
   κουμπιών πάνω απο το matrix"). Ίδια χρωματική ταυτότητα ανά division (div-tech/ent/home) με
   τα .divhdr headers, ώστε το κουμπί να "ταιριάζει" οπτικά με τη στήλη που ελέγχει. */
.division-filterbar { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 0 0 10px; }
.division-filterbtn {
  font-size: 12px; font-weight: 600; padding: 6px 12px; border-radius: 999px;
  background: var(--panel); border: 1px solid var(--line); color: var(--muted);
  cursor: pointer; transition: background-color .12s ease, border-color .12s ease, color .12s ease, opacity .12s ease;
  opacity: .55;
}
.division-filterbtn:hover { opacity: .85; }
.division-filterbtn.active { opacity: 1; background: var(--panel-2); }
.division-filterbtn.div-tech.active { border-color: var(--cat-blue-fg); color: var(--cat-blue-fg); }
.division-filterbtn.div-ent.active { border-color: var(--cat-amber-fg); color: var(--cat-amber-fg); }
.division-filterbtn.div-home.active { border-color: var(--cat-teal-fg); color: var(--cat-teal-fg); }
.division-filterbtn.div-other.active { border-color: var(--muted); color: var(--ink); }
.division-filterbtn .divcount { opacity: .7; }

.cell-row { display: flex; align-items: center; justify-content: center; gap: 1px; }
.cellselect {
  width: 46px; text-align: center; font-family: var(--mono); font-size: 10px;
  padding: 2px 1px; border: 1px solid transparent; background: transparent; border-radius: 4px;
  min-height: 22px;
}
.cellselect:hover { border-color: var(--line); background: var(--panel); }
.cellselect:focus { border-color: var(--accent); background: var(--panel); }
/* SqftPage inline edit (super_admin/space_manager/space_user) — ίδιο compact πνεύμα με
   .cellselect, πλατύτερο (56px) για τιμές τετραγωνικών μέχρι 4-5 ψηφία χωρίς clipping.
   -moz-appearance/-webkit-... αφαιρεί τα native spinner βελάκια (type=number) που δεν
   χωράνε σε ένα τόσο στενό κελί. */
.sqft-cell-input {
  width: 56px; text-align: center; font-family: var(--mono); font-size: 11px;
  padding: 2px 1px; border: 1px solid transparent; background: transparent; border-radius: 4px;
  min-height: 22px; color: var(--ink);
  -moz-appearance: textfield;
}
.sqft-cell-input::-webkit-outer-spin-button, .sqft-cell-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.sqft-cell-input:hover { border-color: var(--line); background: var(--panel); }
.sqft-cell-input:focus { border-color: var(--accent); background: var(--panel); }
/* Αντικαθιστά το native <select> ανά κελί (βλ. σχόλιο στο MatrixCell) — trigger + popover
   που mount-άρεται μόνο on-demand, ίδιο compact πνεύμα με .cellselect. */
.cellpick { position: relative; display: inline-block; }
.cellpick-trigger {
  width: 46px; text-align: center; font-family: var(--mono); font-size: 10px;
  padding: 2px 1px; border: 1px solid transparent; background: transparent; border-radius: 4px;
  min-height: 22px; cursor: pointer; color: var(--muted);
}
.cellpick-trigger:hover { border-color: var(--line); background: var(--panel); }
.cellpick-trigger.filled { color: var(--teal); font-weight: 600; }
/* position:fixed + top/left υπολογίζονται στο JS (βλ. MatrixCell) — εδώ μόνο διαστάσεις/
   z-index, ΟΧΙ position/top/left (θα παράκαμπταν το inline style, .msd-popover default
   είναι position:absolute). Selector .cellpick-popover.msd-popover (διπλή κλάση, ίδιο
   στοιχείο) για μεγαλύτερη specificity από το μονό .msd-popover (~L424, εμφανίζεται
   αργότερα στο αρχείο) — αλλιώς το width: max(100%, 220px) του .msd-popover κερδίζει λόγω
   source order και το popover βγαίνει πολύ φαρδύ χωρίς λόγο. */
.cellpick-popover.msd-popover { position: fixed; width: 190px; z-index: 60; }
.cellpick-opt {
  font-size: 12.5px; padding: 4px 6px; border-radius: 4px; cursor: pointer;
  font-family: var(--mono); display: flex; align-items: baseline; gap: 4px; flex-wrap: wrap;
}
.cellpick-opt:hover { background: var(--line-soft); }
.cellpick-opt.active { background: var(--teal-bg); color: var(--teal); font-weight: 600; }
.cellpick-opt-note { color: var(--muted); font-weight: 400; font-size: 10.5px; }
.cell-faces { display: block; font-size: 9px; color: var(--muted); text-align: center; margin-top: 1px; }
.cell-history-btn {
  flex: none; border: none; background: none; cursor: pointer;
  font-size: 9px; opacity: .25; padding: 0; line-height: 1;
}
.cell-history-btn:hover { opacity: 1; }

/* ---------- history drawer ---------- */
.history-entry { border-bottom: 1px solid var(--line-soft); padding: 8px 0; }
.history-entry:last-child { border-bottom: none; }
.history-entry-date { font-size: 11px; color: var(--muted); margin-bottom: 3px; }
.history-entry-body { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 12px; }
.history-field b { color: var(--ink-soft); font-weight: 600; }
.history-after { color: var(--teal); font-weight: 600; }
.cellselect.filled { color: var(--teal); font-weight: 600; }
.cellempty { color: var(--line); }
.sqft-group-head { text-align: center; background: var(--bg); border-bottom: 1px solid var(--line); font-size: 10.5px; color: var(--muted); text-transform: uppercase; letter-spacing: .3px; }
/* Σύνολο (τελευταία γραμμή, βλ. SqftPage) — ίδιο πνεύμα με το κίτρινο ΣΥΝΟΛΟ row του
   πρωτότυπου spreadsheet που ζητήθηκε να αναπαραχθεί, theme-aware μέσω --amber-bg. */
table.matrix tr.sqft-total-row td { background: var(--amber-bg); font-weight: 600; }
table.matrix tr.sqft-total-row td.storecell { background: var(--amber-bg); }
/* Σύγκριση Net m² καταχωρημένο vs άθροισμα τμημάτων (SqftDepartmentsPerStoreView) — ελαφρύ
   πλαίσιο, ΟΧΙ γέμισμα χρώματος, ώστε να ξεχωρίζει από το ΣΥΝΟΛΟ row από πάνω του χωρίς να
   ανταγωνίζεται οπτικά. .sqft-mismatch (crosscheck, ζητήθηκε ρητά "να είναι ΑΚΡΙΒΩΣ το ίδιο")
   πάνω σε μεμονωμένο κελί όταν η τιμή ΔΕΝ ταιριάζει με το άθροισμα τμημάτων του ίδιου όροφου/
   καταστήματος. */
table.matrix tr.sqft-compare-row td { border-top: 2px solid var(--line); font-style: italic; color: var(--muted); }
table.matrix tr.sqft-compare-row td.storecell { font-style: italic; }
/* "Διαφορά" row (Net - ΣΥΝΟΛΟ ΤΜΗΜΑΤΩΝ) — απλό, ΟΧΙ italic (ζητήθηκε ρητά "τι διαφορά
   προκύπτει", η ίδια η γραμμή είναι η απάντηση, δεν χρειάζεται υποτονική γραφή σαν το
   compare-row από πάνω της). */
table.matrix tr.sqft-diff-row td { font-weight: 600; }
td.sqft-mismatch { background: var(--danger-bg); color: var(--danger); font-weight: 700; font-style: normal; }
.sqft-status-ok { color: var(--ok); font-weight: 700; }
.sqft-status-bad { color: var(--danger); font-weight: 700; }
/* Crosscheck badge στο toolbar (per-store view + summary view) — ίδιο .pill μέγεθος/shape με
   κάθε άλλο pill του app, χρώμα ανάλογα με το αν ταιριάζουν τα τμήματα με το Net m². */
.pill.sqft-crosscheck-ok { background: var(--ok-bg); color: var(--ok); }
.pill.sqft-crosscheck-bad { background: var(--danger-bg); color: var(--danger); }
/* Μικρή ένδειξη διαφοράς πάνω στο Net κελί της Επισκόπησης (ζητήθηκε ρητά "και τα 2 views να
   δείχνουν τι διαφορά προκύπτει") — κάθετη στοίβα κάτω από την τιμή, ΟΧΙ πλάι της (τα κελιά
   είναι ήδη στενά), μικρό/διακριτικό ώστε να μη βαραίνει τον ήδη πυκνό πίνακα όταν δεν
   χρειάζεται προσοχή (δηλαδή στην πλειοψηφία των κελιών, όπου ΔΕΝ υπάρχει απόκλιση). */
.sqft-net-cell { display: flex; flex-direction: column; align-items: center; gap: 1px; }
.sqft-diff-flag { font-size: 9px; font-weight: 700; color: var(--danger); line-height: 1; cursor: help; }
/* Ετικέτα δίπλα σε Αποθήκη/Χώρους Προσωπικού στο per-store view — θυμίζει ότι αυτά τα 2
   τμήματα δεν προσμετρούνται στο Net m² (επιχειρησιακός κανόνας, ζητήθηκε ρητά). */
.sqft-excluded-tag { font-size: 10px; font-weight: 400; color: var(--muted); font-style: italic; }

/* ---------- view switch (SqftPage — Επισκόπηση/Τμήματα ανά κατάστημα/Σύνοψη τμημάτων) ---------- */
/* Ίδιο segmented-pill πνεύμα με .theme-toggle (προφίλ μενού) — ζητήθηκε ρητά "να ταιριάζει
   στην αρμονία και αισθητική της υπόλοιπης πλατφόρμας", αυτό είναι ήδη το καθιερωμένο visual
   language του app για "διάλεξε 1 από λίγες επιλογές". */
.viewswitch {
  display: inline-flex; border: 1px solid var(--line); border-radius: 999px;
  padding: 3px; background: var(--panel-2); gap: 2px; margin-bottom: 14px;
}
.viewswitch-btn {
  border: none; background: none; padding: 7px 16px; border-radius: 999px;
  font-family: var(--sans); font-size: 12.5px; font-weight: 600; color: var(--muted);
  cursor: pointer; transition: background-color .12s ease, color .12s ease;
}
.viewswitch-btn:hover { color: var(--ink); }
.viewswitch-btn.active { background: var(--panel); color: var(--accent-d); box-shadow: var(--shadow-sm); }

/* ---------- toast ---------- */
/* Πάντα σκούρο "chrome" (--ink-fixed), ίδιο μοτίβο με topbar/tooltip — ένα floating toast
   πάνω σε οποιοδήποτε background πρέπει να μένει ευανάγνωστο ασχέτως theme της σελίδας κάτω. */
@keyframes toast-in {
  from { opacity: 0; transform: translateX(12px); }
  to { opacity: 1; transform: translateX(0); }
}
.toasts { position: fixed; right: 18px; bottom: 18px; display: flex; flex-direction: column; gap: 8px; z-index: 50; }
.toast {
  background: var(--ink-fixed-2);
  color: #fff; padding: 10px 14px; border-radius: var(--radius-md);
  font-size: 13px; box-shadow: var(--shadow-lg); border-left: 3px solid var(--ok);
  animation: toast-in .25s cubic-bezier(.16, 1, .3, 1);
}
.toast.err { border-left-color: var(--accent); }

.empty { padding: 40px; text-align: center; color: var(--muted); }

/* ---------- auth screens ---------- */
@keyframes authpanel-in {
  from { opacity: 0; transform: translateY(14px) scale(.96); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes autherr-in { from { opacity: 0; } to { opacity: 1; } }
/* Login/lock screen — πλήρης ευθυγράμμιση με το "Luminous Retail" design system (βλ.
   redesign platform/luminous_retail/DESIGN.md, διαβάστηκε πλήρως): airy white foundation,
   πορτοκαλί (var(--brand)) μόνο σε λίγα σημεία (λογότυπο/CTA/focus), tonal shifts αντί για
   έντονο gradient/σκούρο glass panel. Πριν εδώ ζούσε ένα ξεχωριστό, πιο "δραματικό" branded
   treatment (πορτοκαλί→σκούρο gradient, σκούρο navy header μέσα στην κάρτα) — ρητά
   αντικαταστάθηκε (ζητήθηκε "να ξανασχεδιαστεί με τα νέα design rules... όλη η login page
   και το lock screen", επιβεβαιώθηκε "πλήρης ευθυγράμμιση" σε AskUserQuestion). Το ίδιο
   background token (var(--bg)) με κάθε άλλη σελίδα του app — καμία πλέον ξεχωριστή ένταση. */
.authscreen {
  min-height: 100vh; display: flex; align-items: center; justify-content: center;
  position: relative;
  background: var(--bg);
  padding: 24px;
}

/* ---------- lock screen (πριν το login, "σαν κλειδωμένα Windows" — ζητήθηκε ρητά) ---------- */
/* Ίδιο .authscreen background με το LoginPage από κάτω — click/πλήκτρο κάνει slide-up + fade
   (ίδιο μοτίβο με το πραγματικό Windows lock screen), αποκαλύπτοντας το login form πάνω στο
   ΙΔΙΟ background, όχι δύο άσχετες οθόνες. */
.lockscreen { flex-direction: column; gap: 6px; cursor: pointer; user-select: none; }
/* Λογότυπο μεγάλο και αυτόνομο (ζητήθηκε ρητά "να μπει κάπως το logo ολόκληρο κάπου") — όχι
   πια μικρό μέσα σε σκούρο pill δίπλα σε κείμενο· "Cluster Console" γίνεται caption από κάτω. */
.lockscreen-brand {
  display: flex; flex-direction: column; align-items: center; gap: 10px;
  margin-bottom: 40px; color: var(--ink-soft); font-size: 13px; letter-spacing: .01em; font-weight: 600;
}
.lockscreen-logo { width: 240px; height: 51px; color: var(--brand); }
.lockscreen-card {
  display: flex; flex-direction: column; align-items: center;
  gap: 14px; padding: 40px 64px; border-radius: var(--radius-lg);
  background: var(--panel);
  border: 1px solid var(--line);
  box-shadow: var(--shadow-lg);
}
.lockscreen-lock {
  display: flex; align-items: center; justify-content: center; width: 40px; height: 40px;
  border-radius: 50%; color: var(--accent); background: var(--accent-tint); border: 1px solid transparent;
}
.lockscreen-clock { text-align: center; color: var(--ink); }
.lockscreen-time { font-size: 88px; font-weight: 300; line-height: 1; letter-spacing: -.02em; }
.lockscreen-date { font-size: 18px; color: var(--ink-soft); margin-top: 8px; text-transform: capitalize; }
.lockscreen-hint {
  display: flex; align-items: center; gap: 8px;
  margin-top: 34px; padding: 10px 18px; border-radius: 999px;
  background: var(--panel); border: 1px solid var(--line); color: var(--ink-soft); font-size: 13px;
  transition: background-color .2s;
}
.lockscreen:hover .lockscreen-hint { background: var(--panel-2); }
.lockscreen.exiting {
  transform: translateY(-100%); opacity: 0;
  transition: transform .32s cubic-bezier(.4, 0, .2, 1), opacity .32s ease;
}
/* ---------- idle timeout countdown (header, βλ. AppShell) ---------- */
.idle-timer {
  display: inline-flex; align-items: center; gap: 5px; padding: 5px 10px; border-radius: 999px;
  background: var(--bg); border: 1px solid var(--line); color: var(--muted);
  font-size: 12px; font-variant-numeric: tabular-nums; font-family: var(--mono);
}
@media (prefers-reduced-motion: reduce) {
  .lockscreen.exiting { transform: none; transition: opacity .15s ease; }
}

.authpanel {
  position: relative; z-index: 1;
  width: 440px; border-radius: var(--radius-lg);
  background: var(--panel);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
  animation: authpanel-in .5s cubic-bezier(.16, 1, .3, 1);
}
/* Λευκό/airy hero αντί για το προηγούμενο σκούρο navy strip — το λογότυπο (μεγάλο, αυτόνομο,
   standalone hero moment) πάνω, το "Cluster Console"/"Store Design" caption από κάτω σαν
   δεύτερο επίπεδο ιεραρχίας (DESIGN.md: heading semibold/bold, caption light/muted). Λεπτό
   hairline border κάτω αντί για γεμάτο χρώμα διαχωρίζει από την κάρτα (DESIGN.md: "borders...
   1px, χαμηλής αντίθεσης... guide, όχι δομικός τοίχος"). */
.authhero {
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 18px;
  padding: 40px 28px 32px; border-bottom: 1px solid var(--line);
}
.authlogo { width: 300px; height: 64px; color: var(--brand); }
.authhero-text { display: flex; flex-direction: column; align-items: center; gap: 3px; }
.authhero-text b { font-size: 18px; letter-spacing: -.01em; color: var(--ink); }
.authhero-text span { font-size: 12px; color: var(--muted); }
.authcard {
  padding: 28px 28px 30px; display: flex; flex-direction: column; gap: 16px;
}
.authcard .field label { text-transform: none; font-size: 12px; letter-spacing: 0; color: var(--muted); }
.authcard input {
  width: 100%; padding: 10px 12px; font-size: 14px; border-radius: var(--radius-md); background: var(--bg);
  transition: border-color .15s, box-shadow .15s;
}
.authcard input:focus {
  /* Άμεσο, πιο αισθητό glow σε focus (όχι μόνο on submit) — ζητήθηκε ρητά "εμπνεύσου από τα
     καλύτερα login pages". */
  box-shadow: 0 0 0 4px var(--accent-tint), 0 4px 16px color-mix(in srgb, var(--accent) 25%, transparent);
}
.autherr {
  font-size: 12px; color: var(--danger); background: var(--danger-bg); padding: 8px 10px; border-radius: 6px;
  animation: autherr-in .2s ease; /* cross-fade, όχι slide/shake — established micro-interaction guidance */
}
.authnotice {
  /* Ουδέτερο γκρι, ΟΧΙ var(--accent) — στο login screen το accent ΕΙΝΑΙ το πορτοκαλί brand
     χρώμα, μοιάζει σχεδόν ίδιο με το κόκκινο .autherr και μπερδεύει "αποσυνδεθήκατε λόγω
     αδράνειας" με σφάλμα σύνδεσης. */
  font-size: 12px; color: var(--ink-soft); background: var(--line-soft); padding: 8px 10px; border-radius: 6px;
  animation: autherr-in .2s ease;
}
.authcard button.btn.primary {
  /* Χωρίς δικό του border-radius πια — κληρονομεί το Full Pill του base button.btn
     (DESIGN.md: "Buttons... Full Pill radius, ποτέ αιχμηρές γωνίες"). */
  width: 100%; padding: 10px 12px; font-size: 14px;
  transition: transform .12s cubic-bezier(.34, 1.56, .64, 1), box-shadow .15s, background-color .15s, border-color .15s;
}
.authcard button.btn.primary:not(:disabled):hover { box-shadow: 0 6px 16px color-mix(in srgb, var(--accent) 40%, transparent); }
.authcard button.btn.primary:not(:disabled):active { transform: scale(.97); }
/* Σύντομο success state πριν το onLoggedIn() transition (βλ. LoginPage submit() στο app.jsx) —
   ίδιο consistent "success feedback" pattern σε κάθε επιτυχημένη ενέργεια αυτής της εφαρμογής. */
.authcard button.btn.primary.success { background: var(--ok); border-color: var(--ok); }

/* ---------- drawer ---------- */
@keyframes drawer-backdrop-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes drawer-slide-in { from { transform: translateX(24px); opacity: .6; } to { transform: translateX(0); opacity: 1; } }
.drawer-backdrop {
  position: fixed; inset: 0; background: var(--overlay); z-index: 40;
  display: flex; justify-content: flex-end;
  animation: drawer-backdrop-in .18s ease-out;
}
.drawer {
  width: min(570px, 100vw); height: 100vh;
  background: var(--panel);
  border-left: 1px solid var(--line);
  display: flex; flex-direction: column;
  box-shadow: var(--shadow-drawer);
  animation: drawer-slide-in .22s cubic-bezier(.16, 1, .3, 1);
}
.drawer.wide { width: min(720px, 100vw); }
.drawer-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 18px; border-bottom: 1px solid var(--line);
}
.drawer-head b { font-size: 14px; }
.drawer-subtitle { font-size: 11.5px; color: var(--muted); margin-top: 2px; }
.drawer-body { flex: 1; overflow: auto; padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; }
.drawer-field { display: flex; flex-direction: column; gap: 4px; }
.drawer-field label { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--muted); }
.drawer-field select, .drawer-field input, .drawer-field textarea { width: 100%; }
.drawer-readonly {
  font-size: 13px; color: var(--muted); padding: 6px 8px;
  background: var(--panel-2); border: 1px dashed var(--line); border-radius: 6px;
  min-height: 32px; display: flex; align-items: center;
}
.drawer-foot {
  display: flex; gap: 8px; padding: 14px 18px; border-top: 1px solid var(--line);
}
.drawer-foot .btn.primary { flex: 1; }
.drawer-current { font-size: 11px; color: var(--muted); }
/* Μετονομασία cluster code (ClusterEditDrawer, super_admin only) — inline input+κουμπιά αντί
   για το προεπιλεγμένο width:100% ενός .drawer-field input, ώστε να χωράνε δίπλα-δίπλα. */
.drawer-rename-row { display: flex; gap: 6px; align-items: center; margin-top: 4px; }
.drawer-rename-row input { width: 120px !important; }

/* Κανόνες cluster ανά ομάδα καταστήματος (tab "Cluster Ομάδες", ClusterTierEditor/
   ClusterTiersPage) — 4 ενότητες (Orange/Orange+/White/White+), κάθε μία με ταξινομημένη λίστα
   ΑΝΟΙΧΤΟΥ μήκους από select+remove γραμμές (όχι σταθερό min/mid/max grid). */
.tier-editor { max-width: 560px; }
.tier-group { display: flex; flex-direction: column; gap: 6px; padding: 10px 0; border-top: 1px solid var(--line-soft); }
.tier-group:first-of-type { border-top: none; padding-top: 0; }
.tier-group-head { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; }
.tier-row { display: flex; gap: 6px; align-items: center; }
.tier-row select { flex: 1; }
.tier-row select.danger { border-color: var(--danger); box-shadow: 0 0 0 1px var(--danger); }

/* Spacegroup typeahead picker (ClusterTiersPage, mode "Ανά Spacegroup") — ίδιο "portal-less"
   popover πιο απλό από το MultiSelectDropdown (μία μόνο επιλογή, όχι multi/checkboxes). */
.tier-sg-picker { position: relative; max-width: 420px; }
.tier-sg-picker-list {
  position: absolute; z-index: 10; top: calc(100% + 4px); left: 0; right: 0;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg); max-height: 260px; overflow: auto;
}
.tier-sg-picker-item { padding: 8px 12px; font-size: 13px; cursor: pointer; }
.tier-sg-picker-item:hover { background: var(--panel-2); }
.tier-sg-picker-selected { display: flex; align-items: center; gap: 10px; margin-top: 10px; font-size: 13px; }

/* Ομάδα-tabs (ClusterTiersPage, mode "Ανά Ομάδα Καταστήματος") — ίδιο χρωματικό vocabulary με
   STORE_GROUP_COLOR (border+text χρωματίζεται όταν active, βλ. inline style στο app.jsx). */
.tier-group-tabs { display: flex; gap: 8px; }
.tier-group-tab {
  padding: 7px 16px; border-radius: 999px; border: 1px solid var(--line); background: var(--panel);
  font-size: 13px; font-weight: 600; color: var(--ink-soft); cursor: pointer;
  transition: border-color .12s ease, color .12s ease;
}
.tier-group-tab.active { border-width: 2px; }

/* Comment info popover (CommentInfoPopover) — μικρό "i" δίπλα σε cluster κωδικούς, Clusters
   page ΚΑΙ Cluster ανά κατάστημα matrix. */
.comment-info { display: inline-flex; margin-left: 4px; }
.comment-info-trigger {
  display: flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; padding: 0; border: none; border-radius: 50%;
  background: none; color: var(--muted); cursor: pointer;
}
.comment-info-trigger:hover { background: var(--panel-2); color: var(--ink); }
.comment-info-popover {
  z-index: 50; max-width: 260px; padding: 8px 10px; border-radius: var(--radius-md);
  background: var(--panel); border: 1px solid var(--line); box-shadow: var(--shadow-lg);
  font-size: 12.5px; color: var(--ink); line-height: 1.4; white-space: pre-wrap;
}

/* Faces+comment hover/inline info (ClusterFacesPopover/ClusterFacesInline) — tab "Cluster
   Ομάδες", δείχνει Live/Open/Box Moving/Non-Display/Feed + comment μαζί για έναν επιλεγμένο
   cluster κωδικό ("mousehover ... ώστε να ξέρουμε τι κοιτάμε"). Hover variant ίδιο μέγεθος/θέση
   με .comment-info, inline variant μόνιμα ορατό κάτω από τη γραμμή (showInfo toggle). */
.cluster-faces-trigger {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; margin-left: 4px; border-radius: 50%; color: var(--muted); cursor: default;
}
.cluster-faces-trigger:hover { background: var(--panel-2); color: var(--ink); }
.cluster-faces-popover {
  z-index: 50; max-width: 280px; padding: 8px 10px; border-radius: var(--radius-md);
  background: var(--panel); border: 1px solid var(--line); box-shadow: var(--shadow-lg);
  font-size: 12.5px; color: var(--ink); line-height: 1.4;
}
.cluster-faces-popover-comment { margin-top: 4px; padding-top: 4px; border-top: 1px solid var(--line-soft); color: var(--ink-soft); white-space: pre-wrap; }
/* Faces (στατιστικά) vs comment (ανθρώπινο κείμενο) — ζητήθηκε ρητά "να ξεχωρίζει" όταν είναι
   πολλά μαζί ανοιχτά: tabular αριθμοί από πάνω, το comment παίρνει δικό του accent border +
   πλάγια γραφή + ρητή ετικέτα "Σχόλιο:" ώστε να μη διαβάζεται σαν συνέχεια των faces. */
.cluster-faces-inline { margin: 2px 0 6px; font-size: 12px; color: var(--ink-soft); }
.cluster-faces-inline-faces { font-variant-numeric: tabular-nums; }
.cluster-faces-inline-comment {
  margin-top: 4px; padding-left: 8px; border-left: 2px solid var(--accent-tint);
  color: var(--ink); font-style: italic; white-space: pre-wrap;
}
.cluster-faces-inline-comment b { font-style: normal; color: var(--muted); font-weight: 600; margin-right: 3px; }
/* Ανά Ομάδα Καταστήματος table (πολλές ομάδες ανοιχτές μαζί) ΚΑΙ Ανά Spacegroup editor — κάθε
   κωδικός + το info του μαζί σε ΜΙΑ ξεχωριστή, οριοθετημένη "κάρτα" (ζητήθηκε ρητά "να ξεχωρίζει
   αλλά να είναι συγκεντρωμένο εκεί") αντί για ένα γκρι κουτί χαμένο ανάμεσα σε γειτονικές
   στήλες/γραμμές. Χωρίς border (has-info false, δηλαδή hover-only mode) μένει ελαφρύ όπως πριν. */
.cluster-tier-pill { display: block; margin: 0 0 6px; }
.cluster-tier-pill.has-info {
  padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--panel);
}
.cluster-tier-pill.has-info .pill { margin-bottom: 4px; }
.cluster-tier-pill.has-info .cluster-faces-inline { margin: 0; max-width: 320px; }
.tier-row-wrap.has-info {
  padding: 10px; margin-bottom: 4px; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--panel);
}
.tier-row-wrap.has-info .cluster-faces-inline { margin: 8px 0 0; }
/* Λεπτός κάθετος διαχωριστής πριν από κάθε στήλη ομάδας καταστήματος (ξεκινάει ήδη μετά τα SG
   ID/Space Group, ΠΟΤΕ literal first-child του <tr>) — ζητήθηκε ρητά "να ξεχωρίζει" ανά ομάδα
   όταν είναι πολλές ανοιχτές μαζί (Ctrl/Cmd+click multi-select). */
.cluster-tier-col { border-left: 1px solid var(--line-soft); }

/* ---------- user profile modal (κλικ πάνω σε όνομα, οπουδήποτε) ---------- */
/* Ξεχωριστό από .drawer-backdrop/.drawer (side-panel, γεμίζει όλο το ύψος) — εδώ ζητήθηκε
   ρητά "modal παράθυρο μικρό", άρα κεντραρισμένο compact card αντί για slide-in από την άκρη.
   z-index 60, πάνω από ΟΤΙΔΗΠΟΤΕ άλλο (drawers=40, popovers=45) — ένα όνομα μπορεί να είναι
   clickable ΚΑΙ μέσα σε ένα ήδη ανοιχτό drawer (π.χ. ο PM ενός spacegroup μέσα στο edit drawer). */
@keyframes modal-pop-in { from { transform: scale(.96); opacity: 0; } to { transform: scale(1); opacity: 1; } }
.modal-backdrop {
  position: fixed; inset: 0; background: var(--overlay); z-index: 60;
  display: flex; align-items: center; justify-content: center; padding: 16px;
  animation: drawer-backdrop-in .15s ease-out;
}
.modal-card {
  width: min(320px, 100%); background: var(--panel); border: 1px solid var(--line);
  border-radius: 14px; box-shadow: var(--shadow-drawer);
  animation: modal-pop-in .16s cubic-bezier(.16, 1, .3, 1);
}
.user-modal-body {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 8px; padding: 22px 18px;
}
.user-modal-name { font-size: 15px; font-weight: 700; }
.user-modal-contact {
  display: flex; flex-direction: column; gap: 6px; margin-top: 6px; width: 100%;
  font-size: 12.5px; color: var(--ink-soft);
}
.user-modal-contact > div { display: flex; align-items: center; gap: 7px; justify-content: center; }
.user-modal-contact svg { flex: none; color: var(--muted); }

/* Κοινό clickable-name (RequestCard/Clusters/Users admin/κ.λπ.) — μοιάζει με plain text, ΟΧΙ
   σαν κανονικό button, ζητήθηκε ρητά ένα διακριτικό "κλικ πάνω στο όνομα" χωρίς να θυμίζει
   κουμπί actions τύπου .btn. Underline μόνο on-hover ώστε να μη μοιάζει με broken link default. */
.user-name-link {
  background: none; border: none; padding: 0; margin: 0; font: inherit; color: inherit;
  cursor: pointer; text-decoration-line: none; text-underline-offset: 2px;
}
.user-name-link:hover { text-decoration-line: underline; color: var(--accent); }

/* ---------- request cart ---------- */
.cartbtn { position: relative; }
.cartbadge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 16px; height: 16px; padding: 0 4px; margin-left: 6px;
  background: var(--accent); color: #fff; border-radius: 999px;
  font-size: 10px; font-weight: 700; font-variant-numeric: tabular-nums;
}
.cart-item {
  border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px;
  display: flex; flex-direction: column; gap: 6px;
}
.cart-item-head { display: flex; align-items: center; justify-content: space-between; }
.cart-item-head b { font-size: 13px; }

/* ---------- before/after diff ---------- */
.diff-row {
  display: grid; grid-template-columns: 110px 1fr auto 1fr; align-items: center; gap: 8px;
  font-size: 12px; padding: 3px 0;
}
.diff-field { color: var(--muted); text-transform: uppercase; font-size: 10px; letter-spacing: .4px; }
.diff-before { color: var(--muted); text-decoration: line-through; text-align: right; }
.diff-arrow { color: var(--muted); }
.diff-after { color: var(--ink); font-weight: 600; }

/* ---------- pending matrix cell ---------- */
/* Ξεχωριστό, ΠΑΡΑΜΕΝΕΙ ΑΜΕΤΑΒΛΗΤΟ (δεν μπήκε στο νέο domain-based χρωματικό σύστημα
   παρακάτω) — αυτό εδώ είναι stage-based (τι στάδιο βρίσκεται η αλλαγή), όχι domain-based
   (display/feed), και το matrix κελί αντιπροσωπεύει ΠΑΝΤΑ store_assignment (πάντα display
   domain — το feed δεν έχει matrix κελιά, επιβεβαιωμένο με τον χρήστη), άρα δεν χρειάζεται
   feed variant. */
/* .pending-cell: μέσα στο δικό μου Σύνολο Αλλαγών, όχι ακόμα υποβλημένο. */
td.pending-cell { background: var(--pending-bg); }
td.pending-cell .cellselect, td.pending-cell .cellpick-trigger { color: var(--amber); font-weight: 600; }
/* .pending-submitted-cell: ήδη υποβλήθηκε, εκκρεμεί έγκριση από άλλον ρόλο — διαφορετικό
   χρώμα (μπλε) από το πιο πάνω, ώστε να ξεχωρίζουν οπτικά οι δύο έννοιες. */
td.pending-submitted-cell { background: var(--pending-submitted-bg); }
td.pending-submitted-cell .cellselect, td.pending-submitted-cell .cellpick-trigger { color: var(--cat-blue-fg); font-weight: 600; }
/* .cluster-highlight-cell: ΔΕΝ έχει η ίδιο το κελί κάποιο pending αίτημα, αλλά μοιράζεται
   το ίδιο cluster code με ένα pending cluster-entity αίτημα κάπου αλλού — τρίτη, ξεχωριστή
   έννοια από τα δύο πιο πάνω (μωβ αντί για amber/μπλε). */
td.cluster-highlight-cell { background: var(--cluster-highlight-bg); }
td.cluster-highlight-cell .cellselect, td.cluster-highlight-cell .cellpick-trigger, td.cluster-highlight-cell .chip { color: var(--cluster-highlight-fg); font-weight: 600; }
.cell-faces-pending { color: var(--cluster-highlight-fg); font-weight: 700; }
/* .cell-dimmed — client-side φίλτρο "κατάσταση κελιού" στο Cluster ανά κατάστημα (StoresPage,
   matrix). Δεν κρύβει/αφαιρεί τα μη-ταιριαστά κελιά (θα έσπαγε το grid alignment) — τα κάνει
   απλά χαμηλής αντίθεσης ώστε τα ζητούμενα (pending/submitted/highlighted) να ξεχωρίζουν οπτικά
   με μια ματιά, ίδιο "dim don't hide" σκεπτικό με φίλτρα σε άλλα data-viz εργαλεία. */
td.cell-dimmed { opacity: .28; }

/* ---------- pending clusters row (έχει ήδη υποβληθεί, εκκρεμεί έγκριση) ---------- */
/* domain-display/domain-feed — ίδιο μπλε/πορτοκαλί axis με το request-card παρακάτω.
   domain-both — cluster με ΚΑΙ display ΚΑΙ feed pending ταυτόχρονα (δύο ξεχωριστά change_requests
   rows, βλ. ClusterEditDrawer split-σε-2), λεπτό diagonal gradient των δύο χρωμάτων. */
tbody tr.pending-request-row.domain-display { background: var(--pending-submitted-bg); }
tbody tr.pending-request-row.domain-display:hover { background: var(--pending-submitted-row-hover); }
tbody tr.pending-request-row.domain-feed { background: var(--pending-feed-bg); }
tbody tr.pending-request-row.domain-feed:hover { background: var(--pending-feed-row-hover); }
tbody tr.pending-request-row.domain-both { background: linear-gradient(90deg, var(--pending-submitted-bg) 50%, var(--pending-feed-bg) 50%); }
tbody tr.pending-request-row.domain-both:hover { background: linear-gradient(90deg, var(--pending-submitted-row-hover) 50%, var(--pending-feed-row-hover) 50%); }

/* ---------- requests page ---------- */
/* Συμπαγές: 3-4 λεπτές γραμμές ανά κάρτα αντί για ένα-πεδίο-ανά-γραμμή με μεγάλα uppercase
   labels — με 200+ εκκρεμή αιτήματα η πυκνότητα πληροφορίας μετράει πολύ περισσότερο από
   τον "αέρα" γύρω από κάθε πεδίο. */
.requests-list.compact { display: flex; flex-direction: column; gap: 3px; }
.requests-selectall { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--ink-soft); cursor: pointer; margin-left: 12px; }
.request-select { flex: none; }
.bulk-action-bar {
  position: sticky; bottom: 16px; margin-top: 10px; z-index: 10;
  display: flex; align-items: center; gap: 10px;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: 10px 14px; box-shadow: var(--shadow-lg);
}
.request-card {
  background: var(--panel); border: 1px solid var(--line-soft); border-radius: 6px;
  border-left: 3px solid var(--line); padding: 6px 10px; display: flex; flex-direction: column; gap: 2px;
}
/* Deep-link target (#/requests?highlight=ID από Clusters tab, βλ. RequestsPage) — προσωρινό
   pulse ώστε η στοχευμένη κάρτα να ξεχωρίζει με μια ματιά μέσα στη λίστα μετά το scrollIntoView,
   αφαιρείται αυτόματα μετά από ~2s (βλ. RequestsPage useEffect). */
@keyframes request-card-pulse {
  0%, 100% { box-shadow: 0 0 0 0 var(--accent-tint); }
  50% { box-shadow: 0 0 0 6px var(--accent-tint); }
}
.request-card-pulse { animation: request-card-pulse 1.1s ease-in-out 2; border-color: var(--accent); }
/* Πλήρης αντικατάσταση του παλιού χρωματικού συστήματος (πριν: πορτοκαλί=cluster,
   μπλε=matrix) — τώρα το ΚΥΡΙΟ χρώμα δείχνει domain (μπλε=display, πορτοκαλί=feed, ρητά
   ζητήθηκε), και η ΑΠΟΧΡΩΣΗ (ανοιχτή/σκούρη του ίδιου χρώματος) δείχνει αλλαγή σε cluster
   (ανοιχτή) vs αλλαγή σε κατάστημα/matrix (σκούρη) — 4 συνδυασμοί συνολικά. entity-spacegroup
   (πρόταση νέου spacegroup) παραμένει πράσινο, ξεχωριστή κατηγορία εκτός του display/feed άξονα.
   Το domain-* χρειάζεται να μπει ΠΡΩΤΟ στο className ώστε να δώσει το χρώμα βάσης, το entity-*
   να μπει ΔΕΥΤΕΡΟ ώστε η απόχρωση να το παρακάμπτει (βλ. REQUEST_ENTITY_CLASS/REQUEST_DOMAIN_CLASS στο app.jsx). */
.request-card.domain-display.entity-cluster { border-left-color: var(--cat-blue-light); }
.request-card.domain-display.entity-store { border-left-color: var(--cat-blue-fg); }
.request-card.domain-feed.entity-cluster { border-left-color: var(--cat-orange-light); }
.request-card.domain-feed.entity-store { border-left-color: var(--cat-orange-fg); }
.request-card.entity-spacegroup { border-left-color: var(--ok); }
.request-row1 { display: flex; align-items: center; gap: 8px; }
/* Κοινός "κωδικός επικοινωνίας" (βλ. requestCode στο server) — ουδέτερο γκρι, ΟΧΙ το ίδιο teal
   με το .chip (cluster code) ώστε να μη μπερδεύονται οπτικά οι δύο διαφορετικές έννοιες. */
.request-code {
  flex: none; font-family: var(--mono); font-size: 11px; font-weight: 600; color: var(--muted);
  background: var(--line-soft); border-radius: 5px; padding: 2px 7px;
}
.request-title-text { font-size: 12.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.request-row2, .request-row3 { font-size: 11px; color: var(--ink-soft); line-height: 1.5; }
.request-row3.muted { color: var(--muted); }
.request-actions { display: flex; gap: 6px; }
.request-actions .btn { padding: 2px 8px; }
/* GroupedRequestCard — display+feed μαζί σε ΜΙΑ κάρτα (βλ. app.jsx) αντί για 2 ξεχωριστές
   δίπλα-δίπλα· κάθε domain παραμένει η δική του γραμμή/κατάσταση/κουμπιά μέσα στην κάρτα, ίδιο
   ουδέτερο background και στις δύο (η έγχρωμη διάκριση display/feed μένει στο ήδη υπάρχον
   .pill.domain-pill, όχι στο ίδιο το row background, ώστε να μη "χάνεται" το pill μέσα σε
   ίδιου χρώματος φόντο). */
.request-group-domains { display: flex; flex-direction: column; gap: 4px; margin-top: 2px; }
.request-domain-row {
  display: flex; align-items: center; gap: 8px; padding: 4px 8px; border-radius: 5px;
  background: var(--panel-2); border: 1px solid transparent;
}
.request-domain-diffs { font-size: 11px; color: var(--ink-soft); }
.request-domain-row.request-card-pulse { border-color: var(--accent); }

/* ---------- Stores tab: view picker (πριν φορτωθεί το matrix) ---------- */
/* Grid από "filter cards" (Luminous Retail design system — Cards: λευκό bg, 16px radius,
   Level 1 shadow) — auto-fit αντί για fixed 4 στήλες, ώστε 5 κάρτες (Division/Category/
   Family/Spacegroups/Καταστήματα) να τακτοποιούνται ομοιόμορφα αντί να αφήνουν μία ορφανή. */
.picker-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; margin-top: 16px; }
.picker-col {
  display: flex; flex-direction: column; gap: 8px;
  background: var(--panel); border: 1px solid var(--line-soft); border-radius: var(--radius-lg);
  padding: 16px; box-shadow: var(--shadow-sm);
}
.picker-col-label { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--muted); font-weight: 600; margin-bottom: 2px; }
/* Custom checkbox (.chk-box) — αντικαθιστά το raw native browser checkbox appearance (ζητήθηκε
   ρητά "να ακολουθήσει τη σχεδιαστική λογική του υπόλοιπου platform"), ίδιο "hide native input,
   στυλάρισε ένα sibling span" τέχνασμα με .toggle παραπάνω. Used από ΚΑΘΕ .picker-check checkbox
   list στο app (MultiSelectDropdown filters, Κλείδωμα drawer κ.ο.κ.) — μία διόρθωση εδώ καλύπτει
   όλα τα αντίστοιχα φίλτρα/drawers ταυτόχρονα. */
.picker-check { display: flex; align-items: center; gap: 8px; font-size: 12.5px; padding: 4px 0; cursor: pointer; }
.picker-check input[type=checkbox] { position: absolute; opacity: 0; width: 0; height: 0; }
.chk-box {
  flex: none; width: 16px; height: 16px; border-radius: 5px;
  border: 1.5px solid var(--line); background: var(--panel); color: #fff;
  display: flex; align-items: center; justify-content: center;
  transition: background-color .12s ease, border-color .12s ease;
}
.chk-box svg { opacity: 0; transform: scale(.5); transition: opacity .1s ease, transform .1s ease; }
.picker-check:hover .chk-box { border-color: var(--muted); }
.picker-check input:checked ~ .chk-box { background: var(--accent); border-color: var(--accent); }
.picker-check input:checked ~ .chk-box svg { opacity: 1; transform: scale(1); }
.picker-check input:focus-visible ~ .chk-box { box-shadow: 0 0 0 3px var(--accent-tint); }
.picker-check input:disabled ~ .chk-box { opacity: .5; }
.picker-check input:disabled ~ * { cursor: not-allowed; }
@media (prefers-reduced-motion: reduce) { .chk-box, .chk-box svg { transition: none; } }
/* Column-visibility popover (ColumnsToggleButton) — toggle switches, ΟΧΙ checkboxes, ξεχωριστό
   από .picker-check (που μένει checkbox για multi-select φίλτρα, π.χ. MultiSelectDropdown). */
.colpicker-item { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 9px 2px; font-size: 13px; border-bottom: 1px solid var(--line-soft); }
.colpicker-item:last-child { border-bottom: none; }
/* Search πάνω, ΕΞΩ από το scrollable .drawer-body — μένει σταθερό ενώ η λίστα στηλών από κάτω
   κάνει scroll (βλ. ColumnsToggleButton drawer). */
.colpicker-search { padding: 12px 18px 0; flex: none; }
.colpicker-search input { width: 100%; }
.picker-scroll { max-height: 220px; overflow-y: auto; display: flex; flex-direction: column; gap: 2px; }
.picker-selected-count { font-size: 11px; color: var(--muted); margin-top: 4px; }
.picker-actions { display: flex; gap: 10px; margin-top: 18px; }

/* ---------- import progress bar (ImportPage — chunked validate/apply) ---------- */
.import-progress { display: flex; flex-direction: column; gap: 4px; max-width: 420px; }
.import-progress-track { height: 8px; border-radius: 4px; background: var(--accent-tint); overflow: hidden; }
.import-progress-fill { height: 100%; background: var(--accent); border-radius: 4px; transition: width 0.2s ease; }
.import-progress-label { font-size: 12px; color: var(--muted); }

/* ---------- compact multi-select dropdown (MultiSelectDropdown) ---------- */
.msd { position: relative; display: flex; flex-direction: column; gap: 4px; }
.msd-trigger {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  font-family: var(--sans); font-size: 12.5px; cursor: pointer; text-align: left;
  border: 1px solid var(--line); border-radius: 6px; padding: 6px 9px; background: var(--panel);
  color: var(--ink); min-height: 32px; width: 100%;
}
.msd-trigger:hover { border-color: var(--muted); }
.msd-placeholder { color: var(--muted); }
.msd-caret { color: var(--muted); font-size: 10px; flex-shrink: 0; }
/* z-index 45 (ΟΧΙ 30) — πρέπει να ζωγραφίζεται ΠΑΝΩ από .drawer-backdrop/.sidebar (z-index:40).
   Ένα MultiSelectDropdown ανοιγμένο μέσα σε ένα Φίλτρα drawer (MultiSelectFilterField το
   χρησιμοποιεί απευθείας) πορτάρεται (ReactDOM.createPortal) στο <body>, ΕΞΩ από το ίδιο το
   .drawer — αν το popover έχει χαμηλότερο z-index από το drawer-backdrop, ζωγραφίζεται
   αόρατο ΠΙΣΩ από το πάνελ του drawer (ενώ υπάρχει κανονικά στο DOM), και τα clicks πάνω του
   πιάνει το ίδιο το drawer content από πάνω — ακριβώς το bug "τα φίλτρα δεν ανοίγουν/δεν
   πατάνε" που αναφέρθηκε, αφού ΚΑΘΕ multi-select φίλτρο μέσα σε drawer το είχε. */
/* position/top/left/width ΔΕΝ ζουν πια εδώ — ΚΑΘΕ caller τα ορίζει πάντα inline (βλ.
   openDropdown στο MultiSelectDropdown/openPicker στο MatrixCell), υπολογισμένα από το
   πραγματικό screen rect του trigger. Ένα ξεχασμένο "top: calc(100% + 4px)" εδώ έκανε ακριβώς
   το bug "άνοιξε προς τα πάνω αλλά κατέληξε αόρατο κάτω απ' την οθόνη" — όποτε ο caller δεν
   έθετε ρητά inline top (flip-upward case, βλ. openDropdown), το stylesheet's stale top
   ξαναμπάτσε πίσω, αγνοώντας εντελώς το inline bottom (ζητήθηκε ρητά να διορθωθεί). */
.msd-popover {
  z-index: 45;
  background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md); padding: 8px; display: flex; flex-direction: column; gap: 6px;
}
.msd-search { width: 100%; }
.msd-list { max-height: 220px; overflow-y: auto; display: flex; flex-direction: column; gap: 1px; }
.msd-empty { font-size: 12px; color: var(--muted); padding: 6px 2px; }
.msd-clear { align-self: flex-start; }

/* ---------- dashboard ---------- */
/* Θεματικά sections (Επισκόπηση/Καταστήματα & Τετραγωνικά/Spacegroups & PM/Αιτήματα/
   Συγκριτικά) — ζητήθηκε ρητά αντί για ένα επίπεδο grid με 17+ widgets. Κάθε section έχει
   δικό του τίτλο + δικό του .dash-grid, ξεχωριστά "νησιά" με λίγο κάθετο χώρο ανάμεσα. */
.dash-section { margin-bottom: 28px; }
.dash-section:last-child { margin-bottom: 0; }
.dash-section-title {
  font-size: 12.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px;
  color: var(--muted); margin: 0 0 10px 2px; padding-bottom: 6px; border-bottom: 1px solid var(--line-soft);
}
/* Σταθερές 6 στήλες (όχι auto-fill) — ώστε τα preset μεγέθη widget (XS/S/M/L/XL/Full, βλ.
   .widgetcard-size-*) να έχουν προβλέψιμο νόημα ασχέτως πλάτους οθόνης: XS=1/6, S=2/6, M=3/6,
   L=4/6, XL=5/6, Full=6/6 — πιο λεπτόκοκκο grid από το παλιό 4-column (S/M/L/Full only) ώστε
   συνδυασμοί widgets να αθροίζουν ακριβώς σε 6 πιο συχνά, λιγότερα κενά. grid-auto-flow:dense
   "γεμίζει" όποιο κενό μείνει πιάνοντας το επόμενο card που χωράει εκεί — ζητήθηκε ρητά, με
   γνωστό trade-off ότι η ΟΠΤΙΚΗ σειρά μπορεί να μην είναι πια 100% ίδια με τη σειρά drag-n-drop
   όταν μένει κενό (dense αναδιατάσσει για να γεμίσει, δεν αφήνει τρύπες). Responsive
   breakpoints πιο κάτω μειώνουν στήλες σε στενότερες οθόνες, τα spans προσαρμόζονται
   αναλογικά (βλ. media queries). */
.dash-grid {
  display: grid; grid-template-columns: repeat(6, 1fr); gap: 16px; grid-auto-flow: dense;
}
.widgetcard-size-XS { grid-column: span 1; }
.widgetcard-size-S { grid-column: span 2; }
.widgetcard-size-M { grid-column: span 3; }
.widgetcard-size-L { grid-column: span 4; }
.widgetcard-size-XL { grid-column: span 5; }
.widgetcard-size-Full { grid-column: span 6; }
@media (max-width: 1280px) {
  .dash-grid { grid-template-columns: repeat(3, 1fr); }
  .widgetcard-size-XS { grid-column: span 1; }
  .widgetcard-size-S, .widgetcard-size-M { grid-column: span 2; }
  .widgetcard-size-L, .widgetcard-size-XL, .widgetcard-size-Full { grid-column: span 3; }
}
@media (max-width: 720px) {
  .dash-grid { grid-template-columns: 1fr; }
  .widgetcard-size-XS, .widgetcard-size-S, .widgetcard-size-M,
  .widgetcard-size-L, .widgetcard-size-XL, .widgetcard-size-Full { grid-column: span 1; }
}
/* Edit mode — ζητήθηκε ρητά ένα σαφές οπτικό σήμα ότι το dashboard είναι "σε επεξεργασία"
   πέρα από το ίδιο το toolbar button, ώστε drag/resize affordances να μη διαβάζονται σαν
   μόνιμο μέρος του UI. */
.dash-grid.edit-mode { outline: 2px dashed var(--line); outline-offset: 8px; border-radius: 10px; }
.widgetcard-draghandle {
  cursor: grab; color: var(--muted); font-size: 15px; padding: 2px 4px; border-radius: 4px;
  line-height: 1; user-select: none; touch-action: none;
}
.widgetcard-draghandle:hover { background: var(--bg); color: var(--ink); }
.widgetcard-draghandle:active { cursor: grabbing; }
.widgetcard.dragging { opacity: .4; }
/* 6 κουμπιά πια (XS/S/M/L/XL/Full, πριν 4) — flex-wrap ώστε σε πολύ στενή κάρτα (π.χ. η ίδια
   επιλέχθηκε XS) το sizepicker να σπάει σε 2 γραμμές αντί να στριμώχνεται/κόβεται. */
.widgetcard-sizepicker { display: flex; flex-wrap: wrap; gap: 2px; max-width: 160px; justify-content: flex-end; }
.widgetcard-sizepicker button {
  border: 1px solid var(--line); background: var(--panel); color: var(--muted);
  font-size: 10px; font-weight: 700; padding: 2px 4px; border-radius: 4px; cursor: pointer; line-height: 1.4;
}
.widgetcard-sizepicker button.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.widgetcard-sizepicker button:hover:not(.active) { background: var(--bg); color: var(--ink); }
/* ΟΧΙ πια var(--ink-fixed) gradient (μόνιμα σκούρο chrome, φτιαγμένο για tooltips) — έμενε
   σκούρο navy banner ΑΣΧΕΤΩΣ theme/variant, "ξέμενε" οπτικά πάνω σε ένα π.χ. ανοιχτό γαλάζιο
   φόντο (ζητήθηκε ρητά να ακολουθεί τα χρώματα του υπόλοιπου theme). Ίδιο styling με το
   γενικό .toolbar πλέον. */
.dash-toolbar {
  display: flex; align-items: center; gap: 10px; margin-bottom: 14px;
  padding: 14px 18px; background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); color: var(--ink);
}
.dash-toolbar b { font-size: 16px; letter-spacing: .2px; }

@keyframes widgetcard-in {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}
.widgetcard {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 12px;
  min-height: 220px; min-width: 0; overflow: hidden;
  animation: widgetcard-in .38s ease-out backwards;
  transition: box-shadow .18s ease, border-color .18s ease;
  box-shadow: var(--shadow-sm);
}
.widgetcard:hover { box-shadow: var(--shadow-md); border-color: var(--line-soft); }
/* Στοίβαξη delay ανά θέση στο grid — καθαρά CSS, καμία JS animation lib. Καλύπτει έως 16
   widgets με ρυθμό εμφάνισης· πέρα από αυτό όλα παίρνουν το ίδιο (τελευταίο) delay, αποδεκτό
   γιατί το dashboard σήμερα έχει πολύ λιγότερα widgets από 16. */
.dash-grid .widgetcard:nth-child(1) { animation-delay: .02s; }
.dash-grid .widgetcard:nth-child(2) { animation-delay: .06s; }
.dash-grid .widgetcard:nth-child(3) { animation-delay: .1s; }
.dash-grid .widgetcard:nth-child(4) { animation-delay: .14s; }
.dash-grid .widgetcard:nth-child(5) { animation-delay: .18s; }
.dash-grid .widgetcard:nth-child(6) { animation-delay: .22s; }
.dash-grid .widgetcard:nth-child(7) { animation-delay: .26s; }
.dash-grid .widgetcard:nth-child(8) { animation-delay: .3s; }
.dash-grid .widgetcard:nth-child(n+9) { animation-delay: .34s; }
.widgetcard-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.widgetcard-title { font-size: 13.5px; font-weight: 700; color: var(--ink-soft); }
.widgetcard-controls { display: flex; align-items: center; gap: 2px; }
.widgetcard-controls button {
  border: none; background: none; cursor: pointer; color: var(--muted); font-size: 13px;
  padding: 3px 6px; border-radius: 5px; line-height: 1;
}
.widgetcard-controls button:hover { background: var(--bg); color: var(--ink); }
.widgetcard-controls button:disabled { opacity: .3; cursor: default; }
.widgetcard-controls button:disabled:hover { background: none; }
.widgetcard-body { flex: 1; display: flex; align-items: center; justify-content: center; min-width: 0; width: 100%; }
.widgetcard-body.align-start { align-items: flex-start; justify-content: flex-start; width: 100%; }
.widgetcard-error { color: var(--danger); font-size: 12.5px; }

/* Πολλαπλά StatTile δίπλα-δίπλα μέσα σε ΕΝΑ widget (π.χ. "Σύνολα δικτύου": Καταστήματα/Net/
   Gross/Clusters μαζί) — χρησιμοποιείται με .stattile.compact παιδιά, βλ. παρακάτω. */
.stattile-grid { display: flex; gap: 16px; flex-wrap: wrap; }
.stattile { text-align: center; padding: 8px 0; position: relative; min-width: 0; }
.stattile-value {
  font-size: 34px; font-weight: 800; font-family: var(--mono);
  background: linear-gradient(120deg, var(--ink) 0%, var(--accent) 120%);
  -webkit-background-clip: text; background-clip: text; color: transparent;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.stattile-label { font-size: 12.5px; color: var(--muted); margin-top: 4px; }
.stattile-sub { font-size: 11px; color: var(--muted); margin-top: 2px; }
/* Δύο ή περισσότερα StatTile δίπλα-δίπλα (π.χ. Σύνολο Net/Gross) — μικρότερο font ώστε να
   χωράνε χωρίς overflow, ίδιο πρόβλημα/ίδια λύση με το .dash-table fix νωρίτερα (min-width:0
   στο flex item + ελεγχόμενο μέγεθος γραμματοσειράς αντί να σπρώχνει την κάρτα πλατύτερη). */
.stattile.compact { flex: 1; min-width: 0; }
.stattile.compact .stattile-value { font-size: 24px; }

@media (prefers-reduced-motion: reduce) {
  .widgetcard { animation: none; }
  .drawer-backdrop, .drawer, .toast, .authpanel, .authscreen, .autherr, .profilemenu-popover, .notif-popover { animation: none; }
  * { transition-duration: .01ms !important; }
}

.barchart { width: 100%; display: flex; align-items: flex-end; gap: 10px; padding-top: 8px; }
.barchart-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 0; }
.barchart-value { font-size: 11px; color: var(--ink-soft); font-family: var(--mono); }
.barchart-bar { width: 100%; max-width: 46px; border-radius: 4px 4px 0 0; transition: opacity .15s; }
.barchart-bar:hover { opacity: .8; }
.barchart-label {
  font-size: 10.5px; color: var(--muted); text-align: center; max-width: 70px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.donutchart { display: flex; align-items: center; gap: 16px; }
.donutchart-legend { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.donutchart-legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; }
.donutchart-swatch { width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; }
.donutchart-legend-label { color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 140px; }
.donutchart-legend-value { color: var(--muted); font-family: var(--mono); font-size: 11px; margin-left: auto; }

.linechart, .groupedbarlinechart { width: 100%; }
/* Οριζόντιο scroll ΜΟΝΟ όταν τα σημεία (x-άξονας) δεν χωράνε στο πλάτος του container χωρίς
   να στριμωχτούν (βλ. LineChart component — width = max(containerWidth, n*46), responsive
   στο διαθέσιμο πλάτος μέσω ResizeObserver). position:relative ώστε το .linechart-tooltip
   να τοποθετείται absolute πάνω στο chart, όχι στη σελίδα. */
.linechart-scroll { width: 100%; overflow-x: auto; position: relative; }
.linechart-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; margin-top: 8px; padding: 0 4px; }
.linechart-legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; cursor: pointer; padding: 2px 4px; border-radius: 4px; }
.linechart-legend-item:hover, .linechart-legend-item.active { background: var(--bg); }
.linechart-legend-item.active .linechart-legend-label { color: var(--ink); font-weight: 600; }
.linechart-swatch { width: 10px; height: 10px; border-radius: 3px; flex-shrink: 0; }
.linechart-legend-label { color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 220px; }
.linechart-legend-overflow { font-size: 11.5px; color: var(--muted); padding: 2px 4px; cursor: default; }
/* Tooltip panel — εμφανίζεται πάνω από το σημείο του x-άξονα που κάνεις hover, δείχνει ΟΛΕΣ
   τις ορατές (top-N) σειρές σε αυτό το σημείο ταξινομημένες φθίνουσα, όχι μόνο τη σειρά κάτω
   ακριβώς από το ποντίκι — ζητήθηκε ρητά "να μπορώ να δω όλες τις τιμές στο tooltip". */
/* --ink-fixed (ΟΧΙ --ink) — το --ink αναστρέφεται σε ανοιχτόχρωμο στο dark mode, ένα tooltip
   pinned σε var(--ink) θα γινόταν αόρατο (ανοιχτό κείμενο πάνω σε σχεδόν-λευκό background).
   Μόνιμο σκούρο floating chrome, ίδιο μοτίβο με topbar/toast. */
.linechart-tooltip {
  position: absolute; top: 4px; transform: translateX(-50%);
  background: var(--ink-fixed-2); color: #fff; border-radius: 8px; padding: 8px 10px;
  font-size: 11.5px; box-shadow: var(--shadow-md); z-index: 5; pointer-events: none;
  max-height: 260px; overflow-y: auto; min-width: 160px;
}
.linechart-tooltip-head { font-weight: 700; margin-bottom: 4px; color: #fff; white-space: nowrap; }
.linechart-tooltip-row { display: flex; align-items: center; gap: 6px; padding: 1px 0; white-space: nowrap; }
.linechart-tooltip-label { color: #d8dee8; overflow: hidden; text-overflow: ellipsis; max-width: 160px; }
.linechart-tooltip-value { margin-left: auto; font-family: var(--mono); color: #fff; }

/* table-layout:fixed + per-cell ellipsis — χωρίς αυτό ένα κελί με μακρύ, αδιάσπαστο κείμενο
   (π.χ. "Greek Books (348.797) · Greek Kids Books (184.198) · ...") έσπρωχνε ολόκληρο τον
   πίνακα πλατύτερο από το .widgetcard container του, "χύνοντας" πάνω στην επόμενη κάρτα του
   grid αντί να κόβεται μέσα στα δικά του όρια. */
.dash-table { width: 100%; border-collapse: collapse; font-size: 12.5px; table-layout: fixed; }
.dash-table th { text-align: left; color: var(--muted); font-size: 10.5px; text-transform: uppercase; letter-spacing: .3px; padding: 4px 8px; border-bottom: 1px solid var(--line); }
.dash-table td {
  padding: 6px 8px; border-bottom: 1px solid var(--line-soft);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dash-table tr:last-child td { border-bottom: none; }
/* Modifier για κελιά που είναι ήδη μία λίστα τιμών χωρισμένη με "·" (π.χ. top spacegroups ανά
   division/family/category/PM) — single-line ellipsis έκοβε το 2ο/3ο στοιχείο εντελώς παρόλο
   που η κάρτα έχει άφθονο κάθετο χώρο από κάτω. Επιτρέπει wrap σε 2-3 γραμμές αντί για ellipsis
   σε μία, ίδιο container-clipping (min-width:0 στο .widgetcard) εξακολουθεί να ισχύει. */
.dash-table-wrap td { white-space: normal; overflow: visible; text-overflow: clip; word-break: break-word; }

.dash-hidden-tray {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 14px;
  background: var(--bg); border: 1px dashed var(--line); border-radius: 10px; margin-bottom: 14px;
  font-size: 12.5px; color: var(--muted);
}

/* ---------- Τεκμηρίωση ---------- */
/* Sticky side-nav + scrollable content column, ίδιο 2-column layout σκεπτικό με drawer/side
   panels αλλού στο αρχείο — όχι νέο interaction pattern, μόνο anchor-scroll (καμία δική του
   routing state, IntersectionObserver μόνο κάνει highlight το ενεργό section). */
.docs-layout { display: grid; grid-template-columns: 220px 1fr; gap: 28px; align-items: start; }
/* top: 82px = .app-header's ύψος (64px) + 18px "ανάσα" — χωρίς αυτό, το sticky nav "κολλάει"
   πάνω από το ίδιο σημείο (18px) όπου ήδη κολλάει το .app-header (position:sticky, z-index:20),
   και το header το σκεπάζει· κόβει οπτικά το πάνω μέρος της πρώτης ορατής γραμμής του nav κατά
   το scroll. Μοναδικό sticky element μέσα στο routed page content που χρειάζεται αυτό το offset
   — τα υπόλοιπα sticky (π.χ. table thead) ζουν μέσα σε δικό τους, ξεχωριστό scroll container. */
.docs-nav { position: sticky; top: 82px; display: flex; flex-direction: column; gap: 2px; }
.docs-nav-link {
  padding: 7px 10px; border-radius: 8px; font-size: 13px; color: var(--muted);
  text-decoration: none; border-left: 2px solid transparent;
  background: none; border-top: none; border-right: none; border-bottom: none;
  text-align: left; width: 100%; cursor: pointer; font-family: inherit; display: block;
}
.docs-nav-link:hover { background: var(--panel-2); color: var(--ink); }
.docs-nav-link.active { background: var(--accent-tint); color: var(--accent-d); border-left-color: var(--accent); font-weight: 600; }
.docs-content { min-width: 0; max-width: 1120px; }
/* scroll-margin-top: 82px — ίδιος λόγος με το .docs-nav offset παραπάνω: χωρίς αυτό, ένα κλικ
   στο side-nav σκρολάρει τον τίτλο του section ακριβώς κάτω από το sticky .app-header, κρύβοντάς
   τον προσωρινά μέχρι να προλάβει ο χρήστης να σκρολάρει λίγο παραπάνω. */
.docs-section { padding-top: 6px; margin-bottom: 44px; scroll-margin-top: 82px; }
.docs-section:last-child { margin-bottom: 0; }
.docs-section h2 { font-size: 18px; margin: 0 0 12px; color: var(--ink); }
.docs-section h3 { font-size: 14px; margin: 0 0 6px; color: var(--ink); }
.docs-section p { font-size: 13.5px; line-height: 1.6; color: var(--ink-soft); margin: 0 0 12px; }
.docs-section ul.docs-list, .docs-section ol.docs-runbook { margin: 0 0 12px; padding-left: 22px; }
.docs-list li { font-size: 13.5px; line-height: 1.7; color: var(--ink-soft); margin-bottom: 6px; }

/* Απλό, self-contained relationship diagram (CSS boxes + βελάκια κειμένου) — καμία εξωτερική
   βιβλιοθήκη διαγραμμάτων, ίδιο "zero νέα εξάρτηση" σκεπτικό με το vendoring του dnd-kit. */
.docs-diagram { display: flex; flex-direction: column; align-items: center; gap: 6px; margin: 18px 0 22px; }
.docs-entity-box {
  width: 100%; max-width: 480px; background: var(--panel); border: 1px solid var(--line);
  border-radius: 10px; padding: 12px 16px; text-align: center; box-shadow: var(--shadow-sm);
}
.docs-entity-title { font-weight: 700; font-size: 14px; color: var(--ink); }
.docs-entity-sub { font-size: 12px; color: var(--muted); margin-top: 3px; }
.docs-diagram-arrow { font-size: 12px; color: var(--muted); font-style: italic; }

/* auto-fit αντί για fixed 1fr 1fr — τώρα 3 δρόμοι δεδομένων (προστέθηκε "Δημιουργία νέας
   γραμμής"), θέλει να τακτοποιούνται ομοιόμορφα δίπλα-δίπλα σε φαρδιά οθόνη χωρίς να αφήνουν
   ορφανό το 3ο σε δική του γραμμή. */
.docs-flow-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 18px; margin-top: 12px; }
.docs-flow-col {
  background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 16px 18px;
}
.docs-flow-col ol { margin: 8px 0 10px; padding-left: 18px; }
.docs-flow-col li { font-size: 13px; line-height: 1.6; color: var(--ink-soft); margin-bottom: 6px; }
@media (max-width: 900px) {
  .docs-layout { grid-template-columns: 1fr; }
  .docs-nav { position: static; flex-direction: row; flex-wrap: wrap; }
  .docs-flow-cols { grid-template-columns: 1fr; }
}

/* Το βασικό "tbody td { max-width:220px; white-space:nowrap; ellipsis }" (styles.css ~198)
   είναι σωστό για συμπαγή data grids αλλού στο αρχείο, αλλά εδώ το περιεχόμενο είναι
   επεξηγηματικό κείμενο (πρόταση/παράγραφος ανά κελί) — ζητήθηκε ρητά να μην κόβεται. */
.docs-table { font-size: 12.5px; table-layout: fixed; }
.docs-table td, .docs-table th {
  vertical-align: top; max-width: none; white-space: normal; overflow: visible;
  text-overflow: clip; word-break: break-word; line-height: 1.5;
}
.docs-table td.mono { font-family: var(--mono); font-size: 11.5px; }
.docs-table td.muted { color: var(--muted); }
/* Ξεχωριστό role pill (όχι το ίδιο .pill.role του dark topbar — εδώ ο πίνακας είναι πάνω σε
   ανοιχτόχρωμο .tablewrap background, το topbar version (λευκό-πάνω-σε-σκούρο) θα ήταν αόρατο). */
.docs-table .pill.role { background: var(--teal-bg); color: var(--teal); }

.docs-warn {
  background: var(--warn-bg); border: 1px solid var(--danger); border-radius: 8px; padding: 10px 14px;
  font-size: 13px; color: var(--danger); margin-bottom: 16px;
}

/* ---------- import errors panel ---------- */
/* Πάντα-ορατό όταν υπάρχουν σφάλματα validate (βλ. ImportPage errorRows) — ζητήθηκε ρητά μετά
   από feedback ότι το filter pill "με σφάλμα" ήταν δύσκολο να εντοπιστεί· εδώ δεν χρειάζεται
   κανένα κλικ, το panel εμφανίζεται μόνο του πάνω από το γενικό results table. */
.import-errors {
  background: var(--danger-bg); border: 1px solid var(--danger); border-radius: 8px;
  padding: 10px 14px; margin-top: 14px; font-size: 13px; color: var(--danger);
}
.import-errors table { font-size: 12.5px; }
.import-errors th, .import-errors td { color: var(--ink); }
.docs-runbook { counter-reset: docs-step; }
.docs-runbook > li {
  font-size: 13.5px; line-height: 1.65; color: var(--ink-soft); margin-bottom: 14px; padding-left: 4px;
}
.docs-runbook > li b:first-child { color: var(--ink); }

/* Reference breakdown drawer (Χρήστες → Διαγραφή) — απλή λίστα γραμμών μέσα σε ελαφρύ
   πλαίσιο, ίδιο "μικρό, ξεχωριστό card" ύφος με τα υπόλοιπα .docs-* elements. */
.docs-refbox {
  max-height: 200px; overflow-y: auto; background: var(--bg); border: 1px solid var(--line);
  border-radius: 8px; padding: 6px 10px;
}
.docs-refrow { font-size: 12.5px; color: var(--ink-soft); padding: 3px 0; border-bottom: 1px solid var(--line-soft); }
.docs-refrow:last-child { border-bottom: none; }
.docs-refhint { font-size: 11.5px; color: var(--muted); line-height: 1.5; display: block; margin-top: 4px; }
