@import url('./fonts/fonts.css');

/* ==========================================================================
   365holoavatar — dizajn sistem
   Ovaj fajl je izvor istine. Styleguide (styleguide.html) samo prikazuje
   ono sto je ovde definisano — ako se razidju, greska je u styleguide-u.
   ========================================================================== */

:root {
  /* --- Boje ---------------------------------------------------------------
     Podloga nije crna nego duboko mornarska. Cista crna na OLED-u i na
     holo panelu izgleda kao rupa; mornarska daje dubinu i drzi glow zivim. */
  --bg:          #03070F;   /* stranica */
  --bg-panel:    #070D19;   /* panel */
  --bg-well:     #0A1223;   /* udubljenje u panelu (polja, liste) */
  --bg-raised:   #0E1729;   /* dugme, hover */

  --line:        #12233A;   /* hairline, ivica panela */
  --line-strong: #1B3A5C;   /* ivica u fokusu, aktivna kartica */

  /* Plava je radna boja interfejsa. Cijan je rezervisan za hologram i
     zive vrednosti — ako se cijan koristi svuda, prestaje da znaci bilo sta. */
  --blue:        #2E7BE0;
  --blue-dim:    #1B4E93;
  --cyan:        #22D3EE;
  --cyan-glow:   #00E5FF;

  --ok:          #3DE8A0;
  --warn:        #FFB454;
  --danger:      #FF6B6B;

  --text:        #D6E4F5;
  --text-mid:    #8AA3C0;
  --text-dim:    #52708F;

  /* --- Tipografija --------------------------------------------------------
     Rajdhani nosi HUD karakter: uzak, tehnicki, citljiv i na 3 m sa tube.
     Inter je za sve sto se stvarno cita. JetBrains Mono za brojeve — cifre
     su iste sirine pa vrednost ne poskakuje dok se menja. */
  --font-display: 'Rajdhani', 'Segoe UI Semibold', system-ui, sans-serif;
  --font-ui:      'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-data:    'JetBrains Mono', ui-monospace, 'Cascadia Mono', monospace;

  --step--1: 12px;
  --step-0:  14px;
  --step-1:  16px;
  --step-2:  20px;
  --step-3:  26px;
  --step-4:  34px;

  /* --- Prostor i oblik ---------------------------------------------------- */
  --gap-1: 6px;  --gap-2: 10px; --gap-3: 16px;
  --gap-4: 22px; --gap-5: 32px; --gap-6: 48px;

  --r-sm: 6px; --r-md: 10px; --r-lg: 14px;

  /* Dodir. Admin se koristi na tabletu, cesto stojeci pored tube. */
  --touch: 46px;

  --glow-cyan: 0 0 18px rgba(0, 229, 255, .35);
  --glow-blue: 0 0 16px rgba(46, 123, 224, .35);
  --shadow:    0 8px 28px rgba(0, 0, 0, .5);

  --ease: cubic-bezier(.2, .7, .3, 1);

  /* --- Boje serija u grafikonima -----------------------------------------
     Fiksan redosled, nikad se ne vrti u krug i nikad ne prati rang serije.
     Provereno validatorom na podlozi #070D19: najgori susedni par ΔE 18.7
     (normalan vid) i 15.2 (protanopija), sve tri unutar svetlosnog pojasa.
     Statusne boje (ok/warn/danger) se NIKAD ne koriste kao serija. */
  --s1: #0F9E8A;   /* tirkiz */
  --s2: #2E7BE0;   /* plava  */
  --s3: #C43F86;   /* magenta */
}

/* --- Osnova --------------------------------------------------------------- */

*, *::before, *::after { box-sizing: border-box; }

body.hud {
  margin: 0;
  min-height: 100vh;
  background: var(--bg);
  color: var(--text);
  font: 400 var(--step-0)/1.55 var(--font-ui);
  -webkit-tap-highlight-color: transparent;
}

/* Mreza u pozadini — jedva vidljiva. Daje osecaj instrumenta, ne tapeta.
   Ako se primeti na prvi pogled, prejaka je. */
