import type { DomEditSelection } from "./domEditingTypes"; import { STUDIO_KEYFRAMES_ENABLED } from "./manualEditingAvailability"; import { MetricField } from "./propertyPanelPrimitives"; import { KeyframeNavigation } from "./KeyframeNavigation"; import { formatPxMetricValue, parsePxMetricValue, RESPONSIVE_GRID } from "./propertyPanelHelpers"; type KeyframeEntry = Array<{ percentage: number; properties: Record; ease?: string; }> | null; interface PropertyPanel3dTransformProps { gsapRuntimeValues: Record; gsapAnimId: string | null; resolveAnimIdForProp?: (prop: string) => string | null; gsapKeyframes: KeyframeEntry; currentPct: number; elStart: number; elDuration: number; element: DomEditSelection; onCommitAnimatedProperty?: ( element: DomEditSelection, property: string, value: number, ) => Promise; onSeekToTime?: (time: number) => void; onRemoveKeyframe?: (animId: string, pct: number) => void; onConvertToKeyframes?: (animId: string) => void; } export function PropertyPanel3dTransform({ gsapRuntimeValues, gsapAnimId, resolveAnimIdForProp, gsapKeyframes, currentPct, elStart, elDuration, element, onCommitAnimatedProperty, onSeekToTime, onRemoveKeyframe, onConvertToKeyframes, }: PropertyPanel3dTransformProps) { const idFor = (prop: string) => resolveAnimIdForProp?.(prop) ?? gsapAnimId; return (
3D Transform
{ const v = parsePxMetricValue(next); if (v != null && onCommitAnimatedProperty) { void onCommitAnimatedProperty(element, "z", v); } }} />
{STUDIO_KEYFRAMES_ENABLED && (gsapAnimId || onCommitAnimatedProperty) && ( onSeekToTime?.(elStart + (pct / 100) * elDuration)} onAddKeyframe={() => { if (onCommitAnimatedProperty) { void onCommitAnimatedProperty(element, "z", gsapRuntimeValues?.z ?? 0); } }} onRemoveKeyframe={(pct) => { const id = idFor("z"); if (id) onRemoveKeyframe?.(id, pct); }} onConvertToKeyframes={() => { const id = idFor("z"); if (id) onConvertToKeyframes?.(id); }} /> )}
{ const v = Number.parseFloat(next); if (Number.isFinite(v) && onCommitAnimatedProperty) { void onCommitAnimatedProperty(element, "scale", v); } }} />
{STUDIO_KEYFRAMES_ENABLED && (gsapAnimId || onCommitAnimatedProperty) && ( onSeekToTime?.(elStart + (pct / 100) * elDuration)} onAddKeyframe={() => { if (onCommitAnimatedProperty) { void onCommitAnimatedProperty(element, "scale", gsapRuntimeValues?.scale ?? 1); } }} onRemoveKeyframe={(pct) => { const id = idFor("scale"); if (id) onRemoveKeyframe?.(id, pct); }} onConvertToKeyframes={() => { const id = idFor("scale"); if (id) onConvertToKeyframes?.(id); }} /> )}
{ const v = Number.parseFloat(next.replace("°", "")); if (Number.isFinite(v) && onCommitAnimatedProperty) { void onCommitAnimatedProperty(element, "rotationX", v); } }} /> { const v = Number.parseFloat(next.replace("°", "")); if (Number.isFinite(v) && onCommitAnimatedProperty) { void onCommitAnimatedProperty(element, "rotationY", v); } }} />
); }