@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); } /* Dark/Light toggle button */ .theme-btn { width: 38px; height: 38px; border-radius: 10px; border: 1px solid var(--card-bd); background: var(--card-bg); color: var(--gold-bright); cursor: pointer; display: grid; place-items: center; transition: all 0.2s; flex-shrink: 0; } .theme-btn:hover { background: rgba(245, 166, 35, 0.12); border-color: var(--gold); } .theme-btn i { font-size: 18px; line-height: 1; transition: opacity 0.2s; } .theme-btn .icon-sun { display: none; } .theme-btn .icon-moon { display: block; } [data-theme="light"] .theme-btn .icon-sun { display: block; } /* Signed-in 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); } /* 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; } [data-theme="light"] .theme-btn .icon-moon { display: none; } /* ============================================================ 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; } .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; } @keyframes spin { to { transform: rotate(360deg); } } /* ============================================================ OVERALL SCORE ============================================================ */ /* ============================================================ OVERALL ASSESSMENT BANNER (ARR style) ============================================================ */ .overall-score { text-align: center; padding: 40px 32px 32px; background: linear-gradient( 135deg, rgba(245, 166, 35, 0.15) 0%, rgba(76, 201, 240, 0.08) 100% ); border: 1px solid var(--gold); border-radius: var(--radius); margin-bottom: 24px; box-shadow: 0 0 60px rgba(245, 166, 35, 0.12); } .overall-score .os-label { font-family: "JetBrains Mono", monospace; font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--muted); margin-bottom: 12px; } .os-rating-row { display: flex; align-items: baseline; justify-content: center; gap: 4px; margin-bottom: 6px; } .overall-score .os-number { font-size: 80px; font-weight: 800; line-height: 1; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; } .overall-score .os-max { font-size: 28px; color: var(--muted); font-weight: 600; } .os-label-text { display: block; font-size: 15px; font-weight: 600; color: var(--gold-bright); margin-bottom: 24px; letter-spacing: 0.01em; } /* ARR score chips row */ .arr-scores-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 8px; } @media (max-width: 700px) { .arr-scores-row { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 420px) { .arr-scores-row { grid-template-columns: 1fr; } } .arr-chip { background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: 12px; padding: 14px 16px 10px; text-align: left; transition: border-color 0.2s; } .arr-chip:hover { border-color: var(--gold); } .arr-chip-icon { font-size: 18px; color: var(--gold-bright); display: block; margin-bottom: 8px; } .arr-chip-body { display: flex; flex-direction: column; gap: 2px; margin-bottom: 10px; } .arr-chip-label { font-family: "JetBrains Mono", monospace; font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted-2); } .arr-chip-score { font-size: 26px; font-weight: 800; line-height: 1; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; } .arr-chip-max { font-size: 13px; font-weight: 600; color: var(--muted-2); } .arr-chip-desc { font-size: 11px; color: var(--muted); font-style: italic; } .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); } /* ============================================================ 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; } .review-list { list-style: none; display: flex; flex-direction: column; gap: 10px; } .review-list li { display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; border: 1px solid var(--card-bd); border-radius: 10px; background: var(--card-bg); font-size: 14px; line-height: 1.55; color: var(--muted); transition: border-color 0.2s; } .review-list li:hover { border-color: var(--gold); } .dot-bullet { flex-shrink: 0; width: 6px; height: 6px; border-radius: 50%; background: var(--gold); margin-top: 7px; } /* ============================================================ 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 h2 { font-size: 20px; font-weight: 700; color: var(--ink); margin-bottom: 8px; } .review-meta { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; 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 CSS bar chart */ .admin-chart { display: flex; flex-direction: column; gap: 6px; margin: 14px 0; } .admin-bar-row { display: grid; grid-template-columns: 56px 1fr 84px; align-items: center; gap: 10px; } .admin-bar-label { font-family: "JetBrains Mono", monospace; font-size: 11px; color: var(--muted-2); } .admin-bar-track { background: var(--bg3); border-radius: 999px; height: 10px; overflow: hidden; } .admin-bar-fill { display: block; height: 100%; border-radius: 999px; background: var(--grad); box-shadow: 0 0 6px rgba(245, 166, 35, 0.4); } .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; }