From 3d484952c2f49d91a1eaa039e4bf39f9f4213209 Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Thu, 16 Apr 2026 18:40:43 +0200 Subject: [PATCH] feat: add Svelte stores for app state Co-Authored-By: Claude Opus 4.6 --- client/src/lib/stores.ts | 66 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 client/src/lib/stores.ts diff --git a/client/src/lib/stores.ts b/client/src/lib/stores.ts new file mode 100644 index 0000000..bad8582 --- /dev/null +++ b/client/src/lib/stores.ts @@ -0,0 +1,66 @@ +import { writable, derived } from "svelte/store"; +import type { VideoFile, Marker } from "./api"; + +// --- Connection --- +export const serverUrl = writable("http://192.168.1.51:8000"); + +// --- Files --- +export const roots = writable([]); +export const files = writable([]); +export const hiddenFiles = writable>(new Set()); +export const currentFile = writable(null); +export const hideExported = writable(false); +export const showHidden = writable(false); + +// --- Playback --- +export const duration = writable(0); +export const cursor = writable(0); +export const playPos = writable(null); +export const playing = writable(false); +export const quality = writable("low"); + +// --- Timeline --- +export const markers = writable([]); +export const locked = writable(false); + +// --- Export settings --- +export const clips = writable(3); +export const spread = writable(3.0); +export const shortSide = writable(512); +export const portraitRatio = writable(null); +export const cropCenter = writable(0.5); +export const format = writable("MP4"); +export const hwEncode = writable(false); +export const label = writable(""); +export const category = writable(""); +export const clipName = writable(""); +export const exportFolder = writable(""); +export const encoder = writable("libx264"); +export const trackSubject = writable(false); +export const randPortrait = writable(false); +export const randSquare = writable(false); + +// --- Profiles --- +export const profile = writable("default"); +export const subprofiles = writable([]); + +// --- Export progress --- +export const exportStatus = writable("idle"); // idle | running | done | error +export const exportCompleted = writable(0); +export const exportTotal = writable(0); + +// --- Derived --- +export const clipSpan = derived( + [clips, spread], + ([$clips, $spread]) => 8.0 + ($clips - 1) * $spread +); + +export const visibleFiles = derived( + [files, hiddenFiles, showHidden], + ([$files, $hidden, $showHidden]) => { + return $files.filter(f => { + if (!$showHidden && $hidden.has(f.name)) return false; + return true; + }); + } +);