| /** |
| * @module modules/input-sk |
| * @description A custom element that is a styled, labeled input. |
| * |
| * @attr {Boolean} label - Placeholder style text that moves out of the way |
| * when element is in focus. |
| */ |
| |
| import { $$ } from 'common-sk/modules/dom'; |
| import { define } from 'elements-sk/define'; |
| import { html } from 'lit-html'; |
| |
| import { ElementSk } from '../../../infra-sk/modules/ElementSk'; |
| |
| const template = (ele) => html` |
| <div class=input-container> |
| <input autocomplete=off required |
| @focus=${ele._refresh} |
| @input=${ele._refresh} |
| @keyup=${ele._keyup} |
| @blur=${ele._blur}> |
| </input> |
| <label>${ele.label}</label> |
| <div class=underline-container> |
| <div class=underline></div> |
| <div class=underline-background ></div> |
| </div> |
| </div> |
| `; |
| |
| define('input-sk', class extends ElementSk { |
| constructor() { |
| super(template); |
| |
| this._upgradeProperty('label'); |
| } |
| |
| connectedCallback() { |
| super.connectedCallback(); |
| this._render(); |
| if (this.hasAttribute('value')) { |
| this.value = this.getAttribute('value'); |
| } |
| } |
| |
| /** |
| * @prop {string} value - Content of the input element from typing, |
| * selection, etc. |
| */ |
| get value() { |
| // We back our value with input.value directly, to avoid issues with the |
| // input value changing without changing our value property, causing |
| // element re-rendering to be skipped. |
| return $$('input', this).value; |
| } |
| |
| set value(v) { |
| $$('input', this).value = v; |
| } |
| |
| /** |
| * @prop {Array<string>} label - Label to display to guide user input. |
| * Mirrors the attribute. |
| */ |
| get label() { |
| return this.getAttribute('label') || ''; |
| } |
| |
| set label(val) { |
| this.setAttribute('label', val); |
| this._render(); |
| } |
| }); |