Skip to content

Commit 40ffaae

Browse files
committed
feat(studio): add 'delete all keyframes' to diamond context menu
1 parent 84d807c commit 40ffaae

4 files changed

Lines changed: 24 additions & 0 deletions

File tree

packages/studio/src/components/StudioPreviewArea.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ export function StudioPreviewArea({
107107
handleGsapUpdateMeta,
108108
handleGsapAddKeyframe,
109109
handleGsapConvertToKeyframes,
110+
handleGsapRemoveAllKeyframes,
110111
} = useDomEditContext();
111112

112113
return (
@@ -127,6 +128,10 @@ export function StudioPreviewArea({
127128
onResizeElement={handleTimelineElementResize}
128129
onBlockedEditAttempt={handleBlockedTimelineEdit}
129130
onSelectTimelineElement={handleTimelineElementSelect}
131+
onDeleteAllKeyframes={(_elId) => {
132+
const anim = selectedGsapAnimations.find((a) => a.keyframes);
133+
if (anim) handleGsapRemoveAllKeyframes(anim.id);
134+
}}
130135
onDeleteKeyframe={(_elId, pct) => {
131136
const anim = selectedGsapAnimations.find((a) => a.keyframes);
132137
if (anim) handleGsapRemoveKeyframe(anim.id, pct);

packages/studio/src/components/nle/NLELayout.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ interface NLELayoutProps {
7171
onBlockedEditAttempt?: (element: TimelineElement, intent: BlockedTimelineEditIntent) => void;
7272
onSelectTimelineElement?: (element: TimelineElement | null) => void;
7373
onDeleteKeyframe?: (elementId: string, percentage: number) => void;
74+
onDeleteAllKeyframes?: (elementId: string) => void;
7475
onChangeKeyframeEase?: (elementId: string, percentage: number, ease: string) => void;
7576
onMoveKeyframe?: (element: TimelineElement, oldPct: number, newPct: number) => void;
7677
onToggleKeyframeAtPlayhead?: (element: TimelineElement) => void;
@@ -123,6 +124,7 @@ export const NLELayout = memo(function NLELayout({
123124
onBlockedEditAttempt,
124125
onSelectTimelineElement,
125126
onDeleteKeyframe,
127+
onDeleteAllKeyframes,
126128
onChangeKeyframeEase,
127129
onMoveKeyframe,
128130
onToggleKeyframeAtPlayhead,
@@ -457,6 +459,7 @@ export const NLELayout = memo(function NLELayout({
457459
onBlockedEditAttempt={onBlockedEditAttempt}
458460
onSelectElement={onSelectTimelineElement}
459461
onDeleteKeyframe={onDeleteKeyframe}
462+
onDeleteAllKeyframes={onDeleteAllKeyframes}
460463
onChangeKeyframeEase={onChangeKeyframeEase}
461464
onMoveKeyframe={onMoveKeyframe}
462465
onToggleKeyframeAtPlayhead={onToggleKeyframeAtPlayhead}

packages/studio/src/player/components/KeyframeDiamondContextMenu.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ interface KeyframeDiamondContextMenuProps {
1313
state: KeyframeDiamondContextMenuState;
1414
onClose: () => void;
1515
onDelete: (elementId: string, percentage: number) => void;
16+
onDeleteAll: (elementId: string) => void;
1617
onChangeEase: (elementId: string, percentage: number, ease: string) => void;
1718
onCopyProperties: (elementId: string, percentage: number) => void;
1819
}
@@ -36,6 +37,7 @@ export const KeyframeDiamondContextMenu = memo(function KeyframeDiamondContextMe
3637
state,
3738
onClose,
3839
onDelete,
40+
onDeleteAll,
3941
onChangeEase,
4042
onCopyProperties,
4143
}: KeyframeDiamondContextMenuProps) {
@@ -135,6 +137,17 @@ export const KeyframeDiamondContextMenu = memo(function KeyframeDiamondContextMe
135137
Delete Keyframe
136138
</button>
137139

140+
<button
141+
type="button"
142+
className="w-full flex items-center gap-2 px-3 py-1.5 text-xs text-red-400 hover:bg-neutral-800 cursor-pointer text-left"
143+
onClick={() => {
144+
onDeleteAll(state.elementId);
145+
onClose();
146+
}}
147+
>
148+
Delete All Keyframes
149+
</button>
150+
138151
{/* Copy Properties */}
139152
<button
140153
type="button"

packages/studio/src/player/components/Timeline.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ interface TimelineProps {
7272
onBlockedEditAttempt?: (element: TimelineElement, intent: BlockedTimelineEditIntent) => void;
7373
onSelectElement?: (element: TimelineElement | null) => void;
7474
onDeleteKeyframe?: (elementId: string, percentage: number) => void;
75+
onDeleteAllKeyframes?: (elementId: string) => void;
7576
onChangeKeyframeEase?: (elementId: string, percentage: number, ease: string) => void;
7677
onMoveKeyframe?: (element: TimelineElement, oldPct: number, newPct: number) => void;
7778
onToggleKeyframeAtPlayhead?: (element: TimelineElement) => void;
@@ -92,6 +93,7 @@ export const Timeline = memo(function Timeline({
9293
onBlockedEditAttempt,
9394
onSelectElement,
9495
onDeleteKeyframe,
96+
onDeleteAllKeyframes,
9597
onChangeKeyframeEase,
9698
onMoveKeyframe,
9799
onToggleKeyframeAtPlayhead,
@@ -570,6 +572,7 @@ export const Timeline = memo(function Timeline({
570572
state={kfContextMenu}
571573
onClose={() => setKfContextMenu(null)}
572574
onDelete={(elId, pct) => onDeleteKeyframe?.(elId, pct)}
575+
onDeleteAll={(elId) => onDeleteAllKeyframes?.(elId)}
573576
onChangeEase={(elId, pct, ease) => onChangeKeyframeEase?.(elId, pct, ease)}
574577
onCopyProperties={(elId, pct) => {
575578
const kfData = keyframeCache.get(elId);

0 commit comments

Comments
 (0)