/* ═══════════════════════════════════════════════════════════════
   Statistics Grapher — styles.css
   mistercraig.com
   ═══════════════════════════════════════════════════════════════ */

/* ── Custom properties (design tokens) ── */
:root {
  /* Colours */
  --color-bg:           #ffffff;
  --color-surface:      #f8f9fa;
  --color-surface-2:    #f1f3f5;
  --color-border:       #dee2e6;
  --color-border-light: #e9ecef;
  --color-text:         #1a1a2e;
  --color-text-muted:   #6c757d;
  --color-primary:      #2563eb;
  --color-primary-dark: #1d4ed8;
  --color-primary-light:#dbeafe;
  --color-accent:       #0ea5e9;
  --color-danger:       #dc2626;
  --color-success:      #16a34a;
  --color-warning:      #d97706;
  --color-tab-active:   #ffffff;
  --color-tab-bg:       #f1f3f5;

  /* Graph palettes — swapped in via JS class on <body> */
  --palette-1: #2563eb;
  --palette-2: #0ea5e9;
  --palette-3: #8b5cf6;
  --palette-4: #f59e0b;
  --palette-5: #10b981;
  --palette-6: #ef4444;

  /* Typography */
  --font-ui:    system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  --font-mono:  "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
  --font-size-base: 14px;
  --font-size-sm:   12px;
  --font-size-lg:   16px;
  --font-size-xl:   20px;

  /* Spacing */
  --space-xs:  4px;
  --space-sm:  8px;
  --space-md:  12px;
  --space-lg:  16px;
  --space-xl:  24px;
  --space-2xl: 32px;

  /* Layout */
  --header-height:    56px;
  --left-panel-width: 300px;
  --panel-padding:    var(--space-lg);
  --radius-sm:  4px;
  --radius-md:  6px;
  --radius-lg:  10px;
  --shadow-sm:  0 1px 3px rgba(0,0,0,.08);
  --shadow-md:  0 4px 12px rgba(0,0,0,.10);
}

/* ── Reset & base ── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html {
  font-size: var(--font-size-base);
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  font-family: var(--font-ui);
  background: var(--color-bg);
  color: var(--color-text);
  line-height: 1.5;
  display: flex;
  flex-direction: column;
  height: 100dvh;
  overflow: hidden;
}

/* ── Header ── */
.app-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: var(--header-height);
  padding: 0 var(--space-xl);
  background: var(--color-primary);
  color: #fff;
  flex-shrink: 0;
  gap: var(--space-lg);
}

.header-brand {
  display: flex;
  align-items: center;
  gap: var(--space-md);
}

.header-logo {
  font-size: 1.6rem;
  opacity: .9;
  user-select: none;
}

.app-header h1 {
  font-size: 1.15rem;
  font-weight: 700;
  letter-spacing: -.01em;
  color: #fff;
  line-height: 1.2;
}

.header-sub {
  font-size: var(--font-size-sm);
  opacity: .75;
}

.header-actions {
  display: flex;
  gap: var(--space-sm);
  flex-shrink: 0;
}

/* ── Main two-column layout ── */
.app-layout {
  display: grid;
  grid-template-columns: var(--left-panel-width) 1fr;
  flex: 1;
  overflow: hidden;
}

/* ── Left panel ── */
.panel-left {
  background: var(--color-surface);
  border-right: 1px solid var(--color-border);
  display: flex;
  flex-direction: column;
  overflow-y: auto;
  overflow-x: hidden;
  gap: 0;
}

.panel-section {
  padding: var(--panel-padding);
  border-bottom: 1px solid var(--color-border-light);
}

.section-title {
  font-size: var(--font-size-sm);
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  margin-bottom: var(--space-md);
  display: flex;
  align-items: center;
  gap: var(--space-xs);
}

/* ── Data input ── */
#sample-data {
  width: 100%;
  margin-bottom: var(--space-sm);
  padding: var(--space-xs) var(--space-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg);
  font-size: var(--font-size-sm);
  font-family: var(--font-ui);
  color: var(--color-text);
  cursor: pointer;
}

#data-input {
  width: 100%;
  resize: vertical;
  padding: var(--space-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg);
  font-family: var(--font-mono);
  font-size: var(--font-size-sm);
  color: var(--color-text);
  line-height: 1.6;
  transition: border-color .15s;
}

