skills/web-design/design-playground/SKILL.md
Spin up isolated React playgrounds with Leva control panels to experiment with UI effects, animations, shadows, hover states, and interaction patterns. Use when: 'build me a playground', 'give me knobs for', 'I want to experiment with', 'let me tweak', 'playground for X', 'try this effect', or when user wants to visually dial in a UI technique before integrating into production code. Also triggers when user shares a URL/tweet/CodePen and says 'I want to play with this' or 'let me try this technique'.
npx skillsauth add michailbul/laniameda-skills design-playgroundInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You build isolated, interactive playgrounds for experimenting with UI effects, animations, and design techniques. Every playground comes with a Leva control panel so the user can visually tweak every relevant parameter in real time — then export clean production code when they're happy.
Your standard: Fast to spin up. Beautiful defaults. Every knob that matters is exposed. Code exports clean.
| Layer | Tool | Why |
|---|---|---|
| Scaffold | Vite + React + TypeScript | Fastest cold start, HMR, zero config |
| Controls | Leva (leva) | Best React control panel — auto-generates UI for any parameter |
| Styling | Tailwind CSS | Rapid utility-first styling |
| Animation | Motion (motion/react) | When the effect involves animation |
| 3D (optional) | Three.js / R3F | Only when the effect is 3D |
Core install:
npm create vite@latest playground-[name] -- --template react-ts
cd playground-[name]
npm install leva motion tailwindcss @tailwindcss/vite
All playgrounds live in: ~/work/playgrounds/
~/work/playgrounds/
hover-cards/ # one playground per experiment
shadow-layers/
waveform-icons/
...
Each playground is standalone — no shared dependencies between experiments.
Before scaffolding, clarify:
If user provides a URL reference:
cd ~/work/playgrounds
npm create vite@latest playground-[name] -- --template react-ts
cd playground-[name]
npm install leva motion tailwindcss @tailwindcss/vite
Set up Tailwind with Vite plugin in vite.config.ts:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [react(), tailwindcss()],
})
Add to src/index.css:
@import "tailwindcss";
This is the core. For every playground:
useControlsLeva patterns:
import { useControls, folder } from 'leva'
function Playground() {
const controls = useControls({
'Animation': folder({
duration: { value: 0.3, min: 0.05, max: 2, step: 0.05 },
easing: { options: ['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear'] },
delay: { value: 0, min: 0, max: 1, step: 0.05 },
}),
'Visual': folder({
background: '#ffffff',
borderRadius: { value: 12, min: 0, max: 48, step: 1 },
shadowLayers: { value: 3, min: 1, max: 6, step: 1 },
shadowOpacity: { value: 0.1, min: 0, max: 1, step: 0.01 },
shadowSpread: { value: 1, min: -10, max: 20, step: 0.5 },
}),
'Layout': folder({
gap: { value: 16, min: 0, max: 64, step: 4 },
padding: { value: 24, min: 0, max: 64, step: 4 },
columns: { value: 3, min: 1, max: 6, step: 1 },
}),
})
// Use controls.duration, controls.background, etc. directly in JSX/styles
}
Key Leva input types to use:
{ value: number, min, max, step } — sliders for numeric values{ options: [...] } — dropdown for discrete choices'#hex' — color picker (just pass a hex string){ value: boolean } — toggle{ value: [x, y] } — 2D pointfolder({...}) — group related controlsbutton(() => action) — action buttons (reset, randomize, export)Every playground should include:
Export button — copies the current parameter values as clean CSS/React code:
import { button } from 'leva'
useControls({
'Export': button(() => {
const code = generateCode(controls)
navigator.clipboard.writeText(code)
console.log('Copied to clipboard!')
}),
})
Reset button — snap back to defaults:
useControls({
'Reset': button(() => window.location.reload()),
})
Multiple variants — show the effect applied to several different elements (cards, buttons, icons) so the user sees how it scales:
// Show a grid of cards, buttons, or components all using the same Leva-controlled values
npm run dev
Open in the browser. The Leva panel appears in the top-right by default. User tweaks parameters, sees changes instantly via HMR + React state.
When the user says they're happy:
Multi-layered box-shadow technique. Controls: number of layers, base opacity, spread progression, color, blur factor.
Card grid with hover effects. Controls: scale, translateY, shadow elevation, transition timing, easing curve, border glow.
Icon/button micro-interactions. Controls: animation type (pulse, bounce, wiggle, spin), duration, spring stiffness, spring damping.
CSS border-drawing animations on hover (corners → edges). Controls: border width, color, draw speed, secondary tracer delay, easing.
Text animation on scroll/view. Controls: stagger delay, direction (up/down/fade), blur amount, letter vs word split.
Animated audio visualizer icons. Controls: bar count, animation speed, min/max height, style (bars/wave/dots), muted state.
When user provides a URL, tweet, or CodePen:
Tell the user: "Here's the technique from [source]. I've wired up [N] controls. The defaults match the reference — start tweaking."
When exporting from a playground, output clean production code:
React component (no Leva, hardcoded best values):
// hover-card.tsx — exported from playground
// Technique: multi-layer shadow border + scale hover
export function HoverCard({ children }: { children: React.ReactNode }) {
return (
<div className="group relative rounded-xl bg-white p-6 transition-all duration-300 ease-out hover:scale-[1.02] hover:-translate-y-1"
style={{
boxShadow: `
0 1px 2px rgba(0,0,0,0.04),
0 2px 4px rgba(0,0,0,0.04),
0 4px 8px rgba(0,0,0,0.04)
`,
}}>
{children}
</div>
)
}
CSS custom properties (for non-React targets):
:root {
--card-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 2px 4px rgba(0,0,0,0.04), 0 4px 8px rgba(0,0,0,0.04);
--card-radius: 12px;
--card-hover-scale: 1.02;
--card-hover-lift: -4px;
--card-transition: all 0.3s ease-out;
}
development
Seedance 2.0 video prompt director. Converts plain-text scene descriptions into production-ready bilingual EN+ZH video prompts optimized for the Seedance 2.0 video generator. Handles all Seedance work — action (combat, pursuit, stunts), general (landscapes, journeys, atmosphere), dialogue (confrontations, negotiations, interrogations), and non-narrative commercial work (ad spots, music videos, fashion films, automotive inserts, product shots, pet/character demos, cutaway montages, social reels for TikTok / Reels / YouTube Shorts). Use whenever the user wants to create a Seedance video prompt, mentions Seedance, or describes a cinematic scene for video generation. For NARRATIVE screenplay-integrated work, use seedance-screenwriter instead.
development
Write Seedance 2.0 prompts in screenplay format for narrative storytelling — when the prompts will be cut into a film, short, or scene. Use whenever you're generating shots that will be edited into a continuous story with dialogue, character beats, scene continuity, or coverage. Pairs with the screenwriter skill — read the scene's screenplay first (or the project's `scene.md` if it exists), then translate each shot into a Seedance prompt that reads as a screenplay page, not as an engineering spec.
documentation
Скилл-инструмент для сценариста полнометражного фильма или сериала. Используй всегда, когда пользователь хочет писать сценарий, поэпизодник, разрабатывать сцены, бит-шит, диалоги, делать ревизии, считать экранное время, резать длину, работать с персонажами или мифологией истории. Скилл работает на основе методологий Макки, Кэмпбелла и Аристотеля, выдаёт Hollywood-формат .docx, поддерживает билингвальные сценарии (диалог на одном языке + перевод в скобках под ним), и помогает аудитировать структуру по причинности и движению ценности. Скилл не привязан к конкретной истории — пользователь приносит свою.
development
Extract shot composition DNA from any car photograph into structured JSON — camera angle, lens, framing, lighting — stripped of car-specific details. Then reuse extracted angles with any car identity to generate new images at scale. Use when: extracting angles from reference photos, building a shot library, batch-analyzing car photography, replicating a great angle with a different car, running extraction pipelines in Freepik or Flora. Triggers: "extract this angle", "steal this composition", "shot DNA", "analyze this car photo", "replicate this shot with my car", "batch extract angles", "car photography analysis", "angle extraction", "build a shot library".