Skip to content

refactor!: Base combo box styles #8932

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: base-styles
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 3 additions & 36 deletions packages/combo-box/src/vaadin-lit-combo-box-item.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
* Copyright (c) 2015 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css, html, LitElement } from 'lit';
import { html, LitElement } from 'lit';
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
import { itemStyles } from '@vaadin/item/src/vaadin-item-styles.js';
import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
import { ComboBoxItemMixin } from './vaadin-combo-box-item-mixin.js';

Expand All @@ -25,41 +26,7 @@ export class ComboBoxItem extends ComboBoxItemMixin(ThemableMixin(DirMixin(Polyl
}

static get styles() {
return css`
:host {
align-items: center;
border-radius: var(--vaadin-item-border-radius, var(--_vaadin-radius-m));
box-sizing: border-box;
cursor: pointer;
display: flex;
gap: var(--vaadin-item-gap, 0 var(--_vaadin-gap-container-inline));
height: var(--vaadin-item-height, auto);
padding: var(--vaadin-item-padding, var(--_vaadin-padding-container));
}

:host([focused]) {
outline: var(--vaadin-focus-ring-width) solid var(--vaadin-focus-ring-color);
outline-offset: 1px;
}

:host([hidden]) {
display: none;
}

[part='checkmark'] {
height: var(--vaadin-icon-size, 1lh);
mask-image: var(--_vaadin-icon-checkmark);
width: var(--vaadin-icon-size, 1lh);
}

:host([selected]) [part='checkmark'] {
background: var(--_vaadin-color-subtle);
}

[part='content'] {
flex: 1;
}
`;
return itemStyles;
}

/** @protected */
Expand Down
5 changes: 3 additions & 2 deletions packages/combo-box/src/vaadin-lit-combo-box-overlay.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ const comboBoxOverlayStyles = css`
box-sizing: border-box;
display: none;
height: var(--vaadin-icon-size, 1lh);
inset: 6px 8px auto auto;
inset-block-start: calc(var(--vaadin-item-overlay-padding, 4px) + 6px);
inset-inline-end: 8px;
pointer-events: none;
position: absolute;
width: var(--vaadin-icon-size, 1lh);
Expand All @@ -44,7 +45,7 @@ const comboBoxOverlayStyles = css`
}

:host([loading]) [part~='content'] {
min-height: calc(var(--vaadin-icon-size, 1lh) + 12px);
min-height: calc(var(--vaadin-icon-size, 1lh) + 12px + var(--vaadin-item-overlay-padding, 4px) * 2);
}

@keyframes spin {
Expand Down
14 changes: 4 additions & 10 deletions packages/combo-box/src/vaadin-lit-combo-box-scroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,18 @@ export class ComboBoxScroller extends ComboBoxScrollerMixin(PolylitMixin(LitElem
static get styles() {
return css`
:host {
--vaadin-item-checkmark-display: block;
/* Fixes scrollbar disappearing when 'Show scroll bars: Always' enabled in Safari */
box-shadow: 0 0 0 white;
display: block;
min-height: 1px;
overflow: auto;

/* Fixes item background from getting on top of scrollbars on Safari */
transform: translate3d(0, 0, 0);

/* Enable momentum scrolling on iOS */
-webkit-overflow-scrolling: touch;

/* Fixes scrollbar disappearing when 'Show scroll bars: Always' enabled in Safari */
box-shadow: 0 0 0 white;
}

#selector {
border-color: var(--_vaadin-combo-box-items-container-border-color, transparent);
border-style: var(--_vaadin-combo-box-items-container-border-style, solid);
border-width: var(--_vaadin-combo-box-items-container-border-width, 4px);
border: var(--vaadin-item-overlay-padding, 4px) solid transparent;
position: relative;
}
`;
Expand Down
51 changes: 51 additions & 0 deletions packages/item/src/vaadin-item-styles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/**
* @license
* Copyright (c) 2017 - 2025 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import '@vaadin/component-base/src/style-props.js';
import { css } from 'lit';

export const itemStyles = css`
@layer base {
:host {
align-items: center;
border-radius: var(--vaadin-item-border-radius, var(--_vaadin-radius-m));
box-sizing: border-box;
cursor: pointer;
display: flex;
gap: var(--vaadin-item-gap, 0 var(--_vaadin-gap-container-inline));
height: var(--vaadin-item-height, auto);
padding: var(--vaadin-item-padding, var(--_vaadin-padding-container));
}

:host([focus-ring]) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This won't apply to combo-box items since we use focused attribute there, not focus-ring.
Maybe this could be aligned to make reusing styles easier. @jouni WDYT?

outline: var(--vaadin-focus-ring-width) solid var(--vaadin-focus-ring-color);
outline-offset: calc(var(--vaadin-focus-ring-width) / -1);
}

:host([disabled]) {
cursor: not-allowed;
opacity: 0.5;
}

:host([hidden]) {
display: none;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's use !important for consistency with other components:

Suggested change
display: none;
display: none !important;

}

[part='checkmark'] {
display: var(--vaadin-item-checkmark-display, none);
height: var(--vaadin-icon-size, 1lh);
mask-image: var(--_vaadin-icon-checkmark);
width: var(--vaadin-icon-size, 1lh);
}

:host([selected]) [part='checkmark'] {
background: var(--_vaadin-color-subtle);
}

[part='content'] {
flex: 1;
}
}
`;
1 change: 1 addition & 0 deletions packages/vaadin-lumo-styles/style.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ const globals = css`
--vaadin-item-border-radius: var(--lumo-border-radius-m);
--vaadin-item-gap: 0;
--vaadin-item-height: auto;
--vaadin-item-overlay-padding: var(--lumo-space-xs);
--vaadin-item-padding: 0.5em calc(var(--lumo-space-l) + var(--lumo-border-radius-m) / 4) 0.5em
var(--_lumo-list-box-item-padding-left, calc(var(--lumo-border-radius-m) / 4));
}
Expand Down
Loading