@ericrisco/rsc 3.1.4 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +11 -7
  2. package/manifest.json +17 -68
  3. package/package.json +6 -1
  4. package/scripts/design-upstream.js +92 -0
  5. package/scripts/doctor.js +0 -24
  6. package/scripts/lib/default-skill-floor.js +5 -1
  7. package/scripts/lib/domains.js +2 -2
  8. package/scripts/lib/recommend.js +1 -3
  9. package/scripts/lib/retired-skills.js +7 -1
  10. package/skills/design/IMPECCABLE-LICENSE.txt +191 -0
  11. package/skills/design/SKILL.md +79 -328
  12. package/skills/design/THIRD_PARTY.md +26 -0
  13. package/skills/design/engine/LICENSE +21 -0
  14. package/skills/design/engine/RUN.md +515 -0
  15. package/skills/design/engine/UPSTREAM.json +4 -0
  16. package/skills/design/engine/assets/app.css +216 -0
  17. package/skills/design/engine/assets/base.css +105 -0
  18. package/skills/design/engine/assets/base.js +37 -0
  19. package/skills/design/engine/assets/charts.js +617 -0
  20. package/skills/design/engine/assets/scenes/stage.css +28 -0
  21. package/skills/design/engine/assets/scenes/stage.js +133 -0
  22. package/skills/design/engine/library/app.json +1327 -0
  23. package/skills/design/engine/library/directions.json +1078 -0
  24. package/skills/design/engine/library/heroes.json +1086 -0
  25. package/skills/design/engine/library/motions.json +92 -0
  26. package/skills/design/engine/library/palettes.json +1485 -0
  27. package/skills/design/engine/library/photos.json +7240 -0
  28. package/skills/design/engine/library/sections.json +4429 -0
  29. package/skills/design/engine/library/sites.json +8350 -0
  30. package/skills/design/engine/library/type.json +2024 -0
  31. package/skills/design/engine/references/app-screens.md +1199 -0
  32. package/skills/design/engine/references/colour.md +141 -0
  33. package/skills/design/engine/references/copy.md +177 -0
  34. package/skills/design/engine/references/critique.md +182 -0
  35. package/skills/design/engine/references/imagery.md +791 -0
  36. package/skills/design/engine/references/layout.md +292 -0
  37. package/skills/design/engine/references/motion.md +980 -0
  38. package/skills/design/engine/references/research.md +356 -0
  39. package/skills/design/engine/references/scenes.md +174 -0
  40. package/skills/design/engine/references/tells.md +115 -0
  41. package/skills/design/engine/references/type.md +170 -0
  42. package/skills/design/engine/scripts/assets.mjs +865 -0
  43. package/skills/design/engine/scripts/draw.mjs +584 -0
  44. package/skills/design/engine/scripts/inspect.mjs +303 -0
  45. package/skills/design/engine/scripts/lib/app-draw.mjs +203 -0
  46. package/skills/design/engine/scripts/lib/cdp.mjs +248 -0
  47. package/skills/design/engine/scripts/lib/probe.mjs +909 -0
  48. package/skills/design/engine/scripts/lib/rules.mjs +243 -0
  49. package/skills/design/engine/scripts/lint.mjs +119 -0
  50. package/skills/design/engine/scripts/scenes.mjs +124 -0
  51. package/skills/design/evals/cases.yaml +35 -46
  52. package/skills/design/references/design-md.md +49 -0
  53. package/skills/design/references/finish-review.md +46 -0
  54. package/skills/design/references/modes.md +51 -0
  55. package/skills/expo/SKILL.md +3 -4
  56. package/skills/marketing/references/landing-copy.md +2 -2
  57. package/skills/react/SKILL.md +2 -2
  58. package/skills/react-native/SKILL.md +3 -3
  59. package/skills/suggest/SKILL.md +12 -8
  60. package/skills/suggest/evals/cases.yaml +6 -0
  61. package/skills/swift-ios/SKILL.md +1 -1
  62. package/skills/ui-engineering/SKILL.md +3 -4
  63. package/skills/ui-engineering/evals/cases.yaml +2 -2
  64. package/skills/variant-explorer/SKILL.md +4 -4
  65. package/skills/variant-explorer/evals/cases.yaml +1 -1
  66. package/targets/clone-bootstrap.mjs +1 -1
  67. package/scripts/lib/design-identity.js +0 -117
  68. package/scripts/lib/starting-point.js +0 -314
  69. package/skills/design/evals/README.md +0 -53
  70. package/skills/design/references/ai-tells.md +0 -75
  71. package/skills/design/references/brand-grounding.md +0 -197
  72. package/skills/design/references/copywriting-frameworks.md +0 -138
  73. package/skills/design/references/design-systems.md +0 -49
  74. package/skills/design/references/inspiration-sources.md +0 -96
  75. package/skills/design/references/landing-anatomy-and-cro.md +0 -202
  76. package/skills/design/references/motion-and-interaction.md +0 -232
  77. package/skills/design/references/research-method.md +0 -154
  78. package/skills/design/references/signature-and-craft.md +0 -148
  79. package/skills/design/references/starting-point.md +0 -75
  80. package/skills/design/references/trends-2026.md +0 -80
  81. package/skills/design/references/visual-system.md +0 -237
  82. package/skills/design/scripts/verify.sh +0 -357
  83. package/skills/design-dna/PROMPT.md +0 -211
  84. package/skills/design-dna/SKILL.md +0 -162
  85. package/skills/design-dna/design-dna.schema.json +0 -230
  86. package/skills/design-dna/evals/README.md +0 -64
  87. package/skills/design-dna/evals/cases.yaml +0 -68
  88. package/skills/design-dna/references/method.md +0 -436
  89. package/skills/design-dna/scripts/emit.py +0 -164
  90. package/skills/design-dna/templates/PROMPT.md.tmpl +0 -42
  91. package/skills/design-dna/templates/SKILL.md.tmpl +0 -42
  92. package/skills/design-dna/templates/check.py.tmpl +0 -143
  93. package/skills/design-loop/SKILL.md +0 -160
  94. package/skills/design-loop/evals/README.md +0 -56
  95. package/skills/design-loop/evals/cases.yaml +0 -60
  96. package/skills/motion-craft/SKILL.md +0 -125
  97. package/skills/motion-craft/evals/cases.yaml +0 -38
  98. package/skills/motion-craft/scripts/verify.sh +0 -75
