UNPKG

@alegendstale/holly-components

Version:

Reusable UI components created using lit

110 lines (109 loc) 3.92 kB
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 }; }