body.hud::before {
  content: '';
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
  background:
    linear-gradient(rgba(46,123,224,.045) 1px, transparent 1px) 0 0 / 100% 44px,
    linear-gradient(90deg, rgba(46,123,224,.045) 1px, transparent 1px) 0 0 / 44px 100%,
    radial-gradient(ellipse at 50% 0%, rgba(34,211,238,.07), transparent 60%);
}
body.hud > * { position: relative; z-index: 1; }

h1, h2, h3, .display {
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: .06em;
  margin: 0;
  line-height: 1.15;
}

/* Oznaka sekcije. Uvek verzal, uvek razmaknuto, uvek prigusena —
   to je "sitna stampa" instrumenta, ne naslov. */
.eyebrow {
  font-family: var(--font-display);
  font-size: var(--step--1);
  font-weight: 600;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--text-dim);
}

.num { font-family: var(--font-data); font-variant-numeric: tabular-nums; }

a { color: var(--cyan); }

/* --- Panel ---------------------------------------------------------------- */

.panel {
  background:
    radial-gradient(120% 80% at 50% 0%, rgba(46,123,224,.10), transparent 60%),
    linear-gradient(180deg, #0A1526, #050A14);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-lg);
  box-shadow: inset 0 1px 0 rgba(140,200,255,.07), var(--shadow);
}

.panel-head {
  display: flex; align-items: center; gap: var(--gap-2);
  padding: 14px var(--gap-3);
  border-bottom: 1px solid var(--line-strong);
  background: linear-gradient(180deg, rgba(34,211,238,.07), transparent);
}
.panel-head h2, .panel-head .eyebrow { flex: 1; }
.panel-head h2 {
  font-size: var(--step-1); letter-spacing: .14em; text-transform: uppercase;
  font-weight: 600; color: var(--text);
}
.panel-body { padding: var(--gap-3); }

/* Uglovne zagrade. Jedini cisto dekorativni element u sistemu i zato ide
   samo na panele koji nose zivo stanje — nikad na sve odjednom. */
.panel.bracket { position: relative; }
.panel.bracket::before, .panel.bracket::after {
  content: ''; position: absolute; width: 14px; height: 14px;
  border: 1px solid var(--cyan); opacity: .5;
}
.panel.bracket::before { top: -1px; left: -1px; border-right: 0; border-bottom: 0;
                         border-radius: var(--r-lg) 0 0 0; }
.panel.bracket::after  { bottom: -1px; right: -1px; border-left: 0; border-top: 0;
                         border-radius: 0 0 var(--r-lg) 0; }

/* --- Stanje --------------------------------------------------------------- */

.chip {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 4px 10px; border-radius: 100px;
  border: 1px solid var(--line-strong);
  background: rgba(46,123,224,.08);
  font-family: var(--font-display);
  font-size: var(--step--1); font-weight: 600;
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--text-mid);
}
.chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--text-dim); }

.chip.is-ok     { color: var(--ok);     border-color: rgba(61,232,160,.35); }
.chip.is-warn   { color: var(--warn);   border-color: rgba(255,180,84,.35); }
.chip.is-danger { color: var(--danger); border-color: rgba(255,107,107,.35); }
.chip.is-ok     .dot { background: var(--ok);     box-shadow: 0 0 8px var(--ok); }
.chip.is-warn   .dot { background: var(--warn);   box-shadow: 0 0 8px var(--warn); }
.chip.is-danger .dot { background: var(--danger); box-shadow: 0 0 8px var(--danger); }

/* Puls samo na zivom stanju. Sve sto pulsira bez razloga postaje sum. */
.chip.is-live .dot { animation: pulse 2.4s var(--ease) infinite; }
@keyframes pulse { 0%,100% { opacity: 1 } 50% { opacity: .35 } }

/* --- Podaci --------------------------------------------------------------- */

.stat { display: grid; gap: 2px; }
.stat .k { font-size: var(--step--1); letter-spacing: .1em;
           text-transform: uppercase; color: var(--text-dim); }
.stat .v { font-family: var(--font-data); font-size: var(--step-2);
           font-weight: 600; color: var(--text); }
