@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/index.d.ts CHANGED
@@ -655,7 +655,16 @@ interface TimelineEditCallbacks {
655
655
  }>, options?: {
656
656
  coalesceKey?: string;
657
657
  }) => Promise<void> | void;
658
- 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;
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-CUXnyoIa.js"></script>
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 ? "Muted" : "Mute";
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) && isCanaryEnabled("audio-track-mute");
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) && isCanaryEnabled("audio-track-mute") ? "line-through" : ""}`,
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 && isCanaryEnabled("audio-track-mute") && onToggleSolo && /* @__PURE__ */ jsx35(TimelineSoloButton, { isSoloed, onToggle: onToggleSolo })
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
- if (!isCanaryEnabled("audio-groups")) {
14920
- return {
14921
- tracks: rawTracks,
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 && isCanaryEnabled("audio-fx-rack")) {
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,