@hyperframes/studio 0.8.7 → 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.
- package/dist/assets/{hyperframes-player-bDcU464i.js → hyperframes-player-DYTqZd0d.js} +1 -1
- package/dist/assets/{index-FkAs3zRu.js → index-B69X8UsY.js} +1 -1
- package/dist/assets/{index-MSOSP1-J.js → index-D6CV2x61.js} +1 -1
- package/dist/assets/{index-CUXnyoIa.js → index-ng4tq6YE.js} +115 -115
- package/dist/index.d.ts +10 -1
- package/dist/index.html +1 -1
- package/dist/index.js +14 -21
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/components/editor/PropertyPanelFlat.tsx +1 -5
- package/src/hooks/timelineTrackVisibility.test.ts +31 -0
- package/src/hooks/timelineTrackVisibility.ts +20 -4
- package/src/player/components/Timeline.test.ts +1 -1
- package/src/player/components/TimelineLanes.test.tsx +3 -1
- package/src/player/components/TimelineTrackHeader.test.tsx +2 -1
- package/src/player/components/TimelineTrackPlainHeader.test.tsx +161 -0
- package/src/player/components/TimelineTrackPlainHeader.tsx +17 -10
- package/src/player/components/timelineCallbacks.ts +14 -1
- package/src/player/components/useTimelineTrackDerivations.test.ts +103 -0
- package/src/player/components/useTimelineTrackDerivations.ts +4 -11
package/dist/index.d.ts
CHANGED
|
@@ -655,7 +655,16 @@ interface TimelineEditCallbacks {
|
|
|
655
655
|
}>, options?: {
|
|
656
656
|
coalesceKey?: string;
|
|
657
657
|
}) => Promise<void> | void;
|
|
658
|
-
|
|
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;
|
|
659
668
|
/** B7's bus strip: live-write the group's own attribute while dragging. */
|
|
660
669
|
onSetAudioGroupAttributeLive?: (groupId: string, attr: string, value: string | null) => void;
|
|
661
670
|
/** ...and persist one undo entry on release. */
|
package/dist/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
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-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-ng4tq6YE.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-Ba9zbpT9.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/dist/index.js
CHANGED
|
@@ -1704,9 +1704,6 @@ function resolveCanary(name) {
|
|
|
1704
1704
|
decisions.set(name, decision);
|
|
1705
1705
|
return decision;
|
|
1706
1706
|
}
|
|
1707
|
-
function isCanaryEnabled(name) {
|
|
1708
|
-
return resolveCanary(name).enabled;
|
|
1709
|
-
}
|
|
1710
1707
|
function canaryEventProperties() {
|
|
1711
1708
|
return canaryFeatureProperties(
|
|
1712
1709
|
CANARIES.map((c) => {
|
|
@@ -13178,7 +13175,7 @@ function trackDisplaySuffix(displayNumber) {
|
|
|
13178
13175
|
// src/player/components/TimelineTrackPlainHeader.tsx
|
|
13179
13176
|
import { Fragment as Fragment12, jsx as jsx35, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
13180
13177
|
function visibilityButtonLabel(showAsMute, hidden, suffix) {
|
|
13181
|
-
if (showAsMute) return hidden ?
|
|
13178
|
+
if (showAsMute) return hidden ? `Unmute track${suffix}` : `Mute track${suffix}`;
|
|
13182
13179
|
return hidden ? `Show track${suffix}` : `Hide track${suffix}`;
|
|
13183
13180
|
}
|
|
13184
13181
|
function visibilityButtonIcon(showAsMute, hidden) {
|
|
@@ -13195,7 +13192,7 @@ function VisibilityButton({
|
|
|
13195
13192
|
}) {
|
|
13196
13193
|
if (!visible) return /* @__PURE__ */ jsx35("span", { "aria-hidden": "true", className: "h-6 w-6 shrink-0" });
|
|
13197
13194
|
const suffix = trackDisplaySuffix(trackDisplayNumber2);
|
|
13198
|
-
const showAsMute = Boolean(isAudioTrack)
|
|
13195
|
+
const showAsMute = Boolean(isAudioTrack);
|
|
13199
13196
|
const label = visibilityButtonLabel(showAsMute, hidden, suffix);
|
|
13200
13197
|
return /* @__PURE__ */ jsx35(
|
|
13201
13198
|
"button",
|
|
@@ -13207,7 +13204,7 @@ function VisibilityButton({
|
|
|
13207
13204
|
onPointerDown: (event) => event.stopPropagation(),
|
|
13208
13205
|
onClick: (event) => {
|
|
13209
13206
|
event.stopPropagation();
|
|
13210
|
-
void onToggle?.(trackNumber, !hidden);
|
|
13207
|
+
void onToggle?.(trackNumber, !hidden, trackDisplayNumber2);
|
|
13211
13208
|
},
|
|
13212
13209
|
children: visibilityButtonIcon(showAsMute, hidden)
|
|
13213
13210
|
}
|
|
@@ -13231,7 +13228,7 @@ function PlainTrackHeader({
|
|
|
13231
13228
|
showTrackLabel && /* @__PURE__ */ jsx35(
|
|
13232
13229
|
"span",
|
|
13233
13230
|
{
|
|
13234
|
-
className: `min-w-0 flex-1 truncate text-[11px] ${isAudioTrack && (isTrackHidden || isGroupMuted)
|
|
13231
|
+
className: `min-w-0 flex-1 truncate text-[11px] ${isAudioTrack && (isTrackHidden || isGroupMuted) ? "line-through" : ""}`,
|
|
13235
13232
|
title: isGroupMuted && !isTrackHidden ? `${trackLabel} (group muted)` : trackLabel,
|
|
13236
13233
|
children: trackLabel
|
|
13237
13234
|
}
|
|
@@ -13248,7 +13245,7 @@ function PlainTrackHeader({
|
|
|
13248
13245
|
onToggle: onToggleTrackHidden
|
|
13249
13246
|
}
|
|
13250
13247
|
),
|
|
13251
|
-
isAudioTrack &&
|
|
13248
|
+
isAudioTrack && onToggleSolo && /* @__PURE__ */ jsx35(TimelineSoloButton, { isSoloed, onToggle: onToggleSolo })
|
|
13252
13249
|
] });
|
|
13253
13250
|
}
|
|
13254
13251
|
|
|
@@ -14915,16 +14912,10 @@ function useTimelineTrackDerivations(expandedElements) {
|
|
|
14915
14912
|
}
|
|
14916
14913
|
return Array.from(map.entries()).sort(([a], [b]) => a - b);
|
|
14917
14914
|
}, [expandedElements]);
|
|
14918
|
-
const { tracks, groups, trackGroupOf } = useMemo12(
|
|
14919
|
-
|
|
14920
|
-
|
|
14921
|
-
|
|
14922
|
-
groups: [],
|
|
14923
|
-
trackGroupOf: /* @__PURE__ */ new Map()
|
|
14924
|
-
};
|
|
14925
|
-
}
|
|
14926
|
-
return groupTimelineTracks(rawTracks);
|
|
14927
|
-
}, [rawTracks]);
|
|
14915
|
+
const { tracks, groups, trackGroupOf } = useMemo12(
|
|
14916
|
+
() => groupTimelineTracks(rawTracks),
|
|
14917
|
+
[rawTracks]
|
|
14918
|
+
);
|
|
14928
14919
|
const trackStyles = useMemo12(() => {
|
|
14929
14920
|
const map = /* @__PURE__ */ new Map();
|
|
14930
14921
|
for (const [trackNum, els] of tracks) {
|
|
@@ -57387,7 +57378,7 @@ function PropertyPanelFlat({
|
|
|
57387
57378
|
});
|
|
57388
57379
|
}
|
|
57389
57380
|
}
|
|
57390
|
-
if (sections.audioFx
|
|
57381
|
+
if (sections.audioFx) {
|
|
57391
57382
|
groups.push({
|
|
57392
57383
|
id: "audio-fx",
|
|
57393
57384
|
title: "Audio FX",
|
|
@@ -63437,6 +63428,7 @@ async function toggleTimelineTrackHidden({
|
|
|
63437
63428
|
timelineElements,
|
|
63438
63429
|
track: track2,
|
|
63439
63430
|
hidden,
|
|
63431
|
+
displayNumber,
|
|
63440
63432
|
previewIframe,
|
|
63441
63433
|
writeProjectFile,
|
|
63442
63434
|
recordEdit,
|
|
@@ -63444,7 +63436,7 @@ async function toggleTimelineTrackHidden({
|
|
|
63444
63436
|
pendingTimelineEditPathRef
|
|
63445
63437
|
}) {
|
|
63446
63438
|
const suffix = trackDisplaySuffix(
|
|
63447
|
-
trackDisplayNumber(timelineTrackOrder(timelineElements), track2)
|
|
63439
|
+
displayNumber ?? trackDisplayNumber(timelineTrackOrder(timelineElements), track2)
|
|
63448
63440
|
);
|
|
63449
63441
|
const trackElements = timelineElements.filter((element) => element.track === track2);
|
|
63450
63442
|
const isAudioOnlyTrack = trackElements.length > 0 && trackElements.every(isAudioTimelineElement);
|
|
@@ -63574,7 +63566,7 @@ function useTimelineTrackVisibilityEditing({
|
|
|
63574
63566
|
}) {
|
|
63575
63567
|
const expandedElements = useExpandedTimelineElements();
|
|
63576
63568
|
return useCallback94(
|
|
63577
|
-
async (track2, hidden) => {
|
|
63569
|
+
async (track2, hidden, displayNumber) => {
|
|
63578
63570
|
if (isRecordingRef?.current) {
|
|
63579
63571
|
showToast("Cannot edit timeline while recording", "error");
|
|
63580
63572
|
return;
|
|
@@ -63588,6 +63580,7 @@ function useTimelineTrackVisibilityEditing({
|
|
|
63588
63580
|
timelineElements: expandedElements,
|
|
63589
63581
|
track: track2,
|
|
63590
63582
|
hidden,
|
|
63583
|
+
displayNumber,
|
|
63591
63584
|
previewIframe: previewIframeRef.current,
|
|
63592
63585
|
writeProjectFile,
|
|
63593
63586
|
recordEdit,
|