#data-input:focus {
  outline: none;
  border-color: var(--color-primary);
  box-shadow: 0 0 0 3px var(--color-primary-light);
}

.parse-status {
  font-size: var(--font-size-sm);
  min-height: 18px;
  margin: var(--space-xs) 0 var(--space-sm);
  line-height: 1.4;
}
.parse-status.ok      { color: var(--color-success); }
.parse-status.error   { color: var(--color-danger); }
.parse-status.warning { color: var(--color-warning); }

/* ── Controls area ── */
.control-group {
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
  margin-bottom: var(--space-md);
}

.control-group label {
  font-size: var(--font-size-sm);
  font-weight: 600;
  color: var(--color-text);
}

.control-group input[type="text"],
.control-group input[type="number"],
.control-group select {
  padding: var(--space-xs) var(--space-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  font-size: var(--font-size-sm);
  font-family: var(--font-ui);
  color: var(--color-text);
  background: var(--color-bg);
  width: 100%;
}

.control-group input:focus,
.control-group select:focus {
  outline: none;
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px var(--color-primary-light);
}

/* Slider with linked value display */
.range-with-value {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
}

.range-with-value input[type="range"] {
  flex: 1;
  accent-color: var(--color-primary);
}

.range-with-value span {
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
  min-width: 36px;
  text-align: right;
}

/* Two-field row (e.g. min/max) */
.control-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-sm);
}

.toggle-group {
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
  margin-bottom: var(--space-md);
}

.toggle-label {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  font-size: var(--font-size-sm);
  cursor: pointer;
  user-select: none;
}

.toggle-label input[type="checkbox"] {
  accent-color: var(--color-primary);
  width: 14px;
  height: 14px;
  cursor: pointer;
}

/* Divider within controls */
.control-divider {
  border: none;
  border-top: 1px solid var(--color-border-light);
  margin: var(--space-md) 0;
}

/* ── Summary statistics ── */
#summary-stats {
  font-size: var(--font-size-sm);
}

.summary-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-xs) var(--space-sm);
}

.stat-item {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: 2px 0;
  border-bottom: 1px solid var(--color-border-light);
}

.stat-label {
  color: var(--color-text-muted);
}

.stat-value {
  font-family: var(--font-mono);
  font-weight: 600;
  color: var(--color-text);
}

.stat-section-head {
  grid-column: 1 / -1;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  margin-top: var(--space-sm);
  padding-bottom: var(--space-xs);
  border-bottom: 1px solid var(--color-border);
}

/* ── Right panel ── */
.panel-right {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: var(--color-bg);
}

/* Graph type tabs */
.graph-tabs {
  display: flex;
  overflow-x: auto;
  background: var(--color-surface);
  border-bottom: 2px solid var(--color-border);
  flex-shrink: 0;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}

.graph-tabs::-webkit-scrollbar { display: none; }

.tab-btn {
  flex-shrink: 0;
  padding: var(--space-sm) var(--space-md);
  border: none;
  border-bottom: 2px solid transparent;
  background: none;
  font-size: var(--font-size-sm);
  font-family: var(--font-ui);
  color: var(--color-text-muted);
  cursor: pointer;
  white-space: nowrap;
  transition: color .15s, border-color .15s, background .15s;
  margin-bottom: -2px;
}

.tab-btn:hover {
  color: var(--color-primary);
  background: var(--color-primary-light);
}

.tab-btn.active {
  color: var(--color-primary);
  border-bottom-color: var(--color-primary);
  background: var(--color-bg);
  font-weight: 600;
}

/* Export bar */
.export-bar {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  padding: var(--space-sm) var(--space-lg);
  border-bottom: 1px solid var(--color-border-light);
  background: var(--color-surface);
  flex-shrink: 0;
}

.export-label {
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
  margin-right: var(--space-xs);
}

/* Content area: graph + table stack */
.content-area {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: var(--space-xl);
  display: flex;
  flex-direction: column;
  gap: var(--space-xl);
}

/* Graph container */
.graph-container {
  width: 100%;
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  position: relative;
  /* Default 4:3 aspect ratio — overridden by JS per setting */
  aspect-ratio: 4 / 3;
  max-height: 60vh;
}

.graph-container svg {
  width: 100%;
  height: 100%;
  display: block;
}

