@promakeai/cli 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/index.js +415 -209
  2. package/dist/registry/about-page.json +3 -3
  3. package/dist/registry/about-section.json +4 -4
  4. package/dist/registry/animations.json +2 -2
  5. package/dist/registry/announcement-bar.json +4 -4
  6. package/dist/registry/api.json +1 -1
  7. package/dist/registry/auth-core.json +3 -3
  8. package/dist/registry/auth.json +70 -0
  9. package/dist/registry/bento-grid-section.json +4 -4
  10. package/dist/registry/blog-core.json +5 -5
  11. package/dist/registry/blog-list-page.json +3 -3
  12. package/dist/registry/blog-section.json +4 -4
  13. package/dist/registry/cards-carousel-section.json +4 -4
  14. package/dist/registry/cart-drawer.json +3 -3
  15. package/dist/registry/cart-page.json +3 -3
  16. package/dist/registry/case-study-page.json +3 -3
  17. package/dist/registry/category-section.json +3 -3
  18. package/dist/registry/checkout-page.json +3 -3
  19. package/dist/registry/coming-soon-page-minimal.json +4 -4
  20. package/dist/registry/coming-soon-page.json +4 -4
  21. package/dist/registry/contact-info-grid.json +4 -4
  22. package/dist/registry/contact-page-centered.json +4 -4
  23. package/dist/registry/contact-page-split.json +4 -4
  24. package/dist/registry/contact-page.json +3 -3
  25. package/dist/registry/content-section.json +4 -4
  26. package/dist/registry/cookie-consent.json +4 -4
  27. package/dist/registry/cookies-page.json +3 -3
  28. package/dist/registry/cta-section.json +3 -3
  29. package/dist/registry/docs/reset-password-page.md +36 -0
  30. package/dist/registry/ecommerce-core.json +10 -10
  31. package/dist/registry/empty-page.json +3 -3
  32. package/dist/registry/faq-categorized.json +4 -4
  33. package/dist/registry/faq-simple.json +4 -4
  34. package/dist/registry/favorites-blog-block.json +1 -1
  35. package/dist/registry/favorites-blog-page.json +4 -4
  36. package/dist/registry/favorites-ecommerce-block.json +1 -1
  37. package/dist/registry/favorites-ecommerce-page.json +4 -4
  38. package/dist/registry/feature-section.json +3 -3
  39. package/dist/registry/featured-products.json +3 -3
  40. package/dist/registry/footer-detailed.json +4 -4
  41. package/dist/registry/footer-minimal.json +3 -3
  42. package/dist/registry/footer.json +3 -3
  43. package/dist/registry/forgot-password-page-split.json +4 -4
  44. package/dist/registry/forgot-password-page.json +4 -4
  45. package/dist/registry/google-adsense.json +4 -4
  46. package/dist/registry/google-map.json +2 -2
  47. package/dist/registry/header-centered-pill.json +4 -4
  48. package/dist/registry/header-ecommerce.json +3 -3
  49. package/dist/registry/header-mega.json +4 -4
  50. package/dist/registry/header-minimal.json +4 -4
  51. package/dist/registry/header-simple.json +3 -3
  52. package/dist/registry/hero-carousel.json +3 -3
  53. package/dist/registry/hero-cta.json +4 -4
  54. package/dist/registry/hero-gradient.json +4 -4
  55. package/dist/registry/hero-grid.json +4 -4
  56. package/dist/registry/hero-profile.json +3 -3
  57. package/dist/registry/hero.json +3 -3
  58. package/dist/registry/landing-page-app.json +3 -3
  59. package/dist/registry/landing-page-saas.json +3 -3
  60. package/dist/registry/login-page-split.json +4 -4
  61. package/dist/registry/login-page.json +4 -4
  62. package/dist/registry/logo-cloud.json +4 -4
  63. package/dist/registry/masonry-grid.json +3 -3
  64. package/dist/registry/my-orders-page.json +4 -4
  65. package/dist/registry/newsletter-section.json +4 -4
  66. package/dist/registry/order-card-compact.json +1 -1
  67. package/dist/registry/order-confirmation-page.json +4 -4
  68. package/dist/registry/order-detail-block.json +1 -1
  69. package/dist/registry/orders-list-block.json +1 -1
  70. package/dist/registry/payment-success-block.json +1 -1
  71. package/dist/registry/portfolio-page.json +4 -4
  72. package/dist/registry/post-card.json +3 -3
  73. package/dist/registry/post-detail-block.json +1 -1
  74. package/dist/registry/post-detail-page.json +4 -4
  75. package/dist/registry/pricing-card.json +3 -3
  76. package/dist/registry/pricing-page.json +4 -4
  77. package/dist/registry/pricing-section.json +4 -4
  78. package/dist/registry/privacy-page.json +3 -3
  79. package/dist/registry/product-card-detailed.json +4 -4
  80. package/dist/registry/product-card-hover.json +4 -4
  81. package/dist/registry/product-card.json +3 -3
  82. package/dist/registry/product-detail-block.json +1 -1
  83. package/dist/registry/product-detail-page.json +4 -4
  84. package/dist/registry/product-detail-section.json +4 -4
  85. package/dist/registry/product-quick-view.json +4 -4
  86. package/dist/registry/products-page.json +3 -3
  87. package/dist/registry/reading-progress.json +4 -4
  88. package/dist/registry/register-page-split.json +4 -4
  89. package/dist/registry/register-page.json +4 -4
  90. package/dist/registry/related-posts-block.json +1 -1
  91. package/dist/registry/related-products-block.json +1 -1
  92. package/dist/registry/reset-password-page-split.json +4 -4
  93. package/dist/registry/reset-password-page.json +39 -0
  94. package/dist/registry/service-card.json +1 -1
  95. package/dist/registry/share-buttons.json +4 -4
  96. package/dist/registry/skill-card.json +1 -1
  97. package/dist/registry/team-page.json +4 -4
  98. package/dist/registry/terms-page.json +3 -3
  99. package/dist/registry/testimonials-carousel.json +4 -4
  100. package/dist/registry/testimonials-grid.json +4 -4
  101. package/dist/registry/timeline-section.json +4 -4
  102. package/dist/registry/video-hero.json +4 -4
  103. package/dist/registry/youtube-embed.json +4 -4
  104. package/package.json +2 -2
  105. package/template/.env +6 -6
  106. package/template/public/_redirects +1 -1
  107. package/template/public/robots.txt +14 -14
  108. package/template/src/components/GoogleAnalytics.tsx +34 -34
  109. package/template/src/components/LanguageSwitcher.tsx +53 -53
  110. package/template/src/components/ScriptInjector.tsx +62 -62
  111. package/template/src/lib/env.ts +19 -19
  112. package/template/src/router.tsx +14 -14
  113. package/template/src/vite-env.d.ts +1 -1
@@ -14,7 +14,7 @@
14
14
  "path": "payment-success-block/index.ts",
15
15
  "type": "registry:index",
16
16
  "target": "$modules$/payment-success-block/index.ts",
17
- "content": "export * from './payment-success-block';\n"
17
+ "content": "export * from './payment-success-block';\r\n"
18
18
  },
19
19
  {
20
20
  "path": "payment-success-block/payment-success-block.tsx",
@@ -14,25 +14,25 @@
14
14
  "path": "portfolio-page/portfolio-page.tsx",
15
15
  "type": "registry:component",
16
16
  "target": "$modules$/portfolio-page/portfolio-page.tsx",
17
- "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Link } from \"react-router\";\nimport { cn } from \"@/lib/utils\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { Layout } from \"@/components/Layout\";\nimport { Button } from \"@/components/ui/button\";\nimport { FadeIn } from \"@/modules/animations\";\n\ninterface PortfolioItem {\n id: string;\n title: string;\n category: string;\n image: string;\n description?: string;\n link?: string;\n}\n\ninterface PortfolioPageProps {\n items?: PortfolioItem[];\n categories?: string[];\n title?: string;\n subtitle?: string;\n className?: string;\n}\n\nconst defaultItems: PortfolioItem[] = [\n {\n id: \"1\",\n title: \"E-commerce Platform Redesign\",\n category: \"Web Design\",\n image: \"/images/placeholder.png\",\n description: \"Complete redesign of a major e-commerce platform\",\n link: \"/portfolio/1\",\n },\n {\n id: \"2\",\n title: \"Mobile Banking App\",\n category: \"Mobile App\",\n image: \"/images/placeholder.png\",\n description: \"Secure and intuitive mobile banking experience\",\n link: \"/portfolio/2\",\n },\n {\n id: \"3\",\n title: \"Brand Identity System\",\n category: \"Branding\",\n image: \"/images/placeholder.png\",\n description: \"Complete brand identity for a tech startup\",\n link: \"/portfolio/3\",\n },\n {\n id: \"4\",\n title: \"Healthcare Dashboard\",\n category: \"Web Design\",\n image: \"/images/placeholder.png\",\n description: \"Analytics dashboard for healthcare providers\",\n link: \"/portfolio/4\",\n },\n {\n id: \"5\",\n title: \"Fitness Tracking App\",\n category: \"Mobile App\",\n image: \"/images/placeholder.png\",\n description: \"Comprehensive fitness and wellness tracking\",\n link: \"/portfolio/5\",\n },\n {\n id: \"6\",\n title: \"Restaurant Chain Rebrand\",\n category: \"Branding\",\n image: \"/images/placeholder.png\",\n description: \"Modern rebrand for a national restaurant chain\",\n link: \"/portfolio/6\",\n },\n];\n\nconst defaultCategories = [\"All\", \"Web Design\", \"Mobile App\", \"Branding\"];\n\nexport function PortfolioPage({\n items = defaultItems,\n categories = defaultCategories,\n title,\n subtitle,\n className,\n}: PortfolioPageProps) {\n const { t } = useTranslation(\"portfolio-page\");\n usePageTitle({ title: t(\"pageTitle\") });\n const [activeCategory, setActiveCategory] = useState(\"All\");\n\n const displayTitle = title ?? t(\"title\");\n const displaySubtitle = subtitle ?? t(\"subtitle\");\n\n const filteredItems =\n activeCategory === \"All\"\n ? items\n : items.filter((item) => item.category === activeCategory);\n\n return (\n <Layout>\n <div className={cn(\"min-h-screen py-12 md:py-16\", className)}>\n <div className=\"container max-w-[var(--container-max-width)] mx-auto px-4\">\n {/* Header */}\n <FadeIn className=\"text-center mb-12\">\n <h1 className=\"text-4xl md:text-5xl font-bold mb-4\">{displayTitle}</h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {displaySubtitle}\n </p>\n </FadeIn>\n\n {/* Category Filter */}\n <FadeIn delay={0.1} className=\"flex flex-wrap justify-center gap-2 mb-12\">\n {categories.map((category) => (\n <Button\n key={category}\n variant={activeCategory === category ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => setActiveCategory(category)}\n className=\"rounded-full\"\n >\n {category}\n </Button>\n ))}\n </FadeIn>\n\n {/* Portfolio Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n {filteredItems.map((item, index) => (\n <FadeIn key={item.id} delay={index * 0.05}>\n <Link\n to={item.link || `/portfolio/${item.id}`}\n className=\"group block\"\n >\n <div className=\"relative overflow-hidden rounded-xl bg-muted aspect-[4/3]\">\n <img\n src={item.image}\n alt={item.title}\n className=\"w-full h-full object-cover transition-transform duration-500 group-hover:scale-110\"\n />\n {/* Overlay */}\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300\">\n <div className=\"absolute bottom-0 left-0 right-0 p-6 translate-y-4 group-hover:translate-y-0 transition-transform duration-300\">\n <span className=\"inline-block text-sm text-primary-foreground/80 bg-primary/80 px-3 py-1 rounded-full mb-2\">\n {item.category}\n </span>\n <h3 className=\"text-xl font-bold text-white mb-1\">\n {item.title}\n </h3>\n {item.description && (\n <p className=\"text-white/80 text-sm line-clamp-2\">\n {item.description}\n </p>\n )}\n </div>\n </div>\n </div>\n </Link>\n </FadeIn>\n ))}\n </div>\n\n {/* Empty State */}\n {filteredItems.length === 0 && (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{t(\"noItems\")}</p>\n </div>\n )}\n </div>\n </div>\n </Layout>\n );\n}\n\nexport default PortfolioPage;\n"
17
+ "content": "\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link } from \"react-router\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { usePageTitle } from \"@/hooks/use-page-title\";\r\nimport { Layout } from \"@/components/Layout\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { FadeIn } from \"@/modules/animations\";\r\n\r\ninterface PortfolioItem {\r\n id: string;\r\n title: string;\r\n category: string;\r\n image: string;\r\n description?: string;\r\n link?: string;\r\n}\r\n\r\ninterface PortfolioPageProps {\r\n items?: PortfolioItem[];\r\n categories?: string[];\r\n title?: string;\r\n subtitle?: string;\r\n className?: string;\r\n}\r\n\r\nconst defaultItems: PortfolioItem[] = [\r\n {\r\n id: \"1\",\r\n title: \"E-commerce Platform Redesign\",\r\n category: \"Web Design\",\r\n image: \"/images/placeholder.png\",\r\n description: \"Complete redesign of a major e-commerce platform\",\r\n link: \"/portfolio/1\",\r\n },\r\n {\r\n id: \"2\",\r\n title: \"Mobile Banking App\",\r\n category: \"Mobile App\",\r\n image: \"/images/placeholder.png\",\r\n description: \"Secure and intuitive mobile banking experience\",\r\n link: \"/portfolio/2\",\r\n },\r\n {\r\n id: \"3\",\r\n title: \"Brand Identity System\",\r\n category: \"Branding\",\r\n image: \"/images/placeholder.png\",\r\n description: \"Complete brand identity for a tech startup\",\r\n link: \"/portfolio/3\",\r\n },\r\n {\r\n id: \"4\",\r\n title: \"Healthcare Dashboard\",\r\n category: \"Web Design\",\r\n image: \"/images/placeholder.png\",\r\n description: \"Analytics dashboard for healthcare providers\",\r\n link: \"/portfolio/4\",\r\n },\r\n {\r\n id: \"5\",\r\n title: \"Fitness Tracking App\",\r\n category: \"Mobile App\",\r\n image: \"/images/placeholder.png\",\r\n description: \"Comprehensive fitness and wellness tracking\",\r\n link: \"/portfolio/5\",\r\n },\r\n {\r\n id: \"6\",\r\n title: \"Restaurant Chain Rebrand\",\r\n category: \"Branding\",\r\n image: \"/images/placeholder.png\",\r\n description: \"Modern rebrand for a national restaurant chain\",\r\n link: \"/portfolio/6\",\r\n },\r\n];\r\n\r\nconst defaultCategories = [\"All\", \"Web Design\", \"Mobile App\", \"Branding\"];\r\n\r\nexport function PortfolioPage({\r\n items = defaultItems,\r\n categories = defaultCategories,\r\n title,\r\n subtitle,\r\n className,\r\n}: PortfolioPageProps) {\r\n const { t } = useTranslation(\"portfolio-page\");\r\n usePageTitle({ title: t(\"pageTitle\") });\r\n const [activeCategory, setActiveCategory] = useState(\"All\");\r\n\r\n const displayTitle = title ?? t(\"title\");\r\n const displaySubtitle = subtitle ?? t(\"subtitle\");\r\n\r\n const filteredItems =\r\n activeCategory === \"All\"\r\n ? items\r\n : items.filter((item) => item.category === activeCategory);\r\n\r\n return (\r\n <Layout>\r\n <div className={cn(\"min-h-screen py-12 md:py-16\", className)}>\r\n <div className=\"container max-w-[var(--container-max-width)] mx-auto px-4\">\r\n {/* Header */}\r\n <FadeIn className=\"text-center mb-12\">\r\n <h1 className=\"text-4xl md:text-5xl font-bold mb-4\">{displayTitle}</h1>\r\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\r\n {displaySubtitle}\r\n </p>\r\n </FadeIn>\r\n\r\n {/* Category Filter */}\r\n <FadeIn delay={0.1} className=\"flex flex-wrap justify-center gap-2 mb-12\">\r\n {categories.map((category) => (\r\n <Button\r\n key={category}\r\n variant={activeCategory === category ? \"default\" : \"outline\"}\r\n size=\"sm\"\r\n onClick={() => setActiveCategory(category)}\r\n className=\"rounded-full\"\r\n >\r\n {category}\r\n </Button>\r\n ))}\r\n </FadeIn>\r\n\r\n {/* Portfolio Grid */}\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\r\n {filteredItems.map((item, index) => (\r\n <FadeIn key={item.id} delay={index * 0.05}>\r\n <Link\r\n to={item.link || `/portfolio/${item.id}`}\r\n className=\"group block\"\r\n >\r\n <div className=\"relative overflow-hidden rounded-xl bg-muted aspect-[4/3]\">\r\n <img\r\n src={item.image}\r\n alt={item.title}\r\n className=\"w-full h-full object-cover transition-transform duration-500 group-hover:scale-110\"\r\n />\r\n {/* Overlay */}\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300\">\r\n <div className=\"absolute bottom-0 left-0 right-0 p-6 translate-y-4 group-hover:translate-y-0 transition-transform duration-300\">\r\n <span className=\"inline-block text-sm text-primary-foreground/80 bg-primary/80 px-3 py-1 rounded-full mb-2\">\r\n {item.category}\r\n </span>\r\n <h3 className=\"text-xl font-bold text-white mb-1\">\r\n {item.title}\r\n </h3>\r\n {item.description && (\r\n <p className=\"text-white/80 text-sm line-clamp-2\">\r\n {item.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </Link>\r\n </FadeIn>\r\n ))}\r\n </div>\r\n\r\n {/* Empty State */}\r\n {filteredItems.length === 0 && (\r\n <div className=\"text-center py-12\">\r\n <p className=\"text-muted-foreground\">{t(\"noItems\")}</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n}\r\n\r\nexport default PortfolioPage;\r\n"
18
18
  },
