@hyperframes/studio 0.7.107 → 0.7.108

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 (126) hide show
  1. package/dist/assets/{hyperframes-player-BLrfwq5o.js → hyperframes-player-QqavTWRK.js} +1 -1
  2. package/dist/assets/{index-BA9yhzfR.js → index-BQjXA1pz.js} +1 -1
  3. package/dist/assets/{index-BSBk5srs.js → index-BhHHMprP.js} +1 -1
  4. package/dist/assets/index-DNkh9mbV.css +1 -0
  5. package/dist/assets/index-GqONLcOl.js +428 -0
  6. package/dist/index.d.ts +85 -2
  7. package/dist/index.html +2 -2
  8. package/dist/index.js +17696 -12512
  9. package/dist/index.js.map +1 -1
  10. package/package.json +7 -7
  11. package/src/components/StudioRightPanel.tsx +18 -1
  12. package/src/components/TimelineToolbar.test.tsx +46 -0
  13. package/src/components/TimelineToolbar.tsx +17 -0
  14. package/src/components/editor/PropertyPanel.test.tsx +5 -1
  15. package/src/components/editor/PropertyPanel.tsx +7 -23
  16. package/src/components/editor/PropertyPanelFlat.tsx +25 -0
  17. package/src/components/editor/audioFxSummary.test.ts +75 -0
  18. package/src/components/editor/audioFxSummary.ts +36 -0
  19. package/src/components/editor/audioFxTelemetry.test.ts +129 -0
  20. package/src/components/editor/audioFxTelemetry.ts +230 -0
  21. package/src/components/editor/propertyPanelAudioFxGroup.test.tsx +1830 -0
  22. package/src/components/editor/propertyPanelAudioFxGroup.tsx +299 -0
  23. package/src/components/editor/propertyPanelAudioFxGroupUtils.ts +21 -0
  24. package/src/components/editor/propertyPanelAutomation.test.ts +60 -0
  25. package/src/components/editor/propertyPanelAutomation.ts +97 -0
  26. package/src/components/editor/propertyPanelFlatMediaSection.tsx +37 -9
  27. package/src/components/editor/propertyPanelFlatProps.ts +1 -0
  28. package/src/components/editor/propertyPanelFxAddMenu.tsx +209 -0
  29. package/src/components/editor/propertyPanelFxBandRuler.tsx +72 -0
  30. package/src/components/editor/propertyPanelFxCarveModule.tsx +382 -0
  31. package/src/components/editor/propertyPanelFxControls.test.tsx +115 -0
  32. package/src/components/editor/propertyPanelFxControls.tsx +356 -0
  33. package/src/components/editor/propertyPanelFxEqModule.tsx +196 -0
  34. package/src/components/editor/propertyPanelFxFamily.ts +83 -0
  35. package/src/components/editor/propertyPanelFxNodeOpenBody.tsx +269 -0
  36. package/src/components/editor/propertyPanelFxNodeParams.tsx +112 -0
  37. package/src/components/editor/propertyPanelFxNodeRow.tsx +339 -0
  38. package/src/components/editor/propertyPanelFxPresetMenu.tsx +159 -0
  39. package/src/components/editor/propertyPanelFxPresetRun.tsx +215 -0
  40. package/src/components/editor/propertyPanelFxPresetStyle.test.ts +142 -0
  41. package/src/components/editor/propertyPanelFxPresetStyle.ts +216 -0
  42. package/src/components/editor/propertyPanelFxRackChain.tsx +202 -0
  43. package/src/components/editor/propertyPanelFxSection.test.tsx +1747 -0
  44. package/src/components/editor/propertyPanelFxSection.tsx +550 -0
  45. package/src/components/editor/propertyPanelFxSectionTypes.ts +91 -0
  46. package/src/components/editor/propertyPanelTypes.ts +5 -0
  47. package/src/components/editor/useFxAudition.ts +95 -0
  48. package/src/components/editor/useFxCarve.ts +0 -0
  49. package/src/components/editor/useFxChainObserved.ts +83 -0
  50. package/src/components/editor/useFxLevelling.ts +235 -0
  51. package/src/components/editor/useVolumeAutomation.test.tsx +122 -0
  52. package/src/components/editor/useVolumeAutomation.ts +54 -0
  53. package/src/contexts/DomEditContext.tsx +11 -0
  54. package/src/hooks/useAppHotkeys.test.ts +198 -0
  55. package/src/hooks/useAppHotkeys.ts +30 -3
  56. package/src/hooks/useAutomationSelectionKeyboard.test.tsx +429 -0
  57. package/src/hooks/useAutomationSelectionKeyboard.ts +371 -0
  58. package/src/hooks/useDomEditAttributeCommits.ts +90 -10
  59. package/src/hooks/useDomEditCommits.test.tsx +38 -0
  60. package/src/hooks/useDomEditCommits.ts +2 -0
  61. package/src/hooks/useDomEditSession.ts +2 -0
  62. package/src/hooks/useDomEditTextCommits.ts +2 -0
  63. package/src/hooks/useElementLifecycleOps.ts +3 -0
  64. package/src/hooks/useLivePlayheadTime.ts +49 -0
  65. package/src/hooks/usePreviewPersistence.ts +7 -0
  66. package/src/hooks/useTimelineEditing.ts +3 -0
  67. package/src/player/components/AutomationSelectionMenu.tsx +76 -0
  68. package/src/player/components/AutomationValueInput.tsx +51 -0
  69. package/src/player/components/LayerDisclosureRow.tsx +5 -4
  70. package/src/player/components/Timeline.test.ts +84 -0
  71. package/src/player/components/TimelineAutomationLane.test.tsx +1720 -0
  72. package/src/player/components/TimelineAutomationLane.tsx +674 -0
  73. package/src/player/components/TimelineAutomationLaneSlot.test.tsx +193 -0
  74. package/src/player/components/TimelineLanes.test.tsx +24 -5
  75. package/src/player/components/TimelineLanes.tsx +142 -154
  76. package/src/player/components/TimelineTrackHeader.test.tsx +212 -1
  77. package/src/player/components/TimelineTrackHeader.tsx +166 -6
  78. package/src/player/components/TimelineTrackRow.tsx +8 -1
  79. package/src/player/components/automationClipboard.test.ts +94 -0
  80. package/src/player/components/automationClipboard.ts +136 -0
  81. package/src/player/components/automationGestureKeys.test.ts +49 -0
  82. package/src/player/components/automationGestureKeys.ts +49 -0
  83. package/src/player/components/automationLaneData.test.ts +270 -0
  84. package/src/player/components/automationLaneData.ts +258 -0
  85. package/src/player/components/automationLaneDragMath.ts +194 -0
  86. package/src/player/components/automationLaneGeometry.test.ts +239 -0
  87. package/src/player/components/automationLaneGeometry.ts +287 -0
  88. package/src/player/components/automationLaneHeight.ts +15 -0
  89. package/src/player/components/automationLanePointer.ts +20 -0
  90. package/src/player/components/automationLaneSelection.test.ts +183 -0
  91. package/src/player/components/automationLaneSelection.ts +135 -0
  92. package/src/player/components/automationShapes.test.ts +82 -0
  93. package/src/player/components/automationShapes.ts +70 -0
  94. package/src/player/components/automationSimplify.test.ts +48 -0
  95. package/src/player/components/automationSimplify.ts +51 -0
  96. package/src/player/components/timelineClipGestureHandlers.ts +223 -0
  97. package/src/player/components/timelineLaneProps.ts +19 -0
  98. package/src/player/components/timelineLayout.ts +11 -5
  99. package/src/player/components/useAutomationEdgeStretch.test.ts +27 -0
  100. package/src/player/components/useAutomationEdgeStretch.ts +269 -0
  101. package/src/player/components/useAutomationLaneGestures.ts +537 -0
  102. package/src/player/components/useAutomationLanes.test.tsx +112 -0
  103. package/src/player/components/useAutomationLanes.ts +170 -0
  104. package/src/player/components/useAutomationRangeDrag.ts +114 -0
  105. package/src/player/components/useTimelineTrackLayout.test.ts +107 -1
  106. package/src/player/components/useTimelineTrackLayout.ts +83 -7
  107. package/src/player/hooks/useExpandedTimelineElements.ts +7 -0
  108. package/src/player/hooks/useTimelinePlayer.ts +13 -1
  109. package/src/player/lib/automationStoreSync.test.ts +83 -0
  110. package/src/player/lib/automationStoreSync.ts +56 -0
  111. package/src/player/lib/timelineDOM.test.ts +33 -0
  112. package/src/player/lib/timelineDOM.ts +12 -0
  113. package/src/player/store/automationSelectionSlice.test.ts +30 -0
  114. package/src/player/store/automationSelectionSlice.ts +54 -0
  115. package/src/player/store/playerStore.test.ts +15 -0
  116. package/src/player/store/playerStore.ts +54 -65
  117. package/src/player/store/timelineElement.ts +78 -0
  118. package/src/styles/studio.css +89 -0
  119. package/src/telemetry/agentRuntime.test.ts +45 -0
  120. package/src/telemetry/agentRuntime.ts +62 -0
  121. package/src/telemetry/system.ts +8 -0
  122. package/src/utils/studioFileHistory.test.ts +49 -0
  123. package/src/utils/studioFileHistory.ts +17 -1
  124. package/src/utils/studioTelemetry.ts +16 -10
  125. package/dist/assets/index-dF-CmLZu.js +0 -428
  126. package/dist/assets/index-zQ4JFwwB.css +0 -1
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as react from 'react';
3
3
  import { ReactNode, RefObject } from 'react';
4
+ import { GsapAnimation, PropertyGroupName } from '@hyperframes/core/gsap-parser';
4
5
  import * as zustand from 'zustand';
5
6
  import { MusicBeatAnalysis } from '@hyperframes/core/beats';
6
- import { GsapAnimation, PropertyGroupName } from '@hyperframes/core/gsap-parser';
7
7
  import { GsapAnimation as GsapAnimation$1, ArcPathSegment } from '@hyperframes/parsers/gsap-parser';
8
8
 
9
9
  interface PlayerProps {
@@ -129,6 +129,40 @@ interface KeyframeSlice {
129
129
  setKeyframeCache: (elementId: string, data: KeyframeCacheEntry | undefined) => void;
130
130
  }
131
131
 
132
+ /**
133
+ * The active selection box on one automation lane.
134
+ *
135
+ * A store slice, not lane-local state, for the same reason keyframe selection
136
+ * is one: Delete/copy/paste handlers and the shape menu live outside the lane
137
+ * component and need to read it. Ephemeral by construction — nothing
138
+ * serializes store state, and the selection must never survive into a render.
139
+ */
140
+
141
+ interface AutomationSelection {
142
+ /** TimelineElement key (key ?? id) of the clip that owns the lane. */
143
+ elementKey: string;
144
+ /** Lane target: "volume" or "fx.<nodeId>.<param>". */
145
+ target: string;
146
+ /** Clip-local seconds; always t0 <= t1 (ordered on write). */
147
+ t0: number;
148
+ t1: number;
149
+ /**
150
+ * The box's value bounds, in the parameter's own units; always v0 <= v1.
151
+ *
152
+ * What makes the selection a box rather than a time span: a point is caught
153
+ * only if it falls inside both axes. Span operations — copy, paste, shape
154
+ * insert, simplify — still read t0/t1 alone, because they act on the envelope
155
+ * over a stretch of time rather than on a set of breakpoints.
156
+ */
157
+ v0: number;
158
+ v1: number;
159
+ }
160
+ interface AutomationSelectionSlice {
161
+ automationSelection: AutomationSelection | null;
162
+ setAutomationSelection: (sel: AutomationSelection) => void;
163
+ clearAutomationSelection: () => void;
164
+ }
165
+
132
166
  interface TimelineFocusRequest {
133
167
  id: string;
134
168
  projectId: string | null;
@@ -149,6 +183,15 @@ declare const liveTime: {
149
183
  subscribe: (listener: TimeListener) => () => boolean;
150
184
  };
151
185
 
186
+ /**
187
+ * One row in the timeline: a clip as Studio needs it, translated from the
188
+ * runtime's manifest at createTimelineElementFromManifestClip.
189
+ *
190
+ * Split out of playerStore, which had reached the 600-line studio ceiling and
191
+ * could not carry another field. Re-exported from there, so every existing
192
+ * importer is unaffected.
193
+ */
194
+
152
195
  interface TimelineElement {
153
196
  id: string;
154
197
  label?: string;
@@ -194,6 +237,9 @@ interface TimelineElement {
194
237
  playbackRate?: number;
195
238
  sourceDuration?: number;
196
239
  volume?: number;
240
+ /** Verbatim `data-fx-chain` / `data-automation`; see automationLaneData. */
241
+ fxChain?: string;
242
+ automation?: string;
197
243
  /** Path from data-composition-src — identifies sub-composition elements */
198
244
  compositionSrc?: string;
199
245
  /** Whether this row came from authored clip timing or Studio's full-duration layer fallback. */
@@ -213,12 +259,13 @@ interface TimelineElement {
213
259
  expandedParentStart?: number;
214
260
  expandedHostKey?: string;
215
261
  }
262
+
216
263
  type ZoomMode = "fit" | "manual";
217
264
  type TimelineTool = "select" | "razor";
218
265
  interface SelectElementOptions {
219
266
  preserveSet?: boolean;
220
267
  }
221
- interface PlayerState extends KeyframeSlice, ThumbnailSlice {
268
+ interface PlayerState extends KeyframeSlice, AutomationSelectionSlice, ThumbnailSlice {
222
269
  isPlaying: boolean;
223
270
  currentTime: number;
224
271
  duration: number;
@@ -323,6 +370,37 @@ interface PlayerState extends KeyframeSlice, ThumbnailSlice {
323
370
  requestedSeekTime: number | null;
324
371
  requestSeek: (time: number) => void;
325
372
  clearSeekRequest: () => void;
373
+ /**
374
+ * Request the transport start or stop from outside the player loop.
375
+ *
376
+ * The FX rack auditions a preset by writing it to the running graph, which is
377
+ * silent while the transport is paused — so hovering one has to start
378
+ * playback, and leaving has to put the playhead back where it was. Hovering is
379
+ * not an edit and must not cost the author their place.
380
+ *
381
+ * A nonce rather than a bare boolean: two hovers in a row both want play, and
382
+ * without it the second request is indistinguishable from the first having
383
+ * already been served.
384
+ */
385
+ playbackRequest: {
386
+ playing: boolean;
387
+ returnTo: number | null;
388
+ nonce: number;
389
+ } | null;
390
+ requestPlayback: (playing: boolean, returnTo?: number | null) => void;
391
+ clearPlaybackRequest: () => void;
392
+ /**
393
+ * Request the timeline to scroll a clip into view (e.g. clicking an
394
+ * already-added asset card in the sidebar). Consumed and cleared by
395
+ * useTimelineRevealClip. The nonce makes repeat requests for the same
396
+ * clip observable so a second click re-reveals after the user scrolls away.
397
+ */
398
+ clipRevealRequest: {
399
+ elementId: string;
400
+ nonce: number;
401
+ } | null;
402
+ requestClipReveal: (elementId: string) => void;
403
+ clearClipRevealRequest: () => void;
326
404
  timelineFocus: TimelineFocusRequest | null;
327
405
  timelineFocusNonce: number;
328
406
  requestTimelineFocus: (id: string) => void;
@@ -853,6 +931,11 @@ interface PropertyPanelProps {
853
931
  * `onSetAttribute` calls where omitted. */
854
932
  onSetAttributes?: (selection: DomEditSelection, attrs: Record<string, string>) => Promise<void>;
855
933
  onSetAttributeLive: (attr: string, value: string | null, onSettled?: (ok: boolean) => void) => void | Promise<void>;
934
+ /** Persists without reloading the preview, but re-reads the selection after —
935
+ * for attributes the runtime applies to the live graph itself, where a reload
936
+ * would only interrupt playback, and where the panel still has to see the
937
+ * value it just wrote to compute the next edit from. */
938
+ onSetAttributeQuiet?: (attr: string, value: string | null) => void | Promise<void>;
856
939
  onApplyColorGradingScope?: (scope: "source-file" | "project", value: string | null) => Promise<{
857
940
  changedFiles: number;
858
941
  changedElements: number;
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-dF-CmLZu.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-zQ4JFwwB.css">
8
+ <script type="module" crossorigin src="/assets/index-GqONLcOl.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DNkh9mbV.css">
10
10
  </head>
11
11
  <body>
12
12
  <div data-hf-id="hf-aph5" id="root"></div>