Form Input Component
A CSS implementation of the Sprout Form input component.
Example
html
<div class="spr-stack-container-md">
<div class="spr-form-input-container">
<input class="spr-form-input" placeholder="Content">
</div>
<div class="spr-form-input-container">
<input class="spr-form-input error" placeholder="Content">
</div>
<div class="spr-form-input-container">
<input class="spr-form-input" disabled="disabled" placeholder="Content">
</div>
<div class="spr-form-input-container">
<input class="spr-form-input error" disabled="disabled" placeholder="Content">
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label" for="labeled-input">Label</label>
<input class="spr-form-input" id="labeled-input" placeholder="Content">
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label" for="labeled-input">Label</label>
<input class="spr-form-input" id="labeled-input" placeholder="Content">
<div class="spr-form-input-helper-text">Helper text goes here.</div>
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label error" for="labeled-input">Label</label>
<input class="spr-form-input error" id="labeled-input" placeholder="Content">
<div class="spr-form-input-helper-text spr-helper-text-error">Helper text goes here.</div>
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label" for="labeled-input">Label</label>
<input class="spr-form-input" disabled="disabled" id="labeled-input" placeholder="Content">
<div class="spr-form-input-helper-text disabled">Helper text goes here.</div>
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label disabled" for="labeled-input">Label</label>
<input class="spr-form-input" id="labeled-input" disabled="disabled" placeholder="Content">
<div class="spr-form-input-helper-text disabled">Helper text goes here.</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input spr-select">
<div style="display:flex;flex-direction:row;justify-content:space-between;">
<div>Sprout</div>
<i class="spr-icon spr-icon-carat-down"></i>
</div>
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input spr-select error">
<div style="display:flex;flex-direction:row;justify-content:space-between;">
<div>Sprout</div>
<i class="spr-icon spr-icon-carat-down error"></i>
</div>
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input spr-select disabled">
<div style="display:flex;flex-direction:row;justify-content:space-between;">
<div>Sprout</div>
<i class="spr-icon spr-icon-carat-down"></i>
</div>
</div>
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label" for="labeled-input">Label</label>
<div class="spr-form-input spr-select">
<div style="display:flex;flex-direction:row;justify-content:space-between;">
<div>Sprout</div>
<i class="spr-icon spr-icon-carat-down"></i>
</div>
</div>
<div class="spr-form-input-helper-text">Helper text goes here.</div>
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label" for="labeled-input">Label</label>
<div class="spr-form-input spr-select">
<div style="display:flex;flex-direction:row;justify-content:space-between;">
<div>Sprout</div>
<i class="spr-icon spr-icon-carat-down"></i>
</div>
</div>
</div>
<div class="spr-form-input-container">
<label class="spr-form-input-label" for="labeled-input">Label</label>
<div class="spr-form-input spr-select focus">
<div style="display:flex;flex-direction:row;justify-content:space-between;">
<div>Sprout</div>
<i class="spr-icon spr-icon-carat-down"></i>
</div>
</div>
<div class="spr-popover-container">
<div class="spr-popover">
<div class="spr-select-menu">
<div class="spr-select-option selected">Selected Option</div>
<div class="spr-select-option">Not Selected Option</div>
<div class="spr-select-option disabled">Disabled Option</div>
</div>
</div>
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input-icon-wrap">
<i class="spr-icon spr-icon-check spr-form-input-leading-icon"></i>
<input class="spr-form-input with-leading-icon" id="labeled-input" placeholder="Content">
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input-icon-wrap">
<i class="spr-icon spr-icon-visibility-on spr-form-input-trailing-icon"></i>
<input class="spr-form-input with-trailing-icon" id="labeled-input" placeholder="Content">
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input-icon-wrap">
<i class="spr-icon spr-icon-check spr-form-input-leading-icon"></i>
<i class="spr-icon spr-icon-visibility-on spr-form-input-trailing-icon"></i>
<input class="spr-form-input with-leading-icon with-trailing-icon" id="labeled-input" placeholder="Content">
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input-icon-wrap">
<i class="spr-icon spr-icon-visibility-on spr-form-input-trailing-icon error"></i>
<input class="spr-form-input with-trailing-icon error" id="labeled-input" placeholder="Content">
</div>
</div>
<div class="spr-form-input-container">
<div class="spr-form-input-icon-wrap">
<i class="spr-icon spr-icon-visibility-on spr-form-input-trailing-icon disabled"></i>
<input class="spr-form-input with-trailing-icon" disabled id="labeled-input" placeholder="Content">
</div>
</div>
</div>
Compiled CSS
Example
scss
@import 'components/form-input';
css
compiled
@keyframes openPopover {
from {
transform: scale(0.9);
}
to {
transform: scale(1);
}
}
.spr-select {
cursor: pointer;
}
.spr-select-menu {
max-height: 23.4375rem;
overflow: auto;
}
.spr-select-option {
padding: 0.875rem 0.875rem;
transition-property: background-color, color;
transition-duration: 0.11s;
transition-timing-function: ease-in-out;
background-color: #fff;
cursor: pointer;
}
.spr-select-option.selected {
font-weight: 600;
}
.spr-select-option.disabled {
cursor: default;
pointer-events: none;
opacity: 0.5;
background-color: #fff !important;
}
.spr-select-option.active, .spr-select-option:hover {
background-color: #e4e5e7;
}
@keyframes openDropdown {
from {
transform: scale(0.9);
}
to {
transform: scale(1);
}
}
.spr-form-input {
font-family: "AvenirNext", "Helvetica Neue", Arial, sans-serif;
font-size: 16px;
line-height: 1.375rem;
letter-spacing: 0;
font-weight: 400;
padding: 0.5rem 1rem;
box-sizing: border-box;
border: 1px solid #6b6f7b;
border-radius: 0.25rem;
transition-property: border-color, color;
transition-duration: 0.11s;
transition-timing-function: ease-in-out;
display: inline-block;
background-color: #fff;
width: 100%;
margin: 1px;
}
.spr-form-input::placeholder,
.spr-form-input .placeholder {
color: #bbbdc4;
transition-property: color;
transition-duration: 0.11s;
transition-timing-function: ease-in-out;
}
.spr-form-input.error {
box-sizing: border-box;
border: 1px solid #dd1d33;
border-radius: 0.25rem;
color: #dd1d33;
}
.spr-form-input.error::placeholder {
color: #dd1d33;
}
.spr-form-input:hover, .spr-form-input.hover {
box-sizing: border-box;
border: 2px solid #2ba148;
border-radius: 0.25rem;
box-shadow: none;
margin: 0;
}
.spr-form-input:hover.error, .spr-form-input.hover.error {
box-sizing: border-box;
border: 2px solid #dd1d33;
border-radius: 0.25rem;
}
.spr-form-input:hover .spr-icon-carat-down, .spr-form-input.hover .spr-icon-carat-down {
margin-right: -2px;
}
.spr-form-input:focus, .spr-form-input.focus {
outline: none;
}
.spr-form-input:focus:not(.spr-focus-disabled), .spr-form-input.focus:not(.spr-focus-disabled) {
transition-property: box-shadow, color;
transition-duration: 0.11s;
transition-timing-function: ease-in-out;
box-sizing: border-box;
border: 2px solid #2ba148;
border-radius: 0.25rem;
box-shadow: 0 0 0 0.125rem rgba(43, 161, 72, 0.35);
margin: 0;
}
.spr-form-input:focus:not(.spr-focus-disabled)::placeholder, .spr-form-input.focus:not(.spr-focus-disabled)::placeholder {
color: transparent;
}
.spr-form-input:focus:not(.spr-focus-disabled).error, .spr-form-input.focus:not(.spr-focus-disabled).error {
box-sizing: border-box;
border: 2px solid #dd1d33;
border-radius: 0.25rem;
box-shadow: 0 0 0 0.125rem rgba(221, 29, 51, 0.35);
}
.spr-form-input:disabled, .spr-form-input.disabled {
cursor: default;
pointer-events: none;
opacity: 0.5;
box-sizing: border-box;
border: 1px solid #6b6f7b;
border-radius: 0.25rem;
box-shadow: none;
margin: 1px;
}
.spr-form-input:disabled.error, .spr-form-input.disabled.error {
box-sizing: border-box;
border: 1px solid #dd1d33;
border-radius: 0.25rem;
box-shadow: none !important;
}
.spr-form-input-icon-wrap {
position: relative;
}
.spr-form-input-icon-wrap .spr-form-input-leading-icon,
.spr-form-input-icon-wrap .spr-form-input-trailing-icon {
position: absolute;
top: 0.5rem;
pointer-events: none;
}
.spr-form-input-icon-wrap .spr-form-input-leading-icon.error,
.spr-form-input-icon-wrap .spr-form-input-trailing-icon.error {
background-color: #dd1d33;
}
.spr-form-input-icon-wrap .spr-form-input-leading-icon.disabled,
.spr-form-input-icon-wrap .spr-form-input-trailing-icon.disabled {
cursor: default;
pointer-events: none;
opacity: 0.5;
background-color: #6b6f7b;
}
.spr-form-input-icon-wrap .spr-form-input-leading-icon {
left: 0.75rem;
}
.spr-form-input-icon-wrap .spr-form-input-trailing-icon {
right: 0.75rem;
}
.spr-form-input-icon-wrap .spr-form-input.with-leading-icon {
padding-left: 2.75rem;
}
.spr-form-input-icon-wrap .spr-form-input.with-trailing-icon {
padding-right: 2.75rem;
}
.spr-form-input-container {
display: inline-block;
vertical-align: top;
width: 100%;
}
.spr-form-input-label {
font-family: "AvenirNext", "Helvetica Neue", Arial, sans-serif;
font-size: 0.875rem;
line-height: 1.25rem;
letter-spacing: 0;
font-weight: 400;
margin-right: 1rem;
display: block;
font-weight: 600 !important;
}
.spr-form-input-label.disabled {
cursor: default;
pointer-events: none;
opacity: 0.5;
}
.spr-form-input-label.error {
color: #dd1d33;
}
.spr-form-input-helper-text {
font-family: "AvenirNext", "Helvetica Neue", Arial, sans-serif;
font-size: 0.75rem;
line-height: 1rem;
letter-spacing: 0;
font-weight: 400;
margin-right: 1rem;
margin-top: 0.25rem;
display: block;
color: #6b6f7b;
}
.spr-form-input-helper-text.disabled {
cursor: default;
pointer-events: none;
opacity: 0.5;
}
.spr-helper-text-error {
color: #dd1d33;
}