19
19
  {
20
20
  "path": "portfolio-page/index.ts",
21
21
  "type": "registry:index",
22
22
  "target": "$modules$/portfolio-page/index.ts",
23
- "content": "export * from \"./portfolio-page\";\nexport { PortfolioPage as default } from \"./portfolio-page\";\n"
23
+ "content": "export * from \"./portfolio-page\";\r\nexport { PortfolioPage as default } from \"./portfolio-page\";\r\n"
24
24
  },
25
25
  {
26
26
  "path": "portfolio-page/lang/en.json",
27
27
  "type": "registry:lang",
28
28
  "target": "$modules$/portfolio-page/lang/en.json",
29
- "content": "{\n \"pageTitle\": \"Portfolio\",\n \"title\": \"Our Portfolio\",\n \"subtitle\": \"Showcase of our best work and projects.\",\n \"noItems\": \"No projects found in this category.\"\n}"
29
+ "content": "{\r\n \"pageTitle\": \"Portfolio\",\r\n \"title\": \"Our Portfolio\",\r\n \"subtitle\": \"Showcase of our best work and projects.\",\r\n \"noItems\": \"No projects found in this category.\"\r\n}"
30
30
  },
31
31
  {
32
32
  "path": "portfolio-page/lang/tr.json",
33
33
  "type": "registry:lang",
34
34
  "target": "$modules$/portfolio-page/lang/tr.json",
35
- "content": "{\n \"pageTitle\": \"Portfolyo\",\n \"title\": \"Portfolyomuz\",\n \"subtitle\": \"En iyi çalışmalarımız ve projelerimiz.\",\n \"noItems\": \"Bu kategoride proje bulunamadı.\"\n}"
35
+ "content": "{\r\n \"pageTitle\": \"Portfolyo\",\r\n \"title\": \"Portfolyomuz\",\r\n \"subtitle\": \"En iyi çalışmalarımız ve projelerimiz.\",\r\n \"noItems\": \"Bu kategoride proje bulunamadı.\"\r\n}"
36
36
  }
37
37
  ],
38
38
  "exports": {
@@ -12,7 +12,7 @@
12
12
  "path": "post-card/index.ts",
13
13
  "type": "registry:index",
14
14
  "target": "$modules$/post-card/index.ts",
15
- "content": "export * from './post-card';\n"
15
+ "content": "export * from './post-card';\r\n"
16
16
  },
17
17
  {
18
18
  "path": "post-card/post-card.tsx",
@@ -24,13 +24,13 @@
24
24
  "path": "post-card/lang/en.json",
25
25
  "type": "registry:lang",
26
26
  "target": "$modules$/post-card/lang/en.json",
27
- "content": "{\n \"readMore\": \"Read More\",\n \"minRead\": \"min read\",\n \"views\": \"views\",\n \"published\": \"Published\",\n \"category\": \"Category\",\n \"tags\": \"Tags\",\n \"featured\": \"Featured\"\n}\n"
27
+ "content": "{\r\n \"readMore\": \"Read More\",\r\n \"minRead\": \"min read\",\r\n \"views\": \"views\",\r\n \"published\": \"Published\",\r\n \"category\": \"Category\",\r\n \"tags\": \"Tags\",\r\n \"featured\": \"Featured\"\r\n}\r\n"
28
28
  },
29
29
  {
30
30
  "path": "post-card/lang/tr.json",
31
31
  "type": "registry:lang",
32
32
  "target": "$modules$/post-card/lang/tr.json",
33
- "content": "{\n \"readMore\": \"Devamını Oku\",\n \"minRead\": \"dk okuma\",\n \"views\": \"görüntüleme\",\n \"published\": \"Yayınlandı\",\n \"category\": \"Kategori\",\n \"tags\": \"Etiketler\",\n \"featured\": \"Öne Çıkan\"\n}\n"
33
+ "content": "{\r\n \"readMore\": \"Devamını Oku\",\r\n \"minRead\": \"dk okuma\",\r\n \"views\": \"görüntüleme\",\r\n \"published\": \"Yayınlandı\",\r\n \"category\": \"Kategori\",\r\n \"tags\": \"Etiketler\",\r\n \"featured\": \"Öne Çıkan\"\r\n}\r\n"
34
34
  }
35
35
  ],
36
36
  "exports": {
@@ -12,7 +12,7 @@
12
12
  "path": "post-detail-block/index.ts",
13
13
  "type": "registry:index",
14
14
  "target": "$modules$/post-detail-block/index.ts",
15
- "content": "export * from './post-detail-block';\n"
15
+ "content": "export * from './post-detail-block';\r\n"
16
16
  },
17
17
  {
18
18
  "path": "post-detail-block/post-detail-block.tsx",
@@ -17,25 +17,25 @@
17
17
  "path": "post-detail-page/index.ts",
18
18
  "type": "registry:index",
19
19
  "target": "$modules$/post-detail-page/index.ts",
20
- "content": "export * from './post-detail-page';\nexport { PostDetailPage as default } from './post-detail-page';\n"
20
+ "content": "export * from './post-detail-page';\r\nexport { PostDetailPage as default } from './post-detail-page';\r\n"
21
21
  },
22
22
  {
23
23
  "path": "post-detail-page/post-detail-page.tsx",
24
24
  "type": "registry:page",
25
25
  "target": "$modules$/post-detail-page/post-detail-page.tsx",
26
- "content": "import { useParams } from \"react-router\";\nimport { usePostBySlug } from \"@/modules/blog-core\";\nimport { PostDetailBlock } from \"@/modules/post-detail-block\";\nimport { Layout } from \"@/components/Layout\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useTranslation } from \"react-i18next\";\n\nexport function PostDetailPage() {\n const { t } = useTranslation(\"post-detail-page\");\n const { slug } = useParams<{ slug: string }>();\n const { post, loading, error } = usePostBySlug(slug || \"\");\n\n usePageTitle({ title: post?.title || t(\"loading\", \"Loading...\") });\n\n if (loading) {\n return (\n <Layout>\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4 py-8\">\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-muted rounded w-1/3\"></div>\n <div className=\"h-4 bg-muted rounded w-1/4\"></div>\n <div className=\"h-64 bg-muted rounded\"></div>\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-muted rounded\"></div>\n <div className=\"h-4 bg-muted rounded\"></div>\n <div className=\"h-4 bg-muted rounded w-3/4\"></div>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n if (error || !post) {\n return (\n <Layout>\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4 py-8 text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">{t(\"notFound\", \"Post Not Found\")}</h1>\n <p className=\"text-muted-foreground\">{t(\"notFoundDescription\", \"The post you're looking for doesn't exist or has been removed.\")}</p>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout>\n <PostDetailBlock post={post} />\n </Layout>\n );\n}\n\nexport default PostDetailPage;\n"
26
+ "content": "import { useParams } from \"react-router\";\r\nimport { usePostBySlug } from \"@/modules/blog-core\";\r\nimport { PostDetailBlock } from \"@/modules/post-detail-block\";\r\nimport { Layout } from \"@/components/Layout\";\r\nimport { usePageTitle } from \"@/hooks/use-page-title\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nexport function PostDetailPage() {\r\n const { t } = useTranslation(\"post-detail-page\");\r\n const { slug } = useParams<{ slug: string }>();\r\n const { post, loading, error } = usePostBySlug(slug || \"\");\r\n\r\n usePageTitle({ title: post?.title || t(\"loading\", \"Loading...\") });\r\n\r\n if (loading) {\r\n return (\r\n <Layout>\r\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4 py-8\">\r\n <div className=\"animate-pulse space-y-4\">\r\n <div className=\"h-8 bg-muted rounded w-1/3\"></div>\r\n <div className=\"h-4 bg-muted rounded w-1/4\"></div>\r\n <div className=\"h-64 bg-muted rounded\"></div>\r\n <div className=\"space-y-2\">\r\n <div className=\"h-4 bg-muted rounded\"></div>\r\n <div className=\"h-4 bg-muted rounded\"></div>\r\n <div className=\"h-4 bg-muted rounded w-3/4\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n }\r\n\r\n if (error || !post) {\r\n return (\r\n <Layout>\r\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4 py-8 text-center\">\r\n <h1 className=\"text-2xl font-bold mb-4\">{t(\"notFound\", \"Post Not Found\")}</h1>\r\n <p className=\"text-muted-foreground\">{t(\"notFoundDescription\", \"The post you're looking for doesn't exist or has been removed.\")}</p>\r\n </div>\r\n </Layout>\r\n );\r\n }\r\n\r\n return (\r\n <Layout>\r\n <PostDetailBlock post={post} />\r\n </Layout>\r\n );\r\n}\r\n\r\nexport default PostDetailPage;\r\n"
27
27
  },
28
28
  {
29
29
  "path": "post-detail-page/lang/en.json",
30
30
  "type": "registry:lang",
31
31
  "target": "$modules$/post-detail-page/lang/en.json",
32
- "content": "{\n \"loading\": \"Loading...\",\n \"notFound\": \"Post Not Found\",\n \"notFoundDescription\": \"The post you're looking for doesn't exist or has been removed.\"\n}\n"
32
+ "content": "{\r\n \"loading\": \"Loading...\",\r\n \"notFound\": \"Post Not Found\",\r\n \"notFoundDescription\": \"The post you're looking for doesn't exist or has been removed.\"\r\n}\r\n"
33
33
  },
34
34
  {
35
35
  "path": "post-detail-page/lang/tr.json",
36
36
  "type": "registry:lang",
37
37
  "target": "$modules$/post-detail-page/lang/tr.json",
38
- "content": "{\n \"loading\": \"Yükleniyor...\",\n \"notFound\": \"Yazı Bulunamadı\",\n \"notFoundDescription\": \"Aradığınız yazı mevcut değil veya kaldırılmış.\"\n}\n"
38
+ "content": "{\r\n \"loading\": \"Yükleniyor...\",\r\n \"notFound\": \"Yazı Bulunamadı\",\r\n \"notFoundDescription\": \"Aradığınız yazı mevcut değil veya kaldırılmış.\"\r\n}\r\n"
39
39
  }
40
40
  ],
41
41
  "exports": {
@@ -10,7 +10,7 @@
10
10
  "path": "pricing-card/index.ts",
11
11
  "type": "registry:index",
12
12
  "target": "$modules$/pricing-card/index.ts",
13
- "content": "export * from './pricing-card';\n"
13
+ "content": "export * from './pricing-card';\r\n"
14
14
  },
15
15
  {
16
16
  "path": "pricing-card/pricing-card.tsx",
@@ -22,13 +22,13 @@
22
22
  "path": "pricing-card/lang/en.json",
23
23
  "type": "registry:lang",
24
24
  "target": "$modules$/pricing-card/lang/en.json",
25
- "content": "{\n \"getStarted\": \"Get Started\",\n \"popular\": \"Most Popular\"\n}\n"
25
+ "content": "{\r\n \"getStarted\": \"Get Started\",\r\n \"popular\": \"Most Popular\"\r\n}\r\n"
26
26
  },
27
27
  {
28
28
  "path": "pricing-card/lang/tr.json",
29
29
  "type": "registry:lang",
30
30
  "target": "$modules$/pricing-card/lang/tr.json",
31
- "content": "{\n \"getStarted\": \"Başla\",\n \"popular\": \"En Popüler\"\n}\n"
31
+ "content": "{\r\n \"getStarted\": \"Başla\",\r\n \"popular\": \"En Popüler\"\r\n}\r\n"
32
32
  }
33
33
  ],
