UNPKG

color-elements

Version:

A set of web components for working with color. A Color.js project.

126 lines (108 loc) 2.67 kB
import ColorElement from "../common/color-element.js"; const Self = class GamutBadge extends ColorElement { static tagName = "gamut-badge"; static url = import.meta.url; static styles = import("./gamut-badge.css", { with: { type: "css" } }).catch( () => new URL("./gamut-badge.css", import.meta.url), ); static shadowTemplate = ` <slot> <span id="label" part="label"></span> </slot>`; #label; constructor () { super(); if (!this.#label) { this.#label = this.shadowRoot.querySelector("#label"); } } get gamutLabel () { return this.gamutInfo?.label ?? ""; } updated ({ changed }) { if (changed.has("gamuts")) { this.style.setProperty("--gamut-count", this.gamuts.length - 1); } if (changed.has("gamutInfo")) { if (this.gamutInfo) { this.style.setProperty("--gamut-level", this.gamutInfo.level); this.style.setProperty("--gamut-label", `"${this.gamutInfo.label}"`); this.style.setProperty("--gamut-id", `"${this.gamutInfo.id}"`); } else { this.style.removeProperty("--gamut-level"); this.style.removeProperty("--gamut-label"); this.style.removeProperty("--gamut-id"); } } } static props = { color: { get type () { return Self.Color; }, }, gamuts: { type: Array, default: "srgb, p3, rec2020, prophoto", parse (gamuts) { if (!gamuts) { return []; } if (typeof gamuts === "string") { gamuts = gamuts.trim().split(/\s*,\s*/); } else if (!Array.isArray(gamuts) && typeof gamuts === "object") { // Object return Object.entries(gamuts).map(([id, label]) => ({ id, label })); } let ret = gamuts.map((gamut, level) => { if (gamut?.id && "label" in gamut) { // Already in the correct format return gamut; } gamut = gamut.trim().split(/\s*:\s*/); let id = gamut[0]; let label = gamut[1] ?? Self.Color.spaces[id]?.name ?? id; return { id, label, level }; }); if (!ret.find(gamut => gamut.id === "none")) { ret.push({ id: "none", get label () { return ret[this.level - 1].label + "+"; }, level: ret.length, }); } return ret; }, stringify (gamuts) { return gamuts.map(({ id, label }) => `${id}: ${label}`).join(", "); }, }, gamutInfo: { get () { if (!this.color) { return null; } return this.gamuts?.find( gamut => gamut.id === "none" || this.color?.inGamut(gamut.id), ); }, }, gamut: { type: String, get () { return this.gamutInfo?.id; }, }, }; static events = { gamutchange: { propchange: "gamut", }, }; }; Self.define(); export default Self;