.stat .v.is-ok { color: var(--ok); }

/* Traka popunjenosti. Broj je desno i uvek monospace da ne skace. */
.meter { display: grid; grid-template-columns: 1fr auto; gap: 4px var(--gap-2);
         align-items: center; margin: var(--gap-3) 0; }
.meter .k { font-size: var(--step-0); color: var(--text-mid); }
.meter .v { font-family: var(--font-data); font-size: var(--step-0); color: var(--cyan); }
.meter .bar { grid-column: 1 / -1; height: 3px; border-radius: 2px;
              background: var(--bg-well); overflow: hidden; }
.meter .bar > i { display: block; height: 100%;
                  background: linear-gradient(90deg, var(--blue), var(--cyan));
                  box-shadow: var(--glow-cyan); }

/* --- Kontrole ------------------------------------------------------------- */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: var(--touch); padding: 0 18px;
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
  background: var(--bg-raised); color: var(--text);
  font-family: var(--font-display); font-size: var(--step-1); font-weight: 600;
  letter-spacing: .08em; text-transform: uppercase;
  cursor: pointer; transition: background .15s var(--ease), border-color .15s var(--ease);
}
.btn:hover  { background: #142136; border-color: var(--blue-dim); }
.btn:active { transform: translateY(1px); }
.btn.is-primary { background: var(--blue); border-color: #3E8BF0; color: #fff;
                  box-shadow: var(--glow-blue); }
.btn.is-primary:hover { background: #3A87EC; }
.btn.is-danger  { background: rgba(255,107,107,.1); border-color: rgba(255,107,107,.4);
                  color: var(--danger); }
.btn.is-ghost   { background: transparent; }

/* Mreza brzih radnji: ikonica iznad, kratka rec ispod. */
.btn-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--gap-2); }
.btn-grid .btn { flex-direction: column; gap: 6px; min-height: 76px; padding: 12px 6px;
                 font-size: var(--step--1); letter-spacing: .1em; }
.btn-grid .btn svg { width: 22px; height: 22px; stroke: var(--cyan); fill: none;
                     stroke-width: 1.6; }

:where(a, button, input, select, [tabindex]):focus-visible {
  outline: 2px solid var(--cyan); outline-offset: 2px;
}

/* --- Klizac --------------------------------------------------------------- */

.field { margin: var(--gap-4) 0; }
.field-head { display: flex; align-items: baseline; gap: var(--gap-2); margin-bottom: 10px; }
.field-head .k    { font-weight: 500; }
.field-head .hint { font-size: var(--step--1); color: var(--text-dim); }
.field-head .v    { margin-left: auto; font-family: var(--font-data);
                    font-weight: 600; color: var(--cyan); }

input[type=range] {
  -webkit-appearance: none; appearance: none;
  width: 100%; height: 28px; margin: 0; background: transparent; cursor: pointer;
}
input[type=range]::-webkit-slider-runnable-track {
  height: 3px; border-radius: 2px;
  background: linear-gradient(90deg, var(--blue) var(--fill, 50%),
                                     var(--bg-well) var(--fill, 50%));
}
input[type=range]::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 20px; height: 20px; margin-top: -8.5px; border-radius: 50%;
  background: var(--cyan); box-shadow: var(--glow-cyan);
  border: 3px solid var(--bg);
}
input[type=range]::-moz-range-track { height: 3px; border-radius: 2px; background: var(--bg-well); }
input[type=range]::-moz-range-thumb {
  width: 20px; height: 20px; border-radius: 50%; border: 3px solid var(--bg);
  background: var(--cyan); box-shadow: var(--glow-cyan);
}

/* --- Izbor jedne opcije --------------------------------------------------- */

.option {
  display: flex; gap: var(--gap-3); align-items: flex-start;
  padding: 14px var(--gap-3); margin-bottom: var(--gap-2);
  border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--bg-well); cursor: pointer;
  transition: border-color .15s var(--ease), background .15s var(--ease);
}
.option:has(input:checked) { border-color: var(--blue); background: rgba(46,123,224,.1); }
.option input { width: 20px; height: 20px; margin: 2px 0 0; accent-color: var(--cyan); flex: none; }
.option .t { font-weight: 600; }
.option .d { color: var(--text-dim); font-size: var(--step-0); margin-top: 2px; }

