GSAP suite

Motion primitives with manners

Client-only GSAP components for SplitText hero motion, sequencing, kinetic canvas effects, fan-deck presentation, and Flip-powered grid layouts. Each one ships with a copy-for-your-agent install prompt so any coding agent can drop it into a fresh repo.

Suite status

17 concepts, 1 family

Grid motion

Flip Grid

A reusable non-deck grid primitive for component catalogues, galleries, and browse surfaces. It keeps the DOM as real CSS Grid, captures layout state with GSAP Flip, then animates filtering, sorting, density changes, and featured-card promotion without global selectors.

Inspired by GSAP · GSAP demo Animate CSS Grid Positions

Animate CSS Grid positions

Grid, not deck

Click a card, change the filters, switch density, or sort alphabetically. The DOM stays a real grid and GSAP Flip animates the position delta.
For your agent

Copy this prompt to install GsapFlipGrid

# Install GsapFlipGrid into my Svelte 5 project

Animate CSS Grid filtering, sorting, and promoted-item layout changes with GSAP Flip.

## 1. Install dependencies
bun add gsap

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/GsapFlipGrid.svelte
to src/lib/components/GsapFlipGrid.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  items?: GsapFlipGridItem[];
  filters?: GsapFlipGridFilter[];
  initialFilter?: string;
  initialFeaturedId?: string;
  initialDensity?: 'featured' | 'compact';
  initialSort?: 'curated' | 'alpha';
  showHeader?: boolean;
  showControls?: boolean;
  promoteOnClick?: boolean;
}
```

## 5. Usage
```svelte
<GsapFlipGrid
  items={gridItems}
  filters={[{ id: 'catalog', label: 'Catalog' }]}
  initialFeaturedId="directory"
/>
```

## Notes
Client-only Flip plugin load. Use this for real grids and galleries; keep CardStack for physical deck metaphors.

_Inspired by GSAP demo Animate CSS Grid Positions._

Pointer-driven motion

Shape Trail

A hero canvas where geometric primitives orbit the pointer with damped rAF physics. GSAP timeline stages the entrance reveal (canvas fade + content slide); `gsap.to` drives the settle/release ease on click. Click to settle into a lattice; click again to release.

Spec by Dave Vault · Shape Trail

Shape Trail

Geometry that follows you home.

Move your cursor — the shapes orbit. Click — they settle into the lattice. Click again — they scatter.

Released
For your agent

Copy this prompt to install ShapeTrailHero

# Install ShapeTrailHero into my Svelte 5 project

Geometric morph hero — shapes follow the cursor, settle on click.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/ShapeTrail/ShapeTrailHero.svelte
to src/lib/components/ShapeTrail/ShapeTrailHero.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  density?: number;                          // 32 (clamped to [8, 128])
  palette?: 'mono' | 'aurora' | 'amber';     // 'aurora'
  ariaLabel?: string;                        // 'Shape Trail hero'
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import ShapeTrailHero from '$lib/components/ShapeTrail/ShapeTrailHero.svelte';
</script>
<ShapeTrailHero density={48} palette="aurora" />
```

## Notes
rAF + canvas2d for the per-particle damped-spring physics (stiffness 0.012, damping 0.86); trail fade via translucent rgba bg fillRect each frame. GSAP core (no business plugins) drives the entrance gsap.timeline (canvas fade + content slide + status slide) and the gsap.to settle/release tweens. prefers-reduced-motion paints a single static lattice and skips both gsap and rAF.

_Inspired by Shape Trail._

Variable-font physics

Liquid Type

Per-character damped-spring physics on font-weight + scale (rAF), cursor-proximity peaks, click shockwaves, idle breathing wave. GSAP staggers the entrance reveal per-glyph; rAF owns the continuous physics. CSS custom properties drive the paint.

Spec by Dave Vault · Liquid Type
Words have weight
For your agent

Copy this prompt to install LiquidTypeHero

# Install LiquidTypeHero into my Svelte 5 project

