Template
Loam Quarterly
A warm-gray editorial magazine with a stacked serif nameplate, category navigation, breaking lead, daily feed, featured story cards and a newsletter signup. It gives independent publishers a 21-page multi-category magazine with alternative homepage layouts, galleries, staff pages and a contact form.
Literary quarterly site · Website · Small business site · static site
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Start from this templateRead the build prompt
Typefaces
Literata stays as the bookish serif, and Karla is a gentle grotesk that feels at home on uncoated stock.
- LiterataHeadings: nameplate and headlines 700, italic bylines
- KarlaBody: UI, labels and meta 12-16px
Who it is for
- Independent magazine publishers
- Newsletter writers expanding to a site
- Multi-category editorial brands
- Agencies on tight editorial timelines
Layout
- Utility bar: date left, HOME / POLITICS / OPINION / CONTACTS right
- Centered stacked nameplate: a small tracked first word above a heavy serif second word
- Uppercase category nav with underline on active item and search icon
- Four-column headline strip with category labels
- Breaking News lead (large photo) with Daily Feed list sidebar, both under heavy rules
- Featured Stories: 3-column cards (photo, category, serif headline, excerpt, date, byline) on lighter card surface
- VIEW MORE POSTS pagination link
- Newsletter strip: serif heading, email field + taupe SIGN UP button
- Cookie consent bar; staff profiles, galleries, contact and alternate home layouts on other pages
Palette
Calm, literary, muted, refined, earthy. It feels like a quarterly printed on uncoated stock.
- background (stone)
#e9e7e7 - text
#11100e - primary (taupe/olive)
#6b6357 - card
#f3f2f2 - secondary
#dad8d8 - border
#c4c0ba
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on stone background | 15.44:1 | 4.5:1 |
| Aa | body text on card | 17.02:1 | 4.5:1 |
| Aa | taupe label/link text on stone | 4.81:1 | 4.5:1 |
| Aa | taupe label text on card | 5.30:1 | 4.5:1 |
| Aa | label on taupe primary button | 5.30:1 | 4.5:1 |
| input border on stone background | 3.05:1 | 3:1 | |
| input border on card | 3.36:1 | 3:1 | |
| Aa | dark mode body text | 14.51:1 | 4.5:1 |
| Aa | dark mode text on card | 13.14:1 | 4.5:1 |
| Aa | dark mode primary text on card | 7.02:1 | 4.5:1 |
| Aa | dark mode label on primary button | 7.75: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 scale
- Display
- Literata 700 for nameplate and headlines (24px section heads uppercase, 22-26px card titles)
- Body
- Karla 16px, uppercase 12-13px labels with tracking
A bookish modern serif against a clean sans gives a literary magazine feel that's calmer than a tabloid.
Spacing and imagery
Measured; ~1250px container, 2/3 + 1/3 lead split, 3-col cards with 24px gaps, 4px radius, soft card shadow, heavy 2px rules under section heads.
Atmospheric landscape and documentary photos, sometimes desaturated; full-width card tops; lightbox galleries.
Components
- Utility date bar
- Stacked serif nameplate
- Category nav with active underline
- Headline strip
- Breaking lead block
- Daily feed list
- Featured story card
- View more posts pagination
- Newsletter strip
- Lightbox gallery
- Staff profile card
- Breadcrumbs
- Cookie consent bar
- Contact form
Interactions
- Paginated 'view more' loading
- Lightbox open/close with arrows
- Search overlay
- Mobile drawer nav
- Dark mode toggle
- Card hover shadow lift
- Cookie accept persistence
- Newsletter submit toast
Data
Article{slug, title, excerpt, body, categories[], authorId, publishedAt, cover, gallery[]}Staff{id, name, role, bio, photo}Category{slug, name}Subscriber{email}ContactMessage{name, email, subject, message}
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 **Loam Quarterly**, an online magazine for a fictional independent publisher covering culture, food, travel, sport and politics. Readers want thoughtful long-reads rather than hot takes. The site needs a calm, printed-matter look, three alternative homepage layouts, rich galleries, staff pages and a newsletter, across about 21 pages.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Sheet, Dialog, Breadcrumb, Pagination, Input), lucide-react, Embla Carousel for galleries and the lightbox, Sonner for toasts, Vaul for the mobile drawer, react-hook-form + zod for newsletter and contact forms, React Router. Content in MDX or JSON; no database. A serverless function only for the contact form and signup.
### Pages & layout
1. **Home A (classic)** – utility bar with date and small links; stacked nameplate (tiny letter-spaced word above a heavy serif word); uppercase nav with active underline and search; four-column headline strip; "Breaking News" lead image + story with a "Daily Feed" list on the right, each under a 2px rule; "Featured Stories" three-column cards; "View more posts"; newsletter strip; footer.
2. **Home B (grid)** – masonry-style mixed card sizes. **Home C (list)** – single-column long-read list with large type.
3. **Category**, **Tag**, **Author** archive pages with pagination and breadcrumbs.
4. **Article** – breadcrumbs, category, headline, byline, date, hero, body with drop cap and pull quotes, gallery block, share buttons, related articles.
5. **Post types** (gallery, video, audio, quote), **Staff** list and profiles, **Contact**, **About**, 404.
### Design system
- Tokens: `--background: #e9e7e7`, `--foreground: #11100e`, `--primary: #6b6357`, `--primary-foreground: #f3f2f2`, `--card: #f3f2f2`, `--secondary: #dad8d8`, `--muted: #d2d0d0`, `--border: #c4c0ba` (decorative), `--input-border: #8a8377`, `--radius: 0.25rem`. Dark: background `#1a1917`, card `#23221f`, text `#ece9e4`, primary `#b5ab9b`.
- Fonts: Literata (700 headlines, 400 italic for bylines) and Karla for UI/labels. Scale: 12 (labels, uppercase +0.06em) / 14 / 16 / 18 / 22 / 28 / 36 / 56 (nameplate).
- Spacing: 8px base, 24px gutters, sections 64px; cards with `0 1px 2px rgb(17 16 14 / .08)` shadow, 4px radius.
- Motion: card hover shadow 200ms; lightbox fade 200ms; drawer 250ms.
### Components & interactions
Nameplate, nav (active/hover/focus), search overlay (results/empty), headline strip item, lead block, feed item, story card (with/without image, loading skeleton), pagination (prev/next disabled at ends), gallery + lightbox (arrows, swipe, Escape, counter), share buttons (copy link feedback), newsletter (validation/success/error), contact form (field errors, sending, sent), cookie bar, staff card.
### Data & state
`Article{slug,title,excerpt,body,categories[],authorId,publishedAt,cover{src,alt},gallery?[]}`, `Staff{id,name,role,bio,photo}`, `Category{slug,name}`. Derive archives at build time. Seed 30 fictional articles with original copy (not lorem ipsum in the final build), eight staff members with invented names and placeholder portraits.
### Accessibility
Ink on the stone background is 15.4:1; taupe `#6b6357` is 4.8:1 on stone and 5.3:1 on cards, fine for labels and links; the `#f3f2f2` label on the taupe button is 5.3:1. Inputs use `--input-border: #8a8377` (3:1+ on stone and card) because `#c4c0ba` is a decorative rule colour. Dark mode: text `#ece9e4` on `#1a1917` is 14.5:1, primary `#b5ab9b` is 7.75:1, and button labels on it use `#1a1917`. Drop caps must not break screen-reader reading (use `::first-letter`). Lightbox is a modal dialog with focus trap, labeled controls and alt text per image. Pagination has `aria-current`. Skip link to main content. Reduced motion disables hover lifts and slide animations.
Verified contrast: body text on stone background #11100e on #e9e7e7 = 15.44:1; body text on card #11100e on #f3f2f2 = 17.02:1; taupe label/link text on stone #6b6357 on #e9e7e7 = 4.81:1; taupe label text on card #6b6357 on #f3f2f2 = 5.3:1; label on taupe primary button #f3f2f2 on #6b6357 = 5.3:1; input border on stone background #8a8377 on #e9e7e7 = 3.05:1.
### Security
Proportionate: zod validation on both forms, honeypot and rate limiting at the function, no secrets shipped to the browser, DOMPurify for any HTML in content, safe external links. The cookie banner must block optional analytics until accepted.
### Performance & SEO
Prerender all routes; Article JSON-LD, breadcrumbs structured data, OG images, sitemap and RSS. Lazy-load gallery images and use blurred placeholders. Keep JS for home under ~150KB gzipped. Lighthouse 90+.
### Guardrails
- Original copy and placeholder photography; no real publications, sports clubs or brand names.
- No fabricated quotes attributed to real people.
- Small typed components, no `any`, visible error handling.
- Done when: all three home layouts render from the same data; archives paginate; lightbox is keyboard operable; forms validate and confirm; dark mode keeps contrast; Lighthouse accessibility 95+.