:root { --bg: #f6f5f1; --surface: #ffffff; --surface-2: #efeee8; --text: #1f2328; --muted: #667069; --line: #d9d7cf; --accent: #246bfe; --accent-dark: #174dc0; --success: #147a4b; --warn: #946200; --danger: #b42318; } * { box-sizing: border-box; } body { margin: 0; background: var(--bg); color: var(--text); display: grid; grid-template-columns: 320px minmax(0, 1fr); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; letter-spacing: 0; min-height: 100vh; } body.login-page { display: block; } button, input, select, textarea { font: inherit; } button, .download, .upload { align-items: center; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; color: var(--text); cursor: pointer; display: inline-flex; justify-content: center; min-height: 40px; padding: 9px 12px; text-decoration: none; } button:hover, .download:hover, .upload:hover { border-color: #a7aaa3; } button.primary { background: var(--accent); border-color: var(--accent); color: #fff; } button.primary:hover { background: var(--accent-dark); } button.secondary { background: transparent; border-color: var(--accent); color: var(--accent); } button.secondary:hover { background: rgba(36, 107, 254, 0.07); } button.active-scan { background: #fff8e6; border-color: #ead18e; color: var(--warn); animation: scan-pulse 1.6s ease-in-out infinite; } @keyframes scan-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(148, 98, 0, 0.18); } 50% { box-shadow: 0 0 0 5px rgba(148, 98, 0, 0); } } input, select, textarea { background: #fff; border: 1px solid var(--line); border-radius: 8px; color: var(--text); min-height: 40px; outline: none; padding: 9px 11px; width: 100%; } textarea { line-height: 1.45; min-height: 132px; resize: vertical; } .sidebar { background: var(--surface-2); border-right: 1px solid var(--line); height: 100vh; overflow: auto; padding: 20px; position: sticky; top: 0; } .brand { align-items: center; display: flex; gap: 12px; margin-bottom: 22px; } .brand strong, .brand span { display: block; } .brand span, .hint, .topbar p, .card-meta, .status { color: var(--muted); } .mark { align-items: center; background: #202020; border-radius: 8px; color: #fff; display: flex; font-weight: 750; height: 42px; justify-content: center; width: 42px; } .panel { border-top: 1px solid var(--line); padding: 18px 0; } .panel h2 { font-size: 0.9rem; margin: 0 0 10px; } .upload { width: 100%; } .upload input { display: none; } .compact { margin: 8px 0; } .hint { font-size: 0.82rem; line-height: 1.4; margin: 8px 0 0; } .warning-hint { background: #fff8e6; border: 1px solid #ead18e; border-radius: 8px; color: var(--warn); padding: 8px 10px; } .reference-list { display: grid; gap: 6px; margin-top: 12px; } .reference-pill { background: #fff; border: 1px solid var(--line); border-radius: 8px; color: var(--muted); overflow: hidden; padding: 7px 9px; text-overflow: ellipsis; white-space: nowrap; } .reference-pill strong, .reference-pill span { display: block; overflow: hidden; text-overflow: ellipsis; } .reference-pill strong { color: var(--text); font-size: 0.88rem; } .reference-pill span { font-size: 0.78rem; margin-top: 2px; } .main { min-width: 0; padding: 24px; } .topbar { align-items: center; display: flex; gap: 16px; justify-content: space-between; } .top-actions { align-items: center; display: flex; gap: 10px; } .top-actions form { margin: 0; } h1 { font-size: 1.55rem; margin: 0 0 6px; } .topbar p { margin: 0; } .metrics { display: grid; gap: 12px; grid-template-columns: repeat(5, minmax(120px, 1fr)); margin: 20px 0; } .metric { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; padding: 14px; } .metric span { color: var(--muted); display: block; font-size: 0.78rem; } .metric strong { display: block; font-size: 1.35rem; margin-top: 4px; } .toolbar { align-items: center; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; padding: 10px; } .status { margin-left: auto; } .scenes { display: grid; gap: 14px; } .scene-card { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; overflow: hidden; } .scene-header { align-items: center; border-bottom: 1px solid var(--line); display: grid; gap: 12px; grid-template-columns: 54px minmax(160px, 1fr) minmax(100px, 180px) 140px; padding: 12px 14px; } .scene-number { color: var(--muted); font-variant-numeric: tabular-nums; } .scene-name { font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .badge { background: #f4f4f0; border: 1px solid var(--line); border-radius: 999px; color: var(--muted); font-size: 0.78rem; overflow: hidden; padding: 5px 9px; text-overflow: ellipsis; white-space: nowrap; } .badge.approved { background: #e8f5ee; border-color: #b9dfca; color: var(--success); } .badge.waiting_reference { background: #fff4db; border-color: #ead18e; color: var(--warn); } .scene-body { display: grid; gap: 14px; grid-template-columns: minmax(0, 1fr) 300px; padding: 14px; } .variants { display: grid; gap: 12px; grid-template-columns: repeat(3, minmax(0, 1fr)); } .variant { border: 1px solid var(--line); border-radius: 8px; overflow: hidden; position: relative; } .approved-variant { border-color: var(--success); box-shadow: 0 0 0 4px rgba(20, 122, 75, 0.28); outline: 3px solid var(--success); outline-offset: -3px; } .approved-variant::before { background: var(--success); border-radius: 999px; color: #fff; content: "Approved"; font-size: 0.75rem; font-weight: 700; left: 10px; padding: 4px 8px; position: absolute; top: 10px; z-index: 2; } .image-open { background: transparent; border: 0; border-radius: 0; display: block; min-height: 0; padding: 0; width: 100%; } .variant img, .placeholder { aspect-ratio: 4 / 3; background: #eeeeea; display: block; object-fit: cover; width: 100%; } .image-open img { cursor: zoom-in; } .placeholder { align-items: center; color: var(--muted); display: flex; justify-content: center; } .variant-footer { align-items: center; display: flex; gap: 8px; justify-content: space-between; padding: 8px; } .approved-variant .variant-footer { background: #e8f5ee; } .approved-variant .variant-footer button { background: var(--success); border-color: var(--success); color: #fff; } .variant-footer span { color: var(--muted); font-size: 0.82rem; } .side-actions { display: grid; gap: 10px; align-content: start; } .message { background: #fff8e6; border: 1px solid #ead18e; border-radius: 8px; color: var(--warn); font-size: 0.86rem; padding: 10px; } .empty { background: var(--surface); border: 1px dashed #bdbab1; border-radius: 8px; padding: 32px; } .empty h2 { font-size: 1.2rem; margin: 0 0 8px; } @media (max-width: 980px) { body { grid-template-columns: 1fr; } .sidebar { height: auto; position: static; } .metrics, .scene-body { grid-template-columns: 1fr; } .variants { grid-template-columns: 1fr; } .scene-header { grid-template-columns: 44px minmax(0, 1fr); } } .login-shell { align-items: center; display: flex; min-height: 100vh; justify-content: center; padding: 24px; } .login-card { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; box-shadow: 0 20px 50px rgba(31, 35, 40, 0.08); max-width: 420px; padding: 28px; width: 100%; } .login-card .mark { margin-bottom: 18px; } .login-card h1 { margin-bottom: 6px; } .login-card p { color: var(--muted); margin: 0 0 20px; } .login-card form { display: grid; gap: 12px; } .login-card label span { color: var(--muted); display: block; font-size: 0.82rem; margin-bottom: 6px; } .login-card button { width: 100%; } .login-error { background: #fff0ed; border: 1px solid #f2b8b5; border-radius: 8px; color: var(--danger) !important; padding: 9px 11px; } .modal { display: none; inset: 0; position: fixed; z-index: 50; } .modal.open { display: block; } .modal-backdrop { background: rgba(18, 20, 24, 0.72); inset: 0; position: absolute; } .modal-dialog { background: var(--surface); border-radius: 8px; box-shadow: 0 24px 80px rgba(0, 0, 0, 0.28); left: 50%; max-height: calc(100vh - 48px); max-width: min(1100px, calc(100vw - 48px)); overflow: hidden; position: absolute; top: 50%; transform: translate(-50%, -50%); width: fit-content; } .modal-dialog img { display: block; max-height: calc(100vh - 128px); max-width: min(1100px, calc(100vw - 48px)); object-fit: contain; } .modal-close { position: absolute; right: 10px; top: 10px; z-index: 3; } .modal-caption { border-top: 1px solid var(--line); color: var(--muted); font-size: 0.9rem; padding: 10px 12px; }