Variable-font hero — characters inflate under the cursor with spring physics.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/LiquidType/LiquidTypeHero.svelte
to src/lib/components/LiquidType/LiquidTypeHero.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  words?: string[];                 // ['Words', 'have', 'weight']
  baseWeight?: number;              // 300
  peakWeight?: number;              // 850
  baseScale?: number;               // 1
  peakScale?: number;               // 1.18
  influenceRadius?: number;         // 160 px
  ariaLabel?: string;               // 'Liquid Type hero'
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import LiquidTypeHero from '$lib/components/LiquidType/LiquidTypeHero.svelte';
</script>
<LiquidTypeHero words={['Words', 'have', 'weight']} />
```

## Notes
GSAP core stages a per-glyph fade+lift entrance via gsap.from with stagger. rAF runs the per-character damped-spring on font-weight + scale (stiffness 0.18/0.20, damping 0.74/0.72) and writes --lt-weight + --lt-scale custom properties each frame. Variable font (Inter Variable / Geist with wght axis) gives smooth interpolation; falls back to discrete font-weight on non-variable fonts. Per-character spans are aria-hidden; the joined word string is exposed via .lt-sr-only for assistive tech.

_Inspired by Liquid Type._

GSAP variant of native Timeline

GSAP Timeline

A GSAP-driven sibling of the native Timeline component. Same TimelineEvent[] data shape (drop-in compatible at the prop boundary), but gsap.timeline composes the per-item slide-up + marker scale/rotate (back.out overshoot) + optional progress-line draw. IntersectionObserver fires the one-shot trigger.

Spec by Dave Vault · Timeline

Discovery

Kickoff meeting + scope

MVP

First demo to stakeholders

Beta

Limited release to design partners

GA

Public launch

For your agent

Copy this prompt to install GsapTimeline

# Install GsapTimeline into my Svelte 5 project

Timeline events with gsap.timeline entrance — the GSAP variant of native Timeline.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/GsapTimeline.svelte
to src/lib/components/GsapTimeline.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  events: TimelineEvent[];
  alignment?: 'left' | 'right' | 'alternate';      // 'alternate'
  showProgress?: boolean;                           // false
  dateFormat?: (date: Date) => string;
  onEventClick?: (event: TimelineEvent) => void;
  ariaLabel?: string;                               // 'GSAP timeline'
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import GsapTimeline from '$lib/components/GsapTimeline.svelte';
  const milestones = [
    { id: '1', date: '2024-01-15', title: 'Discovery', completed: true },
    { id: '2', date: '2024-03-01', title: 'MVP',       completed: true },
    { id: '3', date: '2024-06-15', title: 'Beta' },
    { id: '4', date: '2024-09-01', title: 'GA' }
  ];
</script>
<GsapTimeline events={milestones} showProgress />
```

## Notes
Drop-in for native Timeline with GSAP-composed entrance: items slide-up (power3.out, 0.08s stagger), markers scale + rotate with back.out(1.6) overshoot at +0.05s, optional progress line draws (scaleY 0→1 power2.inOut). IntersectionObserver fires once at threshold 0.15. prefers-reduced-motion paints the assembled state via .gsap-timeline--reduced CSS rule.

_Inspired by Timeline._

GSAP variant of native Gantt

GSAP Gantt

A GSAP-driven sibling of the native Gantt component. Same GanttTask[] data shape (drop-in compatible), but gsap.timeline composes the entrance: bars draw left → right via scaleX (0→1, power3.out, 0.06s stagger), milestones pop with back.out(1.7), dependency arrows fade in once their endpoints land. Static context (axis, weekend bands, today line) does not animate by design.

Spec by Dave Vault · Gantt
Task
  • Spec & sign-off
  • Kick-off
  • Design
  • Build
  • Launch
TODAY
For your agent

Copy this prompt to install GsapGantt

# Install GsapGantt into my Svelte 5 project

Gantt schedule with gsap.timeline entrance — the GSAP variant of native Gantt.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/GsapGantt.svelte
to src/lib/components/GsapGantt.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  tasks: GanttTask[];
  startDate?: string | Date;
  endDate?: string | Date;
  dayWidth?: number;                                // 32
  rowHeight?: number;                               // 36
  labelWidth?: number;                              // 220
  showWeekends?: boolean;                           // true
  showToday?: boolean;                              // true
  showDependencies?: boolean;                       // true
  showProgress?: boolean;                           // true
  dateFormat?: 'short' | 'long' | (d: Date) => string;
  onTaskClick?: (task: GanttTask) => void;
  ariaLabel?: string;                               // 'GSAP Gantt chart'
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import GsapGantt from '$lib/components/GsapGantt.svelte';
  const schedule = [
    { id: 'spec',   name: 'Spec',     start: '2026-05-01', end: '2026-05-05', progress: 100 },
    { id: 'kick',   name: 'Kick-off', start: '2026-05-06', end: '2026-05-06', isMilestone: true, dependencies: ['spec'] },
    { id: 'build',  name: 'Build',    start: '2026-05-07', end: '2026-05-15', progress: 35, dependencies: ['kick'] },
    { id: 'launch', name: 'Launch',   start: '2026-05-20', end: '2026-05-20', isMilestone: true, dependencies: ['build'] }
  ];
