@alegendstale/holly-components
Version:
Reusable UI components created using lit
110 lines (109 loc) • 3.92 kB
JavaScript
import { isColorValid, parseUrl, pluginToPaletteSettings } from "../../utils/basicUtils.js";
export var Direction;
(function (Direction) {
Direction["Row"] = "row";
Direction["Column"] = "column";
})(Direction || (Direction = {}));
export var AliasMode;
(function (AliasMode) {
AliasMode["Both"] = "Both";
AliasMode["Alias"] = "Prefer Alias";
})(AliasMode || (AliasMode = {}));
export var CopyFormat;
(function (CopyFormat) {
CopyFormat["Raw"] = "Raw";
CopyFormat["Value"] = "Value";
})(CopyFormat || (CopyFormat = {}));
export const defaultSettings = {
noticeDuration: 10000,
errorPulse: true,
aliasMode: AliasMode.Both,
corners: true,
stabilizeWhileEditing: true,
reloadDelay: 5,
copyFormat: CopyFormat.Raw,
height: 150,
width: 700,
direction: Direction.Column,
gradient: false,
preventHover: false,
hideText: false,
override: false
};
export var Status;
(function (Status) {
Status["VALID"] = "Valid";
Status["INVALID_COLORS"] = "Invalid Colors";
Status["INVALID_SETTINGS"] = "Invalid Settings";
Status["INVALID_COLORS_AND_SETTINGS"] = "Invalid Colors & Settings";
Status["INVALID_GRADIENT"] = "Invalid Gradient";
})(Status || (Status = {}));
export const urlRegex = /(?:https:\/\/www\.|http:\/\/www\.|https:\/\/|http:\/\/)?[a-zA-Z0-9]{2,}(?:\.[a-zA-Z0-9]{2,})(?:\.[a-zA-Z0-9]{2,})?\/(?:palette\/)?([a-zA-Z0-9-]{2,})/;
export class PaletteError extends Error {
constructor(status, message = '') {
super(message);
this.status = status;
}
}
/**
* Parses input & extracts settings
* @param input settings from codeblock
* @returns PaletteSettings or Status if settings are not valid
*/
export function parseSettings(input) {
try {
// Extract JSON settings from the palette
return JSON.parse(input);
}
catch (error) {
return Status.INVALID_SETTINGS;
}
}
/**
* Parses input & extracts colors based on color space or URL
* @param input colors from codeblock
* @returns Array of colors or Status if colors are not valid
*/
export function parseColors(input, override) {
let colors = input.flatMap((color) => {
// Split RGB / HSL delimited by semicolons
if (color.includes('(')) {
return color.split(';').flatMap((postSplitColor) => postSplitColor.trim())
// Remove whitespace elements from array
.filter((color) => color !== '');
}
// Split colors delimited by commas
return color.split(',').flatMap((postSplitColor) => {
return postSplitColor.trim();
});
// Remove semicolons
}).flatMap((color) => color.trim().replace(';', ''));
// Combine colors array into string
const rawColors = colors.join('');
// If URL parse and return
if (rawColors.match(urlRegex))
return parseUrl(rawColors);
// Return status if colors are invalid
if (!override) {
for (let color of colors) {
if (!isColorValid(color))
return Status.INVALID_COLORS;
}
}
// Return final colors array
return colors;
}
/**
* Calculates colors and settings based on codeblock contents
*/
export function calcColorsAndSettings(input, pluginSettings) {
// Splits input by newline creating an array
const split = input.split('\n');
// Returns true if palette settings are defined
const hasSettings = split.some((val) => val.includes(('{')));
// Remove and parse the last split index (settings are always defined on the last index)
let settings = hasSettings ? parseSettings(split.pop() || '') : undefined;
// Get PaletteSettings if valid or plugin defaults if invalid
let settingsObj = typeof settings === 'object' ? settings : pluginToPaletteSettings(pluginSettings);
return { colors: parseColors(split, settingsObj.override), settings: settings };
}