Skip to main content
vibld

Template

Nocturne Works

A dark, monochrome portfolio site for a branding and advertising studio. It combines a typing-animated hero, CMS-driven case studies, a process slider, a pricing calculator, a journal and testimonials, and it converts through a booking modal and a spam-protected contact form.

Monochrome branding studio portfolio · Website · Small business site · full-stack app (auth + DB)

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.

Account setup
Add edit
Analytics
Appearance
Calendar
Chat
Checklist
Checkout
Confirmation
Dashboard
Delete account
Details
Discovery questions
Empty state
Flowchart
Import export
Inbox
Integrations
Invite team
Loading
Login
Onboarding
Plans
Playground
Product tour
Referral
Search
Settings
Share
Sign up
Success
Table
Team members
Text editor
Upgrade
Usage
Verification
Welcome

Start from this templateRead the build prompt

Typefaces

Lexend Deca is an even, open geometric sans with a clean light weight, which gives the premium monochrome gallery its calm, cinematic headlines.

  • Lexend DecaHeadings: hero 60px at 300 at -1.5px, section titles 36px regular
  • Lexend DecaBody: body 16px, 12px 500 uppercase eyebrows at 0.2em

Who it is for

  • Creative and advertising agencies
  • Brand design studios
  • Freelance collectives
  • Marketing leads hiring agencies

Layout

  1. Minimal header: wordmark left, 'MENU' text button right opening a fullscreen blurred overlay nav (Home, Portfolio, Journal, Contact)
  2. Full-screen hero over dark abstract photo with faint vertical grid lines: tracked eyebrow, light-weight white headline typed letter by letter, subline, white pill 'Get in Touch', star row with social proof
  3. Selected work portfolio grid (CMS; shows empty state when no items)
  4. Why-us 3x2 dark cards with icon tiles, category eyebrow, title, one-line metric
  5. Pricing: three tiers with team-size slider and annual toggle
  6. Process slider with Ken Burns images
  7. Testimonials grid
  8. Journal (3-column blog cards)
  9. Contact form + scheduler booking modal, footer

Palette

sleek, cinematic, restrained, confident, premium. It feels like a dark gallery for brand work.

  • page black#000000
  • card surface#111111
  • icon tile#262626
  • text white#fafafa
  • muted text#a3a3a3
  • light section background#fafafa
  • ink#141414

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on black20.12:14.5:1
Aamuted text on black8.33:14.5:1
Aamuted text on card7.49:14.5:1
Aatext on icon tile14.50:14.5:1
Aamuted text on icon tile6.00:14.5:1
Aaink text on white pill button17.65:14.5:1
Aaink text on light sections17.65:14.5:1
white focus ring on black20.12:13:1
icon tile against card (boundary)14.50:13: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
Lexend Deca Light 300 (display sizes 32px+ only), 60px hero with -1.5px tracking; 36px regular section titles
Body
Lexend Deca 16px, weight 400, line-height 1.6; 12px uppercase eyebrows (2 to 3 words) at weight 500, 0.2em tracking

One family, with weight contrast (light headlines, medium labels) and tight tracking for a premium monochrome feel.

Spacing and imagery

Full-width 1232px grid, 3-column cards with 24px gaps, large 32px card radius (1rem token doubled), 120px sections, pill buttons.

Dark, warm abstract portrait photography with light streaks behind the hero; thin vertical grid lines; minimal line icons inside dark rounded tiles; case study covers.

Components

  • Text 'MENU' toggle with fullscreen overlay nav
  • Typing hero headline with blinking cursor
  • White pill CTA
  • Star social-proof row
  • Portfolio grid with empty state
  • Feature cards with icon tile + eyebrow
  • Pricing calculator (tiers, seat slider, annual toggle)
  • Process slider with Ken Burns
  • Testimonials grid
  • Journal cards with read time
  • Case study detail page
  • Booking modal (embedded scheduler)
  • Contact form with honeypot

Interactions

  • Headline types letter by letter with a blinking cursor
  • Overlay menu opens with blur and staggered links
  • Process slider autoplays with parallax zoom
  • Pricing updates live with slider and toggle
  • Scroll reveals and staggered card entrances
  • Booking opens in a modal
  • Contact submission with server validation and rate limiting

