/* ─────────────────────────────────────────────────────────────────────────
«Покупалочка» — marketing site stylesheet.
Single file, no build step. Design tokens transcribed from
src/fe/designsystem/tokens.json (Variant 1 — Quiet Editorial).
───────────────────────────────────────────────────────────────────────── */
:root {
/* color — light (tokens.json color.*.light) */
--surface: #FAF7F2;
--surface-variant: #EFEAE0;
--ink: #1A1611;
--ink-muted: #5C5852;
--primary: #2C5F3D;
--on-primary: #FFFFFF;
--outline: #C8C2B7;
--error: #9B2C2C;
--delta-down: #1B5E20;
/* spacing scale (tokens.json spacing) */
--space-xs: 4px;
--space-sm: 8px;
--space-md: 16px;
--space-lg: 24px;
--space-xl: 32px;
--space-xxl: 48px;
/* radii (tokens.json radius) */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
/* motion (tokens.json motion) */
--dur-fast: 150ms;
--dur-med: 250ms;
--dur-slow: 400ms;
--ease-standard: cubic-bezier(0.2, 0.0, 0.0, 1.0);
/* type families (tokens.json type.family) */
--font-display: Georgia, "Times New Roman", "PT Serif", serif;
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, sans-serif;
--measure: 960px;
}
@media (prefers-color-scheme: dark) {
:root {
/* color — dark (tokens.json color.*.dark) */
--surface: #0F0D0A;
--surface-variant: #1C1916;
--ink: #F0EDE7;
--ink-muted: #A8A4A0;
--primary: #A8D5A0;
--on-primary: #0F2515;
--outline: #3A3631;
--error: #F2B8B5;
--delta-down: #A5D6A7;
}
}
/* ── reset / base ────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
margin: 0;
background: var(--surface);
color: var(--ink);
font-family: var(--font-body);
font-size: 16px; /* bodyMd */
line-height: 24px;
letter-spacing: 0.15px;
-webkit-font-smoothing: antialiased;
}
img, svg { display: block; max-width: 100%; }
a { color: var(--primary); }
h1, h2, h3 {
font-family: var(--font-display);
font-weight: 600;
color: var(--ink);
margin: 0;
}
p { margin: 0; }
/* visually-hidden but available to screen readers and crawlers (e.g. the hero
, whose visible counterpart is the decorative rotating headline). */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0 0 0 0);
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
/* ── layout primitives ───────────────────────────────────────────────────── */
.container {
max-width: var(--measure);
margin: 0 auto;
padding: 0 var(--space-lg);
}
.section { padding: var(--space-xxl) 0; }
.section + .section { border-top: 1px solid var(--outline); }
.section-title {
font-size: 28px; /* displayMd */
line-height: 36px;
letter-spacing: -0.3px;
margin-bottom: var(--space-sm);
}
.section-lead {
font-size: 18px; /* bodyLg */
line-height: 26px;
color: var(--ink-muted);
max-width: 38em;
margin-bottom: var(--space-xl);
}
.eyebrow {
font-size: 13px; /* labelMd */
line-height: 18px;
font-weight: 500;
letter-spacing: 0.5px;
text-transform: uppercase;
color: var(--primary);
margin-bottom: var(--space-sm);
}
/* ── header ──────────────────────────────────────────────────────────────── */
.site-header {
border-bottom: 1px solid var(--outline);
}
.site-header .container {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: var(--space-sm) var(--space-md);
padding-top: var(--space-md);
padding-bottom: var(--space-md);
}
.brand {
display: flex;
align-items: center;
gap: var(--space-sm);
text-decoration: none;
color: var(--ink);
}
.brand img {
width: 32px;
height: 32px;
border-radius: var(--radius-md);
}
.brand span {
font-family: var(--font-display);
font-weight: 600;
font-size: 18px; /* titleMd */
}
.site-nav {
display: flex;
gap: var(--space-lg);
font-size: 14px; /* labelLg */
font-weight: 500;
}
.site-nav a { color: var(--ink-muted); text-decoration: none; }
.site-nav a:hover { color: var(--primary); }
/* ── hero ────────────────────────────────────────────────────────────────── */
.hero .container {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-xl);
align-items: center;
padding-top: var(--space-xxl);
padding-bottom: var(--space-xxl);
}
/* rotating headline — all four stacked in one grid cell so the box height
is the tallest line and never jumps. */
.hero-headline {
display: grid;
/* visual matches a display heading — the element is a
, not an
(the real is the sr-only line above it), so set these explicitly
rather than inheriting from the h1,h2,h3 rule. */
font-family: var(--font-display);
font-weight: 600;
color: var(--ink);
font-size: 32px; /* displayLg */
line-height: 40px;
letter-spacing: -0.5px;
margin: 0 0 var(--space-md);
}
.hero-headline span {
grid-area: 1 / 1;
opacity: 0;
animation: headline-cycle 20s var(--ease-standard) infinite;
}
.hero-headline span:nth-child(1) { animation-delay: 0s; }
.hero-headline span:nth-child(2) { animation-delay: 5s; }
.hero-headline span:nth-child(3) { animation-delay: 10s; }
.hero-headline span:nth-child(4) { animation-delay: 15s; }
@keyframes headline-cycle {
0% { opacity: 0; }
2% { opacity: 1; }
23% { opacity: 1; }
25% { opacity: 0; }
100% { opacity: 0; }
}
.hero-sub {
font-size: 18px; /* bodyLg */
line-height: 26px;
color: var(--ink-muted);
max-width: 34em;
margin-bottom: var(--space-lg);
}
.hero-art { max-width: 420px; }
/* ── buttons / RuStore badge ─────────────────────────────────────────────── */
.rustore-badge {
display: inline-block;
line-height: 0;
border-radius: var(--radius-sm);
}
.rustore-badge img { height: 48px; width: auto; }
.badge-on-dark { display: none; }
@media (prefers-color-scheme: dark) {
.badge-on-light { display: none; }
.badge-on-dark { display: block; }
}
/* ── steps («Как это работает») ──────────────────────────────────────────── */
.steps {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-xl);
}
.step { display: flex; flex-direction: column; }
.step-art { max-width: 200px; margin-bottom: var(--space-md); }
.step-num {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: 1.5px solid var(--primary);
border-radius: 999px;
color: var(--primary);
font-size: 14px;
font-weight: 600;
margin-bottom: var(--space-sm);
}
.step h3 {
font-size: 18px; /* titleMd */
line-height: 24px;
margin-bottom: var(--space-xs);
}
.step p { color: var(--ink-muted); }
/* ── cards («Три способа добавить») ──────────────────────────────────────── */
.cards {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-lg);
}
.card {
border: 1px solid var(--outline);
border-radius: var(--radius-lg);
padding: var(--space-lg);
}
.card-art { max-width: 180px; margin-bottom: var(--space-md); }
.card h3 {
font-size: 18px; /* titleMd */
line-height: 24px;
margin-bottom: var(--space-xs);
}
.card p { color: var(--ink-muted); }
/* ── pillars («Что вы получаете») ────────────────────────────────────────── */
.pillars {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-lg);
}
.pillar {
display: grid;
grid-template-columns: 40px 1fr;
gap: var(--space-md);
align-items: start;
}
.pillar-icon { width: 40px; height: 40px; }
.pillar h3 {
font-size: 18px; /* titleMd */
line-height: 24px;
margin-bottom: var(--space-xs);
}
.pillar p { color: var(--ink-muted); }
/* ── callout («Настоящая скидка») ────────────────────────────────────────── */
.callout {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-lg);
align-items: center;
background: var(--surface-variant);
border-radius: var(--radius-lg);
padding: var(--space-xl);
margin-top: var(--space-xl);
}
.callout-art { max-width: 320px; }
.callout h3 {
font-size: 22px; /* headlineMd */
line-height: 28px;
margin-bottom: var(--space-sm);
}
.callout p { color: var(--ink-muted); }
/* ── universal strip / privacy ───────────────────────────────────────────── */
.split {
display: grid;
grid-template-columns: 1fr;
gap: var(--space-xl);
align-items: center;
}
.split-art { max-width: 360px; }
/* ── gallery ─────────────────────────────────────────────────────────────── */
.gallery {
display: grid;
grid-auto-flow: column;
grid-auto-columns: 220px;
gap: var(--space-lg);
overflow-x: auto;
padding-bottom: var(--space-md);
scroll-snap-type: x mandatory;
}
.shot {
margin: 0;
scroll-snap-align: start;
}
.shot a { display: block; }
.shot img {
width: 100%;
height: auto;
border: 1px solid var(--outline);
border-radius: var(--radius-lg);
}
.shot figcaption {
margin-top: var(--space-sm);
font-size: 14px; /* bodySm */
line-height: 20px;
color: var(--ink-muted);
}
/* CSS-only lightbox — no JavaScript, opened via :target */
.lightbox {
position: fixed;
inset: 0;
z-index: 50;
display: flex;
align-items: center;
justify-content: center;
padding: var(--space-lg);
background: rgba(15, 13, 10, 0.88);
opacity: 0;
pointer-events: none;
transition: opacity var(--dur-med) var(--ease-standard);
}
.lightbox:target { opacity: 1; pointer-events: auto; }
.lightbox-backdrop { position: absolute; inset: 0; }
.lightbox img {
position: relative;
max-height: 90vh;
max-width: 92vw;
width: auto;
border-radius: var(--radius-lg);
}
.lightbox-close {
position: absolute;
top: var(--space-md);
right: var(--space-md);
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
line-height: 1;
color: var(--surface);
text-decoration: none;
border: 1px solid rgba(250, 247, 242, 0.5);
border-radius: 999px;
}
/* ── download / support ──────────────────────────────────────────────────── */
.band {
text-align: center;
}
.band .section-title { margin-bottom: var(--space-lg); }
.support-mail {
font-family: var(--font-display);
font-size: 22px; /* headlineMd */
font-weight: 600;
}
/* ── footer ──────────────────────────────────────────────────────────────── */
.site-footer {
border-top: 1px solid var(--outline);
padding: var(--space-xl) 0;
font-size: 14px; /* bodySm */
line-height: 20px;
color: var(--ink-muted);
}
.site-footer .disclaimer { max-width: 52em; margin-bottom: var(--space-md); }
.site-footer .foot-links { display: flex; gap: var(--space-lg); flex-wrap: wrap; }
.site-footer a { color: var(--ink-muted); }
/* ── illustrations — colour comes from CSS custom properties so SVGs flip
with the theme. Geometry/stroke-width stay as SVG attributes. ─────────── */
svg.ill { width: 100%; height: auto; }
svg.ill .stroke {
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
vector-effect: non-scaling-stroke; /* stroke-width stays in CSS px at any size */
}
svg.ill .c-primary { stroke: var(--primary); }
svg.ill .c-outline { stroke: var(--outline); }
svg.ill .c-muted { stroke: var(--ink-muted); }
svg.ill .c-surface { stroke: var(--surface); }
svg.ill .fill-primary { fill: var(--primary); }
svg.ill .fill-surface { fill: var(--surface); }
svg.ill .fill-variant { fill: var(--surface-variant); }
svg.ill .fill-muted { fill: var(--ink-muted); }
svg.ill .dim { opacity: 0.5; }
/* ── privacy-policy page ─────────────────────────────────────────────────── */
.legal { padding: var(--space-xxl) 0; }
.legal h1 {
font-size: 32px; /* displayLg */
line-height: 40px;
letter-spacing: -0.5px;
margin-bottom: var(--space-md);
}
.legal h2 {
font-size: 22px; /* headlineMd */
line-height: 28px;
margin-top: var(--space-xl);
margin-bottom: var(--space-sm);
}
.legal p { margin-bottom: var(--space-md); max-width: 42em; }
.legal ul { max-width: 42em; padding-left: var(--space-lg); }
.legal li { margin-bottom: var(--space-xs); }
.legal .meta { color: var(--ink-muted); font-size: 14px; }
.todo {
background: var(--surface-variant);
border: 1px dashed var(--error);
border-radius: var(--radius-sm);
padding: 0 var(--space-xs);
color: var(--error);
font-family: var(--font-body);
font-size: 0.9em;
}
/* ── blog ────────────────────────────────────────────────────────────────── */
/* index post cards reuse .card; the title is a link — keep it ink, not the
default link green, so a card reads as a heading. */
.post-card h3 a { color: var(--ink); text-decoration: none; }
.post-card h3 a:hover { color: var(--primary); }
/* ── responsive ──────────────────────────────────────────────────────────── */
@media (min-width: 720px) {
.hero .container { grid-template-columns: 1.1fr 0.9fr; }
.hero-headline { font-size: 36px; line-height: 44px; }
.steps { grid-template-columns: repeat(3, 1fr); }
.cards { grid-template-columns: repeat(3, 1fr); }
.pillars { grid-template-columns: repeat(2, 1fr); gap: var(--space-xl); }
.callout { grid-template-columns: 320px 1fr; }
.split { grid-template-columns: 1fr 1fr; }
.split.reverse .split-art { order: 2; }
}
/* ── motion preferences ──────────────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
.hero-headline span { animation: none; opacity: 0; }
.hero-headline span:nth-child(1) { opacity: 1; }
.lightbox { transition: none; }
* { scroll-behavior: auto; }
}