3-Tier SaaS Pricing Table
A responsive 3-tier pricing table component with monthly/yearly billing toggle, highlighted "Most Popular" plan, and feature comparison. Perfect for SaaS marketing pages, product pages, and subscription-based services.
Overview
This pricing table is designed to maximize conversion with clear visual hierarchy, prominent CTAs, and transparent feature comparison. It adapts seamlessly from desktop 3-column layout to mobile stacked cards.
Structure Specification
Component Hierarchy
The pricing table consists of a Container that holds a Billing Toggle section at the top, followed by a Plans Grid with three Plan Cards (Starter, Professional with "Most Popular" badge, and Enterprise). Each Plan Card contains a Header (with plan name and optional badge), Pricing section (with amount and billing period), CTA Button, and Feature List (with checkmarks and x-marks).
Detailed Component Specifications
1. Pricing Table Container
Dimensions:
- Max width: 1200px (desktop)
- Padding: 48-64px vertical, 24-32px horizontal
- Gap between billing toggle and plans: 48-64px
Behavior:
- Centers content horizontally
- Responsive padding (reduces on mobile)
- Background can be neutral, gradient, or transparent
2. Billing Toggle
Dimensions:
- Container: Centered, max-width 400px
- Toggle switch: 200-240px wide
- Label spacing: 16px gap between labels and switch
- Savings badge: Small pill, right of "Yearly" label
Layout:
The toggle consists of a Monthly label, toggle switch in the center, Yearly label, and a "Save 20%" badge to the right of Yearly.
States:
monthly(default) - Shows monthly pricingyearly- Shows yearly pricing (with discount if applicable)
Elements:
Toggle Labels
- Font size: 16px
- Weight: Medium (500) for inactive, Semibold (600) for active
- Color: Muted gray for inactive, primary text for active
- Transition: Smooth color change (150ms)
Toggle Switch
- Width: 56px, Height: 32px
- Border radius: 16px (pill shape)
- Thumb: 24px circle
- Colors:
- Background (inactive): Light gray (#e5e7eb)
- Background (active): Primary color (#3b82f6)
- Thumb: White (#ffffff)
- Animation: Thumb slides 150-200ms with ease-out
Savings Badge
- Padding: 4px 12px
- Border radius: 12px (pill)
- Background: Success/primary color at 10-20% opacity
- Text: 12-14px, medium weight
- Icon: Optional small savings/discount icon
Behavior:
- Click either label or switch to toggle
- Keyboard accessible (Tab to focus, Enter/Space to toggle)
- Updates all plan prices simultaneously
- Smooth price transition (fade or slide animation)
- ARIA:
role="switch",aria-checked="true/false",aria-label="Billing frequency"
3. Plans Grid
Layout:
- Desktop (≥1024px): 3 columns, equal width, 24-32px gap
- Tablet (768px-1023px): 3 columns, smaller gap (16-24px)
- Mobile (<768px): Single column, 24px gap, stacked
Alignment:
- Plans vertically aligned at top
- "Most Popular" plan can be visually elevated (slightly larger or with subtle shadow)
Responsive:
- Grid to stack transition smooth
- Mobile cards full width with 16px margins
4. Plan Card
Dimensions:
- Padding: 32-40px (desktop), 24-32px (mobile)
- Border radius: 12-16px
- Min height: Equal across all plans for better visual alignment
Visual Hierarchy:
- Most popular plan stands out with:
- Darker border or shadow
- Optional scale (102-105%)
- Higher z-index for depth
- Primary color accent
States:
- Default - Standard appearance
- Highlighted (Most Popular) - Enhanced visual prominence
- Hover - Subtle scale or shadow increase
Border & Shadow:
- Border: 1px solid, light gray (#e5e7eb) or transparent
- Shadow: Subtle elevation, more prominent on popular plan
- Hover shadow: Slightly increased elevation
Background:
- Light mode: White (#ffffff) or very light gray (#fafafa)
- Dark mode: Dark neutral (#1f2937) or slightly lighter than page background
5. Plan Header
Layout:
- Badge (if applicable) at top
- Plan name below badge
- Optional subtitle/description below name
Elements:
Badge ("Most Popular", "Best Value")
- Position: Top of card, centered or left-aligned
- Padding: 6px 16px
- Border radius: 12px (pill) or 6px (rounded)
- Background: Primary color or gradient
- Text: 12-14px, medium/semibold weight, uppercase optional
- Color: White or high-contrast text
- Icon: Optional star/crown icon
Plan Name
- Font size: 24-28px (desktop), 20-24px (mobile)
- Weight: Bold (700) or Semibold (600)
- Color: Primary text color
- Margin: 12-16px below badge, 8-12px above pricing
Description (Optional)
- Font size: 14-16px
- Weight: Regular (400)
- Color: Muted text (#6b7280)
- Margin: 8px below plan name
- Example: "Perfect for individuals"
6. Pricing Section
Layout:
- Price amount prominent and centered/left-aligned
- Billing period below or adjacent to price
- Optional "from" prefix for variable pricing
- Optional strikethrough original price (for yearly savings)
Elements:
Price Amount
- Font size: 48-56px (desktop), 40-48px (mobile)
- Weight: Bold (700) or Extra Bold (800)
- Color: Primary text color
- Currency symbol: Same size or slightly smaller (80% size)
- Decimals: Optional, smaller size (60-70% of price)
Billing Period
- Font size: 16-18px
- Weight: Regular (400) or Medium (500)
- Color: Muted text (#6b7280)
- Format: "/month" or "/mo", "/year" or "/yr"
- Position: Adjacent to price (baseline aligned) or below
Price Change Animation
- Duration: 200-250ms
- Easing: ease-in-out
- Effect: Fade out old price, fade in new price
- Alternative: Slide up/down or scale
- Stagger: Optional subtle delay between cards (50ms)
Discount Indicator (Yearly Plans)
- Original price: Strikethrough, smaller, muted
- Position: Above or next to new price
- Example: "~~$348~~ $279/year"
- Savings text: "Save $69/year" below price
7. CTA Button
Dimensions:
- Width: Full width or 80-90% of card width
- Height: 48-56px (desktop), 44-48px (mobile)
- Padding: 12-16px vertical, 24-32px horizontal
- Border radius: 8-12px
Visual Variants:
Primary CTA (Most Popular Plan)
- Background: Primary color (#3b82f6)
- Text: White (#ffffff)
- Weight: Medium (500) or Semibold (600)
- Font size: 16-18px
- Shadow: Subtle elevation
- Hover: Darker shade or increased shadow
Secondary CTA (Other Plans)
- Variant 1: Outlined
- Border: 2px solid primary or neutral
- Background: Transparent or white
- Text: Primary color
- Hover: Light background fill
- Variant 2: Ghost/Muted
- Background: Light gray (#f3f4f6)
- Text: Primary text color
- Hover: Darker background
States:
- Default - Normal appearance
- Hover - Enhanced (shadow/scale/color change)
- Active - Slight press effect
- Focus - Clear outline (accessibility)
- Loading - Disabled with spinner
- Disabled - Muted colors, not interactive
Text Examples:
- Free plan: "Start Free", "Get Started Free"
- Paid plans: "Get Started", "Start Trial", "Subscribe"
- Enterprise: "Contact Sales", "Request Demo", "Talk to Sales"
Behavior:
- Click triggers appropriate action (signup, checkout, contact form)
- Keyboard accessible (Enter/Space)
- ARIA:
aria-labelif button text is ambiguous
8. Feature List
Layout:
- Unordered list with checkmarks/x-marks
- Left-aligned text
- Consistent spacing between items
- Optional feature grouping with subtle dividers
Dimensions:
- Item height: 36-44px
- Icon size: 20-24px
- Gap between icon and text: 12-16px
- Gap between items: 8-12px
- Margin top: 24-32px from CTA
Elements:
Feature Item
- Font size: 14-16px
- Weight: Regular (400)
- Color: Primary text for included, muted for unavailable
- Line height: 1.5 for readability
Check Icon (Included Feature)
- Color: Success green (#10b981) or primary color
- Style: Solid checkmark or circle with check
- Weight: Medium/bold stroke
X-Mark / Unavailable Icon
- Color: Muted gray (#9ca3af) or light red (#ef4444)
- Style: X mark, minus sign, or grayed-out check
- Optional: Strikethrough text
Feature Groups (Optional)
- Group header: 12-14px, uppercase, semibold, muted
- Divider: 1px line or extra spacing
- Examples: "Core Features", "Advanced Features", "Support"
Accessibility:
- Icons should have
aria-hidden="true" - Text should convey included/unavailable status
- Alternative: Use prefixes like "Included:" or "Not included:"
- Screen reader text:
<span class="sr-only">Included</span>
9. Feature Comparison Behavior
Desktop:
- Features align horizontally across all plans
- Equal height for each feature row
- Makes it easy to compare at a glance
Mobile:
- Features within each card only
- No cross-card comparison (acceptable trade-off)
- Consider showing only top features, with "See all features" expand
Feature Synchronization:
- If feature appears in multiple plans, keep descriptions identical
- Order features by importance (most valuable first)
- Consider using tooltips for complex features
Responsive Breakpoints
Desktop (≥1024px)
- 3-column grid layout
- Full feature lists visible
- Larger typography and spacing
- "Most Popular" plan can be elevated/scaled
- Horizontal alignment of features across cards
Tablet (768px - 1023px)
- 3-column grid maintained, reduced spacing
- Slightly smaller typography
- Reduced padding in cards
- May require horizontal scroll if cards too narrow
- Alternative: Switch to 2+1 layout (2 top, 1 bottom)
Mobile (<768px)
- Single column, stacked cards
- Full width cards with 16px margins
- Reduced typography sizes
- Most Popular plan first or maintain order
- Simplified feature lists (show top 5-7, expand for more)
- Sticky CTA button optional for easier conversion
Small Mobile (<375px)
- Further reduced padding (16-20px)
- Smaller typography
- More compact button sizing
Interaction Patterns
Billing Toggle
- User clicks Monthly/Yearly label or switch
- Switch animates to new position (150-200ms)
- All prices simultaneously update with smooth transition
- Savings badge visibility updates (show on yearly)
- State persists during session (optional localStorage)
Plan Selection
- User clicks CTA button
- Button shows loading state (if async action)
- Navigate to signup/checkout with plan preselected
- Or open modal for immediate action
- Track plan selection for analytics
Feature Tooltip (Optional)
- User hovers or clicks info icon next to feature
- Tooltip appears with detailed explanation
- Tooltip dismisses on mouse leave or Escape key
- Accessible via keyboard (Tab to icon, Enter to show)
Plan Comparison Modal (Optional)
- "Compare plans" link below pricing table
- Opens modal or navigates to detailed comparison page
- Shows full feature matrix with all plans side-by-side
- Helpful for complex products with many features
Accessibility Requirements
WCAG 2.1 Compliance (Level AA)
Structure:
- Use semantic HTML:
<section>,<article>,<ul>,<button> - Proper heading hierarchy (h2 for section title, h3 for plan names)
- Each plan card should be a landmark or have clear structure
Keyboard Navigation:
- Tab order: Billing toggle → Plan 1 CTA → Plan 2 CTA → Plan 3 CTA
- Enter/Space: Activate buttons and toggle
- Focus visible on all interactive elements
ARIA Attributes:
Billing Toggle:
<div role="radiogroup" aria-label="Billing frequency"> <button role="radio" aria-checked="true">Monthly</button> <button role="radio" aria-checked="false">Yearly</button> </div>Or use switch pattern:
<button role="switch" aria-checked="false" aria-label="Switch to yearly billing"> <span>Monthly</span> | <span>Yearly</span> </button>Plan Cards:
<article aria-labelledby="plan-pro-name"> <h3 id="plan-pro-name">Professional</h3> ... </article>Feature List:
<ul aria-label="Features included in Professional plan"> <li> <svg aria-hidden="true">...</svg> <span>Unlimited projects</span> <span class="sr-only">Included</span> </li> </ul>Badges:
<span class="badge" role="status" aria-label="Most popular plan"> Most Popular </span>
Screen Reader Support:
- Prices announced correctly: "$29 per month"
- Feature icons marked
aria-hidden="true" - Feature status clear from text or sr-only spans
- Plan changes announced when billing toggle switches
Color Contrast:
- Text: Minimum 4.5:1 contrast ratio
- Buttons: 3:1 contrast for non-text elements
- Icons: Ensure checkmarks and x-marks are distinguishable
- Test with color blindness simulators
Focus Indicators:
button:focus-visible,
a:focus-visible {
outline: 2px solid var(--primary-color);
outline-offset: 2px;
}
Design System Specifications
Important: These specifications are framework and styling-agnostic. Implement using your project's chosen approach (Tailwind, CSS Modules, styled-components, Chakra UI, Material-UI, SCSS, etc.).
Color Guidelines
Plan Cards
- Background (Light): White (#ffffff) or very light gray (#fafafa)
- Background (Dark): Dark neutral (#1f2937) or slightly lighter than page (#1a1a1a)
- Border (Light): Light gray (#e5e7eb) or transparent
- Border (Dark): Medium gray (#374151) or transparent
- Most Popular Border: Primary color (#3b82f6) or darker border with shadow
Text Colors
- Primary Text (Light): Dark gray (#111827, #1f2937)
- Primary Text (Dark): Light gray (#f9fafb, #e5e7eb)
- Muted Text (Light): Medium gray (#6b7280, #9ca3af)
- Muted Text (Dark): Medium gray (#9ca3af, #6b7280)
- Price: Emphasis color, typically darker/bolder than primary text
CTA Buttons
- Primary Button Background: Primary color (#3b82f6, #10b981)
- Primary Button Text: White (#ffffff)
- Primary Button Hover: Darker shade (darken by 10-15%)
- Secondary Button Border: Primary color or neutral (#e5e7eb)
- Secondary Button Text: Primary color or primary text
- Secondary Button Hover: Light background fill (#f3f4f6)
Feature Icons
- Checkmark (Included): Success green (#10b981) or primary color
- X-mark (Unavailable): Light gray (#9ca3af) or muted red (#ef4444)
Badge
- Background: Primary color or gradient
- Text: White or high-contrast color
- Alternative: Primary color at 10-20% opacity with primary text
Billing Toggle
- Inactive Label: Muted text (#6b7280)
- Active Label: Primary text color
- Switch Background (Off): Light gray (#e5e7eb)
- Switch Background (On): Primary color (#3b82f6)
- Switch Thumb: White (#ffffff)
- Savings Badge: Success/primary color at 10-20% opacity, primary text
Typography
- Section Title: 32-40px, bold (700), primary text
- Plan Name: 24-28px (desktop), 20-24px (mobile), semibold/bold
- Price: 48-56px (desktop), 40-48px (mobile), bold/extra-bold
- Billing Period: 16-18px, regular/medium, muted text
- CTA Button: 16-18px, medium/semibold
- Features: 14-16px, regular
- Badge: 12-14px, medium/semibold, uppercase optional
- Description: 14-16px, regular, muted text
Font Family: Use project's font stack (system-ui, -apple-system, sans-serif or custom)
Line Height:
- Headings: 1.2-1.3
- Body text: 1.5
- Features: 1.5
Spacing System
Use consistent spacing scale (4px, 8px, 12px, 16px, 24px, 32px, 48px, 64px):
- Container Padding: 48-64px vertical, 24-32px horizontal (desktop), 32-48px vertical, 16-24px horizontal (mobile)
- Card Padding: 32-40px (desktop), 24-32px (mobile)
- Grid Gap: 24-32px (desktop), 24px (mobile)
- Element Spacing: 24-32px between major sections, 16-24px between related elements
- Feature Items: 8-12px gap between items
Shadows & Elevation
- Default Card:
0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06) - Most Popular Card:
0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) - Hover Card:
0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) - Primary Button:
0 1px 2px rgba(0, 0, 0, 0.05) - Primary Button Hover:
0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)
Border Radius
- Cards: 12-16px
- Buttons: 8-12px
- Badges: 12px (pill) or 6px (rounded)
- Toggle Switch: 16px (pill)
State Management Considerations
For AI Agents to Implement
State to Track:
billingFrequency: "monthly" | "yearly"- Current billing period selection- Default: "monthly"
- Persistence: Session storage or component state (optional localStorage for persistence)
selectedPlan: string | null- Which plan user clicked (optional, for analytics)loading: boolean- Loading state for CTA buttons (if async)
Computed Values:
- Current prices based on
billingFrequency - Discount amounts for yearly plans
- Feature availability per plan (can be static data)
State Persistence:
billingFrequency→ Session storage (optional)- Reset on page reload acceptable
- Or persist in URL query param:
?billing=yearly
Data Structure:
const pricingPlans = [
{
id: 'starter',
name: 'Starter',
description: 'Perfect for individuals',
monthlyPrice: 9,
yearlyPrice: 89, // 17% discount
highlighted: false,
features: [
{ name: 'Up to 5 projects', included: true },
{ name: '1 GB storage', included: true },
{ name: 'Basic support', included: true },
{ name: 'Advanced analytics', included: false },
{ name: 'Custom domain', included: false },
],
cta: { text: 'Start Free', action: '/signup?plan=starter' }
},
{
id: 'professional',
name: 'Professional',
description: 'Perfect for small teams',
monthlyPrice: 29,
yearlyPrice: 279, // 20% discount
highlighted: true,
badge: 'Most Popular',
features: [
{ name: 'Unlimited projects', included: true },
{ name: '10 GB storage', included: true },
{ name: 'Priority support', included: true },
{ name: 'Advanced analytics', included: true },
{ name: 'Custom domain', included: true },
{ name: 'API access', included: false },
],
cta: { text: 'Get Started', action: '/signup?plan=pro' }
},
{
id: 'enterprise',
name: 'Enterprise',
description: 'Perfect for large organizations',
monthlyPrice: 99,
yearlyPrice: 990, // 17% discount
highlighted: false,
features: [
{ name: 'Unlimited everything', included: true },
{ name: 'Unlimited storage', included: true },
{ name: '24/7 dedicated support', included: true },
{ name: 'Advanced analytics', included: true },
{ name: 'Custom domain', included: true },
{ name: 'API access', included: true },
{ name: 'SSO & SAML', included: true },
],
cta: { text: 'Contact Sales', action: '/contact?plan=enterprise' }
}
];
Animation Specifications
Billing Toggle Animation
- Duration: 200ms
- Easing: ease-in-out
- Properties:
- Switch thumb:
transform(translateX) - Switch background:
background-color - Label colors:
color
- Switch thumb:
Price Change Animation
- Duration: 250ms
- Easing: ease-in-out
- Effect Options:
- Fade: Opacity 1 → 0 → 1
- Slide: translateY(10px) → translateY(0)
- Scale: scale(0.95) → scale(1)
- Stagger: Optional 50ms delay between cards for polished effect
Card Hover Animation
- Duration: 150-200ms
- Easing: ease-out
- Properties:
- Shadow: Increase elevation
- Transform: translateY(-4px) or scale(1.02)
- Boundary: Keep subtle to avoid distraction
CTA Button Hover
- Duration: 150ms
- Easing: ease-out
- Properties:
- Background color: Darken
- Shadow: Increase elevation
- Transform: scale(1.02) optional
Prefers Reduced Motion
When user has prefers-reduced-motion: reduce:
- Disable card hover transforms
- Disable price change slide/scale (use only fade)
- Keep toggle switch animation (functional)
- Reduce animation durations to <100ms
Code Implementation Patterns
React Example Pattern
const PricingTable = () => {
const [billingFrequency, setBillingFrequency] = useState('monthly');
const toggleBilling = () => {
setBillingFrequency(prev => prev === 'monthly' ? 'yearly' : 'monthly');
};
return (
<section className="pricing-container">
<BillingToggle
frequency={billingFrequency}
onToggle={toggleBilling}
/>
<div className="plans-grid">
{pricingPlans.map(plan => (
<PlanCard
key={plan.id}
plan={plan}
billingFrequency={billingFrequency}
highlighted={plan.highlighted}
/>
))}
</div>
</section>
);
};
Vue Example Pattern
<template>
<section class="pricing-container">
<BillingToggle
:frequency="billingFrequency"
@toggle="toggleBilling"
/>
<div class="plans-grid">
<PlanCard
v-for="plan in pricingPlans"
:key="plan.id"
:plan="plan"
:billing-frequency="billingFrequency"
:highlighted="plan.highlighted"
/>
</div>
</section>
</template>
<script setup>
import { ref } from 'vue';
const billingFrequency = ref('monthly');
const toggleBilling = () => {
billingFrequency.value = billingFrequency.value === 'monthly' ? 'yearly' : 'monthly';
};
</script>
Angular Example Pattern
@Component({
selector: 'app-pricing-table',
template: `
<section class="pricing-container">
<app-billing-toggle
[frequency]="billingFrequency"
(toggle)="toggleBilling()"
/>
<div class="plans-grid">
<app-plan-card
*ngFor="let plan of pricingPlans"
[plan]="plan"
[billingFrequency]="billingFrequency"
[highlighted]="plan.highlighted"
/>
</div>
</section>
`
})
export class PricingTableComponent {
billingFrequency: 'monthly' | 'yearly' = 'monthly';
pricingPlans = PRICING_PLANS;
toggleBilling() {
this.billingFrequency = this.billingFrequency === 'monthly' ? 'yearly' : 'monthly';
}
}
Testing Checklist
When implementing this pricing table, test:
- [ ] Billing toggle switches between monthly and yearly
- [ ] All plan prices update simultaneously when billing changes
- [ ] Price change animations are smooth
- [ ] Most Popular plan is visually distinct
- [ ] CTA buttons are prominently displayed and functional
- [ ] Feature lists align properly across plans (desktop)
- [ ] Cards stack properly on mobile
- [ ] Responsive at all breakpoints (mobile, tablet, desktop)
- [ ] Keyboard navigation works (Tab through toggle and CTAs)
- [ ] Screen reader announces prices correctly
- [ ] Focus indicators visible on all interactive elements
- [ ] Color contrast meets WCAG AA (4.5:1 for text)
- [ ] Hover states work on cards and buttons
- [ ] Touch interactions work on mobile
- [ ] No layout shift when prices change
- [ ] Feature icons are accessible (aria-hidden + text)
- [ ] Toggle has proper ARIA attributes
- [ ] Plan selection tracking works (if implemented)
- [ ] Animations respect prefers-reduced-motion
- [ ] Long feature text wraps properly
- [ ] Badges are readable and accessible
Common Variations
2-Tier Pricing
- Remove middle plan
- Adjust grid to 2 columns
- Both plans equal visual weight or highlight one
4+ Tier Pricing
- Horizontal scroll on mobile
- Or accordion/tabs for mobile
- Feature comparison table more important
Feature Comparison Table
- Separate section below cards
- Full feature matrix
- Plan columns with checkmarks
- "Compare plans" link
Annual Discount Badge
- Show "Save 20%" prominently
- Highlight savings in pricing section
- Animate badge on toggle
Free Trial CTA
- "Start 14-day free trial"
- Emphasize no credit card required
- Convert to paid after trial
Tiered Features
- Group features by category
- Expandable sections for long lists
- Icons for feature categories
Custom Enterprise
- "Contact us" or "Request quote"
- Custom pricing
- Feature list different or hidden
Edge Cases
Very Long Feature Names
- Wrap text to multiple lines
- Maintain consistent height across cards
- Consider truncation with tooltip
Many Features
- Limit visible features (show top 7-10)
- "Show all features" expand button
- Or link to full comparison page
Price Changes During View
- Handle real-time price updates
- Smooth transition, no jarring jumps
- Consider "prices may change" disclaimer
Currency Conversion
- Support multiple currencies
- Currency selector above/below pricing
- Respect user locale
Fractional Pricing
- Handle decimals: $9.99 vs $10
- Consistent decimal formatting
- Cents in smaller font size
AI Agent Implementation Prompt Template
Use this template when asking an AI agent to implement this pricing table:
Create a 3-tier SaaS pricing table with the following specifications:
1. Billing Toggle:
- Monthly/Yearly switch with savings badge
- Smooth toggle animation
- Updates all plan prices simultaneously
2. Three Plan Cards (Starter, Professional, Enterprise):
- Professional plan highlighted as "Most Popular"
- Each card includes: plan name, price, CTA button, feature list
- Price changes animate when billing toggle switches
- Responsive: 3-column grid on desktop, stacked on mobile
3. Visual Design:
- Cards with subtle shadows, highlighted plan more prominent
- Checkmarks for included features, x-marks for unavailable
- Primary CTA for highlighted plan, secondary for others
- Consistent spacing and typography
4. Pricing:
- Starter: $9/mo, $89/yr
- Professional: $29/mo, $279/yr (Most Popular)
- Enterprise: $99/mo, $990/yr
- Show savings on yearly plans
5. Accessibility:
- Keyboard navigation (Tab, Enter, Space)
- ARIA labels for toggle and features
- Screen reader announcements for price changes
- Focus visible on all interactive elements
6. Use [Framework: React/Vue/Angular/Svelte] with [Styling: Tailwind/Chakra/CSS Modules]
7. Animate price changes (250ms fade/slide) and respect prefers-reduced-motion
Reference: UI Potion 3-Tier SaaS Pricing Table
See Also
This pricing table feature works well with these potions:
- Button - For plan CTAs and billing toggle (primary/secondary)
These are suggestions. The pricing table works with any button implementation you choose.
Summary for AI Agents
This 3-tier pricing table is a standard marketing component with billing frequency toggle and feature comparison. Key implementation points:
- Layout: CSS Grid for plans (3 columns desktop, 1 column mobile)
- State: Track billing frequency (monthly/yearly), update prices reactively
- Responsive: Grid to stack transition, adjust typography and spacing
- Animations: Smooth price transitions (250ms), toggle switch animation
- Accessibility: ARIA labels, keyboard navigation, screen reader support
- Framework-agnostic: Adapt patterns to any framework's component model
Generate clean, semantic HTML with proper component separation. Use framework-specific state management patterns and CSS methodology as specified by the user. Prioritize conversion optimization with clear visual hierarchy and prominent CTAs.