diff --git a/app/pricing/page.tsx b/app/pricing/page.tsx index 6e21f9f..1aa984f 100644 --- a/app/pricing/page.tsx +++ b/app/pricing/page.tsx @@ -18,7 +18,7 @@ const PricingPage = () => { }; const getPrice = (basePrice: number) => { - return isYearly ? basePrice * 10 : basePrice; + return isYearly ? Math.round(basePrice * 10 * 0.8) : basePrice; }; const getBillingPeriod = () => { @@ -39,34 +39,23 @@ const PricingPage = () => { {/* Pricing Toggle (Monthly/Yearly) */}
-
+
- - -
{/* Pricing Cards Grid */} -
+
{ 'Traffic & performance insights', ]} ctaText="Start Deploying" - ctaHref="#" + ctaHref="/signup?plan=start" /> { 'Email support', ]} ctaText="Start a free trial" - ctaHref="#" + ctaHref="/signup?plan=pro" isPopular={true} /> { 'Advanced Support', ]} ctaText="Contact Sales" - ctaHref="#" + ctaHref="/contact-sales" />
diff --git a/components/pricing-card.tsx b/components/pricing-card.tsx index 0b9b821..4a04f49 100644 --- a/components/pricing-card.tsx +++ b/components/pricing-card.tsx @@ -22,48 +22,61 @@ const PricingCard: React.FC = ({ }) => { const { theme } = useTheme(); + // Add ARIA label for screen readers + const cardAriaLabel = `${title} pricing plan - $${price}/${billingPeriod}`; + const cardBg = theme === 'dark' ? 'bg-gray-800' : 'bg-white'; const cardText = theme === 'dark' ? 'text-gray-100' : 'text-gray-900'; const cardBorder = theme === 'dark' ? 'border-gray-700' : 'border-gray-200'; const cardShadow = theme === 'dark' ? 'shadow-lg' : 'shadow-sm'; - const cardHover = theme === 'dark' ? 'hover:bg-gray-700' : 'hover:bg-indigo-700'; + const cardHover = theme === 'dark' ? 'hover:bg-gray-700' : 'hover:bg-indigo-600'; const cardFocus = theme === 'dark' ? 'focus:ring-indigo-500' : 'focus:ring-indigo-500'; const cardPopular = theme === 'dark' ? 'bg-indigo-700' : 'bg-indigo-600'; const cardFeatureText = theme === 'dark' ? 'text-gray-300' : 'text-gray-700'; const cardFeatureIcon = theme === 'dark' ? 'text-green-400' : 'text-green-500'; + const cardHoverShadow = theme === 'dark' ? 'hover:shadow-xl' : 'hover:shadow-2xl'; + const cardTransition = 'transition-all duration-300'; return ( -
+
{isPopular && ( -
+
Popular
)}
-

{title}

-

+

{title}

+

{title === 'Start' && 'The perfect starting place for your web app or personal project.'} {title === 'Pro' && 'Everything you need to build and scale your app.'} {title === 'Premium' && 'Critical security, performance, observability, platform SLAs, and support.'}

-

+

{price} - /{billingPeriod} + /{billingPeriod}

{ctaText}

What's included:

-
    +
      {features.map((feature, index) => (
    • = ({ ); }; -export default PricingCard; \ No newline at end of file +export default React.memo(PricingCard); \ No newline at end of file diff --git a/components/ui/header.tsx b/components/ui/header.tsx index 8cc446d..c127c6d 100644 --- a/components/ui/header.tsx +++ b/components/ui/header.tsx @@ -32,6 +32,14 @@ const ThemeToggle = dynamic(() => import('./theme-toggle').then(mod => mod.defau ssr: false, }); +const ThemeToggleWrapper = () => { + return ( +
      + +
      + ); +}; + export function Header({ className, isLoggedIn = false, isAdmin = false }: HeaderProps) { const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [profileOpen, setProfileOpen] = useState(false) @@ -108,9 +116,7 @@ export function Header({ className, isLoggedIn = false, isAdmin = false }: Heade ))}
-
- -
+
)}