34
34
  "exports": {
@@ -16,25 +16,25 @@
16
16
  "path": "pricing-page/index.ts",
17
17
  "type": "registry:index",
18
18
  "target": "$modules$/pricing-page/index.ts",
19
- "content": "export * from \"./pricing-page\";\nexport { default } from \"./pricing-page\";\n"
19
+ "content": "export * from \"./pricing-page\";\r\nexport { default } from \"./pricing-page\";\r\n"
20
20
  },
21
21
  {
22
22
  "path": "pricing-page/pricing-page.tsx",
23
23
  "type": "registry:page",
24
24
  "target": "$modules$/pricing-page/pricing-page.tsx",
25
- "content": "import { useState } from \"react\";\nimport { Link } from \"react-router\";\nimport { useTranslation } from \"react-i18next\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { Layout } from \"@/components/Layout\";\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Check, X, HelpCircle } from \"lucide-react\";\nimport { FadeIn, StaggerContainer, StaggerItem } from \"@/modules/animations\";\nimport { cn } from \"@/lib/utils\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ninterface PricingPageProps {\n className?: string;\n}\n\nexport function PricingPage({ className }: PricingPageProps) {\n const { t } = useTranslation(\"pricing-page\");\n usePageTitle({ title: t(\"title\") });\n const [isAnnual, setIsAnnual] = useState(true);\n\n const plans = [\n {\n id: \"free\",\n name: t(\"freeName\"),\n description: t(\"freeDesc\"),\n monthlyPrice: 0,\n annualPrice: 0,\n features: [\n { name: t(\"freeFeature1\"), included: true },\n { name: t(\"freeFeature2\"), included: true },\n { name: t(\"freeFeature3\"), included: true },\n { name: t(\"freeFeature4\"), included: true },\n { name: t(\"freeFeature5\"), included: false },\n { name: t(\"freeFeature6\"), included: false },\n { name: t(\"freeFeature7\"), included: false },\n ],\n popular: false,\n cta: t(\"freeCta\"),\n },\n {\n id: \"pro\",\n name: t(\"proName\"),\n description: t(\"proDesc\"),\n monthlyPrice: 29,\n annualPrice: 24,\n features: [\n { name: t(\"proFeature1\"), included: true },\n { name: t(\"proFeature2\"), included: true },\n { name: t(\"proFeature3\"), included: true },\n { name: t(\"proFeature4\"), included: true },\n { name: t(\"proFeature5\"), included: true },\n { name: t(\"proFeature6\"), included: true },\n { name: t(\"proFeature7\"), included: true },\n ],\n popular: true,\n cta: t(\"proCta\"),\n },\n {\n id: \"enterprise\",\n name: t(\"enterpriseName\"),\n description: t(\"enterpriseDesc\"),\n monthlyPrice: 99,\n annualPrice: 79,\n features: [\n { name: t(\"enterpriseFeature1\"), included: true },\n { name: t(\"enterpriseFeature2\"), included: true },\n { name: t(\"enterpriseFeature3\"), included: true },\n { name: t(\"enterpriseFeature4\"), included: true },\n { name: t(\"enterpriseFeature5\"), included: true },\n { name: t(\"enterpriseFeature6\"), included: true },\n { name: t(\"enterpriseFeature7\"), included: true },\n ],\n popular: false,\n cta: t(\"enterpriseCta\"),\n },\n ];\n\n const comparisonFeatures = [\n { name: t(\"compProjects\"), free: \"3\", pro: t(\"unlimited\"), enterprise: t(\"unlimited\") },\n { name: t(\"compStorage\"), free: \"1GB\", pro: \"25GB\", enterprise: t(\"unlimited\") },\n { name: t(\"compUsers\"), free: \"1\", pro: \"10\", enterprise: t(\"unlimited\") },\n { name: t(\"compApi\"), free: \"1,000\", pro: \"100,000\", enterprise: t(\"unlimited\") },\n { name: t(\"compSupport\"), free: t(\"community\"), pro: t(\"email\"), enterprise: t(\"dedicated\") },\n ];\n\n return (\n <Layout>\n <div className={cn(\"min-h-screen bg-muted/30 py-12 md:py-16\", className)}>\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n {/* Header */}\n <FadeIn className=\"text-center mb-12\">\n <p className=\"text-sm font-medium text-primary mb-2 uppercase tracking-wide\">\n {t(\"label\")}\n </p>\n <h1 className=\"text-4xl md:text-5xl font-bold text-foreground mb-4\">\n {t(\"heading\")}\n </h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto mb-8\">\n {t(\"description\")}\n </p>\n\n {/* Billing Toggle */}\n <div className=\"flex items-center justify-center gap-4\">\n <span className={cn(\"text-sm\", !isAnnual && \"text-foreground font-medium\")}>\n {t(\"monthly\")}\n </span>\n <Switch checked={isAnnual} onCheckedChange={setIsAnnual} />\n <span className={cn(\"text-sm\", isAnnual && \"text-foreground font-medium\")}>\n {t(\"annual\")}\n <Badge variant=\"secondary\" className=\"ml-2\">\n {t(\"save\")}\n </Badge>\n </span>\n </div>\n </FadeIn>\n\n {/* Pricing Cards */}\n <StaggerContainer className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-8 mb-20\">\n {plans.map((plan) => (\n <StaggerItem key={plan.id}>\n <Card className={cn(\n \"relative h-full flex flex-col\",\n plan.popular && \"border-primary shadow-lg ring-2 ring-primary/20\"\n )}>\n {plan.popular && (\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <Badge className=\"bg-primary text-primary-foreground\">\n {t(\"mostPopular\")}\n </Badge>\n </div>\n )}\n\n <CardHeader className=\"text-center pt-8\">\n <CardTitle className=\"text-xl font-bold\">{plan.name}</CardTitle>\n <p className=\"text-sm text-muted-foreground\">{plan.description}</p>\n </CardHeader>\n\n <CardContent className=\"flex-1\">\n <div className=\"text-center mb-8\">\n <div className=\"flex items-baseline justify-center gap-1\">\n <span className=\"text-4xl md:text-5xl font-bold\">\n ${isAnnual ? plan.annualPrice : plan.monthlyPrice}\n </span>\n <span className=\"text-muted-foreground\">/{t(\"month\")}</span>\n </div>\n {isAnnual && plan.monthlyPrice > 0 && (\n <p className=\"text-sm text-muted-foreground mt-1\">\n {t(\"billedAnnually\")} (${plan.annualPrice * 12}/yr)\n </p>\n )}\n </div>\n\n <ul className=\"space-y-3\">\n {plan.features.map((feature, index) => (\n <li key={index} className=\"flex items-center gap-3\">\n {feature.included ? (\n <Check className=\"h-5 w-5 text-primary flex-shrink-0\" />\n ) : (\n <X className=\"h-5 w-5 text-muted-foreground/50 flex-shrink-0\" />\n )}\n <span className={cn(\n \"text-sm\",\n feature.included ? \"text-foreground\" : \"text-muted-foreground/50\"\n )}>\n {feature.name}\n </span>\n </li>\n ))}\n </ul>\n </CardContent>\n\n <CardFooter className=\"pt-4\">\n <Button\n asChild\n className=\"w-full\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n >\n <Link to={plan.id === \"enterprise\" ? \"/contact\" : \"/register\"}>\n {plan.cta}\n </Link>\n </Button>\n </CardFooter>\n </Card>\n </StaggerItem>\n ))}\n </StaggerContainer>\n\n {/* Comparison Table */}\n <FadeIn className=\"mb-16\">\n <h2 className=\"text-2xl md:text-3xl font-bold text-center mb-8\">\n {t(\"compareTitle\")}\n </h2>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"border-b border-border\">\n <th className=\"text-left py-4 px-4 font-medium text-muted-foreground\">\n {t(\"feature\")}\n </th>\n {plans.map((plan) => (\n <th key={plan.id} className=\"text-center py-4 px-4 font-medium\">\n {plan.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {comparisonFeatures.map((feature, index) => (\n <tr key={index} className=\"border-b border-border\">\n <td className=\"py-4 px-4 text-sm\">{feature.name}</td>\n <td className=\"py-4 px-4 text-center text-sm text-muted-foreground\">{feature.free}</td>\n <td className=\"py-4 px-4 text-center text-sm font-medium\">{feature.pro}</td>\n <td className=\"py-4 px-4 text-center text-sm\">{feature.enterprise}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </FadeIn>\n\n {/* FAQ Teaser */}\n <FadeIn className=\"text-center\">\n <Card className=\"bg-card border\">\n <CardContent className=\"p-8\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"h-8 w-8 text-primary mx-auto mb-4 cursor-help\" />\n </TooltipTrigger>\n <TooltipContent>\n <p>{t(\"faqTooltip\")}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <h3 className=\"text-xl font-semibold mb-2\">\n {t(\"faqTitle\")}\n </h3>\n <p className=\"text-muted-foreground mb-4\">\n {t(\"faqDesc\")}\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <Button asChild variant=\"outline\">\n <Link to=\"/faq\">{t(\"viewFaq\")}</Link>\n </Button>\n <Button asChild>\n <Link to=\"/contact\">{t(\"contactSales\")}</Link>\n </Button>\n </div>\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n </div>\n </Layout>\n );\n}\n\nexport default PricingPage;\n"
25
+ "content": "import { useState } from \"react\";\r\nimport { Link } from \"react-router\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { usePageTitle } from \"@/hooks/use-page-title\";\r\nimport { Layout } from \"@/components/Layout\";\r\nimport { Card, CardContent, CardFooter, CardHeader, CardTitle } from \"@/components/ui/card\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\nimport { Switch } from \"@/components/ui/switch\";\r\nimport { Check, X, HelpCircle } from \"lucide-react\";\r\nimport { FadeIn, StaggerContainer, StaggerItem } from \"@/modules/animations\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\";\r\n\r\ninterface PricingPageProps {\r\n className?: string;\r\n}\r\n\r\nexport function PricingPage({ className }: PricingPageProps) {\r\n const { t } = useTranslation(\"pricing-page\");\r\n usePageTitle({ title: t(\"title\") });\r\n const [isAnnual, setIsAnnual] = useState(true);\r\n\r\n const plans = [\r\n {\r\n id: \"free\",\r\n name: t(\"freeName\"),\r\n description: t(\"freeDesc\"),\r\n monthlyPrice: 0,\r\n annualPrice: 0,\r\n features: [\r\n { name: t(\"freeFeature1\"), included: true },\r\n { name: t(\"freeFeature2\"), included: true },\r\n { name: t(\"freeFeature3\"), included: true },\r\n { name: t(\"freeFeature4\"), included: true },\r\n { name: t(\"freeFeature5\"), included: false },\r\n { name: t(\"freeFeature6\"), included: false },\r\n { name: t(\"freeFeature7\"), included: false },\r\n ],\r\n popular: false,\r\n cta: t(\"freeCta\"),\r\n },\r\n {\r\n id: \"pro\",\r\n name: t(\"proName\"),\r\n description: t(\"proDesc\"),\r\n monthlyPrice: 29,\r\n annualPrice: 24,\r\n features: [\r\n { name: t(\"proFeature1\"), included: true },\r\n { name: t(\"proFeature2\"), included: true },\r\n { name: t(\"proFeature3\"), included: true },\r\n { name: t(\"proFeature4\"), included: true },\r\n { name: t(\"proFeature5\"), included: true },\r\n { name: t(\"proFeature6\"), included: true },\r\n { name: t(\"proFeature7\"), included: true },\r\n ],\r\n popular: true,\r\n cta: t(\"proCta\"),\r\n },\r\n {\r\n id: \"enterprise\",\r\n name: t(\"enterpriseName\"),\r\n description: t(\"enterpriseDesc\"),\r\n monthlyPrice: 99,\r\n annualPrice: 79,\r\n features: [\r\n { name: t(\"enterpriseFeature1\"), included: true },\r\n { name: t(\"enterpriseFeature2\"), included: true },\r\n { name: t(\"enterpriseFeature3\"), included: true },\r\n { name: t(\"enterpriseFeature4\"), included: true },\r\n { name: t(\"enterpriseFeature5\"), included: true },\r\n { name: t(\"enterpriseFeature6\"), included: true },\r\n { name: t(\"enterpriseFeature7\"), included: true },\r\n ],\r\n popular: false,\r\n cta: t(\"enterpriseCta\"),\r\n },\r\n ];\r\n\r\n const comparisonFeatures = [\r\n { name: t(\"compProjects\"), free: \"3\", pro: t(\"unlimited\"), enterprise: t(\"unlimited\") },\r\n { name: t(\"compStorage\"), free: \"1GB\", pro: \"25GB\", enterprise: t(\"unlimited\") },\r\n { name: t(\"compUsers\"), free: \"1\", pro: \"10\", enterprise: t(\"unlimited\") },\r\n { name: t(\"compApi\"), free: \"1,000\", pro: \"100,000\", enterprise: t(\"unlimited\") },\r\n { name: t(\"compSupport\"), free: t(\"community\"), pro: t(\"email\"), enterprise: t(\"dedicated\") },\r\n ];\r\n\r\n return (\r\n <Layout>\r\n <div className={cn(\"min-h-screen bg-muted/30 py-12 md:py-16\", className)}>\r\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\r\n {/* Header */}\r\n <FadeIn className=\"text-center mb-12\">\r\n <p className=\"text-sm font-medium text-primary mb-2 uppercase tracking-wide\">\r\n {t(\"label\")}\r\n </p>\r\n <h1 className=\"text-4xl md:text-5xl font-bold text-foreground mb-4\">\r\n {t(\"heading\")}\r\n </h1>\r\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto mb-8\">\r\n {t(\"description\")}\r\n </p>\r\n\r\n {/* Billing Toggle */}\r\n <div className=\"flex items-center justify-center gap-4\">\r\n <span className={cn(\"text-sm\", !isAnnual && \"text-foreground font-medium\")}>\r\n {t(\"monthly\")}\r\n </span>\r\n <Switch checked={isAnnual} onCheckedChange={setIsAnnual} />\r\n <span className={cn(\"text-sm\", isAnnual && \"text-foreground font-medium\")}>\r\n {t(\"annual\")}\r\n <Badge variant=\"secondary\" className=\"ml-2\">\r\n {t(\"save\")}\r\n </Badge>\r\n </span>\r\n </div>\r\n </FadeIn>\r\n\r\n {/* Pricing Cards */}\r\n <StaggerContainer className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-8 mb-20\">\r\n {plans.map((plan) => (\r\n <StaggerItem key={plan.id}>\r\n <Card className={cn(\r\n \"relative h-full flex flex-col\",\r\n plan.popular && \"border-primary shadow-lg ring-2 ring-primary/20\"\r\n )}>\r\n {plan.popular && (\r\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\r\n <Badge className=\"bg-primary text-primary-foreground\">\r\n {t(\"mostPopular\")}\r\n </Badge>\r\n </div>\r\n )}\r\n\r\n <CardHeader className=\"text-center pt-8\">\r\n <CardTitle className=\"text-xl font-bold\">{plan.name}</CardTitle>\r\n <p className=\"text-sm text-muted-foreground\">{plan.description}</p>\r\n </CardHeader>\r\n\r\n <CardContent className=\"flex-1\">\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-baseline justify-center gap-1\">\r\n <span className=\"text-4xl md:text-5xl font-bold\">\r\n ${isAnnual ? plan.annualPrice : plan.monthlyPrice}\r\n </span>\r\n <span className=\"text-muted-foreground\">/{t(\"month\")}</span>\r\n </div>\r\n {isAnnual && plan.monthlyPrice > 0 && (\r\n <p className=\"text-sm text-muted-foreground mt-1\">\r\n {t(\"billedAnnually\")} (${plan.annualPrice * 12}/yr)\r\n </p>\r\n )}\r\n </div>\r\n\r\n <ul className=\"space-y-3\">\r\n {plan.features.map((feature, index) => (\r\n <li key={index} className=\"flex items-center gap-3\">\r\n {feature.included ? (\r\n <Check className=\"h-5 w-5 text-primary flex-shrink-0\" />\r\n ) : (\r\n <X className=\"h-5 w-5 text-muted-foreground/50 flex-shrink-0\" />\r\n )}\r\n <span className={cn(\r\n \"text-sm\",\r\n feature.included ? \"text-foreground\" : \"text-muted-foreground/50\"\r\n )}>\r\n {feature.name}\r\n </span>\r\n </li>\r\n ))}\r\n </ul>\r\n </CardContent>\r\n\r\n <CardFooter className=\"pt-4\">\r\n <Button\r\n asChild\r\n className=\"w-full\"\r\n variant={plan.popular ? \"default\" : \"outline\"}\r\n size=\"lg\"\r\n >\r\n <Link to={plan.id === \"enterprise\" ? \"/contact\" : \"/register\"}>\r\n {plan.cta}\r\n </Link>\r\n </Button>\r\n </CardFooter>\r\n </Card>\r\n </StaggerItem>\r\n ))}\r\n </StaggerContainer>\r\n\r\n {/* Comparison Table */}\r\n <FadeIn className=\"mb-16\">\r\n <h2 className=\"text-2xl md:text-3xl font-bold text-center mb-8\">\r\n {t(\"compareTitle\")}\r\n </h2>\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full border-collapse\">\r\n <thead>\r\n <tr className=\"border-b border-border\">\r\n <th className=\"text-left py-4 px-4 font-medium text-muted-foreground\">\r\n {t(\"feature\")}\r\n </th>\r\n {plans.map((plan) => (\r\n <th key={plan.id} className=\"text-center py-4 px-4 font-medium\">\r\n {plan.name}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {comparisonFeatures.map((feature, index) => (\r\n <tr key={index} className=\"border-b border-border\">\r\n <td className=\"py-4 px-4 text-sm\">{feature.name}</td>\r\n <td className=\"py-4 px-4 text-center text-sm text-muted-foreground\">{feature.free}</td>\r\n <td className=\"py-4 px-4 text-center text-sm font-medium\">{feature.pro}</td>\r\n <td className=\"py-4 px-4 text-center text-sm\">{feature.enterprise}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n </FadeIn>\r\n\r\n {/* FAQ Teaser */}\r\n <FadeIn className=\"text-center\">\r\n <Card className=\"bg-card border\">\r\n <CardContent className=\"p-8\">\r\n <TooltipProvider>\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <HelpCircle className=\"h-8 w-8 text-primary mx-auto mb-4 cursor-help\" />\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>{t(\"faqTooltip\")}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n <h3 className=\"text-xl font-semibold mb-2\">\r\n {t(\"faqTitle\")}\r\n </h3>\r\n <p className=\"text-muted-foreground mb-4\">\r\n {t(\"faqDesc\")}\r\n </p>\r\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\r\n <Button asChild variant=\"outline\">\r\n <Link to=\"/faq\">{t(\"viewFaq\")}</Link>\r\n </Button>\r\n <Button asChild>\r\n <Link to=\"/contact\">{t(\"contactSales\")}</Link>\r\n </Button>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </FadeIn>\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n}\r\n\r\nexport default PricingPage;\r\n"
26
26
  },
