@promakeai/cli 0.3.0 → 0.3.2
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.
- package/dist/index.js +209 -415
- package/dist/registry/about-page.json +3 -3
- package/dist/registry/about-section.json +4 -4
- package/dist/registry/animations.json +2 -2
- package/dist/registry/announcement-bar.json +4 -4
- package/dist/registry/api.json +1 -1
- package/dist/registry/auth-core.json +3 -3
- package/dist/registry/bento-grid-section.json +4 -4
- package/dist/registry/blog-core.json +5 -5
- package/dist/registry/blog-list-page.json +3 -3
- package/dist/registry/blog-section.json +4 -4
- package/dist/registry/cards-carousel-section.json +4 -4
- package/dist/registry/cart-drawer.json +3 -3
- package/dist/registry/cart-page.json +3 -3
- package/dist/registry/case-study-page.json +3 -3
- package/dist/registry/category-section.json +3 -3
- package/dist/registry/checkout-page.json +3 -3
- package/dist/registry/coming-soon-page-minimal.json +4 -4
- package/dist/registry/coming-soon-page.json +4 -4
- package/dist/registry/contact-info-grid.json +4 -4
- package/dist/registry/contact-page-centered.json +4 -4
- package/dist/registry/contact-page-split.json +4 -4
- package/dist/registry/contact-page.json +3 -3
- package/dist/registry/content-section.json +4 -4
- package/dist/registry/cookie-consent.json +4 -4
- package/dist/registry/cookies-page.json +3 -3
- package/dist/registry/cta-section.json +3 -3
- package/dist/registry/ecommerce-core.json +10 -10
- package/dist/registry/empty-page.json +3 -3
- package/dist/registry/faq-categorized.json +4 -4
- package/dist/registry/faq-simple.json +4 -4
- package/dist/registry/favorites-blog-block.json +1 -1
- package/dist/registry/favorites-blog-page.json +4 -4
- package/dist/registry/favorites-ecommerce-block.json +1 -1
- package/dist/registry/favorites-ecommerce-page.json +4 -4
- package/dist/registry/feature-section.json +3 -3
- package/dist/registry/featured-products.json +3 -3
- package/dist/registry/footer-detailed.json +4 -4
- package/dist/registry/footer-minimal.json +3 -3
- package/dist/registry/footer.json +3 -3
- package/dist/registry/forgot-password-page-split.json +4 -4
- package/dist/registry/forgot-password-page.json +4 -4
- package/dist/registry/google-adsense.json +4 -4
- package/dist/registry/google-map.json +2 -2
- package/dist/registry/header-centered-pill.json +4 -4
- package/dist/registry/header-ecommerce.json +3 -3
- package/dist/registry/header-mega.json +4 -4
- package/dist/registry/header-minimal.json +4 -4
- package/dist/registry/header-simple.json +3 -3
- package/dist/registry/hero-carousel.json +3 -3
- package/dist/registry/hero-cta.json +4 -4
- package/dist/registry/hero-gradient.json +4 -4
- package/dist/registry/hero-grid.json +4 -4
- package/dist/registry/hero-profile.json +3 -3
- package/dist/registry/hero.json +3 -3
- package/dist/registry/landing-page-app.json +3 -3
- package/dist/registry/landing-page-saas.json +3 -3
- package/dist/registry/login-page-split.json +4 -4
- package/dist/registry/login-page.json +4 -4
- package/dist/registry/logo-cloud.json +4 -4
- package/dist/registry/masonry-grid.json +3 -3
- package/dist/registry/my-orders-page.json +4 -4
- package/dist/registry/newsletter-section.json +4 -4
- package/dist/registry/order-card-compact.json +1 -1
- package/dist/registry/order-confirmation-page.json +4 -4
- package/dist/registry/order-detail-block.json +1 -1
- package/dist/registry/orders-list-block.json +1 -1
- package/dist/registry/payment-success-block.json +1 -1
- package/dist/registry/portfolio-page.json +4 -4
- package/dist/registry/post-card.json +3 -3
- package/dist/registry/post-detail-block.json +1 -1
- package/dist/registry/post-detail-page.json +4 -4
- package/dist/registry/pricing-card.json +3 -3
- package/dist/registry/pricing-page.json +4 -4
- package/dist/registry/pricing-section.json +4 -4
- package/dist/registry/privacy-page.json +3 -3
- package/dist/registry/product-card-detailed.json +4 -4
- package/dist/registry/product-card-hover.json +4 -4
- package/dist/registry/product-card.json +3 -3
- package/dist/registry/product-detail-block.json +1 -1
- package/dist/registry/product-detail-page.json +4 -4
- package/dist/registry/product-detail-section.json +4 -4
- package/dist/registry/product-quick-view.json +4 -4
- package/dist/registry/products-page.json +3 -3
- package/dist/registry/reading-progress.json +4 -4
- package/dist/registry/register-page-split.json +4 -4
- package/dist/registry/register-page.json +4 -4
- package/dist/registry/related-posts-block.json +1 -1
- package/dist/registry/related-products-block.json +1 -1
- package/dist/registry/reset-password-page-split.json +4 -4
- package/dist/registry/service-card.json +1 -1
- package/dist/registry/share-buttons.json +4 -4
- package/dist/registry/skill-card.json +1 -1
- package/dist/registry/team-page.json +4 -4
- package/dist/registry/terms-page.json +3 -3
- package/dist/registry/testimonials-carousel.json +4 -4
- package/dist/registry/testimonials-grid.json +4 -4
- package/dist/registry/timeline-section.json +4 -4
- package/dist/registry/video-hero.json +4 -4
- package/dist/registry/youtube-embed.json +4 -4
- package/package.json +2 -2
- package/template/.env +6 -6
- package/template/public/_redirects +1 -1
- package/template/public/robots.txt +14 -14
- package/template/src/components/GoogleAnalytics.tsx +34 -34
- package/template/src/components/LanguageSwitcher.tsx +53 -53
- package/template/src/components/ScriptInjector.tsx +62 -62
- package/template/src/lib/env.ts +19 -19
- package/template/src/router.tsx +14 -14
- package/template/src/vite-env.d.ts +1 -1
- package/dist/registry/auth.json +0 -70
- package/dist/registry/docs/reset-password-page.md +0 -36
- package/dist/registry/reset-password-page.json +0 -39
|
@@ -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\";\
|
|
19
|
+
"content": "export * from \"./pricing-page\";\nexport { default } from \"./pricing-page\";\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\";\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"
|
|
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"
|
|
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": "{\
|
|
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"
|
|
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": "{\
|
|
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"
|
|
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';\
|
|
16
|
+
"content": "export * from './pricing-section';\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\";\
|
|
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"
|
|
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": "{\
|
|
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"
|
|
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": "{\
|
|
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"
|
|
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';\
|
|
19
|
+
"content": "export * from './privacy-page';\nexport { PrivacyPage as default } from './privacy-page';\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": "{\
|
|
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"
|
|
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": "{\
|
|
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"
|
|
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';\
|
|
19
|
+
"content": "export * from './product-card-detailed';\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\";\
|
|
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"
|
|
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": "{\
|
|
31
|
+
"content": "{\n \"wishlist\": \"Wishlist\",\n \"addToCart\": \"Add to Cart\",\n \"buyNow\": \"Buy Now\"\n}\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": "{\
|
|
37
|
+
"content": "{\n \"wishlist\": \"Favorilere Ekle\",\n \"addToCart\": \"Sepete Ekle\",\n \"buyNow\": \"Hemen Al\"\n}\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';\
|
|
13
|
+
"content": "export * from './product-card-hover';\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\";\
|
|
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"
|
|
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": "{\
|
|
25
|
+
"content": "{\n \"colors\": \"Colors\"\n}\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": "{\
|
|
31
|
+
"content": "{\n \"colors\": \"Renk\"\n}\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';\
|
|
15
|
+
"content": "export * from './product-card';\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": "{\
|
|
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"
|
|
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": "{\
|
|
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"
|
|
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';\
|
|
15
|
+
"content": "export * from './product-detail-block';\n"
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"path": "product-detail-block/product-detail-block.tsx",
|
|
@@ -17,25 +17,25 @@
|
|
|
17
17
|
"path": "product-detail-page/index.ts",
|
|
18
18
|
"type": "registry:index",
|
|
19
19
|
"target": "$modules$/product-detail-page/index.ts",
|
|
20
|
-
"content": "export * from './product-detail-page';\
|
|
20
|
+
"content": "export * from './product-detail-page';\nexport { ProductDetailPage as default } from './product-detail-page';\n"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "product-detail-page/product-detail-page.tsx",
|
|
24
24
|
"type": "registry:page",
|
|
25
25
|
"target": "$modules$/product-detail-page/product-detail-page.tsx",
|
|
26
|
-
"content": "import { useParams } from \"react-router\";\
|
|
26
|
+
"content": "import { useParams } from \"react-router\";\nimport { useProductBySlug } from \"@/modules/ecommerce-core\";\nimport { ProductDetailBlock } from \"@/modules/product-detail-block\";\nimport { Layout } from \"@/components/Layout\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useTranslation } from \"react-i18next\";\n\nexport function ProductDetailPage() {\n const { t } = useTranslation(\"product-detail-page\");\n const { slug } = useParams<{ slug: string }>();\n const { product, loading, error } = useProductBySlug(slug || \"\");\n\n usePageTitle({ title: product?.name || 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\">\n <div className=\"grid lg:grid-cols-2 gap-12\">\n <div className=\"aspect-square bg-muted rounded-lg\"></div>\n <div className=\"space-y-4\">\n <div className=\"h-6 bg-muted rounded w-1/4\"></div>\n <div className=\"h-10 bg-muted rounded w-3/4\"></div>\n <div className=\"h-4 bg-muted rounded w-1/3\"></div>\n <div className=\"h-8 bg-muted rounded w-1/4\"></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-2/3\"></div>\n </div>\n <div className=\"h-12 bg-muted rounded w-1/2\"></div>\n </div>\n </div>\n </div>\n </div>\n </Layout>\n );\n }\n\n if (error || !product) {\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\", \"Product Not Found\")}</h1>\n <p className=\"text-muted-foreground\">{t(\"notFoundDescription\", \"The product you're looking for doesn't exist or has been removed.\")}</p>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout>\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4 py-8\">\n <ProductDetailBlock product={product} />\n </div>\n </Layout>\n );\n}\n\nexport default ProductDetailPage;\n"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "product-detail-page/lang/en.json",
|
|
30
30
|
"type": "registry:lang",
|
|
31
31
|
"target": "$modules$/product-detail-page/lang/en.json",
|
|
32
|
-
"content": "{\
|
|
32
|
+
"content": "{\n \"loading\": \"Loading...\",\n \"notFound\": \"Product Not Found\",\n \"notFoundDescription\": \"The product you're looking for doesn't exist or has been removed.\"\n}\n"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"path": "product-detail-page/lang/tr.json",
|
|
36
36
|
"type": "registry:lang",
|
|
37
37
|
"target": "$modules$/product-detail-page/lang/tr.json",
|
|
38
|
-
"content": "{\
|
|
38
|
+
"content": "{\n \"loading\": \"Yükleniyor...\",\n \"notFound\": \"Ürün Bulunamadı\",\n \"notFoundDescription\": \"Aradığınız ürün mevcut değil veya kaldırılmış.\"\n}\n"
|
|
39
39
|
}
|
|
40
40
|
],
|
|
41
41
|
"exports": {
|
|
@@ -17,25 +17,25 @@
|
|
|
17
17
|
"path": "product-detail-section/index.ts",
|
|
18
18
|
"type": "registry:index",
|
|
19
19
|
"target": "$modules$/product-detail-section/index.ts",
|
|
20
|
-
"content": "export * from './product-detail-section';\
|
|
20
|
+
"content": "export * from './product-detail-section';\n"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "product-detail-section/product-detail-section.tsx",
|
|
24
24
|
"type": "registry:component",
|
|
25
25
|
"target": "$modules$/product-detail-section/product-detail-section.tsx",
|
|
26
|
-
"content": "import { Star, Heart, Facebook, Twitter, MessageCircle } from \"lucide-react\";\
|
|
26
|
+
"content": "import { Star, Heart, Facebook, Twitter, MessageCircle } 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 ProductDetailSectionProps {\n product: Product;\n className?: string;\n}\n\nexport function ProductDetailSection({\n product,\n className,\n}: ProductDetailSectionProps) {\n const { t } = useTranslation(\"product-detail-section\");\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 handleToggleFavorite = () => {\n if (isFavorite(product.id)) {\n removeFromFavorites(product.id);\n } else {\n addToFavorites(product);\n }\n };\n\n const renderStars = (rating: number) => {\n return Array.from({ length: 5 }, (_, i) => (\n <Star\n key={i}\n className={cn(\n \"w-4 h-4\",\n i < Math.floor(rating) ? \"fill-primary text-primary\" : \"text-primary\"\n )}\n />\n ));\n };\n\n return (\n <section className={cn(\"py-24\", className)}>\n <div className=\"container px-5 mx-auto\">\n <div className=\"lg:w-4/5 mx-auto flex flex-wrap\">\n <img\n alt={product.name}\n className=\"lg:w-1/2 w-full lg:h-auto h-64 object-cover object-center rounded\"\n src={product.images[0] || \"/images/placeholder.png\"}\n />\n <div className=\"lg:w-1/2 w-full lg:pl-10 lg:py-6 mt-6 lg:mt-0\">\n {product.brand && (\n <h2 className=\"text-sm text-muted-foreground tracking-widest uppercase\">\n {product.brand}\n </h2>\n )}\n <h1 className=\"text-3xl font-medium mb-1\">{product.name}</h1>\n\n <div className=\"flex mb-4\">\n <span className=\"flex items-center\">\n {renderStars(product.rating)}\n <span className=\"text-muted-foreground ml-3\">\n {product.review_count} {t(\"reviews\", \"Reviews\")}\n </span>\n </span>\n <span className=\"flex ml-3 pl-3 py-2 border-l-2 border-border space-x-2\">\n <a\n href=\"#\"\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Facebook className=\"w-5 h-5\" />\n </a>\n <a\n href=\"#\"\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Twitter className=\"w-5 h-5\" />\n </a>\n <a\n href=\"#\"\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <MessageCircle className=\"w-5 h-5\" />\n </a>\n </span>\n </div>\n\n <p className=\"leading-relaxed text-muted-foreground\">\n {product.description}\n </p>\n\n {product.category_name && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {t(\"category\", \"Category\")}: {product.category_name}\n </p>\n )}\n\n <div className=\"flex mt-6 items-center pb-5 border-b-2 border-border mb-5\">\n {product.stock > 0 ? (\n <span className=\"text-sm text-green-600 dark:text-green-400\">\n {t(\"inStock\", \"In Stock\")} ({product.stock})\n </span>\n ) : (\n <span className=\"text-sm text-red-600 dark:text-red-400\">\n {t(\"outOfStock\", \"Out of Stock\")}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center\">\n <span className=\"font-medium text-2xl\">\n {formatPrice(price, currency)}\n {product.on_sale && product.sale_price && (\n <span className=\"text-lg text-muted-foreground line-through ml-2\">\n {formatPrice(product.price, currency)}\n </span>\n )}\n </span>\n <Button\n onClick={handleAddToCart}\n className=\"ml-auto\"\n disabled={product.stock === 0}\n >\n {t(\"addToCart\", \"Add to Cart\")}\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleToggleFavorite}\n className=\"rounded-full ml-4\"\n >\n <Heart\n className={cn(\n \"w-5 h-5\",\n isFavorite(product.id) && \"fill-current text-red-500\"\n )}\n />\n </Button>\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n}\n"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "product-detail-section/lang/en.json",
|
|
30
30
|
"type": "registry:lang",
|
|
31
31
|
"target": "$modules$/product-detail-section/lang/en.json",
|
|
32
|
-
"content": "{\
|
|
32
|
+
"content": "{\n \"reviews\": \"Reviews\",\n \"color\": \"Color\",\n \"size\": \"Size\",\n \"addToCart\": \"Add to Cart\"\n}\n"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"path": "product-detail-section/lang/tr.json",
|
|
36
36
|
"type": "registry:lang",
|
|
37
37
|
"target": "$modules$/product-detail-section/lang/tr.json",
|
|
38
|
-
"content": "{\
|
|
38
|
+
"content": "{\n \"reviews\": \"Değerlendirme\",\n \"color\": \"Renk\",\n \"size\": \"Beden\",\n \"addToCart\": \"Sepete Ekle\"\n}\n"
|
|
39
39
|
}
|
|
40
40
|
],
|
|
41
41
|
"exports": {
|