
Spline Interactive
Scaffold Vite or Next.js apps and reusable React wrappers for Spline 3D scenes with interactive event handlers.
Overview
Spline Interactive is an agent skill for the Build phase that scaffolds Spline + React projects and generates reusable scene wrapper components.
Install
npx skills add https://github.com/freshtechbro/claudedesignskills --skill spline-interactiveWhat is this skill?
- project_generator.py scaffolds full Vite or Next.js projects with Spline deps, configs, and README
- component_builder.py emits basic, interactive, and animated Spline React component types
- CLI and interactive modes for project and component generation
- Starter templates include example click/hover handlers and CSS
- Directory documents asset layout for Spline + React starters
- Three component types: basic, interactive, and animated
- Supports Vite and Next.js project generation via project_generator.py
Adoption & trust: 877 installs on skills.sh; 227 GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want Spline 3D in a React app but do not want to manually wire Vite or Next.js, dependencies, and event-handling components.
Who is it for?
Indie builders shipping marketing sites or product demos that embed Spline scenes in Vite or Next.js.
Skip if: Teams that only need static screenshots, already maintain a mature Spline pipeline, or are building non-React stacks without adaptation.
When should I use this skill?
You are building a React UI that embeds Spline scenes and need a starter project or reusable Spline component files.
What do I get? / Deliverables
You get a generated project or saved JSX component with Spline integration patterns and starter handlers ready to drop in your scene URLs.
- Generated Vite or Next.js project tree
- Spline React component JSX
- Starter App.css and README setup notes
Recommended Skills
Journey fit
How it compares
Use for codegen and React wrappers around Spline scenes, not as a substitute for the Spline editor or a generic UI kit skill.
Common Questions / FAQ
Who is spline-interactive for?
Solo and indie frontend builders using React who want scripted Spline project and component scaffolds instead of copying snippets by hand.
When should I use spline-interactive?
During Build → frontend when you are integrating Spline into a new Vite or Next.js app or need interactive, animated, or basic wrapper components.
Is spline-interactive safe to install?
Review the Security Audits panel on this Prism page and inspect generated scripts and dependencies before running them in your repo.
SKILL.md
READMESKILL.md - Spline Interactive
# Spline Interactive - Assets This directory contains starter templates and examples for Spline + React integration. ## Using the Project Generator The easiest way to get started is using the `project_generator.py` script: ```bash # Interactive mode ./scripts/project_generator.py # CLI mode ./scripts/project_generator.py --name my-spline-app # Next.js project ./scripts/project_generator.py --name my-spline-app --nextjs ``` This automatically generates a complete project with: - package.json with all dependencies - Vite or Next.js configuration - React components with Spline integration - Example event handlers - Starter CSS - README with setup instructions ## Project Structure Generated projects have this structure: ``` my-spline-app/ ├── package.json ├── vite.config.js (or next.config.js) ├── index.html (Vite only) ├── README.md ├── src/ │ ├── main.jsx (Vite only) │ ├── App.jsx │ └── App.css └── app/ (Next.js only) └── page.jsx ``` ## Component Templates Use `component_builder.py` to generate reusable Spline components: ```bash # Interactive mode ./scripts/component_builder.py # Generate specific component ./scripts/component_builder.py --name ProductViewer --type interactive # Save to file ./scripts/component_builder.py --name ProductViewer --type interactive --output src/components/ProductViewer.jsx ``` ### Available Component Types 1. **basic** - Simple Spline scene wrapper 2. **interactive** - With click/hover event handling 3. **animated** - With animation trigger methods 4. **controlled** - Exposes methods via ref for parent control 5. **responsive** - Adapts to mobile/desktop screen sizes 6. **lazy** - Lazy-loaded with React.lazy() ## Example Integrations ### With GSAP ScrollTrigger ```jsx import { useRef, useEffect } from 'react'; import Spline from '@splinetool/react-spline'; import gsap from 'gsap'; import ScrollTrigger from 'gsap/ScrollTrigger'; gsap.registerPlugin(ScrollTrigger); export default function ScrollSpline() { const splineApp = useRef(); function onLoad(app) { splineApp.current = app; ScrollTrigger.create({ trigger: '.scene', start: 'top center', onEnter: () => app.emitEvent('mouseHover', 'Product') }); } return ( <div className="scene"> <Spline scene="https://prod.spline.design/YOUR-SCENE-ID/scene.splinecode" onLoad={onLoad} /> </div> ); } ``` ### With Framer Motion ```jsx import { motion } from 'framer-motion'; import Spline from '@splinetool/react-spline'; export default function AnimatedSpline() { return ( <motion.div initial={{ opacity: 0, scale: 0.8 }} animate={{ opacity: 1, scale: 1 }} transition={{ duration: 0.8 }} style={{ width: '100%', height: '600px' }} > <Spline scene="https://prod.spline.design/YOUR-SCENE-ID/scene.splinecode" /> </motion.div> ); } ``` ### Product Configurator ```jsx import { useRef, useState } from 'react'; import Spline from '@splinetool/react-spline'; export default function ProductConfigurator() { const product = useRef(); const splineApp = useRef(); const [color, setColor] = useState('#ff6b6b'); function onLoad(spline) { splineApp.current = spline; product.current = spline.findObjectByName('Product'); } function changeColor(newColor) { setColor(newColor); if (product.current) { product.current.material.color.set(parseInt(newColor.substring(1), 16)); } } function rotate() { if (product.current) { product.current.rotation.y += Math.PI / 4; } } return ( <div> <Spline scene="https://prod.spline.design/YOUR-SCENE-ID/scene.splinecode" onLoad={onLoad} /> <div className="controls"> <button onClick={() => changeColor('#ff6b6b')}>Red</button> <button onClick={() => changeColor('#4ecdc4')}>Cyan</button> <button onClick={() => changeColor('#ffe66d')}>Yellow</button> <button onClick={rotate