/* ============================================================
   Plot Explorer — brand styling ported from kristianskorpen.com
   inverter-course (editorial paper aesthetic).
   ============================================================ */

@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Serif:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap');

* { box-sizing: border-box; }
/* HTML `hidden` attribute must always win over any class-level display rule. */
[hidden] { display: none !important; }

:root {
  /* brand greens */
  --green-50:  #ECF6EE;
  --green-100: #D5EBD9;
  --green-200: #A8D6B0;
  --green-300: #7BC086;
  --green-500: #1F8A4C;
  --green-600: #166E3D;
  --green-700: #0E5630;

  /* ink scale */
  --ink-900: #0E1413;
  --ink-700: #2E3633;
  --ink-500: #5A645F;
  --ink-400: #7B847F;
  --ink-300: #A8AEA9;
  --ink-200: #D6D9D4;
  --ink-150: #E6E5DE;
  --ink-100: #EFEDE5;
  --ink-50:  #F7F5EE;
  --ink-25:  #FAFAF6;
  --paper:   #FFFFFF;

  --warn-500: #B04A1B;
  --warn-100: #FAEADD;

  --fg:           var(--ink-900);
  --fg-soft:      var(--ink-500);
  --fg-muted:     var(--ink-400);
  --bg:           var(--ink-25);
  --bg-card:      var(--paper);
  --bg-paper:     var(--ink-50);
  --bg-inset:     var(--ink-100);
  --border:       var(--ink-150);
  --border-strong:var(--ink-200);
  --accent:       var(--green-500);
  --accent-hover: var(--green-600);
  --accent-soft:  var(--green-50);

  --font-serif: "IBM Plex Serif", "Source Serif 4", Charter, Georgia, serif;
  --font-sans:  "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --font-mono:  "JetBrains Mono", "SFMono-Regular", Menlo, Consolas, monospace;

  --radius-1: 4px;
  --radius-2: 6px;
  --radius-3: 8px;
  --radius-4: 12px;

  --shadow-1: 0 1px 2px rgba(10,15,13,0.04), 0 0 0 1px rgba(10,15,13,0.02);
  --shadow-2: 0 2px 6px rgba(10,15,13,0.06), 0 1px 2px rgba(10,15,13,0.04);
  --shadow-focus: 0 0 0 3px rgba(31,138,76,0.25);

  --dur-fast: 120ms;
  --dur-base: 180ms;
}

/* Scope to the explorer root only when standalone, so we don't override
   <body>, <header>, <footer> of the embedding page. The standalone HTML
   wraps everything in <div class="plot-explorer-root">. */
