@promakeai/cli 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +415 -209
- 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/auth.json +70 -0
- 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/docs/reset-password-page.md +36 -0
- 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/reset-password-page.json +39 -0
- 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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "reset-password-page",
|
|
3
|
+
"type": "registry:page",
|
|
4
|
+
"title": "Reset Password Page",
|
|
5
|
+
"description": "Split-screen password reset page with form on the left and full-height image on the right. Features new password input with confirmation, validates reset code from URL. Clean minimal design with API integration and responsive layout.",
|
|
6
|
+
"registryDependencies": [
|
|
7
|
+
"button",
|
|
8
|
+
"input",
|
|
9
|
+
"auth",
|
|
10
|
+
"api"
|
|
11
|
+
],
|
|
12
|
+
"usage": "import ResetPasswordPage from '@/modules/reset-password-page';\n\n<ResetPasswordPage\n image=\"/images/reset-bg.jpg\"\n/>\n\n• Installed at: src/modules/reset-password-page/\n• Customize text: src/modules/reset-password-page/lang/*.json\n• Uses customerClient.auth.resetPassword() for API\n• Expects ?code= URL parameter from email link\n• Add to your router as a page component",
|
|
13
|
+
"route": {
|
|
14
|
+
"path": "/reset-password",
|
|
15
|
+
"componentName": "ResetPasswordPage"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
{
|
|
19
|
+
"path": "reset-password-page/index.ts",
|
|
20
|
+
"type": "registry:index",
|
|
21
|
+
"target": "$modules$/reset-password-page/index.ts"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"path": "reset-password-page/reset-password-page.tsx",
|
|
25
|
+
"type": "registry:page",
|
|
26
|
+
"target": "$modules$/reset-password-page/reset-password-page.tsx"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"path": "reset-password-page/lang/en.json",
|
|
30
|
+
"type": "registry:lang",
|
|
31
|
+
"target": "$modules$/reset-password-page/lang/en.json"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"path": "reset-password-page/lang/tr.json",
|
|
35
|
+
"type": "registry:lang",
|
|
36
|
+
"target": "$modules$/reset-password-page/lang/tr.json"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"path": "service-card/index.ts",
|
|
11
11
|
"type": "registry:index",
|
|
12
12
|
"target": "$modules$/service-card/index.ts",
|
|
13
|
-
"content": "export * from './service-card';\n"
|
|
13
|
+
"content": "export * from './service-card';\r\n"
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"path": "service-card/service-card.tsx",
|
|
@@ -16,25 +16,25 @@
|
|
|
16
16
|
"path": "share-buttons/share-buttons.tsx",
|
|
17
17
|
"type": "registry:component",
|
|
18
18
|
"target": "$modules$/share-buttons/share-buttons.tsx",
|
|
19
|
-
"content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { toast } from \"sonner\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ntype Platform = \"twitter\" | \"facebook\" | \"linkedin\" | \"whatsapp\" | \"email\" | \"copy\";\n\ninterface ShareButtonsProps {\n url?: string;\n title?: string;\n platforms?: Platform[];\n layout?: \"horizontal\" | \"vertical\";\n size?: \"sm\" | \"md\" | \"lg\";\n showLabels?: boolean;\n className?: string;\n}\n\nconst platformConfig: Record<Platform, { icon: React.FC<{ className?: string }>; color: string }> = {\n twitter: {\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n ),\n color: \"hover:bg-black hover:text-white\",\n },\n facebook: {\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\n </svg>\n ),\n color: \"hover:bg-[#1877F2] hover:text-white\",\n },\n linkedin: {\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\n </svg>\n ),\n color: \"hover:bg-[#0A66C2] hover:text-white\",\n },\n whatsapp: {\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\n </svg>\n ),\n color: \"hover:bg-[#25D366] hover:text-white\",\n },\n email: {\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n ),\n color: \"hover:bg-gray-600 hover:text-white\",\n },\n copy: {\n icon: ({ className }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n ),\n color: \"hover:bg-gray-600 hover:text-white\",\n },\n};\n\nconst sizeClasses = {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n};\n\nconst iconSizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n};\n\nexport function ShareButtons({\n url,\n title,\n platforms = [\"twitter\", \"facebook\", \"linkedin\", \"whatsapp\", \"copy\"],\n layout = \"horizontal\",\n size = \"md\",\n showLabels = false,\n className,\n}: ShareButtonsProps) {\n const { t } = useTranslation(\"share-buttons\");\n const [copied, setCopied] = useState(false);\n\n const shareUrl = url || (typeof window !== \"undefined\" ? window.location.href : \"\");\n const shareTitle = title || (typeof document !== \"undefined\" ? document.title : \"\");\n\n const getShareUrl = (platform: Platform): string => {\n const encodedUrl = encodeURIComponent(shareUrl);\n const encodedTitle = encodeURIComponent(shareTitle);\n\n switch (platform) {\n case \"twitter\":\n return `https://twitter.com/intent/tweet?url=${encodedUrl}&text=${encodedTitle}`;\n case \"facebook\":\n return `https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`;\n case \"linkedin\":\n return `https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`;\n case \"whatsapp\":\n return `https://wa.me/?text=${encodedTitle}%20${encodedUrl}`;\n case \"email\":\n return `mailto:?subject=${encodedTitle}&body=${encodedUrl}`;\n default:\n return \"\";\n }\n };\n\n const handleShare = async (platform: Platform) => {\n if (platform === \"copy\") {\n try {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n toast.success(t(\"copied\"));\n setTimeout(() => setCopied(false), 2000);\n } catch {\n toast.error(t(\"copyFailed\"));\n }\n return;\n }\n\n const shareUrlForPlatform = getShareUrl(platform);\n if (shareUrlForPlatform) {\n window.open(shareUrlForPlatform, \"_blank\", \"noopener,noreferrer,width=600,height=400\");\n }\n };\n\n return (\n <TooltipProvider>\n <div\n className={cn(\n \"flex gap-2\",\n layout === \"vertical\" ? \"flex-col\" : \"flex-row flex-wrap\",\n className\n )}\n >\n {platforms.map((platform) => {\n const config = platformConfig[platform];\n const Icon = config.icon;\n const label = t(`platforms.${platform}`);\n\n return (\n <Tooltip key={platform}>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className={cn(\n sizeClasses[size],\n \"transition-colors duration-200\",\n config.color,\n platform === \"copy\" && copied && \"bg-green-500 text-white hover:bg-green-500\"\n )}\n onClick={() => handleShare(platform)}\n aria-label={label}\n >\n <Icon className={iconSizeClasses[size]} />\n {showLabels && (\n <span className=\"ml-2 text-sm\">{label}</span>\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{label}</p>\n </TooltipContent>\n </Tooltip>\n );\n })}\n </div>\n </TooltipProvider>\n );\n}\n"
|
|
19
|
+
"content": "\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { toast } from \"sonner\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport {\r\n Tooltip,\r\n TooltipContent,\r\n TooltipProvider,\r\n TooltipTrigger,\r\n} from \"@/components/ui/tooltip\";\r\n\r\ntype Platform = \"twitter\" | \"facebook\" | \"linkedin\" | \"whatsapp\" | \"email\" | \"copy\";\r\n\r\ninterface ShareButtonsProps {\r\n url?: string;\r\n title?: string;\r\n platforms?: Platform[];\r\n layout?: \"horizontal\" | \"vertical\";\r\n size?: \"sm\" | \"md\" | \"lg\";\r\n showLabels?: boolean;\r\n className?: string;\r\n}\r\n\r\nconst platformConfig: Record<Platform, { icon: React.FC<{ className?: string }>; color: string }> = {\r\n twitter: {\r\n icon: ({ className }) => (\r\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\r\n </svg>\r\n ),\r\n color: \"hover:bg-black hover:text-white\",\r\n },\r\n facebook: {\r\n icon: ({ className }) => (\r\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\" />\r\n </svg>\r\n ),\r\n color: \"hover:bg-[#1877F2] hover:text-white\",\r\n },\r\n linkedin: {\r\n icon: ({ className }) => (\r\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\" />\r\n </svg>\r\n ),\r\n color: \"hover:bg-[#0A66C2] hover:text-white\",\r\n },\r\n whatsapp: {\r\n icon: ({ className }) => (\r\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\" />\r\n </svg>\r\n ),\r\n color: \"hover:bg-[#25D366] hover:text-white\",\r\n },\r\n email: {\r\n icon: ({ className }) => (\r\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\r\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\r\n </svg>\r\n ),\r\n color: \"hover:bg-gray-600 hover:text-white\",\r\n },\r\n copy: {\r\n icon: ({ className }) => (\r\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\r\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\r\n </svg>\r\n ),\r\n color: \"hover:bg-gray-600 hover:text-white\",\r\n },\r\n};\r\n\r\nconst sizeClasses = {\r\n sm: \"h-8 w-8\",\r\n md: \"h-10 w-10\",\r\n lg: \"h-12 w-12\",\r\n};\r\n\r\nconst iconSizeClasses = {\r\n sm: \"h-4 w-4\",\r\n md: \"h-5 w-5\",\r\n lg: \"h-6 w-6\",\r\n};\r\n\r\nexport function ShareButtons({\r\n url,\r\n title,\r\n platforms = [\"twitter\", \"facebook\", \"linkedin\", \"whatsapp\", \"copy\"],\r\n layout = \"horizontal\",\r\n size = \"md\",\r\n showLabels = false,\r\n className,\r\n}: ShareButtonsProps) {\r\n const { t } = useTranslation(\"share-buttons\");\r\n const [copied, setCopied] = useState(false);\r\n\r\n const shareUrl = url || (typeof window !== \"undefined\" ? window.location.href : \"\");\r\n const shareTitle = title || (typeof document !== \"undefined\" ? document.title : \"\");\r\n\r\n const getShareUrl = (platform: Platform): string => {\r\n const encodedUrl = encodeURIComponent(shareUrl);\r\n const encodedTitle = encodeURIComponent(shareTitle);\r\n\r\n switch (platform) {\r\n case \"twitter\":\r\n return `https://twitter.com/intent/tweet?url=${encodedUrl}&text=${encodedTitle}`;\r\n case \"facebook\":\r\n return `https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`;\r\n case \"linkedin\":\r\n return `https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`;\r\n case \"whatsapp\":\r\n return `https://wa.me/?text=${encodedTitle}%20${encodedUrl}`;\r\n case \"email\":\r\n return `mailto:?subject=${encodedTitle}&body=${encodedUrl}`;\r\n default:\r\n return \"\";\r\n }\r\n };\r\n\r\n const handleShare = async (platform: Platform) => {\r\n if (platform === \"copy\") {\r\n try {\r\n await navigator.clipboard.writeText(shareUrl);\r\n setCopied(true);\r\n toast.success(t(\"copied\"));\r\n setTimeout(() => setCopied(false), 2000);\r\n } catch {\r\n toast.error(t(\"copyFailed\"));\r\n }\r\n return;\r\n }\r\n\r\n const shareUrlForPlatform = getShareUrl(platform);\r\n if (shareUrlForPlatform) {\r\n window.open(shareUrlForPlatform, \"_blank\", \"noopener,noreferrer,width=600,height=400\");\r\n }\r\n };\r\n\r\n return (\r\n <TooltipProvider>\r\n <div\r\n className={cn(\r\n \"flex gap-2\",\r\n layout === \"vertical\" ? \"flex-col\" : \"flex-row flex-wrap\",\r\n className\r\n )}\r\n >\r\n {platforms.map((platform) => {\r\n const config = platformConfig[platform];\r\n const Icon = config.icon;\r\n const label = t(`platforms.${platform}`);\r\n\r\n return (\r\n <Tooltip key={platform}>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n className={cn(\r\n sizeClasses[size],\r\n \"transition-colors duration-200\",\r\n config.color,\r\n platform === \"copy\" && copied && \"bg-green-500 text-white hover:bg-green-500\"\r\n )}\r\n onClick={() => handleShare(platform)}\r\n aria-label={label}\r\n >\r\n <Icon className={iconSizeClasses[size]} />\r\n {showLabels && (\r\n <span className=\"ml-2 text-sm\">{label}</span>\r\n )}\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent>\r\n <p>{label}</p>\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n })}\r\n </div>\r\n </TooltipProvider>\r\n );\r\n}\r\n"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "share-buttons/index.ts",
|
|
23
23
|
"type": "registry:index",
|
|
24
24
|
"target": "$modules$/share-buttons/index.ts",
|
|
25
|
-
"content": "export * from \"./share-buttons\";\n"
|
|
25
|
+
"content": "export * from \"./share-buttons\";\r\n"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"path": "share-buttons/lang/en.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/share-buttons/lang/en.json",
|
|
31
|
-
"content": "{\n \"copied\": \"Link copied to clipboard!\",\n \"copyFailed\": \"Failed to copy link\",\n \"platforms\": {\n \"twitter\": \"Share on X\",\n \"facebook\": \"Share on Facebook\",\n \"linkedin\": \"Share on LinkedIn\",\n \"whatsapp\": \"Share on WhatsApp\",\n \"email\": \"Share via Email\",\n \"copy\": \"Copy link\"\n }\n}\n"
|
|
31
|
+
"content": "{\r\n \"copied\": \"Link copied to clipboard!\",\r\n \"copyFailed\": \"Failed to copy link\",\r\n \"platforms\": {\r\n \"twitter\": \"Share on X\",\r\n \"facebook\": \"Share on Facebook\",\r\n \"linkedin\": \"Share on LinkedIn\",\r\n \"whatsapp\": \"Share on WhatsApp\",\r\n \"email\": \"Share via Email\",\r\n \"copy\": \"Copy link\"\r\n }\r\n}\r\n"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "share-buttons/lang/tr.json",
|
|
35
35
|
"type": "registry:lang",
|
|
36
36
|
"target": "$modules$/share-buttons/lang/tr.json",
|
|
37
|
-
"content": "{\n \"copied\": \"Link panoya kopyalandı!\",\n \"copyFailed\": \"Link kopyalanamadı\",\n \"platforms\": {\n \"twitter\": \"X'te Paylaş\",\n \"facebook\": \"Facebook'ta Paylaş\",\n \"linkedin\": \"LinkedIn'de Paylaş\",\n \"whatsapp\": \"WhatsApp'ta Paylaş\",\n \"email\": \"E-posta ile Paylaş\",\n \"copy\": \"Linki Kopyala\"\n }\n}\n"
|
|
37
|
+
"content": "{\r\n \"copied\": \"Link panoya kopyalandı!\",\r\n \"copyFailed\": \"Link kopyalanamadı\",\r\n \"platforms\": {\r\n \"twitter\": \"X'te Paylaş\",\r\n \"facebook\": \"Facebook'ta Paylaş\",\r\n \"linkedin\": \"LinkedIn'de Paylaş\",\r\n \"whatsapp\": \"WhatsApp'ta Paylaş\",\r\n \"email\": \"E-posta ile Paylaş\",\r\n \"copy\": \"Linki Kopyala\"\r\n }\r\n}\r\n"
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
40
|
"exports": {
|
|
@@ -16,25 +16,25 @@
|
|
|
16
16
|
"path": "team-page/index.ts",
|
|
17
17
|
"type": "registry:index",
|
|
18
18
|
"target": "$modules$/team-page/index.ts",
|
|
19
|
-
"content": "export * from \"./team-page\";\nexport { default } from \"./team-page\";\n"
|
|
19
|
+
"content": "export * from \"./team-page\";\r\nexport { default } from \"./team-page\";\r\n"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "team-page/team-page.tsx",
|
|
23
23
|
"type": "registry:page",
|
|
24
24
|
"target": "$modules$/team-page/team-page.tsx",
|
|
25
|
-
"content": "import { useTranslation } from \"react-i18next\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { Layout } from \"@/components/Layout\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Twitter, Linkedin, Github, Mail } from \"lucide-react\";\nimport { FadeIn, StaggerContainer, StaggerItem } from \"@/modules/animations\";\nimport { cn } from \"@/lib/utils\";\n\ninterface TeamMember {\n id: string;\n name: string;\n role: string;\n bio: string;\n image: string;\n social?: {\n twitter?: string;\n linkedin?: string;\n github?: string;\n email?: string;\n };\n}\n\ninterface TeamPageProps {\n className?: string;\n}\n\nexport function TeamPage({ className }: TeamPageProps) {\n const { t } = useTranslation(\"team-page\");\n usePageTitle({ title: t(\"title\") });\n\n const teamMembers: TeamMember[] = [\n {\n id: \"1\",\n name: t(\"member1Name\"),\n role: t(\"member1Role\"),\n bio: t(\"member1Bio\"),\n image: \"/images/placeholder.png\",\n social: { twitter: \"#\", linkedin: \"#\", email: \"sarah@example.com\" },\n },\n {\n id: \"2\",\n name: t(\"member2Name\"),\n role: t(\"member2Role\"),\n bio: t(\"member2Bio\"),\n image: \"/images/placeholder.png\",\n social: { github: \"#\", linkedin: \"#\", email: \"michael@example.com\" },\n },\n {\n id: \"3\",\n name: t(\"member3Name\"),\n role: t(\"member3Role\"),\n bio: t(\"member3Bio\"),\n image: \"/images/placeholder.png\",\n social: { twitter: \"#\", linkedin: \"#\" },\n },\n {\n id: \"4\",\n name: t(\"member4Name\"),\n role: t(\"member4Role\"),\n bio: t(\"member4Bio\"),\n image: \"/images/placeholder.png\",\n social: { github: \"#\", twitter: \"#\" },\n },\n {\n id: \"5\",\n name: t(\"member5Name\"),\n role: t(\"member5Role\"),\n bio: t(\"member5Bio\"),\n image: \"/images/placeholder.png\",\n social: { linkedin: \"#\", email: \"lisa@example.com\" },\n },\n {\n id: \"6\",\n name: t(\"member6Name\"),\n role: t(\"member6Role\"),\n bio: t(\"member6Bio\"),\n image: \"/images/placeholder.png\",\n social: { twitter: \"#\", linkedin: \"#\" },\n },\n ];\n\n const socialIcons = {\n twitter: Twitter,\n linkedin: Linkedin,\n github: Github,\n email: Mail,\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-16\">\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\">\n {t(\"description\")}\n </p>\n </FadeIn>\n\n {/* Team Grid */}\n <StaggerContainer className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {teamMembers.map((member) => (\n <StaggerItem key={member.id}>\n <div className=\"group bg-card border border-border rounded-xl overflow-hidden h-full hover:shadow-xl transition-shadow duration-300\">\n {/* Image */}\n <div className=\"aspect-[4/3] overflow-hidden bg-muted\">\n <img\n src={member.image}\n alt={member.name}\n className=\"w-full h-full object-cover object-top group-hover:scale-105 transition-transform duration-500\"\n onError={(e) => {\n e.currentTarget.src = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='300' viewBox='0 0 400 300'%3E%3Crect fill='%23f3f4f6' width='400' height='300'/%3E%3Ccircle cx='200' cy='120' r='50' fill='%23d1d5db'/%3E%3Cellipse cx='200' cy='260' rx='80' ry='60' fill='%23d1d5db'/%3E%3C/svg%3E\";\n }}\n />\n </div>\n\n <div className=\"p-5\">\n <h3 className=\"text-xl font-semibold text-foreground mb-1\">\n {member.name}\n </h3>\n <p className=\"text-primary font-medium text-sm mb-3\">\n {member.role}\n </p>\n <p className=\"text-muted-foreground text-sm mb-4\">\n {member.bio}\n </p>\n\n {/* Social Links */}\n {member.social && (\n <div className=\"flex gap-2\">\n {Object.entries(member.social).map(([platform, url]) => {\n const Icon = socialIcons[platform as keyof typeof socialIcons];\n if (!Icon || !url) return null;\n return (\n <a\n key={platform}\n href={platform === \"email\" ? `mailto:${url}` : url}\n className=\"w-8 h-8 rounded-full bg-muted hover:bg-primary/10 flex items-center justify-center transition-colors\"\n aria-label={platform}\n >\n <Icon className=\"h-4 w-4 text-muted-foreground hover:text-primary transition-colors\" />\n </a>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </StaggerItem>\n ))}\n </StaggerContainer>\n\n {/* CTA Section */}\n <FadeIn delay={0.3} className=\"text-center mt-16\">\n <Card className=\"bg-primary/5 border-primary/20\">\n <CardContent className=\"p-8 md:p-12\">\n <h2 className=\"text-2xl md:text-3xl font-bold text-foreground mb-4\">\n {t(\"ctaTitle\")}\n </h2>\n <p className=\"text-muted-foreground mb-6 max-w-xl mx-auto\">\n {t(\"ctaDescription\")}\n </p>\n <a\n href=\"/careers\"\n className=\"inline-flex items-center justify-center px-6 py-3 bg-primary text-primary-foreground font-medium rounded-lg hover:bg-primary/90 transition-colors\"\n >\n {t(\"ctaButton\")}\n </a>\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n </div>\n </Layout>\n );\n}\n\nexport default TeamPage;\n"
|
|
25
|
+
"content": "import { useTranslation } from \"react-i18next\";\r\nimport { usePageTitle } from \"@/hooks/use-page-title\";\r\nimport { Layout } from \"@/components/Layout\";\r\nimport { Card, CardContent } from \"@/components/ui/card\";\r\nimport { Twitter, Linkedin, Github, Mail } from \"lucide-react\";\r\nimport { FadeIn, StaggerContainer, StaggerItem } from \"@/modules/animations\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\ninterface TeamMember {\r\n id: string;\r\n name: string;\r\n role: string;\r\n bio: string;\r\n image: string;\r\n social?: {\r\n twitter?: string;\r\n linkedin?: string;\r\n github?: string;\r\n email?: string;\r\n };\r\n}\r\n\r\ninterface TeamPageProps {\r\n className?: string;\r\n}\r\n\r\nexport function TeamPage({ className }: TeamPageProps) {\r\n const { t } = useTranslation(\"team-page\");\r\n usePageTitle({ title: t(\"title\") });\r\n\r\n const teamMembers: TeamMember[] = [\r\n {\r\n id: \"1\",\r\n name: t(\"member1Name\"),\r\n role: t(\"member1Role\"),\r\n bio: t(\"member1Bio\"),\r\n image: \"/images/placeholder.png\",\r\n social: { twitter: \"#\", linkedin: \"#\", email: \"sarah@example.com\" },\r\n },\r\n {\r\n id: \"2\",\r\n name: t(\"member2Name\"),\r\n role: t(\"member2Role\"),\r\n bio: t(\"member2Bio\"),\r\n image: \"/images/placeholder.png\",\r\n social: { github: \"#\", linkedin: \"#\", email: \"michael@example.com\" },\r\n },\r\n {\r\n id: \"3\",\r\n name: t(\"member3Name\"),\r\n role: t(\"member3Role\"),\r\n bio: t(\"member3Bio\"),\r\n image: \"/images/placeholder.png\",\r\n social: { twitter: \"#\", linkedin: \"#\" },\r\n },\r\n {\r\n id: \"4\",\r\n name: t(\"member4Name\"),\r\n role: t(\"member4Role\"),\r\n bio: t(\"member4Bio\"),\r\n image: \"/images/placeholder.png\",\r\n social: { github: \"#\", twitter: \"#\" },\r\n },\r\n {\r\n id: \"5\",\r\n name: t(\"member5Name\"),\r\n role: t(\"member5Role\"),\r\n bio: t(\"member5Bio\"),\r\n image: \"/images/placeholder.png\",\r\n social: { linkedin: \"#\", email: \"lisa@example.com\" },\r\n },\r\n {\r\n id: \"6\",\r\n name: t(\"member6Name\"),\r\n role: t(\"member6Role\"),\r\n bio: t(\"member6Bio\"),\r\n image: \"/images/placeholder.png\",\r\n social: { twitter: \"#\", linkedin: \"#\" },\r\n },\r\n ];\r\n\r\n const socialIcons = {\r\n twitter: Twitter,\r\n linkedin: Linkedin,\r\n github: Github,\r\n email: Mail,\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-16\">\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\">\r\n {t(\"description\")}\r\n </p>\r\n </FadeIn>\r\n\r\n {/* Team Grid */}\r\n <StaggerContainer className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\r\n {teamMembers.map((member) => (\r\n <StaggerItem key={member.id}>\r\n <div className=\"group bg-card border border-border rounded-xl overflow-hidden h-full hover:shadow-xl transition-shadow duration-300\">\r\n {/* Image */}\r\n <div className=\"aspect-[4/3] overflow-hidden bg-muted\">\r\n <img\r\n src={member.image}\r\n alt={member.name}\r\n className=\"w-full h-full object-cover object-top group-hover:scale-105 transition-transform duration-500\"\r\n onError={(e) => {\r\n e.currentTarget.src = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='300' viewBox='0 0 400 300'%3E%3Crect fill='%23f3f4f6' width='400' height='300'/%3E%3Ccircle cx='200' cy='120' r='50' fill='%23d1d5db'/%3E%3Cellipse cx='200' cy='260' rx='80' ry='60' fill='%23d1d5db'/%3E%3C/svg%3E\";\r\n }}\r\n />\r\n </div>\r\n\r\n <div className=\"p-5\">\r\n <h3 className=\"text-xl font-semibold text-foreground mb-1\">\r\n {member.name}\r\n </h3>\r\n <p className=\"text-primary font-medium text-sm mb-3\">\r\n {member.role}\r\n </p>\r\n <p className=\"text-muted-foreground text-sm mb-4\">\r\n {member.bio}\r\n </p>\r\n\r\n {/* Social Links */}\r\n {member.social && (\r\n <div className=\"flex gap-2\">\r\n {Object.entries(member.social).map(([platform, url]) => {\r\n const Icon = socialIcons[platform as keyof typeof socialIcons];\r\n if (!Icon || !url) return null;\r\n return (\r\n <a\r\n key={platform}\r\n href={platform === \"email\" ? `mailto:${url}` : url}\r\n className=\"w-8 h-8 rounded-full bg-muted hover:bg-primary/10 flex items-center justify-center transition-colors\"\r\n aria-label={platform}\r\n >\r\n <Icon className=\"h-4 w-4 text-muted-foreground hover:text-primary transition-colors\" />\r\n </a>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </StaggerItem>\r\n ))}\r\n </StaggerContainer>\r\n\r\n {/* CTA Section */}\r\n <FadeIn delay={0.3} className=\"text-center mt-16\">\r\n <Card className=\"bg-primary/5 border-primary/20\">\r\n <CardContent className=\"p-8 md:p-12\">\r\n <h2 className=\"text-2xl md:text-3xl font-bold text-foreground mb-4\">\r\n {t(\"ctaTitle\")}\r\n </h2>\r\n <p className=\"text-muted-foreground mb-6 max-w-xl mx-auto\">\r\n {t(\"ctaDescription\")}\r\n </p>\r\n <a\r\n href=\"/careers\"\r\n className=\"inline-flex items-center justify-center px-6 py-3 bg-primary text-primary-foreground font-medium rounded-lg hover:bg-primary/90 transition-colors\"\r\n >\r\n {t(\"ctaButton\")}\r\n </a>\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 TeamPage;\r\n"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"path": "team-page/lang/en.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/team-page/lang/en.json",
|
|
31
|
-
"content": "{\n \"title\": \"Our Team\",\n \"label\": \"Our Team\",\n \"heading\": \"Meet the People Behind the Magic\",\n \"description\": \"Passionate experts dedicated to delivering exceptional results.\",\n \"member1Name\": \"Team Member\",\n \"member1Role\": \"CEO & Founder\",\n \"member1Bio\": \"Visionary leader with 15+ years in tech innovation.\",\n \"member2Name\": \"Team Member\",\n \"member2Role\": \"CTO\",\n \"member2Bio\": \"Full-stack architect passionate about scalable solutions.\",\n \"member3Name\": \"Team Member\",\n \"member3Role\": \"Head of Design\",\n \"member3Bio\": \"Award-winning designer creating beautiful user experiences.\",\n \"member4Name\": \"Team Member\",\n \"member4Role\": \"Lead Developer\",\n \"member4Bio\": \"Open source contributor and clean code advocate.\",\n \"member5Name\": \"Team Member\",\n \"member5Role\": \"Product Manager\",\n \"member5Bio\": \"Strategic thinker turning ideas into successful products.\",\n \"member6Name\": \"Team Member\",\n \"member6Role\": \"Marketing Director\",\n \"member6Bio\": \"Growth expert with data-driven approach.\",\n \"ctaTitle\": \"Want to Join Our Team?\",\n \"ctaDescription\": \"We're always looking for talented individuals to join us.\",\n \"ctaButton\": \"View Open Positions\"\n}"
|
|
31
|
+
"content": "{\r\n \"title\": \"Our Team\",\r\n \"label\": \"Our Team\",\r\n \"heading\": \"Meet the People Behind the Magic\",\r\n \"description\": \"Passionate experts dedicated to delivering exceptional results.\",\r\n \"member1Name\": \"Team Member\",\r\n \"member1Role\": \"CEO & Founder\",\r\n \"member1Bio\": \"Visionary leader with 15+ years in tech innovation.\",\r\n \"member2Name\": \"Team Member\",\r\n \"member2Role\": \"CTO\",\r\n \"member2Bio\": \"Full-stack architect passionate about scalable solutions.\",\r\n \"member3Name\": \"Team Member\",\r\n \"member3Role\": \"Head of Design\",\r\n \"member3Bio\": \"Award-winning designer creating beautiful user experiences.\",\r\n \"member4Name\": \"Team Member\",\r\n \"member4Role\": \"Lead Developer\",\r\n \"member4Bio\": \"Open source contributor and clean code advocate.\",\r\n \"member5Name\": \"Team Member\",\r\n \"member5Role\": \"Product Manager\",\r\n \"member5Bio\": \"Strategic thinker turning ideas into successful products.\",\r\n \"member6Name\": \"Team Member\",\r\n \"member6Role\": \"Marketing Director\",\r\n \"member6Bio\": \"Growth expert with data-driven approach.\",\r\n \"ctaTitle\": \"Want to Join Our Team?\",\r\n \"ctaDescription\": \"We're always looking for talented individuals to join us.\",\r\n \"ctaButton\": \"View Open Positions\"\r\n}"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "team-page/lang/tr.json",
|
|
35
35
|
"type": "registry:lang",
|
|
36
36
|
"target": "$modules$/team-page/lang/tr.json",
|
|
37
|
-
"content": "{\n \"title\": \"Ekibimiz\",\n \"label\": \"Ekibimiz\",\n \"heading\": \"Sihrin Arkasındaki İnsanlarla Tanışın\",\n \"description\": \"Olağanüstü sonuçlar sunmaya ve sınırları zorlamaya adanmış tutkulu bir uzman ekibi.\",\n \"member1Name\": \"Ayşe Yılmaz\",\n \"member1Role\": \"CEO & Kurucu\",\n \"member1Bio\": \"Teknoloji inovasyonunda 15+ yıllık deneyime sahip vizyoner lider.\",\n \"member2Name\": \"Mehmet Kaya\",\n \"member2Role\": \"CTO\",\n \"member2Bio\": \"Ölçeklenebilir çözümler konusunda tutkulu full-stack mimar.\",\n \"member3Name\": \"Zeynep Demir\",\n \"member3Role\": \"Tasarım Direktörü\",\n \"member3Bio\": \"Güzel kullanıcı deneyimleri yaratan ödüllü tasarımcı.\",\n \"member4Name\": \"Ali Öztürk\",\n \"member4Role\": \"Baş Geliştirici\",\n \"member4Bio\": \"Açık kaynak katkıcısı ve temiz kod savunucusu.\",\n \"member5Name\": \"Elif Şahin\",\n \"member5Role\": \"Ürün Müdürü\",\n \"member5Bio\": \"Fikirleri başarılı ürünlere dönüştüren stratejik düşünür.\",\n \"member6Name\": \"Can Arslan\",\n \"member6Role\": \"Pazarlama Direktörü\",\n \"member6Bio\": \"Veri odaklı yaklaşıma sahip büyüme uzmanı.\",\n \"ctaTitle\": \"Ekibimize Katılmak İster misiniz?\",\n \"ctaDescription\": \"İnovasyon tutkumuzu paylaşan yetenekli bireyleri her zaman arıyoruz.\",\n \"ctaButton\": \"Açık Pozisyonları Görüntüle\"\n}\n"
|
|
37
|
+
"content": "{\r\n \"title\": \"Ekibimiz\",\r\n \"label\": \"Ekibimiz\",\r\n \"heading\": \"Sihrin Arkasındaki İnsanlarla Tanışın\",\r\n \"description\": \"Olağanüstü sonuçlar sunmaya ve sınırları zorlamaya adanmış tutkulu bir uzman ekibi.\",\r\n \"member1Name\": \"Ayşe Yılmaz\",\r\n \"member1Role\": \"CEO & Kurucu\",\r\n \"member1Bio\": \"Teknoloji inovasyonunda 15+ yıllık deneyime sahip vizyoner lider.\",\r\n \"member2Name\": \"Mehmet Kaya\",\r\n \"member2Role\": \"CTO\",\r\n \"member2Bio\": \"Ölçeklenebilir çözümler konusunda tutkulu full-stack mimar.\",\r\n \"member3Name\": \"Zeynep Demir\",\r\n \"member3Role\": \"Tasarım Direktörü\",\r\n \"member3Bio\": \"Güzel kullanıcı deneyimleri yaratan ödüllü tasarımcı.\",\r\n \"member4Name\": \"Ali Öztürk\",\r\n \"member4Role\": \"Baş Geliştirici\",\r\n \"member4Bio\": \"Açık kaynak katkıcısı ve temiz kod savunucusu.\",\r\n \"member5Name\": \"Elif Şahin\",\r\n \"member5Role\": \"Ürün Müdürü\",\r\n \"member5Bio\": \"Fikirleri başarılı ürünlere dönüştüren stratejik düşünür.\",\r\n \"member6Name\": \"Can Arslan\",\r\n \"member6Role\": \"Pazarlama Direktörü\",\r\n \"member6Bio\": \"Veri odaklı yaklaşıma sahip büyüme uzmanı.\",\r\n \"ctaTitle\": \"Ekibimize Katılmak İster misiniz?\",\r\n \"ctaDescription\": \"İnovasyon tutkumuzu paylaşan yetenekli bireyleri her zaman arıyoruz.\",\r\n \"ctaButton\": \"Açık Pozisyonları Görüntüle\"\r\n}\r\n"
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
40
|
"exports": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"path": "terms-page/index.ts",
|
|
17
17
|
"type": "registry:index",
|
|
18
18
|
"target": "$modules$/terms-page/index.ts",
|
|
19
|
-
"content": "export * from './terms-page';\nexport { TermsPage as default } from './terms-page';\n"
|
|
19
|
+
"content": "export * from './terms-page';\r\nexport { TermsPage as default } from './terms-page';\r\n"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "terms-page/terms-page.tsx",
|
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"path": "terms-page/lang/en.json",
|
|
29
29
|
"type": "registry:lang",
|
|
30
30
|
"target": "$modules$/terms-page/lang/en.json",
|
|
31
|
-
"content": "{\n \"title\": \"Terms of Service\",\n \"lastUpdated\": \"Last Updated\",\n \"updateDate\": \"January 2026\",\n \"introduction\": \"Please read these Terms of Service carefully before using our website or services. By accessing or using our services, you agree to be bound by these terms. If you do not agree to all the terms and conditions, you may not access or use our services.\",\n \"acceptanceTitle\": \"Acceptance of Terms\",\n \"acceptanceContent\": \"By accessing and using this website, you accept and agree to be bound by the terms and provisions of this agreement. You must be at least 18 years old to use our services. You agree to provide accurate and complete information, maintain the confidentiality of your account, and accept responsibility for all activities under your account.\",\n \"licenseTitle\": \"License and Access\",\n \"licenseContent\": \"We grant you a limited, non-exclusive, non-transferable license to access and use our services for personal, non-commercial purposes. This license does not include resale or commercial use of the service, derivative use of the service or its contents, downloading or copying of account information, or use of data mining, robots, or similar data gathering tools.\",\n \"restrictionsTitle\": \"User Restrictions\",\n \"restrictionsContent\": \"When using our services, you agree not to engage in any activities that may harm, disable, or impair our services or interfere with other users. Do not use the service for illegal purposes, violate laws in your jurisdiction, transmit malicious code, attempt unauthorized access to our systems, or harass other users.\",\n \"terminationTitle\": \"Termination\",\n \"terminationContent\": \"We may terminate or suspend your access to our services immediately, without prior notice, for any reason whatsoever, including breach of these Terms. Upon termination, your right to use the service will cease immediately. You may terminate your account at any time by contacting us.\",\n \"changesTitle\": \"Changes to Terms\",\n \"changesContent\": \"We reserve the right to modify or replace these Terms at any time. Material changes will be notified at least 30 days before taking effect via email or website. Continued use after changes constitutes acceptance of new terms. You should review the Terms periodically for changes.\",\n \"governingTitle\": \"Governing Law\",\n \"governingContent\": \"These Terms shall be governed by and construed in accordance with applicable laws, without regard to conflict of law provisions. Any disputes shall be resolved in the courts of the applicable jurisdiction. These terms constitute the entire agreement between us.\",\n \"footerNote\": \"If you have any questions about these Terms of Service, please contact us. Your continued use of our services constitutes acceptance of these terms.\"\n}\n"
|
|
31
|
+
"content": "{\r\n \"title\": \"Terms of Service\",\r\n \"lastUpdated\": \"Last Updated\",\r\n \"updateDate\": \"January 2026\",\r\n \"introduction\": \"Please read these Terms of Service carefully before using our website or services. By accessing or using our services, you agree to be bound by these terms. If you do not agree to all the terms and conditions, you may not access or use our services.\",\r\n \"acceptanceTitle\": \"Acceptance of Terms\",\r\n \"acceptanceContent\": \"By accessing and using this website, you accept and agree to be bound by the terms and provisions of this agreement. You must be at least 18 years old to use our services. You agree to provide accurate and complete information, maintain the confidentiality of your account, and accept responsibility for all activities under your account.\",\r\n \"licenseTitle\": \"License and Access\",\r\n \"licenseContent\": \"We grant you a limited, non-exclusive, non-transferable license to access and use our services for personal, non-commercial purposes. This license does not include resale or commercial use of the service, derivative use of the service or its contents, downloading or copying of account information, or use of data mining, robots, or similar data gathering tools.\",\r\n \"restrictionsTitle\": \"User Restrictions\",\r\n \"restrictionsContent\": \"When using our services, you agree not to engage in any activities that may harm, disable, or impair our services or interfere with other users. Do not use the service for illegal purposes, violate laws in your jurisdiction, transmit malicious code, attempt unauthorized access to our systems, or harass other users.\",\r\n \"terminationTitle\": \"Termination\",\r\n \"terminationContent\": \"We may terminate or suspend your access to our services immediately, without prior notice, for any reason whatsoever, including breach of these Terms. Upon termination, your right to use the service will cease immediately. You may terminate your account at any time by contacting us.\",\r\n \"changesTitle\": \"Changes to Terms\",\r\n \"changesContent\": \"We reserve the right to modify or replace these Terms at any time. Material changes will be notified at least 30 days before taking effect via email or website. Continued use after changes constitutes acceptance of new terms. You should review the Terms periodically for changes.\",\r\n \"governingTitle\": \"Governing Law\",\r\n \"governingContent\": \"These Terms shall be governed by and construed in accordance with applicable laws, without regard to conflict of law provisions. Any disputes shall be resolved in the courts of the applicable jurisdiction. These terms constitute the entire agreement between us.\",\r\n \"footerNote\": \"If you have any questions about these Terms of Service, please contact us. Your continued use of our services constitutes acceptance of these terms.\"\r\n}\r\n"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"path": "terms-page/lang/tr.json",
|
|
35
35
|
"type": "registry:lang",
|
|
36
36
|
"target": "$modules$/terms-page/lang/tr.json",
|
|
37
|
-
"content": "{\n \"title\": \"Kullanım Şartları\",\n \"lastUpdated\": \"Son Güncelleme\",\n \"updateDate\": \"Ocak 2026\",\n \"introduction\": \"Web sitemizi veya hizmetlerimizi kullanmadan önce lütfen bu Kullanım Şartlarını dikkatlice okuyun. Hizmetlerimize erişerek veya kullanarak bu şartlara bağlı olmayı kabul edersiniz. Tüm şart ve koşulları kabul etmiyorsanız, hizmetlerimize erişemez veya kullanamazsınız.\",\n \"acceptanceTitle\": \"Şartların Kabulü\",\n \"acceptanceContent\": \"Bu web sitesine erişerek ve kullanarak, bu sözleşmenin şart ve hükümlerine bağlı olmayı kabul edersiniz. Hizmetlerimizi kullanmak için en az 18 yaşında olmalısınız. Doğru ve eksiksiz bilgi sağlamayı, hesabınızın gizliliğini korumayı ve hesabınızdaki tüm faaliyetlerden sorumluluk kabul etmeyi taahhüt edersiniz.\",\n \"licenseTitle\": \"Lisans ve Erişim\",\n \"licenseContent\": \"Size hizmetlerimize erişim ve kişisel, ticari olmayan amaçlarla kullanım için sınırlı, münhasır olmayan, devredilemez bir lisans veriyoruz. Bu lisans hizmetin yeniden satışını, ticari kullanımını, türetilmiş kullanımını, hesap bilgilerinin indirilmesini veya veri madenciliği araçlarının kullanımını içermez.\",\n \"restrictionsTitle\": \"Kullanıcı Kısıtlamaları\",\n \"restrictionsContent\": \"Hizmetlerimizi kullanırken, hizmetlerimize zarar verebilecek veya diğer kullanıcıları engelleyebilecek herhangi bir faaliyette bulunmamayı kabul edersiniz. Hizmeti yasadışı amaçlar için kullanmayın, yasaları ihlal etmeyin, zararlı kod iletmeyin, sistemlerimize yetkisiz erişim sağlamaya çalışmayın veya diğer kullanıcıları taciz etmeyin.\",\n \"terminationTitle\": \"Fesih\",\n \"terminationContent\": \"Bu Şartların ihlali de dahil olmak üzere herhangi bir nedenle, önceden haber vermeksizin, hizmetlerimize erişiminizi derhal sonlandırabiliriz veya askıya alabiliriz. Fesih üzerine, hizmeti kullanma hakkınız derhal sona erecektir. Hesabınızı istediğiniz zaman bizimle iletişime geçerek sonlandırabilirsiniz.\",\n \"changesTitle\": \"Şartlardaki Değişiklikler\",\n \"changesContent\": \"Bu Şartları istediğimiz zaman değiştirme hakkını saklı tutuyoruz. Önemli değişiklikler yürürlüğe girmeden en az 30 gün önce e-posta veya web sitesi aracılığıyla bildirilecektir. Değişikliklerden sonra devam eden kullanım yeni şartların kabulü anlamına gelir. Şartları periyodik olarak gözden geçirmelisiniz.\",\n \"governingTitle\": \"Yürürlükteki Hukuk\",\n \"governingContent\": \"Bu Şartlar, hukuk uyuşmazlığı hükümleri dikkate alınmaksızın, yürürlükteki yasalara göre yönetilecek ve yorumlanacaktır. Herhangi bir uyuşmazlık ilgili yargı yetkisinin mahkemelerinde çözülecektir. Bu şartlar aramızdaki tam sözleşmeyi oluşturur.\",\n \"footerNote\": \"Bu Kullanım Şartları hakkında herhangi bir sorunuz varsa, lütfen bizimle iletişime geçin. Hizmetlerimizi kullanmaya devam etmeniz bu şartları kabul ettiğiniz anlamına gelir.\"\n}\n"
|
|
37
|
+
"content": "{\r\n \"title\": \"Kullanım Şartları\",\r\n \"lastUpdated\": \"Son Güncelleme\",\r\n \"updateDate\": \"Ocak 2026\",\r\n \"introduction\": \"Web sitemizi veya hizmetlerimizi kullanmadan önce lütfen bu Kullanım Şartlarını dikkatlice okuyun. Hizmetlerimize erişerek veya kullanarak bu şartlara bağlı olmayı kabul edersiniz. Tüm şart ve koşulları kabul etmiyorsanız, hizmetlerimize erişemez veya kullanamazsınız.\",\r\n \"acceptanceTitle\": \"Şartların Kabulü\",\r\n \"acceptanceContent\": \"Bu web sitesine erişerek ve kullanarak, bu sözleşmenin şart ve hükümlerine bağlı olmayı kabul edersiniz. Hizmetlerimizi kullanmak için en az 18 yaşında olmalısınız. Doğru ve eksiksiz bilgi sağlamayı, hesabınızın gizliliğini korumayı ve hesabınızdaki tüm faaliyetlerden sorumluluk kabul etmeyi taahhüt edersiniz.\",\r\n \"licenseTitle\": \"Lisans ve Erişim\",\r\n \"licenseContent\": \"Size hizmetlerimize erişim ve kişisel, ticari olmayan amaçlarla kullanım için sınırlı, münhasır olmayan, devredilemez bir lisans veriyoruz. Bu lisans hizmetin yeniden satışını, ticari kullanımını, türetilmiş kullanımını, hesap bilgilerinin indirilmesini veya veri madenciliği araçlarının kullanımını içermez.\",\r\n \"restrictionsTitle\": \"Kullanıcı Kısıtlamaları\",\r\n \"restrictionsContent\": \"Hizmetlerimizi kullanırken, hizmetlerimize zarar verebilecek veya diğer kullanıcıları engelleyebilecek herhangi bir faaliyette bulunmamayı kabul edersiniz. Hizmeti yasadışı amaçlar için kullanmayın, yasaları ihlal etmeyin, zararlı kod iletmeyin, sistemlerimize yetkisiz erişim sağlamaya çalışmayın veya diğer kullanıcıları taciz etmeyin.\",\r\n \"terminationTitle\": \"Fesih\",\r\n \"terminationContent\": \"Bu Şartların ihlali de dahil olmak üzere herhangi bir nedenle, önceden haber vermeksizin, hizmetlerimize erişiminizi derhal sonlandırabiliriz veya askıya alabiliriz. Fesih üzerine, hizmeti kullanma hakkınız derhal sona erecektir. Hesabınızı istediğiniz zaman bizimle iletişime geçerek sonlandırabilirsiniz.\",\r\n \"changesTitle\": \"Şartlardaki Değişiklikler\",\r\n \"changesContent\": \"Bu Şartları istediğimiz zaman değiştirme hakkını saklı tutuyoruz. Önemli değişiklikler yürürlüğe girmeden en az 30 gün önce e-posta veya web sitesi aracılığıyla bildirilecektir. Değişikliklerden sonra devam eden kullanım yeni şartların kabulü anlamına gelir. Şartları periyodik olarak gözden geçirmelisiniz.\",\r\n \"governingTitle\": \"Yürürlükteki Hukuk\",\r\n \"governingContent\": \"Bu Şartlar, hukuk uyuşmazlığı hükümleri dikkate alınmaksızın, yürürlükteki yasalara göre yönetilecek ve yorumlanacaktır. Herhangi bir uyuşmazlık ilgili yargı yetkisinin mahkemelerinde çözülecektir. Bu şartlar aramızdaki tam sözleşmeyi oluşturur.\",\r\n \"footerNote\": \"Bu Kullanım Şartları hakkında herhangi bir sorunuz varsa, lütfen bizimle iletişime geçin. Hizmetlerimizi kullanmaya devam etmeniz bu şartları kabul ettiğiniz anlamına gelir.\"\r\n}\r\n"
|
|
38
38
|
}
|
|
39
39
|
],
|
|
40
40
|
"exports": {
|
|
@@ -14,25 +14,25 @@
|
|
|
14
14
|
"path": "testimonials-carousel/index.ts",
|
|
15
15
|
"type": "registry:index",
|
|
16
16
|
"target": "$modules$/testimonials-carousel/index.ts",
|
|
17
|
-
"content": "export * from './testimonials-carousel';\n"
|
|
17
|
+
"content": "export * from './testimonials-carousel';\r\n"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"path": "testimonials-carousel/testimonials-carousel.tsx",
|
|
21
21
|
"type": "registry:component",
|
|
22
22
|
"target": "$modules$/testimonials-carousel/testimonials-carousel.tsx",
|
|
23
|
-
"content": "import { useState, useEffect } from \"react\";\nimport { Star } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"@/lib/utils\";\nimport { Card, CardContent, CardHeader, CardFooter, CardTitle } from \"@/components/ui/card\";\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n type CarouselApi,\n} from \"@/components/ui/carousel\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\nimport { Button } from \"@/components/ui/button\";\n\ninterface Testimonial {\n id: number;\n name: string;\n role: string;\n image: string;\n review: string;\n rating: number;\n}\n\ninterface TestimonialsCarouselProps {\n className?: string;\n}\n\nexport function TestimonialsCarousel({ className }: TestimonialsCarouselProps) {\n const { t } = useTranslation(\"testimonials-carousel\");\n const [api, setApi] = useState<CarouselApi>();\n const [current, setCurrent] = useState(0);\n\n const testimonials: Testimonial[] = [\n {\n id: 1,\n name: t(\"testimonial1Name\", \"Sarah Johnson\"),\n role: t(\"testimonial1Role\", \"Product Manager\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial1Review\", \"This platform has completely transformed how we work. The intuitive interface and powerful features have boosted our team's productivity significantly.\"),\n rating: 5,\n },\n {\n id: 2,\n name: t(\"testimonial2Name\", \"Michael Chen\"),\n role: t(\"testimonial2Role\", \"Software Engineer\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial2Review\", \"Exceptional quality and attention to detail. The support team is incredibly responsive and helpful. Highly recommend for any development team.\"),\n rating: 5,\n },\n {\n id: 3,\n name: t(\"testimonial3Name\", \"Emily Davis\"),\n role: t(\"testimonial3Role\", \"Design Lead\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial3Review\", \"The best investment we've made for our design workflow. Clean, modern, and incredibly flexible. Our clients love the results.\"),\n rating: 4,\n },\n {\n id: 4,\n name: t(\"testimonial4Name\", \"James Wilson\"),\n role: t(\"testimonial4Role\", \"Startup Founder\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial4Review\", \"Launched our MVP in record time thanks to this amazing toolkit. The documentation is excellent and the community is super helpful.\"),\n rating: 5,\n },\n ];\n\n useEffect(() => {\n if (!api) return;\n\n const onSelect = () => {\n setCurrent(api.selectedScrollSnap());\n };\n\n api.on(\"select\", onSelect);\n return () => {\n api.off(\"select\", onSelect);\n };\n }, [api]);\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 <header className=\"mb-12 text-center\">\n <h2 className=\"text-3xl font-bold md:text-4xl mb-4\">\n {t(\"title\", \"What Our Customers Say\")}\n </h2>\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\n {t(\"subtitle\", \"Don't just take our word for it. Here's what our customers have to say about their experience.\")}\n </p>\n </header>\n\n <Carousel\n setApi={setApi}\n opts={{\n align: \"start\",\n loop: true,\n }}\n className=\"w-full max-w-6xl mx-auto\"\n >\n <CarouselContent className=\"-ml-4\">\n {testimonials.map((testimonial) => (\n <CarouselItem\n key={testimonial.id}\n className=\"pl-4 basis-full sm:basis-1/2 lg:basis-1/3\"\n >\n <Card className=\"h-full\">\n <CardHeader>\n <div className=\"flex items-center gap-4\">\n <Avatar className=\"h-12 w-12\">\n <AvatarImage\n src={testimonial.image}\n alt={testimonial.name}\n />\n <AvatarFallback>\n {testimonial.name.charAt(0)}\n </AvatarFallback>\n </Avatar>\n <div>\n <CardTitle className=\"text-base\">\n {testimonial.name}\n </CardTitle>\n <p className=\"text-sm text-muted-foreground\">\n {testimonial.role}\n </p>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <p className=\"text-muted-foreground text-sm leading-relaxed\">\n \"{testimonial.review}\"\n </p>\n </CardContent>\n <CardFooter>\n <div className=\"flex items-center gap-1\">\n {[...Array(5)].map((_, index) => (\n <Star\n key={index}\n className={cn(\n \"h-4 w-4\",\n index < testimonial.rating\n ? \"fill-yellow-400 text-yellow-400\"\n : \"fill-muted text-muted\"\n )}\n />\n ))}\n </div>\n </CardFooter>\n </Card>\n </CarouselItem>\n ))}\n </CarouselContent>\n <CarouselPrevious className=\"hidden lg:flex\" />\n <CarouselNext className=\"hidden lg:flex\" />\n </Carousel>\n\n {/* Dot Navigation */}\n <div className=\"flex items-center justify-center gap-2 mt-8\">\n {testimonials.map((_, index) => (\n <Button\n key={index}\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => api?.scrollTo(index)}\n className={cn(\n \"h-2 rounded-full p-0 transition-all\",\n current === index\n ? \"w-6 bg-primary\"\n : \"w-2 bg-muted hover:bg-muted-foreground/20\"\n )}\n aria-label={`Go to slide ${index + 1}`}\n />\n ))}\n </div>\n </div>\n </section>\n );\n}\n"
|
|
23
|
+
"content": "import { useState, useEffect } from \"react\";\r\nimport { Star } from \"lucide-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Card, CardContent, CardHeader, CardFooter, CardTitle } from \"@/components/ui/card\";\r\nimport {\r\n Carousel,\r\n CarouselContent,\r\n CarouselItem,\r\n CarouselNext,\r\n CarouselPrevious,\r\n type CarouselApi,\r\n} from \"@/components/ui/carousel\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\nimport { Button } from \"@/components/ui/button\";\r\n\r\ninterface Testimonial {\r\n id: number;\r\n name: string;\r\n role: string;\r\n image: string;\r\n review: string;\r\n rating: number;\r\n}\r\n\r\ninterface TestimonialsCarouselProps {\r\n className?: string;\r\n}\r\n\r\nexport function TestimonialsCarousel({ className }: TestimonialsCarouselProps) {\r\n const { t } = useTranslation(\"testimonials-carousel\");\r\n const [api, setApi] = useState<CarouselApi>();\r\n const [current, setCurrent] = useState(0);\r\n\r\n const testimonials: Testimonial[] = [\r\n {\r\n id: 1,\r\n name: t(\"testimonial1Name\", \"Sarah Johnson\"),\r\n role: t(\"testimonial1Role\", \"Product Manager\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial1Review\", \"This platform has completely transformed how we work. The intuitive interface and powerful features have boosted our team's productivity significantly.\"),\r\n rating: 5,\r\n },\r\n {\r\n id: 2,\r\n name: t(\"testimonial2Name\", \"Michael Chen\"),\r\n role: t(\"testimonial2Role\", \"Software Engineer\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial2Review\", \"Exceptional quality and attention to detail. The support team is incredibly responsive and helpful. Highly recommend for any development team.\"),\r\n rating: 5,\r\n },\r\n {\r\n id: 3,\r\n name: t(\"testimonial3Name\", \"Emily Davis\"),\r\n role: t(\"testimonial3Role\", \"Design Lead\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial3Review\", \"The best investment we've made for our design workflow. Clean, modern, and incredibly flexible. Our clients love the results.\"),\r\n rating: 4,\r\n },\r\n {\r\n id: 4,\r\n name: t(\"testimonial4Name\", \"James Wilson\"),\r\n role: t(\"testimonial4Role\", \"Startup Founder\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial4Review\", \"Launched our MVP in record time thanks to this amazing toolkit. The documentation is excellent and the community is super helpful.\"),\r\n rating: 5,\r\n },\r\n ];\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n\r\n const onSelect = () => {\r\n setCurrent(api.selectedScrollSnap());\r\n };\r\n\r\n api.on(\"select\", onSelect);\r\n return () => {\r\n api.off(\"select\", onSelect);\r\n };\r\n }, [api]);\r\n\r\n return (\r\n <section className={cn(\"py-16 md:py-24\", className)}>\r\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\r\n <header className=\"mb-12 text-center\">\r\n <h2 className=\"text-3xl font-bold md:text-4xl mb-4\">\r\n {t(\"title\", \"What Our Customers Say\")}\r\n </h2>\r\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\r\n {t(\"subtitle\", \"Don't just take our word for it. Here's what our customers have to say about their experience.\")}\r\n </p>\r\n </header>\r\n\r\n <Carousel\r\n setApi={setApi}\r\n opts={{\r\n align: \"start\",\r\n loop: true,\r\n }}\r\n className=\"w-full max-w-6xl mx-auto\"\r\n >\r\n <CarouselContent className=\"-ml-4\">\r\n {testimonials.map((testimonial) => (\r\n <CarouselItem\r\n key={testimonial.id}\r\n className=\"pl-4 basis-full sm:basis-1/2 lg:basis-1/3\"\r\n >\r\n <Card className=\"h-full\">\r\n <CardHeader>\r\n <div className=\"flex items-center gap-4\">\r\n <Avatar className=\"h-12 w-12\">\r\n <AvatarImage\r\n src={testimonial.image}\r\n alt={testimonial.name}\r\n />\r\n <AvatarFallback>\r\n {testimonial.name.charAt(0)}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div>\r\n <CardTitle className=\"text-base\">\r\n {testimonial.name}\r\n </CardTitle>\r\n <p className=\"text-sm text-muted-foreground\">\r\n {testimonial.role}\r\n </p>\r\n </div>\r\n </div>\r\n </CardHeader>\r\n <CardContent>\r\n <p className=\"text-muted-foreground text-sm leading-relaxed\">\r\n \"{testimonial.review}\"\r\n </p>\r\n </CardContent>\r\n <CardFooter>\r\n <div className=\"flex items-center gap-1\">\r\n {[...Array(5)].map((_, index) => (\r\n <Star\r\n key={index}\r\n className={cn(\r\n \"h-4 w-4\",\r\n index < testimonial.rating\r\n ? \"fill-yellow-400 text-yellow-400\"\r\n : \"fill-muted text-muted\"\r\n )}\r\n />\r\n ))}\r\n </div>\r\n </CardFooter>\r\n </Card>\r\n </CarouselItem>\r\n ))}\r\n </CarouselContent>\r\n <CarouselPrevious className=\"hidden lg:flex\" />\r\n <CarouselNext className=\"hidden lg:flex\" />\r\n </Carousel>\r\n\r\n {/* Dot Navigation */}\r\n <div className=\"flex items-center justify-center gap-2 mt-8\">\r\n {testimonials.map((_, index) => (\r\n <Button\r\n key={index}\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => api?.scrollTo(index)}\r\n className={cn(\r\n \"h-2 rounded-full p-0 transition-all\",\r\n current === index\r\n ? \"w-6 bg-primary\"\r\n : \"w-2 bg-muted hover:bg-muted-foreground/20\"\r\n )}\r\n aria-label={`Go to slide ${index + 1}`}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"path": "testimonials-carousel/lang/en.json",
|
|
27
27
|
"type": "registry:lang",
|
|
28
28
|
"target": "$modules$/testimonials-carousel/lang/en.json",
|
|
29
|
-
"content": "{\n \"title\": \"What Our Customers Say\",\n \"subtitle\": \"This introductory text sets context for your customer testimonials. Explain the value of customer feedback, highlight what makes your reviews authentic, or mention your customer satisfaction rate. Use Promake to create a compelling introduction to your testimonials.\",\n \"testimonial1Name\": \"Customer Name\",\n \"testimonial1Role\": \"Use Promake to update this with an appropriate job title\",\n \"testimonial1Review\": \"This is where a customer testimonial appears. Include authentic feedback that highlights specific benefits, results, or experiences. Focus on concrete details that build trust and credibility. Use Promake to add real customer reviews that resonate with potential customers.\",\n \"testimonial2Name\": \"Client Name\",\n \"testimonial2Role\": \"Promake can help customize this role\",\n \"testimonial2Review\": \"Add another authentic customer review here. Vary the testimonials to showcase different benefits, use cases, or customer types. Include specific details about how your product or service made a difference. Customize with Promake.\",\n \"testimonial3Name\": \"Testimonial Name\",\n \"testimonial3Role\": \"Replace with customer role\",\n \"testimonial3Review\": \"Include a third testimonial that addresses different aspects of your offering. Real customer stories with specific outcomes are most effective. Use Promake to add testimonials that showcase various benefits and build comprehensive trust.\",\n \"testimonial4Name\": \"Reviewer Name\",\n \"testimonial4Role\": \"Customize this role with Promake\",\n \"testimonial4Review\": \"Placeholder customer testimonial. Update this content using Promake based on your industry.\"\n}\n"
|
|
29
|
+
"content": "{\r\n \"title\": \"What Our Customers Say\",\r\n \"subtitle\": \"This introductory text sets context for your customer testimonials. Explain the value of customer feedback, highlight what makes your reviews authentic, or mention your customer satisfaction rate. Use Promake to create a compelling introduction to your testimonials.\",\r\n \"testimonial1Name\": \"Customer Name\",\r\n \"testimonial1Role\": \"Use Promake to update this with an appropriate job title\",\r\n \"testimonial1Review\": \"This is where a customer testimonial appears. Include authentic feedback that highlights specific benefits, results, or experiences. Focus on concrete details that build trust and credibility. Use Promake to add real customer reviews that resonate with potential customers.\",\r\n \"testimonial2Name\": \"Client Name\",\r\n \"testimonial2Role\": \"Promake can help customize this role\",\r\n \"testimonial2Review\": \"Add another authentic customer review here. Vary the testimonials to showcase different benefits, use cases, or customer types. Include specific details about how your product or service made a difference. Customize with Promake.\",\r\n \"testimonial3Name\": \"Testimonial Name\",\r\n \"testimonial3Role\": \"Replace with customer role\",\r\n \"testimonial3Review\": \"Include a third testimonial that addresses different aspects of your offering. Real customer stories with specific outcomes are most effective. Use Promake to add testimonials that showcase various benefits and build comprehensive trust.\",\r\n \"testimonial4Name\": \"Reviewer Name\",\r\n \"testimonial4Role\": \"Customize this role with Promake\",\r\n \"testimonial4Review\": \"Placeholder customer testimonial. Update this content using Promake based on your industry.\"\r\n}\r\n"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"path": "testimonials-carousel/lang/tr.json",
|
|
33
33
|
"type": "registry:lang",
|
|
34
34
|
"target": "$modules$/testimonials-carousel/lang/tr.json",
|
|
35
|
-
"content": "{\n \"title\": \"Müşterilerimiz Ne Diyor\",\n \"subtitle\": \"Bu giriş metni müşteri referanslarınız için bağlam oluşturur. Müşteri geri bildiriminin değerini açıklayın, yorumlarınızı özgün kılan özellikleri vurgulayın veya müşteri memnuniyet oranınızdan bahsedin. Promake ile referanslarınıza ikna edici bir giriş oluşturun.\",\n \"testimonial1Name\": \"Müşteri Adı\",\n \"testimonial1Role\": \"Bunu uygun iş unvanıyla güncellemek için Promake kullanın\",\n \"testimonial1Review\": \"Burası müşteri referansının göründüğü yerdir. Belirli faydaları, sonuçları veya deneyimleri vurgulayan özgün geri bildirim ekleyin. Güven ve itibar oluşturan somut detaylara odaklanın. Promake ile potansiyel müşterilerde yankı uyandıran gerçek müşteri yorumları ekleyin.\",\n \"testimonial2Name\": \"Müşteri Adı\",\n \"testimonial2Role\": \"Promake bu rolü özelleştirmenize yardımcı olabilir\",\n \"testimonial2Review\": \"Buraya başka bir özgün müşteri yorumu ekleyin. Farklı faydaları, kullanım durumlarını veya müşteri tiplerini sergilemek için referansları çeşitlendirin. Ürününüz veya hizmetinizin nasıl fark yarattığına dair özel detaylar ekleyin. Promake ile özelleştirin.\",\n \"testimonial3Name\": \"Referans Adı\",\n \"testimonial3Role\": \"Müşteri rolüyle değiştirin\",\n \"testimonial3Review\": \"Teklifinizin farklı yönlerini ele alan üçüncü bir referans ekleyin. Belirli sonuçları olan gerçek müşteri hikayeleri en etkilidir. Promake ile çeşitli faydaları sergileyen ve kapsamlı güven oluşturan referanslar ekleyin.\",\n \"testimonial4Name\": \"Yorumcu Adı\",\n \"testimonial4Role\": \"Bu rolü Promake ile özelleştirin\",\n \"testimonial4Review\": \"Müşteri yorumlarını Promake ile ekleyin.\"\n}\n"
|
|
35
|
+
"content": "{\r\n \"title\": \"Müşterilerimiz Ne Diyor\",\r\n \"subtitle\": \"Bu giriş metni müşteri referanslarınız için bağlam oluşturur. Müşteri geri bildiriminin değerini açıklayın, yorumlarınızı özgün kılan özellikleri vurgulayın veya müşteri memnuniyet oranınızdan bahsedin. Promake ile referanslarınıza ikna edici bir giriş oluşturun.\",\r\n \"testimonial1Name\": \"Müşteri Adı\",\r\n \"testimonial1Role\": \"Bunu uygun iş unvanıyla güncellemek için Promake kullanın\",\r\n \"testimonial1Review\": \"Burası müşteri referansının göründüğü yerdir. Belirli faydaları, sonuçları veya deneyimleri vurgulayan özgün geri bildirim ekleyin. Güven ve itibar oluşturan somut detaylara odaklanın. Promake ile potansiyel müşterilerde yankı uyandıran gerçek müşteri yorumları ekleyin.\",\r\n \"testimonial2Name\": \"Müşteri Adı\",\r\n \"testimonial2Role\": \"Promake bu rolü özelleştirmenize yardımcı olabilir\",\r\n \"testimonial2Review\": \"Buraya başka bir özgün müşteri yorumu ekleyin. Farklı faydaları, kullanım durumlarını veya müşteri tiplerini sergilemek için referansları çeşitlendirin. Ürününüz veya hizmetinizin nasıl fark yarattığına dair özel detaylar ekleyin. Promake ile özelleştirin.\",\r\n \"testimonial3Name\": \"Referans Adı\",\r\n \"testimonial3Role\": \"Müşteri rolüyle değiştirin\",\r\n \"testimonial3Review\": \"Teklifinizin farklı yönlerini ele alan üçüncü bir referans ekleyin. Belirli sonuçları olan gerçek müşteri hikayeleri en etkilidir. Promake ile çeşitli faydaları sergileyen ve kapsamlı güven oluşturan referanslar ekleyin.\",\r\n \"testimonial4Name\": \"Yorumcu Adı\",\r\n \"testimonial4Role\": \"Bu rolü Promake ile özelleştirin\",\r\n \"testimonial4Review\": \"Müşteri yorumlarını Promake ile ekleyin.\"\r\n}\r\n"
|
|
36
36
|
}
|
|
37
37
|
],
|
|
38
38
|
"exports": {
|
|
@@ -13,25 +13,25 @@
|
|
|
13
13
|
"path": "testimonials-grid/index.ts",
|
|
14
14
|
"type": "registry:index",
|
|
15
15
|
"target": "$modules$/testimonials-grid/index.ts",
|
|
16
|
-
"content": "export * from './testimonials-grid';\n"
|
|
16
|
+
"content": "export * from './testimonials-grid';\r\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "testimonials-grid/testimonials-grid.tsx",
|
|
20
20
|
"type": "registry:component",
|
|
21
21
|
"target": "$modules$/testimonials-grid/testimonials-grid.tsx",
|
|
22
|
-
"content": "import { Star, Quote } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"@/lib/utils\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\n\ninterface TestimonialsGridProps {\n className?: string;\n}\n\nexport function TestimonialsGrid({ className }: TestimonialsGridProps) {\n const { t } = useTranslation(\"testimonials-grid\");\n\n const testimonials = [\n {\n id: 1,\n name: t(\"testimonial1Name\", \"Alex Thompson\"),\n role: t(\"testimonial1Role\", \"CEO at TechStart\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial1Review\", \"Incredible experience from start to finish. The team went above and beyond to ensure we got exactly what we needed. Would highly recommend.\"),\n rating: 5,\n },\n {\n id: 2,\n name: t(\"testimonial2Name\", \"Maria Garcia\"),\n role: t(\"testimonial2Role\", \"Marketing Director\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial2Review\", \"The attention to detail is remarkable. Every aspect of the product shows careful thought and excellent execution. Our team loves it.\"),\n rating: 5,\n },\n {\n id: 3,\n name: t(\"testimonial3Name\", \"David Kim\"),\n role: t(\"testimonial3Role\", \"Lead Developer\"),\n image: \"/images/placeholder.png\",\n review: t(\"testimonial3Review\", \"As a developer, I appreciate clean code and good documentation. This delivers on both fronts. Integration was seamless and support was excellent.\"),\n rating: 5,\n },\n ];\n\n return (\n <section className={cn(\"py-16 md:py-24 bg-muted/30\", className)}>\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl font-bold md:text-4xl mb-4\">\n {t(\"title\", \"Trusted by Industry Leaders\")}\n </h2>\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\n {t(\"subtitle\", \"See what professionals across various industries have to say about working with us.\")}\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 {testimonials.map((testimonial) => (\n <Card key={testimonial.id} className=\"relative overflow-hidden\">\n <CardContent className=\"pt-6\">\n {/* Quote Icon */}\n <Quote className=\"h-8 w-8 text-primary/20 mb-4\" />\n\n {/* Review */}\n <p className=\"text-muted-foreground mb-6 leading-relaxed\">\n \"{testimonial.review}\"\n </p>\n\n {/* Rating */}\n <div className=\"flex items-center gap-1 mb-4\">\n {[...Array(5)].map((_, index) => (\n <Star\n key={index}\n className={cn(\n \"h-4 w-4\",\n index < testimonial.rating\n ? \"fill-yellow-400 text-yellow-400\"\n : \"fill-muted text-muted\"\n )}\n />\n ))}\n </div>\n\n {/* Author */}\n <div className=\"flex items-center gap-3 pt-4 border-t\">\n <Avatar className=\"h-10 w-10\">\n <AvatarImage\n src={testimonial.image}\n alt={testimonial.name}\n />\n <AvatarFallback>\n {testimonial.name.charAt(0)}\n </AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-semibold text-sm\">{testimonial.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {testimonial.role}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </section>\n );\n}\n"
|
|
22
|
+
"content": "import { Star, Quote } from \"lucide-react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Card, CardContent } from \"@/components/ui/card\";\r\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\";\r\n\r\ninterface TestimonialsGridProps {\r\n className?: string;\r\n}\r\n\r\nexport function TestimonialsGrid({ className }: TestimonialsGridProps) {\r\n const { t } = useTranslation(\"testimonials-grid\");\r\n\r\n const testimonials = [\r\n {\r\n id: 1,\r\n name: t(\"testimonial1Name\", \"Alex Thompson\"),\r\n role: t(\"testimonial1Role\", \"CEO at TechStart\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial1Review\", \"Incredible experience from start to finish. The team went above and beyond to ensure we got exactly what we needed. Would highly recommend.\"),\r\n rating: 5,\r\n },\r\n {\r\n id: 2,\r\n name: t(\"testimonial2Name\", \"Maria Garcia\"),\r\n role: t(\"testimonial2Role\", \"Marketing Director\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial2Review\", \"The attention to detail is remarkable. Every aspect of the product shows careful thought and excellent execution. Our team loves it.\"),\r\n rating: 5,\r\n },\r\n {\r\n id: 3,\r\n name: t(\"testimonial3Name\", \"David Kim\"),\r\n role: t(\"testimonial3Role\", \"Lead Developer\"),\r\n image: \"/images/placeholder.png\",\r\n review: t(\"testimonial3Review\", \"As a developer, I appreciate clean code and good documentation. This delivers on both fronts. Integration was seamless and support was excellent.\"),\r\n rating: 5,\r\n },\r\n ];\r\n\r\n return (\r\n <section className={cn(\"py-16 md:py-24 bg-muted/30\", className)}>\r\n <div className=\"w-full max-w-[var(--container-max-width)] mx-auto px-4\">\r\n <div className=\"text-center mb-12\">\r\n <h2 className=\"text-3xl font-bold md:text-4xl mb-4\">\r\n {t(\"title\", \"Trusted by Industry Leaders\")}\r\n </h2>\r\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\r\n {t(\"subtitle\", \"See what professionals across various industries have to say about working with us.\")}\r\n </p>\r\n </div>\r\n\r\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-6xl mx-auto\">\r\n {testimonials.map((testimonial) => (\r\n <Card key={testimonial.id} className=\"relative overflow-hidden\">\r\n <CardContent className=\"pt-6\">\r\n {/* Quote Icon */}\r\n <Quote className=\"h-8 w-8 text-primary/20 mb-4\" />\r\n\r\n {/* Review */}\r\n <p className=\"text-muted-foreground mb-6 leading-relaxed\">\r\n \"{testimonial.review}\"\r\n </p>\r\n\r\n {/* Rating */}\r\n <div className=\"flex items-center gap-1 mb-4\">\r\n {[...Array(5)].map((_, index) => (\r\n <Star\r\n key={index}\r\n className={cn(\r\n \"h-4 w-4\",\r\n index < testimonial.rating\r\n ? \"fill-yellow-400 text-yellow-400\"\r\n : \"fill-muted text-muted\"\r\n )}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Author */}\r\n <div className=\"flex items-center gap-3 pt-4 border-t\">\r\n <Avatar className=\"h-10 w-10\">\r\n <AvatarImage\r\n src={testimonial.image}\r\n alt={testimonial.name}\r\n />\r\n <AvatarFallback>\r\n {testimonial.name.charAt(0)}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div>\r\n <p className=\"font-semibold text-sm\">{testimonial.name}</p>\r\n <p className=\"text-xs text-muted-foreground\">\r\n {testimonial.role}\r\n </p>\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n ))}\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"path": "testimonials-grid/lang/en.json",
|
|
26
26
|
"type": "registry:lang",
|
|
27
27
|
"target": "$modules$/testimonials-grid/lang/en.json",
|
|
28
|
-
"content": "{\n \"title\": \"What People Say\",\n \"subtitle\": \"Real feedback from our satisfied customers.\",\n \"testimonial1Name\": \"Customer Name\",\n \"testimonial1Role\": \"Position, Company\",\n \"testimonial1Review\": \"Add customer testimonial here. Include specific details about results achieved and positive experiences.\",\n \"testimonial2Name\": \"Client Name\",\n \"testimonial2Role\": \"Position, Company\",\n \"testimonial2Review\": \"Customer testimonial showcasing a different benefit or use case.\",\n \"testimonial3Name\": \"User Name\",\n \"testimonial3Role\": \"Position, Company\",\n \"testimonial3Review\": \"Testimonial highlighting overall satisfaction or unexpected benefits.\"\n}"
|
|
28
|
+
"content": "{\r\n \"title\": \"What People Say\",\r\n \"subtitle\": \"Real feedback from our satisfied customers.\",\r\n \"testimonial1Name\": \"Customer Name\",\r\n \"testimonial1Role\": \"Position, Company\",\r\n \"testimonial1Review\": \"Add customer testimonial here. Include specific details about results achieved and positive experiences.\",\r\n \"testimonial2Name\": \"Client Name\",\r\n \"testimonial2Role\": \"Position, Company\",\r\n \"testimonial2Review\": \"Customer testimonial showcasing a different benefit or use case.\",\r\n \"testimonial3Name\": \"User Name\",\r\n \"testimonial3Role\": \"Position, Company\",\r\n \"testimonial3Review\": \"Testimonial highlighting overall satisfaction or unexpected benefits.\"\r\n}"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "testimonials-grid/lang/tr.json",
|
|
32
32
|
"type": "registry:lang",
|
|
33
33
|
"target": "$modules$/testimonials-grid/lang/tr.json",
|
|
34
|
-
"content": "{\n \"title\": \"İnsanların Yorumları\",\n \"subtitle\": \"Memnun müşterilerimizden gerçek geri bildirimler.\",\n \"testimonial1Name\": \"Kullanıcı Adı\",\n \"testimonial1Role\": \"Pozisyon, Şirket\",\n \"testimonial1Review\": \"Buraya müşteri yorumu eklenecek. Elde edilen sonuçlar ve olumlu deneyimler hakkında özel detaylar içermeli.\",\n \"testimonial2Name\": \"Müşteri Adı\",\n \"testimonial2Role\": \"Pozisyon, Şirket\",\n \"testimonial2Review\": \"Farklı bir faydayı veya kullanım durumunu sergileyen müşteri referansı.\",\n \"testimonial3Name\": \"Uzman Adı\",\n \"testimonial3Role\": \"Pozisyon, Şirket\",\n \"testimonial3Review\": \"Genel memnuniyeti veya şaşırtıcı bir faydayı vurgulayan referans.\"\n}"
|
|
34
|
+
"content": "{\r\n \"title\": \"İnsanların Yorumları\",\r\n \"subtitle\": \"Memnun müşterilerimizden gerçek geri bildirimler.\",\r\n \"testimonial1Name\": \"Kullanıcı Adı\",\r\n \"testimonial1Role\": \"Pozisyon, Şirket\",\r\n \"testimonial1Review\": \"Buraya müşteri yorumu eklenecek. Elde edilen sonuçlar ve olumlu deneyimler hakkında özel detaylar içermeli.\",\r\n \"testimonial2Name\": \"Müşteri Adı\",\r\n \"testimonial2Role\": \"Pozisyon, Şirket\",\r\n \"testimonial2Review\": \"Farklı bir faydayı veya kullanım durumunu sergileyen müşteri referansı.\",\r\n \"testimonial3Name\": \"Uzman Adı\",\r\n \"testimonial3Role\": \"Pozisyon, Şirket\",\r\n \"testimonial3Review\": \"Genel memnuniyeti veya şaşırtıcı bir faydayı vurgulayan referans.\"\r\n}"
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"exports": {
|
|
@@ -13,25 +13,25 @@
|
|
|
13
13
|
"path": "timeline-section/timeline-section.tsx",
|
|
14
14
|
"type": "registry:component",
|
|
15
15
|
"target": "$modules$/timeline-section/timeline-section.tsx",
|
|
16
|
-
"content": "\"use client\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { cn } from \"@/lib/utils\";\nimport { FadeIn } from \"@/modules/animations\";\n\ninterface TimelineItem {\n year: string;\n title: string;\n description: string;\n icon?: React.ReactNode;\n}\n\ninterface TimelineSectionProps {\n items?: TimelineItem[];\n title?: string;\n subtitle?: string;\n className?: string;\n}\n\nconst defaultIcon = (\n <svg\n className=\"w-5 h-5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n);\n\nexport function TimelineSection({\n items,\n title,\n subtitle,\n className,\n}: TimelineSectionProps) {\n const { t } = useTranslation(\"timeline-section\");\n\n const displayTitle = title ?? t(\"title\");\n const displaySubtitle = subtitle ?? t(\"subtitle\");\n\n const defaultItems: TimelineItem[] = [\n {\n year: t(\"items.0.year\"),\n title: t(\"items.0.title\"),\n description: t(\"items.0.description\"),\n },\n {\n year: t(\"items.1.year\"),\n title: t(\"items.1.title\"),\n description: t(\"items.1.description\"),\n },\n {\n year: t(\"items.2.year\"),\n title: t(\"items.2.title\"),\n description: t(\"items.2.description\"),\n },\n {\n year: t(\"items.3.year\"),\n title: t(\"items.3.title\"),\n description: t(\"items.3.description\"),\n },\n ];\n\n const displayItems = items ?? defaultItems;\n\n return (\n <section className={cn(\"py-16 md:py-24\", className)}>\n <div className=\"container max-w-[var(--container-max-width)] mx-auto px-4\">\n {/* Header */}\n <FadeIn className=\"text-center mb-12 md:mb-16\">\n <h2 className=\"text-3xl md:text-4xl font-bold mb-4\">{displayTitle}</h2>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {displaySubtitle}\n </p>\n </FadeIn>\n\n {/* Timeline */}\n <div className=\"relative\">\n {/* Center line */}\n <div className=\"absolute left-4 md:left-1/2 top-0 bottom-0 w-0.5 bg-border md:-translate-x-1/2\" />\n\n <div className=\"space-y-8 md:space-y-12\">\n {displayItems.map((item, index) => (\n <FadeIn\n key={index}\n delay={index * 0.1}\n className={cn(\n \"relative pl-12 md:pl-0\",\n \"md:grid md:grid-cols-2 md:gap-8\",\n index % 2 === 0 ? \"md:text-right\" : \"\"\n )}\n >\n {/* Year badge - Mobile */}\n <div className=\"absolute left-0 top-0 md:hidden\">\n <div className=\"w-8 h-8 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-xs font-bold\">\n {item.icon || defaultIcon}\n </div>\n </div>\n\n {/* Content - Left side on desktop (for even items) */}\n <div\n className={cn(\n \"md:pr-8\",\n index % 2 === 0 ? \"md:block\" : \"md:hidden\"\n )}\n >\n <div className=\"bg-card border border-border rounded-xl p-6 shadow-sm\">\n <span className=\"inline-block text-sm font-semibold text-primary mb-2\">\n {item.year}\n </span>\n <h3 className=\"text-xl font-bold mb-2\">{item.title}</h3>\n <p className=\"text-muted-foreground\">{item.description}</p>\n </div>\n </div>\n\n {/* Center icon - Desktop only */}\n <div className=\"hidden md:block absolute left-1/2 top-6 -translate-x-1/2 z-10\">\n <div className=\"w-10 h-10 rounded-full bg-primary text-primary-foreground flex items-center justify-center shadow-lg\">\n {item.icon || defaultIcon}\n </div>\n </div>\n\n {/* Content - Right side on desktop (for odd items) */}\n <div\n className={cn(\n \"md:pl-8 md:text-left\",\n index % 2 === 0 ? \"md:hidden\" : \"md:block\"\n )}\n >\n <div className=\"bg-card border border-border rounded-xl p-6 shadow-sm md:hidden block\">\n <span className=\"inline-block text-sm font-semibold text-primary mb-2\">\n {item.year}\n </span>\n <h3 className=\"text-xl font-bold mb-2\">{item.title}</h3>\n <p className=\"text-muted-foreground\">{item.description}</p>\n </div>\n </div>\n\n {/* Empty space for grid alignment */}\n <div\n className={cn(\n \"hidden md:block\",\n index % 2 === 0 ? \"md:pl-8\" : \"md:pr-8\"\n )}\n >\n {index % 2 !== 0 && (\n <div className=\"bg-card border border-border rounded-xl p-6 shadow-sm\">\n <span className=\"inline-block text-sm font-semibold text-primary mb-2\">\n {item.year}\n </span>\n <h3 className=\"text-xl font-bold mb-2\">{item.title}</h3>\n <p className=\"text-muted-foreground\">{item.description}</p>\n </div>\n )}\n </div>\n </FadeIn>\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n}\n"
|
|
16
|
+
"content": "\"use client\";\r\n\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { FadeIn } from \"@/modules/animations\";\r\n\r\ninterface TimelineItem {\r\n year: string;\r\n title: string;\r\n description: string;\r\n icon?: React.ReactNode;\r\n}\r\n\r\ninterface TimelineSectionProps {\r\n items?: TimelineItem[];\r\n title?: string;\r\n subtitle?: string;\r\n className?: string;\r\n}\r\n\r\nconst defaultIcon = (\r\n <svg\r\n className=\"w-5 h-5\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <polyline points=\"12 6 12 12 16 14\" />\r\n </svg>\r\n);\r\n\r\nexport function TimelineSection({\r\n items,\r\n title,\r\n subtitle,\r\n className,\r\n}: TimelineSectionProps) {\r\n const { t } = useTranslation(\"timeline-section\");\r\n\r\n const displayTitle = title ?? t(\"title\");\r\n const displaySubtitle = subtitle ?? t(\"subtitle\");\r\n\r\n const defaultItems: TimelineItem[] = [\r\n {\r\n year: t(\"items.0.year\"),\r\n title: t(\"items.0.title\"),\r\n description: t(\"items.0.description\"),\r\n },\r\n {\r\n year: t(\"items.1.year\"),\r\n title: t(\"items.1.title\"),\r\n description: t(\"items.1.description\"),\r\n },\r\n {\r\n year: t(\"items.2.year\"),\r\n title: t(\"items.2.title\"),\r\n description: t(\"items.2.description\"),\r\n },\r\n {\r\n year: t(\"items.3.year\"),\r\n title: t(\"items.3.title\"),\r\n description: t(\"items.3.description\"),\r\n },\r\n ];\r\n\r\n const displayItems = items ?? defaultItems;\r\n\r\n return (\r\n <section className={cn(\"py-16 md:py-24\", className)}>\r\n <div className=\"container max-w-[var(--container-max-width)] mx-auto px-4\">\r\n {/* Header */}\r\n <FadeIn className=\"text-center mb-12 md:mb-16\">\r\n <h2 className=\"text-3xl md:text-4xl font-bold mb-4\">{displayTitle}</h2>\r\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\r\n {displaySubtitle}\r\n </p>\r\n </FadeIn>\r\n\r\n {/* Timeline */}\r\n <div className=\"relative\">\r\n {/* Center line */}\r\n <div className=\"absolute left-4 md:left-1/2 top-0 bottom-0 w-0.5 bg-border md:-translate-x-1/2\" />\r\n\r\n <div className=\"space-y-8 md:space-y-12\">\r\n {displayItems.map((item, index) => (\r\n <FadeIn\r\n key={index}\r\n delay={index * 0.1}\r\n className={cn(\r\n \"relative pl-12 md:pl-0\",\r\n \"md:grid md:grid-cols-2 md:gap-8\",\r\n index % 2 === 0 ? \"md:text-right\" : \"\"\r\n )}\r\n >\r\n {/* Year badge - Mobile */}\r\n <div className=\"absolute left-0 top-0 md:hidden\">\r\n <div className=\"w-8 h-8 rounded-full bg-primary text-primary-foreground flex items-center justify-center text-xs font-bold\">\r\n {item.icon || defaultIcon}\r\n </div>\r\n </div>\r\n\r\n {/* Content - Left side on desktop (for even items) */}\r\n <div\r\n className={cn(\r\n \"md:pr-8\",\r\n index % 2 === 0 ? \"md:block\" : \"md:hidden\"\r\n )}\r\n >\r\n <div className=\"bg-card border border-border rounded-xl p-6 shadow-sm\">\r\n <span className=\"inline-block text-sm font-semibold text-primary mb-2\">\r\n {item.year}\r\n </span>\r\n <h3 className=\"text-xl font-bold mb-2\">{item.title}</h3>\r\n <p className=\"text-muted-foreground\">{item.description}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Center icon - Desktop only */}\r\n <div className=\"hidden md:block absolute left-1/2 top-6 -translate-x-1/2 z-10\">\r\n <div className=\"w-10 h-10 rounded-full bg-primary text-primary-foreground flex items-center justify-center shadow-lg\">\r\n {item.icon || defaultIcon}\r\n </div>\r\n </div>\r\n\r\n {/* Content - Right side on desktop (for odd items) */}\r\n <div\r\n className={cn(\r\n \"md:pl-8 md:text-left\",\r\n index % 2 === 0 ? \"md:hidden\" : \"md:block\"\r\n )}\r\n >\r\n <div className=\"bg-card border border-border rounded-xl p-6 shadow-sm md:hidden block\">\r\n <span className=\"inline-block text-sm font-semibold text-primary mb-2\">\r\n {item.year}\r\n </span>\r\n <h3 className=\"text-xl font-bold mb-2\">{item.title}</h3>\r\n <p className=\"text-muted-foreground\">{item.description}</p>\r\n </div>\r\n </div>\r\n\r\n {/* Empty space for grid alignment */}\r\n <div\r\n className={cn(\r\n \"hidden md:block\",\r\n index % 2 === 0 ? \"md:pl-8\" : \"md:pr-8\"\r\n )}\r\n >\r\n {index % 2 !== 0 && (\r\n <div className=\"bg-card border border-border rounded-xl p-6 shadow-sm\">\r\n <span className=\"inline-block text-sm font-semibold text-primary mb-2\">\r\n {item.year}\r\n </span>\r\n <h3 className=\"text-xl font-bold mb-2\">{item.title}</h3>\r\n <p className=\"text-muted-foreground\">{item.description}</p>\r\n </div>\r\n )}\r\n </div>\r\n </FadeIn>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "timeline-section/index.ts",
|
|
20
20
|
"type": "registry:index",
|
|
21
21
|
"target": "$modules$/timeline-section/index.ts",
|
|
22
|
-
"content": "export * from \"./timeline-section\";\n"
|
|
22
|
+
"content": "export * from \"./timeline-section\";\r\n"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"path": "timeline-section/lang/en.json",
|
|
26
26
|
"type": "registry:lang",
|
|
27
27
|
"target": "$modules$/timeline-section/lang/en.json",
|
|
28
|
-
"content": "{\n \"title\": \"Our Journey\",\n \"subtitle\": \"Customize these milestones with Promake based on your company history.\",\n \"items\": [\n {\n \"year\": \"2020\",\n \"title\": \"Company Founded\",\n \"description\": \"Started with a vision to revolutionize the industry.\"\n },\n {\n \"year\": \"2021\",\n \"title\": \"First Major Milestone\",\n \"description\": \"Reached 10,000 customers and expanded the team.\"\n },\n {\n \"year\": \"2022\",\n \"title\": \"Global Expansion\",\n \"description\": \"Opened offices in 5 new countries across 3 continents.\"\n },\n {\n \"year\": \"2023\",\n \"title\": \"Industry Recognition\",\n \"description\": \"Won multiple awards for innovation and customer satisfaction.\"\n }\n ]\n}\n"
|
|
28
|
+
"content": "{\r\n \"title\": \"Our Journey\",\r\n \"subtitle\": \"Customize these milestones with Promake based on your company history.\",\r\n \"items\": [\r\n {\r\n \"year\": \"2020\",\r\n \"title\": \"Company Founded\",\r\n \"description\": \"Started with a vision to revolutionize the industry.\"\r\n },\r\n {\r\n \"year\": \"2021\",\r\n \"title\": \"First Major Milestone\",\r\n \"description\": \"Reached 10,000 customers and expanded the team.\"\r\n },\r\n {\r\n \"year\": \"2022\",\r\n \"title\": \"Global Expansion\",\r\n \"description\": \"Opened offices in 5 new countries across 3 continents.\"\r\n },\r\n {\r\n \"year\": \"2023\",\r\n \"title\": \"Industry Recognition\",\r\n \"description\": \"Won multiple awards for innovation and customer satisfaction.\"\r\n }\r\n ]\r\n}\r\n"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "timeline-section/lang/tr.json",
|
|
32
32
|
"type": "registry:lang",
|
|
33
33
|
"target": "$modules$/timeline-section/lang/tr.json",
|
|
34
|
-
"content": "{\n \"title\": \"Yolculuğumuz\",\n \"subtitle\": \"Bu kilometre taşlarını şirket geçmişinize göre Promake ile özelleştirin.\",\n \"items\": [\n {\n \"year\": \"2020\",\n \"title\": \"Şirket Kuruldu\",\n \"description\": \"Sektörü dönüştürme vizyonuyla yola çıktık.\"\n },\n {\n \"year\": \"2021\",\n \"title\": \"İlk Büyük Başarı\",\n \"description\": \"10.000 müşteriye ulaştık ve ekibimizi genişlettik.\"\n },\n {\n \"year\": \"2022\",\n \"title\": \"Global Genişleme\",\n \"description\": \"3 kıtada 5 yeni ülkede ofis açtık.\"\n },\n {\n \"year\": \"2023\",\n \"title\": \"Sektör Takdiri\",\n \"description\": \"İnovasyon ve müşteri memnuniyeti alanında birçok ödül kazandık.\"\n }\n ]\n}\n"
|
|
34
|
+
"content": "{\r\n \"title\": \"Yolculuğumuz\",\r\n \"subtitle\": \"Bu kilometre taşlarını şirket geçmişinize göre Promake ile özelleştirin.\",\r\n \"items\": [\r\n {\r\n \"year\": \"2020\",\r\n \"title\": \"Şirket Kuruldu\",\r\n \"description\": \"Sektörü dönüştürme vizyonuyla yola çıktık.\"\r\n },\r\n {\r\n \"year\": \"2021\",\r\n \"title\": \"İlk Büyük Başarı\",\r\n \"description\": \"10.000 müşteriye ulaştık ve ekibimizi genişlettik.\"\r\n },\r\n {\r\n \"year\": \"2022\",\r\n \"title\": \"Global Genişleme\",\r\n \"description\": \"3 kıtada 5 yeni ülkede ofis açtık.\"\r\n },\r\n {\r\n \"year\": \"2023\",\r\n \"title\": \"Sektör Takdiri\",\r\n \"description\": \"İnovasyon ve müşteri memnuniyeti alanında birçok ödül kazandık.\"\r\n }\r\n ]\r\n}\r\n"
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"exports": {
|
|
@@ -12,25 +12,25 @@
|
|
|
12
12
|
"path": "video-hero/index.ts",
|
|
13
13
|
"type": "registry:index",
|
|
14
14
|
"target": "$modules$/video-hero/index.ts",
|
|
15
|
-
"content": "export { VideoHero } from \"./video-hero\";\n"
|
|
15
|
+
"content": "export { VideoHero } from \"./video-hero\";\r\n"
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"path": "video-hero/video-hero.tsx",
|
|
19
19
|
"type": "registry:block",
|
|
20
20
|
"target": "$modules$/video-hero/video-hero.tsx",
|
|
21
|
-
"content": "import { Link } from \"react-router\";\nimport { useTranslation } from \"react-i18next\";\nimport { Play, ArrowRight } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport { FadeIn } from \"@/modules/animations\";\n\ninterface VideoHeroProps {\n videoSrc?: string;\n posterSrc?: string;\n className?: string;\n}\n\nexport function VideoHero({\n videoSrc = \"https://assets.mixkit.co/videos/preview/mixkit-clouds-and-blue-sky-2408-large.mp4\",\n posterSrc = \"/images/placeholder.png\",\n className,\n}: VideoHeroProps) {\n const { t } = useTranslation(\"video-hero\");\n\n return (\n <section className={cn(\"relative min-h-[600px] md:min-h-[700px] lg:min-h-screen flex items-center overflow-hidden\", className)}>\n {/* Video Background */}\n <div className=\"absolute inset-0 z-0\">\n <video\n autoPlay\n muted\n loop\n playsInline\n poster={posterSrc}\n className=\"w-full h-full object-cover\"\n >\n <source src={videoSrc} type=\"video/mp4\" />\n </video>\n {/* Overlay */}\n <div className=\"absolute inset-0 bg-gradient-to-r from-background/95 via-background/80 to-background/60\" />\n <div className=\"absolute inset-0 bg-gradient-to-t from-background via-transparent to-transparent\" />\n </div>\n\n {/* Content */}\n <div className=\"relative z-10 w-full max-w-[var(--container-max-width)] mx-auto px-4 py-20\">\n <div className=\"max-w-2xl\">\n <FadeIn>\n <span className=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-medium mb-6\">\n <Play className=\"h-4 w-4\" />\n {t(\"badge\", \"Watch the Story\")}\n </span>\n </FadeIn>\n\n <FadeIn delay={0.1}>\n <h1 className=\"text-4xl md:text-5xl lg:text-6xl xl:text-7xl font-bold text-foreground mb-6 leading-tight\">\n {t(\"heading\", \"Experience the Future of Innovation\")}\n </h1>\n </FadeIn>\n\n <FadeIn delay={0.2}>\n <p className=\"text-lg md:text-xl text-muted-foreground mb-8 max-w-xl\">\n {t(\"description\", \"Discover how our cutting-edge solutions are transforming industries and creating new possibilities for businesses worldwide.\")}\n </p>\n </FadeIn>\n\n <FadeIn delay={0.3}>\n <div className=\"flex flex-col sm:flex-row gap-4\">\n <Button asChild size=\"lg\" className=\"text-base\">\n <Link to=\"/register\">\n {t(\"primaryCta\", \"Get Started\")}\n <ArrowRight className=\"ml-2 h-5 w-5\" />\n </Link>\n </Button>\n <Button asChild variant=\"outline\" size=\"lg\" className=\"text-base bg-background/50 backdrop-blur-sm\">\n <Link to=\"/about\">\n {t(\"secondaryCta\", \"Learn More\")}\n </Link>\n </Button>\n </div>\n </FadeIn>\n\n {/* Stats */}\n <FadeIn delay={0.4}>\n <div className=\"flex flex-wrap gap-8 mt-12 pt-8 border-t border-border/50\">\n <div>\n <div className=\"text-3xl md:text-4xl font-bold text-foreground\">10K+</div>\n <div className=\"text-sm text-muted-foreground\">{t(\"stat1\", \"Active Users\")}</div>\n </div>\n <div>\n <div className=\"text-3xl md:text-4xl font-bold text-foreground\">98%</div>\n <div className=\"text-sm text-muted-foreground\">{t(\"stat2\", \"Satisfaction\")}</div>\n </div>\n <div>\n <div className=\"text-3xl md:text-4xl font-bold text-foreground\">24/7</div>\n <div className=\"text-sm text-muted-foreground\">{t(\"stat3\", \"Support\")}</div>\n </div>\n </div>\n </FadeIn>\n </div>\n </div>\n\n </section>\n );\n}\n"
|
|
21
|
+
"content": "import { Link } from \"react-router\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Play, ArrowRight } from \"lucide-react\";\r\nimport { Button } from \"@/components/ui/button\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { FadeIn } from \"@/modules/animations\";\r\n\r\ninterface VideoHeroProps {\r\n videoSrc?: string;\r\n posterSrc?: string;\r\n className?: string;\r\n}\r\n\r\nexport function VideoHero({\r\n videoSrc = \"https://assets.mixkit.co/videos/preview/mixkit-clouds-and-blue-sky-2408-large.mp4\",\r\n posterSrc = \"/images/placeholder.png\",\r\n className,\r\n}: VideoHeroProps) {\r\n const { t } = useTranslation(\"video-hero\");\r\n\r\n return (\r\n <section className={cn(\"relative min-h-[600px] md:min-h-[700px] lg:min-h-screen flex items-center overflow-hidden\", className)}>\r\n {/* Video Background */}\r\n <div className=\"absolute inset-0 z-0\">\r\n <video\r\n autoPlay\r\n muted\r\n loop\r\n playsInline\r\n poster={posterSrc}\r\n className=\"w-full h-full object-cover\"\r\n >\r\n <source src={videoSrc} type=\"video/mp4\" />\r\n </video>\r\n {/* Overlay */}\r\n <div className=\"absolute inset-0 bg-gradient-to-r from-background/95 via-background/80 to-background/60\" />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-background via-transparent to-transparent\" />\r\n </div>\r\n\r\n {/* Content */}\r\n <div className=\"relative z-10 w-full max-w-[var(--container-max-width)] mx-auto px-4 py-20\">\r\n <div className=\"max-w-2xl\">\r\n <FadeIn>\r\n <span className=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-medium mb-6\">\r\n <Play className=\"h-4 w-4\" />\r\n {t(\"badge\", \"Watch the Story\")}\r\n </span>\r\n </FadeIn>\r\n\r\n <FadeIn delay={0.1}>\r\n <h1 className=\"text-4xl md:text-5xl lg:text-6xl xl:text-7xl font-bold text-foreground mb-6 leading-tight\">\r\n {t(\"heading\", \"Experience the Future of Innovation\")}\r\n </h1>\r\n </FadeIn>\r\n\r\n <FadeIn delay={0.2}>\r\n <p className=\"text-lg md:text-xl text-muted-foreground mb-8 max-w-xl\">\r\n {t(\"description\", \"Discover how our cutting-edge solutions are transforming industries and creating new possibilities for businesses worldwide.\")}\r\n </p>\r\n </FadeIn>\r\n\r\n <FadeIn delay={0.3}>\r\n <div className=\"flex flex-col sm:flex-row gap-4\">\r\n <Button asChild size=\"lg\" className=\"text-base\">\r\n <Link to=\"/register\">\r\n {t(\"primaryCta\", \"Get Started\")}\r\n <ArrowRight className=\"ml-2 h-5 w-5\" />\r\n </Link>\r\n </Button>\r\n <Button asChild variant=\"outline\" size=\"lg\" className=\"text-base bg-background/50 backdrop-blur-sm\">\r\n <Link to=\"/about\">\r\n {t(\"secondaryCta\", \"Learn More\")}\r\n </Link>\r\n </Button>\r\n </div>\r\n </FadeIn>\r\n\r\n {/* Stats */}\r\n <FadeIn delay={0.4}>\r\n <div className=\"flex flex-wrap gap-8 mt-12 pt-8 border-t border-border/50\">\r\n <div>\r\n <div className=\"text-3xl md:text-4xl font-bold text-foreground\">10K+</div>\r\n <div className=\"text-sm text-muted-foreground\">{t(\"stat1\", \"Active Users\")}</div>\r\n </div>\r\n <div>\r\n <div className=\"text-3xl md:text-4xl font-bold text-foreground\">98%</div>\r\n <div className=\"text-sm text-muted-foreground\">{t(\"stat2\", \"Satisfaction\")}</div>\r\n </div>\r\n <div>\r\n <div className=\"text-3xl md:text-4xl font-bold text-foreground\">24/7</div>\r\n <div className=\"text-sm text-muted-foreground\">{t(\"stat3\", \"Support\")}</div>\r\n </div>\r\n </div>\r\n </FadeIn>\r\n </div>\r\n </div>\r\n\r\n </section>\r\n );\r\n}\r\n"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "video-hero/lang/en.json",
|
|
25
25
|
"type": "registry:lang",
|
|
26
26
|
"target": "$modules$/video-hero/lang/en.json",
|
|
27
|
-
"content": "{\n \"badge\": \"Watch the Story\",\n \"heading\": \"Your Headline Here\",\n \"description\": \"This text appears over your video background. It should be concise yet compelling, clearly stating your value proposition. Use Promake to craft a message that works well with your video content.\",\n \"primaryCta\": \"Get Started\",\n \"secondaryCta\": \"Learn More\",\n \"stat1\": \"Active Users\",\n \"stat2\": \"Satisfaction\",\n \"stat3\": \"Support\"\n}\n"
|
|
27
|
+
"content": "{\r\n \"badge\": \"Watch the Story\",\r\n \"heading\": \"Your Headline Here\",\r\n \"description\": \"This text appears over your video background. It should be concise yet compelling, clearly stating your value proposition. Use Promake to craft a message that works well with your video content.\",\r\n \"primaryCta\": \"Get Started\",\r\n \"secondaryCta\": \"Learn More\",\r\n \"stat1\": \"Active Users\",\r\n \"stat2\": \"Satisfaction\",\r\n \"stat3\": \"Support\"\r\n}\r\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "video-hero/lang/tr.json",
|
|
31
31
|
"type": "registry:lang",
|
|
32
32
|
"target": "$modules$/video-hero/lang/tr.json",
|
|
33
|
-
"content": "{\n \"badge\": \"Hikayeyi İzle\",\n \"heading\": \"İnovasyonun Geleceğini Deneyimleyin\",\n \"description\": \"Bu metin video arka planınızın üzerinde görünür. Kısa ama etkili olmalı, değer önerinizi net bir şekilde belirtmelidir. Promake ile video içeriğinizle uyumlu bir mesaj oluşturun.\",\n \"primaryCta\": \"Başlayın\",\n \"secondaryCta\": \"Daha Fazla Bilgi\",\n \"stat1\": \"Aktif Kullanıcı\",\n \"stat2\": \"Memnuniyet\",\n \"stat3\": \"Destek\"\n}\n"
|
|
33
|
+
"content": "{\r\n \"badge\": \"Hikayeyi İzle\",\r\n \"heading\": \"İnovasyonun Geleceğini Deneyimleyin\",\r\n \"description\": \"Bu metin video arka planınızın üzerinde görünür. Kısa ama etkili olmalı, değer önerinizi net bir şekilde belirtmelidir. Promake ile video içeriğinizle uyumlu bir mesaj oluşturun.\",\r\n \"primaryCta\": \"Başlayın\",\r\n \"secondaryCta\": \"Daha Fazla Bilgi\",\r\n \"stat1\": \"Aktif Kullanıcı\",\r\n \"stat2\": \"Memnuniyet\",\r\n \"stat3\": \"Destek\"\r\n}\r\n"
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"exports": {
|