diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index cdac3713c1..5851d1ca9b 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -268,9 +268,9 @@ This also covers old `/docs/**` paths left behind by a rename in `flowfuse/flowf ## Call-to-Action components -**Nuxt only** — 11ty pages still use hand-written `` links; these components have no 11ty equivalent yet. +Both frameworks have their own implementation of the same system — Vue components on Nuxt, Nunjucks macros on 11ty (see **11ty equivalent** below). The rendering/styling code itself is kept in sync by hand (Vue and Nunjucks share nothing at that level), but the *data* — event name, href, and fixed label per destination — lives in one file, `src/_data/ctaDestinations.json`, imported by both the Vue components and the Nunjucks macros (via a Nunjucks global, see below) so the two can't drift apart on copy or event names without both sides being touched. `site.json`'s `appURL` is combined with `ctaDestinations`' `hrefSuffix` for `signUp`/`signIn`, since the base URL differs per environment and doesn't belong duplicated a third time in `ctaDestinations.json`. -There are exactly four CTA destinations, each with its own component with **fixed copy and href** (a PostHog audit found dozens of different button texts pointing at the same four URLs, which made it impossible to tell which copy converted best — see `/handbook/marketing/website#call-to-action-buttons` for the non-engineer-facing explanation and a live gallery of every variant): +There are exactly five CTA destinations, each with its own component with **fixed copy and href** (a PostHog audit found dozens of different button texts pointing at the same handful of URLs, which made it impossible to tell which copy converted best — see `/handbook/marketing/website#call-to-action-buttons` for the non-engineer-facing explanation and a live gallery of every variant): | Component | href | Fixed label | |---|---|---| @@ -278,8 +278,9 @@ There are exactly four CTA destinations, each with its own component with **fixe | `nuxt/components/CtaSignIn.vue` | `site.appURL` | "Sign In" | | `nuxt/components/CtaContactUs.vue` | `/contact-us/` | "Contact Us" | | `nuxt/components/CtaBookDemo.vue` | `/book-demo/` | "Book a Demo" | +| `nuxt/components/CtaPricing.vue` | `/pricing/` | "View Pricing" | -All four are thin wrappers around `nuxt/components/cta/CtaButton.vue`, which does the actual styling/tracking and isn't meant to be used directly. If a page needs different wording, that's a sign a fifth destination-specific component is needed — not a prop that lets callers override copy on these four. +All five are thin wrappers around `nuxt/components/cta/CtaButton.vue`, which does the actual styling/tracking and isn't meant to be used directly. If a page needs different wording, that's a sign a sixth destination-specific component is needed — not a prop that lets callers override copy on these five. **Props** (all optional except `variant`/`position`): `variant` (`primary` | `primary-outlined` | `highlight` | `highlight-outlined` | `ghost` | `nav-text`), `position` (free string, sent to PostHog — describes where on the page, e.g. `hero`, `pricing-card`), `plan` (e.g. `edge`/`hub`/`fleet`, sent to PostHog), `color` (`primary`|`highlight`|`white`, only for `variant="ghost"`, which has no background of its own), `icon` (Nuxt Icon name for a trailing icon), `uppercase`, `padded` (only for `variant="nav-text"` — whether it has the header-`