import { LitElement, html, css } from 'lit';
import { customElement, property } from 'lit/decorators.js';
@customElement('iu-input')
export class Input extends LitElement {
static override styles = css`
:host {
display: block;
}
.input-group{
margin-bottom: var(--iu-spacing-4);
}
label {
font-weight: bold;
display: block;
margin-bottom: var(--iu-spacing-0);
}
.input{
border-top: 1px solid var(--iu-color-grey-200);
border-bottom: 1px solid var(--iu-color-grey-200);
}
.input:has(+ .helper){
margin-bottom: var(--iu-spacing-0);
}
.helper{
font: var(--iu-f-0);
color: var(--iu-color-grey-500);
}
input {
width: 100%;
height: 2.25rem;
padding: 8px 0;
font-size: 1rem;
border: 0;
color: var(--iu-color-grey-300);
box-sizing: border-box;
}
input::placeholder{
color: var(--iu-color-grey-300);
}
.input:has(input:focus) {
border-top: 1px solid var(--iu-color-black);
border-bottom: 1px solid var(--iu-color-black);
}
input:focus{
outline: 0;
}
`;
@property({ type: String }) label = '';
@property({ type: String }) type = 'text';
@property({ type: String }) name = '';
@property({ type: String }) placeholder = '';
@property({ type: String }) value = '';
@property({ type: String }) helper? : string;
private handleInput(event: Event) {
const target = event.target as HTMLInputElement;
this.value = target.value;
this.dispatchEvent(new CustomEvent('input-change', {
detail: { name: this.name, value: this.value },
bubbles: true,
composed: true
}));
}
override render() {
return html`
<div class="input-group">
<label for="${this.name}">${this.label}</label>
<div class="input">
<input
type="${this.type}"
name="${this.name}"
placeholder="${this.placeholder}"
.value="${this.value}"
@input="${this.handleInput}"
/>
</div>
${this.helper && html`<span class="helper">${this.helper}</span>`}
</div>
`;
}
}
declare global {
interface HTMLElementTagNameMap {
'iu-input': Input;
}
}