Skip to main content
vibld

Template

Turnwell

A solo coach's website with its own lightweight CMS. Visitors read the approach, browse programs and book a free intake call from real availability through a multi-step intake. The coach manages programs (drag to reorder), weekly hours, date overrides, bookings and contact messages in an admin panel.

Coaching practice site with booking and CMS · 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.

Start from this templateRead the build prompt

Typefaces

Fraunces is the soft-contrast wonky serif the design names, and PT Sans is a plain, utilitarian body for the square-cornered UI.

  • FrauncesHeadings: headline 92px 400 at -0.027em, section statements 64px
  • PT SansBody: body 16-18px, 12px uppercase eyebrows, buttons

Who it is for

  • Life and career coaches
  • Therapists and consultants with 1:1 practices
  • Prospective coaching clients
  • Solo practitioners who want to own their booking data

Layout

  1. Salmon header: serif wordmark left, links (About, Programs, Book, Contact) and a black booking button right
  2. Centered hero: tracked uppercase eyebrow, huge high-contrast serif headline, one-line subtitle, black uppercase CTA; full-width moody portrait below
  3. Three offer cards (1:1, programs, free intake)
  4. Approach split: large serif statement left, eyebrow + paragraph + arrow links right, large photo below
  5. Plan steps section
  6. Closing intake-call CTA
  7. Book page: date/time slot picker then multi-step intake
  8. Admin: bookings table with detail panel, programs editor with drag reorder, weekly availability + overrides, messages inbox, theme controls

Palette

warm, candid, bold, intimate, grounded. It is confident editorial type on a flush coral field.

  • background salmon#ff8f8a
  • ink#1e0808
  • alt light background#f1f0ec
  • text#1e1c17
  • soft pink band#ffcfcc
  • muted text#5a3a38

Every checked pair, measured again

SampleWhereRatioNeeds
Aaink text on coral8.73:14.5:1
Aamuted text on coral4.55:14.5:1
Aawhite text on black buttons19.21:14.5:1
Aabody text on paper14.93:14.5:1
Aamuted text on paper8.78:14.5:1
Aaink text on pink band13.76:14.5:1
Aamuted text on pink band7.18:14.5:1
ink focus ring on coral8.73:13:1
ink input border on paper16.84: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
Fraunces 400, 92px, tight -0.027em tracking; 64px section statements
Body
PT Sans 16 to 18px, weight 400, line-height 1.6; eyebrows 12px uppercase with 0.25em tracking; buttons short uppercase labels, bold, tracked

A soft-contrast wonky serif carries emotion; PT Sans keeps UI utilitarian. Square corners throughout.

Spacing and imagery

1216px container, 7/5 asymmetric splits, 128px section padding, 0px radius on everything, hairline dividers.

Moody, low-light portrait photography of women in introspective poses, cropped large and full-bleed; no icons beyond arrows.

Components

  • Header with black square Book button
  • Eyebrow + oversized serif hero
  • Offer cards
  • Split statement section with arrow links
  • Slot-based booking calendar
  • Multi-step intake form
  • Admin sign-in (Google or email)
  • Bookings table with search, sort and detail drawer
  • Program editor with drag-to-reorder and active toggle
  • Weekly availability grid with day toggles and date overrides
  • Contact messages inbox with status
  • Section theme switcher

Interactions

  • Pick a date then an available time; past and blocked slots disabled
  • Intake steps with validation and progress
  • Drag programs to reorder (dnd-kit), toggle active
  • Availability toggles per weekday and override dates
  • Booking status changes from admin
  • Arrow links nudge on hover
  • Section theme swap via class

Data

  • Program{id, title, summary, durationWeeks, price, active, sortOrder}
  • Availability{weekday, start, end, enabled}
  • AvailabilityOverride{date, closed, start?, end?}
  • Booking{id, slotStart, slotEnd, name, email, phone, focusArea, programId, goals, status}
  • ContactMessage{id, name, email, inquiryType, message, status}
  • AdminUser{id, 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 "Turnwell", a website and small back office for an independent life coach. Visitors should feel understood, see the offers, and book a free intake call in a real open slot with a short intake. The coach signs in to manage programs, weekly availability, bookings and messages without touching code.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Calendar, Tabs, Table, Sheet, Switch, Dialog, Toast), lucide-react, date-fns and date-fns-tz. dnd-kit for reordering programs. TanStack Query for data. react-hook-form + zod for booking, intake and contact. Supabase: Auth (Google OAuth and email/password, admin only), Postgres (programs, availability, overrides, bookings, messages), and an Edge Function that checks slot availability atomically and sends confirmation emails.

