| :root { |
| --bg: #eef1f6; |
| --bg-accent: #e4ebf5; |
| --surface: #fbfcfe; |
| --surface-2: #f3f6fb; |
| --ink: #1a2332; |
| --muted: #5b667a; |
| --line: #d5dde9; |
| --accent: #245bdb; |
| --accent-soft: #dce7ff; |
| --warn: #8a5a00; |
| --warn-bg: #fff6e4; |
| --danger: #9b2c2c; |
| --danger-bg: #ffe8e8; |
| --ok: #166534; |
| --radius: 10px; |
| --shadow: 0 1px 2px rgba(26, 35, 50, 0.06); |
| --font-ui: "Figtree", "Segoe UI", sans-serif; |
| --font-display: "Fraunces", Georgia, serif; |
| } |
|
|
| * { |
| box-sizing: border-box; |
| } |
|
|
| body { |
| margin: 0; |
| font-family: var(--font-ui); |
| background: |
| radial-gradient(1200px 500px at 10% -10%, #d9e6ff 0%, transparent 55%), |
| radial-gradient(900px 400px at 100% 0%, #e8f0ea 0%, transparent 50%), |
| var(--bg); |
| color: var(--ink); |
| min-height: 100vh; |
| } |
|
|
| .container { |
| max-width: 1180px; |
| margin: 0 auto; |
| padding: 28px 20px 96px; |
| } |
|
|
| .app-header { |
| margin-bottom: 22px; |
| } |
|
|
| .app-nav { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 8px; |
| margin-bottom: 14px; |
| } |
|
|
| .nav-link { |
| display: inline-flex; |
| align-items: center; |
| padding: 6px 12px; |
| border-radius: 999px; |
| border: 1px solid var(--line); |
| background: var(--surface); |
| color: var(--muted); |
| text-decoration: none; |
| font-size: 0.92rem; |
| } |
|
|
| .nav-link:hover, |
| .nav-link:focus-visible { |
| color: var(--ink); |
| border-color: #b7c6e3; |
| outline: none; |
| } |
|
|
| .nav-link.active { |
| background: var(--accent-soft); |
| border-color: #b7c6e3; |
| color: var(--accent); |
| font-weight: 600; |
| } |
|
|
| .app-header h1 { |
| margin: 0 0 6px; |
| font-family: var(--font-display); |
| font-size: clamp(1.8rem, 3vw, 2.4rem); |
| font-weight: 700; |
| letter-spacing: -0.02em; |
| } |
|
|
| .lede { |
| margin: 0 0 14px; |
| color: var(--muted); |
| max-width: 62ch; |
| line-height: 1.45; |
| } |
|
|
| .provider-strip { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 8px 14px; |
| padding: 10px 12px; |
| background: var(--surface); |
| border: 1px solid var(--line); |
| border-radius: var(--radius); |
| box-shadow: var(--shadow); |
| font-size: 13px; |
| } |
|
|
| .provider-strip span { |
| color: var(--muted); |
| } |
|
|
| .provider-strip strong { |
| color: var(--ink); |
| font-weight: 600; |
| } |
|
|
| .unload-models-btn { |
| margin-left: auto; |
| font: inherit; |
| font-size: 13px; |
| padding: 4px 10px; |
| border-radius: 6px; |
| border: 1px solid var(--line); |
| background: var(--bg); |
| color: var(--ink); |
| cursor: pointer; |
| } |
|
|
| .unload-models-btn:hover:not(:disabled) { |
| border-color: var(--ink); |
| } |
|
|
| .unload-models-btn:disabled { |
| opacity: 0.55; |
| cursor: not-allowed; |
| } |
|
|
| .panel { |
| background: var(--surface); |
| border: 1px solid var(--line); |
| border-radius: var(--radius); |
| padding: 18px 18px 14px; |
| margin-bottom: 16px; |
| box-shadow: var(--shadow); |
| } |
|
|
| .panel h2 { |
| margin: 0 0 4px; |
| font-family: var(--font-display); |
| font-size: 1.35rem; |
| font-weight: 600; |
| } |
|
|
| .kicker { |
| display: block; |
| margin-bottom: 12px; |
| color: var(--muted); |
| font-size: 13px; |
| line-height: 1.4; |
| } |
|
|
| .settings-section { |
| border: 1px solid var(--line); |
| border-radius: 8px; |
| padding: 12px 14px 14px; |
| margin: 0 0 12px; |
| background: var(--surface-2); |
| } |
|
|
| .settings-section > legend { |
| padding: 0 6px; |
| font-size: 12px; |
| font-weight: 700; |
| letter-spacing: 0.04em; |
| text-transform: uppercase; |
| color: var(--muted); |
| } |
|
|
| .grid { |
| display: grid; |
| grid-template-columns: repeat(2, minmax(200px, 1fr)); |
| gap: 12px; |
| } |
|
|
| .grid-1 { |
| grid-template-columns: 1fr; |
| } |
|
|
| label { |
| display: flex; |
| flex-direction: column; |
| gap: 6px; |
| font-size: 14px; |
| font-weight: 500; |
| } |
|
|
| .inline-check { |
| flex-direction: row; |
| align-items: center; |
| gap: 0.5rem; |
| font-weight: 500; |
| } |
|
|
| .help { |
| margin: 4px 0 0; |
| color: var(--muted); |
| font-size: 12px; |
| font-weight: 400; |
| line-height: 1.35; |
| } |
|
|
| .model-options { |
| display: grid; |
| gap: 8px; |
| } |
|
|
| .model-option { |
| display: flex; |
| gap: 10px; |
| align-items: flex-start; |
| padding: 10px 12px; |
| border: 1px solid var(--line); |
| border-radius: 8px; |
| background: var(--surface); |
| cursor: pointer; |
| } |
|
|
| .model-option:has(input:checked) { |
| border-color: #9bb6f0; |
| background: var(--accent-soft); |
| } |
|
|
| .model-option input { |
| margin-top: 3px; |
| } |
|
|
| .model-option strong { |
| display: block; |
| font-size: 14px; |
| } |
|
|
| .model-option span { |
| display: block; |
| color: var(--muted); |
| font-size: 12px; |
| font-weight: 400; |
| margin-top: 2px; |
| } |
|
|
| input, |
| select, |
| button, |
| textarea { |
| padding: 8px 10px; |
| border: 1px solid var(--line); |
| border-radius: 8px; |
| font: inherit; |
| color: var(--ink); |
| background: #fff; |
| } |
|
|
| button { |
| cursor: pointer; |
| background: var(--accent); |
| border: none; |
| color: #fff; |
| font-weight: 600; |
| } |
|
|
| button:disabled { |
| opacity: 0.55; |
| cursor: not-allowed; |
| } |
|
|
| button.secondary { |
| background: #e8edf7; |
| color: var(--ink); |
| } |
|
|
| button.danger { |
| background: #b42318; |
| } |
|
|
| .sticky-save { |
| position: sticky; |
| bottom: 12px; |
| z-index: 20; |
| display: flex; |
| align-items: center; |
| justify-content: space-between; |
| gap: 12px; |
| margin-top: 14px; |
| padding: 10px 12px; |
| border: 1px solid #b8c9f0; |
| border-radius: 10px; |
| background: rgba(251, 252, 254, 0.96); |
| backdrop-filter: blur(6px); |
| box-shadow: 0 8px 24px rgba(26, 35, 50, 0.12); |
| } |
|
|
| .sticky-save .dirty { |
| color: var(--warn); |
| font-size: 13px; |
| font-weight: 600; |
| } |
|
|
| .sticky-save .clean { |
| color: var(--muted); |
| font-size: 13px; |
| } |
|
|
| .stats { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 10px 16px; |
| margin: 10px 0; |
| font-size: 13px; |
| } |
|
|
| .metric { |
| min-width: 88px; |
| } |
|
|
| .metric .label { |
| display: block; |
| color: var(--muted); |
| font-size: 11px; |
| text-transform: uppercase; |
| letter-spacing: 0.04em; |
| } |
|
|
| .metric .value { |
| font-weight: 700; |
| font-size: 1.05rem; |
| } |
|
|
| .checkbox-row { |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| margin: 8px 0 12px; |
| font-size: 0.95rem; |
| } |
|
|
| .actions { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 10px; |
| margin: 10px 0; |
| align-items: center; |
| } |
|
|
| .reclassify-banner { |
| padding: 10px 12px; |
| border: 1px solid #c5d4ef; |
| background: #f3f7ff; |
| border-radius: 8px; |
| } |
|
|
| .reclassify-model select { |
| min-width: 11rem; |
| } |
|
|
| .sr-only { |
| position: absolute; |
| width: 1px; |
| height: 1px; |
| padding: 0; |
| margin: -1px; |
| overflow: hidden; |
| clip: rect(0, 0, 0, 0); |
| white-space: nowrap; |
| border: 0; |
| } |
|
|
| .debug-eval-results { |
| margin-top: 12px; |
| } |
|
|
| .debug-eval-results h3 { |
| margin: 14px 0 8px; |
| font-size: 1rem; |
| } |
|
|
| .debug-thumb { |
| width: 72px; |
| height: 72px; |
| object-fit: cover; |
| border-radius: 6px; |
| background: #e8eef8; |
| } |
|
|
| .table-wrap { |
| overflow-x: auto; |
| } |
|
|
| .progress-track { |
| width: 100%; |
| height: 5px; |
| background: #dde4f0; |
| border-radius: 999px; |
| overflow: hidden; |
| margin: 8px 0 12px; |
| } |
|
|
| .progress-fill { |
| height: 100%; |
| background: linear-gradient(90deg, #2f6cf0, #4aa3ff); |
| border-radius: 999px; |
| transition: width 0.25s ease; |
| } |
|
|
| .tag-suggestions { |
| display: flex; |
| flex-wrap: wrap; |
| gap: 6px; |
| margin: 8px 0 4px; |
| max-height: 160px; |
| overflow-y: auto; |
| } |
|
|
| .tag-suggestion { |
| background: var(--accent-soft); |
| color: #1e3a8a; |
| border: 1px solid #c7d2fe; |
| font-size: 13px; |
| padding: 4px 8px; |
| font-weight: 500; |
| } |
|
|
| .tag-suggestion:hover { |
| background: #dbeafe; |
| } |
|
|
| .chip { |
| display: inline-flex; |
| align-items: center; |
| gap: 6px; |
| padding: 4px 8px; |
| background: #eef2ff; |
| border: 1px solid #c7d2fe; |
| border-radius: 999px; |
| font-size: 13px; |
| } |
|
|
| .chip.warn { |
| background: #fff7ed; |
| border-color: #fdba74; |
| color: #9a3412; |
| margin-left: 6px; |
| } |
|
|
| .domain-toggle { |
| margin-top: 10px; |
| padding: 10px 12px; |
| border: 1px solid var(--border, #cbd5e1); |
| border-radius: 8px; |
| } |
|
|
| .domain-toggle legend { |
| padding: 0 6px; |
| font-weight: 600; |
| } |
|
|
| .real-life-status { |
| margin-top: 8px; |
| font-size: 13px; |
| } |
|
|
| .chip button { |
| padding: 0 6px; |
| border-radius: 999px; |
| background: transparent; |
| color: #334155; |
| font-weight: 700; |
| } |
|
|
| .chip button:disabled { |
| opacity: 0.35; |
| cursor: not-allowed; |
| } |
|
|
| .sfw-mode-toggle { |
| margin: 8px 0 12px; |
| font-weight: 600; |
| } |
|
|
| .tags-locked .chip { |
| opacity: 0.72; |
| filter: grayscale(0.35); |
| } |
|
|
| .chip-parked { |
| background: #f1f5f9; |
| border-color: #cbd5e1; |
| color: #64748b; |
| } |
|
|
| .parked-tags { |
| margin-top: 10px; |
| } |
|
|
| .muted { |
| color: var(--muted); |
| font-size: 13px; |
| } |
|
|
| .scan-preview { |
| margin-top: 8px; |
| padding: 10px 12px; |
| border-radius: 8px; |
| background: #eef7f0; |
| border: 1px solid #c9e2d1; |
| font-size: 13px; |
| } |
|
|
| table { |
| width: 100%; |
| border-collapse: collapse; |
| font-size: 13px; |
| } |
|
|
| th, |
| td { |
| border: 1px solid var(--line); |
| padding: 8px; |
| text-align: left; |
| vertical-align: top; |
| } |
|
|
| th { |
| background: var(--surface-2); |
| font-size: 12px; |
| text-transform: uppercase; |
| letter-spacing: 0.03em; |
| color: var(--muted); |
| } |
|
|
| .needs-review { |
| background: var(--warn-bg); |
| } |
|
|
| .primary-empty { |
| color: var(--warn); |
| font-weight: 600; |
| } |
|
|
| .error { |
| background: var(--danger-bg); |
| border: 1px solid #f5b7b7; |
| border-radius: 8px; |
| padding: 10px; |
| margin-bottom: 12px; |
| color: var(--danger); |
| } |
|
|
| .notice { |
| background: #e8f6ec; |
| border: 1px solid #b7dfc3; |
| border-radius: 8px; |
| padding: 10px; |
| margin-bottom: 12px; |
| color: var(--ok); |
| } |
|
|
| .image-cell { |
| display: flex; |
| flex-direction: column; |
| gap: 6px; |
| min-width: 160px; |
| } |
|
|
| .image-thumb-wrap { |
| position: relative; |
| width: 140px; |
| height: 140px; |
| } |
|
|
| .image-thumb { |
| width: 140px; |
| height: 140px; |
| object-fit: contain; |
| border: 1px solid var(--line); |
| border-radius: 8px; |
| background: #f8faff; |
| display: block; |
| } |
|
|
| .media-badge { |
| position: absolute; |
| right: 6px; |
| bottom: 6px; |
| width: 22px; |
| height: 22px; |
| border-radius: 999px; |
| background: rgba(20, 24, 33, 0.72); |
| color: #fff; |
| font-size: 11px; |
| line-height: 22px; |
| text-align: center; |
| pointer-events: none; |
| } |
|
|
| .image-path { |
| max-width: 220px; |
| font-size: 12px; |
| overflow-wrap: anywhere; |
| } |
|
|
| .tag-list { |
| display: flex; |
| flex-direction: column; |
| gap: 2px; |
| font-size: 12px; |
| } |
|
|
| .debug-json { |
| margin-top: 6px; |
| max-width: 360px; |
| max-height: 220px; |
| overflow: auto; |
| font-size: 11px; |
| line-height: 1.35; |
| background: #152033; |
| color: #e2e8f0; |
| border-radius: 8px; |
| padding: 8px; |
| } |
|
|
| .app-footer { |
| margin-top: 40px; |
| padding-top: 16px; |
| border-top: 1px solid var(--line); |
| color: var(--muted); |
| font-size: 12px; |
| line-height: 1.5; |
| } |
|
|
| .app-footer p { |
| margin: 0; |
| } |
|
|
| .app-footer a { |
| color: var(--muted); |
| text-decoration: underline; |
| text-underline-offset: 2px; |
| } |
|
|
| .app-footer a:hover { |
| color: var(--ink); |
| } |
|
|
| @media (max-width: 760px) { |
| .grid { |
| grid-template-columns: 1fr; |
| } |
|
|
| .sticky-save { |
| flex-direction: column; |
| align-items: stretch; |
| } |
| } |
|
|