: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; } }