@promakeai/cli 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/index.js +56 -56
  2. package/dist/registry/about-page.json +2 -2
  3. package/dist/registry/about-section.json +2 -2
  4. package/dist/registry/announcement-bar.json +1 -1
  5. package/dist/registry/blog-section.json +6 -4
  6. package/dist/registry/cart-drawer.json +5 -4
  7. package/dist/registry/case-study-page.json +2 -2
  8. package/dist/registry/coming-soon-page-minimal.json +1 -1
  9. package/dist/registry/coming-soon-page.json +1 -1
  10. package/dist/registry/contact-info-grid.json +2 -2
  11. package/dist/registry/contact-page-centered.json +2 -2
  12. package/dist/registry/contact-page-split.json +2 -2
  13. package/dist/registry/contact-page.json +2 -2
  14. package/dist/registry/cta-section.json +2 -2
  15. package/dist/registry/docs/blog-section.md +3 -1
  16. package/dist/registry/docs/cart-drawer.md +9 -9
  17. package/dist/registry/docs/favorites-blog-block.md +10 -3
  18. package/dist/registry/docs/favorites-blog-page.md +38 -0
  19. package/dist/registry/docs/favorites-ecommerce-block.md +10 -3
  20. package/dist/registry/docs/favorites-ecommerce-page.md +38 -0
  21. package/dist/registry/docs/google-adsense.md +38 -0
  22. package/dist/registry/docs/login-page.md +6 -16
  23. package/dist/registry/docs/payment-success-block.md +8 -1
  24. package/dist/registry/docs/post-detail-page.md +39 -0
  25. package/dist/registry/docs/product-card-detailed.md +7 -11
  26. package/dist/registry/docs/product-detail-page.md +39 -0
  27. package/dist/registry/docs/product-detail-section.md +7 -13
  28. package/dist/registry/docs/product-quick-view.md +4 -2
  29. package/dist/registry/docs/youtube-embed.md +42 -0
  30. package/dist/registry/faq-categorized.json +2 -2
  31. package/dist/registry/faq-simple.json +2 -2
  32. package/dist/registry/favorites-blog-block.json +1 -1
  33. package/dist/registry/favorites-blog-page.json +48 -0
  34. package/dist/registry/favorites-ecommerce-block.json +1 -1
  35. package/dist/registry/favorites-ecommerce-page.json +48 -0
  36. package/dist/registry/feature-section.json +2 -2
  37. package/dist/registry/footer.json +2 -2
  38. package/dist/registry/google-adsense.json +43 -0
  39. package/dist/registry/header-ecommerce.json +1 -1
  40. package/dist/registry/header-mega.json +1 -1
  41. package/dist/registry/hero-carousel.json +2 -2
  42. package/dist/registry/hero-cta.json +2 -2
  43. package/dist/registry/hero-gradient.json +2 -2
  44. package/dist/registry/hero.json +2 -2
  45. package/dist/registry/index.json +12 -1
  46. package/dist/registry/landing-page-app.json +1 -1
  47. package/dist/registry/landing-page-saas.json +1 -1
  48. package/dist/registry/login-page.json +8 -6
  49. package/dist/registry/logo-cloud.json +1 -1
  50. package/dist/registry/payment-success-block.json +7 -3
  51. package/dist/registry/portfolio-page.json +2 -2
  52. package/dist/registry/post-detail-page.json +48 -0
  53. package/dist/registry/pricing-page.json +1 -1
  54. package/dist/registry/pricing-section.json +2 -2
  55. package/dist/registry/product-card-detailed.json +5 -4
  56. package/dist/registry/product-detail-page.json +48 -0
  57. package/dist/registry/product-detail-section.json +5 -4
  58. package/dist/registry/product-quick-view.json +5 -4
  59. package/dist/registry/team-page.json +1 -1
  60. package/dist/registry/testimonials-carousel.json +2 -2
  61. package/dist/registry/testimonials-grid.json +2 -2
  62. package/dist/registry/timeline-section.json +2 -2
  63. package/dist/registry/video-hero.json +1 -1
  64. package/dist/registry/youtube-embed.json +40 -0
  65. package/package.json +2 -2
  66. package/template/.prettierrc +12 -1
  67. package/template/index.html +3 -3
  68. package/template/package.json +1 -1
  69. package/template/src/constants/constants.json +4 -4
  70. package/template/src/lib/env.ts +20 -0
  71. package/template/src/main.tsx +1 -0
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "youtube-embed",
3
+ "type": "registry:component",
4
+ "title": "YouTube Embed",
5
+ "description": "Responsive YouTube video embed component with customizable options. Supports autoplay, mute, loop, custom start time, and multiple aspect ratios. Includes loading state and error handling.",
6
+ "registryDependencies": [],
7
+ "usage": "import { YouTubeEmbed } from '@/modules/youtube-embed';\n\n// Basic usage\n<YouTubeEmbed videoId=\"dQw4w9WgXcQ\" />\n\n// With all options\n<YouTubeEmbed\n videoId=\"dQw4w9WgXcQ\"\n title=\"Video Title\"\n autoplay={false}\n mute={false}\n loop={false}\n controls={true}\n start={30}\n aspectRatio=\"16/9\"\n className=\"rounded-xl shadow-lg\"\n/>",
8
+ "files": [
9
+ {
10
+ "path": "youtube-embed/index.ts",
11
+ "type": "registry:index",
12
+ "target": "$modules$/youtube-embed/index.ts",
13
+ "content": "export * from './youtube-embed';\r\n"
14
+ },
15
+ {
16
+ "path": "youtube-embed/youtube-embed.tsx",
17
+ "type": "registry:component",
18
+ "target": "$modules$/youtube-embed/youtube-embed.tsx",
19
+ "content": "import { useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Play } from \"lucide-react\";\r\n\r\ninterface YouTubeEmbedProps {\r\n videoId: string;\r\n title?: string;\r\n autoplay?: boolean;\r\n mute?: boolean;\r\n loop?: boolean;\r\n controls?: boolean;\r\n start?: number;\r\n aspectRatio?: \"16/9\" | \"4/3\" | \"1/1\";\r\n className?: string;\r\n}\r\n\r\nexport function YouTubeEmbed({\r\n videoId,\r\n title,\r\n autoplay = false,\r\n mute = false,\r\n loop = false,\r\n controls = true,\r\n start,\r\n aspectRatio = \"16/9\",\r\n className,\r\n}: YouTubeEmbedProps) {\r\n const { t } = useTranslation(\"youtube-embed\");\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n\r\n // Validate videoId\r\n const isValidVideoId = /^[a-zA-Z0-9_-]{11}$/.test(videoId);\r\n\r\n // Build embed URL with parameters\r\n const buildEmbedUrl = () => {\r\n const params = new URLSearchParams();\r\n\r\n if (autoplay) params.set(\"autoplay\", \"1\");\r\n if (mute) params.set(\"mute\", \"1\");\r\n if (loop) {\r\n params.set(\"loop\", \"1\");\r\n params.set(\"playlist\", videoId);\r\n }\r\n if (!controls) params.set(\"controls\", \"0\");\r\n if (start) params.set(\"start\", start.toString());\r\n\r\n params.set(\"rel\", \"0\");\r\n\r\n const queryString = params.toString();\r\n return `https://www.youtube.com/embed/${videoId}${queryString ? `?${queryString}` : \"\"}`;\r\n };\r\n\r\n const handleLoad = () => {\r\n setIsLoading(false);\r\n };\r\n\r\n const handleError = () => {\r\n setIsLoading(false);\r\n setHasError(true);\r\n };\r\n\r\n // Invalid videoId\r\n if (!isValidVideoId) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col items-center justify-center bg-muted rounded-lg border\",\r\n className\r\n )}\r\n style={{ aspectRatio }}\r\n >\r\n <Play className=\"h-12 w-12 text-muted-foreground mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {t(\"invalidId\", \"Invalid video ID\")}\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (hasError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col items-center justify-center bg-muted rounded-lg border\",\r\n className\r\n )}\r\n style={{ aspectRatio }}\r\n >\r\n <Play className=\"h-12 w-12 text-muted-foreground mb-3\" />\r\n <p className=\"text-sm text-muted-foreground\">\r\n {t(\"error\", \"Failed to load video\")}\r\n </p>\r\n <a\r\n href={`https://www.youtube.com/watch?v=${videoId}`}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-sm text-primary hover:underline mt-2\"\r\n >\r\n {t(\"watchOnYouTube\", \"Watch on YouTube\")}\r\n </a>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(\"relative rounded-lg overflow-hidden\", className)}\r\n style={{ aspectRatio }}\r\n >\r\n {isLoading && (\r\n <div className=\"absolute inset-0 flex items-center justify-center bg-muted\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\r\n <span className=\"text-sm text-muted-foreground\">\r\n {t(\"loading\", \"Loading video...\")}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n <iframe\r\n src={buildEmbedUrl()}\r\n width=\"100%\"\r\n height=\"100%\"\r\n style={{ border: 0 }}\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\r\n allowFullScreen\r\n loading=\"lazy\"\r\n title={title || t(\"defaultTitle\", \"YouTube video player\")}\r\n onLoad={handleLoad}\r\n onError={handleError}\r\n className={cn(\"absolute inset-0\", isLoading && \"invisible\")}\r\n />\r\n </div>\r\n );\r\n}\r\n"
20
+ },
21
+ {
22
+ "path": "youtube-embed/lang/en.json",
23
+ "type": "registry:lang",
24
+ "target": "$modules$/youtube-embed/lang/en.json",
25
+ "content": "{\r\n \"loading\": \"Loading video...\",\r\n \"error\": \"Failed to load video\",\r\n \"invalidId\": \"Invalid video ID\",\r\n \"watchOnYouTube\": \"Watch on YouTube\",\r\n \"defaultTitle\": \"YouTube video player\"\r\n}\r\n"
26
+ },
27
+ {
28
+ "path": "youtube-embed/lang/tr.json",
29
+ "type": "registry:lang",
30
+ "target": "$modules$/youtube-embed/lang/tr.json",
31
+ "content": "{\r\n \"loading\": \"Video yükleniyor...\",\r\n \"error\": \"Video yüklenemedi\",\r\n \"invalidId\": \"Geçersiz video ID\",\r\n \"watchOnYouTube\": \"YouTube'da izle\",\r\n \"defaultTitle\": \"YouTube video oynatıcı\"\r\n}\r\n"
32
+ }
33
+ ],
34
+ "exports": {
35
+ "types": [],
36
+ "variables": [
37
+ "YouTubeEmbed"
38
+ ]
39
+ }
40
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@promakeai/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "promake": "dist/index.js"
@@ -49,4 +49,4 @@
49
49
  "@types/prompts": "^2.4.9",