27
27
  {
28
28
  "path": "pricing-page/lang/en.json",
29
29
  "type": "registry:lang",
30
30
  "target": "$modules$/pricing-page/lang/en.json",
31
- "content": "{\n \"title\": \"Pricing\",\n \"label\": \"Pricing\",\n \"heading\": \"Simple, Transparent Pricing\",\n \"description\": \"Customize this pricing description with Promake to match your plans.\",\n \"monthly\": \"Monthly\",\n \"annual\": \"Annual\",\n \"save\": \"Save 20%\",\n \"month\": \"mo\",\n \"billedAnnually\": \"Billed annually\",\n \"mostPopular\": \"Most Popular\",\n \"freeName\": \"Free\",\n \"freeDesc\": \"Perfect for getting started\",\n \"freeFeature1\": \"Feature included\",\n \"freeFeature2\": \"Feature included\",\n \"freeFeature3\": \"Feature included\",\n \"freeFeature4\": \"Feature included\",\n \"freeFeature5\": \"Feature not included\",\n \"freeFeature6\": \"Feature not included\",\n \"freeFeature7\": \"Feature not included\",\n \"freeCta\": \"Get Started\",\n \"proName\": \"Professional\",\n \"proDesc\": \"Best for growing businesses\",\n \"proFeature1\": \"All Free features\",\n \"proFeature2\": \"Feature included\",\n \"proFeature3\": \"Feature included\",\n \"proFeature4\": \"Feature included\",\n \"proFeature5\": \"Feature included\",\n \"proFeature6\": \"Feature included\",\n \"proFeature7\": \"Feature included\",\n \"proCta\": \"Start Free Trial\",\n \"enterpriseName\": \"Enterprise\",\n \"enterpriseDesc\": \"For large organizations\",\n \"enterpriseFeature1\": \"All Pro features\",\n \"enterpriseFeature2\": \"Feature included\",\n \"enterpriseFeature3\": \"Feature included\",\n \"enterpriseFeature4\": \"Feature included\",\n \"enterpriseFeature5\": \"Feature included\",\n \"enterpriseFeature6\": \"Feature included\",\n \"enterpriseFeature7\": \"Feature included\",\n \"enterpriseCta\": \"Contact Sales\",\n \"compareTitle\": \"Compare Plans\",\n \"feature\": \"Feature\",\n \"compProjects\": \"Projects\",\n \"compStorage\": \"Storage\",\n \"compUsers\": \"Team members\",\n \"compApi\": \"API requests\",\n \"compSupport\": \"Support\",\n \"unlimited\": \"Unlimited\",\n \"community\": \"Community\",\n \"email\": \"Email\",\n \"dedicated\": \"Dedicated\",\n \"faqTooltip\": \"Click to see frequently asked questions\",\n \"faqTitle\": \"Have questions?\",\n \"faqDesc\": \"Check out our FAQ or contact our sales team for more information.\",\n \"viewFaq\": \"View FAQ\",\n \"contactSales\": \"Contact Sales\"\n}\n"
31
+ "content": "{\r\n \"title\": \"Pricing\",\r\n \"label\": \"Pricing\",\r\n \"heading\": \"Simple, Transparent Pricing\",\r\n \"description\": \"Customize this pricing description with Promake to match your plans.\",\r\n \"monthly\": \"Monthly\",\r\n \"annual\": \"Annual\",\r\n \"save\": \"Save 20%\",\r\n \"month\": \"mo\",\r\n \"billedAnnually\": \"Billed annually\",\r\n \"mostPopular\": \"Most Popular\",\r\n \"freeName\": \"Free\",\r\n \"freeDesc\": \"Perfect for getting started\",\r\n \"freeFeature1\": \"Feature included\",\r\n \"freeFeature2\": \"Feature included\",\r\n \"freeFeature3\": \"Feature included\",\r\n \"freeFeature4\": \"Feature included\",\r\n \"freeFeature5\": \"Feature not included\",\r\n \"freeFeature6\": \"Feature not included\",\r\n \"freeFeature7\": \"Feature not included\",\r\n \"freeCta\": \"Get Started\",\r\n \"proName\": \"Professional\",\r\n \"proDesc\": \"Best for growing businesses\",\r\n \"proFeature1\": \"All Free features\",\r\n \"proFeature2\": \"Feature included\",\r\n \"proFeature3\": \"Feature included\",\r\n \"proFeature4\": \"Feature included\",\r\n \"proFeature5\": \"Feature included\",\r\n \"proFeature6\": \"Feature included\",\r\n \"proFeature7\": \"Feature included\",\r\n \"proCta\": \"Start Free Trial\",\r\n \"enterpriseName\": \"Enterprise\",\r\n \"enterpriseDesc\": \"For large organizations\",\r\n \"enterpriseFeature1\": \"All Pro features\",\r\n \"enterpriseFeature2\": \"Feature included\",\r\n \"enterpriseFeature3\": \"Feature included\",\r\n \"enterpriseFeature4\": \"Feature included\",\r\n \"enterpriseFeature5\": \"Feature included\",\r\n \"enterpriseFeature6\": \"Feature included\",\r\n \"enterpriseFeature7\": \"Feature included\",\r\n \"enterpriseCta\": \"Contact Sales\",\r\n \"compareTitle\": \"Compare Plans\",\r\n \"feature\": \"Feature\",\r\n \"compProjects\": \"Projects\",\r\n \"compStorage\": \"Storage\",\r\n \"compUsers\": \"Team members\",\r\n \"compApi\": \"API requests\",\r\n \"compSupport\": \"Support\",\r\n \"unlimited\": \"Unlimited\",\r\n \"community\": \"Community\",\r\n \"email\": \"Email\",\r\n \"dedicated\": \"Dedicated\",\r\n \"faqTooltip\": \"Click to see frequently asked questions\",\r\n \"faqTitle\": \"Have questions?\",\r\n \"faqDesc\": \"Check out our FAQ or contact our sales team for more information.\",\r\n \"viewFaq\": \"View FAQ\",\r\n \"contactSales\": \"Contact Sales\"\r\n}\r\n"
32
32
  },
