From piflow
Build a premium, dark, "Linear/Vercel/daytona"-grade SaaS or dev-tool frontend by composing from a BOUNDED MENU of vetted choices — a few locked-in premium picks per layer (tokens, type, layout, background effects, motion/scroll, component idioms, particles, cursor, kinetic text, optional 3D) so that any recomposition stays in-scope and premium and never drifts into generic. Use when someone wants to make a landing page / marketing site / product hero "feel premium / cool / expensive", replicate the dark dev-tool aesthetic, pick the right animation / shader / particle / scroll library, or stand up the whole stack. Triggers: "make it look premium", "dark SaaS landing page", "Linear/Vercel vibe", "which animation library", "premium hero", "particle background", "the entire stack", "replicate this site's feel".
How this skill is triggered — by the user, by Claude, or both
Slash command
/piflow:premium-saas-stackThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**One-line model:** "Premium" is **~70% token discipline, 20% layout, 10% effects** — no library sells you
One-line model: "Premium" is ~70% token discipline, 20% layout, 10% effects — no library sells you the vibe (Linear/Vercel ship zero 3D and almost no effects). So this skill locks a small vetted menu per layer. You COMPOSE from the menus; the union of menus IS the scope. Stay inside → output is premium by construction. Step outside → that's drift, and it's a gated decision, not a default.
This is a capability registry for taste, not code: the menus are the registry, the scope fence is the drift-gate. Lead with Layer 0 (tokens) — skipping it and reaching for effects is the #1 way "premium" collapses into "generic dark theme with a glow on it."
Compose only from the locked menus below. Introducing any library, font, effect, or color outside a menu is DRIFT — stop and treat it as a registry change (justify it, then add it to the menu), never a silent one-off. A second hard rule: restraint budgets are part of the menu (e.g. one accent, ≤2 ambient effects per viewport). Exceeding a budget is the same as escaping scope. This is what keeps "recompose freely" from degrading into "kitchen-sink and generic."
Produce a concrete stack by resolving, in order:
[agnostic] HTML/CSS/JS or [react]):
When in doubt, ship Tier 2 · Agnostic — it's the daytona target and the safest premium default.
Non-negotiable. This layer alone separates "expensive" from "generic." Lock:
| Token | Locked rule | Picks |
|---|---|---|
| Canvas | near-black, never #000 | #0a0a0a (warm-neutral) or #010102 (blue-cast, Linear) |
| Accent | exactly one saturated hue, used ONLY on CTA / status dot / focus ring | violet #5e6ad2 · electric green · cyan. No second chromatic color. |
| Elevation | surface ladder, not drop shadows — 4 steps | #0f1011 → #141516 → #18191a → #191a1b |
| Borders | hairlines at white 6–10% opacity — present but weightless | — |
| Type | one tight grotesque + one mono sibling; negative tracking -0.02 to -0.04em on display | Geist + Geist Mono (free) · Inter Display + JetBrains Mono |
| Space | 8pt grid; 96–128px section padding (generous = confident) | — |
| Radius | sharp or minimal | 0–8px (one pill scale for CTAs is allowed) |
Token starter files (paste-ready hex/font/spacing): shadcn.io/design/linear and /design/vercel (DESIGN.md).
[agnostic] CSS grid · [react] Magic UI / Aceternity blocks.Budget: ≤ 2 ambient effects per viewport. Grain is the always-on premium texture; everything else is one pick.
| Slot | Pick | Framework |
|---|---|---|
| Grain/noise (always-on) | inline <svg feTurbulence> data-URI, mix-blend-mode:overlay, opacity ~0.03 | [agnostic] · [react] shadcn Grain |
| ONE ambient bg (Tier 2+) | mesh-gradient @paper-design/shaders (vanilla and react, zero-dep) · OR aurora (layered radial-gradient, animate transform not stops) · OR dot/retro grid | [agnostic]+[react] |
| Card depth | surface-ladder + hairline (Tier 1) · OR glass (backdrop-filter:blur + 1px chroma border) | [agnostic] · [react] Glin UI |
| Accent glow | conic/radial gradient in OKLCH, low opacity | [agnostic] |
Rule: reserved motion. Spring physics, NOT default ease/linear (the Linear signature). Always gate on
prefers-reduced-motion.
| Slot | Pick | Framework |
|---|---|---|
| Smooth scroll | Lenis (~4kb) — marketing pages only, never dashboards | [agnostic] (+ lenis/react) |
| Scroll-bound | GSAP ScrollTrigger (now free) for pin/scrub/reveal · OR native CSS scroll-driven animations for simple fade/parallax | [agnostic] |
| Component motion | Motion (ex-Framer-Motion) — spring transitions, layout animations | [react] |
Sync note: when using Lenis + GSAP, drive Lenis from gsap.ticker and lenis.on('scroll', ScrollTrigger.update).
Pick only the idioms the page actually needs. Each: [react] = Magic UI / Aceternity; [agnostic] = rebuild
with GSAP/CSS + SVG (an animated beam is just an SVG cubic-bezier + a traveling gradient).
| Idiom | [react] | [agnostic] |
|---|---|---|
| Animated connector / beam | Magic UI AnimatedBeam | SVG bezier + gradient-flow CSS, or GSAP MotionPath |
| Orbiting icons / integration hub | OrbitingCircles | CSS orbital |
| Logo marquee | Marquee | CSS keyframe marquee |
| Terminal / code window | Terminal (typewriter) | GSAP SplitText typewriter |
| Count-up metric | NumberTicker | small JS lerp |
| Node graph / DAG | React Flow (@xyflow/react) | VizCraft / Svelte Flow |
| Globe + arcs | Aceternity Globe | cobe / three-globe |
| SVG draw-on / morph | — | GSAP DrawSVG / MorphSVG (free) · Vivus · anime.js v4 |
Budgets: ≤ 1 particle field per page (FPS-capped); cursor effects gated on pointer:fine; one signature
text reveal, not on every heading.
| Slot | Pick | Framework |
|---|---|---|
| Particles (2D ambient / confetti) | tsParticles — canvas, @tsparticles/slim default; presets: links/confetti/fireworks/ribbons | [agnostic] (+ @tsparticles/react) |
| Particles (GPU 3D field) → Tier 3 only | R3F + shaders (bufferGeometry/FBO) · Three-VFX / threeparticles (WebGPU) | [react]/[agnostic] |
| Cursor / micro-interaction | mouse-animations (<5kb: magnetic, tilt, spotlight, trail, parallax) | [agnostic] |
| Magnetic (React) | use-magnetic (1.3kb, a11y-first) · shadcn tilt/spotlight buttons | [react] |
| Kinetic text | GSAP SplitText (free, the standard; masking, autoSplit) · Griffo (kerning-aware) · Motion splitText (0.7kb) | [agnostic]/[react] |
Pick a small set of reveal styles (fade · blur · clip-mask stagger) and reuse them — variety reads as noise.
@paper-design/shaders
[agnostic+react] · Unicorn Studio (no-code WebGL, layer editor) · Vanta.js (quick 3D bg).dpr=[1,1.5]), lazy-load, provide a CSS fallback.Agnostic · Tier 2 (the daytona default): Geist + Geist Mono · CSS-var tokens · CSS bento · feTurbulence
grain + paper-design/shaders mesh · Lenis + GSAP (ScrollTrigger / SplitText / DrawSVG) · tsParticles ·
mouse-animations. (Tier 3 adds: Vanta or three.js.)
React · Tier 2: shadcn + Geist · Tailwind tokens · Magic UI / Aceternity (idioms + effects) · Motion +
Lenis + GSAP · @tsparticles/react + use-magnetic · @paper-design/shaders-react. *(Tier 3 adds: R3F + Drei
Observable, countable criteria — not vibes:
#000; exactly one accent hue, and it appears ONLY on CTA / status / focus.prefers-reduced-motion; cursor
effects gated on pointer:fine.If any item FAILS, the surface is off-scope or off-premium. Fix tokens/budgets first, effects last.
#000 canvas · ❌ a second accent color · ❌ default letter-spacing on display type ·
❌ rounded-everything · ❌ 3+ stacked background effects · ❌ default-ease/linear motion ·
❌ reaching for 3D to rescue weak tokens · ❌ a different reveal style on every heading ·
❌ shipping a scraped third-party asset verbatim (IP — rebuild clean) ·
❌ adding a library outside the menu without gating it (silent drift).Copywriting / conversion-rate strategy · backend / data · dashboards & in-app UI (different motion + density rules) · light-mode or illustrative brand systems · the scraper/harvest pipeline · accessibility beyond the motion/pointer gates named above (do a full a11y pass separately).
npx claudepluginhub blueif16/piflowCreates bite-sized, testable implementation plans from specs or requirements, with file structure and task decomposition. Activates before coding multi-step tasks.