Implemented pricing page
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user