</script>
<GsapGantt tasks={schedule} />
```

## Notes
Drop-in for native Gantt with GSAP-composed entrance: bars scaleX 0→1 from left (0.06s stagger, power3.out), milestones scale 0→1 with back.out(1.7) at +0.15s, arrows opacity 0→1 at +0.45s once bars have landed. IntersectionObserver fires once at threshold 0.15. Static context (axis, weekend bands, today line, labels) does not animate by design — entrance focuses on bars + milestones + arrows.

_Inspired by Gantt._

Scroll-driven editorial

Picasso Portfolio

A scroll-driven editorial portfolio where each painting starts as scattered colour fields displaced along a Fibonacci-spaced ring, then reassembles into the canvas with a random-order GSAP stagger. IntersectionObserver fires the trigger; gsap.timeline orchestrates the dissect → reassemble + title + caption fade-up.

Spec by Dave Vault · Picasso
Suite I · 2024

Cubist Calm

Soft geometric harmony — earth tones disrupted by a single hot accent.

Suite II · 2025

Aurora Variations

Cool tones with magenta heat. The eye finds the warmth and stays.

Suite III · 2026

Heatmap

Two reds, one yellow, one black — minimum palette, maximum tension.

For your agent

Copy this prompt to install PicassoPortfolio

# Install PicassoPortfolio into my Svelte 5 project

Scroll-driven portfolio — paintings dissect and reassemble.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/Picasso/PicassoPortfolio.svelte
to src/lib/components/Picasso/PicassoPortfolio.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  paintings: PicassoPainting[];      // [{ id, title, caption?, scene?, palette }]
  gridSize?: number;                  // 4 (4x4 grid of swatches)
  duration?: number;                  // 1.4s reassemble timeline
  ariaLabel?: string;                 // 'Picasso portfolio'
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import PicassoPortfolio from '$lib/components/Picasso/PicassoPortfolio.svelte';
  const works = [
    { id: '1', title: 'Cubist Calm', caption: 'Soft geometric harmony.', scene: 'Suite I',
      palette: ['#1d4ed8', '#0f766e', '#fde68a', '#f87171', '#9333ea'] },
    { id: '2', title: 'Aurora', caption: 'Cool tones, hot accent.', scene: 'Suite II',
      palette: ['#0891b2', '#9333ea', '#e879f9', '#fbbf24'] }
  ];
</script>
<PicassoPortfolio paintings={works} />
```

## Notes
GSAP core (no ScrollTrigger / Flip plugins needed): IntersectionObserver fires once per panel at threshold 0.4, gsap.timeline scatters swatches via Fibonacci-spaced angle (cos/sin of i * 137.5°) and reassembles with stagger.from "random". Title + caption fades follow. prefers-reduced-motion + .pp-panel--reduced CSS rule pin the assembled state without animation.

_Inspired by Picasso._

Editorial 3D carousel

Momentum Slider

A horizontal carousel with momentum-driven scrolling and perspective depth (cards rotate into the page based on distance from active). Click the active card and a GSAP timeline handshakes it into a modal with backdrop fade. Native pointer events + rAF for the inertia; gsap core for the snap easing and the modal handshake.

Spec by Dave Vault · Momentum Slider
1 / 5
For your agent

Copy this prompt to install MomentumSlider

# Install MomentumSlider into my Svelte 5 project