### Pages & layout
1. **Header**: serif wordmark; four links; a black square "Book →" button.
2. **Home**: a centered hero with a tracked uppercase eyebrow, a very large serif headline, a subtitle and a black uppercase CTA, followed by a full-width portrait. Then three offer cards (1:1 coaching, focused programs, free intake), an "Approach" split (large serif statement left; eyebrow, paragraph and arrow links right; big photo), a "What a plan looks like" steps section, and a closing booking CTA.
3. **About** and **Programs**: programs render from the DB in `sortOrder`, active ones only.
4. **Book**: a calendar with days that have open slots enabled, then a time-slot list, then a three-step intake (contact details; focus area and program interest; goals), then a confirmation screen.
5. **Contact**: form with an inquiry-type Select.
6. **Admin** (protected): Bookings (search, sort, status, detail Sheet with intake answers), Programs (CRUD, drag reorder, active Switch), Availability (a weekday grid of start and end times with toggles, plus a date override list), and Messages (inbox with status).

### Design system
Tokens: `--background: #ff8f8a` (coral), `--ink: #1e0808`, `--paper: #f1f0ec` (alternate sections and the admin), `--band: #ffcfcc`, `--muted: #5a3a38`, `--radius: 0`. Fonts: Fraunces 400/500 for display and PT Sans 400/500/600 for UI. Scale: 92/64/40/24/18/14/12px; display tracking -0.025em; eyebrows 12px uppercase at 0.25em. Spacing: 8px base, 128px sections, a 7/5 split grid. Buttons are square, black with white uppercase text. Motion: 200ms hovers and 400ms fades. Theme classes (`.theme-coral`, `.theme-paper`, `.theme-ink`) swap section colors.

### Components & interactions
- Slot picker: loading skeleton; days with no slots are disabled; an empty-state message; slots are shown in the visitor's timezone with the coach's timezone noted.
- Intake wizard: step indicator, Back and Next, per-step validation; submit shows a spinner; on success a confirmation screen; if a slot is taken, show "That time was just booked" and refresh.
- Program list (admin): drag handle with keyboard reordering, optimistic save, and rollback on error.
- Availability: weekday Switch plus time inputs, validated so that start is before end.
- Tables: sort headers, search, and an empty state.

### Data & state
Tables: `programs(id, title, summary, duration_weeks, price, active, sort_order)`, `availability(weekday, start_time, end_time, enabled)`, `availability_overrides(date, closed, start_time, end_time)`, `bookings(id, slot_start, slot_end, name, email, phone, focus_area, program_id, goals, status)`, `messages(id, name, email, inquiry_type, body, status)`. Slots are computed server-side. Seed fictional demo data.

### Accessibility
Ink on coral and white on ink both pass; muted `#5a3a38` is the lightest text allowed on coral. Calendar and slot buttons need full date and time labels. The drag reorder needs keyboard sensors and live announcements. Label every intake field, move focus to the step heading, and keep one H1. Respect reduced motion. Verified contrast: ink on coral #1e0808 on #ff8f8a = 8.73:1; muted on coral #5a3a38 on #ff8f8a = 4.55:1; button #ffffff on #1e0808 = 19.21:1; muted on paper #5a3a38 on #f1f0ec = 8.78:1.

### Security
RLS: `programs` are public-read for active rows, with admin-only writes. `bookings` and `messages` accept inserts only through the Edge Function, and only admins can read them. `availability` is public-read and admin-write. The admin is identified through a `user_roles` table. Validate with zod on the client and in the function, add a unique constraint on `slot_start` to prevent double-booking, and rate-limit and honeypot public forms. Keep service keys in function env. Collect minimal intake data and include a privacy notice.

### Performance & SEO
Code-split the admin. Use responsive portrait images. Add meta and OG tags per page and ProfessionalService JSON-LD.

### Guardrails
- Use original copy and placeholder imagery only, with no trademarked names.
- Do not show invented client testimonials as real.
- Store only the intake answers needed and let the coach delete them.
- Keep components small and typed, with no `any`, and show errors visibly.
- Done when: bookings only land in open slots; no double-booking is possible; admin CRUD and reorder persist; anon users cannot read bookings; the intake is fully keyboard accessible.

Open the builderAll templatesThis palette on its own