Data

  • CaseStudy{slug, title, client, category, summary, images[4], body, published}
  • Post{slug, title, excerpt, cover, category, readMinutes, body, publishedAt}
  • Testimonial{name, role, company, quote, rating, avatar}
  • PricingTier{name, basePrice, perSeat, features[]}
  • ContactMessage{name, email, company, budget, message, createdAt}

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 "Nocturne Works", a portfolio and lead-generation site for a small brand and advertising studio. It should feel like walking into a dark gallery: restrained monochrome, light-weight type and cinematic imagery. Prospects browse case studies, understand the process and price, then book a call or send a brief. Editors manage content without code.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Dialog, Slider, Switch, Card, Form, Toast), lucide-react. Framer Motion for the typing hero, overlay menu and reveals. Embla Carousel with an autoplay plugin for the process slider. TanStack Query and react-hook-form + zod. Supabase: Postgres for case_studies, posts, testimonials and contact_messages; Storage for images; Auth for the studio editors; an Edge Function for contact validation, rate limiting and email. The booking modal embeds a third-party scheduler.

### Pages & layout
1. **Header**: wordmark left; a "MENU" text button right that opens a fullscreen blurred overlay with four large links that stagger in, plus a "Close" button.
2. **Hero**: full-screen dark abstract image with faint vertical grid lines, a tracked eyebrow, a light 60px white headline typed letter by letter with a blinking cursor, a subline, a white pill "Get in touch" and a star row with a proof line.
3. **Selected work**: 2 or 3 columns of case study covers and a "View all" link, with a designed empty state.
4. **Why us**: six dark cards (icon tile, uppercase category, title, one-line metric).
5. **Pricing**: three tiers, a team-size Slider and a monthly/annual Switch showing a discount, with live totals.
6. **Process**: a full-width slider with four steps and slow zoom images.
7. **Testimonials**: grid.
8. **Journal**: three-column cards with read time.
9. **Contact**: form, "Book a call" Dialog and footer.
10. Case study detail (up to four images) and post detail pages, plus an editor dashboard for CRUD.

### Design system
Dark-first. Tokens: `--background: #000000`, `--card: #111111`, `--tile: #262626`, `--foreground: #fafafa`, `--muted: #a3a3a3`, `--paper: #fafafa` and `--ink: #141414` for light sections, `--radius: 2rem` on cards, pill buttons. Font: Lexend Deca 300/400/500 (300 only at 32px and above); hero -0.025em; eyebrows 12px uppercase at 0.2em. Scale: 60/36/24/18/16/12px. Spacing: 8px base, 120px sections, 24px gaps. No shadows; use borders `rgb(255 255 255/.06)`. Motion: typing at 40ms per character, overlay 400ms with a 60ms stagger, slider autoplay 6s.

### Components & interactions
- Typing headline: the full text is in the DOM for screen readers, and the animation is visual only.
- Overlay menu: focus trap, Escape to close, body scroll lock.
- Pricing: price is computed as `base + perSeat × seats`, with 15% off when annual; output announced via `aria-live`.
- Cards: hover lightens the border and moves the icon tile; focus-visible shows a white ring.
- Contact: inline errors, a submitting state and a success toast; rate-limit errors display a friendly retry time.
- Empty states for work, journal and testimonials.

### Data & state
Tables: `case_studies(slug, title, client, category, summary, images text[], body_md, published)`, `posts(slug, title, excerpt, cover, category, read_minutes, body_md, published_at)`, `testimonials(name, role, company, quote, rating, avatar)`, `contact_messages(id, name, email, company, budget, message, created_at)`.

### Accessibility
Muted `#a3a3a3` passes on black, card and tile surfaces. Keep focus rings white with a 2px offset. The typing and slider stop under reduced motion; the slider has pause and previous/next controls and labeled slides. Use one H1 (the headline text), card titles as H3 under section H2s, alt text on covers, and a titled booking iframe. Verified contrast: muted on black #a3a3a3 on #000000 = 8.33:1; muted on card #a3a3a3 on #111111 = 7.49:1; muted on tile #a3a3a3 on #262626 = 6.0:1; pill #141414 on #fafafa = 17.65:1.

### Security
RLS: published content is public-read, and only editors (via a `user_roles` table) can write. `contact_messages` is insert-only through the Edge Function and editor-read. Validate with zod on the client and in the function, add a honeypot and per-IP rate limit, sanitize markdown with DOMPurify, and allow uploads of images only (5 MB). Allow-list the scheduler host in the iframe and CSP, and keep service keys in function env.

### Performance & SEO
Code-split the editor, lazy-load covers and serve the hero as AVIF. Give case studies and posts their own meta and OG images, and add CreativeWork and Article JSON-LD.

### Guardrails
- Use original copy and placeholder imagery only, with no real client logos or trademarks.
- Do not present sample testimonials or stats as real.
- Store only the contact fields needed.
- Keep components small and typed, with no `any`, and show errors visibly.
- Done when: the overlay nav is accessible; the pricing math is correct; CMS content renders with empty states; the contact form is rate-limited; reduced motion disables typing and autoplay.

Open the builderAll templatesThis palette on its own