Editorial 3D carousel — momentum scrolling, modal handshake, perspective depth.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/MomentumSlider/MomentumSlider.svelte
to src/lib/components/MomentumSlider/MomentumSlider.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  items: MomentumSliderItem[];                                   // [{ id, title, eyebrow?, subtitle?, description?, image?, alt?, color? }, …]
  initialIndex?: number;                                          // 0
  cardWidth?: number;                                             // 280
  cardGap?: number;                                               // 32
  ariaLabel?: string;                                             // 'Momentum slider'
  onSelect?: (item: MomentumSliderItem, index: number) => void;
  onExpand?: (item: MomentumSliderItem, index: number) => void;
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import MomentumSlider from '$lib/components/MomentumSlider/MomentumSlider.svelte';
  const scenes = [
    { id: '1', title: 'Establishing', eyebrow: 'Wide',  subtitle: 'Take 1', description: 'Wide, slow, deliberate.' },
    { id: '2', title: 'Reveal',       eyebrow: 'Cut',   subtitle: 'Take 2', description: 'Cut to close-up.' },
    { id: '3', title: 'Tension',      eyebrow: 'Hold',  subtitle: 'Take 3', description: 'Let the audience breathe.' },
    { id: '4', title: 'Coda',         eyebrow: 'Pull',  subtitle: 'Take 4', description: 'Pull back. The frame becomes a memory.' }
  ];
</script>
<MomentumSlider items={scenes} />
```

## Notes
GSAP core (no Draggable/Observer/Flip required): native pointer drag + rAF velocity decay (0.93/frame); gsap.to with power3.out for snap, gsap.timeline for the modal handshake (backdrop fade @0 + modal scale-in @0.05 with power3.out). prefers-reduced-motion skips inertia + the timeline; modal appears/disappears instantly. Keyboard: Arrow keys + Home/End to navigate, Enter to expand, Escape to close.

_Inspired by Momentum Slider._

Scroll-driven scenes

Cinema Reel

A vertical scroll-driven reel of cinematic stills with horizontal letterbox masks. IntersectionObserver picks the active frame as it crosses the centre of the viewport; GSAP core drives the eased transitions on filter, scale, mask height and caption opacity.

Spec by Dave Vault · Cinema Reel
Scene 01

Establishing

Wide, slow, deliberate.

Scene 02

Reveal

Cut to close-up. The eye finds the subject.

Scene 03

Tension

Hold. Let the audience breathe.

Scene 04

Coda

Pull back. The frame becomes a memory.

For your agent

Copy this prompt to install CinemaReel

# Install CinemaReel into my Svelte 5 project

Letterboxed scroll-reel of cinematic stills.

## 1. Install dependencies
# No external dependencies

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/CinemaReel/CinemaReel.svelte
to src/lib/components/CinemaReel/CinemaReel.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  stills: CinemaReelStill[];   // [{ id, image?, title?, caption?, scene?, color? }, …]
  letterboxRatio?: number;     // 0.18 — top/bottom bar height as % of frame
  activeThreshold?: number;    // 0.55 — IntersectionObserver ratio to activate
  ariaLabel?: string;          // 'Cinema reel'
  class?: string;
}
```

## 5. Usage
```svelte
<script lang="ts">
  import CinemaReel from '$lib/components/CinemaReel/CinemaReel.svelte';
  const stills = [
    { id: '1', title: 'Opening',  caption: 'Wide shot',   scene: '01', color: '#1d4ed8' },
    { id: '2', title: 'Reveal',   caption: 'Cut in',      scene: '02', image: '/scene-2.jpg' },
    { id: '3', title: 'Coda',     caption: 'Slow pull',   scene: '03', color: '#0f766e' }
  ];
</script>
<CinemaReel {stills} />
```

## Notes
IntersectionObserver picks the active frame; gsap.to drives the easing for filter/scale/mask height/caption opacity. GSAP core only — no business plugins. Falls back to first-still-active + static class when IO unavailable, and to a static .cr-frame--reduced.cr-frame--active CSS rule under prefers-reduced-motion.

_Inspired by Cinema Reel._

Reveal

Reveal Sequence

Wraps a slot in a gsap.context that picks up [data-gsap-item] children (or any selector) and staggers them on mount. Reverts cleanly on unmount and falls back to a static layout under reduced motion.

Spec by Dave Vault · GSAP scoped-timeline pattern

SplitText Hero

A reusable hero component inspired by GreenSock text splitting demos, adapted for Svelte 5.

Scoped Timelines

Animations mount client-side, run inside local GSAP context, then revert cleanly.

Reduced Motion

Motion-heavy paths collapse to a final readable state when the user asks for less.

Composable Primitives

The suite wraps content instead of locking teams into a single fixed layout.

For your agent

Copy this prompt to install GsapRevealSequence

# Install GsapRevealSequence into my Svelte 5 project

Stagger any group of children with an SSR-safe gsap.context wrapper.

