/* ================================================================
   Control Systems Toolbox — Shared Styles
   Author: Davide "the Prof." Bertolino
   ================================================================ */
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=DM+Sans:wght@400;500;600;700&display=swap');

/* ── CSS Variables ─────────────────────────────────────── */
.cst-app {
    --c-bg: #0f1117;
    --c-panel: #181b24;
    --c-border: #262a36;
    --c-text: #e2e4eb;
    --c-text2: #8b8fa3;
    --c-accent: #22d3ee;
    --c-accent2: #a78bfa;
    --c-accent3: #f472b6;
    --c-danger: #ef4444;
    --c-success: #34d399;
    --c-warning: #fbbf24;
    --radius: 10px;
    --font-body: 'DM Sans', sans-serif;
    --font-mono: 'JetBrains Mono', monospace;

    font-family: var(--font-body);
    color: var(--c-text);
    background: var(--c-bg);
    padding: 28px;
    border-radius: 16px;
    max-width: 1200px;
    margin: 20px auto;
    box-sizing: border-box;
}
.cst-app *, .cst-app *::before, .cst-app *::after {
    box-sizing: border-box;
}

/* ── Header ────────────────────────────────────────────── */
.cst-header {
    display: flex; align-items: center; gap: 14px;
    margin-bottom: 24px;
}
.cst-header-icon {
    width: 48px; height: 48px;
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(135deg, #22d3ee33, #a78bfa33);
    border-radius: 12px; color: var(--c-accent);
    flex-shrink: 0;
}
.cst-title {
    margin: 0; font-size: 22px; font-weight: 700;
    letter-spacing: -0.5px; color: #fff;
}
.cst-subtitle {
    margin: 2px 0 0; font-size: 13px; color: var(--c-text2);
}

/* ── Grid Layout ───────────────────────────────────────── */
.cst-grid {
    display: grid;
    grid-template-columns: 380px 1fr;
    gap: 20px; align-items: start;
}
@media (max-width: 860px) {
    .cst-grid { grid-template-columns: 1fr; }
}

/* ── Panels ────────────────────────────────────────────── */
.cst-panel {
    background: var(--c-panel);
    border: 1px solid var(--c-border);
    border-radius: var(--radius);
    padding: 20px;
}
.cst-panel-chart {
    min-height: 420px;
    display: flex; flex-direction: column;
}

/* ── Fieldsets ─────────────────────────────────────────── */
.cst-fieldset {
    border: 1px solid var(--c-border);
    border-radius: 8px;
    padding: 16px;
    margin: 0 0 16px;
}
.cst-fieldset legend {
    font-size: 12px; font-weight: 600; text-transform: uppercase;
    letter-spacing: 1px; color: var(--c-accent); padding: 0 6px;
}
.cst-hint {
    font-size: 12px; color: var(--c-text2); margin: 0 0 12px; line-height: 1.5;
}
.cst-hint code {
    background: #262a36; padding: 1px 5px; border-radius: 4px;
    font-family: var(--font-mono); font-size: 11px; color: var(--c-accent);
}

/* ── Transfer Function Input ───────────────────────────── */
.cst-tf-row {
    display: flex; flex-direction: column; gap: 4px; align-items: center;
}
.cst-tf-block { width: 100%; }
.cst-tf-block label {
    display: block; font-size: 11px; color: var(--c-text2); margin-bottom: 4px;
}
.cst-tf-block input {
    width: 100%; padding: 8px 10px;
    background: var(--c-bg); border: 1px solid var(--c-border); border-radius: 6px;
    color: var(--c-text); font-family: var(--font-mono); font-size: 13px;
    text-align: center;
}
.cst-tf-block input:focus {
    outline: none; border-color: var(--c-accent);
    box-shadow: 0 0 0 2px rgba(34,211,238,0.15);
}
.cst-tf-divider {
    width: 80%; height: 2px; background: var(--c-accent); margin: 4px 0;
}
.cst-tf-preview {
    margin-top: 10px; padding: 8px; background: #0d0f15; border-radius: 6px;
    font-family: var(--font-mono); font-size: 12px;
    text-align: center; color: var(--c-accent2); min-height: 32px;
}

/* ── PID Params ────────────────────────────────────────── */
.cst-params-grid { display: flex; flex-direction: column; gap: 14px; }
.cst-param label {
    display: flex; align-items: center; gap: 6px;
    font-size: 14px; font-weight: 600; margin-bottom: 6px;
}
.cst-param-tag {
    font-size: 10px; font-weight: 400; color: var(--c-text2);
    background: var(--c-bg); padding: 1px 6px; border-radius: 4px;
}
.cst-param input[type="number"] {
    width: 100%; padding: 7px 10px;
    background: var(--c-bg); border: 1px solid var(--c-border); border-radius: 6px;
    color: var(--c-text); font-family: var(--font-mono); font-size: 13px;
}
.cst-param input[type="number"]:focus {
    outline: none; border-color: var(--c-accent);
}
.cst-slider {
    width: 100%; margin-top: 4px; accent-color: var(--c-accent);
    height: 4px; cursor: pointer;
}

/* ── Button Groups ─────────────────────────────────────── */
.cst-btn-group { display: flex; gap: 4px; }
.cst-btn-option {
    padding: 6px 12px; border: 1px solid var(--c-border); border-radius: 6px;
    background: var(--c-bg); color: var(--c-text2); font-size: 12px; font-weight: 500;
    cursor: pointer; transition: all .15s; font-family: var(--font-body);
}
.cst-btn-option:hover { border-color: var(--c-accent); color: var(--c-text); }
.cst-btn-option.active {
    background: rgba(34,211,238,0.12); border-color: var(--c-accent); color: var(--c-accent);
}

/* ── Input rows ────────────────────────────────────────── */
.cst-input-row {
    display: grid; grid-template-columns: 1fr auto auto; gap: 12px; align-items: end;
}
.cst-input-row label {
    display: block; font-size: 11px; color: var(--c-text2); margin-bottom: 4px;
}
.cst-input-row input[type="number"],
.cst-num-input {
    width: 80px; padding: 7px 8px;
    background: var(--c-bg); border: 1px solid var(--c-border); border-radius: 6px;
    color: var(--c-text); font-family: var(--font-mono); font-size: 13px;
}
.cst-num-input:focus,
.cst-input-row input[type="number"]:focus { outline: none; border-color: var(--c-accent); }

.cst-loop-row {
    margin-top: 12px; display: flex; align-items: center; gap: 10px;
}
.cst-loop-row > label { font-size: 11px; color: var(--c-text2); white-space: nowrap; }

/* ── Primary Action Button ─────────────────────────────── */
.cst-run-btn {
    display: flex; align-items: center; justify-content: center; gap: 8px;
    width: 100%; padding: 12px;
    background: linear-gradient(135deg, #22d3ee, #a78bfa);
    border: none; border-radius: 8px;
    color: #0f1117; font-size: 15px; font-weight: 700;
    cursor: pointer; transition: opacity .15s;
    font-family: var(--font-body);
}
.cst-run-btn:hover { opacity: 0.88; }

/* ── Charts ────────────────────────────────────────────── */
.cst-chart-container {
    flex: 1; min-height: 320px; position: relative;
}
.cst-chart-container canvas {
    width: 100% !important; height: 100% !important;
}
.cst-chart-dual {
    display: grid; grid-template-rows: 1fr 1fr; gap: 12px;
    flex: 1; min-height: 500px;
}
.cst-chart-dual .cst-chart-container { min-height: 220px; }

/* ── Metrics ───────────────────────────────────────────── */
.cst-metrics {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(130px,1fr));
    gap: 8px; margin-top: 14px;
}
.cst-metric {
    background: var(--c-bg); border-radius: 6px; padding: 10px;
    display: flex; flex-direction: column; gap: 2px;
}
.cst-metric-label {
    font-size: 10px; color: var(--c-text2); text-transform: uppercase; letter-spacing: 0.5px;
}
.cst-metric-value {
    font-family: var(--font-mono); font-size: 14px; font-weight: 600; color: var(--c-accent);
}

/* ── Action Buttons ────────────────────────────────────── */
.cst-chart-actions {
    display: flex; gap: 8px; margin-top: 12px;
}
.cst-save-btn {
    display: flex; align-items: center; gap: 6px;
    padding: 8px 14px; background: var(--c-bg); border: 1px solid var(--c-border);
    border-radius: 6px; color: var(--c-text2); font-size: 12px; cursor: pointer;
    transition: all .15s; font-family: var(--font-body);
}
.cst-save-btn:hover { border-color: var(--c-accent); color: var(--c-text); }

/* ── Warning Banner ────────────────────────────────────── */
.cst-warning {
    display: none; align-items: center; gap: 10px;
    padding: 12px 16px; margin-top: 12px;
    background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.3);
    border-radius: 8px; color: var(--c-danger);
    font-size: 13px; font-weight: 500;
    animation: cst-flash 0.6s ease;
}
.cst-warning.visible { display: flex; }
.cst-warning svg { flex-shrink: 0; }
@keyframes cst-flash {
    0%, 50% { background: rgba(239,68,68,0.25); }
    100% { background: rgba(239,68,68,0.1); }
}

