@velkymx/vibeui 0.9.0 → 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/AGENTS.md +44 -0
- package/CLAUDE.md +48 -0
- package/README.md +222 -197
- package/dist/App.vue.d.ts +2 -1
- package/dist/components/HelloWorld.vue.d.ts +2 -1
- package/dist/components/VibeAccordion.vue.d.ts +39 -40
- package/dist/components/VibeAlert.vue.d.ts +21 -37
- package/dist/components/VibeAutocomplete.vue.d.ts +59 -31
- package/dist/components/VibeBadge.vue.d.ts +10 -18
- package/dist/components/VibeBreadcrumb.vue.d.ts +25 -21
- package/dist/components/VibeButton.vue.d.ts +13 -17
- package/dist/components/VibeButtonGroup.vue.d.ts +11 -19
- package/dist/components/VibeCard.vue.d.ts +51 -24
- package/dist/components/VibeCarousel.vue.d.ts +27 -49
- package/dist/components/VibeChartBar.vue.d.ts +61 -0
- package/dist/components/VibeChartLine.vue.d.ts +70 -0
- package/dist/components/VibeChartPie.vue.d.ts +34 -0
- package/dist/components/VibeCloseButton.vue.d.ts +9 -7
- package/dist/components/VibeCol.vue.d.ts +9 -17
- package/dist/components/VibeCollapse.vue.d.ts +24 -32
- package/dist/components/VibeContainer.vue.d.ts +9 -17
- package/dist/components/VibeDataTable.vue.d.ts +122 -63
- package/dist/components/VibeDatePicker.vue.d.ts +4 -6
- package/dist/components/VibeDraggable.vue.d.ts +9 -13
- package/dist/components/VibeDropdown.vue.d.ts +46 -43
- package/dist/components/VibeDroppable.vue.d.ts +9 -13
- package/dist/components/VibeFileInput.vue.d.ts +14 -20
- package/dist/components/VibeFormCheckbox.vue.d.ts +30 -22
- package/dist/components/VibeFormDatepicker.vue.d.ts +27 -30
- package/dist/components/VibeFormErrorSummary.vue.d.ts +17 -0
- package/dist/components/VibeFormGroup.vue.d.ts +10 -13
- package/dist/components/VibeFormInput.vue.d.ts +60 -25
- package/dist/components/VibeFormRadio.vue.d.ts +23 -24
- package/dist/components/VibeFormSelect.vue.d.ts +28 -34
- package/dist/components/VibeFormSpinbutton.vue.d.ts +31 -34
- package/dist/components/VibeFormSwitch.vue.d.ts +22 -23
- package/dist/components/VibeFormTextarea.vue.d.ts +24 -25
- package/dist/components/VibeFormWysiwyg.vue.d.ts +23 -22
- package/dist/components/VibeHero.vue.d.ts +117 -0
- package/dist/components/VibeIcon.vue.d.ts +27 -7
- package/dist/components/VibeInputGroup.vue.d.ts +12 -14
- package/dist/components/VibeLink.vue.d.ts +14 -18
- package/dist/components/VibeListGroup.vue.d.ts +26 -22
- package/dist/components/VibeModal.vue.d.ts +47 -45
- package/dist/components/VibeNav.vue.d.ts +40 -20
- package/dist/components/VibeNavbar.vue.d.ts +12 -19
- package/dist/components/VibeNavbarBrand.vue.d.ts +9 -17
- package/dist/components/VibeNavbarNav.vue.d.ts +52 -33
- package/dist/components/VibeNavbarToggle.vue.d.ts +7 -5
- package/dist/components/VibeOffcanvas.vue.d.ts +28 -43
- package/dist/components/VibePagination.vue.d.ts +38 -29
- package/dist/components/VibePlaceholder.vue.d.ts +9 -17
- package/dist/components/VibePopover.vue.d.ts +17 -40
- package/dist/components/VibeProgress.vue.d.ts +13 -21
- package/dist/components/VibeResizable.vue.d.ts +10 -14
- package/dist/components/VibeRow.vue.d.ts +9 -17
- package/dist/components/VibeScrollspy.vue.d.ts +37 -25
- package/dist/components/VibeSkeleton.vue.d.ts +2 -1
- package/dist/components/VibeSlider.vue.d.ts +4 -5
- package/dist/components/VibeSortable.vue.d.ts +37 -18
- package/dist/components/VibeSpinner.vue.d.ts +4 -7
- package/dist/components/VibeStepper.vue.d.ts +32 -31
- package/dist/components/VibeTab.vue.d.ts +7 -11
- package/dist/components/VibeTabContent.vue.d.ts +13 -31
- package/dist/components/VibeTabs.vue.d.ts +9 -13
- package/dist/components/VibeToast.vue.d.ts +31 -44
- package/dist/components/VibeToastHost.vue.d.ts +2 -1
- package/dist/components/VibeTooltip.vue.d.ts +16 -39
- package/dist/components/chart/chartColors.d.ts +3 -0
- package/dist/components/chart/chartResize.d.ts +2 -0
- package/dist/components/chart/chartTooltip.d.ts +2 -0
- package/dist/components/chart/chartTypes.d.ts +6 -0
- package/dist/components/chart/drawBar.d.ts +5 -0
- package/dist/components/chart/drawLine.d.ts +18 -0
- package/dist/components/chart/drawPie.d.ts +4 -0
- package/dist/components/dndStore.d.ts +1 -0
- package/dist/components/index.d.ts +6 -1
- package/dist/composables/useBreakpoints.d.ts +1 -0
- package/dist/composables/useColorMode.d.ts +1 -1
- package/dist/composables/useId.d.ts +1 -4
- package/dist/directives/vTooltip.d.ts +2 -3
- package/dist/injectionKeys.d.ts +34 -0
- package/dist/purify.es-eYghtX9j.mjs +735 -0
- package/dist/types.d.ts +23 -2
- package/dist/utils/routeKey.d.ts +11 -0
- package/dist/utils/safeCss.d.ts +16 -0
- package/dist/utils/safeHref.d.ts +7 -0
- package/dist/utils/sanitizeHtml.d.ts +13 -0
- package/dist/vibeui.css +2 -1
- package/dist/vibeui.es.js +8527 -5855
- package/dist/vibeui.umd.js +3 -1
- package/docs/README.md +225 -0
- package/docs/components/advanced/popover.md +125 -0
- package/docs/components/advanced/scrollspy.md +106 -0
- package/docs/components/advanced/tooltip.md +90 -0
- package/docs/components/card/card.md +223 -0
- package/docs/components/charts/chart-bar.md +129 -0
- package/docs/components/charts/chart-line.md +136 -0
- package/docs/components/charts/chart-pie.md +102 -0
- package/docs/components/core/alert.md +94 -0
- package/docs/components/core/badge.md +75 -0
- package/docs/components/core/button-group.md +99 -0
- package/docs/components/core/button.md +145 -0
- package/docs/components/core/close-button.md +82 -0
- package/docs/components/core/link.md +79 -0
- package/docs/components/core/placeholder.md +129 -0
- package/docs/components/core/skeleton.md +40 -0
- package/docs/components/core/spinner.md +103 -0
- package/docs/components/data/datatable.md +437 -0
- package/docs/components/hero/hero.md +65 -0
- package/docs/components/interactive/accordion.md +121 -0
- package/docs/components/interactive/carousel.md +112 -0
- package/docs/components/interactive/collapse.md +106 -0
- package/docs/components/interactive/date-picker.md +78 -0
- package/docs/components/interactive/draggable.md +91 -0
- package/docs/components/interactive/dropdown.md +129 -0
- package/docs/components/interactive/modal.md +151 -0
- package/docs/components/interactive/offcanvas.md +92 -0
- package/docs/components/interactive/resizable.md +73 -0
- package/docs/components/interactive/slider.md +57 -0
- package/docs/components/interactive/sortable.md +52 -0
- package/docs/components/interactive/stepper.md +83 -0
- package/docs/components/interactive/tabs.md +66 -0
- package/docs/components/interactive/toast.md +177 -0
- package/docs/components/layout/col.md +117 -0
- package/docs/components/layout/container.md +53 -0
- package/docs/components/layout/row.md +107 -0
- package/docs/components/list/list-group.md +225 -0
- package/docs/components/navigation/breadcrumb.md +120 -0
- package/docs/components/navigation/nav.md +151 -0
- package/docs/components/navigation/navbar.md +114 -0
- package/docs/components/navigation/pagination.md +163 -0
- package/docs/components/progress/progress.md +188 -0
- package/docs/composables/back-button.md +28 -0
- package/docs/composables/breakpoints.md +54 -0
- package/docs/composables/color-mode.md +179 -0
- package/docs/composables/use-form.md +78 -0
- package/docs/composables/use-position.md +68 -0
- package/docs/composables/use-toast.md +91 -0
- package/docs/directives/v-tooltip.md +58 -0
- package/docs/forms/README.md +87 -0
- package/docs/forms/autocomplete.md +96 -0
- package/docs/forms/file-input.md +97 -0
- package/docs/forms/form-checkbox.md +100 -0
- package/docs/forms/form-datepicker.md +80 -0
- package/docs/forms/form-error-summary.md +96 -0
- package/docs/forms/form-group.md +118 -0
- package/docs/forms/form-input.md +140 -0
- package/docs/forms/form-radio.md +82 -0
- package/docs/forms/form-select.md +98 -0
- package/docs/forms/form-spinbutton.md +94 -0
- package/docs/forms/form-switch.md +75 -0
- package/docs/forms/form-textarea.md +82 -0
- package/docs/forms/form-wysiwyg.md +99 -0
- package/docs/forms/input-group.md +70 -0
- package/docs/forms/validation.md +213 -0
- package/docs/getting-started/starter-template.md +136 -0
- package/docs/superpowers/plans/2026-05-12-vibe-charts.md +1999 -0
- package/docs/superpowers/plans/2026-05-29-e2e-browser-testing.md +615 -0
- package/docs/superpowers/specs/2026-05-12-charting-design.md +185 -0
- package/docs/superpowers/specs/2026-05-29-e2e-browser-testing-design.md +168 -0
- package/docs/utilities/position.md +82 -0
- package/docs/versioning.md +57 -0
- package/examples/README.md +201 -0
- package/examples/album.html +262 -0
- package/examples/blog.html +166 -0
- package/examples/carousel.html +114 -0
- package/examples/checkout.html +275 -0
- package/examples/cover.html +89 -0
- package/examples/dashboard.html +156 -0
- package/examples/index.html +129 -0
- package/examples/jumbotron.html +56 -0
- package/examples/mobile-dashboard.html +138 -0
- package/examples/pricing.html +172 -0
- package/examples/product.html +145 -0
- package/examples/sidebars.html +166 -0
- package/examples/sign-in.html +119 -0
- package/examples/starter.html +314 -0
- package/examples/sticky-footer-navbar.html +70 -0
- package/examples/sticky-footer.html +60 -0
- package/examples/test-simple.html +91 -0
- package/llms.txt +801 -0
- package/package.json +44 -14
- package/dist/types/index.d.ts +0 -6
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Checkout - VibeUI Example</title>
|
|
7
|
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
8
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
|
|
9
|
+
<link rel="stylesheet" href="../dist/vibeui.css">
|
|
10
|
+
<style>
|
|
11
|
+
body { background-color: #f8f9fa; }
|
|
12
|
+
</style>
|
|
13
|
+
|
|
14
|
+
<!-- VibeToast loads Bootstrap JS internally via `import('bootstrap')`; the UMD bundle
|
|
15
|
+
keeps that bare specifier, so the page maps it here so toasts display. -->
|
|
16
|
+
<script type="importmap">
|
|
17
|
+
{
|
|
18
|
+
"imports": {
|
|
19
|
+
"bootstrap": "https://esm.sh/bootstrap@5.3.0"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
</script>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<div id="app">
|
|
26
|
+
<vibe-container class="py-5">
|
|
27
|
+
<div class="text-center mb-4">
|
|
28
|
+
<vibe-icon icon="bag-check-fill" class="text-primary" font-size="2.5rem"></vibe-icon>
|
|
29
|
+
<h1 class="h3 mt-2">Checkout</h1>
|
|
30
|
+
<p class="text-muted">Review your order and enter your details.</p>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<vibe-row :gutters="5">
|
|
34
|
+
<!-- Order summary -->
|
|
35
|
+
<vibe-col :md="5" :lg="4" order="2" order-md="2">
|
|
36
|
+
<h4 class="d-flex justify-content-between align-items-center mb-3">
|
|
37
|
+
<span class="text-muted">Your cart</span>
|
|
38
|
+
<vibe-badge variant="primary" pill>{{ cart.length }}</vibe-badge>
|
|
39
|
+
</h4>
|
|
40
|
+
|
|
41
|
+
<vibe-list-group class="mb-3" :items="summaryItems">
|
|
42
|
+
<template #item="{ item }">
|
|
43
|
+
<div class="d-flex justify-content-between lh-sm w-100">
|
|
44
|
+
<div>
|
|
45
|
+
<h6 class="my-0" :class="{ 'fw-bold': item.total }">{{ item.name }}</h6>
|
|
46
|
+
<small v-if="item.desc" class="text-muted">{{ item.desc }}</small>
|
|
47
|
+
</div>
|
|
48
|
+
<span :class="item.total ? 'fw-bold' : 'text-muted'">{{ item.price }}</span>
|
|
49
|
+
</div>
|
|
50
|
+
</template>
|
|
51
|
+
</vibe-list-group>
|
|
52
|
+
|
|
53
|
+
<vibe-form-group label="Promo code">
|
|
54
|
+
<vibe-input-group>
|
|
55
|
+
<vibe-form-input v-model="promo" no-wrapper placeholder="Enter code" />
|
|
56
|
+
<template #append>
|
|
57
|
+
<vibe-button variant="secondary" @click="onRedeem">Redeem</vibe-button>
|
|
58
|
+
</template>
|
|
59
|
+
</vibe-input-group>
|
|
60
|
+
</vibe-form-group>
|
|
61
|
+
</vibe-col>
|
|
62
|
+
|
|
63
|
+
<!-- Billing form -->
|
|
64
|
+
<vibe-col :md="7" :lg="8" order="1" order-md="1">
|
|
65
|
+
<vibe-card class="shadow-sm">
|
|
66
|
+
<h4 class="mb-3">Billing address</h4>
|
|
67
|
+
<form novalidate @submit.prevent="onSubmit">
|
|
68
|
+
<vibe-row :gutters="3">
|
|
69
|
+
<vibe-col :md="6">
|
|
70
|
+
<vibe-form-group label="First name">
|
|
71
|
+
<vibe-form-input
|
|
72
|
+
v-model="form.fields.firstName"
|
|
73
|
+
:validation-state="stateFor('firstName')"
|
|
74
|
+
:validation-message="form.errors.firstName"
|
|
75
|
+
/>
|
|
76
|
+
</vibe-form-group>
|
|
77
|
+
</vibe-col>
|
|
78
|
+
<vibe-col :md="6">
|
|
79
|
+
<vibe-form-group label="Last name">
|
|
80
|
+
<vibe-form-input
|
|
81
|
+
v-model="form.fields.lastName"
|
|
82
|
+
:validation-state="stateFor('lastName')"
|
|
83
|
+
:validation-message="form.errors.lastName"
|
|
84
|
+
/>
|
|
85
|
+
</vibe-form-group>
|
|
86
|
+
</vibe-col>
|
|
87
|
+
</vibe-row>
|
|
88
|
+
|
|
89
|
+
<vibe-form-group label="Email">
|
|
90
|
+
<vibe-form-input
|
|
91
|
+
v-model="form.fields.email"
|
|
92
|
+
type="email"
|
|
93
|
+
placeholder="you@example.com"
|
|
94
|
+
:validation-state="stateFor('email')"
|
|
95
|
+
:validation-message="form.errors.email"
|
|
96
|
+
/>
|
|
97
|
+
</vibe-form-group>
|
|
98
|
+
|
|
99
|
+
<vibe-form-group label="Address">
|
|
100
|
+
<vibe-form-input
|
|
101
|
+
v-model="form.fields.address"
|
|
102
|
+
placeholder="1234 Main St"
|
|
103
|
+
:validation-state="stateFor('address')"
|
|
104
|
+
:validation-message="form.errors.address"
|
|
105
|
+
/>
|
|
106
|
+
</vibe-form-group>
|
|
107
|
+
|
|
108
|
+
<vibe-form-group label="Address 2 (optional)">
|
|
109
|
+
<vibe-form-input v-model="form.fields.address2" placeholder="Apartment or suite" />
|
|
110
|
+
</vibe-form-group>
|
|
111
|
+
|
|
112
|
+
<vibe-row :gutters="3">
|
|
113
|
+
<vibe-col :md="5">
|
|
114
|
+
<vibe-form-group label="Country">
|
|
115
|
+
<vibe-form-select
|
|
116
|
+
v-model="form.fields.country"
|
|
117
|
+
:options="countries"
|
|
118
|
+
placeholder="Choose..."
|
|
119
|
+
:validation-state="stateFor('country')"
|
|
120
|
+
:validation-message="form.errors.country"
|
|
121
|
+
/>
|
|
122
|
+
</vibe-form-group>
|
|
123
|
+
</vibe-col>
|
|
124
|
+
<vibe-col :md="4">
|
|
125
|
+
<vibe-form-group label="State">
|
|
126
|
+
<vibe-form-select
|
|
127
|
+
v-model="form.fields.state"
|
|
128
|
+
:options="states"
|
|
129
|
+
placeholder="Choose..."
|
|
130
|
+
:validation-state="stateFor('state')"
|
|
131
|
+
:validation-message="form.errors.state"
|
|
132
|
+
/>
|
|
133
|
+
</vibe-form-group>
|
|
134
|
+
</vibe-col>
|
|
135
|
+
<vibe-col :md="3">
|
|
136
|
+
<vibe-form-group label="Zip">
|
|
137
|
+
<vibe-form-input
|
|
138
|
+
v-model="form.fields.zip"
|
|
139
|
+
:validation-state="stateFor('zip')"
|
|
140
|
+
:validation-message="form.errors.zip"
|
|
141
|
+
/>
|
|
142
|
+
</vibe-form-group>
|
|
143
|
+
</vibe-col>
|
|
144
|
+
</vibe-row>
|
|
145
|
+
|
|
146
|
+
<hr class="my-4">
|
|
147
|
+
|
|
148
|
+
<h4 class="mb-3">Payment</h4>
|
|
149
|
+
<vibe-form-radio
|
|
150
|
+
v-for="opt in paymentOptions"
|
|
151
|
+
:key="opt.value"
|
|
152
|
+
v-model="form.fields.payment"
|
|
153
|
+
name="payment"
|
|
154
|
+
:value="opt.value"
|
|
155
|
+
:label="opt.label"
|
|
156
|
+
/>
|
|
157
|
+
|
|
158
|
+
<vibe-row :gutters="3" class="mt-3">
|
|
159
|
+
<vibe-col :md="6">
|
|
160
|
+
<vibe-form-group label="Name on card">
|
|
161
|
+
<vibe-form-input
|
|
162
|
+
v-model="form.fields.cardName"
|
|
163
|
+
:validation-state="stateFor('cardName')"
|
|
164
|
+
:validation-message="form.errors.cardName"
|
|
165
|
+
/>
|
|
166
|
+
</vibe-form-group>
|
|
167
|
+
</vibe-col>
|
|
168
|
+
<vibe-col :md="6">
|
|
169
|
+
<vibe-form-group label="Card number">
|
|
170
|
+
<vibe-form-input
|
|
171
|
+
v-model="form.fields.cardNumber"
|
|
172
|
+
placeholder="•••• •••• •••• ••••"
|
|
173
|
+
:validation-state="stateFor('cardNumber')"
|
|
174
|
+
:validation-message="form.errors.cardNumber"
|
|
175
|
+
/>
|
|
176
|
+
</vibe-form-group>
|
|
177
|
+
</vibe-col>
|
|
178
|
+
</vibe-row>
|
|
179
|
+
|
|
180
|
+
<vibe-form-checkbox v-model="form.fields.saveInfo" class="mt-3">
|
|
181
|
+
Save this information for next time
|
|
182
|
+
</vibe-form-checkbox>
|
|
183
|
+
|
|
184
|
+
<hr class="my-4">
|
|
185
|
+
|
|
186
|
+
<vibe-button type="submit" variant="primary" size="lg" class="w-100">
|
|
187
|
+
<vibe-icon icon="lock-fill" class="me-2"></vibe-icon>
|
|
188
|
+
Continue to payment
|
|
189
|
+
</vibe-button>
|
|
190
|
+
</form>
|
|
191
|
+
</vibe-card>
|
|
192
|
+
</vibe-col>
|
|
193
|
+
</vibe-row>
|
|
194
|
+
</vibe-container>
|
|
195
|
+
|
|
196
|
+
<vibe-toast-host></vibe-toast-host>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
200
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
201
|
+
<script src="../dist/vibeui.umd.js"></script>
|
|
202
|
+
<script>
|
|
203
|
+
const { createApp, ref, computed } = Vue;
|
|
204
|
+
const { useForm, useToast, validators } = VibeUI;
|
|
205
|
+
|
|
206
|
+
createApp({
|
|
207
|
+
setup() {
|
|
208
|
+
const toast = useToast();
|
|
209
|
+
const promo = ref('');
|
|
210
|
+
|
|
211
|
+
const cart = [
|
|
212
|
+
{ name: 'Product name', desc: 'Brief description', price: 12 },
|
|
213
|
+
{ name: 'Second product', desc: 'Brief description', price: 8 },
|
|
214
|
+
{ name: 'Third item', desc: 'Brief description', price: 5 }
|
|
215
|
+
];
|
|
216
|
+
const summaryItems = computed(() => {
|
|
217
|
+
const total = cart.reduce((s, i) => s + i.price, 0);
|
|
218
|
+
return [
|
|
219
|
+
...cart.map(i => ({ name: i.name, desc: i.desc, price: `$${i.price}` })),
|
|
220
|
+
{ name: 'Total (USD)', price: `$${total}`, total: true }
|
|
221
|
+
];
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const countries = [
|
|
225
|
+
{ text: 'United States', value: 'us' },
|
|
226
|
+
{ text: 'Canada', value: 'ca' },
|
|
227
|
+
{ text: 'United Kingdom', value: 'gb' }
|
|
228
|
+
];
|
|
229
|
+
const states = [
|
|
230
|
+
{ text: 'California', value: 'ca' },
|
|
231
|
+
{ text: 'New York', value: 'ny' },
|
|
232
|
+
{ text: 'Texas', value: 'tx' }
|
|
233
|
+
];
|
|
234
|
+
const paymentOptions = [
|
|
235
|
+
{ label: 'Credit card', value: 'credit' },
|
|
236
|
+
{ label: 'Debit card', value: 'debit' },
|
|
237
|
+
{ label: 'PayPal', value: 'paypal' }
|
|
238
|
+
];
|
|
239
|
+
|
|
240
|
+
const form = useForm({
|
|
241
|
+
firstName: '', lastName: '', email: '', address: '', address2: '',
|
|
242
|
+
country: '', state: '', zip: '', payment: 'credit',
|
|
243
|
+
cardName: '', cardNumber: '', saveInfo: false
|
|
244
|
+
});
|
|
245
|
+
const submitted = ref(false);
|
|
246
|
+
const stateFor = (key) => !submitted.value ? null : (form.errors[key] ? 'invalid' : 'valid');
|
|
247
|
+
|
|
248
|
+
const onRedeem = () => {
|
|
249
|
+
if (promo.value.trim()) toast.success(`Promo "${promo.value}" applied`);
|
|
250
|
+
else toast.warn('Enter a promo code first');
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const onSubmit = async () => {
|
|
254
|
+
submitted.value = true;
|
|
255
|
+
const result = await form.validate({
|
|
256
|
+
firstName: [validators.required('Required')],
|
|
257
|
+
lastName: [validators.required('Required')],
|
|
258
|
+
email: [validators.required('Required'), validators.email('Enter a valid email')],
|
|
259
|
+
address: [validators.required('Required')],
|
|
260
|
+
country: [validators.required('Please select a country')],
|
|
261
|
+
state: [validators.required('Please select a state')],
|
|
262
|
+
zip: [validators.required('Required')],
|
|
263
|
+
cardName: [validators.required('Required')],
|
|
264
|
+
cardNumber: [validators.required('Required'), validators.minLength(12, 'Card number looks too short')]
|
|
265
|
+
});
|
|
266
|
+
if (result.valid) toast.success('Order placed — thank you!');
|
|
267
|
+
else toast.error('Please fix the highlighted fields');
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
return { cart, summaryItems, promo, countries, states, paymentOptions, form, stateFor, onRedeem, onSubmit };
|
|
271
|
+
}
|
|
272
|
+
}).use(VibeUI.default).mount('#app');
|
|
273
|
+
</script>
|
|
274
|
+
</body>
|
|
275
|
+
</html>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Cover - VibeUI Example</title>
|
|
7
|
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
8
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
|
|
9
|
+
<link rel="stylesheet" href="../dist/vibeui.css">
|
|
10
|
+
<style>
|
|
11
|
+
.cover {
|
|
12
|
+
min-height: 100vh;
|
|
13
|
+
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 50%, #6a82fb 100%);
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
16
|
+
|
|
17
|
+
<!-- VibeToast loads Bootstrap JS internally via `import('bootstrap')`; the UMD bundle
|
|
18
|
+
keeps that bare specifier, so the page maps it here so toasts display. -->
|
|
19
|
+
<script type="importmap">
|
|
20
|
+
{
|
|
21
|
+
"imports": {
|
|
22
|
+
"bootstrap": "https://esm.sh/bootstrap@5.3.0"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
</script>
|
|
26
|
+
</head>
|
|
27
|
+
<body>
|
|
28
|
+
<div id="app">
|
|
29
|
+
<div class="cover d-flex flex-column text-white" data-bs-theme="dark">
|
|
30
|
+
<!-- Masthead -->
|
|
31
|
+
<header class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4">
|
|
32
|
+
<a href="#" class="d-flex align-items-center text-white text-decoration-none me-md-auto mb-2 mb-md-0">
|
|
33
|
+
<vibe-icon icon="compass-fill" class="me-2 fs-4"></vibe-icon>
|
|
34
|
+
<span class="fs-5 fw-bold">Cover</span>
|
|
35
|
+
</a>
|
|
36
|
+
<vibe-nav :items="navItems" class="justify-content-center"></vibe-nav>
|
|
37
|
+
</header>
|
|
38
|
+
|
|
39
|
+
<!-- Centered cover content (VibeHero fills the remaining space) -->
|
|
40
|
+
<vibe-hero align="center" class="flex-grow-1 d-flex align-items-center">
|
|
41
|
+
<vibe-col :lg="7" class="mx-auto">
|
|
42
|
+
<h1 class="display-3 fw-bold mb-3">Cover your page beautifully.</h1>
|
|
43
|
+
<p class="lead mb-4">
|
|
44
|
+
A one-page template built entirely with VibeUI components — a hero,
|
|
45
|
+
navigation, and footer, ready to drop your message into.
|
|
46
|
+
</p>
|
|
47
|
+
<div class="d-flex gap-3 justify-content-center">
|
|
48
|
+
<vibe-button variant="light" size="lg" @click="onLearnMore">
|
|
49
|
+
<vibe-icon icon="rocket-takeoff-fill" class="me-2"></vibe-icon>
|
|
50
|
+
Learn more
|
|
51
|
+
</vibe-button>
|
|
52
|
+
<vibe-button variant="light" outline size="lg" href="#features">
|
|
53
|
+
Features
|
|
54
|
+
</vibe-button>
|
|
55
|
+
</div>
|
|
56
|
+
</vibe-col>
|
|
57
|
+
</vibe-hero>
|
|
58
|
+
|
|
59
|
+
<!-- Mastfoot -->
|
|
60
|
+
<footer class="p-3 text-center text-white-50">
|
|
61
|
+
<small>Built with VibeUI by <a href="https://technosorcery.com" class="text-white">TechnoSorcery.com</a></small>
|
|
62
|
+
</footer>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<vibe-toast-host></vibe-toast-host>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
69
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
70
|
+
<script src="../dist/vibeui.umd.js"></script>
|
|
71
|
+
<script>
|
|
72
|
+
const { createApp } = Vue;
|
|
73
|
+
const { useToast } = VibeUI;
|
|
74
|
+
|
|
75
|
+
createApp({
|
|
76
|
+
setup() {
|
|
77
|
+
const toast = useToast();
|
|
78
|
+
const navItems = [
|
|
79
|
+
{ text: 'Home', href: '#', active: true },
|
|
80
|
+
{ text: 'Features', href: '#' },
|
|
81
|
+
{ text: 'Contact', href: '#' }
|
|
82
|
+
];
|
|
83
|
+
const onLearnMore = () => toast.info('Thanks for your interest!');
|
|
84
|
+
return { navItems, onLearnMore };
|
|
85
|
+
}
|
|
86
|
+
}).use(VibeUI.default).mount('#app');
|
|
87
|
+
</script>
|
|
88
|
+
</body>
|
|
89
|
+
</html>
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Dashboard - VibeUI Example</title>
|
|
7
|
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
8
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
|
|
9
|
+
<link rel="stylesheet" href="../dist/vibeui.css">
|
|
10
|
+
<style>
|
|
11
|
+
body { font-size: .875rem; }
|
|
12
|
+
.sidebar {
|
|
13
|
+
position: fixed;
|
|
14
|
+
top: 0;
|
|
15
|
+
bottom: 0;
|
|
16
|
+
left: 0;
|
|
17
|
+
z-index: 100;
|
|
18
|
+
padding: 48px 0 0;
|
|
19
|
+
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
|
|
20
|
+
}
|
|
21
|
+
@media (max-width: 767.98px) {
|
|
22
|
+
.sidebar { top: 5rem; }
|
|
23
|
+
}
|
|
24
|
+
.sidebar-sticky {
|
|
25
|
+
height: calc(100vh - 48px);
|
|
26
|
+
overflow-x: hidden;
|
|
27
|
+
overflow-y: auto;
|
|
28
|
+
}
|
|
29
|
+
</style>
|
|
30
|
+
</head>
|
|
31
|
+
<body>
|
|
32
|
+
<div id="app">
|
|
33
|
+
<!-- Dashboard header: VibeNavbar with container disabled so the brand can use
|
|
34
|
+
column classes and the search input can span full width (custom layout). -->
|
|
35
|
+
<vibe-navbar variant="dark" :container="false" position="sticky-top" tag="header" class="flex-md-nowrap p-0 shadow">
|
|
36
|
+
<vibe-navbar-brand href="./" class="col-md-3 col-lg-2 me-0 px-3 fs-6">
|
|
37
|
+
<vibe-icon icon="speedometer2" class="me-2"></vibe-icon>
|
|
38
|
+
Dashboard
|
|
39
|
+
</vibe-navbar-brand>
|
|
40
|
+
<!-- Raw toggler: driven by Bootstrap's data API against the raw sidebar collapse below. -->
|
|
41
|
+
<button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu">
|
|
42
|
+
<span class="navbar-toggler-icon"></span>
|
|
43
|
+
</button>
|
|
44
|
+
<input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" placeholder="Search" v-model="searchQuery">
|
|
45
|
+
<div class="navbar-nav">
|
|
46
|
+
<div class="nav-item text-nowrap">
|
|
47
|
+
<a class="nav-link px-3" href="#">Sign out</a>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</vibe-navbar>
|
|
51
|
+
|
|
52
|
+
<vibe-container fluid>
|
|
53
|
+
<vibe-row>
|
|
54
|
+
<nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
|
|
55
|
+
<div class="position-sticky pt-3 sidebar-sticky">
|
|
56
|
+
<vibe-list-group flush :items="menuItems">
|
|
57
|
+
<template #item="{ item }">
|
|
58
|
+
<vibe-icon :icon="item.icon" class="me-2"></vibe-icon>
|
|
59
|
+
{{ item.text }}
|
|
60
|
+
</template>
|
|
61
|
+
</vibe-list-group>
|
|
62
|
+
|
|
63
|
+
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
|
|
64
|
+
<span>Saved reports</span>
|
|
65
|
+
</h6>
|
|
66
|
+
<vibe-list-group flush :items="savedReportItems">
|
|
67
|
+
<template #item="{ item }">
|
|
68
|
+
<vibe-icon icon="file-earmark-text" class="me-2"></vibe-icon>
|
|
69
|
+
{{ item.text }}
|
|
70
|
+
</template>
|
|
71
|
+
</vibe-list-group>
|
|
72
|
+
</div>
|
|
73
|
+
</nav>
|
|
74
|
+
|
|
75
|
+
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
|
|
76
|
+
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
|
77
|
+
<h1 class="h2">Dashboard</h1>
|
|
78
|
+
<vibe-button-group size="sm" class="me-2">
|
|
79
|
+
<vibe-button variant="secondary" outline>Share</vibe-button>
|
|
80
|
+
<vibe-button variant="secondary" outline>Export</vibe-button>
|
|
81
|
+
</vibe-button-group>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<vibe-row :gutters="4" class="mb-4">
|
|
85
|
+
<vibe-col :md="3" v-for="stat in stats" :key="stat.label">
|
|
86
|
+
<vibe-card :class="`border-${stat.variant}`">
|
|
87
|
+
<h6 class="text-muted">{{ stat.label }}</h6>
|
|
88
|
+
<h3 class="mb-0">{{ stat.value }}</h3>
|
|
89
|
+
<small :class="`text-${stat.changeClass}`">
|
|
90
|
+
<vibe-icon :icon="stat.changeIcon"></vibe-icon>
|
|
91
|
+
{{ stat.change }}
|
|
92
|
+
</small>
|
|
93
|
+
</vibe-card>
|
|
94
|
+
</vibe-col>
|
|
95
|
+
</vibe-row>
|
|
96
|
+
|
|
97
|
+
<h2>Recent Orders</h2>
|
|
98
|
+
<vibe-data-table :items="orders" :columns="orderColumns" row-key="id" striped hover small>
|
|
99
|
+
<template #cell(status)="{ item }">
|
|
100
|
+
<vibe-badge :variant="item.statusVariant">{{ item.status }}</vibe-badge>
|
|
101
|
+
</template>
|
|
102
|
+
</vibe-data-table>
|
|
103
|
+
</main>
|
|
104
|
+
</vibe-row>
|
|
105
|
+
</vibe-container>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
109
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
110
|
+
<script src="../dist/vibeui.umd.js"></script>
|
|
111
|
+
<script>
|
|
112
|
+
const { createApp } = Vue;
|
|
113
|
+
|
|
114
|
+
createApp({
|
|
115
|
+
data() {
|
|
116
|
+
return {
|
|
117
|
+
searchQuery: '',
|
|
118
|
+
orderColumns: [
|
|
119
|
+
{ key: 'id', label: 'Order ID', sortable: true },
|
|
120
|
+
{ key: 'customer', label: 'Customer', sortable: true, searchable: true },
|
|
121
|
+
{ key: 'product', label: 'Product', searchable: true },
|
|
122
|
+
{ key: 'amount', label: 'Amount', sortable: true },
|
|
123
|
+
{ key: 'status', label: 'Status' }
|
|
124
|
+
],
|
|
125
|
+
menuItems: [
|
|
126
|
+
{ text: 'Dashboard', icon: 'house-fill', href: '#', active: true },
|
|
127
|
+
{ text: 'Orders', icon: 'file-earmark', href: '#', active: false },
|
|
128
|
+
{ text: 'Products', icon: 'cart', href: '#', active: false },
|
|
129
|
+
{ text: 'Customers', icon: 'people', href: '#', active: false },
|
|
130
|
+
{ text: 'Reports', icon: 'graph-up', href: '#', active: false }
|
|
131
|
+
],
|
|
132
|
+
savedReports: ['Current month', 'Last quarter', 'Year-end sale'],
|
|
133
|
+
stats: [
|
|
134
|
+
{ label: 'Total Revenue', value: '$45,231', change: '12.5%', changeIcon: 'arrow-up', changeClass: 'success', variant: 'primary' },
|
|
135
|
+
{ label: 'Orders', value: '1,234', change: '8.2%', changeIcon: 'arrow-up', changeClass: 'success', variant: 'success' },
|
|
136
|
+
{ label: 'Customers', value: '567', change: '3.1%', changeIcon: 'arrow-down', changeClass: 'danger', variant: 'warning' },
|
|
137
|
+
{ label: 'Bounce Rate', value: '42%', change: 'No change', changeIcon: 'dash', changeClass: 'muted', variant: 'info' }
|
|
138
|
+
],
|
|
139
|
+
orders: [
|
|
140
|
+
{ id: '#1001', customer: 'John Doe', product: 'Widget', amount: '$129.99', status: 'Completed', statusVariant: 'success' },
|
|
141
|
+
{ id: '#1002', customer: 'Jane Smith', product: 'Gadget', amount: '$79.99', status: 'Pending', statusVariant: 'warning' },
|
|
142
|
+
{ id: '#1003', customer: 'Bob Johnson', product: 'Tool', amount: '$199.99', status: 'Processing', statusVariant: 'info' },
|
|
143
|
+
{ id: '#1004', customer: 'Alice Brown', product: 'Device', amount: '$299.99', status: 'Completed', statusVariant: 'success' },
|
|
144
|
+
{ id: '#1005', customer: 'Charlie Wilson', product: 'Accessory', amount: '$49.99', status: 'Shipped', statusVariant: 'primary' }
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
computed: {
|
|
149
|
+
savedReportItems() {
|
|
150
|
+
return this.savedReports.map(r => ({ text: r, href: '#' }));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}).use(VibeUI.default).mount('#app');
|
|
154
|
+
</script>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>VibeUI Examples</title>
|
|
7
|
+
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
8
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
|
|
9
|
+
<link rel="stylesheet" href="../dist/vibeui.css">
|
|
10
|
+
<style>
|
|
11
|
+
.example-card {
|
|
12
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
13
|
+
text-decoration: none;
|
|
14
|
+
color: inherit;
|
|
15
|
+
display: block;
|
|
16
|
+
}
|
|
17
|
+
.example-card:hover {
|
|
18
|
+
transform: translateY(-4px);
|
|
19
|
+
box-shadow: 0 8px 16px rgba(0,0,0,0.1);
|
|
20
|
+
}
|
|
21
|
+
</style>
|
|
22
|
+
</head>
|
|
23
|
+
<body>
|
|
24
|
+
<div id="app">
|
|
25
|
+
<vibe-navbar variant="primary" theme="dark" expand="lg" class="mb-4">
|
|
26
|
+
<vibe-navbar-brand href="#" class="fw-bold">
|
|
27
|
+
<vibe-icon icon="lightning-charge-fill"></vibe-icon>
|
|
28
|
+
VibeUI Examples
|
|
29
|
+
</vibe-navbar-brand>
|
|
30
|
+
<span class="navbar-text text-white-50">
|
|
31
|
+
Powered by Bootstrap 5.3 & Vue 3
|
|
32
|
+
</span>
|
|
33
|
+
</vibe-navbar>
|
|
34
|
+
|
|
35
|
+
<vibe-container>
|
|
36
|
+
<vibe-row class="mb-5">
|
|
37
|
+
<vibe-col :lg="8" class="mx-auto text-center">
|
|
38
|
+
<h1 class="display-4 fw-bold mb-3">VibeUI Examples</h1>
|
|
39
|
+
<p class="lead text-muted">
|
|
40
|
+
Get started with VibeUI using these pre-built examples. Each example demonstrates
|
|
41
|
+
different components and patterns you can use in your Vue 3 applications.
|
|
42
|
+
</p>
|
|
43
|
+
</vibe-col>
|
|
44
|
+
</vibe-row>
|
|
45
|
+
|
|
46
|
+
<!-- Starters -->
|
|
47
|
+
<section class="mb-5">
|
|
48
|
+
<h2 class="mb-3">
|
|
49
|
+
<vibe-icon icon="play-circle" class="text-primary"></vibe-icon>
|
|
50
|
+
Starters
|
|
51
|
+
</h2>
|
|
52
|
+
<p class="text-muted mb-4">Quick start templates to begin building with VibeUI</p>
|
|
53
|
+
<vibe-row :gutters="4">
|
|
54
|
+
<vibe-col :md="6" :lg="4" v-for="ex in starters" :key="ex.href">
|
|
55
|
+
<a :href="ex.href" class="example-card">
|
|
56
|
+
<vibe-card class="h-100">
|
|
57
|
+
<h5 class="card-title">
|
|
58
|
+
<vibe-icon :icon="ex.icon" :class="ex.iconClass"></vibe-icon>
|
|
59
|
+
{{ ex.title }}
|
|
60
|
+
</h5>
|
|
61
|
+
<p class="card-text text-muted">{{ ex.text }}</p>
|
|
62
|
+
</vibe-card>
|
|
63
|
+
</a>
|
|
64
|
+
</vibe-col>
|
|
65
|
+
</vibe-row>
|
|
66
|
+
</section>
|
|
67
|
+
|
|
68
|
+
<!-- Custom Components -->
|
|
69
|
+
<section class="mb-5">
|
|
70
|
+
<h2 class="mb-3">
|
|
71
|
+
<vibe-icon icon="grid-3x3-gap" class="text-primary"></vibe-icon>
|
|
72
|
+
Custom Components
|
|
73
|
+
</h2>
|
|
74
|
+
<p class="text-muted mb-4">Full-page examples built with VibeUI components</p>
|
|
75
|
+
<vibe-row :gutters="4">
|
|
76
|
+
<vibe-col :md="6" :lg="4" v-for="ex in examples" :key="ex.href">
|
|
77
|
+
<a :href="ex.href" class="example-card">
|
|
78
|
+
<vibe-card class="h-100">
|
|
79
|
+
<h5 class="card-title">
|
|
80
|
+
<vibe-icon :icon="ex.icon" :class="ex.iconClass"></vibe-icon>
|
|
81
|
+
{{ ex.title }}
|
|
82
|
+
</h5>
|
|
83
|
+
<p class="card-text text-muted">{{ ex.text }}</p>
|
|
84
|
+
</vibe-card>
|
|
85
|
+
</a>
|
|
86
|
+
</vibe-col>
|
|
87
|
+
</vibe-row>
|
|
88
|
+
</section>
|
|
89
|
+
|
|
90
|
+
<footer class="border-top pt-4 pb-4 mt-5 text-center text-muted">
|
|
91
|
+
<p class="mb-0">Built with ✨ by <a href="https://technosorcery.com" class="text-decoration-none">TechnoSorcery.com</a></p>
|
|
92
|
+
<p class="small mb-0 mt-2">VibeUI - A Vue 3 UI library for Bootstrap 5.3</p>
|
|
93
|
+
</footer>
|
|
94
|
+
</vibe-container>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
98
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
99
|
+
<script src="../dist/vibeui.umd.js"></script>
|
|
100
|
+
<script>
|
|
101
|
+
const { createApp } = Vue;
|
|
102
|
+
|
|
103
|
+
createApp({
|
|
104
|
+
data() {
|
|
105
|
+
return {
|
|
106
|
+
starters: [
|
|
107
|
+
{ href: 'starter.html', icon: 'file-earmark-code', iconClass: 'text-primary', title: 'Starter Template', text: 'Basic Vue app with VibeUI components' }
|
|
108
|
+
],
|
|
109
|
+
examples: [
|
|
110
|
+
{ href: 'album.html', icon: 'images', iconClass: 'text-info', title: 'Album', text: 'Photo gallery with cards and grid layout' },
|
|
111
|
+
{ href: 'pricing.html', icon: 'cash-stack', iconClass: 'text-success', title: 'Pricing', text: 'Pricing tables with cards and badges' },
|
|
112
|
+
{ href: 'dashboard.html', icon: 'speedometer2', iconClass: 'text-primary', title: 'Dashboard', text: 'Admin dashboard with sidebar navigation' },
|
|
113
|
+
{ href: 'sign-in.html', icon: 'box-arrow-in-right', iconClass: 'text-primary', title: 'Sign in', text: 'Centered sign-in form with validation' },
|
|
114
|
+
{ href: 'checkout.html', icon: 'bag-check', iconClass: 'text-success', title: 'Checkout', text: 'Billing form, order summary, and validation' },
|
|
115
|
+
{ href: 'sidebars.html', icon: 'layout-sidebar', iconClass: 'text-info', title: 'Sidebars', text: 'Sidebar nav + mobile offcanvas with reactive sections' },
|
|
116
|
+
{ href: 'cover.html', icon: 'fullscreen', iconClass: 'text-primary', title: 'Cover', text: 'Full-viewport one-page hero with VibeHero' },
|
|
117
|
+
{ href: 'product.html', icon: 'box-seam', iconClass: 'text-primary', title: 'Product', text: 'Marketing page with hero, feature grid, and product cards' },
|
|
118
|
+
{ href: 'carousel.html', icon: 'images', iconClass: 'text-info', title: 'Carousel', text: 'Full-width carousel with marketing columns and featurettes' },
|
|
119
|
+
{ href: 'blog.html', icon: 'newspaper', iconClass: 'text-secondary', title: 'Blog', text: 'Magazine layout with posts, pagination, and sidebar' },
|
|
120
|
+
{ href: 'jumbotron.html', icon: 'card-heading', iconClass: 'text-primary', title: 'Jumbotron', text: 'Modern jumbotron built with the bordered VibeHero' },
|
|
121
|
+
{ href: 'sticky-footer.html', icon: 'layout-text-window-reverse', iconClass: 'text-secondary', title: 'Sticky footer', text: 'Footer pinned to the bottom of the viewport' },
|
|
122
|
+
{ href: 'sticky-footer-navbar.html', icon: 'window-stack', iconClass: 'text-secondary', title: 'Sticky footer + navbar', text: 'Fixed top navbar plus a sticky footer' }
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}).use(VibeUI.default).mount('#app');
|
|
127
|
+
</script>
|
|
128
|
+
</body>
|
|
129
|
+
</html>
|