1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { BaseElement, element } from '../BaseElement'; 17fb726d48Sopenharmony_ci 18fb726d48Sopenharmony_ciconst initHtmlStyle = ` 19fb726d48Sopenharmony_ci <style> 20fb726d48Sopenharmony_ci :host{ 21fb726d48Sopenharmony_ci display:flex; 22fb726d48Sopenharmony_ci opacity: 0.86; 23fb726d48Sopenharmony_ci font-family: Helvetica; 24fb726d48Sopenharmony_ci font-size: 14px; 25fb726d48Sopenharmony_ci text-align: left; 26fb726d48Sopenharmony_ci line-height: 16px; 27fb726d48Sopenharmony_ci font-weight: 400; 28fb726d48Sopenharmony_ci } 29fb726d48Sopenharmony_ci #checkbox{ 30fb726d48Sopenharmony_ci position:absolute; 31fb726d48Sopenharmony_ci clip:rect(0,0,0,0); 32fb726d48Sopenharmony_ci } 33fb726d48Sopenharmony_ci 34fb726d48Sopenharmony_ci label{ 35fb726d48Sopenharmony_ci box-sizing:border-box; 36fb726d48Sopenharmony_ci cursor:pointer; 37fb726d48Sopenharmony_ci display:flex; 38fb726d48Sopenharmony_ci align-items:center; 39fb726d48Sopenharmony_ci gap: 12px; 40fb726d48Sopenharmony_ci } 41fb726d48Sopenharmony_ci .chekebox{ 42fb726d48Sopenharmony_ci position:relative; 43fb726d48Sopenharmony_ci display:flex; 44fb726d48Sopenharmony_ci justify-content: center; 45fb726d48Sopenharmony_ci align-items: center; 46fb726d48Sopenharmony_ci width: 16px; 47fb726d48Sopenharmony_ci height:16px; 48fb726d48Sopenharmony_ci border: 1px solid var(--dark-color1,#4D4D4D); 49fb726d48Sopenharmony_ci border-radius: 20%; 50fb726d48Sopenharmony_ci } 51fb726d48Sopenharmony_ci .chekebox::before{ 52fb726d48Sopenharmony_ci position:absolute; 53fb726d48Sopenharmony_ci content:''; 54fb726d48Sopenharmony_ci width:74%; 55fb726d48Sopenharmony_ci height:0.15em; 56fb726d48Sopenharmony_ci background:#3391FF; 57fb726d48Sopenharmony_ci transform:scale(0); 58fb726d48Sopenharmony_ci border-radius: 0.15em; 59fb726d48Sopenharmony_ci } 60fb726d48Sopenharmony_ci .chekebox{ 61fb726d48Sopenharmony_ci background:var(--dark-background,#FFFFFF); 62fb726d48Sopenharmony_ci } 63fb726d48Sopenharmony_ci .chekebox::after{ 64fb726d48Sopenharmony_ci content:''; 65fb726d48Sopenharmony_ci position:absolute; 66fb726d48Sopenharmony_ci width:100%; 67fb726d48Sopenharmony_ci height:100%; 68fb726d48Sopenharmony_ci border-radius:50%; 69fb726d48Sopenharmony_ci background:#FFFFFF; 70fb726d48Sopenharmony_ci opacity:0.2; 71fb726d48Sopenharmony_ci transform:scale(0); 72fb726d48Sopenharmony_ci z-index:-1; 73fb726d48Sopenharmony_ci } 74fb726d48Sopenharmony_ci #checkbox:checked:not(:indeterminate)+label .chekebox .icon{ 75fb726d48Sopenharmony_ci transform: scale(1.5); 76fb726d48Sopenharmony_ci } 77fb726d48Sopenharmony_ci #checkbox:checked+label .chekebox,#checkbox:indeterminate+label .chekebox{ 78fb726d48Sopenharmony_ci border-color:#3391FF; 79fb726d48Sopenharmony_ci } 80fb726d48Sopenharmony_ci #checkbox:indeterminate+label .chekebox::before{ 81fb726d48Sopenharmony_ci transform:scale(1); 82fb726d48Sopenharmony_ci } 83fb726d48Sopenharmony_ci .icon{ 84fb726d48Sopenharmony_ci width: 100%; 85fb726d48Sopenharmony_ci height: 94%; 86fb726d48Sopenharmony_ci transform: scale(0); 87fb726d48Sopenharmony_ci } 88fb726d48Sopenharmony_ci :host([disabled]){ 89fb726d48Sopenharmony_ci pointer-events: none; 90fb726d48Sopenharmony_ci } 91fb726d48Sopenharmony_ci </style> 92fb726d48Sopenharmony_ci `; 93fb726d48Sopenharmony_ci 94fb726d48Sopenharmony_ci@element('lit-check-box') 95fb726d48Sopenharmony_ciexport class LitCheckBox extends BaseElement { 96fb726d48Sopenharmony_ci private checkbox: HTMLInputElement | undefined; 97fb726d48Sopenharmony_ci 98fb726d48Sopenharmony_ci static get observedAttributes(): string[] { 99fb726d48Sopenharmony_ci return ['checked', 'value', 'disabled']; 100fb726d48Sopenharmony_ci } 101fb726d48Sopenharmony_ci 102fb726d48Sopenharmony_ci set disabled(value) { 103fb726d48Sopenharmony_ci if (value === null || value === false) { 104fb726d48Sopenharmony_ci this.removeAttribute('disabled'); 105fb726d48Sopenharmony_ci } else { 106fb726d48Sopenharmony_ci this.setAttribute('disabled', ''); 107fb726d48Sopenharmony_ci } 108fb726d48Sopenharmony_ci } 109fb726d48Sopenharmony_ci 110fb726d48Sopenharmony_ci get indeterminate(): boolean { 111fb726d48Sopenharmony_ci return this.checkbox!.indeterminate; 112fb726d48Sopenharmony_ci } 113fb726d48Sopenharmony_ci 114fb726d48Sopenharmony_ci set indeterminate(value) { 115fb726d48Sopenharmony_ci if (value === null || value === false) { 116fb726d48Sopenharmony_ci this.checkbox!.indeterminate = false; 117fb726d48Sopenharmony_ci } else { 118fb726d48Sopenharmony_ci this.checkbox!.indeterminate = true; 119fb726d48Sopenharmony_ci } 120fb726d48Sopenharmony_ci } 121fb726d48Sopenharmony_ci 122fb726d48Sopenharmony_ci get disabled(): boolean { 123fb726d48Sopenharmony_ci return this.getAttribute('disabled') !== null; 124fb726d48Sopenharmony_ci } 125fb726d48Sopenharmony_ci 126fb726d48Sopenharmony_ci get checked(): boolean { 127fb726d48Sopenharmony_ci return this.getAttribute('checked') !== null; 128fb726d48Sopenharmony_ci } 129fb726d48Sopenharmony_ci 130fb726d48Sopenharmony_ci set checked(boxCheck: boolean) { 131fb726d48Sopenharmony_ci if (boxCheck === null || !boxCheck) { 132fb726d48Sopenharmony_ci this.removeAttribute('checked'); 133fb726d48Sopenharmony_ci } else { 134fb726d48Sopenharmony_ci this.setAttribute('checked', ''); 135fb726d48Sopenharmony_ci } 136fb726d48Sopenharmony_ci } 137fb726d48Sopenharmony_ci 138fb726d48Sopenharmony_ci get value(): string { 139fb726d48Sopenharmony_ci return this.getAttribute('value') || ''; 140fb726d48Sopenharmony_ci } 141fb726d48Sopenharmony_ci 142fb726d48Sopenharmony_ci set value(value: string) { 143fb726d48Sopenharmony_ci this.setAttribute('value', value); 144fb726d48Sopenharmony_ci } 145fb726d48Sopenharmony_ci 146fb726d48Sopenharmony_ci initHtml(): string { 147fb726d48Sopenharmony_ci return ` 148fb726d48Sopenharmony_ci ${initHtmlStyle} 149fb726d48Sopenharmony_ci <input type="checkbox" id="checkbox"> 150fb726d48Sopenharmony_ci <label for="checkbox"> 151fb726d48Sopenharmony_ci <span class="chekebox"> 152fb726d48Sopenharmony_ci <lit-icon name="checkmark" class="icon" color="#3391FF" size="15"> 153fb726d48Sopenharmony_ci </lit-icon> 154fb726d48Sopenharmony_ci </span> 155fb726d48Sopenharmony_ci <slot id="slot"></slot> 156fb726d48Sopenharmony_ci </label> 157fb726d48Sopenharmony_ci `; 158fb726d48Sopenharmony_ci } 159fb726d48Sopenharmony_ci 160fb726d48Sopenharmony_ci initElements(): void { 161fb726d48Sopenharmony_ci this.checkbox = this.shadowRoot?.getElementById('checkbox') as HTMLInputElement; 162fb726d48Sopenharmony_ci } 163fb726d48Sopenharmony_ci 164fb726d48Sopenharmony_ci connectedCallback(): void { 165fb726d48Sopenharmony_ci this.checkbox!.addEventListener('change', () => { 166fb726d48Sopenharmony_ci this.checked = this.checkbox!.checked; 167fb726d48Sopenharmony_ci let changeEvent: CustomEventInit<LitCheckBoxChangeEvent> = { 168fb726d48Sopenharmony_ci detail: { 169fb726d48Sopenharmony_ci checked: this.checked, 170fb726d48Sopenharmony_ci }, 171fb726d48Sopenharmony_ci }; 172fb726d48Sopenharmony_ci this.dispatchEvent(new CustomEvent('change', changeEvent)); 173fb726d48Sopenharmony_ci }); 174fb726d48Sopenharmony_ci } 175fb726d48Sopenharmony_ci 176fb726d48Sopenharmony_ci attributeChangedCallback(name: string, oldValue: string, newValue: string): void { 177fb726d48Sopenharmony_ci if (name === 'checked' && this.checkbox) { 178fb726d48Sopenharmony_ci this.checkbox.checked = newValue !== null; 179fb726d48Sopenharmony_ci } 180fb726d48Sopenharmony_ci if (name === 'value') { 181fb726d48Sopenharmony_ci let slot = this.shadowRoot?.getElementById('slot'); 182fb726d48Sopenharmony_ci slot!.textContent = newValue; 183fb726d48Sopenharmony_ci } 184fb726d48Sopenharmony_ci } 185fb726d48Sopenharmony_ci} 186fb726d48Sopenharmony_ci 187fb726d48Sopenharmony_ciexport interface LitCheckBoxChangeEvent { 188fb726d48Sopenharmony_ci checked: boolean; 189fb726d48Sopenharmony_ci} 190