Skip to content
VibeFather
Join

About this template

A single-page sales page for an online course: a hero with the promise over a drawn video frame (poster, play affordance, duration badge) that opens an honest placeholder modal; an outcomes strip with clearly-sample figures; a six-module curriculum accordion with lessons and run times; an instructor bio told as a story with workspace imagery and no portrait; three student-result stories with sample-labeled numbers; pricing with a full-pay versus three-payment toggle and a what's-included list; a plain-language 30-day guarantee; and an eight-question FAQ. The default content sells an invented tiny-games workshop, but the anatomy suits any skill course — lettering, photography, spreadsheets: change the course name, topic, instructor and price and every module, result and answer still reads true. The look is warm workshop editorial: cream and walnut surfaces, espresso ink, one marigold accent, Domine headlines over Assistant, result figures in tabular numerals, long-scroll rhythm with quiet reveals. Photography shows desks, tools and materials with no faces and no readable text. To adapt it, swap the variables and rewrite the copy in one content file; modules, results, plans and FAQ all read from it.

The template prompt

The live demo was built from exactly this text — nothing added.

# Online Course Sales Page

Build this website exactly as described below. Replace the [VARIABLES] with your own values; keep everything else.

## Brief
A single-page sales page for [COURSE], an online course teaching [TOPIC], taught by [INSTRUCTOR], priced $[PRICE] or three payments of $[PRICE]/3-ish (plan math exact in content.ts). It must do the long-form job in one scroll: promise + video-frame hero (placeholder modal, honest), sample outcome strip, six-module curriculum accordion, instructor story, three sample results, full-pay/3-pay pricing with inclusions, a 30-day guarantee, and an eight-question FAQ. One page: index.html with sections (#curriculum, #instructor, #results, #pricing, #faq). Everything runs in the browser; nothing is submitted anywhere.

- Audience: Hobbyists and career-switchers 22–45 who have three tabs of similar courses open and a folder of abandoned projects. They buy when the curriculum proves depth, the results feel honest, and the guarantee removes the last excuse.
- Goal: Sell the enrollment. Within ten seconds a visitor knows what they'll make and that it's for beginners; within three minutes they've read two modules, one result and the guarantee.
- Tone: Encouraging and specific, like the instructor's first email to a student: concrete outcomes ('you will ship a 60-second game'), zero income claims, one warm joke per screen.

## Stack
- Framework: Vite 5 + React 18 + TypeScript
- Styling: Tailwind CSS 3.4
- Libraries: react (MIT), react-dom (MIT), motion (motion.dev, import from 'motion/react') (MIT), lucide-react (MIT), tailwindcss (MIT), postcss (MIT), autoprefixer (MIT), vite (MIT), @vitejs/plugin-react (MIT), typescript (Apache-2.0), @fontsource/domine (OFL-1.1), @fontsource-variable/assistant (OFL-1.1)
- Build: `npm run build` → static files in `dist/`. No backend, no server code, no external APIs.
- Setup:
  - Scaffold with npm create vite@latest using the react-ts template. One HTML page at the project root: index.html (entry src/main.tsx).
  - vite.config.ts: base './', plugins [react()], build { outDir 'dist', sourcemap false, assetsInlineLimit 0 }. Do not copy src/ into dist/.
  - Tailwind 3.4 through PostCSS, content ['./index.html', './src/**/*.{ts,tsx}']. In tailwind.config.ts add every color under Design to theme.extend.colors with kebab-case keys (cream, walnut, card, espresso, roast, marigold, marigold-deep, sage, rule) and fontFamily display ['Domine', 'Georgia', 'serif'], sans ['Assistant Variable', 'system-ui', 'sans-serif']. Set borderRadius DEFAULT to 14px and add maxWidth { container: '1080px' } — a letter-width read.
  - In src/fonts.ts import '@fontsource/domine/500.css', '@fontsource/domine/700.css' and '@fontsource-variable/assistant'; import src/fonts.ts and src/index.css from the entry file.
  - File layout: src/content.ts (every string, module, lesson, run time, result, plan, inclusion, FAQ answer and image path, typed), src/lib/brand.ts (courseSlug = [COURSE] lowercased with every run of non-alphanumeric characters replaced by '-', emailDomain = 'hello.' + instructorSlug + '.example' style invented address: instructor@ + courseSlug without hyphens + '.com'), src/lib/storage.ts (safe localStorage get/set wrapped in try/catch, keys prefixed with courseSlug + ':').
  - State: src/store/plan.ts is a tiny external store (useSyncExternalStore) holding { plan: 'full' | 'three' } persisted to localStorage key courseSlug + ':plan'; the pricing card, sticky CTA and final CTA all read the same plan price.
  - Components in src/components/: Header.tsx (sticky with an always-visible Enroll button reading the live plan price), Hero.tsx (VideoFrame.tsx — poster, play glyph, duration badge; PlayModal.tsx — the honest placeholder), OutcomeStrip.tsx, Curriculum.tsx (ModuleAccordion.tsx), Instructor.tsx, Results.tsx (ResultCard.tsx), Pricing.tsx (PlanToggle.tsx, IncludedList.tsx), Guarantee.tsx, Faq.tsx, FinalCta.tsx, Footer.tsx, Reveal.tsx (Motion whileInView wrapper), Eyebrow.tsx. src/pages/Home.tsx composes them.
  - Before the first build, download every image listed under Assets into public/images/ with curl -L -o using the exact file names given. The build itself never fetches anything.
  - public/favicon.svg as described under Assets. index.html: lang en, <meta name='theme-color' content='#FAF6EE'>, <link rel='icon' href='./favicon.svg' type='image/svg+xml'>, <title>[COURSE] — Learn [TOPIC] from zero</title>.
  - Write ASSETS.md at the project root as described under Assets.
  - dist/ holds index.html, hashed JS/CSS, the woff2 fonts, favicon.svg and the six images. Keep it under 10 MB.

## Variables
- [COURSE] — Course name (default: "Tiny Games Workshop"). Invented course title. Used in the title, hero, header, footer, localStorage keys and the enrollment button ('Enroll — $[PRICE]'). Never a real course.
- [TOPIC] — What it teaches (default: "making tiny 2D games from scratch"). One lowercase phrase for the skill. Drives the hero promise, module titles, two results and three FAQ answers. Keep it beginner-true (no prior experience needed).
- [INSTRUCTOR] — Instructor (default: "Theo Marsh"). The invented teacher's name. Used in the bio, the video modal ('a note from [INSTRUCTOR]'), results' context and the footer signature. Never a real person.
- [PRICE] — Full price (default: "149"). The full-payment price as digits. The three-pay plan is exactly 3 × $55 for the default ($165 total, stated plainly); if [PRICE] differs, the plan prices recompute in content.ts as round thirds + $16 with the total shown. Drives the pricing card, sticky CTA and final CTA.
- [CREDIT] — keep a small "Template by VibeFather" link to https://vibefather.ai/t/online-course-sales-page in the footer (default: yes; delete this line to remove it)

The copy under Pages & Sections is written for the default values. If your values differ, rewrite every headline, paragraph, label and image for them — same length, tone and structure. Layout, colors, type and motion stay as described.
Keep all copy, image paths and links in one content file (for example `src/content.ts`), keyed by section, so the content can be swapped later without touching components.

Pro template. The design, sections, motion and assets parts of this prompt are for Pro members. The live demo and DESIGN.md stay free.

Join Pro early access →

DESIGN.md

The design system on its own — colors, type, spacing and motion. Apply this look to a project you already have.

---
name: "Online Course Sales Page"
colors:
  cream: "#FAF6EE"
  walnut: "#EFE6D5"
  card: "#FFFEFA"
  espresso: "#2E241C"
  roast: "#5C4E40"
  marigold: "#D98A1F"
  marigold_deep: "#B8710F"
  sage: "#6E7F5E"
  rule: "#E2D8C4"
typography:
  display_h1_h2_h3_module_titles_the_course_name_price_figures: { family: "Domine", weights: [500, 700] }
  text_and_ui_body_eyebrows_buttons_accordion_lessons_faq_captions_tabular_numerals_for_run_times_and_figures: { family: "Assistant", weights: [400, 600, 700] }
spacing: "8px base unit. Container max-width 1080px, centered, side padding 48px desktop, 32px tablet, 20px under 640px. Single column with two-column hero and bio. Section vertical padding 96px desktop, 72px under 1024px, 56px under 640px. Type scale: H1 clamp(40px, 6vw, 68px) Domine 700, line-height 1.05; H2 clamp(30px, 4vw, 46px) Domine 700; H3 22px Domine 700; lead Assistant 400 18px / 1.7 Espresso at 90%; body 16px / 1.75 (max-width 66ch); eyebrow Assistant 700 12px uppercase letter-spacing 0.16em Roast, preceded by a 24px x 2px Marigold line; caption 13px Roast. Buttons: height 52px, Assistant 700 15px. Primary (Enroll): Marigold fill, Card text. Secondary: 1px Espresso/30% border, Espresso text. Inputs: none (no forms). Focus ring everywhere: 2px Marigold outline with 3px offset."
radius: "14px on cards, the video frame, accordion panels, buttons and the guarantee panel. 999px only for chips, the play circle, duration badge and module numbers."
---

# Online Course Sales Page — Design System

Apply this design system to an existing project. It describes the look and feel only; for the full site, use prompt.md.

## Colors
- **Cream** `#FAF6EE` — Page background throughout.
- **Walnut** `#EFE6D5` — Alternate section background (Curriculum, Results, FAQ), hover fill, chips.
- **Card** `#FFFEFA` — Pricing card, accordion panels, result cards, the video frame.
- **Espresso** `#2E241C` — Headlines, body text, icon color, the play glyph.
- **Roast** `#5C4E40` — Secondary text, captions, eyebrows, run-time lines.
- **Marigold** `#D98A1F` — The one accent: Enroll buttons, the play affordance, module numbers, price figures, focus ring, checkmarks.
- **Marigold Deep** `#B8710F` — Button hover and pressed, open accordion's number fill.
- **Sage** `#6E7F5E` — Quiet second color: the guarantee's shield, 'included' ticks, sample-data captions.
- **Rule** `#E2D8C4` — 1px hairlines, card borders, accordion dividers, video frame border.

## Typography
- **Display: H1, H2, H3, module titles, the course name, price figures** — Domine (OFL), weights 500/700. Self-host the font files.
- **Text and UI: body, eyebrows, buttons, accordion lessons, FAQ, captions; tabular numerals for run times and figures** — Assistant (OFL), weights 400/600/700. Self-host the font files.

## Spacing & shape
- Spacing: 8px base unit. Container max-width 1080px, centered, side padding 48px desktop, 32px tablet, 20px under 640px. Single column with two-column hero and bio. Section vertical padding 96px desktop, 72px under 1024px, 56px under 640px. Type scale: H1 clamp(40px, 6vw, 68px) Domine 700, line-height 1.05; H2 clamp(30px, 4vw, 46px) Domine 700; H3 22px Domine 700; lead Assistant 400 18px / 1.7 Espresso at 90%; body 16px / 1.75 (max-width 66ch); eyebrow Assistant 700 12px uppercase letter-spacing 0.16em Roast, preceded by a 24px x 2px Marigold line; caption 13px Roast. Buttons: height 52px, Assistant 700 15px. Primary (Enroll): Marigold fill, Card text. Secondary: 1px Espresso/30% border, Espresso text. Inputs: none (no forms). Focus ring everywhere: 2px Marigold outline with 3px offset.
- Radius: 14px on cards, the video frame, accordion panels, buttons and the guarantee panel. 999px only for chips, the play circle, duration badge and module numbers.

## Motion
- Easing: --ease-out cubic-bezier(0.22, 0.61, 0.36, 1) for reveals and accordions; --ease-io cubic-bezier(0.65, 0, 0.35, 1) for plan toggles and the modal. Warm and steady — a page you scroll with coffee.
- Reveal: blocks wrapped in <Reveal> start at opacity 0, translateY(14px) and settle over 700ms --ease-out when 15% visible (Motion whileInView, viewport once). Siblings stagger 80ms.
- Hero: H1 rises from 20px with 130ms stagger; the video frame scales from 1.03 to 1.0 over 2000ms; the play circle pulses gently (scale 1→1.06, 2400ms loop, disabled under reduced motion); the duration badge fades last.
- PlayModal: overlay Espresso at 45% fades 200ms; the Card panel rises 16px over 280ms --ease-out; content — a drawn play glyph struck through, 'The demo has no video — the real course page would play one here.' and a one-line note from [INSTRUCTOR]. Escape/overlay click closes; focus returns to the play button.
- Curriculum accordion: one module open at a time (single-open); opening slides height 0→auto 340ms --ease-io; the module number fills Marigold; lesson rows stagger in 30ms; the Plus rotates 45 degrees into an X. Run-time totals count to the module sum on open.
- PlanToggle: the sliding thumb moves 220ms --ease-io; both price figures crossfade and the savings line swaps; the header Enroll button's price crossfades in sync (shared store).
- Result cards: the sample figures count up once on reveal (700ms); the '(sample)' caption never animates.
- Guarantee: the shield icon draws once (stroke-dashoffset) when scrolled into view.
- FAQ accordions: height and opacity over 300ms --ease-io; Plus rotates.
- Sticky header: transparent over the hero with Espresso text; after 40px, Cream at 95%, blur, 1px Rule border, 250ms; the Enroll button appears at the same moment (hidden while the hero's own CTA is visible).
- Links: .link-draw grows a 1px currentColor underline over 280ms on hover and focus-visible.
- prefers-reduced-motion: reduce — no pulse, scale, counts (final values), staggers or draws; keep color/border hovers. Use CSS @media in index.css plus Motion's useReducedMotion in components.

## Imagery
Real photography only, warm and tactile, all six made for this template in one consistent style: warm desk light, cream and walnut surfaces, tools and materials, fine grain. Never a person — desks, screens with abstract color work, notebooks (blank grids, no readable text), palettes and handmade props. No readable text, logos or brand marks anywhere (screen content is abstract shapes). Every photo uses object-fit cover with the object-position given under Assets, 14px corners, no shadow; photos on Cream get a 1px Rule outline. Captions in Assistant 13px Roast. Drawn in code: the favicon, the play glyph and duration badge, module numbers, checkmarks, the guarantee shield, plan chips and dividers. Icons: lucide-react only, stroke width 1.75.

## Tone
Encouraging and specific, like the instructor's first email to a student: concrete outcomes ('you will ship a 60-second game'), zero income claims, one warm joke per screen.

---
— Prompt by VibeFather · https://vibefather.ai/t/online-course-sales-page · CC BY-NC 4.0 (non-commercial; commercial use needs a VibeFather Pro license) · Request removal: https://vibefather.ai/takedown