@ssgoi/svelte
Version:
Svelte bindings for SSGOI - Native app-like page transitions for Svelte and SvelteKit applications
288 lines (218 loc) • 6.22 kB
Markdown
# @ssgoi/svelte
Svelte bindings for SSGOI - Native app-like page transitions for Svelte and SvelteKit.
try this: [ssgoi.dev](https://ssgoi.dev)

## What is SSGOI?
SSGOI brings native app-like page transitions to the web. Transform your static page navigations into smooth, delightful experiences that users love.
### ✨ Key Features
- **🌍 Works Everywhere** - Unlike the browser's View Transition API, SSGOI works in all modern browsers (Chrome, Firefox, Safari)
- **🚀 SSR Ready** - Perfect compatibility with SvelteKit. No hydration issues, SEO-friendly
- **🎯 Use Your Router** - Keep your existing routing. SvelteKit's built-in router works seamlessly
- **💾 State Persistence** - Remembers animation state during navigation, even with browser back/forward
- **🧩 Svelte Native** - Built specifically for Svelte with actions and stores
## Installation
```bash
npm install @ssgoi/svelte
# or
yarn add @ssgoi/svelte
# or
pnpm add @ssgoi/svelte
```
## Quick Start
### 1. Wrap your app layout
```svelte
<!-- +layout.svelte -->
<script>
import { Ssgoi } from '@ssgoi/svelte';
import { fade } from '@ssgoi/svelte/view-transitions';
</script>
<Ssgoi config={{ defaultTransition: fade() }}>
<!-- ⚠️ Important: position: relative is required! -->
<div style="position: relative; min-height: 100vh;">
<slot />
</div>
</Ssgoi>
```
### 2. Wrap your pages
```svelte
<!-- +page.svelte -->
<script>
import { SsgoiTransition } from '@ssgoi/svelte';
import { page } from '$app/stores';
</script>
<SsgoiTransition id={$page.url.pathname}>
<h1>Welcome</h1>
<!-- Page content -->
</SsgoiTransition>
```
**That's it!** Your pages now transition smoothly with a fade effect.
## Advanced Transitions
### Route-based Transitions
Define different transitions for different routes:
```svelte
<script>
import { Ssgoi } from '@ssgoi/svelte';
import { slide, fade, scale, pinterest } from '@ssgoi/svelte/view-transitions';
const config = {
transitions: [
// Slide between tabs
{ from: '/home', to: '/about', transition: slide({ direction: 'left' }) },
{ from: '/about', to: '/home', transition: slide({ direction: 'right' }) },
// Scale up when entering details
{ from: '/products', to: '/products/*', transition: scale() },
// Pinterest-style image transitions
{ from: '/gallery', to: '/photo/*', transition: pinterest() }
],
defaultTransition: fade()
};
</script>
<Ssgoi {config}>
<slot />
</Ssgoi>
```
### Symmetric Transitions
Automatically create bidirectional transitions:
```svelte
{
from: '/home',
to: '/about',
transition: slide({ direction: 'left' }),
symmetric: true // Automatically creates reverse transition
}
```
### Individual Element Animations
Animate specific elements during mount/unmount:
```svelte
<script>
import { transition } from '@ssgoi/svelte';
import { fadeIn, slideUp } from '@ssgoi/svelte/transitions';
</script>
<div use:transition={{
key: 'card',
in: fadeIn(),
out: slideUp()
}}>
<h2>Animated Card</h2>
</div>
```
## SvelteKit App Example
```svelte
<!-- +layout.svelte -->
<script>
import { Ssgoi } from '@ssgoi/svelte';
import { slide } from '@ssgoi/svelte/view-transitions';
</script>
<Ssgoi config={{
defaultTransition: slide({ direction: 'left' })
}}>
<div style="position: relative; min-height: 100vh;">
<nav>
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/products">Products</a>
</nav>
<slot />
</div>
</Ssgoi>
<!-- +page.svelte -->
<script>
import { SsgoiTransition } from '@ssgoi/svelte';
import { page } from '$app/stores';
</script>
<SsgoiTransition id={$page.url.pathname}>
<!-- Your page content -->
</SsgoiTransition>
```
## API Reference
### Components
#### `<Ssgoi>`
The provider component that manages transition context.
```svelte
<Ssgoi config={ssgoiConfig}>
<slot />
</Ssgoi>
```
#### `<SsgoiTransition>`
Wrapper component for pages that should transition.
```svelte
<SsgoiTransition id="/page-id">
<slot />
</SsgoiTransition>
```
### Actions
#### `use:transition`
Apply transitions to individual elements.
```svelte
<div use:transition={{
key: 'unique-key',
in: fadeIn(),
out: fadeOut()
}}>
Content
</div>
```
### Stores
#### `transitioning`
Access transition state.
```svelte
<script>
import { transitioning } from '@ssgoi/svelte';
</script>
{#if $transitioning}
<p>Transitioning...</p>
{/if}
```
## Built-in Transitions
### Page Transitions (`@ssgoi/svelte/view-transitions`)
- `fade()` - Smooth opacity transition
- `slide()` - Directional sliding (left/right/up/down)
- `scale()` - Zoom in/out effect
- `hero()` - Shared element transitions
- `pinterest()` - Pinterest-style expand effect
- `ripple()` - Material Design ripple effect
### Element Transitions (`@ssgoi/svelte/transitions`)
- `fadeIn()` / `fadeOut()`
- `slideUp()` / `slideDown()` / `slideLeft()` / `slideRight()`
- `scaleIn()` / `scaleOut()`
- `bounce()`
- `blur()`
- `rotate()`
## Spring Physics Configuration
All transitions use spring physics for natural motion:
```javascript
slide({
direction: 'left',
spring: {
stiffness: 300, // 1-1000, higher = faster
damping: 30 // 0-100, higher = less oscillation
}
})
```
## TypeScript Support
SSGOI is written in TypeScript and provides full type definitions:
```typescript
import type { SsgoiConfig, TransitionConfig } from '@ssgoi/svelte';
const config: SsgoiConfig = {
// Full type safety
};
```
## Browser Support
- Chrome/Edge 88+
- Firefox 78+
- Safari 14+
- All modern mobile browsers
## Performance
- Minimal bundle size (~8kb gzipped)
- Hardware-accelerated animations
- Automatic cleanup and memory management
- Smart preloading for instant transitions
## Documentation
Visit [https://ssgoi.dev](https://ssgoi.dev) for:
- Complete API reference
- Interactive examples
- Advanced patterns
- Migration guides
## Contributing
We welcome contributions! Please see our [contributing guide](https://github.com/meursyphus/ssgoi/blob/main/CONTRIBUTING.md) for details.
## License
MIT © [MeurSyphus](https://github.com/meursyphus)