Images, frames, aspect ratios. Then they arrive.
Three orthogonal concerns: .lsd-aspect locks proportion,
.lsd-frame is the chrome around the image,
.lsd-img is the surface effect. Layer any combination, then chain a
.lsd-fx--<entrance> on the wrapper for scroll-triggered arrival.
.lsd-aspect
A pure CSS utility — sets aspect-ratio: var(--ar) and clips children to
object-fit: cover. Same placeholder, ten ratios, immediately visible
proportional difference.
16 / 9
cinema<div class="lsd-aspect lsd-aspect--16-9">…</div>
4 / 3
classic3 / 2
photo1 / 1
square3 / 4
portrait4 / 5
portrait9 / 16
vertical21 / 9
ultra-widegolden
1.618silver
1.414.lsd-frame
A frame is the chrome around the image — border, shadow, corners, decoration.
Pair any frame with any aspect ratio:
<div class="lsd-frame lsd-frame--polaroid"><div class="lsd-aspect lsd-aspect--4-3">…</div></div>
bordered
F1shadowed
F2polaroid
F3magazine
F4ticket
F5film
F6ornate
F7vignette
F8label-strip
F9glass-card
F10.lsd-img
Surface treatments — hover transitions, idle motion, color and pointer effects. Independent of frame and aspect.
zoom-hover
I1scale(1.08) on hover
ken-burns
I2slow infinite scale + pan
parallax-bg
I3translates with --lsd-progress while scrolling
duotone
I4accent + accent-3 color overlay
mask-reveal
I5pointer-driven porthole — move over image
grayscale-hover
I6desaturated, color on hover
blur-hover
I7blurred at rest, sharp on hover
noise
I8SVG turbulence film grain
.lsd-fx--<entrance>
Each card carries .lsd-scroll .lsd-fx--<name>;
lsd-scroll-trigger.js adds .lsd-in-view on intersection and the
transition plays. Click Replay to re-arm the observer.
fade-in
E1slide-up
E2slide-left
E2scale-in
E3scale-out
E4blur-in
E5mask-up
E6mask-iris
E7rotate-in
E8flip-in
E9curtain
E10stagger-children
E12aspect + frame + img + entrance + hover
Every concern is an independent class. The whole stack chains on one element. Each card below combines all five layers.
polaroid + zoom + scale-in + lift
<div class="lsd-frame lsd-frame--polaroid
lsd-fx--scale-in lsd-fx--lift lsd-scroll lsd-scroll-once">
<div class="lsd-aspect lsd-aspect--1-1">
<div class="lsd-img lsd-img--zoom-hover" …></div>
</div>
</div>