UNPKG

colorjs.io

Version:

Let’s get serious about color

86 lines (71 loc) 2.29 kB
/** * This plugin defines getters and setters for color[spaceId] * e.g. color.lch on *any* color gives us the lch coords */ import ColorSpace from "./space.js"; import Color from "./color.js"; import hooks from "./hooks.js"; // Add space accessors to existing color spaces for (let id in ColorSpace.registry) { addSpaceAccessors(id, ColorSpace.registry[id]); } // Add space accessors to color spaces not yet created hooks.add("colorspace-init-end", addSpaceAccessors); function addSpaceAccessors (id, space) { // Coordinates can be looked up by both id and name let coordIds = Object.keys(space.coords); let coordNames = Object.values(space.coords).map(c => c.name); let propId = id.replace(/-/g, "_"); Object.defineProperty(Color.prototype, propId, { // Convert coords to coords in another colorspace and return them // Source colorspace: this.spaceId // Target colorspace: id get () { let ret = this.getAll(id); if (typeof Proxy === "undefined") { // If proxies are not supported, just return a static array return ret; } // Enable color.spaceId.coordName syntax return new Proxy(ret, { has: (obj, property) => { try { ColorSpace.resolveCoord([space, property]); return true; } catch(e) {} return Reflect.has(obj, property); }, get: (obj, property, receiver) => { if (property && typeof property !== "symbol" && !(property in obj)) { let {index} = ColorSpace.resolveCoord([space, property]); if (index >= 0) { return obj[index]; } } return Reflect.get(obj, property, receiver); }, set: (obj, property, value, receiver) => { if (property && typeof property !== "symbol" && !(property in obj) || property >= 0) { let {index} = ColorSpace.resolveCoord([space, property]); if (index >= 0) { obj[index] = value; // Update color.coords this.setAll(id, obj); return true; } } return Reflect.set(obj, property, value, receiver); }, }); }, // Convert coords in another colorspace to internal coords and set them // Target colorspace: this.spaceId // Source colorspace: id set (coords) { this.setAll(id, coords); }, configurable: true, enumerable: true }); }