//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)
}
})