@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,515 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="min-h-screen">
|
|
3
|
-
<div
|
|
4
|
-
class="bg-white dark:bg-neutral-900 border-b border-neutral-200 dark:border-neutral-800 px-8 py-6"
|
|
5
|
-
>
|
|
6
|
-
<h1 class="text-2xl font-bold text-neutral-900 dark:text-white">
|
|
7
|
-
Social Proof Toast
|
|
8
|
-
</h1>
|
|
9
|
-
<p class="mt-2 text-neutral-600 dark:text-neutral-400">
|
|
10
|
-
Automated notifications showing recent customer activity.
|
|
11
|
-
</p>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<div class="p-8 space-y-12">
|
|
15
|
-
<!-- Demo -->
|
|
16
|
-
<section>
|
|
17
|
-
<h2 class="text-lg font-semibold mb-4">Live Demo</h2>
|
|
18
|
-
<p class="text-sm text-neutral-500 mb-4">
|
|
19
|
-
The social proof notifications will cycle through automatically.
|
|
20
|
-
Select placement, type, and click Start Demo.
|
|
21
|
-
</p>
|
|
22
|
-
<div class="flex flex-wrap items-center gap-3">
|
|
23
|
-
<UButton @click="startDemo">Start Demo</UButton>
|
|
24
|
-
<UButton color="neutral" variant="outline" @click="stopDemo"
|
|
25
|
-
>Stop Demo</UButton
|
|
26
|
-
>
|
|
27
|
-
<div class="flex items-center gap-2 ml-4">
|
|
28
|
-
<span class="text-sm text-neutral-500">Placement:</span>
|
|
29
|
-
<UButtonGroup>
|
|
30
|
-
<UButton
|
|
31
|
-
size="sm"
|
|
32
|
-
:variant="demoPlacement === 'bottomLeft' ? 'solid' : 'outline'"
|
|
33
|
-
@click="demoPlacement = 'bottomLeft'"
|
|
34
|
-
>Bottom Left</UButton
|
|
35
|
-
>
|
|
36
|
-
<UButton
|
|
37
|
-
size="sm"
|
|
38
|
-
:variant="demoPlacement === 'bottomRight' ? 'solid' : 'outline'"
|
|
39
|
-
@click="demoPlacement = 'bottomRight'"
|
|
40
|
-
>Bottom Right</UButton
|
|
41
|
-
>
|
|
42
|
-
<UButton
|
|
43
|
-
size="sm"
|
|
44
|
-
:variant="demoPlacement === 'topLeft' ? 'solid' : 'outline'"
|
|
45
|
-
@click="demoPlacement = 'topLeft'"
|
|
46
|
-
>Top Left</UButton
|
|
47
|
-
>
|
|
48
|
-
<UButton
|
|
49
|
-
size="sm"
|
|
50
|
-
:variant="demoPlacement === 'topRight' ? 'solid' : 'outline'"
|
|
51
|
-
@click="demoPlacement = 'topRight'"
|
|
52
|
-
>Top Right</UButton
|
|
53
|
-
>
|
|
54
|
-
</UButtonGroup>
|
|
55
|
-
</div>
|
|
56
|
-
<div class="flex items-center gap-2 ml-4">
|
|
57
|
-
<span class="text-sm text-neutral-500">Type:</span>
|
|
58
|
-
<UButtonGroup>
|
|
59
|
-
<UButton
|
|
60
|
-
size="sm"
|
|
61
|
-
:variant="demoType === 'success' ? 'solid' : 'outline'"
|
|
62
|
-
@click="demoType = 'success'"
|
|
63
|
-
>Success</UButton
|
|
64
|
-
>
|
|
65
|
-
<UButton
|
|
66
|
-
size="sm"
|
|
67
|
-
:variant="demoType === 'error' ? 'solid' : 'outline'"
|
|
68
|
-
@click="demoType = 'error'"
|
|
69
|
-
>Error</UButton
|
|
70
|
-
>
|
|
71
|
-
<UButton
|
|
72
|
-
size="sm"
|
|
73
|
-
:variant="demoType === 'warning' ? 'solid' : 'outline'"
|
|
74
|
-
@click="demoType = 'warning'"
|
|
75
|
-
>Warning</UButton
|
|
76
|
-
>
|
|
77
|
-
<UButton
|
|
78
|
-
size="sm"
|
|
79
|
-
:variant="demoType === 'info' ? 'solid' : 'outline'"
|
|
80
|
-
@click="demoType = 'info'"
|
|
81
|
-
>Info</UButton
|
|
82
|
-
>
|
|
83
|
-
</UButtonGroup>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
</section>
|
|
87
|
-
|
|
88
|
-
<!-- Type Examples -->
|
|
89
|
-
<section>
|
|
90
|
-
<h2 class="text-lg font-semibold mb-4">Toast Types</h2>
|
|
91
|
-
<div class="grid md:grid-cols-2 gap-4">
|
|
92
|
-
<!-- Success -->
|
|
93
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-6">
|
|
94
|
-
<h3 class="font-medium mb-4 text-green-600 dark:text-green-400">
|
|
95
|
-
Success
|
|
96
|
-
</h3>
|
|
97
|
-
<div
|
|
98
|
-
class="bg-white dark:bg-neutral-900 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-4 flex items-center gap-3"
|
|
99
|
-
>
|
|
100
|
-
<img
|
|
101
|
-
src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=100&h=100&fit=crop"
|
|
102
|
-
alt="Customer"
|
|
103
|
-
class="w-10 h-10 rounded-full object-cover"
|
|
104
|
-
/>
|
|
105
|
-
<div class="flex-1">
|
|
106
|
-
<p class="text-sm text-neutral-900 dark:text-white">
|
|
107
|
-
<span class="font-medium">Sarah M.</span>
|
|
108
|
-
just purchased Pro Plan
|
|
109
|
-
</p>
|
|
110
|
-
<p class="text-xs text-neutral-500 mt-0.5">2 minutes ago</p>
|
|
111
|
-
</div>
|
|
112
|
-
<UIcon
|
|
113
|
-
name="i-lucide-badge-check"
|
|
114
|
-
class="w-5 h-5 text-green-500 flex-shrink-0"
|
|
115
|
-
/>
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
|
|
119
|
-
<!-- Error -->
|
|
120
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-6">
|
|
121
|
-
<h3 class="font-medium mb-4 text-red-600 dark:text-red-400">
|
|
122
|
-
Error
|
|
123
|
-
</h3>
|
|
124
|
-
<div
|
|
125
|
-
class="bg-white dark:bg-neutral-900 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-4 flex items-center gap-3"
|
|
126
|
-
>
|
|
127
|
-
<div
|
|
128
|
-
class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"
|
|
129
|
-
>
|
|
130
|
-
<span class="text-primary-600 dark:text-primary-400 font-medium"
|
|
131
|
-
>J</span
|
|
132
|
-
>
|
|
133
|
-
</div>
|
|
134
|
-
<div class="flex-1">
|
|
135
|
-
<p class="text-sm text-neutral-900 dark:text-white">
|
|
136
|
-
<span class="font-medium">John D.</span>
|
|
137
|
-
payment failed
|
|
138
|
-
</p>
|
|
139
|
-
<p class="text-xs text-neutral-500 mt-0.5">5 minutes ago</p>
|
|
140
|
-
</div>
|
|
141
|
-
<UIcon
|
|
142
|
-
name="i-lucide-x-circle"
|
|
143
|
-
class="w-5 h-5 text-red-500 flex-shrink-0"
|
|
144
|
-
/>
|
|
145
|
-
</div>
|
|
146
|
-
</div>
|
|
147
|
-
|
|
148
|
-
<!-- Warning -->
|
|
149
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-6">
|
|
150
|
-
<h3 class="font-medium mb-4 text-yellow-600 dark:text-yellow-400">
|
|
151
|
-
Warning
|
|
152
|
-
</h3>
|
|
153
|
-
<div
|
|
154
|
-
class="bg-white dark:bg-neutral-900 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-4 flex items-center gap-3"
|
|
155
|
-
>
|
|
156
|
-
<div
|
|
157
|
-
class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"
|
|
158
|
-
>
|
|
159
|
-
<span class="text-primary-600 dark:text-primary-400 font-medium"
|
|
160
|
-
>E</span
|
|
161
|
-
>
|
|
162
|
-
</div>
|
|
163
|
-
<div class="flex-1">
|
|
164
|
-
<p class="text-sm text-neutral-900 dark:text-white">
|
|
165
|
-
<span class="font-medium">Emily R.</span>
|
|
166
|
-
subscription expiring soon
|
|
167
|
-
</p>
|
|
168
|
-
<p class="text-xs text-neutral-500 mt-0.5">10 minutes ago</p>
|
|
169
|
-
</div>
|
|
170
|
-
<UIcon
|
|
171
|
-
name="i-lucide-alert-triangle"
|
|
172
|
-
class="w-5 h-5 text-yellow-500 flex-shrink-0"
|
|
173
|
-
/>
|
|
174
|
-
</div>
|
|
175
|
-
</div>
|
|
176
|
-
|
|
177
|
-
<!-- Info -->
|
|
178
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-6">
|
|
179
|
-
<h3 class="font-medium mb-4 text-blue-600 dark:text-blue-400">
|
|
180
|
-
Info
|
|
181
|
-
</h3>
|
|
182
|
-
<div
|
|
183
|
-
class="bg-white dark:bg-neutral-900 rounded-xl shadow-lg border border-neutral-200 dark:border-neutral-700 p-4 flex items-center gap-3"
|
|
184
|
-
>
|
|
185
|
-
<img
|
|
186
|
-
src="https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop"
|
|
187
|
-
alt="Customer"
|
|
188
|
-
class="w-10 h-10 rounded-full object-cover"
|
|
189
|
-
/>
|
|
190
|
-
<div class="flex-1">
|
|
191
|
-
<p class="text-sm text-neutral-900 dark:text-white">
|
|
192
|
-
<span class="font-medium">James W.</span>
|
|
193
|
-
viewed pricing page
|
|
194
|
-
</p>
|
|
195
|
-
<p class="text-xs text-neutral-500 mt-0.5">1 minute ago</p>
|
|
196
|
-
</div>
|
|
197
|
-
<UIcon
|
|
198
|
-
name="i-lucide-info"
|
|
199
|
-
class="w-5 h-5 text-blue-500 flex-shrink-0"
|
|
200
|
-
/>
|
|
201
|
-
</div>
|
|
202
|
-
</div>
|
|
203
|
-
</div>
|
|
204
|
-
</section>
|
|
205
|
-
|
|
206
|
-
<!-- Configuration -->
|
|
207
|
-
<section>
|
|
208
|
-
<h2 class="text-lg font-semibold mb-4">Timing Configuration</h2>
|
|
209
|
-
<div class="grid md:grid-cols-3 gap-4">
|
|
210
|
-
<div class="p-4 rounded-lg bg-neutral-100 dark:bg-neutral-800">
|
|
211
|
-
<h3 class="font-medium mb-1">Initial Delay</h3>
|
|
212
|
-
<p class="text-sm text-neutral-500">
|
|
213
|
-
Wait before first notification
|
|
214
|
-
</p>
|
|
215
|
-
<p class="mt-2 font-mono text-sm">5000ms (5 seconds)</p>
|
|
216
|
-
</div>
|
|
217
|
-
<div class="p-4 rounded-lg bg-neutral-100 dark:bg-neutral-800">
|
|
218
|
-
<h3 class="font-medium mb-1">Display Duration</h3>
|
|
219
|
-
<p class="text-sm text-neutral-500">How long each shows</p>
|
|
220
|
-
<p class="mt-2 font-mono text-sm">3000ms (3 seconds)</p>
|
|
221
|
-
</div>
|
|
222
|
-
<div class="p-4 rounded-lg bg-neutral-100 dark:bg-neutral-800">
|
|
223
|
-
<h3 class="font-medium mb-1">Interval</h3>
|
|
224
|
-
<p class="text-sm text-neutral-500">Time between notifications</p>
|
|
225
|
-
<p class="mt-2 font-mono text-sm">4000ms (4 seconds)</p>
|
|
226
|
-
</div>
|
|
227
|
-
</div>
|
|
228
|
-
</section>
|
|
229
|
-
|
|
230
|
-
<!-- Props -->
|
|
231
|
-
<section>
|
|
232
|
-
<h2 class="text-lg font-semibold mb-4">Props</h2>
|
|
233
|
-
<table class="w-full text-sm">
|
|
234
|
-
<thead>
|
|
235
|
-
<tr class="border-b border-neutral-200 dark:border-neutral-700">
|
|
236
|
-
<th class="text-left py-3 px-4">Prop</th>
|
|
237
|
-
<th class="text-left py-3 px-4">Type</th>
|
|
238
|
-
<th class="text-left py-3 px-4">Default</th>
|
|
239
|
-
<th class="text-left py-3 px-4">Description</th>
|
|
240
|
-
</tr>
|
|
241
|
-
</thead>
|
|
242
|
-
<tbody class="divide-y divide-neutral-200 dark:divide-neutral-700">
|
|
243
|
-
<tr>
|
|
244
|
-
<td class="py-3 px-4 font-mono text-xs">notifications</td>
|
|
245
|
-
<td class="py-3 px-4">Array</td>
|
|
246
|
-
<td class="py-3 px-4">required</td>
|
|
247
|
-
<td class="py-3 px-4">Array of notification objects</td>
|
|
248
|
-
</tr>
|
|
249
|
-
<tr>
|
|
250
|
-
<td class="py-3 px-4 font-mono text-xs">interval</td>
|
|
251
|
-
<td class="py-3 px-4">Number</td>
|
|
252
|
-
<td class="py-3 px-4">4000</td>
|
|
253
|
-
<td class="py-3 px-4">Time between notifications (ms)</td>
|
|
254
|
-
</tr>
|
|
255
|
-
<tr>
|
|
256
|
-
<td class="py-3 px-4 font-mono text-xs">initialDelay</td>
|
|
257
|
-
<td class="py-3 px-4">Number</td>
|
|
258
|
-
<td class="py-3 px-4">5000</td>
|
|
259
|
-
<td class="py-3 px-4">Delay before first notification (ms)</td>
|
|
260
|
-
</tr>
|
|
261
|
-
<tr>
|
|
262
|
-
<td class="py-3 px-4 font-mono text-xs">displayDuration</td>
|
|
263
|
-
<td class="py-3 px-4">Number</td>
|
|
264
|
-
<td class="py-3 px-4">3000</td>
|
|
265
|
-
<td class="py-3 px-4">How long each notification shows (ms)</td>
|
|
266
|
-
</tr>
|
|
267
|
-
<tr>
|
|
268
|
-
<td class="py-3 px-4 font-mono text-xs">placement</td>
|
|
269
|
-
<td class="py-3 px-4">String</td>
|
|
270
|
-
<td class="py-3 px-4">topRight</td>
|
|
271
|
-
<td class="py-3 px-4">
|
|
272
|
-
topLeft, topRight, bottomLeft, bottomRight
|
|
273
|
-
</td>
|
|
274
|
-
</tr>
|
|
275
|
-
<tr>
|
|
276
|
-
<td class="py-3 px-4 font-mono text-xs">type</td>
|
|
277
|
-
<td class="py-3 px-4">String</td>
|
|
278
|
-
<td class="py-3 px-4">success</td>
|
|
279
|
-
<td class="py-3 px-4">success, error, warning, info</td>
|
|
280
|
-
</tr>
|
|
281
|
-
<tr>
|
|
282
|
-
<td class="py-3 px-4 font-mono text-xs">showIcon</td>
|
|
283
|
-
<td class="py-3 px-4">Boolean</td>
|
|
284
|
-
<td class="py-3 px-4">true</td>
|
|
285
|
-
<td class="py-3 px-4">Whether to show the status icon</td>
|
|
286
|
-
</tr>
|
|
287
|
-
</tbody>
|
|
288
|
-
</table>
|
|
289
|
-
</section>
|
|
290
|
-
|
|
291
|
-
<!-- Notification Structure -->
|
|
292
|
-
<section>
|
|
293
|
-
<h2 class="text-lg font-semibold mb-4">
|
|
294
|
-
Notification Object Structure
|
|
295
|
-
</h2>
|
|
296
|
-
<pre
|
|
297
|
-
class="bg-neutral-100 dark:bg-neutral-800 p-4 rounded-lg text-sm overflow-x-auto"
|
|
298
|
-
><code>notifications: [
|
|
299
|
-
{
|
|
300
|
-
name: 'Sarah M.', // Customer name (required)
|
|
301
|
-
action: 'just purchased Pro Plan', // Action text (required)
|
|
302
|
-
time: '2 minutes ago', // Time string (required)
|
|
303
|
-
avatar: 'https://...' // Optional avatar URL
|
|
304
|
-
},
|
|
305
|
-
// ... more notifications
|
|
306
|
-
]</code></pre>
|
|
307
|
-
</section>
|
|
308
|
-
|
|
309
|
-
<!-- Sample Data -->
|
|
310
|
-
<section>
|
|
311
|
-
<h2 class="text-lg font-semibold mb-4">Sample Notifications</h2>
|
|
312
|
-
<div class="grid md:grid-cols-2 gap-4">
|
|
313
|
-
<div
|
|
314
|
-
v-for="notification in notifications"
|
|
315
|
-
:key="notification.name"
|
|
316
|
-
class="p-4 rounded-lg border border-neutral-200 dark:border-neutral-700 flex items-center gap-3"
|
|
317
|
-
>
|
|
318
|
-
<img
|
|
319
|
-
v-if="notification.avatar"
|
|
320
|
-
:src="notification.avatar"
|
|
321
|
-
:alt="notification.name"
|
|
322
|
-
class="w-10 h-10 rounded-full object-cover"
|
|
323
|
-
/>
|
|
324
|
-
<div
|
|
325
|
-
v-else
|
|
326
|
-
class="w-10 h-10 rounded-full bg-primary-100 dark:bg-primary-900 flex items-center justify-center"
|
|
327
|
-
>
|
|
328
|
-
<span class="text-primary-600 dark:text-primary-400 font-medium">
|
|
329
|
-
{{ notification.name.charAt(0) }}
|
|
330
|
-
</span>
|
|
331
|
-
</div>
|
|
332
|
-
<div class="flex-1">
|
|
333
|
-
<p class="text-sm">
|
|
334
|
-
<span class="font-medium">{{ notification.name }}</span>
|
|
335
|
-
{{ notification.action }}
|
|
336
|
-
</p>
|
|
337
|
-
<p class="text-xs text-neutral-500">{{ notification.time }}</p>
|
|
338
|
-
</div>
|
|
339
|
-
</div>
|
|
340
|
-
</div>
|
|
341
|
-
</section>
|
|
342
|
-
|
|
343
|
-
<!-- Usage Tips -->
|
|
344
|
-
<section>
|
|
345
|
-
<h2 class="text-lg font-semibold mb-4">Usage Tips</h2>
|
|
346
|
-
<ul class="space-y-3 text-neutral-600 dark:text-neutral-400">
|
|
347
|
-
<li class="flex gap-2">
|
|
348
|
-
<UIcon
|
|
349
|
-
name="i-lucide-lightbulb"
|
|
350
|
-
class="w-5 h-5 text-yellow-500 flex-shrink-0"
|
|
351
|
-
/>
|
|
352
|
-
<span
|
|
353
|
-
>Use real customer data or realistic fake data for
|
|
354
|
-
authenticity</span
|
|
355
|
-
>
|
|
356
|
-
</li>
|
|
357
|
-
<li class="flex gap-2">
|
|
358
|
-
<UIcon
|
|
359
|
-
name="i-lucide-lightbulb"
|
|
360
|
-
class="w-5 h-5 text-yellow-500 flex-shrink-0"
|
|
361
|
-
/>
|
|
362
|
-
<span>Keep action text short and focused on conversions</span>
|
|
363
|
-
</li>
|
|
364
|
-
<li class="flex gap-2">
|
|
365
|
-
<UIcon
|
|
366
|
-
name="i-lucide-lightbulb"
|
|
367
|
-
class="w-5 h-5 text-yellow-500 flex-shrink-0"
|
|
368
|
-
/>
|
|
369
|
-
<span>Use recent-sounding times ("2 minutes ago") for urgency</span>
|
|
370
|
-
</li>
|
|
371
|
-
<li class="flex gap-2">
|
|
372
|
-
<UIcon
|
|
373
|
-
name="i-lucide-lightbulb"
|
|
374
|
-
class="w-5 h-5 text-yellow-500 flex-shrink-0"
|
|
375
|
-
/>
|
|
376
|
-
<span>Include diverse customer names and avatars</span>
|
|
377
|
-
</li>
|
|
378
|
-
</ul>
|
|
379
|
-
</section>
|
|
380
|
-
|
|
381
|
-
<!-- Code Example -->
|
|
382
|
-
<section>
|
|
383
|
-
<h2 class="text-lg font-semibold mb-4">Code Example</h2>
|
|
384
|
-
<CodeExample title="Social Proof Toast Usage" :code="codeExample" />
|
|
385
|
-
</section>
|
|
386
|
-
|
|
387
|
-
<!-- Type Examples Code -->
|
|
388
|
-
<section>
|
|
389
|
-
<h2 class="text-lg font-semibold mb-4">Type Examples</h2>
|
|
390
|
-
<CodeExample title="Different Toast Types" :code="typeExamplesCode" />
|
|
391
|
-
</section>
|
|
392
|
-
</div>
|
|
393
|
-
|
|
394
|
-
<!-- Actual Component -->
|
|
395
|
-
<XMarkSocialProofToast
|
|
396
|
-
v-if="demoActive"
|
|
397
|
-
:notifications="notifications"
|
|
398
|
-
:interval="4000"
|
|
399
|
-
:initial-delay="1000"
|
|
400
|
-
:display-duration="3000"
|
|
401
|
-
:placement="demoPlacement"
|
|
402
|
-
:type="demoType"
|
|
403
|
-
/>
|
|
404
|
-
</div>
|
|
405
|
-
</template>
|
|
406
|
-
|
|
407
|
-
<script setup>
|
|
408
|
-
const codeExample = `<XMarkSocialProofToast
|
|
409
|
-
:notifications="notifications"
|
|
410
|
-
:interval="4000"
|
|
411
|
-
:initial-delay="5000"
|
|
412
|
-
:display-duration="3000"
|
|
413
|
-
type="success"
|
|
414
|
-
/>
|
|
415
|
-
|
|
416
|
-
<script setup>
|
|
417
|
-
const notifications = [
|
|
418
|
-
{
|
|
419
|
-
name: 'Sarah M.',
|
|
420
|
-
action: 'just purchased Pro Plan',
|
|
421
|
-
time: '2 minutes ago',
|
|
422
|
-
avatar: 'https://...'
|
|
423
|
-
},
|
|
424
|
-
{
|
|
425
|
-
name: 'James W.',
|
|
426
|
-
action: 'signed up for a free trial',
|
|
427
|
-
time: '5 minutes ago',
|
|
428
|
-
avatar: 'https://...'
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
name: 'Emily R.',
|
|
432
|
-
action: 'upgraded to Enterprise',
|
|
433
|
-
time: '8 minutes ago'
|
|
434
|
-
}
|
|
435
|
-
]
|
|
436
|
-
<\/script>`;
|
|
437
|
-
|
|
438
|
-
const typeExamplesCode = `<!-- Success (default) -->
|
|
439
|
-
<XMarkSocialProofToast
|
|
440
|
-
:notifications="notifications"
|
|
441
|
-
type="success"
|
|
442
|
-
/>
|
|
443
|
-
|
|
444
|
-
<!-- Error -->
|
|
445
|
-
<XMarkSocialProofToast
|
|
446
|
-
:notifications="notifications"
|
|
447
|
-
type="error"
|
|
448
|
-
/>
|
|
449
|
-
|
|
450
|
-
<!-- Warning -->
|
|
451
|
-
<XMarkSocialProofToast
|
|
452
|
-
:notifications="notifications"
|
|
453
|
-
type="warning"
|
|
454
|
-
/>
|
|
455
|
-
|
|
456
|
-
<!-- Info -->
|
|
457
|
-
<XMarkSocialProofToast
|
|
458
|
-
:notifications="notifications"
|
|
459
|
-
type="info"
|
|
460
|
-
/>
|
|
461
|
-
|
|
462
|
-
<!-- Hide icon -->
|
|
463
|
-
<XMarkSocialProofToast
|
|
464
|
-
:notifications="notifications"
|
|
465
|
-
:show-icon="false"
|
|
466
|
-
/>`;
|
|
467
|
-
|
|
468
|
-
const demoActive = ref(false);
|
|
469
|
-
const demoPlacement = ref("bottomLeft");
|
|
470
|
-
const demoType = ref("success");
|
|
471
|
-
|
|
472
|
-
const notifications = [
|
|
473
|
-
{
|
|
474
|
-
name: "Sarah M.",
|
|
475
|
-
action: "just purchased Pro Plan",
|
|
476
|
-
time: "2 minutes ago",
|
|
477
|
-
avatar:
|
|
478
|
-
"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=100&h=100&fit=crop",
|
|
479
|
-
},
|
|
480
|
-
{
|
|
481
|
-
name: "James W.",
|
|
482
|
-
action: "signed up for a free trial",
|
|
483
|
-
time: "5 minutes ago",
|
|
484
|
-
avatar:
|
|
485
|
-
"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop",
|
|
486
|
-
},
|
|
487
|
-
{
|
|
488
|
-
name: "Emily R.",
|
|
489
|
-
action: "upgraded to Enterprise",
|
|
490
|
-
time: "8 minutes ago",
|
|
491
|
-
avatar:
|
|
492
|
-
"https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop",
|
|
493
|
-
},
|
|
494
|
-
{
|
|
495
|
-
name: "Michael T.",
|
|
496
|
-
action: "just made a purchase",
|
|
497
|
-
time: "12 minutes ago",
|
|
498
|
-
},
|
|
499
|
-
{
|
|
500
|
-
name: "Lisa K.",
|
|
501
|
-
action: "joined the newsletter",
|
|
502
|
-
time: "15 minutes ago",
|
|
503
|
-
avatar:
|
|
504
|
-
"https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=100&h=100&fit=crop",
|
|
505
|
-
},
|
|
506
|
-
];
|
|
507
|
-
|
|
508
|
-
const startDemo = () => {
|
|
509
|
-
demoActive.value = true;
|
|
510
|
-
};
|
|
511
|
-
|
|
512
|
-
const stopDemo = () => {
|
|
513
|
-
demoActive.value = false;
|
|
514
|
-
};
|
|
515
|
-
</script>
|
|
@@ -1,161 +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">Badge</h1>
|
|
5
|
-
<p class="mt-2 text-neutral-600 dark:text-neutral-400">Trust indicators and feature badges with preset icons.</p>
|
|
6
|
-
</div>
|
|
7
|
-
|
|
8
|
-
<div class="p-8 space-y-12">
|
|
9
|
-
<!-- Presets -->
|
|
10
|
-
<section>
|
|
11
|
-
<h2 class="text-lg font-semibold mb-4">Preset Badges</h2>
|
|
12
|
-
<p class="text-sm text-neutral-500 mb-4">Built-in presets for common trust indicators</p>
|
|
13
|
-
<div class="flex flex-wrap gap-4">
|
|
14
|
-
<XMarkSocialProofBadge preset="no-credit-card" />
|
|
15
|
-
<XMarkSocialProofBadge preset="cancel-anytime" />
|
|
16
|
-
<XMarkSocialProofBadge preset="free-trial" />
|
|
17
|
-
<XMarkSocialProofBadge preset="secure" />
|
|
18
|
-
<XMarkSocialProofBadge preset="support" />
|
|
19
|
-
<XMarkSocialProofBadge preset="setup" />
|
|
20
|
-
<XMarkSocialProofBadge preset="gdpr" />
|
|
21
|
-
<XMarkSocialProofBadge preset="money-back" />
|
|
22
|
-
</div>
|
|
23
|
-
</section>
|
|
24
|
-
|
|
25
|
-
<!-- Variants -->
|
|
26
|
-
<section>
|
|
27
|
-
<h2 class="text-lg font-semibold mb-4">Style Variants</h2>
|
|
28
|
-
<p class="text-sm text-neutral-500 mb-4">Default, subtle, outline, text, and text-muted styles</p>
|
|
29
|
-
<div class="flex flex-wrap items-center gap-4">
|
|
30
|
-
<XMarkSocialProofBadge preset="secure" variant="default" />
|
|
31
|
-
<XMarkSocialProofBadge preset="secure" variant="subtle" />
|
|
32
|
-
<XMarkSocialProofBadge preset="secure" variant="outline" />
|
|
33
|
-
<XMarkSocialProofBadge preset="secure" variant="text" />
|
|
34
|
-
<XMarkSocialProofBadge preset="secure" variant="text-muted" />
|
|
35
|
-
</div>
|
|
36
|
-
</section>
|
|
37
|
-
|
|
38
|
-
<!-- Custom Badges -->
|
|
39
|
-
<section>
|
|
40
|
-
<h2 class="text-lg font-semibold mb-4">Custom Badges</h2>
|
|
41
|
-
<p class="text-sm text-neutral-500 mb-4">Create custom badges with any icon and label</p>
|
|
42
|
-
<div class="flex flex-wrap gap-4">
|
|
43
|
-
<XMarkSocialProofBadge icon="i-lucide-sparkles" label="AI-Powered" />
|
|
44
|
-
<XMarkSocialProofBadge icon="i-lucide-globe" label="Available Worldwide" variant="subtle" />
|
|
45
|
-
<XMarkSocialProofBadge icon="i-lucide-rocket" label="Fast Setup" variant="outline" />
|
|
46
|
-
</div>
|
|
47
|
-
</section>
|
|
48
|
-
|
|
49
|
-
<!-- Usage Example -->
|
|
50
|
-
<section>
|
|
51
|
-
<h2 class="text-lg font-semibold mb-4">Usage in Hero</h2>
|
|
52
|
-
<p class="text-sm text-neutral-500 mb-4">Common placement below CTA buttons</p>
|
|
53
|
-
<div class="bg-neutral-100 dark:bg-neutral-800 rounded-lg p-8">
|
|
54
|
-
<div class="text-center space-y-6">
|
|
55
|
-
<h3 class="text-2xl font-bold">Start Your Free Trial</h3>
|
|
56
|
-
<UButton size="lg" color="primary">Get Started</UButton>
|
|
57
|
-
<div class="flex justify-center gap-4 flex-wrap">
|
|
58
|
-
<XMarkSocialProofBadge preset="no-credit-card" variant="subtle" />
|
|
59
|
-
<XMarkSocialProofBadge preset="cancel-anytime" variant="subtle" />
|
|
60
|
-
</div>
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
</section>
|
|
64
|
-
|
|
65
|
-
<!-- Props -->
|
|
66
|
-
<section>
|
|
67
|
-
<h2 class="text-lg font-semibold mb-4">Props</h2>
|
|
68
|
-
<div class="overflow-x-auto">
|
|
69
|
-
<table class="w-full text-sm">
|
|
70
|
-
<thead>
|
|
71
|
-
<tr class="border-b border-neutral-200 dark:border-neutral-700">
|
|
72
|
-
<th class="text-left py-3 px-4 font-medium">Prop</th>
|
|
73
|
-
<th class="text-left py-3 px-4 font-medium">Type</th>
|
|
74
|
-
<th class="text-left py-3 px-4 font-medium">Default</th>
|
|
75
|
-
<th class="text-left py-3 px-4 font-medium">Description</th>
|
|
76
|
-
</tr>
|
|
77
|
-
</thead>
|
|
78
|
-
<tbody class="divide-y divide-neutral-200 dark:divide-neutral-700">
|
|
79
|
-
<tr>
|
|
80
|
-
<td class="py-3 px-4 font-mono text-xs">preset</td>
|
|
81
|
-
<td class="py-3 px-4">String</td>
|
|
82
|
-
<td class="py-3 px-4">''</td>
|
|
83
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">no-credit-card, cancel-anytime, free-trial, secure, support, setup, gdpr, money-back</td>
|
|
84
|
-
</tr>
|
|
85
|
-
<tr>
|
|
86
|
-
<td class="py-3 px-4 font-mono text-xs">icon</td>
|
|
87
|
-
<td class="py-3 px-4">String</td>
|
|
88
|
-
<td class="py-3 px-4">''</td>
|
|
89
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Custom icon name (if not using preset)</td>
|
|
90
|
-
</tr>
|
|
91
|
-
<tr>
|
|
92
|
-
<td class="py-3 px-4 font-mono text-xs">label</td>
|
|
93
|
-
<td class="py-3 px-4">String</td>
|
|
94
|
-
<td class="py-3 px-4">''</td>
|
|
95
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">Custom label text (if not using preset)</td>
|
|
96
|
-
</tr>
|
|
97
|
-
<tr>
|
|
98
|
-
<td class="py-3 px-4 font-mono text-xs">variant</td>
|
|
99
|
-
<td class="py-3 px-4">String</td>
|
|
100
|
-
<td class="py-3 px-4">'default'</td>
|
|
101
|
-
<td class="py-3 px-4 text-neutral-600 dark:text-neutral-400">default, subtle, outline, text, text-muted</td>
|
|
102
|
-
</tr>
|
|
103
|
-
</tbody>
|
|
104
|
-
</table>
|
|
105
|
-
</div>
|
|
106
|
-
</section>
|
|
107
|
-
|
|
108
|
-
<!-- Available Presets -->
|
|
109
|
-
<section>
|
|
110
|
-
<h2 class="text-lg font-semibold mb-4">Available Presets</h2>
|
|
111
|
-
<table class="w-full text-sm">
|
|
112
|
-
<thead>
|
|
113
|
-
<tr class="border-b border-neutral-200 dark:border-neutral-700">
|
|
114
|
-
<th class="text-left py-3 px-4">Preset</th>
|
|
115
|
-
<th class="text-left py-3 px-4">Icon</th>
|
|
116
|
-
<th class="text-left py-3 px-4">Label</th>
|
|
117
|
-
</tr>
|
|
118
|
-
</thead>
|
|
119
|
-
<tbody class="divide-y divide-neutral-200 dark:divide-neutral-700">
|
|
120
|
-
<tr><td class="py-3 px-4 font-mono text-xs">no-credit-card</td><td class="py-3 px-4">i-lucide-credit-card</td><td class="py-3 px-4">No credit card required</td></tr>
|
|
121
|
-
<tr><td class="py-3 px-4 font-mono text-xs">cancel-anytime</td><td class="py-3 px-4">i-lucide-x-circle</td><td class="py-3 px-4">Cancel anytime</td></tr>
|
|
122
|
-
<tr><td class="py-3 px-4 font-mono text-xs">free-trial</td><td class="py-3 px-4">i-lucide-gift</td><td class="py-3 px-4">Free 14-day trial</td></tr>
|
|
123
|
-
<tr><td class="py-3 px-4 font-mono text-xs">secure</td><td class="py-3 px-4">i-lucide-shield-check</td><td class="py-3 px-4">Bank-level security</td></tr>
|
|
124
|
-
<tr><td class="py-3 px-4 font-mono text-xs">support</td><td class="py-3 px-4">i-lucide-message-circle</td><td class="py-3 px-4">24/7 support</td></tr>
|
|
125
|
-
<tr><td class="py-3 px-4 font-mono text-xs">setup</td><td class="py-3 px-4">i-lucide-zap</td><td class="py-3 px-4">Setup in minutes</td></tr>
|
|
126
|
-
<tr><td class="py-3 px-4 font-mono text-xs">gdpr</td><td class="py-3 px-4">i-lucide-lock</td><td class="py-3 px-4">GDPR compliant</td></tr>
|
|
127
|
-
<tr><td class="py-3 px-4 font-mono text-xs">money-back</td><td class="py-3 px-4">i-lucide-undo-2</td><td class="py-3 px-4">30-day money back</td></tr>
|
|
128
|
-
</tbody>
|
|
129
|
-
</table>
|
|
130
|
-
</section>
|
|
131
|
-
|
|
132
|
-
<!-- Code Example -->
|
|
133
|
-
<section>
|
|
134
|
-
<h2 class="text-lg font-semibold mb-4">Code Example</h2>
|
|
135
|
-
<CodeExample title="Badge Usage" :code="codeExample" />
|
|
136
|
-
</section>
|
|
137
|
-
</div>
|
|
138
|
-
</div>
|
|
139
|
-
</template>
|
|
140
|
-
|
|
141
|
-
<script setup>
|
|
142
|
-
const codeExample = `<!-- Using presets -->
|
|
143
|
-
<XMarkSocialProofBadge preset="no-credit-card" />
|
|
144
|
-
<XMarkSocialProofBadge preset="secure" variant="subtle" />
|
|
145
|
-
|
|
146
|
-
<!-- Custom badge -->
|
|
147
|
-
<XMarkSocialProofBadge
|
|
148
|
-
icon="i-lucide-sparkles"
|
|
149
|
-
label="AI-Powered"
|
|
150
|
-
variant="outline"
|
|
151
|
-
/>
|
|
152
|
-
|
|
153
|
-
<!-- Text variant (minimal) -->
|
|
154
|
-
<XMarkSocialProofBadge preset="gdpr" variant="text" />
|
|
155
|
-
|
|
156
|
-
<!-- Common usage below CTA -->
|
|
157
|
-
<div class="flex justify-center gap-4">
|
|
158
|
-
<XMarkSocialProofBadge preset="no-credit-card" variant="subtle" />
|
|
159
|
-
<XMarkSocialProofBadge preset="cancel-anytime" variant="subtle" />
|
|
160
|
-
</div>`
|
|
161
|
-
</script>
|