diff --git a/apps/web/app/(marketing)/page.tsx b/apps/web/app/(marketing)/page.tsx index bd00a799a..d3770a2a0 100644 --- a/apps/web/app/(marketing)/page.tsx +++ b/apps/web/app/(marketing)/page.tsx @@ -272,6 +272,7 @@ function Home() { config={billingConfig} paths={{ signUp: pathsConfig.auth.signUp, + subscription: pathsConfig.app.personalAccountBilling, }} /> diff --git a/apps/web/app/(marketing)/pricing/page.tsx b/apps/web/app/(marketing)/pricing/page.tsx index 5cdeb23a2..766f3f777 100644 --- a/apps/web/app/(marketing)/pricing/page.tsx +++ b/apps/web/app/(marketing)/pricing/page.tsx @@ -14,6 +14,11 @@ export const generateMetadata = async () => { }; }; +const paths = { + signUp: pathsConfig.auth.signUp, + subscription: pathsConfig.app.personalAccountBilling, +}; + async function PricingPage() { const { t } = await createI18nServerInstance(); @@ -25,7 +30,7 @@ async function PricingPage() { />
- +
); diff --git a/packages/billing/gateway/src/components/pricing-table.tsx b/packages/billing/gateway/src/components/pricing-table.tsx index c4f9145a5..57a0ab342 100644 --- a/packages/billing/gateway/src/components/pricing-table.tsx +++ b/packages/billing/gateway/src/components/pricing-table.tsx @@ -25,18 +25,22 @@ import { LineItemDetails } from './line-item-details'; interface Paths { signUp: string; + subscription: string; } export function PricingTable({ config, paths, CheckoutButtonRenderer, + redirectToCheckout = true, displayPlanDetails = true, }: { config: BillingConfig; paths: Paths; displayPlanDetails?: boolean; + redirectToCheckout?: boolean; + CheckoutButtonRenderer?: React.ComponentType<{ planId: string; highlighted?: boolean; @@ -88,6 +92,7 @@ export function PricingTable({ selectable key={plan.id} plan={plan} + redirectToCheckout={redirectToCheckout} primaryLineItem={primaryLineItem} product={product} paths={paths} @@ -106,14 +111,14 @@ function PricingItem( className?: string; displayPlanDetails: boolean; - paths: { - signUp: string; - }; + paths: Paths; selectable: boolean; primaryLineItem: z.infer; + redirectToCheckout?: boolean; + plan: { id: string; lineItems: z.infer[]; @@ -251,10 +256,11 @@ function PricingItem( condition={props.plan.id && props.CheckoutButton} fallback={ } > @@ -410,12 +416,24 @@ function DefaultCheckoutButton( name: string; }; - signUpPath: string; + paths: Paths; + redirectToCheckout?: boolean; + highlighted?: boolean; }>, ) { + const redirectToCheckoutParam = props.redirectToCheckout + ? '?redirectToCheckout=true' + : ''; + + const planId = props.plan.id; + const signUpPath = props.paths.signUp; + const subscriptionPath = props.paths.subscription; + const linkHref = - props.plan.href ?? `${props.signUpPath}?utm_source=${props.plan.id}` ?? ''; + props.plan.href ?? + `${signUpPath}?plan=${planId}&next=${subscriptionPath}?plan=${planId}${redirectToCheckoutParam}` ?? + ''; const label = props.plan.label ?? 'common:getStartedWithPlan'; diff --git a/packages/ui/src/shadcn/alert.tsx b/packages/ui/src/shadcn/alert.tsx index b72656971..5bd488905 100644 --- a/packages/ui/src/shadcn/alert.tsx +++ b/packages/ui/src/shadcn/alert.tsx @@ -2,21 +2,21 @@ import * as React from 'react'; import { type VariantProps, cva } from 'class-variance-authority'; -import { cn } from '../utils/cn'; +import { cn } from '../utils'; const alertVariants = cva( - 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', + 'relative w-full bg-gradient-to-r rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', { variants: { variant: { default: 'bg-background text-foreground', destructive: - 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive from-red-50 from-10% via-background to-background dark:from-red-500/10', success: - 'border-green-600/50 text-green-600 dark:border-green-600 [&>svg]:text-green-600', + 'border-green-600/50 text-green-600 dark:border-green-600 [&>svg]:text-green-600 from-green-50 from-10% via-background to-background dark:from-green-500/10', warning: - 'border-orange-600/50 text-orange-600 dark:border-orange-600 [&>svg]:text-orange-600', - info: 'border-blue-600/50 text-blue-600 dark:border-blue-600 [&>svg]:text-blue-600', + 'border-orange-600/50 text-orange-600 dark:border-orange-600 [&>svg]:text-orange-600 from-orange-50 from-10% via-background to-background dark:from-orange-500/10', + info: 'border-blue-600/50 text-blue-600 dark:border-blue-600 [&>svg]:text-blue-600 from-blue-50 from-10% via-background to-background dark:from-blue-500/10', }, }, defaultVariants: { @@ -44,7 +44,7 @@ const AlertTitle = React.forwardRef< >(({ className, ...props }, ref) => (
));