hyperframes 0.8.81 → 0.8.82

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 (42) hide show
  1. package/dist/backgroundChecksWorker.js +890 -0
  2. package/dist/cli.js +2928 -1809
  3. package/dist/commands/layout-audit.browser.js +55 -25
  4. package/dist/fontLocalizeCli.js +417 -134
  5. package/dist/hyperframe-runtime.js +53 -53
  6. package/dist/hyperframe.manifest.json +1 -1
  7. package/dist/hyperframe.runtime.iife.js +53 -53
  8. package/dist/hyperframes-player.global.js +3 -3
  9. package/dist/registry/localSemantic.js +7 -3
  10. package/dist/renderSetupWorker.js +62 -32
  11. package/dist/sherpaWorker.js +179 -0
  12. package/dist/skills/hyperframes/SKILL.md +2 -0
  13. package/dist/skills/hyperframes/references/plugin-installation.md +43 -0
  14. package/dist/skills/hyperframes/references/skill-lifecycle.md +2 -0
  15. package/dist/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
  16. package/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
  17. package/dist/skills/hyperframes-cli/SKILL.md +2 -0
  18. package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +1 -0
  19. package/dist/skills/media-use/SKILL.md +2 -0
  20. package/dist/skills/media-use/references/operations.md +7 -5
  21. package/dist/skills/media-use/references/setup-providers.md +9 -9
  22. package/dist/skills/media-use/registry/localSemantic.js +7 -3
  23. package/dist/skills/media-use/scripts/lib/ff-binaries.mjs +37 -0
  24. package/dist/skills/media-use/scripts/lib/probe.mjs +3 -1
  25. package/dist/skills/media-use/scripts/lib/probe.test.mjs +118 -1
  26. package/dist/skills/media-use/scripts/lib/tts-local-provider.mjs +5 -3
  27. package/dist/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
  28. package/dist/skills/media-use/scripts/resolve.mjs +45 -19
  29. package/dist/skills/media-use/scripts/transcribe.mjs +39 -25
  30. package/dist/skills/media-use/scripts/transcribe.test.mjs +112 -0
  31. package/dist/skills/registry/localSemantic.js +7 -3
  32. package/dist/studio/assets/{hyperframes-player-C68UawR3.js → hyperframes-player-zGIbZhLJ.js} +1 -1
  33. package/dist/studio/assets/{index-CMzPGv9P.js → index-BiLCTunu.js} +1 -1
  34. package/dist/studio/assets/{index-hNVM9Pd2.js → index-DSazIt7R.js} +189 -189
  35. package/dist/studio/assets/{index-CS5SImRT.js → index-DStmfnpZ.js} +1 -1
  36. package/dist/studio/index.d.ts +172 -7
  37. package/dist/studio/index.html +1 -1
  38. package/dist/studio/index.js +2414 -2172
  39. package/dist/studio/index.js.map +1 -1
  40. package/dist/templates/_shared/AGENTS.md +5 -1
  41. package/dist/templates/_shared/CLAUDE.md +5 -1
  42. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import{n as Qi}from"./index-hNVM9Pd2.js";/*!
1
+ import{n as Qi}from"./index-DSazIt7R.js";/*!
2
2
  * Copyright (c) 2026-present, Vanilagy and contributors
3
3
  *
4
4
  * This Source Code Form is subject to the terms of the Mozilla Public
@@ -7,7 +7,7 @@ import { ContextMenu as ContextMenu$1 } from '@base-ui/react/context-menu';
7
7
  import { Menu as Menu$1 } from '@base-ui/react/menu';
8
8
  import { Popover as Popover$1 } from '@base-ui/react/popover';
9
9
  import { RuntimeTimelineClipIdentity, HyperframePickerElementInfo } from '@hyperframes/core';
10
- import { GsapAnimation, PropertyGroupName } from '@hyperframes/core/gsap-parser';
10
+ import { GsapAnimation, ParsedGsap, PropertyGroupName } from '@hyperframes/core/gsap-parser';
11
11
  import { MusicBeatAnalysis } from '@hyperframes/core/beats';
12
12
  import * as zustand from 'zustand';
13
13
  import { StoreApi } from 'zustand';
@@ -654,8 +654,9 @@ interface TimelineElement {
654
654
  playbackRate?: number;
655
655
  sourceDuration?: number;
656
656
  volume?: number;
657
- /** `data-has-audio="true"` on a video: its sound is mixed, so it takes audio affordances (fades). */
657
+ /** A video with sound to mix (`data-has-audio`, or unmuted without it); `muted` silences it. */
658
658
  hasAudio?: boolean;
