app / frontend /src /styles.css
Aissugur Kurganbekov
Claude Fable 5
Trust pack from adversarial audit: disclaimers and demo hygiene
b059712
Raw History Blame Contribute Delete
57.3 kB
/* ========================================================================== * * Tamga β€” design system * Premium, trustworthy aesthetic: ink-on-paper neutral base + a deep-teal accent * and an amber "seal" accent (tamga = seal/stamp). Pure CSS (no framework). * ========================================================================== */ :root { /* Surfaces β€” warm "paper" canvas; solid fills */ --bg: #fbfaf6; --surface-1: #ffffff; --surface-2: #f4f2ec; --glass: rgba(255, 255, 255, 0.72); /* Text β€” Tamga ink (AA/AAA on paper) */ --text: #14202b; --text-dim: #4a5568; /* AA on paper */ --text-faint: #5f6975; /* AA on surface-2 tints */ /* Lines β€” ink low-alpha so hairlines read on the paper bg */ --border: rgba(20, 32, 43, 0.08); --border-strong: rgba(20, 32, 43, 0.16); /* Accent β€” Tamga deep teal (trust + modern) */ --accent: #0e7c7b; --accent-2: #14938f; --accent-grad: linear-gradient(135deg, #0f8280 0%, #0e7c7b 100%); /* light stop β‰₯4.5:1 under white 14px text */ --accent-soft: rgba(14, 124, 123, 0.10); --accent-text: #0b6362; /* teal for small text on --accent-soft, β‰₯4.5:1 */ --accent-border: rgba(14, 124, 123, 0.28); --accent-border-strong: rgba(14, 124, 123, 0.45); --navy: #0e1b2e; /* THE dark-band navy β€” hero, about, cta, proof-band, auth, theme-color */ --r-xs: 6px; /* micro ranks/badges */ --track-display: -0.025em; /* β‰₯28px display */ --track-heading: -0.01em; /* 18-22px headings */ --track-label: 0.08em; /* uppercase labels/eyebrows */ --space-10: 40px; --space-14: 56px; /* section rhythm unit */ --glow: 0 0 0 1px rgba(14, 124, 123, 0.30), 0 8px 24px rgba(14, 124, 123, 0.26); /* Semantic β€” darkened to pass AA as small text on white */ --success: #0f8050; --success-soft: rgba(15, 128, 80, 0.12); --success-text: #0b6b42; /* success for small text on --success-soft, β‰₯4.5:1 */ --warn: #975f00; --warn-soft: rgba(151, 95, 0, 0.12); --danger: #b3273c; --danger-soft: rgba(179, 39, 60, 0.12); /* Radius β€” RADIUS LOCK: outer cards/containers = --r-lg/--r-xl; controls, inputs, icon tiles = --r-md; chips, small icons = --r-sm; rank squares/micro badges = --r-xs; pills (badges, progress tracks) = --r-pill. No literal radius values outside tokens (landing .st-* styles in components/landing/ exempt). */ --r-xl: 22px; --r-lg: 16px; --r-md: 12px; --r-sm: 9px; --r-pill: 999px; /* Shadow / elevation scale */ --shadow-sm: 0 1px 2px rgba(20, 32, 43, 0.06), 0 1px 1px rgba(20, 32, 43, 0.04); --shadow-md: 0 12px 32px rgba(20, 32, 43, 0.10), 0 2px 8px rgba(20, 32, 43, 0.06); --shadow-accent: 0 6px 18px rgba(14, 124, 123, 0.28); /* single accent elevation */ /* Type scale */ --text-xs: 11px; --text-sm: 12px; --text-base: 14px; --text-md: 15px; --text-lg: 18px; --text-xl: 22px; --text-2xl: 28px; /* Spacing scale (4px base) */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; /* Z-index scale */ --z-base: 0; --z-sticky: 20; --z-overlay: 40; --z-modal: 100; /* Motion */ --dur-fast: 0.12s; --dur-base: 0.2s; --dur-slow: 0.45s; --ease: cubic-bezier(0.2, 0.7, 0.2, 1); /* Fonts */ --font-body: "Geist Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --font-display: "Playfair Display Variable", Georgia, serif; --font-mono: "Geist Mono Variable", "SFMono-Regular", ui-monospace, Menlo, Consolas, monospace; /* Redesign: extra accent + ambient tokens (Tamga) */ --accent-3: #c77d2e; /* amber "seal" accent (tamga/stamp) */ --accent-grad-hero: linear-gradient(180deg, #14202b 0%, #0e7c7b 100%); /* clipped headline: inkβ†’teal */ --accent-cyan: #0e7c7b; /* SVG connector / ticks */ --glow-volumetric: 0 40px 90px -28px rgba(20, 32, 43, 0.18); --ease-out: cubic-bezier(0.16, 1, 0.3, 1); --mesh-1: rgba(14, 124, 123, 0.06); /* faint ambient washes on paper */ --mesh-2: rgba(199, 125, 46, 0.05); --mesh-3: rgba(14, 124, 123, 0.04); --grid-line: rgba(20, 32, 43, 0.04); /* ink hairline grid on paper */ --dur-reveal: 0.5s; } * { box-sizing: border-box; } html, body, #root { height: 100%; } html { scroll-behavior: smooth; } body { margin: 0; position: relative; font-family: var(--font-body); font-size: 16px; line-height: 1.5; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; color: var(--text); background: var(--bg); overflow-x: hidden; } /* App chrome stays non-selectable; content (answers, evidence, findings, HS codes) is copyable β€” core product workflow. */ .sidebar, .topbar, .btn, .chips, .seg, .audit-types { user-select: none; -webkit-user-select: none; } /* keep typing/selection working in form fields */ input, textarea { user-select: text; -webkit-user-select: text; } /* Drifting gradient-mesh */ body::before { content: ""; position: fixed; inset: 0; z-index: -2; pointer-events: none; background: radial-gradient(60vw 50vh at 80% -10%, var(--mesh-1), transparent 60%), radial-gradient(50vw 44vh at 8% 4%, var(--mesh-2), transparent 55%), radial-gradient(46vw 38vh at 50% 120%, var(--mesh-3), transparent 60%); background-size: 160% 160%, 150% 150%, 150% 150%; animation: meshDrift 26s ease-in-out infinite alternate; } /* Fine hairline grid, radial-masked to fade at the edges */ body::after { content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none; background-image: linear-gradient(var(--grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--grid-line) 1px, transparent 1px); background-size: 64px 64px; -webkit-mask-image: radial-gradient(120vw 90vh at 50% 30%, #000 30%, transparent 80%); mask-image: radial-gradient(120vw 90vh at 50% 30%, #000 30%, transparent 80%); } @keyframes meshDrift { from { background-position: 0% 0%, 0% 0%, 0% 100%; } to { background-position: 100% 100%, 100% 0%, 50% 0%; } } h1, h2 { margin: 0; font-family: var(--font-display); letter-spacing: var(--track-display); font-weight: 700; line-height: 1.15; } h3, h4 { margin: 0; font-family: var(--font-body); letter-spacing: 0; font-weight: 600; line-height: 1.3; } /* Visible keyboard focus on every interactive element (was missing) */ :where(button, a, input, textarea, select, [tabindex]):focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-xs); } :where(button, a, [tabindex]):focus:not(:focus-visible) { outline: none; } a { color: inherit; } code { font-family: var(--font-mono); font-size: 0.86em; background: var(--surface-2); padding: 1px 6px; border-radius: var(--r-xs); border: 1px solid var(--border); } ::selection { background: rgba(14, 124, 123, 0.25); } /* Scrollbar */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-thumb { background: rgba(20, 32, 43, 0.18); border-radius: 10px; border: 2px solid transparent; background-clip: content-box; } ::-webkit-scrollbar-thumb:hover { background: rgba(20, 32, 43, 0.30); background-clip: content-box; } /* Skip link β€” off-screen until keyboard focus (a11y) */ .skip-link { position: absolute; left: -9999px; z-index: var(--z-modal); } .skip-link:focus-visible { left: 16px; top: 12px; background: var(--surface-1); padding: 10px 16px; border-radius: var(--r-sm); box-shadow: var(--shadow-md); } /* ===================== App shell / layout ================================= */ .app-shell { display: grid; grid-template-columns: 252px minmax(0, 1fr); min-height: 100vh; min-height: 100dvh; /* avoid mobile browser-chrome clipping */ } .main { min-width: 0; width: 100%; max-width: 1400px; /* cap line length on ultra-wide displays */ margin-inline: auto; padding: 34px clamp(20px, 4vw, 56px) 72px; } .view-head { margin-bottom: 26px; } .view-head h1 { font-size: 26px; } .view-head p { margin: 6px 0 0; color: var(--text-dim); font-size: 15px; } /* ===================== Sidebar ============================================ */ .sidebar { position: sticky; top: 0; height: 100vh; height: 100dvh; display: flex; flex-direction: column; padding: 22px 16px; gap: 6px; background: var(--glass); backdrop-filter: blur(22px); -webkit-backdrop-filter: blur(22px); border-right: 1px solid var(--border); } .brand { display: flex; align-items: center; gap: 11px; padding: 6px 10px 18px; } .brand-name { font-weight: 700; font-size: 16px; letter-spacing: -0.02em; } .brand-name span { color: var(--text-faint); font-weight: 600; } .nav { display: flex; flex-direction: column; gap: 3px; } .nav-item { display: flex; align-items: center; gap: 11px; min-height: 40px; padding: 9px 11px; border-radius: var(--r-sm); color: var(--text-dim); font-size: 14px; font-weight: 500; cursor: pointer; border: none; background: none; width: 100%; text-align: left; transition: background var(--dur-base) var(--ease), color var(--dur-base) var(--ease), transform var(--dur-fast) var(--ease); } .nav-item:hover { background: var(--surface-1); color: var(--text); } .nav-item:active { transform: translateY(1px); } .nav-item.active { background: var(--surface-2); color: var(--text); box-shadow: inset 0 0 0 1px var(--border); } .nav-item .ico { color: currentColor; opacity: 0.9; flex: none; } .sidebar-foot { margin-top: auto; padding: 12px 11px 4px; border-top: 1px solid var(--border); font-size: var(--text-sm); color: var(--text-faint); display: flex; align-items: center; gap: 8px; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); box-shadow: 0 0 0 3px var(--success-soft); } .status-dot.off { background: var(--danger); box-shadow: 0 0 0 3px var(--danger-soft); } /* ===================== Buttons ============================================ */ .btn { --bd: var(--border-strong); display: inline-flex; align-items: center; justify-content: center; gap: 8px; font-family: inherit; font-size: 14px; font-weight: 600; line-height: 1; padding: 11px 18px; border-radius: var(--r-sm); border: 1px solid var(--bd); background: var(--surface-2); color: var(--text); cursor: pointer; min-height: 40px; white-space: nowrap; transition: transform var(--dur-fast) var(--ease), background var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease), box-shadow 0.25s var(--ease), opacity var(--dur-base); } .btn:hover { background: color-mix(in srgb, var(--surface-2) 70%, #fff); border-color: var(--border-strong); transform: translateY(-1px); } .btn:active { transform: translateY(1px); } .btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; } .btn--primary { background: var(--accent-grad); border-color: transparent; color: #fff; box-shadow: var(--shadow-sm), var(--shadow-accent); } .btn--primary:hover { box-shadow: var(--shadow-md), var(--glow); background: var(--accent-grad); } .btn--primary:disabled { opacity: 0.62; } /* keep white label legible on gradient */ .btn--ghost { background: transparent; border-color: var(--border); } .btn--ghost:hover { background: var(--surface-1); } .btn--danger { background: transparent; border-color: transparent; color: var(--danger); min-height: 36px; padding: 8px 10px; } .btn--danger:hover { background: var(--danger-soft); } .btn--sm { min-height: 36px; padding: 8px 13px; font-size: 13px; } .btn--lg { padding: 14px 24px; font-size: 15px; } .btn--block { width: 100%; } /* Tertiary text button */ .link-btn { background: none; border: 0; padding: 0; font: inherit; font-size: 13px; font-weight: 600; color: var(--accent); cursor: pointer; transition: color var(--dur-base) var(--ease); } .link-btn:hover { text-decoration: underline; } .link-btn:active { transform: translateY(1px); } .btn .spin { width: 15px; height: 15px; border: 2px solid currentColor; border-top-color: transparent; opacity: 0.75; border-radius: 50%; animation: spin 0.7s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ===================== Card / Badge ======================================= */ .card { background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 22px; transition: border-color 0.2s var(--ease), background 0.2s var(--ease), transform 0.2s var(--ease); } .card--glass { background: var(--glass); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); } .card--hover:hover { border-color: var(--border-strong); background: var(--surface-2); } .badge { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; padding: 3px 10px; border-radius: var(--r-pill); border: 1px solid var(--border); color: var(--text-dim); background: var(--surface-1); white-space: nowrap; } .badge--accent { color: var(--accent-text); background: var(--accent-soft); border-color: var(--accent-border); } .badge--success { color: var(--success-text); background: var(--success-soft); border-color: rgba(15, 128, 80, 0.25); } .badge--warn { color: var(--warn); background: var(--warn-soft); border-color: rgba(151, 95, 0, 0.25); } .badge--danger { color: var(--danger); background: var(--danger-soft); border-color: rgba(179, 39, 60, 0.35); } .badge .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; } /* ===================== Fields ============================================= */ .field { display: block; margin-bottom: 14px; } .field-label { display: block; font-size: var(--text-sm); font-weight: 600; color: var(--text-dim); margin-bottom: 7px; letter-spacing: 0.01em; } .field-error { display: block; margin-top: 6px; font-size: 12px; color: var(--danger); line-height: 1.4; } .input[aria-invalid="true"], .textarea[aria-invalid="true"] { border-color: rgba(179, 39, 60, 0.6); } .input, .textarea, .select { width: 100%; font-family: inherit; font-size: var(--text-base); color: var(--text); background: var(--surface-1); border: 1px solid var(--border); border-radius: var(--r-md); padding: 12px 14px; transition: border-color 0.18s var(--ease), box-shadow 0.18s var(--ease), background 0.18s; outline: none; } .input::placeholder, .textarea::placeholder { color: var(--text-faint); } .input:focus, .textarea:focus, .select:focus { border-color: var(--accent-border-strong); box-shadow: 0 0 0 4px var(--accent-soft); background: var(--surface-2); } .textarea { resize: vertical; min-height: 84px; line-height: 1.5; } .select { appearance: none; cursor: pointer; background-image: linear-gradient(var(--surface-1), var(--surface-1)); } /* ===================== Hero / Landing ===================================== */ .hero-sub { margin: 18px 0 28px; font-size: clamp(15px, 1.6vw, 17px); color: var(--text-dim); max-width: 56ch; line-height: 1.6; text-wrap: pretty; } .hero-cta { display: flex; gap: 12px; flex-wrap: wrap; } /* ===================== Section title ===================================== */ .section-title { display: flex; align-items: center; justify-content: space-between; margin: 6px 0 14px; } .section-title h2 { font-size: 18px; letter-spacing: var(--track-heading); } .section-title .muted { font-size: 13px; color: var(--text-faint); } /* ===================== Upload ============================================= */ .upload { border: 1.5px dashed var(--border-strong); border-radius: var(--r-lg); padding: 34px 24px; text-align: center; background: var(--surface-1); cursor: pointer; transition: border-color 0.2s var(--ease), background 0.2s var(--ease), transform 0.2s var(--ease); } .upload:hover { border-color: var(--accent-border); background: var(--surface-2); } .upload:active { transform: scale(0.997); } .upload.drag { border-color: var(--accent); background: var(--accent-soft); transform: scale(1.005); } .upload-ico { width: 46px; height: 46px; margin: 0 auto 14px; border-radius: var(--r-md); display: grid; place-items: center; background: var(--surface-2); border: 1px solid var(--border); color: var(--accent); } .upload h3 { font-size: 15px; } .upload p { margin: 6px 0 0; font-size: 13px; color: var(--text-faint); } .upload-privacy { font-size: 11.5px !important; opacity: 0.75; } /* ===================== Document cards ===================================== */ .doc-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; } .doc-card { display: flex; flex-direction: column; gap: 14px; padding: 18px; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--surface-1); transition: border-color 0.2s var(--ease), background 0.2s var(--ease), transform 0.2s var(--ease); } .doc-card:hover { border-color: var(--border-strong); background: var(--surface-2); transform: translateY(-2px); } .doc-card-head { display: flex; align-items: flex-start; gap: 11px; } .doc-icon { width: 38px; height: 38px; flex: none; border-radius: var(--r-sm); display: grid; place-items: center; background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim); } .doc-name { font-size: var(--text-base); font-weight: 600; word-break: break-word; line-height: 1.3; } .doc-sub { font-size: 12px; color: var(--text-faint); margin-top: 2px; font-variant-numeric: tabular-nums; } .doc-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; } .doc-confirm-msg { font-size: var(--text-sm); font-weight: 600; color: var(--danger); line-height: 1.35; } .doc-err { font-size: 12px; color: var(--danger); margin-top: 2px; } /* ===================== Ask workspace ===================================== */ .ask-grid { display: grid; grid-template-columns: minmax(0, 1fr) 380px; gap: 18px; align-items: start; } /* Fast / Thinking segmented control */ .segmented { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 18px; } .seg { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface-1); color: var(--text-dim); font-size: 14px; font-weight: 600; font-family: inherit; cursor: pointer; transition: border-color 0.18s var(--ease), background 0.18s var(--ease), color 0.18s var(--ease); } .seg:hover { background: var(--surface-2); color: var(--text); } .seg small { font-size: 11px; font-weight: 500; color: var(--text-faint); text-transform: none; letter-spacing: 0; } .seg.active { color: var(--text); border-color: var(--accent-border-strong); background: var(--accent-soft); box-shadow: 0 0 0 1px rgba(14, 124, 123, 0.12) inset; } .seg-top { display: inline-flex; align-items: center; gap: 6px; } .seg:disabled { opacity: 0.5; cursor: not-allowed; } .seg:disabled:hover { background: var(--surface-1); color: var(--text-dim); } .seg-note { font-size: 12px; color: var(--text-faint); margin: -8px 0 16px; } .chips { display: flex; flex-wrap: wrap; gap: 10px; } .chip { display: flex; flex-direction: column; align-items: flex-start; gap: 3px; text-align: left; padding: 10px 14px; border-radius: var(--r-md); border: 1px solid var(--border); background: var(--surface-1); color: var(--text); font-size: 13px; font-weight: 500; font-family: inherit; cursor: pointer; transition: border-color 0.18s var(--ease), background 0.18s var(--ease), transform 0.12s var(--ease); } .chip:hover { border-color: var(--accent-border); background: var(--surface-2); } .chip:active { transform: translateY(1px); } .chip:disabled { opacity: 0.55; cursor: not-allowed; } .chip small { color: var(--text-faint); font-size: 11px; font-weight: 600; letter-spacing: var(--track-label); text-transform: uppercase; } /* Answer card */ .answer-card { margin-top: 18px; border: 1px solid var(--border); border-radius: var(--r-lg); padding: 20px; background: var(--surface-1); animation: reveal 0.45s var(--ease) both; } .answer-card.abstain { border-color: rgba(151, 95, 0, 0.35); background: linear-gradient(var(--warn-soft), transparent); } .answer-card.grounded { box-shadow: inset 3px 0 0 var(--accent); } .answer-head { display: flex; align-items: center; gap: 9px; margin-bottom: 12px; } .answer-head h3 { font-size: 13px; text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); font-weight: 700; } .answer-body { font-size: 16px; line-height: 1.65; color: var(--text); max-width: 72ch; } .answer-body.dim { color: var(--text-dim); font-size: 15px; } /* Compact AI-evaluation / audit metadata under the answer body. Quiet by design. */ .ask-meta { margin: 16px 0 0; padding-top: 14px; border-top: 1px solid var(--border); display: grid; gap: 6px; max-width: 72ch; } .ask-meta-row { display: grid; grid-template-columns: minmax(0, 9.5em) 1fr; gap: 12px; align-items: baseline; } .ask-meta-k { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); margin: 0; } .ask-meta-v { font-size: var(--text-sm); color: var(--text-dim); margin: 0; font-variant-numeric: tabular-nums; } @keyframes reveal { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } } /* ===================== Evidence panel ==================================== */ .evidence-panel { position: sticky; top: 24px; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--glass); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); overflow: hidden; } .evidence-top { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px; border-bottom: 1px solid var(--border); } .evidence-top h3 { font-size: 13px; text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-dim); font-weight: 700; } .evidence-list { padding: 12px; display: flex; flex-direction: column; gap: 10px; max-height: 64vh; overflow-y: auto; } .evidence-item { border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface-1); overflow: hidden; } .evidence-item-head { display: flex; align-items: center; gap: 10px; width: 100%; padding: 11px 13px; background: none; border: none; color: var(--text); cursor: pointer; font-family: inherit; text-align: left; transition: background 0.18s var(--ease); } .evidence-item-head:hover { background: var(--surface-2); } .evidence-item-head:active { background: var(--surface-1); } .evidence-rank { width: 22px; height: 22px; flex: none; border-radius: var(--r-xs); display: grid; place-items: center; font-size: 11px; font-weight: 700; background: var(--accent-soft); color: var(--accent-text); border: 1px solid var(--accent-border); } .evidence-doc { font-size: 13px; font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .evidence-meta { font-size: 11px; color: var(--text-faint); font-variant-numeric: tabular-nums; } .chevron { transition: transform 0.22s var(--ease); color: var(--text-faint); flex: none; } .chevron.open { transform: rotate(90deg); } .evidence-body { padding: 0 13px 13px; font-size: var(--text-sm); line-height: 1.6; color: var(--text-dim); border-top: 1px solid var(--border); margin-top: -1px; padding-top: 11px; animation: reveal 0.28s var(--ease) both; } .evidence-score { display: inline-block; margin-top: 8px; font-size: 11px; color: var(--text-faint); font-variant-numeric: tabular-nums; } /* Matched-span highlight inside an evidence excerpt (Citation.match_text) */ .evidence-mark { background: var(--accent-soft); color: var(--text); padding: 0 2px; border-radius: var(--r-xs); box-shadow: inset 0 -1px 0 rgba(14, 124, 123, 0.5); } /* ===================== Confidence indicator (Ask answer) ================= */ .confidence { margin: -2px 0 14px; max-width: 72ch; } .confidence-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; } .conf-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; letter-spacing: var(--track-label); text-transform: uppercase; } .conf-status .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .conf-status--ok { color: var(--success); } .conf-status--weak { color: var(--warn); } .conf-pct { font-size: 12px; font-weight: 700; color: var(--text-dim); font-variant-numeric: tabular-nums; } .conf-track { height: 6px; border-radius: var(--r-pill); background: var(--surface-2); border: 1px solid var(--border); overflow: hidden; } .conf-fill { display: block; height: 100%; width: 100%; border-radius: var(--r-pill); transform-origin: left; transition: transform 0.5s var(--ease); } .conf-fill--success { background: var(--success); } .conf-fill--warn { background: var(--warn); } .conf-fill--danger { background: var(--danger); } .conf-fill--neutral { background: var(--text-faint); } /* Export-report button (sits in the answer head) */ .report-btn { margin-left: auto; display: inline-flex; align-items: center; gap: 5px; font-family: inherit; font-size: 12px; font-weight: 600; color: var(--accent-text); background: var(--accent-soft); border: 1px solid var(--accent-border); border-radius: var(--r-pill); padding: 3px 11px; cursor: pointer; transition: background 0.18s var(--ease), border-color 0.18s var(--ease); } .report-btn:hover { background: rgba(14, 124, 123, 0.16); border-color: var(--accent-border-strong); } .report-btn:active { transform: translateY(1px); } /* ===================== Evidence report (printable) ====================== */ /* Off-screen on screen; a print stylesheet reveals just this for window.print() */ .evidence-report { position: absolute; left: -10000px; top: 0; width: 760px; user-select: text; -webkit-user-select: text; } .report-header { display: flex; align-items: flex-start; justify-content: space-between; padding-bottom: 14px; margin-bottom: 18px; border-bottom: 2px solid var(--text); } .report-brand { font-size: 16px; font-weight: 800; color: var(--text); letter-spacing: -0.01em; } .report-date { font-size: 12px; color: var(--text-faint); margin-top: 3px; } .report-status { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: var(--track-label); padding: 4px 12px; border-radius: var(--r-pill); border: 1px solid var(--border); } .report-status.ok { color: var(--success-text); background: var(--success-soft); border-color: rgba(15, 128, 80, 0.3); } .report-status.weak { color: var(--warn); background: var(--warn-soft); border-color: rgba(151, 95, 0, 0.3); } .report-block { margin-bottom: 20px; } .report-label { font-size: 11px; text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); font-weight: 700; margin-bottom: 7px; } .report-question { font-size: 16px; font-weight: 600; color: var(--text); line-height: 1.5; } .report-answer-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; } .report-conf { text-align: right; line-height: 1.1; } .report-conf-num { font-size: 22px; font-weight: 800; color: var(--text); font-variant-numeric: tabular-nums; } .report-conf-lbl { display: block; font-size: 10px; text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); } .report-answer { font-size: 15px; line-height: 1.65; color: var(--text); margin-top: 4px; } .report-facts { display: flex; flex-wrap: wrap; gap: 8px 16px; margin-top: 10px; font-size: 12px; color: var(--text-dim); } .report-evidence { border: 1px solid var(--border); border-radius: var(--r-md); padding: 12px 14px; margin-bottom: 10px; } .report-evidence-head { display: flex; align-items: center; gap: 9px; margin-bottom: 7px; flex-wrap: wrap; } .report-rank { width: 20px; height: 20px; flex: none; border-radius: var(--r-xs); display: grid; place-items: center; font-size: 11px; font-weight: 700; background: var(--accent-soft); color: var(--accent-text); border: 1px solid var(--accent-border); } .report-doc { font-size: 13px; font-weight: 700; color: var(--text); } .report-meta { font-size: 11px; color: var(--text-faint); } .report-excerpt { font-size: var(--text-sm); line-height: 1.6; color: var(--text-dim); } .report-noevidence { font-size: 13px; color: var(--text-dim); } .report-footer { margin-top: 22px; padding-top: 12px; border-top: 1px solid var(--border); font-size: 11px; color: var(--text-faint); } /* When printing the report: hide the app, reveal only the report on the page */ @media print { .printing-report body * { visibility: hidden; } .printing-report .evidence-report, .printing-report .evidence-report * { visibility: visible; } .printing-report .evidence-report { position: absolute; left: 0; top: 0; width: 100%; } .printing-report .evidence-mark { box-shadow: none; } } /* ===================== Metrics (evaluation) ============================== */ .metric-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 14px; margin-bottom: 22px; } .metric-card { padding: 18px; border: 0; border-radius: var(--r-lg); background: var(--surface-2); } .metric-value { font-size: 30px; font-weight: 800; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; } .metric-value.good { color: var(--success); } .metric-value.bad { color: var(--danger); } .metric-label { font-size: var(--text-sm); color: var(--text-dim); margin-top: 4px; } .metric-hint { font-size: var(--text-xs); color: var(--text-faint); margin-top: 7px; line-height: 1.4; } /* ===================== Audit dashboard =================================== */ .audit-controls { display: grid; grid-template-columns: 1fr; gap: 16px; align-items: start; } @media (min-width: 720px) { .audit-controls { grid-template-columns: minmax(220px, 1fr) 1.5fr; } } .audit-types { display: flex; flex-wrap: wrap; gap: 8px; } .audit-type-btn { flex: 1 1 auto; min-width: 92px; padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface-1); color: var(--text-dim); font-size: 13px; font-weight: 600; cursor: pointer; transition: border-color 0.15s var(--ease), background 0.15s var(--ease), color 0.15s var(--ease); } .audit-type-btn:hover { border-color: var(--border-strong); color: var(--text); } .audit-type-btn.active { background: var(--accent-soft); color: var(--accent-text); border-color: var(--accent-border-strong); } .audit-tagline { font-size: 13px; line-height: 1.6; margin-top: 14px; max-width: 72ch; } .audit-summary-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 10px; } .audit-summary { color: var(--text-dim); font-size: 14px; line-height: 1.6; margin: 0 0 18px; max-width: 80ch; } .audit-findings { display: grid; gap: 12px; } @media (min-width: 760px) { .audit-findings { grid-template-columns: 1fr 1fr; } } .finding { border: 1px solid var(--border); border-left: 3px solid var(--border-strong); border-radius: var(--r-md); background: var(--surface-1); padding: 14px 16px; } .finding.ok { border-left-color: var(--success); } .finding.miss { border-left-color: var(--danger); } .finding-top { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; } .finding-icon { display: inline-grid; place-items: center; width: 22px; height: 22px; border-radius: var(--r-xs); flex: none; } .finding.ok .finding-icon { color: var(--success); background: var(--success-soft); } .finding.miss .finding-icon { color: var(--danger); background: var(--danger-soft); } .finding-type { font-weight: 700; font-size: 13px; flex: 1; min-width: 0; } .finding-claim { font-size: 14px; color: var(--text); line-height: 1.5; word-break: break-word; } .finding.miss .finding-claim { color: var(--text-faint); font-style: italic; } .finding-evidence { margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--border); } .finding-evidence-label { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); margin-bottom: 4px; } .finding-excerpt { font-size: var(--text-sm); color: var(--text-dim); line-height: 1.55; } /* Eval table */ .eval-table { display: flex; flex-direction: column; gap: 10px; } .eval-row { display: grid; grid-template-columns: 64px 1fr auto; align-items: center; gap: 14px; padding: 14px 16px; border: 0; border-radius: var(--r-md); background: var(--surface-2); } .eval-q { font-size: 14px; font-weight: 500; } .eval-meta { font-size: 12px; color: var(--text-faint); margin-top: 3px; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } .eval-badges { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } /* ===================== History =========================================== */ .history-item { padding: 14px 0; border-top: 1px solid var(--border); } .history-item:first-child { border-top: none; padding-top: 0; } .history-q { font-size: 14px; font-weight: 600; } .history-a { font-size: 13px; color: var(--text-dim); margin-top: 5px; line-height: 1.5; max-width: 75ch; } /* ===================== States ============================================ */ .empty { text-align: center; padding: 40px 20px; border: 1px dashed var(--border); border-radius: var(--r-lg); color: var(--text-faint); } .empty-ico { width: 44px; height: 44px; margin: 0 auto 14px; border-radius: var(--r-md); display: grid; place-items: center; background: var(--surface-1); border: 1px solid var(--border); color: var(--text-faint); } .empty h3 { font-size: 15px; color: var(--text-dim); } .empty p { margin: 6px auto 0; font-size: 13px; max-width: 40ch; line-height: 1.5; } .errorbox { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border: 1px solid rgba(179, 39, 60, 0.3); background: var(--danger-soft); border-radius: var(--r-md); color: var(--danger); font-size: 13px; } .successbox { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border: 1px solid rgba(15, 128, 80, 0.3); background: var(--success-soft); border-radius: var(--r-md); color: var(--success); font-size: 13px; } /* Skeleton shimmer */ .skeleton { display: flex; flex-direction: column; gap: 11px; } .sk-line { height: 13px; border-radius: var(--r-xs); background: linear-gradient(90deg, rgba(20,32,43,0.05) 25%, rgba(20,32,43,0.11) 37%, rgba(20,32,43,0.05) 63%); background-size: 400% 100%; animation: shimmer 1.4s ease infinite; } @keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } /* Utility */ .stack { display: flex; flex-direction: column; gap: 18px; } .row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .muted { color: var(--text-dim); } .mt-0 { margin-top: 0; } /* ===================== Responsive ======================================== */ @media (max-width: 1040px) { .ask-grid { grid-template-columns: 1fr; } .evidence-panel { position: static; } } @media (max-width: 860px) { .app-shell { grid-template-columns: 1fr; } .sidebar { position: sticky; top: 0; height: auto; flex-direction: row; align-items: center; gap: 4px; padding: 10px 14px; z-index: var(--z-sticky); overflow-x: auto; /* never clip nav items on narrow screens */ } .brand { padding: 4px 8px 4px 0; } .brand-sub-hide { display: none; } .nav { flex-direction: row; gap: 2px; flex: none; } .nav-item { min-height: 44px; padding: 8px 12px; } /* 44px touch target */ .nav-item span.label { display: none; } .sidebar-foot { margin: 0 0 0 auto; border: none; padding: 0; flex: none; } .main { padding: 22px 18px 64px; } } @media (max-width: 560px) { .eval-row { grid-template-columns: 1fr; } .eval-badges { justify-content: flex-start; } .btn--block-sm { width: 100%; } } /* ===================== Eval visualization (charts) ======================= */ .eval-viz { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 28px; align-items: center; padding: 22px; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--surface-1); margin-bottom: 22px; } .eval-donut-block { display: flex; align-items: center; gap: 18px; } .eval-donut { width: 132px; height: 132px; flex: none; } .eval-donut-num { fill: var(--text); font-size: 24px; font-weight: 800; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; } .eval-donut-cap { fill: var(--text-faint); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: var(--track-label); } .eval-donut-arc { animation: eval-arc 0.9s var(--ease) both; } @keyframes eval-arc { from { stroke-dasharray: 0 var(--arc-c); } } .eval-legend { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; font-size: 13px; color: var(--text-dim); } .eval-legend li { display: flex; align-items: center; gap: 9px; } .eval-legend strong { color: var(--text); font-variant-numeric: tabular-nums; } .eval-swatch { width: 11px; height: 11px; border-radius: var(--r-xs); flex: none; } .eval-swatch.pass { background: var(--success); } .eval-swatch.fail { background: var(--danger); opacity: 0.55; } .eval-bars { display: flex; flex-direction: column; gap: 18px; min-width: 0; } .eval-bar-top { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 7px; } .eval-bar-label { font-size: 13px; font-weight: 600; color: var(--text); } .eval-bar-val { font-size: 16px; font-weight: 800; letter-spacing: -0.02em; color: var(--text); font-variant-numeric: tabular-nums; } .eval-bar-track { height: 10px; border-radius: var(--r-pill); background: var(--surface-2); border: 1px solid var(--border); overflow: hidden; } .eval-bar-fill { height: 100%; width: 100%; border-radius: var(--r-pill); background: var(--accent-grad); transform-origin: left; transition: transform 0.9s var(--ease); } .eval-bar-hint { font-size: var(--text-xs); color: var(--text-faint); margin-top: 6px; line-height: 1.4; } @media (max-width: 640px) { .eval-viz { grid-template-columns: 1fr; gap: 22px; } .eval-donut-block { justify-content: center; } } /* ========================================================================== * * REDESIGN β€” "Proof Engine" cinematic landing * ========================================================================== */ /* Sticky top bar (appears on scroll) */ .topbar { position: sticky; top: 0; z-index: var(--z-sticky); display: flex; align-items: center; justify-content: flex-end; gap: 16px; padding: 12px clamp(20px, 4vw, 56px); background: rgba(251, 250, 246, 0.80); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); border-bottom: 1px solid var(--border); opacity: 0; transform: translateY(-8px); pointer-events: none; transition: opacity 0.3s var(--ease-out), transform 0.3s var(--ease-out); } .topbar.show { opacity: 1; transform: none; pointer-events: auto; } /* Mono numbered section eyebrows */ .eyebrow-mono { font-family: var(--font-mono); font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); margin: 0 0 16px; font-variant-numeric: tabular-nums; } .eyebrow-mono b { color: var(--accent); font-weight: 600; } /* Section rhythm β€” one spacing unit between top-level Overview sections */ .landing > section + section, .landing > .logo-strip + section { margin-top: var(--space-14); } /* Scroll reveal */ .reveal { transition: opacity var(--dur-reveal) var(--ease-out), transform var(--dur-reveal) var(--ease-out); } /* Hidden state applies only after JS confirms reveal is supported (html.reveal-on, set in main.jsx). If JS or the observer fails, or it runs headless, content stays visible instead of shipping blank β€” reveal is an enhancement, not a gate. */ html.reveal-on .reveal { opacity: 0; transform: translateY(14px); } html.reveal-on .reveal.in { opacity: 1; transform: none; } /* Stagger: cascade grouped reveals (cards/rows) ~70ms apart for a graceful resolve instead of all-at-once. Reduced-motion block below makes it instant. */ .stagger > .reveal:nth-child(2) { transition-delay: 70ms; } .stagger > .reveal:nth-child(3) { transition-delay: 140ms; } .stagger > .reveal:nth-child(4) { transition-delay: 210ms; } .stagger > .reveal:nth-child(5) { transition-delay: 280ms; } .stagger > .reveal:nth-child(6) { transition-delay: 350ms; } .stagger > .reveal:nth-child(n+7) { transition-delay: 420ms; } /* ---- Hero stage ---- */ .hero-stage { position: relative; display: grid; grid-template-columns: 1.05fr 0.95fr; gap: clamp(28px, 4vw, 56px); align-items: center; padding: clamp(24px, 5vh, 64px) 0 clamp(32px, 6vh, 72px); margin-bottom: 8px; } .hero-h1 { font-family: var(--font-display); font-weight: 800; font-size: clamp(40px, 6.4vw, 76px); line-height: 0.98; letter-spacing: -0.03em; margin: 18px 0; text-wrap: balance; } .hero-h1 .clip { background: var(--accent-grad-hero); -webkit-background-clip: text; background-clip: text; color: transparent; } .hero-trust-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-top: 22px; font-size: var(--text-sm); color: var(--text-faint); } .hero-trust-strip span { display: flex; align-items: center; } .hero-trust-strip span + span::before { content: ""; width: 3px; height: 3px; border-radius: 50%; background: var(--text-faint); margin-right: 14px; } /* ---- Floating product-preview mock ---- */ .preview-wrap { position: relative; } .preview-card { position: relative; border-radius: var(--r-xl); padding: 18px; background: var(--glass); backdrop-filter: blur(22px); -webkit-backdrop-filter: blur(22px); border: 1px solid var(--border-strong); box-shadow: var(--shadow-md), var(--glow-volumetric); animation: floatY 6s var(--ease) infinite alternate; } .preview-card::before { content: ""; position: absolute; inset: 0 0 auto 0; height: 1px; border-radius: var(--r-xl) var(--r-xl) 0 0; background: linear-gradient(90deg, transparent, rgba(20, 32, 43, 0.10), transparent); } @keyframes floatY { to { transform: translateY(-10px); } } .preview-head { display: flex; align-items: center; gap: 9px; font-size: 13px; font-weight: 600; margin-bottom: 14px; } .preview-head .status-dot { margin-left: auto; } .preview-head .on { font-size: 11px; color: var(--text-faint); font-weight: 600; } .preview-q { margin: 0 0 12px auto; width: fit-content; max-width: 88%; background: var(--accent-soft); border: 1px solid var(--accent-border); color: var(--accent-text); font-size: 13px; padding: 9px 13px; border-radius: var(--r-md) var(--r-md) var(--r-xs) var(--r-md); } .preview-answer { font-size: var(--text-base); line-height: 1.6; margin: 0; } .preview-answer .type { display: inline-block; overflow: hidden; white-space: nowrap; max-width: 0; vertical-align: bottom; animation: typeIn 1.6s steps(40) 0.35s forwards; } .preview-answer .type::after { content: ""; display: inline-block; width: 1px; height: 1.05em; margin-left: 2px; background: var(--accent); vertical-align: middle; animation: caret 0.8s steps(1) infinite; } @keyframes typeIn { to { max-width: 100%; } } @keyframes caret { 50% { opacity: 0; } } .preview-answer mark { color: var(--text); background: linear-gradient(var(--accent-soft), var(--accent-soft)) no-repeat; background-size: 0% 100%; padding: 0 3px; border-radius: var(--r-xs); animation: sweep 0.6s var(--ease-out) 2.1s forwards; } @keyframes sweep { to { background-size: 100% 100%; } } .cite-chip { font-size: 10px; font-weight: 700; color: var(--accent-text); background: var(--accent-soft); border: 1px solid var(--accent-border); border-radius: var(--r-xs); padding: 0 4px; vertical-align: super; margin-left: 2px; } .preview-evidence { margin-top: 14px; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface-1); padding: 11px 12px; } .preview-evidence-head { display: flex; align-items: center; gap: 9px; margin-bottom: 7px; } .preview-evidence-doc { font-size: 12px; font-weight: 600; color: var(--text-dim); } .preview-evidence-line { font-size: 12px; color: var(--text-dim); line-height: 1.5; } .preview-evidence mark { color: var(--text); background: var(--accent-soft); padding: 0 3px; border-radius: var(--r-xs); } .preview-peek { position: absolute; inset: auto 0 -16px 22px; z-index: -1; transform: rotate(-4deg); opacity: 0.45; padding: 12px 14px; display: flex; align-items: center; gap: 9px; } /* ---- How it works β€” border-divided horizontal step rail (no card boxes) ---- */ .flow { display: grid; grid-template-columns: 1fr 1fr 1fr; } .flow-step { position: relative; padding: 4px 26px; border-left: 1px solid var(--border); } .flow-step:first-child { border-left: 0; padding-left: 0; } .flow-num { width: 30px; height: 30px; border-radius: var(--r-sm); display: grid; place-items: center; font-family: var(--font-mono); font-weight: 700; font-size: 14px; font-variant-numeric: tabular-nums; color: var(--accent-text); background: var(--accent-soft); border: 1px solid var(--accent-border); margin-bottom: 12px; } .flow-step h3 { font-size: 16px; margin-bottom: 6px; } .flow-step p { font-size: 13px; color: var(--text-dim); line-height: 1.55; margin: 0; } /* ---- Stats band ---- */ .stats-band { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--glass); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); overflow: hidden; } .stat { padding: 28px 24px; border-left: 1px solid var(--border); } .stat:first-child { border-left: none; } .stat-num { font-family: var(--font-display); font-weight: 800; font-size: clamp(34px, 5vw, 52px); letter-spacing: -0.03em; font-variant-numeric: tabular-nums; line-height: 1; background: var(--accent-grad-hero); -webkit-background-clip: text; background-clip: text; color: transparent; } .stat-label { font-size: var(--text-sm); color: var(--text-dim); margin-top: 10px; } /* ---- Bento feature grid ---- */ .bento { display: grid; gap: 14px; grid-template-columns: repeat(3, 1fr); grid-template-areas: "cite cite abst" "src eval eval"; } .bento-tile { border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--surface-1); padding: 22px; transition: border-color 0.2s var(--ease), background 0.2s var(--ease), transform 0.2s var(--ease); } .bento-tile:hover { border-color: var(--border-strong); background: var(--surface-2); transform: translateY(-2px); } .bento-tile .ico { color: var(--accent); margin-bottom: 14px; } .bento-tile h3 { font-size: 17px; margin-bottom: 7px; } .bento-tile p { font-size: 13px; color: var(--text-dim); line-height: 1.55; margin: 0; } .bento-cite { grid-area: cite; } .bento-abst { grid-area: abst; border-color: rgba(151, 95, 0, 0.28); background: linear-gradient(var(--warn-soft), transparent); } .bento-abst .ico { color: var(--warn); } .bento-src { grid-area: src; } .bento-eval { grid-area: eval; } .bento-rankviz { display: flex; flex-direction: column; gap: 6px; margin-top: 14px; } .bento-rankbar { height: 8px; border-radius: var(--r-pill); background: var(--accent-grad); opacity: 0.9; } /* ---- Eval teaser ---- */ .eval-teaser { display: grid; grid-template-columns: 1fr auto; gap: 28px; align-items: center; border: 1px solid var(--border); border-radius: var(--r-xl); background: var(--glass); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); padding: clamp(24px, 4vw, 40px); } .eval-teaser h2 { font-size: clamp(24px, 3vw, 34px); margin-bottom: 10px; } .eval-teaser p { color: var(--text-dim); max-width: 46ch; margin: 0 0 18px; line-height: 1.6; } /* ---- "Works with" logo strip ---- */ .logo-strip { display: flex; align-items: center; flex-wrap: wrap; gap: 12px 22px; margin-top: 18px; padding-top: 20px; border-top: 1px solid var(--border); } .logo-strip .ls-label { font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: var(--track-label); color: var(--text-faint); } .logo-strip .ls-item { display: inline-flex; align-items: center; gap: 7px; font-family: var(--font-display); font-weight: 600; font-size: 14px; color: var(--text-dim); white-space: nowrap; } .logo-strip .ls-item .ico { color: var(--text-faint); } /* ---- Dark proof / testimonials band ---- */ .proof-band { margin-top: 56px; border-radius: var(--r-xl); background: var(--navy); color: #eaf1fb; padding: clamp(28px, 5vw, 52px); } .proof-band .pb-head { margin-bottom: 28px; } .proof-band h2 { color: #fff; font-size: clamp(24px, 3vw, 34px); } .proof-band .pb-sub { color: rgba(234, 241, 251, 0.66); margin: 10px 0 0; font-size: 15px; max-width: 60ch; line-height: 1.6; } .pb-proof { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 18px; padding-top: 24px; border-top: 1px solid rgba(255, 255, 255, 0.12); } .pb-proof-item { display: flex; align-items: flex-start; gap: 11px; } .pb-proof-item .ico { color: color-mix(in srgb, var(--success) 60%, #fff); flex: none; margin-top: 4px; } .pb-proof-item b { display: block; font-family: var(--font-display); font-size: 30px; color: #fff; line-height: 1.05; font-variant-numeric: tabular-nums; } .pb-proof-item .pb-proof-label { font-size: var(--text-sm); color: rgba(234, 241, 251, 0.66); } @media (max-width: 768px) { .pb-proof { grid-template-columns: 1fr; gap: 14px; } } /* ---- Sidebar polish: active rail ---- */ .nav-item.active { box-shadow: inset 0 0 0 1px var(--border), inset 2px 0 0 var(--accent); } /* ---- Redesign responsive ---- */ @media (max-width: 960px) { .hero-stage { grid-template-columns: 1fr; } .preview-wrap { max-width: 460px; } } @media (max-width: 768px) { .flow { grid-template-columns: 1fr; } .flow-step { border-left: 0; border-top: 1px solid var(--border); padding: 20px 0 4px; } .flow-step:first-child { border-top: 0; padding-top: 4px; } .stats-band { grid-template-columns: 1fr; } .stat { border-left: none; border-top: 1px solid var(--border); } .stat:first-child { border-top: none; } .bento { grid-template-columns: 1fr; grid-template-areas: "cite" "abst" "src" "eval"; } .eval-teaser { grid-template-columns: 1fr; } } /* ===================== Reduced motion (respect OS setting) =============== */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; } .sk-line { background: var(--surface-2); } body::before { animation: none; } .preview-card { animation: none; } .preview-answer .type { max-width: 100%; animation: none; } .preview-answer .type::after { display: none; } .preview-answer mark { background-size: 100% 100%; animation: none; } .reveal { opacity: 1; transform: none; } } /* ===================== Auth screen ======================================= */ /* password show/hide */ .auth-input-wrap { position: relative; display: block; } .auth-input-wrap .input { padding-right: 44px; } .auth-eye { position: absolute; top: 50%; right: 8px; transform: translateY(-50%); display: grid; place-items: center; width: 32px; height: 32px; border: none; background: none; cursor: pointer; color: var(--text-faint); border-radius: var(--r-sm); transition: color var(--dur-base) var(--ease), background var(--dur-base) var(--ease); } .auth-eye:hover { color: var(--text); background: var(--surface-2); } /* divider + demo link + switch */ .auth-divider { display: flex; align-items: center; gap: 12px; margin: 20px 0; color: var(--text-faint); font-size: 12px; } .auth-divider::before, .auth-divider::after { content: ""; flex: 1; height: 1px; background: var(--border); } .auth-demo-link { display: block; width: 100%; text-align: center; padding: 11px 18px; min-height: 40px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface-1); color: var(--text-dim); font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer; transition: border-color var(--dur-base) var(--ease), background var(--dur-base) var(--ease), color var(--dur-base) var(--ease); } .auth-demo-link:hover { border-color: var(--border-strong); background: var(--surface-2); color: var(--text); } .auth-demo-link:disabled { opacity: 0.6; cursor: not-allowed; } .auth-google { display: flex; justify-content: center; margin-top: 14px; min-height: 40px; } .auth-switch { margin: 18px 0 0; text-align: center; font-size: 13px; color: var(--text-faint); } .auth-switch button { border: none; background: none; padding: 0; cursor: pointer; font: inherit; font-weight: 600; color: var(--accent); } .auth-switch button:hover { text-decoration: underline; } /* sidebar account row (email + logout) */ .sidebar-account { margin-top: auto; display: flex; align-items: center; gap: 9px; padding: 10px 11px 4px; font-size: var(--text-sm); } .sidebar-account + .sidebar-foot { margin-top: 0; } .sidebar-account .acct-email { color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0; } .sidebar-account .acct-logout { display: inline-grid; place-items: center; width: 28px; height: 28px; flex: none; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface-1); color: var(--text-faint); cursor: pointer; transition: color var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease), background var(--dur-base) var(--ease); } .sidebar-account .acct-logout:hover { color: var(--danger); border-color: var(--border-strong); background: var(--surface-2); } /* ========================================================================== * * Auth (minimal, elegant) β€” split: form + art panel * ========================================================================== */ .authpage { min-height: 100vh; min-height: 100dvh; display: grid; grid-template-columns: 1fr 1fr; background: #fff; color: #14233b; } .authpage-form { display: grid; place-items: center; padding: 48px 28px; } .authpage-inner { width: 100%; max-width: 364px; } .authpage-brand { display: flex; flex-direction: column; align-items: center; gap: 12px; color: #14233b; } .authpage-brand svg { color: #14233b; } .authpage-mark { font-family: var(--font-display); font-weight: 500; font-size: 40px; line-height: 1; letter-spacing: 0.005em; } .authpage-sub { text-align: center; color: #5a6b82; font-size: var(--text-base); margin: 12px 0 30px; } .authpage-fields { display: grid; gap: 16px; } .authpage-art { position: relative; overflow: hidden; background: var(--navy); } .auth-art-svg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; } @keyframes authNodePulse { 0%, 100% { opacity: 0.16; } 50% { opacity: 0.46; } } .auth-node-glow { animation: authNodePulse 3.4s ease-in-out infinite; } @media (prefers-reduced-motion: reduce) { .auth-node-glow { animation: none; } } @media (max-width: 820px) { .authpage { grid-template-columns: 1fr; } .authpage-art { display: none; } } /* Brand mark acts as a "home" button -> Overview. Reset native button styling. */ button.brand { background: none; border: 0; font: inherit; color: inherit; cursor: pointer; text-align: left; padding: 0; } button.brand:hover { opacity: 0.82; } button.brand:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--r-xs); } /* Packet picker: which documents form the cross-checked packet */ .packet-picker { margin-top: 14px; border: 1px solid var(--border); border-radius: var(--r-md); padding: 12px 14px; background: var(--surface-2); } .packet-picker-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; } .packet-picker-links .link-btn { font-size: 13px; } .packet-picker-list { display: flex; flex-wrap: wrap; gap: 8px 18px; } .packet-doc { display: inline-flex; align-items: center; gap: 7px; font-size: 13px; color: var(--text-dim); cursor: pointer; } .packet-doc input { accent-color: var(--accent); width: 15px; height: 15px; cursor: pointer; } .packet-doc:hover { color: var(--text); }
/* ========================================================================== *
* Tamga β€” design system
* Premium, trustworthy aesthetic: ink-on-paper neutral base + a deep-teal accent
* and an amber "seal" accent (tamga = seal/stamp). Pure CSS (no framework).
* ========================================================================== */
:root {
/* Surfaces β€” warm "paper" canvas; solid fills */
--bg: #fbfaf6;
--surface-1: #ffffff;
--surface-2: #f4f2ec;
--glass: rgba(255, 255, 255, 0.72);
/* Text β€” Tamga ink (AA/AAA on paper) */
--text: #14202b;
--text-dim: #4a5568; /* AA on paper */
--text-faint: #5f6975; /* AA on surface-2 tints */
/* Lines β€” ink low-alpha so hairlines read on the paper bg */
--border: rgba(20, 32, 43, 0.08);
--border-strong: rgba(20, 32, 43, 0.16);
/* Accent β€” Tamga deep teal (trust + modern) */
--accent: #0e7c7b;
--accent-2: #14938f;
--accent-grad: linear-gradient(135deg, #0f8280 0%, #0e7c7b 100%); /* light stop β‰₯4.5:1 under white 14px text */
--accent-soft: rgba(14, 124, 123, 0.10);
--accent-text: #0b6362; /* teal for small text on --accent-soft, β‰₯4.5:1 */
--accent-border: rgba(14, 124, 123, 0.28);
--accent-border-strong: rgba(14, 124, 123, 0.45);
--navy: #0e1b2e; /* THE dark-band navy β€” hero, about, cta, proof-band, auth, theme-color */
--r-xs: 6px; /* micro ranks/badges */
--track-display: -0.025em; /* β‰₯28px display */
--track-heading: -0.01em; /* 18-22px headings */
--track-label: 0.08em; /* uppercase labels/eyebrows */
--space-10: 40px;
--space-14: 56px; /* section rhythm unit */
--glow: 0 0 0 1px rgba(14, 124, 123, 0.30), 0 8px 24px rgba(14, 124, 123, 0.26);
/* Semantic β€” darkened to pass AA as small text on white */
--success: #0f8050;
--success-soft: rgba(15, 128, 80, 0.12);
--success-text: #0b6b42; /* success for small text on --success-soft, β‰₯4.5:1 */
--warn: #975f00;
--warn-soft: rgba(151, 95, 0, 0.12);
--danger: #b3273c;
--danger-soft: rgba(179, 39, 60, 0.12);
/* Radius β€” RADIUS LOCK: outer cards/containers = --r-lg/--r-xl; controls,
inputs, icon tiles = --r-md; chips, small icons = --r-sm; rank squares/micro
badges = --r-xs; pills (badges, progress tracks) = --r-pill. No literal
radius values outside tokens (landing .st-* styles in components/landing/ exempt). */
--r-xl: 22px;
--r-lg: 16px;
--r-md: 12px;
--r-sm: 9px;
--r-pill: 999px;
/* Shadow / elevation scale */
--shadow-sm: 0 1px 2px rgba(20, 32, 43, 0.06), 0 1px 1px rgba(20, 32, 43, 0.04);
--shadow-md: 0 12px 32px rgba(20, 32, 43, 0.10), 0 2px 8px rgba(20, 32, 43, 0.06);
--shadow-accent: 0 6px 18px rgba(14, 124, 123, 0.28); /* single accent elevation */
/* Type scale */
--text-xs: 11px;
--text-sm: 12px;
--text-base: 14px;
--text-md: 15px;
--text-lg: 18px;
--text-xl: 22px;
--text-2xl: 28px;
/* Spacing scale (4px base) */
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px;
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
/* Z-index scale */
--z-base: 0;
--z-sticky: 20;
--z-overlay: 40;
--z-modal: 100;
/* Motion */
--dur-fast: 0.12s;
--dur-base: 0.2s;
--dur-slow: 0.45s;
--ease: cubic-bezier(0.2, 0.7, 0.2, 1);
/* Fonts */
--font-body: "Geist Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--font-display: "Playfair Display Variable", Georgia, serif;
--font-mono: "Geist Mono Variable", "SFMono-Regular", ui-monospace, Menlo, Consolas, monospace;
/* Redesign: extra accent + ambient tokens (Tamga) */
--accent-3: #c77d2e; /* amber "seal" accent (tamga/stamp) */