Template
Slabwork
A crisp, brutalist-leaning personal blog/magazine with a featured split hero, an editor's pick carousel, trending and masonry grids, category filters, search and dark mode. It gives a solo publisher a structured front page for lifestyle, business and tech writing.
Brutalist-leaning personal magazine blog · Website · Small business site · static site
Who it is for
- Personal brand bloggers
- Lifestyle and tech writers
- Podcasters with show notes
- Small editorial teams
Layout
- Header: lowercase bold wordmark left, uppercase category links (All, Business, Technology, Podcast) center, square outlined icon buttons (socials, search, theme) right
- Featured split hero: rounded photo left, bold title, uppercase meta line, excerpt, outlined 'Read more →' button right
- Editor's Pick carousel with square prev/next buttons
- Trending grid: 3-column cards with image, 'Category -- Date', bold title, excerpt
- Masonry/more posts sections
- Footer
- Article page with reading progress, share, related posts
Palette
Crisp, neutral, modern, structured, versatile. Minimal monochrome chrome that lets photography lead.
- background
#ffffff - text / primary
#141414 - secondary surface
#f5f5f5 - accent
#f0f0f0 - border
#e6e6e6 - muted text
#595959 - input / button outline
#8e8e8e
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on background | 18.42:1 | 4.5:1 |
| Aa | body text on secondary surface | 16.90:1 | 4.5:1 |
| Aa | muted/uppercase meta text on background | 7.00:1 | 4.5:1 |
| Aa | muted meta text on secondary surface | 6.42:1 | 4.5:1 |
| Aa | inverted hover: white on near-black icon button | 18.42:1 | 4.5:1 |
| square button outline / input border on background | 3.28:1 | 3:1 | |
| square button outline / input border on secondary surface | 3.01:1 | 3:1 | |
| focus ring on background | 18.42:1 | 3:1 | |
| Aa | dark mode: text on base | 17.12:1 | 4.5:1 |
| Aa | dark mode: muted text on base | 7.60:1 | 4.5:1 |
As vibld’s tokens
The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.
- background
- card
- muted
- primary
- secondary
- accent
- destructive *
Type
- Display
- DM Sans 700, 34–36px hero title, 18–20px card titles
- Body
- DM Sans 400 16px; uppercase 12px meta (short, 0.06em tracking) with em-dash separators
Single grotesk; brutalist touches come from square outlined buttons and uppercase meta
Spacing and imagery
Full-width 1230px, 24px gutters, 3-column grid with 32px gaps, 8px image radius, 1px outlines on square buttons; cards on white with faint shadow
Warm AI-style lifestyle photography -- people working on laptops, yoga at home, fashion portraits -- in rounded rectangles.
Components
- Square icon buttons
- Uppercase category nav
- Featured split hero
- Outlined Read more button
- Carousel with square arrows
- Article card with meta line
- Masonry grid
- Category filter
- Search overlay
- Theme toggle
- Reading progress bar
- Related posts
- Skip link
Interactions
- Carousel prev/next
- Card hover lift/image zoom
- Category filtering
- Search with instant results
- Dark mode switch
- Reading progress on article
- Share buttons copy link
Data
Post{slug, title, excerpt, cover, category, author, date, body_md, featured, editors_pick, trending}Category{name, slug}Author{name, role, avatar}
Build prompt
The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.
The baseline
### How to use these prompts Paste a template's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project. ### Engineering baseline - TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind). - Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone. - Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only. - Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables. ### Data and auth baseline (full-stack templates) - Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views. - Store roles in a separate table checked by a security-definer function, never in a user-editable profile field. - Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs. - Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms. - Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data. ### Accessibility and UX baseline - Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change. - Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels. - Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images. - Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives. - Build mobile-first and test at 375px, 768px and 1280px. ### Content guardrails - Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text. - Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.
### Goal Build **Slabwork**, a versatile blog/magazine for a personal brand covering lifestyle, business, technology and a podcast. The home page stacks a featured story, an editor's pick carousel, trending cards and a masonry archive. The job: give a solo publisher a structured, credible front page that's easy to fill. ### Stack React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix), lucide-react. Posts from local MDX; Embla for the Editor's Pick carousel; Fuse.js search in a dialog; next-themes-style theme provider for dark mode. No backend (optional newsletter form via a provider). ### Pages & layout 1. **Home** – header: bold lowercase wordmark, uppercase nav, and five 36px square outlined icon buttons (3 socials, search, theme). Featured split: rounded image (≈ 590×445) left; right a 36px bold title, uppercase meta "AUTHOR / ROLE -- CATEGORY -- DATE", excerpt, outlined "Read more →". "Editor's pick" heading with square arrow buttons and a 4-up carousel. "Trending" 3-column cards. "More stories" masonry mixing tall and wide images. Footer with categories and socials. 2. **Category** pages with filter chips. 3. **Post** – reading progress bar, title, meta, hero, prose, share, author box, related posts (same category, then recent). 4. **Search** dialog. ### Design system Monochrome with brutal edges. `--background: #ffffff`, `--foreground: #141414`, `--secondary: #f5f5f5`, `--border: #e6e6e6`, `--muted-foreground: #595959`, `--input-border: #8e8e8e` (square buttons, inputs; `--border` stays decorative). Body 16px/1.6, ~70ch post column. Dark: `--background: #0f0f0f`, `--foreground: #f2f2f2`, `--muted-foreground: #a3a3a3`. Font: DM Sans 400/500/700. Scale 12 (uppercase meta only, 0.06em tracking) / 14 / 16 / 20 / 36 / 48. Radius 8px images/cards, 0 for icon buttons and outlined CTAs. Shadow on cards `0 1px 3px rgb(0 0 0 / .06)`. Motion 200ms ease. ### Components & interactions Header, IconSquareButton (hover invert black/white, focus ring), FeaturedHero, OutlineButton, Carousel (arrows disabled at ends), PostCard (hover image scale), MasonryGrid, CategoryChips, SearchDialog (empty/results/no results), ThemeToggle, ReadingProgress, ShareBar, AuthorBox, RelatedPosts, SkipLink. ### Data & state Typed MDX frontmatter with flags `featured`, `editorsPick`, `trending`. Related posts computed by shared category/tags. Theme stored in localStorage. Seed 18 original posts with realistic titles (replace any lorem-style placeholders) and generated photos of fictional people. ### Accessibility Square icon buttons need `aria-label`s and 44px hit areas on touch. Uppercase meta at 12px uses #595959 (7.0:1 on white). Carousel: region with label, arrows labeled, no autoplay. Dark mode must preserve contrast for muted text (#a3a3a3 on #0f0f0f). Progress bar decorative. Skip link present, landmarks (header/nav/main/footer). Verified contrast: body text #141414 on #ffffff = 18.4:1; muted/uppercase meta text #595959 on #ffffff = 7.0:1; inverted hover: white #ffffff on #141414 = 18.4:1; square button outline / input border #8e8e8e on #ffffff = 3.2:1; dark mode: muted text #a3a3a3 on #0f0f0f = 7.6:1. ### Security Proportionate static-site hygiene: no secrets in client code, sanitized MDX output, external/social links `rel="noopener noreferrer"`, newsletter form (if added) validated with zod and posted to the provider with a honeypot. ### Performance & SEO Responsive images with `srcset`, lazy below the fold, explicit dimensions for masonry to prevent CLS. Pre-render; per-post meta/OG, Article schema, sitemap, RSS. Lighthouse 95+. ### Guardrails - Write fresh copy for every post (no lorem ipsum); use generated or CC0 imagery; no brand logos. - No fake author credentials or testimonials. - Don't collect data beyond optional emails. - Typed small components, no `any`, visible empty/error states. - Done when: all home sections render from content flags, the carousel works by keyboard, search and category filters return correct posts, dark mode passes contrast, and there is zero layout shift on load.