A React component for embedding Unicorn.Studio interactive scenes in your applications. Compatible with both React (Vite) and Next.js frameworks.
⚠️ Important: This package is a community-created wrapper component and is not officially affiliated with Unicorn.Studio. It depends on Unicorn.Studio's proprietary script and services.
- 🚀 Easy Integration - Simple React component for Next.js projects
- 🎨 Full TypeScript Support - Complete type definitions included
- ⚡ Performance Optimized - Lazy loading and efficient resource management
- 📱 Responsive - Works seamlessly across devices
- 🎮 Interactive - Support for mouse/touch interactions
- 🔧 Flexible - Extensive customization options
- 🧹 Clean Architecture - Proper cleanup and memory management
- 🛡️ Error Handling - Comprehensive error states and fallbacks
npm install unicornstudio-react
# or
yarn add unicornstudio-react
# or
pnpm add unicornstudio-react
This package supports both React (Vite/CRA) and Next.js environments with optimized imports:
Use the default import for standard React applications:
import UnicornScene from "unicornstudio-react";
export default function MyComponent() {
return (
<UnicornScene projectId="YOUR_PROJECT_EMBED_ID" width={800} height={600} />
);
}
Use the Next.js-optimized version with enhanced performance:
import UnicornScene from "unicornstudio-react/next";
export default function MyComponent() {
return (
<UnicornScene projectId="YOUR_PROJECT_EMBED_ID" width={800} height={600} />
);
}
Note: The Next.js version uses Next.js
Script
andImage
components for better performance and optimization. The React version uses standard<script>
and<img>
elements for broader compatibility.
React (Vite/CRA):
import UnicornScene from "unicornstudio-react";
export default function MyComponent() {
return (
<UnicornScene
jsonFilePath="/path/to/your/scene.json"
width="100%"
height="400px"
scale={0.8}
dpi={2}
/>
);
}
Next.js:
import UnicornScene from "unicornstudio-react/next";
export default function MyComponent() {
return (
<UnicornScene
jsonFilePath="/path/to/your/scene.json"
width="100%"
height="400px"
scale={0.8}
dpi={2}
/>
);
}
Both React and Next.js versions support the same props:
// For React: import UnicornScene from "unicornstudio-react";
// For Next.js: import UnicornScene from "unicornstudio-react/next";
import UnicornScene from "unicornstudio-react";
export default function MyComponent() {
const handleLoad = () => {
console.log("Scene loaded successfully!");
};
const handleError = (error: Error) => {
console.error("Scene loading failed:", error);
};
return (
<UnicornScene
projectId="YOUR_PROJECT_EMBED_ID"
width="100vw"
height="100vh"
scale={1}
dpi={1.5}
fps={60}
altText="Interactive 3D scene"
ariaLabel="Animated background scene"
className="my-custom-class"
lazyLoad={true}
production={true}
onLoad={handleLoad}
onError={handleError}
/>
);
}
The component now supports flexible placeholder options that can be displayed while loading, on error, or when WebGL is not supported.
<UnicornScene
projectId="YOUR_PROJECT_ID"
placeholder="/path/to/placeholder.jpg"
width={800}
height={600}
/>
<UnicornScene
projectId="YOUR_PROJECT_ID"
placeholderClassName="bg-gradient-to-r from-blue-500 to-purple-600 animate-pulse"
width="100%"
height="400px"
/>
<UnicornScene
projectId="YOUR_PROJECT_ID"
placeholder={
<div className="flex items-center justify-center h-full bg-gray-100">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-gray-900 mx-auto"></div>
<p className="mt-4 text-gray-600">Loading 3D Scene...</p>
</div>
</div>
}
width={600}
height={400}
/>
showPlaceholderWhileLoading
: Shows placeholder during scene initialization (default:true
)showPlaceholderOnError
: Shows placeholder when scene fails to load (default:true
)- The placeholder automatically shows when WebGL is not supported
Prop | Type | Default | Description |
---|---|---|---|
projectId |
string |
- | The Unicorn Studio project embed ID (required if not using jsonFilePath ) |
jsonFilePath |
string |
- | Path to a self-hosted JSON file (required if not using projectId ) |
width |
number | string |
"100%" |
Width of the scene container |
height |
number | string |
"100%" |
Height of the scene container |
scale |
number |
1 |
Rendering scale (0.25-1, lower values improve performance) |
dpi |
number |
1.5 |
Pixel ratio for rendering quality |
fps |
number |
60 |
Frames per second (0-120) |
altText |
string |
"Scene" |
Alternative text for accessibility |
ariaLabel |
string |
- | ARIA label for the scene |
className |
string |
"" |
Additional CSS classes |
lazyLoad |
boolean |
true |
Load scene only when scrolled into view |
production |
boolean |
true |
Use production CDN |
placeholder |
string | ReactNode |
- | Placeholder content (image URL or React component) |
placeholderClassName |
string |
- | CSS classes for placeholder div (when using CSS placeholder) |
showPlaceholderOnError |
boolean |
true |
Show placeholder when scene fails to load |
showPlaceholderWhileLoading |
boolean |
true |
Show placeholder while scene is loading |
onLoad |
() => void |
- | Callback when scene loads successfully |
onError |
(error: Error) => void |
- | Callback when scene fails to load |
The component uses inline styles for maximum compatibility. You can customize the appearance by:
- Using the
className
prop to add your own CSS classes - Wrapping the component in a styled container
- Using CSS variables for dynamic dimensions:
<div style={{ "--unicorn-width": "100%", "--unicorn-height": "500px" }}>
<UnicornScene projectId="YOUR_PROJECT_ID" />
</div>
- Create your scene at Unicorn Studio
- Click on "Embed" in the export options
- Copy the project ID from the embed code
- ✅ Vite - Optimized for modern React development
- ✅ Create React App (CRA) - Classic React setup
- ✅ Webpack - Custom React builds
- ✅ Parcel - Zero-configuration bundler
- ✅ Rollup - ES modules bundler
- ✅ Next.js 13+ - App Router and Pages Router
- ✅ Next.js 14+ - Latest features and optimizations
- ✅ Vercel deployment - Optimized hosting
- ✅ Static exports - JAMstack compatibility
This component depends on Unicorn.Studio's proprietary script (unicornStudio.umd.js
) which:
- ✅ Is automatically loaded from Unicorn.Studio's official CDN
- ❌ Is NOT bundled or stored in this package
- 🏢 Is owned and hosted by Unicorn.Studio (UNCRN LLC)
- ⚖️ Is subject to Unicorn.Studio's Terms of Service
// ⚠️ Use custom script URL (may violate Unicorn.Studio TOS)
// Only use if you have explicit permission from Unicorn.Studio
const constants = {
UNICORN_STUDIO_CDN_URL: "https://your-custom-cdn.com/unicornStudio.umd.js",
};
Warning: Using a custom script URL may violate Unicorn.Studio's Terms of Service. Consult their legal terms before implementing.
React/Next.js Example usage:
<UnicornScene
projectId="YOUR_PROJECT_EMBED_ID"
sdkUrl="https://your-custom-cdn.com/unicornStudio.umd.js"
width={800}
height={600}
/>
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Mobile browsers with WebGL support
This package's version follows Unicorn.Studio's script version (e.g., v1.4.26) to ensure compatibility. Version format:
1.4.26
- Matches Unicorn.Studio script v1.4.26- Patch versions (e.g.,
1.4.26-1
) may be added for component-specific fixes
- Use appropriate scale values - Lower values (0.5-0.8) can significantly improve performance on lower-end devices
- Enable lazy loading - Scenes will only initialize when visible
- Optimize your scenes - Keep texture sizes reasonable in Unicorn Studio
- Set appropriate DPI - Use lower DPI values for better performance
- Verify your project ID is correct
- Check network requests for the Unicorn Studio script
- Ensure you're not mixing
projectId
andjsonFilePath
- Reduce the
scale
prop value - Lower the
dpi
setting - Decrease
fps
for less demanding animations
- Ensure you have the latest version installed
- Check that your tsconfig includes the necessary DOM types
This component is based on the official Unicorn.Studio React example with the following improvements:
-
Modern React Patterns
- Custom hooks for script loading and scene management
- Proper TypeScript integration with full type definitions
- Next.js
Script
component for optimized loading
-
Better Architecture
- Separation of concerns (hooks, types, constants)
- Proper cleanup and memory management
- Error boundaries and comprehensive error handling
-
Enhanced Developer Experience
- Complete TypeScript support
- Inline styles for zero-config styling
- Extensive prop customization options
- npm package distribution
-
Production Ready
- Proper build pipeline with tsup
- CommonJS and ESM support
- Automated script deduplication
- Comprehensive documentation
This React component wrapper is released under the MIT License - see the LICENSE file for details.
- Unicorn.Studio Script: Proprietary software owned by UNCRN LLC
- Terms: Subject to Unicorn.Studio's Terms of Service
- Licensing: Commercial use governed by Unicorn.Studio's licensing terms
This package is a community-created wrapper and is not officially affiliated with Unicorn.Studio or UNCRN LLC. The authors of this package:
- Do not store, distribute, or modify Unicorn.Studio's proprietary scripts
- Are not responsible for Unicorn.Studio's service availability or performance
- Recommend users comply with Unicorn.Studio's Terms of Service
- Provide this wrapper "as-is" without warranty
For official support or licensing questions regarding Unicorn.Studio, contact Unicorn.Studio directly.
Contributions are welcome! Please feel free to submit a Pull Request.
git clone https://github.com/diegopeixoto/unicornstudio-react.git
cd unicornstudio-react
npm install
npm run dev
- Unicorn Studio - Official website
- Unicorn Studio Documentation - Official docs
- GitHub Repository - This package
- npm Package - npm registry
Author: Diego Peixoto
License: MIT (for this wrapper component only)
Not affiliated with: Unicorn.Studio or UNCRN LLC