All Work
NATURE CONCEPT / RO SELF-INITIATED PRODUCT

Licheanu.

Preserved-nature walls for premium interiors, brought into the dark technical-grid visual system as an organic brand concept. One real route deep, with motion carrying the rest.

ConceptArt DirectionMotion
Role
Concept + Design
Timeline
2026-06-04 to 2026-06-05, 5 commits
Live URL
licheanu.vercel.app ↗
Licheanu homepage

01 / THE REQUEST

The dark system,gone organic.

A self-initiated concept: prove the studio's dark, technical-grid visual language could flex into a living, natural brand without losing its identity. Preserved-nature wall installations for premium interiors were the subject.

02 / THE PROBLEM

Scroll motion driftsout of sync.

Two independent scroll systems, Lenis for smoothing and GSAP ScrollTrigger for scrubbed animation, will fight each other unless one drives the other explicitly. Left alone, a scrubbed timeline visibly lags behind the actual scroll position, especially right after a webfont swaps in and reflows the page, moving every trigger offset out from under the animations bound to them.

03 / THE CHALLENGE

One clock,re-armed on font load.

Lenis is driven off the GSAP ticker rather than its own requestAnimationFrame loop, with lagSmoothing(0) set so scrubbed timelines never fall behind during a heavy frame, and reduced-motion users skip Lenis instantiation entirely rather than getting a disabled-but-loaded smoothing layer (components/MotionSystem.tsx:27-67). ScrollTrigger.refresh() is explicitly re-fired after document.fonts.ready resolves, because Cormorant swapping in moves every trigger offset on the page and a stale offset means animations firing at the wrong scroll position.

A velocity-gated magnetic snap only fires once scrolling has actually stopped and only near a section boundary, and is desktop-only because the same effect on touch reads as motion sickness rather than polish. It carries a re-entrancy lock so a snap in progress can't be re-triggered by a second scroll event, and a timeout safety net in case the animation's onComplete callback is missed (components/motion/SnapController.tsx:7-63).

This is one real route deep. Seven further pages render through a client-side view rather than as separate Next.js routes, which is why the role stays Concept and Design rather than a full production build.

04 / THE SOLUTION

What gotbuilt.

GSAP-driven Lenis

Smooth scroll and scrubbed timelines share one clock, with lag smoothing disabled so nothing drifts.

Font-swap-safe triggers

ScrollTrigger.refresh() re-fires after webfonts load, so trigger offsets stay accurate post-reflow.

Velocity-gated magnetic snap

Fires only at rest, near a boundary, desktop-only, with a re-entrancy lock and a timeout fallback.

Reduced-motion aware

Lenis is never instantiated at all for users who ask for less motion.

05 / THE RESULT

A concept,proven live.

BUILT WITH

Next.js 15.0.4GSAPScrollTriggerLenissplit-type

Have a concept worth proving?

Next project

Santorini Gyros