/* ============================================================
   INPUT VALIDATION — live warning surfaces for js/validation.js.

   Three layers:
     .val-banner   summary bar at the top of the input panel
     .val-badge    flag sitting on the offending row
     .val-cell     highlight on the specific field cell
   All colours come from the theme variables so the three themes
   (dark / light / sepia) stay consistent.
   ============================================================ */

/* ---------- top-of-panel banner ---------- */
.val-banner {
    border-bottom: 1px solid var(--border);
    font-size: 11px;
    background: var(--panel2);
}
.val-banner-bar {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 5px 8px;
    cursor: pointer;
    user-select: none;
}
.val-banner-bar:hover { filter: brightness(0.97); }
.val-banner-bar:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.val-banner .val-ico { font-size: 12px; line-height: 1; }
.val-banner .val-txt { color: var(--text2); }
.val-banner .val-pills { display: flex; gap: 5px; flex-wrap: wrap; flex: 1 1 auto; }
.val-banner .val-toggle {
    color: var(--text2);
    font-size: 10px;
    white-space: nowrap;
    flex: 0 0 auto;
}
.val-banner.val-error .val-banner-bar { border-left: 3px solid var(--danger); background: color-mix(in srgb, var(--danger) 12%, var(--panel2)); }
.val-banner.val-warn  .val-banner-bar { border-left: 3px solid var(--warning); background: color-mix(in srgb, var(--warning) 14%, var(--panel2)); }
.val-banner.val-info  .val-banner-bar { border-left: 3px solid var(--success); background: color-mix(in srgb, var(--success) 10%, var(--panel2)); }

.val-pill {
    display: inline-block;
    padding: 1px 6px;
    border-radius: 9px;
    font-size: 10px;
    font-weight: 600;
    white-space: nowrap;
    border: 1px solid transparent;
}
.val-pill-error { color: var(--danger);  background: color-mix(in srgb, var(--danger) 14%, transparent);  border-color: color-mix(in srgb, var(--danger) 40%, transparent); }
.val-pill-warn  { color: var(--warning); background: color-mix(in srgb, var(--warning) 16%, transparent); border-color: color-mix(in srgb, var(--warning) 45%, transparent); }
.val-pill-info  { color: var(--text2);   background: color-mix(in srgb, var(--text2) 10%, transparent);   border-color: color-mix(in srgb, var(--text2) 25%, transparent); }

/* ---------- expandable issue list ---------- */
.val-list {
    list-style: none;
    margin: 0;
    padding: 0 0 4px;
    max-height: 190px;
    overflow-y: auto;
    border-top: 1px solid var(--border);
}
.val-item {
    display: flex;
    align-items: flex-start;
    gap: 5px;
    padding: 4px 8px 4px 10px;
    cursor: pointer;
    border-left: 3px solid transparent;
}
.val-item:hover { background: color-mix(in srgb, var(--accent) 8%, transparent); }
.val-item-error { border-left-color: var(--danger); }
.val-item-warn  { border-left-color: var(--warning); }
.val-item-info  { border-left-color: var(--border); }
.val-item-ico { flex: 0 0 auto; font-size: 10px; line-height: 1.5; }
.val-item-error .val-item-ico { color: var(--danger); }
.val-item-warn  .val-item-ico { color: var(--warning); }
.val-item-info  .val-item-ico { color: var(--text2); }
.val-item-body { flex: 1 1 auto; min-width: 0; }
.val-msg { display: block; color: var(--text); line-height: 1.35; }
.val-hint { display: block; color: var(--text2); font-size: 10px; line-height: 1.3; margin-top: 1px; }
.val-jump {
    flex: 0 0 auto;
    color: var(--text2);
    font-size: 9px;
    white-space: nowrap;
    opacity: 0;
    align-self: center;
}
.val-item:hover .val-jump { opacity: 1; }

/* ---------- per-tab counter ---------- */
.val-tabcount {
    display: inline-block;
    margin-left: 4px;
    padding: 0 4px;
    border-radius: 8px;
    font-size: 9px;
    font-weight: 700;
    vertical-align: 1px;
    line-height: 1.5;
}
.val-tc-error { color: #fff; background: var(--danger); }
.val-tc-warn  { color: #fff; background: var(--warning); }

/* ---------- row-level flag ---------- */
tr.val-flagged > td { position: relative; }
tr.val-sev-error > td:first-child { box-shadow: inset 3px 0 0 var(--danger); }
tr.val-sev-warn  > td:first-child { box-shadow: inset 3px 0 0 var(--warning); }
tr.val-sev-info  > td:first-child { box-shadow: inset 3px 0 0 var(--border); }
tr.val-flagged:hover > td { background: color-mix(in srgb, var(--warning) 7%, transparent); }
tr.val-sev-error:hover > td { background: color-mix(in srgb, var(--danger) 8%, transparent); }

/* The flag chip lives inside the first cell, absolutely positioned so the
   table's column widths never shift when a row becomes invalid. */
.val-flaghost { overflow: visible !important; }
.val-badge {
    position: absolute;
    left: 1px;
    top: 50%;
    transform: translateY(-50%);
    font-size: 8px;
    font-weight: 700;
    line-height: 1;
    padding: 1px 2px;
    border-radius: 6px;
    color: #fff;
    pointer-events: auto;
    cursor: help;
    z-index: 2;
}
.val-badge-error { background: var(--danger); }
.val-badge-warn  { background: var(--warning); }
.val-badge-info  { background: var(--text2); }

/* Nudge the id text clear of the chip. */
tr.val-flagged > td.val-flaghost { padding-left: 20px; }

/* ---------- field-cell highlight ---------- */
td.val-cell { position: relative; }
td.val-cell::after {
    content: '';
    position: absolute;
    inset: 1px;
    border-radius: 3px;
    pointer-events: none;
}
td.val-cell-error::after { border: 1.5px solid var(--danger); background: color-mix(in srgb, var(--danger) 10%, transparent); }
td.val-cell-warn::after  { border: 1.5px solid var(--warning); background: color-mix(in srgb, var(--warning) 12%, transparent); }

/* ---------- click-to-locate flash ---------- */
tr.val-flash > td { animation: valFlash 1.1s ease-out 1; }
@keyframes valFlash {
    0%, 30% { background: color-mix(in srgb, var(--accent) 28%, transparent); }
    100%    { background: transparent; }
}
@media (prefers-reduced-motion: reduce) {
    tr.val-flash > td { animation: none; outline: 2px solid var(--accent); }
}
