@hyperframes/studio 0.8.6 → 0.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/assets/{hyperframes-player-DdNgW-Np.js → hyperframes-player-DYTqZd0d.js} +1 -1
  2. package/dist/assets/{index-bv8b5eiQ.js → index-B69X8UsY.js} +1 -1
  3. package/dist/assets/index-Ba9zbpT9.css +1 -0
  4. package/dist/assets/{index-Ci7Uy8fR.js → index-D6CV2x61.js} +1 -1
  5. package/dist/assets/index-ng4tq6YE.js +428 -0
  6. package/dist/index.d.ts +108 -18
  7. package/dist/index.html +2 -2
  8. package/dist/index.js +10335 -7201
  9. package/dist/index.js.map +1 -1
  10. package/package.json +7 -7
  11. package/src/App.tsx +22 -23
  12. package/src/captions/components/CaptionAnimationPanel.tsx +46 -13
  13. package/src/captions/components/CaptionOverlay.tsx +172 -29
  14. package/src/captions/components/CaptionOverlayUtils.ts +54 -0
  15. package/src/captions/components/CaptionPropertyPanel.tsx +49 -23
  16. package/src/captions/components/CaptionTimeline.tsx +36 -79
  17. package/src/captions/components/shared.tsx +76 -1
  18. package/src/captions/hooks/useCaptionSync.ts +72 -13
  19. package/src/captions/keyboard.test.ts +12 -0
  20. package/src/captions/keyboard.ts +12 -1
  21. package/src/captions/store.ts +120 -14
  22. package/src/components/EditorShell.selectionSync.test.tsx +1 -1
  23. package/src/components/EditorShell.tsx +13 -1
  24. package/src/components/StudioRightPanel.tsx +2 -0
  25. package/src/components/StudioRightPanel.types.ts +1 -0
  26. package/src/components/editor/AnimationCard.tsx +2 -1
  27. package/src/components/editor/AnimationCardParts.tsx +6 -3
  28. package/src/components/editor/ArcPathControls.tsx +10 -4
  29. package/src/components/editor/BlockParamsPanel.test.tsx +170 -0
  30. package/src/components/editor/BlockParamsPanel.tsx +153 -11
  31. package/src/components/editor/BorderRadiusEditor.tsx +3 -22
  32. package/src/components/editor/FileTree.tsx +41 -12
  33. package/src/components/editor/FileTreeNodes.tsx +90 -20
  34. package/src/components/editor/GsapAnimationList.tsx +5 -0
  35. package/src/components/editor/KeyframeDiamond.tsx +3 -1
  36. package/src/components/editor/KeyframeEaseList.tsx +3 -2
  37. package/src/components/editor/KeyframeNavigation.tsx +6 -2
  38. package/src/components/editor/LayersPanel.tsx +11 -2
  39. package/src/components/editor/MotionPathNode.tsx +1 -0
  40. package/src/components/editor/PropertyPanel.test.tsx +7 -6
  41. package/src/components/editor/PropertyPanel.tsx +13 -5
  42. package/src/components/editor/PropertyPanelFlat.tsx +3 -5
  43. package/src/components/editor/SnapToolbar.tsx +20 -4
  44. package/src/components/editor/TimelineFxPopover.test.tsx +113 -0
  45. package/src/components/editor/TimelineFxPopover.tsx +138 -0
  46. package/src/components/editor/Transform3DCube.tsx +22 -1
  47. package/src/components/editor/manualOffsetDrag.test.ts +49 -0
  48. package/src/components/editor/manualOffsetDrag.ts +13 -1
  49. package/src/components/editor/propertyPanel3dTransform.tsx +11 -3
  50. package/src/components/editor/propertyPanelAudioFxGroup.test.tsx +139 -3
  51. package/src/components/editor/propertyPanelAudioFxGroup.tsx +4 -0
  52. package/src/components/editor/propertyPanelColor.tsx +9 -1
  53. package/src/components/editor/propertyPanelColorGradingControls.tsx +28 -7
  54. package/src/components/editor/propertyPanelCommitField.tsx +9 -1
  55. package/src/components/editor/propertyPanelFill.tsx +50 -2
  56. package/src/components/editor/propertyPanelFlatProps.ts +1 -0
  57. package/src/components/editor/propertyPanelFont.tsx +45 -9
  58. package/src/components/editor/propertyPanelFxPresetStyle.ts +18 -0
  59. package/src/components/editor/propertyPanelFxSection.test.tsx +3 -3
  60. package/src/components/editor/propertyPanelFxSection.tsx +8 -23
  61. package/src/components/editor/propertyPanelPrimitives.tsx +9 -12
  62. package/src/components/editor/propertyPanelStyleSections.tsx +21 -2
  63. package/src/components/editor/propertyPanelTransformCommit.ts +3 -3
  64. package/src/components/editor/propertyPanelTypes.ts +2 -0
  65. package/src/components/editor/useApplyAudioFxPreset.ts +36 -0
  66. package/src/components/editor/useFxCarve.ts +0 -0
  67. package/src/components/editor/useFxCarveGrouping.ts +132 -0
  68. package/src/components/nle/PreviewOverlays.tsx +69 -2
  69. package/src/components/nle/PreviewPane.tsx +1 -0
  70. package/src/components/nle/useTimelineEditCallbacks.test.tsx +1 -0
  71. package/src/components/nle/useTimelineEditCallbacks.ts +27 -0
  72. package/src/components/panels/SlideshowPanel.tsx +81 -12
  73. package/src/components/panels/SlideshowSubPanels.tsx +61 -7
  74. package/src/components/sidebar/AssetCard.test.tsx +2 -2
  75. package/src/components/sidebar/AssetCard.tsx +94 -46
  76. package/src/components/sidebar/AssetContextMenu.tsx +196 -42
  77. package/src/components/sidebar/AssetsTab.tsx +156 -96
  78. package/src/components/sidebar/AudioRow.tsx +95 -40
  79. package/src/components/sidebar/BlocksTab.tsx +40 -128
  80. package/src/components/sidebar/CompositionsTab.tsx +46 -34
  81. package/src/components/sidebar/LeftSidebar.tsx +87 -75
  82. package/src/components/sidebar/PromptPreviewModal.tsx +126 -0
  83. package/src/components/sidebar/assetHelpers.ts +8 -0
  84. package/src/contexts/TimelineEditContext.tsx +5 -0
  85. package/src/hooks/timelineAudioGroupVolume.ts +148 -0
  86. package/src/hooks/timelineEditingHelpers.ts +78 -1
  87. package/src/hooks/timelineElementFxAttribute.ts +150 -0
  88. package/src/hooks/timelineTrackVisibility.test.ts +253 -1
  89. package/src/hooks/timelineTrackVisibility.ts +207 -8
  90. package/src/hooks/useAppHotkeys.ts +22 -0
  91. package/src/hooks/useAudioSoloBridge.ts +61 -0
  92. package/src/hooks/useCaptionDetection.ts +22 -2
  93. package/src/hooks/useDomEditCommits.test.tsx +24 -0
  94. package/src/hooks/useEffectiveTimelineDuration.ts +20 -0
  95. package/src/hooks/useGroupLevel.ts +36 -0
  96. package/src/hooks/useHydrateActiveCompPathFromUrl.ts +36 -0
  97. package/src/hooks/useMusicBeatAnalysis.ts +13 -0
  98. package/src/hooks/useTimelineDeleteOps.ts +170 -0
  99. package/src/hooks/useTimelineEditing.ts +53 -129
  100. package/src/player/components/AudioWaveform.tsx +29 -26
  101. package/src/player/components/BeatStrip.test.tsx +5 -9
  102. package/src/player/components/BeatStrip.tsx +12 -5
  103. package/src/player/components/ClipContextMenu.tsx +8 -2
  104. package/src/player/components/EditModal.tsx +48 -7
  105. package/src/player/components/KeyframeDiamondContextMenu.tsx +90 -10
  106. package/src/player/components/LayerDisclosureRow.tsx +12 -13
  107. package/src/player/components/Player.tsx +43 -8
  108. package/src/player/components/PlayerControls.tsx +107 -63
  109. package/src/player/components/ShortcutsPanel.tsx +23 -4
  110. package/src/player/components/SpeedMenu.tsx +34 -42
  111. package/src/player/components/Timeline.test.ts +8 -8
  112. package/src/player/components/Timeline.tsx +7 -10
  113. package/src/player/components/TimelineFxButton.test.tsx +81 -0
  114. package/src/player/components/TimelineFxButton.tsx +143 -0
  115. package/src/player/components/TimelineGroupBusStrip.test.tsx +146 -0
  116. package/src/player/components/TimelineGroupBusStrip.tsx +103 -0
  117. package/src/player/components/TimelineGroupHeader.tsx +176 -0
  118. package/src/player/components/TimelineGroupRow.tsx +146 -0
  119. package/src/player/components/TimelineLanes.test.tsx +8 -1
  120. package/src/player/components/TimelineLanes.tsx +39 -33
  121. package/src/player/components/TimelineOverlays.tsx +34 -0
  122. package/src/player/components/TimelineSoloButton.tsx +32 -0
  123. package/src/player/components/TimelineTrackHeader.test.tsx +2 -1
  124. package/src/player/components/TimelineTrackHeader.tsx +74 -98
  125. package/src/player/components/TimelineTrackPlainHeader.test.tsx +161 -0
  126. package/src/player/components/TimelineTrackPlainHeader.tsx +126 -0
  127. package/src/player/components/VideoThumbnail.tsx +6 -1
  128. package/src/player/components/menuKeyboardNav.ts +47 -0
  129. package/src/player/components/timelineCallbacks.ts +40 -1
  130. package/src/player/components/timelineKeyboardNavigation.test.ts +8 -0
  131. package/src/player/components/timelineKeyboardNavigation.ts +147 -30
  132. package/src/player/components/timelineLaneProps.ts +3 -0
  133. package/src/player/components/timelineLayout.ts +1 -1
  134. package/src/player/components/timelineNavigationIdentity.ts +4 -0
  135. package/src/player/components/useTimelineLaneRowIndexes.ts +38 -0
  136. package/src/player/components/useTimelineLogicalFocus.ts +9 -0
  137. package/src/player/components/useTimelineLogicalRows.test.tsx +8 -0
  138. package/src/player/components/useTimelineLogicalRows.ts +17 -12
  139. package/src/player/components/useTimelineMultiDragActorWindows.ts +30 -0
  140. package/src/player/components/useTimelineTrackDerivations.test.ts +103 -0
  141. package/src/player/components/useTimelineTrackDerivations.ts +143 -6
  142. package/src/player/components/useTimelineTrackLayout.ts +61 -4
  143. package/src/player/hooks/previewMessageRouter.ts +127 -0
  144. package/src/player/hooks/useTimelinePlayer.ts +9 -47
  145. package/src/player/lib/timelineDOM.ts +51 -0
  146. package/src/player/store/audioSoloSlice.test.ts +113 -0
  147. package/src/player/store/audioSoloSlice.ts +43 -0
  148. package/src/player/store/editingModeSlice.ts +45 -0
  149. package/src/player/store/groupLevels.ts +33 -0
  150. package/src/player/store/keyframeSlice.ts +26 -0
  151. package/src/player/store/playerStore.ts +21 -22
  152. package/src/player/store/timelineElement.ts +10 -0
  153. package/src/telemetry/events.ts +12 -0
  154. package/dist/assets/index-Cy6fGN1u.js +0 -428
  155. package/dist/assets/index-DcF4s1PG.css +0 -1