33
33
  {
34
34
  "path": "pricing-page/lang/tr.json",
35
35
  "type": "registry:lang",
36
36
  "target": "$modules$/pricing-page/lang/tr.json",
37
- "content": "{\n \"title\": \"Fiyatlandırma\",\n \"label\": \"Fiyatlandırma\",\n \"heading\": \"Basit, Şeffaf Fiyatlandırma\",\n \"description\": \"Size uygun planı seçin. Tüm planlar 14 günlük ücretsiz deneme içerir.\",\n \"monthly\": \"Aylık\",\n \"annual\": \"Yıllık\",\n \"save\": \"%20 Tasarruf\",\n \"month\": \"ay\",\n \"billedAnnually\": \"Yıllık faturalandırılır\",\n \"mostPopular\": \"En Popüler\",\n \"freeName\": \"Ücretsiz\",\n \"freeDesc\": \"Platformumuzu denemek için mükemmel\",\n \"freeFeature1\": \"3 projeye kadar\",\n \"freeFeature2\": \"Temel analitik\",\n \"freeFeature3\": \"Topluluk desteği\",\n \"freeFeature4\": \"1GB depolama\",\n \"freeFeature5\": \"API erişimi\",\n \"freeFeature6\": \"Özel alan adı\",\n \"freeFeature7\": \"Öncelikli destek\",\n \"freeCta\": \"Başlayın\",\n \"proName\": \"Profesyonel\",\n \"proDesc\": \"Büyüyen işletmeler için en iyisi\",\n \"proFeature1\": \"Sınırsız proje\",\n \"proFeature2\": \"Gelişmiş analitik\",\n \"proFeature3\": \"Öncelikli e-posta desteği\",\n \"proFeature4\": \"25GB depolama\",\n \"proFeature5\": \"API erişimi\",\n \"proFeature6\": \"Özel alan adı\",\n \"proFeature7\": \"Takım işbirliği\",\n \"proCta\": \"Ücretsiz Deneyin\",\n \"enterpriseName\": \"Kurumsal\",\n \"enterpriseDesc\": \"Büyük ölçekli organizasyonlar için\",\n \"enterpriseFeature1\": \"Pro'daki her şey\",\n \"enterpriseFeature2\": \"Sınırsız depolama\",\n \"enterpriseFeature3\": \"7/24 telefon desteği\",\n \"enterpriseFeature4\": \"Özel entegrasyonlar\",\n \"enterpriseFeature5\": \"Özel müdür\",\n \"enterpriseFeature6\": \"SLA garantisi\",\n \"enterpriseFeature7\": \"Şirket içi seçeneği\",\n \"enterpriseCta\": \"Satışa Başvurun\",\n \"compareTitle\": \"Planları Karşılaştırın\",\n \"feature\": \"Özellik\",\n \"compProjects\": \"Projeler\",\n \"compStorage\": \"Depolama\",\n \"compUsers\": \"Takım üyeleri\",\n \"compApi\": \"Aylık API istekleri\",\n \"compSupport\": \"Destek\",\n \"unlimited\": \"Sınırsız\",\n \"community\": \"Topluluk\",\n \"email\": \"E-posta\",\n \"dedicated\": \"7/24 Özel\",\n \"faqTooltip\": \"Sık sorulan soruları görmek için tıklayın\",\n \"faqTitle\": \"Sorularınız mı var?\",\n \"faqDesc\": \"SSS'imize göz atın veya daha fazla bilgi için satış ekibimizle iletişime geçin.\",\n \"viewFaq\": \"SSS'yi Görüntüle\",\n \"contactSales\": \"Satışa Başvurun\"\n}\n"
37
+ "content": "{\r\n \"title\": \"Fiyatlandırma\",\r\n \"label\": \"Fiyatlandırma\",\r\n \"heading\": \"Basit, Şeffaf Fiyatlandırma\",\r\n \"description\": \"Size uygun planı seçin. Tüm planlar 14 günlük ücretsiz deneme içerir.\",\r\n \"monthly\": \"Aylık\",\r\n \"annual\": \"Yıllık\",\r\n \"save\": \"%20 Tasarruf\",\r\n \"month\": \"ay\",\r\n \"billedAnnually\": \"Yıllık faturalandırılır\",\r\n \"mostPopular\": \"En Popüler\",\r\n \"freeName\": \"Ücretsiz\",\r\n \"freeDesc\": \"Platformumuzu denemek için mükemmel\",\r\n \"freeFeature1\": \"3 projeye kadar\",\r\n \"freeFeature2\": \"Temel analitik\",\r\n \"freeFeature3\": \"Topluluk desteği\",\r\n \"freeFeature4\": \"1GB depolama\",\r\n \"freeFeature5\": \"API erişimi\",\r\n \"freeFeature6\": \"Özel alan adı\",\r\n \"freeFeature7\": \"Öncelikli destek\",\r\n \"freeCta\": \"Başlayın\",\r\n \"proName\": \"Profesyonel\",\r\n \"proDesc\": \"Büyüyen işletmeler için en iyisi\",\r\n \"proFeature1\": \"Sınırsız proje\",\r\n \"proFeature2\": \"Gelişmiş analitik\",\r\n \"proFeature3\": \"Öncelikli e-posta desteği\",\r\n \"proFeature4\": \"25GB depolama\",\r\n \"proFeature5\": \"API erişimi\",\r\n \"proFeature6\": \"Özel alan adı\",\r\n \"proFeature7\": \"Takım işbirliği\",\r\n \"proCta\": \"Ücretsiz Deneyin\",\r\n \"enterpriseName\": \"Kurumsal\",\r\n \"enterpriseDesc\": \"Büyük ölçekli organizasyonlar için\",\r\n \"enterpriseFeature1\": \"Pro'daki her şey\",\r\n \"enterpriseFeature2\": \"Sınırsız depolama\",\r\n \"enterpriseFeature3\": \"7/24 telefon desteği\",\r\n \"enterpriseFeature4\": \"Özel entegrasyonlar\",\r\n \"enterpriseFeature5\": \"Özel müdür\",\r\n \"enterpriseFeature6\": \"SLA garantisi\",\r\n \"enterpriseFeature7\": \"Şirket içi seçeneği\",\r\n \"enterpriseCta\": \"Satışa Başvurun\",\r\n \"compareTitle\": \"Planları Karşılaştırın\",\r\n \"feature\": \"Özellik\",\r\n \"compProjects\": \"Projeler\",\r\n \"compStorage\": \"Depolama\",\r\n \"compUsers\": \"Takım üyeleri\",\r\n \"compApi\": \"Aylık API istekleri\",\r\n \"compSupport\": \"Destek\",\r\n \"unlimited\": \"Sınırsız\",\r\n \"community\": \"Topluluk\",\r\n \"email\": \"E-posta\",\r\n \"dedicated\": \"7/24 Özel\",\r\n \"faqTooltip\": \"Sık sorulan soruları görmek için tıklayın\",\r\n \"faqTitle\": \"Sorularınız mı var?\",\r\n \"faqDesc\": \"SSS'imize göz atın veya daha fazla bilgi için satış ekibimizle iletişime geçin.\",\r\n \"viewFaq\": \"SSS'yi Görüntüle\",\r\n \"contactSales\": \"Satışa Başvurun\"\r\n}\r\n"
38
38
  }
39
39
  ],
40
40
  "exports": {
@@ -13,25 +13,25 @@
13
13
  "path": "pricing-section/index.ts",
14
14
  "type": "registry:index",
15
15
  "target": "$modules$/pricing-section/index.ts",
16
- "content": "export * from './pricing-section';\n"
16
+ "content": "export * from './pricing-section';\r\n"
17
17
  },
18
18
  {
19
19
  "path": "pricing-section/pricing-section.tsx",
20
20
  "type": "registry:component",
21
21
  "target": "$modules$/pricing-section/pricing-section.tsx",
22
- "content": "import { Link } from \"react-router\";\nimport { ArrowRight, Check } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\";\nimport { Badge } from \"@/components/ui/badge\";\n\ninterface PricingSectionProps {\n className?: string;\n}\n\nexport function PricingSection({ className }: PricingSectionProps) {\n const { t } = useTranslation(\"pricing-section\");\n\n const tiers = [\n {\n id: \"starter\",\n name: t(\"starterName\", \"Starter\"),\n description: t(\n \"starterDesc\",\n \"Perfect for individuals and small projects\"\n ),\n price: t(\"starterPrice\", \"$9\"),\n frequency: t(\"perMonth\", \"/month\"),\n features: [\n t(\"starterFeature1\", \"Up to 3 projects\"),\n t(\"starterFeature2\", \"Basic analytics\"),\n t(\"starterFeature3\", \"Email support\"),\n t(\"starterFeature4\", \"1GB storage\"),\n ],\n popular: false,\n },\n {\n id: \"professional\",\n name: t(\"proName\", \"Professional\"),\n description: t(\"proDesc\", \"Best for growing businesses and teams\"),\n price: t(\"proPrice\", \"$29\"),\n frequency: t(\"perMonth\", \"/month\"),\n features: [\n t(\"proFeature1\", \"Unlimited projects\"),\n t(\"proFeature2\", \"Advanced analytics\"),\n t(\"proFeature3\", \"Priority support\"),\n t(\"proFeature4\", \"10GB storage\"),\n t(\"proFeature5\", \"API access\"),\n ],\n popular: true,\n },\n {\n id: \"enterprise\",\n name: t(\"enterpriseName\", \"Enterprise\"),\n description: t(\n \"enterpriseDesc\",\n \"For large organizations with custom needs\"\n ),\n price: t(\"enterprisePrice\", \"$99\"),\n frequency: t(\"perMonth\", \"/month\"),\n features: [\n t(\"enterpriseFeature1\", \"Everything in Pro\"),\n t(\"enterpriseFeature2\", \"Unlimited storage\"),\n t(\"enterpriseFeature3\", \"24/7 phone support\"),\n t(\"enterpriseFeature4\", \"Custom integrations\"),\n t(\"enterpriseFeature5\", \"Dedicated manager\"),\n t(\"enterpriseFeature6\", \"SLA guarantee\"),\n ],\n popular: false,\n },\n ];\n\n return (\n <section className={cn(\"py-16 md:py-24\", className)}>\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n <div className=\"text-center mb-12\">\n <p className=\"text-sm font-medium text-primary mb-2\">\n {t(\"label\", \"Pricing\")}\n </p>\n <h2 className=\"text-3xl font-bold md:text-4xl lg:text-5xl mb-4\">\n {t(\"title\", \"Simple, transparent pricing\")}\n </h2>\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\n {t(\n \"subtitle\",\n \"Choose the plan that's right for you. All plans include a 14-day free trial.\"\n )}\n </p>\n </div>\n\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl mx-auto\">\n {tiers.map((tier) => (\n <Card\n key={tier.id}\n className={cn(\n \"relative overflow-hidden\",\n tier.popular && \"border-primary shadow-lg scale-105\"\n )}\n >\n {tier.popular && (\n <div className=\"absolute top-0 right-0\">\n <Badge className=\"rounded-full\">\n {t(\"popular\", \"Most Popular\")}\n </Badge>\n </div>\n )}\n\n <CardHeader>\n <CardTitle className=\"text-xl font-bold\">{tier.name}</CardTitle>\n <p className=\"text-sm text-muted-foreground\">\n {tier.description}\n </p>\n </CardHeader>\n\n <CardContent>\n <div className=\"flex items-baseline gap-1 mb-6\">\n <span className=\"text-4xl font-bold\">{tier.price}</span>\n <span className=\"text-muted-foreground text-sm\">\n {tier.frequency}\n </span>\n </div>\n\n <ul className=\"space-y-3\">\n {tier.features.map((feature, index) => (\n <li key={index} className=\"flex items-center gap-2\">\n <Check className=\"h-4 w-4 text-primary flex-shrink-0\" />\n <span className=\"text-sm text-muted-foreground\">\n {feature}\n </span>\n </li>\n ))}\n </ul>\n </CardContent>\n\n <CardFooter>\n <Button\n asChild\n className=\"w-full\"\n variant={tier.popular ? \"default\" : \"outline\"}\n >\n <Link to=\"/register\">\n {t(\"cta\", \"Get Started\")}\n <ArrowRight className=\"ml-2 h-4 w-4\" />\n </Link>\n </Button>\n </CardFooter>\n </Card>\n ))}\n </div>\n\n <p className=\"text-center text-sm text-muted-foreground mt-8\">\n {t(\"guarantee\", \"30-day money-back guarantee. No questions asked.\")}\n </p>\n </div>\n </section>\n );\n}\n"
22
+ "content": "import { Link } from \"react-router\";\r\nimport { ArrowRight, Check } from \"lucide-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n Card,\r\n CardContent,\r\n CardFooter,\r\n CardHeader,\r\n CardTitle,\r\n} from \"@/components/ui/card\";\r\nimport { Badge } from \"@/components/ui/badge\";\r\n\r\ninterface PricingSectionProps {\r\n className?: string;\r\n}\r\n\r\nexport function PricingSection({ className }: PricingSectionProps) {\r\n const { t } = useTranslation(\"pricing-section\");\r\n\r\n const tiers = [\r\n {\r\n id: \"starter\",\r\n name: t(\"starterName\", \"Starter\"),\r\n description: t(\r\n \"starterDesc\",\r\n \"Perfect for individuals and small projects\"\r\n ),\r\n price: t(\"starterPrice\", \"$9\"),\r\n frequency: t(\"perMonth\", \"/month\"),\r\n features: [\r\n t(\"starterFeature1\", \"Up to 3 projects\"),\r\n t(\"starterFeature2\", \"Basic analytics\"),\r\n t(\"starterFeature3\", \"Email support\"),\r\n t(\"starterFeature4\", \"1GB storage\"),\r\n ],\r\n popular: false,\r\n },\r\n {\r\n id: \"professional\",\r\n name: t(\"proName\", \"Professional\"),\r\n description: t(\"proDesc\", \"Best for growing businesses and teams\"),\r\n price: t(\"proPrice\", \"$29\"),\r\n frequency: t(\"perMonth\", \"/month\"),\r\n features: [\r\n t(\"proFeature1\", \"Unlimited projects\"),\r\n t(\"proFeature2\", \"Advanced analytics\"),\r\n t(\"proFeature3\", \"Priority support\"),\r\n t(\"proFeature4\", \"10GB storage\"),\r\n t(\"proFeature5\", \"API access\"),\r\n ],\r\n popular: true,\r\n },\r\n {\r\n id: \"enterprise\",\r\n name: t(\"enterpriseName\", \"Enterprise\"),\r\n description: t(\r\n \"enterpriseDesc\",\r\n \"For large organizations with custom needs\"\r\n ),\r\n price: t(\"enterprisePrice\", \"$99\"),\r\n frequency: t(\"perMonth\", \"/month\"),\r\n features: [\r\n t(\"enterpriseFeature1\", \"Everything in Pro\"),\r\n t(\"enterpriseFeature2\", \"Unlimited storage\"),\r\n t(\"enterpriseFeature3\", \"24/7 phone support\"),\r\n t(\"enterpriseFeature4\", \"Custom integrations\"),\r\n t(\"enterpriseFeature5\", \"Dedicated manager\"),\r\n t(\"enterpriseFeature6\", \"SLA guarantee\"),\r\n ],\r\n popular: false,\r\n },\r\n ];\r\n\r\n return (\r\n <section className={cn(\"py-16 md:py-24\", className)}>\r\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\r\n <div className=\"text-center mb-12\">\r\n <p className=\"text-sm font-medium text-primary mb-2\">\r\n {t(\"label\", \"Pricing\")}\r\n </p>\r\n <h2 className=\"text-3xl font-bold md:text-4xl lg:text-5xl mb-4\">\r\n {t(\"title\", \"Simple, transparent pricing\")}\r\n </h2>\r\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\r\n {t(\r\n \"subtitle\",\r\n \"Choose the plan that's right for you. All plans include a 14-day free trial.\"\r\n )}\r\n </p>\r\n </div>\r\n\r\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl mx-auto\">\r\n {tiers.map((tier) => (\r\n <Card\r\n key={tier.id}\r\n className={cn(\r\n \"relative overflow-hidden\",\r\n tier.popular && \"border-primary shadow-lg scale-105\"\r\n )}\r\n >\r\n {tier.popular && (\r\n <div className=\"absolute top-0 right-0\">\r\n <Badge className=\"rounded-full\">\r\n {t(\"popular\", \"Most Popular\")}\r\n </Badge>\r\n </div>\r\n )}\r\n\r\n <CardHeader>\r\n <CardTitle className=\"text-xl font-bold\">{tier.name}</CardTitle>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {tier.description}\r\n </p>\r\n </CardHeader>\r\n\r\n <CardContent>\r\n <div className=\"flex items-baseline gap-1 mb-6\">\r\n <span className=\"text-4xl font-bold\">{tier.price}</span>\r\n <span className=\"text-muted-foreground text-sm\">\r\n {tier.frequency}\r\n </span>\r\n </div>\r\n\r\n <ul className=\"space-y-3\">\r\n {tier.features.map((feature, index) => (\r\n <li key={index} className=\"flex items-center gap-2\">\r\n <Check className=\"h-4 w-4 text-primary flex-shrink-0\" />\r\n <span className=\"text-sm text-muted-foreground\">\r\n {feature}\r\n </span>\r\n </li>\r\n ))}\r\n </ul>\r\n </CardContent>\r\n\r\n <CardFooter>\r\n <Button\r\n asChild\r\n className=\"w-full\"\r\n variant={tier.popular ? \"default\" : \"outline\"}\r\n >\r\n <Link to=\"/register\">\r\n {t(\"cta\", \"Get Started\")}\r\n <ArrowRight className=\"ml-2 h-4 w-4\" />\r\n </Link>\r\n </Button>\r\n </CardFooter>\r\n </Card>\r\n ))}\r\n </div>\r\n\r\n <p className=\"text-center text-sm text-muted-foreground mt-8\">\r\n {t(\"guarantee\", \"30-day money-back guarantee. No questions asked.\")}\r\n </p>\r\n </div>\r\n </section>\r\n );\r\n}\r\n"
23
23
  },
