57 lines
1.1 KiB
TypeScript
57 lines
1.1 KiB
TypeScript
/**
|
|
* UI state for the timeline
|
|
* For core logic, use EditorCore instead.
|
|
*/
|
|
|
|
import { create } from "zustand";
|
|
import { persist } from "zustand/middleware";
|
|
import type { ClipboardItem } from "@/types/timeline";
|
|
|
|
interface TimelineStore {
|
|
snappingEnabled: boolean;
|
|
toggleSnapping: () => void;
|
|
rippleEditingEnabled: boolean;
|
|
toggleRippleEditing: () => void;
|
|
clipboard: {
|
|
items: ClipboardItem[];
|
|
} | null;
|
|
setClipboard: (
|
|
clipboard: {
|
|
items: ClipboardItem[];
|
|
} | null,
|
|
) => void;
|
|
}
|
|
|
|
export const useTimelineStore = create<TimelineStore>()(
|
|
persist(
|
|
(set) => ({
|
|
snappingEnabled: true,
|
|
|
|
toggleSnapping: () => {
|
|
set((state) => ({ snappingEnabled: !state.snappingEnabled }));
|
|
},
|
|
|
|
rippleEditingEnabled: false,
|
|
|
|
toggleRippleEditing: () => {
|
|
set((state) => ({
|
|
rippleEditingEnabled: !state.rippleEditingEnabled,
|
|
}));
|
|
},
|
|
|
|
clipboard: null,
|
|
|
|
setClipboard: (clipboard) => {
|
|
set({ clipboard });
|
|
},
|
|
}),
|
|
{
|
|
name: "timeline-store",
|
|
partialize: (state) => ({
|
|
snappingEnabled: state.snappingEnabled,
|
|
rippleEditingEnabled: state.rippleEditingEnabled,
|
|
}),
|
|
},
|
|
),
|
|
);
|