
Html Ppt Zhangzara Cobalt Grid
- 59 installs
- 83.7k repo stars
- Updated August 5, 2026
- nexu-io/open-design
Helps with ai & agent building tasks during AI-assisted development.
About
html-ppt-zhangzara-cobalt-grid is a Claude Code skill in the AI & Agent Building category.
- html-ppt-zhangzara-cobalt-grid
- AI & Agent Building
- AI-coding skill
Html Ppt Zhangzara Cobalt Grid by the numbers
- 59 all-time installs (skills.sh)
- Ranked #6,520 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/nexu-io/open-design --skill html-ppt-zhangzara-cobalt-gridAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 59 |
|---|---|
| repo stars | ★ 83.7k |
| Last updated | August 5, 2026 |
| Repository | nexu-io/open-design ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Cobalt Grid
Electric cobalt italic serifs on a graph-paper canvas, anchored by stair-stepped pixel-glitch decorations and slim hairline rules.
A single self-contained HTML deck — typography, palette, decorative system, and slide vocabulary are all tuned together. Mixing layouts across templates breaks the system; stay inside this one.
At a glance
- Scheme: light
- Formality: high
- Density: medium
- Slides in demo: 8
Best for
Anything that should feel like a quietly serious design / research bulletin, art publication, or curated trend report. Strong for studio annuals, agency capabilities decks, design-research publications, architecture / art / academic decks, and any deck wanting one strict accent colour and a printed-ledger calmness rather than corporate polish.
Avoid for
Decks that need warmth, multi-colour energy, or a casual / playful voice — the strict cobalt + cream + grid palette is intentionally austere.
Workflow
1. Clone `example.html` into the user's workspace as the working file. 2. Replace placeholder content with the user's real headlines, body copy, numbers, names, dates, and section labels. Match existing dimensions when swapping image placeholders. 3. Preserve the design system. Never substitute fonts, recolor the palette, restructure the layout grid, or strip decorative elements (corner brackets, paper grain, geometric shapes, illustrated SVGs). They are part of the identity. 4. Adjust deck length by duplicating layouts. If the user has more content than the demo holds, duplicate an existing slide of the most appropriate layout. If less, drop slides from the bottom. Update page-number labels. 5. Designing missing layouts: if a slide needs a layout the template doesn't have, design it from scratch using the same fonts, palette, decorative vocabulary, spacing rhythm, and component grammar — never bail to a different template. 6. Keep the navigation runtime as shipped. If the deck ships an assets/deck-stage.js or inline keyboard handler, leave it intact.
Output contract
Emit between <artifact> tags:
<artifact identifier="zhangzara-cobalt-grid" type="text/html" title="Deck Title">
<!doctype html>
<html>...</html>
</artifact>Source & license
Vendored from upstream MIT-licensed `zarazhangrui/beautiful-html-templates`.
The full upstream MIT license text — including the original copyright notice — ships in this skill at `LICENSE` and must be redistributed alongside any copy of example.html, template.json, or any vendored assets/ runtime. See template.json for the upstream metadata snapshot.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Cobalt Grid — Slide Template</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<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=Newsreader:ital,wght@0,400;0,500;1,300;1,400;1,500&family=Hanken+Grotesk:wght@400;500;600;700&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet" />
<style>
:root {
--paper: #F0EBDE; /* warm cream / ivory paper canvas */
--paper-2: #E6E0CE;
--ink: #1F2BE0; /* electric cobalt / royal blue */
--ink-soft: #5560E5; /* lighter cobalt for secondary marks */
--grid: rgba(31, 43, 224, 0.10); /* very faint blue grid */
--rule: #1F2BE0;
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; height: 100%; background: #0a0a0a; }
body {
font-family: 'Hanken Grotesk', 'Helvetica Neue', sans-serif;
color: var(--ink);
overflow: hidden;
}
/* Deck wrapper — fills the viewport */
.deck { position: fixed; inset: 0; display: grid; place-items: center; }
.stage {
position: relative;
width: 100vw; height: 100vh;
overflow: hidden;
background: var(--paper);
}
/* Graph-paper grid behind every slide */
.stage::before {
content: '';
position: absolute; inset: 0;
background-image:
linear-gradient(to right, var(--grid) 1px, transparent 1px),
linear-gradient(to bottom, var(--grid) 1px, transparent 1px);
background-size: clamp(28px, 2.2vw, 44px) clamp(28px, 2.2vw, 44px);
pointer-events: none;
z-index: 1;
}
.slide {
position: absolute; inset: 0;
opacity: 0; pointer-events: none;
transition: opacity 280ms ease;
z-index: 2;
}
.slide.active { opacity: 1; pointer-events: auto; }
/* ─── TYPE SYSTEM ──────────────────────────────────────────── */
.disp {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
line-height: 0.92;
letter-spacing: -0.005em;
color: var(--ink);
}
.body-tx {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 400;
line-height: 1.5;
color: var(--ink);
}
.micro {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
color: var(--ink);
}
.mono {
font-family: 'DM Mono', ui-monospace, monospace;
font-weight: 400;
color: var(--ink);
}
/* Single page-number marker, shared across slides.
Sits ABOVE the bottom hairline rule, with deliberate space between the
two so the chrome elements don't collide on any slide. */
.pagenum {
position: absolute;
right: clamp(28px, 2.4vw, 48px);
bottom: clamp(48px, 4.8vh, 76px);
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(11px, 0.82vw, 13px);
color: var(--ink);
letter-spacing: 0.06em;
z-index: 9;
}
/* Top + bottom slim hairlines that frame each slide.
Echo of the reference's thin rule above and below the composition. The
bottom rule is pinned at the slide's lower edge so the page number,
which sits above it, has clear space and never overlaps. */
.hairlines::before,
.hairlines::after {
content: '';
position: absolute;
left: clamp(36px, 3.6vw, 80px);
right: clamp(36px, 3.6vw, 80px);
height: 1.5px;
background: var(--ink);
z-index: 4;
pointer-events: none;
}
.hairlines::before { top: clamp(28px, 2.6vh, 48px); }
.hairlines::after { bottom: clamp(20px, 2vh, 32px); }
/* Fixed nav hint — sits above the bottom hairline, same vertical level
as the page number on the opposite side, so neither overlaps the rule. */
.nav-hint {
position: fixed;
left: clamp(36px, 3.6vw, 80px);
bottom: clamp(48px, 4.8vh, 76px);
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(10px, 0.75vw, 12px);
color: var(--ink);
letter-spacing: 0.08em;
opacity: 0.4;
z-index: 12;
pointer-events: none;
}
/* ─── DECORATIVE: pixel-glitch stair (reusable SVG) ─────────── */
/* The SVG below renders a column of stair-stepped rectangles, each
filled with vertical scanlines — a direct echo of the reference's
"pixelated" shape on the right side. Decorative only, pointer-events
disabled, sits behind content. */
.pixel-glitch {
position: absolute;
pointer-events: none;
z-index: 3;
}
.pixel-glitch svg { display: block; width: 100%; height: 100%; }
/* ─── DECORATIVE: small QR-style block ───────────────────────── */
/* The QR is paper-backgrounded so it reads as a discrete patch when it
overlaps the pixel-glitch column behind it — without the paper fill,
the empty grid cells let the glitch's vertical scanlines bleed
through and the QR loses its shape. */
.qr-block {
position: absolute;
pointer-events: none;
z-index: 5;
display: grid;
grid-template-columns: repeat(8, 1fr);
grid-template-rows: repeat(8, 1fr);
gap: 1.5px;
background: var(--paper);
padding: 4px;
box-shadow: 0 0 0 1.5px var(--paper);
}
.qr-block .px { background: var(--paper); }
.qr-block .px.on { background: var(--ink); }
/* ──────────────────────────────────────────────────────────────
SLIDE 1 — COVER
────────────────────────────────────────────────────────────── */
.s-cover { background: var(--paper); }
.s-cover .titlewrap {
position: absolute;
left: clamp(36px, 3.6vw, 80px);
top: clamp(80px, 9vh, 160px);
z-index: 5;
max-width: 60%;
}
.s-cover .title {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(100px, min(11vw, 18vh), 200px);
line-height: 0.92;
letter-spacing: -0.008em;
color: var(--ink);
}
.s-cover .subkicker {
margin-top: clamp(20px, 2.2vh, 36px);
display: flex; flex-direction: column; gap: 6px;
}
.s-cover .subkicker .l {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.18em;
font-size: clamp(13px, 1vw, 16px);
color: var(--ink);
}
.s-cover .subkicker .ed {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-size: clamp(28px, min(2.8vw, 4.6vh), 50px);
line-height: 1.1;
color: var(--ink);
}
/* Pixel-glitch column on the right side of the cover */
.s-cover .pixel-glitch {
top: clamp(60px, 6vh, 120px);
right: clamp(36px, 3.6vw, 80px);
width: clamp(280px, 32vw, 560px);
bottom: clamp(110px, 12vh, 200px);
}
/* QR block top-right */
.s-cover .qr-block {
top: clamp(60px, 6vh, 120px);
right: clamp(120px, 8vw, 200px);
width: clamp(58px, 4.2vw, 84px);
height: clamp(58px, 4.2vw, 84px);
}
/* Vertical right-side label column (reads as a stack of micro-text,
replacing the Korean column in the reference). */
.s-cover .vstack {
position: absolute;
right: clamp(36px, 3.6vw, 60px);
top: 50%;
transform: translateY(-50%);
z-index: 5;
display: flex; flex-direction: column;
gap: clamp(10px, 1.2vh, 18px);
align-items: end;
}
.s-cover .vstack .v-row {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(12px, 0.9vw, 15px);
line-height: 1;
color: var(--ink);
letter-spacing: 0.04em;
writing-mode: vertical-rl;
text-orientation: mixed;
}
/* Footer row */
.s-cover .cfooter {
/* Constrained to the left half so it never runs under the right-side
pixel-glitch column on any viewport. */
position: absolute;
left: clamp(36px, 3.6vw, 80px);
right: clamp(680px, 40vw, 880px);
bottom: clamp(82px, 8vh, 120px);
display: flex; justify-content: flex-start; align-items: end;
z-index: 5;
gap: clamp(28px, 3vw, 56px);
}
.s-cover .cfooter .colf {
font-family: 'Hanken Grotesk', sans-serif;
font-size: clamp(14px, 0.92vw, 15px);
line-height: 1.45;
color: var(--ink);
}
.s-cover .cfooter .colf .ftag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600; text-transform: uppercase; letter-spacing: 0.18em;
font-size: clamp(11px, 0.78vw, 13px);
margin-bottom: 4px;
color: var(--ink);
}
/* ──────────────────────────────────────────────────────────────
SLIDE 2 — MANIFESTO
────────────────────────────────────────────────────────────── */
.s-manifesto { background: var(--paper); }
.s-manifesto .stmt-wrap {
position: absolute;
left: clamp(60px, 8vw, 160px);
right: clamp(60px, 8vw, 160px);
top: 50%;
transform: translateY(-50%);
z-index: 5;
text-align: left;
}
.s-manifesto .stmt {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(56px, min(6.4vw, 11vh), 120px);
line-height: 1.05;
letter-spacing: -0.005em;
color: var(--ink);
}
.s-manifesto .stmt .roman {
font-style: normal;
font-weight: 500;
}
.s-manifesto .attr {
margin-top: clamp(28px, 3vh, 50px);
display: flex; gap: clamp(14px, 1.4vw, 24px); align-items: center;
border-top: 1px solid var(--ink);
padding-top: clamp(10px, 1.2vh, 18px);
}
.s-manifesto .attr .who {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
font-size: clamp(12px, 0.85vw, 14px);
color: var(--ink);
}
.s-manifesto .attr .meta-tag {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(12px, 0.82vw, 14px);
color: var(--ink);
letter-spacing: 0.04em;
opacity: 0.78;
}
/* ──────────────────────────────────────────────────────────────
SLIDE 3 — INDEX (numbered list of trends)
────────────────────────────────────────────────────────────── */
.s-index { background: var(--paper); }
.s-index .frame {
position: absolute;
inset: clamp(76px, 8vh, 130px) clamp(36px, 3.6vw, 80px) clamp(100px, 10vh, 150px);
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto 1fr;
gap: clamp(20px, 2.2vh, 36px);
z-index: 5;
}
.s-index .topbar {
display: flex; align-items: end; justify-content: space-between;
border-bottom: 1.5px solid var(--ink);
padding-bottom: clamp(12px, 1.4vh, 22px);
gap: 30px;
}
.s-index .topbar .h {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-size: clamp(48px, min(5vw, 8.5vh), 100px);
line-height: 0.95;
color: var(--ink);
}
.s-index .topbar .lab-tag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600; text-transform: uppercase; letter-spacing: 0.18em;
font-size: clamp(12px, 0.9vw, 14px);
color: var(--ink); text-align: right;
}
.s-index .list {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
gap: clamp(14px, 2vh, 28px) clamp(28px, 3vw, 56px);
}
.s-index .row { align-self: stretch; }
.s-index .row {
display: grid;
grid-template-columns: 56px 1fr;
gap: clamp(12px, 1.4vw, 22px);
border-bottom: 1px solid rgba(31, 43, 224, 0.18);
padding-bottom: clamp(12px, 1.4vh, 20px);
}
.s-index .row .num-tag {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(13px, 0.9vw, 15px);
color: var(--ink);
letter-spacing: 0.04em;
padding-top: 6px;
}
.s-index .row h3 {
margin: 0 0 6px 0;
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(26px, 2vw, 40px);
line-height: 1.05;
color: var(--ink);
}
.s-index .row p {
margin: 0;
font-family: 'Hanken Grotesk', sans-serif;
font-size: clamp(14px, 0.95vw, 15px);
line-height: 1.5;
color: var(--ink);
max-width: 92%;
}
/* ──────────────────────────────────────────────────────────────
SLIDE 4 — CHAPTER (display + intro on glitch background)
────────────────────────────────────────────────────────────── */
.s-chapter { background: var(--paper); }
.s-chapter .pixel-glitch {
top: clamp(60px, 6vh, 120px);
right: clamp(0px, 0vw, 0px);
width: clamp(220px, 26vw, 460px);
bottom: clamp(110px, 12vh, 200px);
opacity: 0.75;
}
.s-chapter .frame {
position: absolute;
left: clamp(36px, 3.6vw, 80px);
right: clamp(280px, 30vw, 540px);
top: clamp(80px, 9vh, 140px);
bottom: clamp(110px, 11vh, 170px);
display: flex; flex-direction: column;
justify-content: center;
z-index: 5;
gap: clamp(18px, 2vh, 32px);
}
.s-chapter .nm-tag {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(13px, 0.92vw, 15px);
color: var(--ink);
letter-spacing: 0.06em;
}
.s-chapter .ttl {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(56px, min(6vw, 10vh), 130px);
line-height: 1.0;
color: var(--ink);
letter-spacing: -0.005em;
}
.s-chapter .lede {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 400;
font-size: clamp(15px, 1vw, 18px);
line-height: 1.5;
color: var(--ink);
max-width: 56ch;
}
/* ──────────────────────────────────────────────────────────────
SLIDE 5 — DATA (vertical pixel-stack bar chart)
────────────────────────────────────────────────────────────── */
.s-data { background: var(--paper); }
.s-data .frame {
position: absolute;
inset: clamp(76px, 8vh, 130px) clamp(36px, 3.6vw, 80px) clamp(100px, 10vh, 150px);
display: grid;
grid-template-rows: auto 1fr;
gap: clamp(20px, 2vh, 36px);
z-index: 5;
}
.s-data .topbar {
display: flex; align-items: end; justify-content: space-between;
border-bottom: 1.5px solid var(--ink);
padding-bottom: clamp(12px, 1.4vh, 22px);
gap: 30px;
}
.s-data .topbar .h {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-size: clamp(46px, min(4.8vw, 8.2vh), 92px);
line-height: 0.95;
color: var(--ink);
}
.s-data .topbar .lab-tag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600; text-transform: uppercase; letter-spacing: 0.18em;
font-size: clamp(12px, 0.9vw, 14px);
color: var(--ink); text-align: right;
}
.s-data .body {
display: grid;
grid-template-columns: 0.8fr 1.6fr;
gap: clamp(28px, 3vw, 56px);
}
.s-data .col-a {
display: flex; flex-direction: column; justify-content: center;
gap: clamp(20px, 2.4vh, 36px);
}
.s-data .stat .vbig {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(110px, min(11vw, 18vh), 240px);
line-height: 0.92;
color: var(--ink);
letter-spacing: -0.015em;
}
.s-data .stat .lab2 {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
font-size: clamp(13px, 0.95vw, 15px);
color: var(--ink);
margin-top: 6px;
}
.s-data .stat .desc {
font-family: 'Hanken Grotesk', sans-serif;
font-size: clamp(15px, 1vw, 17px);
line-height: 1.5;
color: var(--ink);
max-width: 30ch;
margin-top: 6px;
}
/* The chart itself: a row of vertical "pixel stacks" — each track is
a column of small filled cells, with cell count proportional to the
value. Visually echoes the reference's pixel-glitch decoration. */
.s-data .chart {
display: flex; flex-direction: column; justify-content: end;
gap: clamp(10px, 1.2vh, 18px);
}
.s-data .chart .bars {
display: grid;
grid-template-columns: repeat(8, 1fr);
gap: clamp(10px, 1vw, 18px);
align-items: end;
height: 100%;
min-height: clamp(280px, 38vh, 540px);
}
.s-data .chart .stack {
display: flex; flex-direction: column-reverse; gap: 3px;
height: 100%;
}
.s-data .chart .stack .cell {
flex: 1 1 0;
min-height: 6px;
background: rgba(31, 43, 224, 0.10);
}
.s-data .chart .stack .cell.on { background: var(--ink); }
.s-data .chart .ticks {
display: grid;
grid-template-columns: repeat(8, 1fr);
gap: clamp(10px, 1vw, 18px);
border-top: 1.5px solid var(--ink);
padding-top: clamp(8px, 1vh, 14px);
}
.s-data .chart .ticks .ticklab {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(12px, 0.85vw, 14px);
color: var(--ink);
letter-spacing: 0.04em;
text-align: center;
}
/* ──────────────────────────────────────────────────────────────
SLIDE 6 — QUOTE
────────────────────────────────────────────────────────────── */
.s-quote { background: var(--paper); }
.s-quote .pixel-glitch {
top: clamp(40px, 4vh, 80px);
right: clamp(36px, 3.6vw, 80px);
width: clamp(160px, 16vw, 280px);
bottom: clamp(40px, 4vh, 80px);
opacity: 0.6;
}
.s-quote .qframe {
position: absolute;
left: clamp(36px, 3.6vw, 80px);
right: clamp(220px, 22vw, 380px);
top: 50%;
transform: translateY(-50%);
z-index: 5;
}
.s-quote .qkicker {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.2em;
font-size: clamp(12px, 0.9vw, 14px);
color: var(--ink);
margin-bottom: clamp(16px, 1.8vh, 28px);
}
.s-quote .qbody {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(50px, min(5.6vw, 9vh), 110px);
line-height: 1.05;
color: var(--ink);
letter-spacing: -0.005em;
max-width: 92%;
}
.s-quote .qattr {
margin-top: clamp(24px, 2.6vh, 40px);
display: grid; grid-template-columns: auto 1fr;
gap: clamp(14px, 1.4vw, 24px);
align-items: end;
border-top: 1px solid var(--ink);
padding-top: clamp(10px, 1.2vh, 18px);
}
.s-quote .qattr .who-tag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
font-size: clamp(13px, 0.92vw, 15px);
color: var(--ink);
}
.s-quote .qattr .role-meta {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(12px, 0.85vw, 14px);
color: var(--ink);
letter-spacing: 0.04em;
opacity: 0.78;
}
/* ──────────────────────────────────────────────────────────────
SLIDE 7 — TREND TABLE (dense ledger)
────────────────────────────────────────────────────────────── */
.s-table { background: var(--paper); }
.s-table .frame {
position: absolute;
inset: clamp(76px, 8vh, 130px) clamp(36px, 3.6vw, 80px) clamp(100px, 10vh, 150px);
display: flex; flex-direction: column;
z-index: 5;
}
.s-table .topbar {
display: flex; align-items: end; justify-content: space-between;
border-bottom: 1.5px solid var(--ink);
padding-bottom: clamp(12px, 1.4vh, 22px);
margin-bottom: clamp(14px, 1.6vh, 24px);
gap: 30px;
}
.s-table .topbar .h {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-size: clamp(46px, min(4.8vw, 8.2vh), 92px);
line-height: 0.95;
color: var(--ink);
}
.s-table .topbar .lab-tag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600; text-transform: uppercase; letter-spacing: 0.18em;
font-size: clamp(12px, 0.9vw, 14px);
color: var(--ink); text-align: right;
}
.s-table .ledger {
flex: 1;
display: flex;
flex-direction: column;
gap: 0;
/* Distribute the rows so they fill the available height.
The header row stays at the top, body rows space evenly below. */
justify-content: stretch;
}
.s-table .row {
display: grid;
grid-template-columns: 76px 0.6fr 1.4fr 0.7fr 0.5fr;
gap: clamp(14px, 1.4vw, 28px);
align-items: center;
padding: 0;
flex: 1 1 0;
min-height: clamp(46px, 6vh, 80px);
border-bottom: 1px solid rgba(31, 43, 224, 0.18);
}
.s-table .row.headrow {
border-bottom: 1.5px solid var(--ink);
flex: 0 0 auto;
min-height: 0;
padding: 8px 0;
}
.s-table .row.headrow > div {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600; text-transform: uppercase; letter-spacing: 0.18em;
font-size: clamp(11px, 0.75vw, 12px);
color: var(--ink);
}
.s-table .num-tag {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(13px, 0.95vw, 15px);
color: var(--ink);
letter-spacing: 0.04em;
}
.s-table .nm {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-size: clamp(20px, 1.6vw, 28px);
line-height: 1.15;
color: var(--ink);
}
.s-table .desc {
font-family: 'Hanken Grotesk', sans-serif;
font-size: clamp(14px, 0.95vw, 15px);
line-height: 1.4;
color: var(--ink);
}
.s-table .mood-tag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
font-size: clamp(13px, 0.92vw, 15px);
color: var(--ink);
}
.s-table .delta-tag {
font-family: 'DM Mono', ui-monospace, monospace;
font-size: clamp(13px, 0.92vw, 15px);
text-align: right;
color: var(--ink);
letter-spacing: 0.04em;
}
.s-table .delta-tag.up::before { content: '↑ '; }
.s-table .delta-tag.down::before { content: '↓ '; opacity: 0.6; }
.s-table .delta-tag.flat::before { content: '— '; opacity: 0.6; }
/* ──────────────────────────────────────────────────────────────
SLIDE 8 — COLOPHON / CLOSING
────────────────────────────────────────────────────────────── */
.s-colophon { background: var(--paper); }
.s-colophon .pixel-glitch {
top: clamp(80px, 9vh, 160px);
left: clamp(36px, 3.6vw, 80px);
width: clamp(220px, 26vw, 460px);
bottom: clamp(220px, 22vh, 360px);
opacity: 0.75;
}
.s-colophon .qr-block {
top: clamp(80px, 9vh, 160px);
right: clamp(36px, 3.6vw, 80px);
width: clamp(72px, 5vw, 100px);
height: clamp(72px, 5vw, 100px);
}
.s-colophon .titlewrap {
position: absolute;
right: clamp(36px, 3.6vw, 80px);
top: 28%;
z-index: 5;
max-width: 56%;
text-align: right;
}
.s-colophon .ktag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.22em;
font-size: clamp(12px, 0.9vw, 14px);
color: var(--ink);
margin-bottom: clamp(14px, 1.6vh, 24px);
}
.s-colophon .ttl {
font-family: 'Newsreader', Georgia, serif;
font-style: italic;
font-weight: 400;
font-size: clamp(72px, min(8.4vw, 14vh), 180px);
line-height: 0.96;
color: var(--ink);
letter-spacing: -0.005em;
}
.s-colophon .col-footer {
position: absolute;
left: clamp(36px, 3.6vw, 80px);
right: clamp(36px, 3.6vw, 80px);
bottom: clamp(106px, 10.4vh, 160px);
display: grid;
grid-template-columns: 1fr 1fr 1fr 1.2fr;
gap: clamp(20px, 2.4vw, 44px);
z-index: 5;
}
.s-colophon .col-footer > div {
border-top: 1.5px solid var(--ink);
padding-top: clamp(10px, 1.2vh, 16px);
}
.s-colophon .col-footer .ftag {
font-family: 'Hanken Grotesk', sans-serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.18em;
font-size: clamp(11px, 0.78vw, 13px);
margin-bottom: 6px;
color: var(--ink);
}
.s-colophon .col-footer .ftxt {
font-family: 'Hanken Grotesk', sans-serif;
font-size: clamp(14px, 0.95vw, 15px);
line-height: 1.5;
color: var(--ink);
}
</style>
</head>
<body>
<!-- Reusable SVG that draws the staircase of vertical-scanline blocks.
Used on cover, chapter divider, quote, and colophon. -->
<svg style="display:none" aria-hidden="true">
<defs>
<pattern id="vstripes" width="3" height="100" patternUnits="userSpaceOnUse">
<line x1="0.5" y1="0" x2="0.5" y2="100" stroke="#1F2BE0" stroke-width="1.2" />
</pattern>
</defs>
</svg>
<div class="deck">
<div class="stage">
<!-- 1. COVER ──────────────────────────────────────────────── -->
<section class="slide s-cover hairlines active">
<div class="titlewrap">
<h1 class="title">Index<br/>2026</h1>
<div class="subkicker">
<div class="l caption">Field Office Quarterly · Volume IV</div>
<div class="ed">A field report on the state of things.</div>
</div>
</div>
<!-- Pixel-glitch staircase decoration -->
<div class="pixel-glitch" aria-hidden="true">
<svg viewBox="0 0 100 100" preserveAspectRatio="none">
<defs>
<pattern id="vs1" width="2.4" height="100" patternUnits="userSpaceOnUse">
<line x1="0.5" y1="0" x2="0.5" y2="100" stroke="#1F2BE0" stroke-width="1.0" />
</pattern>
</defs>
<rect x="36" y="0" width="38" height="14" fill="url(#vs1)"/>
<rect x="22" y="14" width="50" height="12" fill="url(#vs1)"/>
<rect x="34" y="26" width="46" height="11" fill="url(#vs1)"/>
<rect x="16" y="37" width="60" height="13" fill="url(#vs1)"/>
<rect x="28" y="50" width="48" height="11" fill="url(#vs1)"/>
<rect x="18" y="61" width="62" height="14" fill="url(#vs1)"/>
<rect x="34" y="75" width="44" height="12" fill="url(#vs1)"/>
<rect x="22" y="87" width="50" height="13" fill="url(#vs1)"/>
</svg>
</div>
<!-- Vertical stack of micro-text on far right (replaces Korean) -->
<div class="vstack">
<div class="v-row caption">issue.04</div>
<div class="v-row caption">spring 2026</div>
<div class="v-row caption">field-office.co</div>
</div>
<!-- Footer row — two columns, sized to clear the right-side pixel-glitch -->
<div class="cfooter">
<div class="colf">
<div class="ftag caption">Edited by</div>
<div>Field Office Editorial · Lin Ito & Anya Mehrotra</div>
</div>
<div class="colf">
<div class="ftag caption">Distributed</div>
<div>To subscribers & the open web · twice a year</div>
</div>
</div>
<div class="pagenum">01 / 08</div>
</section>
<!-- 2. MANIFESTO ───────────────────────────────────────────── -->
<section class="slide s-manifesto hairlines">
<div class="stmt-wrap">
<p class="stmt">A trend is a quiet question that several rooms started asking <span class="roman">at roughly the same time.</span></p>
<div class="attr">
<div class="who caption">From the editor's note</div>
<div class="meta-tag caption">Index 2026 · opening pages</div>
</div>
</div>
<div class="pagenum">02 / 08</div>
</section>
<!-- 3. INDEX OF TRENDS ─────────────────────────────────────── -->
<section class="slide s-index hairlines">
<div class="frame">
<div class="topbar">
<div class="h">The index, in six entries.</div>
<div class="lab-tag caption">Spring 2026 · selected trends</div>
</div>
<div class="list">
<div class="row">
<div class="num-tag caption">01.</div>
<div>
<h3>Slow software</h3>
<p>Tools that opt out of the urgency contest and instead promise to be quiet, considered, and on by default.</p>
</div>
</div>
<div class="row">
<div class="num-tag caption">02.</div>
<div>
<h3>Domestic interfaces</h3>
<p>Screens designed to live in living rooms — softer typography, warmer colour, and a willingness to be ignored.</p>
</div>
</div>
<div class="row">
<div class="num-tag caption">03.</div>
<div>
<h3>Hand-set print again</h3>
<p>A return to letterpress, risograph, and small-edition print, often paired with the most digital-feeling clients.</p>
</div>
</div>
<div class="row">
<div class="num-tag caption">04.</div>
<div>
<h3>Quietly weird type</h3>
<p>Display type with one slightly off detail — a tilted ear, a long tail — that keeps a reader looking twice.</p>
</div>
</div>
<div class="row">
<div class="num-tag caption">05.</div>
<div>
<h3>Receipts and ledgers</h3>
<p>Information designed to be filed, not consumed. Tabular layouts, dotted leaders, the page returning the favour.</p>
</div>
</div>
<div class="row">
<div class="num-tag caption">06.</div>
<div>
<h3>Public weather</h3>
<p>Brand and product writing that includes the actual weather of the day, the mood of the team, the unfinished thought.</p>
</div>
</div>
</div>
</div>
<div class="pagenum">03 / 08</div>
</section>
<!-- 4. CHAPTER DIVIDER ─────────────────────────────────────── -->
<section class="slide s-chapter hairlines">
<div class="pixel-glitch" aria-hidden="true">
<svg viewBox="0 0 100 100" preserveAspectRatio="none">
<defs>
<pattern id="vs4" width="2.4" height="100" patternUnits="userSpaceOnUse">
<line x1="0.5" y1="0" x2="0.5" y2="100" stroke="#1F2BE0" stroke-width="1.0" />
</pattern>
</defs>
<rect x="40" y="0" width="40" height="14" fill="url(#vs4)"/>
<rect x="20" y="14" width="56" height="12" fill="url(#vs4)"/>
<rect x="32" y="26" width="48" height="11" fill="url(#vs4)"/>
<rect x="14" y="37" width="64" height="13" fill="url(#vs4)"/>
<rect x="26" y="50" width="50" height="11" fill="url(#vs4)"/>
<rect x="16" y="61" width="62" height="14" fill="url(#vs4)"/>
<rect x="32" y="75" width="46" height="12" fill="url(#vs4)"/>
<rect x="20" y="87" width="54" height="13" fill="url(#vs4)"/>
</svg>
</div>
<div class="frame">
<div class="nm-tag caption">Chapter one — the case for slow software</div>
<h2 class="ttl">Software is a room, and rooms are designed to be lived in slowly.</h2>
<p class="lede">In its first chapter the Index follows the studios, products, and quiet middleware projects that are walking back the urgency the last decade trained us into. Less push. More return. The tools that do not page you, on principle, are the ones we have chosen to read first.</p>
</div>
<div class="pagenum">04 / 08</div>
</section>
<!-- 5. DATA / PIXEL-STACK CHART ───────────────────────────── -->
<section class="slide s-data hairlines">
<div class="frame">
<div class="topbar">
<div class="h">Reader response, by quarter.</div>
<div class="lab-tag caption">Newsletter opens · 2024 Q1 — 2026 Q1</div>
</div>
<div class="body">
<div class="col-a">
<div class="stat">
<div class="vbig">82%</div>
<div class="lab2 caption">Open rate · Q1 2026</div>
<div class="desc">A 2.1× lift on the inaugural issue, driven mostly by long-form chapters being read on Sunday mornings.</div>
</div>
<div class="stat">
<div class="vbig" style="font-size: clamp(72px, min(7vw, 11vh), 150px);">11k</div>
<div class="lab2 caption">Active subscribers</div>
<div class="desc">Quiet, mostly-not-on-social, paying readers; we do not run a referral programme.</div>
</div>
</div>
<div class="chart">
<!-- Each .stack is a quarter; with column-reverse, the first .cell
in source order sits at the BOTTOM of the column, so .on cells
stack up from baseline like a real pixel-bar chart. -->
<div class="bars">
<div class="stack"><!-- Q1 2024: 4 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q2 2024: 5 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q3 2024: 5 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q4 2024: 6 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div><div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q1 2025: 7 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q2 2025: 7 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q4 2025: 8 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div><div class="cell"></div>
</div>
<div class="stack"><!-- Q1 2026: 9 -->
<div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div><div class="cell on"></div>
<div class="cell"></div>
</div>
</div>
<div class="ticks">
<div class="ticklab caption">Q1 24</div>
<div class="ticklab caption">Q2 24</div>
<div class="ticklab caption">Q3 24</div>
<div class="ticklab caption">Q4 24</div>
<div class="ticklab caption">Q1 25</div>
<div class="ticklab caption">Q2 25</div>
<div class="ticklab caption">Q4 25</div>
<div class="ticklab caption">Q1 26</div>
</div>
</div>
</div>
</div>
<div class="pagenum">05 / 08</div>
</section>
<!-- 6. QUOTE ──────────────────────────────────────────────── -->
<section class="slide s-quote hairlines">
<div class="pixel-glitch" aria-hidden="true">
<svg viewBox="0 0 100 100" preserveAspectRatio="none">
<defs>
<pattern id="vs6" width="2.4" height="100" patternUnits="userSpaceOnUse">
<line x1="0.5" y1="0" x2="0.5" y2="100" stroke="#1F2BE0" stroke-width="1.0" />
</pattern>
</defs>
<rect x="20" y="0" width="50" height="14" fill="url(#vs6)"/>
<rect x="34" y="14" width="46" height="13" fill="url(#vs6)"/>
<rect x="14" y="27" width="62" height="14" fill="url(#vs6)"/>
<rect x="26" y="41" width="50" height="13" fill="url(#vs6)"/>
<rect x="22" y="54" width="56" height="14" fill="url(#vs6)"/>
<rect x="36" y="68" width="44" height="13" fill="url(#vs6)"/>
<rect x="20" y="81" width="60" height="14" fill="url(#vs6)"/>
</svg>
</div>
<div class="qframe">
<div class="qkicker caption">A note from the studio</div>
<p class="qbody">"We started the bulletin because the loudest readings of design were eating the ones we found ourselves rereading."</p>
<div class="qattr">
<div class="who-tag caption">Lin Ito</div>
<div class="role-meta caption">Editor · Field Office Quarterly · letter to subscribers, March 2025</div>
</div>
</div>
<div class="pagenum">06 / 08</div>
</section>
<!-- 7. TREND TABLE ─────────────────────────────────────────── -->
<section class="slide s-table hairlines">
<div class="frame">
<div class="topbar">
<div class="h">Trend ledger, in long.</div>
<div class="lab-tag caption">All ten · with our reading on each</div>
</div>
<div class="ledger">
<div class="row headrow">
<div class="caption">No.</div>
<div class="caption">Trend</div>
<div class="caption">Reading</div>
<div class="caption">Mood</div>
<div class="caption">YoY</div>
</div>
<div class="row">
<div class="num-tag caption">01.</div>
<div class="nm">Slow software</div>
<div class="desc">Tools that opt out of urgency by default.</div>
<div class="mood-tag">Quiet · welcomed</div>
<div class="delta-tag up caption">14 pts</div>
</div>
<div class="row">
<div class="num-tag caption">02.</div>
<div class="nm">Domestic interfaces</div>
<div class="desc">Screens designed to live in living rooms.</div>
<div class="mood-tag">Warm · ambient</div>
<div class="delta-tag up caption">9 pts</div>
</div>
<div class="row">
<div class="num-tag caption">03.</div>
<div class="nm">Hand-set print</div>
<div class="desc">Letterpress and risograph paired with digital briefs.</div>
<div class="mood-tag">Tactile · careful</div>
<div class="delta-tag up caption">7 pts</div>
</div>
<div class="row">
<div class="num-tag caption">04.</div>
<div class="nm">Quietly weird type</div>
<div class="desc">Display faces with one slightly off detail.</div>
<div class="mood-tag">Curious · alert</div>
<div class="delta-tag flat caption">flat</div>
</div>
<div class="row">
<div class="num-tag caption">05.</div>
<div class="nm">Receipts & ledgers</div>
<div class="desc">Information designed to be filed, not consumed.</div>
<div class="mood-tag">Plain · honest</div>
<div class="delta-tag up caption">5 pts</div>
</div>
<div class="row">
<div class="num-tag caption">06.</div>
<div class="nm">Public weather</div>
<div class="desc">Brand voice that admits the day's actual mood.</div>
<div class="mood-tag">Open · tender</div>
<div class="delta-tag up caption">11 pts</div>
</div>
<div class="row">
<div class="num-tag caption">07.</div>
<div class="nm">Long-form receipts</div>
<div class="desc">Newsletters that read like printed pamphlets.</div>
<div class="mood-tag">Slow · sourced</div>
<div class="delta-tag up caption">3 pts</div>
</div>
<div class="row">
<div class="num-tag caption">08.</div>
<div class="nm">Pre-loved objects</div>
<div class="desc">Resale and repair as the front of the brand.</div>
<div class="mood-tag">Worn · cared</div>
<div class="delta-tag down caption">2 pts</div>
</div>
</div>
</div>
<div class="pagenum">07 / 08</div>
</section>
<!-- 8. COLOPHON / CLOSING ─────────────────────────────────── -->
<section class="slide s-colophon hairlines">
<div class="pixel-glitch" aria-hidden="true">
<svg viewBox="0 0 100 100" preserveAspectRatio="none">
<defs>
<pattern id="vs8" width="2.4" height="100" patternUnits="userSpaceOnUse">
<line x1="0.5" y1="0" x2="0.5" y2="100" stroke="#1F2BE0" stroke-width="1.0" />
</pattern>
</defs>
<rect x="0" y="0" width="48" height="13" fill="url(#vs8)"/>
<rect x="14" y="13" width="56" height="12" fill="url(#vs8)"/>
<rect x="0" y="25" width="64" height="14" fill="url(#vs8)"/>
<rect x="20" y="39" width="50" height="13" fill="url(#vs8)"/>
<rect x="6" y="52" width="60" height="14" fill="url(#vs8)"/>
<rect x="18" y="66" width="48" height="13" fill="url(#vs8)"/>
<rect x="0" y="79" width="56" height="14" fill="url(#vs8)"/>
<rect x="20" y="93" width="44" height="7" fill="url(#vs8)"/>
</svg>
</div>
<div class="qr-block" aria-hidden="true">
<span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px"></span><span class="px on"></span>
<span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px"></span>
<span class="px on"></span><span class="px"></span><span class="px"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px on"></span>
<span class="px on"></span><span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px on"></span>
<span class="px"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px"></span><span class="px"></span><span class="px on"></span><span class="px"></span>
<span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px on"></span>
<span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span>
<span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px"></span><span class="px on"></span><span class="px on"></span><span class="px"></span>
</div>
<div class="titlewrap">
<div class="ktag caption">Colophon · Index 2026</div>
<h2 class="ttl">See you in the<br/>autumn issue.</h2>
</div>
<div class="col-footer">
<div>
<div class="ftag caption">Editors</div>
<div class="ftxt">Lin Ito & Anya Mehrotra<br/>with the field-office collective</div>
</div>
<div>
<div class="ftag caption">Designed</div>
<div class="ftxt">In Newsreader, Hanken Grotesk<br/>& DM Mono · cobalt on cream</div>
</div>
<div>
<div class="ftag caption">Subscribed</div>
<div class="ftxt">field-office.co · twice a year<br/>quiet, paid, and read slowly</div>
</div>
<div>
<div class="ftag caption">Until autumn</div>
<div class="ftxt">The next issue ships October 2026. Look for the cobalt envelope on a Monday morning.</div>
</div>
</div>
<div class="pagenum">08 / 08</div>
</section>
</div>
</div>
<div class="caption nav-hint">← / → · space</div>
<script>
// Plain vanilla navigation: arrows, space, home/end, swipe.
const slides = Array.from(document.querySelectorAll('.slide'));
let current = 0;
function show(i) {
if (i < 0) i = 0;
if (i > slides.length - 1) i = slides.length - 1;
slides[current].classList.remove('active');
slides[i].classList.add('active');
current = i;
}
document.addEventListener('keydown', (e) => {
if (e.key === 'ArrowRight' || e.key === 'PageDown' || e.key === ' ') { e.preventDefault(); show(current + 1); }
else if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); show(current - 1); }
else if (e.key === 'Home') { e.preventDefault(); show(0); }
else if (e.key === 'End') { e.preventDefault(); show(slides.length - 1); }
});
let tx = null;
document.addEventListener('touchstart', (e) => { tx = e.touches[0].clientX; }, { passive: true });
document.addEventListener('touchend', (e) => {
if (tx == null) return;
const dx = e.changedTouches[0].clientX - tx;
if (Math.abs(dx) > 40) show(current + (dx < 0 ? 1 : -1));
tx = null;
});
</script>
</body>
</html>
MIT License
Copyright (c) 2026 Zara Zhang
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
"slug": "zhangzara-cobalt-grid",
"name": "Cobalt Grid",
"tagline": "Electric cobalt italic serifs on a graph-paper canvas, anchored by stair-stepped pixel-glitch decorations and slim hairline rules.",
"mood": [
"editorial",
"design-research",
"studious",
"modernist",
"tech-print",
"monochrome"
],
"occasion": [
"design trend or research report",
"studio annual or seasonal bulletin",
"creative agency capabilities deck",
"art or architecture publication",
"academic / curatorial publication",
"newsletter or zine pitch"
],
"tone": [
"considered",
"literary",
"studious",
"quietly-modern",
"editorial"
],
"formality": "high",
"density": "medium",
"palette": {
"paper": "#F0EBDE",
"ink": "#1F2BE0",
"ink-soft": "#5560E5",
"grid": "rgba(31,43,224,0.10)",
"description": "warm cream / ivory paper canvas with one strict accent of electric cobalt royal blue. The grid is a faint cobalt overlay, and decorations (pixel stair-blocks, QR-style mini-grids, hairline rules) all use the same blue, keeping the deck strictly bichromatic"
},
"typography": {
"display": "Newsreader (italic)",
"body": "Hanken Grotesk",
"mono": "DM Mono",
"style": "transitional italic serif for hero type and section heads, paired with a neutral grotesk for body and a clean mono for tabular data and micro-captions; strictly cobalt-on-cream"
},
"scheme": "light",
"best_for": "Anything that should feel like a quietly serious design / research bulletin, art publication, or curated trend report. Strong for studio annuals, agency capabilities decks, design-research publications, architecture / art / academic decks, and any deck wanting one strict accent colour and a printed-ledger calmness rather than corporate polish.",
"avoid_for": "Decks that need warmth, multi-colour energy, or a casual / playful voice — the strict cobalt + cream + grid palette is intentionally austere.",
"slide_count": 8,
"navigation": "vanilla JS (arrow keys, space, Home/End, touch swipe)",
"source": "https://github.com/zarazhangrui/beautiful-html-templates/tree/main/templates/cobalt-grid"
}