24
24
  {
25
25
  "path": "pricing-section/lang/en.json",
26
26
  "type": "registry:lang",
27
27
  "target": "$modules$/pricing-section/lang/en.json",
28
- "content": "{\n \"label\": \"Pricing\",\n \"title\": \"Simple, Transparent Pricing\",\n \"subtitle\": \"Choose the perfect plan for your needs. All plans include a 14-day free trial.\",\n \"perMonth\": \"/month\",\n \"popular\": \"Most Popular\",\n \"cta\": \"Get Started\",\n \"guarantee\": \"30-day money-back guarantee. Cancel anytime, no questions asked.\",\n \"starterName\": \"Starter\",\n \"starterDesc\": \"Perfect for individuals and small projects\",\n \"starterPrice\": \"$9\",\n \"starterFeature1\": \"Up to 5 projects\",\n \"starterFeature2\": \"10GB storage\",\n \"starterFeature3\": \"Basic analytics\",\n \"starterFeature4\": \"Email support\",\n \"proName\": \"Pro\",\n \"proDesc\": \"Best for growing teams and businesses\",\n \"proPrice\": \"$29\",\n \"proFeature1\": \"Unlimited projects\",\n \"proFeature2\": \"100GB storage\",\n \"proFeature3\": \"Advanced analytics\",\n \"proFeature4\": \"Priority support\",\n \"proFeature5\": \"Team collaboration tools\",\n \"enterpriseName\": \"Advanced\",\n \"enterpriseDesc\": \"For large organizations with custom needs\",\n \"enterprisePrice\": \"$99\",\n \"enterpriseFeature1\": \"Everything in Pro\",\n \"enterpriseFeature2\": \"Unlimited storage\",\n \"enterpriseFeature3\": \"Custom integrations\",\n \"enterpriseFeature4\": \"Dedicated account manager\",\n \"enterpriseFeature5\": \"Advanced security & compliance\",\n \"enterpriseFeature6\": \"SLA & 24/7 support\"\n}\n"
28
+ "content": "{\r\n \"label\": \"Pricing\",\r\n \"title\": \"Simple, Transparent Pricing\",\r\n \"subtitle\": \"Choose the perfect plan for your needs. All plans include a 14-day free trial.\",\r\n \"perMonth\": \"/month\",\r\n \"popular\": \"Most Popular\",\r\n \"cta\": \"Get Started\",\r\n \"guarantee\": \"30-day money-back guarantee. Cancel anytime, no questions asked.\",\r\n \"starterName\": \"Starter\",\r\n \"starterDesc\": \"Perfect for individuals and small projects\",\r\n \"starterPrice\": \"$9\",\r\n \"starterFeature1\": \"Up to 5 projects\",\r\n \"starterFeature2\": \"10GB storage\",\r\n \"starterFeature3\": \"Basic analytics\",\r\n \"starterFeature4\": \"Email support\",\r\n \"proName\": \"Pro\",\r\n \"proDesc\": \"Best for growing teams and businesses\",\r\n \"proPrice\": \"$29\",\r\n \"proFeature1\": \"Unlimited projects\",\r\n \"proFeature2\": \"100GB storage\",\r\n \"proFeature3\": \"Advanced analytics\",\r\n \"proFeature4\": \"Priority support\",\r\n \"proFeature5\": \"Team collaboration tools\",\r\n \"enterpriseName\": \"Advanced\",\r\n \"enterpriseDesc\": \"For large organizations with custom needs\",\r\n \"enterprisePrice\": \"$99\",\r\n \"enterpriseFeature1\": \"Everything in Pro\",\r\n \"enterpriseFeature2\": \"Unlimited storage\",\r\n \"enterpriseFeature3\": \"Custom integrations\",\r\n \"enterpriseFeature4\": \"Dedicated account manager\",\r\n \"enterpriseFeature5\": \"Advanced security & compliance\",\r\n \"enterpriseFeature6\": \"SLA & 24/7 support\"\r\n}\r\n"
29
29
  },
30
30
  {
31
31
  "path": "pricing-section/lang/tr.json",
32
32
  "type": "registry:lang",
33
33
  "target": "$modules$/pricing-section/lang/tr.json",
34
- "content": "{\n \"label\": \"Fiyatlandırma\",\n \"title\": \"Basit, Şeffaf Fiyatlandırma\",\n \"subtitle\": \"İhtiyaçlarınıza uygun planı seçin. Tüm planlarda 14 günlük ücretsiz deneme dahildir.\",\n \"perMonth\": \"/ay\",\n \"popular\": \"En Popüler\",\n \"cta\": \"Başlayın\",\n \"guarantee\": \"30 gün para iade garantisi. İstediğiniz zaman iptal edin, sorulsuz sualsiz.\",\n \"starterName\": \"Başlangıç\",\n \"starterDesc\": \"Bireyler ve küçük projeler için mükemmel\",\n \"starterPrice\": \"99₺\",\n \"starterFeature1\": \"5 projeye kadar\",\n \"starterFeature2\": \"10GB depolama\",\n \"starterFeature3\": \"Temel analitik\",\n \"starterFeature4\": \"E-posta desteği\",\n \"proName\": \"Pro\",\n \"proDesc\": \"Büyüyen ekipler ve işletmeler için en iyisi\",\n \"proPrice\": \"299₺\",\n \"proFeature1\": \"Sınırsız proje\",\n \"proFeature2\": \"100GB depolama\",\n \"proFeature3\": \"Gelişmiş analitik\",\n \"proFeature4\": \"Öncelikli destek\",\n \"proFeature5\": \"Ekip işbirliği araçları\",\n \"enterpriseName\": \"Gelişmiş\",\n \"enterpriseDesc\": \"Özel ihtiyaçları olan büyük kuruluşlar için\",\n \"enterprisePrice\": \"999₺\",\n \"enterpriseFeature1\": \"Pro'daki her şey\",\n \"enterpriseFeature2\": \"Sınırsız depolama\",\n \"enterpriseFeature3\": \"Özel entegrasyonlar\",\n \"enterpriseFeature4\": \"Özel hesap yöneticisi\",\n \"enterpriseFeature5\": \"Gelişmiş güvenlik ve uyumluluk\",\n \"enterpriseFeature6\": \"SLA ve 7/24 destek\"\n}\n"
34
+ "content": "{\r\n \"label\": \"Fiyatlandırma\",\r\n \"title\": \"Basit, Şeffaf Fiyatlandırma\",\r\n \"subtitle\": \"İhtiyaçlarınıza uygun planı seçin. Tüm planlarda 14 günlük ücretsiz deneme dahildir.\",\r\n \"perMonth\": \"/ay\",\r\n \"popular\": \"En Popüler\",\r\n \"cta\": \"Başlayın\",\r\n \"guarantee\": \"30 gün para iade garantisi. İstediğiniz zaman iptal edin, sorulsuz sualsiz.\",\r\n \"starterName\": \"Başlangıç\",\r\n \"starterDesc\": \"Bireyler ve küçük projeler için mükemmel\",\r\n \"starterPrice\": \"99₺\",\r\n \"starterFeature1\": \"5 projeye kadar\",\r\n \"starterFeature2\": \"10GB depolama\",\r\n \"starterFeature3\": \"Temel analitik\",\r\n \"starterFeature4\": \"E-posta desteği\",\r\n \"proName\": \"Pro\",\r\n \"proDesc\": \"Büyüyen ekipler ve işletmeler için en iyisi\",\r\n \"proPrice\": \"299₺\",\r\n \"proFeature1\": \"Sınırsız proje\",\r\n \"proFeature2\": \"100GB depolama\",\r\n \"proFeature3\": \"Gelişmiş analitik\",\r\n \"proFeature4\": \"Öncelikli destek\",\r\n \"proFeature5\": \"Ekip işbirliği araçları\",\r\n \"enterpriseName\": \"Gelişmiş\",\r\n \"enterpriseDesc\": \"Özel ihtiyaçları olan büyük kuruluşlar için\",\r\n \"enterprisePrice\": \"999₺\",\r\n \"enterpriseFeature1\": \"Pro'daki her şey\",\r\n \"enterpriseFeature2\": \"Sınırsız depolama\",\r\n \"enterpriseFeature3\": \"Özel entegrasyonlar\",\r\n \"enterpriseFeature4\": \"Özel hesap yöneticisi\",\r\n \"enterpriseFeature5\": \"Gelişmiş güvenlik ve uyumluluk\",\r\n \"enterpriseFeature6\": \"SLA ve 7/24 destek\"\r\n}\r\n"
35
35
  }
36
36
  ],
37
37
  "exports": {
@@ -16,7 +16,7 @@
16
16
  "path": "privacy-page/index.ts",
17
17
  "type": "registry:index",
18
18
  "target": "$modules$/privacy-page/index.ts",
19
- "content": "export * from './privacy-page';\nexport { PrivacyPage as default } from './privacy-page';\n"
19
+ "content": "export * from './privacy-page';\r\nexport { PrivacyPage as default } from './privacy-page';\r\n"
20
20
  },
