Brutalist
Raw. Functional. Unapologetic. Heavy borders, stark contrast, no rounded corners.
Technologies Demonstrated
Color Palette
[Alpine]Primary
Secondary
Accent
BG
Surface
Muted
Click any swatch to copy hex value to clipboard.
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-6 gap-4"> @colorSwatch("Primary", "--color-primary") @colorSwatch("Secondary", "--color-secondary") @colorSwatch("Accent", "--color-accent") @colorSwatch("BG", "--color-bg") @colorSwatch("Surface", "--color-surface") @colorSwatch("Muted", "--color-text-muted") </div>
Typography
Display — 3.5rem / Bold
BRUTALISM
Heading — 1.75rem / Bold
The Grid Is Your Canvas
Body — 1rem / Regular
Brutalist design strips away decoration to expose function. Every element serves a purpose. Nothing is hidden. Everything is raw.
Body Italic — 1rem / Italic
"Form ever follows function." — Louis Sullivan
Caption — 0.75rem / Regular
Figure 1. — Raw concrete texture, unfinished surfaces, exposed structure.
Spacing Scale
Base unit: 4px
Buttons
[Alpine]Sizes
Variants
Toggle Demo [Alpine]
State: OFF
<div x-data="{ active: false }" class="flex items-center gap-6"> <button class="px-4 py-2 text-sm font-bold uppercase border-2 font-mono cursor-pointer transition-all" style="border-color: var(--border-color)" { templ.Attributes{ "@click": "active = !active", ":style": "active ? 'border-color: var(--border-color); background: var(--color-primary); color: var(--color-bg); box-shadow: none; transform: translate(0,0)' : 'border-color: var(--border-color); background: var(--color-bg); color: var(--color-primary)'", ":class": "active ? '' : 'brut-btn-secondary'", }... } > <span x-text="active ? 'ACTIVE' : 'INACTIVE'">INACTIVE</span> </button> <p class="text-xs font-mono" style="color: var(--color-text-muted)" x-text="active ? 'State: ON' : 'State: OFF'">State: OFF</p> </div>
Forms
[HTMX] [Alpine]<form hx-post="/guides/brutalist/demo-form" hx-target="#form-response" hx-swap="innerHTML" hx-indicator="#brut-submit" class="space-y-6" > <!-- Text input --> <div> <label class="block text-xs font-bold uppercase mb-1 font-mono" for="brut-name">Name</label> <input id="brut-name" name="name" type="text" placeholder="Enter your name..." class="brut-input w-full px-3 py-2 text-sm font-mono" /> </div> <!-- Select --> <div> <label class="block text-xs font-bold uppercase mb-1 font-mono" for="brut-select">Category</label> <select id="brut-select" name="category" class="brut-input w-full px-3 py-2 text-sm font-mono cursor-pointer"> <option value="">-- Select --</option> <option value="architecture">Architecture</option> <option value="design">Design</option> <option value="engineering">Engineering</option> </select> </div> <!-- Checkboxes --> <div> <p class="text-xs font-bold uppercase mb-2 font-mono">Preferences</p> <div class="space-y-2"> <label class="flex items-center gap-2 cursor-pointer text-sm font-mono"> <input type="checkbox" name="pref" value="raw" class="w-4 h-4 border-2 rounded-none cursor-pointer" style="border-color: var(--border-color)"/> Raw aesthetic </label> <label class="flex items-center gap-2 cursor-pointer text-sm font-mono"> <input type="checkbox" name="pref" value="functional" class="w-4 h-4 border-2 rounded-none cursor-pointer" style="border-color: var(--border-color)"/> Function over form </label> <label class="flex items-center gap-2 cursor-pointer text-sm font-mono"> <input type="checkbox" name="pref" value="honest" class="w-4 h-4 border-2 rounded-none cursor-pointer" style="border-color: var(--border-color)"/> Honest materials </label> </div> </div> <!-- Radio buttons --> <div> <p class="text-xs font-bold uppercase mb-2 font-mono">Weight</p> <div class="space-y-2"> <label class="flex items-center gap-2 cursor-pointer text-sm font-mono"> <input type="radio" name="weight" value="light" class="w-4 h-4 border-2 cursor-pointer" style="border-color: var(--border-color)"/> Light </label> <label class="flex items-center gap-2 cursor-pointer text-sm font-mono"> <input type="radio" name="weight" value="regular" checked class="w-4 h-4 border-2 cursor-pointer" style="border-color: var(--border-color)"/> Regular </label> <label class="flex items-center gap-2 cursor-pointer text-sm font-mono"> <input type="radio" name="weight" value="bold" class="w-4 h-4 border-2 cursor-pointer" style="border-color: var(--border-color)"/> Bold </label> </div> </div> <!-- Submit --> <div> <button type="submit" class="brut-btn-primary px-6 py-2 text-sm font-bold uppercase cursor-pointer"id="brut-submit"> Submit Form <span class="brut-indicator font-mono"> ...</span> </button> </div> </form>
Cards & Panels
[Alpine]Basic Card
STATICA standard content container. Hard borders, flat shadow, zero radius. No decoration. Pure structure.
Expandable Panel
+Hidden content revealed on expand. Alpine.js powers the toggle with no server round-trip needed.
// Raw data block
status: EXPANDED
type: brutalist
border-radius: 0px
<div class="brut-card" x-data="{ expanded: false }"> <div class="p-6 cursor-pointer flex items-center justify-between" { templ.Attributes{"@click": "expanded = !expanded"}... } > <h3 class="text-base font-bold uppercase font-mono">Expandable Panel</h3> <span class="text-xl font-bold font-mono transition-transform" { templ.Attributes{":class": "expanded ? 'rotate-45' : ''"}... }>+</span> </div> <div x-show="expanded" class="px-6 pb-6 border-t-2" style="border-color: var(--border-color)"> <p class="text-sm font-mono pt-4" style="color: var(--color-text-muted)"> Hidden content revealed on expand. Alpine.js powers the toggle with no server round-trip needed. </p> <div class="mt-4 p-3 font-mono text-xs" style="background: var(--color-primary); color: var(--color-bg)"> <p>{ "// Raw data block" }</p> <p>status: EXPANDED</p> <p>type: brutalist</p> <p>border-radius: 0px</p> </div> </div> </div>
Warning Panel
This is an alert/notice panel using the accent color. Hard edges. Cannot be ignored.
Tabs
[Alpine]Design is not decoration. Design is function made visible. Every pixel, every border, every shadow must justify its existence.
<div x-data="{ tab: 'design' }"> <div class="flex" style="border-bottom: 2px solid var(--color-primary);"> for _, t := range []struct{ id, label string }{ {"design", "DESIGN"}, {"code", "CODE"}, {"docs", "DOCS"}, } { <button class="brut-tab" { templ.Attributes{ ":class": "tab==='" + t.id + "' ? 'brut-tab brut-tab-active' : 'brut-tab'", "@click": "tab='" + t.id + "'", }... } >{ t.label }</button> } </div> <div class="brut-card p-6" style="border-top: none;"> <div x-show="tab==='design'"> <p class="text-sm font-mono">Design is not decoration. Design is function made visible. Every pixel, every border, every shadow must justify its existence.</p> </div> <div x-show="tab==='code'" style="display: none;"> <p class="text-sm font-mono">Code is structure. Like brutalist architecture, the structure is not hidden behind a facade — it is the facade. What you see is what it does.</p> </div> <div x-show="tab==='docs'" style="display: none;"> <p class="text-sm font-mono">Documentation is honest. It does not promise what it cannot deliver. It does not hide complexity behind friendly language.</p> </div> </div> </div>