@xenterprises/nuxt-x-marketing 1.0.2 → 1.1.0

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 (64) hide show
  1. package/README.md +130 -11
  2. package/app/components/X/Mark/CodeBlock/index.vue +19 -7
  3. package/app/components/X/Mark/Divider/Glow.vue +25 -19
  4. package/app/components/X/Mark/Section/Stitch.vue +45 -31
  5. package/app/composables/{useParallax.ts → useParallax.js} +6 -7
  6. package/app/composables/{useScrollReveal.ts → useScrollReveal.js} +4 -4
  7. package/nuxt.config.ts +1 -11
  8. package/package.json +1 -1
  9. package/.claude/settings.local.json +0 -23
  10. package/.nuxtrc +0 -1
  11. package/.playground/app.config.ts +0 -74
  12. package/.playground/app.vue +0 -269
  13. package/.playground/components/AppFooter.vue +0 -103
  14. package/.playground/components/AppHeader.vue +0 -41
  15. package/.playground/components/CodeExample.vue +0 -70
  16. package/.playground/components/ComponentPlayground.vue +0 -117
  17. package/.playground/components/DocsHeader.vue +0 -19
  18. package/.playground/layouts/default.vue +0 -15
  19. package/.playground/layouts/docs-layout.vue +0 -161
  20. package/.playground/layouts/docs.vue +0 -11
  21. package/.playground/nuxt.config.ts +0 -5
  22. package/.playground/package-lock.json +0 -6
  23. package/.playground/pages/blog/author.vue +0 -145
  24. package/.playground/pages/blog/card.vue +0 -149
  25. package/.playground/pages/blog/cta.vue +0 -131
  26. package/.playground/pages/blog/detail.vue +0 -471
  27. package/.playground/pages/blog/list.vue +0 -261
  28. package/.playground/pages/blog/navigation.vue +0 -228
  29. package/.playground/pages/blog/sidebar.vue +0 -279
  30. package/.playground/pages/config.vue +0 -289
  31. package/.playground/pages/content/comparison.vue +0 -253
  32. package/.playground/pages/content/cta.vue +0 -245
  33. package/.playground/pages/content/features.vue +0 -217
  34. package/.playground/pages/content/newsletter-section.vue +0 -260
  35. package/.playground/pages/content/newsletter.vue +0 -200
  36. package/.playground/pages/content/pricing.vue +0 -335
  37. package/.playground/pages/content/testimonials.vue +0 -188
  38. package/.playground/pages/hero.vue +0 -257
  39. package/.playground/pages/index.vue +0 -381
  40. package/.playground/pages/layout/footer.vue +0 -210
  41. package/.playground/pages/layout/legal-footer.vue +0 -121
  42. package/.playground/pages/layout/navbar.vue +0 -285
  43. package/.playground/pages/layout/section.vue +0 -266
  44. package/.playground/pages/layout/x-legal.vue +0 -199
  45. package/.playground/pages/modals/feature-modal.vue +0 -320
  46. package/.playground/pages/modals/image-lightbox.vue +0 -277
  47. package/.playground/pages/modals/video-modal.vue +0 -222
  48. package/.playground/pages/notifications/announcement-bar.vue +0 -164
  49. package/.playground/pages/notifications/cookie-banner.vue +0 -210
  50. package/.playground/pages/notifications/cookie-toast.vue +0 -143
  51. package/.playground/pages/notifications/gdpr.vue +0 -276
  52. package/.playground/pages/notifications/social-proof-toast.vue +0 -515
  53. package/.playground/pages/ui/badge.vue +0 -161
  54. package/.playground/pages/ui/bg-pattern.vue +0 -177
  55. package/.playground/pages/ui/glass-card.vue +0 -179
  56. package/.playground/pages/ui/glow-divider.vue +0 -179
  57. package/.playground/pages/ui/promo-card.vue +0 -259
  58. package/.playground/pages/ui/section-stitch.vue +0 -411
  59. package/.playground/pages/utilities/back-to-top.vue +0 -153
  60. package/.playground/pages/utilities/popup-chat.vue +0 -224
  61. package/componentList.json +0 -2129
  62. package/screenshots/playground-home.png +0 -0
  63. package/tsconfig.json +0 -3
  64. /package/app/composables/{useXBlog.ts → useXBlog.js} +0 -0
