import { computed } from 'vue' import { useComponentColor, useNamespace } from '../../../../hooks' import { isEmpty } from '../../../../utils' import { useCheckboxCommonProps } from './use-checkbox-common-props' import type { CSSProperties } from 'vue' import type { CheckboxProps } from '../checkbox' type selectedClass = (selected: boolean) => string type selectedStyle = (selected: boolean) => CSSProperties export const useCheckboxCustomStyle = (props: CheckboxProps) => { const ns = useNamespace('checkbox') const { activeColor, disabled, maxDisabled, size, border, checkedShape } = useCheckboxCommonProps(props) // 解析颜色 const [bgColorClass, bgColorStyle] = useComponentColor(activeColor, 'bg') const [textColorClass, textColorStyle] = useComponentColor( activeColor, 'text' ) const [borderColorClass, borderColorStyle] = useComponentColor( activeColor, 'border' ) // 复选框所属类 const checkboxClass = computed(() => { return (selected: boolean) => { const cls: string[] = [ns.b()] // 禁止选择 if (disabled.value || maxDisabled.value) cls.push(ns.m('disabled')) // 设置尺寸 if (size.value) cls.push(ns.m(size.value)) // 激活样式 if (selected) { cls.push(ns.m('selected')) if (textColorClass.value) cls.push(textColorClass.value) } // 设置激活时的边框颜色 if (border.value) { cls.push('tn-border') if (selected && borderColorClass.value) cls.push(borderColorClass.value) else cls.push('tn-gray-disabled_border') } else { cls.push(ns.m('no-border')) } if (props.customClass) cls.push(props.customClass) return cls.join(' ') } }) // 复选框所属样式 const checkboxStyle = computed(() => { return (selected: boolean) => { const style: CSSProperties = {} // 设置激活时的颜色 if (selected) { if (border.value && !borderColorClass.value) style.borderColor = borderColorStyle.value || 'var(--tn-color-primary)' if (!textColorClass.value) { style.color = textColorStyle.value || 'var(--tn-color-primary)' } } if (!isEmpty(props.customStyle)) Object.assign(style, props.customStyle) return style } }) // 复选框选框所属类 const checkboxCheckedBoxClass = computed(() => { return (selected: boolean) => { const cls: string[] = [ns.e('checked-box')] // 复选框选框的形状 if (checkedShape.value) cls.push(ns.em('checked-box', checkedShape.value)) if (selected || props.indeterminate) { cls.push(ns.em('checked-box', 'selected')) if (bgColorClass.value) cls.push(bgColorClass.value) } else { cls.push('tn-border tn-gray-disabled_border') } return cls.join(' ') } }) // 复选框选框所属样式 const checkboxCheckedBoxStyle = computed(() => { return (selected: boolean) => { const style: CSSProperties = {} if ((selected || props.indeterminate) && !bgColorClass.value) { style.backgroundColor = bgColorStyle.value || 'var(--tn-color-primary)' } return style } }) return { ns, checkboxClass, checkboxStyle, checkboxCheckedBoxClass, checkboxCheckedBoxStyle, } }