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_ci@element('lit-button')
19fb726d48Sopenharmony_ciexport class LitButton extends BaseElement {
20fb726d48Sopenharmony_ci  private slotHtml: HTMLElement | undefined;
21fb726d48Sopenharmony_ci  private button: HTMLButtonElement | null | undefined;
22fb726d48Sopenharmony_ci  private litIcon: LitButton | null | undefined;
23fb726d48Sopenharmony_ci
24fb726d48Sopenharmony_ci  static get observedAttributes(): string[] {
25fb726d48Sopenharmony_ci    return [
26fb726d48Sopenharmony_ci      'text',
27fb726d48Sopenharmony_ci      'back',
28fb726d48Sopenharmony_ci      'icon',
29fb726d48Sopenharmony_ci      'height',
30fb726d48Sopenharmony_ci      'width',
31fb726d48Sopenharmony_ci      'color',
32fb726d48Sopenharmony_ci      'font_size',
33fb726d48Sopenharmony_ci      'border',
34fb726d48Sopenharmony_ci      'padding',
35fb726d48Sopenharmony_ci      'justify_content',
36fb726d48Sopenharmony_ci      'border_radius',
37fb726d48Sopenharmony_ci      'margin_icon',
38fb726d48Sopenharmony_ci      'opacity',
39fb726d48Sopenharmony_ci    ];
40fb726d48Sopenharmony_ci  }
41fb726d48Sopenharmony_ci
42fb726d48Sopenharmony_ci  get text(): string {
43fb726d48Sopenharmony_ci    return this.getAttribute('text') || '';
44fb726d48Sopenharmony_ci  }
45fb726d48Sopenharmony_ci
46fb726d48Sopenharmony_ci  set text(text: string) {
47fb726d48Sopenharmony_ci    this.setAttribute('text', text);
48fb726d48Sopenharmony_ci  }
49fb726d48Sopenharmony_ci
50fb726d48Sopenharmony_ci  get back(): string {
51fb726d48Sopenharmony_ci    return this.getAttribute('back') || '';
52fb726d48Sopenharmony_ci  }
53fb726d48Sopenharmony_ci
54fb726d48Sopenharmony_ci  set back(backColor: string) {
55fb726d48Sopenharmony_ci    this.button!.style.backgroundColor = backColor;
56fb726d48Sopenharmony_ci    this.setAttribute('back', backColor);
57fb726d48Sopenharmony_ci  }
58fb726d48Sopenharmony_ci
59fb726d48Sopenharmony_ci  get icon(): string {
60fb726d48Sopenharmony_ci    return this.getAttribute('icon') || '';
61fb726d48Sopenharmony_ci  }
62fb726d48Sopenharmony_ci
63fb726d48Sopenharmony_ci  set icon(icon: string) {
64fb726d48Sopenharmony_ci    this.litIcon?.setAttribute('name', icon);
65fb726d48Sopenharmony_ci    this.setAttribute('icon', icon);
66fb726d48Sopenharmony_ci    if (icon) {
67fb726d48Sopenharmony_ci      this.litIcon!.style.display = 'block';
68fb726d48Sopenharmony_ci    }
69fb726d48Sopenharmony_ci  }
70fb726d48Sopenharmony_ci
71fb726d48Sopenharmony_ci  get height(): string {
72fb726d48Sopenharmony_ci    return this.getAttribute('height') || '';
73fb726d48Sopenharmony_ci  }
74fb726d48Sopenharmony_ci
75fb726d48Sopenharmony_ci  set height(height: string) {
76fb726d48Sopenharmony_ci    this.setAttribute('height', height);
77fb726d48Sopenharmony_ci  }
78fb726d48Sopenharmony_ci
79fb726d48Sopenharmony_ci  get width(): string {
80fb726d48Sopenharmony_ci    return this.getAttribute('width') || '';
81fb726d48Sopenharmony_ci  }
82fb726d48Sopenharmony_ci
83fb726d48Sopenharmony_ci  set width(width: string) {
84fb726d48Sopenharmony_ci    this.setAttribute('width', width);
85fb726d48Sopenharmony_ci  }
86fb726d48Sopenharmony_ci
87fb726d48Sopenharmony_ci  set color(color: string) {
88fb726d48Sopenharmony_ci    this.setAttribute('color', color);
89fb726d48Sopenharmony_ci  }
90fb726d48Sopenharmony_ci
91fb726d48Sopenharmony_ci  set font_size(fontSize: string) {
92fb726d48Sopenharmony_ci    this.setAttribute('font_size', fontSize);
93fb726d48Sopenharmony_ci  }
94fb726d48Sopenharmony_ci
95fb726d48Sopenharmony_ci  set border(border: string) {
96fb726d48Sopenharmony_ci    this.setAttribute('border', border);
97fb726d48Sopenharmony_ci  }
98fb726d48Sopenharmony_ci
99fb726d48Sopenharmony_ci  set padding(padding: string) {
100fb726d48Sopenharmony_ci    this.setAttribute('padding', padding);
101fb726d48Sopenharmony_ci  }
102fb726d48Sopenharmony_ci
103fb726d48Sopenharmony_ci  set justify_content(justifyContent: string) {
104fb726d48Sopenharmony_ci    this.setAttribute('justify_content', justifyContent);
105fb726d48Sopenharmony_ci  }
106fb726d48Sopenharmony_ci
107fb726d48Sopenharmony_ci  set border_radius(borderRadius: string) {
108fb726d48Sopenharmony_ci    this.setAttribute('border_radius', borderRadius);
109fb726d48Sopenharmony_ci  }
110fb726d48Sopenharmony_ci
111fb726d48Sopenharmony_ci  set margin_icon(value: string) {
112fb726d48Sopenharmony_ci    this.litIcon?.setAttribute('margin_icon', value);
113fb726d48Sopenharmony_ci  }
114fb726d48Sopenharmony_ci
115fb726d48Sopenharmony_ci  set opacity(value: string) {
116fb726d48Sopenharmony_ci    this.litIcon?.setAttribute('opacity', value);
117fb726d48Sopenharmony_ci  }
118fb726d48Sopenharmony_ci
119fb726d48Sopenharmony_ci  set hidden(hidden: boolean) {
120fb726d48Sopenharmony_ci    if (hidden) {
121fb726d48Sopenharmony_ci      this.setAttribute('hidden', 'true');
122fb726d48Sopenharmony_ci      this.style.display = 'none';
123fb726d48Sopenharmony_ci    } else {
124fb726d48Sopenharmony_ci      this.removeAttribute('hidden');
125fb726d48Sopenharmony_ci      this.style.display = 'block';
126fb726d48Sopenharmony_ci    }
127fb726d48Sopenharmony_ci  }
128fb726d48Sopenharmony_ci
129fb726d48Sopenharmony_ci  initHtml(): string {
130fb726d48Sopenharmony_ci    return `
131fb726d48Sopenharmony_ci        ${this.initHtmlStyle()}
132fb726d48Sopenharmony_ci        <div id='custom-div'>
133fb726d48Sopenharmony_ci                <button id="custom-button" type="button">
134fb726d48Sopenharmony_ci                    <slot id="sl" tyle= "padding: 10px"></slot>
135fb726d48Sopenharmony_ci                    <lit-icon id="button-icon" name="" size="18" style= "margin-left: 10px" color="var(--dark-color1,#4D4D4D)"></lit-icon>
136fb726d48Sopenharmony_ci                 </button>
137fb726d48Sopenharmony_ci            </div>
138fb726d48Sopenharmony_ci            `;
139fb726d48Sopenharmony_ci  }
140fb726d48Sopenharmony_ci
141fb726d48Sopenharmony_ci  private initHtmlStyle(): string {
142fb726d48Sopenharmony_ci    return `
143fb726d48Sopenharmony_ci    <style>
144fb726d48Sopenharmony_ci        :host{ 
145fb726d48Sopenharmony_ci            display: block;
146fb726d48Sopenharmony_ci            width: 100%;
147fb726d48Sopenharmony_ci            height: 100%;
148fb726d48Sopenharmony_ci            position: relative;
149fb726d48Sopenharmony_ci            background: background: var(--dark-background3,#FFFFFF);
150fb726d48Sopenharmony_ci        }
151fb726d48Sopenharmony_ci        
152fb726d48Sopenharmony_ci        #custom-button{ 
153fb726d48Sopenharmony_ci            display: flex;
154fb726d48Sopenharmony_ci            flex-direction: row;
155fb726d48Sopenharmony_ci            align-items: center;
156fb726d48Sopenharmony_ci            align-content: center;
157fb726d48Sopenharmony_ci            justify-content: right;
158fb726d48Sopenharmony_ci            cursor: pointer;
159fb726d48Sopenharmony_ci            color: var(--dark-background3,#FFFFFF);
160fb726d48Sopenharmony_ci            background: var(--dark-background3,#FFFFFF);
161fb726d48Sopenharmony_ci            border: 2px solid #409eff;
162fb726d48Sopenharmony_ci            border-radius: 20px;
163fb726d48Sopenharmony_ci            padding: 15px;
164fb726d48Sopenharmony_ci            transition: opacity 0.2s;
165fb726d48Sopenharmony_ci            outline: none;
166fb726d48Sopenharmony_ci            position: relative;
167fb726d48Sopenharmony_ci         }
168fb726d48Sopenharmony_ci            #custom-button::before {
169fb726d48Sopenharmony_ci              position: absolute;
170fb726d48Sopenharmony_ci              top: 50%;
171fb726d48Sopenharmony_ci              left: 50%;
172fb726d48Sopenharmony_ci              width: 100%;
173fb726d48Sopenharmony_ci              height: 100%;
174fb726d48Sopenharmony_ci              background-color: #000;
175fb726d48Sopenharmony_ci              border: inherit;
176fb726d48Sopenharmony_ci              border-color: #000;
177fb726d48Sopenharmony_ci              border-radius: inherit;
178fb726d48Sopenharmony_ci              transform: translate(-50%, -50%);
179fb726d48Sopenharmony_ci              opacity: 0;
180fb726d48Sopenharmony_ci              content: ' ';
181fb726d48Sopenharmony_ci            }
182fb726d48Sopenharmony_ci            #custom-button:active::before {
183fb726d48Sopenharmony_ci              opacity: 0.1;
184fb726d48Sopenharmony_ci            }
185fb726d48Sopenharmony_ci        </style>
186fb726d48Sopenharmony_ci    `;
187fb726d48Sopenharmony_ci  }
188fb726d48Sopenharmony_ci
189fb726d48Sopenharmony_ci  initElements(): void {
190fb726d48Sopenharmony_ci    this.slotHtml = this.shadowRoot?.querySelector('#sl') as HTMLElement;
191fb726d48Sopenharmony_ci    this.button = this.shadowRoot?.querySelector('#custom-button');
192fb726d48Sopenharmony_ci    this.litIcon = this.shadowRoot?.querySelector('#button-icon') as LitButton;
193fb726d48Sopenharmony_ci    if (this.litIcon.getAttribute('name') === '') {
194fb726d48Sopenharmony_ci      this.litIcon!.style.display = 'none';
195fb726d48Sopenharmony_ci    }
196fb726d48Sopenharmony_ci  }
197fb726d48Sopenharmony_ci
198fb726d48Sopenharmony_ci  attributeChangedCallback(name: string, oldValue: string, value: string): void {
199fb726d48Sopenharmony_ci    switch (name) {
200fb726d48Sopenharmony_ci      case 'text':
201fb726d48Sopenharmony_ci        this.slotHtml!.innerText = value;
202fb726d48Sopenharmony_ci        break;
203fb726d48Sopenharmony_ci      case 'back':
204fb726d48Sopenharmony_ci        this.button!.style.backgroundColor = value;
205fb726d48Sopenharmony_ci        break;
206fb726d48Sopenharmony_ci      case 'icon':
207fb726d48Sopenharmony_ci        this.litIcon?.setAttribute('name', value);
208fb726d48Sopenharmony_ci        if (value) {
209fb726d48Sopenharmony_ci          this.litIcon!.style.display = 'block';
210fb726d48Sopenharmony_ci        }
211fb726d48Sopenharmony_ci        break;
212fb726d48Sopenharmony_ci      case 'height':
213fb726d48Sopenharmony_ci        this.button!.style.height = value;
214fb726d48Sopenharmony_ci        break;
215fb726d48Sopenharmony_ci      case 'color':
216fb726d48Sopenharmony_ci        this.button!.style.color = value;
217fb726d48Sopenharmony_ci        break;
218fb726d48Sopenharmony_ci      case 'font_size':
219fb726d48Sopenharmony_ci        this.button!.style.fontSize = value;
220fb726d48Sopenharmony_ci        break;
221fb726d48Sopenharmony_ci      case 'border':
222fb726d48Sopenharmony_ci        this.button!.style.border = value;
223fb726d48Sopenharmony_ci        break;
224fb726d48Sopenharmony_ci      case 'padding':
225fb726d48Sopenharmony_ci        this.button!.style.padding = value;
226fb726d48Sopenharmony_ci        break;
227fb726d48Sopenharmony_ci      case 'justify_content':
228fb726d48Sopenharmony_ci        this.button!.style.justifyContent = value;
229fb726d48Sopenharmony_ci        break;
230fb726d48Sopenharmony_ci      case 'border_radius':
231fb726d48Sopenharmony_ci        this.button!.style.borderRadius = value;
232fb726d48Sopenharmony_ci        break;
233fb726d48Sopenharmony_ci      case 'margin_icon':
234fb726d48Sopenharmony_ci        this.litIcon!.style.margin = value;
235fb726d48Sopenharmony_ci        break;
236fb726d48Sopenharmony_ci      case 'opacity':
237fb726d48Sopenharmony_ci        this.button!.style.opacity = value;
238fb726d48Sopenharmony_ci        break;
239fb726d48Sopenharmony_ci    }
240fb726d48Sopenharmony_ci  }
241fb726d48Sopenharmony_ci}
242