Skip to main content
vibld

Template

Inkstand Courier

A classic newspaper-style editorial site with a blackletter masthead, category navigation, breaking-news lead, daily feed and featured story grids. It is meant for independent publishers and small newsrooms that want an old-print look with around 18 page types, six sections and sample articles.

Traditional newspaper website · 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

Blackletter nameplate, a true Bodoni for headlines and a slab body reproduce the traditional broadsheet hierarchy.

  • UnifrakturMaguntiaHeadings: nameplate only, 72px
  • Libre BodoniHeadings: headlines and uppercase section heads 700
  • Roboto SlabBody: body and meta 16px

Who it is for

  • Independent publishers and journalists
  • Local and niche news outlets
  • Agencies building media sites
  • Bloggers wanting a newspaper aesthetic

Layout

  1. Top utility bar: date left, HOME / POLITICS / OPINION / CONTACTS links right
  2. Centered blackletter masthead
  3. Ruled main nav in small bold uppercase with search icon
  4. Four-up headline ticker row with red category kickers
  5. Two-column lead: BREAKING NEWS large grayscale photo + story left, DAILY FEED list (kicker, headline, dek) right
  6. Article list with date, category and byline meta, separated by rules
  7. FEATURED STORIES heading with red rule and a 3-up grayscale image grid
  8. Newsletter signup block, related articles sidebar on article pages
  9. Footer with social links; cookie notice bar in orange

Palette

Traditional, authoritative, warm, nostalgic, print-like. It evokes a morning paper on cream stock with red ink kickers.

  • background (newsprint cream)#fffbe5
  • text#000000
  • primary (burnt orange)#b55a0f
  • kicker red#d0021b
  • secondary (straw)#f8d57c
  • accent (blue)#436d9d
  • border/dek brown#8a5a2b

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on cream20.18:14.5:1
Aakicker red token on cream7.05:14.5:1
Aakicker red (palette) on cream5.45:14.5:1
Aamuted dek text on cream6.79:14.5:1
Aabrown dek/meta on cream5.64:14.5:1
Aaburnt-orange primary text on cream4.55:14.5:1
Aawhite label on burnt-orange cookie bar and buttons4.74:14.5:1
Aablack text on straw secondary14.80:14.5:1
blue focus outline on cream5.16:13:1
newsletter input border on cream5.64:13: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
UnifrakturMaguntia blackletter masthead 72px; Libre Bodoni 700 uppercase section heads (30px, +0.75px tracking) and headline serif
Body
Roboto Slab 16px, deks in warm brown

Blackletter for nameplate, didone for headlines, slab for body replicates a traditional broadsheet hierarchy.

Spacing and imagery

Full-width 1250px container with 16px gutters, hairline rules between rows, 2/3 + 1/3 lead split, 3-col features; square corners.

News photography rendered in grayscale that shifts to color on hover; large lead image, 3-up feature thumbnails.

Components

  • Utility date bar
  • Blackletter masthead
  • Uppercase ruled nav with search
  • Headline ticker row
  • Category kicker labels
  • Lead story block
  • Daily feed list
  • Article meta line (date · category · byline)
  • Featured stories grid
  • Newsletter signup
  • Related articles sidebar
  • Image carousel gallery
  • Cookie consent bar

Interactions

  • Grayscale-to-color image hover
  • Progressive 'load more' articles
  • Search toggle
  • Responsive collapsing nav into a drawer
  • Carousel gallery navigation
  • Cookie accept dismissal
  • Newsletter submit feedback

Data

  • Article{slug, title, dek, body, category, author, publishedAt, image, featured, breaking}
  • Category{slug, name}
  • Author{name, bio}
  • Subscriber{email}

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 **Inkstand Courier**, a newspaper-style editorial website for a fictional independent daily. Readers are people who like the ritual of a print front page. The site must organize ~35 articles into six sections, surface a breaking lead and a running daily feed, and invite newsletter signups, all with a convincing broadsheet look.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Sheet, Dialog, Input, Button), lucide-react, React Router for ~18 routes. Embla Carousel for the photo gallery post type, react-hook-form + zod for newsletter and contact forms, Sonner for toasts. Content as typed MDX or JSON files; no database. A serverless function only if the newsletter needs to post somewhere.

