hyperframes 0.8.80 → 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.
- package/dist/backgroundChecksWorker.js +890 -0
- package/dist/cli.js +3682 -2418
- package/dist/commands/layout-audit.browser.js +55 -25
- package/dist/fontLocalizeCli.js +575 -174
- package/dist/hyperframe-runtime.js +53 -53
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +53 -53
- package/dist/hyperframes-player.global.js +3 -3
- package/dist/registry/localSemantic.js +7 -3
- package/dist/renderSetupWorker.js +62 -32
- package/dist/sherpaWorker.js +179 -0
- package/dist/skills/hyperframes/SKILL.md +2 -0
- package/dist/skills/hyperframes/references/plugin-installation.md +43 -0
- package/dist/skills/hyperframes/references/skill-lifecycle.md +2 -0
- package/dist/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
- package/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
- package/dist/skills/hyperframes-cli/SKILL.md +2 -0
- package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +1 -0
- package/dist/skills/media-use/SKILL.md +2 -0
- package/dist/skills/media-use/references/operations.md +7 -5
- package/dist/skills/media-use/references/setup-providers.md +9 -9
- package/dist/skills/media-use/registry/localSemantic.js +7 -3
- package/dist/skills/media-use/scripts/lib/ff-binaries.mjs +37 -0
- package/dist/skills/media-use/scripts/lib/probe.mjs +3 -1
- package/dist/skills/media-use/scripts/lib/probe.test.mjs +118 -1
- package/dist/skills/media-use/scripts/lib/test-home.test.mjs +10 -0
- package/dist/skills/media-use/scripts/lib/tts-local-provider.mjs +5 -3
- package/dist/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
- package/dist/skills/media-use/scripts/resolve.mjs +45 -19
- package/dist/skills/media-use/scripts/transcribe.mjs +39 -25
- package/dist/skills/media-use/scripts/transcribe.test.mjs +112 -0
- package/dist/skills/registry/localSemantic.js +7 -3
- package/dist/studio/assets/{hyperframes-player-CgnoxDoD.js → hyperframes-player-zGIbZhLJ.js} +1 -1
- package/dist/studio/assets/{index-J9HXe7mU.js → index-BiLCTunu.js} +1 -1
- package/dist/studio/assets/{index-CsG24Jub.js → index-DSazIt7R.js} +198 -198
- package/dist/studio/assets/{index-DZGVvqDT.js → index-DStmfnpZ.js} +1 -1
- package/dist/studio/index.d.ts +172 -7
- package/dist/studio/index.html +1 -1
- package/dist/studio/index.js +2567 -2314
- package/dist/studio/index.js.map +1 -1
- package/dist/templates/_shared/AGENTS.md +5 -1
- package/dist/templates/_shared/CLAUDE.md +5 -1
- package/package.json +1 -1
package/dist/studio/index.d.ts
CHANGED
|
@@ -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
|
|
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$
|
|
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$
|
|
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
|
-
|
|
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 };
|
package/dist/studio/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-DSazIt7R.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-BWJqxeaH.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|