UNPKG

shineout

Version:

Shein 前端组件库

2,146 lines (2,136 loc) 120 kB
import { darken, fade } from './color' import { set as configSet } from '../config' import { entries } from './objects' import { isFunc } from './is' import hash from './hash' import { paginationClass } from '../Pagination/styles' import { checkinputClass } from '../Checkbox/styles' import { buttonClass } from '../Button/styles' import { selectClass } from '../Select/styles' import { formClass } from '../Form/styles' import { menuClass } from '../Menu/styles' import { alertClass } from '../Alert/styles' import { messageClass } from '../Message/styles' import { modalClass } from '../Modal/styles' import { popoverClass } from '../Popover/styles' import { datepickerClass } from '../DatePicker/styles' import { dropdownClass } from '../Dropdown/styles' import { inputClass } from '../Input/styles' import { cardClass } from '../Card/styles' import { tooltipClass } from '../Tooltip/styles' import { sliderClass } from '../Slider/styles' import { tagClass } from '../Tag/styles' import { exposeClass } from '../styles/expose' import { CartType } from '../icons/Props' import { ObjectType } from '../@types/common' export interface ThemeConfig { /** * 'body': 作为 body 标签的内联样式; 'tag': 作为style标签插入 */ injectType: 'body' | 'tag' /** * 作用的元素; 当 injectType 为 'tag' 时必须传入string */ target?: string | HTMLElement | (() => HTMLElement) } const config: ThemeConfig = { injectType: 'body', target: undefined, } const computedCache: ObjectType = {} let styleObj: ObjectType = {} export function setThemeConfig(c: Partial<ThemeConfig>) { Object.keys(c).forEach((key: keyof ThemeConfig) => { if (key in config) { // @ts-ignore config[key] = c[key] } }) } export function getThemeConfig(name: keyof ThemeConfig) { return config[name] } export function getThemeTarget() { let { target } = config if (!target) return document.body if (isFunc(target)) { target = target() } else if (typeof target === 'string') { target = document.querySelector(target) as HTMLElement } if (target instanceof HTMLElement) return target console.error(`can not find theme target dom from "${config.target}"`) return document.body } export function cleanStyleObj() { styleObj = {} } export function injectTag(custom = {}) { if (config.target && typeof config.target !== 'string') { console.error('The target of themeConfig must use string when injectType = "tag"') } const selector = config.target || 'body' const id = `__shineoutThemeStyleContainer__${hash(selector)}` const varObj: any = { ...styleObj, ...custom } const styleText = `${selector}{${Object.keys(varObj) .map(key => `${key}: ${varObj[key]}`) .join(';')}}` const el = document.getElementById(id) if (el) { el.innerText = styleText } else { const stylee = document.createElement('style') stylee.setAttribute('type', 'text/css') stylee.setAttribute('id', id) stylee.innerText = styleText document.head.appendChild(stylee) } return id } function getProperty(name = '--btn-hover-darken', cache = true) { if (cache && computedCache[name]) return computedCache[name] computedCache[name] = getComputedStyle(document.body) .getPropertyValue(name) .trim() return computedCache[name] } function setBodyProperty(colors: { [x: string]: any }, value?: string | number) { for (const [cssVar, cssValue] of entries(colors)) { if (config.injectType === 'body') { const target = getThemeTarget() if (value === undefined) { target.style.removeProperty(cssVar) } else { target.style.setProperty(cssVar, cssValue) } } if (config.injectType === 'tag') { if (value === undefined) { delete styleObj[cssVar] } else { styleObj[cssVar] = cssValue } } } } const injects = { color: { info: { title: 'Color 颜色', name: 'color', path: 'Button', }, conf: [ { name: 'primary', type: 'color', attr: 'backgroundColor', className: buttonClass('primary'), desc: '主色', }, { name: 'infoColor', type: 'color', attr: 'backgroundColor', className: buttonClass('info'), }, { name: 'warning', type: 'color', attr: 'backgroundColor', className: buttonClass('warning'), }, { name: 'danger', type: 'color', attr: 'backgroundColor', className: buttonClass('danger'), }, { name: 'secondary', type: 'color', attr: 'backgroundColor', className: buttonClass('secondary'), }, { name: 'success', type: 'color', attr: 'backgroundColor', className: buttonClass('success'), }, { name: 'gray100', type: 'color', attr: 'color', desc: 'Form, Datepicker, Cascader, Tree, Card, Upload, Pagination, Select', className: exposeClass('gray-100'), }, { name: 'gray200', type: 'color', attr: 'color', desc: 'Form, Datepicker, Cascader, Alert, Tabs, Progress', className: exposeClass('gray-200'), }, { name: 'gray300', type: 'color', attr: 'color', desc: 'Button, Card, Cascader, Upload, Image, Tooltip', className: exposeClass('gray-300'), }, { name: 'gray400', type: 'color', attr: 'color', desc: 'Cascader, Select, TreeSelect, Slider, Upload, Input, Rate', className: exposeClass('gray-400'), }, { name: 'gray500', type: 'color', attr: 'color', desc: 'Cascader, Select, Table, TreeSelect, Checkbox, Slider, Tree', className: exposeClass('gray-500'), }, { name: 'gray600', type: 'color', attr: 'color', desc: 'Select, Datepicker, TreeSelect, Link-disabled, Table, Pagination, Tree', className: exposeClass('gray-600'), }, { name: 'gray700', type: 'color', attr: 'color', desc: 'Table sort icon hover color', className: exposeClass('gray-700'), }, { name: 'gray800', type: 'color', attr: 'color', desc: 'Dropdown, Card, Dropdown', className: exposeClass('gray-800'), }, { name: 'gray900', type: 'color', attr: 'color', desc: 'text color, Menu', className: exposeClass('gray-900'), }, ], set primary(v: string) { setBodyProperty( { '--primary-color': v, '--primary-color-dark-5': darken(v, 5), '--primary-color-dark-15': darken(v, 15), '--primary-color-dark-btn-hover': darken(v, getProperty()), '--primary-color-lighten-40': darken(v, -40), '--primary-color-fade-60': fade(v, 0.6), '--primary-color-fade-50': fade(v, 0.5), '--primary-color-fade-10': fade(v, 0.1), '--primary-color-fade-5': fade(v, 0.05), '--primary-color-fade-0': fade(v, 0), '--primary-color-dark-5_fade-60': fade(darken(v, 5), 0.6), '--primary-color-dark-5_fade-0': fade(darken(v, 5), 0), }, v ) }, set infoColor(v: string) { setBodyProperty( { '--info-color': v, '--info-color-dark-5': darken(v, 5), '--info-color-fade-60': fade(v, 0.6), '--info-color-dark-5_fade-60': fade(darken(v, 5), 0.6), '--info-color-fade-0': fade(v, 0), '--info-color-dark-5_fade-0': fade(darken(v, 5), 0), '--info-color-dark-btn-hover': darken(v, getProperty()), }, v ) }, set warning(v: string) { setBodyProperty( { '--warning-color': v, '--warning-color-dark-5': darken(v, 5), '--warning-color-fade-60': fade(v, 0.6), '--warning-color-dark-5_fade-60': fade(darken(v, 5), 0.6), '--warning-color-fade-0': fade(v, 0), '--warning-color-dark-5_fade-0': fade(darken(v, 5), 0), '--warning-color-dark-btn-hover': darken(v, getProperty()), }, v ) }, set danger(v: string) { setBodyProperty( { '--danger-color': v, '--danger-color-fade-25': fade(v, 0.25), '--danger-color-dark-5': darken(v, 5), '--danger-color-fade-60': fade(v, 0.6), '--danger-color-dark-5_fade-60': fade(darken(v, 5), 0.6), '--danger-color-fade-0': fade(v, 0), '--danger-color-dark-5_fade-0': fade(darken(v, 5), 0), '--danger-color-dark-btn-hover': darken(v, getProperty()), }, v ) }, set success(v: string) { setBodyProperty( { '--success-color': v, '--success-color-dark-5': darken(v, 5), '--success-color-fade-60': fade(v, 0.6), '--success-color-dark-5_fade-60': fade(darken(v, 5), 0.6), '--success-color-fade-0': fade(v, 0), '--success-color-dark-5_fade-0': fade(darken(v, 5), 0), '--success-color-dark-btn-hover': darken(v, getProperty()), }, v ) }, set secondary(v: string) { setBodyProperty( { '--secondary-color': v, '--secondary-color-dark-5': darken(v, 5), '--secondary-color-dark-btn-hover': darken(v, getProperty()), '--secondary-color-dark-5_fade-60': fade(darken(v, 5), 0.6), '--secondary-color-dark-5_fade-0': fade(darken(v, 5), 0), }, v ) }, set gray100(v: string) { setBodyProperty( { '--gray-100': v, }, v ) }, set gray200(v: string) { setBodyProperty( { '--gray-200': v, '--gray-200-darken-5': darken(v, 5), }, v ) }, set gray300(v: string) { setBodyProperty( { '--gray-300': v, '--gray-300-darken-hover': darken(v, getProperty()), '--gray-300-fade-60': fade(v, 0.6), '--gray-300-fade-0': fade(v, 0), }, v ) }, set gray400(v: string) { setBodyProperty( { '--gray-400': v, '--gray-400-darken-20': darken(v, 20), }, v ) }, set gray500(v: string) { setBodyProperty( { '--gray-500': v, }, v ) }, set gray600(v: string) { setBodyProperty( { '--gray-600': v, '--gray-600-lighten-15': darken(v, -15), }, v ) }, set gray700(v: string) { setBodyProperty( { '--gray-700': v, }, v ) }, set gray800(v: string) { setBodyProperty( { '--gray-800': v, '--gray-800-darken-5': darken(v, 5), }, v ) }, set gray900(v: string) { setBodyProperty( { '--gray-900': v, '--gray-900-lighten-40': darken(v, -40), }, v ) }, }, button: { info: { title: 'Button 按钮', name: 'button', path: 'Button', }, conf: [ { name: 'fontSizeBase', attr: 'fontSize', type: 'number', parser: parseInt, className: buttonClass('_'), desc: '常规按钮字体大小', }, { name: 'fontSizeLarge', attr: 'fontSize', type: 'number', parser: parseInt, className: buttonClass('large'), desc: '大按钮字体大小', }, { name: 'fontSizeSmall', attr: 'fontSize', type: 'number', parser: parseInt, className: buttonClass('small'), desc: '小按钮字体大小', }, { name: 'marginLeft', attr: 'marginLeft', type: 'number', parser: parseInt, className: exposeClass('button'), desc: '连续按钮间距', }, { name: 'spinMargin', attr: 'marginRight', type: 'number', parser: parseInt, className: buttonClass('spin-ltr'), desc: '加载图标与文字间距', }, { name: 'paddingBaseHorizontal', attr: 'paddingLeft', type: 'number', parser: parseInt, className: buttonClass('_'), desc: '常规按钮水平内边距', }, { name: 'paddingBaseVertical', attr: 'paddingTop', type: 'number', parser: parseInt, className: buttonClass('_'), desc: '常规按钮垂直内边距', }, { name: 'paddingLargeHorizontal', attr: 'paddingLeft', type: 'number', parser: parseInt, className: buttonClass('large'), desc: '大按钮水平内边距', }, { name: 'paddingLargeVertical', attr: 'paddingTop', type: 'number', parser: parseInt, className: buttonClass('large'), desc: '大按钮垂直内边距', }, { name: 'paddingSmallHorizontal', attr: 'paddingLeft', type: 'number', parser: parseInt, className: buttonClass('small'), desc: '小按钮水平内边距', }, { name: 'paddingSmallVertical', attr: 'paddingTop', type: 'number', parser: parseInt, className: buttonClass('small'), desc: '小按钮垂直内边距', }, { name: 'borderRadius', attr: 'borderRadius', type: 'number', parser: parseInt, className: buttonClass('_'), desc: '常规按钮圆角', }, { name: 'smallBorderRadius', attr: 'borderRadius', type: 'number', parser: parseInt, className: buttonClass('small'), desc: '小按钮圆角', }, { name: 'largeBorderRadius', attr: 'borderRadius', type: 'number', parser: parseInt, className: buttonClass('large'), desc: '大按钮圆角', }, { name: 'disabledBg', attr: 'backgroundColor', type: 'color', className: buttonClass('disabled'), desc: '禁用按钮背景色', }, { name: 'disabledDelimiter', attr: 'borderColor', type: 'color', className: exposeClass('button-disabled-delimiter'), desc: '按钮组禁用状态下分隔符颜色', }, { name: 'disabledColor', attr: 'color', type: 'color', className: buttonClass('disabled'), desc: '禁用按钮文字颜色', }, { name: 'disabledBorderColor', attr: 'borderColor', type: 'color', className: buttonClass('disabled'), desc: '禁用按钮边框颜色', }, { name: 'buttonDefaultTextColor', attr: 'color', type: 'color', className: buttonClass('default'), desc: '默认样式下文字颜色', }, { name: 'buttonDefaultBorderColor', attr: 'borderColor', type: 'color', className: buttonClass('default'), desc: '默认样式下边框颜色', }, ], set fontSizeBase(v: string) { setBodyProperty( { '--button-font-size-base': `${parseInt(v, 10)}px`, }, v ) }, set fontSizeLarge(v: string) { setBodyProperty( { '--button-font-size-large': `${parseInt(v, 10)}px`, }, v ) }, set fontSizeSmall(v: string) { setBodyProperty( { '--button-font-size-small': `${parseInt(v, 10)}px`, }, v ) }, set spinMargin(v: string) { setBodyProperty( { '--button-spin-margin': `${parseInt(v, 10)}px`, }, v ) }, set marginLeft(v: string) { setBodyProperty( { '--button-margin-left': `${parseInt(v, 10)}px`, }, v ) }, set borderRadius(v: string) { setBodyProperty( { '--button-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set smallBorderRadius(v: string) { setBodyProperty( { '--button-small-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set largeBorderRadius(v: string) { setBodyProperty( { '--button-large-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set paddingBaseHorizontal(v: string) { setBodyProperty( { '--button-padding-base-horizontal': `${parseInt(v, 10)}px`, '--button-padding-base-horizontal-7': `${parseInt(v, 10) * 0.7}px`, }, v ) }, set paddingLargeHorizontal(v: string) { setBodyProperty( { '--button-padding-large-horizontal': `${parseInt(v, 10)}px`, }, v ) }, set paddingSmallHorizontal(v: string) { setBodyProperty( { '--button-padding-small-horizontal': `${parseInt(v, 10)}px`, }, v ) }, set paddingBaseVertical(v: string) { setBodyProperty( { '--button-padding-base-vertical': `${parseInt(v, 10)}px`, }, v ) }, set paddingLargeVertical(v: string) { setBodyProperty( { '--button-padding-large-vertical': `${parseInt(v, 10)}px`, }, v ) }, set paddingSmallVertical(v: string) { setBodyProperty( { '--button-padding-small-vertical': `${parseInt(v, 10)}px`, }, v ) }, set disabledBg(v: string) { setBodyProperty( { '--button-disabled-bg': v, }, v ) }, set disabledColor(v: string) { setBodyProperty( { '--button-disabled-color': v, }, v ) }, set disabledBorderColor(v: string) { setBodyProperty( { '--button-disabled-border-color': v, }, v ) }, set disabledDelimiter(v: string) { setBodyProperty( { '--button-disabled-delimiter': v, }, v ) }, set buttonDefaultTextColor(v: string) { setBodyProperty( { '--button-default-text-color': v, }, v ) }, set buttonDefaultBorderColor(v: string) { setBodyProperty( { '--button-default-border': v, '--button-default-border-fade-0': fade(v, 0), '--button-default-border-fade-60': fade(v, 0.6), }, v ) }, }, dropdown: { info: { title: 'Dropdown 下拉菜单', name: 'dropdown', path: 'Dropdown', }, conf: [ { name: 'borderWidth', attr: 'borderWidth', type: 'number', parser: parseInt, className: exposeClass('dropdown-button'), desc: '按钮边框宽度', }, { name: 'columnsPadding', attr: 'padding', type: 'string', className: dropdownClass('box-list'), desc: '多列平铺的内边距', }, { name: 'optionsHoverBgc', attr: 'backgroundColor', type: 'color', className: exposeClass('dropdown-options-hover'), desc: 'options hover时背景颜色', }, { name: 'optionsHoverColor', attr: 'color', type: 'color', className: exposeClass('dropdown-options-hover'), desc: 'options hover时字体颜色', }, ], set borderWidth(v: string) { setBodyProperty( { '--dropdown-border-width': `${parseInt(v, 10)}px`, }, v ) }, set columnsPadding(v: string) { setBodyProperty( { '--dropdown-columns-padding': v, }, v ) }, set optionsHoverBgc(v: string) { setBodyProperty( { '--dropdown-options-hover-bgc': v, }, v ) }, set optionsHoverColor(v: string) { setBodyProperty( { '--dropdown-options-hover-color': v, }, v ) }, }, form: { info: { title: 'Form 表单', name: 'form', path: 'Form', }, conf: [ { name: 'itemMarginBottom', className: formClass('item'), attr: 'marginBottom', type: 'number', parser: parseInt, desc: '条目垂直间隔', }, { name: 'itemMarginRight', className: exposeClass('form-inline'), attr: 'marginRight', type: 'number', parser: parseInt, desc: '条目水平间隔', }, { name: 'tipColor', className: exposeClass('form-tip'), attr: 'color', type: 'color', desc: '提示文字颜色', }, { name: 'labelHorizontalAlign', className: exposeClass('form-label'), attr: 'textAlign', type: ['start', 'center', 'end'], desc: '标签对齐方式', }, { name: 'formTipFontSize', className: exposeClass('form-tip'), attr: 'fontSize', type: 'number', parser: parseInt, desc: '提示信息字体大小', }, { name: 'formErrorLineHeight', className: exposeClass('form-error'), attr: 'lineHeight', type: 'number', parser: parseFloat, desc: '校验错误文字行高', }, { name: 'formErrorMarginTop', className: exposeClass('form-error'), attr: 'marginTop', type: 'number', parser: parseInt, desc: '校验错误文字顶部间距', }, { name: 'formErrorMarginBottom', className: exposeClass('form-error'), attr: 'marginBottom', type: 'number', parser: parseInt, desc: '校验错误文字底部间距', }, { name: 'formKeepErrorHeight', className: exposeClass('form-keep-error'), attr: 'min-height', type: 'number', parser: parseInt, desc: '错误提示不撑开表单高度时的最小间距', }, ], set itemMarginBottom(v: string) { setBodyProperty( { '--form-item-margin-bottom': `${parseInt(v, 10)}px`, }, v ) }, set itemMarginRight(v: string) { setBodyProperty( { '--form-item-margin-right': `${parseInt(v, 10)}px`, }, v ) }, set tipColor(v: string) { setBodyProperty( { '--form-tip-color': v, }, v ) }, set labelHorizontalAlign(v: string) { setBodyProperty( { '--form-item-label-align': v, }, v ) }, set formTipFontSize(v: string) { setBodyProperty( { '--form-tip-font-size': `${parseInt(v, 10)}px`, }, v ) }, set formErrorLineHeight(v: string) { setBodyProperty( { '--form-item-error-line-height': `${parseInt(v, 10)}px`, }, v ) }, set formErrorMarginTop(v: string) { setBodyProperty( { '--form-item-error-margin-top': `${parseInt(v, 10)}px`, }, v ) }, set formErrorMarginBottom(v: string) { setBodyProperty( { '--form-item-error-margin-bottom': `${parseInt(v, 10)}px`, }, v ) }, set formKeepErrorHeight(v: string) { setBodyProperty( { '--form-Item-min-keep-height': `${parseInt(v, 10)}px`, }, v ) }, }, checkbox: { info: { title: 'Checkbox 复选框', name: 'checkbox', path: 'Checkbox', }, conf: [ { name: 'marginRight', className: checkinputClass('_'), attr: 'marginRight', type: 'number', parser: parseInt, desc: '水平间隔', }, { name: 'borderWidth', className: exposeClass('checkbox-indicator'), attr: 'width', type: 'number', parser: parseInt, desc: '边框宽度', }, { name: 'color', className: checkinputClass('_'), attr: 'color', type: 'color', desc: '文字颜色', }, { name: 'borderColor', className: exposeClass('checkbox-indicator'), attr: 'borderColor', type: 'color', desc: '边框颜色', }, { name: 'textPaddingX', className: exposeClass('checkbox-text'), attr: 'paddingRight', type: 'number', parser: parseInt, desc: '文字水平内间距', }, { name: 'indicatorBorderRadius', className: exposeClass('checkbox-indicator'), attr: 'borderRadius', type: 'number', parser: parseInt, min: 3, desc: '圆角', }, { name: 'checkboxDisabledBgc', className: exposeClass('checkbox-disabled'), attr: 'backgroundColor', type: 'color', desc: 'Checkbox 和 Radio 未选中状态禁用后的背景色', }, { name: 'checkboxCheckedDisabledBgc', className: exposeClass('checkbox-checked-disabled'), attr: 'backgroundColor', type: 'color', desc: 'Checkbox 和 Radio 选中状态下禁用后的背景色', }, ], set marginRight(v: string) { setBodyProperty( { '--checkbox-margin-right': `${parseInt(v, 10)}px`, }, v ) }, set color(v: string) { setBodyProperty( { '--checkinput-color': v, }, v ) }, set borderColor(v: string) { setBodyProperty( { '--checkbox-border-color': v, }, v ) }, set borderWidth(v: string) { setBodyProperty( { '--checkbox-border-width': `${parseInt(v, 10)}px`, }, v ) }, set textPaddingX(v: string) { setBodyProperty( { '--checkbox-text-padding-x': `${parseInt(v, 10)}px`, }, v ) }, set indicatorBorderRadius(v: string) { setBodyProperty( { '--checkbox-indicator-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set checkboxDisabledBgc(v: string) { setBodyProperty( { '--checkbox-disabled-bgc': v, }, v ) }, set checkboxCheckedDisabledBgc(v: string) { setBodyProperty( { '--checkbox-checked-disabled-bgc': v, }, v ) }, }, radio: { info: { title: 'Radio 单选框', name: 'radio', path: 'Radio', }, conf: [ { name: 'size', className: exposeClass('radio'), attr: 'width', type: 'number', parser: parseInt, min: 0, max: 40, desc: '尺寸', }, { name: 'borderWidth', className: exposeClass('radio'), attr: 'borderWidth', type: 'number', parser: parseInt, min: 0, max: 10, desc: '选中的边框宽度', }, { name: 'innerWidth', className: exposeClass('radio-inner'), attr: 'width', type: 'number', parser: parseInt, min: 0, max: 10, desc: '选中点尺寸', }, { name: 'uncheckBorderWidth', className: exposeClass('radio-uncheck'), attr: 'width', type: 'number', parser: parseInt, min: 0, desc: '未选中边框宽度', }, { name: 'color', className: exposeClass('radio'), attr: 'color', type: 'color', desc: '文字颜色', }, ], set size(v: string) { setBodyProperty( { '--radio-width': `${parseInt(v, 10)}px`, }, v ) }, set borderWidth(v: string) { setBodyProperty( { '--radio-border-width': `${parseInt(v, 10)}px`, }, v ) }, set innerWidth(v: string) { setBodyProperty( { '--radio-inner-width': `${parseInt(v, 10)}px`, }, v ) }, set uncheckBorderWidth(v: string) { setBodyProperty( { '--radio-border-uncheck-width': `${parseInt(v, 10)}px`, }, v ) }, set color(v: string) { setBodyProperty( { '--radio-text-color': v, }, v ) }, }, input: { info: { title: 'Input 输入框', name: 'input', path: 'Input', }, conf: [ { name: 'color', className: inputClass('_'), attr: 'color', type: 'color', desc: '文字颜色', }, { name: 'borderRadius', className: inputClass('_'), attr: 'borderRadius', type: 'number', parser: parseInt, desc: '圆角', }, { name: 'underlineHeight', className: inputClass('_', 'underline'), attr: 'borderBottomWidth', type: 'number', parser: parseInt, desc: '下边框宽度(仅在下边框模式生效)', }, { name: 'dropdownBorderRadius', className: datepickerClass('picker'), attr: 'borderRadius', type: 'number', parser: parseInt, desc: '下拉框圆角,例如Select Options', }, { name: 'focusWidth', className: inputClass('focus'), attr: 'boxShadow', type: 'number', max: 20, parser: (v: string) => parseInt(v.split(' ').pop()!, 10), desc: '聚焦发散光宽度', }, { name: 'disabledBg', className: inputClass('disabled'), attr: 'backgroundColor', type: 'color', desc: '禁用背景色', }, { name: 'disabledColor', className: inputClass('disabled'), attr: 'color', type: 'color', desc: '禁用字体色', }, { name: 'borderColor', className: inputClass('_'), attr: 'borderColor', type: 'color', desc: '边框颜色', }, { name: 'borderHoverColor', className: exposeClass('input-focus'), attr: 'borderColor', type: 'color', desc: '鼠标悬浮、聚焦时的边框色', }, { name: 'placeholderColor', className: exposeClass('input-placeholder'), attr: 'color', type: 'color', desc: '占位文字颜色', }, { name: 'placeholderSize', className: exposeClass('input-placeholder'), attr: 'fontSize', type: 'number', parser: parseInt, desc: '占位文字大小', }, { name: 'clearBg', className: exposeClass('input-clear'), attr: 'backgroundColor', type: 'color', desc: '清空图标背景色', }, { name: 'clearHoverBg', className: exposeClass('input-clear-hover'), attr: 'backgroundColor', type: 'color', desc: '清空图标鼠标悬浮背景色', }, ], set color(v: string) { setBodyProperty( { '--input-text-color': v, }, v ) }, set borderRadius(v: string) { setBodyProperty( { '--input-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set underlineHeight(v: string) { setBodyProperty( { '--input-underline-height': `${parseInt(v, 10)}px`, }, v ) }, set dropdownBorderRadius(v: string) { setBodyProperty( { '--input-dropdown-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set disabledBg(v: string) { setBodyProperty( { '--input-bg-disabled': v, }, v ) }, set disabledColor(v: string) { setBodyProperty( { '--input-disabled-color': v, }, v ) }, set borderColor(v: string) { setBodyProperty( { '--input-border-color': v, }, v ) }, set borderHoverColor(v: string) { setBodyProperty( { '--input-border-focus-color': v, '--input-border-focus-color-fade-25': fade(v, 0.25), }, v ) }, set focusWidth(v: string) { setBodyProperty( { '--input-focus-width': `${parseInt(v, 10)}px`, }, v ) }, set placeholderColor(v: string) { setBodyProperty( { '--input-placeholder-color': v, }, v ) }, set placeholderSize(v: string) { setBodyProperty( { '--input-placeholder-size': `${parseInt(v, 10)}px`, }, v ) }, set clearBg(v: string) { setBodyProperty( { '--input-clear-bg-color': v, }, v ) }, set clearHoverBg(v: string) { setBodyProperty( { '--input-clear-bg-hover-color': v, }, v ) }, }, select: { info: { title: 'Select 选择框', name: 'select', path: 'Select', }, conf: [ { name: 'resultPaddingHorizontal', className: exposeClass('select-result-item'), attr: 'paddingLeft', type: 'number', parser: parseInt, desc: '选中值水平内边距', }, { name: 'resultPaddingVertical', className: exposeClass('select-result-item'), attr: 'paddingTop', type: 'number', parser: parseInt, desc: '选中值垂直内边距', }, { name: 'itemColor', className: selectClass('option'), attr: 'color', type: 'color', desc: '选项文字颜色', }, { name: 'itemBgColor', className: selectClass('option'), attr: 'backgroundColor', type: 'color', desc: '选项背景颜色', }, { name: 'disabledBg', className: selectClass('option', 'disabled'), attr: 'backgroundColor', type: 'color', desc: '禁用选项背景色', }, { name: 'disabledColor', className: selectClass('option', 'disabled'), attr: 'color', type: 'color', desc: '禁用选项文字颜色', }, { name: 'itemActiveBg', className: selectClass('active', 'option'), attr: 'backgroundColor', type: 'color', desc: '选中项背景色', }, { name: 'itemActiveColor', className: selectClass('active', 'option'), attr: 'color', type: 'color', desc: '选中项文字颜色', }, { name: 'itemHoverBg', className: exposeClass('select-option-hover'), attr: 'backgroundColor', type: 'color', desc: '选项鼠标悬浮背景色', }, { name: 'itemHoverColor', className: exposeClass('select-option-hover'), attr: 'color', type: 'color', desc: '选项鼠标悬浮文字颜色', }, { name: 'compressedMoreHoverBg', className: exposeClass('select-compressed'), attr: 'backgroundColor', type: 'color', desc: 'compressed模式按钮鼠标悬浮背景色', }, { name: 'clearIconBg', className: exposeClass('select-close'), attr: 'backgroundColor', type: 'color', desc: '清空按钮背景色', }, { name: 'treeDisabledBg', className: exposeClass('select-tree-disabled'), attr: 'backgroundColor', type: 'color', desc: '树形选择禁用选项背景色', }, { name: 'treeContentColor', className: exposeClass('select-tree'), attr: 'color', type: 'color', desc: '树形选择可点击选项文字颜色', }, { name: 'treeDisableContentColor', className: exposeClass('select-tree-disabled'), attr: 'color', type: 'color', desc: '树形选择禁用选项文字颜色', }, { name: 'treeIconHoverBg', className: exposeClass('select-tree-icon-hover'), attr: 'backgroundColor', type: 'color', desc: '树形选择展开箭头背景色', }, { name: 'treeNodeHoverBg', className: exposeClass('select-tree-node-hover'), attr: 'backgroundColor', type: 'color', desc: '树形选择节点hover状态背景色', }, { name: 'treeNodeHoverColor', className: exposeClass('select-tree-node-hover'), attr: 'color', type: 'color', desc: '树形选择节点hover状态文字颜色', }, { name: 'treeNodeSelectedBg', className: exposeClass('select-tree-node-selected'), attr: 'backgroundColor', type: 'color', desc: '树形选择节点选中状态背景色', }, { name: 'treeNodeSelectedColor', className: exposeClass('select-tree-node-selected'), attr: 'color', type: 'color', desc: '树形选择节点选中状态文字颜色', }, ], set resultPaddingVertical(v: string) { setBodyProperty( { '--select-result-padding-vertical': `${parseInt(v, 10)}px`, }, v ) }, set resultPaddingHorizontal(v: string) { setBodyProperty( { '--select-result-padding-horizontal': `${parseInt(v, 10)}px`, '--select-result-padding-horizontal-16': `${parseInt(v, 10) + 16}px`, }, v ) }, set itemColor(v: string) { setBodyProperty( { '--select-option-color': v, }, v ) }, set itemBgColor(v: string) { setBodyProperty( { '--select-option-bg-color': v, }, v ) }, set disabledBg(v: string) { setBodyProperty( { '--select-disabled-bg-color': v, }, v ) }, set disabledColor(v: string) { setBodyProperty( { '--select-disabled-color': v, }, v ) }, set itemActiveBg(v: string) { setBodyProperty( { '--select-item-active-bg': v, }, v ) }, set itemActiveColor(v: string) { setBodyProperty( { '--select-item-active-color': v, }, v ) }, set itemHoverBg(v: string) { setBodyProperty( { '--select-option-hover-bg': v, }, v ) }, set itemHoverColor(v: string) { setBodyProperty( { '--select-option-hover-color': v, }, v ) }, set compressedMoreHoverBg(v: string) { setBodyProperty( { '--select-compressed-hover-bg': v, }, v ) }, set clearIconBg(v: string) { setBodyProperty( { '--select-clear-bg-color': v, }, v ) }, set treeDisabledBg(v: string) { setBodyProperty( { '--select-tree-disabled-bg-color': v, }, v ) }, set treeContentColor(v: string) { setBodyProperty( { '--select-tree-content-color': v, }, v ) }, set treeDisableContentColor(v: string) { setBodyProperty( { '--select-tree-disabled-content-color': v, }, v ) }, set treeIconHoverBg(v: string) { setBodyProperty( { '--select-tree-icon-hover-bg-color': v, }, v ) }, set treeNodeHoverBg(v: string) { setBodyProperty( { '--select-tree-node-hover-bg': v, }, v ) }, set treeNodeHoverColor(v: string) { setBodyProperty( { '--select-tree-node-hover-color': v, }, v ) }, set treeNodeSelectedBg(v: string) { setBodyProperty( { '--select-tree-node-selected-bg': v, }, v ) }, set treeNodeSelectedColor(v: string) { setBodyProperty( { '--select-tree-node-selected-color': v, }, v ) }, }, datepicker: { info: { title: 'Datepicker 日期选择', name: 'datepicker', path: 'Datepicker', }, conf: [ { name: 'rectBorderRadius', className: exposeClass('datepicker-month-item'), attr: 'borderRadius', type: 'number', parser: parseInt, desc: '年份、月份选中项圆角', }, { name: 'dayHoverBgc', className: exposeClass('datepicker-day-hover-bgc'), attr: 'backgroundColor', type: 'color', desc: 'day hover时背景颜色', }, ], set rectBorderRadius(v: string) { setBodyProperty( { '--datepicker-rect-active-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set dayHoverBgc(v: string) { setBodyProperty( { '--datepicker-day-hover-bgc': v, }, v ) }, }, slider: { info: { title: 'Slider 滑块', name: 'slider', path: 'Slider', }, conf: [ { name: 'indicatorBg', className: exposeClass('slider-indicator'), attr: 'backgroundColor', type: 'color', desc: '滑块背景色', }, { name: 'indicatorSize', className: exposeClass('slider-indicator'), attr: 'width', type: 'number', min: 8, max: 40, parser: parseInt, desc: '滑块尺寸', }, { name: 'indicatorBoxShadow', className: exposeClass('slider-indicator'), attr: 'boxShadow', type: 'string', desc: '滑块阴影', }, { name: 'barBg', className: exposeClass('slider-bar'), attr: 'backgroundColor', type: 'color', desc: '滑动条背景色', }, { name: 'disabledBarBg', className: exposeClass('slider-bar-disabled'), attr: 'backgroundColor', type: 'color', desc: '滑动条禁用背景色', }, { name: 'disabledIndicatorBorder', className: exposeClass('slider-indicator-disabled'), attr: 'borderColor', type: 'color', desc: '禁用状态下滑块边框色', }, { name: 'disabledIndicatorBg', className: exposeClass('slider-indicator-disabled'), attr: 'background', type: 'color', desc: '禁用状态下滑块边背景色', }, { name: 'height', className: sliderClass('background'), attr: 'height', type: 'number', parser: parseInt, desc: '滑动条高度', }, { name: 'borderRadius', className: sliderClass('background'), attr: 'borderRadius', type: 'number', parser: parseInt, desc: '滑动条圆角', }, { name: 'valueBottom', className: exposeClass('slider-value'), attr: 'height', type: 'number', parser: parseInt, desc: '当前值距离滑块距离', }, ], set indicatorBg(v: string) { setBodyProperty( { '--slider-indicator-bg': v, }, v ) }, set indicatorSize(v: string) { setBodyProperty( { '--slider-indicator-size': `${parseInt(v, 10)}px`, '--slider-indicator-size-half': `${parseInt(v, 10) / 2}px`, }, v ) }, set indicatorBoxShadow(v: string) { setBodyProperty( { '--slider-indicator-box-shadow': v, }, v ) }, set barBg(v: string) { setBodyProperty( { '--slider-bar-color': v, }, v ) }, set disabledBarBg(v: string) { setBodyProperty( { '--slider-disabled-bar-bg': v, }, v ) }, set disabledIndicatorBorder(v: string) { setBodyProperty( { '--slider-disbaled-indicator-border-color': v, }, v ) }, set disabledIndicatorBg(v: string) { setBodyProperty( { '--slider-disbaled-indicator-bg': v, }, v ) }, set height(v: string) { setBodyProperty( { '--slider-bar-height': `${parseInt(v, 10)}px`, }, v ) }, set borderRadius(v: string) { setBodyProperty( { '--slider-border-radius': `${parseInt(v, 10)}px`, }, v ) }, set valueBottom(v: string) { setBodyProperty( { '--slider-value-bottom': `${parseInt(v, 10)}px`, }, v ) }, }, table: { info: { title: 'Table 表格', name: 'table', path: 'Table', }, conf: [ { name: 'scrollRatio', className: exposeClass('table-scroll-ratio'), attr: 'width', parser: parseInt, type: 'number', desc: '滚动速率,仅在 Windows 下有效', logic: true, max: 500, }, { name: 'headBg', className: exposeClass('table-head'), attr: 'backgroundColor', type: 'color', desc: '表头背景色', }, { name: 'headColor', className: exposeClass('table-head'), attr: 'color', type: 'color', desc: '表头文字颜色', }, { name: 'bodyBg', className: exposeClass('table-body'), attr: 'backgroundColor', type: 'color', desc: '表格内容背景色', }, { name: 'rowSpacing', className: exposeClass('table-spacing'), attr: 'height', type: 'number', parser: parseInt, desc: '行间距', }, { name: 'rowBorderRadius', className: exposeClass('table-spacing'), attr: 'borderRadius', type: 'number', parser: parseInt, desc: '行圆角', }, { name: 'headFontWeight', className: exposeClass('table-head'), attr: 'fontWeight', type: 'number', max: 900, min: 100, parser: parseInt, desc: '表头字重', }, { name: 'borderColor', className: exposeClass('table-head'), attr: 'borderColor', type: 'color', desc: '边框颜色', }, { name: 'hoverBg', className: exposeClass('table-head-hover'), attr: 'backgroundColor', type: 'color', desc: '鼠标悬浮行背景色', }, { name: 'selectedBg', className: exposeClass('table-selected'), attr: 'backgroundColor', type: 'color', desc: '选中行背景色', }, { name: 'textColor', className: exposeClass('table'), attr: 'color', type: 'color', desc: '文字颜色', }, { name: 'borderRadiusTop', className: exposeClass('table-head'), attr: 'borderTopLeftRadius', type: 'number', parser: parseInt, desc: '表格头部圆角', }, { name: 'headerCellPadding', className: exposeClass('table-head'), attr: 'padding', type: 'string', desc: '表头分组内边距', }, { name: 'smallCellPadding', className: exposeClass('table-small'), attr: 'padding', type: 'string', desc: '紧凑表格单元格内边距', }, { name: 'cellPaddingHorizontal', className: exposeClass('table-cell'), attr: 'paddingLeft', type: 'number', parser: parseInt, desc: '单元格水平内边距', }, { name: 'cellPaddingVertical', className: exposeClass('table-cell'), attr: 'paddingTop', type: 'number', parser: parseInt, desc: '单元格垂直内边距', }, { name: 'treeExpandIconMarginRight', className: exposeClass('table-tree-expand'), attr: 'marginRight', type: 'number', parser: parseInt, desc: '子表格展开/收起按钮距离文字距离', }, { name: 'fixedStart', className: exposeClass('table-fixed-start'), attr: 'backgroundColor', type: 'color', desc: '固定列渐变色开始颜色', }, { name: 'fixedEnd', className: exposeClass('table-fixed-end'), attr: 'backgroundColor', type: 'color', desc: '固定列渐变色结束颜色', }, { name: 'tableEvenBgc', className: exposeClass('table-even'), attr: 'backgroundColor', type: 'color', desc: '偶数行背景颜色', }, { name: 'tableOddBgc', className: exposeClass('table-odd'), attr: 'backgroundColor', type: 'color', desc: '奇数行背景颜色', }, { name: 'marginBottom', className: exposeClass('table'), attr: 'marginBottom', type: 'number', parser: parseInt, desc: '表格底部外边距', }, { name: 'headerTopDivider', className: exposeClass('table-head-top'), attr: 'borderWidth', type: 'number', parser: parseInt, desc: '无边框表格头部边框线', }, ], set scrollRatio(v: number | string) { const rate = typeof v === 'number' ? v : parseInt(v, 10) configSet('scrollRatio', rate) setBodyProperty( { '--table-scroll-ratio': `${rate}px`, }, v ) }, set headBg(v: string) { setBodyProperty( { '--table-head-bg': v, }, v ) }, set hoverBg(v: string) { setBodyProperty( { '--table-hover-bg': v, }, v ) }, set selectedBg(v: string) { setBodyProperty( { '--table-selected-row-bg': v, }, v ) }, set headColor(v: string) { setBodyProperty( { '--table-head-color': v, }, v ) }, set bodyBg(v: string) { setBodyProperty( { '--table-body-bg': v, }, v ) }, set rowSpacing(v: string) { setBodyProperty( { '--table-row-spacing': `${parseInt(v, 10)}px`, }