/* * Search-box.ai * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai * File: apps/web/app/globals.css * Description: Global styles — commercial-grade light theme, mobile-first, token-derived. */ @import "../styles/tokens.css"; * { box-sizing: border-box; margin: 0; padding: 0; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { background: radial-gradient(1200px 500px at 80% -10%, rgba(200, 67, 26, 0.045), transparent 60%), radial-gradient(900px 420px at 8% 0%, rgba(21, 112, 104, 0.04), transparent 55%), var(--paper); color: var(--ink); font-family: var(--font-body); font-size: var(--fs-md); line-height: 1.55; min-height: 100dvh; display: flex; flex-direction: column; } ::selection { background: var(--accent-soft); color: var(--accent-deep); } a { color: inherit; } button { font: inherit; cursor: pointer; } :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; } /* ------------------------------- shell ---------------------------------- */ .shell { width: 100%; max-width: 1320px; margin: 0 auto; padding: 0 var(--sp-4); flex: 1; display: flex; flex-direction: column; } .topbar { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-4) 0; border-bottom: 1px solid var(--hairline); } .wordmark { display: inline-flex; align-items: center; gap: 10px; font-family: var(--font-display); font-weight: 600; font-size: 1.15rem; letter-spacing: -0.01em; text-decoration: none; } .wordmark em { color: var(--accent); font-style: italic; } .topbar .tagline { margin-left: auto; font-family: var(--font-mono); font-size: var(--fs-2xs); letter-spacing: 0.04em; color: var(--ink-faint); display: none; } @media (min-width: 768px) { .topbar .tagline { display: block; } } .footer { margin-top: var(--sp-16); padding: var(--sp-6) 0; border-top: 1px solid var(--hairline); font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--ink-faint); display: flex; justify-content: space-between; gap: var(--sp-4); flex-wrap: wrap; } /* ------------------------------ pastilles -------------------------------- */ .pastille { display: inline-grid; place-items: center; width: 30px; height: 30px; min-width: 30px; border-radius: 10px; border: 1px solid transparent; position: relative; transition: transform var(--t-fast) var(--ease-out); } .pastille.ps-sm { width: 22px; height: 22px; min-width: 22px; border-radius: 7px; } .pk-plan { color: var(--accent); background: var(--accent-soft); border-color: color-mix(in srgb, var(--accent) 22%, transparent); } .pk-search { color: var(--ink); background: var(--paper-deep); border-color: var(--hairline-strong); } .pk-fetch { color: var(--ink); background: var(--paper-deep); border-color: var(--hairline-strong); } .pk-read { color: var(--ink); background: var(--paper-deep); border-color: var(--hairline-strong); } .pk-claim { color: var(--accent-deep); background: var(--accent-soft); border-color: color-mix(in srgb, var(--accent) 22%, transparent); } .pk-belief { color: var(--amber); background: var(--amber-soft); border-color: color-mix(in srgb, var(--amber) 25%, transparent); } .pk-evidence { color: var(--teal); background: var(--teal-soft); border-color: color-mix(in srgb, var(--teal) 25%, transparent); } .pk-contradiction { color: #fff; background: var(--accent); border-color: var(--accent-deep); box-shadow: 0 2px 8px rgba(200, 67, 26, 0.35); } .pk-thought { color: var(--ink-soft); background: var(--surface); border-color: var(--hairline); } .pk-synthesis { color: var(--plum); background: var(--plum-soft); border-color: color-mix(in srgb, var(--plum) 25%, transparent); } .pk-done { color: var(--teal); background: var(--teal-soft); border-color: color-mix(in srgb, var(--teal) 25%, transparent); } .pk-failed { color: var(--red); background: var(--red-soft); border-color: color-mix(in srgb, var(--red) 25%, transparent); } .pk-source { color: var(--ink); background: var(--paper-deep); border-color: var(--hairline-strong); } .pk-confidence { color: var(--ink-soft); background: var(--paper-deep); border-color: var(--hairline-strong); } .pastille.spinning::after { content: ""; position: absolute; inset: -4px; border-radius: 13px; border: 1.5px solid transparent; border-top-color: currentColor; animation: spin 0.9s linear infinite; opacity: 0.7; } @keyframes spin { to { transform: rotate(360deg); } } /* -------------------------------- buttons -------------------------------- */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2); min-height: 46px; padding: 0 var(--sp-6); border-radius: var(--r-md); border: 1px solid var(--ink); background: var(--ink); color: var(--paper); font-weight: 600; letter-spacing: 0.01em; transition: background var(--t-fast) var(--ease-out), border-color var(--t-fast) var(--ease-out), transform var(--t-fast) var(--ease-out); } .btn:hover:not(:disabled) { background: var(--accent); border-color: var(--accent); } .btn:active:not(:disabled) { transform: translateY(1px); } .btn:disabled { opacity: 0.45; cursor: not-allowed; } .btn-ghost { display: inline-flex; align-items: center; gap: var(--sp-1); min-height: 32px; padding: 0 var(--sp-3); border-radius: var(--r-sm); border: 1px solid var(--hairline-strong); background: var(--surface); color: var(--ink-soft); font-family: var(--font-mono); font-size: var(--fs-2xs); transition: all var(--t-fast) var(--ease-out); } .btn-ghost:hover { border-color: var(--ink); color: var(--ink); } /* -------------------------------- home ---------------------------------- */ .hero { display: grid; grid-template-columns: 1fr; gap: var(--sp-8); padding: var(--sp-12) 0 var(--sp-8); align-items: center; } @media (min-width: 1024px) { .hero { grid-template-columns: 7fr 5fr; padding: var(--sp-16) 0 var(--sp-12); } } .hero h1 { font-family: var(--font-display); font-size: var(--fs-hero); font-weight: 560; line-height: 1.06; letter-spacing: -0.022em; } .hero h1 em { font-style: italic; color: var(--accent); } .hero .sub { margin-top: var(--sp-5); color: var(--ink-soft); font-size: var(--fs-lg); max-width: 32em; text-wrap: pretty; } .hero-art { display: none; justify-self: center; } @media (min-width: 1024px) { .hero-art { display: block; } } .ask { margin-top: var(--sp-8); display: flex; flex-direction: column; gap: var(--sp-3); } .ask .box { position: relative; border: 1.5px solid var(--hairline-strong); border-radius: var(--r-xl); background: var(--surface); box-shadow: var(--e-2); transition: border-color var(--t-fast) var(--ease-out), box-shadow var(--t-med) var(--ease-out); } .ask .box:focus-within { border-color: var(--ink); box-shadow: var(--e-3); } .ask textarea { display: block; width: 100%; min-height: 108px; padding: var(--sp-5) var(--sp-5) var(--sp-2); font-family: var(--font-body); font-size: var(--fs-md); line-height: 1.6; color: var(--ink); background: transparent; border: none; resize: vertical; outline: none; } .ask textarea::placeholder { color: var(--ink-faint); } .ask .box-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding: var(--sp-2) var(--sp-3) var(--sp-3); } .ask .hint { font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--ink-faint); padding-left: var(--sp-2); } .chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-2); } .chip { min-height: 36px; padding: var(--sp-1) var(--sp-4); border-radius: 999px; border: 1px solid var(--hairline-strong); background: transparent; color: var(--ink-soft); font-size: var(--fs-sm); text-align: left; transition: all var(--t-fast) var(--ease-out); } .chip:hover { border-color: var(--accent); color: var(--accent-deep); background: var(--accent-soft); } /* recent sessions */ .recent { margin: var(--sp-8) 0; } .recent h2, .pane h2, .board h2 { display: flex; align-items: center; gap: var(--sp-2); font-family: var(--font-mono); font-size: var(--fs-2xs); font-weight: 500; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-faint); margin-bottom: var(--sp-4); } .recent ul { list-style: none; border: 1px solid var(--hairline); border-radius: var(--r-lg); background: var(--surface); overflow: hidden; } .recent li + li { border-top: 1px solid var(--hairline); } .recent li a { display: flex; gap: var(--sp-4); align-items: center; padding: var(--sp-4) var(--sp-5); text-decoration: none; transition: background var(--t-fast) var(--ease-out); } .recent li a:hover { background: var(--paper-deep); } .recent .q { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); } .recent .arrow { color: var(--ink-faint); transition: transform var(--t-fast) var(--ease-out), color var(--t-fast) var(--ease-out); } .recent li a:hover .arrow { transform: translateX(3px); color: var(--accent); } .badge { font-family: var(--font-mono); font-size: var(--fs-2xs); padding: 3px 10px; border-radius: 999px; border: 1px solid var(--hairline-strong); color: var(--ink-soft); white-space: nowrap; background: var(--surface); } .badge.running, .badge.synthesizing, .badge.pending { color: var(--accent-deep); border-color: color-mix(in srgb, var(--accent) 40%, transparent); background: var(--accent-soft); } .badge.completed { color: var(--teal); border-color: color-mix(in srgb, var(--teal) 40%, transparent); background: var(--teal-soft); } .badge.failed { color: var(--red); border-color: color-mix(in srgb, var(--red) 35%, transparent); background: var(--red-soft); } /* ----------------------------- session page ------------------------------ */ .question-head { padding: var(--sp-6) 0 var(--sp-5); } .question-head .kicker { font-family: var(--font-mono); font-size: var(--fs-2xs); text-transform: uppercase; letter-spacing: 0.14em; color: var(--accent); margin-bottom: var(--sp-2); } .question-head h1 { font-family: var(--font-display); font-size: clamp(1.35rem, 3.6vw, 2.1rem); font-weight: 560; line-height: 1.18; letter-spacing: -0.015em; max-width: 30em; text-wrap: balance; } /* stats bar */ .statsbar { position: sticky; top: 0; z-index: 20; display: flex; gap: var(--sp-2); align-items: center; padding: var(--sp-2) 0; margin: 0 calc(-1 * var(--sp-4)); padding-left: var(--sp-4); padding-right: var(--sp-4); background: color-mix(in srgb, var(--paper) 88%, transparent); backdrop-filter: blur(10px); border-bottom: 1px solid var(--hairline); overflow-x: auto; scrollbar-width: none; } .statsbar::-webkit-scrollbar { display: none; } .stat-seg { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 5px 12px 5px 6px; border: 1px solid var(--hairline); border-radius: 999px; background: var(--surface); font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--ink-soft); white-space: nowrap; } .stat-seg b { color: var(--ink); font-weight: 600; font-variant-numeric: tabular-nums; } .stat-seg.phase { padding-left: 12px; border-color: color-mix(in srgb, var(--accent) 35%, transparent); background: var(--accent-soft); color: var(--accent-deep); } .stat-seg.phase.done { border-color: color-mix(in srgb, var(--teal) 35%, transparent); background: var(--teal-soft); color: var(--teal); } .stat-seg.phase.dead { border-color: color-mix(in srgb, var(--red) 30%, transparent); background: var(--red-soft); color: var(--red); } .pulse { width: 8px; height: 8px; min-width: 8px; border-radius: 50%; background: currentColor; animation: pulse 1.4s ease-in-out infinite; } .pulse.still { animation: none; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.35; transform: scale(0.72); } } /* research graph (the bloom) */ .bloom-wrap { margin-top: var(--sp-5); border: 1px solid var(--hairline); border-radius: var(--r-lg); background: radial-gradient(600px 200px at 12% 50%, rgba(200, 67, 26, 0.05), transparent 65%), var(--surface); box-shadow: var(--e-1); overflow: hidden; } .bloom-wrap svg { display: block; width: 100%; height: auto; } .rg-branch { fill: none; stroke: var(--hairline-strong); stroke-width: 1.5; stroke-dasharray: 900; stroke-dashoffset: 900; animation: grow 1.1s var(--ease-out) forwards; } .rg-twig { fill: none; stroke: var(--hairline-strong); stroke-width: 1.2; stroke-dasharray: 500; stroke-dashoffset: 500; animation: grow 0.9s var(--ease-out) forwards; } @keyframes grow { to { stroke-dashoffset: 0; } } .rg-node { animation: pop 0.5s var(--ease-out) both; transform-box: fill-box; transform-origin: center; } @keyframes pop { from { transform: scale(0); opacity: 0; } to { transform: scale(1); opacity: 1; } } .rg-label { font-family: var(--font-mono); font-size: 10.5px; fill: var(--ink-soft); } .rg-label.strong { fill: var(--ink); font-weight: 600; } .rg-qring { fill: none; stroke: var(--accent); stroke-width: 1.2; opacity: 0.5; } .rg-qring.live { animation: ripple 2.2s ease-out infinite; transform-box: fill-box; transform-origin: center; } @keyframes ripple { 0% { transform: scale(0.6); opacity: 0.7; } 100% { transform: scale(1.8); opacity: 0; } } /* tabs (mobile) / panes (desktop) */ .tabbar { display: flex; gap: var(--sp-2); padding: var(--sp-4) 0 var(--sp-2); } .tabbar button { flex: 1; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2); border: 1px solid var(--hairline-strong); background: var(--surface); border-radius: var(--r-md); font-family: var(--font-mono); font-size: var(--fs-2xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-soft); transition: all var(--t-fast) var(--ease-out); } .tabbar button.active { border-color: var(--ink); background: var(--ink); color: var(--paper); } .panes { display: grid; grid-template-columns: 1fr; gap: var(--sp-6); padding: var(--sp-4) 0 var(--sp-8); } .pane { min-width: 0; } @media (max-width: 1023px) { .pane { display: none; } .pane.visible { display: block; } } @media (min-width: 1024px) { .tabbar { display: none; } .panes { grid-template-columns: minmax(360px, 5fr) 7fr; align-items: start; } .pane.evidence-pane { grid-column: 1 / -1; } } /* ------------------------------- timeline -------------------------------- */ .tl { position: relative; display: flex; flex-direction: column; gap: var(--sp-3); } .tl::before { content: ""; position: absolute; left: 14.5px; top: 10px; bottom: 10px; width: 1.5px; background: linear-gradient(to bottom, var(--accent), var(--hairline) 30%, var(--hairline)); } .tl-row { position: relative; display: flex; gap: var(--sp-3); align-items: flex-start; animation: rise 0.45s var(--ease-out) both; } @keyframes rise { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: translateY(0); } } .tl-row .pastille { z-index: 1; } .tl-card { flex: 1; min-width: 0; background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); padding: var(--sp-3) var(--sp-4); box-shadow: var(--e-1); transition: border-color var(--t-fast) var(--ease-out); } .tl-row:hover .tl-card { border-color: var(--hairline-strong); } .tl-row.is-contradiction .tl-card { border-color: color-mix(in srgb, var(--accent) 45%, transparent); background: linear-gradient(0deg, var(--accent-soft), var(--surface) 55%); } .tl-head { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; font-family: var(--font-mono); font-size: var(--fs-2xs); text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-faint); } .tl-body { margin-top: 3px; font-size: var(--fs-sm); overflow-wrap: anywhere; } .tl-body .mono { font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--ink-faint); } .tl-quote { margin-top: var(--sp-2); padding: var(--sp-2) var(--sp-3); background: var(--teal-soft); border-left: 3px solid var(--teal); border-radius: var(--r-sm); font-size: var(--fs-sm); font-style: italic; color: color-mix(in srgb, var(--teal) 70%, var(--ink)); } .tl-quote.contradicts { background: var(--accent-soft); border-left-color: var(--accent); color: var(--accent-deep); } .tl-objectives { margin: var(--sp-2) 0 0; padding-left: var(--sp-5); font-size: var(--fs-sm); color: var(--ink-soft); } .tl-objectives li { margin-bottom: 2px; } .tl-empty { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-5); border: 1px dashed var(--hairline-strong); border-radius: var(--r-md); color: var(--ink-faint); font-family: var(--font-mono); font-size: var(--fs-xs); } .status-chip { font-family: var(--font-mono); font-size: var(--fs-2xs); padding: 1px 8px; border-radius: 999px; text-transform: none; letter-spacing: 0; } .status-chip.supported { background: var(--teal-soft); color: var(--teal); } .status-chip.contradicted { background: var(--accent-soft); color: var(--accent-deep); } .status-chip.uncertain { background: var(--amber-soft); color: var(--amber); } .status-chip.exploring { background: var(--paper-deep); color: var(--ink-soft); } /* -------------------------------- answer --------------------------------- */ .answer-panel { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-lg); box-shadow: var(--e-2); overflow: hidden; } .answer-head { display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--hairline); background: var(--paper-deep); } .answer-head .lbl { font-family: var(--font-mono); font-size: var(--fs-2xs); text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-soft); } .answer-head .btn-ghost { margin-left: auto; } .answer-body { padding: var(--sp-6); } .answer-waiting { display: flex; flex-direction: column; gap: var(--sp-3); } .answer-waiting p { color: var(--ink-faint); font-family: var(--font-mono); font-size: var(--fs-xs); } .skel { height: 12px; border-radius: 6px; background: linear-gradient(90deg, var(--paper-deep) 25%, var(--hairline) 50%, var(--paper-deep) 75%); background-size: 200% 100%; animation: shimmer 1.6s linear infinite; } @keyframes shimmer { to { background-position: -200% 0; } } .answer-md { font-size: var(--fs-md); line-height: 1.68; } .answer-md h1, .answer-md h2, .answer-md h3 { font-family: var(--font-display); font-weight: 600; letter-spacing: -0.012em; margin: var(--sp-6) 0 var(--sp-3); line-height: 1.22; } .answer-md h1 { font-size: var(--fs-xl); margin-top: 0; } .answer-md h2 { font-size: var(--fs-lg); } .answer-md h3 { font-size: var(--fs-md); } .answer-md p, .answer-md ul, .answer-md ol { margin-bottom: var(--sp-3); } .answer-md ul, .answer-md ol { padding-left: var(--sp-6); } .answer-md strong { font-weight: 650; } .answer-md table { border-collapse: collapse; width: 100%; margin: var(--sp-4) 0; font-size: var(--fs-sm); } .answer-md th, .answer-md td { border: 1px solid var(--hairline); padding: var(--sp-2) var(--sp-3); text-align: left; } .answer-md th { font-family: var(--font-mono); font-size: var(--fs-2xs); text-transform: uppercase; letter-spacing: 0.06em; background: var(--paper-deep); } .answer-md code { font-family: var(--font-mono); font-size: 0.88em; background: var(--paper-deep); border: 1px solid var(--hairline); padding: 1px 5px; border-radius: 5px; } .answer-md blockquote { border-left: 3px solid var(--hairline-strong); padding-left: var(--sp-4); color: var(--ink-soft); margin-bottom: var(--sp-3); } .answer-md sup.cite a { font-family: var(--font-mono); font-size: 0.72em; color: var(--accent); font-weight: 700; text-decoration: none; padding: 0 2px; border-radius: 4px; } .answer-md sup.cite a:hover { background: var(--accent-soft); } .caret { display: inline-block; width: 8px; height: 1.05em; background: var(--accent); border-radius: 2px; vertical-align: text-bottom; margin-left: 2px; animation: pulse 1s ease-in-out infinite; } /* --------------------------- claims & sources ---------------------------- */ .board { margin-top: var(--sp-2); } .claims-grid { display: grid; grid-template-columns: 1fr; gap: var(--sp-3); margin-bottom: var(--sp-6); } @media (min-width: 768px) { .claims-grid { grid-template-columns: 1fr 1fr; } } @media (min-width: 1280px) { .claims-grid { grid-template-columns: 1fr 1fr 1fr; } } .claim-card { background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); padding: var(--sp-4); box-shadow: var(--e-1); display: flex; flex-direction: column; gap: var(--sp-2); } .claim-card .txt { font-size: var(--fs-sm); line-height: 1.45; flex: 1; } .claim-card .why { font-size: var(--fs-xs); color: var(--ink-faint); } .meter { display: flex; align-items: center; gap: var(--sp-2); } .meter .bar { flex: 1; height: 6px; border-radius: 999px; background: var(--paper-deep); overflow: hidden; } .meter .fill { display: block; height: 100%; border-radius: 999px; background: var(--teal); transition: width 0.6s var(--ease-out); } .meter.contradicted .fill { background: var(--accent); } .meter.uncertain .fill { background: var(--amber); } .meter.exploring .fill { background: var(--ink-faint); } .meter .pct { font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--ink-soft); font-variant-numeric: tabular-nums; min-width: 34px; text-align: right; } .source-list { list-style: none; display: grid; grid-template-columns: 1fr; gap: var(--sp-2); } @media (min-width: 768px) { .source-list { grid-template-columns: 1fr 1fr; } } @media (min-width: 1280px) { .source-list { grid-template-columns: 1fr 1fr 1fr; } } .source-card { display: flex; gap: var(--sp-3); padding: var(--sp-3); background: var(--surface); border: 1px solid var(--hairline); border-radius: var(--r-md); text-decoration: none; min-height: 56px; align-items: center; transition: border-color var(--t-fast) var(--ease-out), transform var(--t-fast) var(--ease-out); } .source-card:hover { border-color: var(--ink); transform: translateY(-1px); } .tile { width: 34px; height: 34px; min-width: 34px; border-radius: 9px; display: grid; place-items: center; color: #fff; font-family: var(--font-mono); font-weight: 700; font-size: var(--fs-sm); text-transform: uppercase; } .source-card .meta { min-width: 0; flex: 1; } .source-card .title { font-size: var(--fs-sm); overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; } .source-card .domain { font-family: var(--font-mono); font-size: var(--fs-2xs); color: var(--ink-faint); } .source-card .cite-idx { font-family: var(--font-mono); font-size: var(--fs-2xs); font-weight: 700; color: var(--accent); border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent); background: var(--accent-soft); border-radius: 7px; padding: 2px 7px; } .error-box { display: flex; gap: var(--sp-3); align-items: center; margin: var(--sp-4) 0; padding: var(--sp-4); border: 1px solid color-mix(in srgb, var(--red) 40%, transparent); border-radius: var(--r-md); background: var(--red-soft); color: var(--red); font-family: var(--font-mono); font-size: var(--fs-xs); } /* ------------------------------ reduced motion --------------------------- */ @media (prefers-reduced-motion: reduce) { .tl-row, .rg-branch, .rg-twig, .rg-node, .skel { animation: none !important; } .rg-branch, .rg-twig { stroke-dashoffset: 0 !important; } .pulse, .caret, .rg-qring.live, .pastille.spinning::after { animation: none !important; } html { scroll-behavior: auto; } } /* graph labels collapse on small screens */ .rg-sm { display: none; } @media (min-width: 768px) { .rg-sm { display: block; } }