/* ── Block Diagram ─────────────────────────────────────── */
.cst-block-diagram {
    margin-top: 20px; padding: 16px;
    background: var(--c-panel); border: 1px solid var(--c-border);
    border-radius: var(--radius);
}
.cst-block-label {
    font-size: 11px; color: var(--c-text2); margin-bottom: 10px;
    text-transform: uppercase; letter-spacing: 1px;
}
.cst-blocks {
    display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    justify-content: center; position: relative;
}
.cst-blk-signal {
    font-family: var(--font-mono); font-size: 14px; font-weight: 600;
    color: var(--c-accent);
}
.cst-blk-arrow { color: var(--c-text2); font-size: 18px; }
.cst-blk-sum {
    width: 32px; height: 32px; border-radius: 50%;
    border: 2px solid var(--c-accent);
    display: flex; align-items: center; justify-content: center;
    font-size: 16px; font-weight: 700; color: var(--c-accent);
}
.cst-blk-box {
    padding: 8px 16px; border-radius: 6px; text-align: center;
    font-size: 13px; font-weight: 600; line-height: 1.3;
}
.cst-blk-box small {
    font-size: 10px; font-weight: 400; color: var(--c-text2); display: block;
}
.cst-blk-pid {
    background: rgba(167,139,250,0.15); border: 1px solid var(--c-accent2); color: var(--c-accent2);
}
.cst-blk-plant {
    background: rgba(34,211,238,0.1); border: 1px solid var(--c-accent); color: var(--c-accent);
}
.cst-blk-feedback { color: var(--c-text2); font-size: 13px; margin-left: -4px; }