50
50
  "typescript": "^5.7.2"
51
51
  }
52
- }
52
+ }
@@ -1 +1,12 @@
1
- {}
1
+ {
2
+ "singleQuote": true,
3
+ "trailingComma": "all",
4
+ "arrowParens": "always",
5
+ "bracketSpacing": true,
6
+ "bracketSameLine": false,
7
+ "semi": true,
8
+ "tabWidth": 2,
9
+ "useTabs": false,
10
+ "printWidth": 120,
11
+ "endOfLine": "lf"
12
+ }
@@ -248,10 +248,10 @@
248
248
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
249
249
 
250
250
  <!-- SEO -->
251
- <title>Site Name - Modern Website Template</title>
251
+ <title>Site Name</title>
252
252
  <meta
253
253
  name="description"
254
- content="A flexible website template for businesses, blogs, ecommerce stores, or portfolios."
254
+ content="Your site description"
255
255
  />
256
256
  <meta name="author" content="Site Name" />
257
257
 
@@ -259,7 +259,7 @@
259
259
  <meta property="og:title" content="Site Name" />
260
260
  <meta
261
261
  property="og:description"
262
- content="A flexible website template for businesses, blogs, ecommerce stores, or portfolios."
262
+ content="Your site description"
263
263
  />
264
264
  <meta property="og:type" content="website" />
