Editorial first
Hierarchy comes from writing, type, and spacing. Decoration never competes with the story.
Living interface guideline
Direction
The system is intentionally restrained. Use these principles to decide what belongs before reaching for a component or utility class.
Hierarchy comes from writing, type, and spacing. Decoration never competes with the story.
Rounded cards and quiet borders establish hierarchy. Shadows are reserved for elevation and interaction.
Indigo marks primary actions; semantic status colors communicate information, success, warning, and error.
Articles, galleries, charts, utilities, and errors share the ReUI Sera tokens without sharing one layout.
Foundations
Use semantic tokens so light and dark themes stay equivalent. Indigo anchors actions; info, success, warning, and destructive roles communicate status consistently.
bg-backgroundtext-foregroundbg-mutedtext-muted-foregroundborder-border/70ring-ringbg-primary text-primary-foregroundbg-info text-info-foregroundbg-success text-success-foregroundbg-warning text-warning-foregroundbg-destructive text-destructive-foregroundbg-invert text-invert-foregroundDisplay / Plus Jakarta Sans
Clear stories, quiet interface.
Body / Plus Jakarta Sans
Body copy uses a comfortable line height and a readable measure. Supporting text steps back through muted foreground, not reduced size alone.
Metadata / Geist Mono
03 · 2026.08.22 · TYPESCRIPT / GO / ASTRO
Rhythm
Keep local groups compact and make section changes unmistakable. Responsive spacing should preserve hierarchy rather than merely shrink it.
mt-10 / sm:mt-16 Use the smaller gap when the next section continues the introduction.mt-16 / sm:mt-24 A major topic change needs more space than an internal group.py-6 to py-10 Scale with content density; use cards when grouping discrete items.max-w-2xl / max-w-3xl Keep prose readable even when the route shell is wider.Pattern 01
Public indexes and utilities start with an eyebrow, one clear h1, and a concise description. Use PageHeader.astro instead of rebuilding this hierarchy per route.
Selected projects
A collection of projects I've built.
Pattern 02
Use ruled rows for works, notes, guestbook entries, experience highlights, and other scan-heavy collections. Keep metadata leading, content central, and the action trailing.
The description explains the destination without turning the row into a card.
ASTRO · SVELTE · GO
Pattern 03
When labels matter as much as values, use a description list or a numbered section grid. This keeps utility pages readable without forcing their content into cards.
Pattern 04
Notes, works, and experience stories keep their authored reading flow. Constrain line length when a table of contents shares the desktop canvas, but do not convert prose into dashboard sections.
article, heading order, and meaningful link text.Pattern 05
Galleries and charts retain the structure their content needs. Bring them into the system through rounded surfaces, semantic color, readable metadata, and restrained interaction.
Gallery
Images lead; controls stay visible and keyboard reachable.
Chart
Use semantic colors for market direction and status.
Controls
Prefer shared UI primitives with consistent rounded corners and clear focus.
Quality
Mobile keeps the same reading order and hierarchy. Columns collapse only when their content no longer fits, and text never depends on a fixed height.
375 PX
Single-column reading flow
768 PX
Expanded rows and media grids
1280 PX
Sidebar and full editorial grid
Quality
Accessibility is part of the component contract, not a finishing pass.
Implementation
Start with the shared shell and header. Choose a content pattern based on the information—not because another route happens to use it.
<Layout title="Page" description="..." url="https://ekel.dev/page">
<div class="mx-auto w-full">
<PageHeader title="Page" eyebrow="Section label">
A concise description of this page.
</PageHeader>
<section class="mt-10 w-full sm:mt-16">
<!-- Use editorial rows, structured data, prose, media, or data UI. -->
</section>
</div>
</Layout>