/* Scandinavian / Djøf-inspired style system. Calm and editorial: pale sage hero, near-black text, generous whitespace, humanist display headings, monochrome UI with a deep-teal accent. */ :root { /* Colors */ --color-sage: #C4D5D3; /* hero + header background */ --color-sage-deep: #B4C9C6; /* sage borders / dividers */ --color-sage-light: #E7EFEE; /* alt section background */ --color-bg: #FFFFFF; --color-ink: #15211D; /* near-black, faint teal cast */ --color-primary: #15211D; --color-accent: #1F4A3F; /* deep teal for links / focus */ --color-accent-dark: #16352D; --color-text-primary: #15211D; --color-text-secondary: #45524E; --color-text-muted: #6E7B77; --color-border: #D7E0DD; --color-footer-bg: #15211D; --color-footer-text: #FFFFFF; /* Typography */ --font-display: 'Bricolage Grotesque', 'Inter', system-ui, sans-serif; --font-sans: 'Inter', system-ui, -apple-system, sans-serif; --text-xs: 0.75rem; --text-sm: 0.875rem; --text-base: 1rem; --text-lg: 1.125rem; --text-xl: 1.25rem; --text-2xl: 1.5rem; --text-3xl: 1.875rem; --text-4xl: 2.25rem; --text-5xl: 3.25rem; --font-normal: 400; --font-medium: 500; --font-semibold: 600; --font-bold: 700; --leading-tight: 1.12; --leading-snug: 1.35; --leading-normal: 1.65; /* Spacing */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; --space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem; --space-16: 4rem; --space-20: 5rem; --space-24: 6rem; /* Layout */ --max-width-content: 1200px; --max-width-text: 720px; --section-padding-y: 5.5rem; /* Radius */ --radius-sm: 4px; --radius-md: 10px; --radius-lg: 16px; --radius-xl: 24px; --radius-pill: 9999px; /* Shadows */ --shadow-sm: 0 1px 3px rgba(21,33,29,0.06); --shadow-md: 0 6px 24px rgba(21,33,29,0.08); --shadow-lg: 0 16px 48px rgba(21,33,29,0.12); /* Transitions */ --transition-fast: 0.15s ease; --transition-base: 0.25s ease; --transition-slow: 0.4s ease; } * { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; font-family: var(--font-sans); font-size: var(--text-base); line-height: var(--leading-normal); color: var(--color-text-primary); background: var(--color-bg); -webkit-font-smoothing: antialiased; } h1, h2, h3, h4 { font-family: var(--font-display); } .container { max-width: var(--max-width-content); margin: 0 auto; padding: 0 var(--space-6); } /* ---------- Header ---------- */ /* The header shares the sage backdrop with the hero so they read as one block. */ .site-header { position: sticky; top: 0; z-index: 50; height: 76px; display: flex; align-items: center; background: var(--color-sage); } .site-header .container { display: flex; align-items: center; justify-content: space-between; width: 100%; } .logo { font-family: var(--font-display); font-weight: var(--font-bold); font-size: var(--text-2xl); color: var(--color-ink); letter-spacing: -0.02em; } .logo span { color: var(--color-accent); } .nav { display: flex; gap: var(--space-8); align-items: center; } .nav a { color: var(--color-ink); text-decoration: none; font-weight: var(--font-semibold); font-size: var(--text-base); transition: opacity var(--transition-base); } .nav a:hover { opacity: 0.6; } .lang-switch { display: flex; gap: var(--space-1); align-items: center; } .lang-switch button { border: none; background: none; cursor: pointer; font: inherit; font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text-secondary); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); transition: color var(--transition-base); } .lang-switch button:hover { color: var(--color-ink); } .lang-switch button.active { color: var(--color-ink); font-weight: var(--font-bold); } /* ---------- Buttons ---------- */ /* Solid ink primary, ink-outline secondary — monochrome, editorial. */ .btn-primary { background-color: var(--color-ink); color: #fff; font-family: var(--font-sans); font-weight: var(--font-semibold); font-size: var(--text-base); padding: 0.85rem 1.9rem; border-radius: var(--radius-md); border: 1.5px solid var(--color-ink); cursor: pointer; transition: background-color var(--transition-base), transform var(--transition-fast); } .btn-primary:hover { background-color: var(--color-accent); border-color: var(--color-accent); transform: translateY(-1px); } .btn-secondary { background-color: transparent; color: var(--color-ink); font-family: var(--font-sans); font-weight: var(--font-semibold); font-size: var(--text-base); padding: 0.85rem 1.9rem; border-radius: var(--radius-md); border: 1.5px solid var(--color-ink); cursor: pointer; transition: background-color var(--transition-base), color var(--transition-base); } .btn-secondary:hover { background-color: var(--color-ink); color: #fff; } /* ---------- Sections ---------- */ section { padding: var(--section-padding-y) 0; } .section-alt { background: var(--color-sage-light); } .section-title { font-size: var(--text-4xl); font-weight: var(--font-semibold); line-height: var(--leading-tight); letter-spacing: -0.02em; margin: 0 0 var(--space-3); } /* ---------- Hero ---------- */ .hero { background: var(--color-sage); padding-top: var(--space-12); padding-bottom: var(--space-24); } .hero .container { display: grid; grid-template-columns: 1.1fr 0.9fr; gap: var(--space-16); align-items: center; } .hero h1 { font-size: var(--text-5xl); font-weight: var(--font-bold); line-height: var(--leading-tight); letter-spacing: -0.03em; margin: 0 0 var(--space-6); } .hero .lead { font-size: var(--text-lg); color: var(--color-text-secondary); max-width: 34ch; margin: 0 0 var(--space-8); } .hero-actions { display: flex; gap: var(--space-4); flex-wrap: wrap; } /* Hero visual: rounded media card holding the inline SVG illustration. */ .hero-visual { aspect-ratio: 4 / 3; width: 100%; border-radius: var(--radius-lg); overflow: hidden; background: linear-gradient(150deg, #DCE8E6 0%, #B7CCC8 100%); box-shadow: var(--shadow-md); display: flex; align-items: center; justify-content: center; } .hero-visual svg { width: 78%; height: auto; } /* ---------- Feature cards ---------- */ .card-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-6); margin-top: var(--space-10); } .feature-card { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-8); display: flex; flex-direction: column; gap: var(--space-3); transition: transform var(--transition-base), box-shadow var(--transition-base); } .feature-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); } .section-alt .feature-card { background: #fff; } .feature-card h3 { font-size: var(--text-xl); font-weight: var(--font-semibold); letter-spacing: -0.01em; margin: 0; } .feature-card p { font-size: var(--text-base); color: var(--color-text-secondary); margin: 0; } .feature-icon { width: 40px; height: 40px; border-radius: var(--radius-md); background: var(--color-sage); display: inline-flex; } /* ---------- Chat panel ---------- */ .panel { max-width: var(--max-width-text); margin: 0 auto; background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-xl); box-shadow: var(--shadow-md); overflow: hidden; } .chat-log { padding: var(--space-6); display: flex; flex-direction: column; gap: var(--space-4); min-height: 280px; max-height: 460px; overflow-y: auto; } .msg { max-width: 80%; padding: var(--space-3) var(--space-4); border-radius: var(--radius-lg); font-size: var(--text-base); line-height: var(--leading-snug); } .msg.user { align-self: flex-end; background: var(--color-ink); color: #fff; border-bottom-right-radius: var(--radius-sm); } .msg.assistant { align-self: flex-start; background: var(--color-sage-light); color: var(--color-text-primary); border-bottom-left-radius: var(--radius-sm); } .msg.assistant { line-height: var(--leading-normal); } .msg.assistant p { margin: 0 0 0.65em; } .msg.assistant p:last-of-type { margin-bottom: 0; } .msg.assistant .cite-ref { font-weight: var(--font-semibold); color: var(--color-accent); white-space: nowrap; } .msg.assistant .citations { display:block; margin-top: var(--space-3); padding-top: var(--space-2); border-top: 1px solid var(--color-sage-deep); font-size: var(--text-xs); color: var(--color-text-muted); } .msg.assistant .disclaimer-inline { border-top: none; padding-top: 0; margin-top: var(--space-1); font-style: italic; } .msg.assistant.msg-warming { font-style: italic; color: var(--color-text-secondary); animation: warm-pulse 1.6s ease-in-out infinite; } @keyframes warm-pulse { 0%,100% { opacity: 0.6; } 50% { opacity: 1; } } .chat-input { display: flex; gap: var(--space-3); padding: var(--space-4) var(--space-6); border-top: 1px solid var(--color-border); align-items: center; } .chat-input input[type="text"] { flex: 1; border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 0.8rem 1.1rem; font: inherit; font-size: var(--text-base); outline: none; transition: border-color var(--transition-base); } .chat-input input[type="text"]:focus { border-color: var(--color-accent); } .upload-row { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-6) var(--space-5); font-size: var(--text-sm); color: var(--color-text-muted); } .upload-row label.file-btn { cursor: pointer; color: var(--color-ink); font-weight: var(--font-semibold); border: 1px dashed var(--color-sage-deep); padding: var(--space-2) var(--space-4); border-radius: var(--radius-md); transition: background-color var(--transition-base); } .upload-row label.file-btn:hover { background: var(--color-sage-light); } .upload-row input[type="file"] { display: none; } /* ---------- Disclaimer ---------- */ .disclaimer { max-width: var(--max-width-text); margin: var(--space-6) auto 0; font-size: var(--text-sm); color: var(--color-text-muted); text-align: center; } /* ---------- Footer ---------- */ .site-footer { background: var(--color-footer-bg); color: var(--color-footer-text); padding: var(--space-16) 0 var(--space-8); } .site-footer a { color: var(--color-footer-text); opacity: 0.8; text-decoration: none; } .site-footer a:hover { opacity: 1; } .footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: var(--space-8); } .footer-grid h4 { font-size: var(--text-base); font-weight: var(--font-semibold); margin: 0 0 var(--space-4); } .footer-grid ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: var(--space-2); } .footer-meta { margin-top: var(--space-10); font-size: var(--text-sm); opacity: 0.55; } /* ---------- Hero note + section lead ---------- */ .hero-note { margin-top: var(--space-5); font-size: var(--text-sm); color: var(--color-text-muted); max-width: 40ch; } .section-lead { font-size: var(--text-lg); color: var(--color-text-secondary); max-width: 56ch; margin: 0 0 var(--space-8); } /* ---------- Wizard ---------- */ .wizard { max-width: var(--max-width-text); margin: 0 auto; padding: var(--space-8); } .wizard-progress { display: flex; gap: var(--space-2); margin-bottom: var(--space-8); } .wiz-dot { flex: 1; height: 4px; border-radius: var(--radius-pill); background: var(--color-border); transition: background var(--transition-base); } .wiz-dot.done { background: var(--color-accent); } .wiz-dot.active { background: var(--color-ink); } .wizard-body { min-height: 220px; } .wiz-q h3 { font-size: var(--text-2xl); font-weight: var(--font-semibold); letter-spacing: -0.01em; margin: 0 0 var(--space-2); } .wiz-help { font-size: var(--text-sm); color: var(--color-text-muted); margin: 0 0 var(--space-6); line-height: var(--leading-snug); } .wiz-options { display: flex; flex-direction: column; gap: var(--space-3); } .wiz-opt { text-align: left; font: inherit; font-size: var(--text-base); font-weight: var(--font-medium); background: #fff; color: var(--color-ink); border: 1.5px solid var(--color-border); border-radius: var(--radius-md); padding: 0.85rem 1.1rem; cursor: pointer; transition: border-color var(--transition-base), background var(--transition-base), transform var(--transition-fast); } .wiz-opt:hover { border-color: var(--color-accent); transform: translateX(2px); } .wiz-opt.selected { border-color: var(--color-ink); background: var(--color-sage-light); font-weight: var(--font-semibold); } .wiz-opt.skip { color: var(--color-text-muted); font-style: italic; border-style: dashed; } .wiz-input { width: 100%; font: inherit; font-size: var(--text-lg); border: 1.5px solid var(--color-border); border-radius: var(--radius-md); padding: 0.85rem 1.1rem; outline: none; transition: border-color var(--transition-base); } .wiz-input:focus { border-color: var(--color-accent); } .wiz-range { display: flex; align-items: center; gap: var(--space-3); } .wiz-range-sep { color: var(--color-text-muted); font-size: var(--text-xl); } .wiz-tabs { display: flex; gap: var(--space-2); margin-bottom: var(--space-5); } .wiz-tab { flex: 1; font: inherit; font-size: var(--text-sm); font-weight: var(--font-medium); cursor: pointer; background: #fff; color: var(--color-text-secondary); border: 1.5px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); transition: border-color var(--transition-base), background var(--transition-base); } .wiz-tab.active { border-color: var(--color-ink); background: var(--color-sage-light); color: var(--color-ink); font-weight: var(--font-semibold); } .wiz-perks { display: flex; flex-direction: column; gap: var(--space-3); } .wiz-preview { margin: var(--space-3) 0 0; font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-accent); } .wizard-nav { display: flex; align-items: center; justify-content: space-between; margin-top: var(--space-8); } .wizard-counter { font-size: var(--text-sm); color: var(--color-text-muted); font-weight: var(--font-medium); } .wiz-shake { animation: wiz-shake 0.45s; } @keyframes wiz-shake { 0%,100%{transform:translateX(0)} 20%,60%{transform:translateX(-7px)} 40%,80%{transform:translateX(7px)} } /* ---------- Dashboard ---------- */ .dash-loading, .dash-error { text-align: center; color: var(--color-text-muted); padding: var(--space-8); } .dash-error { color: var(--color-accent-dark); } .kpi-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-8); } .kpi { background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-6); box-shadow: var(--shadow-sm); } .kpi-accent { background: var(--color-ink); color: #fff; border-color: var(--color-ink); } .kpi-big { font-family: var(--font-display); font-size: var(--text-3xl); font-weight: var(--font-bold); letter-spacing: -0.02em; line-height: 1.1; } .kpi-lbl { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text-primary); margin-top: var(--space-2); line-height: var(--leading-snug); } .kpi-accent .kpi-lbl { color: #fff; } .kpi-sub { font-size: var(--text-xs); color: var(--color-text-secondary); margin-top: var(--space-2); line-height: var(--leading-snug); } .kpi-accent .kpi-sub { color: var(--color-sage); } .kpi-cite { font-size: var(--text-xs); color: var(--color-text-muted); margin-top: var(--space-2); } .kpi-accent .kpi-cite { color: rgba(255,255,255,0.55); } .dash-subtitle { font-size: var(--text-2xl); font-weight: var(--font-semibold); letter-spacing: -0.01em; margin: var(--space-10) 0 var(--space-2); } .dash-subtitle:first-child { margin-top: 0; } .dash-explain { font-size: var(--text-sm); color: var(--color-text-secondary); max-width: 64ch; margin: 0 0 var(--space-6); line-height: var(--leading-normal); } .cell-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--space-4); } .cell-card { background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-5); display: flex; flex-direction: column; gap: var(--space-2); } .cell-head { font-weight: var(--font-semibold); font-size: var(--text-base); line-height: var(--leading-snug); } .cell-measure { font-size: var(--text-base); display: flex; flex-direction: column; gap: 2px; } .cell-central strong { font-size: var(--text-xl); } .cell-tag { display: block; font-size: var(--text-xs); color: var(--color-text-muted); font-weight: var(--font-normal); } .cell-range { font-size: var(--text-sm); color: var(--color-text-secondary); } .cell-proj { font-size: var(--text-sm); color: var(--color-accent); font-weight: var(--font-medium); } .cell-foot { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-4); margin-top: var(--space-2); } .cell-tier { font-size: var(--text-xs); font-weight: var(--font-semibold); padding: 2px 8px; border-radius: var(--radius-pill); background: var(--color-sage-light); color: var(--color-accent-dark); } .tier-mean_only, .tier-suppressed { background: #F3E6DE; color: #7A4A2E; } .cell-cite { font-size: var(--text-xs); color: var(--color-text-muted); } .dash-notes { max-width: var(--max-width-text); margin: var(--space-8) auto 0; padding-left: var(--space-5); color: var(--color-text-secondary); font-size: var(--text-sm); line-height: var(--leading-normal); } .dash-notes li { margin-bottom: var(--space-2); } /* ---------- "Coming soon" placeholder banner ---------- */ .coming-soon { background: var(--color-sage-light); border: 1px dashed var(--color-sage-deep); border-radius: var(--radius-md); padding: var(--space-3) var(--space-5); margin-bottom: var(--space-5); font-size: var(--text-sm); color: var(--color-accent-dark); line-height: var(--leading-snug); } /* ---------- Dashboard view toggle + visual charts ---------- */ .dash-toolbar { display: flex; justify-content: flex-end; margin-bottom: var(--space-6); } .dash-toolbar .btn-secondary { padding: 0.6rem 1.2rem; font-size: var(--text-sm); } .visual-floor { background: var(--color-ink); color: #fff; border-radius: var(--radius-lg); padding: var(--space-5) var(--space-6); margin-bottom: var(--space-6); font-size: var(--text-base); line-height: var(--leading-snug); } .visual-floor strong { color: var(--color-sage); } .chart-grid { display: grid; grid-template-columns: 2fr 1fr; gap: var(--space-6); align-items: stretch; } .chart-card { background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-6); box-shadow: var(--shadow-sm); display: flex; flex-direction: column; } .chart-title { font-size: var(--text-lg); font-weight: var(--font-semibold); margin: 0 0 var(--space-4); } .chart { width: 100%; height: auto; } .chart-gauge { align-items: center; text-align: center; } .chart-gauge .chart { max-width: 180px; } .chart-cap { font-size: var(--text-sm); color: var(--color-text-secondary); margin: var(--space-3) 0 0; line-height: var(--leading-snug); } .chart-cap strong { color: var(--color-ink); } .chart-cap-wide { text-align: center; margin-top: var(--space-6); font-size: var(--text-base); } .chart-bars { margin-top: var(--space-6); } /* bell curve */ .bc-area { fill: var(--color-sage-light); } .bc-line { fill: none; stroke: var(--color-accent); stroke-width: 2.5; } .bc-axis { stroke: var(--color-border); stroke-width: 1.5; } .bc-median { stroke: var(--color-accent); stroke-width: 1.5; stroke-dasharray: 4 4; } .bc-you { stroke: var(--color-ink); stroke-width: 2.5; } .bc-you-dot { fill: var(--color-ink); } .bc-floor { stroke: #B0641E; stroke-width: 1.5; stroke-dasharray: 2 3; } .bc-lbl { fill: var(--color-accent-dark); font-size: 11px; font-weight: 600; font-family: var(--font-sans); } .bc-foot { fill: var(--color-text-muted); font-size: 11px; font-family: var(--font-sans); } .bc-foot-you { fill: var(--color-ink); font-weight: 700; } /* gauge */ .ga-track { fill: none; stroke: var(--color-border); stroke-width: 12; } .ga-fill { fill: none; stroke: var(--color-accent); stroke-width: 12; stroke-linecap: round; } .ga-big { fill: var(--color-ink); font-size: 30px; font-weight: 700; font-family: var(--font-display); } .ga-sub { fill: var(--color-text-muted); font-size: 12px; font-family: var(--font-sans); } /* highlighted "typical pay to ask" inside the standing card */ .standing-ask { margin-top: var(--space-5); width: 100%; background: var(--color-sage-light); border: 1px solid var(--color-sage-deep); border-radius: var(--radius-md); padding: var(--space-4) var(--space-5); } .standing-ask-lbl { font-size: var(--text-xs); font-weight: var(--font-semibold); color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.04em; } .standing-ask-big { font-family: var(--font-display); font-size: var(--text-2xl); font-weight: var(--font-bold); color: var(--color-accent-dark); letter-spacing: -0.01em; line-height: 1.15; } .standing-ask-sub { font-size: var(--text-xs); color: var(--color-text-muted); } /* horizontal comparison bars */ .vbar-wrap { position: relative; display: flex; flex-direction: column; gap: var(--space-4); padding-top: var(--space-5); } .vbar-row { display: flex; flex-direction: column; gap: 4px; } .vbar-label { font-size: var(--text-sm); color: var(--color-text-secondary); } .vbar-track { position: relative; height: 26px; display: flex; align-items: center; gap: 8px; } .vbar-fill { height: 100%; background: var(--color-accent); border-radius: var(--radius-sm); min-width: 2px; } .vbar-val { font-size: var(--text-xs); font-weight: 600; color: var(--color-ink); white-space: nowrap; } .vbar-you { position: absolute; top: 0; bottom: 0; border-left: 2px dashed var(--color-ink); } .vbar-you span { position: absolute; top: -18px; left: 4px; white-space: nowrap; font-size: var(--text-xs); font-weight: 700; color: var(--color-ink); } /* ---------- Chat seeds ---------- */ .chat-seeds { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: var(--space-5) var(--space-6) 0; } .seed-chip { font: inherit; font-size: var(--text-sm); cursor: pointer; background: var(--color-sage-light); color: var(--color-accent-dark); border: 1px solid var(--color-sage-deep); border-radius: var(--radius-pill); padding: var(--space-2) var(--space-4); transition: background var(--transition-base); } .seed-chip:hover { background: var(--color-sage); } .disclaimer-inline { font-style: italic; } /* ---------- Responsive ---------- */ @media (max-width: 900px) { .hero .container { grid-template-columns: 1fr; gap: var(--space-10); } .hero-visual { order: -1; max-width: 460px; } } @media (max-width: 768px) { section { padding: 3.5rem 0; } .hero h1 { font-size: var(--text-4xl); } .section-title { font-size: var(--text-3xl); } .card-grid { grid-template-columns: 1fr; } .footer-grid { grid-template-columns: 1fr; } .nav .nav-links { display: none; } .chart-grid { grid-template-columns: 1fr; } }