@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
|
@@ -10,25 +10,25 @@
|
|
|
10
10
|
"path": "hero-gradient/index.ts",
|
|
11
11
|
"type": "registry:index",
|
|
12
12
|
"target": "$modules$/hero-gradient/index.ts",
|
|
13
|
-
"content": "export * from './hero-gradient';\
|
|
13
|
+
"content": "export * from './hero-gradient';\n"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"path": "hero-gradient/hero-gradient.tsx",
|
|
17
17
|
"type": "registry:component",
|
|
18
18
|
"target": "$modules$/hero-gradient/hero-gradient.tsx",
|
|
19
|
-
"content": "import { Link } from \"react-router\";\
|
|
19
|
+
"content": "import { Link } from \"react-router\";\nimport { ArrowRight } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\ninterface HeroGradientProps {\n className?: string;\n}\n\nexport function HeroGradient({ className }: HeroGradientProps) {\n const { t } = useTranslation(\"hero-gradient\");\n\n return (\n <section\n className={cn(\n \"relative min-h-[70vh] flex items-center justify-center overflow-hidden\",\n className\n )}\n >\n {/* Gradient Background */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-primary/20 via-background to-primary/10\" />\n\n {/* Animated gradient orbs */}\n <div className=\"absolute top-1/4 left-1/4 h-96 w-96 rounded-full bg-primary/30 blur-3xl animate-pulse\" />\n <div className=\"absolute bottom-1/4 right-1/4 h-80 w-80 rounded-full bg-primary/20 blur-3xl animate-pulse delay-700\" />\n\n {/* Grid pattern overlay */}\n <div className=\"absolute inset-0 bg-[linear-gradient(to_right,hsl(var(--border)/0.1)_1px,transparent_1px),linear-gradient(to_bottom,hsl(var(--border)/0.1)_1px,transparent_1px)] bg-[size:4rem_4rem]\" />\n\n {/* Content */}\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4 relative z-10\">\n <div className=\"max-w-4xl mx-auto text-center\">\n {/* Badge */}\n <div className=\"inline-flex items-center gap-2 rounded-full border border-border/50 bg-background/50 backdrop-blur-sm px-4 py-1.5 text-sm mb-8\">\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-primary\" />\n </span>\n {t(\"badge\", \"New features available\")}\n </div>\n\n {/* Heading */}\n <h1 className=\"text-4xl sm:text-5xl md:text-6xl lg:text-7xl font-bold tracking-tight mb-6 leading-tight\">\n {t(\"headingLine1\", \"Transform your ideas\")}\n <br />\n <span className=\"bg-gradient-to-r from-primary to-primary/60 bg-clip-text text-transparent\">\n {t(\"headingLine2\", \"into reality\")}\n </span>\n </h1>\n\n {/* Description */}\n <p className=\"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto mb-10\">\n {t(\"description\", \"A powerful platform that helps you build, deploy, and scale your applications with ease. Start your journey today.\")}\n </p>\n\n {/* CTA Buttons */}\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n <Button asChild size=\"lg\" className=\"text-base px-8\">\n <Link to=\"/register\">\n {t(\"primaryCta\", \"Start Building\")}\n <ArrowRight className=\"ml-2 h-4 w-4\" />\n </Link>\n </Button>\n <Button asChild variant=\"outline\" size=\"lg\" className=\"text-base px-8\">\n <Link to=\"/contact\">\n {t(\"secondaryCta\", \"Contact Sales\")}\n </Link>\n </Button>\n </div>\n\n {/* Trust badges */}\n <div className=\"mt-12 flex flex-wrap items-center justify-center gap-8 text-muted-foreground\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold text-foreground\">10K+</span>\n <span className=\"text-sm\">{t(\"users\", \"Active Users\")}</span>\n </div>\n <div className=\"h-8 w-px bg-border hidden sm:block\" />\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold text-foreground\">99.9%</span>\n <span className=\"text-sm\">{t(\"uptime\", \"Uptime\")}</span>\n </div>\n <div className=\"h-8 w-px bg-border hidden sm:block\" />\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold text-foreground\">24/7</span>\n <span className=\"text-sm\">{t(\"support\", \"Support\")}</span>\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n}\n"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "hero-gradient/lang/en.json",
|
|
23
23
|
"type": "registry:lang",
|
|
24
24
|
"target": "$modules$/hero-gradient/lang/en.json",
|
|
25
|
-
"content": "{\
|
|
25
|
+
"content": "{\n \"badge\": \"New Feature Available\",\n \"headingLine1\": \"Build Something Amazing\",\n \"headingLine2\": \"with your site headline\",\n \"description\": \"Create powerful solutions that drive results for your business.\",\n \"primaryCta\": \"Get Started\",\n \"secondaryCta\": \"Contact Sales\",\n \"users\": \"Active Users\",\n \"uptime\": \"Uptime\",\n \"support\": \"Support\"\n}\n"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"path": "hero-gradient/lang/tr.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/hero-gradient/lang/tr.json",
|
|
31
|
-
"content": "{\
|
|
31
|
+
"content": "{\n \"badge\": \"Yeni Özellik Mevcut\",\n \"headingLine1\": \"Harika Bir Şey İnşa Edin\",\n \"headingLine2\": \"site başlığınızla güncellemesini isteyin\",\n \"description\": \"İşiniz için sonuç odaklı güçlü çözümler oluşturun.\",\n \"primaryCta\": \"Başlayın\",\n \"secondaryCta\": \"Satış ile İletişim\",\n \"users\": \"Aktif Kullanıcı\",\n \"uptime\": \"Çalışma Süresi\",\n \"support\": \"Destek\"\n}\n"
|
|
32
32
|
}
|
|
33
33
|
],
|
|
34
34
|
"exports": {
|
|
@@ -12,25 +12,25 @@
|
|
|
12
12
|
"path": "hero-grid/index.ts",
|
|
13
13
|
"type": "registry:index",
|
|
14
14
|
"target": "$modules$/hero-grid/index.ts",
|
|
15
|
-
"content": "export * from './hero-grid';\
|
|
15
|
+
"content": "export * from './hero-grid';\n"
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"path": "hero-grid/hero-grid.tsx",
|
|
19
19
|
"type": "registry:component",
|
|
20
20
|
"target": "$modules$/hero-grid/hero-grid.tsx",
|
|
21
|
-
"content": "import { Link } from \"react-router\";\
|
|
21
|
+
"content": "import { Link } from \"react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface HeroGridProps {\n images?: string[];\n ctaHref?: string;\n className?: string;\n}\n\nexport function HeroGrid({\n images = [\n \"/images/placeholder.png\",\n \"/images/placeholder.png\",\n \"/images/placeholder.png\",\n \"/images/placeholder.png\",\n \"/images/placeholder.png\",\n \"/images/placeholder.png\",\n \"/images/placeholder.png\",\n ],\n ctaHref = \"/products\",\n className,\n}: HeroGridProps) {\n const { t } = useTranslation(\"hero-grid\");\n\n return (\n <div className={cn(\"relative overflow-hidden bg-background\", className)}>\n <div className=\"pt-16 pb-80 sm:pt-24 sm:pb-40 lg:pt-40 lg:pb-48\">\n <div className=\"relative mx-auto max-w-7xl px-4 sm:static sm:px-6 lg:px-8\">\n <div className=\"sm:max-w-lg\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-6xl\">\n {t(\"title\", \"Discover Our Latest Collection\")}\n </h1>\n <p className=\"mt-4 text-xl text-muted-foreground\">\n {t(\"description\", \"Explore our curated selection of premium products designed to elevate your everyday experience.\")}\n </p>\n </div>\n <div>\n <div className=\"mt-10\">\n {/* Decorative image grid */}\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none lg:absolute lg:inset-y-0 lg:mx-auto lg:w-full lg:max-w-7xl\"\n >\n <div className=\"absolute transform sm:top-0 sm:left-1/2 sm:translate-x-8 lg:top-1/2 lg:left-1/2 lg:translate-x-8 lg:-translate-y-1/2\">\n <div className=\"flex items-center space-x-6 lg:space-x-8\">\n <div className=\"grid shrink-0 grid-cols-1 gap-y-6 lg:gap-y-8\">\n <div className=\"h-64 w-44 overflow-hidden rounded-lg sm:opacity-0 lg:opacity-100\">\n <img\n alt=\"\"\n src={images[0]}\n className=\"size-full object-cover\"\n />\n </div>\n <div className=\"h-64 w-44 overflow-hidden rounded-lg\">\n <img\n alt=\"\"\n src={images[1]}\n className=\"size-full object-cover\"\n />\n </div>\n </div>\n <div className=\"grid shrink-0 grid-cols-1 gap-y-6 lg:gap-y-8\">\n <div className=\"h-64 w-44 overflow-hidden rounded-lg\">\n <img\n alt=\"\"\n src={images[2]}\n className=\"size-full object-cover\"\n />\n </div>\n <div className=\"h-64 w-44 overflow-hidden rounded-lg\">\n <img\n alt=\"\"\n src={images[3]}\n className=\"size-full object-cover\"\n />\n </div>\n <div className=\"h-64 w-44 overflow-hidden rounded-lg\">\n <img\n alt=\"\"\n src={images[4]}\n className=\"size-full object-cover\"\n />\n </div>\n </div>\n <div className=\"grid shrink-0 grid-cols-1 gap-y-6 lg:gap-y-8\">\n <div className=\"h-64 w-44 overflow-hidden rounded-lg\">\n <img\n alt=\"\"\n src={images[5]}\n className=\"size-full object-cover\"\n />\n </div>\n <div className=\"h-64 w-44 overflow-hidden rounded-lg\">\n <img\n alt=\"\"\n src={images[6]}\n className=\"size-full object-cover\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <Button asChild size=\"lg\">\n <Link to={ctaHref}>\n {t(\"cta\", \"Shop Collection\")}\n </Link>\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "hero-grid/lang/en.json",
|
|
25
25
|
"type": "registry:lang",
|
|
26
26
|
"target": "$modules$/hero-grid/lang/en.json",
|
|
27
|
-
"content": "{\
|
|
27
|
+
"content": "{\n \"title\": \"Discover What We Offer\",\n \"description\": \"Explore our curated selection of offerings designed to elevate your experience and help you achieve your goals.\",\n \"cta\": \"Explore Now\"\n}\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "hero-grid/lang/tr.json",
|
|
31
31
|
"type": "registry:lang",
|
|
32
32
|
"target": "$modules$/hero-grid/lang/tr.json",
|
|
33
|
-
"content": "{\
|
|
33
|
+
"content": "{\n \"title\": \"Neler Sunduğumuzu Keşfedin\",\n \"description\": \"Deneyiminizi zenginleştirmek ve hedeflerinize ulaşmanıza yardımcı olmak için tasarlanmış özenle seçilmiş tekliflerimizi keşfedin.\",\n \"cta\": \"Keşfet\"\n}\n"
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"exports": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"path": "hero-profile/index.ts",
|
|
14
14
|
"type": "registry:index",
|
|
15
15
|
"target": "$modules$/hero-profile/index.ts",
|
|
16
|
-
"content": "export * from './hero-profile';\
|
|
16
|
+
"content": "export * from './hero-profile';\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "hero-profile/hero-profile.tsx",
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
"path": "hero-profile/lang/en.json",
|
|
26
26
|
"type": "registry:lang",
|
|
27
27
|
"target": "$modules$/hero-profile/lang/en.json",
|
|
28
|
-
"content": "{\
|
|
28
|
+
"content": "{\n \"name\": \"Your Name\",\n \"bio\": \"Your professional title and location\",\n \"greeting\": \"Hello There!\",\n \"intro\": \"Your introduction and what you do\",\n \"freelancing\": \"Available for Freelancing\",\n \"companiesTitle\": \"Teams I've Worked With\"\n}\n"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "hero-profile/lang/tr.json",
|
|
32
32
|
"type": "registry:lang",
|
|
33
33
|
"target": "$modules$/hero-profile/lang/tr.json",
|
|
34
|
-
"content": "{\
|
|
34
|
+
"content": "{\n \"name\": \"Adınız\",\n \"bio\": \"Mesleğiniz ve konumunuz\",\n \"greeting\": \"Merhaba!\",\n \"intro\": \"Tanıtımınız ve ne yaptığınız\",\n \"freelancing\": \"Freelance İçin Müsait\",\n \"companiesTitle\": \"Çalıştığım Ekipler\"\n}\n"
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"tailwind": {
|
package/dist/registry/hero.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"path": "hero/index.ts",
|
|
11
11
|
"type": "registry:index",
|
|
12
12
|
"target": "$modules$/hero/index.ts",
|
|
13
|
-
"content": "export * from './hero';\
|
|
13
|
+
"content": "export * from './hero';\n"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"path": "hero/hero.tsx",
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
"path": "hero/lang/en.json",
|
|
23
23
|
"type": "registry:lang",
|
|
24
24
|
"target": "$modules$/hero/lang/en.json",
|
|
25
|
-
"content": "{\
|
|
25
|
+
"content": "{\n \"discover\": \"Discover\",\n \"amazing\": \"Inspiring\",\n \"content\": \"Stories\",\n \"subtitle\": \"Explore inspiring stories and meaningful content.\",\n \"readLatest\": \"Start Reading\",\n \"exploreTopics\": \"Explore Topics\"\n}\n"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"path": "hero/lang/tr.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/hero/lang/tr.json",
|
|
31
|
-
"content": "{\
|
|
31
|
+
"content": "{\n \"discover\": \"Keşfedin\",\n \"amazing\": \"İlham Verici\",\n \"content\": \"Hikayeler\",\n \"subtitle\": \"İlham verici hikayeleri ve anlamlı içerikleri keşfedin.\",\n \"readLatest\": \"Okumaya Başlayın\",\n \"exploreTopics\": \"Konuları Keşfedin\"\n}\n"
|
|
32
32
|
}
|
|
33
33
|
],
|
|
34
34
|
"exports": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "landing-page-app/index.ts",
|
|
17
17
|
"type": "registry:index",
|
|
18
18
|
"target": "$modules$/landing-page-app/index.ts",
|
|
19
|
-
"content": "export * from \"./landing-page-app\";\
|
|
19
|
+
"content": "export * from \"./landing-page-app\";\nexport { default } from \"./landing-page-app\";\n"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "landing-page-app/landing-page-app.tsx",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"path": "landing-page-app/lang/en.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/landing-page-app/lang/en.json",
|
|
31
|
-
"content": "{\
|
|
31
|
+
"content": "{\n \"title\": \"Mobile App\",\n \"badge\": \"Available on iOS & Android\",\n \"heroTitle\": \"Your App Name Here\",\n \"heroDescription\": \"The all-in-one app that simplifies your daily tasks and boosts productivity.\",\n \"downloadOn\": \"Download on the\",\n \"getItOn\": \"Get it on\",\n \"downloads\": \"Downloads\",\n \"inCategory\": \"In Category\",\n \"taskComplete\": \"Task Complete!\",\n \"newMessage\": \"New Message\",\n \"featuresLabel\": \"Features\",\n \"featuresTitle\": \"Why You'll Love It\",\n \"feature1Title\": \"Feature One\",\n \"feature1Desc\": \"Lightning-fast performance keeps your app running smoothly at all times.\",\n \"feature2Title\": \"Feature Two\",\n \"feature2Desc\": \"Stay informed with intelligent notifications tailored to your preferences.\",\n \"feature3Title\": \"Feature Three\",\n \"feature3Desc\": \"Your data is protected with bank-level encryption and privacy controls.\",\n \"feature4Title\": \"Feature Four\",\n \"feature4Desc\": \"Access all your content offline, anytime and anywhere you need it.\",\n \"screenshotsLabel\": \"Screenshots\",\n \"screenshotsTitle\": \"See It in Action\",\n \"reviewsLabel\": \"Reviews\",\n \"reviewsTitle\": \"What Users Say\",\n \"review1\": \"This app has completely changed how I manage my daily tasks. Clean interface and super intuitive!\",\n \"review2\": \"Love the offline mode! I can work anywhere without worrying about connectivity. 5 stars!\",\n \"review3\": \"Best app in its category. The team clearly cares about user experience and it shows.\",\n \"ctaTitle\": \"Download Now\",\n \"ctaDescription\": \"Join millions of users worldwide. Download now and start simplifying your life today!\"\n}"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "landing-page-app/lang/tr.json",
|
|
35
35
|
"type": "registry:lang",
|
|
36
36
|
"target": "$modules$/landing-page-app/lang/tr.json",
|
|
37
|
-
"content": "{\
|
|
37
|
+
"content": "{\n \"title\": \"Mobil Uygulama\",\n \"badge\": \"iOS ve Android'de Mevcut\",\n \"heroTitle\": \"Hayatınız, Tek Uygulamada Basitleştirildi\",\n \"heroDescription\": \"Günlük görevlerinizi basitleştiren ve verimliliğinizi artıran hepsi bir arada uygulama.\",\n \"downloadOn\": \"Şuradan indir:\",\n \"getItOn\": \"Şuradan alın:\",\n \"downloads\": \"İndirme\",\n \"inCategory\": \"Kategorisinde\",\n \"taskComplete\": \"Görev Tamamlandı!\",\n \"newMessage\": \"Yeni Mesaj\",\n \"featuresLabel\": \"Özellikler\",\n \"featuresTitle\": \"Neden Seveceksiniz\",\n \"feature1Title\": \"Işık Hızında\",\n \"feature1Desc\": \"Yıldırım hızında performans, uygulamanızı her zaman sorunsuz çalıştırır.\",\n \"feature2Title\": \"Akıllı Bildirimler\",\n \"feature2Desc\": \"Tercihlerinize göre özelleştirilmiş akıllı bildirimlerle bilgilenin.\",\n \"feature3Title\": \"Güvenli & Özel\",\n \"feature3Desc\": \"Verileriniz banka seviyesinde şifreleme ve gizlilik kontrolleriyle korunur.\",\n \"feature4Title\": \"Çevrimdışı Mod\",\n \"feature4Desc\": \"Tüm içeriğinize çevrimdışı, istediğiniz zaman ve yerde erişin.\",\n \"screenshotsLabel\": \"Ekran Görüntüleri\",\n \"screenshotsTitle\": \"Uygulamada Görün\",\n \"reviewsLabel\": \"Yorumlar\",\n \"reviewsTitle\": \"Kullanıcılar Ne Diyor\",\n \"review1\": \"Bu uygulama günlük görevlerimi yönetme şeklimi tamamen değiştirdi. Temiz arayüz ve süper sezgisel!\",\n \"review2\": \"Çevrimdışı modu çok seviyorum! Bağlantı endişesi olmadan her yerde çalışabiliyorum. 5 yıldız!\",\n \"review3\": \"Kategorisindeki en iyi uygulama. Ekibin kullanıcı deneyimini önemsediği belli oluyor.\",\n \"ctaTitle\": \"Şimdi İndirin\",\n \"ctaDescription\": \"iOS ve Android'de ücretsiz olarak mevcut. Yolculuğunuza bugün başlayın.\"\n}\n"
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
40
|
"exports": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "landing-page-saas/index.ts",
|
|
17
17
|
"type": "registry:index",
|
|
18
18
|
"target": "$modules$/landing-page-saas/index.ts",
|
|
19
|
-
"content": "export * from \"./landing-page-saas\";\
|
|
19
|
+
"content": "export * from \"./landing-page-saas\";\nexport { default } from \"./landing-page-saas\";\n"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "landing-page-saas/landing-page-saas.tsx",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"path": "landing-page-saas/lang/en.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/landing-page-saas/lang/en.json",
|
|
31
|
-
"content": "{\
|
|
31
|
+
"content": "{\n \"title\": \"SaaS Landing\",\n \"badge\": \"New Feature Available\",\n \"heroTitle\": \"Your Product Name Here\",\n \"heroDescription\": \"Streamline your workflow and boost team productivity with powerful automation tools.\",\n \"startFree\": \"Start Free Trial\",\n \"watchDemo\": \"Watch Demo\",\n \"noCreditCard\": \"No credit card required\",\n \"stat1Label\": \"Active Users\",\n \"stat2Label\": \"Uptime\",\n \"stat3Label\": \"Tasks Done\",\n \"stat4Label\": \"Rating\",\n \"featuresLabel\": \"Features\",\n \"featuresTitle\": \"Everything You Need\",\n \"featuresDescription\": \"Discover the tools and features that make your work easier and more productive.\",\n \"feature1Title\": \"Feature One\",\n \"feature1Desc\": \"Lightning-fast performance that saves you time and boosts efficiency.\",\n \"feature2Title\": \"Feature Two\",\n \"feature2Desc\": \"Bank-level encryption keeps your data secure and protected at all times.\",\n \"feature3Title\": \"Feature Three\",\n \"feature3Desc\": \"Deep insights and analytics help you make better data-driven decisions.\",\n \"feature4Title\": \"Feature Four\",\n \"feature4Desc\": \"Real-time collaboration tools keep your team connected and productive.\",\n \"feature5Title\": \"Feature Five\",\n \"feature5Desc\": \"99.9% uptime guarantee ensures your work is always accessible.\",\n \"feature6Title\": \"Feature Six\",\n \"feature6Desc\": \"Smart automation handles repetitive tasks so you can focus on what matters.\",\n \"testimonialsLabel\": \"Testimonials\",\n \"testimonialsTitle\": \"What Our Customers Say\",\n \"testimonial1\": \"This tool transformed how our team works. We've cut project delivery time by 40% and improved collaboration significantly.\",\n \"testimonial2\": \"The automation features alone save us 10+ hours per week. It's become essential to our workflow.\",\n \"testimonial3\": \"Incredibly intuitive and powerful. The customer support is outstanding, and the ROI has been remarkable.\",\n \"pricingLabel\": \"Pricing\",\n \"pricingTitle\": \"Simple, Transparent Pricing\",\n \"starterPlan\": \"Starter\",\n \"proPlan\": \"Pro\",\n \"enterprisePlan\": \"Enterprise\",\n \"custom\": \"Custom\",\n \"mostPopular\": \"Most Popular\",\n \"getStarted\": \"Get Started\",\n \"viewAllPlans\": \"View all pricing plans\",\n \"ctaTitle\": \"Ready to Get Started?\",\n \"ctaDescription\": \"Join thousands of teams already using our platform. Start your free 14-day trial today—no credit card required.\",\n \"ctaButton\": \"Get Started\"\n}\n"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "landing-page-saas/lang/tr.json",
|
|
35
35
|
"type": "registry:lang",
|
|
36
36
|
"target": "$modules$/landing-page-saas/lang/tr.json",
|
|
37
|
-
"content": "{\
|
|
37
|
+
"content": "{\n \"title\": \"SaaS Landing\",\n \"badge\": \"Artık AI destekli özelliklerle\",\n \"heroTitle\": \"Daha İyi Ürünler, Her Zamankinden Daha Hızlı Oluşturun\",\n \"heroDescription\": \"Güçlü otomasyon araçlarıyla iş akışınızı optimize edin ve ekip verimliliğini artırın.\",\n \"startFree\": \"Ücretsiz Deneyin\",\n \"watchDemo\": \"Demo İzle\",\n \"noCreditCard\": \"Kredi kartı gerekmez • 14 gün ücretsiz deneme\",\n \"stat1Label\": \"Aktif Kullanıcı\",\n \"stat2Label\": \"Çalışma Süresi\",\n \"stat3Label\": \"Tamamlanan Görev\",\n \"stat4Label\": \"Kullanıcı Puanı\",\n \"featuresLabel\": \"Özellikler\",\n \"featuresTitle\": \"Başarı İçin İhtiyacınız Olan Her Şey\",\n \"featuresDescription\": \"İşinizi daha kolay ve verimli hale getiren araçları ve özellikleri keşfedin.\",\n \"feature1Title\": \"Işık Hızında\",\n \"feature1Desc\": \"Yıldırım hızında performans, zamandan tasarruf sağlar ve verimliliği artırır.\",\n \"feature2Title\": \"Varsayılan Olarak Güvenli\",\n \"feature2Desc\": \"Banka seviyesinde şifreleme, verilerinizi her zaman güvende tutar.\",\n \"feature3Title\": \"Güçlü Analitik\",\n \"feature3Desc\": \"Derin görüşler ve analizler, daha iyi veri odaklı kararlar almanıza yardımcı olur.\",\n \"feature4Title\": \"Takım İşbirliği\",\n \"feature4Desc\": \"Gerçek zamanlı işbirliği araçları ekibinizi bağlı ve verimli tutar.\",\n \"feature5Title\": \"7/24 Kullanılabilirlik\",\n \"feature5Desc\": \"%99.9 çalışma süresi garantisi, işinizin her zaman erişilebilir olmasını sağlar.\",\n \"feature6Title\": \"AI Destekli\",\n \"feature6Desc\": \"Akıllı otomasyon tekrarlayan görevleri halleder, siz önemli işlere odaklanın.\",\n \"testimonialsLabel\": \"Referanslar\",\n \"testimonialsTitle\": \"Dünya Genelinde Ekipler Tarafından Seviliyor\",\n \"testimonial1\": \"Bu araç ekibimizin çalışma şeklini değiştirdi. Proje teslim süremizi %40 azalttık ve işbirliğimizi önemli ölçüde geliştirdik.\",\n \"testimonial2\": \"Sadece otomasyon özellikleri bile bize haftada 10+ saat kazandırıyor. İş akışımızın vazgeçilmez bir parçası oldu.\",\n \"testimonial3\": \"İnanılmaz sezgisel ve güçlü. Müşteri desteği olağanüstü ve yatırım getirisi dikkat çekici.\",\n \"pricingLabel\": \"Fiyatlandırma\",\n \"pricingTitle\": \"Basit, Şeffaf Fiyatlandırma\",\n \"starterPlan\": \"Başlangıç\",\n \"proPlan\": \"Pro\",\n \"enterprisePlan\": \"Kurumsal\",\n \"custom\": \"Özel\",\n \"mostPopular\": \"En Popüler\",\n \"getStarted\": \"Başlayın\",\n \"viewAllPlans\": \"Tüm planları görüntüle\",\n \"ctaTitle\": \"İş Akışınızı Dönüştürmeye Hazır mısınız?\",\n \"ctaDescription\": \"Platformumuzu kullanan binlerce ekibe katılın. 14 günlük ücretsiz denemenizi bugün başlatın—kredi kartı gerekmez.\",\n \"ctaButton\": \"Ücretsiz Denemenizi Başlatın\"\n}\n"
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
40
|
"exports": {
|
|
@@ -17,25 +17,25 @@
|
|
|
17
17
|
"path": "login-page-split/index.ts",
|
|
18
18
|
"type": "registry:index",
|
|
19
19
|
"target": "$modules$/login-page-split/index.ts",
|
|
20
|
-
"content": "export * from './login-page-split';\
|
|
20
|
+
"content": "export * from './login-page-split';\nexport { default } from './login-page-split';\n"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "login-page-split/login-page-split.tsx",
|
|
24
24
|
"type": "registry:page",
|
|
25
25
|
"target": "$modules$/login-page-split/login-page-split.tsx",
|
|
26
|
-
"content": "import { useState } from \"react\";\
|
|
26
|
+
"content": "import { useState } from \"react\";\nimport { Link, useNavigate, useLocation } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Logo } from \"@/components/Logo\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { useTranslation } from \"react-i18next\";\nimport { useAuth } from \"@/modules/auth-core\";\nimport { getErrorMessage } from \"@/modules/api\";\n\ninterface LoginPageSplitProps {\n image?: string;\n}\n\nexport function LoginPageSplit({\n image = \"/images/placeholder.png\",\n}: LoginPageSplitProps) {\n const { t } = useTranslation(\"login-page-split\");\n const navigate = useNavigate();\n const location = useLocation();\n const { login } = useAuth();\n\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Get redirect URL from location state or default to home\n const from = (location.state as { from?: string })?.from || \"/\";\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setIsLoading(true);\n\n try {\n await login(username, password);\n toast.success(t(\"loginSuccess\", \"Login successful!\"));\n navigate(from, { replace: true });\n } catch (err) {\n const errorMessage = getErrorMessage(\n err,\n t(\"loginError\", \"Login failed. Please check your credentials.\")\n );\n setError(errorMessage);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <section className=\"w-full md:grid md:min-h-screen md:grid-cols-2\">\n <div className=\"flex items-center justify-center px-4 py-12\">\n <div className=\"mx-auto grid w-full max-w-sm gap-6\">\n <Logo />\n <hr />\n <div>\n <h1 className=\"text-xl font-bold tracking-tight\">\n {t(\"title\", \"Login\")}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"subtitle\", \"Enter your details below to login\")}\n </p>\n </div>\n\n {error && (\n <div className=\"p-3 text-sm text-red-600 bg-red-50 dark:bg-red-950 dark:text-red-400 rounded-md\">\n {error}\n </div>\n )}\n\n <form onSubmit={handleSubmit} className=\"grid gap-4\">\n <div className=\"grid gap-2\">\n <Label htmlFor=\"username-split\">{t(\"username\", \"Username\")}</Label>\n <Input\n required\n id=\"username-split\"\n type=\"text\"\n autoComplete=\"username\"\n placeholder={t(\"usernamePlaceholder\", \"Enter your username\")}\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n disabled={isLoading}\n />\n </div>\n <div className=\"grid gap-2\">\n <Label htmlFor=\"password-split\">{t(\"password\", \"Password\")}</Label>\n <Input\n required\n id=\"password-split\"\n type=\"password\"\n placeholder=\"••••••••••\"\n autoComplete=\"current-password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n disabled={isLoading}\n />\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading ? (\n <>\n <div className=\"w-4 h-4 border-2 border-primary-foreground border-t-transparent rounded-full animate-spin mr-2\" />\n {t(\"loggingIn\", \"Logging in...\")}\n </>\n ) : (\n t(\"login\", \"Login\")\n )}\n </Button>\n </form>\n\n <div className=\"flex flex-col gap-4 text-sm\">\n <p>\n {t(\"noAccount\", \"Don't have an account?\")}{\" \"}\n <Link to=\"/register\" className=\"underline\">\n {t(\"signUp\", \"Sign up\")}\n </Link>\n </p>\n <Link to=\"/forgot-password\" className=\"underline\">\n {t(\"forgotPassword\", \"Forgot your password?\")}\n </Link>\n </div>\n <hr />\n <p className=\"text-sm text-muted-foreground\">\n © {new Date().getFullYear()} {t(\"copyright\", \"All rights reserved.\")}\n </p>\n </div>\n </div>\n <div className=\"hidden p-4 md:block\">\n <img\n loading=\"lazy\"\n decoding=\"async\"\n width=\"1920\"\n height=\"1080\"\n alt={t(\"imageAlt\", \"Login background\")}\n src={image}\n className=\"size-full rounded-lg border bg-muted object-cover object-center\"\n />\n </div>\n </section>\n );\n}\n\nexport default LoginPageSplit;\n"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "login-page-split/lang/en.json",
|
|
30
30
|
"type": "registry:lang",
|
|
31
31
|
"target": "$modules$/login-page-split/lang/en.json",
|
|
32
|
-
"content": "{\
|
|
32
|
+
"content": "{\n \"title\": \"Login\",\n \"subtitle\": \"Enter your details below to login\",\n \"username\": \"Username\",\n \"usernamePlaceholder\": \"Enter your username\",\n \"email\": \"Email\",\n \"emailPlaceholder\": \"email@example.com\",\n \"password\": \"Password\",\n \"login\": \"Login\",\n \"loggingIn\": \"Logging in...\",\n \"loginSuccess\": \"Login successful!\",\n \"loginError\": \"Login failed. Please check your credentials.\",\n \"loginGoogle\": \"Login with Google\",\n \"noAccount\": \"Don't have an account?\",\n \"signUp\": \"Sign up\",\n \"forgotPassword\": \"Forgot your password?\",\n \"copyright\": \"All rights reserved.\",\n \"imageAlt\": \"Login background\"\n}\n"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"path": "login-page-split/lang/tr.json",
|
|
36
36
|
"type": "registry:lang",
|
|
37
37
|
"target": "$modules$/login-page-split/lang/tr.json",
|
|
38
|
-
"content": "{\
|
|
38
|
+
"content": "{\n \"title\": \"Giriş Yap\",\n \"subtitle\": \"Giriş yapmak için bilgilerinizi girin\",\n \"username\": \"Kullanıcı Adı\",\n \"usernamePlaceholder\": \"Kullanıcı adınızı girin\",\n \"email\": \"E-posta\",\n \"emailPlaceholder\": \"eposta@ornek.com\",\n \"password\": \"Şifre\",\n \"login\": \"Giriş Yap\",\n \"loggingIn\": \"Giriş yapılıyor...\",\n \"loginSuccess\": \"Giriş başarılı!\",\n \"loginError\": \"Giriş başarısız. Lütfen bilgilerinizi kontrol edin.\",\n \"loginGoogle\": \"Google ile Giriş Yap\",\n \"noAccount\": \"Hesabınız yok mu?\",\n \"signUp\": \"Kayıt Ol\",\n \"forgotPassword\": \"Şifrenizi mi unuttunuz?\",\n \"copyright\": \"Tüm hakları saklıdır.\",\n \"imageAlt\": \"Giriş arka planı\"\n}\n"
|
|
39
39
|
}
|
|
40
40
|
],
|
|
41
41
|
"exports": {
|
|
@@ -17,25 +17,25 @@
|
|
|
17
17
|
"path": "login-page/index.ts",
|
|
18
18
|
"type": "registry:index",
|
|
19
19
|
"target": "$modules$/login-page/index.ts",
|
|
20
|
-
"content": "export * from './login-page';\
|
|
20
|
+
"content": "export * from './login-page';\nexport { default } from './login-page';\n"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "login-page/login-page.tsx",
|
|
24
24
|
"type": "registry:page",
|
|
25
25
|
"target": "$modules$/login-page/login-page.tsx",
|
|
26
|
-
"content": "import { useState } from \"react\";\
|
|
26
|
+
"content": "import { useState } from \"react\";\nimport { Link, useNavigate, useLocation } from \"react-router\";\nimport { useTranslation } from \"react-i18next\";\nimport { toast } from \"sonner\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { Logo } from \"@/components/Logo\";\nimport { cn } from \"@/lib/utils\";\nimport { useAuth } from \"@/modules/auth-core\";\nimport { getErrorMessage } from \"@/modules/api\";\n\ninterface LoginPageProps {\n className?: string;\n}\n\nexport function LoginPage({ className }: LoginPageProps) {\n const { t } = useTranslation(\"login-page\");\n usePageTitle({ title: t(\"title\", \"Sign In\") });\n const navigate = useNavigate();\n const location = useLocation();\n const { login } = useAuth();\n\n const [username, setUsername] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const from = (location.state as { from?: string })?.from || \"/\";\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError(null);\n setIsLoading(true);\n\n try {\n await login(username, password);\n toast.success(t(\"loginSuccess\", \"Login successful!\"));\n navigate(from, { replace: true });\n } catch (err) {\n const errorMessage = getErrorMessage(\n err,\n t(\"loginError\", \"Login failed. Please check your credentials.\")\n );\n setError(errorMessage);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <section\n className={cn(\"flex min-h-screen bg-muted/30 px-4 py-16 md:py-32\", className)}\n >\n <form\n onSubmit={handleSubmit}\n className=\"bg-muted m-auto h-fit w-full max-w-sm overflow-hidden rounded-xl border shadow-md\"\n >\n <div className=\"bg-card -m-px rounded-xl border p-8 pb-6\">\n <div className=\"text-center\">\n <Link to=\"/\" aria-label=\"go home\" className=\"mx-auto block w-fit\">\n <Logo size=\"sm\" />\n </Link>\n <h1 className=\"mb-1 mt-4 text-xl font-semibold\">\n {t(\"title\", \"Sign In\")}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"subtitle\", \"Welcome back! Sign in to continue\")}\n </p>\n </div>\n\n {error && (\n <div className=\"mt-4 p-3 text-sm text-red-600 bg-red-50 dark:bg-red-950 dark:text-red-400 rounded-md\">\n {error}\n </div>\n )}\n\n <div className=\"mt-6 space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"username\" className=\"block text-sm\">\n {t(\"username\", \"Username\")}\n </Label>\n <Input\n type=\"text\"\n required\n name=\"username\"\n id=\"username\"\n autoComplete=\"username\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder={t(\"usernamePlaceholder\", \"Enter your username\")}\n disabled={isLoading}\n />\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"password\" className=\"text-sm\">\n {t(\"password\", \"Password\")}\n </Label>\n <Button asChild variant=\"link\" size=\"sm\" className=\"h-auto p-0\">\n <Link to=\"/forgot-password\" className=\"text-xs\">\n {t(\"forgotPassword\", \"Forgot password?\")}\n </Link>\n </Button>\n </div>\n <Input\n type=\"password\"\n required\n name=\"password\"\n id=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"••••••••\"\n disabled={isLoading}\n />\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading ? (\n <>\n <div className=\"w-4 h-4 border-2 border-primary-foreground border-t-transparent rounded-full animate-spin mr-2\" />\n {t(\"signingIn\", \"Signing in...\")}\n </>\n ) : (\n t(\"signIn\", \"Sign In\")\n )}\n </Button>\n </div>\n </div>\n\n <div className=\"p-3\">\n <p className=\"text-center text-sm text-muted-foreground\">\n {t(\"noAccount\", \"Don't have an account?\")}\n <Button asChild variant=\"link\" className=\"px-2\">\n <Link to=\"/register\">{t(\"createAccount\", \"Create account\")}</Link>\n </Button>\n </p>\n </div>\n </form>\n </section>\n );\n}\n\nexport default LoginPage;\n"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "login-page/lang/en.json",
|
|
30
30
|
"type": "registry:lang",
|
|
31
31
|
"target": "$modules$/login-page/lang/en.json",
|
|
32
|
-
"content": "{\
|
|
32
|
+
"content": "{\n \"title\": \"Sign In\",\n \"subtitle\": \"Welcome back! Sign in to continue\",\n \"username\": \"Username\",\n \"usernamePlaceholder\": \"Enter your username\",\n \"email\": \"Email\",\n \"emailPlaceholder\": \"you@example.com\",\n \"password\": \"Password\",\n \"forgotPassword\": \"Forgot password?\",\n \"signIn\": \"Sign In\",\n \"signingIn\": \"Signing in...\",\n \"noAccount\": \"Don't have an account?\",\n \"createAccount\": \"Create account\",\n \"loginSuccess\": \"Login successful!\",\n \"loginError\": \"Login failed. Please check your credentials.\"\n}\n"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"path": "login-page/lang/tr.json",
|
|
36
36
|
"type": "registry:lang",
|
|
37
37
|
"target": "$modules$/login-page/lang/tr.json",
|
|
38
|
-
"content": "{\
|
|
38
|
+
"content": "{\n \"title\": \"Giriş Yap\",\n \"subtitle\": \"Tekrar hoş geldiniz! Devam etmek için giriş yapın\",\n \"username\": \"Kullanıcı Adı\",\n \"usernamePlaceholder\": \"Kullanıcı adınızı girin\",\n \"email\": \"E-posta\",\n \"emailPlaceholder\": \"ornek@email.com\",\n \"password\": \"Şifre\",\n \"forgotPassword\": \"Şifremi unuttum\",\n \"signIn\": \"Giriş Yap\",\n \"signingIn\": \"Giriş yapılıyor...\",\n \"noAccount\": \"Hesabınız yok mu?\",\n \"createAccount\": \"Hesap oluştur\",\n \"loginSuccess\": \"Giriş başarılı!\",\n \"loginError\": \"Giriş başarısız. Lütfen bilgilerinizi kontrol edin.\"\n}\n"
|
|
39
39
|
}
|
|
40
40
|
],
|
|
41
41
|
"exports": {
|
|
@@ -11,25 +11,25 @@
|
|
|
11
11
|
"path": "logo-cloud/logo-cloud.tsx",
|
|
12
12
|
"type": "registry:component",
|
|
13
13
|
"target": "$modules$/logo-cloud/logo-cloud.tsx",
|
|
14
|
-
"content": "\"use client\";\
|
|
14
|
+
"content": "\"use client\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"@/lib/utils\";\n\ninterface Logo {\n name: string;\n image: string;\n url?: string;\n}\n\ninterface LogoCloudProps {\n logos?: Logo[];\n title?: string;\n grayscale?: boolean;\n animate?: boolean;\n speed?: \"slow\" | \"normal\" | \"fast\";\n pauseOnHover?: boolean;\n className?: string;\n}\n\nconst defaultLogos: Logo[] = [\n { name: \"Company 1\", image: \"/images/placeholder.png\" },\n { name: \"Company 2\", image: \"/images/placeholder.png\" },\n { name: \"Company 3\", image: \"/images/placeholder.png\" },\n { name: \"Company 4\", image: \"/images/placeholder.png\" },\n { name: \"Company 5\", image: \"/images/placeholder.png\" },\n { name: \"Company 6\", image: \"/images/placeholder.png\" },\n];\n\nconst speedDuration = {\n slow: \"40s\",\n normal: \"25s\",\n fast: \"15s\",\n};\n\nexport function LogoCloud({\n logos = defaultLogos,\n title,\n grayscale = true,\n animate = true,\n speed = \"slow\",\n pauseOnHover = true,\n className,\n}: LogoCloudProps) {\n const { t } = useTranslation(\"logo-cloud\");\n\n const displayTitle = title ?? t(\"title\");\n\n const renderLogo = (logo: Logo, index: number) => {\n const imageElement = (\n <img\n src={logo.image}\n alt={logo.name}\n className={cn(\n \"h-10 md:h-12 w-auto object-contain transition-all duration-300 rounded-[var(--radius)]\",\n grayscale && \"grayscale opacity-60 hover:grayscale-0 hover:opacity-100\"\n )}\n draggable={false}\n />\n );\n\n if (logo.url) {\n return (\n <a\n key={index}\n href={logo.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-center px-8 md:px-12 shrink-0\"\n >\n {imageElement}\n </a>\n );\n }\n\n return (\n <div key={index} className=\"flex items-center justify-center px-8 md:px-12 shrink-0\">\n {imageElement}\n </div>\n );\n };\n\n return (\n <section className={cn(\"py-12 md:py-16 overflow-hidden\", className)}>\n <div className=\"container max-w-[var(--container-max-width)] mx-auto px-4\">\n {displayTitle && (\n <p className=\"text-center text-sm font-medium text-muted-foreground uppercase tracking-wider mb-8\">\n {displayTitle}\n </p>\n )}\n </div>\n\n {/* Marquee Container */}\n <div\n className={cn(\n \"relative w-full\",\n pauseOnHover && \"[&:hover_.marquee-content]:pause\"\n )}\n >\n {/* Gradient Masks */}\n <div className=\"absolute left-0 top-0 bottom-0 w-20 md:w-32 bg-gradient-to-r from-background to-transparent z-10 pointer-events-none\" />\n <div className=\"absolute right-0 top-0 bottom-0 w-20 md:w-32 bg-gradient-to-l from-background to-transparent z-10 pointer-events-none\" />\n\n {/* Scrolling Content */}\n <div className=\"flex overflow-hidden\">\n <div\n className={cn(\n \"marquee-content flex items-center\",\n animate && \"animate-marquee\"\n )}\n style={{\n [\"--marquee-duration\" as string]: speedDuration[speed],\n }}\n >\n {/* First set of logos */}\n {logos.map((logo, index) => renderLogo(logo, index))}\n {/* Duplicate for seamless loop */}\n {logos.map((logo, index) => renderLogo(logo, index + logos.length))}\n </div>\n </div>\n </div>\n\n <style>{`\n @keyframes marquee {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-50%);\n }\n }\n .animate-marquee {\n animation: marquee var(--marquee-duration, 25s) linear infinite;\n }\n .pause {\n animation-play-state: paused !important;\n }\n `}</style>\n </section>\n );\n}\n"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"path": "logo-cloud/index.ts",
|
|
18
18
|
"type": "registry:index",
|
|
19
19
|
"target": "$modules$/logo-cloud/index.ts",
|
|
20
|
-
"content": "export * from \"./logo-cloud\";\
|
|
20
|
+
"content": "export * from \"./logo-cloud\";\n"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"path": "logo-cloud/lang/en.json",
|
|
24
24
|
"type": "registry:lang",
|
|
25
25
|
"target": "$modules$/logo-cloud/lang/en.json",
|
|
26
|
-
"content": "{\
|
|
26
|
+
"content": "{\n \"title\": \"Trusted by leading companies\"\n}\n"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "logo-cloud/lang/tr.json",
|
|
30
30
|
"type": "registry:lang",
|
|
31
31
|
"target": "$modules$/logo-cloud/lang/tr.json",
|
|
32
|
-
"content": "{\
|
|
32
|
+
"content": "{\n \"title\": \"Önde gelen şirketler tarafından tercih ediliyor\"\n}\n"
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
35
|
"exports": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"path": "masonry-grid/index.ts",
|
|
14
14
|
"type": "registry:index",
|
|
15
15
|
"target": "$modules$/masonry-grid/index.ts",
|
|
16
|
-
"content": "export { MasonryGrid } from \"./masonry-grid\";\
|
|
16
|
+
"content": "export { MasonryGrid } from \"./masonry-grid\";\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "masonry-grid/masonry-grid.tsx",
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
"path": "masonry-grid/lang/en.json",
|
|
26
26
|
"type": "registry:lang",
|
|
27
27
|
"target": "$modules$/masonry-grid/lang/en.json",
|
|
28
|
-
"content": "{\
|
|
28
|
+
"content": "{\n \"close\": \"Close\"\n}\n"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "masonry-grid/lang/tr.json",
|
|
32
32
|
"type": "registry:lang",
|
|
33
33
|
"target": "$modules$/masonry-grid/lang/tr.json",
|
|
34
|
-
"content": "{\
|
|
34
|
+
"content": "{\n \"close\": \"Kapat\"\n}\n"
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"exports": {
|