21
21
  {
22
22
  "path": "privacy-page/privacy-page.tsx",
@@ -28,13 +28,13 @@
28
28
  "path": "privacy-page/lang/en.json",
29
29
  "type": "registry:lang",
30
30
  "target": "$modules$/privacy-page/lang/en.json",
31
- "content": "{\n \"title\": \"Privacy Policy\",\n \"lastUpdated\": \"Last Updated\",\n \"updateDate\": \"January 2026\",\n \"introduction\": \"We are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website or use our services.\",\n \"collectionTitle\": \"Information We Collect\",\n \"collectionContent\": \"We collect information that you provide directly to us, including personal identification information such as name, email address, and phone number. We also collect account credentials, payment information, communications with us, and device/usage data automatically when you use our services.\",\n \"usageTitle\": \"How We Use Your Information\",\n \"usageContent\": \"We use the information we collect to provide, maintain, and improve our services. This includes processing transactions, sending promotional communications with your consent, responding to your requests, monitoring usage trends, and detecting fraudulent activities.\",\n \"securityTitle\": \"Data Security\",\n \"securityContent\": \"We implement appropriate technical and organizational security measures to protect your personal information. This includes SSL/TLS encryption for data transmission, secure data storage with access controls, regular security assessments, and employee training on data protection.\",\n \"rightsTitle\": \"Your Rights\",\n \"rightsContent\": \"You have certain rights regarding your personal information subject to local data protection laws. These include the right to access and receive a copy of your data, rectify inaccurate information, request deletion, object to processing, and data portability to another service provider.\",\n \"cookiesTitle\": \"Cookies and Tracking\",\n \"cookiesContent\": \"We use cookies and similar tracking technologies to collect information about your browsing activities. This includes essential cookies for functionality, analytics cookies to understand user behavior, and marketing cookies for personalized advertising. You can manage preferences in your browser settings.\",\n \"contactTitle\": \"Contact Us\",\n \"contactContent\": \"If you have any questions about this Privacy Policy or our data practices, please contact us through our website contact form, by email, or through the contact information provided on our site.\",\n \"footerNote\": \"This privacy policy is subject to change. We will notify you of any material changes by posting the new policy on this page.\"\n}\n"
31
+ "content": "{\r\n \"title\": \"Privacy Policy\",\r\n \"lastUpdated\": \"Last Updated\",\r\n \"updateDate\": \"January 2026\",\r\n \"introduction\": \"We are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website or use our services.\",\r\n \"collectionTitle\": \"Information We Collect\",\r\n \"collectionContent\": \"We collect information that you provide directly to us, including personal identification information such as name, email address, and phone number. We also collect account credentials, payment information, communications with us, and device/usage data automatically when you use our services.\",\r\n \"usageTitle\": \"How We Use Your Information\",\r\n \"usageContent\": \"We use the information we collect to provide, maintain, and improve our services. This includes processing transactions, sending promotional communications with your consent, responding to your requests, monitoring usage trends, and detecting fraudulent activities.\",\r\n \"securityTitle\": \"Data Security\",\r\n \"securityContent\": \"We implement appropriate technical and organizational security measures to protect your personal information. This includes SSL/TLS encryption for data transmission, secure data storage with access controls, regular security assessments, and employee training on data protection.\",\r\n \"rightsTitle\": \"Your Rights\",\r\n \"rightsContent\": \"You have certain rights regarding your personal information subject to local data protection laws. These include the right to access and receive a copy of your data, rectify inaccurate information, request deletion, object to processing, and data portability to another service provider.\",\r\n \"cookiesTitle\": \"Cookies and Tracking\",\r\n \"cookiesContent\": \"We use cookies and similar tracking technologies to collect information about your browsing activities. This includes essential cookies for functionality, analytics cookies to understand user behavior, and marketing cookies for personalized advertising. You can manage preferences in your browser settings.\",\r\n \"contactTitle\": \"Contact Us\",\r\n \"contactContent\": \"If you have any questions about this Privacy Policy or our data practices, please contact us through our website contact form, by email, or through the contact information provided on our site.\",\r\n \"footerNote\": \"This privacy policy is subject to change. We will notify you of any material changes by posting the new policy on this page.\"\r\n}\r\n"
32
32
  },
33
33
  {
34
34
  "path": "privacy-page/lang/tr.json",
35
35
  "type": "registry:lang",
36
36
  "target": "$modules$/privacy-page/lang/tr.json",
37
- "content": "{\n \"title\": \"Gizlilik Politikası\",\n \"lastUpdated\": \"Son Güncelleme\",\n \"updateDate\": \"Ocak 2026\",\n \"introduction\": \"Gizliliğinizi korumaya ve kişisel bilgilerinizin güvenliğini sağlamaya kararlıyız. Bu Gizlilik Politikası, web sitemizi ziyaret ettiğinizde veya hizmetlerimizi kullandığınızda bilgilerinizi nasıl topladığımızı, kullandığımızı, açıkladığımızı ve koruduğumuzu açıklamaktadır.\",\n \"collectionTitle\": \"Topladığımız Bilgiler\",\n \"collectionContent\": \"Bize doğrudan sağladığınız bilgileri topluyoruz; bunlar arasında ad, e-posta adresi ve telefon numarası gibi kişisel kimlik bilgileri bulunmaktadır. Ayrıca hesap bilgilerini, ödeme bilgilerini, bizimle olan iletişimlerinizi ve hizmetlerimizi kullandığınızda otomatik olarak cihaz/kullanım verilerini topluyoruz.\",\n \"usageTitle\": \"Bilgilerinizi Nasıl Kullanıyoruz\",\n \"usageContent\": \"Topladığımız bilgileri hizmetlerimizi sağlamak, sürdürmek ve iyileştirmek için kullanıyoruz. Bu, işlemleri işlemeyi, izninizle promosyon iletişimleri göndermeyi, taleplerinize yanıt vermeyi, kullanım eğilimlerini izlemeyi ve dolandırıcılık faaliyetlerini tespit etmeyi içerir.\",\n \"securityTitle\": \"Veri Güvenliği\",\n \"securityContent\": \"Kişisel bilgilerinizi korumak için uygun teknik ve organizasyonel güvenlik önlemleri uyguluyoruz. Bu, veri iletimi için SSL/TLS şifreleme, erişim kontrolleri ile güvenli veri depolama, düzenli güvenlik değerlendirmeleri ve veri koruma konusunda çalışan eğitimini içerir.\",\n \"rightsTitle\": \"Haklarınız\",\n \"rightsContent\": \"Yerel veri koruma yasalarına tabi olarak kişisel bilgilerinizle ilgili belirli haklara sahipsiniz. Bunlar arasında verilerinize erişme ve kopyasını alma, yanlış bilgileri düzeltme, silme talep etme, işlemeye itiraz etme ve başka bir hizmet sağlayıcısına veri taşınabilirliği hakları bulunmaktadır.\",\n \"cookiesTitle\": \"Çerezler ve İzleme\",\n \"cookiesContent\": \"Tarama faaliyetleriniz hakkında bilgi toplamak için çerezler ve benzer izleme teknolojileri kullanıyoruz. Bu, işlevsellik için gerekli çerezleri, kullanıcı davranışını anlamak için analitik çerezleri ve kişiselleştirilmiş reklamcılık için pazarlama çerezlerini içerir. Tercihlerinizi tarayıcı ayarlarınızdan yönetebilirsiniz.\",\n \"contactTitle\": \"Bize Ulaşın\",\n \"contactContent\": \"Bu Gizlilik Politikası veya veri uygulamalarımız hakkında sorularınız varsa, lütfen web sitemizdeki iletişim formu, e-posta veya sitemizde sağlanan iletişim bilgileri aracılığıyla bizimle iletişime geçin.\",\n \"footerNote\": \"Bu gizlilik politikası değişikliğe tabidir. Herhangi bir önemli değişikliği bu sayfada yeni politikayı yayınlayarak size bildireceğiz.\"\n}\n"
37
+ "content": "{\r\n \"title\": \"Gizlilik Politikası\",\r\n \"lastUpdated\": \"Son Güncelleme\",\r\n \"updateDate\": \"Ocak 2026\",\r\n \"introduction\": \"Gizliliğinizi korumaya ve kişisel bilgilerinizin güvenliğini sağlamaya kararlıyız. Bu Gizlilik Politikası, web sitemizi ziyaret ettiğinizde veya hizmetlerimizi kullandığınızda bilgilerinizi nasıl topladığımızı, kullandığımızı, açıkladığımızı ve koruduğumuzu açıklamaktadır.\",\r\n \"collectionTitle\": \"Topladığımız Bilgiler\",\r\n \"collectionContent\": \"Bize doğrudan sağladığınız bilgileri topluyoruz; bunlar arasında ad, e-posta adresi ve telefon numarası gibi kişisel kimlik bilgileri bulunmaktadır. Ayrıca hesap bilgilerini, ödeme bilgilerini, bizimle olan iletişimlerinizi ve hizmetlerimizi kullandığınızda otomatik olarak cihaz/kullanım verilerini topluyoruz.\",\r\n \"usageTitle\": \"Bilgilerinizi Nasıl Kullanıyoruz\",\r\n \"usageContent\": \"Topladığımız bilgileri hizmetlerimizi sağlamak, sürdürmek ve iyileştirmek için kullanıyoruz. Bu, işlemleri işlemeyi, izninizle promosyon iletişimleri göndermeyi, taleplerinize yanıt vermeyi, kullanım eğilimlerini izlemeyi ve dolandırıcılık faaliyetlerini tespit etmeyi içerir.\",\r\n \"securityTitle\": \"Veri Güvenliği\",\r\n \"securityContent\": \"Kişisel bilgilerinizi korumak için uygun teknik ve organizasyonel güvenlik önlemleri uyguluyoruz. Bu, veri iletimi için SSL/TLS şifreleme, erişim kontrolleri ile güvenli veri depolama, düzenli güvenlik değerlendirmeleri ve veri koruma konusunda çalışan eğitimini içerir.\",\r\n \"rightsTitle\": \"Haklarınız\",\r\n \"rightsContent\": \"Yerel veri koruma yasalarına tabi olarak kişisel bilgilerinizle ilgili belirli haklara sahipsiniz. Bunlar arasında verilerinize erişme ve kopyasını alma, yanlış bilgileri düzeltme, silme talep etme, işlemeye itiraz etme ve başka bir hizmet sağlayıcısına veri taşınabilirliği hakları bulunmaktadır.\",\r\n \"cookiesTitle\": \"Çerezler ve İzleme\",\r\n \"cookiesContent\": \"Tarama faaliyetleriniz hakkında bilgi toplamak için çerezler ve benzer izleme teknolojileri kullanıyoruz. Bu, işlevsellik için gerekli çerezleri, kullanıcı davranışını anlamak için analitik çerezleri ve kişiselleştirilmiş reklamcılık için pazarlama çerezlerini içerir. Tercihlerinizi tarayıcı ayarlarınızdan yönetebilirsiniz.\",\r\n \"contactTitle\": \"Bize Ulaşın\",\r\n \"contactContent\": \"Bu Gizlilik Politikası veya veri uygulamalarımız hakkında sorularınız varsa, lütfen web sitemizdeki iletişim formu, e-posta veya sitemizde sağlanan iletişim bilgileri aracılığıyla bizimle iletişime geçin.\",\r\n \"footerNote\": \"Bu gizlilik politikası değişikliğe tabidir. Herhangi bir önemli değişikliği bu sayfada yeni politikayı yayınlayarak size bildireceğiz.\"\r\n}\r\n"
38
38
  }
39
39
  ],
40
40
  "exports": {
@@ -16,25 +16,25 @@
16
16
  "path": "product-card-detailed/index.ts",
17
17
  "type": "registry:index",
18
18
  "target": "$modules$/product-card-detailed/index.ts",
19
- "content": "export * from './product-card-detailed';\n"
19
+ "content": "export * from './product-card-detailed';\r\n"
20
20
  },
