Sphere Album

A sphere of image cards you can spin with the wheel, tumble freely with a drag, and click through to a detail page.

111

126 copies

Image preview

Live preview

Abstract dark glass form
Preview

About this component

Fibonacci-spiral placement (why cards don't bunch at the poles), and quaternion orientation instead of yaw/pitch. That second one gets a proper explanation plus two axis diagrams, since it's the bug you hit — a sideways drag rolling the sphere once it's tilted, then reversing past 90°.

Key features — eight, covering the trackball, the 90ms weighted throw, real anchors for links, the 6px drag-cancels-click rule, depth handling, frame-rate independence, static canvas rendering, and off-screen pausing.

Key features

True trackball drag — follows the pointer from any orientation, with no gimbal flip and no limit on how far it tumbles.

  • Weighted throw — release velocity is averaged over the last 90 ms, so a pause before letting go correctly doesn't throw.

  • Per-card links — every card is a real anchor, so page transitions, new-tab and keyboard access all behave normally.

  • Drag never navigates — a gesture longer than 6 px cancels the click, so dragging off a card won't open it.

  • Depth that reads — the front 45% stays sharp; blur and fade ramp up behind it, and back cards stop catching clicks.

  • Frame-rate independent — motion is integrated against elapsed time, so it feels identical at 60, 120 and 144 Hz.

  • Even spacing at any count — add or remove cards and the Fibonacci spiral redistributes them; nothing to rebalance by hand.

  • Quiet on the canvas — renders a single finished frame while designing and exporting, so Framer stays responsive.

  • Pauses off-screen — the loop stops when scrolled out of view or the tab is hidden, and resumes where it left o

API reference

Framer code component. Default export from SphereAlbum.tsx. Panel labels are shown in quotes where they differ from the prop name.

Cards

Prop

Control

Default

Range

items — "Cards"

Array of Object

20 placeholders

—

items[].image — "Image"

ResponsiveImage

empty

—

items[].title — "Title"

String

"Untitled"

—

items[].link — "Detail page"

Link

none

—

items[].width — "Width"

Number

80 px

20–320

items[].height — "Height"

Number

104 px

20–320

openInNewTab — "New tab"

Boolean

false

—

  • items — The cards on the sphere. Add or remove rows to change how many there are; spacing redistributes itself, so you never have to rebalance by hand.

  • items[].image — Cropped to fill the card. A row with no image shows a neutral gradient plate instead of a gap.

  • items[].title — Used as the card's accessible label, and as image alt text when the image has none.

  • items[].link — Where the card goes when clicked. Point it at a Framer page or an external URL. Leave it empty and the card becomes decorative but still spins.

  • items[].width — Card width before perspective. Mixing portrait and landscape sizes is what gives the sphere its scattered rhythm.

  • items[].height — Card height before perspective.

  • openInNewTab — Opens every linked card in a new tab, with rel="noopener noreferrer" applied.

Motion

Prop

Control

Default

Range

radius — "Radius"

Number

46 %

20–70

autoSpin — "Idle spin"

Number

0.11

0–1

dragSpeed — "Drag speed"

Number

0.58

0.1–2

wheelSpeed — "Scroll speed"

Number

0.26

0–1

damping — "Glide"

Number

0.945

0.85–0.99

captureWheel — "Scroll spins"

Boolean

true

—

enableZoom — "Pinch zoom"

Boolean

true

—

introMs — "Intro"

Number

900 ms

0–3000

  • radius — Sphere size as a share of the frame's shorter side, so it rescales with the frame instead of overflowing on phones.

  • autoSpin — The drift it settles back into when nobody is touching it. Set to 0 to have it come to a complete stop.

  • dragSpeed — How far the sphere turns per pixel dragged. At the default, a 100 px drag turns it about 33°.

  • wheelSpeed — How hard a scroll pushes the spin. Scrolling adds to velocity rather than setting position, so it coasts like a flick.

  • damping — How long a throw keeps going. Lower is heavier and stops sooner; 0.99 is nearly frictionless.

  • captureWheel — On, the wheel rotates the sphere and the page stays put. Turn it off when the sphere sits inside a scrolling page and you'd rather the page won.

  • enableZoom — Two-finger pinch, or ⌘/Ctrl + scroll, resizes the sphere between 0.62× and 1.7×.

  • introMs — Cards bloom outward from the centre on load, staggered. Set to 0 to start fully formed.

Appearance

Prop

Control

Default

Range

depthFade — "Depth fade"

Number

0.34

0–1

depthBlur — "Depth blur"

Number

2.2 px

0–6

hoverLift — "Hover lift"

Number

46 px

0–160

cardBackground — "Card fill"

Color

#ffffff

—

cardPadding — "Card inset"

Number

8 px

0–32

cardRadius — "Card radius"

Number

0 px

0–40

shadow — "Shadow"

Boolean

true

—

  • depthFade — How transparent the far side goes. 0 keeps every card fully opaque and the sphere reads flatter.

  • depthBlur — Blur at the very back. The front 45% of the sphere always stays sharp; blur ramps in quadratically behind that. Drop this to 0 first if you go past ~60 cards — it is the costliest property here.

  • hoverLift — How far a hovered card eases toward the camera. 0 disables the effect.

  • cardBackground — The mat behind each image. Visible as a border when Card inset is above 0.

  • cardPadding — Mat width around the image. Set to 0 for edge-to-edge images with no frame.

  • cardRadius — Corner radius on the card. The image inside is rounded to match, minus the inset.

  • shadow — A soft drop shadow under every card. Turn it off on dark backgrounds, where it mostly muddies the edges.

Units

Panel numbers are scaled for comfortable slider ranges. Internally, rotation is measured in radians per 60 fps frame.

Control

Panel

Internal

In practice

radius

46

0.46

Fraction of the frame's shorter side

autoSpin

0.11

0.0011 rad/frame

About 3.8° per second

dragSpeed

0.58

0.0058 rad/px

100 px of drag ≈ 33°

wheelSpeed

0.26

0.00026 rad/frame/px

One notch ≈ a gentle push

damping

0.945

×0.945 per frame

A throw decays over ~1 s

Fixed limits

Three limits are hardcoded rather than exposed, because they mark the edge of what stays controllable.

  • Spin caps at 0.11 rad/frame (≈ 378°/s).

  • Zoom is clamped to 0.62× – 1.7×.

  • A press travelling 6 px or less counts as a tap, not a drag.

Types

interface Item {
    image?: { src: string; srcSet?: string; alt?: string }
    title?: string
    link?: string
    width: number
    height: number
}

interface SphereAlbumProps {
    items: Item[]
    openInNewTab: boolean

    radius: number
    autoSpin: number
    dragSpeed: number
    wheelSpeed: number
    damping: number
    captureWheel: boolean
    enableZoom: boolean
    introMs: number

    depthFade: number
    depthBlur: number
    hoverLift: number
    cardBackground: string
    cardPadding: number
    cardRadius: number
    shadow: boolean

    style?: React.CSSProperties
}
interface Item {
    image?: { src: string; srcSet?: string; alt?: string }
    title?: string
    link?: string
    width: number
    height: number
}

interface SphereAlbumProps {
    items: Item[]
    openInNewTab: boolean

    radius: number
    autoSpin: number
    dragSpeed: number
    wheelSpeed: number
    damping: number
    captureWheel: boolean
    enableZoom: boolean
    introMs: number

    depthFade: number
    depthBlur: number
    hoverLift: number
    cardBackground: string
    cardPadding: number
    cardRadius: number
    shadow: boolean

    style?: React.CSSProperties
}
interface Item {
    image?: { src: string; srcSet?: string; alt?: string }
    title?: string
    link?: string
    width: number
    height: number
}

interface SphereAlbumProps {
    items: Item[]
    openInNewTab: boolean

    radius: number
    autoSpin: number
    dragSpeed: number
    wheelSpeed: number
    damping: number
    captureWheel: boolean
    enableZoom: boolean
    introMs: number

    depthFade: number
    depthBlur: number
    hoverLift: number
    cardBackground: string
    cardPadding: number
    cardRadius: number
    shadow: boolean

    style?: React.CSSProperties
}

Details

Category

Gallery

Media

Image

Views

111

Copies

126

Paste directly onto your Framer canvas.

Need a custom version?

We adapt components to your brand, motion and CMS setup.