import { LitElement, html, css } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { unsafeHTML } from 'lit/directives/unsafe-html.js'; @customElement('iu-checkbox') export class Checkbox extends LitElement { static override styles = css` :host { display: inline-flex; align-items: start; cursor: pointer; user-select: none; margin-bottom: var(--iu-spacing-5); } .checkbox { width: 18px; height: 18px; border: 1px solid var(--iu-color-grey-300); border-radius: 0; display: flex; align-items: center; justify-content: center; flex-shrink: 0; position: relative; } .checkbox::after{ content: ''; background-image: url("data:image/svg+xml,%3Csvg fill='none' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 9'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m4.022 7.313-2.67-2.67-.703.711 3.375 3.375 7.328-7.374-.704-.71-6.626 6.668Z' fill='%23fff'/%3E%3C/svg%3E"); position: absolute; background-size: contain; background-repeat: no-repeat; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%); width: 14px; height: 11px; } .checkbox[aria-checked="true"] { background: var(--iu-color-black); border-color: var(--iu-color-black); } .checkbox[aria-checked="true"]::after { } .label { margin-left: 14px; font: var(--iu-fs-1); color: var(--iu-color-black); a{ color: var(--iu-color-black) } } /* Focus styles */ :host(:focus-within) .checkbox { outline: 0; } `; @property({ type: Boolean, reflect: true }) checked = false; @property({ type: String }) label = ''; // Optional label @property({ type: String }) name = ''; // For form compatibility private toggleChecked() { this.checked = !this.checked; this.dispatchEvent(new CustomEvent('change', { detail: { checked: this.checked }, bubbles: true, composed: true })); } private handleKeyDown(event: KeyboardEvent) { if (event.key === ' ' || event.key === 'Enter') { event.preventDefault(); this.toggleChecked(); } } override render() { return html` <div class="checkbox" role="checkbox" tabindex="0" aria-checked="${this.checked}" @click="${this.toggleChecked}" @keydown="${this.handleKeyDown}" ></div> ${this.label ? html`<span class="label" @click="${this.toggleChecked}">${unsafeHTML(this.label)}</span>` : ''} <input type="checkbox" name="${this.name}" .checked="${this.checked}" hidden /> `; } } declare global { interface HTMLElementTagNameMap { 'iu-checkbox': Checkbox; } }