265
265
  <meta property="og:image" content="" />
@@ -89,4 +89,4 @@
89
89
  "typescript-eslint": "^8.46.4",
90
90
  "vite": "^7.2.4"
91
91
  }
92
- }
92
+ }
@@ -26,11 +26,11 @@
26
26
  "timeout": 30000
27
27
  },
28
28
  "seo": {
29
- "title": "Site Name - Modern Website Template",
30
- "description": "A flexible website template for businesses, blogs, ecommerce stores, or portfolios.",
29
+ "title": "Site Name",
30
+ "description": "Your site description",
31
31
  "author": "Site Name",
32
32
  "ogTitle": "Site Name",
33
- "ogDescription": "A flexible website template for businesses, blogs, ecommerce stores, or portfolios.",
33
+ "ogDescription": "Your site description",
34
34
  "ogImage": "",
35
35
  "twitterSite": "",
36
36
  "twitterImage": "",
@@ -61,4 +61,4 @@
61
61
  "instagram": "",
62
62
  "linkedin": ""
63
63
  }
64
- }
64
+ }
@@ -0,0 +1,20 @@
1
+ // Environment değişkenlerini window'a export et
2
+ declare global {
3
+ interface Window {
4
+ ENV: {
5
+ [key: string]: any;
6
+ };
7
+ }
8
+ }
9
+
10
+ window.ENV = {
11
+ ...Object.keys(import.meta.env)
12
+ .filter((key) => key.startsWith('VITE_'))
13
+ .reduce(
14
+ (acc, key) => ({
15
+ ...acc,
16
+ [key]: import.meta.env[key],
17
+ }),
18
+ {},
19
+ ),
20
+ };
@@ -1,4 +1,5 @@
1
1
  import "./lang";
2
+ import "./lib/env";
2
3
  import "./index.css";
3
4
  import { StrictMode } from "react";
4
5
  import { createRoot } from "react-dom/client";