feat(component): New component textarea

This commit is contained in:
Vasu Singh
2023-07-11 00:12:06 +05:30
committed by GitHub
parent d2aeafda8c
commit 7569ca63be
7 changed files with 189 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
<template>
<label>
<div :class="labelClasses">{{ label }}</div>
<div :class="wrapperClasses">
<textarea v-model="model" :rows="rows" :class="textareaClasses" :placeholder="placeholder"></textarea>
<div v-if="$slots.footer" :class="footerClasses">
<slot name="footer"></slot>
</div>
</div>
</label>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useTextareaClasses } from './composables/useTextareaClasses'
interface TextareaProps {
modelValue?: string;
label?: string;
rows?: number;
custom?: boolean;
placeholder?: string;
}
const props = withDefaults(defineProps<TextareaProps>(), {
value: '',
label: 'Your message',
rows: 4,
custom: false,
placeholder: 'Write your message here...',
})
const emit = defineEmits(['update:modelValue'])
const model = computed({
get() {
return props.modelValue
},
set(val) {
emit('update:modelValue', val)
},
})
const {
textareaClasses,
labelClasses,
wrapperClasses,
footerClasses,
} = useTextareaClasses(props.custom)
</script>

View File

@@ -0,0 +1,33 @@
import { simplifyTailwindClasses } from '@/utils/simplifyTailwindClasses'
import { computed } from 'vue'
const textareaWrapperClasses = 'w-full mb-4 border border-gray-200 rounded-lg bg-gray-50 dark:bg-gray-700 dark:border-gray-600'
const textareaDefaultClasses = 'block p-2.5 w-full text-sm text-gray-900 bg-gray-50 rounded-lg border border-gray-200 focus:ring-blue-500 focus:border-blue-500 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'
const textareaLabelClasses = 'block mb-2 text-sm font-medium text-gray-900 dark:text-white'
const textareaFooterClasses = 'py-2 px-3 border-gray-200 dark:border-gray-600'
export function useTextareaClasses(custom: boolean) {
const textareaClasses = computed(() => {
return simplifyTailwindClasses(textareaDefaultClasses, custom? 'bg-white dark:bg-gray-800 border-none': 'border')
})
const labelClasses = computed(() => {
return textareaLabelClasses
})
const wrapperClasses = computed(() => {
if(custom) return textareaWrapperClasses
return ''
})
const footerClasses = computed(() => {
return textareaFooterClasses
})
return {
textareaClasses,
labelClasses,
wrapperClasses,
footerClasses,
}
}

View File

@@ -62,4 +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 * from './composables'