.plot-explorer-root {
  background: var(--bg);
  color: var(--fg);
  font-family: var(--font-sans);
  font-size: 15px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
.plot-explorer-root a { color: var(--accent); text-decoration: none; }
.plot-explorer-root a:hover { color: var(--accent-hover); text-decoration: underline; }

/* ─────────── header / footer (only inside the explorer root) ─────────── */
.plot-explorer-root > header {
  background: var(--bg-card);
  padding: 1.5rem 2rem 1.2rem;
  border-bottom: 1px solid var(--border);
}
.plot-explorer-root > header h1 {
  font-family: var(--font-serif); font-weight: 600;
  margin: 0 0 0.3rem; font-size: 1.7rem; color: var(--fg);
}
.plot-explorer-root .tagline { margin: 0; color: var(--fg-soft); font-size: 0.95rem; }

.plot-explorer-root > footer {
  padding: 1.5rem 2rem 2.5rem;
  color: var(--fg-muted);
  font-size: 0.8rem;
  text-align: center;
}

/* ─────────── steps ─────────── */
.step { padding: 1.5rem 2rem; }
.step + .step { border-top: 1px solid var(--border); }
.step-head { display: flex; align-items: center; gap: 0.8rem; margin-bottom: 1rem; flex-wrap: wrap; }
.step-num {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.8rem; height: 1.8rem; border-radius: 50%;
  background: var(--accent); color: white; font-weight: 600; font-size: 0.92rem;
  font-family: var(--font-mono);
}
.step-head h2 {
  margin: 0; font-size: 1.15rem; color: var(--fg);
  font-family: var(--font-serif); font-weight: 600;
}
.step-controls { margin-left: auto; display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; }
.link-toggle {
  color: var(--fg-soft); font-size: 0.85rem; cursor: pointer; user-select: none;
  font-family: var(--font-mono);
}
.link-toggle input { vertical-align: middle; margin-right: 0.35rem; accent-color: var(--accent); }

/* ─────────── dropzone ─────────── */
.dropzone {
  border: 2px dashed var(--border-strong);
  border-radius: var(--radius-3);
  padding: 2.5rem 1.5rem;
  text-align: center;
  background: var(--bg-card);
  cursor: pointer;
  transition: border-color var(--dur-fast), background var(--dur-fast);
}
.dropzone:hover, .dropzone.drag {
  border-color: var(--accent);
  background: var(--accent-soft);
}
.dropzone .big { margin: 0; font-size: 1.02rem; color: var(--fg); font-family: var(--font-mono); }

.sample-row {
  display: flex; align-items: center; gap: 0.6rem 0.9rem;
  margin-top: 0.9rem; flex-wrap: wrap;
}
.sample-row .or {
  color: var(--fg-muted); font-size: 0.85rem; font-family: var(--font-mono);
  flex: 0 0 auto;
}
.sample-btn small {
  font-weight: 400; color: var(--fg-muted); margin-left: 0.4em;
  font-family: var(--font-mono); font-size: 0.78em;
}
.sample-btn:hover small { color: var(--ink-700); }

/* ─────────── clean banner ─────────── */
.clean-banner {
  margin-top: 1rem;
  padding: 0.7rem 1rem;
  background: var(--accent-soft);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius-2);
  font-size: 0.88rem;
  color: var(--green-700);
}
.clean-banner strong { color: var(--green-700); }
.clean-banner.err { background: var(--warn-100); border-left-color: var(--warn-500); color: var(--warn-500); }
.clean-banner ul { margin: 0.3rem 0 0 1.2rem; padding: 0; }
.clean-banner li { margin: 0.1rem 0; }
.clean-banner code { font-family: var(--font-mono); font-size: 0.85em; }

/* ─────────── data meta row ─────────── */
.data-meta {
  display: flex; align-items: center; gap: 1rem;
  margin-bottom: 1rem;
  color: var(--fg-soft); font-size: 0.88rem;
}
.data-meta #data-summary { font-family: var(--font-mono); font-size: 0.82rem; }

/* ─────────── buttons ─────────── */
button {
  font-family: var(--font-sans);
  background: var(--accent); color: white; border: 1px solid var(--accent);
  border-radius: var(--radius-2);
  padding: 0.5rem 1rem; font-size: 0.88rem; cursor: pointer;
  transition: background var(--dur-fast), border-color var(--dur-fast);
  font-weight: 500;
}
button:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
button:focus-visible { outline: none; box-shadow: var(--shadow-focus); }
button.ghost {
  background: transparent; color: var(--fg-soft); border-color: var(--border-strong);
}
button.ghost:hover { background: var(--bg-inset); color: var(--fg); border-color: var(--ink-300); }
button.sample-btn {
  background: var(--paper); color: var(--accent); border-color: var(--accent);
}
button.sample-btn:hover { background: var(--accent-soft); color: var(--accent-hover); }
button.mini {
  font-family: var(--font-mono); font-size: 11px;
  text-transform: uppercase; letter-spacing: 0.06em;
  padding: 0.35rem 0.7rem;
  background: var(--paper); color: var(--fg);
  border: 1px solid var(--border-strong);
}
button.mini:hover { background: var(--bg-inset); border-color: var(--ink-300); }
button.remove-plot, button.remove-slider {
  background: transparent; color: var(--fg-muted); border: 0;
  padding: 0.2rem 0.45rem; font-size: 1rem; line-height: 1;
}
button.remove-plot:hover, button.remove-slider:hover { color: var(--warn-500); background: transparent; }

