новый лэйаут и общий дизайн

main
lambda 4 weeks ago
parent 0a037a5bc5
commit 30eeee635b

@ -0,0 +1,4 @@
PRODUCT.md
DESIGN.md
readme.md
.impeccable/

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

@ -0,0 +1,101 @@
# Design
<!-- impeccable design system — Cyclocrust -->
A crust-punk xerox zine, held inside a tight grid. The subject is bicycles and
crust punk; the ethics are DIY and minimal consumption. The look borrows the
strict monochrome and photocopied-zine / noisy-film feel of japanese crust, but
keeps a dosnoventa-tight, ordered structure. Built code-first on Eleventy (11ty)
v3 + Nunjucks + plain CSS.
## The two poles
- **Chaos (crust):** photocopier grain over the sheet, halftone 1-bit photos,
heavy condensed caps, the `////` slash motif, hairline rules, `№` stamps.
- **Order (dosnoventa):** a clean 1160px shell, strict baseline rhythm, one
monochrome palette, everything on a ruled grid.
Neither wins: the grain and the caps supply the attitude, the grid keeps it
legible.
## Palette
Strictly monochrome — paper and one ink.
| token | value | role |
|---------|-----------|-----------------------------------|
| `--paper` | `#f4f1ea` | newsprint / warm photocopy ground |
| `--ink` | `#111110` | photocopier black (text, rules) |
| `--dim` | `#59544a` | faded toner grey (secondary) |
| `--faint` | `#b7b0a3` | whisper rules |
Contrast: ink/paper 17.4:1, dim/paper 7.1:1, paper-on-ink 17.4:1 — all far above
4.5:1.
## Type
Self-hosted woff2 with cyrillic + latin subsets; no external font requests.
- **Jost 300–700** — the brand display face: a **Futura** homage (geometric,
Paul Renner). Masthead, titles, labels, buttons, nav. The author's identity
sheet is set in Futura PT Light, so Jost is the web stand-in (Futura itself is
licensed and lacks a free webfont).
- **Literata 400/600/700 + italic** — the serif reading column (the text face
the author asked for).
- **JetBrains Mono 400/700** — dates, entry numbers, spec keys, captions.
Measure 64ch; body ~17px; display titles up to 4.6rem fluid.
## Mark
The logo mark is the author's own `../identity/logo-mark.png`, traced to clean
inline SVG (potrace) and inlined in the masthead so no extra static file ships:
two large intersecting circles forming a lens, an ellipse iris, and a filled
**diamond** pupil. `fill="currentColor"`, so it inherits the ink colour.
## Signature moves
- **The `////` slash** (from the logo's four mitre strokes) recurs: the button
tail, list bullets, the caption and back-link prefixes.
- **Photocopier grain** — a fixed, non-interactive multiply layer over the whole
sheet (`static/images/grain.png`, ~14% opacity).
- **Halftone photographs** — the two real photos are dithered to 1-bit B&W
(`hero-xerox.png`, `lugs-xerox.png`) and multiply-blended onto the paper.
## Structure
- **Masthead** — eye mark + `cyclocrust` wordmark, uppercase nav, mono folio.
- **Cover** — newest entry leads: condensed caps title, ruled fact line
(запись · дата · материал), serif lede, ink-block CTA, halftone plate + mono
caption.
- **Log** — entry index as a ruled contents list: `№ · дата · заголовок ·
материал`; hover shifts the row and underlines the title.
- **Entry** — left data rail (sticky spec table + date), serif reading column
with a condensed drop cap, ruled `h2`s, framed halftone figures.
- **Colophon** — wordmark, note, contacts, mono tag.
## Motion
One authored moment: rows and nav carry a single ease-out transition; the ink
button inverts on hover. No scroll effects. `prefers-reduced-motion` keeps
smooth scroll off.
## Browser surfaces
Selection (ink ground), caret, scrollbar (dim on paper), focus ring (2.5px ink),
underline offset, and `accent-color` are themed to the two-colour palette.
## Content contracts
- Titles and copy stay as written by the author; `topic`, `material`, `status`
come from frontmatter with honest defaults; no invented facts.
- Contacts ship as the author's real ones: e-mail `order@cyclocrust.net` and
Instagram `cyclocrust` (no Telegram).
- No fabricated prices, counts, testimonials, or commercial claims.
- Rasters carry provenance: the two photographs are the author's own, dithered;
the grain is generated.
## Constraints
Eleventy (11ty) v3 kept as-is; `dist/` is the output. `.eleventyignore` excludes
`PRODUCT.md`, `DESIGN.md`, `readme.md`, `.impeccable/`.

@ -0,0 +1,80 @@
# Product
<!-- impeccable:product-schema 1 -->
## Platform
web
## Stack
Eleventy (11ty) v3 static site, Nunjucks templates, plain CSS. Stays on 11ty — pinned by the user.
Build path: code-led (no image generation available; only magick/ffmpeg converters reported by `impeccable context`). Comp-led is unavailable.
## Users
CONFIRMED (user, 2026-10-03):
1. PRIMARY — the author himself. This is an art diary: a personal record of framebuilding as an art practice.
2. SECONDARY — potential frame customers, who read the blog as a portfolio and should finish wanting to commission a frame.
Reader situation: Russian-speaking, reads on phone/desktop, evening; an enthusiast of steel frames and fixed-gear culture.
## Product Purpose
CONFIRMED: an art diary first (the author's self-expression through the aesthetics of classic steel frames); a portfolio second (proof of craft that turns a reader into a prospective customer).
Success (CONFIRMED): the reader understands the craft and the author's point of view, keeps reading — and, for the customer audience, wants to order a frame.
## Positioning
CONFIRMED (user, 2026-10-03): Cyclocrust is bicycles and crust punk. The ethic is
DIY and hardcore punk; the author is vegan and consumes minimally. Positioning =
"framebuilding as an art project", self-expression through the aesthetics of
classic steel frames — a maker's voice, not a shop. Visual code, also confirmed:
take strict monochrome and the feel of a photocopied zine / noisy film from
japanese crust punk, held inside a dosnoventa-tight, ordered structure.
## Operating Context
Author writes long-form Russian posts with workshop and ride photographs. Posts are the primary unit; the index is the diary's front page and doubles as the portfolio entry. A "контакты" link exists in the header but points to a non-existent `links` page.
## Capabilities and Constraints
- Static 11ty site, output to `dist/`; passthrough copy of `static/**` and `posts/**/*.jpg`.
- Post collection tagged `posts` via `_includes/post.njk`; `index.njk` lists posts.
- Russian-language content (lang="ru").
- Durable assets: logo (C mark, inline SVG); `static/images/hero.jpg` (night film photo: fixed-gear rider between a Photoautomat booth and a red vending machine); `posts/intro/conno_lugs_commercial.jpg` (flat-lay of Cr-Mo "SUPER-STRONG" tubing, lugs, BB shells, dropouts, Japanese catalogue labelling).
- UNDECIDED: whether a contacts/commission page gets built; exact site title ("Cyclocrust 51" vs "cyclocrust").
## Brand Commitments
- Name: Cyclocrust / "cyclocrust".
- Logo mark: the **eye** — two arcs, an iris ring, a filled diamond pupil
(author's identity sheet `../identity/logo.svg`; the "51" rhombus and the frame
wordmark are not used). Reusable motif: the four `////` mitre strokes.
- Language: Russian.
- Visual code (CONFIRMED): strict monochrome; photocopied-zine / noisy-film
texture; japanese-crust attitude inside a dosnoventa-tight grid; a serif face
for body text. Brand display face is **Futura** (the author's identity sheet is
Futura PT); the web build uses Jost, a Futura homage, since Futura has no free
webfont.
- Preserve: existing post text, the two photographs, the 11ty stack.
## Evidence on Hand
- `static/images/hero.jpg` — night flash film photograph, heavy grain, deep blacks, single hard light (real, author's own). The dominant visual evidence of the "art diary" world. A 1-bit halftone version (`hero-xerox.png`) ships on the site.
- `posts/intro/conno_lugs_commercial.jpg` — flat-lay component scan with Japanese catalogue labelling (real); halftone version `posts/intro/lugs-xerox.png`. Evidence of the technical/specification world.
- `posts/intro.md` — intro post.
- Contacts (CONFIRMED): e-mail `order@cyclocrust.net`, Instagram `cyclocrust`.
- Identity assets (`../identity/`): `logo-mark.png` (the eye — inlined as SVG in the masthead), `51.png`/`51.svg` (the "51" diamond — inlined in the colophon).
- ABSENT (must not be fabricated): customer testimonials, frame prices, build counts, press, awards, delivery claims.
## Product Principles
1. The craft is the subject: real work, real material, real process — never generic "industrial" decoration.
2. Voice over inventory: an art practice, not a shop.
3. Night-workshop, photographic atmosphere — read the light from the material already on hand.
4. Reading comfort is part of the design: a calm column inside a committed frame.
5. The portfolio duty is real: a visitor must find the path to commissioning within seconds.
## Accessibility & Inclusion
Keep body text contrast ≥ 4.5:1, keyboard-operable navigation, and a readable measure (~65–75ch). No product-specific standard was established beyond this.

@ -1,30 +1,90 @@
---
title: Cyclocrust 51
title: Cyclocrust
---
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8"/>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% if page.url != "/" %}{{ title }} · Cyclocrust{% else %}Cyclocrust — журнал фреймбилдинга{% endif %}</title>
<meta name="description" content="Фреймбилдинг как арт-проект: стальные рамы, crust punk, DIY. Журнал сборки.">
<meta name="color-scheme" content="light">
<link rel="preload" href="/static/fonts/jost-700-cyr.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/static/css/bundle.css">
<title>{{ title }}</title>
</head>
<body>
<div class="head">
<h1>cyclocrust 51</h1>
<div class="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160.29378 184.2236">
<path d="M-9.29472 45.1525c-4.66648-4.43316-22.63243-20.2992-52.26458-20.2992-44.79821 0-80.7301 35.46525-80.7301 80.26346 0 43.39826 34.53195 80.03013 81.19675 80.03013 16.79933 0 35.9319-5.36645 51.79793-19.36589v-13.53279c-15.86603 17.26597-36.63187 23.56572-52.26458 23.56572-31.49874 0-69.9972-24.03237-69.9972-70.23052 0-39.43176 29.86547-71.39715 69.76388-71.39715 20.06586 0 39.19843 8.86631 52.4979 24.49902z" transform="rotate(-90 -17.0739 7.7792)"/>
<path d="M193.51833-164.8475c-4.66648-4.43316-22.63243-20.29919-52.26458-20.29919-44.7982 0-80.7301 35.46525-80.7301 80.26346 0 43.39826 34.53195 80.03013 81.19675 80.03013 16.79933 0 35.9319-5.36645 51.79793-19.36589v-13.5328c-15.86603 17.26598-36.63187 23.56573-52.26458 23.56573-31.49874 0-69.9972-24.03237-69.9972-70.23052 0-39.43176 29.86547-71.39715 69.76388-71.39715 20.06586 0 39.19843 8.86631 52.4979 24.49902z" transform="rotate(90 -7.7792 -17.0739)"/>
<path d="M113.26131 101.40652a7.61095 7.99795 0 0 1-7.61096 7.99795 7.61095 7.99795 0 0 1-7.61095-7.99795 7.61095 7.99795 0 0 1 7.61095-7.99795 7.61095 7.99795 0 0 1 7.61096 7.99795" transform="translate(-24.85311 -9.2947)"/>
</head>
<body>
<a class="skip" href="#main">К содержанию</a>
<header class="masthead">
<div class="shell masthead__inner">
<a class="plate" href="/" aria-label="Cyclocrust — на главную">
<svg class="plate__mark" viewBox="0 0 700 687" width="40" height="39" aria-hidden="true" focusable="false">
<g transform="translate(0,687) scale(0.1,-0.1)" fill="currentColor">
<path d="M793 6788 c-537 -637 -789 -1329 -788 -2163 1 -415 56 -767 175 -1121 l30 -87 -29 -92 c-365 -1139 -119 -2421 631 -3294 l27 -31 166 2 166 3 -86 95 c-682 747 -970 1801 -764 2798 18 83 35 152 38 152 4 0 22 -30 40 -67 217 -443 638 -925 1083 -1240 1523 -1080 3655 -754 4784 732 130 171 374 570 374 613 0 40 21 -1 39 -75 171 -736 85 -1497 -245 -2154 -135 -270 -302 -500 -553 -761 l-93 -98 175 0 175 0 69 82 c536 637 789 1330 788 2163 -1 415 -56 767 -175 1121 l-30 87 31 96 c191 598 215 1303 64 1929 -115 477 -377 989 -697 1361 l-27 31 -166 -2 -166 -3 86 -95 c682 -747 970 -1801 764 -2797 -18 -84 -35 -153 -38 -153 -4 0 -22 30 -40 68 -217 442 -638 924 -1083 1239 -1523 1080 -3655 754 -4784 -732 -130 -171 -374 -570 -374 -612 0 -46 -22 4 -44 100 -131 576 -102 1182 82 1727 152 448 369 799 721 1163 l94 97 -175 0 -176 0 -69 -82z m3087 -1343 c1140 -132 2096 -800 2575 -1798 87 -181 86 -162 20 -313 -584 -1341 -1875 -2076 -3355 -1908 -1135 128 -2096 799 -2575 1797 -87 181 -86 162 -20 313 583 1339 1883 2079 3355 1909z"/>
<path d="M2879 3880 c-338 -237 -618 -435 -622 -439 -10 -10 1220 -875 1243 -875 32 0 1252 866 1238 879 -22 20 -1215 855 -1230 860 -8 3 -269 -173 -629 -425z"/>
</g>
</svg>
</div>
<ul class="links">
<li><a href="links">контакты</a></li>
<span class="plate__lockup">
<span class="plate__name">cyclocrust</span>
<span class="plate__sub">фреймбилдинг · журнал</span>
</span>
</a>
<nav class="nav" aria-label="Основная навигация">
<ul class="nav__list">
<li><a href="/"{% if page.url == "/" %} aria-current="page"{% endif %}>записи</a></li>
<li><a href="/#kontakty">контакты</a></li>
</ul>
</nav>
<p class="folio">
записей <b>{{ collections.posts | length }}</b><br>
журнал с <b>2025</b>
</p>
</div>
<div class="main">
</header>
<main id="main">
{{ content | safe }}
</main>
<footer class="colophon">
<div class="shell colophon__inner">
<div>
<p class="colophon__wordmark">cyclocrust</p>
<p class="colophon__note">
Фреймбилдинг как арт-проект: стальные рамы, собранные и описанные
вручную. Crust punk, DIY, минимальное потребление. Журнал — рабочая
тетрадь мастера и портфолио.
</p>
</div>
<div class="colophon__col" id="kontakty">
<h3>Контакты</h3>
<ul>
<li><a href="mailto:order@cyclocrust.net">order@cyclocrust.net</a></li>
<li><a href="https://instagram.com/cyclocrust">instagram · cyclocrust</a></li>
</ul>
</div>
<svg class="colophon__mark" viewBox="0 0 1200 1480" width="44" height="54" aria-hidden="true" focusable="false">
<g transform="translate(0.000000,1480.000000) scale(0.100000,-0.100000)"
fill="currentColor" stroke="none">
<path d="M5974 14772 c-11 -15 -1360 -1680 -2997 -3699 l-2978 -3673 2978
-3673 c1638 -2020 2988 -3685 3001 -3701 12 -16 24 -27 25 -25 2 2 1352 1668
3001 3701 l2997 3698 -2998 3699 c-1649 2035 -3000 3700 -3003 3700 -3 0 -14
-12 -26 -27z m2808 -3942 c1525 -1882 2773 -3425 2773 -3430 0 -13 -5545
-6850 -5555 -6850 -10 0 -5555 6838 -5555 6850 0 12 5545 6850 5555 6850 5 0
1256 -1539 2782 -3420z"/>
<path d="M4025 10198 c-30 -90 -704 -2322 -701 -2325 2 -2 31 12 64 32 422
247 1056 264 1518 40 1005 -486 1133 -2034 225 -2715 -541 -407 -1352 -413
-1908 -14 -138 99 -336 302 -392 401 -9 16 -268 -76 -319 -113 -19 -14 58
-135 174 -274 749 -900 2363 -842 3066 110 577 784 467 2018 -237 2633 -415
363 -1056 540 -1585 438 -52 -11 -97 -17 -99 -15 -2 2 100 335 226 741 l230
738 931 3 932 2 0 165 0 165 -1060 0 c-840 0 -1062 -3 -1065 -12z"/>
<path d="M7342 10045 l-82 -165 430 0 430 0 0 -2600 0 -2600 185 0 185 0 0
2765 0 2765 -533 0 -532 0 -83 -165z"/>
</g>
</svg>
</div>
</body>
</footer>
</body>
</html>

@ -1,8 +1,39 @@
---
layout: main
---
<article class="entry">
<div class="shell entry__layout">
<aside class="entry__rail" aria-label="Данные записи">
<dl class="entry__spec">
<div>
<dt>тема</dt>
<dd>{{ topic or "фреймбилдинг" }}</dd>
</div>
<div>
<dt>материал</dt>
<dd>{{ material or "хромомолибден" }}</dd>
</div>
<div>
<dt>статус</dt>
<dd>{{ status or "запись журнала" }}</dd>
</div>
</dl>
<p class="entry__index">
<span>запись</span>
<b>{{ page.date | logdate }}</b>
</p>
</aside>
<div class="post">
<h1>{{ title }}</h1>
<div class="entry__body">
<h1 class="entry__title">{{ title }}</h1>
<div class="prose">
{{ content | safe }}
</div>
</div>
<footer class="entry__foot">
<a class="entry__back" href="/">все записи</a>
</footer>
</div>
</div>
</article>

@ -1,5 +1,27 @@
export default async function (eleventyConfig) {
eleventyConfig.setOutputDirectory("dist");
eleventyConfig.addPassthroughCopy("static/**/*");
eleventyConfig.addPassthroughCopy("posts/**/*.jpg");
eleventyConfig.addPassthroughCopy("posts/**/*.{jpg,jpeg,png,webp,mp4}");
// Log-book date: "26 · 04 · 2026" — reads like a stamped entry, not a feed.
eleventyConfig.addFilter("logdate", (date) => {
const d = new Date(date);
if (Number.isNaN(d.getTime())) return "";
const p = (n) => String(n).padStart(2, "0");
return `${p(d.getUTCDate())} · ${p(d.getUTCMonth() + 1)} · ${d.getUTCFullYear()}`;
});
// Entry numbers, zero-padded like a log folio.
eleventyConfig.addFilter("pad3", (n) => String(n).padStart(3, "0"));
return {
dir: {
input: ".",
includes: "_includes",
output: "dist",
},
templateFormats: ["njk", "md"],
markdownTemplateEngine: "njk",
htmlTemplateEngine: "njk",
};
}

@ -2,11 +2,50 @@
layout: main
---
<div class="posts">
{%- for post in collections.posts -%}
<div class="post">
<a href="{{ post.url }}">{{ post.data.title }}</a>
{{ post.title }}
{% set latest = collections.posts | reverse | first %}
{% if latest %}
<section class="cover" aria-label="Последняя запись">
<div class="shell">
<div class="cover__grid">
<div class="cover__text">
<h1 class="cover__title">{{ latest.data.title }}</h1>
<div class="cover__facts">
<span>запись <b>№{{ (collections.posts | length) | pad3 }}</b></span>
<span>дата <b>{{ latest.date | logdate }}</b></span>
<span>материал <b>{{ latest.data.material or "хромомолибден" }}</b></span>
</div>
<p class="cover__lede">
Журнал сборки стальных рам — процесс, материал и медленный труд,
описанные с точки зрения мастера.
</p>
<p>
<a class="btn" href="{{ latest.url }}">Читать запись</a>
</p>
</div>
<figure class="cover__figure">
<img src="/static/images/hero-xerox.png" alt="Ночная фотография: человек с фиксом у автоматов Photoautomat и Rocky Boxer" width="1200" height="1800" fetchpriority="high" decoding="async">
<figcaption>ночь · фикс · двое автоматов · плёнка</figcaption>
</figure>
</div>
</div>
</section>
{% endif %}
<div class="shell">
<div class="band">
<span class="band__label">записи</span>
<span class="band__rule"></span>
<span class="band__count">{{ collections.posts | length }} шт.</span>
</div>
<div class="log">
{%- for post in collections.posts | reverse -%}
<a class="log__row" href="{{ post.url }}">
<span class="log__no">№{{ (collections.posts | length) - loop.index0 | pad3 }}</span>
<span class="log__date">{{ post.date | logdate }}</span>
<span class="log__title">{{ post.data.title }}</span>
<span class="log__meta">{{ post.data.material or "—" }}</span>
</a>
{%- endfor -%}
</div>
{%- endfor -%}
</div>

@ -1,5 +1,9 @@
---
title: Что такое Cyclocrust?
date: 2026-04-26
topic: фреймбилдинг
material: хромомолибден
status: в работе
---
Это фреймбилдинг как арт проект. Способ моего самовыражения
@ -7,4 +11,7 @@ title: Что такое Cyclocrust?
Медитатция в процессе производства
![узлы](./conno_lugs_commercial.jpg)
<figure>
<img src="./lugs-xerox.png" alt="Узлы и трубы: оригинальные компоненты рамы Cr-Mo «SUPER-STRONG»" width="1100" height="1316" loading="lazy" decoding="async">
<figcaption>узлы и трубы · оригинальные компоненты рамы Cr-Mo «SUPER-STRONG»</figcaption>
</figure>

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

@ -1,46 +1,371 @@
body {
max-width: 1200px;
background: black;
color: white;
margin-inline: auto;
padding-inline: clamp(1rem, 5vw, 120px);
/* ==========================================================================
Cyclocrust — crust punk xerox zine
Bicycles and crust punk, DIY, minimal consumption. A black-and-white
photocopied zine: paper ground, one black ink, halftone photographs,
hairline rules, //// slashes, faint photocopier grain.
Two poles held at once: japanese-crust monochrome chaos (grain, condensed
caps, slash marks) inside a dosnoventa-tight, ordered grid.
========================================================================== */
:root {
--paper: #f4f1ea; /* newsprint / warm photocopy paper */
--ink: #111110; /* photocopier black */
--dim: #59544a; /* faded toner grey */
--faint: #b7b0a3; /* whisper rules */
--rule: color-mix(in srgb, var(--ink) 16%, transparent);
--rule-strong: color-mix(in srgb, var(--ink) 40%, transparent);
/* scrollbar roles (kept separate so they can be overridden for contrast) */
--scrollbar-thumb: var(--dim);
--scrollbar-track: var(--paper);
--cond: "Jost", "Futura", "Century Gothic", system-ui, sans-serif;
--serif: "Literata", Georgia, "Times New Roman", serif;
--mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", monospace;
--measure: 64ch;
--gutter: clamp(1.1rem, 5vw, 4rem);
--shell: 1160px;
--ease: cubic-bezier(0.16, 1, 0.3, 1);
--grain-opacity: 0.12; /* photocopier grain strength over the sheet */
/* One scheme on purpose: the site is a light "paper" zine. Declaring it on
:root lets the browser theme native UI (controls, canvas, scrollbars) to
match and avoids a white flash. */
color-scheme: light;
}
@media (prefers-reduced-motion: no-preference) {
html { scroll-behavior: smooth; }
}
/* Photocopier grain over the whole sheet (fixed, non-interactive) -------- */
body::before {
content: "";
position: fixed;
inset: 0;
z-index: 9999;
pointer-events: none;
opacity: var(--grain-opacity);
mix-blend-mode: multiply;
background-image: url("/static/images/grain.png");
background-size: 160px 160px;
}
/* Torn/uneven toner edges along the sheet */
body::after {
content: "";
position: fixed;
inset: 0;
z-index: 9998;
pointer-events: none;
box-shadow: inset 0 0 90px color-mix(in srgb, var(--ink) 10%, transparent);
}
.head {
align-items: center;
body {
background: var(--paper);
color: var(--ink);
font-family: var(--serif);
font-size: clamp(1rem, 0.95rem + 0.25vw, 1.09rem);
line-height: 1.66;
/* Normalize fallback x-height so Georgia/Times don't shift layout while
Literata loads (or if it fails). */
font-size-adjust: from-font;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-kerning: normal;
min-height: 100vh;
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center;
padding-top: 2rem;
flex-direction: column;
}
.head > * {
flex: 1 1 200px;
flex-basis: calc((600px - 100%) * 999);
text-align: center;
/* Browser surfaces carry the design ------------------------------------- */
::selection { background: var(--ink); color: var(--paper); }
:focus-visible { outline: 2.5px solid var(--ink); outline-offset: 3px; }
html { accent-color: var(--ink); caret-color: var(--ink); scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); scrollbar-gutter: stable; }
/* Legacy WebKit fallback, guarded so it never conflicts with scrollbar-color */
@supports not (scrollbar-color: auto) {
::-webkit-scrollbar { width: 12px; height: 12px; }
::-webkit-scrollbar-track { background: var(--scrollbar-track); }
::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border: 3px solid var(--scrollbar-track); }
}
/* High-contrast preference: stark black thumb on white */
@media (prefers-contrast: more) {
:root { --scrollbar-thumb: #000; --scrollbar-track: #fff; }
}
.head > h1 {
white-space: nowrap;
a { color: inherit; text-decoration-thickness: 1.5px; text-underline-offset: 0.2em; }
.shell { width: 100%; max-width: var(--shell); margin-inline: auto; padding-inline: var(--gutter); }
.skip {
position: absolute; left: -9999px; top: 0; z-index: 100;
background: var(--ink); color: var(--paper);
padding: 0.6rem 1rem; font-family: var(--mono); font-size: 0.8rem;
}
.skip:focus { left: 1rem; top: 1rem; }
/* ==========================================================================
Masthead — a zine cover strip
========================================================================== */
.masthead { border-bottom: 2px solid var(--ink); background: var(--paper); }
.masthead__inner {
display: flex; align-items: center; gap: clamp(0.9rem, 4vw, 2.4rem);
padding-block: 0.85rem; min-height: 4.6rem;
}
.plate { flex: none; display: flex; align-items: center; gap: 0.75rem; text-decoration: none; color: var(--ink); }
.plate__mark { width: 40px; height: 39px; flex: none; color: var(--ink); }
.plate__lockup { display: flex; flex-direction: column; line-height: 1; }
.plate__name {
font-family: var(--cond); font-weight: 500; font-size: 1.55rem;
letter-spacing: 0.005em; text-transform: lowercase;
}
.plate__sub {
font-family: var(--mono); font-size: 0.6rem; letter-spacing: 0.22em;
text-transform: uppercase; color: var(--dim); margin-top: 0.34rem;
}
.nav { margin-left: auto; }
.nav__list { display: flex; align-items: center; gap: clamp(1rem, 3vw, 2.1rem); }
.nav a {
font-family: var(--cond); font-weight: 500; font-size: 0.9rem;
letter-spacing: 0.16em; text-transform: uppercase; text-decoration: none;
color: var(--ink); padding-block: 0.35rem;
border-bottom: 2px solid transparent;
transition: border-color 0.25s var(--ease);
}
.nav a:hover, .nav a[aria-current="page"] { border-bottom-color: var(--ink); }
.head > .logo {
max-width: fit-content;
.folio {
flex: none; font-family: var(--mono); font-size: 0.7rem; letter-spacing: 0.05em;
color: var(--dim); padding-left: clamp(1rem, 3vw, 2rem);
border-left: 1px solid var(--rule); text-align: right;
}
.folio b { color: var(--ink); font-weight: 700; }
.head > .logo > svg {
display: block;
fill: white;
height: auto;
width: 100px;
@media (max-width: 760px) {
.masthead__inner { flex-wrap: wrap; gap: 0.5rem 1rem; }
.nav { order: 3; margin-left: 0; width: 100%; border-top: 1px solid var(--rule); padding-top: 0.6rem; }
.folio { display: none; }
}
.head > .links {
list-style: none;
/* ==========================================================================
Cover — the zine's lead page
========================================================================== */
.cover { border-bottom: 2px solid var(--ink); }
.cover__grid { display: grid; grid-template-columns: 1.15fr 1fr; align-items: stretch; }
.cover__text {
padding: clamp(2rem, 5vw, 4rem) clamp(1.2rem, 4vw, 3rem) clamp(2rem, 5vw, 3.6rem);
display: flex; flex-direction: column; justify-content: center; gap: 1.2rem;
}
.cover__title {
font-family: var(--cond); font-weight: 500;
font-size: clamp(2.4rem, 6.6vw, 4.6rem); line-height: 0.94;
letter-spacing: -0.01em; text-transform: uppercase;
text-wrap: balance; max-width: 15ch;
/* Cap-height normalization suits an all-caps display line. */
font-size-adjust: cap-height from-font;
}
.cover__facts {
display: flex; flex-wrap: wrap; gap: 0.4rem 1.3rem;
font-family: var(--mono); font-size: 0.72rem; letter-spacing: 0.04em;
color: var(--dim); border-top: 1px solid var(--rule-strong); padding-top: 0.85rem;
}
.cover__facts b { color: var(--ink); font-weight: 700; }
.cover__lede {
font-size: clamp(1.05rem, 1rem + 0.4vw, 1.25rem); color: color-mix(in srgb, var(--ink) 82%, var(--paper));
max-width: 36ch; text-wrap: pretty;
}
.cover__figure { position: relative; border-left: 2px solid var(--ink); overflow: hidden; }
.cover__figure img {
width: 100%; height: 100%; object-fit: cover;
filter: contrast(1.06) saturate(0);
mix-blend-mode: multiply;
}
.cover__figure figcaption {
position: absolute; left: 0; bottom: 0; right: 0;
padding: 0.7rem 0.9rem; background: var(--paper);
border-top: 1px solid var(--ink);
font-family: var(--mono); font-size: 0.66rem; letter-spacing: 0.04em;
}
@media (max-width: 860px) {
.cover__grid { grid-template-columns: 1fr; }
.cover__figure { order: -1; border-left: 0; border-bottom: 2px solid var(--ink); aspect-ratio: 4/3; }
}
.head > .links a {
color: white;
font-size: 1.5em;
/* ==========================================================================
Section band
========================================================================== */
.band {
display: flex; align-items: center; gap: 1rem;
padding-top: clamp(2.4rem, 6vw, 4rem); padding-bottom: 0.7rem;
}
.band__label {
font-family: var(--cond); font-weight: 600; font-size: 1.05rem;
letter-spacing: 0.2em; text-transform: uppercase; flex: none;
}
.band__rule { flex: 1; height: 2px; background: var(--ink); }
.band__count { flex: none; font-family: var(--mono); font-size: 0.72rem; color: var(--dim); }
/* ==========================================================================
Log — entry index as a ruled zine contents list
========================================================================== */
.log { border-top: 2px solid var(--ink); margin-bottom: clamp(3rem, 8vw, 5.5rem); }
.log__row {
display: grid; grid-template-columns: 4rem 8.4rem minmax(0, 1fr) auto;
align-items: baseline; gap: 1.1rem; padding-block: 1rem;
border-bottom: 1px solid var(--rule); text-decoration: none; color: var(--ink);
transition: background 0.25s var(--ease), transform 0.25s var(--ease);
}
.log__row:hover { background: color-mix(in srgb, var(--ink) 6%, var(--paper)); transform: translateX(0.5rem); }
.log__no { font-family: var(--mono); font-size: 0.82rem; color: var(--dim); }
.log__date { font-family: var(--mono); font-size: 0.76rem; color: var(--dim); }
.log__title {
font-family: var(--cond); font-weight: 500;
font-size: clamp(1.15rem, 0.95rem + 1vw, 1.75rem); line-height: 1.06;
text-transform: uppercase;
}
.log__meta { font-family: var(--mono); font-size: 0.7rem; color: var(--dim); text-align: right; white-space: nowrap; }
.log__row:hover .log__title { text-decoration: underline; text-decoration-thickness: 3px; text-underline-offset: 0.12em; }
@media (max-width: 760px) {
.log__row { grid-template-columns: 3rem minmax(0, 1fr); gap: 0.35rem 0.8rem; padding-block: 0.9rem; }
.log__no { grid-row: 1 / span 2; }
.log__date { grid-column: 2; }
.log__title { grid-column: 2; }
.log__meta { grid-column: 2; text-align: left; }
}
/* ==========================================================================
Entry — reading page
========================================================================== */
.entry { padding-block: clamp(2.2rem, 6vw, 4.2rem); flex: 1; }
.entry__layout {
display: grid; grid-template-columns: minmax(11rem, 15rem) minmax(0, 1fr);
gap: clamp(1.6rem, 5vw, 4.2rem); align-items: start;
}
.entry__rail { position: sticky; top: 1.6rem; align-self: start; }
.entry__spec { border-top: 2px solid var(--ink); }
.entry__spec > div { padding-block: 0.55rem; border-bottom: 1px solid var(--rule); }
.entry__spec dt {
font-family: var(--mono); font-size: 0.62rem; letter-spacing: 0.14em;
text-transform: uppercase; color: var(--dim); margin-bottom: 0.22rem;
}
.entry__spec dd {
font-family: var(--cond); font-weight: 600; font-size: 1.02rem;
line-height: 1.1; text-transform: uppercase;
}
.entry__index {
margin-top: 0.9rem; font-family: var(--mono); font-size: 0.68rem;
letter-spacing: 0.06em; text-transform: uppercase; color: var(--dim);
display: flex; flex-direction: column; gap: 0.2rem;
}
.entry__index b { color: var(--ink); font-weight: 700; }
.entry__body { max-width: var(--measure); }
@media (max-width: 820px) {
.entry__layout { grid-template-columns: 1fr; gap: 1.6rem; }
.entry__rail { position: static; }
/* single ruled spec list — no empty grid cell, no clipped long values */
.entry__spec { display: block; border-top: 2px solid var(--ink); }
.entry__spec > div {
display: grid; grid-template-columns: 6.5rem minmax(0, 1fr);
gap: 0.3rem 0.8rem; padding-block: 0.55rem;
border-bottom: 1px solid var(--rule);
}
.entry__spec dt { padding-top: 0.22rem; margin: 0; }
.entry__spec dd { overflow-wrap: anywhere; }
.entry__index { display: none; }
}
.entry__title {
font-family: var(--cond); font-weight: 500;
font-size: clamp(1.9rem, 5vw, 3.4rem); line-height: 0.98; letter-spacing: -0.01em;
text-transform: uppercase; text-wrap: balance; margin-bottom: clamp(1.2rem, 3vw, 1.9rem);
padding-bottom: clamp(0.9rem, 2.4vw, 1.4rem); border-bottom: 2px solid var(--ink);
}
/* prose ------------------------------------------------------------------- */
.prose { max-width: var(--measure); }
.prose > * + * { margin-top: 1.05em; }
.prose > h2 {
font-family: var(--cond); font-weight: 600;
font-size: clamp(1.6rem, 1.25rem + 1.5vw, 2.3rem); line-height: 1.02;
text-transform: uppercase; margin-top: 2.2em; padding-top: 0.6em;
border-top: 1px solid var(--rule-strong);
}
.prose > h2 + * { margin-top: 0.6em; }
.prose > h3 { font-family: var(--cond); font-weight: 600; font-size: 1.3rem; letter-spacing: 0.03em; text-transform: uppercase; margin-top: 1.8em; }
.prose > p:first-of-type::first-letter {
float: left; font-family: var(--cond); font-weight: 700; font-size: 3.5em;
line-height: 0.7; padding: 0.06em 0.14em 0 0;
}
.prose a { text-decoration-color: var(--ink); }
.prose a:hover { background: var(--ink); color: var(--paper); text-decoration: none; }
.prose strong { font-weight: 700; }
.prose blockquote {
font-style: italic; padding-block: 0.6rem;
border-top: 1px solid var(--rule-strong); border-bottom: 1px solid var(--rule-strong);
}
.prose code { font-family: var(--mono); font-size: 0.86em; background: color-mix(in srgb, var(--ink) 8%, var(--paper)); padding: 0.1em 0.35em; }
.prose pre { font-family: var(--mono); font-size: 0.84rem; line-height: 1.6; background: var(--ink); color: var(--paper); padding: 1rem 1.1rem; overflow-x: auto; }
.prose pre code { background: none; padding: 0; }
.prose ul, .prose ol { padding-left: 1.3rem; }
.prose li { list-style: none; position: relative; }
.prose li + li { margin-top: 0.35em; }
.prose ul > li::before { content: "//"; position: absolute; left: -1.35rem; font-family: var(--mono); font-size: 0.8em; color: var(--dim); }
.prose ol { counter-reset: n; }
.prose ol > li { counter-increment: n; }
.prose ol > li::before { content: counter(n) "."; position: absolute; left: -1.5rem; font-family: var(--mono); font-size: 0.82em; }
.prose hr { border: 0; border-top: 2px solid var(--ink); margin-block: 2.2em; }
/* figures: framed halftone plates ---------------------------------------- */
.prose figure { margin-block: 2em; }
.prose figure img { width: 100%; border: 2px solid var(--ink); filter: contrast(1.06) saturate(0); mix-blend-mode: multiply; }
.prose figcaption {
font-family: var(--mono); font-size: 0.7rem; line-height: 1.5; color: var(--dim);
margin-top: 0.5rem;
}
.prose figcaption::before { content: "// "; color: var(--ink); font-weight: 700; }
.prose video { width: 100%; border: 2px solid var(--ink); }
.entry__foot {
margin-top: clamp(2.6rem, 6vw, 4.4rem); padding-top: 1.2rem;
border-top: 2px solid var(--ink); display: flex; justify-content: space-between; align-items: center; gap: 1rem;
}
.entry__back {
font-family: var(--cond); font-weight: 500; font-size: 0.92rem;
letter-spacing: 0.16em; text-transform: uppercase; text-decoration: none; color: var(--dim);
}
.entry__back:hover { color: var(--ink); }
.entry__back::before { content: "//"; font-family: var(--mono); margin-right: 0.5rem; }
/* ==========================================================================
Buttons — stamped ink block
========================================================================== */
.btn {
display: inline-flex; align-items: center; gap: 0.6rem;
font-family: var(--cond); font-weight: 500; font-size: 0.95rem;
letter-spacing: 0.14em; text-transform: uppercase; text-decoration: none;
color: var(--paper); background: var(--ink); border: 2px solid var(--ink);
padding: 0.72rem 1.3rem;
transition: background 0.25s var(--ease), color 0.25s var(--ease);
}
.btn::after { content: "////"; font-family: var(--mono); font-size: 0.82em; letter-spacing: -0.16em; }
.btn:hover { background: transparent; color: var(--ink); }
/* ==========================================================================
Colophon — zine back page
========================================================================== */
.colophon { border-top: 2px solid var(--ink); margin-top: auto; }
.colophon__inner {
display: grid; grid-template-columns: 1.4fr 1fr auto; gap: clamp(1.2rem, 4vw, 3rem);
padding-block: clamp(1.8rem, 5vw, 3rem);
}
.colophon__wordmark { font-family: var(--cond); font-weight: 500; font-size: 1.35rem; text-transform: lowercase; }
.colophon__note { font-family: var(--mono); font-size: 0.72rem; line-height: 1.7; color: var(--dim); max-width: 42ch; margin-top: 0.6rem; }
.colophon__col h3 { font-family: var(--mono); font-size: 0.62rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--dim); margin-bottom: 0.6rem; }
.colophon__col ul { display: flex; flex-direction: column; gap: 0.4rem; }
.colophon__col a { font-family: var(--cond); font-weight: 500; font-size: 0.95rem; text-transform: lowercase; letter-spacing: 0.04em; text-decoration: none; color: var(--ink); }
.colophon__col a:hover { text-decoration: underline; text-decoration-thickness: 3px; }
.colophon__mark { width: 44px; height: 54px; color: var(--ink); justify-self: end; align-self: end; }
@media (max-width: 720px) {
.colophon__inner { grid-template-columns: 1fr 1fr; }
.colophon__mark { grid-column: 1 / -1; justify-self: start; }
}

@ -1,2 +1,3 @@
@import "./fonts.css";
@import "./reset.css";
@import "./base.css";

@ -0,0 +1,77 @@
/* Cyclocrust — self-hosted faces (no external requests).
Jost = brand display face — a Futura homage (geometric, Renner).
Masthead, titles, labels, buttons, nav.
Literata = serif reading column.
JetBrains Mono = dates, entry numbers, spec keys, captions. */
/* --- Jost (Futura) --------------------------------------------------------- */
@font-face{font-family:"Jost";font-style:normal;font-weight:300;font-display:swap;
src:url("/static/fonts/jost-300-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Jost";font-style:normal;font-weight:300;font-display:swap;
src:url("/static/fonts/jost-300-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Jost";font-style:normal;font-weight:400;font-display:swap;
src:url("/static/fonts/jost-400-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Jost";font-style:normal;font-weight:400;font-display:swap;
src:url("/static/fonts/jost-400-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Jost";font-style:normal;font-weight:500;font-display:swap;
src:url("/static/fonts/jost-500-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Jost";font-style:normal;font-weight:500;font-display:swap;
src:url("/static/fonts/jost-500-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Jost";font-style:normal;font-weight:600;font-display:swap;
src:url("/static/fonts/jost-600-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Jost";font-style:normal;font-weight:600;font-display:swap;
src:url("/static/fonts/jost-600-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Jost";font-style:normal;font-weight:700;font-display:swap;
src:url("/static/fonts/jost-700-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Jost";font-style:normal;font-weight:700;font-display:swap;
src:url("/static/fonts/jost-700-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
/* --- Literata -------------------------------------------------------------- */
@font-face{font-family:"Literata";font-style:normal;font-weight:400;font-display:swap;
src:url("/static/fonts/literata-400-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Literata";font-style:normal;font-weight:400;font-display:swap;
src:url("/static/fonts/literata-400-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Literata";font-style:italic;font-weight:400;font-display:swap;
src:url("/static/fonts/literata-400-i-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Literata";font-style:italic;font-weight:400;font-display:swap;
src:url("/static/fonts/literata-400-i-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Literata";font-style:normal;font-weight:600;font-display:swap;
src:url("/static/fonts/literata-600-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Literata";font-style:normal;font-weight:600;font-display:swap;
src:url("/static/fonts/literata-600-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"Literata";font-style:normal;font-weight:700;font-display:swap;
src:url("/static/fonts/literata-700-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"Literata";font-style:normal;font-weight:700;font-display:swap;
src:url("/static/fonts/literata-700-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
/* --- JetBrains Mono (dates, numbers, keys) --------------------------------- */
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:400;font-display:swap;
src:url("/static/fonts/jbmono-400-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:400;font-display:swap;
src:url("/static/fonts/jbmono-400-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:700;font-display:swap;
src:url("/static/fonts/jbmono-700-cyr.woff2") format("woff2");
unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:700;font-display:swap;
src:url("/static/fonts/jbmono-700-lat.woff2") format("woff2");
unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}

@ -1,19 +1,67 @@
/* Cyclocrust 51 — reset */
*,
*::before,
*::after {
box-sizing: border-box;
}
* {
margin: 0;
}
p, h1, h2, h3, h4, h5, h6 {
html {
-webkit-text-size-adjust: 100%;
text-size-adjust: 100%;
}
img,
svg,
video {
display: block;
max-width: 100%;
}
img {
height: auto;
}
p,
h1,
h2,
h3,
h4,
h5,
h6 {
overflow-wrap: break-word;
}
p {
p,
blockquote,
li,
.prose {
text-wrap: pretty;
}
h1, h2, h3, h4, h5, h6 {
h1,
h2,
h3,
h4,
h5,
h6 {
text-wrap: balance;
}
ul {
ul,
ol {
padding: 0;
list-style: none;
}
button,
input,
select,
textarea {
font: inherit;
color: inherit;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Loading…
Cancel
Save