Template
Lintel Works
A monochrome architecture-firm website that opens on a full-bleed black-and-white building photo with a huge light-weight headline, then presents services, design philosophy with studio stats, a filterable project gallery, a blog with topic filters and a contact section. It supports light and dark modes.
Architecture practice website · Website · Portfolio · static site
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Add app screens
Pick up to 6 screens, such as a dashboard, settings or an empty state. Each is built in this design’s own palette and typefaces, with its states and guardrails.
Start from this templateRead the build prompt
Typefaces
Zen Kaku Gothic New has a light, restrained Japanese-modernist grotesk Latin that mirrors minimal architecture.
- Zen Kaku Gothic NewHeadings: hero 128px at 300 uppercase; regular 64px sections
- Zen Kaku Gothic NewBody: body 16-18px, 12px uppercase eyebrows
Who it is for
- Architecture firms and design studios
- Studios presenting multi-category portfolios
- Firms seeking residential and commercial clients
- Practices publishing case studies and insights
Layout
- Header: small caps studio name left, centered uppercase links (Work, Services, About, Blog, Contact), theme toggle icon right; translucent over hero
- Full-bleed grayscale modernist building hero with centered two-line light uppercase headline, subtitle and vertical 'Scroll' indicator
- Services: numbered list (01 Residential, 02 Commercial, 03 Renovation, 04 ...)
- About: 'Design Philosophy' heading + two paragraphs left; principles list with left rules and Founded/Projects stats right
- Selected work on light gray: 'Our Projects' with category filter and full-width project images with location/area/year/category
- Blog with topic filters
- Contact: form + details
- Footer
Palette
Minimal, serious, calm, precise, monochrome. It feels like a clean architecture monograph.
- background
#ffffff - text
#000000 - section gray
#f5f5f5 - accent gray
#f2f2f2 - decorative border
#e6e6e6 - input border (light)
#8e8e8e - label gray
#333333 - dark mode bg
#0a0a0a - dark mode muted text
#a3a3a3 - dark mode input border
#6b6b6b - hero overlay (black 60%)
#00000099
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | light: body text | 21.00:1 | 4.5:1 |
| Aa | light: text on section gray | 19.26:1 | 4.5:1 |
| Aa | light: label gray on white | 12.63:1 | 4.5:1 |
| Aa | light: label gray on section gray | 11.59:1 | 4.5:1 |
| Aa | light: white text on black button | 21.00:1 | 4.5:1 |
| light: input border | 3.28:1 | 3:1 | |
| Aa | dark: body text | 18.16:1 | 4.5:1 |
| Aa | dark: muted labels | 7.85:1 | 4.5:1 |
| Aa | dark: muted labels on muted surface | 7.30:1 | 4.5:1 |
| dark: input border | 3.72:1 | 3:1 | |
| dark: focus ring | 18.16:1 | 3:1 | |
| Aa | hero text over 60% black overlay on white-worst-case photo | 5.74:1 | 4.5:1 |
| Aa | light: text on accent gray | 18.76:1 | 4.5:1 |
As vibld’s tokens
The palette on the 15+ color tokens vibld styles a project with, each text color 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
- System sans light (300) uppercase at 128px with slight negative tracking for hero only (display size); regular weight 64px section titles (the system face is not on Google Fonts; a vibld project loads Zen Kaku Gothic New)
- Body
- System sans 16-18px at weight 400, line-height 1.6; 12px uppercase medium eyebrows with 0.1em tracking (the system face is not on Google Fonts; a vibld project loads Zen Kaku Gothic New)
Thin, large type and generous whitespace mirror minimal architecture
Spacing and imagery
Very airy; 24px page gutters on full-width layout, two-column about split, large vertical section padding (~120px), 6px radius on controls
Black-and-white photography of concrete modernist buildings, full-bleed hero and large project images
Components
- Translucent header with theme toggle
- Full-bleed hero with scroll indicator
- Numbered services list
- Philosophy split with principles
- Stats pair (founded, projects)
- Project category filter
- Project card with metadata
- Project detail page
- Blog list with topic filter
- Contact form
- Footer
Interactions
- Theme toggle light/dark
- Header becomes solid white on scroll
- Category filter updates project grid
- Hover scale/brighten on project images
- Scroll indicator animates
- Form validation with toast
Data
Project{slug, title, category, location, area, year, images[], description}Service{number, title, description}Principle{title, description}Post{slug, title, topic, date, excerpt, body}ContactMessage{name, email, 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 color 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, labeled 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 a minimal website for a fictional architecture practice called **Lintel Works**. The audience is homeowners, developers and institutions shortlisting architects. The site should communicate restraint and quality through large black-and-white photography and thin type, show services and philosophy, let visitors filter projects by type, publish articles, and take inquiries.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix Toggle Group, Select, Form, Toast), lucide-react, React Router, react-hook-form + zod, and next-themes (or a small theme hook) for light and dark mode. Framer Motion is optional, for subtle reveals. Static content in typed files or MDX; the contact form posts to one serverless function.
### Pages & layout
1. Header: small uppercase studio name left, centered uppercase links, theme toggle right; translucent gray over the hero, solid after scrolling.
2. Hero: full-bleed grayscale building photo with a 60% black overlay, a two-line light-weight uppercase headline, a one-line subtitle and a vertical "Scroll" line indicator.
3. Services: eyebrow plus heading, then a numbered list of four disciplines with short descriptions.
4. About: large "Design philosophy" heading and two paragraphs on the left; on the right, three principles with left rules and a two-stat row (founded year, project count).
5. Work (light gray band): heading, category filter (All, Residential, Commercial, Cultural, Renovation), and large project cards with location, area, year and category.
6. Project detail: hero image, metadata grid, narrative, gallery.
7. Journal: post list with topic chips; article page.
8. Contact: form and studio details; footer.
### Design system
Light tokens: `--background: #ffffff; --foreground: #000000; --muted: #f5f5f5; --accent: #f2f2f2; --border: #e6e6e6 (decorative); --input-border: #8e8e8e; --label: #333333`. Dark tokens: `--background: #0a0a0a; --foreground: #f5f5f5; --muted: #141414; --border: #262626 (decorative); --input-border: #6b6b6b; --label: #a3a3a3`. Font: Zen Kaku Gothic New 300/400/500. Scale: clamp(56px, 10vw, 128px) hero at 300 weight; 64 / 32 / 20 / 16 / 12px (the 300 weight only at 32px and above; body 16–18px at weight 400, line-height 1.6, max 70ch); eyebrows 12px uppercase, weight 500, with 0.1em tracking. Spacing: 24px gutters, 120px section padding, 64px column gap. Radius 6px on inputs and buttons, 0 on images. No shadows. Motion: 300ms fades; image hover scale 1.03 over 700ms.
### Components & interactions
- Filter: toggle group with an active underline; the URL param updates; empty state "No projects in this category yet".
- Project card: hover scale and caption brighten; focus ring; lazy image with blurred placeholder.
- Theme toggle: labeled button, respects system preference first, persists choice.
- Contact form: name, email, project type select, budget range, message; inline errors; loading; success and error toasts.
### Data & state
`Project{slug,title,category,location,areaSqm,year,cover,images[],summary,body}`, `Service{n,title,text}`, `Principle{title,text}`, `Post{slug,title,topic,date,excerpt,body}`. Filter state lives in URL params. Seed eight invented projects with plausible but fictional locations.
### Accessibility
White hero text sits on a 60% black overlay, which holds 5.7:1 for the subtitle even over a white-worst-case photo. Eyebrow text #333 on white passes easily; in dark mode labels use #a3a3a3. Inputs use #8e8e8e (light) and #6b6b6b (dark) borders so the field edges reach 3:1. The scroll indicator is decorative. The filter uses `aria-pressed`, and the result count is announced. Images need alt text describing the building. Check both themes for focus ring visibility. Verified contrast: light: body text: #000000 on #ffffff = 21.0:1; light: label gray on white: #333333 on #ffffff = 12.63:1; light: input border: #8e8e8e on #ffffff = 3.28:1; dark: muted labels: #a3a3a3 on #0a0a0a = 7.85:1; hero text over 60% black overlay on white-worst-case photo: #ffffff on #666666 = 5.74:1.
### Security
Validate the contact form with zod on the client and in the function, add a honeypot and rate limit, and never expose email-service keys. Sanitize any Markdown-rendered journal content (DOMPurify if HTML is allowed). External links use `rel="noopener noreferrer"`.
### Performance & SEO
Serve grayscale AVIF images with `srcset`; preload the hero. Code-split project and journal routes. Unique titles and descriptions, OG images per project, Organization and Article JSON-LD, sitemap. Target Lighthouse 95+ in both themes.
### Guardrails
- Use original copy and placeholder or generated architecture photos; no real firm names or buildings claimed as your work.
- Present no fabricated client testimonials as real.
- Store only inquiry fields needed.
- Keep components small and typed, never use `any`, and show errors visibly.
- Done when: the filter deep-links and shows an empty state; both themes pass AA; project pages resolve by slug; the contact form validates and blocks bots; the header stays readable over the hero and after scroll.