/* ─────────── form controls ─────────── */
.axis-row label {
  display: flex; flex-direction: column; gap: 0.25rem;
  font-family: var(--font-mono); font-size: 0.7rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft);
}
.opt { color: var(--fg-muted); text-transform: none; letter-spacing: 0; font-size: 0.65rem; }
select {
  background: var(--paper); color: var(--fg);
  font-family: var(--font-sans); font-size: 0.9rem;
  border: 1px solid var(--border-strong); border-radius: var(--radius-2);
  padding: 0.45rem 0.55rem;
}
select:focus { outline: none; border-color: var(--accent); box-shadow: var(--shadow-focus); }

/* ─────────── signals panel (symbol mapping) ─────────── */
.signals-panel {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-3);
  padding: 0.85rem 1rem;
  margin-bottom: 1rem;
  box-shadow: var(--shadow-1);
}
.signals-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 0.7rem; margin-bottom: 0.5rem; flex-wrap: wrap;
}
.signals-title {
  font-family: var(--font-mono); font-size: 0.72rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft); font-weight: 600;
}
.signals-hint {
  font-size: 0.78rem; color: var(--fg-muted); font-style: italic;
}
.signals-table {
  width: 100%; max-width: 36em;
  border-collapse: collapse;
  font-size: 0.85rem;
}
.signals-table th, .signals-table td {
  text-align: left; padding: 0.3rem 0.7rem;
  border-bottom: 1px solid var(--border);
}
.signals-table th {
  font-family: var(--font-mono); font-size: 0.7rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft); font-weight: 500;
}
.signals-table td.col-name {
  font-family: var(--font-mono); color: var(--ink-700);
}
.symbol-input {
  font-family: var(--font-mono); font-size: 0.85rem;
  padding: 0.18rem 0.4rem;
  border: 1px solid var(--border-strong); border-radius: var(--radius-1);
  background: var(--paper); color: var(--green-700);
  width: 100%; min-width: 12em; box-sizing: border-box; font-weight: 500;
}
.symbol-input:focus { outline: none; border-color: var(--accent); box-shadow: var(--shadow-focus); }
/* Flashed briefly when a rename collides with an existing symbol. */
.symbol-input.dupe { border-color: var(--warn-500); background: var(--warn-100); color: var(--warn-500); }

/* ─────────── global sliders panel (sticky) ─────────── */
.shared-panel {
  position: sticky;
  top: 0;
  z-index: 50;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-3);
  padding: 0.85rem 1rem;
  margin-bottom: 1.25rem;
  box-shadow: var(--shadow-2);
}
.shared-panel-head {
  display: flex; align-items: center; gap: 0.8rem;
  margin-bottom: 0.6rem; flex-wrap: wrap;
}
.shared-title {
  font-family: var(--font-mono); font-size: 0.72rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft); font-weight: 600;
}
.shared-hint {
  font-size: 0.78rem; color: var(--fg-muted); font-style: italic;
  flex: 1;
}
.shared-add { display: flex; gap: 0.35rem; align-items: center; }
.shared-add #global-add-select {
  font-size: 0.78rem; padding: 0.3rem 0.5rem; max-width: 12rem;
}

/* ─────────── plot cards ─────────── */
.plots {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(520px, 1fr));
  gap: 1.25rem;
}
.plot-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-3);
  padding: 1rem 1rem 0.9rem;
  box-shadow: var(--shadow-1);
  display: flex; flex-direction: column;
}
.plot-card-head {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 0.8rem;
}
.plot-id {
  font-family: var(--font-mono); font-size: 0.72rem;
  color: var(--fg-soft); font-weight: 600;
  text-transform: uppercase; letter-spacing: 0.08em;
}

