Form input styling
Basic Input
<input class="bf-input" />
<input class="bf-input" />
Label all inputs
Always include a readable label, preferably through a visible, connected <label>
element, or alternatively through a hidden aria-label
attribute.
Wrap the associated elements together in .bf-input-container
, for layout purposes.
<div class="bf-input-container"> <label for="uniqueInputId" class="bf-label">Label element</label> <input id="uniqueInputId" class="bf-input" placeholder="Labelled input" /> </div> <div class="bf-input-container"> <input class="bf-input" aria-label="Hidden label" placeholder="Input with hidden aria-label" /> </div>
<div class="bf-input-container"> <label for="uniqueInputId" class="bf-label">Label element</label> <input id="uniqueInputId" class="bf-input" placeholder="Labelled input" /> </div> <div class="bf-input-container"> <input class="bf-input" aria-label="Hidden label" placeholder="Input with hidden aria-label" /> </div>
Description
Additional information can be added on a .bf-label-description
element.
<div class="bf-input-container"> <label for="descInput" class="bf-label">Label element</label> <div class="bf-label-description">Additional information</div> <input id="descInput" class="bf-input" /> </div>
<div class="bf-input-container"> <label for="descInput" class="bf-label">Label element</label> <div class="bf-label-description">Additional information</div> <input id="descInput" class="bf-input" /> </div>
Feedback
You can provide dynamic feedback below the input with the .bf-label-feedback
class.
<div class="bf-input-container"> <label for="feedbkInput" class="bf-label">Label element</label> <input id="feedbkInput" class="bf-input" /> <div class="bf-label-feedback">Feedback text</div> </div>
<div class="bf-input-container"> <label for="feedbkInput" class="bf-label">Label element</label> <input id="feedbkInput" class="bf-input" /> <div class="bf-label-feedback">Feedback text</div> </div>
Alert state
Render a red underline when there's something wrong with the input,
using .bf-input-alert
on the container, preferably along with a feedback
message letting the user know what's wrong.
<div class="bf-input-container bf-input-alert"> <label for="alertInput" class="bf-label">Label element</label> <input id="alertInput" class="bf-input" /> <div class="bf-label-feedback">Invalid value</div> </div>
<div class="bf-input-container bf-input-alert"> <label for="alertInput" class="bf-label">Label element</label> <input id="alertInput" class="bf-input" /> <div class="bf-label-feedback">Invalid value</div> </div>
Disabled
Disable the field using .bf-input-disabled
on the container and
disabled
attribute on the input element.
<div class="bf-input-container bf-input-disabled"> <label for="disabledInput" class="bf-label">Label element</label> <input disabled id="disabledInput" class="bf-input" /> </div>
<div class="bf-input-container bf-input-disabled"> <label for="disabledInput" class="bf-label">Label element</label> <input disabled id="disabledInput" class="bf-input" /> </div>
Icon
Inputs are void elements, which means they cannot wrap around other elements, making it tricky to place icons and making sure they don't overlap the input text.
Therefore you need a few extra elements and classes to make sure everything looks and works correctly:
<div class="bf-input-container"> <label for="iconInput" class="bf-label">Left aligned icon</label> <div class="bf-input-icon-container bf-input-icon-left"> <input id="iconInput" class="bf-input" /> <span class="bf-input-icon"> <i class="fa-solid fa-user"></i> </span> </div> </div>
<div class="bf-input-container"> <label for="iconInput" class="bf-label">Left aligned icon</label> <div class="bf-input-icon-container bf-input-icon-left"> <input id="iconInput" class="bf-input" /> <span class="bf-input-icon"> <i class="fa-solid fa-user"></i> </span> </div> </div>
Search examples
The icon can placed right, and be a clickable button if you like, optionally styled as a filled button.
<div class="bf-input-container "> <div class="bf-input-icon-container bf-input-icon-left"> <input class="bf-input" placeholder="Filter" aria-label="Filter" /> <span class="bf-input-icon"> <i class="fa-solid fa-search"></i> </span> </div> </div> <div class="bf-input-container"> <div class="bf-input-icon-container bf-input-icon-right"> <input class="bf-input" placeholder="Search" aria-label="Search" /> <button class="bf-input-icon bf-input-icon-button"> <i class="fa-solid fa-search"></i> </button> </div> </div> <div class="bf-input-container"> <div class="bf-input-icon-container bf-input-icon-right bf-input-icon-button-filled" > <input class="bf-input" placeholder="Search button" aria-label="Search" /> <button class="bf-input-icon bf-input-icon-button"> <i class="fa-solid fa-search"></i> </button> </div> </div>
<div class="bf-input-container "> <div class="bf-input-icon-container bf-input-icon-left"> <input class="bf-input" placeholder="Filter" aria-label="Filter" /> <span class="bf-input-icon"> <i class="fa-solid fa-search"></i> </span> </div> </div> <div class="bf-input-container"> <div class="bf-input-icon-container bf-input-icon-right"> <input class="bf-input" placeholder="Search" aria-label="Search" /> <button class="bf-input-icon bf-input-icon-button"> <i class="fa-solid fa-search"></i> </button> </div> </div> <div class="bf-input-container"> <div class="bf-input-icon-container bf-input-icon-right bf-input-icon-button-filled" > <input class="bf-input" placeholder="Search button" aria-label="Search" /> <button class="bf-input-icon bf-input-icon-button"> <i class="fa-solid fa-search"></i> </button> </div> </div>
Loading spinner
<div class="bf-input-container">
<label for="loadingInput" class="bf-label">Loading...</label>
<div class="bf-input-icon-container bf-input-icon-right">
<input id="loadingInput" class="bf-input" />
<span class="bf-input-icon">
<i class="fa-duotone fa-spinner-third fa-spin bfc-theme"></i>
</span>
</div>
</div>
<div class="bf-input-container">
<label for="loadingInput" class="bf-label">Loading...</label>
<div class="bf-input-icon-container bf-input-icon-right">
<input id="loadingInput" class="bf-input" />
<span class="bf-input-icon">
<i class="fa-duotone fa-spinner-third fa-spin bfc-theme"></i>
</span>
</div>
</div>
Disable autocomplete
Disable the browser
autocomplete
with autocomplete="off"
<input autocomplete="off" />
<input autocomplete="off" />