Skip to main content
vibld

Template

Hollis Fern

A warm, story-driven website for a folk singer-songwriter. It opens on a serene sunset-over-water hero with a serif name, then offers a carousel of 'latest stories' cards (a song, a video, a tour date, a merch drop), with inner pages for releases, videos, merch, info and a newsletter signup.

Folk songwriter website · Website · Portfolio · front-end app (local state)

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

Lora and Caveat keep the porch-at-dusk liner notes, and Alegreya Sans is a warmer, more handmade humanist body than Source Sans 3.

  • LoraHeadings: hero name 96px bold at -2.4px, italic tagline
  • Alegreya SansBody: body 16px at 1.6, slight positive tracking
  • CaveatHandwriting: handwritten liner-note accents

Who it is for

  • Folk and Americana singer-songwriters
  • Independent artists moving fans off social media
  • Musicians selling merch without a label
  • Fans attending intimate venue shows

Layout

  1. Transparent header: serif name left, small-caps serif nav (Home, Music, Videos, Merch, Info, Newsletter) right with underline on active
  2. Full-viewport long-exposure sunset seascape hero with centered serif name and italic tagline
  3. 'Latest stories' horizontal carousel of paper-toned cards: handwritten script eyebrow, serif title, short excerpt, rust-colored action link (Listen/Watch/Tickets/Shop)
  4. Dark brown band behind carousel
  5. Footer over photo: rule, serif name, row of platform links in tracked caps, italic copyright
  6. Inner pages: album release pages, tour dates with door times/support/age, video gallery, merch with sizes and stock badges, info, newsletter

Palette

Warm, intimate, nostalgic, handcrafted, calm. It feels like a porch at dusk with a notebook of songs.

  • background (paper)#f8f5f1
  • text#2f2823
  • muted text (excerpts, meta)#786d63
  • primary rust#964c2c
  • cream on photo / on rust#f7f1de
  • sage secondary#d1d7cc
  • wheat accent#e0ceae
  • card#f6f2ea
  • dark wood band#2a1a12
  • input border#9d8874
  • photo scrim (wood brown 65%)#2a1a12a6

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on paper background13.34:14.5:1
Aatext on cards12.98:14.5:1
Aamuted excerpts on cards4.51:14.5:1
Aarust link on cards5.59:14.5:1
Aarust link on paper5.74:14.5:1
Aacream text on rust button5.52:14.5:1
Aacream text on dark wood band14.81:14.5:1
Aatext on sage chip9.87:14.5:1
Aatext on wheat badge9.39:14.5:1
Aahero/nav cream text over 65% wood-brown scrim on white-worst-case photo4.64:14.5:1
newsletter input border on paper3.11:13:1
rust focus ring on cards5.59:13:1
Aatext on muted surface11.15:14.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
Lora bold, 96px with -2.4px tracking for the hero name; Lora italic tagline
Body
Alegreya Sans at 16px, line-height 1.6, with slight positive tracking; Caveat handwritten script for card eyebrows at 24px+ only

Bookish serif + friendly humanist sans + handwritten accent evokes liner notes and journals

Spacing and imagery

Comfortable; ~1150px container with 96px side margins, cards ~320px wide with 24px gaps and 8px radius, full-bleed photographic sections

Long-exposure sunset seascape as hero and footer backdrop; card thumbnails of cabins, vinyl and landscapes with soft vintage paper texture

Components

  • Transparent serif header
  • Photo hero with serif title
  • Stories carousel
  • Paper card with script eyebrow
  • Rust action link with arrow
  • Album release page with tracklist
  • Tour list with door time/support/age
  • Video gallery with custom thumbnails
  • Merch cards with size and stock badges
  • Newsletter signup form
  • Platform link footer

Interactions

  • Carousel drag/swipe with snap
  • Card hover lifts and arrow nudges
  • Active nav underline
  • Page fade transitions
  • Video thumbnail opens embed
  • Newsletter submit with success toast
  • Stock badges (in stock / low / sold out)

Data

  • Story{kind: song|video|tour|merch, title, excerpt, image, href}
  • Album{title, releaseDate, cover, tracks[], links}
  • Show{date, venue, city, doors, support, age, priceAdv, priceDoor, ticketUrl}
  • Video{title, youtubeId, thumbnail, location}
  • MerchItem{name, price, sizes[], stock, image}
  • 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 a website for a fictional folk singer-songwriter called **Hollis Fern**. The audience is listeners who found them at a small show or on social media and want to hear more, buy a record, or join the mailing list. The site should feel handmade and quiet, like liner notes, while still handling releases, shows, videos, merch and a newsletter.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Radix), lucide-react, React Router, Embla Carousel for the stories row, Framer Motion for gentle fades, and react-hook-form + zod for the newsletter. The newsletter is the only backend need: a Supabase table or a single edge function that forwards to an email provider.

### Pages & layout
1. Header: serif name left and small-caps serif links right, transparent over the hero, with an underline on the active page.
2. Hero: full-viewport long-exposure dusk seascape, the name centered in large bold serif, and an italic subtitle.
3. Latest stories: a dark wood-brown band holding a swipeable row of paper-colored cards. Each card has a handwritten eyebrow ("Latest song", "Recent video", "Tour date", "New merch"), a serif title, a two-line excerpt, and a rust link (Listen, Watch, Tickets, Shop).
4. Newsletter strip with one email field.
5. Footer over the photo with the same 65% wood-brown overlay: hairline rule, name, and a row of platform links in tracked caps.
6. Music: album pages with artwork, tracklist, release date and platform links.
7. Shows: date, venue, doors time, support act, age limit, advance and door prices, ticket link.
8. Videos (YouTube thumbnails with play overlay), Merch (sizes, stock badge), and Info (bio, press photo, booking).

### Design system
Tokens: `--background: #f8f5f1; --foreground: #2f2823; --primary: #964c2c; --primary-foreground: #f7f1de; --secondary: #d1d7cc; --accent: #e0ceae; --muted: #e6e1db; --border: #d9d1c9 (decorative dividers); --input-border: #9d8874; --muted-foreground: #786d63; --card: #f6f2ea; --band: #2a1a12`. Fonts: Lora (600/700, italic), Alegreya Sans (400/600), and Caveat for eyebrows only, set at 24px or larger with a Source Sans fallback and a readable text label for assistive tech. Scale: clamp(56px, 8vw, 96px) hero; 32 / 22 / 16 / 13px (13px only for meta at weight 400+; body 16px, line-height 1.6, max 68ch). Spacing: 8px base, 96px section padding. Radius 8px on cards; soft shadow `0 10px 30px -12px rgb(47 40 35 / .35)`. Add a subtle paper-grain texture to cards. Motion: 400ms ease-out fades. Light theme with dark photographic bands.

### Components & interactions
- Story card: hover lifts 4px and the arrow shifts right; focus ring in rust; a skeleton while images load.
- Carousel: arrows and dots, keyboard arrows, snap scrolling on touch.
- Show row: sold-out shows keep the row but disable the link and show a text badge.
- Merch: size chips with a disabled state for sizes that are out; badges for In stock, Low stock and Sold out.
- Newsletter: inline validation, loading state, success message, and a friendly error with retry.

### Data & state
`Story{kind,title,excerpt,image,href}`, `Album{slug,title,date,cover,tracks[],links}`, `Show{date,venue,city,doors,support?,age,priceAdv,priceDoor,ticketUrl?,status}`, `Video{title,youtubeId,thumb}`, `MerchItem{name,price,sizes[],stock,image,url}`, `subscribers(email unique, created_at)`. Seed with invented small-town venues.

### Accessibility
Cream #f7f1de text on the sunset photo sits on a wood-brown overlay (#2a1a12 at 65%), which keeps the subtitle, nav and footer links at 4.6:1 or better even over the brightest sky. Rust #964c2c on #f6f2ea is 5.6:1 and is fine for links; muted excerpts use #786d63; the newsletter input uses the #9d8874 border. Script eyebrows are decorative; duplicate their meaning in readable text or `aria-label`. Carousel needs labelled slides and pause-free manual control. Newsletter input needs a visible label, not just a placeholder. Verified contrast: body text on paper background: #2f2823 on #f8f5f1 = 13.34:1; rust link on cards: #964c2c on #f6f2ea = 5.59:1; hero/nav cream text over 65% wood-brown scrim on white-worst-case photo: #f7f1de on #756a65 = 4.64:1.

### Security
Validate email with zod on the client and in the edge function; add a honeypot and rate limiting per IP; enable RLS on `subscribers` so the anon role can insert only and never select. Use a double opt-in email. External links get `rel="noopener noreferrer"`. Keep provider API keys in edge-function env.

### Performance & SEO
Compress the hero photo (AVIF, under 250 KB) and reuse it for the footer; lazy-load card images; code-split inner routes. MusicGroup and Event JSON-LD; per-page OG images. Target Lighthouse 95+.

### Guardrails
- Use original lyrics-free copy and placeholder photography; no real artist names or logos.
- Don't invent fan quotes presented as real.
- Store only email addresses, with consent.
- Keep components small and typed, never use `any`, and show errors visibly.
- Done when: the stories carousel works by touch, mouse and keyboard; the newsletter blocks duplicates and bots; show rows display doors, support and age; hero text meets contrast; the header never overlaps the carousel cards when scrolled.

Open the builderAll templatesThis palette on its own