.input-active-styles { color: var(--color-text-input); background-color: var(--color-background-input-focus); outline-color: var(--color-outline-input-focus); } .input-element-wrapper { display: grid; grid-template: /* We present a variable to set a uniform row height when needed; otherwise, we fall back to the sensible `auto` value. */ [input-element-start] "icon-starting-offset input-icon icon-content-gap content button-content-gap input-button button-ending-offset" var( --input-element-row-height, auto ) [input-element-end] / [input-element-start] var( --input-icon-starting-offset ) var(--input-icon-width) var(--input-icon-content-gap) minmax(0, 1fr) var(--input-button-content-gap) var(--input-button-width) var( --input-button-ending-offset ) [input-element-end]; align-items: center; .input-element { grid-area: input-element; box-sizing: border-box; padding: 0.25em 0.5em; /* 4px at 16px/1em and 8px at 16px/1em */ font-size: var(--base-font-size-px); font-family: "Source Sans 3 VF", sans-serif; line-height: 1.25; text-overflow: ellipsis; color: var(--color-text-input); background: var(--color-background-input); outline: 1px solid var(--color-outline-input); outline-offset: -1px; border: none; border-radius: 4px; transition: 0.1s linear; transition-property: outline-color, box-shadow; &:hover { outline-color: var(--color-outline-input-hover); } &:focus { @extend .input-active-styles; box-shadow: 0 0 5px var(--color-box-shadow-input-focus); } } &.has-input-icon .input-element { padding-left: calc( var(--input-icon-starting-offset) + var(--input-icon-width) + var(--input-icon-content-gap) ); } &.has-input-button .input-element { padding-right: calc( var(--input-button-content-gap) + var(--input-button-width) + var(--input-button-ending-offset) ); } /* Special styles for input with pills */ &.has-input-pills .pill-container { .input { flex-grow: 1; /* Override default values in web/styles/input_pill.css */ padding: 0; line-height: inherit; &:empty::before { color: var(--color-text-placeholder); content: attr(data-placeholder); } } .pill { height: 1.25em; /* 20px at 16px/1em */ } &:has(.input:hover) { outline-color: var(--color-outline-input-hover); } &:has(.input:focus) { @extend .input-active-styles; box-shadow: 0 0 5px var(--color-box-shadow-input-focus); } } } .input-icon { grid-area: input-icon; /* Matching the color of input icon on the left to that of a neutral icon button gives us a consistent look when paired with the input button on the right. */ color: var(--color-text-neutral-icon-button); /* We need to set the z-index, since the input icon comes before the input element in the DOM, but we want to display it over the input element in the UI. */ z-index: 1; pointer-events: none; } .input-button { grid-area: input-button; padding: 0.25em; /* 4px at 16px/1em */ } .filter-input { /* We use the `input` tag in the selector to avoid conflicts with the pill containing counterpart, which uses a `contenteditable` div instead of an input element, and thus doesn't support the placeholder pseudo-classes. */ input.input-element { &:placeholder-shown { /* In case of filter inputs, when the input field is empty, we hide the input button and adjust the right padding to compensate for the same. */ padding-right: 0.5em; ~ .input-close-filter-button { visibility: hidden; } } &:not(:placeholder-shown) { @extend .input-active-styles; } } /* Specific styles for filter input with pills */ &.has-input-pills { &:not(:has(.pill)):has(.input:empty) { .input-element { padding-right: 0.5em; } .input-close-filter-button { visibility: hidden; } } &:has(.pill):not(:has(.input:empty)) .input-element { @extend .input-active-styles; } } }