Pricing.jsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { Link } from 'react-router-dom';
  2. import { useState } from 'react';
  3. import { useLanguage } from '../context/LanguageContext';
  4. function Pricing() {
  5. const [hoveredPlan, setHoveredPlan] = useState(null);
  6. const { t } = useLanguage();
  7. const plans = [
  8. {
  9. name: 'Starter',
  10. price: '29',
  11. features: [
  12. 'Basic AI trend analysis',
  13. '25 AI image generations/month',
  14. 'Basic analytics dashboard',
  15. 'Content calendar',
  16. 'Email support',
  17. 'Single user'
  18. ],
  19. },
  20. {
  21. name: 'Professional',
  22. price: '99',
  23. popular: true,
  24. features: [
  25. 'Advanced AI trend predictions',
  26. '150 AI image generations/month',
  27. 'Advanced analytics & insights',
  28. 'Content strategy AI assistant',
  29. 'Priority support',
  30. 'Up to 3 team members',
  31. 'Brand growth recommendations',
  32. 'Social media scheduling'
  33. ],
  34. },
  35. {
  36. name: 'Business',
  37. price: '249',
  38. features: [
  39. 'Custom AI solutions',
  40. 'Unlimited image generations',
  41. 'Multi-brand analytics',
  42. 'Dedicated account manager',
  43. 'API access',
  44. 'Unlimited team members',
  45. 'Custom integrations',
  46. 'White-label reports'
  47. ],
  48. },
  49. ];
  50. return (
  51. <div className="py-24 sm:py-32 relative overflow-hidden">
  52. {/* Background elements */}
  53. <div className="absolute inset-0 pointer-events-none">
  54. <div className="absolute top-1/4 left-0 w-72 h-72 bg-brand-purple/10 rounded-full blur-3xl"></div>
  55. <div className="absolute bottom-1/4 right-0 w-72 h-72 bg-brand-pink/10 rounded-full blur-3xl"></div>
  56. </div>
  57. <div className="mx-auto max-w-7xl px-6 lg:px-8 relative">
  58. <div className="mx-auto max-w-4xl text-center">
  59. <h2 className="text-base font-semibold leading-7 text-brand-purple inline-flex items-center gap-2">
  60. {t('pricing.title')}
  61. <span className="inline-block w-1 h-1 bg-brand-pink rounded-full animate-pulse"></span>
  62. </h2>
  63. <p className="mt-2 text-4xl font-bold tracking-tight text-gray-900 sm:text-5xl relative">
  64. {t('pricing.subtitle')}
  65. <span className="absolute -top-1 -right-1 w-2 h-2 bg-brand-blue rounded-full"></span>
  66. </p>
  67. <p className="mt-6 text-lg leading-8 text-gray-600">
  68. {t('pricing.description')}
  69. </p>
  70. </div>
  71. <div className="mt-16 grid grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3 relative">
  72. {plans.map((plan) => (
  73. <div
  74. key={plan.name}
  75. className={`relative rounded-3xl p-8 transition-all duration-300
  76. ${plan.popular ? 'ring-2 ring-brand-purple' : 'ring-1 ring-gray-200'}
  77. ${hoveredPlan === plan.name ? 'transform scale-105 bg-gradient-to-br from-white to-brand-light' : ''}`}
  78. onMouseEnter={() => setHoveredPlan(plan.name)}
  79. onMouseLeave={() => setHoveredPlan(null)}
  80. >
  81. {plan.popular && (
  82. <span className="absolute -top-4 left-1/2 -translate-x-1/2 bg-brand-purple text-white text-xs px-4 py-1 rounded-full">
  83. {t('pricing.mostPopular')}
  84. </span>
  85. )}
  86. <h3 className="text-lg font-semibold leading-8 text-gray-900">{plan.name}</h3>
  87. <p className="mt-4 flex items-baseline">
  88. <span className="text-5xl font-bold tracking-tight text-gray-900">${plan.price}</span>
  89. <span className="ml-2 text-sm text-gray-600">{t('pricing.perMonth')}</span>
  90. </p>
  91. <ul className="mt-8 space-y-3 text-sm leading-6 text-gray-600">
  92. {plan.features.map((feature, index) => (
  93. <li
  94. key={feature}
  95. className="flex gap-x-3 items-center transition-all duration-300"
  96. style={{
  97. transform: hoveredPlan === plan.name ? 'translateX(8px)' : 'none',
  98. transitionDelay: `${index * 50}ms`
  99. }}
  100. >
  101. <svg className="h-6 w-5 flex-none text-black" viewBox="0 0 20 20" fill="currentColor">
  102. <path fillRule="evenodd" d="M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z" clipRule="evenodd" />
  103. </svg>
  104. {feature}
  105. </li>
  106. ))}
  107. </ul>
  108. <Link
  109. to={`/register?plan=${plan.name.toLowerCase()}`}
  110. className={`mt-8 block rounded-full px-8 py-4 text-center text-sm font-semibold shadow-sm transition-all duration-300
  111. ${plan.popular
  112. ? 'bg-brand-purple text-white hover:bg-brand-purple/90'
  113. : 'bg-brand-light text-black hover:bg-brand-light/80'
  114. }`}
  115. >
  116. {t('pricing.getStarted')} {plan.name}
  117. </Link>
  118. </div>
  119. ))}
  120. </div>
  121. <div className="mt-16 text-center">
  122. <p className="text-gray-600 text-sm flex items-center justify-center gap-2">
  123. <span className="w-1 h-1 bg-gray-400 rounded-full"></span>
  124. {t('pricing.trial')}
  125. <span className="w-1 h-1 bg-gray-400 rounded-full"></span>
  126. </p>
  127. </div>
  128. </div>
  129. </div>
  130. );
  131. }
  132. export default Pricing;