The Wireframe Aesthetic is a deliberate design philosophy that elevates the skeletal framework of a webpage – its grid lines, bounding boxes, placeholder markers, and structural annotations – from hidden scaffolding to visible, intentional surface design. Where traditional web design treats wireframes as a temporary planning artifact to be replaced by polished visuals, this aesthetic freezes the design process at the blueprint stage and declares it complete. The result is an interface that looks perpetually under construction, revealing its own bones: dashed borders outline every container, column guides remain visible, placeholder crosses mark image regions, and annotation labels identify each component by name. It is the architectural blueprint hung on the gallery wall – structure elevated to style.
Rooted in the same honesty-driven lineage as Brutalist Web Design and the broader “builder culture” of developers who live between code editors and design tools, the Wireframe Aesthetic emerged in the mid-2010s as designers began sharing low-fidelity mockups on portfolio sites and discovered that the raw, skeletal layouts possessed their own stark beauty. The style draws from UX wireframing conventions – grayscale palettes, monospace fonts, placeholder boxes with diagonal crosses, and visible 12-column grid overlays – but repurposes them as final visual output rather than intermediate documentation. Monospace typography reinforces the technical, diagrammatic quality. Colors are severely restricted to blacks, whites, and cool grays, with occasional accent lines in blueprint blue or annotation red to mark interactive elements or callouts.
The philosophy embraces constraint as creative liberation. Fixed-width grids, plain monospaced text, dashed outlines, and labeled bounding boxes create a visual language that is simultaneously minimal and information-dense. Every element announces what it is and where it sits in the layout hierarchy. Nothing is hidden behind gradients, shadows, or photographic imagery. The Wireframe Aesthetic appeals to technically minded audiences – developers, designers, architects, and engineers – who find elegance in exposed systems and legible structure. It communicates transparency, process-awareness, and a willingness to show the work behind the work.
The Wireframe Aesthetic operates within a severely restricted palette derived from the conventions of low-fidelity wireframing and technical drawing. The dominant register is grayscale, with functional color limited to annotation markers, interactive state indicators, and the occasional blueprint blue accent. The palette should feel like a printed schematic – precise, clinical, and deliberately un-decorative.
| Swatch | Hex | Role/Usage |
|---|---|---|
#FFFFFF |
Primary background, empty canvas areas | |
#F5F5F5 |
Alternate section background, grid column fill | |
#E0E0E0 |
Grid lines, column guides, subtle dividers | |
#BDBDBD |
Placeholder fills, disabled states, muted borders | |
#9E9E9E |
Secondary text, annotations, dimension labels | |
#757575 |
Tertiary text, metadata, timestamps | |
#424242 |
Primary body text, paragraph content | |
#212121 |
Headings, structural borders, strong emphasis | |
#000000 |
Maximum contrast elements, active borders | |
#2196F3 |
Blueprint accent, interactive links, selection indicators | |
#1565C0 |
Blueprint dark, hover state for links, active annotations | |
#E53935 |
Annotation red, error states, redline markers | |
#43A047 |
Success states, approval markers, dimension confirmations | |
#FFF9C4 |
Sticky note highlight, annotation callout background | |
#90CAF9 |
Blueprint tint, selected region highlight, grid overlay |
:root {
/* Grayscale spectrum */
--wire-white: #ffffff;
--wire-gray-50: #f5f5f5;
--wire-gray-200: #e0e0e0;
--wire-gray-400: #bdbdbd;
--wire-gray-500: #9e9e9e;
--wire-gray-600: #757575;
--wire-gray-800: #424242;
--wire-gray-900: #212121;
--wire-black: #000000;
/* Functional accents */
--wire-blue: #2196f3;
--wire-blue-dark: #1565c0;
--wire-red: #e53935;
--wire-green: #43a047;
--wire-note: #fff9c4;
--wire-blue-tint: #90caf9;
/* Semantic tokens */
--wire-bg: var(--wire-white);
--wire-bg-alt: var(--wire-gray-50);
--wire-text: var(--wire-gray-800);
--wire-heading: var(--wire-gray-900);
--wire-border: var(--wire-gray-400);
--wire-border-strong: var(--wire-gray-900);
--wire-grid-line: var(--wire-gray-200);
--wire-annotation: var(--wire-gray-500);
--wire-link: var(--wire-blue);
--wire-link-hover: var(--wire-blue-dark);
--wire-accent: var(--wire-blue);
--wire-error: var(--wire-red);
--wire-success: var(--wire-green);
}
The Wireframe Aesthetic relies exclusively on monospaced typefaces to maintain the technical, diagrammatic quality of design-tool output. Monospace fonts create a visible character grid that aligns with the broader grid-exposure philosophy, and their association with code editors and terminal interfaces reinforces the “under construction” reading of the design. Hierarchy is established through weight, letter-spacing, and modest size increments rather than dramatic scale contrasts or serif/sans-serif pairing.
| Font | Weight(s) | Usage | Link |
|---|---|---|---|
| IBM Plex Mono | 300, 400, 500, 700 | Primary body text, annotations, labels | fonts.google.com/specimen/IBM+Plex+Mono |
| JetBrains Mono | 400, 500, 700, 800 | Headlines, display text, component labels | fonts.google.com/specimen/JetBrains+Mono |
| Space Mono | 400, 700 | Alternate body text, code blocks, metadata | fonts.google.com/specimen/Space+Mono |
| Source Code Pro | 300, 400, 600, 700 | Technical annotations, dimension labels, grid markers | fonts.google.com/specimen/Source+Code+Pro |
| Fira Code | 300, 400, 500, 700 | Ligature-enhanced code, decorative monospace accents | fonts.google.com/specimen/Fira+Code |
| Heading | Body | Vibe |
|---|---|---|
| JetBrains Mono (800) | IBM Plex Mono (400) | Bold structural headings with clean, readable body text; the quintessential wireframe pairing |
| Space Mono (700) | Source Code Pro (400) | Quirky geometric headings paired with neutral technical prose; a balance of personality and precision |
| JetBrains Mono (700) | Fira Code (400) | Developer-native pairing with programming ligatures in body text; appeals to the builder audience |
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500;700&family=JetBrains+Mono:wght@400;500;700;800&display=swap');
/* === Base Typography === */
body {
font-family: 'IBM Plex Mono', 'Consolas', 'Courier New', monospace;
font-size: 14px;
line-height: 1.7;
color: var(--wire-text);
background-color: var(--wire-bg);
letter-spacing: 0.01em;
}
h1, h2, h3, h4, h5, h6 {
font-family: 'JetBrains Mono', 'IBM Plex Mono', monospace;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
line-height: 1.2;
color: var(--wire-heading);
margin: 0 0 0.75em 0;
}
h1 {
font-size: clamp(1.75rem, 4vw, 3rem);
font-weight: 800;
letter-spacing: 0.12em;
}
h2 {
font-size: clamp(1.25rem, 3vw, 2rem);
}
h3 {
font-size: clamp(1rem, 2vw, 1.5rem);
font-weight: 500;
}
a {
color: var(--wire-link);
text-decoration: underline;
text-decoration-style: dashed;
text-underline-offset: 3px;
}
a:hover {
color: var(--wire-link-hover);
text-decoration-style: solid;
}
code, pre {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.875em;
background-color: var(--wire-bg-alt);
border: 1px dashed var(--wire-border);
padding: 0.2em 0.4em;
}
pre {
padding: 1.25em;
overflow-x: auto;
white-space: pre;
}
/* Annotation labels */
.label {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.625rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
}
A content card rendered in the wireframe idiom: dashed borders, visible label, placeholder image region with diagonal cross, and monospace text throughout.
.wire-card {
border: 1px dashed var(--wire-border);
padding: 1.25rem;
margin: 0.75rem 0;
background-color: var(--wire-bg);
position: relative;
}
.wire-card::before {
content: 'CARD';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.wire-card:hover {
border-color: var(--wire-blue);
border-style: solid;
}
.wire-card h3 {
font-size: 0.9rem;
margin-bottom: 0.5rem;
padding-bottom: 0.4rem;
border-bottom: 1px dashed var(--wire-gray-200);
}
.wire-card p {
font-size: 0.8rem;
color: var(--wire-gray-600);
line-height: 1.6;
}
/* Placeholder image region with diagonal cross */
.wire-card .placeholder {
width: 100%;
aspect-ratio: 16 / 9;
border: 1px dashed var(--wire-border);
margin-bottom: 1rem;
position: relative;
background:
linear-gradient(
to top right,
transparent calc(50% - 0.5px),
var(--wire-gray-200) calc(50% - 0.5px),
var(--wire-gray-200) calc(50% + 0.5px),
transparent calc(50% + 0.5px)
),
linear-gradient(
to bottom right,
transparent calc(50% - 0.5px),
var(--wire-gray-200) calc(50% - 0.5px),
var(--wire-gray-200) calc(50% + 0.5px),
transparent calc(50% + 0.5px)
);
display: flex;
align-items: center;
justify-content: center;
}
.wire-card .placeholder span {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0.15rem 0.5rem;
}
Buttons that look like wireframe annotations of buttons – dashed borders, monospace labels, and minimal state changes that keep the schematic register intact.
.wire-button {
display: inline-block;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.75rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.12em;
padding: 0.6rem 1.25rem;
border: 1px dashed var(--wire-border-strong);
background-color: var(--wire-bg);
color: var(--wire-heading);
cursor: pointer;
text-decoration: none;
transition: border-style 0.1s ease;
position: relative;
}
.wire-button:hover {
border-style: solid;
border-color: var(--wire-blue);
color: var(--wire-blue);
}
.wire-button:active {
background-color: var(--wire-blue);
color: var(--wire-white);
border-color: var(--wire-blue);
border-style: solid;
}
.wire-button--primary {
background-color: var(--wire-gray-900);
color: var(--wire-white);
border-color: var(--wire-gray-900);
border-style: solid;
}
.wire-button--primary:hover {
background-color: var(--wire-blue);
border-color: var(--wire-blue);
color: var(--wire-white);
}
/* Ghost / annotation variant */
.wire-button--ghost {
border: 1px dotted var(--wire-gray-400);
color: var(--wire-gray-500);
background-color: transparent;
}
.wire-button--ghost:hover {
border-style: dashed;
color: var(--wire-gray-800);
border-color: var(--wire-gray-800);
}
A navigation bar that appears as a labeled wireframe region, with links styled as inline annotation markers.
.wire-nav {
border: 1px dashed var(--wire-border);
padding: 0.75rem 1.5rem;
margin-bottom: 1.5rem;
position: relative;
}
.wire-nav::before {
content: 'NAV';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.wire-nav ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-wrap: wrap;
gap: 0.25rem;
}
.wire-nav a {
display: block;
padding: 0.4rem 0.75rem;
color: var(--wire-gray-800);
text-decoration: none;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.1em;
border: 1px dotted transparent;
}
.wire-nav a:hover {
border-color: var(--wire-blue);
color: var(--wire-blue);
}
.wire-nav a.active {
border: 1px dashed var(--wire-blue);
color: var(--wire-blue);
}
A hero region that announces itself as a wireframe component, with structural labels, a placeholder image area, and typographic hierarchy maintained entirely in monospace.
.wire-hero {
min-height: 80vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 3rem 2rem;
border: 1px dashed var(--wire-border);
margin-bottom: 1.5rem;
position: relative;
}
.wire-hero::before {
content: 'HERO SECTION';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
/* Corner registration marks */
.wire-hero::after {
content: '';
position: absolute;
top: 8px;
right: 8px;
width: 12px;
height: 12px;
border-top: 1px solid var(--wire-gray-400);
border-right: 1px solid var(--wire-gray-400);
}
.wire-hero h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
font-weight: 800;
letter-spacing: 0.12em;
line-height: 1.15;
}
.wire-hero p {
font-size: clamp(0.8rem, 1.2vw, 1rem);
max-width: 55ch;
margin-top: 1.5rem;
line-height: 1.8;
color: var(--wire-gray-600);
}
.wire-hero .btn-row {
margin-top: 2rem;
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
A CSS-only grid overlay that makes the 12-column structure permanently visible behind page content.
.wire-grid-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1.5rem;
padding: 0 2rem;
pointer-events: none;
}
.wire-grid-overlay .col {
background-color: var(--wire-blue-tint);
opacity: 0.04;
border-left: 1px solid var(--wire-gray-200);
border-right: 1px solid var(--wire-gray-200);
}
/* Toggle visibility */
.wire-grid-overlay.hidden {
display: none;
}
/* Column labels along top */
.wire-grid-labels {
position: fixed;
top: 0;
left: 0;
right: 0;
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1.5rem;
padding: 0 2rem;
z-index: 1000;
pointer-events: none;
}
.wire-grid-labels span {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.5rem;
color: var(--wire-gray-400);
text-align: center;
padding: 2px 0;
letter-spacing: 0.05em;
}
The signature wireframe element: a rectangle with diagonal cross lines indicating where an image would be placed.
.wire-placeholder {
width: 100%;
aspect-ratio: 16 / 9;
border: 1px dashed var(--wire-border);
position: relative;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
background-color: var(--wire-bg-alt);
}
/* Diagonal cross lines */
.wire-placeholder::before,
.wire-placeholder::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 141.42%;
height: 1px;
background-color: var(--wire-gray-200);
transform-origin: top left;
}
.wire-placeholder::before {
transform: rotate(33.69deg); /* atan(9/16) for 16:9 ratio */
}
.wire-placeholder::after {
top: auto;
bottom: 0;
transform-origin: bottom left;
transform: rotate(-33.69deg);
}
.wire-placeholder span {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.6rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--wire-annotation);
background-color: var(--wire-bg-alt);
padding: 0.15rem 0.5rem;
z-index: 1;
}
/* Size variants */
.wire-placeholder--square { aspect-ratio: 1 / 1; }
.wire-placeholder--portrait { aspect-ratio: 3 / 4; }
.wire-placeholder--wide { aspect-ratio: 21 / 9; }
Floating annotation markers that mimic the comment/note tools found in design software like Figma or Sketch.
.wire-annotation {
position: relative;
display: inline-block;
}
.wire-annotation::after {
content: attr(data-note);
position: absolute;
bottom: calc(100% + 6px);
left: 0;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--wire-red);
background-color: var(--wire-note);
padding: 0.25rem 0.5rem;
border: 1px solid var(--wire-red);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.15s ease;
}
.wire-annotation:hover::after {
opacity: 1;
}
/* Persistent annotation marker (always visible) */
.wire-marker {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.25rem;
height: 1.25rem;
border-radius: 50%;
background-color: var(--wire-red);
color: var(--wire-white);
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
font-weight: 700;
cursor: default;
}
A section separator that includes dimension annotations and dashed rules, mimicking the measurement lines of technical drawings.
.wire-divider {
display: flex;
align-items: center;
gap: 0.75rem;
margin: 2rem 0;
color: var(--wire-annotation);
}
.wire-divider::before,
.wire-divider::after {
content: '';
flex: 1;
height: 0;
border-top: 1px dashed var(--wire-gray-200);
}
.wire-divider span {
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
text-transform: uppercase;
letter-spacing: 0.15em;
white-space: nowrap;
}
/* Measurement-style divider with end caps */
.wire-divider--measured {
position: relative;
}
.wire-divider--measured::before,
.wire-divider--measured::after {
border-top-style: solid;
border-top-color: var(--wire-gray-400);
}
.wire-divider--measured span {
background-color: var(--wire-bg);
padding: 0 0.5rem;
}
| Aesthetic | Relationship |
|---|---|
| Brutalist Web Design | Shares the ethos of structural honesty and visible construction, but Brutalism uses heavy solid borders and raw HTML defaults where Wireframe uses thin dashed lines and deliberate annotation |
| Minimalism | Both strip away ornament and imagery, but Minimalism pursues quiet elegance through absence, while Wireframe Aesthetic fills the space with visible structure and annotation |
| Blueprint Design | Close sibling that draws specifically from architectural blueprints (blue backgrounds, white lines); Wireframe Aesthetic uses a broader wireframing-tool language on white backgrounds |
| Flat Design | Shares the rejection of depth and skeuomorphism; Flat Design fills shapes with solid color and smooth type, while Wireframe keeps shapes outlined and type monospaced |
| Bento Grid | Both celebrate visible grid structure, but Bento Grid uses filled, colorful cells with rounded corners as a polished layout system; Wireframe strips the grid to its structural skeleton |
| Neubrutalism | Descendant of Brutalism that adds thick borders and bold color; Wireframe Aesthetic shares the border-heavy approach but uses thin strokes, dashes, and gray tones instead of heavy black outlines |
| Constructivism | Historical parallel in using geometric structure as both framework and ornament; both movements expose the underlying system, though Constructivism layers political ideology onto the visual structure |
| Terminal / CLI | Shares the monospace typography and developer-culture associations; Terminal aesthetic is about dark screens and command-line interaction, while Wireframe is about light backgrounds and spatial layout |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Wireframe Aesthetic Template</title>
<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=IBM+Plex+Mono:wght@300;400;500;700&family=JetBrains+Mono:wght@400;500;700;800&display=swap" rel="stylesheet">
<style>
/* =============================================
CSS CUSTOM PROPERTIES
============================================= */
:root {
/* Grayscale */
--wire-white: #ffffff;
--wire-gray-50: #f5f5f5;
--wire-gray-200: #e0e0e0;
--wire-gray-400: #bdbdbd;
--wire-gray-500: #9e9e9e;
--wire-gray-600: #757575;
--wire-gray-800: #424242;
--wire-gray-900: #212121;
--wire-black: #000000;
/* Accents */
--wire-blue: #2196f3;
--wire-blue-dark: #1565c0;
--wire-blue-tint: #90caf9;
--wire-red: #e53935;
--wire-green: #43a047;
--wire-note: #fff9c4;
/* Semantic */
--wire-bg: var(--wire-white);
--wire-bg-alt: var(--wire-gray-50);
--wire-text: var(--wire-gray-800);
--wire-heading: var(--wire-gray-900);
--wire-border: var(--wire-gray-400);
--wire-border-strong: var(--wire-gray-900);
--wire-grid-line: var(--wire-gray-200);
--wire-annotation: var(--wire-gray-500);
--wire-link: var(--wire-blue);
--wire-link-hover: var(--wire-blue-dark);
}
/* =============================================
RESET & BASE
============================================= */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
font-size: 14px;
scroll-behavior: smooth;
}
body {
font-family: 'IBM Plex Mono', 'Consolas', 'Courier New', monospace;
line-height: 1.7;
color: var(--wire-text);
background-color: var(--wire-bg);
letter-spacing: 0.01em;
max-width: 1200px;
margin: 0 auto;
padding: 1.5rem;
}
/* =============================================
GRID OVERLAY
============================================= */
.grid-overlay {
position: fixed;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 100%;
max-width: 1200px;
height: 100%;
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1.5rem;
padding: 0 1.5rem;
pointer-events: none;
z-index: -1;
}
.grid-overlay .col {
border-left: 1px solid var(--wire-grid-line);
border-right: 1px solid var(--wire-grid-line);
background-color: rgba(144, 202, 249, 0.03);
}
.grid-overlay .col:first-child {
border-left: 1px solid var(--wire-gray-200);
}
.grid-overlay .col:last-child {
border-right: 1px solid var(--wire-gray-200);
}
/* Grid column labels */
.grid-labels {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 1.5rem;
margin-bottom: 0.5rem;
}
.grid-labels span {
font-size: 0.55rem;
color: var(--wire-gray-400);
text-align: center;
letter-spacing: 0.05em;
}
/* =============================================
TYPOGRAPHY
============================================= */
h1, h2, h3, h4, h5, h6 {
font-family: 'JetBrains Mono', 'IBM Plex Mono', monospace;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
line-height: 1.2;
color: var(--wire-heading);
}
h1 { font-size: clamp(1.75rem, 4vw, 3rem); font-weight: 800; letter-spacing: 0.12em; }
h2 { font-size: clamp(1.25rem, 3vw, 2rem); margin-bottom: 1rem; }
h3 { font-size: clamp(1rem, 2vw, 1.35rem); font-weight: 500; }
p { margin-bottom: 0.75rem; max-width: 70ch; }
a {
color: var(--wire-link);
text-decoration: underline;
text-decoration-style: dashed;
text-underline-offset: 3px;
}
a:hover {
color: var(--wire-link-hover);
text-decoration-style: solid;
}
/* =============================================
ANNOTATION LABEL MIXIN
============================================= */
.labeled {
position: relative;
}
.labeled::before {
content: attr(data-label);
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
/* Corner registration mark */
.corner-mark::after {
content: '';
position: absolute;
top: 6px;
right: 6px;
width: 10px;
height: 10px;
border-top: 1px solid var(--wire-gray-400);
border-right: 1px solid var(--wire-gray-400);
}
/* =============================================
NAVIGATION
============================================= */
.nav {
border: 1px dashed var(--wire-border);
padding: 0.75rem 1.5rem;
margin-bottom: 1.5rem;
position: relative;
}
.nav::before {
content: 'NAV';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.nav ul {
list-style: none;
display: flex;
flex-wrap: wrap;
gap: 0.25rem;
align-items: center;
}
.nav li:first-child {
margin-right: auto;
}
.nav .logo {
font-family: 'JetBrains Mono', monospace;
font-size: 0.8rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-heading);
text-decoration: none;
}
.nav .logo:hover {
color: var(--wire-blue);
}
.nav a {
display: block;
padding: 0.35rem 0.65rem;
color: var(--wire-gray-800);
text-decoration: none;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.1em;
border: 1px dotted transparent;
}
.nav a:hover {
border-color: var(--wire-blue);
color: var(--wire-blue);
}
/* =============================================
HERO SECTION
============================================= */
.hero {
min-height: 75vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 3rem 2rem;
border: 1px dashed var(--wire-border);
margin-bottom: 1.5rem;
position: relative;
}
.hero::before {
content: 'HERO';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.hero::after {
content: '';
position: absolute;
top: 6px;
right: 6px;
width: 10px;
height: 10px;
border-top: 1px solid var(--wire-gray-400);
border-right: 1px solid var(--wire-gray-400);
}
.hero h1 {
line-height: 1.15;
margin-bottom: 0;
}
.hero .subtitle {
font-size: clamp(0.75rem, 1.2vw, 0.95rem);
max-width: 55ch;
margin-top: 1.25rem;
line-height: 1.8;
color: var(--wire-gray-600);
}
.hero .btn-row {
margin-top: 2rem;
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.hero .dimensions {
position: absolute;
bottom: 8px;
right: 12px;
font-size: 0.5rem;
color: var(--wire-gray-400);
letter-spacing: 0.05em;
}
/* =============================================
BUTTONS
============================================= */
.btn {
display: inline-block;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.7rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.1em;
padding: 0.6rem 1.25rem;
border: 1px dashed var(--wire-border-strong);
background-color: var(--wire-bg);
color: var(--wire-heading);
cursor: pointer;
text-decoration: none;
transition: border-style 0.1s ease;
}
.btn:hover {
border-style: solid;
border-color: var(--wire-blue);
color: var(--wire-blue);
}
.btn:active {
background-color: var(--wire-blue);
color: var(--wire-white);
border-color: var(--wire-blue);
}
.btn--filled {
background-color: var(--wire-gray-900);
color: var(--wire-white);
border-color: var(--wire-gray-900);
border-style: solid;
}
.btn--filled:hover {
background-color: var(--wire-blue);
border-color: var(--wire-blue);
color: var(--wire-white);
}
/* =============================================
SECTIONS
============================================= */
.section {
border: 1px dashed var(--wire-border);
padding: 2.5rem 2rem;
margin-bottom: 1.5rem;
position: relative;
}
.section::before {
content: attr(data-label);
position: absolute;
top: -0.5em;
left: 0.75rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.55rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.section::after {
content: '';
position: absolute;
top: 6px;
right: 6px;
width: 10px;
height: 10px;
border-top: 1px solid var(--wire-gray-400);
border-right: 1px solid var(--wire-gray-400);
}
/* =============================================
DIVIDER
============================================= */
.divider {
display: flex;
align-items: center;
gap: 0.75rem;
margin: 1.5rem 0;
color: var(--wire-annotation);
}
.divider::before,
.divider::after {
content: '';
flex: 1;
border-top: 1px dashed var(--wire-gray-200);
}
.divider span {
font-size: 0.5rem;
text-transform: uppercase;
letter-spacing: 0.15em;
}
/* =============================================
PLACEHOLDER IMAGE
============================================= */
.placeholder {
width: 100%;
aspect-ratio: 16 / 9;
border: 1px dashed var(--wire-border);
position: relative;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--wire-bg-alt);
overflow: hidden;
}
.placeholder::before,
.placeholder::after {
content: '';
position: absolute;
width: 200%;
height: 1px;
background-color: var(--wire-gray-200);
top: 50%;
left: 50%;
}
.placeholder::before {
transform: translate(-50%, -50%) rotate(26deg);
}
.placeholder::after {
transform: translate(-50%, -50%) rotate(-26deg);
}
.placeholder span {
font-size: 0.6rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--wire-annotation);
background-color: var(--wire-bg-alt);
padding: 0.15rem 0.5rem;
z-index: 1;
}
.placeholder--square { aspect-ratio: 1 / 1; }
/* =============================================
CARD GRID
============================================= */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 1.5rem;
margin-top: 1.5rem;
}
.card {
border: 1px dashed var(--wire-border);
padding: 1.25rem;
position: relative;
background-color: var(--wire-bg);
}
.card::before {
content: 'CARD';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-size: 0.5rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.card:hover {
border-color: var(--wire-blue);
border-style: solid;
}
.card h3 {
font-size: 0.85rem;
margin-bottom: 0.5rem;
padding-bottom: 0.4rem;
border-bottom: 1px dashed var(--wire-gray-200);
}
.card p {
font-size: 0.75rem;
color: var(--wire-gray-600);
line-height: 1.65;
}
.card .tag {
display: inline-block;
font-size: 0.55rem;
text-transform: uppercase;
letter-spacing: 0.1em;
border: 1px dotted var(--wire-gray-400);
padding: 0.15rem 0.4rem;
margin-right: 0.2rem;
margin-top: 0.5rem;
color: var(--wire-gray-600);
}
.card .placeholder {
margin-bottom: 0.75rem;
aspect-ratio: 16 / 10;
}
/* =============================================
FEATURES GRID
============================================= */
.features {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1.5rem;
margin-top: 1.5rem;
}
.feature {
border: 1px dotted var(--wire-gray-400);
padding: 1.25rem;
text-align: center;
}
.feature .icon-placeholder {
width: 48px;
height: 48px;
border: 1px dashed var(--wire-border);
margin: 0 auto 0.75rem;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.5rem;
color: var(--wire-annotation);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.feature h4 {
font-size: 0.75rem;
margin-bottom: 0.4rem;
letter-spacing: 0.1em;
}
.feature p {
font-size: 0.7rem;
color: var(--wire-gray-600);
max-width: none;
}
/* =============================================
DATA TABLE
============================================= */
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 0.75rem;
margin-top: 1.5rem;
}
.data-table th,
.data-table td {
border: 1px dashed var(--wire-gray-200);
padding: 0.6rem 0.8rem;
text-align: left;
vertical-align: top;
}
.data-table th {
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--wire-heading);
border-bottom: 1px solid var(--wire-gray-900);
font-size: 0.65rem;
}
.data-table tr:hover td {
background-color: var(--wire-bg-alt);
}
/* =============================================
ANNOTATION MARKERS
============================================= */
.marker {
display: inline-flex;
align-items: center;
justify-content: center;
width: 1.15rem;
height: 1.15rem;
border-radius: 50%;
background-color: var(--wire-red);
color: var(--wire-white);
font-size: 0.5rem;
font-weight: 700;
cursor: default;
vertical-align: super;
margin-left: 0.15rem;
}
/* =============================================
FOOTER
============================================= */
.footer {
border: 1px dashed var(--wire-border);
padding: 2rem;
margin-top: 1.5rem;
position: relative;
}
.footer::before {
content: 'FOOTER';
position: absolute;
top: -0.5em;
left: 0.75rem;
font-size: 0.55rem;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--wire-annotation);
background-color: var(--wire-bg);
padding: 0 0.35rem;
}
.footer p {
font-size: 0.7rem;
color: var(--wire-gray-600);
}
.footer a {
color: var(--wire-gray-800);
}
.footer .footer-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 1.5rem;
}
.footer .footer-grid h4 {
font-size: 0.6rem;
margin-bottom: 0.5rem;
color: var(--wire-annotation);
border-bottom: 1px dotted var(--wire-gray-200);
padding-bottom: 0.3rem;
}
.footer .footer-grid ul {
list-style: none;
}
.footer .footer-grid li {
padding: 0.15rem 0;
}
.footer .footer-grid a {
font-size: 0.7rem;
text-decoration: none;
}
.footer .footer-grid a:hover {
color: var(--wire-blue);
text-decoration-style: dashed;
text-decoration-line: underline;
}
.footer .copyright {
margin-top: 1.5rem;
padding-top: 1rem;
border-top: 1px dashed var(--wire-gray-200);
font-size: 0.6rem;
color: var(--wire-gray-500);
}
/* =============================================
UTILITIES
============================================= */
.mt-1 { margin-top: 0.75rem; }
.mt-2 { margin-top: 1.5rem; }
.mt-3 { margin-top: 2.25rem; }
.text-muted { color: var(--wire-gray-600); }
.text-annotation { color: var(--wire-annotation); font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.1em; }
/* =============================================
RESPONSIVE
============================================= */
@media (max-width: 768px) {
html { font-size: 13px; }
body { padding: 1rem; }
.hero {
min-height: 60vh;
padding: 2rem 1.5rem;
}
.section {
padding: 2rem 1.5rem;
}
.grid-overlay {
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
padding: 0 1rem;
}
.card-grid {
grid-template-columns: 1fr;
}
.features {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 480px) {
.hero { min-height: 50vh; padding: 1.5rem 1rem; }
.section { padding: 1.5rem 1rem; }
.features { grid-template-columns: 1fr; }
.nav ul { flex-direction: column; }
.nav li:first-child { margin-right: 0; margin-bottom: 0.5rem; }
}
</style>
</head>
<body>
<!-- GRID OVERLAY -->
<div class="grid-overlay" aria-hidden="true">
<div class="col"></div><div class="col"></div><div class="col"></div>
<div class="col"></div><div class="col"></div><div class="col"></div>
<div class="col"></div><div class="col"></div><div class="col"></div>
<div class="col"></div><div class="col"></div><div class="col"></div>
</div>
<!-- GRID COLUMN LABELS -->
<div class="grid-labels" aria-hidden="true">
<span>1</span><span>2</span><span>3</span><span>4</span>
<span>5</span><span>6</span><span>7</span><span>8</span>
<span>9</span><span>10</span><span>11</span><span>12</span>
</div>
<!-- NAVIGATION -->
<nav class="nav">
<ul>
<li><a href="#" class="logo">[Wireframe]</a></li>
<li><a href="#about">About</a></li>
<li><a href="#projects">Projects</a></li>
<li><a href="#features">Features</a></li>
<li><a href="#data">Data</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
<!-- HERO SECTION -->
<section class="hero" id="home">
<h1>Structure<br>Is the Design</h1>
<p class="subtitle">
A design aesthetic where the wireframe is the final product.
Exposed grids, dashed borders, annotation labels, and monospace
typography transform the skeletal framework into intentional
visual style.
</p>
<div class="btn-row">
<a href="#projects" class="btn">View Projects</a>
<a href="#about" class="btn btn--filled">Learn More</a>
</div>
<span class="dimensions">1200 x 800</span>
</section>
<!-- ABOUT SECTION -->
<section class="section" data-label="ABOUT" id="about">
<h2>About This Approach</h2>
<p>
The Wireframe Aesthetic freezes the design process at the blueprint
stage and declares it complete. Every container is outlined with
dashed borders. Every region carries a structural label. The grid
is permanently visible. Nothing is hidden.
</p>
<p>
This is not a design in progress. This is the design. The skeleton
is the style. The structure is the ornament.
</p>
<div class="divider"><span>Section Break</span></div>
<div class="placeholder mt-2">
<span>Image -- 1200 x 675</span>
</div>
</section>
<!-- PROJECTS SECTION -->
<section class="section" data-label="PROJECTS" id="projects">
<h2>Projects</h2>
<p>
Each card below is a wireframe component. The dashed borders
indicate container boundaries. Placeholder images use the
conventional diagonal cross. Hover to see interactive states.
</p>
<div class="card-grid">
<div class="card">
<div class="placeholder">
<span>Thumbnail</span>
</div>
<h3>Layout Engine</h3>
<p>A CSS grid system that renders its own column guides as a permanent visual layer, making the 12-column structure visible to end users.</p>
<span class="tag">CSS Grid</span>
<span class="tag">Layout</span>
</div>
<div class="card">
<div class="placeholder">
<span>Thumbnail</span>
</div>
<h3>Schematic UI Kit</h3>
<p>A component library where every element looks like a wireframe annotation, complete with dashed borders, labels, and dimension markers.</p>
<span class="tag">Components</span>
<span class="tag">Figma</span>
</div>
<div class="card">
<div class="placeholder">
<span>Thumbnail</span>
</div>
<h3>Blueprint Theme</h3>
<p>A CMS theme that renders published content in wireframe style, proving that skeletal aesthetics work for real content at scale.</p>
<span class="tag">Theme</span>
<span class="tag">CMS</span>
</div>
<div class="card">
<div class="placeholder">
<span>Thumbnail</span>
</div>
<h3>Mono Type Specimen</h3>
<p>A type specimen website built entirely in monospace, demonstrating that rich typographic hierarchy is achievable within a single font family.</p>
<span class="tag">Typography</span>
<span class="tag">Monospace</span>
</div>
</div>
</section>
<!-- FEATURES SECTION -->
<section class="section" data-label="FEATURES" id="features">
<h2>Features</h2>
<p>
Core characteristics of the wireframe design approach,
presented as annotated feature blocks.
</p>
<div class="features">
<div class="feature">
<div class="icon-placeholder">Icon</div>
<h4>Visible Grid</h4>
<p>Column guides remain visible, transforming layout scaffolding into surface design.</p>
</div>
<div class="feature">
<div class="icon-placeholder">Icon</div>
<h4>Dashed Borders</h4>
<p>Every container is outlined with dashed strokes, revealing structural boundaries.</p>
</div>
<div class="feature">
<div class="icon-placeholder">Icon</div>
<h4>Annotations</h4>
<p>Components carry visible labels identifying their structural role in the layout.</p>
</div>
<div class="feature">
<div class="icon-placeholder">Icon</div>
<h4>Monospace Type</h4>
<p>All text uses monospaced fonts for character-grid alignment and technical character.</p>
</div>
<div class="feature">
<div class="icon-placeholder">Icon</div>
<h4>Placeholders</h4>
<p>Image regions use the conventional diagonal-cross wireframe symbol.</p>
</div>
<div class="feature">
<div class="icon-placeholder">Icon</div>
<h4>Grayscale Palette</h4>
<p>Color is restricted to functional accents; the palette is predominantly gray.</p>
</div>
</div>
</section>
<!-- DATA SECTION -->
<section class="section" data-label="DATA TABLE" id="data">
<h2>Specifications</h2>
<p>Technical parameters for the wireframe design system.</p>
<table class="data-table">
<thead>
<tr>
<th>Property</th>
<th>Value</th>
<th>Unit</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Grid Columns</td>
<td>12</td>
<td>columns</td>
<td>Visible overlay with numbered labels</td>
</tr>
<tr>
<td>Base Font Size</td>
<td>14</td>
<td>px</td>
<td>IBM Plex Mono, all monospace stack</td>
</tr>
<tr>
<td>Gutter Width</td>
<td>24</td>
<td>px</td>
<td>1.5rem between grid columns</td>
</tr>
<tr>
<td>Border Style</td>
<td>dashed</td>
<td>--</td>
<td>1px dashed for containers; dotted for subtle</td>
</tr>
<tr>
<td>Color Range</td>
<td>15</td>
<td>swatches</td>
<td>10 grayscale + 5 functional accents</td>
</tr>
<tr>
<td>Max Content Width</td>
<td>1200</td>
<td>px</td>
<td>Centered with auto margins</td>
</tr>
</tbody>
</table>
</section>
<!-- CONTACT SECTION -->
<section class="section" data-label="CONTACT" id="contact">
<h2>Contact</h2>
<p>
Email: <a href="mailto:hello@example.com">hello@example.com</a><span class="marker">1</span>
—
Source: <a href="#">View Repository</a>
—
License: MIT
</p>
</section>
<!-- FOOTER -->
<footer class="footer">
<div class="footer-grid">
<div>
<h4>Navigation</h4>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#projects">Projects</a></li>
<li><a href="#features">Features</a></li>
</ul>
</div>
<div>
<h4>Resources</h4>
<ul>
<li><a href="#">Documentation</a></li>
<li><a href="#">Component Library</a></li>
<li><a href="#">Grid System</a></li>
<li><a href="#">Type Specimen</a></li>
</ul>
</div>
<div>
<h4>Community</h4>
<ul>
<li><a href="#">GitHub</a></li>
<li><a href="#">Discussions</a></li>
<li><a href="#">Changelog</a></li>
<li><a href="#">Contributing</a></li>
</ul>
</div>
<div>
<h4>Legal</h4>
<ul>
<li><a href="#">Privacy Policy</a></li>
<li><a href="#">Terms of Use</a></li>
<li><a href="#">Licenses</a></li>
</ul>
</div>
</div>
<p class="copyright">
Built with HTML and CSS. Monospace type. Dashed borders. Visible grid.
The wireframe is the design. © 2025
</p>
</footer>
</body>
</html>
position: fixed and z-index: -1, then tint the columns at 3-4% opacity so the layout structure is permanently visible without competing with foreground contentdata-label attribute pattern to create self-labeling components: apply a ::before pseudo-element that reads content: attr(data-label) and positions the text as a small monospace label at the top-left corner of each dashed container, so adding labels requires only an HTML attribute changeborder-style: dashed as your global default and reserve solid borders for hover states and active selections; this single CSS choice establishes the wireframe register immediately and makes interactive state changes feel like “selecting” an element in a design tooltransition: border-style 0.1s ease pattern as your primary interaction feedback; the shift from dashed to solid on hover mimics the “selection” action in design software and provides clear interactive affordance without violating the schematic aesthetic