Compare commits

...

1 Commits

Author SHA1 Message Date
kbe
a1e49a1e1a Implemented pricing page 2025-08-14 18:38:57 +02:00
3 changed files with 40 additions and 32 deletions

View File

@@ -37,10 +37,10 @@ const PricingPage = () => {
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-16"> <div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div className="text-center"> <div className="text-center">
<h1 className="text-3xl font-extrabold sm:text-4xl md:text-5xl transition-all duration-300"> <h1 className="text-3xl font-extrabold sm:text-4xl md:text-5xl transition-all duration-300">
Find a plan to power your apps. Transform your food photos with AI
</h1> </h1>
<p className="mt-3 text-lg sm:text-xl transition-opacity duration-300"> <p className="mt-3 text-lg sm:text-xl transition-opacity duration-300">
Dishpix supports teams of all sizes, with pricing that scales. Choose the perfect plan to enhance your culinary photography with cutting-edge AI technology.
</p> </p>
<p className="mt-2 text-sm font-medium text-indigo-600 dark:text-indigo-400 transition-colors duration-300"> <p className="mt-2 text-sm font-medium text-indigo-600 dark:text-indigo-400 transition-colors duration-300">
{getDiscountBadge().text} {getDiscountBadge().text}
@@ -53,19 +53,19 @@ const PricingPage = () => {
{/* Pricing Cards Grid */} {/* Pricing Cards Grid */}
<div className="mt-12 sm:mt-16 lg:mt-20 space-y-8 sm:space-y-12 md:space-y-16 lg:space-y-0 sm:grid sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 sm:gap-6 lg:gap-8 transition-all duration-300"> <div className="mt-12 sm:mt-16 lg:mt-20 space-y-8 sm:space-y-12 md:space-y-16 lg:space-y-0 sm:grid sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 sm:gap-6 lg:gap-8 transition-all duration-300">
<PricingCard <PricingCard
title="Start" title="Basic"
price={`$${getPrice(9)}`} price={`$${getPrice(9)}`}
billingPeriod={getBillingPeriod()} billingPeriod={getBillingPeriod()}
features={[ features={[
'Import your repo, deploy in seconds', 'Enhance up to 50 food photos/month',
'Automatic CI/CD', 'Basic AI food recognition',
'Web Application Firewall', 'Standard lighting correction',
'Global, automated CDN', 'Color enhancement',
'Fluid compute', 'Remove minor blemishes',
'DDoS Mitigation', 'Basic background cleanup',
'Traffic & performance insights', 'Standard resolution exports',
]} ]}
ctaText="Start Deploying" ctaText="Start Enhancing"
ctaHref="#" ctaHref="#"
/> />
<PricingCard <PricingCard
@@ -73,32 +73,37 @@ const PricingPage = () => {
price={`$${getPrice(29)}`} price={`$${getPrice(29)}`}
billingPeriod={getBillingPeriod()} billingPeriod={getBillingPeriod()}
features={[ features={[
'Everything in Start, plus:', 'Everything in Basic, plus:',
'10x more included usage', 'Enhance up to 500 food photos/month',
'Observability tools', 'Advanced AI food styling',
'Faster builds', 'Professional lighting simulation',
'Cold start prevention', 'Gourmet color grading',
'Advanced WAF Protection', 'Remove unwanted objects',
'Email support', 'AI-powered ingredient recognition',
'High-resolution exports',
'Priority processing',
]} ]}
ctaText="Start a free trial" ctaText="Start free trial"
ctaHref="#" ctaHref="#"
isPopular={true} isPopular={true}
/> />
<PricingCard <PricingCard
title="Premium" title="MasterChef"
price={`$${getPrice(99)}`} price={`$${getPrice(99)}`}
billingPeriod={getBillingPeriod()} billingPeriod={getBillingPeriod()}
features={[ features={[
'Everything in Pro, plus:', 'Everything in Pro, plus:',
'Guest & Team access controls', 'Unlimited food photo enhancements',
'SCIM & Directory Sync', 'AI-generated food styling suggestions',
'Managed WAF Rulesets', 'Restaurant-quality presentation',
'Multi-region compute & failover', 'Advanced background replacement',
'99.99% SLA', 'Multi-dish composition',
'Advanced Support', 'Professional food photography presets',
'4K resolution exports',
'Batch processing capabilities',
'Priority support',
]} ]}
ctaText="Contact Sales" ctaText="Get Started"
ctaHref="#" ctaHref="#"
/> />
</div> </div>

View File

@@ -35,16 +35,19 @@ const PricingCard: React.FC<PricingCardProps> = ({
return ( return (
<div className={`flex flex-col ${cardBg} border ${cardBorder} rounded-xl ${cardShadow} overflow-hidden transition-all duration-300 transform hover:scale-105`}> <div className={`flex flex-col ${cardBg} border ${cardBorder} rounded-xl ${cardShadow} overflow-hidden transition-all duration-300 transform hover:scale-105`}>
{isPopular && ( {isPopular && (
<div className={`${cardPopular} text-white text-xs font-semibold px-3 py-1.5 rounded-t-xl`}> <div className={`${cardPopular} px-3 py-1.5 text-center text-white text-xs font-semibold rounded-t-xl`}>
Most Popular Most Popular
</div> </div>
)} )}
{!isPopular && (
<div className="py-3.5"></div>
)}
<div className="p-6"> <div className="p-6">
<h3 className={`text-2xl font-bold ${cardText}`}>{title}</h3> <h3 className={`text-2xl font-bold ${cardText}`}>{title}</h3>
<p className="mt-4 text-sm text-gray-400"> <p className="mt-4 text-sm text-gray-400">
{title === 'Start' && 'The perfect starting place for your web app or personal project.'} {title === 'Basic' && 'Perfect for food bloggers and home cooks looking to enhance their culinary photography.'}
{title === 'Pro' && 'Everything you need to build and scale your app.'} {title === 'Pro' && 'Everything you need to showcase restaurant dishes professionally and attract more customers.'}
{title === 'Premium' && 'Critical security, performance, observability, platform SLAs, and support.'} {title === 'MasterChef' && 'Complete professional suite for food photographers and culinary brands demanding perfection.'}
</p> </p>
<p className="mt-8"> <p className="mt-8">
<span className="text-5xl font-extrabold">{price}</span> <span className="text-5xl font-extrabold">{price}</span>

View File

@@ -11,7 +11,7 @@ interface ThemeContextType {
const ThemeContext = createContext<ThemeContextType | undefined>(undefined); const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
export const ThemeProvider: React.FC<{ children: ReactNode }> = ({ children }) => { export const ThemeProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
const [theme, setTheme] = useState<Theme>('dark'); // Default to dark mode const [theme, setTheme] = useState<Theme>('light'); // Default to light mode (white backgrounds)
useEffect(() => { useEffect(() => {
const savedTheme = localStorage.getItem('theme') as Theme | null; const savedTheme = localStorage.getItem('theme') as Theme | null;