@velkymx/vibeui 0.8.2 → 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/README.md +245 -58
- 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 +24 -30
- 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 +16 -20
- 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/src/components/VibeDatePicker.vue.d.ts +120 -0
- package/dist/src/components/VibeDraggable.vue.d.ts +77 -0
- package/dist/{components → src/components}/VibeDropdown.vue.d.ts +46 -43
- package/dist/src/components/VibeDroppable.vue.d.ts +70 -0
- package/dist/src/components/VibeFileInput.vue.d.ts +127 -0
- package/dist/{components → src/components}/VibeFormCheckbox.vue.d.ts +30 -22
- package/dist/{components → src/components}/VibeFormDatepicker.vue.d.ts +27 -30
- package/dist/{components → src/components}/VibeFormGroup.vue.d.ts +11 -14
- package/dist/{components → src/components}/VibeFormInput.vue.d.ts +22 -23
- package/dist/{components → src/components}/VibeFormRadio.vue.d.ts +23 -24
- package/dist/{components → src/components}/VibeFormSelect.vue.d.ts +28 -34
- package/dist/{components → src/components}/VibeFormSpinbutton.vue.d.ts +31 -34
- package/dist/{components → src/components}/VibeFormSwitch.vue.d.ts +22 -23
- package/dist/{components → src/components}/VibeFormTextarea.vue.d.ts +24 -25
- package/dist/{components → src/components}/VibeFormWysiwyg.vue.d.ts +24 -23
- 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/src/components/VibeResizable.vue.d.ts +140 -0
- package/dist/{components → src/components}/VibeRow.vue.d.ts +9 -17
- package/dist/src/components/VibeScrollspy.vue.d.ts +89 -0
- package/dist/src/components/VibeSkeleton.vue.d.ts +54 -0
- package/dist/src/components/VibeSlider.vue.d.ts +77 -0
- package/dist/src/components/VibeSortable.vue.d.ts +59 -0
- package/dist/{components → src/components}/VibeSpinner.vue.d.ts +4 -7
- package/dist/src/components/VibeStepper.vue.d.ts +133 -0
- package/dist/src/components/VibeTab.vue.d.ts +41 -0
- package/dist/src/components/VibeTabContent.vue.d.ts +56 -0
- package/dist/src/components/VibeTabs.vue.d.ts +78 -0
- package/dist/{components → src/components}/VibeToast.vue.d.ts +40 -42
- package/dist/src/components/VibeToastHost.vue.d.ts +16 -0
- 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/src/components/dndStore.d.ts +7 -0
- package/dist/{components → src/components}/index.d.ts +18 -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/useForm.d.ts +22 -0
- package/dist/src/composables/useId.d.ts +2 -0
- package/dist/src/composables/usePosition.d.ts +20 -0
- package/dist/src/composables/useToast.d.ts +52 -0
- package/dist/src/directives/vTooltip.d.ts +24 -0
- package/dist/{index.d.ts → src/index.d.ts} +6 -0
- package/dist/src/injectionKeys.d.ts +28 -0
- package/dist/{types.d.ts → src/types.d.ts} +32 -6
- 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 +8351 -3508
- package/dist/vibeui.umd.js +3 -1
- package/docs/README.md +85 -13
- package/docs/components/advanced/popover.md +27 -52
- package/docs/components/advanced/scrollspy.md +57 -15
- package/docs/components/advanced/tooltip.md +26 -47
- package/docs/components/card/card.md +9 -1
- 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 +27 -5
- package/docs/components/core/badge.md +0 -6
- package/docs/components/core/button-group.md +0 -6
- package/docs/components/core/button.md +1 -1
- package/docs/components/core/close-button.md +5 -5
- package/docs/components/core/link.md +60 -17
- package/docs/components/core/placeholder.md +0 -6
- package/docs/components/core/skeleton.md +40 -0
- package/docs/components/core/spinner.md +0 -6
- package/docs/components/data/datatable.md +29 -10
- package/docs/components/hero/hero.md +64 -0
- package/docs/components/interactive/accordion.md +29 -0
- package/docs/components/interactive/carousel.md +19 -4
- package/docs/components/interactive/collapse.md +3 -2
- package/docs/components/interactive/date-picker.md +78 -0
- package/docs/components/interactive/draggable.md +91 -0
- package/docs/components/interactive/dropdown.md +54 -18
- package/docs/components/interactive/modal.md +15 -20
- package/docs/components/interactive/offcanvas.md +4 -1
- 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 +93 -30
- package/docs/components/layout/col.md +0 -6
- package/docs/components/layout/container.md +0 -6
- package/docs/components/layout/row.md +0 -6
- package/docs/components/list/list-group.md +4 -0
- package/docs/components/navigation/breadcrumb.md +4 -0
- package/docs/components/navigation/nav.md +64 -1
- package/docs/components/navigation/navbar.md +2 -0
- package/docs/components/navigation/pagination.md +16 -0
- package/docs/components/progress/progress.md +7 -1
- package/docs/composables/color-mode.md +44 -6
- 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 +60 -61
- package/docs/forms/autocomplete.md +96 -0
- package/docs/forms/file-input.md +97 -0
- package/docs/forms/form-checkbox.md +75 -25
- package/docs/forms/form-datepicker.md +58 -28
- package/docs/forms/form-group.md +79 -44
- package/docs/forms/form-input.md +88 -31
- package/docs/forms/form-radio.md +60 -36
- package/docs/forms/form-select.md +75 -31
- package/docs/forms/form-spinbutton.md +72 -33
- package/docs/forms/form-switch.md +53 -25
- package/docs/forms/form-textarea.md +60 -29
- package/docs/forms/form-wysiwyg.md +73 -38
- package/docs/forms/input-group.md +53 -34
- package/docs/forms/validation.md +135 -521
- 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 +407 -47
- package/package.json +42 -13
- 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/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/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}/useFormValidation.d.ts +0 -0
- /package/dist/{main.d.ts → src/main.d.ts} +0 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# VibeUI — Guidance for AI Coding Agents
|
|
2
|
+
|
|
3
|
+
You are generating code that uses **`@velkymx/vibeui`** — a Vue 3 component library wrapping Bootstrap 5.3. Follow this and you'll produce correct code on the first try.
|
|
4
|
+
|
|
5
|
+
## Read the docs before you build — do not guess
|
|
6
|
+
|
|
7
|
+
These all ship inside the installed package:
|
|
8
|
+
|
|
9
|
+
- **Start here:** [`llms.txt`](./llms.txt) (package root) — the load → use → leverage workflow, a "common mistakes" cheat sheet, and a link index to every doc page.
|
|
10
|
+
- **Full API reference:** [`docs/`](./docs/README.md) — one page per component with its exact props, events, and slots.
|
|
11
|
+
- **Working examples:** [`examples/`](./examples/index.html) — full-page templates to copy patterns from.
|
|
12
|
+
|
|
13
|
+
**Do NOT** infer the API from `dist/`, from the compiled `.d.ts` types alone, or from memory. The documented props, `:items` shapes, and slot names are the source of truth. When unsure about a component, open its doc page first.
|
|
14
|
+
|
|
15
|
+
## Core rules
|
|
16
|
+
|
|
17
|
+
1. **Bootstrap CSS yes, Bootstrap JS never.** Import `bootstrap/dist/css/bootstrap.min.css` in your app. Do **not** import Bootstrap's JS — VibeUI loads it internally, on demand. (Non-bundler / UMD / CDN pages need a `bootstrap` import map, e.g. `{ "imports": { "bootstrap": "https://esm.sh/bootstrap@5.3" } }`, or interactive components silently fail.)
|
|
18
|
+
2. **Style with props.** `variant`, `size`, `outline` (a boolean — use `variant="secondary" outline`, **not** `variant="outline-secondary"`). For one-offs, pass `class`/`style`; they merge onto the component root.
|
|
19
|
+
3. **Visibility is `v-model`.** `<VibeModal v-model="open" />` (also Offcanvas / Toast / Collapse / Alert). Don't call Bootstrap `show`/`hide`.
|
|
20
|
+
4. **Data-driven components take arrays — never hand-write the Bootstrap markup:**
|
|
21
|
+
- `:items` → `VibeNav`, `VibeDropdown`, `VibeListGroup`, `VibeBreadcrumb`, `VibeNavbarNav`, `VibeCarousel` (`CarouselItem[]`, each needs `src`)
|
|
22
|
+
- `:options` → `VibeFormSelect`
|
|
23
|
+
- `:bars` → `VibeProgress`
|
|
24
|
+
- `:columns` + `:items` → `VibeDataTable`
|
|
25
|
+
5. **Custom content uses slots:** `#item` (Nav/Dropdown/ListGroup), `#header`/`#footer`/`#image` (Card), `cell(<key>)` (DataTable), default slot for body.
|
|
26
|
+
6. **These tags do NOT exist** — use the slot / `:items` API instead: `<vibe-card-body>`, `<vibe-card-header>`, `<vibe-list-group-item>`, `<vibe-nav-item>`, `<vibe-dropdown-item>`, `<vibe-progress-bar>`.
|
|
27
|
+
7. **`VibeIcon` uses `icon=`**, not `name=`.
|
|
28
|
+
8. **Drive components through props / `v-model` / slots / exposed methods** (`modal.value?.show()` / `.hide()` / `.toggle()` / `.refresh()` via a template ref). Never reach around the component to Bootstrap's own instance.
|
|
29
|
+
9. **Forms:** wrap controls in `<VibeFormGroup label="…">` (auto-links label + id + accessibility). Validate with `useForm` + `validators`; bind `:validation-state` / `:validation-message` per field.
|
|
30
|
+
|
|
31
|
+
## Setup
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { createApp } from 'vue'
|
|
35
|
+
import VibeUI from '@velkymx/vibeui'
|
|
36
|
+
import 'bootstrap/dist/css/bootstrap.min.css'
|
|
37
|
+
createApp(App).use(VibeUI).mount('#app') // registers all components + the v-vibe-tooltip directive
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Or import components by name for tree-shaking and full template type-checking:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { VibeButton, VibeModal, VibeCard } from '@velkymx/vibeui'
|
|
44
|
+
```
|
package/README.md
CHANGED
|
@@ -1,101 +1,288 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center"><img src="https://github.com/velkymx/vibeui/blob/1.0-main/vibeui.png?raw=true">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://vuejs.org/)
|
|
4
|
+
[](https://getbootstrap.com/)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](https://www.npmjs.com/package/@velkymx/vibeui)
|
|
8
|
+
[](https://github.com/velkymx/vibeui/actions/workflows/ci.yml)
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
# About VibeUI
|
|
13
|
+
|
|
14
|
+
**The Vue 3 component library for people who already love Bootstrap.**
|
|
15
|
+
|
|
16
|
+
> **🤖 Building with an AI assistant?** Point it at [`llms.txt`](./llms.txt) (quick-start guardrails + a link to every doc) and [`docs/`](./docs/README.md). Every component's props, events, and slots are documented — **don't let it guess props or reverse-engineer from `dist/`.** Quick reminders: data-driven components use `:items` / `:bars` / `:options`, visibility uses `v-model`, outline buttons use the `outline` prop, and granular tags like `<vibe-card-body>` / `<vibe-nav-item>` do **not** exist (use slots). All of this ships inside the npm package — see also [`AGENTS.md`](./AGENTS.md).
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Bootstrap components in Vue are painful. Every modal, tooltip, dropdown, and collapse needs manual JS instantiation, event wiring, unique ID generation, ARIA linking, and teardown on unmount. Miss one step and you ship memory leaks, broken focus, duplicate IDs, or detached-DOM crashes.
|
|
23
|
+
|
|
24
|
+
VibeUI handles all of it. 60+ strictly-typed Vue 3 components that wrap Bootstrap 5.3 - and quietly own every piece of plumbing:
|
|
25
|
+
- JS lifecycle (init, reconfigure, dispose) with race-condition and unmount guards
|
|
26
|
+
- `v-model` on every interactive component
|
|
27
|
+
- Auto-generated IDs, labels, and `aria-describedby` via `VibeFormGroup`
|
|
28
|
+
- Focus return to trigger on modal/offcanvas close (WCAG 2.4.3)
|
|
29
|
+
- Touch/hybrid detection for tooltips, modals, and Android back button
|
|
30
|
+
- Lazy-loaded heavy dependencies (charts, WYSIWYG editor, Bootstrap JS)
|
|
31
|
+
|
|
32
|
+
Plus an interaction suite - drag/drop, sortable, resizable, slider, stepper, autocomplete, calendar, and canvas charts - filling the gap jQuery UI left behind.
|
|
33
|
+
|
|
34
|
+
You keep the Bootstrap you know. VibeUI handles the Vue you'd rather not write.
|
|
6
35
|
|
|
7
|
-
|
|
8
|
-
* **Full Bootstrap 5 Integration**: Automatically manages Bootstrap's JavaScript lifecycle, including dynamic initialization, reactive configuration, and memory cleanup.
|
|
9
|
-
* **Data-Driven & Reactive**: Components are fully reactive with `v-model` support and automatic updates when props or data change.
|
|
10
|
-
* **Smart Form Intelligence**: Automated ID generation and accessibility linking via `VibeFormGroup` context.
|
|
11
|
-
* **Zero-Boilerplate**: Components handle their own IDs, Teleportation, and Bootstrap instances internally.
|
|
12
|
-
* **TypeScript Support**: Fully typed components for a great developer experience.
|
|
13
|
-
* **Accessibility First**: Automatic ARIA attribute management and focus trapping.
|
|
36
|
+
> **Coming from BootstrapVue?** If you built on Bootstrap + Vue 2, VibeUI will feel familiar: component-per-feature, data-driven `items` arrays, `v-model` everywhere, and Bootstrap styling via props. Not a drop-in port, but the mental model carries over.
|
|
14
37
|
|
|
15
|
-
##
|
|
38
|
+
## Contents
|
|
16
39
|
|
|
17
|
-
|
|
40
|
+
- [Quick Start](#quick-start)
|
|
41
|
+
- [Features](#features)
|
|
42
|
+
- [Components](#components)
|
|
43
|
+
- [Layout](#layout)
|
|
44
|
+
- [Core](#core)
|
|
45
|
+
- [Navigation](#navigation)
|
|
46
|
+
- [Containers](#containers)
|
|
47
|
+
- [Interactive](#interactive)
|
|
48
|
+
- [Tooltips & Popovers](#tooltips--popovers)
|
|
49
|
+
- [Data & Charts](#data--charts)
|
|
50
|
+
- [Forms](#forms)
|
|
51
|
+
- [Composables](#composables)
|
|
52
|
+
- [Directives](#directives)
|
|
53
|
+
- [Examples](#examples)
|
|
54
|
+
- [Documentation](#documentation)
|
|
55
|
+
|
|
56
|
+
## Quick Start
|
|
18
57
|
|
|
19
58
|
```bash
|
|
20
59
|
npm install @velkymx/vibeui bootstrap
|
|
21
60
|
```
|
|
22
61
|
|
|
23
|
-
|
|
62
|
+
Optional peers (only if you use the features that need them):
|
|
24
63
|
|
|
25
64
|
```bash
|
|
26
|
-
npm install bootstrap-icons
|
|
65
|
+
npm install bootstrap-icons # VibeIcon
|
|
66
|
+
npm install quill dompurify # VibeFormWysiwyg (dompurify sanitizes editor HTML)
|
|
27
67
|
```
|
|
28
68
|
|
|
29
|
-
|
|
69
|
+
In your app entry (`main.ts`):
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { createApp } from 'vue'
|
|
73
|
+
import App from './App.vue'
|
|
74
|
+
import VibeUI from '@velkymx/vibeui'
|
|
75
|
+
import 'bootstrap/dist/css/bootstrap.min.css'
|
|
30
76
|
|
|
31
|
-
|
|
77
|
+
createApp(App).use(VibeUI).mount('#app')
|
|
78
|
+
```
|
|
32
79
|
|
|
33
|
-
|
|
34
|
-
import { createApp } from 'vue';
|
|
35
|
-
import App from './App.vue';
|
|
36
|
-
import VibeUI from '@velkymx/vibeui';
|
|
37
|
-
import 'bootstrap/dist/css/bootstrap.min.css';
|
|
80
|
+
All components register globally. Prefer explicit imports? Tree-shakeable:
|
|
38
81
|
|
|
39
|
-
|
|
82
|
+
```ts
|
|
83
|
+
import { VibeButton, VibeModal, VibeCard } from '@velkymx/vibeui'
|
|
40
84
|
```
|
|
41
85
|
|
|
42
|
-
|
|
86
|
+
> Bootstrap **CSS** is imported by you. Bootstrap **JS** is managed internally - do not import it yourself.
|
|
43
87
|
|
|
44
|
-
|
|
88
|
+
### 30-second taste
|
|
45
89
|
|
|
46
90
|
```vue
|
|
47
91
|
<template>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
</VibeModal>
|
|
58
|
-
</div>
|
|
92
|
+
<!-- Tooltip: auto-inits, taps on touch, hovers on desktop -->
|
|
93
|
+
<VibeTooltip text="I just work!">
|
|
94
|
+
<VibeButton>Hover or Tap Me</VibeButton>
|
|
95
|
+
</VibeTooltip>
|
|
96
|
+
|
|
97
|
+
<!-- v-model modal, hybrid-ready, focus-safe -->
|
|
98
|
+
<VibeModal v-model="showModal" title="Hello!">
|
|
99
|
+
Fully reactive, automated, and accessible.
|
|
100
|
+
</VibeModal>
|
|
59
101
|
</template>
|
|
60
102
|
```
|
|
61
103
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
VibeUI handles accessibility and IDs for you.
|
|
104
|
+
Forms wire their own accessibility:
|
|
65
105
|
|
|
66
106
|
```vue
|
|
67
107
|
<template>
|
|
68
|
-
<!-- No
|
|
108
|
+
<!-- No id needed - label, control, and feedback linked automatically -->
|
|
69
109
|
<VibeFormGroup label="Email Address">
|
|
70
|
-
<VibeFormInput v-model="email" type="email" />
|
|
110
|
+
<VibeFormInput v-model="fields.email" type="email" />
|
|
71
111
|
</VibeFormGroup>
|
|
72
|
-
|
|
73
|
-
<!-- New in v0.8.0: Input Groups -->
|
|
74
|
-
<VibeInputGroup prepend="@">
|
|
75
|
-
<VibeFormInput v-model="username" noWrapper />
|
|
76
|
-
</VibeInputGroup>
|
|
77
112
|
</template>
|
|
78
113
|
```
|
|
79
114
|
|
|
115
|
+
Toasts from anywhere:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
import { useToast } from '@velkymx/vibeui'
|
|
119
|
+
const toast = useToast()
|
|
120
|
+
toast.success('Saved')
|
|
121
|
+
toast.error('Network error', { delay: 8000 })
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Mount `<VibeToastHost />` once at app root, dispatch from any component.
|
|
125
|
+
|
|
126
|
+
## Features
|
|
127
|
+
|
|
128
|
+
| Feature | What it means |
|
|
129
|
+
|---------|---------------|
|
|
130
|
+
| **Bootstrap JS abstracted** | No `new bootstrap.Modal(...)`. Init, reconfigure, and dispose are automatic - with unmount guards. |
|
|
131
|
+
| **v-model everywhere** | Modals, offcanvas, toasts, collapses, tabs, accordions, sliders, and every form control. |
|
|
132
|
+
| **Self-wiring accessibility** | `VibeFormGroup` generates IDs, links labels, `aria-describedby`, help text, and validation feedback. Modals/offcanvas return focus on close. |
|
|
133
|
+
| **Strict TypeScript** | Typed props, emit payloads, and `provide`/`inject` keys. Full editor autocomplete, no `any`. |
|
|
134
|
+
| **Touch & hybrid aware** | Tooltips switch to tap on touch. Modals and offcanvas honor Android back button. |
|
|
135
|
+
| **Lazy-loaded** | Charts, WYSIWYG editor, and Bootstrap's JS load on demand - ship only what you use. |
|
|
136
|
+
| **Interaction suite** | Drag/drop, sortable, resizable, slider, stepper, autocomplete, calendar, and canvas charts. |
|
|
137
|
+
|
|
80
138
|
## Components
|
|
81
139
|
|
|
82
|
-
|
|
140
|
+
60+ components covering Bootstrap 5.3 plus an interaction and data-viz suite.
|
|
141
|
+
|
|
142
|
+
### Layout
|
|
143
|
+
|
|
144
|
+
| Component | Description | Docs |
|
|
145
|
+
|-----------|-------------|------|
|
|
146
|
+
| `VibeContainer` | Responsive fixed/fluid container | [docs](./docs/components/layout/container.md) |
|
|
147
|
+
| `VibeRow` | Flexbox grid row | [docs](./docs/components/layout/row.md) |
|
|
148
|
+
| `VibeCol` | Flexbox grid column with breakpoints | [docs](./docs/components/layout/col.md) |
|
|
149
|
+
|
|
150
|
+
### Core
|
|
151
|
+
|
|
152
|
+
| Component | Description | Docs |
|
|
153
|
+
|-----------|-------------|------|
|
|
154
|
+
| `VibeAlert` | Contextual alert with dismiss and fade animation | [docs](./docs/components/core/alert.md) |
|
|
155
|
+
| `VibeBadge` | Inline badge with variant and pill styles | [docs](./docs/components/core/badge.md) |
|
|
156
|
+
| `VibeButton` | Button with variant, size, and outline styles | [docs](./docs/components/core/button.md) |
|
|
157
|
+
| `VibeButtonGroup` | Horizontal or vertical button group | [docs](./docs/components/core/button-group.md) |
|
|
158
|
+
| `VibeCloseButton` | Accessible dismiss button | [docs](./docs/components/core/close-button.md) |
|
|
159
|
+
| `VibeIcon` | Bootstrap Icons wrapper with sizing and color | - |
|
|
160
|
+
| `VibeLink` | Styled anchor with href validation | [docs](./docs/components/core/link.md) |
|
|
161
|
+
| `VibePlaceholder` | Animated loading placeholder | [docs](./docs/components/core/placeholder.md) |
|
|
162
|
+
| `VibeSkeleton` | Multi-variant skeleton loading component | [docs](./docs/components/core/skeleton.md) |
|
|
163
|
+
| `VibeSpinner` | Loading spinner with variant and size | [docs](./docs/components/core/spinner.md) |
|
|
164
|
+
|
|
165
|
+
### Navigation
|
|
166
|
+
|
|
167
|
+
| Component | Description | Docs |
|
|
168
|
+
|-----------|-------------|------|
|
|
169
|
+
| `VibeBreadcrumb` | Breadcrumb trail from items array | [docs](./docs/components/navigation/breadcrumb.md) |
|
|
170
|
+
| `VibeNav` | Tab/pill nav with router-link support | [docs](./docs/components/navigation/nav.md) |
|
|
171
|
+
| `VibeNavbar` | Responsive navbar with collapse | [docs](./docs/components/navigation/navbar.md) |
|
|
172
|
+
| `VibeNavbarBrand` | Navbar brand/logo link | [docs](./docs/components/navigation/navbar.md) |
|
|
173
|
+
| `VibeNavbarToggle` | Navbar collapse toggle button | [docs](./docs/components/navigation/navbar.md) |
|
|
174
|
+
| `VibeNavbarNav` | Navbar nav list from items array | [docs](./docs/components/navigation/navbar.md) |
|
|
175
|
+
| `VibePagination` | Pagination with ellipsis and page window | [docs](./docs/components/navigation/pagination.md) |
|
|
176
|
+
| `VibeScrollspy` | Scroll-aware nav highlighting | [docs](./docs/components/advanced/scrollspy.md) |
|
|
177
|
+
|
|
178
|
+
### Containers
|
|
179
|
+
|
|
180
|
+
| Component | Description | Docs |
|
|
181
|
+
|-----------|-------------|------|
|
|
182
|
+
| `VibeCard` | Card container with header/body/footer slots, section classes, and an image slot | [docs](./docs/components/card/card.md) |
|
|
183
|
+
| `VibeHero` | Hero / banner section (variant, bordered, bgImage, gradient, overlay) | [docs](./docs/components/hero/hero.md) |
|
|
184
|
+
| `VibeListGroup` | List group with router-link support | [docs](./docs/components/list/list-group.md) |
|
|
185
|
+
|
|
186
|
+
### Interactive
|
|
187
|
+
|
|
188
|
+
| Component | Description | Docs |
|
|
189
|
+
|-----------|-------------|------|
|
|
190
|
+
| `VibeAccordion` | Accordion with always-open and flush options | [docs](./docs/components/interactive/accordion.md) |
|
|
191
|
+
| `VibeCarousel` | Image carousel with indicators and captions | [docs](./docs/components/interactive/carousel.md) |
|
|
192
|
+
| `VibeCollapse` | Toggle visibility with Bootstrap animation | [docs](./docs/components/interactive/collapse.md) |
|
|
193
|
+
| `VibeDatePicker` | Calendar date picker with range and min/max | [docs](./docs/components/interactive/date-picker.md) |
|
|
194
|
+
| `VibeDraggable` | Drag source wrapper | [docs](./docs/components/interactive/draggable.md) |
|
|
195
|
+
| `VibeDroppable` | Drop target zone | [docs](./docs/components/interactive/draggable.md) |
|
|
196
|
+
| `VibeDropdown` | Dropdown menu with items array | [docs](./docs/components/interactive/dropdown.md) |
|
|
197
|
+
| `VibeModal` | Modal dialog with v-model, sizes, scrollable | [docs](./docs/components/interactive/modal.md) |
|
|
198
|
+
| `VibeOffcanvas` | Offcanvas panel with placement options | [docs](./docs/components/interactive/offcanvas.md) |
|
|
199
|
+
| `VibeResizable` | Resizable container with aspect-ratio lock | [docs](./docs/components/interactive/resizable.md) |
|
|
200
|
+
| `VibeSlider` | Range slider with single or dual handles | [docs](./docs/components/interactive/slider.md) |
|
|
201
|
+
| `VibeSortable` | Sortable list with drag reorder | [docs](./docs/components/interactive/sortable.md) |
|
|
202
|
+
| `VibeStepper` | Multi-step wizard with validation | [docs](./docs/components/interactive/stepper.md) |
|
|
203
|
+
| `VibeTabs` | Tabbed interface from items array | [docs](./docs/components/interactive/tabs.md) |
|
|
204
|
+
| `VibeTab` | Individual tab panel | [docs](./docs/components/interactive/tabs.md) |
|
|
205
|
+
| `VibeTabContent` | Standalone tab-pane content host | [docs](./docs/components/interactive/tabs.md) |
|
|
206
|
+
| `VibeToast` | Toast notification component with v-model | [docs](./docs/components/interactive/toast.md) |
|
|
207
|
+
| `VibeToastHost` | Toast container for `useToast()` service | [docs](./docs/composables/use-toast.md) |
|
|
208
|
+
|
|
209
|
+
### Tooltips & Popovers
|
|
210
|
+
|
|
211
|
+
| Component | Description | Docs |
|
|
212
|
+
|-----------|-------------|------|
|
|
213
|
+
| `VibePopover` | Popover with title and text content | [docs](./docs/components/advanced/popover.md) |
|
|
214
|
+
| `VibeTooltip` | Tooltip with hover/tap detection | [docs](./docs/components/advanced/tooltip.md) |
|
|
215
|
+
|
|
216
|
+
### Data & Charts
|
|
217
|
+
|
|
218
|
+
| Component | Description | Docs |
|
|
219
|
+
|-----------|-------------|------|
|
|
220
|
+
| `VibeDataTable` | Sortable, searchable, paginated data table | [docs](./docs/components/data/datatable.md) |
|
|
221
|
+
| `VibeProgress` | Progress bar with multi-bar and animated | [docs](./docs/components/progress/progress.md) |
|
|
222
|
+
| `VibeChartBar` | Bar chart (stacked, grouped) | [docs](./docs/components/charts/chart-bar.md) |
|
|
223
|
+
| `VibeChartLine` | Line chart with smooth curves and fill | [docs](./docs/components/charts/chart-line.md) |
|
|
224
|
+
| `VibeChartPie` | Pie chart | [docs](./docs/components/charts/chart-pie.md) |
|
|
225
|
+
|
|
226
|
+
> Charts are dependency-free, canvas-rendered, and lazy-loaded - no Chart.js or D3.
|
|
227
|
+
|
|
228
|
+
### Forms
|
|
229
|
+
|
|
230
|
+
| Component | Description | Docs |
|
|
231
|
+
|-----------|-------------|------|
|
|
232
|
+
| `VibeAutocomplete` | Typeahead with keyboard nav and async search | [docs](./docs/forms/autocomplete.md) |
|
|
233
|
+
| `VibeFileInput` | File picker with drag/drop and size validation | [docs](./docs/forms/file-input.md) |
|
|
234
|
+
| `VibeFormCheckbox` | Checkbox with indeterminate and group support | [docs](./docs/forms/form-checkbox.md) |
|
|
235
|
+
| `VibeFormDatepicker` | Native date input wrapper | [docs](./docs/forms/form-datepicker.md) |
|
|
236
|
+
| `VibeFormGroup` | Auto-wires label, IDs, help text, and validation | [docs](./docs/forms/form-group.md) |
|
|
237
|
+
| `VibeFormInput` | Text input with types, sizes, and states | [docs](./docs/forms/form-input.md) |
|
|
238
|
+
| `VibeFormRadio` | Radio button with group and inline layout | [docs](./docs/forms/form-radio.md) |
|
|
239
|
+
| `VibeFormSelect` | Select dropdown with single and multiple selection | [docs](./docs/forms/form-select.md) |
|
|
240
|
+
| `VibeFormSpinbutton` | Numeric stepper with min/max/step | [docs](./docs/forms/form-spinbutton.md) |
|
|
241
|
+
| `VibeFormSwitch` | Toggle switch with label | [docs](./docs/forms/form-switch.md) |
|
|
242
|
+
| `VibeFormTextarea` | Multi-line text input with character count | [docs](./docs/forms/form-textarea.md) |
|
|
243
|
+
| `VibeFormWysiwyg` | Rich-text editor (Quill) with DOMPurify sanitization | [docs](./docs/forms/form-wysiwyg.md) |
|
|
244
|
+
| `VibeInputGroup` | Input with prepend/append slots | [docs](./docs/forms/input-group.md) |
|
|
245
|
+
|
|
246
|
+
Form validation rules and `useForm()` API: [docs](./docs/forms/validation.md)
|
|
247
|
+
|
|
248
|
+
## Composables
|
|
249
|
+
|
|
250
|
+
| Composable | Description | Docs |
|
|
251
|
+
|------------|-------------|------|
|
|
252
|
+
| `useBackButton` | Android back button handler | [docs](./docs/composables/back-button.md) |
|
|
253
|
+
| `useBreakpoints` | Reactive Bootstrap breakpoint detection | [docs](./docs/composables/breakpoints.md) |
|
|
254
|
+
| `useColorMode` | Light/dark/auto mode with system detection | [docs](./docs/composables/color-mode.md) |
|
|
255
|
+
| `useForm` | Form state, dirty detection, and validation | [docs](./docs/composables/use-form.md) |
|
|
256
|
+
| `useFormValidation` | Standalone validator runner with concurrency guard | [docs](./docs/forms/validation.md) |
|
|
257
|
+
| `usePosition` | Popper-style positioning utility | [docs](./docs/composables/use-position.md) |
|
|
258
|
+
| `useToast` | Programmatic toast dispatch (success, error, etc.) | [docs](./docs/composables/use-toast.md) |
|
|
83
259
|
|
|
84
|
-
|
|
85
|
-
* **Core**: Alert, Badge, Button, ButtonGroup, CloseButton, Spinner, Placeholder, Icon, Link
|
|
86
|
-
* **Navigation**: Breadcrumb, Nav, Navbar, Pagination, Scrollspy
|
|
87
|
-
* **Interactive**: Accordion, Collapse, Dropdown, Modal, Offcanvas, Toast, Carousel
|
|
88
|
-
* **Data**: DataTable (with mobile Stack mode)
|
|
89
|
-
* **Forms**: Input, InputGroup, Select, Textarea, Spinbutton, Datepicker, Checkbox, Radio, Switch, Wysiwyg, FormGroup
|
|
260
|
+
## Directives
|
|
90
261
|
|
|
91
|
-
|
|
262
|
+
| Directive | Description | Docs |
|
|
263
|
+
|-----------|-------------|------|
|
|
264
|
+
| `v-vibe-tooltip` | Directive-based tooltip on any element | [docs](./docs/directives/v-tooltip.md) |
|
|
92
265
|
|
|
93
|
-
|
|
266
|
+
## Examples
|
|
94
267
|
|
|
95
|
-
|
|
268
|
+
Full-page templates built entirely with VibeUI components — open [`examples/index.html`](./examples/index.html) (see [`examples/README.md`](./examples/README.md) for how to run them):
|
|
96
269
|
|
|
97
|
-
|
|
270
|
+
| Example | Shows |
|
|
271
|
+
|---------|-------|
|
|
272
|
+
| [Starter](./examples/starter.html) | Navbar, hero, features, interactive components, footer |
|
|
273
|
+
| [Album](./examples/album.html) | Photo grid with cards, badges, and an icon nav |
|
|
274
|
+
| [Pricing](./examples/pricing.html) | Pricing cards with variant-colored headers |
|
|
275
|
+
| [Checkout](./examples/checkout.html) | Full billing form, order summary, and validation |
|
|
276
|
+
| [Sign-in](./examples/sign-in.html) | Centered form with `useForm` validation |
|
|
277
|
+
| [Dashboard](./examples/dashboard.html) | Admin shell with sidebar and `VibeDataTable` |
|
|
278
|
+
| [Sidebars](./examples/sidebars.html) | Desktop sidebar + mobile offcanvas nav |
|
|
279
|
+
| [Product](./examples/product.html) | Marketing page with hero, feature grid, product cards |
|
|
280
|
+
| [Carousel](./examples/carousel.html) | Full-width `VibeCarousel` + featurettes |
|
|
281
|
+
| [Cover](./examples/cover.html) | Full-viewport one-page `VibeHero` |
|
|
282
|
+
| [Blog](./examples/blog.html) | Magazine layout with pagination and sidebar |
|
|
283
|
+
| [Jumbotron](./examples/jumbotron.html) | Modern jumbotron via the bordered `VibeHero` |
|
|
98
284
|
|
|
99
|
-
##
|
|
285
|
+
## Documentation
|
|
100
286
|
|
|
101
|
-
|
|
287
|
+
Full API reference: [`docs/`](./docs/README.md)
|
|
288
|
+
LLM-optimized reference: [`llms.txt`](./llms.txt)
|