From b87c8d775177effd72533c31f6389972386c45af Mon Sep 17 00:00:00 2001 From: vasu Date: Tue, 13 Jun 2023 14:51:41 +0530 Subject: [PATCH] feat(component): New select component --- docs/components/select.md | 74 +++++++++++++++++++ .../select/examples/DisabledSelect.vue | 17 +++++ .../select/examples/SelectExample.vue | 17 +++++ .../components/select/examples/SelectSize.vue | 17 +++++ .../select/examples/UnderlinedSelect.vue | 17 +++++ src/components/Select/Select.vue | 51 +++++++++++++ .../Select/composables/useSelectClasses.ts | 35 +++++++++ src/components/Select/types.ts | 4 + src/index.ts | 2 + 9 files changed, 234 insertions(+) create mode 100644 docs/components/select.md create mode 100644 docs/components/select/examples/DisabledSelect.vue create mode 100644 docs/components/select/examples/SelectExample.vue create mode 100644 docs/components/select/examples/SelectSize.vue create mode 100644 docs/components/select/examples/UnderlinedSelect.vue create mode 100644 src/components/Select/Select.vue create mode 100644 src/components/Select/composables/useSelectClasses.ts create mode 100644 src/components/Select/types.ts diff --git a/docs/components/select.md b/docs/components/select.md new file mode 100644 index 0000000..44cda73 --- /dev/null +++ b/docs/components/select.md @@ -0,0 +1,74 @@ + + +# Vue Select Components - Flowbite + +#### Get started with the select component to allow the user to choose from one or more options from a dropdown list based on multiple styles, sizes, and variants + +--- + +:::tip +Original reference: [https://flowbite.com/docs/forms/select/](https://flowbite.com/docs/forms/select/) +::: + +The select input component can be used to gather information from users based on multiple options in the form of a dropdown list and by browsing this page you will find multiple options, styles, sizes, and variants built with the utility classes from Tailwind CSS also available in dark mode. + +## Default +```vue + + +``` + + + +## Disabled + +```vue + +``` + + + +## Underlined + +```vue + +``` + + + +## Size + +```vue + +``` + + \ No newline at end of file diff --git a/docs/components/select/examples/DisabledSelect.vue b/docs/components/select/examples/DisabledSelect.vue new file mode 100644 index 0000000..878a76f --- /dev/null +++ b/docs/components/select/examples/DisabledSelect.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/docs/components/select/examples/SelectExample.vue b/docs/components/select/examples/SelectExample.vue new file mode 100644 index 0000000..36c81e4 --- /dev/null +++ b/docs/components/select/examples/SelectExample.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/docs/components/select/examples/SelectSize.vue b/docs/components/select/examples/SelectSize.vue new file mode 100644 index 0000000..c08866f --- /dev/null +++ b/docs/components/select/examples/SelectSize.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/docs/components/select/examples/UnderlinedSelect.vue b/docs/components/select/examples/UnderlinedSelect.vue new file mode 100644 index 0000000..9b2d69c --- /dev/null +++ b/docs/components/select/examples/UnderlinedSelect.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/src/components/Select/Select.vue b/src/components/Select/Select.vue new file mode 100644 index 0000000..c56dd6d --- /dev/null +++ b/src/components/Select/Select.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/src/components/Select/composables/useSelectClasses.ts b/src/components/Select/composables/useSelectClasses.ts new file mode 100644 index 0000000..29d8568 --- /dev/null +++ b/src/components/Select/composables/useSelectClasses.ts @@ -0,0 +1,35 @@ +import type { Ref } from 'vue' +import { computed } from 'vue' +import { simplifyTailwindClasses } from '@/utils/simplifyTailwindClasses' +import type { InputSize } from '@/components/Input/types' + +// SELECT +const defaultSelectClasses = 'w-full text-gray-900 bg-gray-50 border-[1px] border-gray-300 rounded-lg focus:ring-primary-500 focus:border-primary-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500' +const disabledSelectClasses = 'cursor-not-allowed bg-gray-100' +const underlineSelectClasses = 'bg-transparent dark:bg-transparent border-0 border-b-2 border-gray-200 appearance-none dark:border-gray-700 focus:outline-none focus:ring-0 focus:border-gray-200 peer rounded-none' +const selectSizeClasses: Record = { + lg: 'p-4', + md: 'p-2.5 text-sm', + sm: 'p-2 text-sm', +} + +export type UseSelectClassesProps = { + size: Ref + disabled: Ref + underline: Ref +} + +export function useSelectClasses(props: UseSelectClassesProps) { + const selectClasses = computed(() => { + return simplifyTailwindClasses(defaultSelectClasses, selectSizeClasses[props.size.value], props.disabled.value ? disabledSelectClasses : '') + }) + + const underlineClasses = computed(() => { + return underlineSelectClasses + }) + + return { + selectClasses, + underlineClasses, + } +} \ No newline at end of file diff --git a/src/components/Select/types.ts b/src/components/Select/types.ts new file mode 100644 index 0000000..2ad533f --- /dev/null +++ b/src/components/Select/types.ts @@ -0,0 +1,4 @@ +export type optionsType = { + value: string, + name: string, +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 1a34345..a1b73bd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -52,4 +52,6 @@ export { default as Input } from './components/Input/Input.vue' export { default as SlotListener } from './components/utils/SlotListener/SlotListener.vue' +export { default as Select } from './components/Select/Select.vue' + export * from './composables'