/* ── Footer ────────────────────────────────────────────── */
.cst-footer {
    margin-top: 20px; padding-top: 14px;
    border-top: 1px solid var(--c-border);
    display: flex; justify-content: space-between; align-items: center;
    flex-wrap: wrap; gap: 8px;
}
.cst-footer-author {
    font-size: 11px; color: var(--c-text2);
}
.cst-footer-author a {
    color: var(--c-accent); text-decoration: none;
}
.cst-footer-author a:hover { text-decoration: underline; }

/* ── Nyquist Stability Banner ──────────────────────────── */
.cst-nyquist-stability {
    display: flex; align-items: center; gap: 14px;
    padding: 14px 18px; margin-bottom: 14px;
    border-radius: 8px; font-size: 13px;
    animation: cst-flash 0.6s ease;
}
.cst-nyquist-stable {
    background: rgba(52,211,153,0.08); border: 1px solid rgba(52,211,153,0.3);
}
.cst-nyquist-unstable {
    background: rgba(239,68,68,0.08); border: 1px solid rgba(239,68,68,0.3);
}
.cst-nyquist-marginal {
    background: rgba(251,191,36,0.08); border: 1px solid rgba(251,191,36,0.3);
}
.cst-nyquist-stability-icon {
    width: 36px; height: 36px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    font-size: 18px; font-weight: 700; flex-shrink: 0;
}
.cst-nyquist-stable .cst-nyquist-stability-icon {
    background: rgba(52,211,153,0.15); color: var(--c-success);
}
.cst-nyquist-unstable .cst-nyquist-stability-icon {
    background: rgba(239,68,68,0.15); color: var(--c-danger);
}
.cst-nyquist-marginal .cst-nyquist-stability-icon {
    background: rgba(251,191,36,0.15); color: var(--c-warning);
}
.cst-nyquist-stability-title {
    font-weight: 700; font-size: 14px; color: var(--c-text);
}
.cst-nyquist-stability-detail {
    font-size: 12px; color: var(--c-text2); margin-top: 2px;
    font-family: var(--font-mono);
}

/* ── Nyquist Formula Block ─────────────────────────────── */
.cst-nyquist-formula {
    padding: 4px 0; font-size: 15px; color: var(--c-text);
    text-align: center; line-height: 1.8;
}

/* ── Root Locus Poles List ─────────────────────────────── */
.cst-rlocus-poles-list {
    display: flex; flex-wrap: wrap; gap: 6px;
    margin-top: 8px; min-height: 24px;
}
.cst-rlocus-pole-item {
    font-family: var(--font-mono); font-size: 12px;
    background: var(--c-bg); padding: 3px 8px; border-radius: 4px;
}