21
21
  {
22
22
  "path": "product-card-detailed/product-card-detailed.tsx",
23
23
  "type": "registry:component",
24
24
  "target": "$modules$/product-card-detailed/product-card-detailed.tsx",
25
- "content": "import { Link, useNavigate } from \"react-router\";\nimport { Heart } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n useCart,\n useFavorites,\n formatPrice,\n type Product,\n} from \"@/modules/ecommerce-core\";\nimport constants from \"@/constants/constants.json\";\n\ninterface ProductCardDetailedProps {\n product: Product;\n className?: string;\n}\n\nexport function ProductCardDetailed({\n product,\n className,\n}: ProductCardDetailedProps) {\n const { t } = useTranslation(\"product-card-detailed\");\n const navigate = useNavigate();\n const { addItem } = useCart();\n const { isFavorite, addToFavorites, removeFromFavorites } = useFavorites();\n const currency = (constants.site as any).currency || \"USD\";\n\n if (!product) {\n return null;\n }\n\n const price = product.on_sale && product.sale_price\n ? product.sale_price\n : product.price;\n\n const handleAddToCart = () => {\n addItem(product);\n toast.success(t(\"addedToCart\", \"Added to cart!\"));\n };\n\n const handleBuyNow = () => {\n addItem(product);\n navigate(\"/checkout\");\n };\n\n const handleToggleFavorite = () => {\n if (isFavorite(product.id)) {\n removeFromFavorites(product.id);\n } else {\n addToFavorites(product);\n }\n };\n\n return (\n <div\n className={cn(\n \"group relative block overflow-hidden h-full flex flex-col\",\n className\n )}\n >\n <div className=\"relative\">\n <button\n onClick={handleToggleFavorite}\n className=\"absolute end-4 top-4 z-10 rounded-full bg-background p-1.5 transition hover:text-primary\"\n >\n <span className=\"sr-only\">{t(\"wishlist\", \"Wishlist\")}</span>\n <Heart\n className={cn(\n \"size-4\",\n isFavorite(product.id) && \"fill-current text-red-500\"\n )}\n />\n </button>\n\n <Link to={`/products/${product.slug}`}>\n <img\n src={product.images[0] || \"/images/placeholder.png\"}\n alt={product.name}\n className=\"h-64 w-full object-cover transition duration-500 group-hover:scale-105 sm:h-72\"\n />\n </Link>\n </div>\n\n <div className=\"relative border border-border bg-background p-6 flex-1 flex flex-col\">\n <p>\n {formatPrice(price, currency)}\n {product.on_sale && product.sale_price && (\n <span className=\"text-muted-foreground line-through ml-2\">\n {formatPrice(product.price, currency)}\n </span>\n )}\n </p>\n\n <h3 className=\"mt-1.5 text-lg font-medium\">\n <Link to={`/products/${product.slug}`} className=\"hover:underline\">\n {product.name}\n </Link>\n </h3>\n\n <div className=\"mt-1.5 min-h-[4.5rem]\">\n {product.description && (\n <p className=\"line-clamp-3 text-muted-foreground text-sm\">\n {product.description}\n </p>\n )}\n </div>\n\n <div className=\"mt-auto pt-4 flex flex-col gap-3\">\n <Button\n className=\"w-full transition hover:scale-105\"\n onClick={handleBuyNow}\n >\n {t(\"buyNow\", \"Buy Now\")}\n </Button>\n <Button\n variant=\"secondary\"\n className=\"w-full transition hover:scale-105\"\n onClick={handleAddToCart}\n >\n {t(\"addToCart\", \"Add to Cart\")}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"
25
+ "content": "import { Link, useNavigate } from \"react-router\";\r\nimport { Heart } from \"lucide-react\";\r\nimport { toast } from \"sonner\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport {\r\n useCart,\r\n useFavorites,\r\n formatPrice,\r\n type Product,\r\n} from \"@/modules/ecommerce-core\";\r\nimport constants from \"@/constants/constants.json\";\r\n\r\ninterface ProductCardDetailedProps {\r\n product: Product;\r\n className?: string;\r\n}\r\n\r\nexport function ProductCardDetailed({\r\n product,\r\n className,\r\n}: ProductCardDetailedProps) {\r\n const { t } = useTranslation(\"product-card-detailed\");\r\n const navigate = useNavigate();\r\n const { addItem } = useCart();\r\n const { isFavorite, addToFavorites, removeFromFavorites } = useFavorites();\r\n const currency = (constants.site as any).currency || \"USD\";\r\n\r\n if (!product) {\r\n return null;\r\n }\r\n\r\n const price = product.on_sale && product.sale_price\r\n ? product.sale_price\r\n : product.price;\r\n\r\n const handleAddToCart = () => {\r\n addItem(product);\r\n toast.success(t(\"addedToCart\", \"Added to cart!\"));\r\n };\r\n\r\n const handleBuyNow = () => {\r\n addItem(product);\r\n navigate(\"/checkout\");\r\n };\r\n\r\n const handleToggleFavorite = () => {\r\n if (isFavorite(product.id)) {\r\n removeFromFavorites(product.id);\r\n } else {\r\n addToFavorites(product);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"group relative block overflow-hidden h-full flex flex-col\",\r\n className\r\n )}\r\n >\r\n <div className=\"relative\">\r\n <button\r\n onClick={handleToggleFavorite}\r\n className=\"absolute end-4 top-4 z-10 rounded-full bg-background p-1.5 transition hover:text-primary\"\r\n >\r\n <span className=\"sr-only\">{t(\"wishlist\", \"Wishlist\")}</span>\r\n <Heart\r\n className={cn(\r\n \"size-4\",\r\n isFavorite(product.id) && \"fill-current text-red-500\"\r\n )}\r\n />\r\n </button>\r\n\r\n <Link to={`/products/${product.slug}`}>\r\n <img\r\n src={product.images[0] || \"/images/placeholder.png\"}\r\n alt={product.name}\r\n className=\"h-64 w-full object-cover transition duration-500 group-hover:scale-105 sm:h-72\"\r\n />\r\n </Link>\r\n </div>\r\n\r\n <div className=\"relative border border-border bg-background p-6 flex-1 flex flex-col\">\r\n <p>\r\n {formatPrice(price, currency)}\r\n {product.on_sale && product.sale_price && (\r\n <span className=\"text-muted-foreground line-through ml-2\">\r\n {formatPrice(product.price, currency)}\r\n </span>\r\n )}\r\n </p>\r\n\r\n <h3 className=\"mt-1.5 text-lg font-medium\">\r\n <Link to={`/products/${product.slug}`} className=\"hover:underline\">\r\n {product.name}\r\n </Link>\r\n </h3>\r\n\r\n <div className=\"mt-1.5 min-h-[4.5rem]\">\r\n {product.description && (\r\n <p className=\"line-clamp-3 text-muted-foreground text-sm\">\r\n {product.description}\r\n </p>\r\n )}\r\n </div>\r\n\r\n <div className=\"mt-auto pt-4 flex flex-col gap-3\">\r\n <Button\r\n className=\"w-full transition hover:scale-105\"\r\n onClick={handleBuyNow}\r\n >\r\n {t(\"buyNow\", \"Buy Now\")}\r\n </Button>\r\n <Button\r\n variant=\"secondary\"\r\n className=\"w-full transition hover:scale-105\"\r\n onClick={handleAddToCart}\r\n >\r\n {t(\"addToCart\", \"Add to Cart\")}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"
26
26
  },
27
27
  {
28
28
  "path": "product-card-detailed/lang/en.json",
29
29
  "type": "registry:lang",
30
30
  "target": "$modules$/product-card-detailed/lang/en.json",
31
- "content": "{\n \"wishlist\": \"Wishlist\",\n \"addToCart\": \"Add to Cart\",\n \"buyNow\": \"Buy Now\"\n}\n"
31
+ "content": "{\r\n \"wishlist\": \"Wishlist\",\r\n \"addToCart\": \"Add to Cart\",\r\n \"buyNow\": \"Buy Now\"\r\n}\r\n"
32
32
  },
33
33
  {
34
34
  "path": "product-card-detailed/lang/tr.json",
35
35
  "type": "registry:lang",
36
36
  "target": "$modules$/product-card-detailed/lang/tr.json",
37
- "content": "{\n \"wishlist\": \"Favorilere Ekle\",\n \"addToCart\": \"Sepete Ekle\",\n \"buyNow\": \"Hemen Al\"\n}\n"
37
+ "content": "{\r\n \"wishlist\": \"Favorilere Ekle\",\r\n \"addToCart\": \"Sepete Ekle\",\r\n \"buyNow\": \"Hemen Al\"\r\n}\r\n"
38
38
  }
39
39
  ],
40
40
  "exports": {
@@ -10,25 +10,25 @@
10
10
  "path": "product-card-hover/index.ts",
11
11
  "type": "registry:index",
12
12
  "target": "$modules$/product-card-hover/index.ts",
13
- "content": "export * from './product-card-hover';\n"
13
+ "content": "export * from './product-card-hover';\r\n"
14
14
  },
15
15
  {
16
16
  "path": "product-card-hover/product-card-hover.tsx",
17
17
  "type": "registry:component",
18
18
  "target": "$modules$/product-card-hover/product-card-hover.tsx",
19
- "content": "import { Link } from \"react-router\";\nimport { cn } from \"@/lib/utils\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface ProductCardHoverProps {\n href: string;\n image: string;\n hoverImage: string;\n title: string;\n price: number;\n currency?: string;\n colorCount?: number;\n className?: string;\n}\n\nexport function ProductCardHover({\n href,\n image,\n hoverImage,\n title,\n price,\n currency = \"$\",\n colorCount,\n className,\n}: ProductCardHoverProps) {\n const { t } = useTranslation(\"product-card-hover\");\n\n return (\n <Link to={href} className={cn(\"group block overflow-hidden\", className)}>\n <div className=\"relative h-[350px] sm:h-[450px]\">\n <img\n src={image}\n alt={title}\n className=\"absolute inset-0 h-full w-full object-cover opacity-100 group-hover:opacity-0 transition-opacity duration-300\"\n />\n <img\n src={hoverImage}\n alt={title}\n className=\"absolute inset-0 h-full w-full object-cover opacity-0 group-hover:opacity-100 transition-opacity duration-300\"\n />\n </div>\n\n <div className=\"relative bg-background pt-3\">\n <h3 className=\"text-sm group-hover:underline group-hover:underline-offset-4\">\n {title}\n </h3>\n\n <div className=\"mt-1.5 flex items-center justify-between\">\n <p className=\"tracking-wide\">\n {currency}{price.toFixed(2)}\n </p>\n\n {colorCount && (\n <p className=\"text-xs tracking-wide uppercase text-muted-foreground\">\n {colorCount} {t(\"colors\", \"Colors\")}\n </p>\n )}\n </div>\n </div>\n </Link>\n );\n}\n"
19
+ "content": "import { Link } from \"react-router\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\ninterface ProductCardHoverProps {\r\n href: string;\r\n image: string;\r\n hoverImage: string;\r\n title: string;\r\n price: number;\r\n currency?: string;\r\n colorCount?: number;\r\n className?: string;\r\n}\r\n\r\nexport function ProductCardHover({\r\n href,\r\n image,\r\n hoverImage,\r\n title,\r\n price,\r\n currency = \"$\",\r\n colorCount,\r\n className,\r\n}: ProductCardHoverProps) {\r\n const { t } = useTranslation(\"product-card-hover\");\r\n\r\n return (\r\n <Link to={href} className={cn(\"group block overflow-hidden\", className)}>\r\n <div className=\"relative h-[350px] sm:h-[450px]\">\r\n <img\r\n src={image}\r\n alt={title}\r\n className=\"absolute inset-0 h-full w-full object-cover opacity-100 group-hover:opacity-0 transition-opacity duration-300\"\r\n />\r\n <img\r\n src={hoverImage}\r\n alt={title}\r\n className=\"absolute inset-0 h-full w-full object-cover opacity-0 group-hover:opacity-100 transition-opacity duration-300\"\r\n />\r\n </div>\r\n\r\n <div className=\"relative bg-background pt-3\">\r\n <h3 className=\"text-sm group-hover:underline group-hover:underline-offset-4\">\r\n {title}\r\n </h3>\r\n\r\n <div className=\"mt-1.5 flex items-center justify-between\">\r\n <p className=\"tracking-wide\">\r\n {currency}{price.toFixed(2)}\r\n </p>\r\n\r\n {colorCount && (\r\n <p className=\"text-xs tracking-wide uppercase text-muted-foreground\">\r\n {colorCount} {t(\"colors\", \"Colors\")}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </Link>\r\n );\r\n}\r\n"
20
20
  },
21
21
  {
22
22
  "path": "product-card-hover/lang/en.json",
23
23
  "type": "registry:lang",
24
24
  "target": "$modules$/product-card-hover/lang/en.json",
25
- "content": "{\n \"colors\": \"Colors\"\n}\n"
25
+ "content": "{\r\n \"colors\": \"Colors\"\r\n}\r\n"
26
26
  },
27
27
  {
28
28
  "path": "product-card-hover/lang/tr.json",
29
29
  "type": "registry:lang",
30
30
  "target": "$modules$/product-card-hover/lang/tr.json",
31
- "content": "{\n \"colors\": \"Renk\"\n}\n"
31
+ "content": "{\r\n \"colors\": \"Renk\"\r\n}\r\n"
32
32
  }
33
33
  ],
34
34
  "exports": {
@@ -12,7 +12,7 @@
12
12
  "path": "product-card/index.ts",
13
13
  "type": "registry:index",
14
14
  "target": "$modules$/product-card/index.ts",
15
- "content": "export * from './product-card';\n"
15
+ "content": "export * from './product-card';\r\n"
16
16
  },
17
17
  {
18
18
  "path": "product-card/product-card.tsx",
@@ -24,13 +24,13 @@
24
24
  "path": "product-card/lang/en.json",
25
25
  "type": "registry:lang",
26
26
  "target": "$modules$/product-card/lang/en.json",
27
- "content": "{\n \"outOfStock\": \"Out of Stock\",\n \"sale\": \"Sale\",\n \"new\": \"New\",\n \"featured\": \"Featured\",\n \"addToCart\": \"Add to Cart\",\n \"addToCartShort\": \"Add\",\n \"save\": \"Save\"\n}\n"
27
+ "content": "{\r\n \"outOfStock\": \"Out of Stock\",\r\n \"sale\": \"Sale\",\r\n \"new\": \"New\",\r\n \"featured\": \"Featured\",\r\n \"addToCart\": \"Add to Cart\",\r\n \"addToCartShort\": \"Add\",\r\n \"save\": \"Save\"\r\n}\r\n"
28
28
  },
29
29
  {
30
30
  "path": "product-card/lang/tr.json",
31
31
  "type": "registry:lang",
32
32
  "target": "$modules$/product-card/lang/tr.json",
33
- "content": "{\n \"outOfStock\": \"Stokta Yok\",\n \"sale\": \"İndirim\",\n \"new\": \"Yeni\",\n \"featured\": \"Öne Çıkan\",\n \"addToCart\": \"Sepete Ekle\",\n \"addToCartShort\": \"Ekle\",\n \"save\": \"Tasarruf\"\n}\n"
33
+ "content": "{\r\n \"outOfStock\": \"Stokta Yok\",\r\n \"sale\": \"İndirim\",\r\n \"new\": \"Yeni\",\r\n \"featured\": \"Öne Çıkan\",\r\n \"addToCart\": \"Sepete Ekle\",\r\n \"addToCartShort\": \"Ekle\",\r\n \"save\": \"Tasarruf\"\r\n}\r\n"
34
34
  }
35
35
  ],
36
36
  "exports": {
@@ -12,7 +12,7 @@
12
12
  "path": "product-detail-block/index.ts",
13
13
  "type": "registry:index",
14
14
  "target": "$modules$/product-detail-block/index.ts",
15
- "content": "export * from './product-detail-block';\n"
15
+ "content": "export * from './product-detail-block';\r\n"
16
16
  },
17
17
  {
18
18
  "path": "product-detail-block/product-detail-block.tsx",