78 lines
2.2 KiB
Vue
78 lines
2.2 KiB
Vue
<template>
|
|
<label class="flex justify-start items-center" :class="!disabled ? 'cursor-pointer' : ''">
|
|
<div class="border-2 rounded flex flex-shrink-0 justify-center items-center" :class="wrapperClass">
|
|
<input v-model="selected" :disabled="disabled" type="checkbox" class="opacity-0 absolute" :class="!disabled ? 'cursor-pointer' : ''" />
|
|
<span v-if="partial" class="material-symbols text-base leading-none text-gray-400">remove</span>
|
|
<svg v-else-if="selected" class="fill-current pointer-events-none" :class="svgClass" viewBox="0 0 20 20"><path d="M0 11l2-2 5 5L18 3l2 2L7 18z" /></svg>
|
|
</div>
|
|
<div v-if="label" class="select-none" :class="[labelClassname, disabled ? 'text-gray-400' : 'text-gray-100']">{{ label }}</div>
|
|
</label>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
value: Boolean,
|
|
label: String,
|
|
small: Boolean,
|
|
medium: Boolean,
|
|
checkboxBg: {
|
|
type: String,
|
|
default: 'white'
|
|
},
|
|
borderColor: {
|
|
type: String,
|
|
default: 'gray-400'
|
|
},
|
|
checkColor: {
|
|
type: String,
|
|
default: 'green-500'
|
|
},
|
|
labelClass: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
disabled: Boolean,
|
|
partial: Boolean
|
|
},
|
|
data() {
|
|
return {}
|
|
},
|
|
computed: {
|
|
selected: {
|
|
get() {
|
|
return this.value
|
|
},
|
|
set(val) {
|
|
this.$emit('input', !!val)
|
|
}
|
|
},
|
|
wrapperClass() {
|
|
var classes = [`bg-${this.checkboxBg} border-${this.borderColor}`]
|
|
if (this.small) classes.push('w-4 h-4')
|
|
else if (this.medium) classes.push('w-5 h-5')
|
|
else classes.push('w-6 h-6')
|
|
|
|
return classes.join(' ')
|
|
},
|
|
labelClassname() {
|
|
if (this.labelClass) return this.labelClass
|
|
var classes = []
|
|
if (this.small) classes.push('text-xs md:text-sm pl-1')
|
|
else if (this.medium) classes.push('text-base md:text-lg pl-2')
|
|
else classes.push('pl-2')
|
|
return classes.join(' ')
|
|
},
|
|
svgClass() {
|
|
var classes = [`text-${this.checkColor}`]
|
|
if (this.small) classes.push('w-3 h-3')
|
|
else if (this.medium) classes.push('w-3.5 h-3.5')
|
|
else classes.push('w-4 h-4')
|
|
|
|
return classes.join(' ')
|
|
}
|
|
},
|
|
methods: {},
|
|
mounted() {}
|
|
}
|
|
</script> |