diff --git a/apps/marketing/README.md b/apps/marketing/README.md index 6452b2a3..01d63e33 100644 --- a/apps/marketing/README.md +++ b/apps/marketing/README.md @@ -126,7 +126,7 @@ Two deliberate exclusions: Icons reached through a `:name` binding cannot be found by the icon scanner. When a new icon comes from `config/content.ts`, add its list to `icon.clientBundle.icons` in `nuxt.config.ts` the way -`featureCards` and `logoCloud` already are, or it will silently render as an empty box. +`logoCloud` already is, or it will silently render as an empty box. ## Adding or editing a legal document diff --git a/apps/marketing/app/pages/index.vue b/apps/marketing/app/pages/index.vue index fba5ded0..0c24d4a2 100644 --- a/apps/marketing/app/pages/index.vue +++ b/apps/marketing/app/pages/index.vue @@ -3,7 +3,6 @@ - diff --git a/apps/marketing/config/content.ts b/apps/marketing/config/content.ts index 5e98da2c..b51960d4 100644 --- a/apps/marketing/config/content.ts +++ b/apps/marketing/config/content.ts @@ -1,6 +1,6 @@ /** - * Structure of the landing page: which cards exist, in which order, and which translation key and - * icon each one carries. + * Structure of the landing page: which cards exist, in which order, and which translation key + * each one carries. * * Copy itself lives in `@code-zero/i18n` (`locales//marketing.json`) so translators work * from one place and Lunaria can report staleness. This file only holds what is not language — @@ -11,15 +11,7 @@ export interface FeatureCard { /** Key under `marketing.features.items`; also the Vue list key. */ readonly id: string; - /** Lucide icon name resolved by `@nuxt/icon` from the locally installed collection. */ - readonly icon: string; -} - -export interface Testimonial { - /** Key under `marketing.testimonials.items`. */ - readonly id: string; - /** Initials rendered in the avatar tile; no remote images on a page that must stay fast. */ - readonly initials: string; + readonly layout: 'lead' | 'standard' | 'wide'; } export interface FaqEntry { @@ -48,20 +40,14 @@ export interface PricingPlan { export const pricingCurrency = 'USD'; export const featureCards = [ - { id: 'observe', icon: 'lucide:eye' }, - { id: 'runner', icon: 'lucide:shield-check' }, - { id: 'verify', icon: 'lucide:circle-check-big' }, - { id: 'models', icon: 'lucide:cpu' }, - { id: 'sandbox', icon: 'lucide:box' }, - { id: 'policy', icon: 'lucide:scale' }, + { id: 'observe', layout: 'lead' }, + { id: 'runner', layout: 'standard' }, + { id: 'verify', layout: 'standard' }, + { id: 'models', layout: 'standard' }, + { id: 'sandbox', layout: 'standard' }, + { id: 'policy', layout: 'wide' }, ] as const satisfies readonly FeatureCard[]; -export const testimonials = [ - { id: 'one', initials: 'MC' }, - { id: 'two', initials: 'JW' }, - { id: 'three', initials: 'AO' }, -] as const satisfies readonly Testimonial[]; - export const faqEntries = [ { id: 'write' }, { id: 'models' }, diff --git a/apps/marketing/content.config.ts b/apps/marketing/content.config.ts index 74c9b88a..0f6db56a 100644 --- a/apps/marketing/content.config.ts +++ b/apps/marketing/content.config.ts @@ -14,7 +14,7 @@ const legalSchema = z.object({ /** * Frontmatter every blog post declares. `date` is the publication date (ISO 8601) the listing * sorts by; `tag` is a single lowercase category the listing can filter on; `authorInitials` - * feeds the same initials-tile avatar the testimonials use — this site ships no portrait images. + * feeds the initials-tile avatar — this site ships no portrait images. */ const blogSchema = z.object({ title: z.string(), diff --git a/apps/marketing/modules/home/components/CallToAction.vue b/apps/marketing/modules/home/components/CallToAction.vue index 886ddc44..6eb321cc 100644 --- a/apps/marketing/modules/home/components/CallToAction.vue +++ b/apps/marketing/modules/home/components/CallToAction.vue @@ -1,15 +1,19 @@