@xenterprises/nuxt-x-marketing 0.0.23 → 1.0.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/.claude/settings.local.json +22 -0
- package/.playground/app.config.ts +44 -45
- package/.playground/app.vue +263 -0
- package/.playground/components/AppFooter.vue +103 -0
- package/.playground/components/AppHeader.vue +41 -0
- package/.playground/components/CodeExample.vue +70 -0
- package/.playground/components/ComponentPlayground.vue +117 -0
- package/.playground/components/DocsHeader.vue +19 -0
- package/.playground/layouts/default.vue +13 -3
- package/.playground/layouts/docs-layout.vue +161 -0
- package/.playground/layouts/docs.vue +11 -0
- package/.playground/package-lock.json +6 -0
- package/.playground/pages/blog/author.vue +145 -0
- package/.playground/pages/blog/card.vue +149 -0
- package/.playground/pages/blog/cta.vue +131 -0
- package/.playground/pages/blog/detail.vue +379 -0
- package/.playground/pages/blog/list.vue +261 -0
- package/.playground/pages/blog/navigation.vue +228 -0
- package/.playground/pages/blog/sidebar.vue +279 -0
- package/.playground/pages/config.vue +289 -0
- package/.playground/pages/content/comparison.vue +253 -0
- package/.playground/pages/content/cta.vue +245 -0
- package/.playground/pages/content/features.vue +217 -0
- package/.playground/pages/content/newsletter-section.vue +260 -0
- package/.playground/pages/content/newsletter.vue +200 -0
- package/.playground/pages/content/pricing.vue +335 -0
- package/.playground/pages/content/testimonials.vue +188 -0
- package/.playground/pages/hero.vue +257 -0
- package/.playground/pages/index.vue +379 -2
- package/.playground/pages/layout/footer.vue +210 -0
- package/.playground/pages/layout/legal-footer.vue +121 -0
- package/.playground/pages/layout/navbar.vue +285 -0
- package/.playground/pages/layout/section.vue +266 -0
- package/.playground/pages/layout/x-legal.vue +199 -0
- package/.playground/pages/modals/feature-modal.vue +320 -0
- package/.playground/pages/modals/image-lightbox.vue +277 -0
- package/.playground/pages/modals/video-modal.vue +222 -0
- package/.playground/pages/notifications/announcement-bar.vue +164 -0
- package/.playground/pages/notifications/cookie-banner.vue +210 -0
- package/.playground/pages/notifications/cookie-toast.vue +143 -0
- package/.playground/pages/notifications/gdpr.vue +276 -0
- package/.playground/pages/notifications/social-proof-toast.vue +255 -0
- package/.playground/pages/ui/badge.vue +161 -0
- package/.playground/pages/ui/bg-pattern.vue +177 -0
- package/.playground/pages/ui/glass-card.vue +179 -0
- package/.playground/pages/ui/glow-divider.vue +179 -0
- package/.playground/pages/ui/promo-card.vue +259 -0
- package/.playground/pages/ui/section-stitch.vue +411 -0
- package/.playground/pages/utilities/back-to-top.vue +153 -0
- package/.playground/pages/utilities/popup-chat.vue +224 -0
- package/README.md +799 -164
- package/app/app.config.ts +88 -2
- package/app/app.vue +106 -11
- package/app/assets/css/x-marketing.css +668 -0
- package/app/components/X/Footer/XLegal/index.vue +63 -26
- package/app/components/X/Footer/index.vue +89 -89
- package/app/components/X/Header/App.vue +63 -0
- package/app/components/X/Mark/Blog/Author.vue +170 -0
- package/app/components/X/Mark/Blog/CTANewsletter.vue +197 -0
- package/app/components/X/Mark/Blog/Card.vue +117 -0
- package/app/components/X/Mark/Blog/Detail.vue +240 -0
- package/app/components/X/Mark/Blog/List.vue +156 -0
- package/app/components/X/Mark/Blog/Navigation.vue +100 -0
- package/app/components/X/Mark/Blog/Sidebar.vue +160 -0
- package/app/components/X/Mark/Button/BackToTop.vue +99 -0
- package/app/components/X/Mark/CTA/index.vue +294 -0
- package/app/components/X/Mark/Card/Glass.vue +64 -0
- package/app/components/X/Mark/Card/Promo.vue +164 -0
- package/app/components/X/Mark/Divider/Glow.vue +113 -0
- package/app/components/X/Mark/Features/index.vue +194 -0
- package/app/components/X/Mark/Hero/index.vue +217 -0
- package/app/components/X/Mark/Layout/AnnouncementBar.vue +139 -0
- package/app/components/X/Mark/Layout/Footer.vue +160 -0
- package/app/components/X/Mark/Layout/FooterLegal.vue +42 -0
- package/app/components/X/Mark/Layout/Navbar.vue +267 -0
- package/app/components/X/Mark/Modal/Chat.vue +151 -0
- package/app/components/X/Mark/Modal/Feature.vue +197 -0
- package/app/components/X/Mark/Modal/Image.vue +226 -0
- package/app/components/X/Mark/Modal/Video.vue +203 -0
- package/app/components/X/Mark/Modal/index.vue +133 -0
- package/app/components/X/Mark/Newsletter/Form.vue +174 -0
- package/app/components/X/Mark/Pattern/Bg.vue +86 -0
- package/app/components/X/Mark/Pricing/Comparison.vue +126 -0
- package/app/components/X/Mark/Pricing/Plans.vue +181 -0
- package/app/components/X/Mark/Privacy/CookieBanner.vue +112 -0
- package/app/components/X/Mark/Privacy/CookieToast.vue +43 -0
- package/app/components/X/Mark/Privacy/GDPR.vue +245 -0
- package/app/components/X/Mark/Section/Newsletter.vue +183 -0
- package/app/components/X/Mark/Section/Stitch.vue +156 -0
- package/app/components/X/Mark/Section/index.vue +151 -0
- package/app/components/X/Mark/SocialProof/Badge.vue +102 -0
- package/app/components/X/Mark/SocialProof/Testimonials.vue +326 -0
- package/app/components/X/Mark/SocialProof/Toast.vue +136 -0
- package/app/components/X/Mark/_archive/Pattern/Background.vue +83 -0
- package/app/components/X/Mark/_archive/Pattern/CheckBg.vue +35 -0
- package/app/components/X/Mark/_archive/Pattern/CircuitBg.vue +41 -0
- package/app/components/X/Mark/_archive/Pattern/DotsBg.vue +35 -0
- package/app/components/X/Mark/_archive/Pattern/GlowDivider.vue +86 -0
- package/app/components/X/Mark/_archive/Pattern/HexBg.vue +35 -0
- package/app/components/X/Mark/_archive/Pattern/PlaidBg.vue +47 -0
- package/app/components/X/Mark/_archive/Pattern/SectionStitch.vue +168 -0
- package/app/components/X/Mark/_archive/Pattern/WaveBg.vue +41 -0
- package/app/components/X/_archive/Newsletter/Form.vue +123 -0
- package/app/components/X/_archive/Newsletter/Section.vue +131 -0
- package/app/composables/useParallax.ts +124 -0
- package/app/composables/useScrollReveal.ts +92 -0
- package/app/pages/index.vue +210 -0
- package/app/plugins/marketing.client.ts +13 -0
- package/app/types/marketing.d.ts +268 -0
- package/componentList.json +511 -0
- package/nuxt.config.ts +6 -13
- package/package.json +21 -9
- package/.editorconfig +0 -12
- package/app/assets/css/main.css +0 -2
- package/app/components/X/Marketing/Sections/EmailSubscription/index.vue +0 -129
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(curl:*)",
|
|
5
|
+
"Bash(npm run dev:*)",
|
|
6
|
+
"Bash(cat:*)",
|
|
7
|
+
"Bash(npm install:*)",
|
|
8
|
+
"Bash(find:*)",
|
|
9
|
+
"Bash(ls:*)",
|
|
10
|
+
"Skill(frontend-design)",
|
|
11
|
+
"Bash(git log:*)",
|
|
12
|
+
"Bash(test:*)",
|
|
13
|
+
"Bash(timeout 300 npx playwright test:*)",
|
|
14
|
+
"Bash(npx playwright test:*)",
|
|
15
|
+
"Bash(npx playwright install:*)",
|
|
16
|
+
"Bash({} ;)",
|
|
17
|
+
"mcp__plugin_context7_context7__resolve-library-id",
|
|
18
|
+
"mcp__plugin_context7_context7__query-docs",
|
|
19
|
+
"Bash(git reset:*)"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,72 +1,71 @@
|
|
|
1
1
|
export default defineAppConfig({
|
|
2
2
|
xMarketing: {
|
|
3
|
-
name: "
|
|
3
|
+
name: "X Marketing Components",
|
|
4
4
|
config: {
|
|
5
|
-
markerProjectId: "
|
|
5
|
+
markerProjectId: "",
|
|
6
6
|
emailMarketingNewsletters: {
|
|
7
|
-
organizationId: "
|
|
7
|
+
organizationId: "", // Disabled for documentation playground
|
|
8
8
|
},
|
|
9
9
|
},
|
|
10
10
|
header: {
|
|
11
11
|
logo: {
|
|
12
12
|
src: "https://cdn.x.enterprises/logo-x.png",
|
|
13
|
-
|
|
13
|
+
srcDark: "https://cdn.x.enterprises/logo-x.png",
|
|
14
|
+
alt: "nuxt-x-marketing",
|
|
14
15
|
},
|
|
15
16
|
nav: {
|
|
16
|
-
buttons: [
|
|
17
|
-
{
|
|
18
|
-
label: "Get Started",
|
|
19
|
-
to: "/get-started",
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
17
|
links: [
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
},
|
|
18
|
+
{ label: "Features", to: "#features" },
|
|
19
|
+
{ label: "Testimonials", to: "#testimonials" },
|
|
20
|
+
{ label: "Pricing", to: "#pricing" },
|
|
21
|
+
{ label: "Blog", to: "/blog/card" },
|
|
22
|
+
],
|
|
23
|
+
buttons: [
|
|
24
|
+
{ label: "Sign In", to: "#" },
|
|
25
|
+
{ label: "Get Started", to: "#", color: "primary" },
|
|
31
26
|
],
|
|
32
27
|
},
|
|
33
28
|
},
|
|
34
29
|
footer: {
|
|
30
|
+
bg: {
|
|
31
|
+
color: "bg-gray-900",
|
|
32
|
+
},
|
|
35
33
|
logo: {
|
|
36
34
|
src: "https://cdn.x.enterprises/logo-x.png",
|
|
37
|
-
alt: "",
|
|
35
|
+
alt: "nuxt-x-marketing",
|
|
38
36
|
},
|
|
39
|
-
|
|
40
|
-
color: "",
|
|
41
|
-
img: {
|
|
42
|
-
src: "https://cdn.x.enterprises/bg-gradient.svg",
|
|
43
|
-
alt: "Gradient background",
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
body: "Rock Your Band's World with Bandmate - the all-in-one platform designed to streamline your band's management, collaboration, and growth. Stay connected, stay inspired, and keep rocking with Bandmate! Follow us on social media and join our newsletter for the latest updates, tips, and industry news. Let's make music together!",
|
|
37
|
+
body: "A comprehensive collection of beautifully designed marketing components built with Nuxt UI v4 and Tailwind CSS. Perfect for landing pages, marketing sites, and SaaS products.",
|
|
47
38
|
socials: [
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
icon: "i-simple-icons-instagram",
|
|
52
|
-
},
|
|
39
|
+
{ name: "GitHub", url: "https://github.com", icon: "i-lucide-github" },
|
|
40
|
+
{ name: "Twitter", url: "https://twitter.com", icon: "i-lucide-twitter" },
|
|
41
|
+
{ name: "LinkedIn", url: "https://linkedin.com", icon: "i-lucide-linkedin" },
|
|
53
42
|
],
|
|
54
43
|
columns: [
|
|
55
44
|
{
|
|
56
|
-
headerLabel: "
|
|
45
|
+
headerLabel: "Product",
|
|
46
|
+
links: [
|
|
47
|
+
{ label: "Features", to: "#features" },
|
|
48
|
+
{ label: "Pricing", to: "#pricing" },
|
|
49
|
+
{ label: "Changelog", to: "#" },
|
|
50
|
+
{ label: "Roadmap", to: "#" },
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
headerLabel: "Company",
|
|
55
|
+
links: [
|
|
56
|
+
{ label: "About", to: "#" },
|
|
57
|
+
{ label: "Blog", to: "/blog/card" },
|
|
58
|
+
{ label: "Careers", to: "#" },
|
|
59
|
+
{ label: "Contact", to: "#" },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
headerLabel: "Resources",
|
|
57
64
|
links: [
|
|
58
|
-
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
label: "Pricing",
|
|
64
|
-
to: "/pricing",
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
label: "Customers",
|
|
68
|
-
to: "/customers",
|
|
69
|
-
},
|
|
65
|
+
{ label: "Documentation", to: "#" },
|
|
66
|
+
{ label: "Guides", to: "#" },
|
|
67
|
+
{ label: "Help Center", to: "#" },
|
|
68
|
+
{ label: "Community", to: "#" },
|
|
70
69
|
],
|
|
71
70
|
},
|
|
72
71
|
],
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="min-h-screen bg-neutral-50 dark:bg-neutral-950">
|
|
3
|
+
<!-- Sidebar Navigation -->
|
|
4
|
+
<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">
|
|
5
|
+
<!-- Header -->
|
|
6
|
+
<div class="p-6 border-b border-neutral-200 dark:border-neutral-800">
|
|
7
|
+
<NuxtLink to="/" class="block">
|
|
8
|
+
<h1 class="text-lg font-bold text-neutral-900 dark:text-white">nuxt-x-marketing</h1>
|
|
9
|
+
<p class="text-sm text-neutral-500 dark:text-neutral-400 mt-1">Component Playground</p>
|
|
10
|
+
</NuxtLink>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<!-- Dark Mode Toggle -->
|
|
14
|
+
<div class="px-6 py-4 border-b border-neutral-200 dark:border-neutral-800">
|
|
15
|
+
<button
|
|
16
|
+
@click="toggleDarkMode"
|
|
17
|
+
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"
|
|
18
|
+
>
|
|
19
|
+
<UIcon :name="isDark ? 'i-lucide-sun' : 'i-lucide-moon'" class="w-4 h-4" />
|
|
20
|
+
<span>{{ isDark ? 'Light Mode' : 'Dark Mode' }}</span>
|
|
21
|
+
</button>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<!-- Navigation -->
|
|
25
|
+
<nav class="p-4 space-y-6">
|
|
26
|
+
<!-- Getting Started -->
|
|
27
|
+
<div>
|
|
28
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Getting Started</h3>
|
|
29
|
+
<ul class="space-y-1">
|
|
30
|
+
<li>
|
|
31
|
+
<NuxtLink
|
|
32
|
+
to="/"
|
|
33
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-colors"
|
|
34
|
+
: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'"
|
|
35
|
+
>
|
|
36
|
+
<UIcon name="i-lucide-home" class="w-4 h-4" />
|
|
37
|
+
<span>Kitchen Sink</span>
|
|
38
|
+
</NuxtLink>
|
|
39
|
+
</li>
|
|
40
|
+
<li>
|
|
41
|
+
<NuxtLink
|
|
42
|
+
to="/config"
|
|
43
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm font-medium transition-colors"
|
|
44
|
+
: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'"
|
|
45
|
+
>
|
|
46
|
+
<UIcon name="i-lucide-settings" class="w-4 h-4" />
|
|
47
|
+
<span>App Config</span>
|
|
48
|
+
</NuxtLink>
|
|
49
|
+
</li>
|
|
50
|
+
</ul>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<!-- Layout -->
|
|
54
|
+
<div>
|
|
55
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Layout</h3>
|
|
56
|
+
<ul class="space-y-1">
|
|
57
|
+
<li v-for="item in navItems.layout" :key="item.to">
|
|
58
|
+
<NuxtLink
|
|
59
|
+
:to="item.to"
|
|
60
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
61
|
+
: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'"
|
|
62
|
+
>
|
|
63
|
+
<span>{{ item.label }}</span>
|
|
64
|
+
</NuxtLink>
|
|
65
|
+
</li>
|
|
66
|
+
</ul>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<!-- Hero -->
|
|
70
|
+
<div>
|
|
71
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Hero</h3>
|
|
72
|
+
<ul class="space-y-1">
|
|
73
|
+
<li>
|
|
74
|
+
<NuxtLink
|
|
75
|
+
to="/hero"
|
|
76
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
77
|
+
: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'"
|
|
78
|
+
>
|
|
79
|
+
<span>Hero</span>
|
|
80
|
+
</NuxtLink>
|
|
81
|
+
</li>
|
|
82
|
+
</ul>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<!-- Content -->
|
|
86
|
+
<div>
|
|
87
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Content</h3>
|
|
88
|
+
<ul class="space-y-1">
|
|
89
|
+
<li v-for="item in navItems.content" :key="item.to">
|
|
90
|
+
<NuxtLink
|
|
91
|
+
:to="item.to"
|
|
92
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
93
|
+
: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'"
|
|
94
|
+
>
|
|
95
|
+
<span>{{ item.label }}</span>
|
|
96
|
+
</NuxtLink>
|
|
97
|
+
</li>
|
|
98
|
+
</ul>
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
<!-- Blog -->
|
|
102
|
+
<div>
|
|
103
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Blog</h3>
|
|
104
|
+
<ul class="space-y-1">
|
|
105
|
+
<li v-for="item in navItems.blog" :key="item.to">
|
|
106
|
+
<NuxtLink
|
|
107
|
+
:to="item.to"
|
|
108
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
109
|
+
: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'"
|
|
110
|
+
>
|
|
111
|
+
<span>{{ item.label }}</span>
|
|
112
|
+
</NuxtLink>
|
|
113
|
+
</li>
|
|
114
|
+
</ul>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<!-- UI Elements -->
|
|
118
|
+
<div>
|
|
119
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">UI Elements</h3>
|
|
120
|
+
<ul class="space-y-1">
|
|
121
|
+
<li v-for="item in navItems.ui" :key="item.to">
|
|
122
|
+
<NuxtLink
|
|
123
|
+
:to="item.to"
|
|
124
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
125
|
+
: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'"
|
|
126
|
+
>
|
|
127
|
+
<span>{{ item.label }}</span>
|
|
128
|
+
</NuxtLink>
|
|
129
|
+
</li>
|
|
130
|
+
</ul>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<!-- Modals -->
|
|
134
|
+
<div>
|
|
135
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Modals</h3>
|
|
136
|
+
<ul class="space-y-1">
|
|
137
|
+
<li v-for="item in navItems.modals" :key="item.to">
|
|
138
|
+
<NuxtLink
|
|
139
|
+
:to="item.to"
|
|
140
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
141
|
+
: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'"
|
|
142
|
+
>
|
|
143
|
+
<span>{{ item.label }}</span>
|
|
144
|
+
</NuxtLink>
|
|
145
|
+
</li>
|
|
146
|
+
</ul>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<!-- Notifications -->
|
|
150
|
+
<div>
|
|
151
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Notifications</h3>
|
|
152
|
+
<ul class="space-y-1">
|
|
153
|
+
<li v-for="item in navItems.notifications" :key="item.to">
|
|
154
|
+
<NuxtLink
|
|
155
|
+
:to="item.to"
|
|
156
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
157
|
+
: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'"
|
|
158
|
+
>
|
|
159
|
+
<span>{{ item.label }}</span>
|
|
160
|
+
</NuxtLink>
|
|
161
|
+
</li>
|
|
162
|
+
</ul>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<!-- Utilities -->
|
|
166
|
+
<div>
|
|
167
|
+
<h3 class="px-3 text-xs font-semibold text-neutral-400 dark:text-neutral-500 uppercase tracking-wider mb-2">Utilities</h3>
|
|
168
|
+
<ul class="space-y-1">
|
|
169
|
+
<li v-for="item in navItems.utilities" :key="item.to">
|
|
170
|
+
<NuxtLink
|
|
171
|
+
:to="item.to"
|
|
172
|
+
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors"
|
|
173
|
+
: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'"
|
|
174
|
+
>
|
|
175
|
+
<span>{{ item.label }}</span>
|
|
176
|
+
</NuxtLink>
|
|
177
|
+
</li>
|
|
178
|
+
</ul>
|
|
179
|
+
</div>
|
|
180
|
+
</nav>
|
|
181
|
+
|
|
182
|
+
<!-- Footer -->
|
|
183
|
+
<div class="p-4 border-t border-neutral-200 dark:border-neutral-800 mt-auto">
|
|
184
|
+
<p class="text-xs text-neutral-400 dark:text-neutral-500 text-center">33 Components</p>
|
|
185
|
+
</div>
|
|
186
|
+
</aside>
|
|
187
|
+
|
|
188
|
+
<!-- Main Content -->
|
|
189
|
+
<main class="ml-64">
|
|
190
|
+
<NuxtPage />
|
|
191
|
+
</main>
|
|
192
|
+
|
|
193
|
+
<!-- Nuxt UI Providers for modals and toasts -->
|
|
194
|
+
<UModals />
|
|
195
|
+
<UToaster />
|
|
196
|
+
</div>
|
|
197
|
+
</template>
|
|
198
|
+
|
|
199
|
+
<script setup>
|
|
200
|
+
const colorMode = useColorMode()
|
|
201
|
+
const route = useRoute()
|
|
202
|
+
|
|
203
|
+
const isDark = computed(() => colorMode.value === 'dark')
|
|
204
|
+
|
|
205
|
+
function toggleDarkMode() {
|
|
206
|
+
colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark'
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function isActive(path) {
|
|
210
|
+
return route.path === path
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const navItems = {
|
|
214
|
+
layout: [
|
|
215
|
+
{ label: 'Navbar', to: '/layout/navbar' },
|
|
216
|
+
{ label: 'Section', to: '/layout/section' },
|
|
217
|
+
{ label: 'Footer', to: '/layout/footer' },
|
|
218
|
+
{ label: 'Legal Footer', to: '/layout/legal-footer' },
|
|
219
|
+
{ label: 'X Legal Footer', to: '/layout/x-legal' }
|
|
220
|
+
],
|
|
221
|
+
content: [
|
|
222
|
+
{ label: 'Features', to: '/content/features' },
|
|
223
|
+
{ label: 'Testimonials', to: '/content/testimonials' },
|
|
224
|
+
{ label: 'Pricing', to: '/content/pricing' },
|
|
225
|
+
{ label: 'Comparison', to: '/content/comparison' },
|
|
226
|
+
{ label: 'Newsletter', to: '/content/newsletter' },
|
|
227
|
+
{ label: 'CTA', to: '/content/cta' }
|
|
228
|
+
],
|
|
229
|
+
blog: [
|
|
230
|
+
{ label: 'Card', to: '/blog/card' },
|
|
231
|
+
{ label: 'List', to: '/blog/list' },
|
|
232
|
+
{ label: 'Detail', to: '/blog/detail' },
|
|
233
|
+
{ label: 'Sidebar', to: '/blog/sidebar' },
|
|
234
|
+
{ label: 'Author', to: '/blog/author' },
|
|
235
|
+
{ label: 'Navigation', to: '/blog/navigation' },
|
|
236
|
+
{ label: 'Newsletter CTA', to: '/blog/cta' }
|
|
237
|
+
],
|
|
238
|
+
ui: [
|
|
239
|
+
{ label: 'Badge', to: '/ui/badge' },
|
|
240
|
+
{ label: 'Glass Card', to: '/ui/glass-card' },
|
|
241
|
+
{ label: 'Promo Card', to: '/ui/promo-card' },
|
|
242
|
+
{ label: 'Glow Divider', to: '/ui/glow-divider' },
|
|
243
|
+
{ label: 'Bg Pattern', to: '/ui/bg-pattern' },
|
|
244
|
+
{ label: 'Section Stitch', to: '/ui/section-stitch' }
|
|
245
|
+
],
|
|
246
|
+
modals: [
|
|
247
|
+
{ label: 'Video Modal', to: '/modals/video-modal' },
|
|
248
|
+
{ label: 'Image Lightbox', to: '/modals/image-lightbox' },
|
|
249
|
+
{ label: 'Feature Modal', to: '/modals/feature-modal' }
|
|
250
|
+
],
|
|
251
|
+
notifications: [
|
|
252
|
+
{ label: 'Announcement Bar', to: '/notifications/announcement-bar' },
|
|
253
|
+
{ label: 'Cookie Banner', to: '/notifications/cookie-banner' },
|
|
254
|
+
{ label: 'Cookie Toast', to: '/notifications/cookie-toast' },
|
|
255
|
+
{ label: 'GDPR', to: '/notifications/gdpr' },
|
|
256
|
+
{ label: 'Social Proof Toast', to: '/notifications/social-proof-toast' }
|
|
257
|
+
],
|
|
258
|
+
utilities: [
|
|
259
|
+
{ label: 'Back to Top', to: '/utilities/back-to-top' },
|
|
260
|
+
{ label: 'Popup Chat', to: '/utilities/popup-chat' }
|
|
261
|
+
]
|
|
262
|
+
}
|
|
263
|
+
</script>
|
|
@@ -0,0 +1,103 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
|