Swiss International
Helvetica-era grid discipline. Red/black/white. Typography as the only decoration.
Technologies Demonstrated
Color Palette
[Alpine]
Red
#e63329
Black
#1a1a1a
White
#ffffff
Click any swatch to copy hex value.
<div class="grid grid-cols-1 sm:grid-cols-3 gap-0" style="border: 2px solid var(--color-border);"> @swissSwatch("Red", "#e63329", "#fff") @swissSwatch("Black", "#1a1a1a", "#fff") @swissSwatch("White", "#ffffff", "#1a1a1a") </div>
Typography
[Alpine]
Display — 5rem / Bold
Grid
Heading — 2rem / Bold
Typographic Hierarchy
IBM Plex Sans Weights
Light — editorial captions and secondary text
Regular — body copy and running text
Medium — subheadings and navigation
Bold — headlines and typographic emphasis
Caption — 0.75rem
Fig. 1 — The International Typographic Style emerged in Switzerland in the 1950s, championed by designers at the Basel and Zurich schools.
Helvetica Neue
<div x-data="{ size: 1 }" class="swiss-rule pt-8 mt-8"> <div class="flex items-center gap-6 mb-6 flex-wrap"> <span class="swiss-label">Scale Factor</span> <input type="range" min="0.5" max="3" step="0.1" x-model="size" class="w-48 cursor-pointer"/> <span class="swiss-label font-mono" x-text="parseFloat(size).toFixed(1) + 'x'">1.0x</span> </div> <p class="font-bold leading-none" style="font-family: var(--font-display); color: var(--color-secondary);" { templ.Attributes{":style": "'font-size: calc(var(--font-size-display) * ' + size + ')'"}... } >Helvetica Neue</p> <p class="swiss-label mt-4" x-text="'Computed: calc(5rem × ' + parseFloat(size).toFixed(1) + ')'"></p> </div>
Spacing Scale
Base unit: 8px (matches --baseline)
Grid System
12-column modular grid — all columns have equal width, separated by borders
12 col
6 col
6 col
8 col
4 col
4 col
4 col
4 col
Editorial Cards
[Templ]
Design Systems
Grid as Foundation
The grid is not a cage — it is a liberation from chaos. When elements align to a common module, the eye can rest and the mind can read. Structure is the invisible architecture of good design.
Typography
Weight Creates Hierarchy
Bold speaks first. Regular speaks second. Light speaks last. Weight is not decoration — it is the sequence in which information is consumed. Hierarchy is direction.
Color
Red as Signal
In Swiss design, red is never decoration. It is a signal: stop, look, this matters. Black carries the content. White gives it room to breathe. Red marks what cannot be ignored.
@swissArticleCard("Design Systems", "Grid as Foundation", "The grid is not a cage — it is a liberation from chaos. When elements align to a common module, the eye can rest and the mind can read. Structure is the invisible architecture of good design.") @swissArticleCard("Typography", "Weight Creates Hierarchy", "Bold speaks first. Regular speaks second. Light speaks last. Weight is not decoration — it is the sequence in which information is consumed. Hierarchy is direction.") @swissArticleCard("Color", "Red as Signal", "In Swiss design, red is never decoration. It is a signal: stop, look, this matters. Black carries the content. White gives it room to breathe. Red marks what cannot be ignored.")
Pull Quotes
"
Good design is as little design as possible.
— Dieter Rams — Ten Principles of Good Design
"
Typography is what language looks like.
— Ellen Lupton — Thinking with Type
"
The grid system is an aid, not a guarantee.
— Josef Müller-Brockmann — Grid Systems
Buttons
[Alpine]
Variants
Toggle Demo [Alpine]
State: OFF
<div x-data="{ active: false }" class="flex items-center gap-6"> <button class="text-sm" { templ.Attributes{ ":class": "active ? 'swiss-btn' : 'swiss-btn-outline'", "@click": "active = !active", }... } > <span x-text="active ? 'ACTIVE' : 'INACTIVE'">INACTIVE</span> </button> <p class="swiss-label" x-text="active ? 'State: ON' : 'State: OFF'">State: OFF</p> </div>
Forms
[HTMX]
<form hx-post="/guides/swiss/demo-form" hx-target="#swiss-form-response" hx-swap="innerHTML" class="space-y-6" > <div> <label class="block swiss-label mb-2" for="swiss-name">Name</label> <input id="swiss-name" name="name" type="text" placeholder="Your name" class="swiss-input"/> </div> <div> <label class="block swiss-label mb-2" for="swiss-email">Email</label> <input id="swiss-email" name="email" type="email" placeholder="your@email.com" class="swiss-input"/> </div> <div> <label class="block swiss-label mb-2" for="swiss-role">Role</label> <select id="swiss-role" name="role" class="swiss-input cursor-pointer"> <option value="">— Select role —</option> <option value="designer">Designer</option> <option value="developer">Developer</option> <option value="director">Art Director</option> </select> </div> <div class="flex items-center gap-3"> <input type="checkbox" id="swiss-grid" name="grid" class="w-4 h-4 cursor-pointer" style="accent-color: var(--color-primary);"/> <label for="swiss-grid" class="swiss-label cursor-pointer">I believe in the grid</label> </div> <!-- Radio buttons --> <div> <p class="swiss-label mb-3">Preferred Era</p> <div class="space-y-2"> <label class="flex items-center gap-3 cursor-pointer" style="font-size: 0.875rem;"> <input type="radio" name="era" value="1950s" class="w-4 h-4 cursor-pointer" style="accent-color: var(--color-primary);"/> 1950s — Basel School </label> <label class="flex items-center gap-3 cursor-pointer" style="font-size: 0.875rem;"> <input type="radio" name="era" value="1960s" checked class="w-4 h-4 cursor-pointer" style="accent-color: var(--color-primary);"/> 1960s — International Style </label> <label class="flex items-center gap-3 cursor-pointer" style="font-size: 0.875rem;"> <input type="radio" name="era" value="1970s" class="w-4 h-4 cursor-pointer" style="accent-color: var(--color-primary);"/> 1970s — Post-Modernist Reaction </label> </div> </div> <div class="swiss-rule pt-4"> <button type="submit" class="swiss-btn text-sm">Submit via HTMX</button> </div> </form>
Cards & Panels
[Alpine]
Static Card
Information Module
A bordered container with no radius and no shadow. The border itself creates separation. Swiss design relies on rules, not decorative flourishes.
Expandable Module
Click to expand
The expand/collapse pattern demonstrates Alpine.js reactive state without page navigation. Content becomes visible or hidden based on a simple boolean flag — no CSS classes toggled manually.
State:
<div style="border: 2px solid var(--color-border);" x-data="{ expanded: false }"> <div class="p-5 flex items-center justify-between cursor-pointer" { templ.Attributes{"@click": "expanded = !expanded"}... } > <div> <p class="swiss-label mb-1">Expandable Module</p> <h3 class="font-bold" style="font-family: var(--font-display); color: var(--color-secondary);">Click to expand</h3> </div> <span class="text-2xl font-bold transition-transform duration-200" style="color: var(--color-primary); font-family: var(--font-body);" { templ.Attributes{":class": "expanded ? 'rotate-45' : ''"}... } >+</span> </div> <div x-show="expanded" style="border-top: 2px solid var(--color-border);"> <div class="p-5"> <p style="color: var(--color-text-muted); font-size: 0.875rem; max-width: 55ch;">The expand/collapse pattern demonstrates Alpine.js reactive state without page navigation. Content becomes visible or hidden based on a simple boolean flag — no CSS classes toggled manually.</p> <div class="mt-4 p-3" style="background: var(--color-surface-2); border-left: 3px solid var(--color-primary);"> <p class="swiss-label">State: <span x-text="expanded ? 'EXPANDED' : 'COLLAPSED'" style="color: var(--color-primary);"></span></p> </div> </div> </div> </div>
Search Filter
[HTMX]
Live search with hx-get + hx-trigger="input changed delay:300ms"
Design Systems
Grid as Foundation
The grid is not a cage — it is a liberation from chaos.
Typography
Weight Creates Hierarchy
Bold speaks first. Regular speaks second. Light speaks last.
Color
Red as Signal
In Swiss design, red is never decoration. It is a signal.
<div> <input type="text" name="q" placeholder="Filter articles..." class="swiss-input mb-4" hx-get="/guides/swiss/search" hx-target="#swiss-search-results" hx-swap="innerHTML" hx-trigger="input changed delay:300ms, search" /> <div id="swiss-search-results"> @swissArticleCard("Design Systems", "Grid as Foundation", "The grid is not a cage — it is a liberation from chaos.") @swissArticleCard("Typography", "Weight Creates Hierarchy", "Bold speaks first. Regular speaks second. Light speaks last.") @swissArticleCard("Color", "Red as Signal", "In Swiss design, red is never decoration. It is a signal.") </div> </div>