Post Digital is a hybrid physical/digital design aesthetic that occupies the tension-filled space between analog materiality and digital computation. Emerging in the late 2000s and gaining traction through the 2010s, it represents a critical response to the seamless, polished perfection of mainstream digital design – deliberately reintroducing the artifacts, errors, and tactile qualities of physical media into screen-based work. Where modernist digital design sought to eliminate noise, Post Digital treats glitched print, misregistered color layers, halftone rasterization, scan artifacts, and compression errors as expressive design vocabulary. The movement draws heavily from risograph printing, photocopier degradation, screen-printing misalignment, and the deliberate corruption of digital files – a philosophy rooted in the belief that imperfection signals authenticity in an era of algorithmic smoothness.
The term “post-digital” itself, as theorized by artists and critics such as Florian Cramer and Kim Cascone, does not mean “after digital” but rather describes a condition where digital technology is so pervasive that designers and artists become more interested in what happens at its boundaries – where pixels bleed onto paper, where JPEG compression meets ink on cardstock, where a riso drum slightly misfeeds. Post Digital design is fundamentally concerned with the “phygital” – physical/digital constructs that inhabit both material and computational spaces simultaneously. This manifests in web design as interfaces that simulate the tactile imperfections of analog printing: visible halftone dots, deliberate color separation misalignment, paper textures overlaid on screen elements, scan-line distortion, and the grainy, slightly-off registration of multi-pass print processes.
Unlike pure Glitch Art, which often celebrates catastrophic digital failure, Post Digital maintains a careful balance – the design is intentionally imperfect but still structured and readable. It borrows the stripped-back minimalism and geometric clarity of modernist design while layering on the warm, human errors of analog reproduction. The color palette tends toward the muted, semi-transparent ink tones of risograph and screen-printing, with deliberate overprinting creating unexpected secondary hues where colors overlap. Typography favors clean geometric or grotesque sans-serifs – not distressed or hand-drawn, but rendered imperfectly, as if a sharp digital typeface was printed on a slightly miscalibrated machine. The result is a design language that feels both contemporary and material, digital and handmade, precise and beautifully broken.
Post Digital palettes draw from the semi-transparent spot-color inks used in risograph and screen-printing. Colors are typically limited to 2-4 primary inks, with overprinting creating rich secondary tones. The palette favors muted, slightly desaturated tones that suggest ink absorbed into uncoated paper stock rather than the vivid saturation of backlit screens.
| Swatch | Hex | Role / Usage |
|---|---|---|
| Riso Blue | #0078BF |
Primary cool ink, headings, key interactive elements |
| Riso Red | #E55A5A |
Primary warm ink, accents, error states, emphasis |
| Riso Yellow | #F5C542 |
Tertiary ink layer, highlights, badges, overprint mixing |
| Fluorescent Pink | #FF6B8A |
Vibrant accent ink, call-to-action, decorative overprint |
| Overprint Purple | #6B4C8A |
Blue + Red overprint result, secondary headings, tags |
| Overprint Green | #5A8A6B |
Blue + Yellow overprint result, success states, accents |
| Overprint Brown | #A0724A |
Red + Yellow overprint result, warm mid-tones, borders |
| Uncoated White | #F2EDE4 |
Paper stock base, primary background, card surfaces |
| Newsprint Gray | #D8D0C4 |
Secondary background, subtle section differentiation |
| Ink Black | #1A1A1A |
Body text, key-line elements, high-contrast details |
| Carbon Gray | #3D3A38 |
Secondary text, code blocks, structural borders |
| Toner Gray | #7A7570 |
Captions, metadata, muted interface chrome |
| Scanner White | #FAFAF7 |
High-emphasis backgrounds, modal overlays |
| Drum Shift Cyan | #4AC4D6 |
Misregistration accent, alternate cool tone, links |
| Bleed Magenta | #C44B7A |
Registration bleed accent, decorative offset elements |
:root {
/* Primary spot-color inks */
--pd-blue: #0078bf;
--pd-red: #e55a5a;
--pd-yellow: #f5c542;
--pd-pink: #ff6b8a;
/* Overprint results */
--pd-purple: #6b4c8a;
--pd-green: #5a8a6b;
--pd-brown: #a0724a;
/* Paper and substrate */
--pd-paper: #f2ede4;
--pd-newsprint: #d8d0c4;
--pd-scanner-white: #fafaf7;
/* Ink darks */
--pd-black: #1a1a1a;
--pd-carbon: #3d3a38;
--pd-toner: #7a7570;
/* Misregistration accents */
--pd-cyan: #4ac4d6;
--pd-magenta: #c44b7a;
/* Functional mappings */
--pd-bg: var(--pd-paper);
--pd-text: var(--pd-black);
--pd-text-muted: var(--pd-toner);
--pd-link: var(--pd-blue);
--pd-link-hover: var(--pd-cyan);
--pd-accent: var(--pd-red);
--pd-accent-secondary: var(--pd-pink);
--pd-border: var(--pd-newsprint);
--pd-surface: var(--pd-scanner-white);
}
Post Digital typography pairs the geometric precision of modernist sans-serifs with the material imperfection of analog reproduction. The typefaces themselves are clean and contemporary – the “analog” quality comes not from distressed letterforms but from how those clean letters are rendered: with slight misregistration, halftone rasterization, overprint transparency, or scan degradation applied on top. Monospaced faces appear frequently, referencing digital code, printer output, and the mechanical uniformity of typewriter text.
| Font Name | Style | Weight(s) | Usage |
|---|---|---|---|
| Space Grotesk | Geometric sans | 300, 400, 500, 700 | Primary headings, hero text |
| Inter | Neo-grotesque sans | 400, 500, 600 | Body text, UI labels, navigation |
| JetBrains Mono | Monospace | 400, 500, 700 | Code blocks, metadata, captions, process marks |
| DM Sans | Geometric sans | 400, 500, 700 | Alternative heading face, button labels |
| IBM Plex Mono | Monospace | 400, 500 | Secondary mono, registration marks, technical labels |
| Pairing | Heading Font | Body Font | Best For |
|---|---|---|---|
| Precision + Process | Space Grotesk 700 | JetBrains Mono 400 | Editorial layouts, technical portfolios |
| Clean + Material | Space Grotesk 500 | Inter 400 | Marketing pages, agency sites |
| Code + Craft | JetBrains Mono 700 | Inter 400 | Developer tools, creative coding projects |
| Industrial + Readable | DM Sans 700 | Inter 400 | Product pages, e-commerce with post-digital flair |
| Systematic | IBM Plex Mono 500 | JetBrains Mono 400 | Data visualization, generative art documentation |
/* Post Digital typography system */
body {
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
font-size: 1rem;
line-height: 1.7;
color: var(--pd-black);
font-feature-settings: 'liga' 1, 'kern' 1;
-webkit-font-smoothing: antialiased;
}
h1, h2, h3 {
font-family: 'Space Grotesk', 'DM Sans', sans-serif;
font-weight: 700;
line-height: 1.15;
letter-spacing: -0.02em;
color: var(--pd-black);
}
h1 {
font-size: clamp(2.5rem, 6vw, 4.5rem);
/* Misregistration effect on headings */
text-shadow:
2px 1px 0 rgba(0, 120, 191, 0.2),
-1px -1px 0 rgba(229, 90, 90, 0.15);
}
h2 {
font-size: clamp(1.8rem, 4vw, 2.8rem);
text-shadow:
1px 1px 0 rgba(0, 120, 191, 0.12),
-1px 0 0 rgba(229, 90, 90, 0.08);
}
h3 {
font-size: clamp(1.2rem, 2.5vw, 1.6rem);
font-weight: 500;
letter-spacing: 0;
}
/* Monospace for process and metadata */
code, pre, .pd-mono {
font-family: 'JetBrains Mono', 'IBM Plex Mono', 'Courier New', monospace;
font-size: 0.875rem;
letter-spacing: -0.01em;
}
/* Small caps for labels and section markers */
.pd-label {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--pd-toner);
}
/* Post Digital card -- printed card on paper surface */
.pd-card {
background: var(--pd-scanner-white);
border: 1px solid var(--pd-newsprint);
padding: 2rem;
position: relative;
overflow: hidden;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
/* Halftone texture overlay */
.pd-card::before {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(
circle,
rgba(26, 26, 26, 0.08) 0.6px,
transparent 0.6px
);
background-size: 4px 4px;
pointer-events: none;
opacity: 0.5;
mix-blend-mode: multiply;
}
/* Misregistered color accent bar */
.pd-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--pd-blue);
/* Misregistration: red layer offset by 2px */
box-shadow: 2px 1px 0 var(--pd-red);
}
.pd-card:hover {
transform: translateY(-2px);
box-shadow:
0 4px 12px rgba(26, 26, 26, 0.08),
0 1px 3px rgba(26, 26, 26, 0.05);
}
/* Card title */
.pd-card h3 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
color: var(--pd-black);
margin-bottom: 0.5rem;
text-shadow: 1px 0 0 rgba(0, 120, 191, 0.1);
}
/* Card body text */
.pd-card p {
font-family: 'Inter', sans-serif;
color: var(--pd-carbon);
line-height: 1.7;
font-size: 0.95rem;
}
/* Card metadata in mono */
.pd-card__meta {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
color: var(--pd-toner);
letter-spacing: 0.02em;
margin-top: 1rem;
padding-top: 0.75rem;
border-top: 1px solid var(--pd-newsprint);
}
/* Post Digital button -- clean form with analog registration artifacts */
.pd-btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1.75rem;
font-family: 'Space Grotesk', 'DM Sans', sans-serif;
font-size: 0.875rem;
font-weight: 500;
letter-spacing: 0.03em;
text-decoration: none;
color: var(--pd-scanner-white);
background: var(--pd-blue);
border: none;
cursor: pointer;
position: relative;
transition: all 0.15s ease;
}
/* Misregistered shadow layer (simulates offset ink pass) */
.pd-btn::before {
content: '';
position: absolute;
inset: 0;
background: var(--pd-red);
transform: translate(2px, 1px);
z-index: -1;
transition: transform 0.15s ease;
}
.pd-btn:hover {
background: var(--pd-cyan);
}
.pd-btn:hover::before {
transform: translate(3px, 2px);
}
.pd-btn:active {
transform: translate(1px, 1px);
}
.pd-btn:active::before {
transform: translate(1px, 0px);
}
/* Ghost variant -- outlined with overprint hover */
.pd-btn--ghost {
background: transparent;
color: var(--pd-blue);
border: 1.5px solid var(--pd-blue);
}
.pd-btn--ghost::before {
background: transparent;
border: 1.5px solid var(--pd-red);
}
.pd-btn--ghost:hover {
background: rgba(0, 120, 191, 0.06);
color: var(--pd-blue);
}
/* Overprint variant -- layered color effect */
.pd-btn--overprint {
background: var(--pd-red);
mix-blend-mode: multiply;
}
.pd-btn--overprint::before {
background: var(--pd-blue);
mix-blend-mode: multiply;
}
.pd-btn--overprint:hover {
background: var(--pd-pink);
}
/* Post Digital navigation -- clean structure with registration marks */
.pd-nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 2rem;
background: var(--pd-paper);
border-bottom: 1px solid var(--pd-newsprint);
position: relative;
}
/* Registration mark in top-left corner */
.pd-nav::before {
content: '\2316'; /* registration target character */
position: absolute;
top: 0.5rem;
left: 0.5rem;
font-size: 0.6rem;
color: var(--pd-toner);
opacity: 0.4;
}
/* Color calibration bar along bottom edge */
.pd-nav::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(
to right,
var(--pd-blue) 0%,
var(--pd-blue) 25%,
var(--pd-red) 25%,
var(--pd-red) 50%,
var(--pd-yellow) 50%,
var(--pd-yellow) 75%,
var(--pd-black) 75%,
var(--pd-black) 100%
);
opacity: 0.6;
}
.pd-nav__brand {
font-family: 'Space Grotesk', sans-serif;
font-size: 1.25rem;
font-weight: 700;
color: var(--pd-black);
text-decoration: none;
letter-spacing: -0.02em;
/* Subtle misregistration on brand */
text-shadow:
1px 0 0 rgba(0, 120, 191, 0.15),
-1px 0 0 rgba(229, 90, 90, 0.12);
}
.pd-nav__links {
display: flex;
gap: 2rem;
list-style: none;
margin: 0;
padding: 0;
}
.pd-nav__link {
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
font-weight: 500;
color: var(--pd-carbon);
text-decoration: none;
letter-spacing: 0.02em;
padding: 0.25rem 0;
position: relative;
transition: color 0.15s ease;
}
.pd-nav__link:hover {
color: var(--pd-blue);
}
/* Active link with overprint underline */
.pd-nav__link--active {
color: var(--pd-blue);
}
.pd-nav__link--active::after {
content: '';
position: absolute;
bottom: -2px;
left: 0;
right: 0;
height: 2px;
background: var(--pd-blue);
box-shadow: 1px 1px 0 var(--pd-red);
}
/* Post Digital hero -- layered print passes with misregistration */
.pd-hero {
position: relative;
min-height: 85vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 5rem 2rem;
background: var(--pd-paper);
overflow: hidden;
}
/* Paper grain texture */
.pd-hero::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.04;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23grain)'/%3E%3C/svg%3E");
background-size: 512px 512px;
pointer-events: none;
mix-blend-mode: multiply;
}
/* Halftone dot pattern overlay */
.pd-hero::after {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(
circle,
rgba(0, 120, 191, 0.04) 1px,
transparent 1px
);
background-size: 6px 6px;
pointer-events: none;
}
.pd-hero__content {
position: relative;
z-index: 2;
max-width: 900px;
}
.pd-hero__label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--pd-toner);
margin-bottom: 1.5rem;
}
/* Registration mark before label */
.pd-hero__label::before {
content: '\25C9 ';
color: var(--pd-red);
opacity: 0.6;
}
.pd-hero__title {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(3rem, 8vw, 6rem);
font-weight: 700;
line-height: 1.05;
color: var(--pd-black);
margin-bottom: 2rem;
/* Three-color misregistration */
text-shadow:
3px 2px 0 rgba(0, 120, 191, 0.18),
-2px -1px 0 rgba(229, 90, 90, 0.14),
1px -1px 0 rgba(245, 197, 66, 0.1);
}
.pd-hero__subtitle {
font-family: 'Inter', sans-serif;
font-size: clamp(1rem, 2vw, 1.25rem);
color: var(--pd-carbon);
line-height: 1.7;
max-width: 600px;
margin-bottom: 2.5rem;
}
/* Decorative crop marks in hero corners */
.pd-hero__crop {
position: absolute;
width: 24px;
height: 24px;
opacity: 0.25;
}
.pd-hero__crop::before,
.pd-hero__crop::after {
content: '';
position: absolute;
background: var(--pd-black);
}
.pd-hero__crop::before {
width: 1px;
height: 100%;
left: 50%;
}
.pd-hero__crop::after {
width: 100%;
height: 1px;
top: 50%;
}
.pd-hero__crop--tl { top: 2rem; left: 2rem; }
.pd-hero__crop--tr { top: 2rem; right: 2rem; }
.pd-hero__crop--bl { bottom: 2rem; left: 2rem; }
.pd-hero__crop--br { bottom: 2rem; right: 2rem; }
/* Color-separated misregistration effect for display text */
.pd-misreg {
position: relative;
color: var(--pd-black);
}
/* Cyan plate offset */
.pd-misreg::before {
content: attr(data-text);
position: absolute;
top: 0;
left: 2px;
color: var(--pd-blue);
opacity: 0.25;
mix-blend-mode: multiply;
pointer-events: none;
z-index: -1;
}
/* Red plate offset */
.pd-misreg::after {
content: attr(data-text);
position: absolute;
top: 1px;
left: -1px;
color: var(--pd-red);
opacity: 0.2;
mix-blend-mode: multiply;
pointer-events: none;
z-index: -1;
}
/* Animated registration drift on hover */
.pd-misreg:hover::before {
animation: pd-drift-cyan 2s ease-in-out infinite alternate;
}
.pd-misreg:hover::after {
animation: pd-drift-red 2.5s ease-in-out infinite alternate;
}
@keyframes pd-drift-cyan {
0% { transform: translate(2px, 0); }
100% { transform: translate(3px, 1px); }
}
@keyframes pd-drift-red {
0% { transform: translate(-1px, 1px); }
100% { transform: translate(-2px, -1px); }
}
/* Halftone dot pattern applied over images */
.pd-halftone {
position: relative;
overflow: hidden;
line-height: 0;
}
.pd-halftone img {
width: 100%;
height: auto;
filter: grayscale(0.3) contrast(1.1);
}
/* Halftone dot grid overlay */
.pd-halftone::before {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(
circle,
rgba(26, 26, 26, 0.35) 1.2px,
transparent 1.2px
);
background-size: 5px 5px;
mix-blend-mode: multiply;
pointer-events: none;
z-index: 1;
}
/* Color tint overlay (simulates single-ink riso print) */
.pd-halftone::after {
content: '';
position: absolute;
inset: 0;
background: var(--pd-blue);
mix-blend-mode: color;
opacity: 0.15;
pointer-events: none;
z-index: 2;
}
/* Red channel variant */
.pd-halftone--red::after {
background: var(--pd-red);
}
/* Yellow channel variant */
.pd-halftone--yellow::after {
background: var(--pd-yellow);
}
/* Duotone: two overlapping color passes */
.pd-halftone--duotone {
background: var(--pd-blue);
}
.pd-halftone--duotone img {
filter: grayscale(1) contrast(1.2);
mix-blend-mode: multiply;
}
.pd-halftone--duotone::after {
background: linear-gradient(
135deg,
rgba(229, 90, 90, 0.4) 0%,
transparent 60%
);
mix-blend-mode: screen;
}
/* Color bar divider mimicking printer calibration strips */
.pd-divider {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 1.5rem 0;
position: relative;
}
.pd-divider::before {
content: '';
flex: 1;
height: 1px;
background: var(--pd-newsprint);
}
.pd-divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--pd-newsprint);
}
/* Center color calibration block */
.pd-divider__marks {
display: flex;
gap: 3px;
}
.pd-divider__mark {
width: 12px;
height: 12px;
display: block;
}
.pd-divider__mark:nth-child(1) { background: var(--pd-blue); }
.pd-divider__mark:nth-child(2) { background: var(--pd-red); }
.pd-divider__mark:nth-child(3) { background: var(--pd-yellow); }
.pd-divider__mark:nth-child(4) { background: var(--pd-black); }
/* Registration target divider */
.pd-divider--target {
justify-content: center;
}
.pd-divider--target::before,
.pd-divider--target::after {
max-width: 40%;
}
/* Scan-line glitch effect for sections or images */
.pd-glitch-scan {
position: relative;
overflow: hidden;
}
/* Horizontal scan lines */
.pd-glitch-scan::before {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
to bottom,
transparent 0px,
transparent 2px,
rgba(26, 26, 26, 0.03) 2px,
rgba(26, 26, 26, 0.03) 4px
);
pointer-events: none;
z-index: 3;
}
/* Random glitch displacement band */
.pd-glitch-scan::after {
content: '';
position: absolute;
left: 0;
right: 0;
top: 42%;
height: 6px;
background: var(--pd-paper);
transform: translateX(4px);
mix-blend-mode: difference;
opacity: 0.15;
pointer-events: none;
z-index: 4;
}
/* Animated glitch on hover */
.pd-glitch-scan:hover::after {
animation: pd-scanglitch 0.3s steps(4) infinite;
}
@keyframes pd-scanglitch {
0% { top: 42%; transform: translateX(4px); height: 6px; }
25% { top: 18%; transform: translateX(-3px); height: 4px; }
50% { top: 67%; transform: translateX(6px); height: 8px; }
75% { top: 31%; transform: translateX(-2px); height: 3px; }
100% { top: 55%; transform: translateX(5px); height: 5px; }
}
mix-blend-mode: multiply on overlapping elements to create authentic overprint effects that generate secondary colors| Aesthetic | Relationship | Key Difference |
|---|---|---|
| Glitch Art | Close sibling | Glitch Art focuses on catastrophic digital failure; Post Digital balances glitch with structured composition |
| Risograph | Core influence | Risograph is a specific printing technique; Post Digital abstracts its qualities into a broader design language |
| Brutalism (Web) | Shares rawness | Brutalism strips design bare for ideology; Post Digital layers analog warmth onto digital structure |
| Vaporwave | Distant cousin | Vaporwave nostalgically remixes 80s/90s digital culture; Post Digital is forward-looking and process-focused |
| Swiss / International | Foundational ancestor | Swiss design provides the clean grid and geometric type that Post Digital then disrupts with analog artifacts |
| Lo-Fi / Anti-Design | Tonal overlap | Anti-Design rejects polish entirely; Post Digital carefully controls the degree of imperfection |
| 90s Grunge | Analog precursor | Grunge is fully analog chaos; Post Digital specifically explores the analog-digital boundary |
| Generative Art | Process kinship | Both celebrate visible process; Generative Art uses algorithms while Post Digital uses reproduction artifacts |
| New Aesthetic | Philosophical sibling | Both examine how digital systems see and represent the physical world, but New Aesthetic is more theoretical |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Post Digital -- Hybrid Physical/Digital Aesthetic</title>
<!-- Google Fonts -->
<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=Space+Grotesk:wght@300;400;500;700&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
/* ============================================
POST DIGITAL -- CSS CUSTOM PROPERTIES
============================================ */
:root {
/* Primary spot-color inks */
--pd-blue: #0078bf;
--pd-red: #e55a5a;
--pd-yellow: #f5c542;
--pd-pink: #ff6b8a;
/* Overprint results */
--pd-purple: #6b4c8a;
--pd-green: #5a8a6b;
--pd-brown: #a0724a;
/* Paper and substrate */
--pd-paper: #f2ede4;
--pd-newsprint: #d8d0c4;
--pd-scanner-white: #fafaf7;
/* Ink darks */
--pd-black: #1a1a1a;
--pd-carbon: #3d3a38;
--pd-toner: #7a7570;
/* Misregistration accents */
--pd-cyan: #4ac4d6;
--pd-magenta: #c44b7a;
/* Functional mappings */
--pd-bg: var(--pd-paper);
--pd-text: var(--pd-black);
--pd-text-muted: var(--pd-toner);
--pd-link: var(--pd-blue);
--pd-accent: var(--pd-red);
--pd-border: var(--pd-newsprint);
--pd-surface: var(--pd-scanner-white);
}
/* ============================================
RESET & BASE
============================================ */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
font-size: 1rem;
line-height: 1.7;
color: var(--pd-text);
background: var(--pd-bg);
-webkit-font-smoothing: antialiased;
position: relative;
}
/* Full-page paper grain texture */
body::before {
content: '';
position: fixed;
inset: 0;
opacity: 0.035;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23grain)'/%3E%3C/svg%3E");
background-size: 512px 512px;
pointer-events: none;
z-index: 9999;
mix-blend-mode: multiply;
}
a { color: var(--pd-link); text-decoration: none; }
a:hover { color: var(--pd-cyan); }
img { max-width: 100%; height: auto; display: block; }
/* ============================================
TYPOGRAPHY
============================================ */
h1, h2, h3, h4 {
font-family: 'Space Grotesk', sans-serif;
font-weight: 700;
line-height: 1.15;
letter-spacing: -0.02em;
}
h1 {
font-size: clamp(3rem, 8vw, 5.5rem);
text-shadow:
3px 2px 0 rgba(0, 120, 191, 0.18),
-2px -1px 0 rgba(229, 90, 90, 0.14);
}
h2 {
font-size: clamp(1.8rem, 4vw, 2.8rem);
text-shadow:
2px 1px 0 rgba(0, 120, 191, 0.12),
-1px 0 0 rgba(229, 90, 90, 0.08);
}
h3 {
font-size: clamp(1.2rem, 2.5vw, 1.6rem);
font-weight: 500;
}
.mono {
font-family: 'JetBrains Mono', monospace;
font-size: 0.875rem;
letter-spacing: -0.01em;
}
.label {
font-family: 'Space Grotesk', sans-serif;
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--pd-toner);
}
/* ============================================
NAVIGATION
============================================ */
.nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 2rem;
background: var(--pd-paper);
border-bottom: 1px solid var(--pd-newsprint);
position: sticky;
top: 0;
z-index: 100;
}
.nav::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(
to right,
var(--pd-blue) 0%, var(--pd-blue) 25%,
var(--pd-red) 25%, var(--pd-red) 50%,
var(--pd-yellow) 50%, var(--pd-yellow) 75%,
var(--pd-black) 75%, var(--pd-black) 100%
);
opacity: 0.5;
}
.nav__brand {
font-family: 'Space Grotesk', sans-serif;
font-size: 1.2rem;
font-weight: 700;
color: var(--pd-black);
text-decoration: none;
text-shadow:
1px 0 0 rgba(0, 120, 191, 0.15),
-1px 0 0 rgba(229, 90, 90, 0.12);
}
.nav__links {
display: flex;
gap: 2rem;
list-style: none;
}
.nav__link {
font-family: 'Inter', sans-serif;
font-size: 0.85rem;
font-weight: 500;
color: var(--pd-carbon);
text-decoration: none;
transition: color 0.15s;
position: relative;
}
.nav__link:hover { color: var(--pd-blue); }
.nav__link--active {
color: var(--pd-blue);
}
.nav__link--active::after {
content: '';
position: absolute;
bottom: -4px;
left: 0;
right: 0;
height: 2px;
background: var(--pd-blue);
box-shadow: 1px 1px 0 var(--pd-red);
}
/* ============================================
HERO SECTION
============================================ */
.hero {
position: relative;
min-height: 85vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 5rem 2rem;
overflow: hidden;
}
/* Halftone dot pattern overlay */
.hero::after {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(
circle,
rgba(0, 120, 191, 0.04) 1px,
transparent 1px
);
background-size: 6px 6px;
pointer-events: none;
}
.hero__content {
position: relative;
z-index: 2;
max-width: 860px;
margin: 0 auto;
width: 100%;
}
.hero__label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--pd-toner);
margin-bottom: 1.5rem;
}
.hero__label::before {
content: '\25C9 ';
color: var(--pd-red);
opacity: 0.6;
}
.hero__title {
margin-bottom: 1.5rem;
}
.hero__subtitle {
font-size: clamp(1rem, 2vw, 1.2rem);
color: var(--pd-carbon);
max-width: 580px;
margin-bottom: 2.5rem;
line-height: 1.75;
}
/* Crop marks */
.crop-mark {
position: absolute;
width: 20px;
height: 20px;
opacity: 0.2;
}
.crop-mark::before,
.crop-mark::after {
content: '';
position: absolute;
background: var(--pd-black);
}
.crop-mark::before {
width: 1px;
height: 100%;
left: 50%;
}
.crop-mark::after {
width: 100%;
height: 1px;
top: 50%;
}
.crop-mark--tl { top: 1.5rem; left: 1.5rem; }
.crop-mark--tr { top: 1.5rem; right: 1.5rem; }
.crop-mark--bl { bottom: 1.5rem; left: 1.5rem; }
.crop-mark--br { bottom: 1.5rem; right: 1.5rem; }
/* ============================================
BUTTONS
============================================ */
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.8rem 1.8rem;
font-family: 'Space Grotesk', sans-serif;
font-size: 0.875rem;
font-weight: 500;
letter-spacing: 0.03em;
text-decoration: none;
color: var(--pd-scanner-white);
background: var(--pd-blue);
border: none;
cursor: pointer;
position: relative;
transition: all 0.15s ease;
}
.btn::before {
content: '';
position: absolute;
inset: 0;
background: var(--pd-red);
transform: translate(2px, 1px);
z-index: -1;
transition: transform 0.15s ease;
}
.btn:hover { background: var(--pd-cyan); color: var(--pd-scanner-white); }
.btn:hover::before { transform: translate(3px, 2px); }
.btn:active { transform: translate(1px, 1px); }
.btn--ghost {
background: transparent;
color: var(--pd-blue);
border: 1.5px solid var(--pd-blue);
}
.btn--ghost::before {
background: transparent;
border: 1.5px solid var(--pd-red);
}
.btn--ghost:hover {
background: rgba(0, 120, 191, 0.06);
color: var(--pd-blue);
}
/* ============================================
SECTION DIVIDER
============================================ */
.divider {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 2.5rem 2rem;
max-width: 960px;
margin: 0 auto;
}
.divider::before,
.divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--pd-newsprint);
}
.divider__marks {
display: flex;
gap: 3px;
}
.divider__mark {
width: 10px;
height: 10px;
display: block;
}
.divider__mark:nth-child(1) { background: var(--pd-blue); }
.divider__mark:nth-child(2) { background: var(--pd-red); }
.divider__mark:nth-child(3) { background: var(--pd-yellow); }
.divider__mark:nth-child(4) { background: var(--pd-black); }
/* ============================================
CONTENT SECTIONS
============================================ */
.section {
max-width: 960px;
margin: 0 auto;
padding: 3rem 2rem;
}
.section__label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--pd-toner);
margin-bottom: 0.75rem;
}
.section__title {
margin-bottom: 1.5rem;
}
.section__text {
max-width: 680px;
color: var(--pd-carbon);
margin-bottom: 2rem;
}
/* ============================================
CARD GRID
============================================ */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
margin-top: 2rem;
}
.card {
background: var(--pd-scanner-white);
border: 1px solid var(--pd-newsprint);
padding: 2rem;
position: relative;
overflow: hidden;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card::before {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(
circle,
rgba(26, 26, 26, 0.07) 0.5px,
transparent 0.5px
);
background-size: 4px 4px;
pointer-events: none;
opacity: 0.4;
mix-blend-mode: multiply;
}
.card::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--pd-blue);
box-shadow: 2px 1px 0 var(--pd-red);
}
.card:hover {
transform: translateY(-2px);
box-shadow:
0 4px 12px rgba(26, 26, 26, 0.08),
0 1px 3px rgba(26, 26, 26, 0.05);
}
.card__number {
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
color: var(--pd-toner);
letter-spacing: 0.1em;
margin-bottom: 0.75rem;
}
.card h3 {
font-family: 'Space Grotesk', sans-serif;
color: var(--pd-black);
margin-bottom: 0.5rem;
text-shadow: 1px 0 0 rgba(0, 120, 191, 0.08);
}
.card p {
color: var(--pd-carbon);
font-size: 0.95rem;
line-height: 1.7;
}
.card__tag {
display: inline-block;
margin-top: 1rem;
padding: 0.2rem 0.6rem;
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
letter-spacing: 0.05em;
color: var(--pd-purple);
border: 1px solid var(--pd-purple);
opacity: 0.7;
}
/* ============================================
OVERPRINT SHOWCASE
============================================ */
.overprint-demo {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 2rem;
margin-top: 2rem;
}
.overprint-demo__layer {
position: relative;
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Space Grotesk', sans-serif;
font-size: 2.5rem;
font-weight: 700;
color: var(--pd-scanner-white);
}
.overprint-demo__layer::before {
content: '';
position: absolute;
inset: 8%;
border-radius: 50%;
mix-blend-mode: multiply;
}
.overprint-demo__layer::after {
content: '';
position: absolute;
inset: 12%;
border-radius: 50%;
mix-blend-mode: multiply;
transform: translate(8px, 6px);
}
.overprint-demo__layer:nth-child(1)::before { background: var(--pd-blue); }
.overprint-demo__layer:nth-child(1)::after { background: var(--pd-red); }
.overprint-demo__layer:nth-child(2)::before { background: var(--pd-red); }
.overprint-demo__layer:nth-child(2)::after { background: var(--pd-yellow); }
.overprint-demo__layer:nth-child(3)::before { background: var(--pd-blue); }
.overprint-demo__layer:nth-child(3)::after { background: var(--pd-yellow); }
.overprint-demo__label {
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
color: var(--pd-toner);
text-align: center;
margin-top: 0.5rem;
letter-spacing: 0.08em;
}
/* ============================================
MISREGISTRATION TEXT
============================================ */
.misreg {
position: relative;
display: inline-block;
}
.misreg::before {
content: attr(data-text);
position: absolute;
top: 0;
left: 2px;
color: var(--pd-blue);
opacity: 0.25;
mix-blend-mode: multiply;
pointer-events: none;
z-index: -1;
}
.misreg::after {
content: attr(data-text);
position: absolute;
top: 1px;
left: -1px;
color: var(--pd-red);
opacity: 0.2;
mix-blend-mode: multiply;
pointer-events: none;
z-index: -1;
}
/* ============================================
PROCESS MARKS FOOTER
============================================ */
.footer {
padding: 3rem 2rem;
border-top: 1px solid var(--pd-newsprint);
text-align: center;
}
.footer__process {
font-family: 'JetBrains Mono', monospace;
font-size: 0.65rem;
color: var(--pd-toner);
letter-spacing: 0.12em;
text-transform: uppercase;
margin-bottom: 0.5rem;
}
.footer__calibration {
display: inline-flex;
gap: 4px;
margin: 1rem auto;
}
.footer__swatch {
width: 16px;
height: 16px;
display: block;
}
.footer__swatch:nth-child(1) { background: var(--pd-blue); }
.footer__swatch:nth-child(2) { background: var(--pd-red); }
.footer__swatch:nth-child(3) { background: var(--pd-yellow); }
.footer__swatch:nth-child(4) { background: var(--pd-black); }
.footer__swatch:nth-child(5) { background: var(--pd-purple); }
.footer__swatch:nth-child(6) { background: var(--pd-green); }
.footer__copy {
font-size: 0.8rem;
color: var(--pd-toner);
margin-top: 1rem;
}
/* ============================================
RESPONSIVE
============================================ */
@media (max-width: 768px) {
.nav {
flex-direction: column;
gap: 1rem;
padding: 1rem;
}
.nav__links { gap: 1rem; flex-wrap: wrap; justify-content: center; }
.hero { min-height: 70vh; padding: 3rem 1.5rem; }
.overprint-demo { grid-template-columns: 1fr; max-width: 200px; margin: 2rem auto; }
.card-grid { grid-template-columns: 1fr; }
.section { padding: 2rem 1.5rem; }
}
</style>
</head>
<body>
<!-- ============================================
NAVIGATION
============================================ -->
<nav class="nav">
<a href="#" class="nav__brand">POST/DIGITAL</a>
<ul class="nav__links">
<li><a href="#" class="nav__link nav__link--active">Work</a></li>
<li><a href="#" class="nav__link">Process</a></li>
<li><a href="#" class="nav__link">Archive</a></li>
<li><a href="#" class="nav__link">About</a></li>
<li><a href="#" class="nav__link">Contact</a></li>
</ul>
</nav>
<!-- ============================================
HERO
============================================ -->
<section class="hero">
<span class="crop-mark crop-mark--tl"></span>
<span class="crop-mark crop-mark--tr"></span>
<span class="crop-mark crop-mark--bl"></span>
<span class="crop-mark crop-mark--br"></span>
<div class="hero__content">
<p class="hero__label">RISO BLUE / 300 DPI / PASS 01 OF 03</p>
<h1 class="hero__title">
<span class="misreg" data-text="Hybrid">Hybrid</span>
<span class="misreg" data-text="Materiality">Materiality</span>
</h1>
<p class="hero__subtitle">
Where digital precision meets analog imperfection. Post Digital design
celebrates the artifacts of physical reproduction -- halftone dots,
misregistered ink layers, paper grain -- rendered on screen with
intentional warmth and material honesty.
</p>
<div style="display: flex; gap: 1rem; flex-wrap: wrap;">
<a href="#work" class="btn">View Work</a>
<a href="#process" class="btn btn--ghost">Our Process</a>
</div>
</div>
</section>
<!-- ============================================
DIVIDER
============================================ -->
<div class="divider">
<span class="divider__marks">
<span class="divider__mark"></span>
<span class="divider__mark"></span>
<span class="divider__mark"></span>
<span class="divider__mark"></span>
</span>
</div>
<!-- ============================================
FEATURED WORK (CARDS)
============================================ -->
<section class="section" id="work">
<p class="section__label">01 -- FEATURED WORK</p>
<h2 class="section__title">Selected Projects</h2>
<p class="section__text">
Each project explores the boundary between computational precision and
physical materiality -- cycling between screen, printer, scanner, and
back again until the layers of process become visible in the final form.
</p>
<div class="card-grid">
<div class="card">
<p class="card__number">PD-001</p>
<h3>Offset Identity</h3>
<p>
Visual identity system built from deliberately misregistered color
separations. Each print run produces unique variations as the riso
drum drifts between passes.
</p>
<span class="card__tag">IDENTITY</span>
</div>
<div class="card">
<p class="card__number">PD-002</p>
<h3>Scan Feedback</h3>
<p>
Editorial series exploring recursive scanning -- each page was
printed, scanned, edited, reprinted, and rescanned until digital
and analog artifacts became inseparable.
</p>
<span class="card__tag">EDITORIAL</span>
</div>
<div class="card">
<p class="card__number">PD-003</p>
<h3>Halftone Interface</h3>
<p>
Web application UI where all imagery is processed through a visible
halftone rasterization pipeline, rendering smooth photographs as
tactile dot patterns.
</p>
<span class="card__tag">UI / UX</span>
</div>
<div class="card">
<p class="card__number">PD-004</p>
<h3>Overprint Posters</h3>
<p>
Poster series using a strict two-color palette with overprint zones
generating a third hue. Designed digitally, printed on riso, scanned
back for web display.
</p>
<span class="card__tag">PRINT</span>
</div>
<div class="card">
<p class="card__number">PD-005</p>
<h3>Glitch Codex</h3>
<p>
Generative book where each spread is corrupted by a custom
datamoshing algorithm, then printed on uncoated stock to add the
texture of physical paper to digital noise.
</p>
<span class="card__tag">GENERATIVE</span>
</div>
<div class="card">
<p class="card__number">PD-006</p>
<h3>Material Web</h3>
<p>
Website designed entirely using scanned physical collage elements --
cut paper, ink marks, tape -- reassembled in code with CSS blend
modes preserving their analog texture.
</p>
<span class="card__tag">WEB</span>
</div>
</div>
</section>
<!-- ============================================
DIVIDER
============================================ -->
<div class="divider">
<span class="divider__marks">
<span class="divider__mark"></span>
<span class="divider__mark"></span>
<span class="divider__mark"></span>
<span class="divider__mark"></span>
</span>
</div>
<!-- ============================================
PROCESS SECTION
============================================ -->
<section class="section" id="process">
<p class="section__label">02 -- PROCESS</p>
<h2 class="section__title">The Feedback Loop</h2>
<p class="section__text">
Post Digital work is defined by its process: a continuous cycle between
physical and digital media. Design in vectors, print on riso, scan the
output, edit the scan, reprint. Each pass adds its own artifacts --
misregistration, grain, compression -- until the work becomes a layered
record of its own production.
</p>
<div class="overprint-demo">
<div>
<div class="overprint-demo__layer"></div>
<p class="overprint-demo__label">BLUE + RED = PURPLE</p>
</div>
<div>
<div class="overprint-demo__layer"></div>
<p class="overprint-demo__label">RED + YELLOW = BROWN</p>
</div>
<div>
<div class="overprint-demo__layer"></div>
<p class="overprint-demo__label">BLUE + YELLOW = GREEN</p>
</div>
</div>
</section>
<!-- ============================================
DIVIDER
============================================ -->
<div class="divider">
<span class="divider__marks">
<span class="divider__mark"></span>
<span class="divider__mark"></span>
<span class="divider__mark"></span>
<span class="divider__mark"></span>
</span>
</div>
<!-- ============================================
ABOUT / PHILOSOPHY
============================================ -->
<section class="section" id="about">
<p class="section__label">03 -- PHILOSOPHY</p>
<h2 class="section__title">
<span class="misreg" data-text="Beyond Seamless">Beyond Seamless</span>
</h2>
<p class="section__text">
In an era where algorithms generate flawless imagery on demand, the
deliberate embrace of material imperfection becomes a radical act of
authenticity. Post Digital design does not reject technology -- it
reveals technology by making its processes visible. Every halftone dot,
every misregistered color pass, every grain of scanner noise is evidence
of a physical encounter between idea and medium.
</p>
<p class="section__text" style="font-family: 'JetBrains Mono', monospace; font-size: 0.8rem; color: var(--pd-toner); border-left: 2px solid var(--pd-blue); padding-left: 1.25rem;">
"Post-digital art is more concerned with being human than with being digital."
<br>-- Florian Cramer, Post-digital Aesthetics, 2015
</p>
</section>
<!-- ============================================
FOOTER
============================================ -->
<footer class="footer">
<p class="footer__process">
RISO BLUE / RISO RED / RISO YELLOW -- 300 DPI -- UNCOATED 120GSM
</p>
<div class="footer__calibration">
<span class="footer__swatch"></span>
<span class="footer__swatch"></span>
<span class="footer__swatch"></span>
<span class="footer__swatch"></span>
<span class="footer__swatch"></span>
<span class="footer__swatch"></span>
</div>
<p class="footer__copy">
© 2026 Post/Digital Studio -- All artifacts intentional
</p>
</footer>
</body>
</html>
mix-blend-mode: multiply on overlapping colored elements to simulate authentic overprint behavior; semi-transparent inks on paper naturally multiply when layeredfeTurbulence filter with fractalNoise type at baseFrequency 0.5-0.8 creates convincing paper grain without external image assetstext-shadow on headings – offset cyan/red/yellow shadows by 1-3px to simulate color separation plate misalignment without duplicating DOM elementsradial-gradient dot patterns for halftone – radial-gradient(circle, rgba(0,0,0,0.3) 1px, transparent 1px) with a 4-6px background-size creates a convincing halftone screengrayscale(), contrast(), and a mix-blend-mode: multiply color overlay to create authentic single-ink risograph image renderingmix-blend-mode: multiply, the resulting color may not match expectations; preview all overlap combinations and adjust opacity to achieve usable contrast@supports (mix-blend-mode: multiply) to ensure core content remains accessible in browsers that do not support blend modes; the clean underlying structure should work without any effects applied