/* ============================================================
   so.css — Sistemi Operativi (processi + memoria virtuale)
   Layout compatto a due colonne. Primitive in lab.css.
   ============================================================ */

/* ============================================================
   Vista rilocazione: indirizzo logico → fisico
   ============================================================ */
.reloc-h2 { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.2rem, 2.6vw, 1.55rem); line-height: 1.15; margin-bottom: 0.5rem; }
.reloc-h2 .c-log { color: var(--accent); }
.reloc-h2 .c-phys { color: #3fae6b; }
.reloc-intro { color: var(--ink-soft); font-size: 0.92rem; line-height: 1.55; margin-bottom: 1.2rem; }
.reloc-intro b { color: var(--ink); font-weight: 600; }
.reloc-hint { min-height: 1.3rem; font-size: 0.85rem; line-height: 1.5; margin: 0.75rem 0 0; font-family: var(--font-mono); }
.reloc-hint.ok { color: var(--ink); }
.reloc-hint.err { color: #e0533d; }
.reloc-hint b { color: var(--accent); }
.reloc-hint .rh-dec { color: var(--ink-faint); font-size: 0.78rem; }

/* Scatola MMU con la somma */
.mmu-box { margin-top: 1.2rem; border: 1px solid var(--line); border-radius: 12px; background: var(--bg-sunk); padding: 0.6rem 1.1rem 1rem; display: grid; gap: 0.45rem; }
.mmu-box.err { border-color: color-mix(in srgb, #e0533d 55%, var(--line)); }
.mmu-cap { font-family: var(--font-mono); font-size: 0.72rem; color: var(--ink-soft); padding-bottom: 0.5rem; margin-bottom: 0.15rem; border-bottom: 1px solid var(--line-soft); }
.mmu-row { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.mmu-tag { font-family: var(--font-mono); font-size: 0.72rem; color: var(--ink-soft); }
.mmu-tag.log { color: var(--accent); }
.mmu-tag.base { color: #c98a1b; }
.mmu-tag.phys { color: #3fae6b; }
.mmu-num { font-family: var(--font-mono); font-size: 1.15rem; font-weight: 600; color: var(--ink); }
.mmu-op { font-family: var(--font-mono); color: var(--ink-faint); line-height: 0.6; }
.mmu-line { height: 1px; background: var(--line); margin: 0.15rem 0; }
.mmu-row.total .mmu-num { font-size: 1.45rem; color: #3fae6b; }
.mmu-box.err .mmu-row.total .mmu-num { color: #e0533d; font-size: 1.05rem; }

/* Colonne logico ↔ fisico */
.reloc-viz .viz-cols { display: flex; align-items: stretch; gap: 0.7rem; }
.logical-col { width: 33%; min-width: 92px; }
.ram-col { flex: 1; }
.vcol-label { display: block; font-family: var(--font-mono); font-size: 0.72rem; color: var(--ink-soft); margin-bottom: 0.5rem; text-align: center; }
.vcol-label small { color: var(--ink-faint); }
.viz-arrow { align-self: center; font-family: var(--font-mono); font-size: 0.74rem; color: #c98a1b; text-align: center; white-space: nowrap; padding-top: 1.6rem; }

/* Colori dei programmi (regioni RAM + barra logica) */
.ram-region.so, .lbar-track.so { background: color-mix(in srgb, #8a8f98 22%, transparent); border: 1px solid color-mix(in srgb, #8a8f98 55%, var(--line)); }
.ram-region.a,  .lbar-track.a  { background: var(--accent-wash); border: 1px solid color-mix(in srgb, var(--accent) 55%, var(--line)); }
.ram-region.b,  .lbar-track.b  { background: color-mix(in srgb, #3fae6b 16%, transparent); border: 1px solid color-mix(in srgb, #3fae6b 55%, var(--line)); }
.ram-region.c,  .lbar-track.c  { background: color-mix(in srgb, #c98a1b 16%, transparent); border: 1px solid color-mix(in srgb, #c98a1b 55%, var(--line)); }

/* Barra RAM (fisico) */
.ram-track { position: relative; height: 430px; border: 1px solid var(--line); border-radius: 10px; background: var(--bg-sunk); overflow: hidden; }
.ram-region { position: absolute; left: 0; right: 0; border-radius: 5px; padding: 0.2rem 0.5rem; display: flex; flex-direction: column; justify-content: center; gap: 0.1rem; overflow: hidden; }
.ram-region.sel { box-shadow: inset 0 0 0 2px var(--accent); z-index: 2; }
.rr-name { font-size: 0.76rem; font-weight: 600; color: var(--ink); line-height: 1.15; }
.rr-range { font-family: var(--font-mono); font-size: 0.62rem; color: var(--ink-soft); }
.ram-marker { position: absolute; left: -2px; right: -2px; height: 0; border-top: 2px dashed #3fae6b; z-index: 3; }
.ram-marker .rm-lbl { position: absolute; right: 3px; top: -0.62rem; font-family: var(--font-mono); font-size: 0.62rem; background: #3fae6b; color: #fff; padding: 0.05rem 0.35rem; border-radius: 5px; }

/* Barra logica (programma) */
.lbar-track { position: relative; height: 430px; border-radius: 10px; }
.lbar-edge { position: absolute; left: 0; right: 0; text-align: center; font-family: var(--font-mono); font-size: 0.62rem; color: var(--ink-soft); }
.lbar-edge.top { top: 3px; }
.lbar-edge.bot { bottom: 3px; }
.lbar-marker { position: absolute; left: -2px; right: -2px; height: 0; border-top: 2px dashed var(--accent); }
.lbar-marker span { position: absolute; left: 50%; transform: translateX(-50%); top: -0.62rem; font-family: var(--font-mono); font-size: 0.62rem; background: var(--accent); color: var(--accent-ink); padding: 0.05rem 0.35rem; border-radius: 5px; white-space: nowrap; }

@media (max-width: 520px) {
  .ram-track, .lbar-track { height: 340px; }
  .rr-name { font-size: 0.66rem; }
}

.examples { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.example-chip {
  font-family: var(--font-mono); font-size: 0.74rem;
  padding: 0.3rem 0.65rem; border: 1px solid var(--line);
  border-radius: 100px; background: var(--bg); color: var(--ink); cursor: pointer;
  transition: border-color 0.2s var(--ease), color 0.2s var(--ease);
}
.example-chip:hover { border-color: var(--accent); color: var(--accent); }

.run-btn {
  display: inline-flex; align-items: center; gap: 0.4rem;
  font-family: var(--font-sans); font-size: 0.88rem; font-weight: 500;
  padding: 0.5rem 0.95rem; border: 1px solid var(--accent); border-radius: 100px;
  background: var(--accent); color: var(--accent-ink); cursor: pointer;
  transition: transform 0.15s var(--ease);
}
.run-btn:hover:not(:disabled) { transform: translateY(-1px); }
.code-status { font-family: var(--font-mono); font-size: 0.74rem; color: var(--ink-soft); }
.code-status.err { color: #e0533d; }
.code-status.ok { color: #3fae6b; }

/* colore stabile per processo */
.p0 { --pc: #2c45ff; } .p1 { --pc: #1f9e8a; } .p2 { --pc: #c98a1b; }
.p3 { --pc: #8a5cf0; } .p4 { --pc: #d6502e; } .p5 { --pc: #3fae6b; }
[data-theme="dark"] .p0 { --pc: #8a8bff; }

.state-label { display: block; font-family: var(--font-mono); font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-faint); margin-bottom: 0.55rem; }

/* ---------- Layout compatto ---------- */
.so-hero { padding-top: clamp(2rem, 5vw, 3.5rem); padding-bottom: 1.1rem; }
.so-mode { margin-top: 1.5rem; overflow-x: auto; padding-bottom: 2px; }
.so-mode .seg { min-width: max-content; }
.so-section { padding-top: 0; padding-bottom: clamp(2rem, 5vw, 3.5rem); }
.so-layout {
  display: grid;
  grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr);
  gap: 1rem; align-items: start;
}
.so-layout > * { min-width: 0; }
/* la memoria è più chiara in verticale: un blocco sotto l'altro */
#memMode .so-layout { grid-template-columns: minmax(0, 1fr); gap: 1.1rem; }
@media (max-width: 880px) {
  .so-layout { grid-template-columns: minmax(0, 1fr); }
  .exec-panel { order: -1; } /* su mobile la vista live sta sopra le impostazioni */
}
.panel { padding: clamp(1.1rem, 2.5vw, 1.5rem); }

.exec-bar {
  display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;
  margin-bottom: 1rem; padding-bottom: 0.85rem; border-bottom: 1px solid var(--line-soft);
}
.exec-bar .code-status { margin-left: auto; }
.clock { font-family: var(--font-mono); font-size: 0.82rem; color: var(--ink-soft); }
.exec-bar .clock { margin-left: auto; }
.clock b { color: var(--ink); font-size: 1rem; }

/* ============================================================
   PROCESSI
   ============================================================ */
.proc-controls { display: flex; flex-wrap: wrap; gap: 0.9rem 1.5rem; align-items: flex-start; margin-bottom: 1rem; }
.setup-panel .control-group { margin-bottom: 0.9rem; }

.proc-table-wrap { border-top: 1px solid var(--line-soft); padding-top: 0.9rem; }
.proc-table-head, .proc-row { display: grid; grid-template-columns: 1fr 4.5rem 4.5rem 2rem; gap: 0.45rem; align-items: center; }
.proc-table-head { font-family: var(--font-mono); font-size: 0.64rem; color: var(--ink-faint); text-transform: uppercase; letter-spacing: 0.03em; margin-bottom: 0.45rem; }
.proc-row { margin-bottom: 0.4rem; }
.proc-row .pname { display: flex; align-items: center; gap: 0.45rem; font-family: var(--font-mono); font-weight: 600; font-size: 0.9rem; }
.proc-row .pdot { width: 12px; height: 12px; border-radius: 3px; background: var(--pc, var(--accent)); flex-shrink: 0; }
.proc-row .field input { padding: 0.4rem 0.5rem; font-size: 0.86rem; }
.proc-row .rm { width: 1.9rem; height: 1.9rem; border: 1px solid var(--line); border-radius: 7px; background: var(--bg); color: var(--ink-soft); cursor: pointer; }
.proc-row .rm:hover { border-color: #e0533d; color: #e0533d; }

.cpu-stage { display: flex; gap: 1rem; align-items: stretch; flex-wrap: wrap; margin-bottom: 1.1rem; }
.cpu-core {
  flex: 0 0 auto; min-width: 110px;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.25rem;
  padding: 0.7rem 1rem; border: 2px solid var(--line); border-radius: 12px; background: var(--bg);
  transition: border-color 0.25s var(--ease), background-color 0.25s var(--ease);
}
.cpu-core.busy { border-color: var(--pc, var(--accent)); background: color-mix(in srgb, var(--pc, var(--accent)) 10%, var(--bg)); }
.cpu-label { font-family: var(--font-mono); font-size: 0.62rem; letter-spacing: 0.06em; color: var(--ink-faint); }
.cpu-proc { font-family: var(--font-display); font-size: 1.5rem; font-weight: 500; color: var(--pc, var(--ink)); }

.ready-queue-wrap { flex: 1; min-width: 0; }
.queue-label { display: block; font-family: var(--font-mono); font-size: 0.64rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-faint); margin-bottom: 0.4rem; }
.ready-queue { display: flex; gap: 0.35rem; flex-wrap: wrap; min-height: 2.1rem; align-content: flex-start; padding: 0.35rem; border: 1px dashed var(--line); border-radius: 9px; }
.queue-item { font-family: var(--font-mono); font-size: 0.8rem; font-weight: 600; color: var(--accent-ink); background: var(--pc, var(--accent)); padding: 0.3rem 0.6rem; border-radius: 6px; }
.queue-empty { font-family: var(--font-mono); font-size: 0.73rem; color: var(--ink-faint); align-self: center; }

.gantt-wrap { margin-bottom: 1.1rem; }
.gantt { display: flex; gap: 2px; overflow-x: auto; padding-bottom: 1rem; }
.gantt-cell {
  flex: 0 0 auto; width: 22px; height: 30px; border-radius: 4px;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-mono); font-size: 0.66rem; font-weight: 600; color: var(--accent-ink);
  background: var(--pc, var(--line)); position: relative;
}
.gantt-cell.idle { background: var(--bg-sunk); color: var(--ink-faint); border: 1px dashed var(--line); }
.gantt-cell .gt { position: absolute; bottom: -1rem; left: 0; font-size: 0.56rem; color: var(--ink-faint); font-weight: 400; }

.proc-states { display: grid; gap: 0.45rem; }
.pstate {
  display: grid; grid-template-columns: auto 1fr auto; gap: 0.55rem; align-items: center;
  padding: 0.5rem 0.65rem; border: 1px solid var(--line); border-radius: 9px; background: var(--bg);
}
.pstate .pdot { width: 11px; height: 11px; border-radius: 3px; background: var(--pc, var(--accent)); }
.pstate .pn { font-family: var(--font-mono); font-weight: 600; font-size: 0.84rem; }
.pstate .bar-track { height: 7px; border-radius: 4px; background: var(--bg-sunk); overflow: hidden; }
.pstate .bar-fill { height: 100%; background: var(--pc, var(--accent)); transition: width 0.3s var(--ease); }
.badge { font-family: var(--font-mono); font-size: 0.62rem; padding: 0.18rem 0.45rem; border-radius: 100px; border: 1px solid var(--line); white-space: nowrap; }
.badge.run { background: var(--pc, var(--accent)); color: var(--accent-ink); border-color: transparent; }
.badge.ready { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }
.badge.wait { color: #c98a1b; border-color: #c98a1b; }
.badge.new { color: var(--ink-soft); }
.badge.term { color: var(--ink-faint); text-decoration: line-through; }

.proc-metrics { margin-top: 1rem; padding-top: 0.85rem; border-top: 1px solid var(--line-soft); font-family: var(--font-mono); font-size: 0.76rem; color: var(--ink-soft); line-height: 1.6; }
.proc-metrics b { color: var(--ink); }
#procStatus { display: block; margin-top: 0.8rem; }

/* ============================================================
   MEMORIA
   ============================================================ */
.mem-note { font-family: var(--font-mono); font-size: 0.72rem; color: var(--ink-faint); margin: 0.2rem 0 0.9rem; line-height: 1.5; }
.mem-note b { color: var(--ink-soft); }

.addr-break { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: stretch; font-family: var(--font-mono); margin-bottom: 1rem; }
.addr-part { border: 1px solid var(--line); border-radius: 9px; padding: 0.5rem 0.7rem; text-align: center; min-width: 4.6rem; }
.addr-part.size { border-style: dashed; }
.addr-part.page { border-color: var(--accent); background: var(--accent-wash); }
.addr-part.offset { border-color: #c98a1b; background: rgba(201,138,27,0.08); }
.addr-part .ap-label { font-size: 0.58rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-faint); }
.addr-part .ap-val { font-size: 1.15rem; font-weight: 600; color: var(--ink); }
.addr-part .ap-sub { font-size: 0.58rem; color: var(--ink-faint); }
.addr-op { display: grid; place-items: center; font-size: 1rem; color: var(--ink-faint); }

.trans-steps { display: grid; gap: 0.35rem; font-family: var(--font-mono); font-size: 0.78rem; }
.trans-step { display: flex; gap: 0.5rem; align-items: baseline; color: var(--ink-soft); padding: 0.25rem 0; border-bottom: 1px solid var(--line-soft); line-height: 1.45; }
.trans-step .tn { color: var(--accent); flex-shrink: 0; }
.trans-step b { color: var(--ink); }
.trans-step.fault { color: #e0533d; }
.trans-step.fault .tn { color: #e0533d; }

.mem-result { margin-top: 1rem; padding: 0.85rem 1.1rem; border-radius: 10px; font-family: var(--font-mono); }
.mem-result:empty { display: none; }
.mem-result.ok { background: var(--accent-wash); border: 1px solid color-mix(in srgb, var(--accent) 45%, var(--line)); }
.mem-result.fault { background: rgba(224,83,61,0.08); border: 1px solid rgba(224,83,61,0.4); }
.mem-result .mr-big { font-family: var(--font-display); font-size: clamp(1.3rem, 4vw, 1.8rem); font-weight: 500; color: var(--ink); }
.mem-result .mr-lbl { font-size: 0.7rem; color: var(--ink-soft); }
.mem-result.fault .mr-big { color: #e0533d; }

.page-table { display: grid; gap: 0; border: 1px solid var(--line); border-radius: 9px; overflow: hidden; font-family: var(--font-mono); font-size: 0.78rem; }
.pt-head, .pt-row { display: grid; grid-template-columns: 1.3fr 1.3fr 1fr 0.9fr; }
.pt-head { background: var(--bg-elev); border-bottom: 1px solid var(--line); }
.pt-head span, .pt-row span { padding: 0.4rem 0.6rem; }
.pt-head span { font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--ink-faint); }
.pt-row { border-bottom: 1px solid var(--line-soft); }
.pt-row:last-child { border-bottom: 0; }
.pt-row.present { background: var(--accent-wash); }
.pt-row.hit { box-shadow: inset 3px 0 0 var(--accent); }
.pt-row .frame.none { color: var(--ink-faint); }
.bit { font-weight: 600; }
.bit.on { color: #3fae6b; }
.bit.off { color: #e0533d; }

.proc-state-mini { display: inline-flex; gap: 0.3rem; flex-wrap: wrap; margin-left: 0.5rem; }
.proc-state-mini .st { font-family: var(--font-mono); font-size: 0.6rem; padding: 0.18rem 0.45rem; border: 1px solid var(--line); border-radius: 100px; color: var(--ink-faint); text-transform: none; letter-spacing: 0; }
.proc-state-mini .st.active { border-color: var(--accent); color: var(--accent); background: var(--accent-wash); font-weight: 600; }
.proc-state-mini .st.wait.active { border-color: #c98a1b; color: #c98a1b; background: rgba(201,138,27,0.1); }

.ram-frames { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 0.45rem; }
@media (max-width: 560px) { .ram-frames { grid-template-columns: repeat(2, minmax(0,1fr)); } }
.frame-cell {
  border: 1px solid var(--line); border-radius: 9px; padding: 0.5rem 0.6rem; background: var(--bg);
  transition: border-color 0.3s var(--ease), background-color 0.3s var(--ease);
}
.frame-cell .fc-addr { font-family: var(--font-mono); font-size: 0.6rem; color: var(--ink-faint); }
.frame-cell .fc-page { font-family: var(--font-mono); font-size: 0.84rem; font-weight: 600; color: var(--ink); }
.frame-cell.empty .fc-page { color: var(--ink-faint); font-weight: 400; }
.frame-cell.filled { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
.frame-cell.changed { border-color: var(--accent); background: var(--accent-wash); }

/* ---------- Paginazione: riquadro «spezzettamento» logica → fisica ---------- */
.pg-map { display: flex; flex-direction: column; gap: 0.4rem; }
.pg-map-row { display: grid; grid-template-columns: 1fr auto 1.2fr; align-items: center; gap: 0.55rem; }
.pg-chip { font-family: var(--font-mono); font-size: 0.78rem; padding: 0.45rem 0.5rem; border-radius: 8px; border: 1px solid var(--line); text-align: center; background: var(--bg); }
.pg-chip small { color: var(--ink-faint); font-weight: 400; }
.pg-chip.log { color: var(--ink-soft); border-style: dashed; }
.pg-chip.phys.pf-so { background: color-mix(in srgb, #8a8f98 18%, transparent); border-color: color-mix(in srgb, #8a8f98 50%, var(--line)); }
.pg-chip.phys.pf-a  { background: var(--accent-wash); border-color: color-mix(in srgb, var(--accent) 50%, var(--line)); }
.pg-chip.phys.pf-b  { background: color-mix(in srgb, #3fae6b 16%, transparent); border-color: color-mix(in srgb, #3fae6b 50%, var(--line)); }
.pg-map-arrow { font-family: var(--font-mono); color: var(--accent); font-weight: 700; font-size: 0.85rem; }
.pg-map-row.hit .pg-chip { box-shadow: 0 0 0 2px var(--accent); }

/* ---------- Paginazione: tabella pagine (4 col.) + mappa RAM per processo ---------- */
#pgTable .pt-head, #pgTable .pt-row { grid-template-columns: 0.7fr 1.1fr 0.7fr 1.1fr; }
#pgTable .pt-head span, #pgTable .pt-row span { padding: 0.4rem 0.5rem; }
.pg-ram { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.45rem; }
@media (max-width: 560px) { .pg-ram { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.pg-frame {
  border: 1px solid var(--line); border-radius: 9px; padding: 0.5rem 0.55rem; background: var(--bg); min-height: 3rem;
  transition: box-shadow 0.2s var(--ease), transform 0.12s var(--ease);
}
.pg-frame .pf-addr { font-family: var(--font-mono); font-size: 0.6rem; color: var(--ink-faint); }
.pg-frame .pf-who { font-family: var(--font-mono); font-size: 0.8rem; font-weight: 600; color: var(--ink); margin-top: 0.15rem; }
.pg-frame.empty .pf-who { color: var(--ink-faint); font-weight: 400; }
.pg-frame.pf-so { background: color-mix(in srgb, #8a8f98 18%, transparent); border-color: color-mix(in srgb, #8a8f98 50%, var(--line)); }
.pg-frame.pf-a  { background: var(--accent-wash); border-color: color-mix(in srgb, var(--accent) 50%, var(--line)); }
.pg-frame.pf-b  { background: color-mix(in srgb, #3fae6b 16%, transparent); border-color: color-mix(in srgb, #3fae6b 50%, var(--line)); }
.pg-frame.hit { box-shadow: 0 0 0 2px var(--accent); transform: translateY(-2px); }

/* su schermi stretti i segmented control con etichette lunghe vanno a capo, niente overflow */
@media (max-width: 600px) {
  .so-mode .seg, #memSubSeg { flex-wrap: wrap; }
}

.swap-area { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.swap-page { font-family: var(--font-mono); font-size: 0.76rem; padding: 0.35rem 0.65rem; border: 1px solid var(--line); border-radius: 7px; background: var(--bg); color: var(--ink-soft); }
.swap-page.changed { border-color: #c98a1b; color: #c98a1b; background: rgba(201,138,27,0.08); }
.swap-empty { font-family: var(--font-mono); font-size: 0.74rem; color: var(--ink-faint); }

@media (max-width: 480px) {
  .proc-table-head, .proc-row { grid-template-columns: 1fr 3.5rem 3.5rem 1.8rem; gap: 0.35rem; }
}