package/dist/index.d.ts CHANGED
@@ -31,6 +31,10 @@ interface PlayerControlsProps {
31
31
  disabled?: boolean;
32
32
  isFullscreen?: boolean;
33
33
  onToggleFullscreen?: () => void;
34
+ /** Needed to read the soloed clips' labels out of the preview document. */
35
+ previewIframeRef?: {
36
+ current: HTMLIFrameElement | null;
37
+ };
34
38
  }
35
39
  declare const PlayerControls: react.NamedExoticComponent<PlayerControlsProps>;
36
40
 
@@ -113,6 +117,12 @@ interface KeyframeSlice {
113
117
  setClipExpanded: (id: string, expanded: boolean) => void;
114
118
  /** Union-expand clips (keyframed clips are expanded by default on load). */
115
119
  expandClips: (ids: readonly string[]) => void;
120
+ /** Groups whose member rows the caret has shown (structural, not lanes). */
121
+ expandedGroupIds: Set<string>;
122
+ toggleGroupExpanded: (id: string) => void;
123
+ /** Rows (clip id or group id) whose automation-lane rows the `∿` button opened. */
124
+ expandedLaneOwnerIds: Set<string>;
125
+ toggleLaneOwnerExpanded: (id: string) => void;
116
126
  /**
117
127
  * Project/session/element-scoped request. Its nonce is monotonic across store
118
128
  * resets so a stale consumer can never collide with a later request.
@@ -177,6 +187,56 @@ interface ThumbnailSlice {
177
187
  setThumbnailMode: (mode: ThumbnailMode) => void;
178
188
  }
179
189
 
190
+ /**
191
+ * "Hear only this" — session-only monitoring override, never persisted.
192
+ *
193
+ * Holds clip ids and group ids (never track numbers, per the design doc: solo
194
+ * is a per-element/per-group concept, not a row-position one). Exclusive by
195
+ * default (a plain toggle replaces the set); ⌘/Ctrl-click adds/removes one
196
+ * member without disturbing the rest. Never written to any attribute or
197
+ * document — the export-safety guarantee this slice exists to hold.
198
+ */
199
+
200
+ interface AudioSoloSlice {
201
+ soloed: ReadonlySet<string>;
202
+ toggleSolo: (id: string, options?: {
203
+ add?: boolean;
204
+ }) => void;
205
+ clearSolo: () => void;
206
+ }
207
+
208
+ /**
209
+ * The two editing-mode toggles the timeline toolbar owns.
210
+ *
211
+ * A store slice rather than toolbar-local state because both are read far from
212
+ * where they are set: the motion-path arm is consumed by the canvas click
213
+ * handler and published by MotionPathOverlay, and the auto-keyframe flag
214
+ * decides what a drag/resize/rotate does inside the edit commit path.
215
+ *
216
+ * `motionPathArmed` is also cleared by playerStore on selection change — arming
217
+ * survives neither a new element nor a project switch, so those resets stay
218
+ * with the state they clear alongside.
219
+ */
220
+
221
+ interface EditingModeSlice {
222
+ /** Motion-path "set destination" mode. Armed from the preview toolbar
223
+ * (replaces the old double-click-on-canvas UX); while armed, one canvas
224
+ * click places the new path's destination. */
225
+ motionPathArmed: boolean;
226
+ setMotionPathArmed: (armed: boolean) => void;
227
+ /** Published by MotionPathOverlay so the toolbar shows the button only when
228
+ * the selected element can actually take a path. */
229
+ motionPathCreateAvailable: boolean;
230
+ setMotionPathCreateAvailable: (available: boolean) => void;
231
+ /** Global toggle for the "Add keyframe" diamond in the timeline toolbar
232
+ * (#1808). When false, a manual drag/resize/rotate edit on an element that
233
+ * already has a live tween shifts every keyframe by the edit's delta
234
+ * (preserving the animation's shape) instead of inserting/updating a
235
+ * keyframe at the playhead. */
236
+ autoKeyframeEnabled: boolean;
237
+ setAutoKeyframeEnabled: (enabled: boolean) => void;
238
+ }
239
+
180
240
  type TimeListener = (time: number) => void;
181
241
  declare const liveTime: {
182
242
  notify: (time: number) => void;
@@ -250,6 +310,16 @@ interface TimelineElement {
250
310
  hidden?: boolean;
251
311
  /** Value of data-timeline-role attribute — used to identify music vs. voiceover. */
252
312
  timelineRole?: string;
313
+ /** Verbatim `data-audio-group` — the id of the `<hf-audio-group>` this clip belongs to, when any. */
314
+ audioGroup?: string;
315
+ /** The owning group's `data-label` (falls back to its id) — resolved once per parse. */
316
+ audioGroupLabel?: string;
317
+ /** The owning group's `data-volume` (defaults to 1) — resolved once per parse. */
318
+ audioGroupVolume?: number;
319
+ /** The owning group's `data-hidden` (defaults to false) — resolved once per parse. */
320
+ audioGroupHidden?: boolean;
321
+ /** The owning group's serialized `data-fx-chain`, when set — resolved once per parse. */
322
+ audioGroupFxChain?: string;
253
323
  /**
254
324
  * Set by useExpandedTimelineElements on an inline-expanded sub-composition
255
325
  * child: the absolute master-timeline start of the sub-comp host the child
@@ -265,7 +335,7 @@ type TimelineTool = "select" | "razor";
265
335
  interface SelectElementOptions {
266
336
  preserveSet?: boolean;
267
337
  }
268
- interface PlayerState extends KeyframeSlice, AutomationSelectionSlice, ThumbnailSlice {
338
+ interface PlayerState extends KeyframeSlice, AutomationSelectionSlice, ThumbnailSlice, AudioSoloSlice, EditingModeSlice {
269
339
  isPlaying: boolean;
270
340
  currentTime: number;
271
341
  duration: number;
@@ -303,20 +373,6 @@ interface PlayerState extends KeyframeSlice, AutomationSelectionSlice, Thumbnail
303
373
  * (drag, resize, rotate) target this instead of recomputing from playhead. */
304
374
  activeKeyframePct: number | null;
305
375
  setActiveKeyframePct: (pct: number | null) => void;
306
- /** Motion-path "set destination" mode. Armed from the preview toolbar (replaces
307
- * the old double-click-on-canvas UX); while armed, one canvas click places the
308
- * new path's destination. `available` is published by MotionPathOverlay so the
309
- * toolbar shows the button only when the selected element can take a path. */
310
- motionPathArmed: boolean;
311
- setMotionPathArmed: (armed: boolean) => void;
312
- motionPathCreateAvailable: boolean;
313
- setMotionPathCreateAvailable: (available: boolean) => void;
314
- /** Global toggle for the "Add keyframe" diamond in the timeline toolbar (#1808).
315
- * When false, a manual drag/resize/rotate edit on an element that already has
316
- * a live tween shifts every keyframe by the edit's delta (preserving the
317
- * animation's shape) instead of inserting/updating a keyframe at the playhead. */
318
- autoKeyframeEnabled: boolean;
319
- setAutoKeyframeEnabled: (enabled: boolean) => void;
320
376
  /** Multi-select: additional selected elements beyond selectedElementId. */
321
377
  selectedElementIds: Set<string>;
322
378
  clearSelectedElementIds: () => void;
@@ -355,7 +411,7 @@ interface PlayerState extends KeyframeSlice, AutomationSelectionSlice, Thumbnail
355
411
  setSelectedElementId: (id: string | null, options?: SelectElementOptions) => void;
356
412
  /** Move the selection anchor within an active multi-selection without collapsing it. */
357
413
  setSelectionAnchor: (id: string | null) => void;
358
- updateElement: (elementId: string, updates: Partial<Pick<TimelineElement, "start" | "duration" | "track" | "zIndex" | "hasExplicitZIndex" | "playbackStart" | "hidden">>) => void;
414
+ updateElement: (elementId: string, updates: Partial<Pick<TimelineElement, "start" | "duration" | "track" | "zIndex" | "hasExplicitZIndex" | "playbackStart" | "hidden" | "audioGroup">>) => void;
359
415
  setZoomMode: (mode: ZoomMode) => void;
360
416
  setManualZoomPercent: (percent: number) => void;
361
417
  bumpZEditVersion: () => void;
@@ -599,7 +655,28 @@ interface TimelineEditCallbacks {
599
655
  }>, options?: {
600
656
  coalesceKey?: string;
601
657
  }) => Promise<void> | void;
602
- onToggleTrackHidden?: (track: number, hidden: boolean) => Promise<void> | void;
658
+ /**
659
+ * `displayNumber` is the row the CLICKED control announced. It travels with
660
+ * the click because the header and the undo-history label derive the row from
661
+ * two different orderings: the header's comes from the group-aware row list
662
+ * (synthetic anchor rows, members pulled contiguous), the history's from a
663
+ * plain ascending sort of element-bearing keys. Once a group exists those
664
+ * disagree, so the same click said "Mute track 2" and recorded "Mute track 1".
665
+ * Passing the rendered number keeps one answer instead of two derivations.
666
+ */
667
+ onToggleTrackHidden?: (track: number, hidden: boolean, displayNumber?: number | null) => Promise<void> | void;
668
+ /** B7's bus strip: live-write the group's own attribute while dragging. */
669
+ onSetAudioGroupAttributeLive?: (groupId: string, attr: string, value: string | null) => void;
670
+ /** ...and persist one undo entry on release. */
671
+ onSetAudioGroupAttributeQuiet?: (groupId: string, attr: string, value: string | null, label: string) => Promise<void>;
672
+ /** C1's ungrouped-track FX pointer: "Group these clips" — write
673
+ * `data-audio-group` on every one of them, atomically. Same shape B6's
674
+ * carve auto-grouping uses. */
675
+ onGroupClips?: (clipIds: readonly string[], groupId: string) => Promise<void>;
676
+ /** C1's single-clip FX write: addressed by the clip itself rather than the
677
+ * current selection, mirroring `onSetAudioGroupAttributeLive/Quiet`. */
678
+ onSetElementAttributeLive?: (element: TimelineElement, attr: string, value: string | null) => void;
679
+ onSetElementAttributeQuiet?: (element: TimelineElement, attr: string, value: string | null, label: string) => Promise<void>;
603
680
  onBlockedEditAttempt?: (element: TimelineElement, intent: BlockedTimelineEditIntent) => void;
604
681
  onSplitElement?: (element: TimelineElement, splitTime: number) => Promise<void> | void;
605
682
  onRazorSplit?: (element: TimelineElement, splitTime: number) => Promise<void> | void;
@@ -759,10 +836,21 @@ interface TimelineEditCallbackDeps {
759
836
  handleTimelineElementResize: (element: TimelineElement, updates: Pick<TimelineElement, "start" | "duration" | "playbackStart">) => Promise<void> | void;
760
837
  handleTimelineGroupResize: NonNullable<TimelineEditCallbacks["onResizeElements"]>;
761
838
  handleToggleTrackHidden: (track: number, hidden: boolean) => Promise<void> | void;
839
+ setAudioGroupAttribute: {
840
+ setLive: (groupId: string, attr: string, value: string | null) => void;
841
+ setQuiet: (groupId: string, attr: string, value: string | null, label: string) => Promise<void>;
842
+ };
762
843
  handleBlockedTimelineEdit: (element: TimelineElement, intent: BlockedTimelineEditIntent) => void;
763
844
  handleTimelineElementSplit: (element: TimelineElement, splitTime: number) => Promise<void> | void;
764
845
  handleRazorSplit: (element: TimelineElement, splitTime: number) => Promise<void> | void;
765
846
  handleRazorSplitAll: (splitTime: number) => Promise<void> | void;
847
+ /** C1's ungrouped-track FX pointer — same auto-grouping write B6's carve uses. */
848
+ handleGroupClips?: (clipIds: readonly string[], groupId: string) => Promise<void>;
849
+ /** C1's single-clip FX write, addressed by the clip itself. */
850
+ setElementFxAttribute?: {
851
+ setLive: (element: TimelineElement, attr: string, value: string | null) => void;
852
+ setQuiet: (element: TimelineElement, attr: string, value: string | null, label: string) => Promise<void>;
853
+ };
766
854
  }
767
855
 
768
856
  interface BlockPreviewInfo {
@@ -806,7 +894,7 @@ interface EditorShellProps extends TimelineEditCallbackDeps {
806
894
  onToggleRecording?: () => void;
807
895
  gestureOverlay?: ReactNode;
808
896
  }
809
- declare function EditorShell({ left, right, hidden, timelineToolbar, renderClipContent, handleTimelineElementDelete, handleTimelineAssetDrop, handleTimelineBlockDrop, handleTimelineCompositionDrop, handlePreviewBlockDrop, handleTimelineFileDrop, handleTimelineElementMove, handleTimelineElementsMove, handleTimelineElementResize, handleTimelineGroupResize, handleToggleTrackHidden, handleBlockedTimelineEdit, handleTimelineElementSplit, handleRazorSplit, handleRazorSplitAll, setCompIdToSrc, setCompositionLoading, shouldShowMotionPath, shouldShowSelectedDomBounds, isGestureRecording, recordingState, onToggleRecording, blockPreview, gestureOverlay, }: EditorShellProps): react_jsx_runtime.JSX.Element;
897
+ declare function EditorShell({ left, right, hidden, timelineToolbar, renderClipContent, handleTimelineElementDelete, handleTimelineAssetDrop, handleTimelineBlockDrop, handleTimelineCompositionDrop, handlePreviewBlockDrop, handleTimelineFileDrop, handleTimelineElementMove, handleTimelineElementsMove, handleTimelineElementResize, handleTimelineGroupResize, handleToggleTrackHidden, setAudioGroupAttribute, handleGroupClips, setElementFxAttribute, handleBlockedTimelineEdit, handleTimelineElementSplit, handleRazorSplit, handleRazorSplitAll, setCompIdToSrc, setCompositionLoading, shouldShowMotionPath, shouldShowSelectedDomBounds, isGestureRecording, recordingState, onToggleRecording, blockPreview, gestureOverlay, }: EditorShellProps): react_jsx_runtime.JSX.Element;
810
898
 
811
899
  interface NLEPreviewProps {
812
900
  projectId: string;
@@ -966,6 +1054,8 @@ interface PropertyPanelProps {
966
1054
  onRemoveTextField: (fieldKey: string) => void;
967
1055
  onAskAgent: () => void;
968
1056
  onToggleElementHidden?: (elementKey: string, hidden: boolean) => void | Promise<void>;
1057
+ /** B6: group two or more picked voice clips, atomically, one undo entry. */
1058
+ onAutoGroupCarveSources?: (clipIds: readonly string[], groupId: string) => Promise<void>;
969
1059
  onImportAssets?: (files: FileList, dir?: string) => Promise<string[]>;
970
1060
  onAddMediaOverlay?: AddMediaOverlayHandler;
971
1061
  fontAssets?: ImportedFontAsset[];
package/dist/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>HyperFrames Studio</title>
8
- <script type="module" crossorigin src="/assets/index-Cy6fGN1u.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-DcF4s1PG.css">
8
+ <script type="module" crossorigin src="/assets/index-ng4tq6YE.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-Ba9zbpT9.css">
10
10
  </head>
11
11
  <body>
12
12
  <div data-hf-id="hf-aph5" id="root"></div>