659
+ muted?: boolean;
659
660
  /** Clip-edge fades from `data-fade-in` / `data-fade-out`, seconds; absent means none. */
660
661
  fadeIn?: number;
661
662
  fadeOut?: number;
@@ -1094,7 +1095,7 @@ interface DomEditPatchBatchesResult {
1094
1095
  changed: boolean;
1095
1096
  }
1096
1097
 
1097
- interface RecordEditInput$1 {
1098
+ interface RecordEditInput$2 {
1098
1099
  label: string;
1099
1100
  coalesceKey?: string;
1100
1101
  files: Record<string, {
@@ -1118,7 +1119,7 @@ interface UseTimelineEditingOptions {
1118
1119
  showToast: (message: string, tone?: "error" | "info") => void;
1119
1120
  writeProjectFile: (path: string, content: string, expectedContent?: string) => Promise<void>;
1120
1121
  observeProjectFileVersion?: (path: string, version: string | null) => void;
1121
- recordEdit: (input: RecordEditInput$1) => Promise<void>;
1122
+ recordEdit: (input: RecordEditInput$2) => Promise<void>;
1122
1123
  reloadPreview: () => void;
1123
1124
  previewIframeRef: RefObject<HTMLIFrameElement | null>;
1124
1125
  pendingTimelineEditPathRef: MutableRefObject<Set<string>>;
@@ -1142,6 +1143,101 @@ type TimelineMoveUpdates = Pick<TimelineElement, "start" | "track"> & {
1142
1143
  stackingReorder?: TimelineStackingReorderIntent | null;
1143
1144
  };
1144
1145
 
1146
+ /** Value-only channels a `tl.set(...)` patch may touch. */
1147
+ interface SetPatchProps {
1148
+ x?: number;
1149
+ y?: number;
1150
+ rotation?: number;
1151
+ rotationX?: number;
1152
+ rotationY?: number;
1153
+ rotationZ?: number;
1154
+ z?: number;
1155
+ transformPerspective?: number;
1156
+ scaleX?: number;
1157
+ scaleY?: number;
1158
+ scale?: number;
1159
+ opacity?: number;
1160
+ }
1161
+ /** A single keyframe step's numeric channels (the GSAP array-keyframe form). */
1162
+ type KeyframeStep = Record<string, number>;
1163
+ type RuntimeTweenChange = {
1164
+ kind: "set";
1165
+ props: SetPatchProps;
1166
+ } | {
1167
+ kind: "keyframes";
1168
+ keyframes: KeyframeStep[];
1169
+ } | {
1170
+ kind: "keyframe-rebuild";
1171
+ pct: number;
1172
+ props: KeyframeStep;
1173
+ } | {
1174
+ kind: "global-set";
1175
+ props: SetPatchProps;
1176
+ };
1177
+
1178
+ interface MutationResult {
1179
+ ok: boolean;
1180
+ changed?: boolean;
1181
+ parsed?: ParsedGsap;
1182
+ before?: string;
1183
+ after?: string;
1184
+ scriptText?: string;
1185
+ }
1186
+ interface CommitMutationOptions {
1187
+ label: string;
1188
+ /** Observe the durable writer result without duplicating the request path. */
1189
+ onResult?: (result: MutationResult) => void;
1190
+ coalesceKey?: string;
1191
+ coalesceMs?: number;
1192
+ softReload?: boolean;
1193
+ skipReload?: boolean;
1194
+ /**
1195
+ * Write the source but leave the preview alone; the caller renders once when it
1196
+ * is done. For a multi-write action like a group drag, rendering after each
1197
+ * write shows a source where the members not yet written still hold their old
1198
+ * values, so they snap back until their own write lands. This also defers the
1199
+ * in-place runtime patch's seek, which re-renders the whole timeline and repaints
1200
+ * the queued members the same way. Unlike `skipReload` this changes nothing about
1201
+ * error handling — a failed write still throws.
1202
+ */
1203
+ deferPreviewSync?: boolean;
1204
+ /** Shares an in-place patch miss with the final render of one multi-write action. */
1205
+ previewFallbackLatch?: {
1206
+ pending: boolean;
1207
+ };
1208
+ beforeReload?: () => void;
1209
+ /**
1210
+ * Serialize this commit against others sharing the same key. Used to chain
1211
+ * per-animationId GSAP meta updates. Every commit independently takes the
1212
+ * project/file mutation lock, so this key only adds ordering and can never
1213
+ * bypass whole-file serialization.
1214
+ */
1215
+ serializeKey?: string;
1216
+ /**
1217
+ * Value-only edit fast path. When present, `runCommit` first tries to patch the
1218
+ * one changed tween in the preview's runtime timeline in place
1219
+ * (`patchRuntimeTweenInPlace`) — instant, no composition re-run, no iframe
1220
+ * remount. On a successful patch the reload is skipped entirely (panels still
1221
+ * refresh); when the patch can't be confidently applied it falls back to the
1222
+ * existing soft/full reload path. Structural edits omit this and reload as before.
1223
+ */
1224
+ instantPatch?: {
1225
+ selector: string;
1226
+ change: RuntimeTweenChange;
1227
+ };
1228
+ /**
1229
+ * The same fast path for a batched commit: one patch per element the batch
1230
+ * wrote, applied in order. All of them must land for the reload to be skipped
1231
+ * — one that can't be applied leaves the preview half-patched, so the whole
1232
+ * batch falls back to the reload. Only the last patch re-renders (see
1233
+ * `deferSeek`), so a ten-element batch repaints once.
1234
+ */
1235
+ instantPatches?: Array<{
1236
+ selector: string;
1237
+ change: RuntimeTweenChange;
1238
+ }>;
1239
+ }
1240
+
1145
1241
  interface TimelineGroupMoveChange {
1146
1242
  element: TimelineElement;
1147
1243
  start: number;
@@ -2648,7 +2744,7 @@ declare function findElementBlock(html: string, elementId: string): {
2648
2744
  isSelfClosing: boolean;
2649
2745
  } | null;
2650
2746
 
2651
- interface RecordEditInput {
2747
+ interface RecordEditInput$1 {
2652
2748
  label: string;
2653
2749
  coalesceKey?: string;
2654
2750
  coalesceMs?: number;
@@ -2694,7 +2790,7 @@ declare function usePersistentEditHistory({ projectId }: UsePersistentEditHistor
2694
2790
  createdAt: number;
2695
2791
  }[];
2696
2792
  };
2697
- recordEdit: ({ label, coalesceKey, coalesceMs, files }: RecordEditInput) => Promise<void>;
2793
+ recordEdit: ({ label, coalesceKey, coalesceMs, files }: RecordEditInput$1) => Promise<void>;
2698
2794
  undo: (callbacks: ApplyCallbacks) => Promise<ApplyResult>;
2699
2795
  redo: (callbacks: ApplyCallbacks) => Promise<ApplyResult>;
2700
2796
  };
@@ -2890,4 +2986,73 @@ declare function TimelineEditProvider({ value, children, }: {
2890
2986
  children: ReactNode;
2891
2987
  }): react_jsx_runtime.JSX.Element;
2892
2988
 
2893
- export { type AgentModalAnchorPoint, type AgentPromptElementInfo, AskAgentModal, type AskAgentModalProps, AudioWaveform, type AudioWaveformProps, type BlockedTimelineEditIntent, Button, type ButtonSize, type ButtonVariant, type CanEditTimelineElement, CompositionBreadcrumb, type CompositionDimensions, type CompositionLevel, CompositionThumbnail, ContextMenu, DEFAULT_SHORTCUT_SECTIONS, type EditHistoryHandle, EditorShell, type EditorShellProps, type ExternalFileChangeBlockedState, type ExternalFileChangeCoordinatorHandle, ExternalFileConflictBanner, type FfmpegStatus, FileTree, GridOverlay, HyperframesLoader, type HyperframesLoaderProps, HyperframesLogo, IconButton, ImageThumbnail, type ImageThumbnailProps, Input, type InputProps, Menu, MenuItem, type MenuItemTone, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuShortcut, NLEPreview, NumberField, type NumberFieldProps, type PatchOperation, type PersistedRenderSettings, type PickedElement, Player, PlayerControls, type PlayerHandle, type PlayerHandleElement, type PlayerHandleListener, type PlayerHandleTimeListener, Popover, type PopupPreviewState, type DomEditCompositionRect as PreviewCompositionRect, PreviewGuides, PreviewOverlayProvider, type PreviewOverlayProviderProps, type PreviewSnapPreferences, type PreviewState, PropertyPanel, type RenderJob, RenderQueue, type RenderQueueProps, type ResolutionPreset, Select, type SelectOption, type SelectProps, type ShortcutHint, type ShortcutSection, Slider, type SliderProps, SnapToolbar, SourceEditor, type StartRenderOptions, StudioApp, StudioFileConflictError, type StudioPendingEditsDrainResult, Tab, TabPanel, Tabs, TabsList, type ThumbnailPriority, Timeline, TimelineClipMenu, type TimelineClipRenderContext, type TimelineEditCallbacks, type TimelineEditOutcome, type TimelineEditPermission, TimelineEditPopover, TimelineEditProvider, type TimelineElement, TimelineEmptyStatePart, TimelineFrame, TimelineGapMenu, TimelineKeyframeMenu, TimelineLanes, TimelineOverlays, TimelinePane, type TimelinePaneProps, TimelinePlayhead, TimelineProvider, TimelineRazorGuide, TimelineRuler, TimelineShortcutHint, type TimelineTheme, type TimelineTimeRange$1 as TimelineTimeRange, Toggle, type ToggleProps, Tooltip, type UseEditHistoryActionsOptions, type UsePersistentEditHistoryOptions, type UseProjectFileWriterOptions, type UseRenderClipContentOptions, type UseTimelineEditingOptions, VideoThumbnail, applyPatch, buildPickerAgentContextPreview, buildPickerAgentPrompt, buttonBase, buttonSizes, buttonVariants, cn, fieldBase, fieldText, findElementBlock, flushStudioPendingEdits, formatTime, getPersistedRenderSettings, liveTime, mergeStyleIntoTag, parseStyleString, persistRenderSettings, popupSurface, resolveIframe, resolveSourceFile, useEditHistoryActions, useElementPicker, usePersistentEditHistory, usePlayerHandle, usePlayerStore, usePreviewCompositionRect, usePreviewGuidesStore, usePreviewOverlayContext, useProjectFileWriter, useRenderClipContent, useRenderQueue, useTimelineContext, useTimelineEditing, useTimelinePlayer };
2989
+ interface EnableKeyframesSession {
2990
+ domEditSelection: DomEditSelection | null;
2991
+ selectedGsapAnimations: GsapAnimation[];
2992
+ previewIframeRef?: React.RefObject<HTMLIFrameElement | null>;
2993
+ handleGsapAddAnimation: (method: "to" | "from" | "set" | "fromTo") => void;
2994
+ handleGsapConvertToKeyframes: (animId: string, resolvedFromValues?: Record<string, number | string>, duration?: number, commitOverrides?: Partial<CommitMutationOptions>) => void | Promise<void>;
2995
+ handleGsapRemoveKeyframe: (animId: string, pct: number) => void;
2996
+ handleGsapAddKeyframeBatch?: (animId: string, pct: number, properties: Record<string, number | string>, commitOverrides?: Partial<CommitMutationOptions>) => Promise<void>;
2997
+ commitMutation?: (mutation: Record<string, unknown>, options: CommitMutationOptions) => Promise<void>;
2998
+ }
2999
+
3000
+ interface TimelineHistoryButtonsProps {
3001
+ canUndo?: boolean;
3002
+ canRedo?: boolean;
3003
+ undoLabel?: string;
3004
+ redoLabel?: string;
3005
+ onUndo?: () => Promise<void> | void;
3006
+ onRedo?: () => Promise<void> | void;
3007
+ }
3008
+ /** Undo and Redo: a host's props win, else the shell's edit history. */
3009
+ declare function TimelineHistoryButtons(props: TimelineHistoryButtonsProps): react_jsx_runtime.JSX.Element;
3010
+
3011
+ interface DomEditSessionSlice extends EnableKeyframesSession {
3012
+ domEditSelection: DomEditSelection | null;
3013
+ selectedGsapAnimations: GsapAnimation[];
3014
+ }
3015
+ interface TimelineToolbarProps {
3016
+ domEditSession?: DomEditSessionSlice;
3017
+ onSplitElement?: (element: TimelineElement, splitTime: number) => void;
3018
+ history?: TimelineHistoryButtonsProps;
3019
+ showAddBeat?: boolean;
3020
+ }
3021
+ declare function TimelineToolbar({ domEditSession, onSplitElement, history, showAddBeat, }: TimelineToolbarProps): react_jsx_runtime.JSX.Element;
3022
+
3023
+ interface AudioMeterStripProps {
3024
+ /** Pass a stable ref (useRef): a new object each render restarts the meter loop. */
3025
+ previewIframeRef?: RefObject<HTMLIFrameElement | null>;
3026
+ }
3027
+ declare const AudioMeterStrip: react.NamedExoticComponent<AudioMeterStripProps>;
3028
+
3029
+ interface RecordEditInput {
3030
+ label: string;
3031
+ coalesceKey?: string;
3032
+ files: Record<string, {
3033
+ before: string;
3034
+ after: string;
3035
+ }>;
3036
+ }
3037
+ interface UseClipboardOptions {
3038
+ projectId: string | null;
3039
+ activeCompPath: string | null;
3040
+ domEditSelectionRef: React.MutableRefObject<DomEditSelection | null>;
3041
+ showToast: (message: string, tone?: "error" | "info") => void;
3042
+ writeProjectFile: (path: string, content: string) => Promise<void>;
3043
+ recordEdit: (input: RecordEditInput) => Promise<void>;
3044
+ reloadPreview: () => void;
3045
+ handleTimelineElementsDelete: (elements: TimelineElement[]) => Promise<void>;
3046
+ handleDomEditElementDelete: (selection: DomEditSelection) => Promise<void>;
3047
+ previewIframeRef: React.MutableRefObject<HTMLIFrameElement | null>;
3048
+ waitForPendingDomEditSaves: () => Promise<void>;
3049
+ }
3050
+ declare function useClipboard({ projectId, activeCompPath, domEditSelectionRef, showToast, writeProjectFile, recordEdit, reloadPreview, handleTimelineElementsDelete, handleDomEditElementDelete, previewIframeRef, waitForPendingDomEditSaves, }: UseClipboardOptions): {
3051
+ handleCopy: () => boolean;
3052
+ handlePaste: () => Promise<void>;
3053
+ handleCut: () => Promise<boolean>;
3054
+ handleDuplicate: () => Promise<boolean>;
3055
+ canPaste: () => boolean;
3056
+ };
3057
+
3058
+ export { type AgentModalAnchorPoint, type AgentPromptElementInfo, AskAgentModal, type AskAgentModalProps, AudioMeterStrip, type AudioMeterStripProps, AudioWaveform, type AudioWaveformProps, type BlockedTimelineEditIntent, Button, type ButtonSize, type ButtonVariant, type CanEditTimelineElement, CompositionBreadcrumb, type CompositionDimensions, type CompositionLevel, CompositionThumbnail, ContextMenu, DEFAULT_SHORTCUT_SECTIONS, type EditHistoryHandle, EditorShell, type EditorShellProps, type ExternalFileChangeBlockedState, type ExternalFileChangeCoordinatorHandle, ExternalFileConflictBanner, type FfmpegStatus, FileTree, GridOverlay, HyperframesLoader, type HyperframesLoaderProps, HyperframesLogo, IconButton, ImageThumbnail, type ImageThumbnailProps, Input, type InputProps, Menu, MenuItem, type MenuItemTone, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuShortcut, NLEPreview, NumberField, type NumberFieldProps, type PatchOperation, type PersistedRenderSettings, type PickedElement, Player, PlayerControls, type PlayerHandle, type PlayerHandleElement, type PlayerHandleListener, type PlayerHandleTimeListener, Popover, type PopupPreviewState, type DomEditCompositionRect as PreviewCompositionRect, PreviewGuides, PreviewOverlayProvider, type PreviewOverlayProviderProps, type PreviewSnapPreferences, type PreviewState, PropertyPanel, type RenderJob, RenderQueue, type RenderQueueProps, type ResolutionPreset, Select, type SelectOption, type SelectProps, type ShortcutHint, type ShortcutSection, Slider, type SliderProps, SnapToolbar, SourceEditor, type StartRenderOptions, StudioApp, StudioFileConflictError, type StudioPendingEditsDrainResult, Tab, TabPanel, Tabs, TabsList, type ThumbnailPriority, Timeline, TimelineClipMenu, type TimelineClipRenderContext, type TimelineEditCallbacks, type TimelineEditOutcome, type TimelineEditPermission, TimelineEditPopover, TimelineEditProvider, type TimelineElement, TimelineEmptyStatePart, TimelineFrame, TimelineGapMenu, TimelineHistoryButtons, type TimelineHistoryButtonsProps, TimelineKeyframeMenu, TimelineLanes, TimelineOverlays, TimelinePane, type TimelinePaneProps, TimelinePlayhead, TimelineProvider, TimelineRazorGuide, TimelineRuler, TimelineShortcutHint, type TimelineTheme, type TimelineTimeRange$1 as TimelineTimeRange, TimelineToolbar, type TimelineToolbarProps, Toggle, type ToggleProps, Tooltip, type UseClipboardOptions, type UseEditHistoryActionsOptions, type UsePersistentEditHistoryOptions, type UseProjectFileWriterOptions, type UseRenderClipContentOptions, type UseTimelineEditingOptions, VideoThumbnail, applyPatch, buildPickerAgentContextPreview, buildPickerAgentPrompt, buttonBase, buttonSizes, buttonVariants, cn, fieldBase, fieldText, findElementBlock, flushStudioPendingEdits, formatTime, getPersistedRenderSettings, liveTime, mergeStyleIntoTag, parseStyleString, persistRenderSettings, popupSurface, resolveIframe, resolveSourceFile, useClipboard, useEditHistoryActions, useElementPicker, usePersistentEditHistory, usePlayerHandle, usePlayerStore, usePreviewCompositionRect, usePreviewGuidesStore, usePreviewOverlayContext, useProjectFileWriter, useRenderClipContent, useRenderQueue, useTimelineContext, useTimelineEditing, useTimelinePlayer };
@@ -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-hNVM9Pd2.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-DSazIt7R.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-BWJqxeaH.css">
10
10
  </head>
11
11
  <body>