Build complete, production-ready frontend pages by orchestrating 5 specialized capabilities: design engineering, motion systems, AI-generated assets, persuasive copy, and generative art.
text
/frontend-dev <request>
The user provides their request as natural language (e.g. "build a landing page for a music streaming app").
text
frontend-dev/
├── SKILL.md # Core skill (this file)
├── scripts/ # Asset generation scripts
│ ├── minimax_tts.py # Text-to-speech
│ ├── minimax_music.py # Music generation
│ ├── minimax_video.py # Video generation (async)
│ └── minimax_image.py # Image generation
├── references/ # Detailed guides (read as needed)
│ ├── minimax-cli-reference.md # CLI flags quick reference
│ ├── asset-prompt-guide.md # Asset prompt engineering rules
│ ├── minimax-tts-guide.md # TTS usage & voices
│ ├── minimax-music-guide.md # Music prompts & lyrics format
│ ├── minimax-video-guide.md # Camera commands & models
│ ├── minimax-image-guide.md # Ratios & batch generation
│ ├── minimax-voice-catalog.md # All voice IDs
│ ├── motion-recipes.md # Animation code snippets
│ ├── env-setup.md # Environment setup
│ └── troubleshooting.md # Common issues
├── templates/ # Visual art templates
│ ├── viewer.html # p5.js interactive art base
│ └── generator_template.js # p5.js code reference
└── canvas-fonts/ # Static art fonts (TTF + licenses)
All frameworks use the same asset organization:
text
assets/
├── images/
│ ├── hero-landing-1710xxx.webp
│ ├── icon-feature-01.webp
│ └── bg-pattern.svg
├── videos/
│ ├── hero-bg-1710xxx.mp4
│ └── demo-preview.mp4
└── audio/
├── bgm-ambient-1710xxx.mp3
└── tts-intro-1710xxx.mp3
Asset naming: {type}-{descriptor}-{timestamp}.{ext}
FrameworkAsset LocationComponent LocationPure HTML./assets/N/A (inline or ./js/)React/Next.jspublic/assets/``src/components/Vue/Nuxtpublic/assets/``src/components/Svelte/SvelteKitstatic/assets/``src/lib/components/Astropublic/assets/``src/components/
text
project/
├── index.html
├── assets/
│ ├── images/
│ ├── videos/
│ └── audio/
├── css/
│ └── styles.css
└── js/
└── main.js # Animations (GSAP/vanilla)
text
project/
├── public/assets/ # Static assets
├── src/
│ ├── components/
│ │ ├── ui/ # Button, Card, Input
│ │ ├── sections/ # Hero, Features, CTA
│ │ └── motion/ # RevealSection, StaggerGrid
│ ├── lib/
│ ├── styles/
│ └── app/ # Pages
└── package.json
text
project/
├── public/assets/
├── src/ # or root for Nuxt
│ ├── components/
│ │ ├── ui/
│ │ ├── sections/
│ │ └── motion/
│ ├── composables/ # Shared logic
│ ├── pages/
│ └── assets/ # Processed assets (optional)
└── package.json
text
project/
├── public/assets/
├── src/
│ ├── components/ # .astro, .tsx, .vue, .svelte
│ ├── layouts/
│ ├── pages/
│ └── styles/
└── package.json
Component naming: PascalCase ( HeroSection.tsx, HeroSection.vue, HeroSection.astro)
All rules in this skill are mandatory. Violating any rule is a blocking error — fix before proceeding or delivering.
Generate all image/video/audio assets using scripts/. NEVER use placeholder URLs (unsplash, picsum, placeholder.com, via.placeholder, placehold.co, etc.) or external URLs.
Follow copywriting frameworks (AIDA, PAS, FAB) to craft all text content. Do NOT use "Lorem ipsum" — write real copy.
Scaffold the project and build each section following Design and Motion rules. Integrate generated assets and copy. All <img>, <video>, <source>, and CSS background-image MUST reference local assets from Phase 3.
Run final checklist (see Quality Gates section).
DialDefaultRangeDESIGN_VARIANCE81=Symmetry, 10=AsymmetricMOTION_INTENSITY61=Static, 10=CinematicVISUAL_DENSITY41=Airy, 10=Packed
Adapt dynamically based on user requests.
package.json before importing any library. Output install command if missing."use client" leaf components.package.json — NEVER mix v3/v4 syntax.min-h-[100dvh] not h-screen. Use CSS Grid not flex percentage math.max-w-[1400px] mx-auto or max-w-7xl.RuleDirectiveTypographyHeadlines: text-4xl md:text-6xl tracking-tighter. Body: text-base leading-relaxed max-w-[65ch]. NEVER use Inter — use Geist/Outfit/Satoshi. NEVER use Serif on dashboards.ColorMax 1 accent, saturation < 80%. NEVER use AI purple/blue. Stick to one palette.LayoutNEVER use centered heroes when VARIANCE > 4. Force split-screen or asymmetric layouts.CardsNEVER use generic cards when DENSITY > 7. Use border-t, divide-y, or spacing.StatesALWAYS implement: Loading (skeleton), Empty, Error, Tactile feedback ( scale-[0.98]).FormsLabel above input. Error below. gap-2 for input blocks.
backdrop-blur + border-white/10 + shadow-[inset_0_1px_0_rgba(255,255,255,0.1)]useMotionValue/ useTransform — never useState for continuous animationslayout and layoutId propsstaggerChildren or CSS animation-delay: calc(var(--index) * 100ms)CategoryBannedVisualNeon glows, pure black (#000), oversaturated accents, gradient text on headers, custom cursorsTypographyInter font, oversized H1s, Serif on dashboardsLayout3-column equal card rows, floating elements with awkward gapsComponentsDefault shadcn/ui without customization
CategoryPatternsNavigationDock magnification, Magnetic button, Gooey menu, Dynamic island, Radial menu, Speed dial, Mega menuLayoutBento grid, Masonry, Chroma grid, Split-screen scroll, Curtain revealCardsParallax tilt, Spotlight border, Glassmorphism, Holographic foil, Swipe stack, Morphing modalScrollSticky stack, Horizontal hijack, Locomotive sequence, Zoom parallax, Progress path, Liquid swipeGalleryDome gallery, Coverflow, Drag-to-pan, Accordion slider, Hover trail, Glitch effectTextKinetic marquee, Text mask reveal, Scramble effect, Circular path, Gradient stroke, Kinetic gridMicroParticle explosion, Pull-to-refresh, Skeleton shimmer, Directional hover, Ripple click, SVG draw, Mesh gradient, Lens blur
#f9fafb, cards pure white with border-slate-200/50rounded-[2.5rem], diffusion shadowtracking-tight headersstiffness: 100, damping: 20), infinite loops, React.memo isolation5-Card Archetypes:
layoutIdWhen brand styling is active:
#141413, Light: #faf9f5, Mid: #b0aea5, Subtle: #e8e6dc#d97757, Blue #6a9bcc, Green #788c5dNeedToolUI enter/exit/layoutFramer Motion — AnimatePresence, layoutId, springsScroll storytelling (pin, scrub)GSAP + ScrollTrigger — frame-accurate controlLooping iconsLottie — lazy-load (~50KB)3D/WebGLThree.js / R3F — isolated <Canvas>, own "use client" boundaryHover/focus statesCSS only — zero JS costNative scroll-drivenCSS — animation-timeline: scroll()
Conflict Rules [MANDATORY]:
LevelTechniques1-2 SubtleCSS transitions only, 150-300ms3-4 SmoothCSS keyframes + Framer animate, stagger ≤3 items5-6 FluidwhileInView, magnetic hover, parallax tilt7-8 CinematicGSAP ScrollTrigger, pinned sections, horizontal hijack9-10 ImmersiveFull scroll sequences, Three.js particles, WebGL shaders
See references/motion-recipes.md for full code. Summary:
RecipeToolUse ForScroll RevealFramerFade+slide on viewport entryStagger GridFramerSequential list animationsPinned TimelineGSAPHorizontal scroll with pinningTilt CardFramerMouse-tracking 3D perspectiveMagnetic ButtonFramerCursor-attracted buttonsText ScrambleVanillaMatrix-style decode effectSVG Path DrawCSSScroll-linked path animationHorizontal ScrollGSAPVertical-to-horizontal hijackParticle BackgroundR3FDecorative WebGL particlesLayout MorphFramerCard-to-modal expansion
GPU-only properties (ONLY animate these): transform, opacity, filter, clip-path
NEVER animate: width, height, top, left, margin, padding, font-size — if you need these effects, use transform: scale() or clip-path instead.
Isolation:
React.memo leaf componentswill-change: transform ONLY during animationcontain: layout style paint on heavy containersMobile:
prefers-reduced-motionpointer: coarseCleanup: Every useEffect with GSAP/observers MUST return () => ctx.revert()
FeelFramer ConfigSnappystiffness: 300, damping: 30Smoothstiffness: 150, damping: 20Bouncystiffness: 100, damping: 10Heavystiffness: 60, damping: 20CSS EasingValueSmooth decelcubic-bezier(0.16, 1, 0.3, 1)Smooth accelcubic-bezier(0.7, 0, 0.84, 0)Elasticcubic-bezier(0.34, 1.56, 0.64, 1)
prefers-reduced-motion checkoutline not box-shadow)aria-live="polite" for dynamically revealed contentbash
npm install framer-motion # UI (keep at top level)
npm install gsap # Scroll (lazy-load)
npm install lottie-react # Icons (lazy-load)
npm install three @react-three/fiber @react-three/drei # 3D (lazy-load)
TypeScriptPatternTTSscripts/minimax_tts.pySyncMusicscripts/minimax_music.pySyncVideoscripts/minimax_video.pyAsync (create → poll → download)Imagescripts/minimax_image.pySync
Env: MINIMAX_API_KEY (required).
<project>/public/assets/{images,videos,audio}/ as {type}-{descriptor}-{timestamp}.{ext} — MUST save locallyShortcutSpechero16:9, cinematic, text-safethumb1:1, centered subjecticon1:1, flat, clean backgroundavatar1:1, portrait, circular crop readybanner21:9, OG/socialbg-video768P, 6s, [Static shot]``video-hd1080P, 6sbgm30s, no vocals, loopablettsMiniMax HD, MP3
references/minimax-cli-reference.md — CLI flagsreferences/asset-prompt-guide.md — Prompt rulesreferences/minimax-voice-catalog.md — Voice IDsreferences/minimax-tts-guide.md — TTS usagereferences/minimax-music-guide.md — Music generation (prompts, lyrics, structure tags)references/minimax-video-guide.md — Camera commandsreferences/minimax-image-guide.md — Ratios, batchAIDA (landing pages, emails):
text
ATTENTION: Bold headline (promise or pain)
INTEREST: Elaborate problem ("yes, that's me")
DESIRE: Show transformation
ACTION: Clear CTA
PAS (pain-driven products):
text
PROBLEM: State clearly
AGITATE: Make urgent
SOLUTION: Your product
FAB (product differentiation):
text
FEATURE: What it does
ADVANTAGE: Why it matters
BENEFIT: What customer gains
FormulaExamplePromise"Double open rates in 30 days"Question"Still wasting 10 hours/week?"How-To"How to automate your pipeline"Number"7 mistakes killing conversions"Negative"Stop losing leads"Curiosity"The one change that tripled bookings"Transformation"From 50 to 500 leads"
Be specific. Lead with outcome, not method.
Bad: Submit, Click here, Learn more
Good: "Start my free trial", "Get the template now", "Book my strategy call"
Formula: [Action Verb] + [What They Get] + [Urgency/Ease]
Place: above fold, after value, multiple on long pages.
TriggerExampleFOMO"Only 3 spots left"Fear of loss"Every day without this, you're losing $X"Status"Join 10,000+ top agencies"Ease"Set it up once. Forget forever."Frustration"Tired of tools that deliver nothing?"Hope"Yes, you CAN hit $10K MRR"
ObjectionResponseToo expensiveShow ROI: "Pays for itself in 2 weeks"Won't work for meSocial proof from similar customerNo time"Setup takes 10 minutes"What if it fails"30-day money-back guarantee"Need to thinkUrgency/scarcity
Place in FAQ, testimonials, near CTA.
Testimonials (with name/title), Case studies, Data/metrics, Social proof, Certifications
Philosophy-first workflow. Two output modes.
ModeOutputWhenStaticPDF/PNGPosters, print, design assetsInteractiveHTML (p5.js)Generative art, explorable variations
Name the movement (1-2 words). Articulate philosophy (4-6 paragraphs) covering:
Identify subtle, niche reference — sophisticated, not literal. Jazz musician quoting another song.
Static Mode:
canvas-fonts/.pdf or .png + philosophy .mdInteractive Mode:
templates/viewer.html firstrandomSeed(seed); noiseSeed(seed);Refine, don't add. Make it crisp. Polish into masterpiece.
Design:
w-full, px-4) for high-variance designsmin-h-[100dvh] not h-screenMotion:
useEffect have cleanup returnsprefers-reduced-motion respectedReact.memo leaf componentsGeneral:
package.jsonunsplash, picsum, placeholder, placehold, via.placeholder, lorem.space, dummyimage. If ANY found, STOP and replace with generated assets before delivering.React and Next.js are trademarks of Meta Platforms, Inc. and Vercel, Inc., respectively. Vue.js is a trademark of Evan You. Tailwind CSS is a trademark of Tailwind Labs Inc. Svelte and SvelteKit are trademarks of their respective owners. GSAP/GreenSock is a trademark of GreenSock Inc. Three.js, Framer Motion, Lottie, Astro, and all other product names are trademarks of their respective owners.