@promakeai/cli 0.0.5
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 +212 -0
- package/dist/registry/about-page.json +45 -0
- package/dist/registry/about-section.json +40 -0
- package/dist/registry/animations.json +69 -0
- package/dist/registry/bento-grid-section.json +42 -0
- package/dist/registry/blog-core.json +74 -0
- package/dist/registry/blog-list-page.json +48 -0
- package/dist/registry/blog-section.json +43 -0
- package/dist/registry/cards-carousel-section.json +46 -0
- package/dist/registry/cart-drawer.json +43 -0
- package/dist/registry/cart-page.json +47 -0
- package/dist/registry/category-section.json +43 -0
- package/dist/registry/checkout-page.json +47 -0
- package/dist/registry/contact-info-grid.json +40 -0
- package/dist/registry/contact-page-centered.json +50 -0
- package/dist/registry/contact-page-map-overlay.json +54 -0
- package/dist/registry/contact-page-map-split.json +54 -0
- package/dist/registry/contact-page-split.json +49 -0
- package/dist/registry/contact-page.json +45 -0
- package/dist/registry/content-section.json +40 -0
- package/dist/registry/cookies-page.json +45 -0
- package/dist/registry/cta-section.json +40 -0
- package/dist/registry/docs/about-page.md +32 -0
- package/dist/registry/docs/about-section.md +33 -0
- package/dist/registry/docs/animations.md +44 -0
- package/dist/registry/docs/bento-grid-section.md +40 -0
- package/dist/registry/docs/blog-core.md +37 -0
- package/dist/registry/docs/blog-list-page.md +38 -0
- package/dist/registry/docs/blog-section.md +39 -0
- package/dist/registry/docs/cards-carousel-section.md +39 -0
- package/dist/registry/docs/cart-drawer.md +42 -0
- package/dist/registry/docs/cart-page.md +37 -0
- package/dist/registry/docs/category-section.md +34 -0
- package/dist/registry/docs/checkout-page.md +38 -0
- package/dist/registry/docs/contact-info-grid.md +33 -0
- package/dist/registry/docs/contact-page-centered.md +41 -0
- package/dist/registry/docs/contact-page-map-overlay.md +44 -0
- package/dist/registry/docs/contact-page-map-split.md +44 -0
- package/dist/registry/docs/contact-page-split.md +40 -0
- package/dist/registry/docs/contact-page.md +33 -0
- package/dist/registry/docs/content-section.md +35 -0
- package/dist/registry/docs/cookies-page.md +32 -0
- package/dist/registry/docs/cta-section.md +32 -0
- package/dist/registry/docs/ecommerce-core.md +41 -0
- package/dist/registry/docs/empty-page.md +31 -0
- package/dist/registry/docs/faq-categorized.md +38 -0
- package/dist/registry/docs/faq-simple.md +38 -0
- package/dist/registry/docs/favorites-blog-block.md +38 -0
- package/dist/registry/docs/favorites-ecommerce-block.md +38 -0
- package/dist/registry/docs/feature-section.md +33 -0
- package/dist/registry/docs/featured-products.md +38 -0
- package/dist/registry/docs/footer-detailed.md +33 -0
- package/dist/registry/docs/footer-minimal.md +32 -0
- package/dist/registry/docs/footer.md +32 -0
- package/dist/registry/docs/google-map.md +36 -0
- package/dist/registry/docs/header-centered-pill.md +37 -0
- package/dist/registry/docs/header-ecommerce.md +38 -0
- package/dist/registry/docs/header-mega.md +40 -0
- package/dist/registry/docs/header-minimal.md +38 -0
- package/dist/registry/docs/header-simple.md +32 -0
- package/dist/registry/docs/hero-cta.md +38 -0
- package/dist/registry/docs/hero-gradient.md +33 -0
- package/dist/registry/docs/hero-grid.md +40 -0
- package/dist/registry/docs/hero-profile.md +33 -0
- package/dist/registry/docs/hero.md +32 -0
- package/dist/registry/docs/login-page-split.md +40 -0
- package/dist/registry/docs/login-page.md +39 -0
- package/dist/registry/docs/newsletter-section.md +40 -0
- package/dist/registry/docs/order-card-compact.md +37 -0
- package/dist/registry/docs/order-detail-block.md +37 -0
- package/dist/registry/docs/orders-list-block.md +40 -0
- package/dist/registry/docs/payment-success-block.md +32 -0
- package/dist/registry/docs/post-card.md +37 -0
- package/dist/registry/docs/post-detail-block.md +37 -0
- package/dist/registry/docs/pricing-card.md +37 -0
- package/dist/registry/docs/pricing-section.md +39 -0
- package/dist/registry/docs/privacy-page.md +32 -0
- package/dist/registry/docs/product-card-detailed.md +42 -0
- package/dist/registry/docs/product-card-hover.md +35 -0
- package/dist/registry/docs/product-card.md +37 -0
- package/dist/registry/docs/product-detail-block.md +37 -0
- package/dist/registry/docs/product-detail-section.md +45 -0
- package/dist/registry/docs/products-page.md +39 -0
- package/dist/registry/docs/related-posts-block.md +38 -0
- package/dist/registry/docs/related-products-block.md +38 -0
- package/dist/registry/docs/service-card.md +34 -0
- package/dist/registry/docs/skill-card.md +33 -0
- package/dist/registry/docs/terms-page.md +32 -0
- package/dist/registry/docs/testimonials-carousel.md +40 -0
- package/dist/registry/docs/testimonials-grid.md +39 -0
- package/dist/registry/ecommerce-core.json +95 -0
- package/dist/registry/empty-page.json +45 -0
- package/dist/registry/faq-categorized.json +42 -0
- package/dist/registry/faq-simple.json +42 -0
- package/dist/registry/favorites-blog-block.json +43 -0
- package/dist/registry/favorites-ecommerce-block.json +43 -0
- package/dist/registry/feature-section.json +40 -0
- package/dist/registry/featured-products.json +43 -0
- package/dist/registry/footer-detailed.json +43 -0
- package/dist/registry/footer-minimal.json +40 -0
- package/dist/registry/footer.json +40 -0
- package/dist/registry/google-map.json +31 -0
- package/dist/registry/header-centered-pill.json +45 -0
- package/dist/registry/header-ecommerce.json +42 -0
- package/dist/registry/header-mega.json +47 -0
- package/dist/registry/header-minimal.json +45 -0
- package/dist/registry/header-simple.json +43 -0
- package/dist/registry/hero-cta.json +42 -0
- package/dist/registry/hero-gradient.json +40 -0
- package/dist/registry/hero-grid.json +42 -0
- package/dist/registry/hero-profile.json +62 -0
- package/dist/registry/hero.json +40 -0
- package/dist/registry/index.json +70 -0
- package/dist/registry/login-page-split.json +47 -0
- package/dist/registry/login-page.json +49 -0
- package/dist/registry/newsletter-section.json +44 -0
- package/dist/registry/order-card-compact.json +42 -0
- package/dist/registry/order-detail-block.json +42 -0
- package/dist/registry/orders-list-block.json +45 -0
- package/dist/registry/payment-success-block.json +40 -0
- package/dist/registry/post-card.json +42 -0
- package/dist/registry/post-detail-block.json +42 -0
- package/dist/registry/pricing-card.json +40 -0
- package/dist/registry/pricing-section.json +43 -0
- package/dist/registry/privacy-page.json +45 -0
- package/dist/registry/product-card-detailed.json +45 -0
- package/dist/registry/product-card-hover.json +40 -0
- package/dist/registry/product-card.json +42 -0
- package/dist/registry/product-detail-block.json +42 -0
- package/dist/registry/product-detail-section.json +46 -0
- package/dist/registry/products-page.json +48 -0
- package/dist/registry/related-posts-block.json +43 -0
- package/dist/registry/related-products-block.json +43 -0
- package/dist/registry/service-card.json +28 -0
- package/dist/registry/skill-card.json +28 -0
- package/dist/registry/terms-page.json +45 -0
- package/dist/registry/testimonials-carousel.json +44 -0
- package/dist/registry/testimonials-grid.json +43 -0
- package/package.json +52 -0
- package/template/.env +6 -0
- package/template/.prettierignore +3 -0
- package/template/.prettierrc +1 -0
- package/template/README.md +73 -0
- package/template/bun.lock +1007 -0
- package/template/components.json +22 -0
- package/template/eslint.config.js +32 -0
- package/template/index.html +285 -0
- package/template/package.json +92 -0
- package/template/promake.json +6 -0
- package/template/public/_redirects +1 -0
- package/template/public/data/database.db +0 -0
- package/template/public/favicon.svg +1 -0
- package/template/public/images/placeholder.png +0 -0
- package/template/public/robots.txt +14 -0
- package/template/scripts/init-db.ts +131 -0
- package/template/src/App.tsx +33 -0
- package/template/src/components/Footer.tsx +100 -0
- package/template/src/components/Header.tsx +79 -0
- package/template/src/components/Hero.tsx +69 -0
- package/template/src/components/LanguageSwitcher.tsx +47 -0
- package/template/src/components/Layout.tsx +25 -0
- package/template/src/components/Logo.tsx +64 -0
- package/template/src/components/ThemeSwitcher.tsx +58 -0
- package/template/src/components/ui/accordion.tsx +64 -0
- package/template/src/components/ui/alert-dialog.tsx +155 -0
- package/template/src/components/ui/alert.tsx +66 -0
- package/template/src/components/ui/aspect-ratio.tsx +11 -0
- package/template/src/components/ui/avatar.tsx +51 -0
- package/template/src/components/ui/badge.tsx +46 -0
- package/template/src/components/ui/breadcrumb.tsx +109 -0
- package/template/src/components/ui/button-group.tsx +83 -0
- package/template/src/components/ui/button.tsx +62 -0
- package/template/src/components/ui/calendar.tsx +220 -0
- package/template/src/components/ui/card.tsx +92 -0
- package/template/src/components/ui/carousel.tsx +239 -0
- package/template/src/components/ui/chart.tsx +357 -0
- package/template/src/components/ui/checkbox.tsx +32 -0
- package/template/src/components/ui/collapsible.tsx +31 -0
- package/template/src/components/ui/command.tsx +182 -0
- package/template/src/components/ui/context-menu.tsx +252 -0
- package/template/src/components/ui/dialog.tsx +141 -0
- package/template/src/components/ui/drawer.tsx +135 -0
- package/template/src/components/ui/dropdown-menu.tsx +255 -0
- package/template/src/components/ui/empty.tsx +104 -0
- package/template/src/components/ui/field.tsx +246 -0
- package/template/src/components/ui/form.tsx +168 -0
- package/template/src/components/ui/hover-card.tsx +44 -0
- package/template/src/components/ui/input-group.tsx +170 -0
- package/template/src/components/ui/input-otp.tsx +75 -0
- package/template/src/components/ui/input.tsx +21 -0
- package/template/src/components/ui/item.tsx +193 -0
- package/template/src/components/ui/kbd.tsx +28 -0
- package/template/src/components/ui/label.tsx +24 -0
- package/template/src/components/ui/menubar.tsx +274 -0
- package/template/src/components/ui/navigation-menu.tsx +168 -0
- package/template/src/components/ui/pagination.tsx +127 -0
- package/template/src/components/ui/popover.tsx +48 -0
- package/template/src/components/ui/progress.tsx +29 -0
- package/template/src/components/ui/radio-group.tsx +45 -0
- package/template/src/components/ui/resizable.tsx +54 -0
- package/template/src/components/ui/scroll-area.tsx +58 -0
- package/template/src/components/ui/select.tsx +188 -0
- package/template/src/components/ui/separator.tsx +28 -0
- package/template/src/components/ui/sheet.tsx +137 -0
- package/template/src/components/ui/sidebar.tsx +726 -0
- package/template/src/components/ui/skeleton.tsx +13 -0
- package/template/src/components/ui/slider.tsx +63 -0
- package/template/src/components/ui/sonner.tsx +38 -0
- package/template/src/components/ui/spinner.tsx +16 -0
- package/template/src/components/ui/switch.tsx +31 -0
- package/template/src/components/ui/table.tsx +114 -0
- package/template/src/components/ui/tabs.tsx +66 -0
- package/template/src/components/ui/textarea.tsx +18 -0
- package/template/src/components/ui/toggle-group.tsx +81 -0
- package/template/src/components/ui/toggle.tsx +45 -0
- package/template/src/components/ui/tooltip.tsx +61 -0
- package/template/src/constants/constants.json +58 -0
- package/template/src/hooks/use-is-mobile.ts +21 -0
- package/template/src/hooks/use-page-title.ts +49 -0
- package/template/src/hooks/use-theme.ts +57 -0
- package/template/src/index.css +128 -0
- package/template/src/lang/en/about.json +4 -0
- package/template/src/lang/en/contact.json +39 -0
- package/template/src/lang/en/cookies.json +4 -0
- package/template/src/lang/en/footer.json +12 -0
- package/template/src/lang/en/forgotPassword.json +37 -0
- package/template/src/lang/en/header.json +10 -0
- package/template/src/lang/en/hero.json +8 -0
- package/template/src/lang/en/index.json +30 -0
- package/template/src/lang/en/login.json +18 -0
- package/template/src/lang/en/notfound.json +7 -0
- package/template/src/lang/en/privacy.json +4 -0
- package/template/src/lang/en/register.json +25 -0
- package/template/src/lang/en/terms.json +4 -0
- package/template/src/lang/index.ts +86 -0
- package/template/src/lang/tr/about.json +4 -0
- package/template/src/lang/tr/contact.json +39 -0
- package/template/src/lang/tr/cookies.json +4 -0
- package/template/src/lang/tr/footer.json +12 -0
- package/template/src/lang/tr/forgotPassword.json +37 -0
- package/template/src/lang/tr/header.json +10 -0
- package/template/src/lang/tr/hero.json +8 -0
- package/template/src/lang/tr/index.json +30 -0
- package/template/src/lang/tr/login.json +18 -0
- package/template/src/lang/tr/notfound.json +7 -0
- package/template/src/lang/tr/privacy.json +4 -0
- package/template/src/lang/tr/register.json +25 -0
- package/template/src/lang/tr/terms.json +4 -0
- package/template/src/lib/api.ts +237 -0
- package/template/src/lib/storage.ts +109 -0
- package/template/src/lib/utils.ts +15 -0
- package/template/src/main.tsx +13 -0
- package/template/src/modules/api/USAGE.md +515 -0
- package/template/src/modules/api/customer-client.ts +20 -0
- package/template/src/modules/api/get-error-message.ts +18 -0
- package/template/src/modules/api/validation/en.json +29 -0
- package/template/src/modules/api/validation/tr.json +29 -0
- package/template/src/modules/auth/USAGE.md +248 -0
- package/template/src/modules/auth/auth-header-menu.tsx +123 -0
- package/template/src/modules/auth/auth-store.ts +57 -0
- package/template/src/modules/auth/forgot-password-page.tsx +371 -0
- package/template/src/modules/auth/login-page.tsx +183 -0
- package/template/src/modules/auth/register-page.tsx +252 -0
- package/template/src/modules/auth/use-auth.ts +273 -0
- package/template/src/modules/db/adapters/IDataAdapter.ts +26 -0
- package/template/src/modules/db/adapters/SqliteAdapter.ts +364 -0
- package/template/src/modules/db/adapters/index.ts +2 -0
- package/template/src/modules/db/config.ts +59 -0
- package/template/src/modules/db/core/DataManager.ts +125 -0
- package/template/src/modules/db/core/types.ts +101 -0
- package/template/src/modules/db/index.ts +42 -0
- package/template/src/modules/db/react/QueryProvider.tsx +16 -0
- package/template/src/modules/db/react/index.ts +23 -0
- package/template/src/modules/db/react/queryClient.ts +64 -0
- package/template/src/modules/db/react/useRepository.ts +400 -0
- package/template/src/modules/db/utils/parsers.ts +96 -0
- package/template/src/pages/Index.tsx +108 -0
- package/template/src/pages/NotFound.tsx +35 -0
- package/template/src/router.tsx +14 -0
- package/template/src/types/index.ts +0 -0
- package/template/src/vite-env.d.ts +1 -0
- package/template/tsconfig.app.json +32 -0
- package/template/tsconfig.json +17 -0
- package/template/tsconfig.node.json +26 -0
- package/template/vite.config.ts +74 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "related-posts-block",
|
|
3
|
+
"type": "registry:block",
|
|
4
|
+
"title": "Related Posts Block",
|
|
5
|
+
"description": "Related posts section with heading and 3-column grid. Shows posts by same category or tags. Use at bottom of post detail pages.",
|
|
6
|
+
"registryDependencies": [
|
|
7
|
+
"blog-core",
|
|
8
|
+
"post-card"
|
|
9
|
+
],
|
|
10
|
+
"usage": "import { RelatedPostsBlock } from '@/modules/related-posts-block';\n\n<RelatedPostsBlock posts={relatedPosts} />\n\n• Props: posts (Post[] from blog-core)\n• Uses PostCard component\n• Responsive: 3 cols desktop, 1 col mobile",
|
|
11
|
+
"files": [
|
|
12
|
+
{
|
|
13
|
+
"path": "related-posts-block/index.ts",
|
|
14
|
+
"type": "registry:index",
|
|
15
|
+
"target": "$modules$/related-posts-block/index.ts",
|
|
16
|
+
"content": "export * from './related-posts-block';\r\n"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"path": "related-posts-block/related-posts-block.tsx",
|
|
20
|
+
"type": "registry:block",
|
|
21
|
+
"target": "$modules$/related-posts-block/related-posts-block.tsx",
|
|
22
|
+
"content": "import { PostCard } from \"@/modules/post-card/post-card\";\nimport { useTranslation } from \"react-i18next\";\nimport type { Post } from \"@/modules/blog-core/types\";\n\ninterface RelatedPostsBlockProps {\n posts: Post[];\n title?: string;\n}\n\nexport function RelatedPostsBlock({ posts, title }: RelatedPostsBlockProps) {\n const { t } = useTranslation(\"related-posts-block\");\n\n if (posts.length === 0) {\n return null;\n }\n\n return (\n <div className=\"container mx-auto px-4 py-12\">\n <div className=\"max-w-6xl mx-auto\">\n <h2 className=\"text-3xl font-bold mb-8\">\n {title || t(\"title\", \"Related Posts\")}\n </h2>\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {posts.map((post) => (\n <PostCard key={post.id} post={post} layout=\"grid\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "related-posts-block/lang/en.json",
|
|
26
|
+
"type": "registry:lang",
|
|
27
|
+
"target": "$modules$/related-posts-block/lang/en.json",
|
|
28
|
+
"content": "{\n \"title\": \"Related Posts\"\n}\n"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "related-posts-block/lang/tr.json",
|
|
32
|
+
"type": "registry:lang",
|
|
33
|
+
"target": "$modules$/related-posts-block/lang/tr.json",
|
|
34
|
+
"content": "{\n \"title\": \"İlgili Yazılar\"\n}\n"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"exports": {
|
|
38
|
+
"types": [],
|
|
39
|
+
"variables": [
|
|
40
|
+
"RelatedPostsBlock"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "related-products-block",
|
|
3
|
+
"type": "registry:block",
|
|
4
|
+
"title": "Related Products Block",
|
|
5
|
+
"description": "Related/recommended products section with heading and horizontal scrollable grid. Shows 4 products on desktop, swipeable on mobile. Use on product detail pages.",
|
|
6
|
+
"registryDependencies": [
|
|
7
|
+
"ecommerce-core",
|
|
8
|
+
"product-card"
|
|
9
|
+
],
|
|
10
|
+
"usage": "import { RelatedProductsBlock } from '@/modules/related-products-block';\n\n<RelatedProductsBlock products={relatedProducts} />\n\n• Props: products (Product[] from ecommerce-core)\n• Uses ProductCard component\n• Responsive: 4 cols desktop, scrollable mobile",
|
|
11
|
+
"files": [
|
|
12
|
+
{
|
|
13
|
+
"path": "related-products-block/index.ts",
|
|
14
|
+
"type": "registry:index",
|
|
15
|
+
"target": "$modules$/related-products-block/index.ts",
|
|
16
|
+
"content": "export * from './related-products-block';\r\n"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"path": "related-products-block/related-products-block.tsx",
|
|
20
|
+
"type": "registry:block",
|
|
21
|
+
"target": "$modules$/related-products-block/related-products-block.tsx",
|
|
22
|
+
"content": "import { Link } from \"react-router\";\nimport { Star } from \"lucide-react\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { useTranslation } from \"react-i18next\";\nimport constants from \"@/constants/constants.json\";\nimport { formatPrice } from \"@/modules/ecommerce-core/format-price\";\nimport type { Product } from \"@/modules/ecommerce-core/types\";\n\ninterface RelatedProductsBlockProps {\n products: Product[];\n title?: string;\n}\n\nexport function RelatedProductsBlock({\n products,\n title,\n}: RelatedProductsBlockProps) {\n const { t } = useTranslation(\"related-products-block\");\n\n if (products.length === 0) {\n return null;\n }\n\n return (\n <div>\n <h2 className=\"text-2xl font-bold mb-6\">\n {title || t(\"title\", \"Related Products\")}\n </h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6\">\n {products.map((product) => (\n <Card\n key={product.id}\n className=\"group overflow-hidden border-0 p-0 shadow-sm hover:shadow-lg transition-all duration-300\"\n >\n <Link to={`/products/${product.slug}`}>\n <div className=\"relative aspect-square overflow-hidden cursor-pointer\">\n <img\n src={product.images[0] || \"/images/placeholder.png\"}\n alt={product.name}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n />\n </div>\n </Link>\n <CardContent className=\"p-4\">\n <Link to={`/products/${product.slug}`}>\n <h3 className=\"font-semibold hover:text-primary transition-colors line-clamp-1\">\n {product.name}\n </h3>\n </Link>\n <div className=\"flex items-center justify-between mt-2\">\n <span className=\"font-semibold\">\n {formatPrice(product.price, constants.site.currency)}\n </span>\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-current text-yellow-400\" />\n <span className=\"text-xs\">{product.rating}</span>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "related-products-block/lang/en.json",
|
|
26
|
+
"type": "registry:lang",
|
|
27
|
+
"target": "$modules$/related-products-block/lang/en.json",
|
|
28
|
+
"content": "{\n \"title\": \"Related Products\"\n}\n"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "related-products-block/lang/tr.json",
|
|
32
|
+
"type": "registry:lang",
|
|
33
|
+
"target": "$modules$/related-products-block/lang/tr.json",
|
|
34
|
+
"content": "{\n \"title\": \"İlgili Ürünler\"\n}\n"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"exports": {
|
|
38
|
+
"types": [],
|
|
39
|
+
"variables": [
|
|
40
|
+
"RelatedProductsBlock"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "service-card",
|
|
3
|
+
"type": "registry:component",
|
|
4
|
+
"title": "Service Card",
|
|
5
|
+
"description": "Service/offering display card with large icon, service title, description text, and optional 'Learn More' link. Features hover lift effect, subtle border, and icon background circle. Great for displaying services, features, or benefits in a grid layout.",
|
|
6
|
+
"registryDependencies": [],
|
|
7
|
+
"usage": "import { ServiceCard } from '@/modules/service-card';\n\n<ServiceCard\n icon={<CodeIcon />}\n title=\"Web Development\"\n description=\"Custom web applications...\"\n link=\"/services/web\"\n/>\n\n• Installed at: src/modules/service-card/\n• Use in grid: grid grid-cols-1 md:grid-cols-3 gap-6",
|
|
8
|
+
"files": [
|
|
9
|
+
{
|
|
10
|
+
"path": "service-card/index.ts",
|
|
11
|
+
"type": "registry:index",
|
|
12
|
+
"target": "$modules$/service-card/index.ts",
|
|
13
|
+
"content": "export * from './service-card';\r\n"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"path": "service-card/service-card.tsx",
|
|
17
|
+
"type": "registry:component",
|
|
18
|
+
"target": "$modules$/service-card/service-card.tsx",
|
|
19
|
+
"content": "import { Card } from \"@/components/ui/card\";\nimport {\n Globe,\n Pen,\n Smartphone,\n Code,\n Palette,\n Server,\n Shield,\n Zap,\n Users,\n Mail,\n Settings,\n BarChart,\n type LucideIcon\n} from \"lucide-react\";\n\ninterface Service {\n id: string | number;\n title: string;\n description: string;\n icon: string;\n}\n\ninterface ServiceCardProps {\n service: Service;\n className?: string;\n}\n\nconst iconMap: Record<string, LucideIcon> = {\n globe: Globe,\n pen: Pen,\n smartphone: Smartphone,\n code: Code,\n palette: Palette,\n server: Server,\n shield: Shield,\n zap: Zap,\n users: Users,\n mail: Mail,\n settings: Settings,\n chart: BarChart,\n};\n\nexport function ServiceCard({ service, className = '' }: ServiceCardProps) {\n const IconComponent = iconMap[service.icon] || Globe;\n\n return (\n <Card className={`group overflow-hidden border-0 shadow-md transition-all duration-300 bg-background/80 backdrop-blur-sm hover:shadow-lg ${className}`}>\n <div className=\"p-8 text-center\">\n <div className=\"w-16 h-16 mx-auto mb-6 bg-primary/10 rounded-full flex items-center justify-center transition-colors group-hover:bg-primary/20\">\n <IconComponent className=\"w-8 h-8 text-primary\" />\n </div>\n\n <h3 className=\"text-xl font-bold text-foreground mb-4 transition-colors\">\n {service.title}\n </h3>\n\n <p className=\"text-muted-foreground leading-relaxed\">\n {service.description}\n </p>\n </div>\n </Card>\n );\n}\n"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"exports": {
|
|
23
|
+
"types": [],
|
|
24
|
+
"variables": [
|
|
25
|
+
"ServiceCard"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skill-card",
|
|
3
|
+
"type": "registry:component",
|
|
4
|
+
"title": "Skill Card",
|
|
5
|
+
"description": "Portfolio skill display card with icon/logo, skill name, proficiency level (percentage or text), and animated progress bar. Progress bar animates on scroll into view. Supports different sizes (sm, md, lg) and color variants. Perfect for showcasing technical skills in portfolios.",
|
|
6
|
+
"registryDependencies": [],
|
|
7
|
+
"usage": "import { SkillCard } from '@/modules/skill-card';\n\n<SkillCard\n name=\"React\"\n icon={<ReactIcon />}\n level={90}\n/>\n\n• Installed at: src/modules/skill-card/\n• Use in grid: grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
8
|
+
"files": [
|
|
9
|
+
{
|
|
10
|
+
"path": "skill-card/index.ts",
|
|
11
|
+
"type": "registry:index",
|
|
12
|
+
"target": "$modules$/skill-card/index.ts",
|
|
13
|
+
"content": "export * from './skill-card';\r\n"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"path": "skill-card/skill-card.tsx",
|
|
17
|
+
"type": "registry:component",
|
|
18
|
+
"target": "$modules$/skill-card/skill-card.tsx",
|
|
19
|
+
"content": "import { cn } from \"@/lib/utils\";\n\ninterface Skill {\n id: string | number;\n name: string;\n percentage: number;\n icon?: React.ReactNode;\n}\n\ninterface SkillCardProps {\n skill: Skill;\n className?: string;\n}\n\n// Get gradient based on percentage\nfunction getGradientClass(percentage: number): string {\n if (percentage >= 90) return \"from-emerald-500 to-cyan-500\";\n if (percentage >= 75) return \"from-blue-500 to-indigo-500\";\n if (percentage >= 60) return \"from-violet-500 to-purple-500\";\n if (percentage >= 40) return \"from-orange-500 to-amber-500\";\n return \"from-rose-500 to-pink-500\";\n}\n\nexport function SkillCard({ skill, className = \"\" }: SkillCardProps) {\n const radius = 40;\n const circumference = 2 * Math.PI * radius;\n const strokeDashoffset = circumference - (skill.percentage / 100) * circumference;\n const gradientClass = getGradientClass(skill.percentage);\n\n return (\n <div\n className={cn(\n \"group relative overflow-hidden rounded-2xl p-6 transition-all duration-500\",\n \"hover:scale-105 hover:shadow-2xl hover:shadow-primary/20\",\n \"bg-gradient-to-br\",\n gradientClass,\n className\n )}\n >\n {/* Glow effect on hover */}\n <div className=\"absolute inset-0 bg-white/10 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" />\n\n {/* Circular Progress */}\n <div className=\"relative flex items-center justify-center mb-4\">\n <svg className=\"w-24 h-24 transform -rotate-90\" viewBox=\"0 0 100 100\">\n {/* Background circle */}\n <circle\n cx=\"50\"\n cy=\"50\"\n r={radius}\n fill=\"none\"\n stroke=\"rgba(255,255,255,0.2)\"\n strokeWidth=\"8\"\n />\n {/* Progress circle */}\n <circle\n cx=\"50\"\n cy=\"50\"\n r={radius}\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"8\"\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n className=\"transition-all duration-1000 ease-out\"\n />\n </svg>\n\n {/* Percentage in center */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <span className=\"text-2xl font-bold text-white drop-shadow-lg\">\n {skill.percentage}%\n </span>\n </div>\n </div>\n\n {/* Icon (if provided) */}\n {skill.icon && (\n <div className=\"flex justify-center mb-3 text-white/90\">\n {skill.icon}\n </div>\n )}\n\n {/* Skill Name */}\n <h3 className=\"text-center text-lg font-semibold text-white drop-shadow-md\">\n {skill.name}\n </h3>\n\n {/* Decorative elements */}\n <div className=\"absolute -top-12 -right-12 w-24 h-24 bg-white/10 rounded-full blur-2xl group-hover:scale-150 transition-transform duration-700\" />\n <div className=\"absolute -bottom-8 -left-8 w-20 h-20 bg-white/10 rounded-full blur-xl group-hover:scale-150 transition-transform duration-700\" />\n </div>\n );\n}\n"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"exports": {
|
|
23
|
+
"types": [],
|
|
24
|
+
"variables": [
|
|
25
|
+
"SkillCard"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "terms-page",
|
|
3
|
+
"type": "registry:page",
|
|
4
|
+
"title": "Terms of Service Page",
|
|
5
|
+
"description": "Terms of service/use page with numbered sections covering account terms, acceptable use, intellectual property, disclaimers, limitation of liability, and termination. Includes table of contents, collapsible sections, and professional legal formatting. Last updated date and acceptance notice included.",
|
|
6
|
+
"registryDependencies": [],
|
|
7
|
+
"usage": "import { TermsPage } from '@/modules/terms-page';\n\n<Route path=\"/terms\" element={<TermsPage />} />\n\n• Legal terms structure with numbered sections\n• Sections: account, use, IP, liability, termination\n• Edit content in lang/en.json",
|
|
8
|
+
"route": {
|
|
9
|
+
"path": "/terms",
|
|
10
|
+
"componentName": "TermsPage"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
{
|
|
14
|
+
"path": "terms-page/index.ts",
|
|
15
|
+
"type": "registry:index",
|
|
16
|
+
"target": "$modules$/terms-page/index.ts",
|
|
17
|
+
"content": "export * from './terms-page';\r\nexport { TermsPage as default } from './terms-page';\r\n"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "terms-page/terms-page.tsx",
|
|
21
|
+
"type": "registry:page",
|
|
22
|
+
"target": "$modules$/terms-page/terms-page.tsx",
|
|
23
|
+
"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 { FileText, Scale, AlertTriangle, Ban, RefreshCw, Gavel } from \"lucide-react\";\nimport { FadeIn, StaggerContainer, StaggerItem } from \"@/modules/animations\";\n\nexport function TermsPage() {\n const { t } = useTranslation(\"terms-page\");\n usePageTitle({ title: t(\"title\") });\n\n const sections = [\n { icon: FileText, titleKey: \"acceptanceTitle\", contentKey: \"acceptanceContent\" },\n { icon: Scale, titleKey: \"licenseTitle\", contentKey: \"licenseContent\" },\n { icon: AlertTriangle, titleKey: \"restrictionsTitle\", contentKey: \"restrictionsContent\" },\n { icon: Ban, titleKey: \"terminationTitle\", contentKey: \"terminationContent\" },\n { icon: RefreshCw, titleKey: \"changesTitle\", contentKey: \"changesContent\" },\n { icon: Gavel, titleKey: \"governingTitle\", contentKey: \"governingContent\" },\n ];\n\n return (\n <Layout>\n <div className=\"min-h-screen bg-muted/30 py-12\">\n <div className=\"container mx-auto px-4\">\n {/* Header */}\n <FadeIn className=\"text-center mb-12\">\n <div className=\"w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4\">\n <FileText className=\"w-8 h-8 text-primary\" />\n </div>\n <h1 className=\"text-4xl font-bold text-foreground mb-4\">\n {t(\"title\")}\n </h1>\n <p className=\"text-muted-foreground\">\n {t(\"lastUpdated\")}: {t(\"updateDate\")}\n </p>\n </FadeIn>\n\n {/* Introduction */}\n <FadeIn delay={0.1} className=\"max-w-4xl mx-auto mb-12\">\n <Card>\n <CardContent className=\"p-8\">\n <p className=\"text-muted-foreground leading-relaxed\">\n {t(\"introduction\")}\n </p>\n </CardContent>\n </Card>\n </FadeIn>\n\n {/* Sections */}\n <StaggerContainer className=\"max-w-4xl mx-auto space-y-6\">\n {sections.map(({ icon: Icon, titleKey, contentKey }, index) => (\n <StaggerItem key={titleKey}>\n <Card>\n <CardContent className=\"p-8\">\n <div className=\"flex items-start gap-4\">\n <div className=\"w-10 h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Icon className=\"w-5 h-5 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-xl font-semibold mb-3\">\n {index + 1}. {t(titleKey)}\n </h2>\n <p className=\"text-muted-foreground\">{t(contentKey)}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </StaggerItem>\n ))}\n </StaggerContainer>\n\n {/* Footer Note */}\n <FadeIn className=\"max-w-4xl mx-auto mt-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">{t(\"footerNote\")}</p>\n </FadeIn>\n </div>\n </div>\n </Layout>\n );\n}\n\nexport default TermsPage;\n"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"path": "terms-page/lang/en.json",
|
|
27
|
+
"type": "registry:lang",
|
|
28
|
+
"target": "$modules$/terms-page/lang/en.json",
|
|
29
|
+
"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"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"path": "terms-page/lang/tr.json",
|
|
33
|
+
"type": "registry:lang",
|
|
34
|
+
"target": "$modules$/terms-page/lang/tr.json",
|
|
35
|
+
"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"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"exports": {
|
|
39
|
+
"types": [],
|
|
40
|
+
"variables": [
|
|
41
|
+
"TermsPage",
|
|
42
|
+
"default"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "testimonials-carousel",
|
|
3
|
+
"type": "registry:component",
|
|
4
|
+
"title": "Testimonials Carousel",
|
|
5
|
+
"description": "Carousel-based testimonials section using Embla Carousel. Features customer cards with avatar, name, role, review text, and star ratings. Includes dot navigation and arrow controls. Responsive design shows 1-3 cards based on screen size.",
|
|
6
|
+
"registryDependencies": [
|
|
7
|
+
"carousel",
|
|
8
|
+
"card",
|
|
9
|
+
"avatar"
|
|
10
|
+
],
|
|
11
|
+
"usage": "import { TestimonialsCarousel } from '@/modules/testimonials-carousel';\n\n<TestimonialsCarousel />\n\n- Embla carousel with loop\n- Dot pagination controls\n- Star ratings\n- Responsive 1-3 column layout",
|
|
12
|
+
"files": [
|
|
13
|
+
{
|
|
14
|
+
"path": "testimonials-carousel/index.ts",
|
|
15
|
+
"type": "registry:index",
|
|
16
|
+
"target": "$modules$/testimonials-carousel/index.ts",
|
|
17
|
+
"content": "export * from './testimonials-carousel';\r\n"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "testimonials-carousel/testimonials-carousel.tsx",
|
|
21
|
+
"type": "registry:component",
|
|
22
|
+
"target": "$modules$/testimonials-carousel/testimonials-carousel.tsx",
|
|
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=\"container 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
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"path": "testimonials-carousel/lang/en.json",
|
|
27
|
+
"type": "registry:lang",
|
|
28
|
+
"target": "$modules$/testimonials-carousel/lang/en.json",
|
|
29
|
+
"content": "{\r\n \"title\": \"What Our Customers Say\",\r\n \"subtitle\": \"AI will customize this subtitle based on your testimonials section purpose.\",\r\n \"testimonial1Name\": \"Customer Name\",\r\n \"testimonial1Role\": \"AI will replace this with appropriate job title\",\r\n \"testimonial1Review\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. AI will replace this testimonial with relevant customer feedback based on your site.\",\r\n \"testimonial2Name\": \"Client Name\",\r\n \"testimonial2Role\": \"This role will be customized by AI\",\r\n \"testimonial2Review\": \"This is placeholder testimonial text. AI will generate appropriate customer reviews based on your service or product offerings.\",\r\n \"testimonial3Name\": \"Testimonial Name\",\r\n \"testimonial3Role\": \"Replace with customer role\",\r\n \"testimonial3Review\": \"Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. AI will customize this review to match your project context.\",\r\n \"testimonial4Name\": \"Reviewer Name\",\r\n \"testimonial4Role\": \"AI will customize this role\",\r\n \"testimonial4Review\": \"Placeholder customer testimonial. AI will replace this with contextually appropriate feedback based on your industry and services.\"\r\n}\r\n"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"path": "testimonials-carousel/lang/tr.json",
|
|
33
|
+
"type": "registry:lang",
|
|
34
|
+
"target": "$modules$/testimonials-carousel/lang/tr.json",
|
|
35
|
+
"content": "{\r\n \"title\": \"Müşterilerimiz Ne Diyor\",\r\n \"subtitle\": \"AI bu alt başlığı referanslar bölümünüzün amacına göre özelleştirecektir.\",\r\n \"testimonial1Name\": \"Müşteri Adı\",\r\n \"testimonial1Role\": \"AI bunu uygun iş unvanıyla değiştirecektir\",\r\n \"testimonial1Review\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. AI bu referansı sitenize göre ilgili müşteri geri bildirimleriyle değiştirecektir.\",\r\n \"testimonial2Name\": \"Müşteri Adı\",\r\n \"testimonial2Role\": \"Bu rol AI tarafından özelleştirilecektir\",\r\n \"testimonial2Review\": \"Bu placeholder referans metnidir. AI hizmet veya ürün tekliflerinize göre uygun müşteri yorumları üretecektir.\",\r\n \"testimonial3Name\": \"Referans Adı\",\r\n \"testimonial3Role\": \"Müşteri rolüyle değiştirin\",\r\n \"testimonial3Review\": \"Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. AI bu yorumu proje bağlamınıza uyacak şekilde özelleştirecektir.\",\r\n \"testimonial4Name\": \"Yorumcu Adı\",\r\n \"testimonial4Role\": \"AI bu rolü özelleştirecektir\",\r\n \"testimonial4Review\": \"Placeholder müşteri referansı. AI bunu hedef kitlenize ve içeriğinize göre bağlamsal olarak uygun geri bildirimlerle değiştirecektir.\"\r\n}\r\n"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"exports": {
|
|
39
|
+
"types": [],
|
|
40
|
+
"variables": [
|
|
41
|
+
"TestimonialsCarousel"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "testimonials-grid",
|
|
3
|
+
"type": "registry:component",
|
|
4
|
+
"title": "Testimonials Grid",
|
|
5
|
+
"description": "Static 3-column grid testimonials section without carousel. Features quote icon, review text, star ratings, and author info with avatar. Simple, clean design with subtle background. Great for landing pages and about pages.",
|
|
6
|
+
"registryDependencies": [
|
|
7
|
+
"card",
|
|
8
|
+
"avatar"
|
|
9
|
+
],
|
|
10
|
+
"usage": "import { TestimonialsGrid } from '@/modules/testimonials-grid';\n\n<TestimonialsGrid />\n\n- Static 3-column grid\n- Quote icon decoration\n- Star ratings\n- No JavaScript carousel needed",
|
|
11
|
+
"files": [
|
|
12
|
+
{
|
|
13
|
+
"path": "testimonials-grid/index.ts",
|
|
14
|
+
"type": "registry:index",
|
|
15
|
+
"target": "$modules$/testimonials-grid/index.ts",
|
|
16
|
+
"content": "export * from './testimonials-grid';\r\n"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"path": "testimonials-grid/testimonials-grid.tsx",
|
|
20
|
+
"type": "registry:component",
|
|
21
|
+
"target": "$modules$/testimonials-grid/testimonials-grid.tsx",
|
|
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=\"container 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
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "testimonials-grid/lang/en.json",
|
|
26
|
+
"type": "registry:lang",
|
|
27
|
+
"target": "$modules$/testimonials-grid/lang/en.json",
|
|
28
|
+
"content": "{\r\n \"title\": \"What People Say\",\r\n \"subtitle\": \"AI will customize this subtitle to match your testimonials section.\",\r\n \"testimonial1Name\": \"Industry Leader Name\",\r\n \"testimonial1Role\": \"AI will replace with appropriate executive title\",\r\n \"testimonial1Review\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. AI will generate appropriate testimonial based on your site and audience.\",\r\n \"testimonial2Name\": \"Customer Name\",\r\n \"testimonial2Role\": \"This role will be customized by AI\",\r\n \"testimonial2Review\": \"Placeholder testimonial text. AI will replace this with relevant feedback based on your content or services.\",\r\n \"testimonial3Name\": \"Expert Name\",\r\n \"testimonial3Role\": \"Replace with expert role\",\r\n \"testimonial3Review\": \"Sed do eiusmod tempor incididunt ut labore. AI will customize this review to provide contextually appropriate testimonial content.\"\r\n}\r\n"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "testimonials-grid/lang/tr.json",
|
|
32
|
+
"type": "registry:lang",
|
|
33
|
+
"target": "$modules$/testimonials-grid/lang/tr.json",
|
|
34
|
+
"content": "{\r\n \"title\": \"İnsanların Yorumları\",\r\n \"subtitle\": \"AI bu alt başlığı referanslar bölümünüze uyacak şekilde özelleştirecektir.\",\r\n \"testimonial1Name\": \"Kullanıcı Adı\",\r\n \"testimonial1Role\": \"AI bunu uygun yönetici unvanıyla değiştirecektir\",\r\n \"testimonial1Review\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. AI sitenize ve hedef kitlenize göre uygun referans üretecektir.\",\r\n \"testimonial2Name\": \"Müşteri Adı\",\r\n \"testimonial2Role\": \"Bu rol AI tarafından özelleştirilecektir\",\r\n \"testimonial2Review\": \"Placeholder referans metni. AI bunu içerik veya hizmetlerinize göre ilgili geri bildirimlerle değiştirecektir.\",\r\n \"testimonial3Name\": \"Uzman Adı\",\r\n \"testimonial3Role\": \"Uzman rolüyle değiştirin\",\r\n \"testimonial3Review\": \"Sed do eiusmod tempor incididunt ut labore. AI bu yorumu bağlamsal olarak uygun referans içeriği sağlamak için özelleştirecektir.\"\r\n}\r\n"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"exports": {
|
|
38
|
+
"types": [],
|
|
39
|
+
"variables": [
|
|
40
|
+
"TestimonialsGrid"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@promakeai/cli",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"promake": "dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"dist/index.js",
|
|
10
|
+
"dist/registry",
|
|
11
|
+
"template"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"dev": "bun run src/index.ts",
|
|
15
|
+
"dev:app": "cd dev && bun run dev",
|
|
16
|
+
"dev:populate": "bun run scripts/populate-dev.ts",
|
|
17
|
+
"dev:fresh": "bun run dev:populate && bun run dev:app",
|
|
18
|
+
"playground:create": "rm -rf playground && bun run dev -- create playground --template empty --pm bun",
|
|
19
|
+
"playground:reset": "bun run playground:create",
|
|
20
|
+
"playground:add": "cd playground && bun run ../src/index.ts add",
|
|
21
|
+
"playground:ecommerce": "rm -rf playground && bun run dev -- create playground --template ecommerce --pm bun",
|
|
22
|
+
"build": "bun run build:cli && bun run build:registry",
|
|
23
|
+
"build:cli": "bun build src/index.ts --outdir dist --target node --minify",
|
|
24
|
+
"build:registry": "bun run scripts/build-registry.ts",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "bun run build",
|
|
27
|
+
"test": "bun test",
|
|
28
|
+
"test:watch": "bun test --watch",
|
|
29
|
+
"test:coverage": "bun test --coverage",
|
|
30
|
+
"release": "bun run build && npm publish --access public"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"adm-zip": "^0.5.16",
|
|
34
|
+
"archiver": "^7.0.1",
|
|
35
|
+
"chalk": "^5.3.0",
|
|
36
|
+
"commander": "^12.1.0",
|
|
37
|
+
"culori": "^4.0.2",
|
|
38
|
+
"fs-extra": "^11.2.0",
|
|
39
|
+
"glob": "^11.0.0",
|
|
40
|
+
"ora": "^8.1.1",
|
|
41
|
+
"prompts": "^2.4.2"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/archiver": "^7.0.0",
|
|
45
|
+
"@types/bun": "^1.1.14",
|
|
46
|
+
"@types/culori": "^4.0.1",
|
|
47
|
+
"@types/fs-extra": "^11.0.4",
|
|
48
|
+
"@types/node": "^22.10.2",
|
|
49
|
+
"@types/prompts": "^2.4.9",
|
|
50
|
+
"typescript": "^5.7.2"
|
|
51
|
+
}
|
|
52
|
+
}
|
package/template/.env
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
VITE_API_PAYMENT=https://payment.promake.ai/api/v1
|
|
2
|
+
VITE_TENANT_UUID="YWJjeHl6MTIzT0dVWkNBTg"
|
|
3
|
+
VITE_MAIL_SERVICE_URL="https://mail.promake.ai/api/v1/send-mail"
|
|
4
|
+
VITE_TENANT_MAIL="uc.erkut@gmail.com"
|
|
5
|
+
VITE_ONLINE_PAYMENT_METHODS="stripe,iyzico"
|
|
6
|
+
VITE_AVAILABLE_PAYMENT_METHODS="card,transfer,cash"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# React + TypeScript + Vite
|
|
2
|
+
|
|
3
|
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
|
4
|
+
|
|
5
|
+
Currently, two official plugins are available:
|
|
6
|
+
|
|
7
|
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
|
|
8
|
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
9
|
+
|
|
10
|
+
## React Compiler
|
|
11
|
+
|
|
12
|
+
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
|
|
13
|
+
|
|
14
|
+
## Expanding the ESLint configuration
|
|
15
|
+
|
|
16
|
+
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
export default defineConfig([
|
|
20
|
+
globalIgnores(["dist"]),
|
|
21
|
+
{
|
|
22
|
+
files: ["**/*.{ts,tsx}"],
|
|
23
|
+
extends: [
|
|
24
|
+
// Other configs...
|
|
25
|
+
|
|
26
|
+
// Remove tseslint.configs.recommended and replace with this
|
|
27
|
+
tseslint.configs.recommendedTypeChecked,
|
|
28
|
+
// Alternatively, use this for stricter rules
|
|
29
|
+
tseslint.configs.strictTypeChecked,
|
|
30
|
+
// Optionally, add this for stylistic rules
|
|
31
|
+
tseslint.configs.stylisticTypeChecked,
|
|
32
|
+
|
|
33
|
+
// Other configs...
|
|
34
|
+
],
|
|
35
|
+
languageOptions: {
|
|
36
|
+
parserOptions: {
|
|
37
|
+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
|
|
38
|
+
tsconfigRootDir: import.meta.dirname,
|
|
39
|
+
},
|
|
40
|
+
// other options...
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
]);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
// eslint.config.js
|
|
50
|
+
import reactX from "eslint-plugin-react-x";
|
|
51
|
+
import reactDom from "eslint-plugin-react-dom";
|
|
52
|
+
|
|
53
|
+
export default defineConfig([
|
|
54
|
+
globalIgnores(["dist"]),
|
|
55
|
+
{
|
|
56
|
+
files: ["**/*.{ts,tsx}"],
|
|
57
|
+
extends: [
|
|
58
|
+
// Other configs...
|
|
59
|
+
// Enable lint rules for React
|
|
60
|
+
reactX.configs["recommended-typescript"],
|
|
61
|
+
// Enable lint rules for React DOM
|
|
62
|
+
reactDom.configs.recommended,
|
|
63
|
+
],
|
|
64
|
+
languageOptions: {
|
|
65
|
+
parserOptions: {
|
|
66
|
+
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
|
|
67
|
+
tsconfigRootDir: import.meta.dirname,
|
|
68
|
+
},
|
|
69
|
+
// other options...
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
]);
|
|
73
|
+
```
|