/* Placeholder state */
.graph-placeholder {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
  gap: var(--space-md);
  color: var(--color-text-muted);
  text-align: center;
  padding: var(--space-2xl);
}

.placeholder-icon {
  font-size: 3.5rem;
  opacity: .25;
  user-select: none;
}

.placeholder-text {
  font-size: var(--font-size-lg);
}

.placeholder-hint {
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
}

/* ── Frequency / data table ── */
.table-container {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--color-bg);
}

.table-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--space-sm) var(--space-lg);
  background: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
  gap: var(--space-md);
  flex-wrap: wrap;
}

.table-toolbar h3 {
  font-size: var(--font-size-sm);
  font-weight: 700;
  color: var(--color-text);
}

.table-col-toggles {
  display: flex;
  gap: var(--space-md);
  flex-wrap: wrap;
}

.table-scroll {
  overflow-x: auto;
}

.data-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--font-size-sm);
}

.data-table th {
  padding: var(--space-sm) var(--space-md);
  text-align: right;
  font-weight: 700;
  background: var(--color-surface-2);
  border-bottom: 2px solid var(--color-border);
  white-space: nowrap;
  font-size: 11px;
  letter-spacing: .03em;
  color: var(--color-text-muted);
}

.data-table th:first-child { text-align: left; }

.data-table td {
  padding: var(--space-xs) var(--space-md);
  text-align: right;
  font-family: var(--font-mono);
  border-bottom: 1px solid var(--color-border-light);
}

.data-table td:first-child {
  text-align: left;
  font-family: var(--font-ui);
  font-weight: 500;
}

.data-table tbody tr:last-child td { border-bottom: none; }
.data-table tbody tr:hover td { background: var(--color-primary-light); }

/* ── Buttons ── */
.btn-primary {
  width: 100%;
  padding: var(--space-sm) var(--space-lg);
  background: var(--color-primary);
  color: #fff;
  border: none;
  border-radius: var(--radius-md);
  font-size: var(--font-size-base);
  font-family: var(--font-ui);
  font-weight: 600;
  cursor: pointer;
  transition: background .15s;
}
.btn-primary:hover { background: var(--color-primary-dark); }
.btn-primary:active { transform: translateY(1px); }

.btn-ghost {
  padding: var(--space-xs) var(--space-md);
  background: rgba(255,255,255,.15);
  color: #fff;
  border: 1px solid rgba(255,255,255,.35);
  border-radius: var(--radius-md);
  font-size: var(--font-size-sm);
  font-family: var(--font-ui);
  cursor: pointer;
  transition: background .15s;
}
.btn-ghost:hover { background: rgba(255,255,255,.25); }

.btn-export {
  padding: 3px var(--space-md);
  background: var(--color-bg);
  color: var(--color-text);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  font-size: var(--font-size-sm);
  font-family: var(--font-ui);
  font-weight: 600;
  cursor: pointer;
  transition: background .15s, border-color .15s;
}
.btn-export:hover {
  background: var(--color-primary-light);
  border-color: var(--color-primary);
  color: var(--color-primary);
}

/* Small icon button (?) */
.info-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  border: 1px solid var(--color-border);
  background: var(--color-bg);
  color: var(--color-text-muted);
  font-size: 10px;
  font-weight: 700;
  cursor: pointer;
  flex-shrink: 0;
  line-height: 1;
  transition: border-color .15s, color .15s;
}
.info-btn:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

/* ── Info overlay ── */
.info-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,.4);
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-xl);
}

.info-overlay[hidden] { display: none; }

.info-box {
  background: var(--color-bg);
  border-radius: var(--radius-lg);
  padding: var(--space-xl);
  max-width: 480px;
  width: 100%;
  box-shadow: var(--shadow-md);
  position: relative;
}

.info-box h3 {
  font-size: var(--font-size-lg);
  margin-bottom: var(--space-md);
  padding-right: var(--space-xl);
  color: var(--color-primary);
}

.info-box p, .info-box li {
  font-size: var(--font-size-sm);
  line-height: 1.65;
  color: var(--color-text);
}

.info-box ul {
  padding-left: var(--space-lg);
  margin-top: var(--space-sm);
}

