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

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

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

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

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

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

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

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

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

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

.tabs { display: flex; gap: var(--sp-1); }
.tabs a {
  padding: 7px 13px;
  border-radius: var(--r-s);
  font-size: var(--fs-s);
  color: var(--muted);
  white-space: nowrap;
  transition: background var(--t) var(--ease), color var(--t) var(--ease);
}
.tabs a:hover { background: var(--hover); color: var(--ink); text-decoration: none; }
.tabs a.active { background: var(--accent-soft); color: var(--ink); font-weight: var(--fw-semi); }

.spacer { flex: 1; }

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

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

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

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

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

/* ---------------------------------------------------------------- σελίδα */
main {
  padding: var(--sp-7) var(--sp-8) var(--sp-8);
  max-width: var(--page-max);
  margin-inline: auto;
}

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

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

/* ---------------------------------------------------------------- κάρτες και διάταξη */
.card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r);
  padding: var(--sp-6);
  margin-block-end: var(--sp-5);
  box-shadow: var(--shadow);
}
a.card { display: block; color: inherit; transition: border-color var(--t) var(--ease); }
a.card:hover { border-color: var(--accent); text-decoration: none; }
/* Το κρίσιμο ΔΕΝ παίρνει αριστερή χρωματιστή μπάρα (κλισέ): περίγραμμα + απαλό glow (§1). */
.card.crit { border-color: var(--crit-line); box-shadow: 0 0 0 3px var(--crit-glow), var(--shadow-strong); }

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

/* ---------------------------------------------------------------- chips, κουκκίδες, σοβαρότητα */
.pill {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-xs);
  font-weight: var(--fw-med);
  padding: 3px var(--sp-4);
  border-radius: var(--r-pill);
  background: var(--neutral-soft);
  color: var(--muted);
  white-space: nowrap;
}
.pill.accent { background: var(--accent-soft); color: var(--accent); }
.pill.on { background: var(--ok-soft); color: var(--ok); }
.pill.off { background: var(--crit-soft); color: var(--crit); }
.pill.warn { background: var(--warn); color: var(--on-warn); }      /* μέτρημα ειδοποιήσεων: συμπαγές */
.pill.crit { background: var(--crit); color: var(--on-crit); }

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

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

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

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

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

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

/* ---------------------------------------------------------------- καταστάσεις (§6) */
#toast {
  position: fixed;
  inset-inline-start: 50%;
  transform: translateX(-50%);
  inset-block-end: calc(var(--sp-7) + env(safe-area-inset-bottom));
  background: var(--card2);
  color: var(--ink);
  border: 1px solid var(--line);
  box-shadow: var(--shadow-strong);
  padding: var(--sp-4) var(--sp-6);
  border-radius: var(--r);
  max-width: 90vw;
  z-index: 40;
}
#toast.bad { border-color: var(--crit-line); color: var(--crit); }

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

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

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

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

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

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

/* ---------------------------------------------------------------- Στόλος: κάρτα οχήματος */
.cards { grid-template-columns: repeat(auto-fill, minmax(18.5rem, 1fr)); }
.vcard { display: flex; flex-direction: column; gap: var(--sp-5); padding: var(--sp-6) var(--sp-6) 13px; margin: 0; }
.vcard-top { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
.vcard-name { display: flex; align-items: center; gap: var(--sp-3); font-size: 15.5px; font-weight: var(--fw-semi); color: var(--ink); }
.vcard-body { display: flex; align-items: center; gap: var(--sp-5); }
.vcard-side { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.vcard-extra { font-size: 12.5px; color: var(--muted); }
.vcard-extra.crit { color: var(--crit); }
.vcard-extra.warn { color: var(--warn); }
/* Παγωμένη τιμή: γκριζάρει ΚΑΙ λέει πόσο παλιά είναι (§2). Ποτέ κρυμμένη — μια τιμή που εξαφανίζεται
   χωρίς εξήγηση είναι χειρότερη από μια τιμή που παραδέχεται την ηλικία της. */
.vcard-extra.stale { opacity: .55; text-decoration: line-through solid; text-decoration-thickness: 1px; }
.vcard-extra.stale .age { text-decoration: none; display: inline-block; }
.ring.stale { opacity: .45; }
.vcard-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); font-size: var(--fs-xs); color: var(--muted); }
/* Τιμή που μόλις ενημερώθηκε: 300ms λάμψη. Ό,τι είναι ζωντανό αναπνέει (§1) — τίποτα άλλο δεν κουνιέται. */
.vcard.flash { animation: flash var(--flash) var(--ease); }
@keyframes flash { from { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); } }

