Welcome to Vanilla Breeze
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
Wireframe mode for rapid HTML prototyping. Apply sketch-like rendering with four fidelity levels, dark mode support, and element labeling via a single data attribute.
The data-wireframe attribute converts any page or container into a sketch-like wireframe. It applies grayscale rendering, dashed borders, and hand-drawn fonts to help focus on layout and structure during prototyping.
Wireframe mode requires the dev CSS bundle. The JS API requires the dev JS bundle.
<!-- Main CSS (always needed) --><link rel="stylesheet" href="/cdn/vanilla-breeze.css"> <!-- Dev CSS (adds wireframe, debug tools) --><link rel="stylesheet" href="/cdn/vanilla-breeze-dev.css"> <!-- Dev JS (adds VanillaBreeze.wireframe API) --><script type="module" src="/cdn/vanilla-breeze-dev.js"></script>
data-wireframe to <html> for full-page wireframe, or to any container for scoped wireframingdata-mode="dark" or system preference<!-- Apply to html for full-page wireframe --><html data-wireframe> <!-- Or scope to a container --><section data-wireframe> <h2>This section renders as a wireframe</h2> <p>Rest of the page is normal.</p></section>
| Attribute | Type | Description |
|---|---|---|
data-wireframe |
string | Fidelity level: lo, mid, hi, annotate, or empty (defaults to mid behavior). |
data-wf-label |
string | Element label text shown in annotate mode via ::before pseudo-element. |
data-wf-annotate |
boolean | Composable annotation layer. Unlike annotate fidelity, this overlays element labels on top of any fidelity level. Uses ::after so it coexists with data-wf-label badges. |
data-wf-callout |
string | Design review comment. JS renders a numbered <mark> marker and collects text into a footnote panel. |
| Level | Fonts | Borders | Colors | Best For |
|---|---|---|---|---|
lo |
Redacted Script (scribble) | Rough dashed | Pure B&W | Early concept sketches |
mid (default) |
Flow Block | Dashed | Grayscale | Layout review |
hi |
System fonts | Subtle | Near-production | Content review, stakeholder demos |
annotate |
System fonts | Labeled | Grayscale + labels | Design specs, developer handoff |
<!-- Lo: scribble font, rough borders, pure B&W --><html data-wireframe="lo"> <!-- Mid: block font, dashed borders, grayscale (default) --><html data-wireframe="mid"><html data-wireframe> <!-- Hi: system fonts, subtle styling, near-production --><html data-wireframe="hi"> <!-- Annotate: element labels visible --><html data-wireframe="annotate">
Add data-wf-label to any element to show a label badge in annotate mode. The JS API can also auto-label elements using their alt text (images) or explicit labels.
<section data-wf-label="Hero Section"> <h1>Page Title</h1> <p>Subtitle text here.</p></section> <nav data-wf-label="Primary Navigation"> <a href="#">Home</a> <a href="#">About</a></nav>
</section> <section> <h2>JavaScript API</h2> <p>The <code>VanillaBreeze.wireframe</code> object provides programmatic control. Available when the dev JS bundle is loaded.</p> <h3>Toggle</h3> <code-block language="javascript" show-lines label="Toggle wireframe" data-escape// Toggle wireframe on/offVanillaBreeze.wireframe.toggle(); // Toggle with specific fidelityVanillaBreeze.wireframe.toggle('lo'); // Set fidelity directlyVanillaBreeze.wireframe.setFidelity('hi'); // Remove wireframe modeVanillaBreeze.wireframe.setFidelity('');
VanillaBreeze.wireframe.isActive();// → true/false VanillaBreeze.wireframe.getFidelity();// → 'lo' | 'mid' | 'hi' | 'annotate' | null/code-block <table class="props-table"> <caption>API Methods</caption> <thead> <tr><th>Method</th><th>Returns</th><th>Description</th></tr> </thead> <tbody> <tr> <td><code>toggle(level?)</code></td> <td><code>boolean</code></td> <td>Toggle wireframe on/off. Returns whether now enabled.</td> </tr> <tr> <td><code>setFidelity(level)</code></td> <td><code>void</code></td> <td>Set fidelity. Pass empty string to disable.</td> </tr> <tr> <td><code>isActive()</code></td> <td><code>boolean</code></td> <td>Check if wireframe mode is active.</td> </tr> <tr> <td><code>getFidelity()</code></td> <td><code>string|null</code></td> <td>Get current fidelity level.</td> </tr> <tr> <td><code>labelElements()</code></td> <td><code>void</code></td> <td>Auto-label elements with <code>data-wf-label</code> and images with <code>alt</code> text.</td> </tr> <tr> <td><code>label(target, text)</code></td> <td><code>void</code></td> <td>Label a specific element or CSS selector.</td> </tr> <tr> <td><code>toggleAnnotations()</code></td> <td><code>boolean</code></td> <td>Toggle composable annotations. Returns whether now enabled.</td> </tr> <tr> <td><code>addCallout(target, text)</code></td> <td><code>void</code></td> <td>Attach a design review comment to an element.</td> </tr> <tr> <td><code>removeCallout(target)</code></td> <td><code>void</code></td> <td>Remove a callout from an element.</td> </tr> <tr> <td><code>renderCallouts()</code></td> <td><code>void</code></td> <td>Inject numbered <code><mark></code> markers on all <code>[data-wf-callout]</code> elements.</td> </tr> <tr> <td><code>renderCalloutPanel(container?)</code></td> <td><code>void</code></td> <td>Render <code><aside></code> footnote panel with ordered list of callout texts.</td> </tr> <tr> <td><code>toggleCallouts()</code></td> <td><code>boolean</code></td> <td>Toggle callout markers and panel visibility. Returns whether now visible.</td> </tr> </tbody> </table></section> <section> <h2>Composable Annotations</h2> <p>The <code>data-wf-annotate</code> attribute layers element labels on top of any fidelity level. Unlike the <code>annotate</code> fidelity mode, this lets you see lo-fi or hi-fi styling with labels overlaid.</p> <p>Annotations use <code>::after</code> pseudo-elements (positioned top-right), so they never collide with <code>data-wf-label</code> badges (which use <code>::before</code>, top-left). Both can appear simultaneously on the same element.</p> <code-block language="html" show-lines label="Composable annotations" data-escape><!-- Composable annotation attribute --><html data-wireframe="lo" data-wf-annotate> <!-- Lo-fi styles WITH element labels overlaid --></html>
</section> <section> <h2>Callouts & Comments</h2> <p>The callout system adds design review comments to wireframe elements. This creates a three-tier overlay model:</p> <table> <thead> <tr><th>System</th><th>Attribute</th><th>Purpose</th><th>Rendering</th></tr> </thead> <tbody> <tr> <td><strong>Labels</strong></td> <td><code>data-wf-label</code></td> <td>"What this IS" — structural name</td> <td><code>::before</code> badge, top-left inside</td> </tr> <tr> <td><strong>Annotations</strong></td> <td><code>data-wf-annotate</code></td> <td>"What tag this uses" — developer reference</td> <td><code>::after</code> monospace label, top-right outside</td> </tr> <tr> <td><strong>Callouts</strong></td> <td><code>data-wf-callout</code></td> <td>"What a reviewer thinks" — design comments</td> <td>Injected <code><mark></code> numbered marker + footnote panel</td> </tr> </tbody> </table> <p>All three can be active simultaneously without collision.</p> <code-block language="html" show-lines label="Callout attributes" data-escape><section data-wf-callout="Consider full-bleed hero with background image"> <h2>Hero</h2></section> <form data-wf-callout="Add phone number field and CAPTCHA"> <!-- form fields --></form>
</section> <section> <h2>Dark Mode</h2> <p>Wireframe tokens automatically invert for dark mode, either via the <code>data-mode="dark"</code> attribute or <code>prefers-color-scheme: dark</code> media query.</p> <code-block language="html" show-lines label="Dark mode wireframe" data-escape><!-- Explicit dark mode --><html data-wireframe data-mode="dark"> <!-- Auto dark mode via system preference works too -->
Wireframe mode exposes custom properties you can use or override in your own styles.
/* Available wireframe tokens */[data-wireframe] { --wireframe-stroke: oklch(30% 0 0); --wireframe-fill: oklch(98% 0 0); --wireframe-text: oklch(15% 0 0); --wireframe-muted: oklch(50% 0 0); --wireframe-accent: oklch(90% 0 0); --wireframe-border: 2px dashed var(--wireframe-stroke); --wireframe-label-bg: var(--wireframe-stroke); --wireframe-label-color: var(--wireframe-fill);}
Ctrl+Shift+W (or Cmd+Shift+W on macOS) toggles wireframe mode. This is auto-registered when the dev JS bundle loads.
</section> <section> <h2>Palette Variants</h2> <p>Override the default grayscale palette with themed color sets. Pure CSS, no JS needed.</p> <table> <thead> <tr><th>Palette</th><th>Description</th></tr> </thead> <tbody> <tr><td><code>blueprint</code></td><td>Blue-toned wireframe, reminiscent of architectural drawings</td></tr> <tr><td><code>sepia</code></td><td>Warm paper-toned wireframe for a classic sketch feel</td></tr> </tbody> </table> <code-block language="html" show-lines label="Palette variants" data-escape><!-- Blue-toned blueprint wireframe --><html data-wireframe data-wf-palette="blueprint"> <!-- Warm sepia wireframe --><html data-wireframe data-wf-palette="sepia">
Debug overlays that work independently of wireframe mode.
| Attribute | Description |
|---|---|
data-show-grid | 12-column grid overlay for layout alignment |
data-show-spacing | Box-model outline on all elements |
<!-- Grid column overlay (works with or without wireframe) --><body data-show-grid> <!-- Spacing / box-model debug overlay --><body data-show-spacing> <!-- Combine with wireframe --><html data-wireframe="lo"> <body data-show-grid data-show-spacing>
Wireframe mode works seamlessly with other prototyping attributes:
lo fidelity, placeholder text gets abstract letter-spacing and reduced opacitySee the Prototyping Toolkit page for the full picture.
::before and annotations use ::after pseudo-elements, not injected DOM nodes<mark> elements with aria-labelpointer-events: none