version: alpha name: Cartesian description: A quiet, museum-catalog editorial system built on Playfair Display serif headlines, Inter sans body, and a five-tone warm-stone palette. The aesthetic is "consulting deck meets architectural monograph" — minimal geometric line decorations (thin circles, dashed arcs, vertical and horizontal hairlines) drift behind content, suggesting drafting paper and compass work. Every divider is a single 1px line in a muted taupe; nothing is bold, nothing is loud. The cultural reference is Massimo Vignelli's editorial work, the Cooper Hewitt catalog, and pencil-and-tracing-paper urban planning documents.
colors: bg-primary: "#EDE8E0" bg-secondary: "#E2DBD1" text-primary: "#1A1A1A" text-secondary: "#5A5A5A" accent: "#8A8178" line: "#B8B0A4" white-overlay: "rgba(255, 255, 255, 0.3)"
typography: display:
fontFamily: "Playfair Display, serif"
fontSize: "clamp(3rem, 6vw, 5.5rem)"
fontWeight: 400
lineHeight: 1.1
h1:
fontFamily: "Playfair Display, serif"
fontSize: "clamp(2.5rem, 5vw, 4.5rem)"
fontWeight: 400
lineHeight: 1.1
h2:
fontFamily: "Playfair Display, serif"
fontSize: "clamp(1.8rem, 3.5vw, 3rem)"
fontWeight: 400
lineHeight: 1.1
h3:
fontFamily: "Playfair Display, serif"
fontSize: "clamp(1.2rem, 2vw, 1.6rem)"
fontWeight: 400
lineHeight: 1.1
stat-figure:
fontFamily: "Playfair Display, serif"
fontSize: "2rem"
fontWeight: 400
lineHeight: 1
agenda-numeral:
fontFamily: "Playfair Display, serif"
fontSize: "1.5rem"
fontWeight: 400
lineHeight: 1
team-initial:
fontFamily: "Playfair Display, serif"
fontSize: "2rem"
fontWeight: 400
lineHeight: 1
quote-mark:
fontFamily: "Playfair Display, serif"
fontSize: "5rem"
fontWeight: 400
lineHeight: 1
card-headline:
fontFamily: "Playfair Display, serif"
fontSize: "1.3rem"
fontWeight: 400
lineHeight: 1.1
timeline-headline:
fontFamily: "Playfair Display, serif"
fontSize: "1.2rem"
fontWeight: 400
lineHeight: 1.1
body:
fontFamily: "Inter, sans-serif"
fontSize: "clamp(0.9rem, 1.2vw, 1.1rem)"
fontWeight: 400
lineHeight: 1.6
body-sm:
fontFamily: "Inter, sans-serif"
fontSize: "0.9rem"
fontWeight: 400
lineHeight: 1.6
subtitle:
fontFamily: "Inter, sans-serif"
fontSize: "clamp(1rem, 1.5vw, 1.3rem)"
fontWeight: 400
lineHeight: 1.5
attribution:
fontFamily: "Inter, sans-serif"
fontSize: "0.85rem"
fontWeight: 400
lineHeight: 1.4
letterSpacing: 2px
textTransform: uppercase
label:
fontFamily: "Inter, sans-serif"
fontSize: "0.75rem"
fontWeight: 500
lineHeight: 1
letterSpacing: 3px
textTransform: uppercase
micro:
fontFamily: "Inter, sans-serif"
fontSize: "0.7rem"
fontWeight: 400
lineHeight: 1
letterSpacing: 2px
textTransform: uppercase
spacing: pad-y: "4vh" pad-x: "4vw" gap-xl: "6vw" gap-lg: "5vw" gap-md: "3vw" gap-sm: "2vh" card-pad: "4vh 2vw"
canvas: width: 100vw height: 100vh
components: card:
border: "1px solid {colors.line}"
padding: "{spacing.card-pad}"
background: "{colors.white-overlay}"
description: "Tracing-paper card — 1px taupe outline with semi-transparent white fill that lets the canvas tone bleed through. No radius, no shadow."
card-icon:
width: 40px
height: 40px
border: "1px solid {colors.line}"
borderRadius: "50%"
color: "{colors.accent}"
fontSize: "1rem"
description: "Small ringed circle (40px) containing a 1–3 character Roman numeral or letter in accent taupe."
agenda-row:
padding: "2vh 0"
borderBottom: "1px solid {colors.line}"
description: "List row separated only by a 1px taupe hairline. Numeral at left, label at right."
timeline-rule:
height: "1px"
background: "{colors.line}"
description: "Single horizontal 1px taupe line connecting timeline items. No nodes, no markers — just the line."
vertical-line:
width: "1px"
height: "100%"
background: "{colors.line}"
opacity: 0.3
description: "Optional decorative vertical hairline anchored at left edge (default 8vw from edge) at low opacity. Provides drafting-paper grid feel."
horizontal-accent:
width: "20vw"
height: "1px"
background: "{colors.text-primary}"
description: "Single short ink-black 1px horizontal line used as a strong accent rule. Black, not taupe."
geo-circle:
border: "1px solid {colors.line}"
borderRadius: "50%"
opacity: 0.5
description: "Thin solid taupe ring at low opacity, used as decorative geometry behind content."
geo-arc:
border: "1px dashed {colors.line}"
borderRadius: "50%"
opacity: 0.3
description: "Thin dashed taupe ring at very low opacity, paired with geo-circle to suggest compass construction."
geo-decoration:
border: "1px solid {colors.line}"
borderRadius: "50%"
description: "Large decorative ring (30–50vw diameter) anchored to a corner or center. Always pairs with a ::before pseudo-element rendering a smaller dashed ring inside it, suggesting concentric drafting."
geo-ring:
width: "50vw"
height: "50vw"
border: "1px solid {colors.line}"
borderRadius: "50%"
opacity: 0.3
description: "The largest geometric decoration variant — a 50vw centered ring with an inner ::before dashed ring at 70% diameter."
image-placeholder:
background: "{colors.bg-secondary}"
border: "1px solid {colors.line}"
description: "Solid taupe-tinted block with two crossed 1px diagonal hairlines via ::before/::after at +30° and -30°, suggesting an X over a blank frame. Holds a small uppercase label centered."
team-photo:
width: "12vw"
height: "12vw"
borderRadius: "50%"
border: "1px solid {colors.line}"
background: "{colors.bg-secondary}"
description: "Circular portrait frame (12vw) in slightly darker stone, ringed in taupe, holding a single Playfair initial in accent taupe at center."
nav-arrow:
width: 40px
height: 40px
border: "1px solid {colors.line}"
background: "transparent"
description: "Square 40px button with 1px taupe border holding an arrow glyph. Hover state inverts to ink fill with cream text."
nav-dot:
width: 8px
height: 8px
borderRadius: "50%"
background: "{colors.line}"
description: "Small taupe dot at right edge as navigation indicator. Active state shifts to ink and scales 1.3."
chart-stroke-primary: "{colors.text-primary}" chart-stroke-comparison: "{colors.line}" chart-comparison-dash: "5, 5" chart-grid-color: "{colors.bg-secondary}"
When this design system is used by the frontend-slides skill, generate the final deck as a fixed 1920×1080 stage that scales uniformly to the browser viewport. The deck should preserve a 16:9 slide canvas on every screen, including phones; it may letterbox or pillarbox, but it should not reflow slide content for mobile.
This policy has higher priority than any source-template responsive behavior described later in this file. If a later section says the original template is viewport-fluid, treat that as source history only, not as the target generation model for frontend-slides.
This policy applies even if the source template was originally implemented with viewport-fluid CSS such as 100vw, 100vh, vw, vh, or clamp(). Treat those values as design proportions to translate into 1920×1080 stage coordinates, not as live responsive rules in the generated deck.
Use deck-stage.js or an equivalent inline stage scaler for final output: render each slide at 1920×1080, scale the whole stage with one transform, and verify rendered screenshots for both text overflow and panel overlap.
Cartesian is a quiet museum-catalog editorial system. Its defining premise is restraint through 1px lines. Every structural element — list separators, agenda rules, timeline connectors, card borders, table dividers — is a single 1px line in a muted taupe {colors.line}. There are no thick borders, no fills, no shadows, no rounded surfaces. Hierarchy is built through type contrast and negative space; depth does not exist in the conventional sense.
The typeface stack is a literary-monograph pairing. Playfair Display — a high-contrast didone-influenced serif — carries every headline, every stat numeral, every card title, every team initial, every quote mark. Playfair runs at weight 400 (regular) almost exclusively — there is no use of bold or 700-weight Playfair in the system. The thin-stroke didone aesthetic depends on letting the letterforms breathe at modest weights. Inter — a clean modern grotesque — carries every body paragraph, every subtitle, every label, every attribution. Inter runs at 400 for body and 500 for labels. The pairing creates the system's editorial voice: serif statements + clean sans supporting structure.
The palette is five warm stones plus ink. The canvas is {colors.bg-primary} — a warm sandstone off-cream. A slightly deeper stone {colors.bg-secondary} provides subtle region differentiation (image placeholders, team photo frames). Ink {colors.text-primary} is the headline color; medium gray {colors.text-secondary} is body. A warmer taupe {colors.accent} carries labels, attribution, and small numerals. The lightest taupe {colors.line} is the universal 1px line color. There are no accent colors in the populist sense — no red, no orange, no blue. The palette is stone, stone, stone, ink, ink. The only "color" in the system is type contrast.
Depth is entirely absent in the conventional sense. There are no shadows, no elevated cards, no rounded surfaces, no gradients. Atmosphere is created by geometric line decorations: thin solid and dashed circles in {colors.line} at 20–50% opacity drift behind content as if drawn on tracing paper with a compass. These do not create hierarchy — they create mood. The decorative geometry signals "drafted, considered, precise."
Density philosophy: sparse and breathing. Cartesian reads as elegant when sparse and broken when crowded. A correctly composed slide pairs one Playfair headline with one body paragraph, or one chart with one short caption, framed by generous negative space. Most slide composition uses centered or asymmetric two-column layouts with 5–6vw gutters and significant vertical breathing room. The decorative compass arcs reinforce the sparseness — they are most effective when there is room around them. A slide that feels broken in this system is one packed edge-to-edge with content; the correct density is "one clear idea, well-framed, on stone paper."
Key Characteristics:
{colors.bg-primary} with single 1px taupe {colors.line} dividers as the universal structural element.{colors.bg-primary} — #EDE8E0): The canvas. Warm sandstone off-cream — closer to "manila folder" than "white paper." This is the default slide background.{colors.bg-secondary} — #E2DBD1): A slightly deeper stone, used for image placeholders, team-photo frames, and any region that needs subtle separation from the canvas without a colored fill or a border.{colors.text-primary} — #1A1A1A): Near-black ink. Used for headlines, stat numerals, and the special {components.horizontal-accent} rule. The strongest contrast color in the system.{colors.text-secondary} — #5A5A5A): Medium warm gray. Used for all body paragraph text. Softer than ink — readable but recedes.{colors.accent} — #8A8178): Warm taupe. Used for labels, attributions, agenda numerals, slide counter, card-icon text, team-member role text. The system's "small text" color.{colors.line} — #B8B0A4): Pale taupe. The universal 1px line color: card borders, agenda rules, timeline connectors, team-photo rings, nav-arrow borders, geo-decoration rings.{colors.bg-primary}.{colors.text-primary} — always ink, never colored, never accent-taupe. Playfair headlines are uniformly ink.{colors.text-secondary} (medium warm gray).{colors.accent} (warm taupe).{colors.line} — every 1px structural border. Never use ink-black for borders except the rare horizontal-accent rule.{colors.bg-secondary}.{colors.text-primary} (ink).{colors.line} with 5px dashed stroke.{colors.bg-secondary}.{colors.accent}.Cartesian has no accent color in the populist sense. A red callout, a blue bar, a green stat — none of these exist. When emphasis is needed, increase type size, switch from sans to serif, or add a single 1px horizontal-accent rule in ink. Color is not the emphasis mechanism in this system; restraint is.
The system runs on a two-face conversation: Playfair Display (serif, weights 400/600/700, italic available) carries every headline, stat numeral, quote mark, card title, and team initial; Inter (sans, weights 300/400/500/600) carries every body, subtitle, label, attribution, and micro-text. There is no third face.
Playfair Display is used almost exclusively at weight 400 (regular). The system deliberately avoids bold Playfair — the didone aesthetic relies on thin-stroke modulation that disappears at heavier weights. Italic Playfair is available (loaded) but not exercised in the default template; reserve it for inline emphasis inside body copy.
Inter runs at weight 400 for body, weight 500 for labels and micro-text, weight 600 for the rare emphasized inline element. The contrast between Playfair's high-modulation serif and Inter's even sans is the system's primary typographic rhythm.
| Token | Size | Family | Weight | Use |
|---|---|---|---|---|
{typography.display} |
clamp(3rem, 6vw, 5.5rem) | Playfair Display | 400 | Cover or large opening title |
{typography.h1} |
clamp(2.5rem, 5vw, 4.5rem) | Playfair Display | 400 | Section-opening or large closing headline |
{typography.h2} |
clamp(1.8rem, 3.5vw, 3rem) | Playfair Display | 400 | Primary slide headline |
{typography.h3} |
clamp(1.2rem, 2vw, 1.6rem) | Playfair Display | 400 | Sub-headline within a region |
{typography.card-headline} |
1.3rem | Playfair Display | 400 | Card or pillar-block title |
{typography.timeline-headline} |
1.2rem | Playfair Display | 400 | Timeline-step or phase headline |
{typography.stat-figure} |
2rem | Playfair Display | 400 | Numerical stat figure (typically inline in a stats cluster) |
{typography.team-initial} |
2rem | Playfair Display | 400 | Initial letter centered inside a team-photo circle |
{typography.agenda-numeral} |
1.5rem | Playfair Display | 400 | Ordinal numeral preceding an agenda row |
{typography.quote-mark} |
5rem | Playfair Display | 400 | Opening quotation glyph for a pull-quote |
{typography.subtitle} |
clamp(1rem, 1.5vw, 1.3rem) | Inter | 400 | Subtitle paragraph below a display headline |
{typography.body} |
clamp(0.9rem, 1.2vw, 1.1rem) | Inter | 400 | Standard paragraph body |
{typography.body-sm} |
0.9rem | Inter | 400 | Compact body inside cards or timeline items |
{typography.attribution} |
0.85rem | Inter | 400 | Attribution line below a quote, with 2px tracking + uppercase |
{typography.label} |
0.75rem | Inter | 500 | Section label / eyebrow above a headline, with 3px tracking + uppercase |
{typography.micro} |
0.7rem | Inter | 400 | Image label, slide counter, smallest chrome text |
{typography.h2} (clamp 1.8–3rem).{typography.h1} (clamp 2.5–4.5rem); for the most expansive cover, {typography.display} (clamp 3–5.5rem).{typography.body} (clamp 0.9–1.1rem).{typography.label} (0.75rem) — always 3px tracking + uppercase.{typography.stat-figure} (2rem). Cartesian does not have a hero-stat-numeral pattern (no 5–7rem display stat); stats are presented as inline ranks at modest scale.When unsure, reach for {typography.h2} for the slide's primary text moment, not {typography.h3} (which is a sub-headline within a region).
These treatments are non-optional whenever the corresponding element type is used:
{colors.text-primary} (ink). Headlines are never accent-taupe and never gray. The exception is decorative initial letters inside a circular card-icon or team-photo, where the letterform is rendered in {colors.accent}.{colors.line}. Other border colors do not exist except for the rare horizontal-accent rule in ink.The Playfair-400 + Inter-400 combination is the system's voice. Switching either family or jumping Playfair to weight 700 reads as a different design system. Italic emphasis is permitted via inline <em> inside body copy (Inter italic) — italic Playfair is loaded but reserved for rare uses. Underline is not used.
Line-height stays open: headlines at 1.1, body at 1.6. The wide body line-height is part of the breathing-room aesthetic.
The canvas is 100vw × 100vh — full viewport with hidden overflow. Each .slide is absolutely positioned to fill the viewport; one slide carries .active (opacity 1, visibility visible) at a time. Transitions are 0.6s opacity + visibility fades.
| Token | Value | Use |
|---|---|---|
{spacing.pad-y} |
4vh | Default vertical slide padding |
{spacing.pad-x} |
4vw | Default horizontal slide padding |
{spacing.gap-xl} |
6vw | Major two-column gutter (most spacious) |
{spacing.gap-lg} |
5vw | Standard two-column or grid gutter |
{spacing.gap-md} |
3vw | Card-grid gutter |
{spacing.gap-sm} |
2vh | Agenda row vertical padding, attribution spacing |
{spacing.card-pad} |
4vh 2vw | Internal padding for content cards |
Headlines typically carry a 2–3vh margin-bottom from labels above and a 2vh margin-bottom from body below. Section headers above 3-card or 4-team grids carry a 6vh margin-bottom from the grid (significant breathing room).
Cartesian's signature is its drafting-paper geometric decoration. Every slide may layer one or more of:
geo-decoration anchored to a corner (typically 30–50vw diameter) with an inner dashed ring at ~80% diameter (the ::before pseudo).vertical-line at ~8vw from the left edge running floor-to-ceiling at 30% opacity.horizontal-accent (a single short black 1px line) anchored at 15vh from the bottom-left.geo-ring (50vw circle) on closing or contemplative slides.These elements have no informational role — they create atmosphere. Slides without any geometric decoration are valid; over-decoration (more than two geo elements per slide) breaks the restraint.
The system's chrome is minimal:
nav-dot indicators (8px circles in taupe).nav-arrow buttons (40×40, 1px taupe border, transparent fill).slide-counter text in Inter at 0.75rem with 2px tracking in {colors.accent}.There is no top chrome bar, no persistent header, no footer rule.
Cartesian has no shadows, no elevated cards, no rounded surfaces, no gradients. Every element sits on a single plane.
Hierarchy is constructed from:
Introducing a box-shadow, an elevated card, or a soft gradient breaks the restraint that defines the system.
| Value | Use |
|---|---|
| 50% (circle) | Every circular element: card-icon (40px), team-photo (12vw), nav-dot (8px), geo-circle, geo-arc, geo-decoration, geo-ring |
| 0 | Everything else: cards, image-placeholders, nav-arrows, agenda rows, timeline, stat-blocks, chart container |
The system uses only two radius values: 50% (true circle) or 0 (sharp rectangle). Soft-rounded corners do not exist.
{colors.line} — the universal structural border. Used on every card, image-placeholder, team-photo ring, nav-arrow, agenda row bottom, timeline rule, stats top, geo-circle, geo-decoration.{colors.line} — used on geo-arc and the inner ::before ring inside geo-decoration / geo-ring. Dashed signals "construction line / arc."{colors.text-primary} — used only on the rare horizontal-accent decorative rule. The system's only ink-black line.All structural borders are {colors.line}. Thicker borders, colored borders, and dashed structural borders (other than geo-arcs) do not exist.
Geometric ring (geo-circle / geo-decoration / geo-ring) — Thin 1px taupe circles in various sizes (10vw, 30vw, 50vw) at 20–50% opacity. Typically paired with an inner dashed ::before ring at 70–80% of the outer diameter, suggesting compass construction with both a primary and an offset arc. Anchored to corners or centers; sits behind content with z-index: 0 and pointer-events: none.
Vertical line — A single 1px taupe column anchored at ~8vw from the left slide edge, running floor-to-ceiling at 30% opacity. Suggests a drafting-paper alignment guide. Optional per slide.
Horizontal accent — A single 20vw × 1px black line anchored 15vh from the bottom-left of a slide. The system's only ink-black line — used as a strong terminal accent rule on cover or closing layouts. Use sparingly.
Image placeholder — A solid {colors.bg-secondary} block with two 150% diagonal 1px taupe lines crossed at +30° and -30° via ::before / ::after, forming an X. Centers a small uppercase Inter label ("Visual Reference" or similar). The X pattern is the signature image-not-yet-wired treatment.
Team-photo frame — A 12vw circular block in {colors.bg-secondary} with a 1px taupe ring, holding a single Playfair-400 initial at 2rem in {colors.accent} centered. Used as portrait placeholder.
Card — A 1px taupe-bordered block with a semi-transparent white interior fill ({colors.white-overlay}) that lets the canvas tone bleed through subtly. The faint white fill is what differentiates a card from a bare region; remove the fill and the card disappears.
Agenda row — A flex row containing a Playfair {typography.agenda-numeral} in {colors.accent} at left, then a label at right, with 2vh padding and a 1px taupe bottom border. Stacked rows form an agenda list.
Timeline — A 1px taupe top-border across a flex row of evenly-distributed timeline items; each item carries a small Inter year label in taupe, a Playfair {typography.timeline-headline}, and an Inter body paragraph. The hairline is the only timeline structure — there are no nodes, no markers, no dots.
Stats cluster — A flex row of stat items separated by gap-md, framed by a 1px taupe top border, holding inline {typography.stat-figure} Playfair numerals with small uppercase Inter labels in taupe below.
Quote mark — A 5rem Playfair quote glyph at 50% opacity in taupe, positioned above a Playfair {typography.h2} headline + a small uppercase taupe attribution below.
Chart — Chart.js bar or line chart with ink-black primary series and dashed taupe comparison series. Grid lines in {colors.bg-secondary}. Axis ticks in {colors.accent}. Always rendered without fill on the primary series (or with a 5% ink-tinted fill on line charts).
{colors.line} for every structural separator — agenda rule, timeline connector, card border, stats top, team-photo ring. The 1px hairline is Cartesian's identity.{colors.text-primary} (ink). Playfair never appears in taupe or color.{colors.accent} (taupe) with uppercase + 2–3px letter-spacing.{colors.bg-secondary} as the fill for image placeholders and team-photo frames — a subtle stone, not white, not gray.horizontal-accent (20vw × 1px ink line) sparingly as a strong terminal rule on cover or closing compositions.{colors.accent} (taupe). Headlines are ink; taupe is reserved for small text.Cartesian is a viewport-fluid 1920×1080 presentation system using vw / vh units and clamp() throughout. There is a single @media (max-aspect-ratio: 4/3) breakpoint that collapses two-column grids to single-column, hides the timeline rule (which would lose meaning when stacked), and stacks team and card grids vertically. The system is otherwise responsive without breakpoints.
clamp().vh / vw units that scale linearly with viewport.ArrowRight or Space.ArrowLeft.Charts are rendered with Chart.js (loaded via CDN). The two chart types in the source are bar and line; both follow the ink-primary / dashed-taupe-comparison convention. Custom font settings inject Inter into Chart.js label rendering.
Not explicitly handled. Each slide is a 100vw × 100vh block; export workflows should snapshot each slide at 1920×1080.
| Role | Latin font | Recommended Chinese pairing | Source |
|---|---|---|---|
| Display / Headline (Playfair Display 400) | Playfair Display | 思源宋体 Noto Serif SC 700 | Google Fonts |
| Body / Label (Inter 400–500) | Inter | 思源宋体 Noto Serif SC 400 | Google Fonts |
Use Strategy A — single-font-stack with fallback: declare Noto Serif SC after the Latin font in the same font-family stack so Latin glyphs render in Playfair / Inter and CJK glyphs fall through to Noto Serif SC automatically. One CSS rule per role, no manual class switching.
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400..700;1,400..700&family=Inter:wght@300..600&family=Noto+Serif+SC:wght@400;700&display=swap" rel="stylesheet">
:root {
--font-display: "Playfair Display", "Noto Serif SC", serif;
--font-body: "Inter", "Noto Serif SC", sans-serif;
}
/* Headlines use Noto Serif SC 700; body uses Noto Serif SC 400. */
letter-spacing on Hanzi runs. Keep the 2–3px tracking only on uppercase Latin labels.text-transform: uppercase on any label/attribution/micro when content is Hanzi — Chinese has no case; forcing uppercase does nothing for Hanzi but breaks the rendering of any mixed Latin acronyms inside.,.:;"") for Latin. Never mix half-width punctuation into a Chinese sentence.2026 年, AI 产品). Improves readability of mixed runs.Noto Serif SC (思源宋体) is the only mainstream Hanzi serif with the same restrained editorial register Cartesian needs — its modulated horizontal-thin / vertical-thick strokes echo Playfair's didone aesthetic, and its uniformly even cadence matches Cartesian's "museum-catalog" voice. Using NSC at weight 700 for headlines preserves the visual mass of the Latin display while NSC 400 carries body with the same quiet warmth Inter provides. The five-stone palette absorbs Hanzi cleanly because every glyph stays in ink or taupe — no candy fills to negotiate. The decorative compass-arc geometry layer is content-agnostic and works identically in any language. Avoid bolding Hanzi (the Chinese-typography equivalent of Cartesian's "no bold Playfair" rule); rely on size and the 1px line dividers for hierarchy.
Noto Serif SC is the only Hanzi serif loaded — there is no italic axis (Chinese type historically has no italic), so the rare italic Playfair <em> moment loses its emphasis when the body falls through to NSC. Substitute a single-character span colored in {colors.accent} (taupe), or wrap the emphasized phrase in faint brackets 「」, to recover emphasis. NSC's 700 weight is the heaviest available — the system's restraint-through-400-weight rule naturally extends to Chinese, so this is rarely a gap in practice.
{colors.line} border. No exceptions.{colors.text-primary}. Don't bold; don't color.{colors.accent}.{colors.text-secondary}, with line-height 1.6.horizontal-accent 20vw ink line is the system's only "ink rule" — use it sparingly as a terminal accent, never as a routine divider.geo-decoration and geo-ring ::before inner-ring pattern is hardcoded in CSS; size variants beyond what the source exercises require new style rules.<img> and adjusting the circular crop.::before / ::after with fixed 150% widths; resizing the placeholder beyond the source dimensions may require recomputing the rotation angle to maintain edge-touch.<em> emphasis in body copy but the system itself does not author any italic text.vertical-line and horizontal-accent decorative elements have hardcoded position values (8vw from left, 15vh from bottom); using them off-default-position requires per-instance style overrides.currentSlide / totalSlides IDs are referenced in the JS but the system has no internal slide-name registry; new slides simply increment by their DOM order.