@velkymx/vibeui 0.8.0 → 0.8.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/CLAUDE.md +48 -0
- package/dist/vibeui.css +1 -1
- package/dist/vibeui.es.js +149 -148
- package/dist/vibeui.umd.js +1 -1
- package/docs/README.md +153 -0
- package/docs/components/advanced/popover.md +150 -0
- package/docs/components/advanced/scrollspy.md +64 -0
- package/docs/components/advanced/tooltip.md +111 -0
- package/docs/components/card/card.md +215 -0
- package/docs/components/core/alert.md +72 -0
- package/docs/components/core/badge.md +81 -0
- package/docs/components/core/button-group.md +105 -0
- package/docs/components/core/button.md +127 -0
- package/docs/components/core/close-button.md +82 -0
- package/docs/components/core/link.md +36 -0
- package/docs/components/core/placeholder.md +135 -0
- package/docs/components/core/spinner.md +109 -0
- package/docs/components/data/datatable.md +416 -0
- package/docs/components/interactive/accordion.md +92 -0
- package/docs/components/interactive/carousel.md +97 -0
- package/docs/components/interactive/collapse.md +105 -0
- package/docs/components/interactive/dropdown.md +93 -0
- package/docs/components/interactive/modal.md +148 -0
- package/docs/components/interactive/offcanvas.md +89 -0
- package/docs/components/interactive/toast.md +114 -0
- package/docs/components/layout/col.md +123 -0
- package/docs/components/layout/container.md +59 -0
- package/docs/components/layout/row.md +113 -0
- package/docs/components/list/list-group.md +221 -0
- package/docs/components/navigation/breadcrumb.md +116 -0
- package/docs/components/navigation/nav.md +88 -0
- package/docs/components/navigation/navbar.md +106 -0
- package/docs/components/navigation/pagination.md +146 -0
- package/docs/components/progress/progress.md +182 -0
- package/docs/composables/back-button.md +28 -0
- package/docs/composables/breakpoints.md +54 -0
- package/docs/composables/color-mode.md +141 -0
- package/docs/forms/README.md +88 -0
- package/docs/forms/form-checkbox.md +50 -0
- package/docs/forms/form-datepicker.md +50 -0
- package/docs/forms/form-group.md +80 -0
- package/docs/forms/form-input.md +55 -0
- package/docs/forms/form-radio.md +58 -0
- package/docs/forms/form-select.md +54 -0
- package/docs/forms/form-spinbutton.md +55 -0
- package/docs/forms/form-switch.md +47 -0
- package/docs/forms/form-textarea.md +51 -0
- package/docs/forms/form-wysiwyg.md +64 -0
- package/docs/forms/input-group.md +51 -0
- package/docs/forms/validation.md +599 -0
- package/llms.txt +422 -0
- package/package.json +5 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# VibeFormDatepicker
|
|
2
|
+
|
|
3
|
+
Date and time input component using native browser pickers.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const date = ref('')
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<VibeFormDatepicker
|
|
15
|
+
v-model="date"
|
|
16
|
+
label="Choose a date"
|
|
17
|
+
/>
|
|
18
|
+
</template>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Props
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
|------|------|---------|-------------|
|
|
25
|
+
| `modelValue` | `String` | `''` | The date string (v-model) |
|
|
26
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
27
|
+
| `label` | `String` | `undefined` | Label text |
|
|
28
|
+
| `disabled` | `Boolean` | `false` | Disable the picker |
|
|
29
|
+
| `readonly` | `Boolean` | `false` | Make readonly |
|
|
30
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
31
|
+
| `min` | `String` | `undefined` | Minimum date |
|
|
32
|
+
| `max` | `String` | `undefined` | Maximum date |
|
|
33
|
+
| `size` | `'sm' \| 'lg'` | `undefined` | Picker size |
|
|
34
|
+
| `type` | `String` | `'date'` | Type: `'date'`, `'time'`, `'datetime-local'`, etc. |
|
|
35
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
36
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
37
|
+
| `validateOn` | `'input' \| 'blur' \| 'change'` | `'blur'` | When to validate |
|
|
38
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
39
|
+
|
|
40
|
+
## Important Notes
|
|
41
|
+
|
|
42
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
43
|
+
|
|
44
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
45
|
+
|
|
46
|
+
## Bootstrap CSS Classes
|
|
47
|
+
|
|
48
|
+
- `.form-control`
|
|
49
|
+
- `.form-control-{size}`
|
|
50
|
+
- `.is-valid`, `.is-invalid`
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# VibeFormGroup
|
|
2
|
+
|
|
3
|
+
Form group container component for organizing form fields with labels, help text, and validation feedback.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
VibeFormGroup automatically links its label to the child VibeUI form component using automatic ID injection.
|
|
8
|
+
|
|
9
|
+
```vue
|
|
10
|
+
<script setup lang="ts">
|
|
11
|
+
import { ref } from 'vue'
|
|
12
|
+
const email = ref('')
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<template>
|
|
16
|
+
<VibeFormGroup
|
|
17
|
+
label="Email Address"
|
|
18
|
+
help-text="We'll never share your email with anyone else."
|
|
19
|
+
>
|
|
20
|
+
<VibeFormInput
|
|
21
|
+
v-model="email"
|
|
22
|
+
type="email"
|
|
23
|
+
placeholder="Enter email"
|
|
24
|
+
/>
|
|
25
|
+
</VibeFormGroup>
|
|
26
|
+
</template>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Floating Labels
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<template>
|
|
33
|
+
<VibeFormGroup
|
|
34
|
+
label="Email Address"
|
|
35
|
+
floating
|
|
36
|
+
>
|
|
37
|
+
<VibeFormInput
|
|
38
|
+
v-model="email"
|
|
39
|
+
type="email"
|
|
40
|
+
placeholder="name@example.com"
|
|
41
|
+
/>
|
|
42
|
+
</VibeFormGroup>
|
|
43
|
+
</template>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Horizontal Layout
|
|
47
|
+
|
|
48
|
+
```vue
|
|
49
|
+
<template>
|
|
50
|
+
<VibeFormGroup
|
|
51
|
+
label="Email"
|
|
52
|
+
row
|
|
53
|
+
:label-cols="3"
|
|
54
|
+
label-align="end"
|
|
55
|
+
>
|
|
56
|
+
<VibeFormInput v-model="email" type="email" />
|
|
57
|
+
</VibeFormGroup>
|
|
58
|
+
</template>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Important Notes
|
|
62
|
+
|
|
63
|
+
**Automatic ID Injection:** VibeFormGroup uses Vue's provide/inject to share a unique ID with its child VibeUI components (like `VibeFormInput`, `VibeFormSelect`, etc.). This ensures that labels and ARIA attributes are correctly linked without requiring manual `id` or `label-for` props.
|
|
64
|
+
|
|
65
|
+
**Manual Linking:** If you are using native HTML elements instead of VibeUI components inside the group, you must still provide a `label-for` on the group and a matching `id` on your element.
|
|
66
|
+
|
|
67
|
+
## Props
|
|
68
|
+
|
|
69
|
+
| Prop | Type | Default | Description |
|
|
70
|
+
|------|------|---------|-------------|
|
|
71
|
+
| `label` | `String` | `undefined` | Label text |
|
|
72
|
+
| `labelFor` | `String` | `Auto-generated` | ID of the form control |
|
|
73
|
+
| `required` | `Boolean` | `false` | Show required asterisk |
|
|
74
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
75
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
76
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
77
|
+
| `floating` | `Boolean` | `false` | Use floating label layout |
|
|
78
|
+
| `row` | `Boolean` | `false` | Use horizontal row layout |
|
|
79
|
+
| `labelCols` | `Number \| String` | `undefined` | Number of columns for label (1-12) |
|
|
80
|
+
| `labelAlign` | `'start' \| 'center' \| 'end'` | `undefined` | Label text alignment |
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# VibeFormInput
|
|
2
|
+
|
|
3
|
+
Text input component with built-in validation support for various input types.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const name = ref('')
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<VibeFormInput
|
|
15
|
+
v-model="name"
|
|
16
|
+
label="Full Name"
|
|
17
|
+
placeholder="Enter your name"
|
|
18
|
+
/>
|
|
19
|
+
</template>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
|------|------|---------|-------------|
|
|
26
|
+
| `modelValue` | `String \| Number` | `''` | The input value (v-model) |
|
|
27
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
28
|
+
| `label` | `String` | `undefined` | Label text |
|
|
29
|
+
| `type` | `InputType` | `'text'` | HTML input type |
|
|
30
|
+
| `placeholder` | `String` | `undefined` | Placeholder text |
|
|
31
|
+
| `disabled` | `Boolean` | `false` | Disable the input |
|
|
32
|
+
| `readonly` | `Boolean` | `false` | Make the input readonly |
|
|
33
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
34
|
+
| `size` | `'sm' \| 'lg'` | `undefined` | Input size |
|
|
35
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
36
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
37
|
+
| `validateOn` | `'input' \| 'blur' \| 'change'` | `'blur'` | When to validate |
|
|
38
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
39
|
+
| `plaintext` | `Boolean` | `false` | Display as plain text |
|
|
40
|
+
| `noWrapper` | `Boolean` | `false` | Removes the wrapping div, label, and feedback. Useful inside `VibeInputGroup`. |
|
|
41
|
+
| `focusRing` | `Boolean` | `false` | Enable the Bootstrap 5.3 focus-ring helper |
|
|
42
|
+
|
|
43
|
+
## Important Notes
|
|
44
|
+
|
|
45
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
46
|
+
|
|
47
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
48
|
+
|
|
49
|
+
## Bootstrap CSS Classes
|
|
50
|
+
|
|
51
|
+
- `.form-control`
|
|
52
|
+
- `.form-control-{size}`
|
|
53
|
+
- `.is-valid`, `.is-invalid`
|
|
54
|
+
- `.form-control-plaintext`
|
|
55
|
+
- `.focus-ring`
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# VibeFormRadio
|
|
2
|
+
|
|
3
|
+
Radio button component for exclusive selection within a group.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const picked = ref('one')
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<VibeFormRadio
|
|
15
|
+
v-model="picked"
|
|
16
|
+
name="myGroup"
|
|
17
|
+
value="one"
|
|
18
|
+
label="Option One"
|
|
19
|
+
/>
|
|
20
|
+
<VibeFormRadio
|
|
21
|
+
v-model="picked"
|
|
22
|
+
name="myGroup"
|
|
23
|
+
value="two"
|
|
24
|
+
label="Option Two"
|
|
25
|
+
/>
|
|
26
|
+
</template>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
| Prop | Type | Default | Description |
|
|
32
|
+
|------|------|---------|-------------|
|
|
33
|
+
| `modelValue` | `any` | `''` | The picked value (v-model) |
|
|
34
|
+
| `value` | `any` | Required | Value of this radio |
|
|
35
|
+
| `name` | `String` | Required | Shared name for the radio group |
|
|
36
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
37
|
+
| `label` | `String` | `undefined` | Label text |
|
|
38
|
+
| `disabled` | `Boolean` | `false` | Disable the radio |
|
|
39
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
40
|
+
| `inline` | `Boolean` | `false` | Display inline |
|
|
41
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
42
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
43
|
+
| `validateOn` | `'change' \| 'blur'` | `'change'` | When to validate |
|
|
44
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
45
|
+
| `reverse` | `Boolean` | `false` | Reverse label and input |
|
|
46
|
+
|
|
47
|
+
## Important Notes
|
|
48
|
+
|
|
49
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
50
|
+
|
|
51
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
52
|
+
|
|
53
|
+
## Bootstrap CSS Classes
|
|
54
|
+
|
|
55
|
+
- `.form-check`
|
|
56
|
+
- `.form-check-input`
|
|
57
|
+
- `.form-check-label`
|
|
58
|
+
- `.is-valid`, `.is-invalid`
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# VibeFormSelect
|
|
2
|
+
|
|
3
|
+
Custom select component with support for single and multiple selection.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const selected = ref('')
|
|
11
|
+
const options = [
|
|
12
|
+
{ value: '1', text: 'Option 1' },
|
|
13
|
+
{ value: '2', text: 'Option 2' }
|
|
14
|
+
]
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<template>
|
|
18
|
+
<VibeFormSelect
|
|
19
|
+
v-model="selected"
|
|
20
|
+
label="Choose an option"
|
|
21
|
+
:options="options"
|
|
22
|
+
/>
|
|
23
|
+
</template>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
| Prop | Type | Default | Description |
|
|
29
|
+
|------|------|---------|-------------|
|
|
30
|
+
| `modelValue` | `any` | `''` | Selected value (v-model) |
|
|
31
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
32
|
+
| `label` | `String` | `undefined` | Label text |
|
|
33
|
+
| `options` | `FormSelectOption[]` | `[]` | Array of options |
|
|
34
|
+
| `multiple` | `Boolean` | `false` | Enable multiple selection |
|
|
35
|
+
| `selectSize` | `Number` | `undefined` | Visible rows |
|
|
36
|
+
| `disabled` | `Boolean` | `false` | Disable the select |
|
|
37
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
38
|
+
| `size` | `'sm' \| 'lg'` | `undefined` | Select size |
|
|
39
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
40
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
41
|
+
| `validateOn` | `'change' \| 'blur'` | `'change'` | When to validate |
|
|
42
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
43
|
+
|
|
44
|
+
## Important Notes
|
|
45
|
+
|
|
46
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
47
|
+
|
|
48
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
49
|
+
|
|
50
|
+
## Bootstrap CSS Classes
|
|
51
|
+
|
|
52
|
+
- `.form-select`
|
|
53
|
+
- `.form-select-{size}`
|
|
54
|
+
- `.is-valid`, `.is-invalid`
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# VibeFormSpinbutton
|
|
2
|
+
|
|
3
|
+
Numeric input component with increment and decrement buttons.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const count = ref(0)
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<VibeFormSpinbutton
|
|
15
|
+
v-model="count"
|
|
16
|
+
label="Quantity"
|
|
17
|
+
:min="0"
|
|
18
|
+
:max="10"
|
|
19
|
+
/>
|
|
20
|
+
</template>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| Prop | Type | Default | Description |
|
|
26
|
+
|------|------|---------|-------------|
|
|
27
|
+
| `modelValue` | `Number` | `0` | The numeric value (v-model) |
|
|
28
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
29
|
+
| `label` | `String` | `undefined` | Label text |
|
|
30
|
+
| `disabled` | `Boolean` | `false` | Disable the spinbutton |
|
|
31
|
+
| `readonly` | `Boolean` | `false` | Make readonly |
|
|
32
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
33
|
+
| `min` | `Number` | `undefined` | Minimum value |
|
|
34
|
+
| `max` | `Number` | `undefined` | Maximum value |
|
|
35
|
+
| `step` | `Number` | `1` | Increment/decrement step |
|
|
36
|
+
| `size` | `'sm' \| 'lg'` | `undefined` | Button and input size |
|
|
37
|
+
| `wrap` | `Boolean` | `false` | Wrap around when min/max reached |
|
|
38
|
+
| `vertical` | `Boolean` | `false` | Stack buttons vertically |
|
|
39
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
40
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
41
|
+
| `validateOn` | `'input' \| 'blur' \| 'change'` | `'blur'` | When to validate |
|
|
42
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
43
|
+
|
|
44
|
+
## Important Notes
|
|
45
|
+
|
|
46
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
47
|
+
|
|
48
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
49
|
+
|
|
50
|
+
## Bootstrap CSS Classes
|
|
51
|
+
|
|
52
|
+
- `.form-control`
|
|
53
|
+
- `.input-group`
|
|
54
|
+
- `.btn`
|
|
55
|
+
- `.is-valid`, `.is-invalid`
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# VibeFormSwitch
|
|
2
|
+
|
|
3
|
+
Toggle switch component for boolean values.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const isEnabled = ref(false)
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<VibeFormSwitch
|
|
15
|
+
v-model="isEnabled"
|
|
16
|
+
label="Enable notifications"
|
|
17
|
+
/>
|
|
18
|
+
</template>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Props
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Description |
|
|
24
|
+
|------|------|---------|-------------|
|
|
25
|
+
| `modelValue` | `Boolean` | `false` | The toggle state (v-model) |
|
|
26
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
27
|
+
| `label` | `String` | `undefined` | Label text |
|
|
28
|
+
| `disabled` | `Boolean` | `false` | Disable the switch |
|
|
29
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
30
|
+
| `inline` | `Boolean` | `false` | Display inline |
|
|
31
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
32
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
33
|
+
| `validateOn` | `'change' \| 'blur'` | `'change'` | When to validate |
|
|
34
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
35
|
+
|
|
36
|
+
## Important Notes
|
|
37
|
+
|
|
38
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
39
|
+
|
|
40
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
41
|
+
|
|
42
|
+
## Bootstrap CSS Classes
|
|
43
|
+
|
|
44
|
+
- `.form-check`, `.form-switch`
|
|
45
|
+
- `.form-check-input`
|
|
46
|
+
- `.form-check-label`
|
|
47
|
+
- `.is-valid`, `.is-invalid`
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# VibeFormTextarea
|
|
2
|
+
|
|
3
|
+
Multi-line text input component.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { ref } from 'vue'
|
|
10
|
+
const text = ref('')
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<VibeFormTextarea
|
|
15
|
+
v-model="text"
|
|
16
|
+
label="Comments"
|
|
17
|
+
placeholder="Enter your comments here..."
|
|
18
|
+
/>
|
|
19
|
+
</template>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
|------|------|---------|-------------|
|
|
26
|
+
| `modelValue` | `String` | `''` | The textarea value (v-model) |
|
|
27
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
28
|
+
| `label` | `String` | `undefined` | Label text |
|
|
29
|
+
| `placeholder` | `String` | `undefined` | Placeholder text |
|
|
30
|
+
| `rows` | `Number \| String` | `3` | Number of visible rows |
|
|
31
|
+
| `disabled` | `Boolean` | `false` | Disable the textarea |
|
|
32
|
+
| `readonly` | `Boolean` | `false` | Make readonly |
|
|
33
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
34
|
+
| `size` | `'sm' \| 'lg'` | `undefined` | Textarea size |
|
|
35
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
36
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
37
|
+
| `validateOn` | `'input' \| 'blur' \| 'change'` | `'blur'` | When to validate |
|
|
38
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
39
|
+
| `noResize` | `Boolean` | `false` | Disable resizing |
|
|
40
|
+
|
|
41
|
+
## Important Notes
|
|
42
|
+
|
|
43
|
+
**Automatic ID Generation:** This component automatically generates a unique ID if one is not provided.
|
|
44
|
+
|
|
45
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID to ensure proper label association and accessibility.
|
|
46
|
+
|
|
47
|
+
## Bootstrap CSS Classes
|
|
48
|
+
|
|
49
|
+
- `.form-control`
|
|
50
|
+
- `.form-control-{size}`
|
|
51
|
+
- `.is-valid`, `.is-invalid`
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# VibeFormWysiwyg
|
|
2
|
+
|
|
3
|
+
WYSIWYG (What You See Is What You Get) editor component powered by QuillJS.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
First, install Quill as a dependency:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install quill
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Basic Usage
|
|
14
|
+
|
|
15
|
+
```vue
|
|
16
|
+
<script setup lang="ts">
|
|
17
|
+
import { ref } from 'vue'
|
|
18
|
+
const content = ref('')
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<template>
|
|
22
|
+
<VibeFormWysiwyg
|
|
23
|
+
v-model="content"
|
|
24
|
+
label="Content"
|
|
25
|
+
placeholder="Write something amazing..."
|
|
26
|
+
/>
|
|
27
|
+
</template>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Props
|
|
31
|
+
|
|
32
|
+
| Prop | Type | Default | Description |
|
|
33
|
+
|------|------|---------|-------------|
|
|
34
|
+
| `modelValue` | `String` | `''` | The HTML content (v-model) |
|
|
35
|
+
| `id` | `String` | `Auto-generated` | Unique identifier |
|
|
36
|
+
| `label` | `String` | `undefined` | Label text |
|
|
37
|
+
| `placeholder` | `String` | `'Write something...'` | Placeholder text |
|
|
38
|
+
| `disabled` | `Boolean` | `false` | Disable the editor |
|
|
39
|
+
| `readonly` | `Boolean` | `false` | Make readonly |
|
|
40
|
+
| `required` | `Boolean` | `false` | Mark as required |
|
|
41
|
+
| `theme` | `'snow' \| 'bubble'` | `'snow'` | Quill theme |
|
|
42
|
+
| `toolbar` | `Array \| String \| Boolean` | default toolbar | Full toolbar configuration |
|
|
43
|
+
| `mobileToolbar` | `Array \| String \| Boolean` | default mobile toolbar | Simplified toolbar for small screens |
|
|
44
|
+
| `height` | `String` | `'200px'` | Minimum height |
|
|
45
|
+
| `validationState` | `'valid' \| 'invalid' \| null` | `null` | Validation state |
|
|
46
|
+
| `validationMessage` | `String` | `undefined` | Validation message |
|
|
47
|
+
| `validationRules` | `ValidationRule[] \| ValidatorFunction` | `undefined` | Validation rules |
|
|
48
|
+
| `validateOn` | `'change' \| 'blur'` | `'blur'` | When to validate |
|
|
49
|
+
| `helpText` | `String` | `undefined` | Help text |
|
|
50
|
+
|
|
51
|
+
## Important Notes
|
|
52
|
+
|
|
53
|
+
**Automatic Initialization:** This component dynamically imports Quill and initializes it when mounted. If Quill is not installed in your project, it will display a helpful error message.
|
|
54
|
+
|
|
55
|
+
**Lifecycle Management:** VibeFormWysiwyg automatically cleans up its internal Quill instance and removes orphaned toolbar elements from the DOM on unmount to prevent memory leaks.
|
|
56
|
+
|
|
57
|
+
**Automatic ID Injection:** When used inside a `VibeFormGroup`, this component will automatically inherit the group's ID for proper label association.
|
|
58
|
+
|
|
59
|
+
## Bootstrap CSS Classes
|
|
60
|
+
|
|
61
|
+
- `.vibe-wysiwyg-container`
|
|
62
|
+
- `.is-valid`
|
|
63
|
+
- `.is-invalid`
|
|
64
|
+
- Uses native Quill CSS classes internally.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# VibeInputGroup
|
|
2
|
+
|
|
3
|
+
Input groups allow you to prepend or append text, buttons, or other elements to your input fields.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```vue
|
|
8
|
+
<VibeInputGroup prepend="@">
|
|
9
|
+
<VibeFormInput noWrapper v-model="username" placeholder="Username" />
|
|
10
|
+
</VibeInputGroup>
|
|
11
|
+
|
|
12
|
+
<VibeInputGroup append=".00">
|
|
13
|
+
<VibeFormInput noWrapper v-model="price" placeholder="Price" />
|
|
14
|
+
</VibeInputGroup>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Props
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
|------|------|---------|-------------|
|
|
21
|
+
| `prepend` | `String` | `undefined` | Shorthand for prepending text |
|
|
22
|
+
| `append` | `String` | `undefined` | Shorthand for appending text |
|
|
23
|
+
| `size` | `'sm' \| 'lg'` | `undefined` | Size of the input group |
|
|
24
|
+
| `tag` | `String` | `'div'` | HTML tag to use for the container |
|
|
25
|
+
|
|
26
|
+
## Slots
|
|
27
|
+
|
|
28
|
+
| Slot | Description |
|
|
29
|
+
|------|-------------|
|
|
30
|
+
| `default` | The main content, usually a `VibeFormInput` with the `noWrapper` prop |
|
|
31
|
+
| `prepend` | Slot for complex prepend content (e.g., icons or buttons) |
|
|
32
|
+
| `append` | Slot for complex append content |
|
|
33
|
+
|
|
34
|
+
## Advanced Example
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<VibeInputGroup>
|
|
38
|
+
<template #prepend>
|
|
39
|
+
<VibeButton variant="outline-secondary">Search</VibeButton>
|
|
40
|
+
</template>
|
|
41
|
+
<VibeFormInput noWrapper v-model="query" />
|
|
42
|
+
<template #append>
|
|
43
|
+
<span class="input-group-text">
|
|
44
|
+
<VibeIcon name="search" />
|
|
45
|
+
</span>
|
|
46
|
+
</template>
|
|
47
|
+
</VibeInputGroup>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Mobile Note
|
|
51
|
+
Input groups work seamlessly with the `noWrapper` prop on `VibeFormInput`, ensuring that the Bootstrap `.input-group` classes apply correctly without extra wrapping divs breaking the layout.
|