Skip to main content
vibld

Template

Tandem

A one-screen 'coming soon' product launch page with a two-column layout: orange 'Coming Soon' kicker, bold waitlist headline, product pitch and an inline email form on the left, and laptop plus phone device mockups on a soft gray panel on the right. It lets founders and SaaS teams collect early signups before the product exists.

Coming-soon launch page · Website · SaaS landing page · 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.

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

Google Sans is a clean, friendly platform-style sans, so the hardware teaser keeps the native product-page feel.

  • Google SansHeadings: two-line heading 40px 700 at -1.2px
  • Google SansBody: body 16px

Who it is for

  • Founders validating demand
  • SaaS teams teasing a product
  • Agencies spinning up pre-launch pages
  • Makers collecting early-access emails

Layout

  1. Left column (~40%) on white: orange 'Coming Soon.' line, black 'Join the waitlist.' headline, product description paragraph, smaller launch note in gray, 'Get early access' label, email input + orange 'Notify me' button
  2. Right column (~60%) on light gray: overlapping laptop and phone mockups showing the same art-directed image, bleeding off the right edge
  3. Stacks vertically on mobile with mockups below the form
  4. Success state after signup (toast)

Palette

Clean, optimistic, simple, product-focused, warm. Like a premium hardware teaser with a sunset glow.

  • background#ffffff
  • panel#f7f7f7
  • text#111111
  • primary/accent (warm orange)#bf4f10
  • muted text#666666
  • input border#949494

Every checked pair, measured again

SampleWhereRatioNeeds
Aabody text on white18.88:14.5:1
Aamuted note on white5.74:14.5:1
Aamuted text on gray panel5.36:14.5:1
Aawhite label on orange button4.84:14.5:1
Aaorange kicker text on white4.84:14.5:1
input border on white3.03:13:1
Aadark mode body text17.43:14.5:1
Aadark mode primary text7.78:14.5:1
Aadark mode label on primary7.78:14.5:1
Aadark mode text on panel16.13:14.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
SF Pro Display / system sans 700, 40px two-line heading with -1.2px tracking, first line in orange (SF Pro Display is not on Google Fonts; a vibld project loads Google Sans)
Body
SF Pro Text / system sans 16px (SF Pro Text is not on Google Fonts; a vibld project loads Google Sans)

Native platform system type for a clean, product-page feel; color splits the two headline lines.

Spacing and imagery

Single viewport, 40/60 split, left content vertically centered with ~66px padding, tiny 2px radius on input and button.

Photo-real laptop and phone device mockups displaying a warm sunset mountain wallpaper as a stand-in for the product UI.

Components

  • Two-tone headline
  • Product description
  • Launch note
  • Labeled email input
  • Orange submit button
  • Laptop mockup
  • Phone mockup
  • Gray showcase panel
  • Success toast
  • Dark mode tokens

Interactions

  • Email validation with inline error
  • Submit loading and success toast
  • Responsive stacking of columns
  • Hover/focus states on button and input

Data

  • Subscriber{email, created_at, source}
  • LaunchConfig{productName, pitch, launchNote, accentColor, screenshots{desktop, mobile}}

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 **Tandem**, a one-screen pre-launch page for a fictional all-in-one team workspace. Visitors arrive from social posts; in five seconds they should understand what is coming, see it on real devices and drop their email. The page must be trivial to rebrand for the next product.

### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Input, Button, Label, Form), lucide-react, react-hook-form + zod, Sonner for the success toast. No backend except a small serverless function (or a Supabase insert-only `subscribers` table) that stores emails. All copy, colors and screenshot paths come from a `launch.config.ts` file and CSS variables.

### Pages & layout
1. **Launch page (single viewport)** – desktop split 40/60.
   - Left (white): an orange line "Coming soon." directly above a black headline "Join the waitlist." (same size, bold, tight tracking); a two-sentence product pitch; a smaller gray note about perks for founding members; a visible label "Get early access"; an inline row with an email input and an orange "Notify me" button.
   - Right (very light gray panel): a laptop mockup with a phone mockup overlapping its lower-left corner, both showing product screenshots (use a bright, art-directed placeholder until real UI exists); the laptop bleeds off the right edge.
   - Mobile: stack the text first, then the mockups scaled to fit, no horizontal scroll.
2. **Privacy** – short page explaining what the email is used for.

### Design system
- Tokens: `--background: #ffffff`, `--panel: #f7f7f7`, `--foreground: #111111`, `--primary: #bf4f10`, `--primary-foreground: #ffffff`, `--muted-foreground: #666666`, `--border: #949494`, `--radius: 2px`. Dark tokens: background `#0f0f10`, panel `#18181a`, foreground `#f4f4f5`, primary `#f28a4f`, primary-foreground `#0f0f10`.
- Fonts: system UI stack (`-apple-system, "SF Pro Text", Google Sans, sans-serif`), headings 700 with -0.03em tracking. Scale: 13 / 16 / 17 / 24 / 40 / 48.
- Spacing: 8px base; left column padding 64px; 24px between blocks; input height 40px.
- Motion: mockups fade and rise 500ms on load; button hover darkens 150ms; no other animation.

### Components & interactions
Device mockup component (frame SVG + screenshot slot, `desktop` and `mobile` variants, lazy image with blur placeholder), email form (idle, focus ring, invalid "Enter a valid email", submitting with spinner and disabled button, success toast plus inline "You're on the list" text, duplicate handled gracefully, network error with retry), dark mode via `prefers-color-scheme`.

### Data & state
`Subscriber{email, createdAt, source}`; `LaunchConfig{productName, kicker, headline, pitch, note, accent, screenshots{desktop, mobile}, privacyUrl}`. Form state in react-hook-form; no global state needed. Use placeholder imagery, not real product UI from another company.

### Accessibility
The warm orange is set to `#bf4f10` so white button labels reach 4.8:1 and the orange kicker passes on white (4.8:1) and the gray panel (4.5:1). Dark mode labels on the `#f28a4f` primary are `#0f0f10` (7.8:1). Gray note `#666666` passes (5.7:1). The input border is `#949494` (3:1). Keep a real `<label>` for the email field, `autocomplete="email"`, and `aria-describedby` for errors. Success is announced in a polite live region. Device mockups have alt text describing the product view. The whole page works at 200% zoom.
Verified contrast: body text on white #111111 on #ffffff = 18.88:1; muted note on white #666666 on #ffffff = 5.74:1; muted text on gray panel #666666 on #f7f7f7 = 5.36:1; white label on orange button #ffffff on #bf4f10 = 4.84:1; orange kicker text on white #bf4f10 on #ffffff = 4.84:1.

### Security
Proportionate: zod validation on the client and the function, email normalization, honeypot field, per-IP rate limiting, optional Turnstile. If Supabase is used, RLS allows anon insert only and a unique constraint on email; no public reads. No keys other than the anon key in client code. Link to the privacy page near the form.

### Performance & SEO
One viewport, so aim for a perfect score: preload the laptop screenshot, serve AVIF/WebP at 1x/2x, system fonts (no web-font cost), JS under ~80KB. Title, description and an OG image showing the mockups. Lighthouse 100 target.

### Guardrails
- Placeholder product name, copy and screenshots; avoid brand names or trademarked device marks on the mockups.
- Don't claim fake signup counts or press mentions.
- Store only the email and timestamp.
- Small typed components, no `any`, visible errors.
- Done when: the layout matches the 40/60 split on desktop and stacks cleanly on a 360px phone; the form validates, prevents double submits and confirms; button contrast is fixed; config changes rebrand the page without touching components.

Open the builderAll templatesThis palette on its own