@@ -1,269 +0,0 @@
1
- <template>
2
- <UApp>
3
- <div class="min-h-screen bg-neutral-50 dark:bg-neutral-950">
4
- <!-- Sidebar Navigation -->
5
- <aside class="fixed top-0 left-0 w-64 h-screen bg-white dark:bg-neutral-900 border-r border-neutral-200 dark:border-neutral-800 overflow-y-auto z-50">
6
- <!-- Header -->
7
- <div class="p-6 border-b border-neutral-200 dark:border-neutral-800">
8
- <NuxtLink to="/" class="block">
9
- <h1 class="text-lg font-bold text-neutral-900 dark:text-white">nuxt-x-marketing</h1>
10
- <p class="text-sm text-neutral-500 dark:text-neutral-400 mt-1">Component Playground</p>
11
- </NuxtLink>
12
- </div>
13
-
14
- <!-- Dark Mode Toggle -->
15
- <div class="px-6 py-4 border-b border-neutral-200 dark:border-neutral-800">
16
- <button
17
- @click="toggleDarkMode"
18
- class="flex items-center gap-2 px-3 py-2 w-full rounded-lg text-sm text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800 transition-colors"
19
- >
20
- <ClientOnly>
21
- <UIcon :name="isDark ? 'i-lucide-sun' : 'i-lucide-moon'" class="w-4 h-4" />
22
- <template #fallback>
23
- <UIcon name="i-lucide-moon" class="w-4 h-4" />
24
- </template>
25
- </ClientOnly>
26
- <ClientOnly>
27
- <span>{{ isDark ? 'Light Mode' : 'Dark Mode' }}</span>
28
- <template #fallback><span>Dark Mode</span></template>
29
- </ClientOnly>
30
- </button>
31
- </div>
32
-
33
- <!-- Navigation -->
34
- <nav class="p-4 space-y-6">
35
- <!-- Getting Started -->
36
- <div>
37
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Getting Started</h3>
38
- <ul class="space-y-1">
39
- <li>
40
- <NuxtLink
41
- to="/"
42
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-colors"
43
- :class="isActive('/') ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
44
- >
45
- <UIcon name="i-lucide-home" class="w-4 h-4" />
46
- <span>Kitchen Sink</span>
47
- </NuxtLink>
48
- </li>
49
- <li>
50
- <NuxtLink
51
- to="/config"
52
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-colors"
53
- :class="isActive('/config') ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
54
- >
55
- <UIcon name="i-lucide-settings" class="w-4 h-4" />
56
- <span>App Config</span>
57
- </NuxtLink>
58
- </li>
59
- </ul>
60
- </div>
61
-
62
- <!-- Layout -->
63
- <div>
64
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Layout</h3>
65
- <ul class="space-y-1">
66
- <li v-for="item in navItems.layout" :key="item.to">
67
- <NuxtLink
68
- :to="item.to"
69
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
70
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
71
- >
72
- <span>{{ item.label }}</span>
73
- </NuxtLink>
74
- </li>
75
- </ul>
76
- </div>
77
-
78
- <!-- Hero -->
79
- <div>
80
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Hero</h3>
81
- <ul class="space-y-1">
82
- <li>
83
- <NuxtLink
84
- to="/hero"
85
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
86
- :class="isActive('/hero') ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
87
- >
88
- <span>Hero</span>
89
- </NuxtLink>
90
- </li>
91
- </ul>
92
- </div>
93
-
94
- <!-- Content -->
95
- <div>
96
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Content</h3>
97
- <ul class="space-y-1">
98
- <li v-for="item in navItems.content" :key="item.to">
99
- <NuxtLink
100
- :to="item.to"
101
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
102
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
103
- >
104
- <span>{{ item.label }}</span>
105
- </NuxtLink>
106
- </li>
107
- </ul>
108
- </div>
109
-
110
- <!-- Blog -->
111
- <div>
112
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Blog</h3>
113
- <ul class="space-y-1">
114
- <li v-for="item in navItems.blog" :key="item.to">
115
- <NuxtLink
116
- :to="item.to"
117
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
118
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
119
- >
120
- <span>{{ item.label }}</span>
121
- </NuxtLink>
122
- </li>
123
- </ul>
124
- </div>
125
-
126
- <!-- UI Elements -->
127
- <div>
128
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">UI Elements</h3>
129
- <ul class="space-y-1">
130
- <li v-for="item in navItems.ui" :key="item.to">
131
- <NuxtLink
132
- :to="item.to"
133
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
134
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
135
- >
136
- <span>{{ item.label }}</span>
137
- </NuxtLink>
138
- </li>
139
- </ul>
140
- </div>
141
-
142
- <!-- Modals -->
143
- <div>
144
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Modals</h3>
145
- <ul class="space-y-1">
146
- <li v-for="item in navItems.modals" :key="item.to">
147
- <NuxtLink
148
- :to="item.to"
149
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
150
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
151
- >
152
- <span>{{ item.label }}</span>
153
- </NuxtLink>
154
- </li>
155
- </ul>
156
- </div>
157
-
158
- <!-- Notifications -->
159
- <div>
160
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Notifications</h3>
161
- <ul class="space-y-1">
162
- <li v-for="item in navItems.notifications" :key="item.to">
163
- <NuxtLink
164
- :to="item.to"
165
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
166
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
167
- >
168
- <span>{{ item.label }}</span>
169
- </NuxtLink>
170
- </li>
171
- </ul>
172
- </div>
173
-
174
- <!-- Utilities -->
175
- <div>
176
- <h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Utilities</h3>
177
- <ul class="space-y-1">
178
- <li v-for="item in navItems.utilities" :key="item.to">
179
- <NuxtLink
180
- :to="item.to"
181
- class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
182
- :class="isActive(item.to) ? 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300' : 'text-neutral-600 dark:text-neutral-300 hover:bg-neutral-100 dark:hover:bg-neutral-800'"
183
- >
184
- <span>{{ item.label }}</span>
185
- </NuxtLink>
186
- </li>
187
- </ul>
188
- </div>
189
- </nav>
190
-
191
- <!-- Footer -->
192
- <div class="p-4 border-t border-neutral-200 dark:border-neutral-800 mt-auto">
193
- <p class="text-xs text-neutral-400 dark:text-neutral-500 text-center">33 Components</p>
194
- </div>
195
- </aside>
196
-
197
- <!-- Main Content -->
198
- <main class="ml-64">
199
- <NuxtPage />
200
- </main>
201
- </div>
202
- </UApp>
203
- </template>
204
-
205
- <script setup>
206
- const colorMode = useColorMode()
207
- const route = useRoute()
208
-
209
- const isDark = computed(() => colorMode.value === 'dark')
210
-
211
- function toggleDarkMode() {
212
- colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark'
213
- }
214
-
215
- function isActive(path) {
216
- return route.path === path
217
- }
218
-
219
- const navItems = {
220
- layout: [
221
- { label: 'Navbar', to: '/layout/navbar' },
222
- { label: 'Section', to: '/layout/section' },
223
- { label: 'Footer', to: '/layout/footer' },
224
- { label: 'Legal Footer', to: '/layout/legal-footer' },
225
- { label: 'X Legal Footer', to: '/layout/x-legal' }
226
- ],
227
- content: [
228
- { label: 'Features', to: '/content/features' },
229
- { label: 'Testimonials', to: '/content/testimonials' },
230
- { label: 'Pricing', to: '/content/pricing' },
231
- { label: 'Comparison', to: '/content/comparison' },
232
- { label: 'Newsletter', to: '/content/newsletter' },
233
- { label: 'CTA', to: '/content/cta' }
234
- ],
235
- blog: [
236
- { label: 'Card', to: '/blog/card' },
237
- { label: 'List', to: '/blog/list' },
238
- { label: 'Detail', to: '/blog/detail' },
239
- { label: 'Sidebar', to: '/blog/sidebar' },
240
- { label: 'Author', to: '/blog/author' },
241
- { label: 'Navigation', to: '/blog/navigation' },
242
- { label: 'Newsletter CTA', to: '/blog/cta' }
243
- ],
244
- ui: [
245
- { label: 'Badge', to: '/ui/badge' },
246
- { label: 'Glass Card', to: '/ui/glass-card' },
247
- { label: 'Promo Card', to: '/ui/promo-card' },
248
- { label: 'Glow Divider', to: '/ui/glow-divider' },
249
- { label: 'Bg Pattern', to: '/ui/bg-pattern' },
250
- { label: 'Section Stitch', to: '/ui/section-stitch' }
251
- ],
252
- modals: [
253
- { label: 'Video Modal', to: '/modals/video-modal' },
254
- { label: 'Image Lightbox', to: '/modals/image-lightbox' },
255
- { label: 'Feature Modal', to: '/modals/feature-modal' }
256
- ],
257
- notifications: [
258
- { label: 'Announcement Bar', to: '/notifications/announcement-bar' },
259
- { label: 'Cookie Banner', to: '/notifications/cookie-banner' },
260
- { label: 'Cookie Toast', to: '/notifications/cookie-toast' },
261
- { label: 'GDPR', to: '/notifications/gdpr' },
262
- { label: 'Social Proof Toast', to: '/notifications/social-proof-toast' }
263
- ],
264
- utilities: [
265
- { label: 'Back to Top', to: '/utilities/back-to-top' },
266
- { label: 'Popup Chat', to: '/utilities/popup-chat' }
267
- ]
268
- }
269
- </script>
@@ -1,103 +0,0 @@
1
- <template>
2
- <footer class="border-t border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950">
3
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
4
- <div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-8">
5
- <!-- About -->
6
- <div>
7
- <h3 class="font-semibold text-gray-900 dark:text-white mb-4">
8
- X Marketing Components
9
- </h3>
10
- <p class="text-sm text-gray-600 dark:text-gray-400">
11
- A comprehensive collection of 60+ production-ready marketing components built with Nuxt UI v4.
12
- </p>
13
- </div>
14
-
15
- <!-- Documentation -->
16
- <div>
17
- <h4 class="font-semibold text-gray-900 dark:text-white mb-4">Documentation</h4>
18
- <ul class="space-y-2">
19
- <li>
20
- <NuxtLink
21
- to="/docs"
22
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
23
- >
24
- Getting Started
25
- </NuxtLink>
26
- </li>
27
- <li>
28
- <NuxtLink
29
- to="/docs/quick-start"
30
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
31
- >
32
- Quick Start
33
- </NuxtLink>
34
- </li>
35
- <li>
36
- <NuxtLink
37
- to="/docs/components"
38
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
39
- >
40
- All Components
41
- </NuxtLink>
42
- </li>
43
- </ul>
44
- </div>
45
-
46
- <!-- Resources -->
47
- <div>
48
- <h4 class="font-semibold text-gray-900 dark:text-white mb-4">Resources</h4>
49
- <ul class="space-y-2">
50
- <li>
51
- <a
52
- href="https://ui.nuxt.com"
53
- target="_blank"
54
- rel="noopener noreferrer"
55
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
56
- >
57
- Nuxt UI Docs
58
- </a>
59
- </li>
60
- <li>
61
- <a
62
- href="https://nuxt.com"
63
- target="_blank"
64
- rel="noopener noreferrer"
65
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
66
- >
67
- Nuxt Docs
68
- </a>
69
- </li>
70
- <li>
71
- <a
72
- href="https://tailwindcss.com"
73
- target="_blank"
74
- rel="noopener noreferrer"
75
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
76
- >
77
- Tailwind CSS
78
- </a>
79
- </li>
80
- </ul>
81
- </div>
82
- </div>
83
-
84
- <!-- Bottom -->
85
- <div class="border-t border-gray-200 dark:border-gray-800 pt-8 flex justify-between items-center">
86
- <p class="text-sm text-gray-600 dark:text-gray-400">
87
- © 2025 X Marketing. Built with Nuxt UI v4.
88
- </p>
89
- <div class="flex items-center gap-4">
90
- <a
91
- href="https://github.com"
92
- target="_blank"
93
- rel="noopener noreferrer"
94
- class="text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
95
- >
96
- <UIcon name="i-lucide-github" class="w-5 h-5" />
97
- </a>
98
- </div>
99
- </div>
100
- </div>
101
- </footer>
102
- </template>
103
-
@@ -1,41 +0,0 @@
1
- <template>
2
- <header class="sticky top-0 z-40 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950">
3
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
4
- <div class="flex justify-between items-center h-16">
5
- <!-- Logo -->
6
- <NuxtLink to="/" class="flex items-center gap-2 font-semibold text-lg">
7
- <UIcon name="i-lucide-layers" class="w-6 h-6 text-primary" />
8
- <span>X Marketing</span>
9
- </NuxtLink>
10
-
11
- <!-- Navigation -->
12
- <nav class="hidden md:flex items-center gap-8">
13
- <NuxtLink
14
- to="/"
15
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
16
- >
17
- Demo
18
- </NuxtLink>
19
- <NuxtLink
20
- to="/docs"
21
- class="text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition-colors"
22
- >
23
- Documentation
24
- </NuxtLink>
25
- </nav>
26
-
27
- <!-- Right Actions -->
28
- <div class="flex items-center gap-4">
29
- <UButton
30
- to="/docs/quick-start"
31
- variant="soft"
32
- size="sm"
33
- label="Get Started"
34
- />
35
- <UColorModeButton />
36
- </div>
37
- </div>
38
- </div>
39
- </header>
40
- </template>
41
-
@@ -1,70 +0,0 @@
1
- <template>
2
- <div
3
- class="border border-default rounded-lg overflow-hidden bg-white dark:bg-slate-950 shadow-sm"
4
- >
5
- <div
6
- class="flex items-center justify-between bg-gradient-to-r from-slate-50 to-slate-100 dark:from-slate-900 dark:to-slate-800 px-4 py-3 border-b border-default"
7
- >
8
- <div class="flex items-center gap-2">
9
- <div class="w-2 h-2 rounded-full bg-blue-500"></div>
10
- <span
11
- class="text-sm font-semibold text-slate-700 dark:text-slate-300"
12
- >{{ title }}</span
13
- >
14
- </div>
15
- <div class="flex items-center gap-2">
16
- <span
17
- v-if="copied"
18
- class="text-xs text-green-600 dark:text-green-400 font-medium flex items-center gap-1"
19
- >
20
- <i class="i-lucide-check w-3 h-3" />
21
- Copied!
22
- </span>
23
- <UButton
24
- :icon="copied ? 'i-lucide-check' : 'i-lucide-copy'"
25
- :color="copied ? 'green' : 'gray'"
26
- variant="ghost"
27
- size="xs"
28
- @click="copyCode"
29
- :disabled="copied"
30
- class="transition-all"
31
- >
32
- {{ copied ? "Copied" : "Copy" }}
33
- </UButton>
34
- </div>
35
- </div>
36
- <div class="overflow-x-auto bg-white dark:bg-slate-950">
37
- <pre
38
- class="p-4 text-sm leading-relaxed text-slate-800 dark:text-slate-200 font-mono whitespace-pre-wrap break-words"
39
- ><code>{{ code }}</code></pre>
40
- </div>
41
- </div>
42
- </template>
43
-
44
- <script setup>
45
- const props = defineProps({
46
- title: {
47
- type: String,
48
- default: "Code Example",
49
- },
50
- code: {
51
- type: String,
52
- required: true,
53
- },
54
- });
55
-
56
- const copied = ref(false);
57
-
58
- const copyCode = async () => {
59
- try {
60
- await navigator.clipboard.writeText(props.code);
61
- copied.value = true;
62
- setTimeout(() => {
63
- copied.value = false;
64
- }, 2000);
65
- } catch (err) {
66
- console.error("Failed to copy:", err);
67
- }
68
- };
69
- </script>
70
-
@@ -1,117 +0,0 @@
1
- <template>
2
- <div class="space-y-6">
3
- <!-- Props Editor -->
4
- <div class="border border-default rounded-lg overflow-hidden">
5
- <div class="bg-slate-50 dark:bg-slate-900 px-4 py-3 border-b border-default">
6
- <h3 class="text-sm font-semibold text-slate-700 dark:text-slate-300">
7
- Customize Props
8
- </h3>
9
- </div>
10
- <div class="p-4 space-y-4">
11
- <div v-for="(value, key) in editableProps" :key="key" class="space-y-2">
12
- <label class="text-sm font-medium text-slate-700 dark:text-slate-300">
13
- {{ key }}
14
- </label>
15
- <div v-if="typeof value === 'boolean'" class="flex items-center gap-2">
16
- <UToggle v-model="editableProps[key]" />
17
- <span class="text-xs text-slate-500">{{ value ? 'true' : 'false' }}</span>
18
- </div>
19
- <UInput
20
- v-else-if="typeof value === 'string'"
21
- v-model="editableProps[key]"
22
- :placeholder="`Enter ${key}`"
23
- size="sm"
24
- />
25
- <UInput
26
- v-else-if="typeof value === 'number'"
27
- v-model.number="editableProps[key]"
28
- type="number"
29
- :placeholder="`Enter ${key}`"
30
- size="sm"
31
- />
32
- <div v-else class="text-xs text-slate-500">
33
- {{ typeof value }} (not editable)
34
- </div>
35
- </div>
36
- </div>
37
- </div>
38
-
39
- <!-- Live Preview -->
40
- <div class="border border-default rounded-lg overflow-hidden">
41
- <div class="bg-slate-50 dark:bg-slate-900 px-4 py-3 border-b border-default">
42
- <h3 class="text-sm font-semibold text-slate-700 dark:text-slate-300">
43
- Live Preview
44
- </h3>
45
- </div>
46
- <div class="p-6 bg-white dark:bg-slate-950">
47
- <slot :props="editableProps" />
48
- </div>
49
- </div>
50
-
51
- <!-- Generated Code -->
52
- <div class="border border-default rounded-lg overflow-hidden">
53
- <div class="bg-slate-50 dark:bg-slate-900 px-4 py-3 border-b border-default flex items-center justify-between">
54
- <h3 class="text-sm font-semibold text-slate-700 dark:text-slate-300">
55
- Generated Code
56
- </h3>
57
- <UButton
58
- icon="i-lucide-copy"
59
- variant="ghost"
60
- size="xs"
61
- @click="copyGeneratedCode"
62
- >
63
- {{ codeCopied ? 'Copied!' : 'Copy' }}
64
- </UButton>
65
- </div>
66
- <div class="overflow-x-auto bg-white dark:bg-slate-950">
67
- <pre class="p-4 text-sm leading-relaxed text-slate-800 dark:text-slate-200 font-mono"><code>{{ generatedCode }}</code></pre>
68
- </div>
69
- </div>
70
- </div>
71
- </template>
72
-
73
- <script setup>
74
- const props = defineProps({
75
- componentName: {
76
- type: String,
77
- required: true,
78
- },
79
- initialProps: {
80
- type: Object,
81
- default: () => ({}),
82
- },
83
- });
84
-
85
- const editableProps = ref({ ...props.initialProps });
86
- const codeCopied = ref(false);
87
-
88
- const generatedCode = computed(() => {
89
- const propsStr = Object.entries(editableProps.value)
90
- .map(([key, value]) => {
91
- if (typeof value === 'string') {
92
- return ` ${key}="${value}"`;
93
- } else if (typeof value === 'boolean') {
94
- return value ? ` :${key}="true"` : ` :${key}="false"`;
95
- } else if (typeof value === 'number') {
96
- return ` :${key}="${value}"`;
97
- }
98
- return ` :${key}="${JSON.stringify(value)}"`;
99
- })
100
- .join('\n');
101
-
102
- return `<${props.componentName}\n${propsStr}\n/>`;
103
- });
104
-
105
- const copyGeneratedCode = async () => {
106
- try {
107
- await navigator.clipboard.writeText(generatedCode.value);
108
- codeCopied.value = true;
109
- setTimeout(() => {
110
- codeCopied.value = false;
111
- }, 2000);
112
- } catch (err) {
113
- console.error('Failed to copy:', err);
114
- }
115
- };
116
- </script>
117
-
@@ -1,19 +0,0 @@
1
- <template>
2
- <header class="sticky top-0 z-40 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-950">
3
- <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
4
- <div class="flex justify-between items-center h-14">
5
- <!-- Logo -->
6
- <NuxtLink to="/" class="flex items-center gap-2 font-semibold text-base">
7
- <UIcon name="i-lucide-layers" class="w-5 h-5 text-primary" />
8
- <span>X Marketing</span>
9
- <span class="text-xs text-gray-500 dark:text-gray-400 font-normal ml-1">/ Docs</span>
10
- </NuxtLink>
11
-
12
- <!-- Right Actions -->
13
- <div class="flex items-center gap-3">
14
- <UColorModeButton />
15
- </div>
16
- </div>
17
- </div>
18
- </header>
19
- </template>
@@ -1,15 +0,0 @@
1
- <template>
2
- <UApp>
3
- <NuxtLoadingIndicator />
4
-
5
- <AppHeader />
6
-
7
- <UMain>
8
- <slot />
9
- </UMain>
10
-
11
- <AppFooter />
12
- </UApp>
13
- </template>
14
-
15
- <script setup></script>