#

#

Visual

SVG

SC Golden Spiral

SC Golden Spiral

SC Golden Spiral

Aug 26, 2025

0 views

An SVG point-field arranged along the golden-angle (Fermat) spiral. Each dot can pulse in size and opacity with phase offsets from the spiral index, and the entire field can rotate smoothly. Works great for meditative backgrounds, hero motifs, and data-art accents.

Lilac Flower
Lilac Flower
Lilac Flower
Lilac Flower
#
Built With
React, SVG, CSS, Framer Code Component API
#
Layout Support
Fully Responsive or fixed width/height
#
Orientation
Full Fill motif
#
Ideal Use Case
Ambient hero visuals, decorative backgrounds, brand motion textures
#
Built With
React, SVG, CSS, Framer Code Component API
#
Layout Support
Fully Responsive or fixed width/height
#
Orientation
Full Fill motif
#
Ideal Use Case
Ambient hero visuals, decorative backgrounds, brand motion textures
#
Built With
React, SVG, CSS, Framer Code Component API
#
Layout Support
Fully Responsive or fixed width/height
#
Orientation
Full Fill motif
#
Ideal Use Case
Ambient hero visuals, decorative backgrounds, brand motion textures

//

Tags

golden-angle
spiral
generative
svg
pulse
animation
rotate
responsive
//
Technologies
None (pure SVG/React)
//
Notes
No external libs; uses native SVG <animate> for per-dot motion.
//
Technologies
None (pure SVG/React)
//
Notes
No external libs; uses native SVG <animate> for per-dot motion.
//
Technologies
None (pure SVG/React)
//
Notes
No external libs; uses native SVG <animate> for per-dot motion.
#
Logic Level
Low–Medium (deterministic geometry + simple animation)
#
Runtime Cost
Low–Medium (hundreds of SVG circles + optional anim)
#
Component Size
~2–3 KB (raw TSX)
#
Notes
showFPS is debug-only; disable for production.
#
Logic Level
Low–Medium (deterministic geometry + simple animation)
#
Runtime Cost
Low–Medium (hundreds of SVG circles + optional anim)
#
Component Size
~2–3 KB (raw TSX)
#
Notes
showFPS is debug-only; disable for production.
#
Logic Level
Low–Medium (deterministic geometry + simple animation)
#
Runtime Cost
Low–Medium (hundreds of SVG circles + optional anim)
#
Component Size
~2–3 KB (raw TSX)
#
Notes
showFPS is debug-only; disable for production.
  1. Add SCGoldenSpiral to your canvas; choose Size Mode = fixed (px) or dynamic (% of container).

  2. Set Points (e.g., 400–1200) and Dot Radius (1.5–3 for dense fields).

  3. Enable Pulse Effect to animate dot r and opacity; choose Duration, Min/Max Size, Min/Max Opacity, and Pulse Direction (inside or outside).

  4. Toggle Rotate for slow turntable motion; adjust Rotation Speed and Direction.

  5. Frame the motif via Anchor presets plus X/Y Offset.

  • Calm Aura: points=700 · r=2 · pulseEffect=on · duration=4 · size 0.8–1.25 · opacity 0.25–0.9 · rotate off

  • Hero Drift: points=900 · r=2 · pulseEffect=on · duration=3 · rotate on · speed=0.2 · dir=clockwise

  • Minimal Static: points=500 · r=1.5 · pulseEffect=off · rotate off

  • Golden-angle placement: For index i (0-based), uses idx=i+0.5, frac=idx/N, r=√(frac)*maxRadius, θ=idx*φ, φ=π(3−√5).

  • Responsive sizing: maxRadius derives from the smaller of width/height; in dynamic mode it scales via Width%/Height% of the container.

  • Pulsing: Each circle animates r and opacity with SVG <animate>, offset by its normalized frac. Direction flips phase (inside uses 1−frac).

  • Rotation: A requestAnimationFrame loop increments a local rotation state; applied as transform: rotate(...) on the <svg>.

  • Anchoring: Predefined anchors shift the cluster by ±¼ of the shorter side; X/Y Offset fine-tunes.

  • SVG handles hundreds of circles well; thousands plus pulsing is still reasonable on desktops.

  • Prefer points ≤ 1200 on laptops; reduce dotRadius for density instead of adding excessive points.

  • Keep duration ≥ 2s for smoother, less battery-intense motion.

  • Disable showFPS when shipping.

  • Evergreen browsers support SVG animation broadly; older iOS Safari may need testing for heavy <animate> counts.

  • Rotation uses CSS transforms—GPU-friendly.

  • No SSR output differences; geometry is computed at mount with current box size.

  • Decorative by default; add aria-hidden="true" if it conveys no information.

  • If used behind text, ensure adequate contrast and avoid excessive motion that could distract.

  • No network, storage, or permissions.

  • Only window resize listeners; they’re removed on unmount.

  • No dangerouslySetInnerHTML or dynamic code execution.

Name

Type

Default

Description

points

number

600

Number of dots in the spiral

dotRadius

number

2

Base circle radius (px)

duration

number

3

Pulse cycle duration (seconds)

fillColor

string

#ffffff

Dot fill color

pulseEffect

boolean

true

Enable SVG pulse animation

opacityMin

number

0.3

Minimum opacity during pulse (0–1)

opacityMax

number

1

Maximum opacity during pulse (0–1)

sizeMin

number

0.5

Radius multiplier at pulse minimum

sizeMax

number

1.5

Radius multiplier at pulse peak

pulseDirection

enum

outside

Wave phase origin (inside/outside)

sizeMode

enum

fixed

Spiral bounds mode (fixed px or dynamic %)

ellipseWidth

number

200

Horizontal bound in px (fixed mode)

ellipseHeight

number

600

