diff --git a/docs/components/input.md b/docs/components/input.md
index 21a255c..5ae4107 100644
--- a/docs/components/input.md
+++ b/docs/components/input.md
@@ -6,6 +6,7 @@ import InputHelperExample from './input/examples/InputHelperExample.vue';
import InputPrefixExample from './input/examples/InputPrefixExample.vue';
import InputSuffixExample from './input/examples/InputSuffixExample.vue'
import InputRequiredExample from './input/examples/InputRequiredExample.vue'
+import InputValidationExample from './input/examples/InputValidationExample.vue'
# Vue Input - Flowbite
@@ -124,3 +125,24 @@ import { Input, Button } from 'flowbite-vue'
```
+
+## Slot - Validation
+
+- Set validation status via `validationStatus` props, which accepts `'success'` or `'error'`.
+- Add validation message via `validationMessage` slot.
+
+```vue
+
+
+
+
+
+ Please enter a valid email address
+
+
+
+```
+
+
diff --git a/docs/components/input/examples/InputHelperExample.vue b/docs/components/input/examples/InputHelperExample.vue
index 4921483..6984a8c 100644
--- a/docs/components/input/examples/InputHelperExample.vue
+++ b/docs/components/input/examples/InputHelperExample.vue
@@ -1,6 +1,6 @@
diff --git a/docs/components/input/examples/InputPrefixExample.vue b/docs/components/input/examples/InputPrefixExample.vue
index 23bdaaa..f58980d 100644
--- a/docs/components/input/examples/InputPrefixExample.vue
+++ b/docs/components/input/examples/InputPrefixExample.vue
@@ -1,6 +1,6 @@
diff --git a/docs/components/input/examples/InputSizeExample.vue b/docs/components/input/examples/InputSizeExample.vue
index 25d04aa..a0ad55a 100644
--- a/docs/components/input/examples/InputSizeExample.vue
+++ b/docs/components/input/examples/InputSizeExample.vue
@@ -1,10 +1,12 @@
-
-
-
+
+
+
diff --git a/docs/components/input/examples/InputSuffixExample.vue b/docs/components/input/examples/InputSuffixExample.vue
index 5c03095..d2ea6ab 100644
--- a/docs/components/input/examples/InputSuffixExample.vue
+++ b/docs/components/input/examples/InputSuffixExample.vue
@@ -1,6 +1,6 @@
diff --git a/docs/components/input/examples/InputValidationExample.vue b/docs/components/input/examples/InputValidationExample.vue
new file mode 100644
index 0000000..c252abb
--- /dev/null
+++ b/docs/components/input/examples/InputValidationExample.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ Please enter a valid email address
+
+
+
+
+
diff --git a/src/components/Input/Input.vue b/src/components/Input/Input.vue
index 6831936..7e2b88b 100644
--- a/src/components/Input/Input.vue
+++ b/src/components/Input/Input.vue
@@ -18,15 +18,18 @@
+
+
+
diff --git a/src/components/Input/composables/useInputClasses.ts b/src/components/Input/composables/useInputClasses.ts
index 8f93d4f..fcee23e 100644
--- a/src/components/Input/composables/useInputClasses.ts
+++ b/src/components/Input/composables/useInputClasses.ts
@@ -1,10 +1,10 @@
import type { Ref } from 'vue'
import { computed } from 'vue'
-import type { InputSize } from '@/components/Input/types'
+import { ValidationStatus, type InputSize } from '@/components/Input/types'
import { simplifyTailwindClasses } from '@/utils/simplifyTailwindClasses'
// LABEL
-const defaultLabelClasses = 'block mb-2 text-sm font-medium text-gray-900 dark:text-gray-300'
+const baseLabelClasses = 'block mb-2 text-sm font-medium'
// INPUT
const defaultInputClasses = 'bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500'
@@ -15,9 +15,13 @@ const inputSizeClasses: Record = {
sm: 'p-2 text-sm',
}
+const successInputClasses = 'bg-green-50 border-green-500 dark:border-green-500 text-green-900 dark:text-green-400 placeholder-green-700 dark:placeholder-green-500 focus:ring-green-500 focus:border-green-500'
+const errorInputClasses = 'bg-red-50 border-red-500 text-red-900 placeholder-red-700 focus:ring-red-500 focus:border-red-500 dark:text-red-500 dark:placeholder-red-500 dark:border-red-500'
+
export type UseInputClassesProps = {
size: Ref
disabled: Ref
+ validationStatus: Ref
}
export function useInputClasses(props: UseInputClassesProps): {
@@ -25,11 +29,15 @@ export function useInputClasses(props: UseInputClassesProps): {
labelClasses: Ref
} {
const inputClasses = computed(() => {
- return simplifyTailwindClasses(defaultInputClasses, inputSizeClasses[props.size.value], props.disabled.value ? disabledInputClasses : '')
+ const vs = props.validationStatus.value
+ const classByStatus = vs === ValidationStatus.Success ? successInputClasses : (vs == ValidationStatus.Error ? errorInputClasses : '')
+ return simplifyTailwindClasses(defaultInputClasses, classByStatus, inputSizeClasses[props.size.value], props.disabled.value ? disabledInputClasses : '')
})
const labelClasses = computed(() => {
- return defaultLabelClasses
+ const vs = props.validationStatus.value
+ const classByStatus = vs === ValidationStatus.Success ? 'text-green-700 dark:text-green-500' : (vs == ValidationStatus.Error ? 'text-red-700 dark:text-red-500' : 'text-gray-900 dark:text-gray-300')
+ return baseLabelClasses + ' ' + classByStatus
})
return {
diff --git a/src/components/Input/types.ts b/src/components/Input/types.ts
index 651e3a2..740409c 100644
--- a/src/components/Input/types.ts
+++ b/src/components/Input/types.ts
@@ -1 +1,6 @@
export type InputSize = 'sm' | 'md' | 'lg'
+
+export enum ValidationStatus {
+ Success = 'success',
+ Error = 'error',
+}