## 1. Install dependencies
bun add gsap

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/GsapRevealSequence.svelte
to src/lib/components/GsapRevealSequence.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  selector?: string;        // default '[data-gsap-item]'
  axis?: 'x' | 'y';         // default 'y'
  distance?: number;        // default 28
  duration?: number;        // default 0.7
  delay?: number;           // default 0
  stagger?: number;         // default 0.08
  ease?: string;            // default 'power3.out'
}
```

## 5. Usage
```svelte
<GsapRevealSequence stagger={0.12} distance={42}>
  {#each cards as card (card.title)}
    <article data-gsap-item>...</article>
  {/each}
</GsapRevealSequence>
```

_Inspired by GSAP scoped-timeline pattern._

Canvas

Kinetic Canvas Field

A full-bleed canvas particle field that follows the cursor, presses on click, and releases under a budget. Particles are drawn on a 2D context and driven from the GSAP ticker so cleanup is single-call.

Spec by Dave Vault · Liquid Type cursor trail

Pointer field

Move, press, release

Particles drawn on canvas, driven from the GSAP ticker, cleaned up on unmount.
For your agent

Copy this prompt to install KineticCanvasField

# Install KineticCanvasField into my Svelte 5 project

Pointer-driven particle field with GSAP ticker cleanup.

## 1. Install dependencies
bun add gsap

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/KineticCanvasField.svelte
to src/lib/components/KineticCanvasField.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  density?: number;         // default 96
  palette?: 'aurora' | 'mono' | 'amber';
  children?: Snippet;
}
```

## 5. Usage
```svelte
<KineticCanvasField density={96} palette="aurora">
  <div class="kinetic-panel">
    <h2>Move, press, release</h2>
  </div>
</KineticCanvasField>
```

## Notes
Caps particle budget at 240; resizes the canvas on devicePixelRatio changes.

_Inspired by Liquid Type cursor trail._

Deck

Fan Deck Carousel

A fan-stack carousel that arranges card items in a perspective fan and rotates the active card to the front. Keyboard navigation, drag-to-flick, and a soft 3D depth effect.

Spec by Dave Vault · Drag Gallery
For your agent

Copy this prompt to install FanDeckCarousel

# Install FanDeckCarousel into my Svelte 5 project

Editorial fan-stack carousel with keyboard + drag navigation.

## 1. Install dependencies
bun add gsap

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/FanDeckCarousel.svelte
to src/lib/components/FanDeckCarousel.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  items: FanDeckItem[];
  initialIndex?: number;
}
```

## 5. Usage
```svelte
<FanDeckCarousel items={deckItems} />
```

_Inspired by Drag Gallery._

Hero text

SplitText Hero

A reusable hero that splits a headline into characters, words, or lines and choreographs the entrance with GSAP SplitText. Mode is switchable at runtime; the component re-runs the timeline on change and respects reduced-motion preferences.

Inspired by CodePen · GreenSock pen xxmaNYj

The hero at the top of this page is this component. The agent prompt below is what other agents should paste to install the same SplitText hero in their own project.

For your agent

Copy this prompt to install GsapSplitTextHero

# Install GsapSplitTextHero into my Svelte 5 project

Per-character, per-word, per-line text reveal with mode toggle.

## 1. Install dependencies
bun add gsap

## 2. Save component source
Copy the file at https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/lib/components/GsapSplitTextHero.svelte
to src/lib/components/GsapSplitTextHero.svelte in your project.

## 3. (Optional) Save demo route
Copy https://github.com/Jktfe/tfeSvelteTemplates/blob/main/src/routes/gsap-suite/+page.svelte to src/routes/gsap-suite/+page.svelte.

## 4. Props
```ts
{
  headline?: string;
  eyebrow?: string;
  copy?: string;
  initialMode?: 'chars' | 'words' | 'lines';
  theme?: 'light' | 'dark';
}
```

## 5. Usage
```svelte
<GsapSplitTextHero
  headline="Motion primitives with manners"
  eyebrow="GSAP suite"
  copy="SplitText, scoped timelines, canvas motion, deck choreography."
/>
```

## Notes
Client-only — wraps SplitText.create inside onMount and reverts on cleanup.

_Inspired by GreenSock pen xxmaNYj._

Coming next

From spec to component

Concept specs from Dave Vault queued for implementation. Each one will land here with a working demo, agent prompt, and provenance chip.