/* ───────────────────────────────────────────────────────────────────────── «Покупалочка» — 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; } }