117 lines
2.8 KiB
TypeScript
117 lines
2.8 KiB
TypeScript
import {customElement, DeesElement, TemplateResult, property, html, cssManager} from '@designestate/dees-element';
|
|
import * as domtools from '@designestate/dees-domtools';
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
'dees-input-text': DeesInputText;
|
|
}
|
|
}
|
|
|
|
@customElement('dees-input-text')
|
|
export class DeesInputText extends DeesElement {
|
|
public static demo = () => html`<dees-input-text></dees-input-text>`;
|
|
|
|
// INSTANCE
|
|
public changeSubject = new domtools.rxjs.Subject();
|
|
|
|
@property({
|
|
type: String
|
|
})
|
|
public label: string = 'Label';
|
|
|
|
@property({
|
|
type: String
|
|
})
|
|
public key: string;
|
|
|
|
@property({
|
|
type: String
|
|
})
|
|
public value: string = '';
|
|
|
|
@property({
|
|
type: Boolean
|
|
})
|
|
public required: boolean = false;
|
|
|
|
@property({
|
|
type: Boolean
|
|
})
|
|
public disabled: boolean = false;
|
|
|
|
public render(): TemplateResult {
|
|
return html `
|
|
<style>
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
:host {
|
|
position: relative;
|
|
display: grid;
|
|
margin: 10px 0px;
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.maincontainer {
|
|
color: ${this.goBright ? '#333' : '#ccc'};
|
|
}
|
|
|
|
.label {
|
|
font-size: 14px;
|
|
margin-bottom: 5px;
|
|
}
|
|
|
|
input {
|
|
margin-top: 5px;
|
|
background: ${this.goBright ? '#fafafa' : '#222'};
|
|
border-top: ${this.goBright ? '1px solid #CCC' : '1px solid #444'};
|
|
border-bottom: ${this.goBright ? '1px solid #CCC' : '1px solid #333'};
|
|
border-right: ${this.goBright ? '1px solid #CCC' : 'none'};
|
|
border-left: ${this.goBright ? '1px solid #CCC' : 'none'};
|
|
padding-left:10px;
|
|
padding-right: 10px;
|
|
border-radius: 2px;
|
|
width: 100%;
|
|
line-height: 48px;
|
|
transition: all 0.2s;
|
|
outline: none;
|
|
font-size: 16px;
|
|
font-family: Inter;
|
|
color: ${this.goBright ? '#333' : '#ccc'};
|
|
}
|
|
|
|
input:disabled {
|
|
background: ${cssManager.bdTheme('#ffffff00', '#11111100')};
|
|
border: 1px dashed ${cssManager.bdTheme('#666666', '#666666')};
|
|
color: #9b9b9e;
|
|
cursor: default;
|
|
}
|
|
|
|
input:focus {
|
|
outline: none;
|
|
border-bottom: 1px solid #e4002b;
|
|
}
|
|
</style>
|
|
<div class="maincontainer">
|
|
<div class="label">${this.label}</div>
|
|
<input type="text" value=${this.value} @input="${this.updateValue}" .disabled=${this.disabled} />
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
public async updateValue(eventArg: Event) {
|
|
const target: any = eventArg.target;
|
|
this.value = target.value;
|
|
this.changeSubject.next(this);
|
|
}
|
|
|
|
public async freeze() {
|
|
this.disabled = true;
|
|
}
|
|
|
|
public async unfreeze() {
|
|
this.disabled = false;
|
|
}
|
|
}
|