/* Δαχτυλίδι SoC και γραμμούλα: χρώμα ΜΟΝΟ από κλάση, ποτέ από attribute (θέμα + αχρωματοψία). */
.ring, .spark { flex: none; }
.ring-track { fill: none; stroke: var(--line); }
.ring-value { fill: none; stroke: var(--accent); }
.ring-value.crit { stroke: var(--crit); }
.ring-text { fill: var(--ink); }
.ring-empty {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 2px dashed var(--line);
  border-radius: var(--r-pill);
  color: var(--muted);
  font-size: 11px;
}
.spark polyline { stroke: var(--accent); }
.spark-end { fill: var(--accent); }
.spark.crit polyline { stroke: var(--crit); }
.spark.crit .spark-end { fill: var(--crit); }

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

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

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

.inc-detail { display: flex; flex-direction: column; gap: var(--sp-5); }
.inc-detail .card { margin: 0; }
.inc-head { display: flex; flex-direction: column; gap: var(--sp-3); }
.inc-h1 { font-size: var(--fs-xl); margin: 0; }
.inc-body { margin: 0; color: var(--muted); }
.inc-label { font-size: var(--fs-xs); color: var(--muted); letter-spacing: .04em; margin-block-end: var(--sp-3); }
.inc-measure { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-6); margin-block-start: var(--sp-5); flex-wrap: wrap; }
.inc-value { font-size: var(--fs-3xl); font-weight: 650; line-height: var(--lh-num); }
.inc-unit { font-size: var(--fs-l); font-weight: var(--fw-med); color: var(--muted); }
.inc-chart { flex: 1; min-width: 12rem; }
.chart { width: 100%; height: 90px; display: block; }
.chart polyline { stroke: var(--accent); vector-effect: non-scaling-stroke; }
.chart.crit polyline { stroke: var(--crit); }
.chart.crit .spark-end { fill: var(--crit); }
.chart-threshold { stroke: var(--muted); vector-effect: non-scaling-stroke; }

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

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

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

/* ---------------------------------------------------------------- Όχημα (Π4): σκίτσο, hero, πλακίδια */
.veh { display: flex; flex-direction: column; gap: var(--sp-5); }
.veh .card { margin: 0; }
.veh-head .row { gap: var(--sp-4); }
.veh-h1 { font-size: var(--fs-2xl); margin: 0; }
.veh-cols { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: var(--sp-5); align-items: start; }
.veh-left, .veh-right { display: flex; flex-direction: column; gap: var(--sp-5); min-width: 0; }
.veh-left { position: sticky; inset-block-start: 84px; }   /* το όχημα μένει στο μάτι όσο διαβάζεις δεξιά */
.veh-h2 { margin: 0; }
.veh-sketch { padding: var(--sp-4) var(--sp-5); }
/* Το σκίτσο δεν μεγαλώνει άλλο: πάνω από ~640px γίνεται αφίσα, όχι πληροφορία. */
.sketch { width: 100%; max-width: 640px; height: auto; display: block; margin-inline: auto; }

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

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

.veh-hero { display: flex; align-items: center; gap: var(--sp-7); flex-wrap: wrap; }
.veh-stats { display: flex; gap: var(--sp-7); flex-wrap: wrap; }
.veh-stat-v { font-size: var(--fs-2xl); font-weight: 650; line-height: var(--lh-num); }

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

/* Τέσσερις τροχοί σε δύο σειρές — η διάταξη ΕΙΝΑΙ η πληροφορία: πάνω το εμπρός, κάτω το πίσω, αριστερά
   αριστερά. Σε κινητό μένουν 2×2 (δεν γίνεται μία στήλη): αλλιώς χάνεται η αντιστοιχία με το όχημα. */
.wheels { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-4); }
.wheel {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  padding: var(--sp-4);
  background: var(--card2);
  border: 1px solid var(--line);
  border-radius: var(--r);
  font: inherit;
  color: inherit;
  text-align: start;
  cursor: pointer;
}
.wheel:hover { filter: none; border-color: var(--accent); }
.wheel.open { border-color: var(--accent); }
.wheel.crit { border-color: var(--crit); }
.wheel-val { font-size: var(--fs-l); font-weight: 650; line-height: var(--lh-num); }
.wheel.crit .wheel-val { color: var(--crit); }
.wheel-val.stale { opacity: .5; }
.bar { height: 6px; border-radius: var(--r-pill); background: var(--bg2); overflow: hidden; }
.bar span { display: block; height: 100%; background: var(--accent); }
.veh-history .chart { height: 120px; }

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

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

