ProductViewer
threecn/product-viewerFreeComponent
An orbitable, polished product volume with an emissive --primary tint; hover slows the spin.
Install it
npx shadcn@latest add https://threecn.dev/r/product-viewer.jsonSource
1"use client"23import * as React from "react"4import { useFrame } from "@react-three/fiber"5import { OrbitControls, RoundedBox } from "@react-three/drei"6import * as THREE from "three"78import {9 SceneContainer,10 type SceneContainerProps,11} from "@/components/threecn/scene-container"12import {13 useShadcnTheme,14 type ThemeMode,15} from "@/components/hooks/use-shadcn-theme"1617type ProductProps = {18 autoRotate: boolean19 autoRotateSpeed: number20 metalness: number21 roughness: number22 theme: ThemeMode23}2425function Product({26 autoRotate,27 autoRotateSpeed,28 metalness,29 roughness,30 theme,31}: ProductProps) {32 const groupRef = React.useRef<THREE.Group>(null)33 const matRef = React.useRef<THREE.MeshStandardMaterial>(null)34 const [hovered, setHovered] = React.useState(false)35 const { primaryColor, accentColor, foregroundColor } = useShadcnTheme(theme)3637 useFrame((_, delta) => {38 if (!groupRef.current || !autoRotate) return39 const target = hovered ? 0.15 : 140 groupRef.current.rotation.y += delta * 0.4 * autoRotateSpeed * target41 groupRef.current.rotation.x = THREE.MathUtils.lerp(42 groupRef.current.rotation.x,43 hovered ? 0.1 : 0.25,44 0.0545 )46 })4748 return (49 <group50 ref={groupRef}51 onPointerOver={(e) => {52 e.stopPropagation()53 setHovered(true)54 }}55 onPointerOut={() => setHovered(false)}56 >57 <RoundedBox args={[2.2, 2.2, 2.2]} radius={0.28} smoothness={6} castShadow>58 <meshStandardMaterial59 ref={matRef}60 color={accentColor}61 emissive={primaryColor}62 emissiveIntensity={hovered ? 0.55 : 0.3}63 metalness={metalness}64 roughness={roughness}65 />66 </RoundedBox>67 {/* subtle inner accent edge */}68 <RoundedBox args={[2.24, 2.24, 2.24]} radius={0.3} smoothness={6}>69 <meshStandardMaterial70 color={foregroundColor}71 transparent72 opacity={0.04}73 metalness={0.9}74 roughness={0.1}75 wireframe76 />77 </RoundedBox>78 </group>79 )80}8182export type ProductViewerProps = {83 autoRotate?: boolean84 autoRotateSpeed?: number85 /** Material metalness (0–1). */86 metalness?: number87 /** Material roughness (0–1). */88 roughness?: number89 className?: string90 theme?: ThemeMode91 environment?: SceneContainerProps["environment"]92}9394/**95 * A polished rounded volume that simulates a product. Drag to orbit; hovering96// … truncated
What it pulls in
npm packages
Files it writes
More from threecn
All 28 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| AuroraRibbonsaurora-ribbons | threecn | Components | Free | 3 deps · 3 files | |
| Boidsboids | threecn | Components | Free | 3 deps · 3 files | |
| Clothcloth | threecn | Components | Free | 3 deps · 3 files | |
| Crystalcrystal | threecn | Components | Free | 3 deps · 3 files | |
| CubeWavecube-wave | threecn | Components | Free | 3 deps · 3 files | |
| CurlFlowcurl-flow | threecn | Components | Free | 3 deps · 3 files | |
| DnaHelixdna-helix | threecn | Components | Free | 3 deps · 3 files | |
| FloatingCard3Dfloating-card-3d | threecn | Components | Free | 3 deps · 3 files |
