@import url("https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&family=DM+Serif+Display&family=Fraunces:ital,opsz,wght@1,9..144,700&display=swap"); /* ============================================================ TOKENS — Dark mode (default) ============================================================ */ :root { --bg: #0b0905; --bg2: #14100a; --bg3: #1c1610; --gold: #f5a623; --gold-bright: #ffc24b; --gold-soft: #ffd97d; --gold-deep: #b9750a; --ink: #f7f0e2; --muted: #b9a784; --muted-2: #8a7c60; --line: rgba(245, 166, 35, 0.16); --card-bg: rgba(255, 182, 62, 0.045); --card-bd: rgba(245, 166, 35, 0.18); --grad: linear-gradient( 118deg, #ffe09a 0%, #ffc24b 38%, #f5a623 64%, #e07b00 100% ); --glow: 0 0 40px rgba(245, 166, 35, 0.18); --shadow: 0 4px 32px rgba(0, 0, 0, 0.45); --radius: 16px; --danger: #e63946; --success: #2dc653; } /* ============================================================ TOKENS — Light mode ============================================================ */ [data-theme="light"] { --bg: #faf7f2; --bg2: #f0ebe0; --bg3: #e8e0d0; --gold: #c87f00; --gold-bright: #d48a00; --gold-soft: #e09a20; --gold-deep: #a06800; --ink: #1a1208; --muted: #6b5c3e; --muted-2: #9a8a6a; --line: rgba(180, 120, 0, 0.18); --card-bg: rgba(255, 255, 255, 0.85); --card-bd: rgba(180, 120, 0, 0.22); --grad: linear-gradient(118deg, #c87f00 0%, #d48a00 40%, #b06000 100%); --glow: 0 0 30px rgba(200, 127, 0, 0.12); --shadow: 0 4px 24px rgba(0, 0, 0, 0.1); } /* ============================================================ BASE ============================================================ */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; } body { font-family: "Be Vietnam Pro", system-ui, sans-serif; background: var(--bg); color: var(--ink); min-height: 100vh; line-height: 1.6; -webkit-font-smoothing: antialiased; transition: background 0.3s, color 0.3s; } /* ============================================================ AMBIENT BACKGROUND ============================================================ */ .bg-ambient { position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; } .bg-ambient::before { content: ""; position: absolute; inset: 0; background: radial-gradient( 900px 600px at 80% -5%, rgba(245, 166, 35, 0.14), transparent 60% ), radial-gradient( 700px 500px at 5% 110%, rgba(185, 117, 10, 0.1), transparent 60% ); transition: opacity 0.3s; } [data-theme="light"] .bg-ambient::before { background: radial-gradient( 900px 600px at 80% -5%, rgba(200, 127, 0, 0.07), transparent 60% ), radial-gradient( 700px 500px at 5% 110%, rgba(160, 100, 0, 0.05), transparent 60% ); } .bg-grid { position: absolute; inset: 0; background-image: linear-gradient(rgba(245, 166, 35, 0.05) 1px, transparent 1px), linear-gradient(90deg, rgba(245, 166, 35, 0.05) 1px, transparent 1px); background-size: 54px 54px; -webkit-mask: radial-gradient(110% 90% at 75% 0%, #000 25%, transparent 78%); mask: radial-gradient(110% 90% at 75% 0%, #000 25%, transparent 78%); } [data-theme="light"] .bg-grid { background-image: linear-gradient(rgba(180, 120, 0, 0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(180, 120, 0, 0.06) 1px, transparent 1px); } .bg-traces { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0.55; pointer-events: none; } [data-theme="light"] .bg-traces { opacity: 0.3; } /* ============================================================ LAYOUT ============================================================ */ .page-wrap { position: relative; z-index: 2; display: flex; flex-direction: column; min-height: 100vh; } .container { max-width: 1000px; margin: 0 auto; padding: 0 24px; } /* ============================================================ HEADER ============================================================ */ header { position: sticky; top: 0; z-index: 100; background: rgba(11, 9, 5, 0.82); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-bottom: 1px solid var(--line); padding: 14px 0; transition: background 0.3s, border-color 0.3s; } [data-theme="light"] header { background: rgba(250, 247, 242, 0.88); } header .container { display: flex; align-items: center; gap: 16px; } .logo { display: flex; align-items: center; gap: 2px; text-decoration: none; font-family: 'Fraunces', serif; font-size: 22px; font-weight: 700; font-style: italic; letter-spacing: -.01em; color: var(--ink); } .logo .logo-accent { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; } nav { margin-left: auto; display: flex; align-items: center; gap: 8px; } nav a { color: var(--muted); text-decoration: none; font-size: 14px; font-weight: 500; padding: 6px 14px; border-radius: 99px; border: 1px solid transparent; transition: all 0.2s; } nav a:hover { color: var(--gold-bright); border-color: var(--card-bd); background: var(--card-bg); } /* ── Float: scroll-to-top ───────────────────────────────────────────────── */ .float-btn { position: fixed; bottom: 28px; right: 28px; width: 44px; height: 44px; border-radius: 50%; border: 1px solid var(--card-bd); background: var(--bg2); color: var(--gold-bright); cursor: pointer; display: grid; place-items: center; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); opacity: 0; visibility: hidden; transform: translateY(10px); transition: opacity 0.22s, transform 0.22s, visibility 0.22s, border-color 0.2s, background 0.2s; z-index: 200; } .float-btn.visible { opacity: 1; visibility: visible; transform: translateY(0); } .float-btn:hover { background: rgba(245, 166, 35, 0.12); border-color: var(--gold); } .float-btn i { font-size: 20px; } /* ── Page-limit modal ──────────────────────────────────────────────────────── */ .modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0, 0, 0, 0.65); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); z-index: 1000; align-items: center; justify-content: center; padding: 16px; } .modal-overlay.open { display: flex; } .modal-box { background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: var(--radius); padding: 32px 28px 28px; box-shadow: 0 24px 64px rgba(0, 0, 0, 0.4); max-width: 480px; width: 100%; box-shadow: 0 20px 60px rgba(0,0,0,0.18); } .modal-icon { width: 44px; height: 44px; border-radius: 12px; background: rgba(245,166,35,.12); display: flex; align-items: center; justify-content: center; margin-bottom: 16px; } .modal-icon i { font-size: 22px; color: var(--gold); } .modal-box h3 { font-size: 18px; font-weight: 700; margin: 0 0 8px; } .modal-body { color: var(--muted); font-size: 14px; margin: 0 0 12px; } .modal-list { margin: 0 0 12px; padding-left: 20px; font-size: 14px; line-height: 1.9; } .modal-note { font-size: 13px; color: var(--muted); margin: 0 0 20px; padding: 10px 14px; background: rgba(245,166,35,.06); border-left: 3px solid var(--gold); border-radius: 4px; } .modal-body-unified { text-align: justify; hyphens: auto; margin-bottom: 20px !important; } .modal-body-unified a { color: var(--gold-bright); text-decoration: none; font-weight: 600; } .modal-body-unified a:hover { text-decoration: underline; } .modal-format-note { font-size: 13px; color: var(--muted); line-height: 1.6; margin: 0 0 20px; text-align: justify; hyphens: auto; } .modal-format-note a { color: var(--gold-bright); text-decoration: none; font-weight: 600; } .modal-format-note a:hover { text-decoration: underline; } .modal-check { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; margin-bottom: 24px; } .modal-check input[type="checkbox"] { margin-top: 2px; flex-shrink: 0; accent-color: var(--gold); width: 16px; height: 16px; } .modal-check span { font-family: "Be Vietnam Pro", system-ui, sans-serif; font-size: 14px; font-weight: 400; text-transform: none; letter-spacing: normal; line-height: 1.55; } .modal-actions { display: flex; gap: 10px; } .modal-actions .btn { flex: 1; white-space: nowrap; width: auto; margin-top: 0; padding: 13px 16px; font-size: 14px; } /* Account dropdown in the header nav (injected by nav-auth.js) */ .nav-account { position: relative; display: inline-flex; } /* The user-icon trigger */ .nav-account-btn { width: 38px; height: 38px; padding: 0; border-radius: 50%; border: 1px solid var(--card-bd); background: var(--card-bg); cursor: pointer; display: grid; place-items: center; overflow: hidden; transition: border-color 0.2s, box-shadow 0.2s; flex-shrink: 0; } .nav-account-btn:hover, .nav-account.open .nav-account-btn { border-color: var(--gold); box-shadow: 0 0 0 3px rgba(245, 166, 35, 0.15); } .nav-avatar { width: 100%; height: 100%; object-fit: cover; display: block; } .nav-avatar-initials { display: grid; place-items: center; font-size: 13px; font-weight: 700; letter-spacing: 0.02em; color: #1a1208; background: var(--grad); } /* Guest (not signed in) — plain icon, no gradient */ .nav-avatar-guest { display: grid; place-items: center; font-size: 18px; color: var(--gold-bright); background: transparent; width: 100%; height: 100%; } /* The dropdown panel */ .nav-menu { position: absolute; top: calc(100% + 10px); right: 0; min-width: 220px; padding: 6px; border-radius: 14px; border: 1px solid var(--card-bd); background: var(--bg2); box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35); opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity 0.16s, transform 0.16s, visibility 0.16s; z-index: 100; } .nav-account.open .nav-menu { opacity: 1; visibility: visible; transform: translateY(0); } .nav-menu-head { display: flex; flex-direction: column; gap: 2px; padding: 10px 12px 8px; } .nav-menu-name { font-size: 14px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .nav-menu-email { font-size: 12px; color: var(--muted-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .nav-menu-sep { height: 1px; background: var(--line); margin: 4px 0; } .nav-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 12px; border-radius: 9px; border: none; background: transparent; font-family: inherit; font-size: 14px; font-weight: 500; color: var(--muted); text-align: left; text-decoration: none; cursor: pointer; transition: background 0.16s, color 0.16s; } .nav-menu-item i { font-size: 17px; color: var(--gold-bright); flex-shrink: 0; } .nav-menu-item:hover { background: rgba(245, 166, 35, 0.1); color: var(--ink); } .nav-menu-signout:hover { background: rgba(230, 57, 70, 0.12); color: #ff6b6b; } .nav-menu-signout:hover i { color: #ff6b6b; } /* ============================================================ MAIN ============================================================ */ main { padding: 56px 0 96px; flex: 1; } /* ============================================================ HERO ============================================================ */ .hero { text-align: center; margin-bottom: 48px; } .hero-badge { display: inline-flex; align-items: center; gap: 10px; font-family: "JetBrains Mono", monospace; font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--gold-bright); border: 1px solid var(--card-bd); padding: 8px 18px; border-radius: 99px; background: var(--card-bg); margin-bottom: 24px; } .hero-badge .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--gold); box-shadow: 0 0 10px var(--gold); } .hero h1 { font-size: clamp(32px, 5.5vw, 56px); font-weight: 800; line-height: 1.08; letter-spacing: -0.02em; margin-bottom: 16px; } .gold-text { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; } .fraunces-text { font-family: "Fraunces", serif; font-style: italic; font-weight: 400; } .hero p { color: var(--muted); font-size: 16px; max-width: 48ch; margin: 0 auto; line-height: 1.6; } /* ============================================================ CARD ============================================================ */ .card { border: 1px solid var(--card-bd); border-radius: var(--radius); padding: 32px; background: var(--card-bg); box-shadow: var(--shadow); margin-bottom: 20px; position: relative; overflow: hidden; transition: border-color 0.2s, background 0.3s; } .card::after { content: ""; position: absolute; right: -40px; bottom: -40px; width: 120px; height: 120px; border-radius: 50%; background: radial-gradient( circle, rgba(245, 166, 35, 0.12), transparent 70% ); pointer-events: none; } /* ============================================================ RULE LINE ============================================================ */ .rule { height: 3px; width: 60px; border-radius: 3px; background: var(--grad); margin: 12px 0 28px; box-shadow: var(--glow); } /* ============================================================ SECTION KICKER ============================================================ */ .kicker { display: inline-flex; align-items: center; gap: 8px; font-family: "JetBrains Mono", monospace; font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--gold-bright); margin-bottom: 10px; } .kicker .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--gold); box-shadow: 0 0 8px var(--gold); } /* ============================================================ UPLOAD ZONE ============================================================ */ .upload-zone { border: 2px dashed var(--card-bd); border-radius: var(--radius); padding: 52px 24px; text-align: center; cursor: pointer; transition: all 0.25s; background: transparent; position: relative; } .upload-zone:hover, .upload-zone.drag-over { border-color: var(--gold); background: rgba(245, 166, 35, 0.04); } .upload-zone input[type="file"] { position: absolute; inset: 0; opacity: 0; cursor: pointer; width: 100%; height: 100%; } .upload-icon { font-size: 44px; margin-bottom: 14px; display: block; color: var(--gold); text-shadow: 0 0 20px rgba(245, 166, 35, 0.5); line-height: 1; } .step-icon { font-size: 28px; color: var(--gold-bright); display: block; margin-bottom: 10px; text-shadow: 0 0 12px rgba(245, 166, 35, 0.35); } .section-num i { font-size: 14px; } .upload-zone strong { display: block; font-size: 17px; font-weight: 700; color: var(--ink); margin-bottom: 6px; } .upload-zone p { color: var(--muted); font-size: 13px; } .upload-note { display: flex; align-items: flex-start; gap: 6px; margin: 10px 0 0; font-size: 12.5px; color: var(--muted); line-height: 1.5; } .upload-note i { flex-shrink: 0; margin-top: 1px; } .upload-note-link { flex-shrink: 0; margin-left: 4px; color: var(--gold-bright); text-decoration: none; font-weight: 600; white-space: nowrap; transition: color 0.15s; } .upload-note-link:hover { color: var(--gold); text-decoration: underline; } .file-name { display: none; align-items: center; gap: 10px; margin-top: 14px; font-size: 13px; font-family: "JetBrains Mono", monospace; color: var(--gold-bright); font-weight: 600; padding: 8px 8px 8px 16px; background: rgba(245, 166, 35, 0.08); border-radius: 8px; border: 1px solid var(--card-bd); } #file-name-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .file-clear-btn { flex-shrink: 0; width: 24px; height: 24px; border-radius: 6px; border: none; background: transparent; color: var(--muted); cursor: pointer; display: grid; place-items: center; font-size: 16px; transition: background 0.15s, color 0.15s; } .file-clear-btn:hover { background: rgba(230, 57, 70, 0.15); color: #e63946; } /* ============================================================ FORM ============================================================ */ .form-group { margin-top: 24px; } label { display: block; font-size: 13px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); margin-bottom: 8px; font-family: "JetBrains Mono", monospace; } input[type="email"], input[type="text"] { width: 100%; padding: 13px 16px; border: 1px solid var(--card-bd); border-radius: 10px; font-size: 15px; font-family: "Be Vietnam Pro", sans-serif; color: var(--ink); background: var(--bg2); transition: border-color 0.2s, box-shadow 0.2s, background 0.3s; } input[type="email"]::placeholder, input[type="text"]::placeholder { color: var(--muted-2); } input[type="email"]:focus, input[type="text"]:focus { outline: none; border-color: var(--gold); box-shadow: 0 0 0 3px rgba(245, 166, 35, 0.15); } /* ============================================================ BUTTONS ============================================================ */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 13px 28px; border-radius: 10px; border: none; font-size: 15px; font-weight: 700; font-family: "Be Vietnam Pro", sans-serif; cursor: pointer; transition: all 0.2s; letter-spacing: 0.01em; } .btn-primary { background: var(--grad); color: #1a1208; width: 100%; margin-top: 24px; box-shadow: 0 4px 20px rgba(245, 166, 35, 0.25); } .btn-primary:hover { filter: brightness(1.08); transform: translateY(-1px); box-shadow: 0 6px 28px rgba(245, 166, 35, 0.35); } .btn-primary:disabled { background: var(--bg3); color: var(--muted-2); cursor: not-allowed; transform: none; box-shadow: none; border: 1px solid var(--line); } .btn-outline { background: var(--card-bg); border: 1px solid var(--card-bd); color: var(--gold-bright); width: 100%; margin-top: 12px; } .btn-outline:hover { background: rgba(245, 166, 35, 0.08); border-color: var(--gold); } /* ============================================================ SECRET KEY BOX ============================================================ */ .secret-key-box { display: none; margin-top: 28px; border: 1px solid var(--gold); border-radius: var(--radius); padding: 28px 24px; text-align: center; background: rgba(245, 166, 35, 0.06); box-shadow: 0 0 40px rgba(245, 166, 35, 0.1); } .secret-key-box .sk-label { font-family: "JetBrains Mono", monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; } .secret-key-box .sk-value { font-family: "JetBrains Mono", monospace; font-size: clamp(18px, 3vw, 26px); font-weight: 700; letter-spacing: 0.12em; word-break: break-all; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; margin-bottom: 14px; line-height: 1.3; } .secret-key-box .sk-hint { font-size: 13px; color: var(--muted); line-height: 1.5; margin-bottom: 16px; } .sk-input-row { display: flex; align-items: center; gap: 0; margin-bottom: 14px; border: 1px solid var(--gold); border-radius: 10px; overflow: hidden; background: var(--bg2); } .sk-input { flex: 1; padding: 12px 16px; background: transparent; border: none; outline: none; font-family: "JetBrains Mono", monospace; font-size: 15px; font-weight: 600; letter-spacing: 0.08em; color: var(--gold-bright); cursor: default; min-width: 0; } .sk-input::selection { background: rgba(245, 166, 35, 0.25); } .sk-icon-btn { flex-shrink: 0; width: 44px; height: 44px; display: grid; place-items: center; background: transparent; border: none; border-left: 1px solid var(--card-bd); color: var(--muted); cursor: pointer; transition: color 0.2s, background 0.2s; font-size: 18px; } .sk-icon-btn:hover { color: var(--gold-bright); background: rgba(245, 166, 35, 0.08); } /* ============================================================ ALERTS ============================================================ */ .alert { display: none; padding: 12px 16px; border-radius: 10px; font-size: 14px; margin-top: 16px; line-height: 1.5; } .alert-error { background: rgba(230, 57, 70, 0.1); color: #f87171; border: 1px solid rgba(230, 57, 70, 0.3); } [data-theme="light"] .alert-error { background: #fde8ea; color: #b91c1c; border: 1px solid #fca5a5; } .alert-info { background: rgba(245, 166, 35, 0.08); color: var(--gold-bright); border: 1px solid var(--card-bd); } /* ============================================================ HOW IT WORKS ============================================================ */ .steps-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; } .steps-grid--3 { grid-template-columns: repeat(3, 1fr); } @media (max-width: 640px) { .steps-grid, .steps-grid--3 { grid-template-columns: 1fr; } } .step-card { border: 1px solid var(--card-bd); border-radius: 14px; padding: 20px; background: var(--card-bg); position: relative; overflow: hidden; transition: transform 0.2s, border-color 0.2s; } .step-card:hover { transform: translateY(-3px); border-color: var(--gold); } .step-card::after { content: ""; position: absolute; right: -20px; bottom: -20px; width: 80px; height: 80px; border-radius: 50%; background: radial-gradient( circle, rgba(245, 166, 35, 0.15), transparent 70% ); } .step-num { position: absolute; top: 14px; right: 18px; font-family: "DM Serif Display", serif; font-size: 46px; font-weight: 400; line-height: 1; letter-spacing: -0.01em; color: transparent; -webkit-text-stroke: 1px var(--gold); opacity: 0.4; pointer-events: none; transition: opacity 0.2s; } .step-card:hover .step-num { opacity: 0.75; } .step-card h3 { font-size: 15px; font-weight: 700; margin-bottom: 6px; color: var(--ink); } .step-card p { font-size: 13px; color: var(--muted); line-height: 1.5; } /* ============================================================ REVIEW PAGE — LOOKUP ============================================================ */ #lookup-section { max-width: 520px; margin: 0 auto 32px; } /* ============================================================ STATUS BADGES ============================================================ */ .status-badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 14px; border-radius: 99px; font-size: 12px; font-family: "JetBrains Mono", monospace; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; } .status-pending { background: rgba(255, 200, 50, 0.1); color: #fbbf24; border: 1px solid rgba(255, 200, 50, 0.25); } .status-processing { background: rgba(96, 165, 250, 0.1); color: #60a5fa; border: 1px solid rgba(96, 165, 250, 0.25); } .status-completed { background: rgba(45, 198, 83, 0.1); color: #34d399; border: 1px solid rgba(45, 198, 83, 0.25); } .status-failed { background: rgba(230, 57, 70, 0.1); color: #f87171; border: 1px solid rgba(230, 57, 70, 0.25); } [data-theme="light"] .status-pending { background: #fffbeb; color: #92400e; border-color: #fde68a; } [data-theme="light"] .status-processing { background: #eff6ff; color: #1d4ed8; border-color: #bfdbfe; } [data-theme="light"] .status-completed { background: #f0fdf4; color: #166534; border-color: #bbf7d0; } [data-theme="light"] .status-failed { background: #fef2f2; color: #991b1b; border-color: #fecaca; } .spinner { width: 12px; height: 12px; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; animation: spin 0.7s linear infinite; display: inline-block; } .spin { animation: spin 0.8s linear infinite; display: inline-block; } @keyframes spin { to { transform: rotate(360deg); } } /* ============================================================ OVERALL SCORE ============================================================ */ /* Overall Assessment inline (inside section card) */ .overall-inline { display: flex; align-items: baseline; gap: 6px; margin-top: 4px; } .os-number { font-size: 36px; font-weight: 800; line-height: 1; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; } .os-max { font-size: 16px; color: var(--muted); font-weight: 600; } .os-sep { color: var(--muted-2); font-size: 16px; margin: 0 2px; } .os-label-text { font-size: 15px; font-weight: 600; color: var(--gold-bright); letter-spacing: 0.01em; } /* Admin KPI cards */ .kpi-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 14px; margin-bottom: 24px; } .kpi-card { background: var(--card); border: 1px solid var(--card-bd); border-radius: 14px; padding: 16px 18px; } .kpi-header { display: flex; align-items: center; gap: 6px; margin-bottom: 8px; } .kpi-icon { font-size: 15px; color: var(--gold); } .kpi-label { font-family: "JetBrains Mono", monospace; font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); } .kpi-value { font-size: 26px; font-weight: 800; background: var(--grad); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; line-height: 1.1; word-break: break-all; } .kpi-growth { margin-top: 6px; font-size: 11px; font-family: "JetBrains Mono", monospace; } .kpi-growth-up { color: #4ade80; } .kpi-growth-down { color: #f87171; } /* ARR score rows — OpenReview-style inline list */ .arr-scores-row { display: flex; flex-direction: column; gap: 0; margin-top: 12px; border: 1px solid rgba(245, 166, 35, 0.2); border-radius: 12px; overflow: hidden; text-align: left; } .arr-chip { display: grid; grid-template-columns: 130px 52px 1fr 100px; align-items: center; gap: 12px; padding: 10px 16px; border-bottom: 1px solid rgba(245, 166, 35, 0.1); transition: background 0.15s; } .arr-chip:last-child { border-bottom: none; } .arr-chip:hover { background: rgba(245, 166, 35, 0.04); } .arr-chip-icon { display: none; } .arr-chip-body { display: contents; } .arr-chip-label { font-family: "JetBrains Mono", monospace; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); } .arr-chip-score { font-size: 15px; font-weight: 800; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; white-space: nowrap; } .arr-chip-max { font-size: 12px; font-weight: 500; color: var(--muted-2); } .arr-chip-desc { font-size: 12px; color: var(--muted); font-style: italic; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .arr-chip-bar-wrap { background: var(--bg3); border-radius: 999px; height: 4px; overflow: hidden; } .arr-chip-bar { height: 100%; border-radius: 999px; background: var(--grad); transition: width 0.8s cubic-bezier(0.2, 0.7, 0.2, 1); box-shadow: 0 0 6px rgba(245, 166, 35, 0.4); } .arr-chip-na { opacity: 0.5; } .arr-chip-na .arr-chip-score { color: var(--muted-2); } @media (max-width: 600px) { .arr-chip { grid-template-columns: 110px 44px 1fr; } .arr-chip-bar-wrap { display: none; } } /* ============================================================ REVIEW SECTIONS (ARR: Summary / Strengths / Weaknesses / Comments / Ethics) ============================================================ */ .review-section { margin-bottom: 20px; } .review-section h3 { font-size: 15px; font-weight: 700; margin-bottom: 16px; color: var(--ink); display: flex; align-items: center; gap: 10px; } .section-icon { width: 30px; height: 30px; border-radius: 8px; background: rgba(245, 166, 35, 0.12); border: 1px solid var(--card-bd); display: grid; place-items: center; font-size: 15px; color: var(--gold-bright); flex-shrink: 0; } .review-prose { font-size: 14px; color: var(--muted); line-height: 1.7; white-space: pre-wrap; text-align: justify; hyphens: auto; } .review-list { list-style: none; display: flex; flex-direction: column; gap: 12px; counter-reset: review-item; } .review-list li { display: flex; align-items: flex-start; gap: 14px; font-size: 14px; line-height: 1.65; color: var(--muted); text-align: justify; hyphens: auto; } .review-list li::before { content: ""; flex-shrink: 0; width: 6px; height: 6px; border-radius: 50%; background: var(--gold); margin-top: 9px; } .dot-bullet { display: none; } /* ============================================================ STATUS SECTION (pending/processing) ============================================================ */ #status-section { text-align: center; padding: 48px 32px; } #status-section p { color: var(--muted); margin-top: 16px; font-size: 15px; max-width: 40ch; margin-left: auto; margin-right: auto; } #review-content { display: none; } /* ============================================================ REVIEW HEADER ============================================================ */ .review-header { display: flex; align-items: flex-start; gap: 16px; margin-bottom: 28px; flex-wrap: wrap; } .review-header > div { width: 100%; } .review-header h2 { font-size: clamp(18px, 2.2vw, 24px); font-weight: 800; color: var(--ink); line-height: 1.3; margin-bottom: 0; } .review-chip { display: inline-flex; align-items: center; gap: 5px; font-size: 12.5px; font-weight: 500; color: var(--muted); background: var(--bg2); border: 1px solid var(--card-bd); border-radius: 999px; padding: 4px 10px; } .review-chip i { font-size: 13px; } .paper-title-row { display: flex; align-items: center; gap: 10px; flex-wrap: nowrap; width: 100%; } .paper-title-row h2 { margin-bottom: 0; flex: 1; min-width: 0; } .source-downloads { display: flex; gap: 4px; flex-shrink: 0; margin-left: auto; } .src-icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border: none; background: none; color: var(--muted); font-size: 36px; text-decoration: none; transition: color 0.15s; } .src-icon-btn:hover { color: var(--gold); } .review-meta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 12px; margin-bottom: 4px; } .review-date { display: none; align-items: center; gap: 6px; font-family: 'JetBrains Mono', monospace; font-size: 11px; letter-spacing: 0.06em; color: var(--muted-2); } /* ============================================================ FEEDBACK FORM ============================================================ */ .fb-question { margin-bottom: 24px; } .fb-question-label { font-size: 14px; font-weight: 600; color: var(--ink); margin-bottom: 12px; } .fb-optional { font-weight: 400; color: var(--muted); font-size: 13px; } .fb-options { display: flex; flex-wrap: wrap; gap: 10px; } .fb-option { display: flex; align-items: center; gap: 10px; padding: 10px 18px; border: 1px solid var(--card-bd); border-radius: 10px; background: var(--card-bg); cursor: pointer; font-size: 14px; color: var(--muted); transition: border-color 0.2s, background 0.2s, color 0.2s; user-select: none; flex: 1; min-width: 100px; } .fb-option input[type="radio"] { accent-color: var(--gold); width: 15px; height: 15px; flex-shrink: 0; } .fb-option:hover { border-color: var(--gold); color: var(--ink); } .fb-option.selected { border-color: var(--gold); background: rgba(245, 166, 35, 0.1); color: var(--gold-bright); font-weight: 600; } .fb-textarea { width: 100%; min-height: 100px; padding: 12px 16px; background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: 10px; color: var(--ink); font-family: 'Be Vietnam Pro', sans-serif; font-size: 14px; line-height: 1.6; resize: vertical; transition: border-color 0.2s; outline: none; } .fb-textarea:focus { border-color: var(--gold); } .fb-textarea::placeholder { color: var(--muted-2); } .fb-char-count { text-align: right; font-size: 12px; color: var(--muted-2); margin-top: 6px; font-family: 'JetBrains Mono', monospace; } .fb-disclaimer { text-align: center; font-size: 12px; color: var(--muted-2); margin-top: 12px; } .fb-success { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 32px 0 8px; color: var(--gold-bright); } .fb-success i { font-size: 40px; } .fb-success p { font-size: 16px; font-weight: 600; color: var(--ink); } /* ============================================================ FOOTER ============================================================ */ footer { text-align: center; padding: 28px; color: var(--muted-2); font-size: 13px; border-top: 1px solid var(--line); font-family: "JetBrains Mono", monospace; letter-spacing: 0.08em; } footer a { color: var(--gold-bright); text-decoration: none; } footer a:hover { text-decoration: underline; } /* ============================================================ ANIMATIONS ============================================================ */ @keyframes rise { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: none; } } .fade-in { animation: rise 0.55s cubic-bezier(0.2, 0.7, 0.2, 1) both; } .fade-in:nth-child(2) { animation-delay: 0.08s; } .fade-in:nth-child(3) { animation-delay: 0.16s; } .fade-in:nth-child(4) { animation-delay: 0.24s; } /* ============================================================ RESPONSIVE ============================================================ */ @media (max-width: 600px) { .card { padding: 22px 18px; } main { padding: 36px 0 64px; } .hero h1 { font-size: 28px; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; } } /* ============================================================ ADMIN DASHBOARD ============================================================ */ .admin-table-wrap { width: 100%; overflow-x: auto; margin-top: 12px; } .admin-table { width: 100%; border-collapse: collapse; font-size: 13.5px; } .admin-table thead th { text-align: left; padding: 10px 12px; font-family: "JetBrains Mono", monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--card-bd); white-space: nowrap; } .admin-table td { padding: 10px 12px; border-bottom: 1px solid var(--line); color: var(--ink); vertical-align: middle; } .admin-table tbody tr:hover { background: rgba(245, 166, 35, 0.04); } .admin-input { padding: 6px 8px; border: 1px solid var(--card-bd); border-radius: 8px; background: var(--bg2); color: var(--ink); font-size: 13px; font-family: "Be Vietnam Pro", sans-serif; } .admin-input:focus { outline: none; border-color: var(--gold); } .admin-input-sm { width: 72px; } .admin-btn-sm { width: auto; padding: 7px 12px; } .admin-filters { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 12px; } .admin-filters input[type="text"], .admin-filters select { width: auto; flex: 1 1 200px; padding: 9px 12px; border: 1px solid var(--card-bd); border-radius: 10px; background: var(--bg2); color: var(--ink); } .admin-filters .btn { width: auto; } /* Cost-over-time line chart */ .chart-controls { display: flex; flex-direction: column; gap: 10px; margin: 14px 0 10px; } .chart-presets { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } .chart-preset { padding: 5px 12px; border-radius: 8px; border: 1px solid var(--card-bd); background: var(--bg2); color: var(--muted); font-size: 12px; font-family: "JetBrains Mono", monospace; cursor: pointer; transition: border-color 0.15s, color 0.15s, background 0.15s; } .chart-preset:hover { border-color: var(--gold); color: var(--ink); } .chart-preset.active { background: rgba(245,166,35,0.15); border-color: var(--gold); color: var(--gold-bright); font-weight: 700; } .chart-preset-sep { width: 1px; height: 18px; background: var(--card-bd); margin: 0 2px; } .chart-custom { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .chart-wrap { position: relative; margin: 8px 0 4px; } .cost-svg { width: 100%; height: 220px; display: block; overflow: visible; } .chart-dot { cursor: crosshair; } .chart-tooltip { display: none; position: absolute; background: rgba(20, 20, 28, 0.75); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); border: 1px solid rgba(245, 166, 35, 0.3); border-radius: 6px; padding: 5px 10px; font-size: 12px; font-family: "JetBrains Mono", monospace; color: var(--gold-bright); pointer-events: none; white-space: nowrap; box-shadow: 0 4px 16px rgba(0,0,0,.25); line-height: 1.6; z-index: 10; } /* keep old bar-chart classes in case referenced elsewhere */ .admin-bar-val { font-family: "JetBrains Mono", monospace; font-size: 12px; color: var(--gold-bright); text-align: right; } .admin-provider-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; margin-top: 12px; } /* Provider bar chart */ .provider-bars { display: flex; flex-direction: column; gap: 10px; margin-top: 14px; } .provider-bar-row { display: grid; grid-template-columns: 100px 1fr 80px 44px; align-items: center; gap: 10px; cursor: default; } .provider-bar-name { font-size: 12px; color: var(--ink); text-transform: capitalize; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .provider-bar-track { background: var(--bg3); border-radius: 999px; height: 10px; overflow: hidden; } .provider-bar-fill { display: block; height: 100%; border-radius: 999px; transition: width 0.4s ease; } .provider-bar-val { font-family: "JetBrains Mono", monospace; font-size: 12px; text-align: right; white-space: nowrap; } .provider-bar-share { font-size: 11px; color: var(--muted); text-align: right; font-family: "JetBrains Mono", monospace; } /* ============================================================ SUBMISSION HISTORY PANEL ============================================================ */ .subs-card { border: 1px solid var(--card-bd); border-radius: var(--radius); background: var(--card-bg); box-shadow: var(--shadow); margin-bottom: 20px; position: relative; overflow: hidden; } /* Top accent line */ .subs-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--grad); border-radius: var(--radius) var(--radius) 0 0; } /* Corner glow */ .subs-card::after { content: ""; position: absolute; right: -30px; bottom: -30px; width: 120px; height: 120px; border-radius: 50%; background: radial-gradient(circle, rgba(245, 166, 35, 0.08), transparent 70%); pointer-events: none; } /* Header row: icon+title on left, toolbar on right */ .subs-card-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 22px 28px 18px; flex-wrap: wrap; } .subs-card-title-group { display: flex; align-items: center; gap: 14px; flex-shrink: 0; } .subs-card-icon { width: 40px; height: 40px; border-radius: 11px; background: rgba(245, 166, 35, 0.1); border: 1px solid rgba(245, 166, 35, 0.22); display: grid; place-items: center; font-size: 19px; color: var(--gold-bright); flex-shrink: 0; } .subs-card-title { font-size: 15px; font-weight: 700; color: var(--ink); line-height: 1.2; } .subs-card-subtitle { font-size: 12px; color: var(--muted-2); margin-top: 2px; line-height: 1.3; } .subs-card-divider { height: 1px; background: var(--line); margin: 0 28px; } /* Toolbar moves inside header — override margin */ .subs-card-header .sub-toolbar { margin-bottom: 0; flex-wrap: nowrap; } /* Table and pagination padding to match new layout */ .subs-card #submissions-loading, .subs-card #submissions-empty, .subs-card #submissions-noresult, .subs-card #submissions-error, .subs-card #submissions-list { padding: 0 28px 24px; } .subs-card #submissions-loading, .subs-card #submissions-empty, .subs-card #submissions-noresult { padding-top: 32px; } @media (max-width: 680px) { .subs-card-header { flex-direction: column; align-items: flex-start; padding: 18px 20px 14px; } .subs-card-header .sub-toolbar { width: 100%; } .subs-card-divider { margin: 0 20px; } .subs-card #submissions-loading, .subs-card #submissions-empty, .subs-card #submissions-noresult, .subs-card #submissions-error, .subs-card #submissions-list { padding: 0 20px 20px; } } /* ============================================================ MY SUBMISSIONS TABLE ============================================================ */ .sub-table { width: 100%; border-collapse: collapse; font-size: 13.5px; } .sub-table thead th { text-align: left; padding: 10px 12px; font-family: "JetBrains Mono", monospace; font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); border-bottom: 1px solid var(--card-bd); white-space: nowrap; } .sub-table td { padding: 12px 12px; border-bottom: 1px solid var(--line); vertical-align: middle; } .sub-table tbody tr:last-child td { border-bottom: none; } .sub-table tbody tr:hover { background: rgba(245,166,35,.04); } .sub-title { font-weight: 600; max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .sub-date { color: var(--muted); font-size: 13px; white-space: nowrap; } .sub-score { font-size: 20px; font-weight: 700; color: var(--gold); } .sub-score-max { font-size: 13px; font-weight: 400; color: var(--muted); } .sub-view-btn { padding: 7px 14px; font-size: 13px; width: auto; margin-top: 0; text-decoration: none; } .sub-reject-btn.active { background: rgba(239,68,68,0.08); border-color: rgba(239,68,68,0.35); color: #ef4444; } /* Rejection reason modal */ .reject-modal-box { max-width: 440px; } .reject-modal-reason { font-size: 14px; color: var(--muted); line-height: 1.65; padding: 16px; background: rgba(239, 68, 68, 0.06); border: 1px solid rgba(239, 68, 68, 0.18); border-radius: 10px; margin-top: 4px; text-align: justify; hyphens: auto; } .reject-modal-box a { text-decoration: none; } /* Toolbar: search + filter */ .sub-toolbar { display: flex; gap: 10px; margin-bottom: 16px; flex-wrap: wrap; } .sub-search-wrap { position: relative; flex: 1; min-width: 180px; } .sub-search-icon { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--muted-2); font-size: 15px; pointer-events: none; width: 16px; text-align: center; } .sub-search { width: 100%; padding: 9px 12px; border: 1px solid var(--card-bd); border-radius: 10px; background: var(--bg2); color: var(--ink); font-family: "Be Vietnam Pro", sans-serif; font-size: 14px; outline: none; transition: border-color 0.2s; } .sub-search:focus { border-color: var(--gold); } .sub-search::placeholder { color: var(--muted-2); } .sub-filter { padding: 9px 36px 9px 12px; border: 1px solid var(--card-bd); border-radius: 10px; background: var(--bg2); color: var(--ink); font-family: "Be Vietnam Pro", sans-serif; font-size: 14px; outline: none; cursor: pointer; transition: border-color 0.2s; appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24'%3E%3Cpath fill='%23b9a784' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; } .sub-filter:focus { border-color: var(--gold); } [data-theme="light"] .sub-filter { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24'%3E%3Cpath fill='%236b5c3e' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E"); } /* Pagination */ .sub-pagination { display: flex; align-items: center; justify-content: space-between; margin-top: 16px; flex-wrap: wrap; gap: 8px; } .sub-page-info { font-size: 13px; color: var(--muted); font-family: "JetBrains Mono", monospace; } .sub-page-btns { display: flex; gap: 4px; } .sub-page-btn { min-width: 32px; height: 32px; padding: 0 8px; border: 1px solid var(--card-bd); border-radius: 8px; background: var(--card-bg); color: var(--muted); font-size: 13px; font-family: "Be Vietnam Pro", sans-serif; cursor: pointer; display: grid; place-items: center; transition: background 0.15s, border-color 0.15s, color 0.15s; } .sub-page-btn:hover:not(:disabled) { border-color: var(--gold); color: var(--ink); } .sub-page-btn.active { background: rgba(245, 166, 35, 0.15); border-color: var(--gold); color: var(--gold-bright); font-weight: 700; } .sub-page-btn:disabled { opacity: 0.35; cursor: default; } .sub-page-ellipsis { display: grid; place-items: center; height: 32px; padding: 0 4px; font-size: 13px; color: var(--muted); user-select: none; } /* ============================================================ SUBMISSION TRACKER CARD ============================================================ */ .tracker-card { position: relative; border-radius: var(--radius); padding: 28px 32px 24px; margin-bottom: 24px; overflow: hidden; background: linear-gradient(135deg, rgba(245, 166, 35, 0.08) 0%, rgba(245, 166, 35, 0.03) 50%, rgba(245, 166, 35, 0.06) 100% ); border: 1px solid rgba(245, 166, 35, 0.28); box-shadow: 0 0 0 1px rgba(245, 166, 35, 0.06), var(--shadow); } /* Decorative corner glow */ .tracker-card::before { content: ""; position: absolute; top: -40px; right: -40px; width: 160px; height: 160px; border-radius: 50%; background: radial-gradient(circle, rgba(245, 166, 35, 0.12) 0%, transparent 70%); pointer-events: none; } .tracker-card.failed { background: linear-gradient(135deg, rgba(239, 68, 68, 0.07) 0%, rgba(239, 68, 68, 0.02) 100% ); border-color: rgba(239, 68, 68, 0.28); box-shadow: 0 0 0 1px rgba(239, 68, 68, 0.06), var(--shadow); } .tracker-card.failed::before { background: radial-gradient(circle, rgba(239, 68, 68, 0.1) 0%, transparent 70%); } .tracker-card.completed { background: linear-gradient(135deg, rgba(45, 198, 83, 0.07) 0%, rgba(45, 198, 83, 0.02) 100% ); border-color: rgba(45, 198, 83, 0.28); box-shadow: 0 0 0 1px rgba(45, 198, 83, 0.06), var(--shadow); } .tracker-card.completed::before { background: radial-gradient(circle, rgba(45, 198, 83, 0.1) 0%, transparent 70%); } /* Header row */ .tracker-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 28px; } .tracker-header-left { display: flex; flex-direction: column; gap: 6px; min-width: 0; } .tracker-header-right { flex-shrink: 0; display: flex; align-items: center; } .tracker-kicker { display: flex; align-items: center; gap: 8px; font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--gold); } .tracker-pulse { width: 7px; height: 7px; border-radius: 50%; background: var(--gold); flex-shrink: 0; animation: tracker-pulse 2s ease-in-out infinite; } @keyframes tracker-pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(245, 166, 35, 0.5); } 50% { opacity: 0.7; box-shadow: 0 0 0 5px rgba(245, 166, 35, 0); } } .tracker-card.failed .tracker-pulse { background: #ef4444; animation: none; } .tracker-card.completed .tracker-pulse { background: var(--success); animation: none; box-shadow: 0 0 0 3px rgba(45, 198, 83, 0.2); } .tracker-title { font-size: 16px; font-weight: 700; color: var(--ink); line-height: 1.35; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 540px; } .tracker-in-progress { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--gold); background: rgba(245, 166, 35, 0.1); border: 1px solid rgba(245, 166, 35, 0.25); border-radius: 20px; padding: 5px 12px; } .tracker-failed-msg { display: flex; align-items: center; gap: 6px; font-size: 13px; color: #ef4444; } /* Rejected body (below header when stepper is hidden) */ .tracker-rejected-body { display: flex; flex-direction: column; gap: 12px; } .tracker-rejected-msg { display: flex; align-items: flex-start; gap: 10px; font-size: 13px; color: #ef4444; line-height: 1.55; } .tracker-rejected-msg i { font-size: 18px; flex-shrink: 0; margin-top: 1px; } .tracker-card a { text-decoration: none; } /* Rejected/failed message area */ #tracker-message { margin-bottom: 4px; } /* Stepper */ .tracker-stepper { display: flex; align-items: flex-start; gap: 0; overflow-x: auto; padding: 4px 2px 2px; } .ts-step { display: flex; flex-direction: column; align-items: center; gap: 8px; min-width: 88px; flex-shrink: 0; } .ts-dot { position: relative; width: 40px; height: 40px; border-radius: 50%; border: 2px solid rgba(245, 166, 35, 0.18); background: rgba(245, 166, 35, 0.04); display: grid; place-items: center; font-size: 17px; color: var(--muted-2); transition: border-color 0.25s, background 0.25s, color 0.25s; flex-shrink: 0; } .ts-label { font-size: 11px; color: var(--muted-2); text-align: center; line-height: 1.3; max-width: 88px; transition: color 0.25s, font-weight 0.15s; } .ts-connector { flex: 1; height: 2px; background: rgba(245, 166, 35, 0.14); margin-top: 19px; min-width: 16px; transition: background 0.35s; } /* Done step */ .ts-step.done .ts-dot { background: rgba(245, 166, 35, 0.14); border-color: var(--gold); color: var(--gold-bright); } .ts-step.done .ts-label { color: var(--gold); } .ts-connector.done { background: var(--gold); } /* Active step */ .ts-step.active .ts-dot { background: var(--gold); border-color: var(--gold); color: #fff; box-shadow: 0 0 0 4px rgba(245, 166, 35, 0.18); } .ts-step.active .ts-dot::before { content: ""; position: absolute; inset: -6px; border-radius: 50%; border: 2px solid transparent; border-top-color: var(--gold); border-right-color: rgba(245, 166, 35, 0.35); animation: ts-spin 1s linear infinite; } .ts-step.active .ts-label { color: var(--ink); font-weight: 700; } @keyframes ts-spin { to { transform: rotate(360deg); } } /* Failed / completed active dot */ .tracker-card.failed .ts-step.active .ts-dot { background: #ef4444; border-color: #ef4444; box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.18); } .tracker-card.failed .ts-step.active .ts-dot::before { display: none; } .tracker-card.completed .ts-step.active .ts-dot { background: var(--success); border-color: var(--success); box-shadow: 0 0 0 4px rgba(45, 198, 83, 0.18); } .tracker-card.completed .ts-step.active .ts-dot::before { display: none; } .tracker-card.completed .ts-connector.done { background: var(--success); } .tracker-card.completed .ts-step.done .ts-dot { background: rgba(45, 198, 83, 0.14); border-color: var(--success); color: var(--success); } .tracker-card.completed .ts-step.done .ts-label { color: var(--success); } /* ============================================================ REVIEW BODY LAYOUT — sticky ToC + sections ============================================================ */ .review-body-layout { display: grid; grid-template-columns: 180px 1fr; gap: 24px; align-items: start; } /* Sticky ToC */ .review-toc { position: sticky; top: 80px; /* below fixed header */ background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: var(--radius); padding: 16px 14px; text-align: left; } .toc-label { font-family: "Be Vietnam Pro", sans-serif; font-size: 13px; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--ink); margin-bottom: 10px; padding-left: 10px; } .review-toc nav { display: flex; flex-direction: column; align-items: stretch; gap: 2px; } .toc-item { display: block; padding: 7px 10px; border-radius: 8px; font-size: 13px; font-weight: 500; color: var(--muted); text-decoration: none; text-align: left; transition: background 0.15s, color 0.15s; border: none; } .toc-item:hover { background: rgba(245, 166, 35, 0.08); color: var(--ink); } .toc-item.active { background: rgba(245, 166, 35, 0.12); color: var(--gold-bright); font-weight: 700; } .review-sections { min-width: 0; } @media (max-width: 720px) { .review-body-layout { grid-template-columns: 1fr; } .review-toc { position: static; display: flex; align-items: center; gap: 12px; padding: 10px 14px; overflow-x: auto; } .toc-label { margin-bottom: 0; white-space: nowrap; } .review-toc nav { flex-direction: row; flex-wrap: nowrap; gap: 4px; } .toc-item { white-space: nowrap; } } /* ============================================================ FEEDBACK MODAL (step-by-step) ============================================================ */ .fb-modal-box { max-width: 460px; padding: 28px 28px 28px; } .fb-modal-header { display: flex; align-items: flex-start; gap: 14px; margin-bottom: 20px; } .fb-modal-meta { flex: 1; } .fb-modal-meta h3 { font-size: 17px; font-weight: 700; margin: 0 0 3px; } .fb-step-counter { font-family: "JetBrains Mono", monospace; font-size: 11px; color: var(--muted-2); letter-spacing: 0.06em; margin: 0; } .fb-modal-close { flex-shrink: 0; width: 32px; height: 32px; border: none; background: transparent; color: var(--muted); cursor: pointer; display: grid; place-items: center; font-size: 20px; border-radius: 8px; transition: background 0.15s, color 0.15s; margin-left: auto; } .fb-modal-close:hover { background: rgba(245, 166, 35, 0.1); color: var(--ink); } .fb-progress-bar-wrap { height: 3px; background: var(--bg3); border-radius: 999px; margin-bottom: 28px; overflow: hidden; } .fb-progress-bar { height: 100%; border-radius: 999px; background: var(--grad); width: 0%; transition: width 0.4s cubic-bezier(0.2, 0.7, 0.2, 1); box-shadow: 0 0 6px rgba(245, 166, 35, 0.4); } /* Step container */ .fb-steps { position: relative; } .fb-step { display: none; animation: fb-slide-in 0.3s cubic-bezier(0.2, 0.7, 0.2, 1) both; } .fb-step.active { display: block; } @keyframes fb-slide-in { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } } .fb-step-question { font-size: 15px; font-weight: 600; color: var(--ink); line-height: 1.5; margin-bottom: 14px; } .fb-optional { font-weight: 400; color: var(--muted); font-size: 13px; } /* Choice chips */ .fb-chip-group { display: flex; flex-wrap: wrap; gap: 10px; } .fb-chip { padding: 10px 20px; border: 1px solid var(--card-bd); border-radius: 99px; background: var(--card-bg); font-family: "Be Vietnam Pro", sans-serif; font-size: 14px; font-weight: 500; color: var(--muted); cursor: pointer; transition: border-color 0.18s, background 0.18s, color 0.18s, transform 0.15s; } .fb-chip:hover { border-color: var(--gold); color: var(--ink); background: rgba(245, 166, 35, 0.07); } .fb-chip.selected { border-color: var(--gold); background: rgba(245, 166, 35, 0.14); color: var(--gold-bright); font-weight: 700; transform: scale(1.03); } /* Step 4 textarea */ .fb-textarea { width: 100%; min-height: 90px; padding: 12px 14px; background: var(--bg2); border: 1px solid var(--card-bd); border-radius: 10px; color: var(--ink); font-family: "Be Vietnam Pro", sans-serif; font-size: 14px; line-height: 1.6; resize: vertical; transition: border-color 0.2s; outline: none; } .fb-textarea:focus { border-color: var(--gold); } .fb-textarea::placeholder { color: var(--muted-2); } .fb-char-count { text-align: right; font-size: 12px; color: var(--muted-2); margin-top: 5px; font-family: "JetBrains Mono", monospace; } /* Success step */ .fb-success-step .fb-success { display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 20px 0 8px; text-align: center; color: var(--gold-bright); } .fb-success-step .fb-success i { font-size: 44px; } .fb-success-step .fb-success p { font-size: 17px; font-weight: 700; color: var(--ink); margin: 0; } .fb-success-sub { font-size: 13px; color: var(--muted); }