openreader/src/app/(public)/public.css
Richard R 27267e5ffb refactor(public): use environment variables for base URL and improve accessibility
Switch landing and layout metadata to use BASE_URL from environment for
deployment flexibility. Refine privacy page environment check for robustness.
Update ARIA attributes on landing preview for better accessibility. Adjust
terminal and visually hidden styles for improved formatting and screen reader
support.
2026-05-31 16:29:40 -06:00

1159 lines
27 KiB
CSS

/* =================================================================== *
* OpenReader — public marketing surface
* Concept: an editorial "reading room" where the product's own
* word-level read-along highlighting is the page's signature motif.
* Everything is driven by the app's theme CSS variables + color-mix,
* so it adapts to every theme (light, dark, ocean, forest, …).
* =================================================================== */
.public-shell {
/* Map theme tokens into local, semantic names */
--pub-bg: var(--background);
--pub-fg: var(--foreground);
--pub-surface: var(--base);
--pub-border: var(--offbase);
--pub-accent: var(--accent);
--pub-accent-soft: var(--secondary-accent);
--pub-muted: var(--muted);
/* Derived, reusable mixes */
--pub-soft: color-mix(in srgb, var(--pub-fg) 74%, var(--pub-muted));
--pub-faint: color-mix(in srgb, var(--pub-fg) 52%, var(--pub-muted));
--pub-line: color-mix(in srgb, var(--pub-border) 70%, transparent);
--pub-line-soft: color-mix(in srgb, var(--pub-border) 45%, transparent);
--pub-card: color-mix(in srgb, var(--pub-surface) 86%, transparent);
--pub-card-solid: color-mix(in srgb, var(--pub-surface) 96%, var(--pub-bg));
--pub-glass: color-mix(in srgb, var(--pub-surface) 70%, transparent);
--pub-accent-wash: color-mix(in srgb, var(--pub-accent) 12%, transparent);
--pub-radius: 1.25rem;
--pub-radius-sm: 0.85rem;
--pub-maxw: 1180px;
min-height: 100vh;
color: var(--pub-fg);
background: var(--pub-bg);
position: relative;
isolation: isolate;
overflow-x: clip;
font-feature-settings: 'kern' 1, 'liga' 1;
}
/* ── Atmosphere: soft aurora wash + faint hairline grid ───────────── */
.public-aurora {
position: fixed;
inset: -25vh -20vw;
z-index: -2;
pointer-events: none;
background:
radial-gradient(40vw 40vw at 12% 8%, color-mix(in srgb, var(--pub-accent) 22%, transparent), transparent 60%),
radial-gradient(36vw 36vw at 88% 4%, color-mix(in srgb, var(--pub-accent-soft) 16%, transparent), transparent 62%),
radial-gradient(50vw 40vw at 70% 88%, color-mix(in srgb, var(--pub-accent) 10%, transparent), transparent 64%);
filter: saturate(1.05);
animation: public-drift 26s ease-in-out infinite alternate;
}
.public-grain {
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
opacity: 0.5;
background-image:
linear-gradient(to right, var(--pub-line-soft) 1px, transparent 1px),
linear-gradient(to bottom, var(--pub-line-soft) 1px, transparent 1px);
background-size: 64px 64px;
background-position: center;
-webkit-mask-image: radial-gradient(circle at 50% 30%, black 0%, transparent 78%);
mask-image: radial-gradient(circle at 50% 30%, black 0%, transparent 78%);
}
@keyframes public-drift {
0% { transform: translate3d(0, 0, 0) scale(1); }
100% { transform: translate3d(0, -3%, 0) scale(1.06); }
}
.public-frame {
position: relative;
z-index: 1;
}
.public-wrap {
width: min(var(--pub-maxw), calc(100% - 2.4rem));
margin-inline: auto;
}
.public-shell h1,
.public-shell h2,
.public-shell h3 {
font-weight: 700;
}
.public-visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
}
/* ───────────────────────────── Topbar ───────────────────────────── */
.public-topbar {
position: sticky;
top: 0;
z-index: 50;
padding: 0.9rem 0 0;
}
.public-topbar-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
border: 1px solid var(--pub-line);
background: var(--pub-glass);
-webkit-backdrop-filter: blur(16px) saturate(1.4);
backdrop-filter: blur(16px) saturate(1.4);
border-radius: 999px;
padding: 0.5rem 0.8rem 0.5rem 1rem;
box-shadow:
0 1px 0 color-mix(in srgb, var(--pub-fg) 6%, transparent) inset,
0 18px 45px color-mix(in srgb, var(--pub-bg) 60%, transparent);
}
.public-brand {
display: inline-flex;
align-items: center;
gap: 0.6rem;
text-decoration: none;
color: var(--pub-fg);
border-radius: 999px;
padding: 0.2rem 0.3rem;
}
.public-brand-mark {
width: 1.55rem;
height: 1.55rem;
border-radius: 0.45rem;
box-shadow: 0 2px 8px color-mix(in srgb, var(--pub-accent) 30%, transparent);
}
.public-brand-copy {
display: flex;
flex-direction: column;
line-height: 1;
}
.public-brand-text {
font-weight: 700;
letter-spacing: -0.02em;
font-size: 1rem;
}
.public-brand-tag {
color: var(--pub-muted);
letter-spacing: 0.14em;
font-size: 0.58rem;
text-transform: uppercase;
margin-top: 0.28rem;
}
.public-nav {
display: flex;
align-items: center;
gap: 0.35rem;
}
.public-nav-link {
color: var(--pub-soft);
text-decoration: none;
font-size: 0.85rem;
font-weight: 500;
padding: 0.4rem 0.7rem;
border-radius: 999px;
transition: color 160ms ease, background-color 160ms ease;
}
.public-nav-link:hover {
color: var(--pub-accent);
background: var(--pub-accent-wash);
}
.public-nav-divider {
width: 1px;
height: 1.3rem;
background: var(--pub-line);
margin-inline: 0.25rem;
}
@media (max-width: 560px) {
.public-nav-link,
.public-nav-divider {
display: none;
}
.public-terminal-body {
padding: 0.9rem 1rem 1.1rem;
font-size: 0.74rem;
}
}
/* ────────────────────────────── Hero ────────────────────────────── */
.public-main {
padding-bottom: clamp(3.5rem, 7vw, 6rem);
}
.public-hero {
padding-top: clamp(2.5rem, 6vw, 5rem);
}
.public-hero-grid {
display: grid;
grid-template-columns: 1fr;
gap: clamp(2rem, 4vw, 3.5rem);
align-items: center;
}
.public-eyebrow {
display: inline-flex;
align-items: center;
gap: 0.5rem;
border-radius: 999px;
padding: 0.35rem 0.85rem 0.35rem 0.7rem;
border: 1px solid color-mix(in srgb, var(--pub-accent) 40%, transparent);
background: var(--pub-accent-wash);
color: var(--pub-accent);
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.public-eyebrow-dot {
width: 0.5rem;
height: 0.5rem;
border-radius: 999px;
background: var(--pub-accent);
box-shadow: 0 0 0 0 color-mix(in srgb, var(--pub-accent) 70%, transparent);
animation: public-pulse 2.4s ease-out infinite;
}
@keyframes public-pulse {
0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--pub-accent) 55%, transparent); }
70% { box-shadow: 0 0 0 0.5rem color-mix(in srgb, var(--pub-accent) 0%, transparent); }
100% { box-shadow: 0 0 0 0 transparent; }
}
.public-hero-title {
margin: 1.2rem 0 0;
font-size: clamp(2.5rem, 6.4vw, 4.6rem);
line-height: 1.02;
letter-spacing: -0.03em;
max-width: 16ch;
font-weight: 800;
}
/* The read-along sweep — words light one-by-one like the real reader */
.public-sweep {
display: inline;
}
.public-sweep-word {
position: relative;
font-style: italic;
border-radius: 0.18em;
padding: 0 0.04em;
color: var(--pub-fg);
background-color: transparent;
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
/* Each word's highlight is a short pulse staggered by --i; the cycle is long
enough that every word is back to transparent before it restarts, so the
whole line cleanly clears between sweeps. */
animation: public-sweep 4s cubic-bezier(0.4, 0, 0.2, 1) infinite;
animation-delay: calc(var(--i) * 0.42s);
}
@keyframes public-sweep {
0%, 8% {
background-color: transparent;
}
14% {
background-color: color-mix(in srgb, var(--pub-accent) 55%, transparent);
}
30%, 100% {
background-color: transparent;
}
}
.public-hero-copy {
margin: 1.4rem 0 0;
max-width: 52ch;
line-height: 1.65;
color: var(--pub-soft);
font-size: clamp(1rem, 1.4vw, 1.12rem);
}
.public-actions {
margin-top: 1.8rem;
display: flex;
flex-wrap: wrap;
gap: 0.6rem;
}
.public-formats {
margin-top: 1.9rem;
display: flex;
align-items: center;
gap: 0.85rem;
flex-wrap: wrap;
}
.public-formats-label {
font-size: 0.7rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--pub-muted);
}
.public-formats-list {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
}
.public-format-chip {
font-size: 0.74rem;
font-weight: 600;
letter-spacing: 0.02em;
padding: 0.3rem 0.6rem;
border-radius: 0.5rem;
border: 1px solid var(--pub-line);
background: color-mix(in srgb, var(--pub-bg) 40%, transparent);
color: var(--pub-soft);
}
/* ── Reader mockup — demonstrates the synchronized read-along ─────── */
.public-reader {
position: relative;
border: 1px solid var(--pub-line);
border-radius: var(--pub-radius);
background: var(--pub-card);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
box-shadow:
0 1px 0 color-mix(in srgb, var(--pub-fg) 6%, transparent) inset,
0 30px 70px color-mix(in srgb, var(--pub-bg) 55%, transparent);
overflow: hidden;
}
.public-reader-glow {
position: absolute;
inset: -40% -10% auto -10%;
height: 70%;
background: radial-gradient(60% 100% at 80% 0%, color-mix(in srgb, var(--pub-accent) 26%, transparent), transparent 70%);
pointer-events: none;
}
.public-reader-bar {
position: relative;
display: flex;
align-items: center;
gap: 0.45rem;
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--pub-line-soft);
}
.public-reader-dot {
width: 0.6rem;
height: 0.6rem;
border-radius: 999px;
background: var(--pub-line);
}
.public-reader-dot[data-tone='a'] { background: color-mix(in srgb, var(--pub-accent) 70%, var(--pub-muted)); }
.public-reader-dot[data-tone='b'] { background: color-mix(in srgb, var(--pub-accent-soft) 60%, var(--pub-muted)); }
.public-reader-dot[data-tone='c'] { background: color-mix(in srgb, var(--pub-muted) 55%, transparent); }
.public-reader-file {
margin-left: 0.4rem;
font-size: 0.78rem;
font-weight: 600;
color: var(--pub-soft);
}
.public-reader-voice {
margin-left: auto;
font-size: 0.68rem;
letter-spacing: 0.04em;
color: var(--pub-muted);
padding: 0.2rem 0.55rem;
border-radius: 999px;
border: 1px solid var(--pub-line-soft);
}
.public-reader-body {
position: relative;
padding: 1.4rem 1.4rem 1.1rem;
}
.public-reader-chapter {
margin: 0 0 0.7rem;
font-size: 0.68rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--pub-muted);
}
.public-reader-text {
margin: 0;
font-size: clamp(1.02rem, 1.5vw, 1.2rem);
line-height: 1.75;
color: var(--pub-soft);
}
/* These mirror the app's real highlight treatment (globals.css) */
.public-reader-sentence {
background-color: color-mix(in srgb, var(--pub-accent) 16%, transparent);
border-radius: 3px;
padding: 0.04em 1px;
color: var(--pub-fg);
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
}
.public-reader-word {
background-color: color-mix(in srgb, var(--pub-accent) 52%, transparent);
border-radius: 3px;
padding: 0.04em 2px;
color: var(--pub-fg);
animation: public-word-pulse 2.8s ease-in-out infinite;
}
@keyframes public-word-pulse {
0%, 100% { background-color: color-mix(in srgb, var(--pub-accent) 42%, transparent); }
50% { background-color: color-mix(in srgb, var(--pub-accent) 62%, transparent); }
}
/* Playback bar */
.public-player {
position: relative;
display: flex;
align-items: center;
gap: 0.85rem;
padding: 0.85rem 1.1rem;
border-top: 1px solid var(--pub-line-soft);
background: color-mix(in srgb, var(--pub-bg) 35%, transparent);
}
.public-player-play {
flex: none;
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.3rem;
height: 2.3rem;
border: none;
border-radius: 999px;
background: var(--pub-accent);
color: var(--background);
cursor: default;
box-shadow: 0 8px 20px color-mix(in srgb, var(--pub-accent) 45%, transparent);
}
.public-wave {
flex: 1;
display: flex;
align-items: center;
gap: 2px;
height: 2rem;
overflow: hidden;
}
.public-wave-bar {
flex: 1;
min-width: 2px;
height: 100%;
border-radius: 999px;
background: color-mix(in srgb, var(--pub-accent) 60%, var(--pub-muted));
transform: scaleY(0.35);
transform-origin: center;
animation: public-wave 1.3s ease-in-out infinite;
animation-delay: calc(var(--b) * -0.07s);
}
.public-wave-bar:nth-child(3n) { background: color-mix(in srgb, var(--pub-accent-soft) 55%, var(--pub-muted)); }
.public-wave-bar:nth-child(4n) { animation-duration: 1.7s; }
.public-wave-bar:nth-child(5n) { animation-duration: 0.95s; }
@keyframes public-wave {
0%, 100% { transform: scaleY(0.28); opacity: 0.75; }
50% { transform: scaleY(1); opacity: 1; }
}
.public-player-time {
flex: none;
font-size: 0.72rem;
font-variant-numeric: tabular-nums;
color: var(--pub-soft);
}
.public-player-speed {
flex: none;
font-size: 0.7rem;
font-weight: 600;
color: var(--pub-accent);
padding: 0.18rem 0.45rem;
border-radius: 0.45rem;
border: 1px solid color-mix(in srgb, var(--pub-accent) 35%, transparent);
}
/* ── Provider strip ───────────────────────────────────────────────── */
.public-providers {
margin-top: clamp(2.5rem, 5vw, 4rem);
display: flex;
align-items: center;
gap: 1.4rem;
flex-wrap: wrap;
padding-top: 1.4rem;
border-top: 1px solid var(--pub-line-soft);
}
.public-providers-label {
font-size: 0.7rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--pub-muted);
}
.public-providers-track {
display: flex;
flex-wrap: wrap;
gap: 1.6rem;
align-items: center;
}
.public-provider {
font-size: 0.98rem;
font-weight: 600;
letter-spacing: -0.01em;
color: var(--pub-faint);
transition: color 200ms ease;
}
.public-provider:hover {
color: var(--pub-fg);
}
/* ───────────────────────────── Sections ─────────────────────────── */
.public-section {
margin-top: clamp(4rem, 8vw, 7rem);
}
.public-section-head {
max-width: 40ch;
margin-bottom: clamp(1.8rem, 3vw, 2.6rem);
}
.public-kicker {
margin: 0 0 0.7rem;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--pub-accent);
}
.public-section-head h2 {
margin: 0;
font-size: clamp(1.7rem, 3.6vw, 2.7rem);
line-height: 1.08;
letter-spacing: -0.025em;
}
/* ── How it works — editorial numbered steps ──────────────────────── */
.public-steps {
list-style: none;
margin: 0;
padding: 0;
display: grid;
grid-template-columns: 1fr;
gap: 0;
border-top: 1px solid var(--pub-line);
}
.public-step {
position: relative;
padding: 1.6rem 0;
border-bottom: 1px solid var(--pub-line);
}
.public-step-num {
display: block;
font-size: 1.05rem;
font-weight: 600;
color: var(--pub-accent);
letter-spacing: 0.04em;
margin-bottom: 0.6rem;
}
.public-step h3 {
margin: 0 0 0.5rem;
font-size: 1.25rem;
letter-spacing: -0.01em;
}
.public-step p {
margin: 0;
color: var(--pub-soft);
line-height: 1.65;
font-size: 0.96rem;
max-width: 60ch;
}
/* ── Feature grid ─────────────────────────────────────────────────── */
.public-features {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
.public-feature {
position: relative;
border: 1px solid var(--pub-line);
border-radius: var(--pub-radius);
background: var(--pub-card);
padding: clamp(1.3rem, 2.2vw, 1.8rem);
overflow: hidden;
transition: transform 240ms ease, border-color 240ms ease, box-shadow 240ms ease;
}
.public-feature::after {
content: '';
position: absolute;
inset: auto -30% -60% auto;
width: 60%;
height: 80%;
background: radial-gradient(circle, color-mix(in srgb, var(--pub-accent) 16%, transparent), transparent 70%);
opacity: 0;
transition: opacity 280ms ease;
pointer-events: none;
}
.public-feature:hover {
transform: translateY(-3px);
border-color: color-mix(in srgb, var(--pub-accent) 45%, var(--pub-border));
box-shadow: 0 22px 50px color-mix(in srgb, var(--pub-bg) 55%, transparent);
}
.public-feature:hover::after {
opacity: 1;
}
.public-feature-kicker {
display: inline-block;
margin-bottom: 0.75rem;
font-size: 0.68rem;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--pub-accent);
}
.public-feature h3 {
margin: 0;
font-size: 1.22rem;
letter-spacing: -0.01em;
}
.public-feature p {
margin: 0.6rem 0 0;
color: var(--pub-soft);
line-height: 1.62;
font-size: 0.94rem;
}
/* ── Self-host callout + terminal ─────────────────────────────────── */
.public-callout {
position: relative;
border: 1px solid var(--pub-line);
border-radius: var(--pub-radius);
background: var(--pub-card-solid);
padding: clamp(1.6rem, 4vw, 3rem);
overflow: hidden;
display: grid;
grid-template-columns: 1fr;
gap: clamp(1.8rem, 3vw, 2.6rem);
align-items: center;
}
.public-callout-glow {
position: absolute;
inset: auto auto -50% -20%;
width: 60%;
height: 120%;
background: radial-gradient(circle, color-mix(in srgb, var(--pub-accent) 22%, transparent), transparent 65%);
pointer-events: none;
}
.public-callout-copy {
position: relative;
}
.public-callout-copy h2 {
margin: 0;
font-size: clamp(1.7rem, 3.6vw, 2.6rem);
line-height: 1.06;
letter-spacing: -0.025em;
max-width: 16ch;
}
.public-callout-text {
margin: 0.9rem 0 0;
color: var(--pub-soft);
line-height: 1.66;
max-width: 52ch;
}
.public-callout .public-actions {
margin-top: 1.6rem;
}
.public-terminal {
position: relative;
border: 1px solid var(--pub-line);
border-radius: var(--pub-radius-sm);
background: color-mix(in srgb, var(--pub-bg) 82%, var(--pub-surface));
overflow: hidden;
box-shadow: 0 24px 60px color-mix(in srgb, var(--pub-bg) 60%, transparent);
}
.public-terminal-bar {
display: flex;
align-items: center;
gap: 0.45rem;
padding: 0.6rem 0.85rem;
border-bottom: 1px solid var(--pub-line-soft);
}
.public-terminal-title {
margin-left: 0.4rem;
font-size: 0.68rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--pub-muted);
}
.public-terminal-body {
margin: 0;
padding: 1.1rem 1.2rem 1.3rem;
font-family: ui-monospace, 'SF Mono', 'JetBrains Mono', 'Fira Code', Menlo, monospace;
font-size: 0.82rem;
line-height: 1.7;
color: var(--pub-soft);
/* Preserve the command's formatting and scroll within the box instead of
wrapping mid-token, which breaks the layout on narrow screens. */
white-space: pre;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.public-term-comment { color: var(--pub-muted); }
.public-term-prompt {
color: var(--pub-accent);
font-weight: 700;
margin-right: 0.4rem;
}
.public-term-accent { color: var(--pub-accent); }
.public-term-caret {
display: inline-block;
width: 0.5rem;
height: 1.05em;
margin-left: 0.2rem;
vertical-align: text-bottom;
background: var(--pub-accent);
animation: public-blink 1.1s steps(2, start) infinite;
}
@keyframes public-blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
/* ───────────────────────────── Footer ───────────────────────────── */
.public-footer {
margin-top: clamp(4rem, 8vw, 7rem);
padding: clamp(2.5rem, 5vw, 4rem) 0 2.5rem;
border-top: 1px solid var(--pub-line-soft);
}
.public-footer-inner {
display: grid;
grid-template-columns: 1fr;
gap: 2.4rem;
}
.public-footer-mark {
display: flex;
align-items: center;
gap: 0.55rem;
}
.public-footer-label {
margin: 1rem 0 1.2rem;
color: var(--pub-soft);
font-size: 0.92rem;
line-height: 1.6;
max-width: 42ch;
}
.public-footer-cta {
display: flex;
flex-wrap: wrap;
gap: 0.55rem;
}
.public-footer-cols {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
.public-footer-col {
display: flex;
flex-direction: column;
gap: 0.55rem;
}
.public-footer-col-title {
margin: 0 0 0.3rem;
font-size: 0.68rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--pub-muted);
}
.public-footer-col a {
color: var(--pub-soft);
text-decoration: none;
font-size: 0.9rem;
transition: color 150ms ease;
}
.public-footer-col a:hover {
color: var(--pub-accent);
}
.public-footer-base {
margin-top: 2.4rem;
}
.public-footer-base p {
margin: 1.1rem 0 0;
font-size: 0.78rem;
color: var(--pub-muted);
}
/* ── Reveal animations ────────────────────────────────────────────── */
@keyframes public-reveal {
from { opacity: 0; transform: translate3d(0, 22px, 0); }
to { opacity: 1; transform: translate3d(0, 0, 0); }
}
.public-reveal-1 { animation: public-reveal 640ms cubic-bezier(0.2, 0.7, 0.2, 1) both; }
.public-reveal-2 { animation: public-reveal 640ms cubic-bezier(0.2, 0.7, 0.2, 1) 120ms both; }
.public-reveal-3 { animation: public-reveal 640ms cubic-bezier(0.2, 0.7, 0.2, 1) 240ms both; }
/* =================================================================== *
* Privacy / policy page
* =================================================================== */
.public-panel {
border: 1px solid var(--pub-line);
border-radius: var(--pub-radius);
background: var(--pub-card);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
}
.policy-main {
padding-top: clamp(2.5rem, 6vw, 4.5rem);
}
.policy-hero {
position: relative;
padding: clamp(1.6rem, 4vw, 2.8rem);
overflow: hidden;
}
.policy-hero h1 {
margin: 0;
font-size: clamp(1.9rem, 4.6vw, 3.2rem);
line-height: 1.02;
letter-spacing: -0.03em;
font-weight: 800;
max-width: 18ch;
}
.policy-hero p {
margin: 1rem 0 0;
color: var(--pub-soft);
line-height: 1.66;
max-width: 68ch;
}
.policy-hero strong {
color: var(--pub-fg);
}
.policy-badges {
margin-top: 1.3rem;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.policy-badge {
border: 1px solid var(--pub-line);
border-radius: 999px;
padding: 0.4rem 0.85rem;
background: color-mix(in srgb, var(--pub-bg) 45%, transparent);
font-size: 0.76rem;
color: var(--pub-soft);
}
.policy-grid {
margin-top: 1.4rem;
display: grid;
grid-template-columns: 1fr;
gap: 1.2rem;
}
.policy-nav {
border: 1px solid var(--pub-line);
border-radius: var(--pub-radius-sm);
background: var(--pub-card);
padding: 1.1rem;
align-self: start;
}
.policy-nav-title {
margin: 0;
font-size: 0.68rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--pub-muted);
}
.policy-nav-list {
list-style: none;
margin: 0.85rem 0 0;
padding: 0;
display: grid;
gap: 0.25rem;
}
.policy-nav-list a {
display: block;
text-decoration: none;
color: var(--pub-soft);
font-size: 0.88rem;
border-radius: 0.55rem;
padding: 0.5rem 0.6rem;
border: 1px solid transparent;
transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease;
}
.policy-nav-list a:hover {
border-color: color-mix(in srgb, var(--pub-accent) 45%, transparent);
color: var(--pub-accent);
background: var(--pub-accent-wash);
}
.policy-sections {
overflow: hidden;
}
.policy-section {
padding: clamp(1.3rem, 2.6vw, 1.9rem);
border-top: 1px solid var(--pub-line-soft);
scroll-margin-top: 6rem;
}
.policy-section:first-child {
border-top: 0;
}
.policy-section h2 {
margin: 0;
font-size: 1.25rem;
font-weight: 600;
letter-spacing: -0.01em;
}
.policy-section p {
margin: 0.7rem 0 0;
line-height: 1.66;
font-size: 0.94rem;
color: var(--pub-soft);
}
.policy-list {
margin: 0.85rem 0 0;
padding-left: 1.1rem;
list-style: disc;
display: grid;
gap: 0.45rem;
}
.policy-list li {
line-height: 1.6;
color: var(--pub-soft);
font-size: 0.92rem;
}
.policy-fact-list {
margin: 0.9rem 0 0;
padding: 0;
list-style: none;
display: grid;
gap: 0.5rem;
}
.policy-fact-list li {
border-left: 2px solid color-mix(in srgb, var(--pub-accent) 50%, transparent);
background: color-mix(in srgb, var(--pub-bg) 42%, transparent);
border-radius: 0 0.5rem 0.5rem 0;
padding: 0.65rem 0.8rem;
font-size: 0.92rem;
line-height: 1.58;
color: var(--pub-soft);
}
.policy-fact-list li strong,
.policy-list li strong {
color: var(--pub-fg);
}
.policy-highlight {
margin-top: 0.9rem;
border: 1px solid color-mix(in srgb, var(--pub-accent) 50%, transparent);
border-radius: 0.8rem;
background: var(--pub-accent-wash);
padding: 0.85rem 1rem;
font-size: 0.9rem;
line-height: 1.6;
color: var(--pub-soft);
}
.policy-highlight strong {
color: var(--pub-accent);
}
.policy-actions {
margin-top: 1.3rem;
display: flex;
flex-wrap: wrap;
gap: 0.55rem;
}
.public-link-inline {
color: var(--pub-accent);
text-decoration: underline;
text-underline-offset: 3px;
}
/* ───────────────────────── Responsive layout ────────────────────── */
@media (min-width: 768px) {
.public-hero-grid {
grid-template-columns: 1.05fr 0.95fr;
}
.public-steps {
grid-template-columns: repeat(3, 1fr);
border-top: none;
}
.public-step {
padding: 0 1.8rem;
border-bottom: none;
border-left: 1px solid var(--pub-line);
}
.public-step:first-child {
padding-left: 0;
border-left: none;
}
.public-features {
grid-template-columns: repeat(2, 1fr);
}
.public-feature-wide {
grid-column: span 2;
}
.public-callout {
grid-template-columns: 1fr 0.85fr;
}
.policy-grid {
grid-template-columns: 260px minmax(0, 1fr);
align-items: start;
}
.policy-nav {
position: sticky;
top: 6rem;
}
.policy-fact-list {
grid-template-columns: repeat(2, 1fr);
}
.public-footer-inner {
grid-template-columns: 1.4fr 1fr;
gap: 3rem;
align-items: start;
}
}
@media (min-width: 1040px) {
.public-features {
grid-template-columns: repeat(3, 1fr);
}
.public-feature-wide {
grid-column: span 1;
}
/* Let the two "wide" features anchor the corners with extra presence */
.public-feature:first-child,
.public-feature:last-child {
grid-column: span 1;
}
}
@media (prefers-reduced-motion: reduce) {
.public-aurora,
.public-eyebrow-dot,
.public-sweep-word,
.public-reader-word,
.public-wave-bar,
.public-term-caret,
.public-reveal-1,
.public-reveal-2,
.public-reveal-3 {
animation: none !important;
}
.public-sweep-word {
color: var(--pub-fg);
background-color: color-mix(in srgb, var(--pub-accent) 16%, transparent);
}
.public-wave-bar {
transform: scaleY(0.6);
}
}