function isObjEmpty(obj: object = {}): boolean { return Object.keys(obj).length === 0; } function deepClone(obj: T): T { return JSON.parse(JSON.stringify(obj)); } function areObjectEquals(obj: object, obj2: object): boolean { return JSON.stringify(obj) === JSON.stringify(obj2); } function isMac(): boolean { return navigator.platform.toUpperCase().indexOf("MAC") >= 0; } function capitalize(string: string): string { return string.charAt(0).toUpperCase() + string.slice(1); } function hexToRgb(hex: string): { r: number; g: number; b: number } | null { const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; const newHex = hex.replace(shorthandRegex, function (_, r, g, b) { return r + r + g + g + b + b; }); const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(newHex); return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16), } : null; } function luminance(r: number, g: number, b: number): number { const a = [r, g, b].map((v) => { const fractor = v / 255; return fractor <= 0.03928 ? fractor / 12.92 : Math.pow((fractor + 0.055) / 1.055, 2.4); }); return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; } function isJsonValid(json: any): boolean { try { JSON.parse(json); } catch (e) { return false; } return true; } export { isObjEmpty, deepClone, areObjectEquals, isMac, capitalize, hexToRgb, luminance, isJsonValid, };