diff --git a/packages/select/src/vaadin-select.js b/packages/select/src/vaadin-select.js index 196656caa9a..f5144f1f0a7 100644 --- a/packages/select/src/vaadin-select.js +++ b/packages/select/src/vaadin-select.js @@ -532,10 +532,13 @@ class Select extends DelegateFocusMixin(FieldMixin(SlotMixin(ElementMixin(Themab const selected = this._items[this._menuElement.selected]; + this._valueButton.removeAttribute('placeholder'); + if (!selected) { if (this.placeholder) { const item = this.__createItem(this.placeholder); this.__appendItem(item); + this._valueButton.setAttribute('placeholder', ''); } } else { this.__attachSelectedItem(selected); diff --git a/packages/select/test/visual/lumo/screenshots/select/baseline/empty-value.png b/packages/select/test/visual/lumo/screenshots/select/baseline/empty-value.png new file mode 100644 index 00000000000..158674bff0e Binary files /dev/null and b/packages/select/test/visual/lumo/screenshots/select/baseline/empty-value.png differ diff --git a/packages/select/test/visual/lumo/select.test.js b/packages/select/test/visual/lumo/select.test.js index b31706716e5..217c7fc7f6c 100644 --- a/packages/select/test/visual/lumo/select.test.js +++ b/packages/select/test/visual/lumo/select.test.js @@ -136,4 +136,17 @@ describe('select', () => { element.value = 'item 1'; await visualDiff(div, 'width-value'); }); + + it('empty value', async () => { + // To make sure placeholder styles aren't applied to empty value item + element.placeholder = 'Placeholder'; + element.renderer = (root) => { + root.innerHTML = ` + + Empty + + `; + }; + await visualDiff(div, 'empty-value'); + }); }); diff --git a/packages/select/test/visual/material/screenshots/select/baseline/empty-value.png b/packages/select/test/visual/material/screenshots/select/baseline/empty-value.png new file mode 100644 index 00000000000..7b73bb0f2da Binary files /dev/null and b/packages/select/test/visual/material/screenshots/select/baseline/empty-value.png differ diff --git a/packages/select/test/visual/material/select.test.js b/packages/select/test/visual/material/select.test.js index d0bd16765b9..85386b7ebe3 100644 --- a/packages/select/test/visual/material/select.test.js +++ b/packages/select/test/visual/material/select.test.js @@ -118,4 +118,17 @@ describe('select', () => { element.value = 'item 1'; await visualDiff(div, 'width-value'); }); + + it('empty value', async () => { + // To make sure placeholder styles aren't applied to empty value item + element.placeholder = 'Placeholder'; + element.renderer = (root) => { + root.innerHTML = ` + + Empty + + `; + }; + await visualDiff(div, 'empty-value'); + }); }); diff --git a/packages/select/theme/lumo/vaadin-select-styles.js b/packages/select/theme/lumo/vaadin-select-styles.js index 6e247ef30ff..0509ab42b26 100644 --- a/packages/select/theme/lumo/vaadin-select-styles.js +++ b/packages/select/theme/lumo/vaadin-select-styles.js @@ -20,13 +20,13 @@ const select = css` } /* placeholder styles */ - :host(:not([has-value])) [part='input-field'] ::slotted([slot='value']) { + :host [part='input-field'] ::slotted([slot='value'][placeholder]) { color: inherit; transition: opacity 0.175s 0.1s; opacity: 0.5; } - :host([has-value]) [part='input-field'] ::slotted([slot='value']) { + :host [part='input-field'] ::slotted([slot='value']) { color: var(--lumo-body-text-color); } diff --git a/packages/select/theme/material/vaadin-select-styles.js b/packages/select/theme/material/vaadin-select-styles.js index 322ad432eb4..b6bad4eb7da 100644 --- a/packages/select/theme/material/vaadin-select-styles.js +++ b/packages/select/theme/material/vaadin-select-styles.js @@ -15,13 +15,13 @@ const select = css` } /* placeholder styles */ - :host(:not([has-value])) [part='input-field'] ::slotted([slot='value']) { + :host [part='input-field'] ::slotted([slot='value'][placeholder]) { color: var(--material-disabled-text-color); transition: opacity 0.175s 0.1s; opacity: 1; } - :host([has-value]) [part='input-field'] ::slotted([slot='value']) { + :host [part='input-field'] ::slotted([slot='value']) { color: var(--material-body-text-color); }