.axis-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.7rem; margin-bottom: 0.7rem; }
@media (max-width: 720px) { .axis-row { grid-template-columns: 1fr; } }
/* Axis expression inputs span the full row, sitting under the selects. */
.axis-row .x-expr, .axis-row .z-expr {
  grid-column: 1 / -1; width: 100%; box-sizing: border-box;
  font-family: var(--font-mono); font-size: 0.78rem;
  padding: 0.3rem 0.5rem;
  border: 1px solid var(--border-strong); border-radius: var(--radius-2);
  background: var(--paper); color: var(--ink-900);
}
.axis-row .x-expr:focus, .axis-row .z-expr:focus { outline: none; border-color: var(--accent); box-shadow: var(--shadow-focus); }
.axis-row .x-expr.error, .axis-row .z-expr.error { border-color: var(--warn-500); background: var(--warn-100); }

.curves-section { margin-bottom: 0.7rem; }
.curves-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 0.5rem; margin-bottom: 0.4rem; flex-wrap: wrap;
}
.curves-title {
  font-family: var(--font-mono); font-size: 0.7rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft);
}
.curves-add { display: flex; gap: 0.35rem; align-items: center; }
.curves-add .add-curve-select { font-size: 0.78rem; padding: 0.3rem 0.45rem; max-width: 12rem; }
.curves-list { display: flex; flex-direction: column; gap: 0.3rem; }
.curve-row {
  display: flex; align-items: center; gap: 0.45rem;
  padding: 0.3rem 0.5rem;
  background: var(--bg-paper);
  border: 1px solid var(--border);
  border-radius: var(--radius-2);
  min-width: 0;
}
.curve-row .swatch {
  width: 14px; height: 14px; border-radius: 50%;
  border: 1.5px solid var(--ink-200); flex: 0 0 auto;
}
.curve-row select { flex: 0 1 auto; min-width: 6em; font-size: 0.84rem; padding: 0.25rem 0.4rem; }
.curve-row .curve-col { flex: 1 1 auto; min-width: 8em; max-width: 16em; }
.curve-row .curve-op { flex: 0 1 auto; min-width: 7em; }
.curve-row .curve-expr {
  flex: 1 1 auto; min-width: 0;
  font-family: var(--font-mono); font-size: 0.78rem;
  padding: 0.25rem 0.45rem;
  border: 1px solid var(--border-strong); border-radius: var(--radius-2);
  background: var(--paper); color: var(--ink-900);
}
.curve-row .curve-expr:focus { outline: none; border-color: var(--accent); box-shadow: var(--shadow-focus); }
.curve-row .curve-expr.error { border-color: var(--warn-500); background: var(--warn-100); }
.curve-row .remove-curve {
  background: transparent; color: var(--fg-soft); border: 0;
  padding: 0.15rem 0.35rem; cursor: pointer; font-size: 1rem;
}
.curve-row .remove-curve:hover { color: var(--warn-500); }

.ptype-row {
  display: flex; align-items: center; gap: 1rem;
  margin-bottom: 0.7rem; padding: 0.45rem 0.7rem;
  background: var(--bg-paper); border: 1px solid var(--border);
  border-radius: var(--radius-2);
  font-size: 0.85rem;
}
.ptype-row .ptype-label {
  font-family: var(--font-mono); font-size: 0.7rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft);
}
.ptype-row label { color: var(--fg); cursor: pointer; }
.ptype-row input { vertical-align: middle; margin-right: 0.3rem; accent-color: var(--accent); }

.plot-area { position: relative; min-height: 340px; min-width: 0; }
.plot-canvas {
  width: 100%; min-height: 340px;
  background: var(--paper);
  border-radius: var(--radius-2);
}
.plot-empty {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  text-align: center; padding: 1.5rem;
  background: rgba(255,255,255,0.92);
  border-radius: var(--radius-2);
  font-family: var(--font-mono); font-size: 0.82rem;
  color: var(--fg-soft); line-height: 1.5;
  pointer-events: none;
}

