const smCheckbox = document.createElement('template') smCheckbox.innerHTML = `
` customElements.define('sm-checkbox', class extends HTMLElement { constructor() { super() this.attachShadow({ mode: 'open' }).append(smCheckbox.content.cloneNode(true)) this.defaultState this.checkbox = this.shadowRoot.querySelector('.checkbox'); this.reset = this.reset.bind(this) this.dispatch = this.dispatch.bind(this) this.handleKeyDown = this.handleKeyDown.bind(this) this.handleClick = this.handleClick.bind(this) } static get observedAttributes() { return ['value', 'disabled', 'checked'] } get disabled() { return this.hasAttribute('disabled') } set disabled(val) { if (val) { this.setAttribute('disabled', '') } else { this.removeAttribute('disabled') } } get checked() { return this.hasAttribute('checked') } set checked(value) { if (value) { this.setAttribute('checked', '') } else { this.removeAttribute('checked') } } set value(val) { this.setAttribute('value', val) } get value() { return this.getAttribute('value') } focusIn() { this.focus() } reset() { this.value = this.defaultState } dispatch() { this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })) } handleKeyDown(e) { if (e.key === ' ') { e.preventDefault() this.toggleAttribute('checked') } } handleClick(e) { this.toggleAttribute('checked') } connectedCallback() { if (!this.hasAttribute('disabled')) { this.setAttribute('tabindex', '0') } this.setAttribute('role', 'checkbox') this.defaultState = this.hasAttribute('checked') if (!this.hasAttribute('checked')) { this.setAttribute('aria-checked', 'false') } this.addEventListener('keydown', this.handleKeyDown) this.addEventListener('click', this.handleClick) } attributeChangedCallback(name, oldValue, newValue) { if (oldValue !== newValue) { if (name === 'checked') { this.setAttribute('aria-checked', this.hasAttribute('checked')) this.dispatch() } else if (name === 'disabled') { if (this.hasAttribute('disabled')) { this.removeAttribute('tabindex') } else { this.setAttribute('tabindex', '0') } } } } disconnectedCallback() { this.removeEventListener('keydown', this.handleKeyDown) this.removeEventListener('change', this.handleClick) } })