Portfolio
  • 01Home
  • 02Projects
  • 03About
  • 04Skills
  • 05Lab
  • 06Writing
  • 07Contact

© 2026 Hamza Syrage

LabView all
Arrow FieldCursorCursor SpotlightCursorGooey CursorCursorImage CompareMediaInteractive ChartDataMagnetic ButtonInteractionMarquee RevealTypographyMorphing ShapeAnimationsNested ViewsOverlaysOdometer CounterDataParticle ConstellationCanvasRipple ClickButtonsScroll RevealScrollShuffle GridLayoutStep WizardNavigationTabsNavigationTilt CardCards

UI Experiments

All Lab Entries
Cursor

Gooey Cursor

A trail of blobs that melt into each other using nothing but blur and contrast.

The "gooey" effect is usually an SVG filter with feGaussianBlur and feColorMatrix. You can get the same result with two CSS filter functions, no SVG, no canvas, no JavaScript math.

#Step 1 - CSS filters

Two CSS properties do all the work. blur() softens each blob's edge, and extreme contrast snaps every soft pixel back to fully solid or fully transparent. When two blobs overlap, their blurred edges combine, and the contrast threshold fuses them.

Two blobs merging via blur + contrast

tsx
Loading...

#Step 2 - Spring follow

Each blob tracks the cursor with useSpring at a different stiffness. The first blob is snappy (stiffness 300), the second is laggy (stiffness 225). The difference creates a trailing effect without separate animation logic for each blob.

Two blobs tracking the cursor with different spring stiffness

Move your cursor

tsx
Loading...

#Step 3 - Blob styling

Style the blobs as claret circles with bg-primary. The contrast filter on the parent container merges overlapping blobs into one continuous membrane. The wrapper background must match or be transparent, otherwise the contrast will posterize it.

Claret blobs with gooey merge via contrast filter

Move your cursor

tsx
Loading...

#Step 4 - Multiple blobs

Scale to 5 blobs with decreasing size (52px to 16px) and stiffness (300 to 160). The larger blobs lead and the smaller ones trail, creating an organic taper instead of a string of identical beads.

5 blobs with decreasing size and stiffness

Move your cursor

tsx
Loading...

#Step 5 - Configuration

Adjust blob count, base stiffness, blur radius, and blob size. Lower blur values create less gooey stretch. Higher stiffness makes the trail shorter and more responsive.

Adjustable blob count, stiffness, and blur

Blobs5
Stiffness300
Blur14px
Blob size52px

Move your cursor

tsx
Loading...

#Configuration

Tune everything: number of blobs, spring stiffness, blur amount, and blob size. The code updates in real-time.

Move your cursor

All parameters
Blob count5
Stiffness300
Blur14px
Blob size52px
tsx
Loading...