/* ---------------------------------------------------------------- Ρυθμίσεις (Π5) */
.set { display: grid; grid-template-columns: 13rem minmax(0, 1fr); gap: var(--sp-6); align-items: start; }
.set-nav { display: flex; flex-direction: column; gap: var(--sp-1); position: sticky; inset-block-start: 84px; }
.set-nav-item {
  font: inherit;
  font-size: var(--fs-s);
  text-align: start;
  padding: var(--sp-3) var(--sp-4);
  border: none;
  border-radius: var(--r-s);
  background: none;
  color: var(--muted);
  cursor: pointer;
}
.set-nav-item:hover { background: var(--hover); color: var(--ink); filter: none; }
.set-nav-item.active { background: var(--accent-soft); color: var(--ink); font-weight: var(--fw-semi); }
.set-h2 { margin: 0; font-size: var(--fs-l); }
.set-body .card { margin: 0; }

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

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

/* ---------------------------------------------------------------- κινητό: η μισή χρήση είναι στην αυλή */
@media (max-width: 719px) {
  #top { gap: var(--sp-4); padding: var(--sp-4) var(--sp-5); }
  /* Το σκίτσο συρρικνώνεται με το πλάτος: τα γράμματά του ΜΕΓΑΛΩΝΟΥΝ μέσα στο viewBox για να μένουν
     αναγνώσιμα στο κινητό (η μισή χρήση είναι στην αυλή, με τον ήλιο πάνω στην οθόνη). */
  .sk-value { font-size: 30px; }
  .sk-cap { font-size: 22px; }
  #top .tabs { display: none; }
  #bottom { display: flex; }
  main { padding: var(--sp-5) var(--sp-5) calc(var(--bottombar-h) + var(--sp-7)); }
  h1 { font-size: var(--fs-xl); margin-block-end: var(--sp-5); }
  /* Στην αυλή, με γάντια και ήλιο: μεγαλύτερα σημεία αφής. */
  button, .btn { padding: var(--sp-4) var(--sp-6); font-size: var(--fs-m); }
  .card { padding: var(--sp-5); }
  /* Δύο στήλες, όχι μία: με τέσσερις κάρτες σε στήλη το πρώτο ΟΧΗΜΑ πέφτει κάτω από την οθόνη — και το
     «είναι καλά ο στόλος μου;» παύει να απαντιέται χωρίς scroll (§2). */
  .band { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-4); }
  .stat { padding: var(--sp-4); }
  .set { grid-template-columns: 1fr; }
  .set-nav { position: static; flex-direction: row; flex-wrap: wrap; }
  .stat-value { font-size: 26px; }
  .cards { grid-template-columns: 1fr; }
}

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


/* ΣΥΝΟΜΙΛΙΑ (01/09) — δύο πλευρές, οπτικά ξεχωριστές. Λογικές ιδιότητες παντού (margin-inline-*), ώστε
   να γυρίσει μόνη της όταν έρθει γλώσσα RTL (§B6: he/ar) — όχι left/right που θα έπρεπε να ξαναγραφτούν. */
.conv { display: flex; flex-direction: column; gap: var(--sp-4); }
.conv-msg {
  max-width: 42rem;
  padding: var(--sp-4);
  border: 1px solid var(--line);
  border-radius: var(--r);
  background: var(--card2);
}
.conv-msg.out { margin-inline-end: auto; border-color: var(--accent); }
.conv-msg.in { margin-inline-start: auto; background: var(--card); }
.conv-meta { display: flex; gap: var(--sp-3); align-items: baseline; }
.conv-ch { font-weight: var(--fw-med); }
.conv-body { margin-block-start: var(--sp-2); white-space: pre-wrap; }

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

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

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

/* Βιβλιοθήκη εγχειριδίων: γραμμή = ένα έγγραφο + η διαγραφή του. Η διαγραφή δεξιά και μικρή — υπάρχει,
   αλλά δεν είναι το πρώτο πράγμα που πατάς. */
.man-row { display: flex; align-items: center; gap: var(--sp-4); }
.man-main { flex: 1; min-width: 0; }
.add-vehicle { margin-block-end: var(--sp-6); }

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

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