@acrodata/gradient-picker
Version:
A powerful and beautiful gradient picker.
115 lines • 15.2 kB
JavaScript
export function split(input, separator = ',') {
const result = [];
let l = 0;
let parentCount = 0;
separator = new RegExp(separator);
for (let i = 0; i < input.length; i++) {
if (input[i] === '(') {
parentCount++;
}
else if (input[i] === ')') {
parentCount--;
}
if (parentCount === 0 && separator.test(input[i])) {
result.push(input.slice(l, i).trim());
l = i + 1;
}
}
result.push(input.slice(l).trim());
return result;
}
export function resolveStops(v) {
const stops = [];
for (let i = 0, n = v.length; i < n; i++) {
const [color, offset, offset2] = split(v[i], /\s+/);
if (isHint(v[i])) {
stops.push({
color: '',
offset: resolveLength(v[i]),
hint: resolveLength(v[i]),
});
}
else {
stops.push({
color,
offset: resolveLength(offset),
});
if (offset2) {
stops.push({
color,
offset: resolveLength(offset2),
});
}
}
}
return stops;
}
const REGEX = /^(-?\d*\.?\d*)(%|vw|vh|px|em|rem|deg|rad|grad|turn|ch|vmin|vmax)?$/;
function isHint(v) {
return REGEX.test(v);
}
export function resolveLength(v) {
if (!v)
return undefined;
const [, value, unit] = v.trim().match(REGEX) || [];
return { value: Number(value), unit: unit ?? 'px' };
}
const positionKeyword = new Set(['center', 'left', 'top', 'right', 'bottom']);
function isPositionKeyword(v) {
return positionKeyword.has(v) || isNaN(parseFloat(v));
}
function extendPosition(v) {
const res = Array(2).fill('');
for (let i = 0; i < 2; i++) {
// If the x position is the length, the y position should also be the length
// at 100% => at 100% 50%
if (!v[i])
res[i] = i == 0 || isPositionKeyword(v[i - 1]) ? 'center' : '50%';
else
res[i] = v[i];
}
return res;
}
export function resolvePosition(v = '') {
let posArr = extendPosition(v.split(' ').filter(v => v));
// Correct the positions of x and y
// top center => center top
// center left => left center
if (['top', 'bottom'].includes(posArr[0]) || ['left', 'right'].includes(posArr[1])) {
posArr = posArr.reverse();
}
const position = {
x: { type: 'keyword', value: 'center' },
y: { type: 'keyword', value: 'center' },
};
position.x = isPositionKeyword(posArr[0])
? { type: 'keyword', value: posArr[0] }
: { type: 'length', value: posArr[0] };
position.y = isPositionKeyword(posArr[1])
? { type: 'keyword', value: posArr[1] }
: { type: 'length', value: posArr[1] };
return position;
}
export function splitByColorInterp(input) {
const regex = /\bin\s+([a-z0-9-]+(?:\s+(?:shorter|longer|increasing|decreasing)\s+hue)?)\b/i;
const match = input.match(regex);
if (!match) {
return [input];
}
// match[0]: in color interpolation method
const matchedStr = match[0];
// match[1]: color interpolation method
const colorInterpMethod = match[1];
const parts = input.split(matchedStr);
const remainingStr = (parts[0] + parts[1]).trim();
return [remainingStr, colorInterpMethod];
}
// https://developer.mozilla.org/en-US/docs/Web/CSS/color-interpolation-method
export function resolveColorInterp(input) {
const [space, ...method] = input.split(' ');
return {
space: space,
method: method.length > 0 ? method.join(' ') : undefined,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncmFkaWVudC1waWNrZXIvc3JjL2xpYi9wYXJzZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsWUFBNkIsR0FBRztJQUNuRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM1QixXQUFXLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxXQUFXLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRW5D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QU0sRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTRCLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDckYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2xvcixcbiAgQ29sb3JTdG9wLFxuICBIdWVJbnRlcnBvbGF0aW9uTWV0aG9kLFxuICBQb3NpdGlvbktleXdvcmQsXG4gIFBvc2l0aW9uUHJvcGVydHlWYWx1ZSxcbn0gZnJvbSAnLi90eXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0KGlucHV0OiBzdHJpbmcsIHNlcGFyYXRvcjogc3RyaW5nIHwgUmVnRXhwID0gJywnKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgbGV0IGwgPSAwO1xuICBsZXQgcGFyZW50Q291bnQgPSAwO1xuICBzZXBhcmF0b3IgPSBuZXcgUmVnRXhwKHNlcGFyYXRvcik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpbnB1dFtpXSA9PT0gJygnKSB7XG4gICAgICBwYXJlbnRDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRbaV0gPT09ICcpJykge1xuICAgICAgcGFyZW50Q291bnQtLTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Q291bnQgPT09IDAgJiYgc2VwYXJhdG9yLnRlc3QoaW5wdXRbaV0pKSB7XG4gICAgICByZXN1bHQucHVzaChpbnB1dC5zbGljZShsLCBpKS50cmltKCkpO1xuICAgICAgbCA9IGkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIHJlc3VsdC5wdXNoKGlucHV0LnNsaWNlKGwpLnRyaW0oKSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTdG9wcyh2OiBzdHJpbmdbXSk6IENvbG9yU3RvcFtdIHtcbiAgY29uc3Qgc3RvcHM6IENvbG9yU3RvcFtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDAsIG4gPSB2Lmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IFtjb2xvciwgb2Zmc2V0LCBvZmZzZXQyXSA9IHNwbGl0KHZbaV0sIC9cXHMrLyk7XG5cbiAgICBpZiAoaXNIaW50KHZbaV0pKSB7XG4gICAgICBzdG9wcy5wdXNoKHtcbiAgICAgICAgY29sb3I6ICcnLFxuICAgICAgICBvZmZzZXQ6IHJlc29sdmVMZW5ndGgodltpXSksXG4gICAgICAgIGhpbnQ6IHJlc29sdmVMZW5ndGgodltpXSksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcHMucHVzaCh7XG4gICAgICAgIGNvbG9yLFxuICAgICAgICBvZmZzZXQ6IHJlc29sdmVMZW5ndGgob2Zmc2V0KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob2Zmc2V0Mikge1xuICAgICAgICBzdG9wcy5wdXNoKHtcbiAgICAgICAgICBjb2xvcixcbiAgICAgICAgICBvZmZzZXQ6IHJlc29sdmVMZW5ndGgob2Zmc2V0MiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdG9wcztcbn1cblxuY29uc3QgUkVHRVggPSAvXigtP1xcZCpcXC4/XFxkKikoJXx2d3x2aHxweHxlbXxyZW18ZGVnfHJhZHxncmFkfHR1cm58Y2h8dm1pbnx2bWF4KT8kLztcblxuZnVuY3Rpb24gaXNIaW50KHY6IHN0cmluZykge1xuICByZXR1cm4gUkVHRVgudGVzdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMZW5ndGgodj86IHN0cmluZykge1xuICBpZiAoIXYpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gdi50cmltKCkubWF0Y2goUkVHRVgpIHx8IFtdO1xuXG4gIHJldHVybiB7IHZhbHVlOiBOdW1iZXIodmFsdWUpLCB1bml0OiB1bml0ID8/ICdweCcgfTtcbn1cblxuY29uc3QgcG9zaXRpb25LZXl3b3JkID0gbmV3IFNldDxQb3NpdGlvbktleXdvcmQ+KFsnY2VudGVyJywgJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbSddKTtcblxuZnVuY3Rpb24gaXNQb3NpdGlvbktleXdvcmQodjogYW55KTogdiBpcyBQb3NpdGlvbktleXdvcmQge1xuICByZXR1cm4gcG9zaXRpb25LZXl3b3JkLmhhcyh2KSB8fCBpc05hTihwYXJzZUZsb2F0KHYpKTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kUG9zaXRpb24odjogc3RyaW5nW10pIHtcbiAgY29uc3QgcmVzOiBzdHJpbmdbXSA9IEFycmF5KDIpLmZpbGwoJycpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgIC8vIElmIHRoZSB4IHBvc2l0aW9uIGlzIHRoZSBsZW5ndGgsIHRoZSB5IHBvc2l0aW9uIHNob3VsZCBhbHNvIGJlIHRoZSBsZW5ndGhcbiAgICAvLyBhdCAxMDAlID0+IGF0IDEwMCUgNTAlXG4gICAgaWYgKCF2W2ldKSByZXNbaV0gPSBpID09IDAgfHwgaXNQb3NpdGlvbktleXdvcmQodltpIC0gMV0pID8gJ2NlbnRlcicgOiAnNTAlJztcbiAgICBlbHNlIHJlc1tpXSA9IHZbaV07XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBvc2l0aW9uKHYgPSAnJykge1xuICBsZXQgcG9zQXJyID0gZXh0ZW5kUG9zaXRpb24odi5zcGxpdCgnICcpLmZpbHRlcih2ID0+IHYpKTtcbiAgLy8gQ29ycmVjdCB0aGUgcG9zaXRpb25zIG9mIHggYW5kIHlcbiAgLy8gdG9wIGNlbnRlciA9PiBjZW50ZXIgdG9wXG4gIC8vIGNlbnRlciBsZWZ0ID0+IGxlZnQgY2VudGVyXG4gIGlmIChbJ3RvcCcsICdib3R0b20nXS5pbmNsdWRlcyhwb3NBcnJbMF0pIHx8IFsnbGVmdCcsICdyaWdodCddLmluY2x1ZGVzKHBvc0FyclsxXSkpIHtcbiAgICBwb3NBcnIgPSBwb3NBcnIucmV2ZXJzZSgpO1xuICB9XG5cbiAgY29uc3QgcG9zaXRpb246IHtcbiAgICB4OiBQb3NpdGlvblByb3BlcnR5VmFsdWU7XG4gICAgeTogUG9zaXRpb25Qcm9wZXJ0eVZhbHVlO1xuICB9ID0ge1xuICAgIHg6IHsgdHlwZTogJ2tleXdvcmQnLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICB5OiB7IHR5cGU6ICdrZXl3b3JkJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gIH07XG5cbiAgcG9zaXRpb24ueCA9IGlzUG9zaXRpb25LZXl3b3JkKHBvc0FyclswXSlcbiAgICA/IHsgdHlwZTogJ2tleXdvcmQnLCB2YWx1ZTogcG9zQXJyWzBdIH1cbiAgICA6IHsgdHlwZTogJ2xlbmd0aCcsIHZhbHVlOiBwb3NBcnJbMF0gfTtcblxuICBwb3NpdGlvbi55ID0gaXNQb3NpdGlvbktleXdvcmQocG9zQXJyWzFdKVxuICAgID8geyB0eXBlOiAna2V5d29yZCcsIHZhbHVlOiBwb3NBcnJbMV0gfVxuICAgIDogeyB0eXBlOiAnbGVuZ3RoJywgdmFsdWU6IHBvc0FyclsxXSB9O1xuXG4gIHJldHVybiBwb3NpdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QnlDb2xvckludGVycChpbnB1dDogc3RyaW5nKSB7XG4gIGNvbnN0IHJlZ2V4ID0gL1xcYmluXFxzKyhbYS16MC05LV0rKD86XFxzKyg/OnNob3J0ZXJ8bG9uZ2VyfGluY3JlYXNpbmd8ZGVjcmVhc2luZylcXHMraHVlKT8pXFxiL2k7XG5cbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChyZWdleCk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiAgLy8gbWF0Y2hbMF06IGluIGNvbG9yIGludGVycG9sYXRpb24gbWV0aG9kXG4gIGNvbnN0IG1hdGNoZWRTdHIgPSBtYXRjaFswXTtcbiAgLy8gbWF0Y2hbMV06IGNvbG9yIGludGVycG9sYXRpb24gbWV0aG9kXG4gIGNvbnN0IGNvbG9ySW50ZXJwTWV0aG9kID0gbWF0Y2hbMV07XG5cbiAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdChtYXRjaGVkU3RyKTtcbiAgY29uc3QgcmVtYWluaW5nU3RyID0gKHBhcnRzWzBdICsgcGFydHNbMV0pLnRyaW0oKTtcblxuICByZXR1cm4gW3JlbWFpbmluZ1N0ciwgY29sb3JJbnRlcnBNZXRob2RdO1xufVxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvY29sb3ItaW50ZXJwb2xhdGlvbi1tZXRob2RcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29sb3JJbnRlcnAoaW5wdXQ6IHN0cmluZyk6IENvbG9yIHtcbiAgY29uc3QgW3NwYWNlLCAuLi5tZXRob2RdID0gaW5wdXQuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICBzcGFjZTogc3BhY2UgYXMgQ29sb3JbJ3NwYWNlJ10sXG4gICAgbWV0aG9kOiBtZXRob2QubGVuZ3RoID4gMCA/IChtZXRob2Quam9pbignICcpIGFzIEh1ZUludGVycG9sYXRpb25NZXRob2QpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuIl19