@velkymx/vibeui 0.9.0 → 1.0.2
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/purify.es-1D-VntFD.mjs +679 -0
- package/dist/src/App.vue.d.ts +3 -0
- package/dist/src/components/HelloWorld.vue.d.ts +6 -0
- package/dist/src/components/VibeAccordion.vue.d.ts +89 -0
- package/dist/{components → src/components}/VibeAlert.vue.d.ts +18 -34
- package/dist/src/components/VibeAutocomplete.vue.d.ts +74 -0
- package/dist/{components → src/components}/VibeBadge.vue.d.ts +10 -18
- package/dist/src/components/VibeBreadcrumb.vue.d.ts +51 -0
- package/dist/{components → src/components}/VibeButton.vue.d.ts +13 -17
- package/dist/{components → src/components}/VibeButtonGroup.vue.d.ts +10 -18
- package/dist/{components → src/components}/VibeCard.vue.d.ts +51 -24
- package/dist/{components → src/components}/VibeCarousel.vue.d.ts +27 -49
- package/dist/src/components/VibeChartBar.vue.d.ts +61 -0
- package/dist/src/components/VibeChartLine.vue.d.ts +70 -0
- package/dist/src/components/VibeChartPie.vue.d.ts +34 -0
- package/dist/{components → src/components}/VibeCloseButton.vue.d.ts +9 -7
- package/dist/{components → src/components}/VibeCol.vue.d.ts +9 -17
- package/dist/src/components/VibeCollapse.vue.d.ts +76 -0
- package/dist/src/components/VibeContainer.vue.d.ts +36 -0
- package/dist/src/components/VibeDataTable.vue.d.ts +131 -0
- package/dist/{components → src/components}/VibeDatePicker.vue.d.ts +4 -6
- package/dist/{components → src/components}/VibeDraggable.vue.d.ts +9 -13
- package/dist/{components → src/components}/VibeDropdown.vue.d.ts +46 -43
- package/dist/{components → src/components}/VibeDroppable.vue.d.ts +9 -13
- package/dist/{components → src/components}/VibeFileInput.vue.d.ts +14 -20
- package/dist/{components → src/components}/VibeFormCheckbox.vue.d.ts +29 -21
- package/dist/{components → src/components}/VibeFormDatepicker.vue.d.ts +26 -29
- package/dist/{components → src/components}/VibeFormGroup.vue.d.ts +10 -13
- package/dist/{components → src/components}/VibeFormInput.vue.d.ts +22 -23
- package/dist/{components → src/components}/VibeFormRadio.vue.d.ts +22 -23
- package/dist/{components → src/components}/VibeFormSelect.vue.d.ts +27 -33
- package/dist/{components → src/components}/VibeFormSpinbutton.vue.d.ts +30 -33
- package/dist/{components → src/components}/VibeFormSwitch.vue.d.ts +21 -22
- package/dist/{components → src/components}/VibeFormTextarea.vue.d.ts +23 -24
- package/dist/{components → src/components}/VibeFormWysiwyg.vue.d.ts +22 -21
- package/dist/src/components/VibeHero.vue.d.ts +108 -0
- package/dist/{components → src/components}/VibeIcon.vue.d.ts +27 -7
- package/dist/{components → src/components}/VibeInputGroup.vue.d.ts +11 -13
- package/dist/{components → src/components}/VibeLink.vue.d.ts +14 -18
- package/dist/{components → src/components}/VibeListGroup.vue.d.ts +26 -22
- package/dist/{components → src/components}/VibeModal.vue.d.ts +29 -45
- package/dist/{components → src/components}/VibeNav.vue.d.ts +40 -20
- package/dist/{components → src/components}/VibeNavbar.vue.d.ts +12 -19
- package/dist/src/components/VibeNavbarBrand.vue.d.ts +34 -0
- package/dist/src/components/VibeNavbarNav.vue.d.ts +80 -0
- package/dist/{components → src/components}/VibeNavbarToggle.vue.d.ts +7 -5
- package/dist/{components → src/components}/VibeOffcanvas.vue.d.ts +28 -43
- package/dist/{components → src/components}/VibePagination.vue.d.ts +38 -29
- package/dist/{components → src/components}/VibePlaceholder.vue.d.ts +9 -17
- package/dist/src/components/VibePopover.vue.d.ts +72 -0
- package/dist/src/components/VibeProgress.vue.d.ts +37 -0
- package/dist/{components → src/components}/VibeResizable.vue.d.ts +10 -14
- package/dist/{components → src/components}/VibeRow.vue.d.ts +9 -17
- package/dist/src/components/VibeScrollspy.vue.d.ts +89 -0
- package/dist/{components → src/components}/VibeSkeleton.vue.d.ts +2 -1
- package/dist/{components → src/components}/VibeSlider.vue.d.ts +4 -5
- package/dist/src/components/VibeSortable.vue.d.ts +59 -0
- package/dist/{components → src/components}/VibeSpinner.vue.d.ts +4 -7
- package/dist/{components → src/components}/VibeStepper.vue.d.ts +32 -31
- package/dist/{components → src/components}/VibeTab.vue.d.ts +7 -11
- package/dist/src/components/VibeTabContent.vue.d.ts +56 -0
- package/dist/{components → src/components}/VibeTabs.vue.d.ts +9 -13
- package/dist/{components → src/components}/VibeToast.vue.d.ts +31 -44
- package/dist/{components → src/components}/VibeToastHost.vue.d.ts +2 -1
- package/dist/src/components/VibeTooltip.vue.d.ts +63 -0
- package/dist/src/components/chart/chartColors.d.ts +3 -0
- package/dist/src/components/chart/chartResize.d.ts +2 -0
- package/dist/src/components/chart/chartTooltip.d.ts +2 -0
- package/dist/src/components/chart/chartTypes.d.ts +6 -0
- package/dist/src/components/chart/drawBar.d.ts +5 -0
- package/dist/src/components/chart/drawLine.d.ts +18 -0
- package/dist/src/components/chart/drawPie.d.ts +4 -0
- package/dist/{components → src/components}/dndStore.d.ts +1 -0
- package/dist/{components → src/components}/index.d.ts +5 -1
- package/dist/{composables → src/composables}/useBreakpoints.d.ts +1 -0
- package/dist/{composables → src/composables}/useColorMode.d.ts +1 -1
- package/dist/src/composables/useId.d.ts +2 -0
- package/dist/{directives → src/directives}/vTooltip.d.ts +2 -3
- package/dist/src/injectionKeys.d.ts +28 -0
- package/dist/{types.d.ts → src/types.d.ts} +21 -2
- package/dist/src/utils/safeCss.d.ts +16 -0
- package/dist/src/utils/safeHref.d.ts +7 -0
- package/dist/src/utils/sanitizeHtml.d.ts +13 -0
- package/dist/vibeui.css +2 -1
- package/dist/vibeui.es.js +8269 -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 +127 -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 +435 -0
- package/docs/components/hero/hero.md +64 -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 +143 -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 +108 -0
- package/docs/components/navigation/pagination.md +162 -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-group.md +115 -0
- package/docs/forms/form-input.md +112 -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 +782 -0
- package/package.json +44 -14
- package/dist/App.vue.d.ts +0 -2
- package/dist/components/HelloWorld.vue.d.ts +0 -5
- package/dist/components/VibeAccordion.vue.d.ts +0 -90
- package/dist/components/VibeAutocomplete.vue.d.ts +0 -46
- package/dist/components/VibeBreadcrumb.vue.d.ts +0 -47
- package/dist/components/VibeCollapse.vue.d.ts +0 -84
- package/dist/components/VibeContainer.vue.d.ts +0 -44
- package/dist/components/VibeDataTable.vue.d.ts +0 -76
- package/dist/components/VibeNavbarBrand.vue.d.ts +0 -42
- package/dist/components/VibeNavbarNav.vue.d.ts +0 -61
- package/dist/components/VibePopover.vue.d.ts +0 -95
- package/dist/components/VibeProgress.vue.d.ts +0 -45
- package/dist/components/VibeScrollspy.vue.d.ts +0 -77
- package/dist/components/VibeSortable.vue.d.ts +0 -40
- package/dist/components/VibeTabContent.vue.d.ts +0 -74
- package/dist/components/VibeTooltip.vue.d.ts +0 -86
- package/dist/composables/useId.d.ts +0 -5
- package/dist/types/index.d.ts +0 -6
- /package/dist/{composables → src/composables}/useBackButton.d.ts +0 -0
- /package/dist/{composables → src/composables}/useForm.d.ts +0 -0
- /package/dist/{composables → src/composables}/useFormValidation.d.ts +0 -0
- /package/dist/{composables → src/composables}/usePosition.d.ts +0 -0
- /package/dist/{composables → src/composables}/useToast.d.ts +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{main.d.ts → src/main.d.ts} +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
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, viewport-fit=cover">
|
|
6
|
+
<title>Sidebars - 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
|
+
.app-sidebar { width: 260px; min-height: 100vh; position: sticky; top: 0; }
|
|
12
|
+
</style>
|
|
13
|
+
|
|
14
|
+
<!-- VibeOffcanvas + VibeDropdown load Bootstrap JS internally via `import('bootstrap')`;
|
|
15
|
+
the UMD bundle keeps that bare specifier, so the page maps it here. -->
|
|
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
|
+
<!-- Mobile top bar: toggles the offcanvas sidebar -->
|
|
27
|
+
<vibe-navbar variant="dark" expand="lg" position="sticky-top" class="d-lg-none">
|
|
28
|
+
<button class="navbar-toggler" type="button" @click="showSidebar = true">
|
|
29
|
+
<span class="navbar-toggler-icon"></span>
|
|
30
|
+
</button>
|
|
31
|
+
<vibe-navbar-brand href="#" class="fw-bold">
|
|
32
|
+
<vibe-icon icon="layers-fill" class="me-2"></vibe-icon>
|
|
33
|
+
Acme
|
|
34
|
+
</vibe-navbar-brand>
|
|
35
|
+
</vibe-navbar>
|
|
36
|
+
|
|
37
|
+
<div class="d-flex">
|
|
38
|
+
<!-- Desktop sidebar -->
|
|
39
|
+
<aside class="app-sidebar d-none d-lg-flex flex-column bg-dark text-white p-3" data-bs-theme="dark">
|
|
40
|
+
<a href="#" class="d-flex align-items-center mb-3 text-white text-decoration-none">
|
|
41
|
+
<vibe-icon icon="layers-fill" class="me-2 fs-4"></vibe-icon>
|
|
42
|
+
<span class="fs-5 fw-bold">Acme</span>
|
|
43
|
+
</a>
|
|
44
|
+
<hr>
|
|
45
|
+
<!-- Vertical pill nav, icons via #item slot, reactive active section -->
|
|
46
|
+
<vibe-nav vertical pills :items="navItems" @item-click="onNavClick" class="flex-grow-1">
|
|
47
|
+
<template #item="{ item }">
|
|
48
|
+
<vibe-icon :icon="item.icon" class="me-2"></vibe-icon>
|
|
49
|
+
{{ item.text }}
|
|
50
|
+
</template>
|
|
51
|
+
</vibe-nav>
|
|
52
|
+
<hr>
|
|
53
|
+
<vibe-dropdown
|
|
54
|
+
text="Jane Doe"
|
|
55
|
+
variant="dark"
|
|
56
|
+
direction="up"
|
|
57
|
+
:items="userMenu"
|
|
58
|
+
@item-click="onUserMenu"
|
|
59
|
+
>
|
|
60
|
+
<template #button>
|
|
61
|
+
<vibe-icon icon="person-circle" class="me-2"></vibe-icon>
|
|
62
|
+
Jane Doe
|
|
63
|
+
</template>
|
|
64
|
+
</vibe-dropdown>
|
|
65
|
+
</aside>
|
|
66
|
+
|
|
67
|
+
<!-- Main content -->
|
|
68
|
+
<main class="flex-grow-1 p-4">
|
|
69
|
+
<h1 class="h3 mb-1">{{ activeContent.title }}</h1>
|
|
70
|
+
<p class="text-muted">{{ activeContent.subtitle }}</p>
|
|
71
|
+
|
|
72
|
+
<vibe-row :gutters="3" class="mt-3">
|
|
73
|
+
<vibe-col :md="6" :xl="4" v-for="card in activeContent.cards" :key="card.title">
|
|
74
|
+
<vibe-card class="h-100 shadow-sm">
|
|
75
|
+
<template #header>
|
|
76
|
+
<vibe-icon :icon="card.icon" class="me-2"></vibe-icon>
|
|
77
|
+
{{ card.title }}
|
|
78
|
+
</template>
|
|
79
|
+
<p class="mb-0 text-muted">{{ card.body }}</p>
|
|
80
|
+
</vibe-card>
|
|
81
|
+
</vibe-col>
|
|
82
|
+
</vibe-row>
|
|
83
|
+
</main>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<!-- Mobile offcanvas sidebar: same nav, closes on selection -->
|
|
87
|
+
<vibe-offcanvas v-model="showSidebar" title="Acme" placement="start">
|
|
88
|
+
<vibe-nav vertical pills :items="navItems" @item-click="onNavClickMobile">
|
|
89
|
+
<template #item="{ item }">
|
|
90
|
+
<vibe-icon :icon="item.icon" class="me-2"></vibe-icon>
|
|
91
|
+
{{ item.text }}
|
|
92
|
+
</template>
|
|
93
|
+
</vibe-nav>
|
|
94
|
+
</vibe-offcanvas>
|
|
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, ref, computed } = Vue;
|
|
102
|
+
const { useToast } = VibeUI;
|
|
103
|
+
|
|
104
|
+
createApp({
|
|
105
|
+
setup() {
|
|
106
|
+
const toast = useToast();
|
|
107
|
+
const showSidebar = ref(false);
|
|
108
|
+
const activeSection = ref('dashboard');
|
|
109
|
+
|
|
110
|
+
const menu = [
|
|
111
|
+
{ id: 'dashboard', text: 'Dashboard', icon: 'speedometer2' },
|
|
112
|
+
{ id: 'orders', text: 'Orders', icon: 'bag' },
|
|
113
|
+
{ id: 'products', text: 'Products', icon: 'box-seam' },
|
|
114
|
+
{ id: 'customers', text: 'Customers', icon: 'people' },
|
|
115
|
+
{ id: 'reports', text: 'Reports', icon: 'graph-up' },
|
|
116
|
+
{ id: 'settings', text: 'Settings', icon: 'gear' }
|
|
117
|
+
];
|
|
118
|
+
|
|
119
|
+
// No href -> VibeNav renders clickable buttons (no Bootstrap Tab JS), active drives content.
|
|
120
|
+
const navItems = computed(() => menu.map(m => ({
|
|
121
|
+
text: m.text, icon: m.icon, active: m.id === activeSection.value
|
|
122
|
+
})));
|
|
123
|
+
|
|
124
|
+
const content = {
|
|
125
|
+
dashboard: { title: 'Dashboard', subtitle: 'Overview of your store at a glance.', cards: [
|
|
126
|
+
{ title: 'Revenue', icon: 'cash-stack', body: '$45,231 this month, up 12%.' },
|
|
127
|
+
{ title: 'Orders', icon: 'bag-check', body: '1,234 orders awaiting fulfilment.' },
|
|
128
|
+
{ title: 'Visitors', icon: 'eye', body: '8,540 unique visitors this week.' }
|
|
129
|
+
]},
|
|
130
|
+
orders: { title: 'Orders', subtitle: 'Track and manage customer orders.', cards: [
|
|
131
|
+
{ title: 'Pending', icon: 'hourglass-split', body: '42 orders pending review.' },
|
|
132
|
+
{ title: 'Shipped', icon: 'truck', body: '318 orders shipped this week.' }
|
|
133
|
+
]},
|
|
134
|
+
products: { title: 'Products', subtitle: 'Your catalog and inventory.', cards: [
|
|
135
|
+
{ title: 'In stock', icon: 'box-seam', body: '512 SKUs available.' },
|
|
136
|
+
{ title: 'Low stock', icon: 'exclamation-triangle', body: '7 products below threshold.' }
|
|
137
|
+
]},
|
|
138
|
+
customers: { title: 'Customers', subtitle: 'People who buy from you.', cards: [
|
|
139
|
+
{ title: 'Total', icon: 'people', body: '5,671 registered customers.' }
|
|
140
|
+
]},
|
|
141
|
+
reports: { title: 'Reports', subtitle: 'Insights and analytics.', cards: [
|
|
142
|
+
{ title: 'Sales trend', icon: 'graph-up-arrow', body: 'Steady growth over 6 months.' }
|
|
143
|
+
]},
|
|
144
|
+
settings: { title: 'Settings', subtitle: 'Configure your workspace.', cards: [
|
|
145
|
+
{ title: 'Preferences', icon: 'sliders', body: 'Theme, locale, and notifications.' }
|
|
146
|
+
]}
|
|
147
|
+
};
|
|
148
|
+
const activeContent = computed(() => content[activeSection.value]);
|
|
149
|
+
|
|
150
|
+
const userMenu = [
|
|
151
|
+
{ text: 'Profile' },
|
|
152
|
+
{ text: 'Billing' },
|
|
153
|
+
{ divider: true },
|
|
154
|
+
{ text: 'Sign out' }
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
const onNavClick = ({ index }) => { activeSection.value = menu[index].id; };
|
|
158
|
+
const onNavClickMobile = ({ index }) => { activeSection.value = menu[index].id; showSidebar.value = false; };
|
|
159
|
+
const onUserMenu = ({ item }) => { toast.info(item.text); };
|
|
160
|
+
|
|
161
|
+
return { showSidebar, navItems, activeContent, userMenu, onNavClick, onNavClickMobile, onUserMenu };
|
|
162
|
+
}
|
|
163
|
+
}).use(VibeUI.default).mount('#app');
|
|
164
|
+
</script>
|
|
165
|
+
</body>
|
|
166
|
+
</html>
|
|
@@ -0,0 +1,119 @@
|
|
|
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>Sign in - 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="min-vh-100 d-flex align-items-center justify-content-center py-5">
|
|
27
|
+
<vibe-col :md="7" :lg="5" :xl="4">
|
|
28
|
+
<vibe-card class="shadow-sm">
|
|
29
|
+
<div class="text-center mb-4">
|
|
30
|
+
<vibe-icon icon="box-seam-fill" class="text-primary" font-size="2.5rem"></vibe-icon>
|
|
31
|
+
<h1 class="h3 mt-2 mb-1">Sign in</h1>
|
|
32
|
+
<p class="text-muted small mb-0">Welcome back — please enter your details.</p>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<form novalidate @submit.prevent="onSubmit">
|
|
36
|
+
<vibe-form-group label="Email address">
|
|
37
|
+
<vibe-form-input
|
|
38
|
+
v-model="form.fields.email"
|
|
39
|
+
type="email"
|
|
40
|
+
placeholder="you@example.com"
|
|
41
|
+
:validation-state="stateFor('email')"
|
|
42
|
+
:validation-message="form.errors.email"
|
|
43
|
+
/>
|
|
44
|
+
</vibe-form-group>
|
|
45
|
+
|
|
46
|
+
<vibe-form-group label="Password">
|
|
47
|
+
<vibe-form-input
|
|
48
|
+
v-model="form.fields.password"
|
|
49
|
+
type="password"
|
|
50
|
+
placeholder="••••••••"
|
|
51
|
+
:validation-state="stateFor('password')"
|
|
52
|
+
:validation-message="form.errors.password"
|
|
53
|
+
/>
|
|
54
|
+
</vibe-form-group>
|
|
55
|
+
|
|
56
|
+
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
57
|
+
<vibe-form-checkbox v-model="form.fields.remember">Remember me</vibe-form-checkbox>
|
|
58
|
+
<a href="#" class="small text-decoration-none">Forgot password?</a>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<vibe-button type="submit" variant="primary" class="w-100">
|
|
62
|
+
<vibe-icon icon="box-arrow-in-right" class="me-2"></vibe-icon>
|
|
63
|
+
Sign in
|
|
64
|
+
</vibe-button>
|
|
65
|
+
</form>
|
|
66
|
+
|
|
67
|
+
<template #footer>
|
|
68
|
+
<div class="text-center small text-muted">
|
|
69
|
+
Don't have an account? <a href="#" class="text-decoration-none">Sign up</a>
|
|
70
|
+
</div>
|
|
71
|
+
</template>
|
|
72
|
+
</vibe-card>
|
|
73
|
+
</vibe-col>
|
|
74
|
+
</vibe-container>
|
|
75
|
+
|
|
76
|
+
<vibe-toast-host></vibe-toast-host>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
80
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
81
|
+
<script src="../dist/vibeui.umd.js"></script>
|
|
82
|
+
<script>
|
|
83
|
+
const { createApp, ref } = Vue;
|
|
84
|
+
const { useForm, useToast, validators } = VibeUI;
|
|
85
|
+
|
|
86
|
+
createApp({
|
|
87
|
+
setup() {
|
|
88
|
+
const toast = useToast();
|
|
89
|
+
const form = useForm({ email: '', password: '', remember: false });
|
|
90
|
+
const submitted = ref(false);
|
|
91
|
+
|
|
92
|
+
// Per-field state: nothing before first submit, then valid/invalid from errors.
|
|
93
|
+
const stateFor = (key) => !submitted.value ? null : (form.errors[key] ? 'invalid' : 'valid');
|
|
94
|
+
|
|
95
|
+
const onSubmit = async () => {
|
|
96
|
+
submitted.value = true;
|
|
97
|
+
const result = await form.validate({
|
|
98
|
+
email: [
|
|
99
|
+
validators.required('Email is required'),
|
|
100
|
+
validators.email('Enter a valid email address')
|
|
101
|
+
],
|
|
102
|
+
password: [
|
|
103
|
+
validators.required('Password is required'),
|
|
104
|
+
validators.minLength(8, 'Must be at least 8 characters')
|
|
105
|
+
]
|
|
106
|
+
});
|
|
107
|
+
if (result.valid) {
|
|
108
|
+
toast.success(`Signed in as ${form.fields.email}`);
|
|
109
|
+
} else {
|
|
110
|
+
toast.error('Please fix the highlighted fields');
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return { form, submitted, stateFor, onSubmit };
|
|
115
|
+
}
|
|
116
|
+
}).use(VibeUI.default).mount('#app');
|
|
117
|
+
</script>
|
|
118
|
+
</body>
|
|
119
|
+
</html>
|
|
@@ -0,0 +1,314 @@
|
|
|
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>Starter Template - VibeUI</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
|
+
.feature-icon {
|
|
12
|
+
width: 4rem;
|
|
13
|
+
height: 4rem;
|
|
14
|
+
border-radius: .75rem;
|
|
15
|
+
display: inline-flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
font-size: 2rem;
|
|
19
|
+
margin-bottom: 1rem;
|
|
20
|
+
}
|
|
21
|
+
</style>
|
|
22
|
+
|
|
23
|
+
<!-- VibeUI loads Bootstrap JS internally via `import('bootstrap')`; the UMD bundle
|
|
24
|
+
keeps that bare specifier, so the page maps it here so the dropdown works. -->
|
|
25
|
+
<script type="importmap">
|
|
26
|
+
{
|
|
27
|
+
"imports": {
|
|
28
|
+
"bootstrap": "https://esm.sh/bootstrap@5.3.0"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
</head>
|
|
33
|
+
<body>
|
|
34
|
+
<div id="app">
|
|
35
|
+
<vibe-navbar variant="dark" expand="lg" class="shadow-sm">
|
|
36
|
+
<vibe-container>
|
|
37
|
+
<vibe-navbar-brand href="#">
|
|
38
|
+
<vibe-icon icon="lightning-charge-fill" class="me-2"></vibe-icon>
|
|
39
|
+
VibeUI
|
|
40
|
+
</vibe-navbar-brand>
|
|
41
|
+
<vibe-navbar-toggle target="navbarNav"></vibe-navbar-toggle>
|
|
42
|
+
<vibe-collapse id="navbarNav" is-nav>
|
|
43
|
+
<vibe-navbar-nav :items="navItems" class="ms-auto"></vibe-navbar-nav>
|
|
44
|
+
</vibe-collapse>
|
|
45
|
+
</vibe-container>
|
|
46
|
+
</vibe-navbar>
|
|
47
|
+
|
|
48
|
+
<!-- Hero Section -->
|
|
49
|
+
<vibe-hero
|
|
50
|
+
gradient="linear-gradient(135deg, #667eea 0%, #764ba2 100%)"
|
|
51
|
+
align="start"
|
|
52
|
+
class="text-white"
|
|
53
|
+
>
|
|
54
|
+
<vibe-row class="align-items-center">
|
|
55
|
+
<vibe-col :lg="6">
|
|
56
|
+
<h1 class="display-3 fw-bold mb-3">Build amazing apps with VibeUI</h1>
|
|
57
|
+
<p class="lead mb-4">A modern Vue 3 component library built on Bootstrap 5.3. Create beautiful, responsive interfaces in minutes.</p>
|
|
58
|
+
<div class="d-flex gap-3 mb-4">
|
|
59
|
+
<vibe-button variant="light" size="lg" @click="handleGetStarted">
|
|
60
|
+
<vibe-icon icon="rocket-takeoff-fill" class="me-2"></vibe-icon>
|
|
61
|
+
Get Started
|
|
62
|
+
</vibe-button>
|
|
63
|
+
<vibe-button variant="light" outline size="lg">
|
|
64
|
+
<vibe-icon icon="github" class="me-2"></vibe-icon>
|
|
65
|
+
View on GitHub
|
|
66
|
+
</vibe-button>
|
|
67
|
+
</div>
|
|
68
|
+
</vibe-col>
|
|
69
|
+
<vibe-col :lg="6" class="text-center">
|
|
70
|
+
<img src="https://via.placeholder.com/600x400/ffffff/667eea?text=VibeUI+Demo" alt="Demo" class="img-fluid rounded-4 shadow-lg">
|
|
71
|
+
</vibe-col>
|
|
72
|
+
</vibe-row>
|
|
73
|
+
</vibe-hero>
|
|
74
|
+
|
|
75
|
+
<!-- Alert Demo -->
|
|
76
|
+
<vibe-container class="my-5">
|
|
77
|
+
<vibe-row>
|
|
78
|
+
<vibe-col :cols="12">
|
|
79
|
+
<vibe-alert v-model="showAlert" variant="success" dismissible class="shadow-sm">
|
|
80
|
+
<vibe-icon icon="check-circle-fill" class="me-2"></vibe-icon>
|
|
81
|
+
<strong>Welcome!</strong> This is a live demo of VibeUI components. Try clicking the buttons below!
|
|
82
|
+
</vibe-alert>
|
|
83
|
+
</vibe-col>
|
|
84
|
+
</vibe-row>
|
|
85
|
+
</vibe-container>
|
|
86
|
+
|
|
87
|
+
<!-- Features -->
|
|
88
|
+
<vibe-container class="my-5 py-5">
|
|
89
|
+
<vibe-row>
|
|
90
|
+
<vibe-col :cols="12" class="text-center mb-5">
|
|
91
|
+
<h2 class="display-5 fw-bold">Why developers love VibeUI</h2>
|
|
92
|
+
<p class="lead text-muted">Everything you need to build modern web applications</p>
|
|
93
|
+
</vibe-col>
|
|
94
|
+
</vibe-row>
|
|
95
|
+
<vibe-row :gutters="4">
|
|
96
|
+
<vibe-col :md="4" v-for="feature in features" :key="feature.title">
|
|
97
|
+
<div class="text-center h-100">
|
|
98
|
+
<div :class="`feature-icon bg-${feature.color} bg-opacity-10 text-${feature.color}`">
|
|
99
|
+
<vibe-icon :icon="feature.icon"></vibe-icon>
|
|
100
|
+
</div>
|
|
101
|
+
<h4 class="fw-bold">{{ feature.title }}</h4>
|
|
102
|
+
<p class="text-muted">{{ feature.description }}</p>
|
|
103
|
+
</div>
|
|
104
|
+
</vibe-col>
|
|
105
|
+
</vibe-row>
|
|
106
|
+
</vibe-container>
|
|
107
|
+
|
|
108
|
+
<!-- Interactive Demo -->
|
|
109
|
+
<section class="bg-light py-5">
|
|
110
|
+
<vibe-container>
|
|
111
|
+
<vibe-row class="align-items-center">
|
|
112
|
+
<vibe-col :lg="6">
|
|
113
|
+
<h2 class="display-6 fw-bold mb-3">Interactive Components</h2>
|
|
114
|
+
<p class="lead text-muted mb-4">All components are fully reactive and work seamlessly with Vue 3.</p>
|
|
115
|
+
|
|
116
|
+
<div class="d-flex gap-2 mb-3 flex-wrap">
|
|
117
|
+
<vibe-button variant="primary" @click="counter++">
|
|
118
|
+
<vibe-icon icon="hand-thumbs-up-fill" class="me-2"></vibe-icon>
|
|
119
|
+
Like ({{ counter }})
|
|
120
|
+
</vibe-button>
|
|
121
|
+
<vibe-button variant="success">
|
|
122
|
+
<vibe-icon icon="share-fill" class="me-2"></vibe-icon>
|
|
123
|
+
Share
|
|
124
|
+
</vibe-button>
|
|
125
|
+
<vibe-dropdown id="demo-dropdown" text="More" variant="secondary" :items="moreItems">
|
|
126
|
+
<template #item="{ item }">
|
|
127
|
+
<vibe-icon :icon="item.icon" class="me-2"></vibe-icon>
|
|
128
|
+
{{ item.text }}
|
|
129
|
+
</template>
|
|
130
|
+
</vibe-dropdown>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class="mb-4">
|
|
134
|
+
<vibe-badge variant="primary" class="me-2">Vue 3</vibe-badge>
|
|
135
|
+
<vibe-badge variant="success" class="me-2">TypeScript</vibe-badge>
|
|
136
|
+
<vibe-badge variant="info" class="me-2">Bootstrap 5.3</vibe-badge>
|
|
137
|
+
<vibe-badge variant="warning">Responsive</vibe-badge>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<vibe-progress
|
|
141
|
+
class="mb-2"
|
|
142
|
+
height="20px"
|
|
143
|
+
:bars="[{ value: 75, variant: 'primary', striped: true, animated: true, label: '75% Complete' }]"
|
|
144
|
+
></vibe-progress>
|
|
145
|
+
</vibe-col>
|
|
146
|
+
<vibe-col :lg="6">
|
|
147
|
+
<vibe-card class="shadow border-0">
|
|
148
|
+
<h5 class="card-title fw-bold mb-3">Component Showcase</h5>
|
|
149
|
+
<vibe-list-group flush :items="showcaseItems">
|
|
150
|
+
<template #item="{ item }">
|
|
151
|
+
<div class="d-flex justify-content-between align-items-center">
|
|
152
|
+
<div>
|
|
153
|
+
<vibe-icon :icon="item.icon" :class="`text-${item.color} me-2`"></vibe-icon>
|
|
154
|
+
{{ item.name }}
|
|
155
|
+
</div>
|
|
156
|
+
<vibe-badge :variant="item.color" pill>{{ item.count }}</vibe-badge>
|
|
157
|
+
</div>
|
|
158
|
+
</template>
|
|
159
|
+
</vibe-list-group>
|
|
160
|
+
</vibe-card>
|
|
161
|
+
</vibe-col>
|
|
162
|
+
</vibe-row>
|
|
163
|
+
</vibe-container>
|
|
164
|
+
</section>
|
|
165
|
+
|
|
166
|
+
<!-- Stats -->
|
|
167
|
+
<vibe-container class="py-5 my-5">
|
|
168
|
+
<vibe-row class="text-center" :gutters="4">
|
|
169
|
+
<vibe-col :md="3" v-for="stat in stats" :key="stat.label">
|
|
170
|
+
<div class="h-100">
|
|
171
|
+
<div :class="`display-4 fw-bold text-${stat.color}`">{{ stat.value }}</div>
|
|
172
|
+
<p class="text-muted mb-0">{{ stat.label }}</p>
|
|
173
|
+
</div>
|
|
174
|
+
</vibe-col>
|
|
175
|
+
</vibe-row>
|
|
176
|
+
</vibe-container>
|
|
177
|
+
|
|
178
|
+
<!-- CTA -->
|
|
179
|
+
<section class="bg-primary text-white py-5">
|
|
180
|
+
<vibe-container class="text-center">
|
|
181
|
+
<vibe-row>
|
|
182
|
+
<vibe-col :cols="12">
|
|
183
|
+
<h2 class="display-5 fw-bold mb-3">Ready to get started?</h2>
|
|
184
|
+
<p class="lead mb-4">Join thousands of developers building with VibeUI</p>
|
|
185
|
+
<vibe-button variant="light" size="lg" class="me-3">
|
|
186
|
+
<vibe-icon icon="download" class="me-2"></vibe-icon>
|
|
187
|
+
Install Now
|
|
188
|
+
</vibe-button>
|
|
189
|
+
<vibe-button variant="light" outline size="lg">
|
|
190
|
+
<vibe-icon icon="book" class="me-2"></vibe-icon>
|
|
191
|
+
Read Docs
|
|
192
|
+
</vibe-button>
|
|
193
|
+
</vibe-col>
|
|
194
|
+
</vibe-row>
|
|
195
|
+
</vibe-container>
|
|
196
|
+
</section>
|
|
197
|
+
|
|
198
|
+
<!-- Footer -->
|
|
199
|
+
<footer class="bg-dark text-white py-5">
|
|
200
|
+
<vibe-container>
|
|
201
|
+
<vibe-row :gutters="4">
|
|
202
|
+
<vibe-col :lg="4">
|
|
203
|
+
<h5 class="fw-bold mb-3">
|
|
204
|
+
<vibe-icon icon="lightning-charge-fill" class="me-2"></vibe-icon>
|
|
205
|
+
VibeUI
|
|
206
|
+
</h5>
|
|
207
|
+
<p class="text-white-50">A modern Vue 3 UI library for building beautiful applications with Bootstrap 5.3.</p>
|
|
208
|
+
</vibe-col>
|
|
209
|
+
<vibe-col :lg="2">
|
|
210
|
+
<h6 class="fw-bold mb-3">Product</h6>
|
|
211
|
+
<ul class="list-unstyled">
|
|
212
|
+
<li class="mb-2"><a href="#" class="text-white-50 text-decoration-none">Features</a></li>
|
|
213
|
+
<li class="mb-2"><a href="#" class="text-white-50 text-decoration-none">Pricing</a></li>
|
|
214
|
+
<li class="mb-2"><a href="#" class="text-white-50 text-decoration-none">Examples</a></li>
|
|
215
|
+
</ul>
|
|
216
|
+
</vibe-col>
|
|
217
|
+
<vibe-col :lg="2">
|
|
218
|
+
<h6 class="fw-bold mb-3">Resources</h6>
|
|
219
|
+
<ul class="list-unstyled">
|
|
220
|
+
<li class="mb-2"><a href="#" class="text-white-50 text-decoration-none">Documentation</a></li>
|
|
221
|
+
<li class="mb-2"><a href="#" class="text-white-50 text-decoration-none">Components</a></li>
|
|
222
|
+
<li class="mb-2"><a href="#" class="text-white-50 text-decoration-none">GitHub</a></li>
|
|
223
|
+
</ul>
|
|
224
|
+
</vibe-col>
|
|
225
|
+
<vibe-col :lg="4">
|
|
226
|
+
<h6 class="fw-bold mb-3">Stay Updated</h6>
|
|
227
|
+
<p class="text-white-50 small">Get the latest updates and news about VibeUI.</p>
|
|
228
|
+
<div class="d-flex gap-2">
|
|
229
|
+
<a href="#" class="text-white"><vibe-icon icon="twitter" size="lg"></vibe-icon></a>
|
|
230
|
+
<a href="#" class="text-white"><vibe-icon icon="github" size="lg"></vibe-icon></a>
|
|
231
|
+
<a href="#" class="text-white"><vibe-icon icon="discord" size="lg"></vibe-icon></a>
|
|
232
|
+
</div>
|
|
233
|
+
</vibe-col>
|
|
234
|
+
</vibe-row>
|
|
235
|
+
<hr class="my-4 border-secondary">
|
|
236
|
+
<vibe-row>
|
|
237
|
+
<vibe-col :md="6">
|
|
238
|
+
<p class="text-white-50 small mb-0">© 2024 VibeUI. Built with ✨ by <a href="https://technosorcery.com" class="text-white-50">TechnoSorcery.com</a></p>
|
|
239
|
+
</vibe-col>
|
|
240
|
+
<vibe-col :md="6" class="text-md-end">
|
|
241
|
+
<a href="#" class="text-white-50 text-decoration-none small me-3">Privacy</a>
|
|
242
|
+
<a href="#" class="text-white-50 text-decoration-none small">Terms</a>
|
|
243
|
+
</vibe-col>
|
|
244
|
+
</vibe-row>
|
|
245
|
+
</vibe-container>
|
|
246
|
+
</footer>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
|
250
|
+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
|
251
|
+
<script src="../dist/vibeui.umd.js"></script>
|
|
252
|
+
<script>
|
|
253
|
+
const { createApp } = Vue;
|
|
254
|
+
|
|
255
|
+
createApp({
|
|
256
|
+
data() {
|
|
257
|
+
return {
|
|
258
|
+
showAlert: true,
|
|
259
|
+
counter: 42,
|
|
260
|
+
navItems: [
|
|
261
|
+
{ text: 'Features', href: '#' },
|
|
262
|
+
{ text: 'Examples', href: '#' },
|
|
263
|
+
{ text: 'Docs', href: '#' },
|
|
264
|
+
{ text: 'GitHub', href: '#' }
|
|
265
|
+
],
|
|
266
|
+
moreItems: [
|
|
267
|
+
{ text: 'Bookmark', icon: 'bookmark', href: '#' },
|
|
268
|
+
{ text: 'Download', icon: 'download', href: '#' },
|
|
269
|
+
{ divider: true },
|
|
270
|
+
{ text: 'Report', icon: 'flag', href: '#' }
|
|
271
|
+
],
|
|
272
|
+
features: [
|
|
273
|
+
{
|
|
274
|
+
icon: 'lightning-charge-fill',
|
|
275
|
+
color: 'primary',
|
|
276
|
+
title: 'Lightning Fast',
|
|
277
|
+
description: 'Optimized for performance with minimal bundle size and maximum efficiency.'
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
icon: 'palette-fill',
|
|
281
|
+
color: 'success',
|
|
282
|
+
title: 'Customizable',
|
|
283
|
+
description: 'Easily theme and customize components to match your brand identity.'
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
icon: 'shield-check',
|
|
287
|
+
color: 'info',
|
|
288
|
+
title: 'Type Safe',
|
|
289
|
+
description: 'Full TypeScript support with comprehensive type definitions.'
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
showcaseItems: [
|
|
293
|
+
{ name: 'Navigation', icon: 'compass', color: 'primary', count: '8' },
|
|
294
|
+
{ name: 'Forms', icon: 'ui-checks', color: 'success', count: '12' },
|
|
295
|
+
{ name: 'Data Display', icon: 'table', color: 'info', count: '6' },
|
|
296
|
+
{ name: 'Feedback', icon: 'bell', color: 'warning', count: '5' }
|
|
297
|
+
],
|
|
298
|
+
stats: [
|
|
299
|
+
{ value: '50+', label: 'Components', color: 'primary' },
|
|
300
|
+
{ value: '10K+', label: 'Downloads', color: 'success' },
|
|
301
|
+
{ value: '100%', label: 'Free & Open', color: 'info' },
|
|
302
|
+
{ value: '5.0', label: 'Rating', color: 'warning' }
|
|
303
|
+
]
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
methods: {
|
|
307
|
+
handleGetStarted() {
|
|
308
|
+
alert('Ready to build something amazing? Check out the documentation!');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}).use(VibeUI.default).mount('#app');
|
|
312
|
+
</script>
|
|
313
|
+
</body>
|
|
314
|
+
</html>
|