/* ==========================================================================
   OptiRank Studio — Dashboard UI
   Used by /dashboard.html and by the condensed teaser on the homepage.
   ========================================================================== */

/* Top bar ---------------------------------------------------------------- */

.dash-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2);
  margin-bottom: var(--space-4);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface);
}

.dash-bar__select {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  min-height: 40px;
  padding: 0 var(--space-2);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background-color: var(--color-surface-alt);
  font-family: var(--font-mono);
  font-size: 0.875rem;
  color: var(--color-ink);
  cursor: not-allowed;
}

.dash-bar__select svg {
  width: 16px;
  height: 16px;
  color: var(--color-ink-dim);
}

.dash-bar__stamp {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  font-size: var(--text-caption);
  color: var(--color-ink-dim);
}

.dash-bar__spacer {
  flex: 1 1 auto;
}

.dash-bar__actions {
  display: flex;
  gap: var(--space-1);
}

/* KPI tiles -------------------------------------------------------------- */

.kpi-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: var(--space-2);
}

@media (min-width: 1024px) {
  .kpi-row {
    gap: var(--space-3);
  }
}

.kpi {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: var(--space-2);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background-color: var(--color-surface);
}

@media (min-width: 768px) {
  .kpi {
    padding: var(--space-3);
  }
}

.kpi__label {
  margin: 0;
  font-size: var(--text-caption);
  font-weight: 500;
  color: var(--color-ink-dim);
}

.kpi__value {
  margin: 0;
  font-family: var(--font-mono);
  font-size: clamp(1.5rem, 1.2rem + 1.2vw, 2rem);
  font-weight: 500;
  line-height: 1.1;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
  color: var(--color-ink);
}

.kpi__trend {
  margin: 0;
  font-size: 12px;
  font-weight: 500;
}

.kpi__trend--up {
  color: color-mix(in srgb, var(--color-accent) 76%, var(--color-ink));
}

.kpi__trend--down {
  color: var(--color-danger);
}

.kpi__trend--flat {
  color: var(--color-ink-dim);
}

.kpi__spark {
  margin-top: var(--space-1);
  width: 100%;
  height: 32px;
  overflow: visible;
}

/* Chart ------------------------------------------------------------------ */

.chart-card {
  position: relative;
  min-width: 0;
  padding: var(--space-3);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface);
}

@media (min-width: 768px) {
  .chart-card {
    padding: var(--space-4);
  }
}

.chart-card__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-1);
  margin-bottom: var(--space-3);
}

.chart-card__title {
  margin: 0;
  font-size: var(--text-body-lg);
}

.chart-card__meta {
  margin: 0;
  font-size: var(--text-caption);
  color: var(--color-ink-dim);
}

.chart {
  position: relative;
}

.chart__svg {
  display: block;
  width: 100%;
  height: 220px;
  overflow: visible;
}

@media (min-width: 768px) {
  .chart__svg {
    height: 280px;
  }
}

.chart__grid line {
  stroke: var(--color-border);
  stroke-width: 1;
}

.chart__axis-label {
  font-family: var(--font-mono);
  font-size: 11px;
  fill: var(--color-ink-dim);
}

.chart__point {
  pointer-events: none;
  transition: r var(--duration-fast) var(--ease-out);
}

.chart__point-hit {
  fill: transparent;
  cursor: pointer;
}

.chart__point-hit:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
  border-radius: 50%;
}

.chart__point-hit.is-active + .chart__point,
.chart__point-hit:hover + .chart__point {
  r: 6;
}

.chart__tooltip {
  position: absolute;
  z-index: 3;
  transform: translate(-50%, calc(-100% - 12px));
  padding: 6px 10px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--color-border);
  background-color: var(--color-surface);
  box-shadow: var(--shadow-card);
  white-space: nowrap;
  pointer-events: none;
}

.chart__tooltip[hidden] {
  display: none;
}

.chart__tooltip-label {
  display: block;
  font-size: 11px;
  color: var(--color-ink-dim);
}

.chart__tooltip-value {
  display: block;
  font-family: var(--font-mono);
  font-size: 0.875rem;
  font-weight: 500;
  color: var(--color-ink);
}

/* Dashboard grid --------------------------------------------------------- */

.dash-grid {
  display: grid;
  gap: var(--space-3);
  margin-top: var(--space-3);
}

@media (min-width: 1024px) {
  .dash-grid {
    grid-template-columns: 1.6fr 1fr;
    gap: var(--space-4);
    margin-top: var(--space-4);
  }
}

