// Credit: https://css-tricks.com/auto-growing-inputs-textareas/#comment-1787000 // Please use theirs, not mine. I have modified it for my own purposes. const autoWidthTemplate = document.createElement('template'); autoWidthTemplate.innerHTML = ` `; class AutoWidthInput extends HTMLElement { static get formAssociated() { return true; } constructor() { super(); this.internals = this.attachInternals(); this._shadowRoot = this.attachShadow({ mode: 'open' }); this._shadowRoot.appendChild(autoWidthTemplate.content.cloneNode(true)); this._input = this._shadowRoot.querySelector('input'); this.value_ = this._input.value; } _manageValidity() { const value = this._input.value; const required = this._input.hasAttribute("required"); if (value === '' && required) { this.internals.setValidity({ valueMissing: true }, 'This field is required', this._input); } else { this.internals.setValidity({}); } } connectedCallback() { this.value = this._input.value; this._input.addEventListener('input', (e) => { this.value = this._input.value; }); } formResetCallback() { this.value = ""; } get value() { return this._input.value; } set value(v) { this._input.value = v; this.dataset.value = v; this.internals.setFormValue(v); this._manageValidity(); } static get observedAttributes() { return ['placeholder', 'name', 'required']; } attributeChangedCallback(name, oldVal, newVal) { this._input.setAttribute(name, newVal); } } window.customElements.define('autowidth-input', AutoWidthInput);