Files
peardock-website/src/styles/global.css
T
2026-07-16 16:06:42 -04:00

1243 lines
25 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ═══════════════════════════════════════════════════════════
PearDock Website · Design System
Brand tokens: #0f1117 · #2dd4bf · #f4f7fb
═══════════════════════════════════════════════════════════ */
:root {
--bg-primary: #0a0c10;
--bg-secondary: #0f1117;
--bg-tertiary: #161b22;
--bg-elevated: #1c2128;
--bg-hover: #22272e;
--bg-glass: rgba(22, 27, 34, 0.72);
--accent: #2dd4bf;
--accent-secondary: #14b8a6;
--accent-dim: rgba(45, 212, 191, 0.12);
--accent-glow: rgba(45, 212, 191, 0.35);
--accent-border: rgba(45, 212, 191, 0.28);
--success: #4ade80;
--warning: #fbbf24;
--danger: #f87171;
--info: #38bdf8;
--text: #f4f7fb;
--text-secondary: #c8d1df;
--text-muted: #9aa8bc;
--text-faint: #7d8b9f;
--border: rgba(255, 255, 255, 0.08);
--border-strong: rgba(255, 255, 255, 0.14);
--radius: 14px;
--radius-sm: 10px;
--radius-lg: 22px;
--radius-full: 999px;
--font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
--mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', ui-monospace, monospace;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
--shadow-md: 0 8px 24px rgba(0, 0, 0, 0.35);
--shadow-lg: 0 24px 64px rgba(0, 0, 0, 0.45);
--shadow-glow: 0 0 80px rgba(45, 212, 191, 0.15);
/* Compact bar; pear hangs below and is cradled by the bar bottom */
--nav-h: 68px;
--brand-logo: 96px;
/* Keep leaf fully on-screen (no overflow above viewport top) */
--brand-top-inset: 6px;
/* How far the pear hangs past the bar bottom */
--brand-overhang: calc(var(--brand-logo) - var(--nav-h) + var(--brand-top-inset));
/* True semicircle diameter under the pear (snug around the mark) */
--brand-cradle: calc(var(--brand-logo) + 4px);
--max: 1200px;
--max-wide: 1400px;
/* Docs prose width is controlled in docs.css (--docs-content) */
--docs-max: 58rem;
--install-max: 720px;
--ease: cubic-bezier(0.22, 1, 0.36, 1);
}
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
/* Single scrollport: only the document scrolls (not html+body both) */
overflow-x: clip;
overflow-y: scroll; /* stable gutter; body must NOT also scroll */
max-width: 100%;
height: 100%;
}
body {
font-family: var(--font);
font-size: 16px;
line-height: 1.65;
color: var(--text);
background: var(--bg-primary);
min-height: 100%;
/* Critical: avoid second vertical scrollbar on body */
overflow-x: clip;
overflow-y: visible;
max-width: 100%;
position: relative;
}
/* ─── Slim themed scrollbars (site-wide) ─── */
:root {
--sb-size: 8px;
--sb-radius: 999px;
--sb-track: transparent;
--sb-thumb: rgba(148, 163, 184, 0.28);
--sb-thumb-hover: rgba(45, 212, 191, 0.55);
--sb-thumb-active: rgba(45, 212, 191, 0.75);
}
/* Firefox */
* {
scrollbar-width: thin;
scrollbar-color: var(--sb-thumb) var(--sb-track);
}
/* Chromium / Safari / Edge */
*::-webkit-scrollbar {
width: var(--sb-size);
height: var(--sb-size);
}
*::-webkit-scrollbar-track {
background: var(--sb-track);
border-radius: var(--sb-radius);
}
*::-webkit-scrollbar-thumb {
background: var(--sb-thumb);
border-radius: var(--sb-radius);
border: 2px solid transparent;
background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:hover {
background: var(--sb-thumb-hover);
border: 2px solid transparent;
background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:active {
background: var(--sb-thumb-active);
border: 2px solid transparent;
background-clip: padding-box;
}
*::-webkit-scrollbar-corner {
background: transparent;
}
/* Utility: hide without fighting other display rules */
.hidden,
[hidden] {
display: none !important;
}
/* Ensure main chrome never forces a wider document */
main,
.site-nav,
.site-footer,
.docs-layout,
.section,
.container,
.container-wide {
max-width: 100%;
min-width: 0;
}
img {
max-width: 100%;
height: auto;
display: block;
}
video,
iframe,
svg {
max-width: 100%;
}
a {
color: var(--accent);
text-decoration: none;
transition: color 0.2s var(--ease);
}
a:hover {
color: #5eead4;
}
/* ─── Typography ─── */
h1, h2, h3, h4 {
font-weight: 700;
letter-spacing: -0.03em;
line-height: 1.15;
color: var(--text);
}
h1 { font-size: clamp(2.4rem, 5.5vw, 3.75rem); }
h2 { font-size: clamp(1.75rem, 3.5vw, 2.5rem); }
h3 { font-size: 1.25rem; }
h4 { font-size: 1.05rem; }
p { color: var(--text-secondary); }
.lead {
font-size: clamp(1.05rem, 2vw, 1.25rem);
color: var(--text-muted);
line-height: 1.7;
max-width: 52ch;
}
.gradient-text {
background: linear-gradient(135deg, #5eead4 0%, var(--accent) 40%, #38bdf8 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
/* ─── Layout ─── */
.container {
width: min(100% - 2rem, var(--max));
max-width: 100%;
margin-inline: auto;
padding-inline: 0;
box-sizing: border-box;
}
.container-wide {
width: min(100% - 2rem, var(--max-wide));
max-width: 100%;
margin-inline: auto;
box-sizing: border-box;
}
.section {
padding: 6rem 0;
position: relative;
}
.section-sm {
padding: 4rem 0;
}
.section-label {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 1rem;
}
.section-label::before {
content: '';
width: 18px;
height: 2px;
background: var(--accent);
border-radius: 2px;
}
/* ─── Buttons ─── */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.55rem;
font-family: var(--font);
font-size: 0.95rem;
font-weight: 600;
letter-spacing: -0.01em;
padding: 0.8rem 1.4rem;
border-radius: var(--radius-full);
border: 1px solid transparent;
cursor: pointer;
transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease),
background 0.2s, border-color 0.2s, color 0.2s;
text-decoration: none;
white-space: nowrap;
line-height: 1.2;
}
.btn:hover {
transform: translateY(-1px);
}
.btn:active {
transform: translateY(0);
}
.btn-primary {
background: linear-gradient(135deg, var(--accent) 0%, var(--accent-secondary) 100%);
color: #042f2e;
box-shadow: 0 0 0 1px rgba(45, 212, 191, 0.3), 0 8px 28px rgba(45, 212, 191, 0.25);
}
.btn-primary:hover {
color: #042f2e;
box-shadow: 0 0 0 1px rgba(45, 212, 191, 0.5), 0 12px 36px rgba(45, 212, 191, 0.35);
}
.btn-secondary {
background: var(--bg-elevated);
color: var(--text);
border-color: var(--border-strong);
}
.btn-secondary:hover {
color: var(--text);
border-color: var(--accent-border);
background: var(--bg-hover);
}
.btn-ghost {
background: transparent;
color: var(--text-secondary);
border-color: var(--border);
}
.btn-ghost:hover {
color: var(--text);
border-color: var(--border-strong);
background: rgba(255, 255, 255, 0.03);
}
.btn-lg {
padding: 1rem 1.75rem;
font-size: 1.02rem;
}
.btn-sm {
padding: 0.5rem 0.95rem;
font-size: 0.85rem;
}
/* ─── Cards ─── */
.card {
background: linear-gradient(165deg, rgba(28, 33, 40, 0.9) 0%, rgba(15, 17, 23, 0.95) 100%);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 1.75rem;
transition: border-color 0.3s var(--ease), transform 0.3s var(--ease),
box-shadow 0.3s var(--ease);
max-width: 100%;
min-width: 0;
box-sizing: border-box;
overflow-x: clip;
}
.card:hover {
border-color: var(--accent-border);
transform: translateY(-3px);
box-shadow: var(--shadow-md), 0 0 40px rgba(45, 212, 191, 0.06);
}
.card-icon {
width: 44px;
height: 44px;
border-radius: 12px;
display: grid;
place-items: center;
background: var(--accent-dim);
border: 1px solid var(--accent-border);
color: var(--accent);
font-size: 1.15rem;
margin-bottom: 1.1rem;
}
.card h3 {
margin-bottom: 0.55rem;
}
.card p {
font-size: 0.95rem;
color: var(--text-muted);
}
/* ─── Code ─── */
code, kbd {
font-family: var(--mono);
font-size: 0.88em;
}
:not(pre) > code {
background: var(--accent-dim);
color: var(--accent);
padding: 0.15em 0.45em;
border-radius: 6px;
border: 1px solid var(--accent-border);
}
pre {
background: #080a0e;
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.15rem 1.25rem;
/* Long curl URLs have no spaces · break mid-token, never h-scroll */
overflow-x: clip;
overflow-y: hidden;
max-width: 100%;
width: 100%;
min-width: 0;
box-sizing: border-box;
font-family: var(--mono);
font-size: 0.8rem;
line-height: 1.7;
color: var(--text-secondary);
position: relative;
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: anywhere;
}
pre code {
background: none;
border: none;
padding: 0;
color: inherit;
font-size: inherit;
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: anywhere;
display: block;
max-width: 100%;
min-width: 0;
overflow-x: clip;
box-sizing: border-box;
}
.code-block {
position: relative;
margin: 1.25rem 0;
max-width: 100%;
min-width: 0;
overflow-x: clip;
overflow-y: visible;
width: 100%;
box-sizing: border-box;
}
.code-block pre {
margin: 0;
/* room for copy button */
padding-right: 4.5rem;
overflow-x: clip;
white-space: pre-wrap;
word-break: break-all;
}
.code-block .copy-btn {
position: absolute;
top: 0.65rem;
right: 0.65rem;
z-index: 2;
font-size: 0.75rem;
padding: 0.35rem 0.65rem;
border-radius: 8px;
background: var(--bg-elevated);
border: 1px solid var(--border);
color: var(--text-muted);
cursor: pointer;
font-family: var(--font);
font-weight: 500;
transition: all 0.2s;
}
.code-block .copy-btn:hover {
color: var(--accent);
border-color: var(--accent-border);
}
.code-block .copy-btn.copied {
color: var(--success);
border-color: rgba(74, 222, 128, 0.35);
}
/* ─── Tables ─── */
.table-wrap {
overflow-x: clip;
margin: 1.25rem 0;
border-radius: var(--radius);
border: 1px solid var(--border);
max-width: 100%;
width: 100%;
box-sizing: border-box;
min-width: 0;
}
table {
width: 100%;
max-width: 100%;
border-collapse: collapse;
font-size: 0.92rem;
table-layout: fixed;
}
th, td {
text-align: left;
padding: 0.85rem 1.1rem;
border-bottom: 1px solid var(--border);
word-break: break-word;
overflow-wrap: anywhere;
vertical-align: top;
min-width: 0;
}
th code,
td code {
word-break: break-all;
overflow-wrap: anywhere;
white-space: normal;
}
th {
background: var(--bg-tertiary);
color: var(--text-muted);
font-weight: 600;
font-size: 0.78rem;
letter-spacing: 0.04em;
text-transform: uppercase;
}
td {
color: var(--text-secondary);
background: rgba(15, 17, 23, 0.5);
}
tr:last-child td {
border-bottom: none;
}
tr:hover td {
background: rgba(45, 212, 191, 0.04);
}
/* ─── Badge / Chip ─── */
.badge {
display: inline-flex;
align-items: center;
gap: 0.35rem;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 0.3rem 0.65rem;
border-radius: var(--radius-full);
background: var(--accent-dim);
color: var(--accent);
border: 1px solid var(--accent-border);
}
.badge-muted {
background: rgba(255, 255, 255, 0.05);
color: var(--text-muted);
border-color: var(--border);
}
/* ─── Nav ─── */
.site-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
height: var(--nav-h);
display: flex;
align-items: center;
/* Pear hangs below the strip; keep overflow visible */
overflow: visible;
transition: background 0.3s, border-color 0.3s, backdrop-filter 0.3s;
border-bottom: 1px solid transparent;
/* Keep glass only on the bar strip; logo + cradle paint above it */
isolation: isolate;
}
.site-nav.scrolled {
background: var(--bg-glass);
backdrop-filter: blur(16px) saturate(1.4);
-webkit-backdrop-filter: blur(16px) saturate(1.4);
border-bottom-color: var(--border);
}
.nav-inner {
width: min(100% - 2rem, var(--max-wide));
max-width: 100%;
margin-inline: auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
min-width: 0;
height: 100%;
overflow: visible;
position: relative;
z-index: 1;
}
.nav-brand {
display: flex;
align-items: center;
/* Tight: pear artwork already has transparent side padding */
gap: 0.15rem;
color: var(--text);
font-weight: 700;
font-size: 1.15rem;
letter-spacing: -0.03em;
flex-shrink: 0;
min-width: 0;
position: relative;
z-index: 2;
/* Brand row matches bar; logo hangs from here */
height: var(--nav-h);
}
/*
* Bottom-only cradle: true semicircle under the pear.
* Full disc is positioned with its center on the bar bottom, then the top
* half is clipped away · so only a curve leaves and returns to the bar.
* No top ring, no diameter stroke through the pear.
*/
.nav-brand::after {
content: '';
position: absolute;
left: 0;
/* Circle center sits on the bars bottom edge */
top: calc(100% - (var(--brand-cradle) / 2));
width: var(--brand-cradle);
height: var(--brand-cradle);
margin-left: calc((var(--brand-logo) - var(--brand-cradle)) / 2);
z-index: 0;
pointer-events: none;
box-sizing: border-box;
border-radius: 50%;
border: 1px solid transparent;
background: transparent;
box-shadow: none;
/* Keep only the lower half (under the nav) */
clip-path: inset(50% 0 0 0);
transition:
background 0.3s,
border-color 0.3s,
box-shadow 0.3s,
backdrop-filter 0.3s;
}
.site-nav.scrolled .nav-brand::after {
/* Same glass + border as the bar · continuous under the pear */
background: var(--bg-glass);
backdrop-filter: blur(16px) saturate(1.4);
-webkit-backdrop-filter: blur(16px) saturate(1.4);
border-color: var(--border);
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.3);
}
/*
* Erase the straight nav border under the pear so the semicircle is the
* only edge there. Uses the bars own glass fill (not a solid black strip).
*/
.site-nav.scrolled .nav-brand::before {
content: '';
position: absolute;
left: calc((var(--brand-logo) - var(--brand-cradle)) / 2 + 1px);
bottom: -1px;
width: calc(var(--brand-cradle) - 2px);
height: 3px;
z-index: 2;
pointer-events: none;
/* Layer glass over the secondary bg so the 1px border is fully hidden */
background:
linear-gradient(var(--bg-glass), var(--bg-glass)),
var(--bg-secondary);
}
.nav-brand-text {
line-height: 1;
white-space: nowrap;
/* Pull wordmark into the logos empty right margin */
margin-left: -0.35rem;
position: relative;
z-index: 1;
}
/*
* Free-floating pear · top stays inside the bar (no viewport clip);
* bottom hangs below and sits in the circular cradle.
*/
.nav-brand-logo {
width: var(--brand-logo);
height: var(--brand-logo);
max-width: none;
flex-shrink: 0;
display: block;
object-fit: contain;
object-position: center;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
position: relative;
z-index: 3;
align-self: flex-start;
margin: 0;
margin-top: var(--brand-top-inset);
margin-bottom: calc(-1 * var(--brand-overhang));
/* Soft depth so it reads over glass + page content */
filter:
drop-shadow(0 2px 4px rgba(0, 0, 0, 0.25))
drop-shadow(0 10px 22px rgba(0, 0, 0, 0.4));
transition: transform 0.28s var(--ease), filter 0.28s var(--ease);
pointer-events: auto;
}
.nav-links {
min-width: 0;
position: relative;
z-index: 1;
}
.nav-cta {
flex-shrink: 0;
position: relative;
z-index: 1;
}
.nav-brand:hover {
color: var(--text);
}
.nav-brand:hover .nav-brand-logo {
/* Lift slightly but keep leaf on-screen (no negative translate past top) */
transform: translateY(-2px) scale(1.04);
filter:
drop-shadow(0 4px 8px rgba(0, 0, 0, 0.28))
drop-shadow(0 14px 28px rgba(0, 0, 0, 0.45));
}
.nav-links {
display: flex;
align-items: center;
gap: 0.25rem;
list-style: none;
}
.nav-links a {
color: var(--text-muted);
font-size: 0.92rem;
font-weight: 500;
padding: 0.5rem 0.85rem;
border-radius: 10px;
transition: color 0.2s, background 0.2s;
}
.nav-links a:hover,
.nav-links a.active {
color: var(--text);
background: rgba(255, 255, 255, 0.04);
}
.nav-cta {
display: flex;
align-items: center;
gap: 0.65rem;
}
.nav-toggle {
display: none;
width: 42px;
height: 42px;
border-radius: 10px;
border: 1px solid var(--border);
background: var(--bg-elevated);
color: var(--text);
cursor: pointer;
place-items: center;
font-size: 1.2rem;
}
/* ─── Footer ─── */
.site-footer {
border-top: 1px solid var(--border);
background: var(--bg-secondary);
padding: 4rem 0 2rem;
margin-top: 2rem;
}
.footer-grid {
display: grid;
grid-template-columns: 1.4fr repeat(3, 1fr);
gap: 2.5rem;
margin-bottom: 3rem;
}
.footer-brand {
display: flex;
flex-direction: column;
gap: 1rem;
}
.footer-brand img {
width: 40px;
height: 40px;
border-radius: 10px;
}
.footer-brand p {
font-size: 0.92rem;
color: var(--text-muted);
max-width: 28ch;
}
.footer-col h4 {
font-size: 0.78rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--text-faint);
margin-bottom: 1rem;
}
.footer-col a {
display: block;
color: var(--text-muted);
font-size: 0.92rem;
padding: 0.3rem 0;
}
.footer-col a:hover {
color: var(--accent);
}
.footer-bottom {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding-top: 1.75rem;
border-top: 1px solid var(--border);
font-size: 0.85rem;
color: var(--text-faint);
}
.footer-bottom a {
color: var(--text-muted);
}
.footer-bottom a:hover {
color: var(--accent);
}
/* ─── Ambient background ─── */
.bg-mesh {
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
background:
radial-gradient(ellipse 80% 50% at 50% -20%, rgba(45, 212, 191, 0.12), transparent 55%),
radial-gradient(ellipse 40% 40% at 90% 10%, rgba(56, 189, 248, 0.06), transparent 50%),
radial-gradient(ellipse 50% 40% at 10% 60%, rgba(45, 212, 191, 0.04), transparent 50%),
var(--bg-primary);
}
.bg-grid {
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
background-image:
linear-gradient(rgba(255, 255, 255, 0.02) 1px, transparent 1px),
linear-gradient(90deg, rgba(255, 255, 255, 0.02) 1px, transparent 1px);
background-size: 64px 64px;
mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, black, transparent);
-webkit-mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, black, transparent);
}
/* ─── Utilities ─── */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.flex { display: flex; }
.flex-wrap { flex-wrap: wrap; }
.items-center { align-items: center; }
.justify-between { justify-content: space-between; }
.gap-2 { gap: 0.5rem; }
.gap-3 { gap: 0.75rem; }
.gap-4 { gap: 1rem; }
.mt-2 { margin-top: 0.5rem; }
.mt-4 { margin-top: 1rem; }
.mt-6 { margin-top: 1.5rem; }
.mb-4 { margin-bottom: 1rem; }
.mb-6 { margin-bottom: 1.5rem; }
.text-muted { color: var(--text-muted); }
.text-center { text-align: center; }
/* ─── Reveal animation ─── */
.reveal {
opacity: 0;
transform: translateY(22px);
transition: opacity 0.7s var(--ease), transform 0.7s var(--ease);
}
.reveal.visible {
opacity: 1;
transform: none;
}
/* ─── Responsive / mobile ─── */
/* Backdrop for open mobile menus */
.nav-backdrop,
.docs-sidebar-backdrop {
display: none;
position: fixed;
inset: 0;
z-index: 900;
background: rgba(0, 0, 0, 0.55);
-webkit-backdrop-filter: blur(2px);
backdrop-filter: blur(2px);
border: 0;
padding: 0;
cursor: pointer;
}
.nav-backdrop.is-visible,
.docs-sidebar-backdrop.is-visible {
display: block;
}
body.nav-open,
body.docs-sidebar-open {
overflow: hidden;
touch-action: none;
}
@media (max-width: 900px) {
:root {
--nav-h: 60px;
/* Fit fully inside the bar · no overflow / cradle on mobile */
--brand-logo: 44px;
--brand-top-inset: 0px;
--brand-overhang: 0px;
}
.site-nav {
height: auto;
min-height: var(--nav-h);
padding-top: env(safe-area-inset-top, 0);
overflow: visible;
}
.nav-inner {
width: 100%;
max-width: 100%;
padding: 0.65rem 1rem;
padding-right: max(1rem, env(safe-area-inset-right));
padding-left: max(1rem, env(safe-area-inset-left));
flex-wrap: wrap;
row-gap: 0;
box-sizing: border-box;
overflow: visible;
}
.nav-brand {
order: 1;
font-size: 1.1rem;
gap: 0.35rem;
height: calc(var(--nav-h) - 0px);
min-height: calc(var(--nav-h) - 8px);
align-items: center;
}
/* No cradle on mobile */
.nav-brand::before,
.nav-brand::after,
.site-nav.scrolled .nav-brand::before,
.site-nav.scrolled .nav-brand::after {
content: none;
display: none;
background: none;
border: none;
box-shadow: none;
}
.nav-brand-text {
margin-left: 0;
}
.nav-brand-logo {
/* Sit flush in the bar · no hang above/below */
align-self: center;
margin: 0;
width: var(--brand-logo);
height: var(--brand-logo);
max-height: calc(var(--nav-h) - 12px);
}
.nav-brand:hover .nav-brand-logo {
transform: none;
}
.nav-toggle {
display: grid;
order: 2;
margin-left: auto;
min-width: 44px;
min-height: 44px;
touch-action: manipulation;
}
.nav-links,
.nav-cta {
display: none;
}
/* Single stacked panel: links + CTAs flow naturally (no absolute dual panels) */
.site-nav.open {
background: var(--bg-secondary);
border-bottom-color: var(--border);
max-height: min(100dvh, 100vh);
/* Drawer scrolls; pear may clip while open · ok vs closed overflow */
overflow-x: visible;
overflow-y: auto;
overscroll-behavior: contain;
}
.site-nav.open .nav-links {
display: flex;
flex-direction: column;
order: 3;
width: 100%;
flex-basis: 100%;
gap: 0.15rem;
padding: 0.75rem 0 0.35rem;
border-top: 1px solid var(--border);
margin-top: 0.5rem;
list-style: none;
}
.site-nav.open .nav-links a {
display: flex;
align-items: center;
min-height: 48px;
padding: 0.75rem 0.85rem;
font-size: 1rem;
border-radius: 12px;
}
.site-nav.open .nav-cta {
display: flex;
flex-direction: column;
order: 4;
width: 100%;
flex-basis: 100%;
gap: 0.65rem;
padding: 0.5rem 0 0.85rem;
}
.site-nav.open .nav-cta .btn {
width: 100%;
max-width: 100%;
white-space: normal;
min-height: 48px;
justify-content: center;
}
.footer-grid {
grid-template-columns: 1fr 1fr;
gap: 1.75rem 1.25rem;
}
.section {
padding: 3.5rem 0;
}
.card {
padding: 1.25rem;
}
pre {
font-size: 0.76rem;
padding: 0.9rem 0.95rem;
}
.code-block pre {
padding-right: 4rem;
}
/* Touch-friendly controls */
.btn {
min-height: 44px;
touch-action: manipulation;
}
.btn-sm {
min-height: 40px;
}
/* Tables: scroll inside wrap only */
.table-wrap {
-webkit-overflow-scrolling: touch;
overflow-x: auto;
margin-inline: 0;
}
table {
min-width: 28rem;
table-layout: auto;
}
th, td {
white-space: normal;
word-break: break-word;
}
h1 {
font-size: clamp(1.85rem, 8vw, 2.6rem);
}
h2 {
font-size: clamp(1.4rem, 5.5vw, 2rem);
}
.lead {
font-size: 1.02rem;
}
}
@media (max-width: 560px) {
.footer-grid {
grid-template-columns: 1fr;
gap: 1.5rem;
}
.footer-col a {
padding: 0.45rem 0;
min-height: 40px;
display: flex;
align-items: center;
}
.footer-bottom {
flex-direction: column;
align-items: flex-start;
gap: 0.65rem;
text-align: left;
}
.container,
.container-wide {
width: min(100% - 1.25rem, var(--max));
}
.btn {
white-space: normal;
text-align: center;
}
.btn-lg {
padding: 0.9rem 1.25rem;
width: 100%;
max-width: 100%;
}
.hero-actions {
flex-direction: column;
align-items: stretch;
}
.hero-actions .btn {
width: 100%;
}
/* Safe area for home indicator */
.site-footer {
padding-bottom: max(2rem, env(safe-area-inset-bottom));
}
body {
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
}
}
/* Very small phones */
@media (max-width: 380px) {
:root {
--brand-logo: 40px;
--brand-top-inset: 0px;
--brand-overhang: 0px;
}
.nav-brand {
font-size: 1rem;
gap: 0.25rem;
}
.nav-brand-text {
margin-left: 0;
}
.container,
.container-wide {
width: min(100% - 1rem, var(--max));
}
}
/* ─── Hard ban: no horizontal scrollbars on code / install blocks ─── */
pre,
pre code,
.code-block,
.install-card,
.table-wrap {
overflow-x: clip !important;
max-width: 100% !important;
min-width: 0 !important;
}
pre,
pre code {
white-space: pre-wrap !important;
word-break: break-all !important;
overflow-wrap: anywhere !important;
}