OrbitGallery — 3D Carousel for React & Three.js (WebGL)
A 3D WebGL carousel for React and Next.js: project cards on a curved arc above a reflective floor. Drag, scroll or use the arrow keys, then click a card to open it. Three layouts, light and dark themes, accessible and SEO-friendly.
by UpForkComponentUpdated 4 Oct 2026
Code
19 files · 6 packages
The code comes with the Pro plan
The files above install into your project with one command, or download as a ZIP.
See the plansAbout
Project cards on a curved arc above a reflective floor. Drag, scroll or use the arrow keys to turn it; click the front card and it flies to fill the screen while the project opens over it. A sellable React component with a headless core, three layouts, light, dark and auto themes, an accessible and indexable list, and a CSS fallback when there is no WebGL.
What's here
package/ the component: source, tests, build (tsup: ESM + CJS + .d.ts), README with every prop and recipe
src/ OrbitGallery, the scene (cards, floor, camera rig, effects), the headless store and hooks,
the layouts, the HTML layer (overlay, cursor, detail view, accessible list), the CSS fallback
test/ vitest: layout geometry, seamless wrap, snapping, the state machine, the hook
demo/ the landing page (Vite, prerendered to static HTML) with a leva panel and "Copy props"
src/data/ the twelve demo projects (items.ts) and their blur-up placeholders
public/media/ their covers (WebP) and the two loops (MP4)
art/ the covers and loops are drawn in code: art.html holds the shaders, render.mjs renders them
e2e/ the Playwright smoke test
screenshots/ the screenshots above, made by scripts/screenshots.mjs
registry/ the component as flat files for UpFork's live preview and the shadcn CLI (scripts/registry.mjs)
PLAN.md the plan written before the code, and where the build departs from the brief
LISTING.md what goes into UpFork's product form
The component's documentation is package/README.md.
Run it
Node.js 22 and pnpm.
pnpm install
pnpm dev # the demo with live reload, http://localhost:4101
pnpm build # the library (package/dist) and the prerendered demo (demo/dist)
pnpm preview # the built demo, http://localhost:4100
pnpm test # 46 unit tests
pnpm e2e # the Playwright smoke test (builds and serves the demo itself; uses the installed Chrome)
pnpm lint
pnpm typecheck
pnpm --filter orbit-gallery size prints the library's gzipped size after a build (about 39 KB; the budget is 60).
The demo reads a few settings from the address bar, handy for links and screenshots:
/?layout=grid&theme=light&effects=cinematic#full.
Make it yours
- Projects:
demo/src/data/items.ts. Each item needs anid, atitleand animage; asubtitle,description,tags,href,video,accentand a 24 pxplaceholderare optional. The demo's are fictional. - Corners: the
brand,navandctaprops take any markup (seedemo/src/App.tsx). - Look: the
themeprop (eight tokens: colours and the two fonts),radius,curvature,gap,cardAspect,floorandeffects. Open Tune on the demo, set it up by eye, then Copy props. - Cover art:
demo/art/art.htmldraws each demo picture in a fragment shader.node art/render.mjs preview <dir>renders previews,stills <dir>the 4096 × 2560 originals,frames <dir> <name> <seconds> <fps>a seamless loop;python art/build-media.py <stills> [<framesRoot>]writes the WebP covers, the placeholders and the MP4s.
Checks
Verified in Chrome (Windows, Intel Iris Plus) on the production build:
- Lighthouse, desktop: Performance 91–92, Accessibility 100, Best practices 100, SEO 100 (LCP 0.4 s, CLS 0.001).
- No console errors or warnings (three is pinned to 0.182: three r183+ makes React Three Fiber 9 warn about
THREE.Clock). - Twenty open/close cycles: geometries, textures and programs stay flat, the JS heap stays at 10 MB.
- A Next.js 16 App Router app builds and runs with it both through
next/dynamicand as a plain server-rendered import. - Without WebGL (
--disable-gpu), the CSS fallback renders and responds to the keys.
Licence
Sold on UpFork under the UpFork Standard License: see package/LICENSE.md.
Before you buy
Everything you need to know
How this component gets from the preview into your project, and what buyers ask most.
How to use it
From the preview to your project
- 01
Try it in the preview
Switch between light and dark, and resize it to phone and tablet widths, before you decide.
- 02
Get it
Free products are yours with a free account. Paid ones settle in USDT on TRON, sent straight to the wallet on your order.
- 03
Install it
Components go into your project with one shadcn command, dependencies included. Everything else downloads with a checksum.
- 04
Make it yours
It's your code now: rename it, restyle it and wire in your real data.
- 05
Or hand it to your AI
Copy the prompt and let your coding assistant place it in your project, following your conventions.
Yes, a free one: it keeps your order, every payment you make for it and the files together. Free products need it too: without an account you can look and try the live preview, but not download, install or copy anything.
Send the price as a USDT transfer on TRON (TRC-20) to the wallet on your order, shown with its QR code, then paste the transaction ID on the order. It's checked on-chain, and the files unlock once it's confirmed. Paid less? You're asked for the rest.
Yes. The Standard License covers unlimited personal and commercial projects, client work included; just don't resell it on its own. Open-source licenses say so on the product.
Create a CLI token on your account page, put it in your project's .env.local, add UpFork to components.json once, and install with npx shadcn add: free and paid components alike.
Onto your order, in your account. Download links last ten minutes and can be made again.
Releases are scanned for malware and reviewed before anyone can download them, and every file shows its SHA-256 so you can check what you got.
Building with an AI assistant?
Copy a ready-made prompt with the code, its dependencies and a demo, and your assistant can put it in place for you.
Selling your own work?
Get approved once, then publish components, templates and apps, paid in USDT straight to your own wallet.
Components


