This commit is contained in:
2022-07-21 03:28:35 +00:00
parent d7c883d6df
commit 51b34b0e1d
30103 changed files with 4152204 additions and 23 deletions
+17
View File
@@ -0,0 +1,17 @@
const delta = 0.20689655172413793; // 6÷29
const cielabForwardTransform = t => t > delta ** 3 ? Math.cbrt(t) : t / (3 * delta ** 2) + 4 / 29;
const cielabReverseTransform = t => t > delta ? t ** 3 : 3 * delta ** 2 * (t - 4 / 29);
export function fromXYZ(xyz) {
const transform = cielabForwardTransform;
const transformedY = transform(xyz[1]);
return [116 * transformedY - 16, 500 * (transform(xyz[0] / 0.95047) - transformedY), 200 * (transformedY - transform(xyz[2] / 1.08883))];
}
export function toXYZ(lab) {
const transform = cielabReverseTransform;
const Ln = (lab[0] + 16) / 116;
return [transform(Ln + lab[1] / 500) * 0.95047, transform(Ln), transform(Ln - lab[2] / 200) * 1.08883];
}
//# sourceMappingURL=transformCIELAB.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/util/color/transformCIELAB.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG,mBAAd,C,CAAkC;;AAElC,MAAM,sBAAsB,GAAI,CAAD,IAC7B,CAAC,GAAG,KAAK,IAAI,CAAb,GACI,IAAI,CAAC,IAAL,CAAU,CAAV,CADJ,GAEK,CAAC,IAAI,IAAI,KAAK,IAAI,CAAjB,CAAF,GAAyB,IAAI,EAHnC;;AAMA,MAAM,sBAAsB,GAAI,CAAD,IAC7B,CAAC,GAAG,KAAJ,GACI,CAAC,IAAI,CADT,GAEK,IAAI,KAAK,IAAI,CAAd,IAAoB,CAAC,GAAG,IAAI,EAA5B,CAHN;;AAMA,OAAM,SAAU,OAAV,CAAmB,GAAnB,EAA2B;AAC/B,QAAM,SAAS,GAAG,sBAAlB;AACA,QAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAD,CAAJ,CAA9B;AAEA,SAAO,CACL,MAAM,YAAN,GAAqB,EADhB,EAEL,OAAO,SAAS,CAAC,GAAG,CAAC,CAAD,CAAH,GAAS,OAAV,CAAT,GAA8B,YAArC,CAFK,EAGL,OAAO,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAD,CAAH,GAAS,OAAV,CAA/B,CAHK,CAAP;AAKD;AAED,OAAM,SAAU,KAAV,CAAiB,GAAjB,EAAyB;AAC7B,QAAM,SAAS,GAAG,sBAAlB;AACA,QAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAD,CAAH,GAAS,EAAV,IAAgB,GAA3B;AACA,SAAO,CACL,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,CAAD,CAAH,GAAS,GAAf,CAAT,GAA+B,OAD1B,EAEL,SAAS,CAAC,EAAD,CAFJ,EAGL,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,CAAD,CAAH,GAAS,GAAf,CAAT,GAA+B,OAH1B,CAAP;AAKD","sourcesContent":["import { XYZ, LAB } from '../colorUtils'\n\nconst delta = 0.20689655172413793 // 6÷29\n\nconst cielabForwardTransform = (t: number): number => (\n t > delta ** 3\n ? Math.cbrt(t)\n : (t / (3 * delta ** 2)) + 4 / 29\n)\n\nconst cielabReverseTransform = (t: number): number => (\n t > delta\n ? t ** 3\n : (3 * delta ** 2) * (t - 4 / 29)\n)\n\nexport function fromXYZ (xyz: XYZ): LAB {\n const transform = cielabForwardTransform\n const transformedY = transform(xyz[1])\n\n return [\n 116 * transformedY - 16,\n 500 * (transform(xyz[0] / 0.95047) - transformedY),\n 200 * (transformedY - transform(xyz[2] / 1.08883)),\n ]\n}\n\nexport function toXYZ (lab: LAB): XYZ {\n const transform = cielabReverseTransform\n const Ln = (lab[0] + 16) / 116\n return [\n transform(Ln + lab[1] / 500) * 0.95047,\n transform(Ln),\n transform(Ln - lab[2] / 200) * 1.08883,\n ]\n}\n"],"sourceRoot":"","file":"transformCIELAB.js"}
+39
View File
@@ -0,0 +1,39 @@
import { clamp } from '../../util/helpers'; // For converting XYZ to sRGB
const srgbForwardMatrix = [[3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [0.0557, -0.2040, 1.0570]]; // Forward gamma adjust
const srgbForwardTransform = C => C <= 0.0031308 ? C * 12.92 : 1.055 * C ** (1 / 2.4) - 0.055; // For converting sRGB to XYZ
const srgbReverseMatrix = [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]]; // Reverse gamma adjust
const srgbReverseTransform = C => C <= 0.04045 ? C / 12.92 : ((C + 0.055) / 1.055) ** 2.4;
export function fromXYZ(xyz) {
const rgb = Array(3);
const transform = srgbForwardTransform;
const matrix = srgbForwardMatrix; // Matrix transform, then gamma adjustment
for (let i = 0; i < 3; ++i) {
rgb[i] = Math.round(clamp(transform(matrix[i][0] * xyz[0] + matrix[i][1] * xyz[1] + matrix[i][2] * xyz[2])) * 255);
} // Rescale back to [0, 255]
return (rgb[0] << 16) + (rgb[1] << 8) + (rgb[2] << 0);
}
export function toXYZ(rgb) {
const xyz = [0, 0, 0];
const transform = srgbReverseTransform;
const matrix = srgbReverseMatrix; // Rescale from [0, 255] to [0, 1] then adjust sRGB gamma to linear RGB
const r = transform((rgb >> 16 & 0xff) / 255);
const g = transform((rgb >> 8 & 0xff) / 255);
const b = transform((rgb >> 0 & 0xff) / 255); // Matrix color space transform
for (let i = 0; i < 3; ++i) {
xyz[i] = matrix[i][0] * r + matrix[i][1] * g + matrix[i][2] * b;
}
return xyz;
}
//# sourceMappingURL=transformSRGB.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/util/color/transformSRGB.ts"],"names":[],"mappings":"AACA,SAAS,KAAT,QAAsB,oBAAtB,C,CAEA;;AACA,MAAM,iBAAiB,GAAG,CACxB,CAAC,MAAD,EAAS,CAAC,MAAV,EAAkB,CAAC,MAAnB,CADwB,EAExB,CAAC,CAAC,MAAF,EAAU,MAAV,EAAkB,MAAlB,CAFwB,EAGxB,CAAC,MAAD,EAAS,CAAC,MAAV,EAAkB,MAAlB,CAHwB,CAA1B,C,CAMA;;AACA,MAAM,oBAAoB,GAAI,CAAD,IAC3B,CAAC,IAAI,SAAL,GACI,CAAC,GAAG,KADR,GAEI,QAAQ,CAAC,KAAK,IAAI,GAAT,CAAT,GAAyB,KAH/B,C,CAMA;;;AACA,MAAM,iBAAiB,GAAG,CACxB,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,CADwB,EAExB,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,CAFwB,EAGxB,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,CAHwB,CAA1B,C,CAMA;;AACA,MAAM,oBAAoB,GAAI,CAAD,IAC3B,CAAC,IAAI,OAAL,GACI,CAAC,GAAG,KADR,GAEI,CAAC,CAAC,CAAC,GAAG,KAAL,IAAc,KAAf,KAAyB,GAH/B;;AAMA,OAAM,SAAU,OAAV,CAAmB,GAAnB,EAA2B;AAC/B,QAAM,GAAG,GAAG,KAAK,CAAC,CAAD,CAAjB;AACA,QAAM,SAAS,GAAG,oBAAlB;AACA,QAAM,MAAM,GAAG,iBAAf,CAH+B,CAK/B;;AACA,OAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,CAApB,EAAuB,EAAE,CAAzB,EAA4B;AAC1B,IAAA,GAAG,CAAC,CAAD,CAAH,GAAS,IAAI,CAAC,KAAL,CAAW,KAAK,CAAC,SAAS,CACjC,MAAM,CAAC,CAAD,CAAN,CAAU,CAAV,IAAe,GAAG,CAAC,CAAD,CAAlB,GACA,MAAM,CAAC,CAAD,CAAN,CAAU,CAAV,IAAe,GAAG,CAAC,CAAD,CADlB,GAEA,MAAM,CAAC,CAAD,CAAN,CAAU,CAAV,IAAe,GAAG,CAAC,CAAD,CAHe,CAAV,CAAL,GAIf,GAJI,CAAT;AAKD,GAZ8B,CAc/B;;;AACA,SAAO,CAAC,GAAG,CAAC,CAAD,CAAH,IAAU,EAAX,KAAkB,GAAG,CAAC,CAAD,CAAH,IAAU,CAA5B,KAAkC,GAAG,CAAC,CAAD,CAAH,IAAU,CAA5C,CAAP;AACD;AAED,OAAM,SAAU,KAAV,CAAiB,GAAjB,EAA8B;AAClC,QAAM,GAAG,GAAQ,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,CAAjB;AACA,QAAM,SAAS,GAAG,oBAAlB;AACA,QAAM,MAAM,GAAG,iBAAf,CAHkC,CAKlC;;AACA,QAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,EAAP,GAAY,IAAb,IAAqB,GAAtB,CAAnB;AACA,QAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAP,GAAW,IAAZ,IAAoB,GAArB,CAAnB;AACA,QAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAP,GAAW,IAAZ,IAAoB,GAArB,CAAnB,CARkC,CAUlC;;AACA,OAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,CAApB,EAAuB,EAAE,CAAzB,EAA4B;AAC1B,IAAA,GAAG,CAAC,CAAD,CAAH,GAAS,MAAM,CAAC,CAAD,CAAN,CAAU,CAAV,IAAe,CAAf,GAAmB,MAAM,CAAC,CAAD,CAAN,CAAU,CAAV,IAAe,CAAlC,GAAsC,MAAM,CAAC,CAAD,CAAN,CAAU,CAAV,IAAe,CAA9D;AACD;;AAED,SAAO,GAAP;AACD","sourcesContent":["import { ColorInt, XYZ } from '../colorUtils'\nimport { clamp } from '../../util/helpers'\n\n// For converting XYZ to sRGB\nconst srgbForwardMatrix = [\n [3.2406, -1.5372, -0.4986],\n [-0.9689, 1.8758, 0.0415],\n [0.0557, -0.2040, 1.0570],\n]\n\n// Forward gamma adjust\nconst srgbForwardTransform = (C: number): number => (\n C <= 0.0031308\n ? C * 12.92\n : 1.055 * C ** (1 / 2.4) - 0.055\n)\n\n// For converting sRGB to XYZ\nconst srgbReverseMatrix = [\n [0.4124, 0.3576, 0.1805],\n [0.2126, 0.7152, 0.0722],\n [0.0193, 0.1192, 0.9505],\n]\n\n// Reverse gamma adjust\nconst srgbReverseTransform = (C: number): number => (\n C <= 0.04045\n ? C / 12.92\n : ((C + 0.055) / 1.055) ** 2.4\n)\n\nexport function fromXYZ (xyz: XYZ): ColorInt {\n const rgb = Array(3)\n const transform = srgbForwardTransform\n const matrix = srgbForwardMatrix\n\n // Matrix transform, then gamma adjustment\n for (let i = 0; i < 3; ++i) {\n rgb[i] = Math.round(clamp(transform(\n matrix[i][0] * xyz[0] +\n matrix[i][1] * xyz[1] +\n matrix[i][2] * xyz[2]\n )) * 255)\n }\n\n // Rescale back to [0, 255]\n return (rgb[0] << 16) + (rgb[1] << 8) + (rgb[2] << 0)\n}\n\nexport function toXYZ (rgb: ColorInt): XYZ {\n const xyz: XYZ = [0, 0, 0]\n const transform = srgbReverseTransform\n const matrix = srgbReverseMatrix\n\n // Rescale from [0, 255] to [0, 1] then adjust sRGB gamma to linear RGB\n const r = transform((rgb >> 16 & 0xff) / 255)\n const g = transform((rgb >> 8 & 0xff) / 255)\n const b = transform((rgb >> 0 & 0xff) / 255)\n\n // Matrix color space transform\n for (let i = 0; i < 3; ++i) {\n xyz[i] = matrix[i][0] * r + matrix[i][1] * g + matrix[i][2] * b\n }\n\n return xyz\n}\n"],"sourceRoot":"","file":"transformSRGB.js"}
+235
View File
@@ -0,0 +1,235 @@
// Utilities
import { consoleWarn } from './console';
import { chunk, padEnd } from './helpers';
import { toXYZ } from './color/transformSRGB';
export function isCssColor(color) {
return !!color && !!color.match(/^(#|var\(--|(rgb|hsl)a?\()/);
}
export function colorToInt(color) {
let rgb;
if (typeof color === 'number') {
rgb = color;
} else if (typeof color === 'string') {
let c = color[0] === '#' ? color.substring(1) : color;
if (c.length === 3) {
c = c.split('').map(char => char + char).join('');
}
if (c.length !== 6) {
consoleWarn(`'${color}' is not a valid rgb color`);
}
rgb = parseInt(c, 16);
} else {
throw new TypeError(`Colors can only be numbers or strings, recieved ${color == null ? color : color.constructor.name} instead`);
}
if (rgb < 0) {
consoleWarn(`Colors cannot be negative: '${color}'`);
rgb = 0;
} else if (rgb > 0xffffff || isNaN(rgb)) {
consoleWarn(`'${color}' is not a valid rgb color`);
rgb = 0xffffff;
}
return rgb;
}
export function classToHex(color, colors, currentTheme) {
const [colorName, colorModifier] = color.toString().trim().replace('-', '').split(' ', 2);
let hexColor = '';
if (colorName && colorName in colors) {
if (colorModifier && colorModifier in colors[colorName]) {
hexColor = colors[colorName][colorModifier];
} else if ('base' in colors[colorName]) {
hexColor = colors[colorName].base;
}
} else if (colorName && colorName in currentTheme) {
hexColor = currentTheme[colorName];
}
return hexColor;
}
export function intToHex(color) {
let hexColor = color.toString(16);
if (hexColor.length < 6) hexColor = '0'.repeat(6 - hexColor.length) + hexColor;
return '#' + hexColor;
}
export function colorToHex(color) {
return intToHex(colorToInt(color));
}
/**
* Converts HSVA to RGBA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV
*
* @param color HSVA color as an array [0-360, 0-1, 0-1, 0-1]
*/
export function HSVAtoRGBA(hsva) {
const {
h,
s,
v,
a
} = hsva;
const f = n => {
const k = (n + h / 60) % 6;
return v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);
};
const rgb = [f(5), f(3), f(1)].map(v => Math.round(v * 255));
return {
r: rgb[0],
g: rgb[1],
b: rgb[2],
a
};
}
/**
* Converts RGBA to HSVA. Based on formula from https://en.wikipedia.org/wiki/HSL_and_HSV
*
* @param color RGBA color as an array [0-255, 0-255, 0-255, 0-1]
*/
export function RGBAtoHSVA(rgba) {
if (!rgba) return {
h: 0,
s: 1,
v: 1,
a: 1
};
const r = rgba.r / 255;
const g = rgba.g / 255;
const b = rgba.b / 255;
const max = Math.max(r, g, b);
const min = Math.min(r, g, b);
let h = 0;
if (max !== min) {
if (max === r) {
h = 60 * (0 + (g - b) / (max - min));
} else if (max === g) {
h = 60 * (2 + (b - r) / (max - min));
} else if (max === b) {
h = 60 * (4 + (r - g) / (max - min));
}
}
if (h < 0) h = h + 360;
const s = max === 0 ? 0 : (max - min) / max;
const hsv = [h, s, max];
return {
h: hsv[0],
s: hsv[1],
v: hsv[2],
a: rgba.a
};
}
export function HSVAtoHSLA(hsva) {
const {
h,
s,
v,
a
} = hsva;
const l = v - v * s / 2;
const sprime = l === 1 || l === 0 ? 0 : (v - l) / Math.min(l, 1 - l);
return {
h,
s: sprime,
l,
a
};
}
export function HSLAtoHSVA(hsl) {
const {
h,
s,
l,
a
} = hsl;
const v = l + s * Math.min(l, 1 - l);
const sprime = v === 0 ? 0 : 2 - 2 * l / v;
return {
h,
s: sprime,
v,
a
};
}
export function RGBAtoCSS(rgba) {
return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;
}
export function RGBtoCSS(rgba) {
return RGBAtoCSS({ ...rgba,
a: 1
});
}
export function RGBAtoHex(rgba) {
const toHex = v => {
const h = Math.round(v).toString(16);
return ('00'.substr(0, 2 - h.length) + h).toUpperCase();
};
return `#${[toHex(rgba.r), toHex(rgba.g), toHex(rgba.b), toHex(Math.round(rgba.a * 255))].join('')}`;
}
export function HexToRGBA(hex) {
const rgba = chunk(hex.slice(1), 2).map(c => parseInt(c, 16));
return {
r: rgba[0],
g: rgba[1],
b: rgba[2],
a: Math.round(rgba[3] / 255 * 100) / 100
};
}
export function HexToHSVA(hex) {
const rgb = HexToRGBA(hex);
return RGBAtoHSVA(rgb);
}
export function HSVAtoHex(hsva) {
return RGBAtoHex(HSVAtoRGBA(hsva));
}
export function parseHex(hex) {
if (hex.startsWith('#')) {
hex = hex.slice(1);
}
hex = hex.replace(/([^0-9a-f])/gi, 'F');
if (hex.length === 3 || hex.length === 4) {
hex = hex.split('').map(x => x + x).join('');
}
if (hex.length === 6) {
hex = padEnd(hex, 8, 'F');
} else {
hex = padEnd(padEnd(hex, 6), 8, 'F');
}
return `#${hex}`.toUpperCase().substr(0, 9);
}
export function parseGradient(gradient, colors, currentTheme) {
return gradient.replace(/([a-z]+(\s[a-z]+-[1-5])?)(?=$|,)/gi, x => {
return classToHex(x, colors, currentTheme) || x;
}).replace(/(rgba\()#[0-9a-f]+(?=,)/gi, x => {
return 'rgba(' + Object.values(HexToRGBA(parseHex(x.replace(/rgba\(/, '')))).slice(0, 3).join(',');
});
}
export function RGBtoInt(rgba) {
return (rgba.r << 16) + (rgba.g << 8) + rgba.b;
}
/**
* Returns the contrast ratio (1-21) between two colors.
*
* @param c1 First color
* @param c2 Second color
*/
export function contrastRatio(c1, c2) {
const [, y1] = toXYZ(RGBtoInt(c1));
const [, y2] = toXYZ(RGBtoInt(c2));
return (Math.max(y1, y2) + 0.05) / (Math.min(y1, y2) + 0.05);
}
//# sourceMappingURL=colorUtils.js.map
File diff suppressed because one or more lines are too long
+320
View File
@@ -0,0 +1,320 @@
const red = Object.freeze({
base: '#f44336',
lighten5: '#ffebee',
lighten4: '#ffcdd2',
lighten3: '#ef9a9a',
lighten2: '#e57373',
lighten1: '#ef5350',
darken1: '#e53935',
darken2: '#d32f2f',
darken3: '#c62828',
darken4: '#b71c1c',
accent1: '#ff8a80',
accent2: '#ff5252',
accent3: '#ff1744',
accent4: '#d50000'
});
const pink = Object.freeze({
base: '#e91e63',
lighten5: '#fce4ec',
lighten4: '#f8bbd0',
lighten3: '#f48fb1',
lighten2: '#f06292',
lighten1: '#ec407a',
darken1: '#d81b60',
darken2: '#c2185b',
darken3: '#ad1457',
darken4: '#880e4f',
accent1: '#ff80ab',
accent2: '#ff4081',
accent3: '#f50057',
accent4: '#c51162'
});
const purple = Object.freeze({
base: '#9c27b0',
lighten5: '#f3e5f5',
lighten4: '#e1bee7',
lighten3: '#ce93d8',
lighten2: '#ba68c8',
lighten1: '#ab47bc',
darken1: '#8e24aa',
darken2: '#7b1fa2',
darken3: '#6a1b9a',
darken4: '#4a148c',
accent1: '#ea80fc',
accent2: '#e040fb',
accent3: '#d500f9',
accent4: '#aa00ff'
});
const deepPurple = Object.freeze({
base: '#673ab7',
lighten5: '#ede7f6',
lighten4: '#d1c4e9',
lighten3: '#b39ddb',
lighten2: '#9575cd',
lighten1: '#7e57c2',
darken1: '#5e35b1',
darken2: '#512da8',
darken3: '#4527a0',
darken4: '#311b92',
accent1: '#b388ff',
accent2: '#7c4dff',
accent3: '#651fff',
accent4: '#6200ea'
});
const indigo = Object.freeze({
base: '#3f51b5',
lighten5: '#e8eaf6',
lighten4: '#c5cae9',
lighten3: '#9fa8da',
lighten2: '#7986cb',
lighten1: '#5c6bc0',
darken1: '#3949ab',
darken2: '#303f9f',
darken3: '#283593',
darken4: '#1a237e',
accent1: '#8c9eff',
accent2: '#536dfe',
accent3: '#3d5afe',
accent4: '#304ffe'
});
const blue = Object.freeze({
base: '#2196f3',
lighten5: '#e3f2fd',
lighten4: '#bbdefb',
lighten3: '#90caf9',
lighten2: '#64b5f6',
lighten1: '#42a5f5',
darken1: '#1e88e5',
darken2: '#1976d2',
darken3: '#1565c0',
darken4: '#0d47a1',
accent1: '#82b1ff',
accent2: '#448aff',
accent3: '#2979ff',
accent4: '#2962ff'
});
const lightBlue = Object.freeze({
base: '#03a9f4',
lighten5: '#e1f5fe',
lighten4: '#b3e5fc',
lighten3: '#81d4fa',
lighten2: '#4fc3f7',
lighten1: '#29b6f6',
darken1: '#039be5',
darken2: '#0288d1',
darken3: '#0277bd',
darken4: '#01579b',
accent1: '#80d8ff',
accent2: '#40c4ff',
accent3: '#00b0ff',
accent4: '#0091ea'
});
const cyan = Object.freeze({
base: '#00bcd4',
lighten5: '#e0f7fa',
lighten4: '#b2ebf2',
lighten3: '#80deea',
lighten2: '#4dd0e1',
lighten1: '#26c6da',
darken1: '#00acc1',
darken2: '#0097a7',
darken3: '#00838f',
darken4: '#006064',
accent1: '#84ffff',
accent2: '#18ffff',
accent3: '#00e5ff',
accent4: '#00b8d4'
});
const teal = Object.freeze({
base: '#009688',
lighten5: '#e0f2f1',
lighten4: '#b2dfdb',
lighten3: '#80cbc4',
lighten2: '#4db6ac',
lighten1: '#26a69a',
darken1: '#00897b',
darken2: '#00796b',
darken3: '#00695c',
darken4: '#004d40',
accent1: '#a7ffeb',
accent2: '#64ffda',
accent3: '#1de9b6',
accent4: '#00bfa5'
});
const green = Object.freeze({
base: '#4caf50',
lighten5: '#e8f5e9',
lighten4: '#c8e6c9',
lighten3: '#a5d6a7',
lighten2: '#81c784',
lighten1: '#66bb6a',
darken1: '#43a047',
darken2: '#388e3c',
darken3: '#2e7d32',
darken4: '#1b5e20',
accent1: '#b9f6ca',
accent2: '#69f0ae',
accent3: '#00e676',
accent4: '#00c853'
});
const lightGreen = Object.freeze({
base: '#8bc34a',
lighten5: '#f1f8e9',
lighten4: '#dcedc8',
lighten3: '#c5e1a5',
lighten2: '#aed581',
lighten1: '#9ccc65',
darken1: '#7cb342',
darken2: '#689f38',
darken3: '#558b2f',
darken4: '#33691e',
accent1: '#ccff90',
accent2: '#b2ff59',
accent3: '#76ff03',
accent4: '#64dd17'
});
const lime = Object.freeze({
base: '#cddc39',
lighten5: '#f9fbe7',
lighten4: '#f0f4c3',
lighten3: '#e6ee9c',
lighten2: '#dce775',
lighten1: '#d4e157',
darken1: '#c0ca33',
darken2: '#afb42b',
darken3: '#9e9d24',
darken4: '#827717',
accent1: '#f4ff81',
accent2: '#eeff41',
accent3: '#c6ff00',
accent4: '#aeea00'
});
const yellow = Object.freeze({
base: '#ffeb3b',
lighten5: '#fffde7',
lighten4: '#fff9c4',
lighten3: '#fff59d',
lighten2: '#fff176',
lighten1: '#ffee58',
darken1: '#fdd835',
darken2: '#fbc02d',
darken3: '#f9a825',
darken4: '#f57f17',
accent1: '#ffff8d',
accent2: '#ffff00',
accent3: '#ffea00',
accent4: '#ffd600'
});
const amber = Object.freeze({
base: '#ffc107',
lighten5: '#fff8e1',
lighten4: '#ffecb3',
lighten3: '#ffe082',
lighten2: '#ffd54f',
lighten1: '#ffca28',
darken1: '#ffb300',
darken2: '#ffa000',
darken3: '#ff8f00',
darken4: '#ff6f00',
accent1: '#ffe57f',
accent2: '#ffd740',
accent3: '#ffc400',
accent4: '#ffab00'
});
const orange = Object.freeze({
base: '#ff9800',
lighten5: '#fff3e0',
lighten4: '#ffe0b2',
lighten3: '#ffcc80',
lighten2: '#ffb74d',
lighten1: '#ffa726',
darken1: '#fb8c00',
darken2: '#f57c00',
darken3: '#ef6c00',
darken4: '#e65100',
accent1: '#ffd180',
accent2: '#ffab40',
accent3: '#ff9100',
accent4: '#ff6d00'
});
const deepOrange = Object.freeze({
base: '#ff5722',
lighten5: '#fbe9e7',
lighten4: '#ffccbc',
lighten3: '#ffab91',
lighten2: '#ff8a65',
lighten1: '#ff7043',
darken1: '#f4511e',
darken2: '#e64a19',
darken3: '#d84315',
darken4: '#bf360c',
accent1: '#ff9e80',
accent2: '#ff6e40',
accent3: '#ff3d00',
accent4: '#dd2c00'
});
const brown = Object.freeze({
base: '#795548',
lighten5: '#efebe9',
lighten4: '#d7ccc8',
lighten3: '#bcaaa4',
lighten2: '#a1887f',
lighten1: '#8d6e63',
darken1: '#6d4c41',
darken2: '#5d4037',
darken3: '#4e342e',
darken4: '#3e2723'
});
const blueGrey = Object.freeze({
base: '#607d8b',
lighten5: '#eceff1',
lighten4: '#cfd8dc',
lighten3: '#b0bec5',
lighten2: '#90a4ae',
lighten1: '#78909c',
darken1: '#546e7a',
darken2: '#455a64',
darken3: '#37474f',
darken4: '#263238'
});
const grey = Object.freeze({
base: '#9e9e9e',
lighten5: '#fafafa',
lighten4: '#f5f5f5',
lighten3: '#eeeeee',
lighten2: '#e0e0e0',
lighten1: '#bdbdbd',
darken1: '#757575',
darken2: '#616161',
darken3: '#424242',
darken4: '#212121'
});
const shades = Object.freeze({
black: '#000000',
white: '#ffffff',
transparent: 'transparent'
});
export default Object.freeze({
red,
pink,
purple,
deepPurple,
indigo,
blue,
lightBlue,
cyan,
teal,
green,
lightGreen,
lime,
yellow,
amber,
orange,
deepOrange,
brown,
blueGrey,
grey,
shades
});
//# sourceMappingURL=colors.js.map
+1
View File
File diff suppressed because one or more lines are too long
+4
View File
@@ -0,0 +1,4 @@
export default function component(options) {
return options;
}
//# sourceMappingURL=component.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../src/util/component.ts"],"names":[],"mappings":"AAkBA,eAAc,SAAU,SAAV,CAAwB,OAAxB,EAAkC;AAC9C,SAAO,OAAP;AACD","sourcesContent":["/* eslint-disable max-len, import/export */\nimport {\n ComponentOptions,\n RecordPropsDefinition,\n ThisTypedComponentOptionsWithArrayProps,\n ThisTypedComponentOptionsWithRecordProps,\n} from 'vue/types/options'\nimport { Vue } from 'vue/types/vue'\nimport { FunctionalComponentOptions } from 'vue'\n\ntype V = Vue\n\n// Maybe don't actually use this, it doesn't work very well\nexport default function component<Data, Methods, Computed, PropNames extends string = never> (options?: ThisTypedComponentOptionsWithArrayProps<V, Data, Methods, Computed, PropNames>): ThisTypedComponentOptionsWithArrayProps<V, Data, Methods, Computed, PropNames>\nexport default function component<Data, Methods, Computed, Props> (options?: ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>): ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>\nexport default function component<PropNames extends string = never> (definition: FunctionalComponentOptions<Record<PropNames, any>, PropNames[]>): FunctionalComponentOptions<Record<PropNames, any>, PropNames[]>\nexport default function component<Props> (definition: FunctionalComponentOptions<Props, RecordPropsDefinition<Props>>): FunctionalComponentOptions<Props, RecordPropsDefinition<Props>>\nexport default function component (options?: ComponentOptions<V>): ComponentOptions<V>\nexport default function component<T> (options: T): T {\n return options\n}\n"],"sourceRoot":"","file":"component.js"}
+98
View File
@@ -0,0 +1,98 @@
import Vuetify from '../framework';
function createMessage(message, vm, parent) {
if (Vuetify.config.silent) return;
if (parent) {
vm = {
_isVue: true,
$parent: parent,
$options: vm
};
}
if (vm) {
// Only show each message once per instance
vm.$_alreadyWarned = vm.$_alreadyWarned || [];
if (vm.$_alreadyWarned.includes(message)) return;
vm.$_alreadyWarned.push(message);
}
return `[Vuetify] ${message}` + (vm ? generateComponentTrace(vm) : '');
}
export function consoleInfo(message, vm, parent) {
const newMessage = createMessage(message, vm, parent);
newMessage != null && console.info(newMessage);
}
export function consoleWarn(message, vm, parent) {
const newMessage = createMessage(message, vm, parent);
newMessage != null && console.warn(newMessage);
}
export function consoleError(message, vm, parent) {
const newMessage = createMessage(message, vm, parent);
newMessage != null && console.error(newMessage);
}
export function deprecate(original, replacement, vm, parent) {
consoleWarn(`[UPGRADE] '${original}' is deprecated, use '${replacement}' instead.`, vm, parent);
}
export function breaking(original, replacement, vm, parent) {
consoleError(`[BREAKING] '${original}' has been removed, use '${replacement}' instead. For more information, see the upgrade guide https://github.com/vuetifyjs/vuetify/releases/tag/v2.0.0#user-content-upgrade-guide`, vm, parent);
}
export function removed(original, vm, parent) {
consoleWarn(`[REMOVED] '${original}' has been removed. You can safely omit it.`, vm, parent);
}
/**
* Shamelessly stolen from vuejs/vue/blob/dev/src/core/util/debug.js
*/
const classifyRE = /(?:^|[-_])(\w)/g;
const classify = str => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, '');
function formatComponentName(vm, includeFile) {
if (vm.$root === vm) {
return '<Root>';
}
const options = typeof vm === 'function' && vm.cid != null ? vm.options : vm._isVue ? vm.$options || vm.constructor.options : vm || {};
let name = options.name || options._componentTag;
const file = options.__file;
if (!name && file) {
const match = file.match(/([^/\\]+)\.vue$/);
name = match && match[1];
}
return (name ? `<${classify(name)}>` : `<Anonymous>`) + (file && includeFile !== false ? ` at ${file}` : '');
}
function generateComponentTrace(vm) {
if (vm._isVue && vm.$parent) {
const tree = [];
let currentRecursiveSequence = 0;
while (vm) {
if (tree.length > 0) {
const last = tree[tree.length - 1];
if (last.constructor === vm.constructor) {
currentRecursiveSequence++;
vm = vm.$parent;
continue;
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence];
currentRecursiveSequence = 0;
}
}
tree.push(vm);
vm = vm.$parent;
}
return '\n\nfound in\n\n' + tree.map((vm, i) => `${i === 0 ? '---> ' : ' '.repeat(5 + i * 2)}${Array.isArray(vm) ? `${formatComponentName(vm[0])}... (${vm[1]} recursive calls)` : formatComponentName(vm)}`).join('\n');
} else {
return `\n\n(found in ${formatComponentName(vm)})`;
}
}
//# sourceMappingURL=console.js.map
+1
View File
File diff suppressed because one or more lines are too long
+55
View File
@@ -0,0 +1,55 @@
function createUTCDate(year, month = 0, day = 1) {
let date;
if (year < 100 && year >= 0) {
date = new Date(Date.UTC(year, month, day));
if (isFinite(date.getUTCFullYear())) {
date.setUTCFullYear(year);
}
} else {
date = new Date(Date.UTC(year, month, day));
}
return date;
}
function firstWeekOffset(year, firstDayOfWeek, firstDayOfYear) {
const firstWeekDayInFirstWeek = 7 + firstDayOfWeek - firstDayOfYear;
const firstWeekDayOfYear = (7 + createUTCDate(year, 0, firstWeekDayInFirstWeek).getUTCDay() - firstDayOfWeek) % 7;
return -firstWeekDayOfYear + firstWeekDayInFirstWeek - 1;
}
function dayOfYear(year, month, day, firstDayOfWeek) {
let dayOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][month];
if (month > 1 && isLeapYear(year)) {
dayOfYear++;
}
return dayOfYear + day;
}
function weeksInYear(year, firstDayOfWeek, firstDayOfYear) {
const weekOffset = firstWeekOffset(year, firstDayOfWeek, firstDayOfYear);
const weekOffsetNext = firstWeekOffset(year + 1, firstDayOfWeek, firstDayOfYear);
const daysInYear = isLeapYear(year) ? 366 : 365;
return (daysInYear - weekOffset + weekOffsetNext) / 7;
}
export function weekNumber(year, month, day, firstDayOfWeek, localeFirstDayOfYear) {
const weekOffset = firstWeekOffset(year, firstDayOfWeek, localeFirstDayOfYear);
const week = Math.ceil((dayOfYear(year, month, day, firstDayOfWeek) - weekOffset) / 7);
if (week < 1) {
return week + weeksInYear(year - 1, firstDayOfWeek, localeFirstDayOfYear);
} else if (week > weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)) {
return week - weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear);
} else {
return week;
}
}
export function isLeapYear(year) {
return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
}
//# sourceMappingURL=dateTimeUtils.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../src/util/dateTimeUtils.ts"],"names":[],"mappings":"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","sourcesContent":["function createUTCDate (year: number, month = 0, day = 1) {\n let date\n if (year < 100 && year >= 0) {\n date = new Date(Date.UTC(year, month, day))\n if (isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(year)\n }\n } else {\n date = new Date(Date.UTC(year, month, day))\n }\n\n return date\n}\n\nfunction firstWeekOffset (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const firstWeekDayInFirstWeek = 7 + firstDayOfWeek - firstDayOfYear\n const firstWeekDayOfYear = (7 + createUTCDate(year, 0, firstWeekDayInFirstWeek).getUTCDay() - firstDayOfWeek) % 7\n\n return -firstWeekDayOfYear + firstWeekDayInFirstWeek - 1\n}\n\nfunction dayOfYear (year: number, month: number, day: number, firstDayOfWeek: number) {\n let dayOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][month]\n if (month > 1 && isLeapYear(year)) {\n dayOfYear++\n }\n\n return dayOfYear + day\n}\n\nfunction weeksInYear (year: number, firstDayOfWeek: number, firstDayOfYear: number) {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, firstDayOfYear)\n const weekOffsetNext = firstWeekOffset(year + 1, firstDayOfWeek, firstDayOfYear)\n const daysInYear = isLeapYear(year) ? 366 : 365\n\n return (daysInYear - weekOffset + weekOffsetNext) / 7\n}\n\nexport function weekNumber (year: number, month: number, day: number, firstDayOfWeek: number, localeFirstDayOfYear: number): number {\n const weekOffset = firstWeekOffset(year, firstDayOfWeek, localeFirstDayOfYear)\n const week = Math.ceil((dayOfYear(year, month, day, firstDayOfWeek) - weekOffset) / 7)\n\n if (week < 1) {\n return week + weeksInYear(year - 1, firstDayOfWeek, localeFirstDayOfYear)\n } else if (week > weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)) {\n return week - weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)\n } else {\n return week\n }\n}\n\nexport function isLeapYear (year: number): boolean {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)\n}\n"],"sourceRoot":"","file":"dateTimeUtils.js"}
+17
View File
@@ -0,0 +1,17 @@
/**
* Removes duplicate `@input` listeners when
* using v-model with functional components
*
* @see https://github.com/vuetifyjs/vuetify/issues/4460
*/
export default function dedupeModelListeners(data) {
if (data.model && data.on && data.on.input) {
if (Array.isArray(data.on.input)) {
const i = data.on.input.indexOf(data.model.callback);
if (i > -1) data.on.input.splice(i, 1);
} else {
delete data.on.input;
}
}
}
//# sourceMappingURL=dedupeModelListeners.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../src/util/dedupeModelListeners.ts"],"names":[],"mappings":"AAEA;;;;;;AAMA,eAAc,SAAU,oBAAV,CAAgC,IAAhC,EAA+C;AAC3D,MAAI,IAAI,CAAC,KAAL,IAAc,IAAI,CAAC,EAAnB,IAAyB,IAAI,CAAC,EAAL,CAAQ,KAArC,EAA4C;AAC1C,QAAI,KAAK,CAAC,OAAN,CAAc,IAAI,CAAC,EAAL,CAAQ,KAAtB,CAAJ,EAAkC;AAChC,YAAM,CAAC,GAAG,IAAI,CAAC,EAAL,CAAQ,KAAR,CAAc,OAAd,CAAsB,IAAI,CAAC,KAAL,CAAW,QAAjC,CAAV;AACA,UAAI,CAAC,GAAG,CAAC,CAAT,EAAY,IAAI,CAAC,EAAL,CAAQ,KAAR,CAAc,MAAd,CAAqB,CAArB,EAAwB,CAAxB;AACb,KAHD,MAGO;AACL,aAAO,IAAI,CAAC,EAAL,CAAQ,KAAf;AACD;AACF;AACF","sourcesContent":["import { VNodeData } from 'vue'\n\n/**\n * Removes duplicate `@input` listeners when\n * using v-model with functional components\n *\n * @see https://github.com/vuetifyjs/vuetify/issues/4460\n */\nexport default function dedupeModelListeners (data: VNodeData): void {\n if (data.model && data.on && data.on.input) {\n if (Array.isArray(data.on.input)) {\n const i = data.on.input.indexOf(data.model.callback)\n if (i > -1) data.on.input.splice(i, 1)\n } else {\n delete data.on.input\n }\n }\n}\n"],"sourceRoot":"","file":"dedupeModelListeners.js"}
+397
View File
@@ -0,0 +1,397 @@
import Vue from 'vue';
export function createSimpleFunctional(c, el = 'div', name) {
return Vue.extend({
name: name || c.replace(/__/g, '-'),
functional: true,
render(h, {
data,
children
}) {
data.staticClass = `${c} ${data.staticClass || ''}`.trim();
return h(el, data, children);
}
});
}
export function directiveConfig(binding, defaults = {}) {
return { ...defaults,
...binding.modifiers,
value: binding.arg,
...(binding.value || {})
};
}
export function addOnceEventListener(el, eventName, cb, options = false) {
var once = event => {
cb(event);
el.removeEventListener(eventName, once, options);
};
el.addEventListener(eventName, once, options);
}
let passiveSupported = false;
try {
if (typeof window !== 'undefined') {
const testListenerOpts = Object.defineProperty({}, 'passive', {
get: () => {
passiveSupported = true;
}
});
window.addEventListener('testListener', testListenerOpts, testListenerOpts);
window.removeEventListener('testListener', testListenerOpts, testListenerOpts);
}
} catch (e) {
console.warn(e);
}
export { passiveSupported };
export function addPassiveEventListener(el, event, cb, options) {
el.addEventListener(event, cb, passiveSupported ? options : false);
}
export function getNestedValue(obj, path, fallback) {
const last = path.length - 1;
if (last < 0) return obj === undefined ? fallback : obj;
for (let i = 0; i < last; i++) {
if (obj == null) {
return fallback;
}
obj = obj[path[i]];
}
if (obj == null) return fallback;
return obj[path[last]] === undefined ? fallback : obj[path[last]];
}
export function deepEqual(a, b) {
if (a === b) return true;
if (a instanceof Date && b instanceof Date) {
// If the values are Date, they were convert to timestamp with getTime and compare it
if (a.getTime() !== b.getTime()) return false;
}
if (a !== Object(a) || b !== Object(b)) {
// If the values aren't objects, they were already checked for equality
return false;
}
const props = Object.keys(a);
if (props.length !== Object.keys(b).length) {
// Different number of props, don't bother to check
return false;
}
return props.every(p => deepEqual(a[p], b[p]));
}
export function getObjectValueByPath(obj, path, fallback) {
// credit: http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key#comment55278413_6491621
if (obj == null || !path || typeof path !== 'string') return fallback;
if (obj[path] !== undefined) return obj[path];
path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
path = path.replace(/^\./, ''); // strip a leading dot
return getNestedValue(obj, path.split('.'), fallback);
}
export function getPropertyFromItem(item, property, fallback) {
if (property == null) return item === undefined ? fallback : item;
if (item !== Object(item)) return fallback === undefined ? item : fallback;
if (typeof property === 'string') return getObjectValueByPath(item, property, fallback);
if (Array.isArray(property)) return getNestedValue(item, property, fallback);
if (typeof property !== 'function') return fallback;
const value = property(item, fallback);
return typeof value === 'undefined' ? fallback : value;
}
export function createRange(length) {
return Array.from({
length
}, (v, k) => k);
}
export function getZIndex(el) {
if (!el || el.nodeType !== Node.ELEMENT_NODE) return 0;
const index = +window.getComputedStyle(el).getPropertyValue('z-index');
if (!index) return getZIndex(el.parentNode);
return index;
}
const tagsToReplace = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;'
};
export function escapeHTML(str) {
return str.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
}
export function filterObjectOnKeys(obj, keys) {
const filtered = {};
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
if (typeof obj[key] !== 'undefined') {
filtered[key] = obj[key];
}
}
return filtered;
}
export function convertToUnit(str, unit = 'px') {
if (str == null || str === '') {
return undefined;
} else if (isNaN(+str)) {
return String(str);
} else {
return `${Number(str)}${unit}`;
}
}
export function kebabCase(str) {
return (str || '').replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
}
export function isObject(obj) {
return obj !== null && typeof obj === 'object';
} // KeyboardEvent.keyCode aliases
export const keyCodes = Object.freeze({
enter: 13,
tab: 9,
delete: 46,
esc: 27,
space: 32,
up: 38,
down: 40,
left: 37,
right: 39,
end: 35,
home: 36,
del: 46,
backspace: 8,
insert: 45,
pageup: 33,
pagedown: 34
}); // This remaps internal names like '$cancel' or '$vuetify.icons.cancel'
// to the current name or component for that icon.
export function remapInternalIcon(vm, iconName) {
if (!iconName.startsWith('$')) {
return iconName;
} // Get the target icon name
const iconPath = `$vuetify.icons.values.${iconName.split('$').pop().split('.').pop()}`; // Now look up icon indirection name,
// e.g. '$vuetify.icons.values.cancel'
return getObjectValueByPath(vm, iconPath, iconName);
}
export function keys(o) {
return Object.keys(o);
}
/**
* Camelize a hyphen-delimited string.
*/
const camelizeRE = /-(\w)/g;
export const camelize = str => {
return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '');
};
/**
* Returns the set difference of B and A, i.e. the set of elements in B but not in A
*/
export function arrayDiff(a, b) {
const diff = [];
for (let i = 0; i < b.length; i++) {
if (a.indexOf(b[i]) < 0) diff.push(b[i]);
}
return diff;
}
/**
* Makes the first character of a string uppercase
*/
export function upperFirst(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
export function groupItems(items, groupBy, groupDesc) {
const key = groupBy[0];
const groups = [];
let current = null;
for (var i = 0; i < items.length; i++) {
const item = items[i];
const val = getObjectValueByPath(item, key);
if (current !== val) {
current = val;
groups.push({
name: val,
items: []
});
}
groups[groups.length - 1].items.push(item);
}
return groups;
}
export function wrapInArray(v) {
return v != null ? Array.isArray(v) ? v : [v] : [];
}
export function sortItems(items, sortBy, sortDesc, locale, customSorters) {
if (sortBy === null || !sortBy.length) return items;
const stringCollator = new Intl.Collator(locale, {
sensitivity: 'accent',
usage: 'sort'
});
return items.sort((a, b) => {
for (let i = 0; i < sortBy.length; i++) {
const sortKey = sortBy[i];
let sortA = getObjectValueByPath(a, sortKey);
let sortB = getObjectValueByPath(b, sortKey);
if (sortDesc[i]) {
[sortA, sortB] = [sortB, sortA];
}
if (customSorters && customSorters[sortKey]) {
const customResult = customSorters[sortKey](sortA, sortB);
if (!customResult) continue;
return customResult;
} // Check if both cannot be evaluated
if (sortA === null && sortB === null) {
continue;
}
[sortA, sortB] = [sortA, sortB].map(s => (s || '').toString().toLocaleLowerCase());
if (sortA !== sortB) {
if (!isNaN(sortA) && !isNaN(sortB)) return Number(sortA) - Number(sortB);
return stringCollator.compare(sortA, sortB);
}
}
return 0;
});
}
export function defaultFilter(value, search, item) {
return value != null && search != null && typeof value !== 'boolean' && value.toString().toLocaleLowerCase().indexOf(search.toLocaleLowerCase()) !== -1;
}
export function searchItems(items, search) {
if (!search) return items;
search = search.toString().toLowerCase();
if (search.trim() === '') return items;
return items.filter(item => Object.keys(item).some(key => defaultFilter(getObjectValueByPath(item, key), search, item)));
}
/**
* Returns:
* - 'normal' for old style slots - `<template slot="default">`
* - 'scoped' for old style scoped slots (`<template slot="default" slot-scope="data">`) or bound v-slot (`#default="data"`)
* - 'v-slot' for unbound v-slot (`#default`) - only if the third param is true, otherwise counts as scoped
*/
export function getSlotType(vm, name, split) {
if (vm.$slots[name] && vm.$scopedSlots[name] && vm.$scopedSlots[name].name) {
return split ? 'v-slot' : 'scoped';
}
if (vm.$slots[name]) return 'normal';
if (vm.$scopedSlots[name]) return 'scoped';
}
export function debounce(fn, delay) {
let timeoutId = 0;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => fn(...args), delay);
};
}
export function throttle(fn, limit) {
let throttling = false;
return (...args) => {
if (!throttling) {
throttling = true;
setTimeout(() => throttling = false, limit);
return fn(...args);
}
};
}
export function getPrefixedScopedSlots(prefix, scopedSlots) {
return Object.keys(scopedSlots).filter(k => k.startsWith(prefix)).reduce((obj, k) => {
obj[k.replace(prefix, '')] = scopedSlots[k];
return obj;
}, {});
}
export function getSlot(vm, name = 'default', data, optional = false) {
if (vm.$scopedSlots[name]) {
return vm.$scopedSlots[name](data instanceof Function ? data() : data);
} else if (vm.$slots[name] && (!data || optional)) {
return vm.$slots[name];
}
return undefined;
}
export function clamp(value, min = 0, max = 1) {
return Math.max(min, Math.min(max, value));
}
export function padEnd(str, length, char = '0') {
return str + char.repeat(Math.max(0, length - str.length));
}
export function chunk(str, size = 1) {
const chunked = [];
let index = 0;
while (index < str.length) {
chunked.push(str.substr(index, size));
index += size;
}
return chunked;
}
export function humanReadableFileSize(bytes, binary = false) {
const base = binary ? 1024 : 1000;
if (bytes < base) {
return `${bytes} B`;
}
const prefix = binary ? ['Ki', 'Mi', 'Gi'] : ['k', 'M', 'G'];
let unit = -1;
while (Math.abs(bytes) >= base && unit < prefix.length - 1) {
bytes /= base;
++unit;
}
return `${bytes.toFixed(1)} ${prefix[unit]}B`;
}
export function camelizeObjectKeys(obj) {
if (!obj) return {};
return Object.keys(obj).reduce((o, key) => {
o[camelize(key)] = obj[key];
return o;
}, {});
}
export function mergeDeep(source = {}, target = {}) {
for (const key in target) {
const sourceProperty = source[key];
const targetProperty = target[key]; // Only continue deep merging if
// both properties are objects
if (isObject(sourceProperty) && isObject(targetProperty)) {
source[key] = mergeDeep(sourceProperty, targetProperty);
continue;
}
source[key] = targetProperty;
}
return source;
}
export function fillArray(length, obj) {
return Array(length).fill(obj);
}
//# sourceMappingURL=helpers.js.map
+1
View File
File diff suppressed because one or more lines are too long
+150
View File
@@ -0,0 +1,150 @@
import { camelize, wrapInArray } from './helpers';
const pattern = {
styleList: /;(?![^(]*\))/g,
styleProp: /:(.*)/
};
function parseStyle(style) {
const styleMap = {};
for (const s of style.split(pattern.styleList)) {
let [key, val] = s.split(pattern.styleProp);
key = key.trim();
if (!key) {
continue;
} // May be undefined if the `key: value` pair is incomplete.
if (typeof val === 'string') {
val = val.trim();
}
styleMap[camelize(key)] = val;
}
return styleMap;
}
export default function mergeData() {
const mergeTarget = {};
let i = arguments.length;
let prop; // Allow for variadic argument length.
while (i--) {
// Iterate through the data properties and execute merge strategies
// Object.keys eliminates need for hasOwnProperty call
for (prop of Object.keys(arguments[i])) {
switch (prop) {
// Array merge strategy (array concatenation)
case 'class':
case 'directives':
if (arguments[i][prop]) {
mergeTarget[prop] = mergeClasses(mergeTarget[prop], arguments[i][prop]);
}
break;
case 'style':
if (arguments[i][prop]) {
mergeTarget[prop] = mergeStyles(mergeTarget[prop], arguments[i][prop]);
}
break;
// Space delimited string concatenation strategy
case 'staticClass':
if (!arguments[i][prop]) {
break;
}
if (mergeTarget[prop] === undefined) {
mergeTarget[prop] = '';
}
if (mergeTarget[prop]) {
// Not an empty string, so concatenate
mergeTarget[prop] += ' ';
}
mergeTarget[prop] += arguments[i][prop].trim();
break;
// Object, the properties of which to merge via array merge strategy (array concatenation).
// Callback merge strategy merges callbacks to the beginning of the array,
// so that the last defined callback will be invoked first.
// This is done since to mimic how Object.assign merging
// uses the last given value to assign.
case 'on':
case 'nativeOn':
if (arguments[i][prop]) {
mergeTarget[prop] = mergeListeners(mergeTarget[prop], arguments[i][prop]);
}
break;
// Object merge strategy
case 'attrs':
case 'props':
case 'domProps':
case 'scopedSlots':
case 'staticStyle':
case 'hook':
case 'transition':
if (!arguments[i][prop]) {
break;
}
if (!mergeTarget[prop]) {
mergeTarget[prop] = {};
}
mergeTarget[prop] = { ...arguments[i][prop],
...mergeTarget[prop]
};
break;
// Reassignment strategy (no merge)
default:
// slot, key, ref, tag, show, keepAlive
if (!mergeTarget[prop]) {
mergeTarget[prop] = arguments[i][prop];
}
}
}
}
return mergeTarget;
}
export function mergeStyles(target, source) {
if (!target) return source;
if (!source) return target;
target = wrapInArray(typeof target === 'string' ? parseStyle(target) : target);
return target.concat(typeof source === 'string' ? parseStyle(source) : source);
}
export function mergeClasses(target, source) {
if (!source) return target;
if (!target) return source;
return target ? wrapInArray(target).concat(source) : source;
}
export function mergeListeners(target, source) {
if (!target) return source;
if (!source) return target;
let event;
for (event of Object.keys(source)) {
// Concat function to array of functions if callback present.
if (target[event]) {
// Insert current iteration data in beginning of merged array.
target[event] = wrapInArray(target[event]);
target[event].push(...wrapInArray(source[event]));
} else {
// Straight assign.
target[event] = source[event];
}
}
return target;
}
//# sourceMappingURL=mergeData.js.map
File diff suppressed because one or more lines are too long
+8
View File
@@ -0,0 +1,8 @@
/* eslint-disable max-len, import/export, no-use-before-define */
import Vue from 'vue';
export default function mixins(...args) {
return Vue.extend({
mixins: args
});
}
//# sourceMappingURL=mixins.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../src/util/mixins.ts"],"names":[],"mappings":"AAAA;AACA,OAAO,GAAP,MAAoC,KAApC;AAIA,eAAc,SAAU,MAAV,CAAkB,GAAG,IAArB,EAA2C;AACvD,SAAO,GAAG,CAAC,MAAJ,CAAW;AAAE,IAAA,MAAM,EAAE;AAAV,GAAX,CAAP;AACD","sourcesContent":["/* eslint-disable max-len, import/export, no-use-before-define */\nimport Vue, { VueConstructor } from 'vue'\n\nexport default function mixins<T extends VueConstructor[]> (...args: T): ExtractVue<T> extends infer V ? V extends Vue ? VueConstructor<V> : never : never\nexport default function mixins<T extends Vue> (...args: VueConstructor[]): VueConstructor<T>\nexport default function mixins (...args: VueConstructor[]): VueConstructor {\n return Vue.extend({ mixins: args })\n}\n\n/**\n * Returns the instance type from a VueConstructor\n * Useful for adding types when using mixins().extend()\n */\nexport type ExtractVue<T extends VueConstructor | VueConstructor[]> = T extends (infer U)[]\n ? UnionToIntersection<\n U extends VueConstructor<infer V> ? V : never\n >\n : T extends VueConstructor<infer V> ? V : never\n\ntype UnionToIntersection<U> =\n (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never\n"],"sourceRoot":"","file":"mixins.js"}
+14
View File
@@ -0,0 +1,14 @@
export default function rebuildFunctionalSlots(slots, h) {
const children = [];
for (const slot in slots) {
if (slots.hasOwnProperty(slot)) {
children.push(h('template', {
slot
}, slots[slot]));
}
}
return children;
}
//# sourceMappingURL=rebuildFunctionalSlots.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../../src/util/rebuildFunctionalSlots.ts"],"names":[],"mappings":"AAEA,eAAc,SAAU,sBAAV,CAAkC,KAAlC,EAAiF,CAAjF,EAAiG;AAC7G,QAAM,QAAQ,GAAY,EAA1B;;AAEA,OAAK,MAAM,IAAX,IAAmB,KAAnB,EAA0B;AACxB,QAAI,KAAK,CAAC,cAAN,CAAqB,IAArB,CAAJ,EAAgC;AAC9B,MAAA,QAAQ,CAAC,IAAT,CAAc,CAAC,CAAC,UAAD,EAAa;AAAE,QAAA;AAAF,OAAb,EAAuB,KAAK,CAAC,IAAD,CAA5B,CAAf;AACD;AACF;;AAED,SAAO,QAAP;AACD","sourcesContent":["import { CreateElement, VNode } from 'vue'\n\nexport default function rebuildFunctionalSlots (slots: { [key: string]: VNode[] | undefined }, h: CreateElement) {\n const children: VNode[] = []\n\n for (const slot in slots) {\n if (slots.hasOwnProperty(slot)) {\n children.push(h('template', { slot }, slots[slot]))\n }\n }\n\n return children\n}\n"],"sourceRoot":"","file":"rebuildFunctionalSlots.js"}