@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.
- package/README.md +130 -11
- package/app/components/X/Mark/CodeBlock/index.vue +19 -7
- package/app/components/X/Mark/Divider/Glow.vue +25 -19
- package/app/components/X/Mark/Section/Stitch.vue +45 -31
- package/app/composables/{useParallax.ts → useParallax.js} +6 -7
- package/app/composables/{useScrollReveal.ts → useScrollReveal.js} +4 -4
- package/nuxt.config.ts +1 -11
- package/package.json +1 -1
- package/.claude/settings.local.json +0 -23
- package/.nuxtrc +0 -1
- package/.playground/app.config.ts +0 -74
- package/.playground/app.vue +0 -269
- package/.playground/components/AppFooter.vue +0 -103
- package/.playground/components/AppHeader.vue +0 -41
- package/.playground/components/CodeExample.vue +0 -70
- package/.playground/components/ComponentPlayground.vue +0 -117
- package/.playground/components/DocsHeader.vue +0 -19
- package/.playground/layouts/default.vue +0 -15
- package/.playground/layouts/docs-layout.vue +0 -161
- package/.playground/layouts/docs.vue +0 -11
- package/.playground/nuxt.config.ts +0 -5
- package/.playground/package-lock.json +0 -6
- package/.playground/pages/blog/author.vue +0 -145
- package/.playground/pages/blog/card.vue +0 -149
- package/.playground/pages/blog/cta.vue +0 -131
- package/.playground/pages/blog/detail.vue +0 -471
- package/.playground/pages/blog/list.vue +0 -261
- package/.playground/pages/blog/navigation.vue +0 -228
- package/.playground/pages/blog/sidebar.vue +0 -279
- package/.playground/pages/config.vue +0 -289
- package/.playground/pages/content/comparison.vue +0 -253
- package/.playground/pages/content/cta.vue +0 -245
- package/.playground/pages/content/features.vue +0 -217
- package/.playground/pages/content/newsletter-section.vue +0 -260
- package/.playground/pages/content/newsletter.vue +0 -200
- package/.playground/pages/content/pricing.vue +0 -335
- package/.playground/pages/content/testimonials.vue +0 -188
- package/.playground/pages/hero.vue +0 -257
- package/.playground/pages/index.vue +0 -381
- package/.playground/pages/layout/footer.vue +0 -210
- package/.playground/pages/layout/legal-footer.vue +0 -121
- package/.playground/pages/layout/navbar.vue +0 -285
- package/.playground/pages/layout/section.vue +0 -266
- package/.playground/pages/layout/x-legal.vue +0 -199
- package/.playground/pages/modals/feature-modal.vue +0 -320
- package/.playground/pages/modals/image-lightbox.vue +0 -277
- package/.playground/pages/modals/video-modal.vue +0 -222
- package/.playground/pages/notifications/announcement-bar.vue +0 -164
- package/.playground/pages/notifications/cookie-banner.vue +0 -210
- package/.playground/pages/notifications/cookie-toast.vue +0 -143
- package/.playground/pages/notifications/gdpr.vue +0 -276
- package/.playground/pages/notifications/social-proof-toast.vue +0 -515
- package/.playground/pages/ui/badge.vue +0 -161
- package/.playground/pages/ui/bg-pattern.vue +0 -177
- package/.playground/pages/ui/glass-card.vue +0 -179
- package/.playground/pages/ui/glow-divider.vue +0 -179
- package/.playground/pages/ui/promo-card.vue +0 -259
- package/.playground/pages/ui/section-stitch.vue +0 -411
- package/.playground/pages/utilities/back-to-top.vue +0 -153
- package/.playground/pages/utilities/popup-chat.vue +0 -224
- package/componentList.json +0 -2129
- package/screenshots/playground-home.png +0 -0
- package/tsconfig.json +0 -3
- /package/app/composables/{useXBlog.ts → useXBlog.js} +0 -0
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="min-h-screen">
|
|
3
|
-
<div class="bg-white dark:bg-neutral-900 border-b border-neutral-200 dark:border-neutral-800 px-8 py-6">
|
|
4
|
-
<h1 class="text-2xl font-bold text-neutral-900 dark:text-white">Blog Sidebar</h1>
|
|
5
|
-
<p class="mt-2 text-neutral-600 dark:text-neutral-400">Sidebar with search, categories, tags, recent posts, and newsletter CTA.</p>
|
|
6
|
-
</div>
|
|
7
|
-
|
|
8
|
-
<div class="space-y-0">
|
|
9
|
-
<!-- Full Sidebar Demo -->
|
|
10
|
-
<XMarkSection bg="default">
|
|
11
|
-
<div class="text-center mb-8">
|
|
12
|
-
<span class="inline-block px-3 py-1 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 text-xs font-medium mb-4">Full Sidebar</span>
|
|
13
|
-
<h2 class="xText-headline">Complete Sidebar Layout</h2>
|
|
14
|
-
<p class="mt-4 text-neutral-600 dark:text-neutral-400">With search, categories, tags, recent posts, and newsletter CTA</p>
|
|
15
|
-
</div>
|
|
16
|
-
<div class="grid lg:grid-cols-3 gap-8">
|
|
17
|
-
<div class="lg:col-span-2 bg-neutral-50 dark:bg-neutral-800/50 rounded-lg p-8 min-h-[400px]">
|
|
18
|
-
<p class="text-neutral-500">Main content area - blog post or list would go here</p>
|
|
19
|
-
</div>
|
|
20
|
-
<div>
|
|
21
|
-
<XMarkBlogSidebar
|
|
22
|
-
:categories="categories"
|
|
23
|
-
:tags="tags"
|
|
24
|
-
:recent-posts="recentPosts"
|
|
25
|
-
:has-search="true"
|
|
26
|
-
:has-cta="true"
|
|
27
|
-
@search="handleSearch"
|
|
28
|
-
/>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
</XMarkSection>
|
|
32
|
-
|
|
33
|
-
<!-- Minimal Sidebar -->
|
|
34
|
-
<XMarkSection bg="subtle">
|
|
35
|
-
<div class="text-center mb-8">
|
|
36
|
-
<span class="inline-block px-3 py-1 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 text-xs font-medium mb-4">Minimal</span>
|
|
37
|
-
<h2 class="xText-headline">Minimal Sidebar</h2>
|
|
38
|
-
<p class="mt-4 text-neutral-600 dark:text-neutral-400">Only search and categories, no CTA</p>
|
|
39
|
-
</div>
|
|
40
|
-
<div class="max-w-sm mx-auto">
|
|
41
|
-
<XMarkBlogSidebar
|
|
42
|
-
:categories="categories"
|
|
43
|
-
:has-search="true"
|
|
44
|
-
:has-cta="false"
|
|
45
|
-
@search="handleSearch"
|
|
46
|
-
/>
|
|
47
|
-
</div>
|
|
48
|
-
</XMarkSection>
|
|
49
|
-
|
|
50
|
-
<!-- Without Search -->
|
|
51
|
-
<XMarkSection bg="default">
|
|
52
|
-
<div class="text-center mb-8">
|
|
53
|
-
<span class="inline-block px-3 py-1 rounded-full bg-primary-100 dark:bg-primary-900/30 text-primary-600 dark:text-primary-400 text-xs font-medium mb-4">No Search</span>
|
|
54
|
-
<h2 class="xText-headline">Without Search Input</h2>
|
|
55
|
-
<p class="mt-4 text-neutral-600 dark:text-neutral-400">Focus on navigation elements only</p>
|
|
56
|
-
</div>
|
|
57
|
-
<div class="max-w-sm mx-auto">
|
|
58
|
-
<XMarkBlogSidebar
|
|
59
|
-
:categories="categories"
|
|
60
|
-
:tags="tags"
|
|
61
|
-
:recent-posts="recentPosts.slice(0, 2)"
|
|
62
|
-
:has-search="false"
|
|
63
|
-
:has-cta="true"
|
|
64
|
-
/>
|
|
65
|
-
</div>
|
|
66
|
-
</XMarkSection>
|
|
67
|
-
|
|
68
|
-
<!-- Events -->
|
|
69
|
-
<XMarkSection bg="subtle">
|
|
70
|
-
<h2 class="text-lg font-semibold mb-6">Events</h2>
|
|
71
|
-
<div class="overflow-x-auto">
|
|
72
|
-
<table class="w-full text-sm">
|
|
73
|
-
<thead>
|
|
74
|
-
<tr class="border-b border-neutral-200 dark:border-neutral-700">
|
|
75
|
-
<th class="text-left py-3 px-4 font-medium">Event</th>
|
|
76
|
-
<th class="text-left py-3 px-4 font-medium">Payload</th>
|
|
77
|
-
<th class="text-left py-3 px-4 font-medium">Description</th>
|
|
78
|
-
</tr>
|
|
79
|
-
</thead>
|
|
80
|
-
<tbody class="divide-y divide-neutral-200 dark:divide-neutral-700">
|
|
81
|
-
<tr>
|
|
82
|
-
<td class="py-3 px-4 font-mono text-xs">@search</td>
|
|
83
|
-
<td class="py-3 px-4">String</td>
|
|
84
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Emitted when user presses Enter in search input</td>
|
|
85
|
-
</tr>
|
|
86
|
-
</tbody>
|
|
87
|
-
</table>
|
|
88
|
-
</div>
|
|
89
|
-
</XMarkSection>
|
|
90
|
-
|
|
91
|
-
<!-- Props Documentation -->
|
|
92
|
-
<XMarkSection bg="default">
|
|
93
|
-
<h2 class="text-lg font-semibold mb-6">Props</h2>
|
|
94
|
-
<div class="overflow-x-auto">
|
|
95
|
-
<table class="w-full text-sm">
|
|
96
|
-
<thead>
|
|
97
|
-
<tr class="border-b border-neutral-200 dark:border-neutral-700">
|
|
98
|
-
<th class="text-left py-3 px-4 font-medium">Prop</th>
|
|
99
|
-
<th class="text-left py-3 px-4 font-medium">Type</th>
|
|
100
|
-
<th class="text-left py-3 px-4 font-medium">Default</th>
|
|
101
|
-
<th class="text-left py-3 px-4 font-medium">Description</th>
|
|
102
|
-
</tr>
|
|
103
|
-
</thead>
|
|
104
|
-
<tbody class="divide-y divide-neutral-200 dark:divide-neutral-700">
|
|
105
|
-
<tr>
|
|
106
|
-
<td class="py-3 px-4 font-mono text-xs">hasSearch</td>
|
|
107
|
-
<td class="py-3 px-4">Boolean</td>
|
|
108
|
-
<td class="py-3 px-4">true</td>
|
|
109
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Show search input at the top</td>
|
|
110
|
-
</tr>
|
|
111
|
-
<tr>
|
|
112
|
-
<td class="py-3 px-4 font-mono text-xs">categories</td>
|
|
113
|
-
<td class="py-3 px-4">Array</td>
|
|
114
|
-
<td class="py-3 px-4">[]</td>
|
|
115
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Categories [{ name, slug, count }]</td>
|
|
116
|
-
</tr>
|
|
117
|
-
<tr>
|
|
118
|
-
<td class="py-3 px-4 font-mono text-xs">tags</td>
|
|
119
|
-
<td class="py-3 px-4">Array</td>
|
|
120
|
-
<td class="py-3 px-4">[]</td>
|
|
121
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Tags [{ name, slug }]</td>
|
|
122
|
-
</tr>
|
|
123
|
-
<tr>
|
|
124
|
-
<td class="py-3 px-4 font-mono text-xs">recentPosts</td>
|
|
125
|
-
<td class="py-3 px-4">Array</td>
|
|
126
|
-
<td class="py-3 px-4">[]</td>
|
|
127
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Recent posts [{ title, slug, img?: { src, alt? }, date? }]</td>
|
|
128
|
-
</tr>
|
|
129
|
-
<tr>
|
|
130
|
-
<td class="py-3 px-4 font-mono text-xs">categoryBasePath</td>
|
|
131
|
-
<td class="py-3 px-4">String</td>
|
|
132
|
-
<td class="py-3 px-4">'/blog/category'</td>
|
|
133
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Base path for category links</td>
|
|
134
|
-
</tr>
|
|
135
|
-
<tr>
|
|
136
|
-
<td class="py-3 px-4 font-mono text-xs">tagBasePath</td>
|
|
137
|
-
<td class="py-3 px-4">String</td>
|
|
138
|
-
<td class="py-3 px-4">'/blog/tag'</td>
|
|
139
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Base path for tag links</td>
|
|
140
|
-
</tr>
|
|
141
|
-
<tr>
|
|
142
|
-
<td class="py-3 px-4 font-mono text-xs">hasCta</td>
|
|
143
|
-
<td class="py-3 px-4">Boolean</td>
|
|
144
|
-
<td class="py-3 px-4">true</td>
|
|
145
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Show newsletter CTA section</td>
|
|
146
|
-
</tr>
|
|
147
|
-
</tbody>
|
|
148
|
-
</table>
|
|
149
|
-
</div>
|
|
150
|
-
</XMarkSection>
|
|
151
|
-
|
|
152
|
-
<!-- Data Structure -->
|
|
153
|
-
<XMarkSection bg="subtle">
|
|
154
|
-
<h2 class="text-lg font-semibold mb-4">Data Structures</h2>
|
|
155
|
-
<div class="grid md:grid-cols-3 gap-6">
|
|
156
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-4">
|
|
157
|
-
<h3 class="font-medium mb-2">Category Object</h3>
|
|
158
|
-
<pre class="text-xs font-mono overflow-x-auto">{
|
|
159
|
-
name: "Tutorial",
|
|
160
|
-
slug: "/blog/category/tutorial",
|
|
161
|
-
count: 12
|
|
162
|
-
}</pre>
|
|
163
|
-
</div>
|
|
164
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-4">
|
|
165
|
-
<h3 class="font-medium mb-2">Tag Object</h3>
|
|
166
|
-
<pre class="text-xs font-mono overflow-x-auto">{
|
|
167
|
-
name: "Vue",
|
|
168
|
-
slug: "/blog/tag/vue"
|
|
169
|
-
}</pre>
|
|
170
|
-
</div>
|
|
171
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-4">
|
|
172
|
-
<h3 class="font-medium mb-2">Recent Post Object</h3>
|
|
173
|
-
<pre class="text-xs font-mono overflow-x-auto">{
|
|
174
|
-
title: "Getting Started",
|
|
175
|
-
slug: "/blog/getting-started",
|
|
176
|
-
img: { src: "...", alt: "..." },
|
|
177
|
-
date: "2024-01-15"
|
|
178
|
-
}</pre>
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
181
|
-
</XMarkSection>
|
|
182
|
-
|
|
183
|
-
<!-- Code Example -->
|
|
184
|
-
<XMarkSection bg="default">
|
|
185
|
-
<h2 class="text-lg font-semibold mb-4">Code Example</h2>
|
|
186
|
-
<CodeExample title="Blog Sidebar Usage" :code="codeExample" />
|
|
187
|
-
</XMarkSection>
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
</template>
|
|
191
|
-
|
|
192
|
-
<script setup>
|
|
193
|
-
// Initialize scroll reveal animations
|
|
194
|
-
useScrollReveal()
|
|
195
|
-
|
|
196
|
-
const handleSearch = (query) => {
|
|
197
|
-
console.log('Search:', query)
|
|
198
|
-
// In a real app: navigateTo(`/blog?search=${query}`)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const codeExample = `<!-- Full sidebar with blog layout -->
|
|
202
|
-
<div class="grid lg:grid-cols-3 gap-8">
|
|
203
|
-
<!-- Main content -->
|
|
204
|
-
<div class="lg:col-span-2">
|
|
205
|
-
<XMarkBlogList :posts="posts" />
|
|
206
|
-
</div>
|
|
207
|
-
|
|
208
|
-
<!-- Sidebar -->
|
|
209
|
-
<div>
|
|
210
|
-
<XMarkBlogSidebar
|
|
211
|
-
:categories="categories"
|
|
212
|
-
:tags="tags"
|
|
213
|
-
:recent-posts="recentPosts"
|
|
214
|
-
:has-search="true"
|
|
215
|
-
:has-cta="true"
|
|
216
|
-
@search="handleSearch"
|
|
217
|
-
/>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
|
|
221
|
-
<!-- Handle search event -->
|
|
222
|
-
const handleSearch = (query) => {
|
|
223
|
-
navigateTo(\`/blog?search=\${query}\`)
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
<!-- Minimal sidebar (no CTA) -->
|
|
227
|
-
<XMarkBlogSidebar
|
|
228
|
-
:categories="categories"
|
|
229
|
-
:has-search="true"
|
|
230
|
-
:has-cta="false"
|
|
231
|
-
@search="handleSearch"
|
|
232
|
-
/>
|
|
233
|
-
|
|
234
|
-
<!-- Without search -->
|
|
235
|
-
<XMarkBlogSidebar
|
|
236
|
-
:categories="categories"
|
|
237
|
-
:tags="tags"
|
|
238
|
-
:recent-posts="recentPosts"
|
|
239
|
-
:has-search="false"
|
|
240
|
-
:has-cta="true"
|
|
241
|
-
/>`
|
|
242
|
-
|
|
243
|
-
const categories = [
|
|
244
|
-
{ name: 'Tutorial', slug: '/blog/category/tutorial', count: 12 },
|
|
245
|
-
{ name: 'Development', slug: '/blog/category/development', count: 8 },
|
|
246
|
-
{ name: 'Design', slug: '/blog/category/design', count: 6 },
|
|
247
|
-
{ name: 'Performance', slug: '/blog/category/performance', count: 4 }
|
|
248
|
-
]
|
|
249
|
-
|
|
250
|
-
const tags = [
|
|
251
|
-
{ name: 'Vue', slug: '/blog/tag/vue' },
|
|
252
|
-
{ name: 'Nuxt', slug: '/blog/tag/nuxt' },
|
|
253
|
-
{ name: 'TypeScript', slug: '/blog/tag/typescript' },
|
|
254
|
-
{ name: 'Tailwind', slug: '/blog/tag/tailwind' },
|
|
255
|
-
{ name: 'CSS', slug: '/blog/tag/css' },
|
|
256
|
-
{ name: 'JavaScript', slug: '/blog/tag/javascript' }
|
|
257
|
-
]
|
|
258
|
-
|
|
259
|
-
const recentPosts = [
|
|
260
|
-
{
|
|
261
|
-
title: 'Getting Started with Nuxt 3',
|
|
262
|
-
slug: '/blog/getting-started',
|
|
263
|
-
img: { src: 'https://images.unsplash.com/photo-1517694712202-14dd9538aa97?w=100&h=100&fit=crop', alt: 'Code' },
|
|
264
|
-
date: '2024-01-15'
|
|
265
|
-
},
|
|
266
|
-
{
|
|
267
|
-
title: 'Vue 3 Composition API',
|
|
268
|
-
slug: '/blog/composition-api',
|
|
269
|
-
img: { src: 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=100&h=100&fit=crop', alt: 'Code' },
|
|
270
|
-
date: '2024-01-10'
|
|
271
|
-
},
|
|
272
|
-
{
|
|
273
|
-
title: 'Building Design Systems',
|
|
274
|
-
slug: '/blog/design-systems',
|
|
275
|
-
img: { src: 'https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=100&h=100&fit=crop', alt: 'Design' },
|
|
276
|
-
date: '2024-01-05'
|
|
277
|
-
}
|
|
278
|
-
]
|
|
279
|
-
</script>
|
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="min-h-screen">
|
|
3
|
-
<div class="bg-white dark:bg-neutral-900 border-b border-neutral-200 dark:border-neutral-800 px-8 py-6">
|
|
4
|
-
<h1 class="text-2xl font-bold text-neutral-900 dark:text-white">App Configuration</h1>
|
|
5
|
-
<p class="mt-2 text-neutral-600 dark:text-neutral-400">
|
|
6
|
-
Full kitchen sink example of app.config.ts for nuxt-x-marketing layer.
|
|
7
|
-
</p>
|
|
8
|
-
</div>
|
|
9
|
-
|
|
10
|
-
<div class="p-8 space-y-8">
|
|
11
|
-
<!-- Copy Button -->
|
|
12
|
-
<div class="flex items-center justify-between">
|
|
13
|
-
<h2 class="text-lg font-semibold">app.config.ts</h2>
|
|
14
|
-
<UButton
|
|
15
|
-
:icon="copied ? 'i-lucide-check' : 'i-lucide-copy'"
|
|
16
|
-
:label="copied ? 'Copied!' : 'Copy to Clipboard'"
|
|
17
|
-
:color="copied ? 'success' : 'neutral'"
|
|
18
|
-
variant="soft"
|
|
19
|
-
@click="copyToClipboard"
|
|
20
|
-
/>
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
<!-- Code Block -->
|
|
24
|
-
<div class="relative">
|
|
25
|
-
<pre
|
|
26
|
-
class="bg-neutral-900 text-neutral-100 rounded-xl p-6 overflow-x-auto text-sm leading-relaxed"
|
|
27
|
-
><code>{{ configCode }}</code></pre>
|
|
28
|
-
</div>
|
|
29
|
-
|
|
30
|
-
<!-- Section Breakdown -->
|
|
31
|
-
<div class="space-y-6">
|
|
32
|
-
<h2 class="text-lg font-semibold">Configuration Sections</h2>
|
|
33
|
-
|
|
34
|
-
<div class="grid md:grid-cols-2 gap-6">
|
|
35
|
-
<!-- UI Config -->
|
|
36
|
-
<article class="bg-neutral-100 dark:bg-neutral-800 rounded-xl p-6">
|
|
37
|
-
<h3 class="font-semibold mb-2 flex items-center gap-2">
|
|
38
|
-
<UIcon name="i-lucide-palette" class="w-5 h-5 text-primary-500" />
|
|
39
|
-
ui
|
|
40
|
-
</h3>
|
|
41
|
-
<p class="text-sm text-neutral-600 dark:text-neutral-400">
|
|
42
|
-
Nuxt UI theme configuration including colors, button variants, and component slots.
|
|
43
|
-
</p>
|
|
44
|
-
</article>
|
|
45
|
-
|
|
46
|
-
<!-- xMarketing Config -->
|
|
47
|
-
<article class="bg-neutral-100 dark:bg-neutral-800 rounded-xl p-6">
|
|
48
|
-
<h3 class="font-semibold mb-2 flex items-center gap-2">
|
|
49
|
-
<UIcon name="i-lucide-settings" class="w-5 h-5 text-primary-500" />
|
|
50
|
-
xMarketing.config
|
|
51
|
-
</h3>
|
|
52
|
-
<p class="text-sm text-neutral-600 dark:text-neutral-400">
|
|
53
|
-
Integration settings for Marker.io feedback and email marketing services.
|
|
54
|
-
</p>
|
|
55
|
-
</article>
|
|
56
|
-
|
|
57
|
-
<!-- Header Config -->
|
|
58
|
-
<article class="bg-neutral-100 dark:bg-neutral-800 rounded-xl p-6">
|
|
59
|
-
<h3 class="font-semibold mb-2 flex items-center gap-2">
|
|
60
|
-
<UIcon name="i-lucide-panel-top" class="w-5 h-5 text-primary-500" />
|
|
61
|
-
xMarketing.header
|
|
62
|
-
</h3>
|
|
63
|
-
<p class="text-sm text-neutral-600 dark:text-neutral-400">
|
|
64
|
-
Logo, navigation links, and header buttons. Supports nested dropdown menus.
|
|
65
|
-
</p>
|
|
66
|
-
</article>
|
|
67
|
-
|
|
68
|
-
<!-- Footer Config -->
|
|
69
|
-
<article class="bg-neutral-100 dark:bg-neutral-800 rounded-xl p-6">
|
|
70
|
-
<h3 class="font-semibold mb-2 flex items-center gap-2">
|
|
71
|
-
<UIcon name="i-lucide-panel-bottom" class="w-5 h-5 text-primary-500" />
|
|
72
|
-
xMarketing.footer
|
|
73
|
-
</h3>
|
|
74
|
-
<p class="text-sm text-neutral-600 dark:text-neutral-400">
|
|
75
|
-
Footer with logo, description, social links, and multi-column link sections.
|
|
76
|
-
</p>
|
|
77
|
-
</article>
|
|
78
|
-
|
|
79
|
-
<!-- Blog Config -->
|
|
80
|
-
<article class="bg-neutral-100 dark:bg-neutral-800 rounded-xl p-6">
|
|
81
|
-
<h3 class="font-semibold mb-2 flex items-center gap-2">
|
|
82
|
-
<UIcon name="i-lucide-file-text" class="w-5 h-5 text-primary-500" />
|
|
83
|
-
xMarketing.blog
|
|
84
|
-
</h3>
|
|
85
|
-
<p class="text-sm text-neutral-600 dark:text-neutral-400">
|
|
86
|
-
Blog section configuration including title, description, and meta tags.
|
|
87
|
-
</p>
|
|
88
|
-
</article>
|
|
89
|
-
|
|
90
|
-
<!-- Legal Config -->
|
|
91
|
-
<article class="bg-neutral-100 dark:bg-neutral-800 rounded-xl p-6">
|
|
92
|
-
<h3 class="font-semibold mb-2 flex items-center gap-2">
|
|
93
|
-
<UIcon name="i-lucide-scale" class="w-5 h-5 text-primary-500" />
|
|
94
|
-
xMarketing.legal
|
|
95
|
-
</h3>
|
|
96
|
-
<p class="text-sm text-neutral-600 dark:text-neutral-400">
|
|
97
|
-
Company legal information for privacy policy, terms, and compliance pages.
|
|
98
|
-
</p>
|
|
99
|
-
</article>
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
</template>
|
|
105
|
-
|
|
106
|
-
<script setup>
|
|
107
|
-
const copied = ref(false)
|
|
108
|
-
|
|
109
|
-
const configCode = `export default defineAppConfig({
|
|
110
|
-
// Nuxt UI Theme Configuration
|
|
111
|
-
ui: {
|
|
112
|
-
primary: "brand",
|
|
113
|
-
colors: {
|
|
114
|
-
primary: "brand",
|
|
115
|
-
secondary: "deep",
|
|
116
|
-
neutral: "zinc",
|
|
117
|
-
},
|
|
118
|
-
header: {
|
|
119
|
-
container: "max-w-screen-2xl container mx-auto",
|
|
120
|
-
},
|
|
121
|
-
button: {
|
|
122
|
-
slots: {
|
|
123
|
-
base: "font-medium tracking-wide",
|
|
124
|
-
},
|
|
125
|
-
variants: {
|
|
126
|
-
size: {
|
|
127
|
-
lg: "px-8 py-4 text-base",
|
|
128
|
-
xl: "px-10 py-5 text-lg",
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
},
|
|
132
|
-
card: {
|
|
133
|
-
slots: {
|
|
134
|
-
root: "overflow-hidden",
|
|
135
|
-
body: "p-0",
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
|
|
140
|
-
// X Marketing Layer Configuration
|
|
141
|
-
xMarketing: {
|
|
142
|
-
// Project Identity
|
|
143
|
-
name: "My SaaS Product",
|
|
144
|
-
url: "https://mysaas.com",
|
|
145
|
-
|
|
146
|
-
// Third-party Integrations
|
|
147
|
-
config: {
|
|
148
|
-
markerProjectId: "your-marker-project-id",
|
|
149
|
-
emailMarketingNewsletters: {
|
|
150
|
-
organizationId: "your-org-id",
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
|
|
154
|
-
// Header / Navigation
|
|
155
|
-
header: {
|
|
156
|
-
logo: {
|
|
157
|
-
src: "/images/logo.svg",
|
|
158
|
-
srcDark: "/images/logo-dark.svg",
|
|
159
|
-
alt: "My SaaS Logo",
|
|
160
|
-
},
|
|
161
|
-
nav: {
|
|
162
|
-
links: [
|
|
163
|
-
{ label: "Features", to: "#features" },
|
|
164
|
-
{ label: "Pricing", to: "#pricing" },
|
|
165
|
-
{
|
|
166
|
-
label: "Resources",
|
|
167
|
-
children: [
|
|
168
|
-
{ label: "Documentation", to: "/docs" },
|
|
169
|
-
{ label: "Blog", to: "/blog" },
|
|
170
|
-
{ label: "Changelog", to: "/changelog" },
|
|
171
|
-
],
|
|
172
|
-
},
|
|
173
|
-
{ label: "About", to: "/about" },
|
|
174
|
-
],
|
|
175
|
-
buttons: [
|
|
176
|
-
{
|
|
177
|
-
label: "Sign In",
|
|
178
|
-
to: "/login",
|
|
179
|
-
variant: "ghost",
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
label: "Get Started",
|
|
183
|
-
to: "/signup",
|
|
184
|
-
color: "primary",
|
|
185
|
-
},
|
|
186
|
-
],
|
|
187
|
-
},
|
|
188
|
-
},
|
|
189
|
-
|
|
190
|
-
// Footer
|
|
191
|
-
footer: {
|
|
192
|
-
logo: {
|
|
193
|
-
src: "/images/logo.svg",
|
|
194
|
-
alt: "My SaaS Logo",
|
|
195
|
-
},
|
|
196
|
-
bg: {
|
|
197
|
-
color: "bg-neutral-900",
|
|
198
|
-
img: {
|
|
199
|
-
src: "/images/footer-pattern.svg",
|
|
200
|
-
alt: "",
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
body: "Build faster with our comprehensive toolkit. Trusted by thousands of developers worldwide.",
|
|
204
|
-
socials: [
|
|
205
|
-
{ name: "GitHub", url: "https://github.com/mycompany", icon: "i-lucide-github" },
|
|
206
|
-
{ name: "Twitter", url: "https://twitter.com/mycompany", icon: "i-lucide-twitter" },
|
|
207
|
-
{ name: "LinkedIn", url: "https://linkedin.com/company/mycompany", icon: "i-lucide-linkedin" },
|
|
208
|
-
{ name: "Discord", url: "https://discord.gg/mycompany", icon: "i-lucide-message-circle" },
|
|
209
|
-
],
|
|
210
|
-
columns: [
|
|
211
|
-
{
|
|
212
|
-
headerLabel: "Product",
|
|
213
|
-
links: [
|
|
214
|
-
{ label: "Features", to: "#features" },
|
|
215
|
-
{ label: "Pricing", to: "#pricing" },
|
|
216
|
-
{ label: "Changelog", to: "/changelog" },
|
|
217
|
-
{ label: "Roadmap", to: "/roadmap" },
|
|
218
|
-
{ label: "Integrations", to: "/integrations" },
|
|
219
|
-
],
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
headerLabel: "Company",
|
|
223
|
-
links: [
|
|
224
|
-
{ label: "About", to: "/about" },
|
|
225
|
-
{ label: "Blog", to: "/blog" },
|
|
226
|
-
{ label: "Careers", to: "/careers" },
|
|
227
|
-
{ label: "Press Kit", to: "/press" },
|
|
228
|
-
{ label: "Contact", to: "/contact" },
|
|
229
|
-
],
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
headerLabel: "Resources",
|
|
233
|
-
links: [
|
|
234
|
-
{ label: "Documentation", to: "/docs" },
|
|
235
|
-
{ label: "API Reference", to: "/api" },
|
|
236
|
-
{ label: "Guides", to: "/guides" },
|
|
237
|
-
{ label: "Help Center", to: "/help" },
|
|
238
|
-
{ label: "Community", to: "/community" },
|
|
239
|
-
],
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
headerLabel: "Legal",
|
|
243
|
-
links: [
|
|
244
|
-
{ label: "Privacy Policy", to: "/privacy" },
|
|
245
|
-
{ label: "Terms of Service", to: "/terms" },
|
|
246
|
-
{ label: "Cookie Policy", to: "/cookies" },
|
|
247
|
-
{ label: "GDPR", to: "/gdpr" },
|
|
248
|
-
],
|
|
249
|
-
},
|
|
250
|
-
],
|
|
251
|
-
},
|
|
252
|
-
|
|
253
|
-
// Blog Configuration
|
|
254
|
-
blog: {
|
|
255
|
-
active: true,
|
|
256
|
-
title: "Blog",
|
|
257
|
-
description: "Insights, tutorials, and updates from our team.",
|
|
258
|
-
meta: {
|
|
259
|
-
title: "Blog | My SaaS",
|
|
260
|
-
description: "Read the latest insights, tutorials, and product updates from the My SaaS team.",
|
|
261
|
-
},
|
|
262
|
-
},
|
|
263
|
-
|
|
264
|
-
// Legal / Company Information
|
|
265
|
-
legal: {
|
|
266
|
-
companyName: "My SaaS Inc.",
|
|
267
|
-
companyAddress: "123 Innovation Drive, San Francisco, CA 94107",
|
|
268
|
-
companyEmail: "legal@mysaas.com",
|
|
269
|
-
companyPhone: "+1 (555) 123-4567",
|
|
270
|
-
registrationNumber: "12345678",
|
|
271
|
-
vatNumber: "US123456789",
|
|
272
|
-
jurisdiction: "State of Delaware, USA",
|
|
273
|
-
lastUpdated: "2024-01-01",
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
});`
|
|
277
|
-
|
|
278
|
-
async function copyToClipboard() {
|
|
279
|
-
try {
|
|
280
|
-
await navigator.clipboard.writeText(configCode)
|
|
281
|
-
copied.value = true
|
|
282
|
-
setTimeout(() => {
|
|
283
|
-
copied.value = false
|
|
284
|
-
}, 2000)
|
|
285
|
-
} catch (err) {
|
|
286
|
-
console.error('Failed to copy:', err)
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
</script>
|