diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index e97d9e44..2421d6ba 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -262,6 +262,11 @@ function ExtensionSettingsSection({ } if (field.type === "slider") { + const step = field.step ?? 0.01; + const stepText = String(step); + const precision = stepText.includes(".") + ? stepText.split(".")[1]?.length ?? 0 + : 0; return (
{ extensionHost.setExtensionSetting(extensionId, field.id, v); forceUpdate((n) => n + 1); }} - formatValue={(v) => v.toFixed(1)} + formatValue={(v) => v.toFixed(precision)} parseInput={(text) => parseFloat(text)} />
@@ -1552,11 +1557,17 @@ export function SettingsPanel({ }; const resetFrameSection = () => { + const preferredFrame = initialEditorPreferences.frame; + const resolvedFrame = preferredFrame + ? availableFrames.some((candidate) => candidate.id === preferredFrame) + ? preferredFrame + : null + : null; onShadowChange?.(initialEditorPreferences.shadowIntensity); onBorderRadiusChange?.(initialEditorPreferences.borderRadius); onAspectRatioChange?.(initialEditorPreferences.aspectRatio); onPaddingChange?.({ ...initialEditorPreferences.padding }); - onFrameChange?.(initialEditorPreferences.frame); + onFrameChange?.(resolvedFrame); removeBackgroundStateRef.current = null; }; diff --git a/src/lib/extensions/extensionHost.ts b/src/lib/extensions/extensionHost.ts index 41cd5c33..d0683e7e 100644 --- a/src/lib/extensions/extensionHost.ts +++ b/src/lib/extensions/extensionHost.ts @@ -185,6 +185,14 @@ export class ExtensionHost { isPlaying: boolean; } | null = null; + constructor() { + if (typeof window !== "undefined") { + window.addEventListener("beforeunload", () => { + this.flushPersistedSettings(); + }); + } + } + /** * Activate an extension given its info and resolved module URL. */ @@ -274,6 +282,7 @@ export class ExtensionHost { } this.activeExtensions.delete(extensionId); + this.flushPersistedSettings(); this.notifyListeners(); console.log(`[extensions] Deactivated: ${extensionId}`); } @@ -286,6 +295,7 @@ export class ExtensionHost { for (const id of ids) { await this.deactivateExtension(id); } + this.flushPersistedSettings(); } // --------------------------------------------------------------------------- @@ -619,6 +629,14 @@ export class ExtensionHost { }, 500); } + private flushPersistedSettings(): void { + if (this.persistTimeout) { + clearTimeout(this.persistTimeout); + this.persistTimeout = null; + } + this.writePersistedSettingsStore(this.getFullSettingsStore()); + } + /** * Create the permission-gated API object for an extension. */