//Color Grid const colorGrid = document.createElement('template'); colorGrid.innerHTML = `
`; customElements.define('color-grid', class extends HTMLElement { constructor() { super() this.attachShadow({ mode: 'open' }).append(colorGrid.content.cloneNode(true)) this.colorArray = [] this.container = this.shadowRoot.querySelector('.color-tile-container') this.handleChange = this.handleChange.bind(this) this.setCheckMark = this.setCheckMark.bind(this) } set colors(arr) { this.colorArray = arr this.renderTiles() } set selectedColor(color) { if (this.colorArray.includes(color) && this.container.querySelector(`[data-color="${color}"]`)) { const selectedTile = this.container.querySelector(`[data-color="${color}"]`) if (selectedTile) { selectedTile.querySelector('input').checked = true this.setCheckMark(selectedTile) } } } randString(length) { let result = ''; let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; for (let i = 0; i < length; i++) result += characters.charAt(Math.floor(Math.random() * characters.length)); return result; } renderTiles() { this.container.innerHTML = '' const frag = document.createDocumentFragment() const groupName = this.randString(6) this.colorArray.forEach(color => { const label = document.createElement('label') label.classList.add('color-tile') label.setAttribute('data-color', color) if (color.includes('--')) label.setAttribute('style', `background-color: var(${color})`) else label.setAttribute('style', `background-color: ${color}`) label.innerHTML = ` ` frag.append(label) }) this.container.append(frag) } setCheckMark(target) { target.parentNode.querySelectorAll('.checkmark').forEach(checkmark => checkmark.remove()) const checkMark = document.createElement('div') checkMark.classList.add('checkmark') checkMark.innerHTML = ` ` target.append(checkMark) } handleChange(e) { const clickedTile = e.target.closest('.color-tile') this.setCheckMark(clickedTile) const clickedTileColor = clickedTile.dataset.color const tileSelected = new CustomEvent('colorselected', { bubbles: true, composed: true, detail: { value: clickedTileColor, } }) this.dispatchEvent(tileSelected) } connectedCallback() { this.container.addEventListener('change', this.handleChange) } disconnectedCallback() { this.container.removeEventListener('change', this.handleChange) } })