/* --- Lista i dnevnik ------------------------------------------------------ */

.rows { display: grid; gap: var(--gap-2); }
.row {
  display: flex; align-items: center; gap: var(--gap-3);
  padding: 12px var(--gap-3);
  background: var(--bg-well); border: 1px solid var(--line); border-radius: var(--r-md);
  border-left: 2px solid var(--blue);
}
.row .t { font-weight: 600; }
.row .d { font-size: var(--step--1); letter-spacing: .08em;
          text-transform: uppercase; color: var(--text-dim); }
.row .right { margin-left: auto; }

.log { font-family: var(--font-data); font-size: var(--step--1); }
.log div { display: flex; gap: var(--gap-3); padding: 9px 0;
           border-bottom: 1px solid var(--line); color: var(--text-mid); }
.log div:last-child { border-bottom: 0; }
.log time { color: var(--text-dim); }
.log .who { margin-left: auto; color: var(--text-dim); }

/* --- Raspored ------------------------------------------------------------- */

.wrap { max-width: 1560px; margin: 0 auto; padding: var(--gap-4); }
.grid { display: grid; gap: var(--gap-3); }
@media (min-width: 900px)  { .grid.c3 { grid-template-columns: 320px 1fr 380px; } }
@media (min-width: 700px)  { .grid.c2 { grid-template-columns: 1fr 1fr; } }

/* --- Gornja traka --------------------------------------------------------- */

.topbar {
  display: flex; align-items: center; gap: var(--gap-4);
  padding: 10px var(--gap-4);
  background: linear-gradient(180deg, #081222, #04090F);
  border-bottom: 1px solid var(--line);
  position: sticky; top: 0; z-index: 20;
}
.brand { display: flex; align-items: center; gap: 12px; }
.brand svg { width: 34px; height: 34px; }
.brand .n  { font-family: var(--font-display); font-weight: 700;
             font-size: var(--step-2); letter-spacing: .1em; line-height: 1; }
.brand .s  { font-family: var(--font-display); font-size: 10px; font-weight: 600;
             letter-spacing: .3em; color: var(--text-dim); }

.nav { display: flex; gap: 2px; margin-left: var(--gap-3); overflow-x: auto; }
.nav a {
  padding: 12px 16px; border-bottom: 2px solid transparent;
  font-family: var(--font-display); font-size: var(--step-0); font-weight: 600;
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--text-dim); text-decoration: none; white-space: nowrap;
}
.nav a:hover { color: var(--text-mid); }
.nav a[aria-current] { color: var(--cyan); border-bottom-color: var(--cyan);
                       background: linear-gradient(180deg, transparent, rgba(34,211,238,.09)); }
.topbar .right { margin-left: auto; display: flex; align-items: center; gap: var(--gap-3); }

/* --- Staklo tube: ziva slika unutar cilindra ------------------------------ */

/* Renderi su PNG na crnoj podlozi. `screen` gasi crno u providno, pa svetlo
   iz slike pada na panel umesto da stoji u crnom kvadratu. */
.glowimg { mix-blend-mode: screen; }

/* --- Scena: ziva slika unutar renderovane tube -----------------------------
   Render nosi metalne prstenove, postolje i volumetrijski sjaj; CSS to ne ume.
   Ziva slika sa tube sedi tacno u staklu, pa ono sto se vidi jeste tuba. */
.tube-stage {
  position: relative; width: 100%; max-width: 600px; margin: 0 auto;
  aspect-ratio: 1 / 1;
}
.tube-stage::after {                       /* halo iza cele tube */
  content: ''; position: absolute; inset: -8%; z-index: 0; pointer-events: none;
  background: radial-gradient(ellipse at 50% 62%, rgba(34,211,238,.16), transparent 62%);
}
.tube-stage > img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  z-index: 2; pointer-events: none;
}
/* Izmereno na renderu (1024 px): staklo ide 35.0–65.4 % po sirini,
   19.5–77.1 % po visini. Zato ovi brojevi nisu okrugli. */