@@ -1,138 +0,0 @@
1
- # Conversion Copywriting Frameworks
2
-
3
- The marketing-copy engine. Copy carries the value prop — the prettiest hero fails if the words are vague. Write benefit-led, specific, and human. The `marketing` skill is the canonical owner of the WORDS (voice, full landing copy, launch, channel adaptation) and grounds them in the same `02-DOCS/wiki/brand/` study; this file is the design-side quick reference that makes on-page copy convert and keeps it in sync with the design. For anything beyond the hero/section copy, hand off to `marketing`.
4
-
5
- ## The 5s value-prop test
6
-
7
- A stranger reads the hero and, within 5 seconds, can answer: **what is it, who is it for, why is it better?** If any answer is missing, the copy fails — rewrite before you touch the layout.
8
-
9
- Build the value prop from a value-proposition canvas: map the customer's jobs/pains/gains, then your pain-relievers/gain-creators, then compress the strongest match into a headline.
10
-
11
- ```text
12
- VALUE-PROP CANVAS — Driftway (preview-environment CLI)
13
- Customer jobs ...... ship a branch for review without breaking staging
14
- Customer pains ..... staging is a shared queue; manual env setup eats an afternoon
15
- Customer gains ..... reviewers click a link and see the real change
16
- Pain relievers ..... one CLI command spins an isolated env; auto-teardown
17
- Gain creators ...... every PR gets a live preview URL automatically
18
- Headline ........... "Preview every branch — no staging queue"
19
- Subhead ............ "One command gives every pull request a live URL. For platform teams who are done babysitting staging."
20
- ```
21
-
22
- ## Frameworks with picker
23
-
24
- Pick the framework by traffic temperature and funnel position.
25
-
26
- - **PAS (Problem-Agitate-Solution)** — pain-aware cold traffic that already feels the problem.
27
- - **AIDA (Attention-Interest-Desire-Action)** — broad / top-of-funnel where you must earn attention first.
28
- - **FAB (Feature-Advantage-Benefit)** — feature sections; translate capability into outcome.
29
- - **BAB (Before-After-Bridge)** — show the transformation; strong for case studies.
30
- - **JTBD (Jobs To Be Done)** — frame the product as the tool that gets a specific job done.
31
-
32
- ```text
33
- PAS rewrite
34
- Bad — "Our platform streamlines environment management."
35
- Good — "Staging is a queue. Every merge waits behind someone else's broken branch.
36
- Driftway gives each PR its own environment — no queue, no waiting."
37
- ```
38
-
39
- ```text
40
- AIDA rewrite
41
- Bad — "Sign up for our developer tool today."
42
- Good — "See your branch live in 30 seconds (Attention). It runs as one CLI step in
43
- your existing pipeline (Interest). Reviewers click a real URL, not a screenshot
44
- (Desire). Start free — no credit card (Action)."
45
- ```
46
-
47
- ```text
48
- FAB rewrite
49
- Bad — "Includes automatic environment teardown."
50
- Good — "Environments tear down automatically when the PR merges (Feature → Advantage),
51
- so you never pay for idle infra or clean up by hand (Benefit)."
52
- ```
53
-
54
- ```text
55
- BAB rewrite
56
- Bad — "Improve your review workflow."
57
- Good — "Before: reviewers guess from a diff (Before). After: they click a live URL and
58
- test the real thing (After). Driftway builds that URL on every push (Bridge)."
59
- ```
60
-
61
- ```text
62
- JTBD rewrite
63
- Bad — "A powerful preview platform for modern teams."
64
- Good — "When a teammate opens a PR, you want to test the actual change in seconds —
65
- Driftway gives that PR a live environment automatically."
66
- ```
67
-
68
- ## Headline formulas
69
-
70
- | Formula | Pattern | Example |
71
- | --- | --- | --- |
72
- | Outcome + timeframe | `<Outcome> in <time>` | "Preview every branch in 30 seconds" |
73
- | X without Y | `<Gain> without <pain>` | "Live previews without a staging queue" |
74
- | JTBD | `When <trigger>, <product> <gets job done>` | "When you open a PR, get a live URL automatically" |
75
- | Specificity | Replace adjectives with numbers | "Cut review setup from 20 min to 30 sec" |
76
-
77
- The subhead's job: state **who** it's for, **how** it works in one clause, and **proof** if you have it. Specificity beats cleverness — a clear claim outconverts a clever pun every time.
78
-
79
- ## Benefit-led specificity
80
-
81
- Climb the ladder feature → benefit → proof. Stop at the rung the visitor cares about (the benefit), and back it with the proof rung.
82
-
83
- ```text
84
- Feature ... "Isolated per-branch environments."
85
- Benefit ... "Reviewers test the real change, not a screenshot."
86
- Proof ..... "Northwind cut review setup from 20 min to 30 sec across 40 engineers."
87
- ```
88
-
89
- Numbers and receipts outperform adjectives. "Fast" is a claim; "30 seconds" is evidence.
90
-
91
- ## Microcopy & CTA copy
92
-
93
- Buttons use value verbs; forms label clearly; states stay human.
94
-
95
- | Context | Bad | Good |
96
- | --- | --- | --- |
97
- | Primary CTA | "Submit" | "Start free" |
98
- | Secondary CTA | "Learn more" | "See a 2-min demo" |
99
- | Form label | "Email" placeholder only | "Work email" with persistent label |
100
- | Empty state | "No data" | "No previews yet — push a branch to create one" |
101
- | Loading | "Loading..." | "Spinning up your environment…" |
102
- | Error | "Something went wrong" | "Couldn't reach the API. Retry, or check status.acme.example." |
103
-
104
- ## Voice/tone system
105
-
106
- Define a reusable VOICE block once and apply it everywhere. If a brand study exists under `02-DOCS/wiki/brand/voice.md` (owned by `marketing`), consume its profile verbatim; otherwise fill this and persist it back to the brand study:
107
-
108
- ```text
109
- VOICE
110
- Persona ...... a senior engineer who respects your time
111
- Tone sliders . formal ⟵───●──── casual | serious ●──────── playful | dense ───●───── airy
112
- Do ........... lead with the outcome; use concrete numbers; short sentences; active voice
113
- Don't ........ hype words; bait questions; em-dash-stacked run-ons; forced lowercase
114
- Reading level 8th–10th grade; one idea per sentence
115
- ```
116
-
117
- ## The ban-list
118
-
119
- State once, enforce everywhere. These signal AI-template copy and erode trust:
120
-
121
- `revolutionary` · `game-changer` · `cutting-edge` · "In today's landscape" · `unlock` · `seamless` · `elevate` · `supercharge` · bait questions ("Tired of slow deploys?") · "not X, just Y" · forced lowercase as a style · "Excited to share".
122
-
123
- The `marketing` skill is the canonical owner of voice and distribution; this ban-list is the on-page enforcement of its rules.
124
-
125
- ## SEO-aware copy
126
-
127
- A structural constraint, not a keyword strategy — defer depth (keyword research, GEO, technical SEO) to the `marketing` sibling skill, which carries SEO/GEO.
128
-
129
- - Title 50–60 characters; meta description 120–160.
130
- - Put the primary keyword in the `<h1>` naturally, not stuffed.
131
- - Use scannable `<h2>`/`<h3>` subheads that double as answers to likely queries.
132
- - Front-load the benefit in the first 160 characters so search snippets read well.
133
-
134
- ## See Also
135
-
136
- - `landing-anatomy-and-cro.md` — where each piece of copy lands on the page.
137
- - `brand-grounding.md` — where the voice/positioning that drives this copy is captured and persisted.
138
- - `../../marketing/SKILL.md` — canonical owner of voice, full landing copy, launch, channel adaptation, and SEO/GEO + keyword research.
@@ -1,49 +0,0 @@
1
- # When the brief is a design system, not an aesthetic
2
-
3
- This skill's default is Tailwind v4 + Next.js, and for most briefs that is right. But some
4
- briefs correspond to a **maintained, official design system**, and there the correct answer is
5
- to install it. Recreating its CSS by hand produces something that looks like it, fails its
6
- accessibility work, and drifts on its next release.
7
-
8
- The list is deliberately short: only the cases where using the official package is
9
- **obligatory or strongly expected**, and where the default instinct would be to hand-roll it.
10
- Free choices (Bootstrap, Material for a non-Google product, Radix Themes, shadcn/ui) are not
11
- here — they are ordinary picks, and shadcn/ui in particular is already this skill's territory,
12
- where the rule is simply never to ship it in its default state.
13
-
14
- | The brief reads as | Install | Why it is not a choice |
15
- | --- | --- | --- |
16
- | A UK public-sector service | `govuk-frontend` | Expected by the Service Standard; deviating is a finding at assessment |
17
- | A US federal or trust-first public service | `uswds` | Same, under the US Web Design System |
18
- | A Shopify admin surface or embedded app | `@shopify/polaris` (or Polaris web components) | Required for admin UI to be accepted |
19
- | IBM-flavoured enterprise or dense analytics | `@carbon/react` + `@carbon/styles` | Mature data-density patterns you will otherwise reinvent badly |
20
- | An Atlassian / Jira-adjacent product surface | `@atlaskit/*` + `@atlaskit/tokens` | Official DS; token-driven theming |
21
- | A GitHub-style devtool or community page | `@primer/css`, or `@primer/react-brand` for marketing | Official Primer; the Brand variant is the marketing half |
22
- | A Microsoft / Fluent-flavoured product | `@fluentui/react-components` | Official Fluent, Microsoft tokens, accessibility already done |
23
-
24
- ## The three rules that come with them
25
-
26
- 1. **Do not recreate it.** If the brief names one of these, install the package. Importing its
27
- tokens and then overriding ninety percent of them is the same mistake with extra steps.
28
- 2. **One system per project.** No Fluent components inside a Carbon tree, no shadcn/ui
29
- dropped into a Material app. Mixing two systems produces a third, worse one.
30
- 3. **Name what is an approximation.** When the brief is an *aesthetic* rather than a system —
31
- glassmorphism, bento tiles, brutalism, editorial, aurora gradients, kinetic type — there is
32
- no official package, and saying so is part of the work. Apple's Liquid Glass is documented
33
- for Apple platforms only: there is no official web implementation, so a web version is a
34
- `backdrop-filter` approximation and must be labelled as one, in the code and to the user.
35
-
36
- ## What still applies
37
-
38
- Everything in `../SKILL.md` that is not styling: the brand gate, the accessibility floor,
39
- the Core Web Vitals budget, the 5-second value-prop test, and the tell registry in
40
- `../scripts/verify.sh`. An official design system settles which components you use. It does
41
- not settle whether the page says anything.
42
-
43
- ## Where to browse for component ideas
44
-
45
- When a surface needs an idea rather than a primitive, a gallery of shipped products
46
- names where to go — Aceternity for marketing effects, 21st.dev for breadth, React Bits for tunable
47
- animation — and what each is good for. Take the technique and rebuild it in this project's tokens;
48
- check the brand study for what it refuses first, because a component that contradicts a stated ban
49
- makes the page look less designed, not more.
@@ -1,96 +0,0 @@
1
- # Reference — where to go looking for a bar
2
-
3
- > Last verified: **2026-08-24**. Every URL below was requested on that date and answered.
4
- > Four sites block automated requests (403/429) but are alive in a browser — marked *(bot-blocked)*.
5
- > A source with no date does not exist. Re-check before quoting one as current.
6
-
7
- **Go and look.** Your built-in aesthetic prior is the median of every template ever scraped, so the
8
- fastest way past it is to open real work and name what it does. This file is where to open.
9
-
10
- Two rules that make the browsing worth anything:
11
-
12
- - **Come back with a specific page, not a gallery.** `../../design-loop/SKILL.md` needs a bar you can
13
- open — one URL, one screenshot. "Something like Awwwards" is not a bar; a named site from it is.
14
- - **Extract principles, not pixels.** "Headline is 8× the body, one accent at 3% coverage" travels to
15
- your project. Cloning a competitor's exact grid is theatre, and `research-method.md` says so.
16
-
17
- ## A whole page to beat
18
-
19
- The default bucket. Use it when the goal is a site or landing and you need something to converge on.
20
-
21
- | Source | Go here for |
22
- |---|---|
23
- | [Awwwards](https://www.awwwards.com) | The award tier. Ambitious, often over-built — take the craft, leave the load time. |
24
- | [Recent](https://recent.design) | Formerly **Godly**; `godly.website` now 301s here. Curated modern web, strong signal-to-noise. |
25
- | [SiteInspire](https://www.siteinspire.com) *(bot-blocked)* | Long-running, filterable by style, type and subject. Calmer taste than Awwwards. |
26
- | [Land-book](https://land-book.com) *(bot-blocked)* | Landing pages at volume, filterable by industry and style. |
27
- | [Httpster](https://httpster.net) | Opinionated and current, less polished-agency than the rest. |
28
- | [Minimal Gallery](https://minimal.gallery) | When the brief is restraint and you need proof it can still sell. |
29
- | [Curated Design](https://curated.design) | Aggregated across galleries — a fast first sweep. |
30
- | [Nicely Done](https://nicelydone.club) | Real product sites and app UI rather than portfolios. |
31
- | [Lapa Ninja](https://lapa.ninja) *(bot-blocked)* | Large landing archive, free, categorised. |
32
- | [One Page Love](https://onepagelove.com) | Single-page sites specifically — the constraint is the point. |
33
-
34
- ## SaaS and conversion surfaces
35
-
36
- | Source | Go here for |
37
- |---|---|
38
- | [SaaS Landing Page](https://saaslandingpage.com) | Real SaaS landings, browsable **by section** (hero, pricing, testimonials, footer) — the most useful axis when you are building one section at a time. |
39
- | [Landingfolio](https://www.landingfolio.com) | Landings and page sections, heavy on conversion patterns. |
40
-
41
- ## Real product, real flows — not portfolios
42
-
43
- The most under-used bucket. Portfolio galleries show the hero; these show what happens after the click.
44
-
45
- | Source | Go here for |
46
- |---|---|
47
- | [Mobbin](https://mobbin.com) | Screens and full flows from shipped apps, mobile and web. The reference for "how does a real onboarding actually go". |
48
- | [Page Flows](https://pageflows.com) | Recorded user flows end to end — signup, checkout, cancellation. Video, so you see the motion too. |
49
- | [Screensdesign](https://screensdesign.com) | Mobile app screens with an emphasis on what is currently shipping. |
50
- | [Refero](https://refero.design) | UI/UX inspiration organised for browsing by pattern. |
51
-
52
- ## One section, one pattern
53
-
54
- Use when the piece is small and named: `design-loop` splits a goal into three or four pieces, and
55
- these are for when a piece is "the footer" or "the empty state".
56
-
57
- | Source | Go here for |
58
- |---|---|
59
- | [Footer.design](https://www.footer.design) | Footers only. Narrow on purpose, and the narrowness is why it is good. |
60
- | [Collect UI](https://collectui.com) | Daily-UI-style collections by component and pattern. |
61
- | [UI Garage](https://uigarage.net) | Patterns tagged by element and by industry. |
62
- | [UI Movement](https://uimovement.com) | Motion and interaction specifically — pair with the frequency gate in `../../motion-craft/SKILL.md` before copying anything. |
63
- | [Dark.design](https://dark.design) · [Dark Mode Design](https://darkmodedesign.com) | Dark interfaces done properly, which is a different problem from inverting a light one. |
64
- | [Scrnshts](https://scrnshts.club) | App Store screenshot design — a real discipline of its own. |
65
-
66
- ## Design systems as the canonical answer
67
-
68
- Not inspiration: **specification**. When the question is "what is the correct behaviour for this
69
- component", these outrank any gallery.
70
-
71
- | Source | Go here for |
72
- |---|---|
73
- | [Material 3](https://m3.material.io) | Google's system. Exhaustive on states, motion and tokens. |
74
- | [Apple HIG](https://developer.apple.com/design/human-interface-guidelines) | The reference for platform behaviour and for what *not* to invent on Apple platforms. |
75
- | [Shopify Polaris](https://polaris.shopify.com) | Dense, commerce-grade product UI with unusually good content guidance. |
76
- | [IBM Carbon](https://carbondesignsystem.com) | Enterprise density and data-heavy patterns. |
77
- | [GitHub Primer](https://primer.style) | Developer-tool UI, which is the closest analogue for most rsc projects. |
78
- | [The Component Gallery](https://component.gallery) *(bot-blocked)* | The same component compared **across** design systems — the fastest way to see the range of correct answers. |
79
- | [Adele](https://adele.uxpin.com) | Index of public design systems and their pattern libraries. |
80
- | [Designsystems.com](https://www.designsystems.com) | Essays on building and maintaining a system, not a system itself. |
81
-
82
- ## Niche, but the right answer when it fits
83
-
84
- | Source | Go here for |
85
- |---|---|
86
- | [Interface In Game](https://interfaceingame.com) | Game UI. Useful well beyond games for diegetic and high-density HUD ideas. |
87
- | [Mobile.design](https://mobile.design) | Mobile-first patterns collected on their own terms. |
88
-
89
- ## Housekeeping
90
-
91
- - **[Bestfolios](https://www.bestfolios.com) returned 502 on 2026-08-24** and is excluded until it
92
- comes back. Do not cite it.
93
- - **Component ideas**, as opposed to whole pages, live in
94
- Component galleries — Aceternity, 21st.dev, React Bits.
95
- - **Identity outranks all of this.** Check `02-DOCS/wiki/brand/` for what the project refuses before
96
- bringing an idea back. A gallery cannot know what your brand vetoed.
@@ -1,202 +0,0 @@
1
- # Landing Anatomy & Conversion (CRO)
2
-
3
- The CRO playbook. Every section earns its place by doing one job that moves a visitor toward conversion. Pair this with `copywriting-frameworks.md` for the words and `visual-system.md` for the tokens.
4
-
5
- ## Above the fold
6
-
7
- The first viewport decides whether the visitor stays. It must pass the **5-second test**: a stranger reads it and can say what it is, who it's for, and why it's better.
8
-
9
- - **F-pattern** for text-dense pages (docs, blogs): the eye sweeps the top line, drops, sweeps again. Put the value prop and primary CTA on the first horizontal sweep.
10
- - **Z-pattern** for sparse hero layouts: top-left brand → top-right nav/CTA → diagonal to the headline → bottom-right primary action.
11
- - **Must be visible without scrolling:** the value prop (headline + subhead), the primary CTA, one proof signal (logo strip or a hard metric), and the product itself (screenshot, terminal, or short loop) — not a stock gradient.
12
-
13
- ```text
14
- Bad — Centered headline over an atmospheric gradient; product hidden below fold.
15
- Good — Headline + subhead + "Start free" CTA + a real product screenshot, all above the fold.
16
- ```
17
-
18
- ## Section-by-section anatomy
19
-
20
- Each section has a job, a copy framework, an accessibility note, and the conversion principle it serves.
21
-
22
- | Section | Job | Copy framework | Conversion principle |
23
- | --- | --- | --- | --- |
24
- | Hero | State the value prop; pass the 5s test | Outcome + timeframe headline | Clarity beats cleverness |
25
- | Logo / social-proof strip | Borrow credibility instantly | "Trusted by N teams" | Social proof / authority |
26
- | Problem / agitation | Name the pain in the reader's words | PAS (Problem-Agitate) | Loss aversion |
27
- | Solution | Show the product doing the job | FAB (feature→benefit) | Concreteness over claims |
28
- | Features → benefits (bento) | Translate capability into outcome | JTBD per cell | Self-relevance |
29
- | How-it-works | Reduce perceived effort | 3-step sequence | Effort reduction |
30
- | Testimonials / case studies | Prove it works for people like them | Quantified quote | Similarity + proof |
31
- | Objection handling | Preempt the top "no" | "X without Y" | Risk reduction |
32
- | Pricing | Make the choice easy | Value framing, anchored | Anchoring + decoy |
33
- | FAQ | Answer real blockers | Question→direct answer | Friction removal |
34
- | Final CTA | One clear action | Value-on-the-button | Single decision |
35
- | Footer | Navigation, legal, trust | Scannable links | Trust + completeness |
36
-
37
- Accessibility note for every section: give each `<section>` an accessible name via `aria-labelledby` (pointing at its heading) or `aria-label`, and keep the heading order linear (`h1` → `h2` → `h3`, no skips).
38
-
39
- ## Full landing skeleton
40
-
41
- One complete, copy-pasteable Next.js 15 App Router page: semantic landmarks, exactly one `<h1>`, the Metadata API, and valid JSON-LD.
42
-
43
- ```tsx
44
- // app/page.tsx — semantic landing skeleton (Next.js 15 App Router)
45
- import type { Metadata } from "next";
46
-
47
- export const metadata: Metadata = {
48
- title: "Deploy in minutes — Acme", // 50–60 chars
49
- description: "Ship a fix in 4 minutes with no YAML and no on-call page. Free to start.", // 120–160
50
- };
51
-
52
- export default function Page() {
53
- return (
54
- <main>
55
- <section aria-labelledby="hero-h">
56
- <h1 id="hero-h">Ship a fix in 4 minutes</h1>
57
- {/* subhead, primary CTA, product screenshot */}
58
- </section>
59
- <section aria-label="Trusted by">{/* logo strip */}</section>
60
- <section aria-labelledby="pricing-h">
61
- <h2 id="pricing-h">Pricing</h2>
62
- {/* 3-tier table */}
63
- </section>
64
- <section aria-labelledby="faq-h">
65
- <h2 id="faq-h">FAQ</h2>
66
- {/* question/answer list */}
67
- </section>
68
- <script
69
- type="application/ld+json"
70
- dangerouslySetInnerHTML={{ __html: JSON.stringify({
71
- "@context": "https://schema.org",
72
- "@type": "Organization",
73
- name: "Acme",
74
- url: "https://acme.example",
75
- }) }}
76
- />
77
- </main>
78
- );
79
- }
80
- ```
81
-
82
- ## CTA strategy
83
-
84
- - **One primary action per viewport.** A secondary action (ghost button, text link) may accompany it, but never two equal-weight primaries competing for the click.
85
- - **Placement cadence:** above the fold + after the value is established + after pricing + a sticky bar on mobile. Visitors convert at different scroll depths; meet each one.
86
- - **Value on the button:** "Start free", "Get my estimate", "See it live" — never "Submit" or "Click here".
87
-
88
- ```tsx
89
- // components/sticky-cta.tsx — sticky mobile CTA, hidden on desktop (Client Component)
90
- "use client";
91
-
92
- export function StickyCta() {
93
- return (
94
- <div className="fixed inset-x-0 bottom-0 z-50 border-t border-fg/10 bg-bg/90 p-3 backdrop-blur md:hidden">
95
- <a
96
- href="#start"
97
- className="flex min-h-11 items-center justify-center rounded-card bg-brand-500 font-medium text-white"
98
- >
99
- Start free
100
- </a>
101
- </div>
102
- );
103
- }
104
- ```
105
-
106
- ## Pricing psychology
107
-
108
- - **Anchoring:** show the highest tier near the recommended one so the middle reads as reasonable.
109
- - **3 tiers, highlighted middle:** the middle tier is the intended default; mark it with a ring and a "Most popular" badge.
110
- - **Annual default:** show annual pricing first with the monthly equivalent ("$20/mo billed annually") — frames the lower number.
111
- - **Value framing, not feature dumps:** lead each tier with the outcome the buyer gets, then list features.
112
- - **Decoy effect:** a deliberately less attractive tier makes the target tier look better.
113
- - **Risk reversal:** money-back guarantee, free trial, no credit card — lowers the cost of saying yes.
114
-
115
- ```html
116
- <!-- 3-tier pricing, middle tier highlighted -->
117
- <div class="mx-auto grid max-w-5xl grid-cols-1 gap-6 md:grid-cols-3">
118
- <article class="rounded-card border border-fg/10 p-6">
119
- <h3 class="font-semibold">Starter</h3>
120
- <p class="price mt-2 text-3xl font-semibold">$0</p>
121
- </article>
122
- <article class="rounded-card border border-brand-500 p-6 ring-2 ring-brand-500">
123
- <p class="text-xs font-medium text-brand-500">Most popular</p>
124
- <h3 class="font-semibold">Team</h3>
125
- <p class="price mt-2 text-3xl font-semibold">$20<span class="text-base text-fg/60">/mo</span></p>
126
- </article>
127
- <article class="rounded-card border border-fg/10 p-6">
128
- <h3 class="font-semibold">Enterprise</h3>
129
- <p class="mt-2 text-3xl font-semibold">Custom</p>
130
- </article>
131
- </div>
132
- ```
133
-
134
- ## Social proof
135
-
136
- Logos, quantified testimonials, metrics, and trust badges — each placed where it answers the visitor's current doubt. Logos near the hero borrow authority early; a quantified case study near pricing closes the deal.
137
-
138
- ```text
139
- Bad — "This tool is amazing, it changed everything for us!" — Happy Customer
140
- Good — "Cut our deploy time from 22 min to 90 sec." — Priya R., Staff Eng, Northwind
141
- ```
142
-
143
- Quantified, attributed, specific. A vague rave is worth less than one hard number.
144
-
145
- ## Objection handling + FAQ
146
-
147
- Surface the real reasons a visitor hesitates (price, migration cost, lock-in, security) and answer them directly. Add `FAQPage` JSON-LD **only** when the on-page content matches the markup — fabricated FAQ structured data is a guidelines violation.
148
-
149
- ```json
150
- {
151
- "@context": "https://schema.org",
152
- "@type": "FAQPage",
153
- "mainEntity": [
154
- {
155
- "@type": "Question",
156
- "name": "Do I need to change my CI pipeline?",
157
- "acceptedAnswer": {
158
- "@type": "Answer",
159
- "text": "No. Driftway runs as a single CLI step inside your existing pipeline."
160
- }
161
- },
162
- {
163
- "@type": "Question",
164
- "name": "Is there a free tier?",
165
- "acceptedAnswer": {
166
- "@type": "Answer",
167
- "text": "Yes. Solo projects are free; paid tiers start at $20/mo billed annually."
168
- }
169
- }
170
- ]
171
- }
172
- ```
173
-
174
- ## A/B mindset + instrumentation
175
-
176
- - **One hypothesis at a time.** Change the headline OR the CTA color, not both — otherwise you cannot attribute the lift.
177
- - **Measure:** conversion rate (primary), scroll depth (do they reach pricing?), and INP at the CTA (a janky button costs clicks).
178
- - **Event-hook sketch:** fire a typed event on the primary action so the funnel is measurable.
179
-
180
- ```ts
181
- // lib/track.ts — minimal typed conversion event
182
- type Event = "cta_click" | "pricing_view" | "signup_start";
183
- export function track(event: Event, props: Record<string, string | number> = {}) {
184
- // forward to your analytics provider
185
- window.dispatchEvent(new CustomEvent("analytics", { detail: { event, ...props } }));
186
- }
187
- ```
188
-
189
- ## SEO-aware structure constraint
190
-
191
- Enforce the structural constraints here; defer keyword research, GEO, and technical audits to the `../marketing/SKILL.md` sibling (it carries SEO/GEO + keyword intent).
192
-
193
- - Exactly one `<h1>`; linear heading order.
194
- - Semantic landmarks (`header`/`nav`/`main`/`section`/`footer`).
195
- - Metadata API: title 50–60 chars, description 120–160 chars.
196
- - JSON-LD presence appropriate to the page: `Organization` sitewide, `Product` on a product page, `BreadcrumbList` for nested routes, `Article` for content, `FAQPage` only when FAQ content matches.
197
-
198
- ## See Also
199
-
200
- - `copywriting-frameworks.md` — the words for every section above.
201
- - `../../marketing/SKILL.md` — deep SEO/GEO, keyword research, and SEO-aware copy structure.
202
- - `../../nextjs/SKILL.md` — App Router Metadata API and rendering specifics.