/* ─────────── plot body — canvas on top, sliders below ─────────── */
.plot-body {
  display: flex; flex-direction: column;
  gap: 1rem;
  min-width: 0;
}

/* ─────────── sliders ─────────── */
.sliders-wrap {
  padding-top: 0.55rem;
  border-top: 1px solid var(--border);
  min-width: 0;
}
.sliders {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 0.35rem;
}
/* "+ add" sits right under the plot and next to the curve add-row above it,
   so without a heading it reads as "add a curve" — it actually adds a FILTER
   slider (narrows the data by one input dimension), which blanks the plot
   until the range is widened again. Keep the heading visible so the purpose
   is stated even before any slider has been added. */
.sliders-head {
  display: flex; align-items: baseline; gap: 0.5rem; margin-bottom: 0.3rem;
}
.sliders-title {
  font-family: var(--font-mono); font-size: 0.7rem;
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--fg-soft);
}
.add-slider-row {
  display: flex; gap: 0.35rem; align-items: center;
  margin-top: 0.4rem;
}
.add-slider-row .add-slider-select {
  font-size: 0.74rem; padding: 0.2rem 0.4rem;
  flex: 1; min-width: 0;
}
.add-slider-row .add-slider { font-size: 10.5px; padding: 0.2rem 0.5rem; }

/* two-row grid: row 1 = name | val | buttons; row 2 = range bar full-width */
.slider-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto auto auto auto;
  grid-template-rows: auto auto;
  align-items: center;
  column-gap: 0.35rem;
  row-gap: 0.2rem;
  padding: 0.3rem 0.55rem;
  background: var(--bg-paper);
  border: 1px solid var(--border);
  border-radius: var(--radius-2);
  min-width: 0;
}
.slider-row .name {
  grid-row: 1; grid-column: 1 / 2;
  font-family: var(--font-mono);
  color: var(--ink-700);
  font-size: 0.76rem;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  min-width: 0;
}
.slider-row .name.output-name { color: var(--ink-500); font-style: italic; }
.slider-row .val {
  grid-row: 1; grid-column: 2 / 3;
  font-family: var(--font-mono);
  color: var(--green-600);
  font-variant-numeric: tabular-nums;
  font-size: 0.78rem;
  font-weight: 500;
  padding: 0.05rem 0.25rem;
  border-radius: 3px;
  cursor: text;
  min-width: 2.6em;
  text-align: right;
  outline: none;
}
.slider-row .val:hover  { background: var(--bg-inset); }
.slider-row .val:focus  { background: var(--accent-soft); outline: 1px solid var(--accent); }
.slider-row .scale-ctrl     { grid-row: 1; grid-column: 3 / 4; display: inline-flex; align-items: center; gap: 3px; min-width: 0; }
.slider-row .promote-slider { grid-row: 1; grid-column: 4 / 5; }
.slider-row .lock-toggle    { grid-row: 1; grid-column: 5 / 6; }
.slider-row .remove-slider  { grid-row: 1; grid-column: 6 / 7; }
.slider-row .range-input {
  grid-row: 2; grid-column: 1 / -1;
  width: 100%; min-width: 0; margin: 0;
}
.slider-row .ticks { display: none; }
/* in the floating global panel there's no ⬆ promote, so 4 cols suffice */
.shared-panel .slider-row { grid-template-columns: minmax(0, 1fr) auto auto auto; }
.shared-panel .slider-row .lock-toggle    { grid-row: 1; grid-column: 3 / 4; }
.shared-panel .slider-row .remove-slider  { grid-row: 1; grid-column: 4 / 5; }
.slider-row .lock-toggle {
  background: transparent; border: 0; padding: 0.2rem 0.3rem;
  color: var(--fg-soft); font-size: 0.95rem; cursor: pointer; line-height: 1;
  transition: color var(--dur-fast);
}
.slider-row .lock-toggle:hover { color: var(--ink-900); }
.slider-row.floating { background: var(--ink-25); border-style: dashed; }
.slider-row.floating .val { color: var(--ink-400); font-style: italic; }
.slider-row.floating .range-input { opacity: 0.45; }