.tube-stage .live {
  position: absolute; z-index: 3; overflow: hidden;
  left: 35.0%; top: 19.5%; width: 30.5%; height: 57.6%;
  background: #000;
  /* Prikaz je crn — `screen` gasi tu crninu, pa avatar lebdi u staklu
     umesto da sedi u svetlom pravougaoniku. Blend spere kontrast, pa se vraca. */
  mix-blend-mode: screen;
  filter: contrast(1.12) saturate(1.08);
}
.tube-stage .live > iframe {
  width: 1080px; height: 1920px; border: 0; display: block; background: #000;
  transform-origin: 0 0;
}

/* --- Hvataljka: avatar se pomera i skalira direktno na tubi ----------------
   Broj u centimetrima nema smisla u tabeli ispod — smisao ima na staklu,
   pored glave koju meri. */
/* Isti prostor kao staklo — procenti u hvataljci moraju da znace isto
   sto i procenti na tubi, inace se povlaci jedno a pomera drugo. */
.grab {
  position: absolute; z-index: 4; cursor: grab;
  left: 35.0%; top: 19.5%; width: 30.5%; height: 57.6%;
  touch-action: none;
}
.grab.dragging { cursor: grabbing; }

.grab .frame {
  position: absolute; left: 0; width: 100%;
  border: 1px dashed rgba(34,211,238,.55);
  background: rgba(34,211,238,.05);
}
.grab .frame::after {                      /* ručica za veličinu, dole u sredini */
  content: ''; position: absolute; left: 50%; bottom: -7px; translate: -50% 0;
  width: 34px; height: 14px; border-radius: 7px;
  background: var(--cyan); box-shadow: var(--glow-cyan); cursor: ns-resize;
}
.grab .tag {
  position: absolute; left: calc(100% + 10px); white-space: nowrap;
  font: 600 12px var(--font-data); color: var(--cyan);
  text-shadow: 0 0 8px rgba(0,0,0,.9);
}
.grab .tag.head  { top: 2%; }
.grab .tag.eye   { color: var(--ok); }
.grab .eyeline {
  position: absolute; left: -6%; width: 112%; height: 0;
  border-top: 1px dashed rgba(61,232,160,.5);
}
.grab[hidden] { display: none; }

/* --- Bocne trake sa ikonicama --------------------------------------------- */
.rail { display: grid; gap: var(--gap-2); align-content: start; }
.rail .eyebrow { text-align: center; margin-bottom: 2px; }
.rail button {
  width: 46px; height: 46px; display: grid; place-items: center;
  border: 1px solid var(--line-strong); border-radius: var(--r-md);
  background: var(--bg-raised); cursor: pointer;
}
.rail button svg { width: 20px; height: 20px; stroke: var(--text-mid);
                   fill: none; stroke-width: 1.6; }
.rail button:hover svg { stroke: var(--text); }
.rail button[aria-pressed="true"] {
  border-color: var(--cyan); background: rgba(34,211,238,.12);
  box-shadow: var(--glow-cyan);
}
.rail button[aria-pressed="true"] svg { stroke: var(--cyan); }

/* --- Grafikon ------------------------------------------------------------- */

.chart { position: relative; }
.chart svg { display: block; width: 100%; height: 132px; overflow: visible; }
.chart .axis  { stroke: var(--line); }
.chart .gridline { stroke: var(--line); stroke-dasharray: 2 5; }
.chart .tick  { fill: var(--text-dim); font: 400 10px var(--font-data); }
.chart .serie { fill: none; stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
.chart .last  { r: 3.5; }
.legend { display: flex; gap: var(--gap-3); flex-wrap: wrap;
          margin-top: var(--gap-2); font-size: var(--step--1); color: var(--text-mid); }
.legend span { display: inline-flex; align-items: center; gap: 7px; }
.legend i { width: 10px; height: 2px; border-radius: 1px; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .001ms !important; transition-duration: .001ms !important; }
}
