Split text into characters, words, or lines.
Combine with stagger for fluid reveal animations.
Design is intelligence made visible — every pixel, every frame, every transition.
Masked split example
Hidden outside the parent until every character slides into place.
03 — Scroll Scrub
Scroll-linked motion.
Tie animation progress directly to scroll position.
Scrub forward and backward with sub-pixel precision, then optionally smooth the catch-up for faster wheel and trackpad input.
04 — Scroll Trigger Depth
Depth through motion.
Depth layers driven entirely by scroll trigger attributes.
Each shape scrubs at a different offset without a dedicated parallax helper.
05 — Interactive Triggers
Hover. Click. React.
Attach animations to hover and click events with data attributes.
Target other elements using CSS selectors.
Hover → scale + rotate
Click → elastic spin
Hover → blur + shrink
Hover → lift + fade
06 — Mouse Trigger
Follow the cursor.
Usedata-glm-trigger-mouseto map mouse movement to transform, scale,
opacity, and filter values. Adddata-glm-animate-onceto keep the last position instead of resetting.
Mouse
Reset On Idle
Move inside the stage. When you stop or leave, the orb eases back to center.
move mousereturns to rest
Mouse
Sticky Position
Withdata-glm-animate-once, the last mouse-driven state remains after you stop moving.
move mouseholds last state
07 — Mouse Cursor
Custom cursor objects.
Usedata-glm-mouse-objectto replace the cursor inside any region with a custom element.
Fade and scale appearance are optional, and hover targets can trigger an extra scale-up state.
Plugin
Cursor Region
Move through the region to see the custom cursor, then hover the blocks to scale the cursor object even more.
Hover the fieldcustom cursor active
Scale target
Scale target
Track motion
Fade on enter
Drag
08 — Magnetic Cursor
Elements that follow.
Magnetic effect — elements subtly gravitate toward
the cursor on hover. Perfect for CTAs and interactive elements.
Explore
Learn
Build
09 — Draggable
Drag with boundaries.
Adddata-glm-draggableto any element.
Pass a selector to keep it constrained inside a limit container, with smooth motion and inertia on release.
Plugin
Bounded Drag
Drag the block and release it. It keeps moving with inertia, but never leaves the dashed boundary.
limit: #drag-limit-demo
Drag
10 — Slider
Carousel with drag.
Configure rows per device, attach any blocks as arrow controllers,
enable loop mode, toggle drag inertia with a data attribute,
enable wheel or trackpad scrolling, and map slider velocity into your own CSS property.
GLM Slider Demodrag, wheel, flick, snap, loop
←
→
01 / MotionSnap to the nearest slide.
Release the track and it settles onto the closest page with smooth easing.
02 / ControlAny block can drive the carousel.
Use selector-based arrows so your own UI elements become slider controls.
03 / DevicesResponsive rows by attribute.
Desktop shows three items, tablet two, mobile one with the same markup.
04 / InertiaDrag with momentum.
Flick the track and inertia keeps it moving before the snap resolves.
05 / LoopWrap to the start again.
Arrow navigation can move one item at a time with its own slower speed profile.
06 / BuildPair it with your GLM addons.
Use it alongside draggable and easing-driven UI patterns in the same system.
Inertia + skew demodriven only by slider data attributes
←
→
01 / DriftCards lean into the motion.
As velocity rises, each card picks up a slight skew and settles back smoothly.
02 / InertiaFlick to feel the release.
The visual tilt stays alive through the momentum phase instead of stopping at pointer up.
03 / SnapEased settle, not a hard lock.
Arrow clicks and snap completion continue to drive the same skew response.
04 / LoopContinuous in both directions.
The looped track keeps the motion feeling uninterrupted while the cards react to speed.
11 — Easing Library
GSAP-grade easings.
All the classics: power1–4, back, elastic, bounce,
circ, expo, sine — plus custom cubic-bezier and steps.
Click any easing to preview.
power1.out
power2.out
power3.out
power4.out
back.out
back.in
back.inOut
elastic.out
elastic.in
bounce.out
bounce.in
circ.out
expo.out
sine.out
ease-in
ease-out
ease-in-out
12 — Data Attributes
Zero JavaScript required.
Add data attributes to any HTML element.
GLM auto-inits the animation engine on page load, and can also read matching `–glm-*` variables from `.glm-class-*` CSS classes.
<!– Fade-in on scroll into view –><divdata-glm-trigger-viewdata-glm-prop-translateY=„50px”data-glm-prop-opacity=„0”data-glm-easing=„power3.out”data-glm-duration=„0.8”><!– Treat attribute props as .to() values instead of .from() –><divdata-glm-trigger-viewdata-glm-todata-glm-prop-translateY=„50px”data-glm-prop-opacity=„0.4”data-glm-duration=„0.8”><!– CSS class-driven config via –glm-* variables –>.glm-class-rise {–glm-trigger-view: true;–glm-prop-translateY: 50px;–glm-prop-opacity: 0;–glm-duration: 0.8;}<divclass=„glm-class-rise”><!– Scroll-scrub with blur filter –><divdata-glm-trigger-scrolldata-glm-prop-filter-blur=„20px”data-glm-prop-translateY=„100px”data-glm-scrub-smooth=„0.12”data-glm-scrub-max-step=„0.04”><!– Stagger children on view –><divdata-glm-trigger-viewdata-glm-staggerdata-glm-stagger-delay=„0.1”data-glm-prop-translateY=„30px”data-glm-prop-opacity=„0”><!– Text split with char stagger –><h2data-glm-split=„chars”data-glm-prop-translateY=„40px”data-glm-prop-opacity=„0”data-glm-stagger-delay=„0.03”><!– Masked text split reveal –><h2data-glm-split=„chars”data-glm-maskdata-glm-prop-translateY=„110%”data-glm-prop-opacity=„0”data-glm-stagger-delay=„0.02”><!– Clip-path reveal –><divdata-glm-trigger-viewdata-glm-prop-clippath=„inset(0% 100% 0% 0%)”data-glm-easing=„power3.out”data-glm-duration=„1”><!– Draggable inside boundary selector –><divid=„limit-box”>
<divdata-glm-draggable=„#limit-box”>
</div><!– Slider with responsive rows and controller selectors –><divdata-glm-sliderdata-glm-slider-row=„3”data-glm-slider-row-tablet=„2”data-glm-slider-row-mobile=„1”data-glm-slider-free-scrolldata-glm-slider-inertiadata-glm-slider-inertia-prop=„–slider-skew”data-glm-slider-inertia-minmax=„-7, 7”data-glm-slider-inertia-units=„deg”data-glm-slider-inertia-strength=„0.035”data-glm-slider-speed=„0.8”data-glm-slider-snap-speed=„1”data-glm-slider-scroll=„1”data-glm-slider-scrollsnap=„1”data-glm-slider-left-arrow=„.leftarrow”data-glm-slider-right-arrow=„.rightarrow”data-glm-slider-loopdata-glm-slider-snap><!– Mouse trigger area –><divdata-glm-trigger-mouse=„.mouse-area”data-glm-prop-translateX=„36px”data-glm-prop-translateY=„24px”data-glm-prop-scale=„1.15”><!– Magnetic button –><buttondata-glm-magneticdata-glm-magnetic-strength=„0.35”data-glm-magnetic-ease=„0.08”><!– Custom cursor region –><divdata-glm-mouse-object=„.cursor-template”data-glm-mouse-fadedata-glm-mouse-scaledata-glm-mouse-scale-object=„.cursor-target”><!– Click trigger on external element –><divdata-glm-trigger-click=„#my-button”data-glm-prop-scale=„1.5”data-glm-easing=„elastic.out”>
Default attribute mode = from
`data-glm-to` = to
`.glm-class-*` reads `–glm-*` from CSS
Class config can also opt into `to` mode
13 — JavaScript API
Full programmatic control.
For complex sequences, use the JS API directly.
GLM.to()
Animate from current state to target values. Returns a controllable Tween.
GLM.from()
Set initial values, then animate back to element’s natural state.
GLM.fromTo()
Full control — define both start and end animation states explicitly.
GLM.timeline()
Sequence tweens with position offsets. Chain .to() calls with timeline offsets like -0.3s or +0.2.
GLM.scrollTrigger()
Link tween progress to scroll position with scrub, pin, and markers.
GLM.splitText()
Split into .chars, .words, or .lines arrays for targeted animation.
GLM.set()
Apply transform, filter, and opacity states immediately before or between tweens.
GLM.magnetic()
Cursor-following magnetic attraction with configurable strength and ease.
GLM.draggable()
Drag elements freely or constrain them inside a boundary element via selector.
GLM.slider()
Responsive carousels with drag inertia, snapping, looping, and external arrow controls.
Enable lerp-based smooth scrolling with a single call.
Wraps your content in a fixed container and interpolates
scroll position for that silk-like feel.
// Wrap content in a container and enable smooth scroll// HTML: <div id=”smooth-wrapper”>…all content…</div>constsmooth =GLM.smoothScroll({
content:‘#smooth-wrapper’,
lerp:0.08});// Destroy when neededsmooth.kill();
Smooth scroll code example (disabled on this WordPress demo)GLM.smoothScroll({ content: ‘#page-content’, lerp: 0.08 })
// Minimal page structure<divid=„page-content”>
…
</div>// Enable smooth scrolling after DOM is readyGLM.smoothScroll({
content:‘#page-content’,
lerp:0.08});