/* ============================================================ Kontra — Broadsheet Editorial (prototype tokens + layout) Source: DESIGN.md. CSS custom properties = design tokens. Responsive: desktop ≥1024 / tablet 641–1023 / mobile ≤640. ============================================================ */ :root { --canvas: #fbf9f3; --canvas-bright: #ffffff; --surface: #f0eee8; --surface-hi: #eae8e2; --surface-highest: #e4e2dd; --ink: #1b1c18; --ink-muted: #444748; --ink-faint: #747878; --accent: #ad3222; --accent-deep: #8b190d; --accent-soft: #ffdad4; --on-accent-soft: #400100; --ink-inverse: #1c1b1b; --on-ink-inverse: #ffffff; --outline: #c4c7c7; --hairline: #e4e2dd; --scrim: rgba(26, 26, 26, 0.4); --font-display: 'Newsreader', Garamond, Georgia, serif; --font-body: 'Literata', Georgia, 'Times New Roman', serif; --font-ui: 'Work Sans', 'Helvetica Neue', Arial, sans-serif; --space-2xs: 4px; --space-xs: 8px; --space-sm: 12px; --space-md: 16px; --space-lg: 24px; --space-xl: 32px; --space-2xl: 48px; --content-max: 42rem; --gutter: 24px; --gutter-mobile: 20px; } html { -webkit-font-smoothing: antialiased; } body { margin: 0; background: var(--canvas); color: var(--ink); font-family: var(--font-body); overscroll-behavior-y: none; } /* ---------- Type ---------- */ .font-display { font-family: var(--font-display); } .font-body { font-family: var(--font-body); } .font-ui { font-family: var(--font-ui); } .display-masthead { font-family: var(--font-display); font-weight: 700; font-size: 34px; line-height: 1.1; letter-spacing: -0.03em; } .headline-xl { font-family: var(--font-display); font-weight: 600; font-size: 30px; line-height: 1.22; letter-spacing: -0.02em; } .headline-lg { font-family: var(--font-display); font-weight: 600; font-size: 24px; line-height: 1.26; letter-spacing: -0.01em; } .headline-md { font-family: var(--font-display); font-weight: 500; font-size: 20px; line-height: 1.3; } .headline-sm { font-family: var(--font-display); font-weight: 600; font-size: 17px; line-height: 1.33; } .headline-sub { font-family: var(--font-display); font-weight: 500; font-size: 15px; line-height: 1.33; } .body-lead { font-family: var(--font-body); font-weight: 400; font-size: 19px; line-height: 1.58; letter-spacing: -0.005em; } .body-md { font-family: var(--font-body); font-weight: 400; font-size: 17px; line-height: 1.65; } .body-sm { font-family: var(--font-body); font-weight: 400; font-size: 14px; line-height: 1.57; } .quote-display { font-family: var(--font-display); font-style: italic; font-weight: 400; font-size: 21px; line-height: 1.45; letter-spacing: -0.01em; } .label-caps { font-family: var(--font-ui); font-weight: 600; font-size: 11px; line-height: 16px; letter-spacing: 0.12em; text-transform: uppercase; } .label-meta { font-family: var(--font-ui); font-weight: 500; font-size: 12px; line-height: 18px; letter-spacing: 0.02em; } .label-ui { font-family: var(--font-ui); font-weight: 500; font-size: 14px; line-height: 20px; letter-spacing: 0.01em; } /* ---------- Layout shell ---------- */ .container { max-width: 1200px; margin: 0 auto; padding: 0 var(--gutter); } .content-column { max-width: var(--content-max); margin-left: auto; margin-right: auto; } @media (max-width: 640px) { .container { padding: 0 var(--gutter-mobile); } } /* ---------- Hairlines ---------- */ .hairline-t { border-top: 1px solid var(--hairline); } .hairline-b { border-bottom: 1px solid var(--hairline); } .hairline-y { border-top: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline); } /* ---------- Buttons / forms ---------- */ .btn-primary { font-family: var(--font-ui); font-weight: 600; font-size: 12px; letter-spacing: 0.12em; text-transform: uppercase; background: var(--ink-inverse); color: var(--on-ink-inverse); border: none; border-radius: 0; min-height: 42px; padding: 0 16px; transition: background 150ms; cursor: pointer; } .btn-primary:hover { background: var(--accent); } .btn-primary:active { transform: scale(0.97); } .btn-secondary { font-family: var(--font-ui); font-weight: 600; font-size: 12px; letter-spacing: 0.12em; text-transform: uppercase; background: transparent; color: var(--ink); border: 1px solid var(--ink); border-radius: 0; min-height: 42px; padding: 0 16px; transition: background 150ms; cursor: pointer; } .btn-secondary:active { background: rgba(27,28,24,0.1); } .field { font-family: var(--font-body); font-size: 13px; color: var(--ink); background: var(--surface); border: 1px solid var(--hairline); border-radius: 0; padding: 8px 14px; min-height: 40px; } .field:focus { border-color: var(--ink); background: var(--canvas-bright); outline: none; } .field::placeholder { color: var(--ink-faint); } /* ---------- Figures ---------- */ figure.plate { background: var(--surface); border-top: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline); } figure.plate img { display: block; width: 100%; filter: grayscale(1) contrast(1.08); } figure.gridplate { background: var(--surface); border: 1px solid var(--hairline); } figure.gridplate img { display: block; width: 100%; aspect-ratio: 3/2; filter: grayscale(1) contrast(1.05); } .pullquote { background: var(--surface); border-left: 4px solid var(--accent); padding: 24px; border-radius: 0; } .pullquote .mark { font-family: var(--font-display); color: var(--accent); font-size: 38px; line-height: 1; opacity: 0.8; } /* Selection */ ::selection { background: var(--accent-soft); color: var(--on-accent-soft); } /* ============================================================ MASTHEAD (centered brand + dropdown ribbon) ============================================================ */ .masthead { position: sticky; top: 0; z-index: 50; background: var(--canvas); border-bottom: 1px solid var(--hairline); } .meta-line { display: flex; justify-content: space-between; align-items: center; font-family: var(--font-ui); letter-spacing: 0.12em; text-transform: uppercase; font-size: 11px; font-weight: 600; color: var(--ink-muted); border-bottom: 1px solid var(--hairline); padding-bottom: 6px; } .meta-line .edition { color: var(--accent); } /* Centered brand: left spacer mirrors the right icon cluster for optical centering */ .brand-row { display: grid; grid-template-columns: 52px 1fr 52px; align-items: center; padding: 10px 0; } .brand-row .brand { text-align: center; } .brand-row .brand a { text-decoration: none; color: var(--ink); } .brand-tools { display: flex; align-items: center; gap: 8px; justify-content: flex-end; } .brand-tools a { color: var(--ink-muted); text-decoration: none; } .brand-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--ink-inverse); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 13px; text-decoration: none; } /* Ribbon + dropdowns (desktop/tablet) */ .ribbon { display: flex; align-items: stretch; gap: 0; border-top: 1px solid var(--hairline); position: relative; font-family: var(--font-ui); } .ribbon .nav-item { position: relative; padding: 10px 18px 11px; } .ribbon .nav-item > a { font-family: var(--font-ui); font-weight: 600; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-muted); text-decoration: none; display: inline-block; white-space: nowrap; border-bottom: 2px solid transparent; padding-bottom: 1px; } .ribbon .nav-item.active > a { color: var(--ink); border-bottom-color: var(--ink); } .ribbon .nav-item.accent > a { color: var(--accent); font-weight: 700; border-bottom-color: var(--accent); } .ribbon .nav-item > a:hover { color: var(--ink); } .nav-drop { position: absolute; top: 100%; left: 0; min-width: 300px; background: var(--canvas); border: 1px solid var(--hairline); box-shadow: none; padding: 14px 16px; display: none; z-index: 60; } .nav-item:hover .nav-drop, .nav-item:focus-within .nav-drop { display: block; } .nav-drop .drop-kicker { display: block; font-family: var(--font-ui); font-weight: 600; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); margin-top: 8px; } .nav-drop .drop-title { display: block; font-family: var(--font-display); font-weight: 600; font-size: 15px; line-height: 1.35; color: var(--ink); margin-top: 2px; } .nav-drop .drop-item { display: block; text-decoration: none; padding: 8px 12px; } .nav-drop .drop-item:hover .drop-title { color: var(--accent); } .nav-drop .drop-item + .drop-item { border-top: 1px solid var(--hairline); } .nav-drop .drop-all { display: block; margin-top: 10px; padding: 8px 12px; font-family: var(--font-ui); font-weight: 600; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink); text-decoration: none; border-top: 1px solid var(--hairline); } .nav-drop .drop-all:hover { color: var(--accent); } /* ============================================================ FRONT PAGE GRIDS (responsive) ============================================================ */ /* Lead stack: 2fr hero + 1fr rail on desktop; stacks below */ .lead-grid { display: grid; grid-template-columns: 2fr 1fr; gap: 32px; align-items: start; padding: 32px 0 0; } @media (max-width: 1023px) { .lead-grid { grid-template-columns: 1fr; padding-top: 24px; } } @media (max-width: 640px) { .lead-grid { padding-top: 16px; } } /* Subject grid: 4 cols → 2 cols (tablet) → 1 col (mobile) */ .subject-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; } @media (max-width: 1023px) { .subject-grid { grid-template-columns: repeat(2, 1fr); gap: 20px; } } @media (max-width: 640px) { .subject-grid { grid-template-columns: 1fr; gap: 16px; } } .subject-box { border: 1px solid var(--hairline); padding: 16px; } .subject-box .kicker { font-family: var(--font-ui); font-weight: 700; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); } .subject-box .s-head { display: block; font-family: var(--font-display); font-weight: 600; font-size: 17px; line-height: 1.33; color: var(--ink); text-decoration: none; margin-top: 10px; } .subject-box .s-sub { display: block; font-family: var(--font-display); font-weight: 500; font-size: 15px; line-height: 1.35; color: var(--ink-muted); text-decoration: none; margin-top: 6px; } .subject-box .s-by { display: block; font-family: var(--font-ui); font-weight: 500; font-size: 12px; color: var(--ink-faint); margin-top: 8px; } .subject-box .s-more { display: block; font-family: var(--font-ui); font-weight: 600; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); text-decoration: none; margin-top: 10px; } .subject-box .s-more::after { content: ' →'; } .subject-box .s-more:hover { color: var(--accent); } /* Latest feed: 2 cols → 1 col */ .latest-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; } @media (max-width: 1023px) { .latest-grid { grid-template-columns: 1fr; gap: 20px; } } .feed-row { display: block; text-decoration: none; padding: 16px 0; border-top: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline); } .feed-row .f-kicker { font-family: var(--font-ui); font-weight: 700; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); } .feed-row .f-head { display: block; font-family: var(--font-display); font-weight: 600; font-size: 17px; line-height: 1.33; color: var(--ink); margin-top: 8px; } .feed-row .f-sub { display: block; font-family: var(--font-display); font-weight: 500; font-size: 15px; line-height: 1.35; color: var(--ink-muted); margin-top: 5px; } .feed-row .f-meta { font-family: var(--font-ui); font-weight: 500; font-size: 12px; color: var(--ink-faint); margin-top: 8px; } .feed-row:hover .f-head { color: var(--accent); } /* ============================================================ MOBILE BOTTOM NAV (≤640 only) ============================================================ */ .bottom-nav { position: fixed; bottom: 0; left: 0; right: 0; z-index: 100; background: var(--canvas); border-top: 1px solid var(--hairline); display: none; } .bottom-nav-inner { display: flex; justify-content: space-around; align-items: center; min-height: 60px; font-family: var(--font-ui); } .bn-item { display: flex; flex-direction: column; align-items: center; gap: 2px; flex: 1; color: var(--ink-muted); text-decoration: none; font-size: 10px; letter-spacing: 0.04em; } .bn-item .ic { font-size: 20px; } .bn-item.active { color: var(--ink); } .bn-item.active .ic { color: var(--accent); } /* Sections drawer via
*/ .bn-sections { position: relative; flex: 1; } .bn-sections summary { display: flex; flex-direction: column; align-items: center; gap: 2px; color: var(--ink-muted); list-style: none; cursor: pointer; font-size: 10px; letter-spacing: 0.04em; } .bn-sections summary::-webkit-details-marker { display: none; } .bn-sections summary .ic { font-size: 20px; color: var(--ink-muted); } .sections-drawer { position: fixed; left: 0; right: 0; bottom: 60px; max-height: 60vh; overflow-y: auto; background: var(--canvas); border-top: 1px solid var(--hairline); display: none; } .bn-sections[open] .sections-drawer { display: block; } .sections-drawer a { display: flex; align-items: center; justify-content: space-between; padding: 14px 20px; font-family: var(--font-ui); font-weight: 600; font-size: 13px; letter-spacing: 0.02em; color: var(--ink); text-decoration: none; } .sections-drawer a + a { border-top: 1px solid var(--hairline); } .sections-drawer .dr-all { font-family: var(--font-ui); font-weight: 700; font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent); } .sections-drawer a::after { content: '›'; color: var(--ink-muted); } @media (max-width: 640px) { .bottom-nav { display: block; } /* keep body from hiding behind the fixed bar */ main, footer { padding-bottom: 72px; } } /* ============================================================ ARTICLE ============================================================ */ .article-header { padding: 32px 0 0; } .article-header .kicker { font-family: var(--font-ui); font-weight: 700; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); } .article-header h1 { font-family: var(--font-display); font-weight: 600; font-size: 30px; line-height: 1.22; letter-spacing: -0.02em; color: var(--ink); margin: 12px 0 10px; } .article-header .deck { font-family: var(--font-body); font-size: 14px; line-height: 1.57; color: var(--ink-muted); margin: 0 0 12px; } .article-header .meta { font-family: var(--font-ui); font-weight: 500; font-size: 12px; color: var(--ink-faint); padding: 10px 0; border-bottom: 1px solid var(--hairline); } .article-header .meta strong { color: var(--ink); font-weight: 600; } .field-notes { margin: 36px 0; } .field-notes .fn-head { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--hairline); padding: 0 0 8px; } .field-notes .fn-head .l { font-family: var(--font-ui); font-weight: 700; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink); } .field-notes .fn-head .r { font-family: var(--font-ui); font-weight: 500; font-size: 12px; color: var(--ink-faint); } .field-notes .fn-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; margin-top: 16px; } @media (max-width: 640px) { .field-notes .fn-grid { grid-template-columns: 1fr; } } .field-notes figcaption { font-family: var(--font-body); font-size: 14px; line-height: 1.5; color: var(--ink-muted); padding: 10px 12px; background: var(--surface); } .field-notes figcaption .cap-kicker { font-family: var(--font-ui); font-weight: 700; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); } .save-module { background: var(--surface); border-top: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline); padding: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; } .save-module .l .t { font-family: var(--font-ui); font-weight: 600; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); } .save-module .l .s { font-family: var(--font-ui); font-weight: 500; font-size: 13px; color: var(--ink); } .related { background: var(--surface-hi); padding: 40px 24px; margin-top: 40px; } .related .r-head { display: flex; justify-content: space-between; border-bottom: 1px solid var(--hairline); padding: 0 0 8px; } .related .r-head .l { font-family: var(--font-ui); font-weight: 700; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); } .related .r-head .r { font-family: var(--font-ui); font-weight: 500; font-size: 12px; color: var(--ink-faint); } .newsletter-card { background: var(--canvas-bright); border: 1px solid var(--hairline); padding: 20px; margin-top: 24px; } .newsletter-card .t { font-family: var(--font-ui); font-weight: 700; font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); } .newsletter-card p { font-family: var(--font-body); font-size: 14px; line-height: 1.57; color: var(--ink-muted); margin: 10px 0; } .newsletter-card form { display: flex; gap: 8px; } .newsletter-card .field { flex: 1; } .site-footer { padding: 40px 0; border-top: 1px solid var(--hairline); text-align: center; } .site-footer .t { font-family: var(--font-display); font-weight: 700; font-size: 30px; letter-spacing: -0.03em; color: var(--ink); } .site-footer .tag { font-family: var(--font-ui); font-weight: 500; font-size: 12px; color: var(--ink-faint); margin-top: 8px; } .site-footer .copy { font-family: var(--font-ui); font-weight: 600; font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); margin-top: 16px; }