Vertical bound in px (fixed mode)

widthPercent

number

12

Horizontal bound as % of container (dynamic)

heightPercent

number

48

Vertical bound as % of container (dynamic)

positionAnchor

enum

center

Anchor for the spiral (center/top/bottom/left/right/corners)

xOffset

number

0

Additional X translation (px)

yOffset

number

0

Additional Y translation (px)

showFPS

boolean

false

Show live FPS counter (debug only)

rotate

boolean

false

Rotate the entire spiral group

rotationDirection

enum

counter-clockwise

Rotation direction

rotationSpeed

number

0.2

Angular step in degrees per animation frame

name:points
type:number
default:600
desc:Number of dots in the spiral
name:dotRadius
type:number
default:2
desc:Base circle radius (px)
name:duration
type:number
default:3
desc:Pulse cycle duration (seconds)
name:fillColor
type:string
default:#ffffff
desc:Dot fill color
name:pulseEffect
type:boolean
default:true
desc:Enable SVG pulse animation
name:opacityMin
type:number
default:0.3
desc:Minimum opacity during pulse (0–1)
name:opacityMax
type:number
default:1
desc:Maximum opacity during pulse (0–1)
name:sizeMin
type:number
default:0.5
desc:Radius multiplier at pulse minimum
name:sizeMax
type:number
default:1.5
desc:Radius multiplier at pulse peak
name:pulseDirection
type:enum
default:outside
desc:Wave phase origin (inside/outside)
name:sizeMode
type:enum
default:fixed
desc:Spiral bounds mode (fixed px or dynamic %)
name:ellipseWidth
type:number
default:200
desc:Horizontal bound in px (fixed mode)
name:ellipseHeight
type:number
default:600
desc:Vertical bound in px (fixed mode)
name:widthPercent
type:number
default:12
desc:Horizontal bound as % of container (dynamic)
name:heightPercent
type:number
default:48
desc:Vertical bound as % of container (dynamic)
name:positionAnchor
type:enum
default:center
desc:Anchor for the spiral (center/top/bottom/left/right/corners)
name:xOffset
type:number
default:0
desc:Additional X translation (px)
name:yOffset
type:number
default:0
desc:Additional Y translation (px)
name:showFPS
type:boolean
default:false
desc:Show live FPS counter (debug only)
name:rotate
type:boolean
default:false
desc:Rotate the entire spiral group
name:rotationDirection
type:enum
default:counter-clockwise
desc:Rotation direction
name:rotationSpeed
type:number
default:0.2
desc:Angular step in degrees per animation frame

Name

Type

Default

Description

name:points
type:number
default:600
desc:Number of dots in the spiral
name:dotRadius
type:number
default:2
desc:Base circle radius (px)
name:duration
type:number
default:3
desc:Pulse cycle duration (seconds)
name:fillColor
type:string
default:#ffffff
desc:Dot fill color
name:pulseEffect
type:boolean
default:true
desc:Enable SVG pulse animation
name:opacityMin
type:number
default:0.3
desc:Minimum opacity during pulse (0–1)
name:opacityMax
type:number
default:1
desc:Maximum opacity during pulse (0–1)
name:sizeMin
type:number
default:0.5
desc:Radius multiplier at pulse minimum
name:sizeMax
type:number
default:1.5
desc:Radius multiplier at pulse peak
name:pulseDirection
type:enum
default:outside
desc:Wave phase origin (inside/outside)
name:sizeMode
type:enum
default:fixed
desc:Spiral bounds mode (fixed px or dynamic %)
name:ellipseWidth
type:number
default:200
desc:Horizontal bound in px (fixed mode)
name:ellipseHeight
type:number
default:600
desc:Vertical bound in px (fixed mode)
name:widthPercent
type:number
default:12
desc:Horizontal bound as % of container (dynamic)
name:heightPercent
type:number
default:48
desc:Vertical bound as % of container (dynamic)
name:positionAnchor
type:enum
default:center
desc:Anchor for the spiral (center/top/bottom/left/right/corners)
name:xOffset
type:number
default:0
desc:Additional X translation (px)
name:yOffset
type:number
default:0
desc:Additional Y translation (px)
name:showFPS
type:boolean
default:false
desc:Show live FPS counter (debug only)
name:rotate
type:boolean
default:false
desc:Rotate the entire spiral group
name:rotationDirection
type:enum
default:counter-clockwise
desc:Rotation direction
name:rotationSpeed
type:number
default:0.2
desc:Angular step in degrees per animation frame
  • Decorative by default; add aria-hidden="true" if it conveys no information.

  • If used behind text, ensure adequate contrast and avoid excessive motion that could distract.

  • No network, storage, or permissions.

  • Only window resize listeners; they’re removed on unmount.

  • No dangerouslySetInnerHTML or dynamic code execution.

  • Original animation: Filip Zrnzević — golden-angle (Fermat) spiral of SVG circles with phased <animate> pulses for radius and opacity.

  • Framer/React adaptation: SecretoCho Design — responsive sizing (fixed/dynamic), anchor presets + X/Y offsets, global rotation, inside/outside pulse direction, property controls, and optional FPS overlay.

  • Derivative work notice: This component is an adaptation of Filip Zrnzević’s original concept. Before commercial use or redistribution, review the original work’s license/terms and ensure proper attribution consistent with those terms.

Filip Zrnzevic

Source Link

SecretoCho Design 2025

  • Derivative work notice: This component is an adaptation of Filip Zrnzević’s original concept. Before commercial use or redistribution, review the original work’s license/terms and ensure proper attribution consistent with those terms.

  • Warranty: Provided “as is” for visual/UX purposes only. Validate performance, accessibility (motion/contrast), and compatibility in your target environments.

Stay ahead of the curve with insights into emerging visualization trends and technologies.