+
Monthly
-
-
-
Yearly
@@ -75,7 +64,7 @@ const PricingPage = () => {
{/* 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
))}
-
-
-
+
)}