/* legacy stacked-layout rules — overridden by the flex layout above */

/* feasibility shading on the track */
.slider-row .range-input.has-mask {
  /* JS sets background to a linear-gradient with stops where infeasible */
  background-image: var(--mask-gradient, none);
  background-repeat: no-repeat;
  background-size: 100% 6px;
  background-position: center;
}
@media (max-width: 720px) {
  .sliders { grid-template-columns: 1fr; }
}

/* range input — match inverter-course slider chrome */
input[type="range"] {
  -webkit-appearance: none; appearance: none;
  width: 100%; height: 18px;
  background: transparent;
  cursor: pointer;
}
input[type="range"]::-webkit-slider-runnable-track {
  height: 2px; background: var(--border-strong); border-radius: 100px;
}
input[type="range"]::-moz-range-track {
  height: 2px; background: var(--border-strong); border-radius: 100px;
}
input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 14px; height: 14px;
  background: var(--paper); border: 2px solid var(--green-500);
  border-radius: 50%; margin-top: -6px;
  box-shadow: 0 1px 2px rgba(0,0,0,0.15);
  transition: transform 80ms;
}
input[type="range"]::-moz-range-thumb {
  width: 14px; height: 14px;
  background: var(--paper); border: 2px solid var(--green-500);
  border-radius: 50%;
  box-shadow: 0 1px 2px rgba(0,0,0,0.15);
}
input[type="range"]:hover::-webkit-slider-thumb { transform: scale(1.15); }
input[type="range"]:active::-webkit-slider-thumb { transform: scale(1.3); }

.plot-footnote {
  font-size: 0.7rem; color: var(--fg-muted);
  margin-top: 0.5rem;
  font-family: var(--font-mono);
}

/* ─────────── onboarding overlay ─────────── */
.onboard {
  position: fixed; inset: 0;
  background: rgba(14, 20, 19, 0.55);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
  backdrop-filter: blur(2px);
}
.onboard-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-3);
  padding: 1.6rem 1.8rem;
  max-width: 440px;
  text-align: center;
  box-shadow: var(--shadow-2);
}
.onboard-card h3 {
  font-family: var(--font-serif); font-weight: 600;
  margin: 0 0 0.6rem; font-size: 1.25rem;
}
.onboard-card p { color: var(--fg-soft); margin: 0 0 1.2rem; }
.onboard-card.help-card {
  max-width: 720px; max-height: 80vh; overflow: auto;
  text-align: left;
}
.help-body { font-size: 0.88rem; line-height: 1.5; color: var(--ink-700); }
.help-body h4 {
  font-family: var(--font-serif); font-weight: 600;
  margin: 1.1rem 0 0.35rem; font-size: 1rem;
  color: var(--fg);
}
.help-body code, .help-body .mono { font-family: var(--font-mono); font-size: 0.85em;
  background: var(--bg-inset); padding: 0.06rem 0.3rem; border-radius: 3px; color: var(--ink-900); }
.help-body table { border-collapse: collapse; width: 100%; font-size: 0.85rem; margin: 0.3rem 0 0.6rem; }
.help-body td, .help-body th { text-align: left; padding: 0.25rem 0.5rem; border-bottom: 1px solid var(--border); vertical-align: top; }
.help-body th { color: var(--fg-soft); font-weight: 500; font-size: 0.78rem; }
.help-body td:first-child { font-family: var(--font-mono); font-size: 0.85em; white-space: nowrap; color: var(--green-700); }
.curve-help { background: var(--paper); color: var(--fg-soft); border: 1px solid var(--border-strong); width: 1.6rem; padding: 0.2rem 0; font-weight: 600; }
.curve-help:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }

/* ─────────── responsive ─────────── */
@media (max-width: 720px) {
  header { padding: 1rem 0.9rem 0.8rem; }
  header h1 { font-size: 1.3rem; }
  .tagline { font-size: 0.85rem; }
  .step { padding: 1rem 0.9rem; }
  footer { padding: 1rem 0.9rem 1.5rem; }

  .step-head h2 { font-size: 1rem; }
  .step-controls { width: 100%; justify-content: flex-end; }

  .dropzone { padding: 1.5rem 1rem; }
  .dropzone .big { font-size: 0.92rem; }
  .sample-row { flex-direction: column; align-items: stretch; gap: 0.5rem; }
  .sample-btn { width: 100%; }

  .data-meta { flex-direction: column; align-items: flex-start; gap: 0.4rem; }
  .data-meta #data-summary { font-size: 0.78rem; word-break: break-word; }

  .shared-panel { padding: 0.7rem 0.7rem; margin-bottom: 0.9rem; border-radius: var(--radius-2); }
  .shared-panel-head { flex-direction: column; align-items: stretch; gap: 0.45rem; }
  .shared-add { width: 100%; }
  .shared-add #global-add-select { flex: 1; max-width: none; min-width: 0; }

  .plots { gap: 0.9rem; grid-template-columns: 1fr; }
  .plot-card { padding: 0.7rem; min-height: 0; }
  .plot-card-head { margin-bottom: 0.5rem; }

  .axis-row { grid-template-columns: 1fr; gap: 0.45rem; }
  .ptype-row { flex-wrap: wrap; gap: 0.5rem; padding: 0.35rem 0.5rem; }

  .plot-area { min-height: 280px; }
  .plot-canvas { min-height: 280px; }

  .sliders { grid-template-columns: 1fr; gap: 0.4rem; }
  .slider-row .name { font-size: 0.8rem; }
  .slider-row .val  { font-size: 0.82rem; }
  .lock-toggle, .remove-slider, .promote-slider { padding: 0.18rem 0.35rem; min-width: 1.5rem; }
  .add-slider-row { flex-wrap: wrap; }
  .add-slider-row .add-slider-select { flex: 1 1 100%; }

  /* Curve rows carry three <select>s with em-based min-widths (col/op ~7-8em,
     the generic select 6em) that add up past a narrow phone/embed width and
     never wrap, so the row (and its ancestor card) bulges past the viewport
     and the tail — line-style select, ✕, + ADD CURVE — goes unreachable.
     Let the row wrap and drop the min-widths so it folds to fit instead. */
  .curve-row { flex-wrap: wrap; row-gap: 0.3rem; }
  .curve-row select,
  .curve-row .curve-col,
  .curve-row .curve-op { min-width: 0; flex: 1 1 6em; }
  .curve-row .curve-expr { flex: 1 1 100%; }
  .curves-add .add-curve-select { max-width: none; flex: 1 1 8em; }

  /* avoid sticky covering too much on phones — keep panel relative on small screens */
  .shared-panel { position: relative; top: auto; box-shadow: var(--shadow-1); }

  .onboard-card { padding: 1.1rem 1.2rem; max-width: 90vw; }
}

/* slightly larger touch targets */
@media (max-width: 720px) and (pointer: coarse) {
  input[type="range"] { height: 28px; }
  input[type="range"]::-webkit-slider-thumb { width: 20px; height: 20px; margin-top: -9px; }
  input[type="range"]::-moz-range-thumb { width: 20px; height: 20px; }
  button { min-height: 38px; }
}

