import { LitElement, html, nothing, CSSResultArray } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { styles } from './nile-color-swatch.css'; @customElement('nile-color-swatch') export class NileColorSwatch extends LitElement { static get styles(): CSSResultArray { return [styles]; } /** The hex color this swatch represents. */ @property({ type: String, reflect: true })color = '#000000'; /** Whether this swatch is the currently selected color. */ @property({ type: Boolean, reflect: true })active = false; private _tickColor(): string { const hex = this.color.replace('#', ''); if (hex.length !== 6) { return '#FFFFFF'; } const r = parseInt(hex.substring(0, 2), 16) / 255; const g = parseInt(hex.substring(2, 4), 16) / 255; const b = parseInt(hex.substring(4, 6), 16) / 255; const toLinear = (c: number) => c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); const R = toLinear(r); const G = toLinear(g); const B = toLinear(b); const luminance = 0.2126 * R + 0.7152 * G + 0.0722 * B; const contrastWithWhite = (1.05) / (luminance + 0.05); const contrastWithBlack = (luminance + 0.05) / 0.05; return contrastWithWhite > contrastWithBlack ? '#FFFFFF' : '#111827'; } render() { const cls = `swatch${this.active ? ' swatch--active' : ''}`; const tickColor = this._tickColor(); return html` `; } } declare global { interface HTMLElementTagNameMap { 'nile-color-swatch': NileColorSwatch; } }