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
- A cybernetically enhanced web application framework that compiles to highly optimized JavaScript with reactive state management and component-based architecture.
- Author
- tessl
- Last updated
transitions.md docs/
1# Transitions23Svelte provides built-in transition effects for smooth element enter and exit animations. Transitions can be applied to elements conditionally rendered with `{#if}` blocks or list items in `{#each}` blocks.45## Capabilities67### fade89Animates the opacity of an element from 0 to current opacity for in transitions, and from current opacity to 0 for out transitions.1011```typescript { .api }12/**13* Opacity fade transition14* @param node - Element to animate15* @param params - Fade animation parameters16* @returns Transition configuration17*/18function fade(node: Element, params?: FadeParams): TransitionConfig;19```2021**Usage Examples:**2223```typescript24import { fade } from "svelte/transition";2526let visible = $state(false);2728// Basic fade29/*30{#if visible}31<div transition:fade>32Hello world!33</div>34{/if}35*/3637// Custom fade parameters38/*39{#if visible}40<div transition:fade={{ duration: 1000, delay: 200 }}>41Slow fade with delay42</div>43{/if}44*/4546// Separate in/out transitions47/*48{#if visible}49<div in:fade={{ duration: 300 }} out:fade={{ duration: 150 }}>50Different in/out timing51</div>52{/if}53*/54```5556### fly5758Animates x/y position and opacity. In transitions animate from provided values to element's default values, out transitions reverse this.5960```typescript { .api }61/**62* Position and opacity transition with motion63* @param node - Element to animate64* @param params - Fly animation parameters65* @returns Transition configuration66*/67function fly(node: Element, params?: FlyParams): TransitionConfig;68```6970**Usage Examples:**7172```typescript73import { fly } from "svelte/transition";74import { cubicOut } from "svelte/easing";7576// Fly in from the left77/*78{#if visible}79<div transition:fly={{ x: -200, duration: 400 }}>80Slides in from left81</div>82{/if}83*/8485// Fly in from top with custom easing86/*87{#if visible}88<div transition:fly={{89y: -100,90duration: 600,91easing: cubicOut,92opacity: 0.393}}>94Slides down with custom easing95</div>96{/if}97*/9899// Different directions for in/out100/*101{#if visible}102<div103in:fly={{ x: -200, duration: 300 }}104out:fly={{ x: 200, duration: 300 }}105>106Slides in from left, out to right107</div>108{/if}109*/110```111112### slide113114Animates the height (or width) of an element, revealing content gradually.115116```typescript { .api }117/**118* Height/width slide transition119* @param node - Element to animate120* @param params - Slide animation parameters121* @returns Transition configuration122*/123function slide(node: Element, params?: SlideParams): TransitionConfig;124```125126**Usage Examples:**127128```typescript129import { slide } from "svelte/transition";130131// Vertical slide (default)132/*133{#if expanded}134<div transition:slide>135<p>This content slides down/up</p>136</div>137{/if}138*/139140// Horizontal slide141/*142{#if expanded}143<div transition:slide={{ axis: 'x', duration: 400 }}>144<p>This content slides left/right</p>145</div>146{/if}147*/148149// Custom duration and easing150/*151{#if expanded}152<div transition:slide={{153duration: 600,154easing: t => t * t,155axis: 'y'156}}>157<p>Slow slide with custom easing</p>158</div>159{/if}160*/161```162163### scale164165Animates opacity and scale of an element. In transitions animate from provided values to element's defaults.166167```typescript { .api }168/**169* Scale and opacity transition170* @param node - Element to animate171* @param params - Scale animation parameters172* @returns Transition configuration173*/174function scale(node: Element, params?: ScaleParams): TransitionConfig;175```176177**Usage Examples:**178179```typescript180import { scale } from "svelte/transition";181182// Basic scale animation183/*184{#if visible}185<div transition:scale>186Scales in/out from center187</div>188{/if}189*/190191// Custom scale parameters192/*193{#if visible}194<div transition:scale={{195start: 0.5,196opacity: 0.3,197duration: 400198}}>199Starts at 50% scale, 30% opacity200</div>201{/if}202*/203204// Scale with different in/out values205/*206{#if visible}207<div208in:scale={{ start: 0.8, duration: 200 }}209out:scale={{ start: 1.2, duration: 150 }}210>211Scales up on entry, scales further up on exit212</div>213{/if}214*/215```216217### blur218219Animates a blur filter alongside opacity changes.220221```typescript { .api }222/**223* Blur filter and opacity transition224* @param node - Element to animate225* @param params - Blur animation parameters226* @returns Transition configuration227*/228function blur(node: Element, params?: BlurParams): TransitionConfig;229```230231**Usage Examples:**232233```typescript234import { blur } from "svelte/transition";235236// Basic blur transition237/*238{#if visible}239<div transition:blur>240Blurs in and out241</div>242{/if}243*/244245// Custom blur parameters246/*247{#if visible}248<div transition:blur={{249amount: 10,250opacity: 0.4,251duration: 800252}}>253Heavy blur with custom opacity254</div>255{/if}256*/257```258259### draw260261Animates SVG path strokes, creating a drawing effect. Only works with elements that have `getTotalLength()` method.262263```typescript { .api }264/**265* SVG path drawing transition266* @param node - SVG element with getTotalLength method267* @param params - Draw animation parameters268* @returns Transition configuration269*/270function draw(271node: SVGElement & { getTotalLength(): number },272params?: DrawParams273): TransitionConfig;274```275276**Usage Examples:**277278```typescript279import { draw } from "svelte/transition";280281// Basic path drawing282/*283{#if visible}284<svg>285<path286d="M 0 0 L 100 100"287stroke="black"288fill="none"289transition:draw290/>291</svg>292{/if}293*/294295// Custom draw parameters296/*297{#if visible}298<svg>299<path300d="M 0 0 L 100 100"301stroke="black"302fill="none"303transition:draw={{ speed: 2, duration: 1000 }}304/>305</svg>306{/if}307*/308309// Draw based on path length310/*311{#if visible}312<svg>313<polyline314points="0,0 50,25 100,0"315stroke="red"316fill="none"317transition:draw={{ speed: 1 }}318/>319</svg>320{/if}321*/322```323324### crossfade325326Creates a pair of transitions for elements that move between different states, with smooth crossfading.327328```typescript { .api }329/**330* Creates crossfade transition pair for moving elements331* @param params - Crossfade configuration and fallback332* @returns Tuple of [send, receive] transition functions333*/334function crossfade(params: CrossfadeParams & {335fallback?: (node: Element, params: CrossfadeParams, intro: boolean) => TransitionConfig;336}): [337(node: Element, params: CrossfadeParams & { key: any }) => () => TransitionConfig,338(node: Element, params: CrossfadeParams & { key: any }) => () => TransitionConfig339];340```341342**Usage Examples:**343344```typescript345import { crossfade } from "svelte/transition";346import { quintOut } from "svelte/easing";347348const [send, receive] = crossfade({349duration: 400,350easing: quintOut,351fallback: (node, params) => {352return fly(node, { y: -30, duration: 400 });353}354});355356let todos = $state([357{ id: 1, done: false, text: "Write docs" },358{ id: 2, done: false, text: "Test code" }359]);360361// Usage in template for todo list362/*363<div class="todo">364{#each todos.filter(t => !t.done) as todo (todo.id)}365<div out:send={{ key: todo.id }}>366{todo.text}367</div>368{/each}369</div>370371<div class="done">372{#each todos.filter(t => t.done) as todo (todo.id)}373<div in:receive={{ key: todo.id }}>374{todo.text}375</div>376{/each}377</div>378*/379```380381## Types382383```typescript { .api }384interface TransitionConfig {385delay?: number;386duration?: number;387easing?: (t: number) => number;388css?: (t: number, u: number) => string;389tick?: (t: number, u: number) => void;390}391392interface FadeParams {393delay?: number;394duration?: number;395easing?: (t: number) => number;396}397398interface FlyParams {399delay?: number;400duration?: number;401easing?: (t: number) => number;402x?: number | string;403y?: number | string;404opacity?: number;405}406407interface SlideParams {408delay?: number;409duration?: number;410easing?: (t: number) => number;411axis?: 'x' | 'y';412}413414interface ScaleParams {415delay?: number;416duration?: number;417easing?: (t: number) => number;418start?: number;419opacity?: number;420}421422interface BlurParams {423delay?: number;424duration?: number;425easing?: (t: number) => number;426amount?: number | string;427opacity?: number;428}429430interface DrawParams {431delay?: number;432speed?: number;433duration?: number | ((len: number) => number);434easing?: (t: number) => number;435}436437interface CrossfadeParams {438delay?: number;439duration?: number | ((len: number) => number);440easing?: (t: number) => number;441}442443type EasingFunction = (t: number) => number;444```445446## Best Practices4474481. **Use appropriate transitions**: Choose transitions that match your UI's personality4492. **Respect motion preferences**: Check `prefersReducedMotion` and provide alternatives4503. **Keep durations reasonable**: Generally 200-500ms for most UI transitions4514. **Use easing functions**: Import from `svelte/easing` for better motion feel4525. **Test performance**: Complex transitions on many elements can impact performance4536. **Provide fallbacks**: Use `fallback` parameter in `crossfade` for items without pairs