/* ─────────── cursors (oscilloscope-style readout) ─────────── */
.plot-card-head .cursor-toggle {
  margin-left: auto; margin-right: 0.4rem;
  font-family: var(--font-mono); font-size: 11px;
  text-transform: uppercase; letter-spacing: 0.06em;
  padding: 0.3rem 0.6rem;
  background: var(--paper); color: var(--fg-soft);
  border: 1px solid var(--border-strong); cursor: pointer;
}
.plot-card-head .cursor-toggle:hover { background: var(--bg-inset); border-color: var(--ink-300); }
.plot-card-head .cursor-toggle.on { background: var(--accent); color: #fff; border-color: var(--accent); }
.plot-card-head .cursor-toggle[disabled] { opacity: 0.4; cursor: not-allowed; }
/* crosshair over the plot while placing cursors */
.plot-card.cursing .plot-canvas { cursor: crosshair; }

.cursor-readout { margin-top: 0.6rem; }
.cursor-bar {
  display: flex; align-items: center; gap: 0.8rem;
  margin-bottom: 0.45rem;
}
.cursor-hint { font-size: 0.74rem; color: var(--fg-muted); }
.cursor-hint b { color: var(--fg-soft); }
.cursor-table th.opcol { white-space: nowrap; padding: 0.1rem 0.2rem; }
.cursor-table .opcol-select {
  font: inherit; font-size: 0.72rem; padding: 0.05rem 0.15rem;
  border: 1px solid var(--ink-200); border-radius: 4px; background: var(--bg-inset);
  color: var(--fg-soft); vertical-align: middle;
}
.cursor-table .opcol-del {
  border: none; background: none; cursor: pointer; color: var(--fg-muted);
  font-size: 0.72rem; padding: 0 0.15rem; line-height: 1; vertical-align: middle;
}
.cursor-table .opcol-del:hover { color: var(--danger, #b04a1b); }
.cursor-table th.addcol, .cursor-table td.addcol { width: 1%; text-align: center; }
.cursor-table .add-opcol {
  border: 1px dashed var(--ink-300); background: none; cursor: pointer;
  color: var(--fg-muted); border-radius: 4px; padding: 0 0.35rem; font-size: 0.9rem; line-height: 1.3;
}
.cursor-table .add-opcol:hover { border-color: var(--accent); color: var(--accent); }

.cursor-table {
  width: 100%; border-collapse: collapse;
  font-family: var(--font-mono); font-size: 0.74rem;
}
.cursor-table th, .cursor-table td {
  text-align: right; padding: 0.22rem 0.55rem;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}
.cursor-table th { color: var(--fg-muted); font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; }
.cursor-table td.lbl, .cursor-table th.lbl { text-align: left; color: var(--fg); }
.cursor-table .swatch { display: inline-block; width: 9px; height: 9px; border-radius: 2px; margin-right: 0.4rem; vertical-align: baseline; }
.cursor-table .col-a { color: #1F8A4C; }
.cursor-table .col-b { color: #B04A1B; }
.cursor-table tr.xrow td { color: var(--fg-soft); font-weight: 600; border-bottom: 2px solid var(--border-strong); }
.cursor-table .sub-tag { color: var(--fg-muted); font-size: 0.66rem; margin-left: 0.35rem; }
.cursor-table .na { color: var(--ink-300); }

/* "+ Add plot" relocated below the parameter panels, directly above Plot 1 */
.add-plot-row { display: flex; justify-content: flex-start; gap: 0.6rem; margin: 0.4rem 0 0.9rem; }

/* wider cursor table (A/B/Δ + interval measurements) can scroll on narrow cards */
.cursor-table-wrap { overflow-x: auto; }
.cursor-table .unit { color: var(--fg-muted); font-size: 0.82em; }

/* per-slider scale: dropdown (lin / log / expr) + optional expression box */
.slider-row .scale-mode {
  width: 58px; flex: none; font-size: 11px; padding: 1px 2px; border-radius: 4px;
  border: 1px solid var(--border); background: var(--bg-soft, rgba(0,0,0,0.03)); color: var(--fg-muted, #555);
}
.slider-row .scale-expr {
  width: 80px; flex: none; font-size: 11px; font-family: var(--font-mono, monospace);
  padding: 2px 5px; border-radius: 4px; border: 1px solid var(--border);
  background: var(--bg-soft, rgba(0,0,0,0.03)); color: var(--fg-muted, #555);
}
.slider-row .scale-expr:focus { color: var(--ink-900, #111); }
.slider-row .scale-expr.error { border-color: var(--warn-500, #c0392b); color: var(--warn-500, #c0392b); }
