vuetify
Version:
Vue Material Component Framework
168 lines (141 loc) • 3.58 kB
text/typescript
// Utilities
import {
HSVA,
HSVAtoRGBA,
HSVAtoHex,
RGBA,
Hex,
RGBAtoHSVA,
HexToHSVA,
HSLA,
HSVAtoHSLA,
RGBAtoHex,
HSLAtoHSVA,
parseHex,
Hexa,
} from '../../../util/colorUtils'
export interface VColorPickerColor {
alpha: number
hex: Hex
hexa: Hexa
hsla: HSLA
hsva: HSVA
hue: number
rgba: RGBA
}
export function fromHSVA (hsva: HSVA): VColorPickerColor {
hsva = { ...hsva }
const hexa = HSVAtoHex(hsva)
const hsla = HSVAtoHSLA(hsva)
const rgba = HSVAtoRGBA(hsva)
return {
alpha: hsva.a,
hex: hexa.substr(0, 7),
hexa,
hsla,
hsva,
hue: hsva.h,
rgba,
}
}
export function fromHSLA (hsla: HSLA): VColorPickerColor {
const hsva = HSLAtoHSVA(hsla)
const hexa = HSVAtoHex(hsva)
const rgba = HSVAtoRGBA(hsva)
return {
alpha: hsva.a,
hex: hexa.substr(0, 7),
hexa,
hsla,
hsva,
hue: hsva.h,
rgba,
}
}
export function fromRGBA (rgba: RGBA): VColorPickerColor {
const hsva = RGBAtoHSVA(rgba)
const hexa = RGBAtoHex(rgba)
const hsla = HSVAtoHSLA(hsva)
return {
alpha: hsva.a,
hex: hexa.substr(0, 7),
hexa,
hsla,
hsva,
hue: hsva.h,
rgba,
}
}
export function fromHexa (hexa: Hexa): VColorPickerColor {
const hsva = HexToHSVA(hexa)
const hsla = HSVAtoHSLA(hsva)
const rgba = HSVAtoRGBA(hsva)
return {
alpha: hsva.a,
hex: hexa.substr(0, 7),
hexa,
hsla,
hsva,
hue: hsva.h,
rgba,
}
}
export function fromHex (hex: Hex): VColorPickerColor {
return fromHexa(parseHex(hex))
}
function has (obj: object, key: string[]) {
return key.every(k => obj.hasOwnProperty(k))
}
export function parseColor (color: any, oldColor: VColorPickerColor | null) {
if (!color) return fromRGBA({ r: 255, g: 0, b: 0, a: 1 })
if (typeof color === 'string') {
if (color === 'transparent') return fromHexa('#00000000')
const hex = parseHex(color)
if (oldColor && hex === oldColor.hexa) return oldColor
else return fromHexa(hex)
}
if (typeof color === 'object') {
if (color.hasOwnProperty('alpha')) return color
const a = color.hasOwnProperty('a') ? parseFloat(color.a) : 1
if (has(color, ['r', 'g', 'b'])) {
if (oldColor && color === oldColor.rgba) return oldColor
else return fromRGBA({ ...color, a })
} else if (has(color, ['h', 's', 'l'])) {
if (oldColor && color === oldColor.hsla) return oldColor
else return fromHSLA({ ...color, a })
} else if (has(color, ['h', 's', 'v'])) {
if (oldColor && color === oldColor.hsva) return oldColor
else return fromHSVA({ ...color, a })
}
}
return fromRGBA({ r: 255, g: 0, b: 0, a: 1 })
}
function stripAlpha (color: any, stripAlpha: boolean) {
if (stripAlpha) {
const { a, ...rest } = color
return rest
}
return color
}
export function extractColor (color: VColorPickerColor, input: any) {
if (input == null) return color
if (typeof input === 'string') {
return input.length === 7 ? color.hex : color.hexa
}
if (typeof input === 'object') {
if (has(input, ['r', 'g', 'b'])) return stripAlpha(color.rgba, !input.a)
else if (has(input, ['h', 's', 'l'])) return stripAlpha(color.hsla, !input.a)
else if (has(input, ['h', 's', 'v'])) return stripAlpha(color.hsva, !input.a)
}
return color
}
export function hasAlpha (color: any) {
if (!color) return false
if (typeof color === 'string') {
return color.length > 7
}
if (typeof color === 'object') {
return has(color, ['a']) || has(color, ['alpha'])
}
return false
}