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 + + +``` + + 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 @@ + + 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', +}