@vaadin/vaadin-lumo-styles
Version:
Lumo is a design system foundation for modern web applications, used by Vaadin components
188 lines (159 loc) • 5.95 kB
CSS
/**
* @license
* Copyright (c) 2017 - 2026 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
@media lumo_mixins_field-base {
:host {
display: inline-flex;
outline: none;
--lumo-text-field-size: var(--lumo-size-m);
color: var(--vaadin-input-field-value-color, var(--lumo-body-text-color));
font-size: var(--vaadin-input-field-value-font-size, var(--lumo-font-size-m));
font-family: var(--lumo-font-family);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-tap-highlight-color: transparent;
padding: var(--lumo-space-xs) 0;
--_focus-ring-color: var(--vaadin-focus-ring-color, var(--lumo-primary-color-50pct));
--_focus-ring-width: var(--vaadin-focus-ring-width, 2px);
--_input-height: var(--vaadin-input-field-height, var(--lumo-text-field-size));
--_disabled-value-color: var(--vaadin-input-field-disabled-value-color, var(--lumo-disabled-text-color));
}
:host::before {
content: '\2003';
width: 0;
/* Size and position this element on the same vertical position as the input-field element
to make vertical align for the host element work as expected */
height: var(--_input-height);
box-sizing: border-box;
display: inline-flex;
align-items: center;
}
[class$='container'] {
display: flex;
flex-direction: column;
min-width: 100%;
max-width: 100%;
width: var(--vaadin-field-default-width, 12em);
}
:host([hidden]) {
display: none ;
}
:host([focused]) [part='input-field'] ::slotted(:is(input, textarea)) {
mask-image: none;
}
::slotted(:is(input, textarea):placeholder-shown) {
color: var(--vaadin-input-field-placeholder-color, var(--lumo-secondary-text-color));
}
/* Hover */
:host(:hover:not([readonly]):not([focused]):not([disabled])) [part='input-field']::after {
opacity: var(--vaadin-input-field-hover-highlight-opacity, 0.1);
}
/* Touch device adjustment */
@media (pointer: coarse) {
:host(:hover:not([readonly]):not([focused]):not([disabled])) [part='input-field']::after {
opacity: 0;
}
:host(:active:not([readonly]):not([focused]):not([disabled])) [part='input-field']::after {
opacity: 0.2;
}
}
/* Trigger when not focusing using the keyboard */
:host([focused]:not([focus-ring]):not([readonly])) [part='input-field']::after {
transform: scaleX(0);
transition-duration: 0.15s, 1s;
}
/* Opt-in focus-ring when using pointer devices */
/* This applies a focus-ring as box-shadow when the element is focused, but
the ring is only visible / has a width when the respective CSS property is
"enabled" using a value of 1 */
:host([focused]) [part='input-field'] {
/* Borders are implemented using box-shadows as well. To avoid overriding
the border on focus, even if the pointer focus-ring is disabled, we need to:
- Duplicate the border box shadow for this rule
- Remove the border (by using width of 0) when the focus-ring is visible,
which is the same behavior as for the keyboard focus-ring below
- Apply the border when the focus ring is not visible
*/
--_pointer-focus-visible: clamp(0, var(--lumo-input-field-pointer-focus-visible, 0), 1);
--_conditional-border-width: calc(calc(1 - var(--_pointer-focus-visible)) * var(--_input-border-width));
--_conditional-focus-ring-width: calc(var(--_pointer-focus-visible) * var(--_focus-ring-width));
box-shadow:
inset 0 0 0 var(--_conditional-border-width) var(--_input-border-color),
0 0 0 var(--_conditional-focus-ring-width) var(--_focus-ring-color);
}
/* Focus-ring when using keyboard navigation */
:host([focus-ring]) [part='input-field'] {
box-shadow: 0 0 0 var(--_focus-ring-width) var(--_focus-ring-color);
}
/* Read-only and disabled */
:host(:is([readonly], [disabled])) ::slotted(:is(input, textarea):placeholder-shown) {
opacity: 0;
}
/* Read-only style */
:host([readonly]) {
--vaadin-input-field-border-color: transparent;
}
/* Disabled style */
:host([disabled]) {
pointer-events: none;
--vaadin-input-field-border-color: var(--lumo-contrast-20pct);
}
:host([disabled]) [part='label'],
:host([disabled]) [part='input-field'] ::slotted([slot$='fix']) {
color: var(--lumo-disabled-text-color);
-webkit-text-fill-color: var(--lumo-disabled-text-color);
}
:host([disabled]) [part='input-field'] ::slotted(:not([slot$='fix'])) {
color: var(--_disabled-value-color);
-webkit-text-fill-color: var(--_disabled-value-color);
}
/* Invalid style */
:host([invalid]) {
--vaadin-input-field-border-color: var(--lumo-error-color);
--_focus-ring-color: var(--lumo-error-color-50pct);
}
:host([input-prevented]) [part='input-field'] {
animation: shake 0.15s infinite;
}
@keyframes shake {
25% {
transform: translateX(4px);
}
75% {
transform: translateX(-4px);
}
}
/* Small theme */
:host([theme~='small']) {
font-size: var(--lumo-font-size-s);
--lumo-text-field-size: var(--lumo-size-s);
}
:host([theme~='small']) [part='label'] {
font-size: var(--lumo-font-size-xs);
}
:host([theme~='small']) [part='error-message'] {
font-size: var(--lumo-font-size-xxs);
}
/* Slotted content */
[part='input-field'] ::slotted(:not(vaadin-icon):not(input):not(textarea)) {
color: var(--lumo-secondary-text-color);
font-weight: 400;
}
[part~='clear-button']::before {
content: var(--lumo-icons-cross);
}
@media (forced-colors: active) {
:host(:not([readonly])) [part='input-field'] {
outline: 1px solid;
outline-offset: -1px;
}
:host([focused]) [part='input-field'] {
outline-width: 2px;
}
:host([disabled]) [part='input-field'] {
outline-color: GrayText;
}
}
}