/* ── Pole-Zero Map ─────────────────────────────────────── */
.cst-pz-toolbar {
    display: flex; align-items: center; justify-content: space-between;
    gap: 8px; margin-bottom: 10px; flex-wrap: wrap;
}
.cst-pz-clear-btn {
    background: transparent; border: 1px solid var(--c-danger);
    color: var(--c-danger); padding: 5px 12px; border-radius: 6px;
    font-size: 12px; font-family: var(--font-body); cursor: pointer;
    transition: background 0.2s;
}
.cst-pz-clear-btn:hover { background: rgba(239,68,68,0.12); }
.cst-pz-canvas-wrap {
    background: #0f1117; border: 1px solid var(--c-border);
    border-radius: 8px; overflow: hidden; display: flex;
    justify-content: center; align-items: center;
}
.cst-pz-canvas-wrap canvas {
    display: block; max-width: 100%;
}
.cst-pz-tf-display {
    background: var(--c-bg); border: 1px solid var(--c-border);
    border-radius: 8px; padding: 10px 14px; margin-top: 12px;
    text-align: center;
}

/* ── Response Compare ──────────────────────────────────── */
.cst-rcomp-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 12px; }
.cst-rcomp-empty { font-size: 12px; color: var(--c-text2); text-align: center; padding: 10px; }
.cst-rcomp-item {
    display: flex; align-items: center; gap: 8px;
    background: var(--c-bg); padding: 6px 10px; border-radius: 6px;
    border: 1px solid var(--c-border);
}
.cst-rcomp-color {
    width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; display: inline-block;
}
.cst-rcomp-label {
    flex: 1; font-family: var(--font-mono); font-size: 12px; color: var(--c-text);
}
.cst-rcomp-remove {
    background: transparent; border: none; color: var(--c-danger);
    font-size: 18px; cursor: pointer; padding: 0 4px; line-height: 1;
}
.cst-rcomp-remove:hover { color: #ff6b6b; }
.cst-rcomp-add-row {
    display: flex; gap: 8px; align-items: flex-end; flex-wrap: wrap;
}
.cst-rcomp-inputs {
    display: flex; gap: 6px; flex: 1;
}
.cst-rcomp-inputs > div { flex: 1; }
.cst-rcomp-inputs label {
    font-size: 11px; color: var(--c-text2); display: block; margin-bottom: 3px;
}
.cst-rcomp-inputs .cst-num-input { width: 100%; }
.cst-rcomp-add-btn {
    background: var(--c-accent); color: #000; border: none;
    padding: 7px 14px; border-radius: 6px; font-size: 12px;
    font-family: var(--font-body); font-weight: 600; cursor: pointer;
    display: flex; align-items: center; gap: 4px; white-space: nowrap;
    transition: opacity 0.2s;
}
.cst-rcomp-add-btn:hover { opacity: 0.85; }
.cst-rcomp-presets {
    display: flex; gap: 6px; align-items: center; margin-top: 10px; flex-wrap: wrap;
}
.cst-rcomp-preset-btn {
    background: var(--c-bg); border: 1px solid var(--c-border);
    color: var(--c-text2); padding: 4px 10px; border-radius: 5px;
    font-size: 11px; font-family: var(--font-mono); cursor: pointer;
    transition: border-color 0.2s, color 0.2s;
}
.cst-rcomp-preset-btn:hover { border-color: var(--c-accent); color: var(--c-text); }

/* Comparison table */
.cst-rcomp-table {
    width: 100%; border-collapse: collapse; font-size: 12px;
    font-family: var(--font-mono);
}
.cst-rcomp-table th, .cst-rcomp-table td {
    padding: 6px 8px; border-bottom: 1px solid var(--c-border);
    text-align: center;
}
.cst-rcomp-table th {
    color: var(--c-text2); font-weight: 600; font-size: 11px;
    background: var(--c-bg); position: sticky; top: 0;
}
.cst-rcomp-table td { color: var(--c-text); }
.cst-rcomp-table td:first-child { text-align: left; font-size: 11px; }

/* ── State Space Module ────────────────────────────────── */
.cst-ss-matrix-inputs { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.cst-ss-matrix-inputs label {
    font-size: 11px; color: var(--c-text2); display: block; margin-bottom: 3px; font-weight: 600;
}
.cst-ss-textarea {
    width: 100%; background: var(--c-bg); border: 1px solid var(--c-border);
    color: var(--c-text); padding: 8px; border-radius: 6px; resize: vertical;
    font-family: var(--font-mono); font-size: 13px;
}
.cst-ss-equations {
    display: flex; gap: 20px; justify-content: center;
    margin: 12px 0; font-size: 16px;
}
.cst-ss-eq-lhs { font-family: var(--font-mono); color: var(--c-text); }
.cst-ss-matrices {
    display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; margin: 16px 0;
}
.cst-ss-mat-block { text-align: center; }
.cst-ss-mat-label {
    font-size: 14px; font-weight: 700; color: var(--c-accent2);
    margin-bottom: 6px; font-family: var(--font-mono);
}
.cst-ss-matrix {
    border-collapse: collapse; margin: 0 auto;
    border-left: 2px solid var(--c-accent2); border-right: 2px solid var(--c-accent2);
    border-radius: 0;
}
.cst-ss-matrix td {
    padding: 5px 10px; text-align: right;
    font-family: var(--font-mono); font-size: 13px; color: var(--c-text);
    white-space: nowrap;
}
.cst-ss-scalar {
    font-family: var(--font-mono); font-size: 16px; color: var(--c-text);
    padding: 8px 16px; display: inline-block;
    border-left: 2px solid var(--c-accent2); border-right: 2px solid var(--c-accent2);
}

/* ── Block Algebra Module ──────────────────────────────── */
.blkalg-blocks-list { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; }
.blkalg-block-item {
    display: flex; align-items: center; gap: 6px;
    background: var(--c-bg); padding: 5px 8px; border-radius: 5px;
    border: 1px solid var(--c-border); font-size: 12px;
}
.blkalg-block-name { font-weight: 700; color: var(--c-accent); font-family: var(--font-mono); min-width: 32px; }
.blkalg-block-tf { flex: 1; color: var(--c-text2); font-family: var(--font-mono); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.blkalg-add-block-row { display: flex; gap: 6px; align-items: center; }
.blkalg-op-builder { display: flex; flex-direction: column; }
.blkalg-op-row { display: flex; gap: 6px; align-items: center; }
.blkalg-select {
    flex: 1; background: var(--c-bg); border: 1px solid var(--c-border);
    color: var(--c-text); padding: 6px 8px; border-radius: 6px;
    font-family: var(--font-mono); font-size: 12px;
}
.blkalg-steps { max-height: 200px; overflow-y: auto; }
.blkalg-step-empty { font-size: 12px; color: var(--c-text2); text-align: center; padding: 8px; }
.blkalg-step-item {
    display: flex; gap: 8px; padding: 6px 0;
    border-bottom: 1px solid var(--c-border);
}
.blkalg-step-num {
    width: 22px; height: 22px; border-radius: 50%;
    background: var(--c-accent2); color: #000; font-size: 11px; font-weight: 700;
    display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.blkalg-step-content { flex: 1; }
.blkalg-step-formula { font-size: 12px; color: var(--c-text); font-family: var(--font-mono); }
.blkalg-step-op { font-size: 10px; color: var(--c-text2); background: var(--c-bg); padding: 1px 6px; border-radius: 3px; }
.blkalg-step-tf { font-size: 11px; color: var(--c-text2); font-family: var(--font-mono); margin-top: 2px; }
.blkalg-diagram-wrap {
    background: #0f1117; border: 1px solid var(--c-border);
    border-radius: 8px; overflow: hidden;
}
.blkalg-diagram-wrap canvas { display: block; width: 100%; }

/* ── Discretization Module ─────────────────────────────── */
.cst-discr-method {
    display: flex; align-items: center; gap: 8px;
    font-size: 13px; color: var(--c-text); cursor: pointer;
    padding: 4px 0;
}
.cst-discr-method input { accent-color: var(--c-accent); }
.cst-discr-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
.discr-gz-cards { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.discr-gz-card {
    flex: 1; min-width: 180px;
    background: var(--c-bg); border: 1px solid var(--c-border);
    border-left-width: 3px; border-radius: 6px; padding: 10px 12px;
}
.discr-gz-card-title { font-size: 12px; font-weight: 700; margin-bottom: 6px; }
.discr-gz-card-tf {
    font-family: var(--font-mono); font-size: 12px; color: var(--c-text);
    text-align: center;
}
.discr-gz-num, .discr-gz-den { display: block; }
.discr-gz-div {
    display: block; height: 1px; background: var(--c-text2);
    margin: 4px 10%; 
}
