diff --git a/src/components/pricing/feature-comparison.tsx b/src/components/pricing/feature-comparison.tsx index 2f32444..57da52f 100644 --- a/src/components/pricing/feature-comparison.tsx +++ b/src/components/pricing/feature-comparison.tsx @@ -39,17 +39,17 @@ const GROUPS: FeatureGroup[] = [ { label: "Active contacts", tooltip: "The client records in your CRM — the people who can sign into your client experience.", - values: ["5", "50", "500", "Unlimited", "Custom"], + values: ["5", "50", "500", "Unlimited", "Unlimited"], }, { label: "Internal users included", tooltip: "Teammates with access to your workspace.", - values: ["1", "1", "3", "5", "Custom"], + values: ["1", "1", "3", "5", "Unlimited"], }, { label: "Cost per additional internal user", plain: true, - values: [false, false, "+$29 yr / $39 mo", "+$59 yr / $79 mo", "Custom"], + values: [false, false, "+$29 yr / $39 mo", "+$59 yr / $79 mo", false], }, ], }, @@ -139,6 +139,10 @@ const GROUPS: FeatureGroup[] = [ values: [false, false, false, true, true], }, { label: "Enforce MFA", values: [false, false, false, true, true] }, + { + label: "Advanced security controls", + values: [false, false, false, false, true], + }, { label: "HIPAA compliance with BAA", tooltip: "BAA available for handling protected health information.", @@ -215,6 +219,10 @@ const GROUPS: FeatureGroup[] = [ label: "Dedicated success manager", values: [false, false, false, false, true], }, + { + label: "Implementation service", + values: [false, false, false, false, true], + }, { label: "Technical advisor", values: [false, false, false, false, true], diff --git a/src/components/pricing/plan-wash.ts b/src/components/pricing/plan-wash.ts index 1b0a659..af1987f 100644 --- a/src/components/pricing/plan-wash.ts +++ b/src/components/pricing/plan-wash.ts @@ -38,12 +38,12 @@ export const PLAN_WASH_NEUTRAL = /** * /pricing only. Its cards are a subgrid that runs taller than the card block's, * so the wash is given a longer fade there; applied after the base strings - * above, which it overrides from lg up. + * above, which it overrides from xl up (where the table layout starts). */ export const PLAN_WASH_BRAND_LG = - "lg:[background:linear-gradient(to_bottom,rgba(125,164,255,0.45),transparent_160px)]"; + "xl:[background:linear-gradient(to_bottom,rgba(125,164,255,0.45),transparent_160px)]"; export const PLAN_WASH_NEUTRAL_LG = - "lg:[background:linear-gradient(to_bottom,var(--muted),transparent_160px)]"; + "xl:[background:linear-gradient(to_bottom,var(--muted),transparent_160px)]"; /** * The recommended card's own edge: brand blue at the top, gone by the middle, diff --git a/src/components/pricing/pricing-plans.tsx b/src/components/pricing/pricing-plans.tsx index 3f528f4..8cc5e9a 100644 --- a/src/components/pricing/pricing-plans.tsx +++ b/src/components/pricing/pricing-plans.tsx @@ -14,6 +14,11 @@ import { interface PlanFeatureGroup { label: string; items: string[]; + // This group lists what the plan adds on top of the tier below it. Its + // heading is worked out at render time ("Everything in Starter, plus") so it + // can fall back to plain "Features" when that tier's card isn't on screen — + // signed-in visitors don't see Free, so Starter has nothing to build on. + extendsPrevious?: boolean; } interface Plan { @@ -23,6 +28,13 @@ interface Plan { description: string; featureGroups: PlanFeatureGroup[]; cta: string; + ctaHref: string; + // A quieter "Book a demo" button under the main CTA, for the tiers where + // buying outright is the main path but a demo is a fair second. + secondaryDemo?: boolean; + // Price is a floor, not a rate: same figure on both billing toggles, and the + // line under it says so instead of "Billed monthly / annually". + startingPrice?: boolean; highlighted: boolean; } @@ -58,6 +70,7 @@ const PLANS: Plan[] = [ }, ], cta: "Get started", + ctaHref: SIGNUP_URL, highlighted: false, }, { @@ -75,7 +88,8 @@ const PLANS: Plan[] = [ ], }, { - label: "Everything in Free, plus", + label: "Features", + extendsPrevious: true, items: [ "MCP connector", "More included credits", @@ -88,6 +102,7 @@ const PLANS: Plan[] = [ }, ], cta: "Get started", + ctaHref: SIGNUP_URL, highlighted: false, }, { @@ -105,7 +120,8 @@ const PLANS: Plan[] = [ ], }, { - label: "Everything in Starter, plus", + label: "Features", + extendsPrevious: true, items: [ "Custom domains", "API access", @@ -121,6 +137,8 @@ const PLANS: Plan[] = [ }, ], cta: "Get started", + ctaHref: SIGNUP_URL, + secondaryDemo: true, highlighted: true, }, { @@ -138,7 +156,8 @@ const PLANS: Plan[] = [ ], }, { - label: "Everything in Pro, plus", + label: "Features", + extendsPrevious: true, items: [ "Audit log", "Client access permissions", @@ -155,7 +174,42 @@ const PLANS: Plan[] = [ ], }, ], + cta: "Get started", + ctaHref: SIGNUP_URL, + secondaryDemo: true, + highlighted: false, + }, + { + name: "Enterprise", + priceMonthly: 2000, + priceYearly: 2000, + description: "For firms with custom needs", + featureGroups: [ + { + label: "Fundamentals", + items: [ + "Unlimited active contacts", + "Unlimited internal users", + "Custom build credits", + ], + }, + { + label: "Features", + extendsPrevious: true, + items: ["Custom SSO", "Advanced security controls", "Sandbox workspace"], + }, + { + label: "Support", + items: [ + "Dedicated success manager", + "Implementation service", + "Shared Slack channel", + ], + }, + ], cta: DEMO_CTA_LABEL, + ctaHref: DEMO_URL, + startingPrice: true, highlighted: false, }, ]; @@ -166,70 +220,9 @@ const PAID_PLANS = PLANS.filter((plan) => plan.priceMonthly > 0); type Billing = "monthly" | "yearly"; -// Enterprise sits BELOW the tier columns as one wide card (so adding it never -// pushes the grid to five columns). Minimal: a label + one-line pitch, with the -// demo CTA on the right — no perk grid, so it reads as a quiet footnote to the -// tiers rather than a fifth plan. It's a standalone outlined card detached from -// the plans table above (gap, not a shared border) at every breakpoint. -function EnterpriseCard() { - return ( - // Same 4-column grid as the tiers so the heading, perks, and CTA line up - // under the columns above (heading | perks | perks | CTA). No dividers - // between them: the grid already does the separating, and four hairlines - // inside one row made it read as a second table under the real one. - // Keeps its fill on desktop dark, like the tier columns above it — dropped - // there, this card was the one row of the pricing table still sitting on the - // page's own near-black. -
{group.label}
++ {group.extendsPrevious && prevName + ? `Everything in ${prevName}, plus` + : group.label} +