.dash-panel {
  /* Grid items default to min-width:auto, which lets the wide issues table
     push the whole page sideways on narrow screens. */
  min-width: 0;
  padding: var(--space-3);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface);
}

@media (min-width: 768px) {
  .dash-panel {
    padding: var(--space-4);
  }
}

.dash-panel__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-1);
  margin-bottom: var(--space-3);
}

.dash-panel__title {
  margin: 0;
  font-size: var(--text-body-lg);
}

.dash-panel__meta {
  margin: 0;
  font-size: var(--text-caption);
  color: var(--color-ink-dim);
}

/* Issues table ----------------------------------------------------------- */

.table-scroll {
  min-width: 0;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  margin-inline: calc(var(--space-3) * -1);
  padding-inline: var(--space-3);
}

@media (min-width: 768px) {
  .table-scroll {
    margin-inline: 0;
    padding-inline: 0;
  }
}

.issues-table {
  width: 100%;
  min-width: 620px;
  border-collapse: collapse;
  font-size: 0.9375rem;
}

.issues-table th,
.issues-table td {
  padding: var(--space-2) var(--space-2) var(--space-2) 0;
  text-align: left;
  vertical-align: top;
  border-bottom: 1px solid var(--color-border);
}

.issues-table th {
  font-family: var(--font-body);
  font-size: var(--text-caption);
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-ink-dim);
  white-space: nowrap;
}

.issues-table tbody tr:last-child td {
  border-bottom: 0;
}

.issues-table__issue {
  color: var(--color-ink);
  font-weight: 500;
}

.issues-table__path {
  display: block;
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--color-ink-dim);
}

.issues-table__num {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  color: var(--color-ink-dim);
  white-space: nowrap;
}

.issues-table__date {
  font-size: var(--text-caption);
  color: var(--color-ink-dim);
  white-space: nowrap;
}

/* Schema status card ----------------------------------------------------- */

.schema-list {
  list-style: none;
  margin: 0;
  padding: 0;
}

.schema-list li {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: 10px 0;
  margin: 0;
  border-bottom: 1px solid var(--color-border);
}

.schema-list li:last-child {
  border-bottom: 0;
}

.schema-list__name {
  flex: 1;
  font-family: var(--font-mono);
  font-size: 0.875rem;
  color: var(--color-ink);
}

.schema-list__status {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: var(--text-caption);
  white-space: nowrap;
}

.schema-list__status--ok {
  color: color-mix(in srgb, var(--color-accent) 76%, var(--color-ink));
}

.schema-list__status--missing {
  color: var(--color-danger);
}

.schema-list__status--partial {
  color: color-mix(in srgb, var(--color-warn) 78%, var(--color-ink));
}

.schema-list__status svg {
  width: 16px;
  height: 16px;
}

/* Health gauge ----------------------------------------------------------- */

.gauge {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}

.gauge__svg {
  width: 180px;
  height: 180px;
  margin-bottom: var(--space-2);
  transform: rotate(-90deg);
}

.gauge__track {
  stroke: var(--color-border);
}

.gauge__value {
  stroke: var(--color-accent);
  stroke-linecap: round;
}

/* Centred inside the 180px ring, which is the gauge's first child. */
.gauge__readout {
  position: absolute;
  top: 90px;
  left: 50%;
  transform: translate(-50%, -50%);
  margin: 0;
}

.gauge__number {
  display: block;
  font-family: var(--font-mono);
  font-size: 2.5rem;
  font-weight: 500;
  line-height: 1;
  letter-spacing: -0.03em;
  color: var(--color-ink);
}

.gauge__scale {
  display: block;
  font-size: var(--text-caption);
  color: var(--color-ink-dim);
}

.gauge__legend {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-2);
  list-style: none;
  margin: var(--space-2) 0 0;
  padding: 0;
  font-size: 12px;
  color: var(--color-ink-dim);
}

.gauge__legend li {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 0;
}

.gauge__legend span {
  width: 8px;
  height: 8px;
  border-radius: 50%;
}

/* Footnote --------------------------------------------------------------- */

.dash-footnote {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  margin-top: var(--space-4);
  padding: var(--space-3);
  border: 1px dashed var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-surface-alt);
  font-size: 0.9375rem;
  color: var(--color-ink-dim);
}

.dash-footnote p {
  margin: 0;
  max-width: 60ch;
}
