bin-ui
Version:
基于 vue2.6 / vue-cli3 的 UI 组件库
119 lines (91 loc) • 2.67 kB
JavaScript
import tinycolor from 'tinycolor2'
import { oneOf } from '../../utils/util'
function setAlpha(data, alpha) {
const color = tinycolor(data)
const { _a } = color
if (_a === undefined || _a === null) {
color.setAlpha(alpha || 1)
}
return color
}
function getColor(data, colorData) {
const alpha = colorData && colorData.a
if (colorData) {
// hsl is better than hex between conversions
if (colorData.hsl) {
return setAlpha(colorData.hsl, alpha)
}
if (colorData.hex && colorData.hex.length > 0) {
return setAlpha(colorData.hex, alpha)
}
}
return setAlpha(colorData, alpha)
}
export function changeColor(data, oldHue) {
const colorData = data === '' ? '#1089ff' : data
const color = getColor(data, colorData)
const hsl = color.toHsl()
const hsv = color.toHsv()
if (hsl.s === 0) {
hsl.h = colorData.h || (colorData.hsl && colorData.hsl.h) || oldHue || 0
hsv.h = hsl.h
}
// when the hsv.v is less than 0.0164 (base on test)
// because of possible loss of precision
// the result of hue and saturation would be miscalculated
if (hsv.v < 0.0164) {
hsv.h = colorData.h || (colorData.hsv && colorData.hsv.h) || 0
hsv.s = colorData.s || (colorData.hsv && colorData.hsv.s) || 0
}
if (hsl.l < 0.01) {
hsl.h = colorData.h || (colorData.hsl && colorData.hsl.h) || 0
hsl.s = colorData.s || (colorData.hsl && colorData.hsl.s) || 0
}
return {
hsl,
hex: color.toHexString().toUpperCase(),
rgba: color.toRgb(),
hsv,
oldHue: colorData.h || oldHue || hsl.h,
source: colorData.source,
a: colorData.a || color.getAlpha()
}
}
export function clamp(value, min, max) {
if (value < min) {
return min
}
if (value > max) {
return max
}
return value
}
export function getIncrement(key, keys, increment) {
return oneOf(key, keys) ? increment : 0
}
export function getTouches(e, prop) {
return e.touches ? e.touches[0][prop] : 0
}
export function toRGBAString(rgba) {
const { r, g, b, a } = rgba
return `rgba(${[r, g, b, a].join(',')})`
}
export function isValidHex(hex) {
return tinycolor(hex).isValid()
}
function checkIteratee(data, counts, letter) {
let { checked, passed } = counts
const value = data[letter]
if (value) {
checked += 1
if (Number.isFinite(value)) {
passed += 1
}
}
return { checked, passed }
}
const keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v']
export function simpleCheckForValidColor(data) {
const results = keysToCheck.reduce(checkIteratee.bind(null, data), { checked: 0, passed: 0 })
return results.checked === results.passed ? data : undefined
}