### Pages & layout
1. **Home** – utility bar (today's date, a few links); centered blackletter nameplate; ruled uppercase nav with search icon; four-up headline strip with red kickers; lead row: "Breaking News" with a large photo, headline and dek on the left (2/3), "Daily Feed" list on the right (1/3); a ruled list of recent stories with date · category · byline; "Featured Stories" with a red rule and three image cards; newsletter band; footer.
2. **Section pages** (Politics, Technology, Sports, Fashion, Food, Opinion) – section header, lead story, paginated list with "Load more".
3. **Article** – kicker, headline, dek, byline and date, hero image with caption, body with pull quotes, related-articles sidebar, share links.
4. **Post-type demos** – gallery post, video post, quote post. **Contact**, **About**, 404.

### Design system
- Tokens: `--background: #fffbe5`, `--foreground: #000000`, `--primary: #b55a0f`, `--kicker: #b0001a`, `--secondary: #f8d57c`, `--accent: #436d9d`, `--border: #d2c2ac` (decorative rules), `--input-border: #8a5a2b`, `--muted-foreground: #7a4f25`.
- Fonts: UnifrakturMaguntia (nameplate only), Libre Bodoni 700 (headlines, uppercase section heads with +0.03em tracking), Roboto Slab (body, meta). Scale: 12 (kicker, uppercase +0.1em) / 13 / 16 / 20 / 24 / 30 / 44 / 72.
- Layout: 12-col grid, 1248px max, 16px gutters, 1px rules between items, square corners, no shadows.
- Motion: image filter grayscale(100%) to 0 over 400ms ease; nav drawer 250ms.

### Components & interactions
Nameplate, nav (active section underline, focus), search dialog (empty, results, no results), kicker label, story card variants (lead, list, thumbnail, text-only), byline meta, load more (idle/loading/end of list), newsletter (validation, success, error), related list, gallery carousel (arrows, keyboard, counter), cookie notice (accept persists), skeletons while content loads.

### Data & state
`Article{slug,title,dek,body,category,authorId,publishedAt,image{src,alt,caption},isBreaking,isFeatured,type:'standard'|'gallery'|'video'|'quote'}`, `Author{id,name,bio}`, `Category{slug,name}`. Load from content files; derive feeds by date. Seed 35 fictional articles with neutral topics and invented reporter names; use placeholder photos.

### Accessibility
Black on cream is ~20:1; the kicker red `#b0001a` on cream is 7.05:1; the burnt-orange primary is darkened to `#b55a0f` so it passes as text on cream (4.55:1) and with white labels on the cookie bar and buttons (4.74:1). The newsletter input uses `--input-border: #8a5a2b` (5.6:1) because the `#d2c2ac` rule colour is decorative. Blackletter is decorative: give the nameplate a plain-text accessible name and never use it for body text. One `h1` per page, logical heading order, `<article>`, `<nav>`, `<main>` landmarks. Grayscale images still need meaningful alt text; captions use `<figcaption>`. Visible focus outlines in blue `#436d9d`.
Verified contrast: body text on cream #000000 on #fffbe5 = 20.18:1; kicker red token on cream #b0001a on #fffbe5 = 7.05:1; kicker red #d0021b on #fffbe5 = 5.45:1; muted dek text on cream #7a4f25 on #fffbe5 = 6.79:1; brown dek/meta on cream #8a5a2b on #fffbe5 = 5.64:1; burnt-orange primary text on cream #b55a0f on #fffbe5 = 4.55:1.

### Security
Proportionate for a static site: zod validation on newsletter/contact, honeypot plus server-side rate limiting if posted, no secrets in client code, sanitize any HTML article bodies with DOMPurify, and `rel="noopener noreferrer"` on social links. Cookie notice should not load trackers before consent.

### Performance & SEO
Pre-render article routes or use SSG; NewsArticle JSON-LD, canonical URLs, OG images per article, RSS feed, sitemap. Lazy-load images below the lead, subset the blackletter font to the nameplate glyphs. Lighthouse 90+.

### Guardrails
- Original articles and placeholder imagery; no real publications, logos or journalists.
- No fabricated quotes attributed to real people.
- Small typed components, no `any`, visible errors.
- Done when: home, six sections, article and post-type routes all render; load more paginates to an end state; grayscale hover is disabled with reduced motion; newsletter validates; each article has correct meta and JSON-LD.

Open the builderAll templatesThis palette on its own