Inputs. Sized, toned, animated.
One .lsd-input base — text, email, number, password, search,
textarea, select — with independent size, state, and
style modifiers. Every input chains the universal
.lsd-fx--* animation library, so the same lift / shimmer /
glow / border-draw effects you wire into buttons just work on a field.
.lsd-input
Token contract: --inp-bg, --inp-fg,
--inp-border, --inp-radius, --inp-pad-x,
--inp-pad-y, --inp-font, --inp-focus-color.
Applies to <input>, <textarea>, and
<select>.
sm / md (default) / lg
Size mods shift padding + font-size only. Border, radius, and tone stay the same.
<input class="lsd-input lsd-input--sm" /> <input class="lsd-input" /> <input class="lsd-input lsd-input--lg" />
text / email / number / password / search / textarea / select
Same base class, any HTML field type. Native semantics preserved.
<input class="lsd-input" type="email" /> <textarea class="lsd-input"></textarea> <select class="lsd-input">…</select>
default / focused / disabled / error / success / read-only
Use aria-invalid="true" for error, .is-success for success, disabled + readonly for inert states.
<input class="lsd-input" aria-invalid="true" /> <input class="lsd-input is-success" /> <input class="lsd-input" disabled />
auto (default) / block
.lsd-input--block stretches to fill its container. Default sizes to content / browser min.
<input class="lsd-input lsd-input--block" />
Eight input styles
Structural / decorative variants — distinct from state. Each is independent and chains
with sizes, states, and the universal .lsd-fx--* library below.
Filled
Solid bg, no border, soft inset highlight. Reads as a tile rather than an outlined box.
<input class="lsd-input lsd-input--filled" />
Outlined
Transparent bg, accent border. Loud variant for hero forms and CTAs.
<input class="lsd-input lsd-input--outlined" />
Underlined
Bottom border only, no padding inline. Minimal, editorial vibe.
<input class="lsd-input lsd-input--underlined" />
Floating label
Label rises into a caption when the field is focused or filled. Pure CSS via :has + :placeholder-shown.
<label class="lsd-input-float"> <input class="lsd-input" placeholder=" " /> <span class="lsd-input-float__label">Email</span> </label>
Icon prefix
Leading icon slot; icon tints with the focus color when the field is active.
<div class="lsd-input-icon"> <span class="lsd-input-icon__icon">⌕</span> <input class="lsd-input" type="search" /> </div>
Pre/post addons
Addons fused to the input shell, one perceived unit. Useful for URLs, units, or currencies.
<div class="lsd-input-addon"> <span class="lsd-input-addon__addon">https://</span> <input class="lsd-input" /> </div>
Frosted glass
backdrop-filter blur + saturate over an accent-tinted surface. Best layered over imagery.
<input class="lsd-input lsd-input--glass" />
Terminal
Monospace, dark, accent-2 caret that blinks. Pairs with command-palette UI.
<input class="lsd-input lsd-input--terminal"
value="> deploy --prod" />
Chain .lsd-fx--* onto a field
The universal animations from the buttons page are not button-specific — they read
only --accent, --accent-2, --accent-3 from the
host. Chain them onto any .lsd-input for hover/focus/loading/error feedback.
Lift + bloom on focus
Field elevates with a dual-color shadow when focused. Same shadow recipe used on buttons.
<input class="lsd-input lsd-fx--lift" />
Border draw on focus
Conic gradient animates around the outline. Triggered by :focus-within.
<input class="lsd-input lsd-fx--border-draw" />
Loading state — glow pulse
Continuous halo while the field is processing. Toggle to demo.
<input class="lsd-input lsd-fx--glow-pulse" />
Hover shimmer sweep
Diagonal light stripe sweeps across the field on hover. Pure CSS.
<input class="lsd-input lsd-input--filled
lsd-fx--shimmer" />
Error glitch (label)
Toggle to flip aria-invalid and run a brief glitch on the error label.
<span class="lsd-fx--glitch is-active">
<span class="lsd-fx__text"
data-text="INVALID">INVALID</span>
</span>
Shuffle on label
The universal shuffle works on any text node — here on a field label.
<span class="lsd-fx--letter-shuffle"
data-text="ACCESS CODE">
ACCESS CODE
</span>
.lsd-input--ripple-focus
A field-specific animation: when the input receives focus, a horizontal ripple line
emanates from the center along the bottom edge until it fills the full width. Pure
CSS via ::before + :focus. Different from
.lsd-fx--border-draw because it only touches the bottom edge.
Bottom-edge focus ripple
Pair with .lsd-input--underlined for the cleanest read. Reduced-motion downgrades to a simple fade.
<input class="lsd-input lsd-input--underlined
lsd-input--ripple-focus" />