一键导入
example-svelte
Patterns for using Helios with Svelte. Use when building compositions in a Svelte environment, utilizing Svelte stores for reactive frame updates.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Patterns for using Helios with Svelte. Use when building compositions in a Svelte environment, utilizing Svelte stores for reactive frame updates.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Collection of agent skills for Helios video engine. Use when working with programmatic video creation, browser-native animations, or Helios compositions. Install individual skills by path for specific capabilities.
Core API for Helios video engine. Use when creating compositions, managing timeline state, controlling playback, or subscribing to frame updates. Covers Helios class instantiation, signals, animation helpers, and DOM synchronization.
Patterns for using Helios with Vanilla Canvas API. Use when building high-performance 2D/3D animations without frameworks.
Chart.js integration patterns for Helios. Use when creating animated data visualizations with Chart.js.
Learn how to use D3.js with Helios for data visualization. Use when creating charts, graphs, or data-driven animations.
Patterns for using Helios with Framer Motion. Use when you want to use Framer Motion's physics and transitions but need frame-perfect synchronization with Helios.
| name | example-svelte |
| description | Patterns for using Helios with Svelte. Use when building compositions in a Svelte environment, utilizing Svelte stores for reactive frame updates. |
Integrate Helios into Svelte components using Svelte Stores to manage frame state reactivity efficiently.
Wrap the Helios instance in a readable store to make state reactive.
// lib/store.js
import { readable } from 'svelte/store';
export const createHeliosStore = (helios) => {
return readable(helios.getState(), (set) => {
// Set initial value
set(helios.getState());
// Subscribe to updates
const unsubscribe = helios.subscribe((state) => {
set(state);
});
return unsubscribe;
});
};
<!-- App.svelte -->
<script>
import { onMount, onDestroy } from 'svelte';
import { Helios } from '@helios-project/core';
import { createHeliosStore } from './lib/store';
let canvas;
let ctx;
const duration = 5;
const fps = 30;
// Initialize Singleton
const helios = new Helios({ duration, fps });
helios.bindToDocumentTimeline();
// Expose to window
if (typeof window !== 'undefined') window.helios = helios;
// Create Store
const heliosStore = createHeliosStore(helios);
// Reactive Drawing Statement
$: if (ctx && $heliosStore) {
draw($heliosStore.currentFrame);
}
function draw(frame) {
const width = canvas.width;
const height = canvas.height;
// Clear
ctx.clearRect(0, 0, width, height);
// Draw
const progress = frame / (duration * fps);
ctx.fillStyle = '#ff3e00';
ctx.fillRect(progress * width, height / 2 - 50, 100, 100);
}
onMount(() => {
ctx = canvas.getContext('2d');
canvas.width = 1920;
canvas.height = 1080;
// Initial draw
draw(helios.currentFrame.peek());
});
</script>
<canvas bind:this={canvas}></canvas>
<style>
canvas {
display: block;
width: 100%;
height: 100%;
}
</style>
For Svelte 5, use the $state rune to create a reactive state class.
// lib/helios.svelte.ts
import { Helios } from '@helios-project/core';
export class HeliosState {
currentFrame = $state(0);
fps = $state(0);
duration = $state(0);
isPlaying = $state(false);
constructor(helios) {
this.fps = helios.fps;
this.duration = helios.duration;
this.isPlaying = helios.isPlaying;
helios.subscribe((state) => {
this.currentFrame = state.currentFrame;
this.isPlaying = state.isPlaying;
});
}
}
<!-- App.svelte -->
<script>
import { Helios } from '@helios-project/core';
import { HeliosState } from './lib/helios.svelte.js';
const helios = new Helios({ duration: 10, fps: 30 });
const state = new HeliosState(helios);
// Reactivity works automatically with state properties
$effect(() => {
console.log(`Current Frame: ${state.currentFrame}`);
});
</script>
<div>Frame: {state.currentFrame}</div>
readable store is the perfect primitive for wrapping the helios.subscribe callback.$:): Use reactive statements to trigger redraws whenever $heliosStore updates.Helios outside the component script or in a separate module to ensure it persists if the component remounts (though for a root App component, inside <script> is fine).For audio visualization, use a derived store to compute analysis data (RMS, Waveform) reactively based on the current frame.
// lib/audio.js
import { derived } from 'svelte/store';
export function createAudioStore(bufferStore, heliosStore) {
return derived(
[bufferStore, heliosStore],
([$buffer, $heliosState]) => {
if (!$buffer || !$heliosState) return { rms: 0, waveform: [] };
const data = $buffer.getChannelData(0);
const sampleRate = $buffer.sampleRate;
const time = $heliosState.currentFrame / $heliosState.fps;
// Analyze window around current time
const center = Math.floor(time * sampleRate);
const windowSize = 1024;
// ... (FFT logic or simple time-domain analysis) ...
return { rms: 0.5, waveform: [] }; // Mock result
}
);
}
<script>
import { createAudioStore } from './lib/audio';
// ... setup heliosStore and bufferStore ...
const audioStore = createAudioStore(bufferStore, heliosStore);
$: if (ctx && $audioStore) {
const { rms, waveform } = $audioStore;
// Draw using rms/waveform
}
</script>
examples/svelte-canvas-animation/examples/svelte-runes-animation/examples/svelte-audio-visualization/