@fto-consult/common
Version:
Un ensemble de bibliothèques et d'utilistaires communs pour le développement d'applications javascript
156 lines (128 loc) • 5.88 kB
JavaScript
// Copyright 2022 @fto-consult/Boris Fouomene. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import {isDecimal,defaultDecimal,isNonNullString} from "$cutils";
import * as RNColors from "./rn-colors";
import namesColors from "./names-colors";
import {isHex} from "./tiny-color/utils";
import tinyColor from "./tiny-color";
export * from "./rn-colors";
export * from "./tiny-color/utils";
export * from "./tiny-color";
const Colors = {...namesColors,...RNColors};
const ColorsKeys = Object.keys(Colors);
const countColorsSufix = ColorsKeys.length;
const avatarSuffix = [ 'red', 'pink', 'purple', 'deep-purple', 'indigo', 'blue', 'light-blue', 'cyan', 'teal', 'green', 'light-green', 'lime', 'yellow', 'amber', 'orange', 'deep-orange', 'brown', 'grey', 'blue-grey']
export {tinyColor};
/*** usage : see @materialy-Colors for list of Colors available
* Colors.get("read") => Colors.get("red-500")
* Colors.get("red-100")
* Colors => {}//Colors object
* Colors.getColors => retourne toutes les variantes de couleur de l'objet passé en paramètre
*/
Colors.get = (color)=>{
if(!isNonNullString(color)) return undefined;
color = color.replaceAll("-","").replaceAll("_","").toLowerCase().trim();
return Colors[color] || undefined;
}
Colors.getBrightness = color => {
return tinyColor(color).getBrightness();
}
/****
* Get contrasts of color
* Retourne la couleur d'arrière plan à appliquer pour la couleur d'avant plan passée en parmaètre et
* inversement
* @param hexcolor: couleur au format hexa
* @returns {string} couleur à appliquer sur la couleur hexcolor, pour un bon contraste : back ou white.
*/
Colors.getContrast = function(hexcolor,comparator){
let contrastColor = Colors.getBrightness(hexcolor);
comparator = isDecimal(comparator) && comparator > 10 ? comparator : 170//128;
contrastColor = (contrastColor >= comparator) ? 'black' : 'white';
return contrastColor;
}
/*** vérifie si la couleur est un chaine de caractère hexa decimal en couleur */
Colors.isHex = isHex;
Colors.isValid = color => {
return Colors.isHex(color) || tinyColor(color).isValid();
}
//tinyColors methods @see : // https://github.com/bgrins/TinyColor
let stringMethods = [
"toHsv","toHsl","setAlpha","getAlpha","toHex","toHex8","toRgb","toPercentageRgb","toName",
"lighten","brighten","darken","desaturate","saturate",""
]
stringMethods.map((m,i)=>{
Colors[m] = (...args)=> tinyColor(...args)[m]().toString();
});
Colors.toRgbObj = Colors.toRgbObject = (color)=>tinyColor(color).toRgb();
Colors.toSixDigitsHex = (color)=>{
if(!Colors.isHex(color)) return "";
if(color.length === 7 || color.length < 3) return color;
const col = color.split("#")[1];
if (col.length === 3) {
return "#"+col.split('').map(function (hex) {
return hex + hex;
}).join('');
}
return color;
}
/**** définie la valeur alpha à partir d'une couleur données */
export const setAlpha = Colors.toAlpha= Colors.setAlpha = (color,alpha)=>{
return Colors.isValid(color) && isDecimal(alpha)? tinyColor(color).setAlpha(alpha).toRgbString(): color;
}
Colors.getLuminance = (color)=> tinyColor(color).getLuminance();
Colors.isDark = (color,mesure)=> {
let cont = Colors.getBrightness(color);
mesure = isDecimal(mesure) && mesure > 10 ? mesure : 128;
return isDecimal(cont) && cont < mesure ? true : false;
}
Colors.isLight = Colors.isWhite = (color,mesure)=> {
let cont = Colors.getBrightness(color);
mesure = isDecimal(mesure) && mesure > 10 ? mesure : 128;
return (isDecimal(cont) && cont >= mesure) ? true : false;
}
/*** retourne l'une des couleurs figurant dans la liste des couleurs du tableau avatarSuffixes
* @param : numeric, l'indice de la couleur recherchée
*
*/
export const getColorSuffix = Colors.getColorSuffix = Colors.suffix = Colors.getSuffix= function(suffix){
suffix = defaultDecimal(suffix);
if(suffix <0){
suffix = 0;
}
let count = countColorsSufix-1;
if(suffix < avatarSuffix.length){
let color = avatarSuffix[suffix].replaceAll("-","").toLowerCase();
if(Colors[color]) return Colors[color];
}
if(suffix > count){
suffix = suffix%count;
}
return Colors[ColorsKeys[suffix]];
}
/**** retourne la background class en prenant en paramètre un index, voir color pour plus */
export const getBackgroundSuffix = Colors.getBackgroundSuffix= Colors.getBgSuffix = function getBackgroundSuffix(index){
return Colors.getContrast(getColorSuffix(index))
}
export const getBgSuffix = getBackgroundSuffix;
export const getColor2BackgroundSuffix = Colors.getColor2BackgroundSuffix = Colors.getColor2BgSuffix = (suffix)=>{
let color = getColorSuffix(suffix);
return {color,backgroundColor:Colors.getContrast(color)};
}
export const getAvatarStyleFromSuffix = Colors.getAvatarStyleFromSuffix = (suffix)=>{
suffix = defaultDecimal(suffix);
let color = getColorSuffix(suffix);
const colorContrast = Colors.getContrast(color);
return {color:colorContrast,backgroundColor:color,style:{color:colorContrast,backgroundColor:color}};
}
export const getSuffixStyle = Colors.getSuffixStyle = getColor2BackgroundSuffix;
export const getColor2BgSuffix = getColor2BackgroundSuffix;
export const equalsWhite = Colors.equalsWhite = Colors.isEqualsToWhite = (color)=>{
color = Colors.isValid(color)? tinyColor(color).toHex().toString().ltrim("#") : defaultStr(color).toLowerCase();
return color === 'ffffff'? true : false;
}
export const isEqualsToWhite = equalsWhite;
export default Colors;
export const randomHex = Colors.random = Colors.randomHex = () => {
return `#${Math.random().toString(16).slice(2, 8)}`;
}