diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index f9b2d9e..e6bae8d 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -65,6 +65,7 @@ function getComponents() { function getFormComponents() { return [ { text: 'Input', link: 'components/input' }, + { text: 'FileInput', link: 'components/fileInput' }, { text: 'Checkbox', link: 'components/checkbox' }, { text: 'Select', link: 'components/select' }, { text: 'Toggle', link: 'components/toggle' }, diff --git a/docs/components/fileInput.md b/docs/components/fileInput.md new file mode 100644 index 0000000..92bbfcb --- /dev/null +++ b/docs/components/fileInput.md @@ -0,0 +1,103 @@ + + +# Vue FileInput - Flowbite + +#### Get started with the file input component to let the user to upload one or more files from their device storage based on multiple styles and sizes + +:::tip +Original reference: [https://flowbite.com/docs/forms/file-input/](https://flowbite.com/docs/forms/file-input/) +::: + +## File upload example + +```vue + + + +``` + + + +## Multiple File upload + +```vue + + + +``` + + + + +## Helper text + +```vue + + + +``` + + + +## Sizes + +```vue + + + +``` + + + +## Dropone + + +```vue + + + +``` + + diff --git a/docs/components/fileInput/examples/FileInpDefault.vue b/docs/components/fileInput/examples/FileInpDefault.vue new file mode 100644 index 0000000..75c0471 --- /dev/null +++ b/docs/components/fileInput/examples/FileInpDefault.vue @@ -0,0 +1,13 @@ + + + diff --git a/docs/components/fileInput/examples/FileInpDropZone.vue b/docs/components/fileInput/examples/FileInpDropZone.vue new file mode 100644 index 0000000..ca08d6d --- /dev/null +++ b/docs/components/fileInput/examples/FileInpDropZone.vue @@ -0,0 +1,14 @@ + + + diff --git a/docs/components/fileInput/examples/FileInpHelper.vue b/docs/components/fileInput/examples/FileInpHelper.vue new file mode 100644 index 0000000..8a013f8 --- /dev/null +++ b/docs/components/fileInput/examples/FileInpHelper.vue @@ -0,0 +1,14 @@ + + + diff --git a/docs/components/fileInput/examples/FileInpSize.vue b/docs/components/fileInput/examples/FileInpSize.vue new file mode 100644 index 0000000..beaf07c --- /dev/null +++ b/docs/components/fileInput/examples/FileInpSize.vue @@ -0,0 +1,12 @@ + + + diff --git a/docs/components/fileInput/examples/MultipleFile.vue b/docs/components/fileInput/examples/MultipleFile.vue new file mode 100644 index 0000000..69dd4c4 --- /dev/null +++ b/docs/components/fileInput/examples/MultipleFile.vue @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/src/components/FileInput/FileInput.vue b/src/components/FileInput/FileInput.vue new file mode 100644 index 0000000..7266037 --- /dev/null +++ b/src/components/FileInput/FileInput.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/components/FileInput/composables/useFileInputClasses.ts b/src/components/FileInput/composables/useFileInputClasses.ts new file mode 100644 index 0000000..387cdd7 --- /dev/null +++ b/src/components/FileInput/composables/useFileInputClasses.ts @@ -0,0 +1,38 @@ +import { simplifyTailwindClasses } from '@/utils/simplifyTailwindClasses' +import { computed } from 'vue' + +const fileInpDefaultClasses = 'block w-full text-sm text-gray-900 border-[1px] border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400' +const fileInpLabelClasses = 'block mb-2 text-sm font-medium text-gray-900 dark:text-white' +const fileInpDropzoneClasses = 'flex flex-col items-center justify-center w-full h-64 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 dark:hover:bg-bray-800 dark:bg-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:bg-gray-600' +const fileDropzoneWrapClasses = 'flex flex-col items-center justify-center pt-5 pb-6' +const fileDropzoneDefaultTextClasses = '!-mb-2 text-sm text-gray-500 dark:text-gray-400' + +export function useFileInputClasses(size: string) { + const fileInpClasses = computed(() => { + return simplifyTailwindClasses(fileInpDefaultClasses, 'text-' + size) + }) + + const labelClasses = computed(() => { + return fileInpLabelClasses + }) + + const dropzoneLabelClasses = computed(() => { + return fileInpDropzoneClasses + }) + + const dropzoneWrapClasses = computed(() => { + return fileDropzoneWrapClasses + }) + + const dropzoneTextClasses = computed(() => { + return fileDropzoneDefaultTextClasses + }) + + return { + fileInpClasses, + labelClasses, + dropzoneLabelClasses, + dropzoneWrapClasses, + dropzoneTextClasses, + } +} diff --git a/src/index.ts b/src/index.ts index fd75ae9..73124ec 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,6 +62,6 @@ export { default as Range } from './components/Range/Range.vue' export { default as Radio } from './components/Radio/Radio.vue' -export { default as Textarea } from './components/Textarea/Textarea.vue' +export { default as FileInput } from './components/FileInput/FileInput.vue' export * from './composables'