.info-close {
  position: absolute;
  top: var(--space-md);
  right: var(--space-md);
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid var(--color-border);
  background: none;
  font-size: 1.1rem;
  cursor: pointer;
  color: var(--color-text-muted);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background .15s;
}
.info-close:hover { background: var(--color-surface); }

/* ── Toast ── */
.toast {
  position: fixed;
  bottom: var(--space-xl);
  left: 50%;
  transform: translateX(-50%) translateY(80px);
  background: #1a1a2e;
  color: #fff;
  padding: var(--space-sm) var(--space-xl);
  border-radius: var(--radius-lg);
  font-size: var(--font-size-sm);
  font-weight: 500;
  box-shadow: var(--shadow-md);
  z-index: 2000;
  transition: transform .25s ease;
  white-space: nowrap;
}
.toast.show {
  transform: translateX(-50%) translateY(0);
}

/* ── Placeholder utility ── */
.placeholder-text {
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
  font-style: italic;
}

/* ── D3 graph element base styles ── */
.axis text {
  font-family: var(--font-ui);
  font-size: 11px;
  fill: var(--color-text);
}
.axis path, .axis line {
  stroke: var(--color-border);
}
.gridline line {
  stroke: var(--color-border-light);
  stroke-dasharray: 3,3;
}
.gridline-major line {
  stroke: var(--color-border);
  stroke-dasharray: none;
}
.graph-title {
  font-family: var(--font-ui);
  font-size: 14px;
  font-weight: 700;
  fill: var(--color-text);
}
.axis-label {
  font-family: var(--font-ui);
  font-size: 11px;
  fill: var(--color-text-muted);
}


/* ── Responsive — narrow viewport (tablets / small screens) ── */
@media (max-width: 900px) {
  :root {
    --left-panel-width: 260px;
  }
}

@media (max-width: 680px) {
  body { overflow-y: auto; }

  .app-layout {
    grid-template-columns: 1fr;
    grid-template-rows: auto 1fr;
    overflow: visible;
  }

  .panel-left {
    border-right: none;
    border-bottom: 2px solid var(--color-border);
    max-height: 50vh;
  }

  .panel-right {
    overflow: visible;
  }

  .graph-container {
    aspect-ratio: 4 / 3;
    max-height: none;
  }

  .app-header {
    padding: 0 var(--space-lg);
  }

  .header-sub { display: none; }
}

/* ── Box plot column grid ──────────────────────────────────────── */
.bp-grid-scroll {
  overflow-x: auto;
  padding-bottom: 4px;
  margin-bottom: 6px;
}
.bp-grid {
  display: flex;
  gap: 8px;
  min-width: min-content;
}
.bp-col {
  display: flex;
  flex-direction: column;
  width: 110px;
  flex-shrink: 0;
}
.bp-col-head {
  display: flex;
  align-items: center;
  gap: 5px;
  margin-bottom: 4px;
}
.bp-col-swatch {
  width: 14px;
  height: 14px;
  border-radius: 3px;
  flex-shrink: 0;
}
.bp-col-name {
  flex: 1;
  min-width: 0;
  font-size: 12px;
  padding: 3px 5px;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-surface);
  color: var(--color-text);
}
.bp-col-name:focus { outline: 2px solid var(--color-primary); outline-offset: 1px; }
.bp-col-data {
  flex: 1;
  min-height: 140px;
  font-size: 12px;
  font-family: var(--font-mono, monospace);
  padding: 6px;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-surface);
  color: var(--color-text);
  resize: vertical;
  line-height: 1.5;
}
.bp-col-data:focus { outline: 2px solid var(--color-primary); outline-offset: 1px; }
.bp-col-data::placeholder { color: var(--color-text-muted); }
.bp-parse-status {
  font-size: 11px;
  min-height: 16px;
  margin-bottom: 6px;
  color: var(--color-text-muted);
}
.bp-parse-status.ok    { color: var(--color-success); }
.bp-parse-status.error { color: var(--color-danger); }
.bp-grid-footer {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  margin-top: 8px;
}
.bp-grid-footer .btn-ghost {
  background: var(--color-surface-2);
  color: var(--color-text);
  border: 1px solid var(--color-border);
  flex: 1;
}
.bp-grid-footer .btn-ghost:hover {
  background: var(--color-border);
}
.bp-grid-footer .btn-primary {
  width: auto;
  flex: 1;
}
