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