Spec Registry
Help your agents use open-source better. Learn more.
Find usage specs for your project’s dependencies
- Author
- tessl
- Last updated
- Spec files
npm-svelte
Describes: npm/svelte
- Description
- Revolutionary JavaScript framework and compiler that builds web applications without runtime overhead by compiling components at build time.
- Author
- tessl
- Last updated
list-animations.md docs/
1# List Animations23FLIP animations for smooth list reordering and element positioning transitions using the First, Last, Invert, Play technique.45## Capabilities67### FLIP Animation89Create smooth transitions when elements change position in lists, providing natural motion for reordering, filtering, and layout changes.1011```javascript { .api }12/**13* Creates FLIP (First, Last, Invert, Play) animation for element position changes14* @param node - DOM element to animate15* @param positions - Start and end DOMRect positions16* @param params - Animation parameters17* @returns Animation configuration18*/19function flip(20node: Element,21{ from, to }: { from: DOMRect; to: DOMRect },22params?: FlipParams23): AnimationConfig;2425interface FlipParams {26/** Delay before animation starts (ms) */27delay?: number;28/** Animation duration (ms) or function based on distance */29duration?: number | ((len: number) => number);30/** Easing function */31easing?: (t: number) => number;32}3334interface AnimationConfig {35delay?: number;36duration?: number;37easing?: (t: number) => number;38css?: (t: number, u: number) => string;39tick?: (t: number, u: number) => void;40}41```4243**Usage Examples:**4445```javascript46// Basic list with FLIP animations47import { flip } from "svelte/animate";48import { cubicOut } from "svelte/easing";4950let items = [51{ id: 1, name: "First item" },52{ id: 2, name: "Second item" },53{ id: 3, name: "Third item" }54];5556function shuffle() {57items = items.sort(() => Math.random() - 0.5);58}5960// In template:61{#each items as item (item.id)}62<div animate:flip={{ duration: 300 }}>63{item.name}64</div>65{/each}6667// With custom parameters68{#each items as item (item.id)}69<div animate:flip={{70duration: d => Math.sqrt(d * 200),71easing: cubicOut72}}>73{item.name}74</div>75{/each}76```7778### Dynamic Duration7980Adjust animation duration based on the distance elements need to travel for more natural motion.8182**Usage Examples:**8384```javascript85import { flip } from "svelte/animate";8687// Duration proportional to distance88{#each todos as todo (todo.id)}89<div animate:flip={{ duration: d => Math.sqrt(d * 150) }}>90<input type="checkbox" bind:checked={todo.done} />91{todo.text}92</div>93{/each}9495// Fixed duration for consistent timing96{#each items as item (item.id)}97<div animate:flip={{ duration: 250 }}>98{item.content}99</div>100{/each}101```102103### Advanced List Patterns104105Common patterns for using FLIP animations in interactive lists.106107**Sortable List:**108109```javascript110import { flip } from "svelte/animate";111import { dndzone } from "svelte-dnd-action";112113let items = [114{ id: 1, name: "Task 1" },115{ id: 2, name: "Task 2" },116{ id: 3, name: "Task 3" }117];118119function handleDndConsider(e) {120items = e.detail.items;121}122123function handleDndFinalize(e) {124items = e.detail.items;125}126127// Template with drag-and-drop and FLIP128<div129use:dndzone={{ items }}130on:consider={handleDndConsider}131on:finalize={handleDndFinalize}132>133{#each items as item (item.id)}134<div animate:flip={{ duration: 300 }}>135{item.name}136</div>137{/each}138</div>139```140141**Filtered List with Animations:**142143```javascript144import { flip } from "svelte/animate";145import { scale } from "svelte/transition";146147let items = [...]; // Your data148let filter = "";149150$: filteredItems = items.filter(item =>151item.name.toLowerCase().includes(filter.toLowerCase())152);153154// Template155<input bind:value={filter} placeholder="Filter items..." />156157{#each filteredItems as item (item.id)}158<div159in:scale={{ duration: 200 }}160out:scale={{ duration: 200 }}161animate:flip={{ duration: 300 }}162>163{item.name}164</div>165{/each}166```167168**Todo List with Categories:**169170```javascript171import { flip } from "svelte/animate";172import { fly } from "svelte/transition";173174let todos = [...];175176function toggleDone(id) {177todos = todos.map(todo =>178todo.id === id ? { ...todo, done: !todo.done } : todo179);180}181182// Template183<div class="todo-sections">184<section class="pending">185<h2>Pending</h2>186{#each todos.filter(t => !t.done) as todo (todo.id)}187<div188animate:flip={{ duration: 300 }}189in:fly={{ x: -100 }}190out:fly={{ x: 100 }}191>192<input193type="checkbox"194checked={todo.done}195on:change={() => toggleDone(todo.id)}196/>197{todo.text}198</div>199{/each}200</section>201202<section class="completed">203<h2>Completed</h2>204{#each todos.filter(t => t.done) as todo (todo.id)}205<div206animate:flip={{ duration: 300 }}207in:fly={{ x: -100 }}208out:fly={{ x: 100 }}209>210<input211type="checkbox"212checked={todo.done}213on:change={() => toggleDone(todo.id)}214/>215<s>{todo.text}</s>216</div>217{/each}218</section>219</div>220```221222### Performance Optimization223224Tips for optimal FLIP animation performance:225226```javascript227import { flip } from "svelte/animate";228229// Use shorter durations for better performance230{#each items as item (item.id)}231<div animate:flip={{ duration: 200 }}>232{item.name}233</div>234{/each}235236// Avoid complex easing functions for large lists237import { linear, cubicOut } from "svelte/easing";238239{#each items as item (item.id)}240<div animate:flip={{241duration: 150,242easing: items.length > 50 ? linear : cubicOut243}}>244{item.name}245</div>246{/each}247248// Consider disabling animations for very large lists249{#each items as item (item.id)}250<div animate:flip={{251duration: items.length > 100 ? 0 : 300252}}>253{item.name}254</div>255{/each}256```257258### Integration with Transitions259260Combine FLIP animations with enter/exit transitions for complete motion design:261262```javascript263import { flip } from "svelte/animate";264import { fade, fly, scale } from "svelte/transition";265266// Fade in/out with position animations267{#each items as item (item.id)}268<div269in:fade={{ duration: 200 }}270out:fade={{ duration: 200 }}271animate:flip={{ duration: 300 }}272>273{item.name}274</div>275{/each}276277// Slide in from side with repositioning278{#each items as item (item.id)}279<div280in:fly={{ x: -50, duration: 200 }}281out:fly={{ x: 50, duration: 200 }}282animate:flip={{ duration: 300 }}283>284{item.name}285</div>286{/each}287288// Scale with smooth repositioning289{#each items as item (item.id)}290<div291in:scale={{ start: 0.8, duration: 150 }}292out:scale={{ start: 0.8, duration: 150 }}293animate:flip={{ duration: d => Math.sqrt(d * 100) }}294>295{item.name}296</div>297{/each}298```299300## FLIP Technique Explained301302FLIP stands for:303- **First**: Measure the initial position of elements304- **Last**: Measure the final position after DOM changes305- **Invert**: Apply a transform to move elements back to their starting positions306- **Play**: Animate the transform back to 0, creating smooth motion307308This technique allows for smooth animations even when the actual DOM changes happen instantly, making it perfect for list reordering, filtering, and layout changes.