@vaadin/field-base
Version:
Vaadin field base mixins
208 lines (180 loc) • 5.74 kB
JavaScript
/**
* @license
* Copyright (c) 2021 - 2026 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import '@vaadin/component-base/src/styles/style-props.js';
import { css } from 'lit';
export const field = css`
:host {
--_helper-below-field: initial;
--_helper-above-field: ;
--_no-label: initial;
--_has-label: ;
--_no-helper: initial;
--_has-helper: ;
--_no-error: initial;
--_has-error: ;
--_gap: var(--vaadin-input-field-container-gap, var(--vaadin-gap-xs));
--_gap-s: round(var(--_gap) / 3, 2px);
display: inline-grid;
grid-template:
'label' auto var(--_helper-above-field, 'helper' auto) 'baseline' 0 'input' 1fr var(
--_helper-below-field,
'helper' auto
)
'error' auto / 100%;
outline: none;
cursor: default;
-webkit-tap-highlight-color: transparent;
}
:host([has-label]) {
--_has-label: initial;
--_no-label: ;
}
:host([has-helper]) {
--_has-helper: initial;
--_no-helper: ;
}
:host([has-error-message]) {
--_has-error: initial;
--_no-error: ;
}
:host([hidden]) {
display: none ;
}
:host(:not([has-label])) [part='label'],
:host(:not([has-helper])) [part='helper-text'],
:host(:not([has-error-message])) [part='error-message'] {
display: none;
}
/* Baseline alignment guide */
:host::before {
content: '\\2003' / '';
grid-column: 1;
grid-row: var(--_has-label, label / baseline) var(--_no-label, label / input);
align-self: var(--_has-label, end) var(--_no-label, start);
font-size: var(--vaadin-input-field-value-font-size, inherit);
line-height: var(--vaadin-input-field-value-line-height, inherit);
padding: var(
--vaadin-input-field-padding,
var(--vaadin-padding-block-container) var(--vaadin-padding-inline-container)
);
border: var(--vaadin-input-field-border-width, 1px) solid transparent;
pointer-events: none;
margin-bottom: var(--_no-label, 0)
var(
--_has-label,
calc(
var(
--vaadin-field-baseline-input-height,
(1lh + var(--vaadin-padding-block-container) * 2 + var(--vaadin-input-field-border-width, 1px) * 2)
) *
-1
)
);
}
[class$='container'] {
display: contents;
}
[part] {
grid-column: 1;
}
[part='label'] {
font-size: var(--vaadin-input-field-label-font-size, inherit);
line-height: var(--vaadin-input-field-label-line-height, inherit);
font-weight: var(--vaadin-input-field-label-font-weight, 500);
color: var(--vaadin-input-field-label-color, var(--vaadin-text-color));
word-break: break-word;
position: relative;
grid-area: label;
margin-bottom: var(--_helper-below-field, var(--_gap)) var(--_helper-above-field, var(--_no-helper, var(--_gap)));
}
::slotted(label) {
cursor: inherit;
}
:host([disabled]) [part='label'],
:host([disabled]) ::slotted(label) {
opacity: 0.5;
}
:host([disabled]) [part='label'] ::slotted(label) {
opacity: 1;
}
:host([required]) [part='label'] {
padding-inline-end: 1em;
}
[part='required-indicator'] {
display: inline-block;
position: absolute;
width: 1em;
text-align: center;
color: var(--vaadin-input-field-required-indicator-color, var(--vaadin-text-color-secondary));
}
[part='required-indicator']::after {
content: var(--vaadin-input-field-required-indicator, '*');
}
:host(:not([required])) [part='required-indicator'] {
display: none;
}
[part='label'],
[part='helper-text'],
[part='error-message'] {
width: min-content;
min-width: 100%;
box-sizing: border-box;
}
[part='input-field'],
[part='group-field'],
[part='input-fields'] {
grid-area: input;
}
[part='input-field'] {
width: var(--vaadin-field-default-width, 12em);
max-width: 100%;
min-width: 100%;
}
:host([readonly]) [part='input-field'] {
cursor: default;
}
:host([disabled]) [part='input-field'] {
cursor: var(--vaadin-disabled-cursor);
}
[part='helper-text'] {
font-size: var(--vaadin-input-field-helper-font-size, inherit);
line-height: var(--vaadin-input-field-helper-line-height, inherit);
font-weight: var(--vaadin-input-field-helper-font-weight, 400);
color: var(--vaadin-input-field-helper-color, var(--vaadin-text-color-secondary));
grid-area: helper;
margin-top: var(--_helper-above-field, var(--_gap-s)) var(--_helper-below-field, var(--_gap));
margin-bottom: var(--_helper-above-field, var(--_gap));
}
[part='error-message'] {
font-size: var(--vaadin-input-field-error-font-size, inherit);
line-height: var(--vaadin-input-field-error-line-height, inherit);
font-weight: var(--vaadin-input-field-error-font-weight, 400);
color: var(--vaadin-input-field-error-color, var(--vaadin-text-color));
display: flex;
gap: var(--vaadin-gap-xs);
grid-area: error;
margin-top: var(--_has-helper, var(--_helper-below-field, var(--_gap-s)) var(--_helper-above-field, var(--_gap)))
var(--_no-helper, var(--_gap));
}
[part='error-message']::before {
content: '';
display: inline-block;
flex: none;
width: var(--vaadin-icon-size, 1lh);
height: var(--vaadin-icon-size, 1lh);
mask: var(--_vaadin-icon-warn) 50% / var(--vaadin-icon-visual-size, 100%) no-repeat;
background: currentColor;
}
:host([theme~='helper-above-field']) {
--_helper-above-field: initial;
--_helper-below-field: ;
}
@media (forced-colors: active) {
[part='error-message']::before {
background: CanvasText;
}
}
`;