hyperframes 0.8.151 → 0.8.153

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 (169) hide show
  1. package/dist/{add-QKZZG7A2.js → add-D7GZM6ZS.js} +14 -14
  2. package/dist/{animatedGifPrep-YQDPYGOD.js → animatedGifPrep-IBLDIJXC.js} +9 -9
  3. package/dist/api.js +15 -15
  4. package/dist/{asset-3Q737Y4H.js → asset-ACZRQU2Z.js} +2 -2
  5. package/dist/{assetCataloger-BTHEBJJB.js → assetCataloger-Y3OELLLW.js} +4 -4
  6. package/dist/{auth-XL7EU3SO.js → auth-LFWML3XJ.js} +1 -1
  7. package/dist/{autoUpdate-PJFLTQ3U.js → autoUpdate-7IUGQXOV.js} +2 -2
  8. package/dist/{backgroundChecks-T5TIR5WK.js → backgroundChecks-XI364BNX.js} +3 -3
  9. package/dist/backgroundChecksWorker.js +3 -3
  10. package/dist/{batchRender-NFLVIDB4.js → batchRender-6TD4XSIP.js} +5 -5
  11. package/dist/{beats-JU4GZ26R.js → beats-FZGQ3HLR.js} +14 -14
  12. package/dist/{benchmark-7U2YWLTW.js → benchmark-3YEKSYMP.js} +10 -10
  13. package/dist/{browser-D57UPYDA.js → browser-R5PKLYZD.js} +3 -3
  14. package/dist/{bundleWithLocalizedFonts-26MXQOZG.js → bundleWithLocalizedFonts-QX5HV7LC.js} +2 -2
  15. package/dist/{capture-LT252COQ.js → capture-MTHXUEC2.js} +19 -19
  16. package/dist/{capture-47BV25G3.js → capture-R7QSBEPW.js} +2 -2
  17. package/dist/{catalog-BEZXOV4O.js → catalog-K2TRGCXO.js} +14 -14
  18. package/dist/{catch-up-KVV5X6BF.js → catch-up-WCSN4K4A.js} +4 -4
  19. package/dist/{check-6KQ433E6.js → check-N4EFKWC3.js} +294 -66
  20. package/dist/{checkBrowser-PRDR6XBY.js → checkBrowser-73SOMDG3.js} +75 -45
  21. package/dist/{chunk-IZPN423R.js → chunk-2F6LWCSF.js} +11 -6
  22. package/dist/{chunk-TCWMDCBX.js → chunk-2X3UJ4Q3.js} +2 -2
  23. package/dist/{chunk-YZTVHRJ2.js → chunk-2XEBNYG5.js} +1 -1
  24. package/dist/chunk-3DMR7RF6.js +24 -0
  25. package/dist/{chunk-APDLWWFG.js → chunk-3VGU2SH7.js} +1 -1
  26. package/dist/{chunk-OZ4K46OV.js → chunk-4IRCZWND.js} +2 -2
  27. package/dist/{chunk-4PKQEKAI.js → chunk-4OVLWS2K.js} +2 -2
  28. package/dist/{chunk-DHPFXAUF.js → chunk-57GN6KWT.js} +17 -3
  29. package/dist/{chunk-374QQGBQ.js → chunk-5CS4T6C6.js} +63 -12
  30. package/dist/{chunk-FLVI7FHU.js → chunk-5DD45SJZ.js} +1 -1
  31. package/dist/{chunk-BRF3O35X.js → chunk-5FS4HCHN.js} +109 -31
  32. package/dist/{chunk-DIOBKUBV.js → chunk-5OKZRXLT.js} +2 -2
  33. package/dist/{chunk-POEEDPJI.js → chunk-5ZGSN5YK.js} +1 -1
  34. package/dist/{chunk-FJWEYVEM.js → chunk-7FYFEXD2.js} +658 -198
  35. package/dist/{chunk-L3N7RJHS.js → chunk-7NKLNOHW.js} +3 -3
  36. package/dist/{chunk-O3DUX6P2.js → chunk-AA67UBB2.js} +4 -4
  37. package/dist/{chunk-IZ7L6V76.js → chunk-AUK5QCRH.js} +1 -1
  38. package/dist/{chunk-YEBKEWKB.js → chunk-BD3XH4A7.js} +1 -1
  39. package/dist/{chunk-XXPYZBZ3.js → chunk-C6TPGUWD.js} +2 -2
  40. package/dist/{chunk-ZD3RDNZI.js → chunk-CBMZYOWC.js} +1 -1
  41. package/dist/{chunk-ZGCRVM5M.js → chunk-DAKXCEE3.js} +4 -4
  42. package/dist/{chunk-AIJS74LG.js → chunk-FFDC5OWV.js} +8 -2
  43. package/dist/{chunk-DMKI64EZ.js → chunk-FSZAFCU7.js} +1 -1
  44. package/dist/{chunk-OSAH7S5M.js → chunk-FZC4UM4G.js} +1 -1
  45. package/dist/{chunk-QBYHNRHU.js → chunk-GV7I3ZSQ.js} +2 -2
  46. package/dist/{chunk-N3I6RAOR.js → chunk-GXPD7J53.js} +11 -11
  47. package/dist/{chunk-N4IXP3MY.js → chunk-HGAOO43L.js} +3 -3
  48. package/dist/{chunk-QF7AE3DB.js → chunk-J5LEAKUA.js} +1 -1
  49. package/dist/{chunk-PUIELIFA.js → chunk-JBUIS5DN.js} +1 -1
  50. package/dist/{chunk-KXX6NLOT.js → chunk-JQ57FAYN.js} +1 -1
  51. package/dist/{chunk-RRBKEHST.js → chunk-KFBEMIMD.js} +54 -6
  52. package/dist/{chunk-RYL6ZIJP.js → chunk-OIONMNWN.js} +18 -11
  53. package/dist/{chunk-KQGWP4KH.js → chunk-OSASJLU4.js} +1 -1
  54. package/dist/{chunk-3ZPFRDEJ.js → chunk-PVGDU7SE.js} +4 -4
  55. package/dist/{chunk-XGLNQDLN.js → chunk-PXOFFSO3.js} +1 -1
  56. package/dist/{chunk-IP73NMQT.js → chunk-QBFHVMOI.js} +10 -10
  57. package/dist/{chunk-IPDS2SWI.js → chunk-R6WCSVCE.js} +1 -1
  58. package/dist/{chunk-XYHBVSWD.js → chunk-RCWSM7IQ.js} +2 -2
  59. package/dist/{chunk-4YZYYP7V.js → chunk-SUVIGBHS.js} +3 -3
  60. package/dist/{chunk-L6RIMCMG.js → chunk-T2Y2WC5I.js} +3 -3
  61. package/dist/{chunk-QLGBNGXC.js → chunk-TCJM3KF2.js} +2 -2
  62. package/dist/{chunk-XKKBIFE5.js → chunk-TQUTAWUR.js} +7 -7
  63. package/dist/{chunk-HVXRYMGQ.js → chunk-TXWPPBIW.js} +1 -1
  64. package/dist/{chunk-2PSPARWP.js → chunk-TYXH3EKP.js} +4 -0
  65. package/dist/{chunk-FMNVTKX2.js → chunk-U3BCDVZO.js} +1 -1
  66. package/dist/{chunk-RJRGR5KF.js → chunk-UNOALNYO.js} +9 -9
  67. package/dist/{chunk-3SVC7SW4.js → chunk-V6UUZGP6.js} +7 -3
  68. package/dist/{chunk-LFNQDTSH.js → chunk-VYKPBRCB.js} +63 -12
  69. package/dist/{chunk-S22FKF6G.js → chunk-WNCGJFTZ.js} +2 -2
  70. package/dist/{chunk-XNDXENJQ.js → chunk-WQMTHPTK.js} +3 -3
  71. package/dist/{chunk-4LE27ST4.js → chunk-XQYLUY2F.js} +2 -2
  72. package/dist/chunk-XSEGMQYA.js +30 -0
  73. package/dist/{chunk-35PWWBGZ.js → chunk-YI6OBVWQ.js} +1 -1
  74. package/dist/{chunk-GNTVYF7E.js → chunk-YOEGUBBY.js} +5 -5
  75. package/dist/{chunk-FAIYEIZ4.js → chunk-YYMJEQ4D.js} +1 -1
  76. package/dist/{chunk-LKQS72D5.js → chunk-Z6CSYA7U.js} +1 -1
  77. package/dist/{chunk-XQKVEQNY.js → chunk-ZDEEHQ2Y.js} +2 -2
  78. package/dist/chunk-ZQMYD22O.js +215 -0
  79. package/dist/{clean-RLTHFTQA.js → clean-TLMZ6GVY.js} +52 -31
  80. package/dist/cli.js +53 -53
  81. package/dist/{cloud-Q5TGBTW3.js → cloud-XFIRM6YE.js} +4 -4
  82. package/dist/{cloudrun-4UZF74MV.js → cloudrun-OUGI5NN4.js} +6 -6
  83. package/dist/{compare-Q5UNR2V4.js → compare-OKSXYO3L.js} +30 -30
  84. package/dist/{compiler-ZXT27Z62.js → compiler-WHUQZITN.js} +6 -6
  85. package/dist/{component-H734P32V.js → component-3II4YXAD.js} +3 -3
  86. package/dist/{compositions-YEHDSTDR.js → compositions-RL75WQS6.js} +13 -13
  87. package/dist/{delete-LDBMPWRT.js → delete-4FM24SJ2.js} +2 -2
  88. package/dist/{deterministicFonts-C5JQLCTS.js → deterministicFonts-EOMDR6ZF.js} +3 -3
  89. package/dist/{dist-RGE4QASU.js → dist-2YYJYYPY.js} +3 -3
  90. package/dist/{dist-7JXLFD6U.js → dist-NUSNSGME.js} +4 -4
  91. package/dist/{doctor-XNJFIWJ7.js → doctor-Q5WYRIVP.js} +11 -11
  92. package/dist/{events-G6UFLNXR.js → events-CPZTSXAX.js} +2 -2
  93. package/dist/{events-UKCPUWMH.js → events-J5VJAKGT.js} +3 -3
  94. package/dist/{feedback-CK3KZ7DE.js → feedback-U64DIKAF.js} +8 -8
  95. package/dist/{figma-3D5C737B.js → figma-GUHWRHJO.js} +3 -3
  96. package/dist/fontLocalizeCli.js +12 -12
  97. package/dist/{get-QGTQUWFT.js → get-XDQJPF7G.js} +2 -2
  98. package/dist/{gpuPolicy-G5QAQDYF.js → gpuPolicy-7SIPG5BM.js} +9 -9
  99. package/dist/{grade-compare-XIHOM62P.js → grade-compare-WWW2F3NY.js} +30 -30
  100. package/dist/{gsapParserAcorn-VXZ3ZIF2.js → gsapParserAcorn-7NCK2LVT.js} +2 -2
  101. package/dist/{help-U5UBXT52.js → help-3UJYI7LC.js} +1 -1
  102. package/dist/{history-5J73QZSA.js → history-VQSM5L6N.js} +77 -205
  103. package/dist/hyperframe-runtime.js +4 -0
  104. package/dist/hyperframe.manifest.json +1 -1
  105. package/dist/hyperframe.runtime.iife.js +4 -0
  106. package/dist/hyperframes-player.global.js +1 -1
  107. package/dist/{info-RJHQQQUP.js → info-NMDUH7N5.js} +9 -9
  108. package/dist/{init-M6UQOYYC.js → init-D753VPPZ.js} +24 -24
  109. package/dist/{inspect-PRQWDBTP.js → inspect-KEE27DQN.js} +31 -31
  110. package/dist/{installer-ZL7UKYK5.js → installer-QCHUXV6E.js} +7 -7
  111. package/dist/{keyframes-VMUJYTCQ.js → keyframes-EP44YDZW.js} +227 -82
  112. package/dist/{lambda-ON42DRQD.js → lambda-Q5FTNY4J.js} +7 -7
  113. package/dist/{layout-QKBFVDVY.js → layout-LATG5CZV.js} +31 -31
  114. package/dist/{lint-ZQHHL2SV.js → lint-TQDQFJKW.js} +9 -9
  115. package/dist/{lintProject-3Z6OJCSO.js → lintProject-XQWXJYSC.js} +3 -3
  116. package/dist/{list-YBRKIWGF.js → list-O44ENRGS.js} +2 -2
  117. package/dist/{login-4B2YXGLB.js → login-EKFN5PZP.js} +4 -4
  118. package/dist/{media-treatment-5C5EJAAP.js → media-treatment-LPT4GYAE.js} +12 -12
  119. package/dist/{models-R7ZDWBJ6.js → models-CRYHY4KH.js} +12 -12
  120. package/dist/{motionShot-ZHESZNUL.js → motionShot-BS3DB666.js} +28 -15
  121. package/dist/{normalize-audio-EVWZVTBM.js → normalize-audio-7X445LLJ.js} +6 -6
  122. package/dist/{open-TV6HT4UT.js → open-JA7FN5F5.js} +4 -4
  123. package/dist/{parakeetRunner-YVVF4CG6.js → parakeetRunner-AFUTDANA.js} +12 -12
  124. package/dist/{pipeline-ETR5SEBS.js → pipeline-3TQHAQOJ.js} +9 -9
  125. package/dist/{play-C6WONRZV.js → play-UUJAXFCJ.js} +24 -24
  126. package/dist/{present-RANXTVPA.js → present-EBP6YMCJ.js} +20 -20
  127. package/dist/{preview-KF6UMBT2.js → preview-PVJDLZDU.js} +19 -19
  128. package/dist/{producer-CY2GXBWN.js → producer-HE23BPEU.js} +1 -1
  129. package/dist/{projectConfig-KPXCNMBM.js → projectConfig-EX35BZLA.js} +9 -9
  130. package/dist/{publication-Y36N4A7E.js → publication-OUGS3P7W.js} +4 -4
  131. package/dist/{publish-RCQJO35C.js → publish-UUFZR6QT.js} +12 -12
  132. package/dist/{remove-background-3ZMXVWLB.js → remove-background-P5M42CA5.js} +10 -10
  133. package/dist/{render-WUSTRMUD.js → render-AWFQGD4T.js} +5 -5
  134. package/dist/{render-PTNEFO5U.js → render-BJMONGDL.js} +10 -10
  135. package/dist/{render-FKVRCDT2.js → render-YSD2SRBL.js} +57 -22
  136. package/dist/{render-batch-AQHU2JWZ.js → render-batch-6UN3HT5A.js} +5 -5
  137. package/dist/renderSetupWorker.js +3 -3
  138. package/dist/{resolver-L5BDZJKU.js → resolver-O6ZENVYP.js} +6 -6
  139. package/dist/{sherpa-3S3ISG7G.js → sherpa-RWHRDO53.js} +11 -11
  140. package/dist/skills/hyperframes-cli/SKILL.md +3 -0
  141. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +5 -1
  142. package/dist/{skills-X4WQEKNF.js → skills-KC6IGXDU.js} +5 -5
  143. package/dist/{skillsUpdateCheck-UYCVHDZ6.js → skillsUpdateCheck-7C4TD7EL.js} +3 -3
  144. package/dist/{snapshot-YEYHQEZQ.js → snapshot-SNZL5GPC.js} +118 -41
  145. package/dist/{src-OLBDPEG6.js → src-KKS6QEHB.js} +11 -11
  146. package/dist/{src-2NN2WB6X.js → src-YMUDUVXQ.js} +8 -8
  147. package/dist/{staticProjectServer-7H35NMWB.js → staticProjectServer-XOCIQ3FV.js} +20 -20
  148. package/dist/studio/assets/{hyperframes-player-DJt8E7k4.js → hyperframes-player-Cn6V2ZaK.js} +1 -1
  149. package/dist/studio/assets/{index-DgbLblGR.js → index-CEGNvZnK.js} +1 -1
  150. package/dist/studio/assets/{index-DWIHrAY2.js → index-CaaXbGyk.js} +1 -1
  151. package/dist/studio/assets/{index-BGks9KLI.js → index-Cwpnr4DV.js} +132 -132
  152. package/dist/studio/index.html +1 -1
  153. package/dist/{studio-api-HGM2A5I3.js → studio-api-NUNUZQ5I.js} +30 -16
  154. package/dist/{studioServer-M6XFL7N6.js → studioServer-FBY3YWZH.js} +43 -43
  155. package/dist/{synthesize-22B7L5GX.js → synthesize-W2M7QGDV.js} +6 -5
  156. package/dist/{telemetry-KVCZKVTE.js → telemetry-KNSTX3E2.js} +3 -3
  157. package/dist/{timeline-VYYKZR4V.js → timeline-6I5LGPP6.js} +20 -20
  158. package/dist/{tokens-B5NFFL55.js → tokens-MY4GOQ53.js} +2 -2
  159. package/dist/{transcribe-SBETOIWI.js → transcribe-56WECC4Y.js} +10 -10
  160. package/dist/{transcribe-WNFRYZAC.js → transcribe-ISCPZLQZ.js} +16 -16
  161. package/dist/{tts-QSAQZVEZ.js → tts-RE227GFP.js} +1 -1
  162. package/dist/{updateCheck-5MM2DFUC.js → updateCheck-FAG4T4AV.js} +2 -2
  163. package/dist/{upgrade-LWID54R3.js → upgrade-5QCPW55B.js} +2 -2
  164. package/dist/{urlDownloader-CVLNXFDG.js → urlDownloader-FGSJGUM7.js} +8 -8
  165. package/dist/{validate-V4CGQ6OF.js → validate-WC3FUSUF.js} +25 -25
  166. package/dist/{video-VJB2KRSS.js → video-DOFSWSSR.js} +9 -9
  167. package/package.json +1 -1
  168. package/dist/chunk-WBLXWOYK.js +0 -15
  169. package/dist/{screenshotCapture-TEUIWXWN.js → screenshotCapture-3JXXUZND.js} +3 -3
@@ -39,7 +39,7 @@ import {
39
39
  stripEmbeddedRuntimeScripts,
40
40
  styleElementsFor,
41
41
  warnUnknownEnumValues
42
- } from "./chunk-QBYHNRHU.js";
42
+ } from "./chunk-GV7I3ZSQ.js";
43
43
  import {
44
44
  cssVariableName
45
45
  } from "./chunk-VC76R6W2.js";
@@ -49,7 +49,7 @@ import {
49
49
  } from "./chunk-OFQWTKPW.js";
50
50
  import {
51
51
  lintHyperframeHtml
52
- } from "./chunk-GNTVYF7E.js";
52
+ } from "./chunk-YOEGUBBY.js";
53
53
  import {
54
54
  checkSubCompositionUsability,
55
55
  resolveSubCompositionContent
@@ -72,7 +72,7 @@ import {
72
72
  } from "./chunk-SDYDNHEE.js";
73
73
  import {
74
74
  parse
75
- } from "./chunk-2PSPARWP.js";
75
+ } from "./chunk-TYXH3EKP.js";
76
76
 
77
77
  // ../core/dist/compiler/htmlCompiler.js
78
78
  import { resolve } from "path";
@@ -1036,12 +1036,16 @@ function wrapScopedCompositionScript(source, compositionId, errorLabel = "[Hyper
1036
1036
  var __hfBaseHyperframes = window.__hyperframes;
1037
1037
  var __hfScopedHyperframes = ${SCOPED_HYPERFRAMES_EXPRESSION};
1038
1038
  var __hfRun = function() {
1039
+ var report = window.__hfScriptState;
1040
+ if (typeof report === "function") report("start", __hfCompositionSrc || "index.html");
1039
1041
  try {
1040
1042
  (function(document, gsap, window, __hyperframes) {
1041
1043
  ${source.replace(/<\/(script)/gi, "<\\/$1")}
1042
1044
  }).call(window, __hfScopedDocument, __hfScopedGsap, __hfScopedWindow, __hfScopedHyperframes);
1043
1045
  } catch (_err) {
1044
1046
  console.error(__hfErrorLabel, __hfCompId, _err);
1047
+ } finally {
1048
+ if (typeof report === "function") report("finish", __hfCompositionSrc || "index.html");
1045
1049
  }
1046
1050
  };
1047
1051
  // What the script started on the global gsap timeline, by any route, for a scene swap to revert.
@@ -15,8 +15,9 @@ import {
15
15
  ancestor,
16
16
  full,
17
17
  parse,
18
+ parseExpressionAt,
18
19
  simple
19
- } from "./chunk-2PSPARWP.js";
20
+ } from "./chunk-TYXH3EKP.js";
20
21
  import {
21
22
  __toESM
22
23
  } from "./chunk-M2WBOQ2Q.js";
@@ -2195,19 +2196,19 @@ function collectIdentifierBindingIndex(ast) {
2195
2196
  }
2196
2197
  }
2197
2198
  function addBinding(bindings, scopeNode, name, selector) {
2198
- let scoped = bindings.get(scopeNode);
2199
+ let scoped = bindings.byScope.get(scopeNode);
2199
2200
  if (!scoped) {
2200
2201
  scoped = /* @__PURE__ */ new Map();
2201
- bindings.set(scopeNode, scoped);
2202
+ bindings.byScope.set(scopeNode, scoped);
2202
2203
  }
2203
2204
  if (!scoped.has(name)) scoped.set(name, selector);
2204
2205
  }
2205
2206
  function lookupBindingFromAncestors(name, ancestors, bindings) {
2206
2207
  for (const scopeNode of scopeChainFromAncestors(ancestors)) {
2207
- const selector = bindings.get(scopeNode)?.get(name);
2208
+ const selector = bindings.byScope.get(scopeNode)?.get(name);
2208
2209
  if (selector !== void 0) return selector;
2209
2210
  }
2210
- return bindings.get(null)?.get(name) ?? null;
2211
+ return bindings.byScope.get(null)?.get(name) ?? null;
2211
2212
  }
2212
2213
  function isFunctionNode2(node) {
2213
2214
  return node?.type === "ArrowFunctionExpression" || node?.type === "FunctionExpression" || node?.type === "FunctionDeclaration";
@@ -2246,7 +2247,7 @@ function collectScopeBindings(ast) {
2246
2247
  return bindings;
2247
2248
  }
2248
2249
  function collectTargetBindings(ast, scope, identifierBindings) {
2249
- const bindings = /* @__PURE__ */ new Map();
2250
+ const bindings = { byScope: /* @__PURE__ */ new Map(), identifiers: identifierBindings };
2250
2251
  ancestor(ast, {
2251
2252
  VariableDeclarator(node, _, ancestors) {
2252
2253
  const name = node.id?.name;
@@ -2327,7 +2328,18 @@ function resolveTargetSelector(node, ancestors, scope, bindings) {
2327
2328
  return typeof node.value === "string" ? node.value : null;
2328
2329
  }
2329
2330
  if (node.type === "Identifier") {
2330
- return lookupBindingFromAncestors(node.name, ancestors, bindings);
2331
+ const bound = lookupBindingFromAncestors(node.name, ancestors, bindings);
2332
+ if (bound) return bound;
2333
+ const declaration = findVisibleIdentifierDeclaration(
2334
+ node.name,
2335
+ ancestors,
2336
+ bindings.identifiers,
2337
+ node.start
2338
+ );
2339
+ if (declaration?.kind !== "const" || bindings.identifiers.reassignedDeclarations.has(declaration.node))
2340
+ return null;
2341
+ const literal = resolveNode(declaration.node.init, scope);
2342
+ return typeof literal === "string" ? literal : null;
2331
2343
  }
2332
2344
  if (node.type === "CallExpression") {
2333
2345
  return selectorFromQueryCall(node, scope);
@@ -2352,7 +2364,7 @@ function describeProxyTarget(targetNode, varsNode, scope) {
2352
2364
  const onUpdate = findPropertyNode(varsNode, "onUpdate");
2353
2365
  const driven = onUpdate ? drivenDomChannel(onUpdate) : void 0;
2354
2366
  if (driven) return `proxy \u2192 ${driven}`;
2355
- return "dwell/hold";
2367
+ return objNode.properties.length === 0 && !onUpdate ? "dwell/hold" : "proxy (unresolved DOM association)";
2356
2368
  }
2357
2369
  function isStyleAssignmentTarget(left) {
2358
2370
  return left?.type === "MemberExpression" && left.object?.type === "MemberExpression" && left.object.property?.name === "style" && !!left.property?.name;
@@ -2871,6 +2883,8 @@ function tweenCallToAnimation(call, scope, source, identifierBindings) {
2871
2883
  duration,
2872
2884
  ease
2873
2885
  };
2886
+ if (["stagger", "repeat", "repeatDelay", "delay"].some((key) => findPropertyNode(call.varsArg, key)))
2887
+ anim.inspectionTiming = inspectionTiming(call.varsArg, scope);
2874
2888
  if (targetIdentity) anim.targetIdentity = targetIdentity;
2875
2889
  if (!hasPositionArg) anim.implicitPosition = true;
2876
2890
  let group = classifyTweenPropertyGroup(properties);
@@ -2893,14 +2907,51 @@ function tweenCallToAnimation(call, scope, source, identifierBindings) {
2893
2907
  if (provenance) anim.provenance = provenance;
2894
2908
  return anim;
2895
2909
  }
2910
+ function inspectionTiming(varsNode, scope) {
2911
+ const numeric2 = (key) => {
2912
+ const node2 = findPropertyNode(varsNode, key);
2913
+ if (!node2) return 0;
2914
+ const value = resolveNode(node2, scope);
2915
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
2916
+ };
2917
+ const node = findPropertyNode(varsNode, "stagger");
2918
+ let stagger = { each: 0 };
2919
+ if (node) {
2920
+ const value = resolveNode(node, scope);
2921
+ stagger = typeof value === "number" ? { each: value } : null;
2922
+ if (node.type === "ObjectExpression" && !(node.properties ?? []).some(
2923
+ (p) => !["each", "amount", "from", "ease", "axis", "grid"].includes(propKeyName(p) ?? "")
2924
+ )) {
2925
+ const each = resolveNode(findPropertyNode(node, "each"), scope);
2926
+ const amount = resolveNode(findPropertyNode(node, "amount"), scope);
2927
+ if (!findPropertyNode(node, "grid") && !findPropertyNode(node, "axis")) {
2928
+ if (typeof amount === "number") stagger = { amount };
2929
+ else if (typeof each === "number") stagger = { each };
2930
+ }
2931
+ }
2932
+ }
2933
+ return {
2934
+ repeat: numeric2("repeat"),
2935
+ repeatDelay: numeric2("repeatDelay"),
2936
+ delay: numeric2("delay"),
2937
+ stagger
2938
+ };
2939
+ }
2896
2940
  function staggerAmount(raw) {
2897
2941
  if (typeof raw === "number") return raw;
2898
2942
  if (typeof raw !== "string") return void 0;
2899
2943
  const src = raw.startsWith("__raw:") ? raw.slice(6) : raw;
2900
- const m = /(?:each\s*:\s*)?(-?\d+(?:\.\d+)?)/.exec(src);
2901
- if (!m) return void 0;
2902
- const n2 = Number.parseFloat(m[1]);
2903
- return Number.isFinite(n2) ? n2 : void 0;
2944
+ try {
2945
+ const node = parseExpressionAt(src, 0, { ecmaVersion: "latest" });
2946
+ if (src.slice(node.end).trim()) return void 0;
2947
+ const value = resolveNode(
2948
+ node.type === "ObjectExpression" ? findPropertyNode(node, "each") : node,
2949
+ /* @__PURE__ */ new Map()
2950
+ );
2951
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
2952
+ } catch {
2953
+ return void 0;
2954
+ }
2904
2955
  }
2905
2956
  function restValue(prop) {
2906
2957
  return prop === "opacity" || prop.startsWith("scale") ? 1 : 0;
@@ -20,7 +20,7 @@ import {
20
20
  SDR_RGB_TO_BT709_FILTER,
21
21
  SDR_RGB_TO_TAGGED_BT709_FILTER,
22
22
  renderProvenanceArgs
23
- } from "./chunk-IZPN423R.js";
23
+ } from "./chunk-2F6LWCSF.js";
24
24
 
25
25
  // src/background-removal/pipeline.ts
26
26
  import { spawn } from "child_process";
@@ -270,7 +270,7 @@ function inferInputKind(inputPath) {
270
270
  }
271
271
  async function probeMedia(inputPath) {
272
272
  const isImage = inferInputKind(inputPath) === "image";
273
- const engine = await import("./src-2NN2WB6X.js");
273
+ const engine = await import("./src-YMUDUVXQ.js");
274
274
  const meta = await engine.extractMediaMetadata(inputPath);
275
275
  if (isImage) {
276
276
  return { width: meta.width, height: meta.height, fps: 0, frameCount: 1 };
@@ -14,14 +14,14 @@ import {
14
14
  isAllowedHtmlAttribute,
15
15
  isSafeAttributeValue,
16
16
  sanitizeRichTextChildren
17
- } from "./chunk-XQKVEQNY.js";
17
+ } from "./chunk-ZDEEHQ2Y.js";
18
18
  import {
19
19
  decodedUrlPath,
20
20
  removeElementWithGsapCascade
21
- } from "./chunk-LFNQDTSH.js";
21
+ } from "./chunk-VYKPBRCB.js";
22
22
  import {
23
23
  require_dist
24
- } from "./chunk-GNTVYF7E.js";
24
+ } from "./chunk-YOEGUBBY.js";
25
25
  import {
26
26
  readClipTiming,
27
27
  writeClipTiming
@@ -19,10 +19,10 @@ import {
19
19
  import {
20
20
  formatVariableValidationIssue,
21
21
  validateVariables
22
- } from "./chunk-XQKVEQNY.js";
22
+ } from "./chunk-ZDEEHQ2Y.js";
23
23
  import {
24
24
  extractCompositionMetadata
25
- } from "./chunk-LFNQDTSH.js";
25
+ } from "./chunk-VYKPBRCB.js";
26
26
 
27
27
  // src/utils/variables.ts
28
28
  import { readFileSync } from "fs";
@@ -0,0 +1,30 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+
8
+ // src/utils/checkSnapshotDirectory.ts
9
+ import { randomUUID } from "crypto";
10
+ import { join, resolve } from "path";
11
+ var runDirectories = /* @__PURE__ */ new Map();
12
+ function checkSnapshotDirectory(projectDir) {
13
+ const project = resolve(projectDir);
14
+ let directory = runDirectories.get(project);
15
+ if (!directory) {
16
+ directory = join(project, ".hyperframes", "artifacts", "snapshots", randomUUID());
17
+ runDirectories.set(project, directory);
18
+ }
19
+ return directory;
20
+ }
21
+
22
+ // src/utils/checkTypes.ts
23
+ function rectToBbox(rect) {
24
+ return { x: rect.left, y: rect.top, width: rect.width, height: rect.height };
25
+ }
26
+
27
+ export {
28
+ checkSnapshotDirectory,
29
+ rectToBbox
30
+ };
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-ISN5GRYI.js";
18
18
  import {
19
19
  VERSION
20
- } from "./chunk-TCWMDCBX.js";
20
+ } from "./chunk-2X3UJ4Q3.js";
21
21
 
22
22
  // src/utils/updateCheck.ts
23
23
  import { existsSync, readFileSync } from "fs";
@@ -25,7 +25,7 @@ import {
25
25
  extractMediaSrcMutations,
26
26
  isSafeMediaUrl,
27
27
  resolveAliasDisplayName
28
- } from "./chunk-APDLWWFG.js";
28
+ } from "./chunk-3VGU2SH7.js";
29
29
  import {
30
30
  findFfBinary
31
31
  } from "./chunk-VAS6HQX3.js";
@@ -49,7 +49,7 @@ import {
49
49
  import {
50
50
  parse,
51
51
  simple
52
- } from "./chunk-2PSPARWP.js";
52
+ } from "./chunk-TYXH3EKP.js";
53
53
  import {
54
54
  isSceneLikeCompositionId,
55
55
  parseSlideshowManifest,
@@ -7437,18 +7437,18 @@ function deriveDurationFromClips(tags, rootTag) {
7437
7437
  return resolveCompositionDuration({ authoredDurationSeconds: null, clipEndsSeconds: clipEnds });
7438
7438
  }
7439
7439
  async function loadParseGsapScript() {
7440
- const mod = await import("./gsapParserAcorn-VXZ3ZIF2.js");
7440
+ const mod = await import("./gsapParserAcorn-7NCK2LVT.js");
7441
7441
  return mod.parseGsapScriptAcorn;
7442
7442
  }
7443
7443
  async function loadGsapScriptMotionPathFirstUseIndex() {
7444
- const mod = await import("./gsapParserAcorn-VXZ3ZIF2.js");
7444
+ const mod = await import("./gsapParserAcorn-7NCK2LVT.js");
7445
7445
  return mod.gsapScriptMotionPathFirstUseIndex;
7446
7446
  }
7447
7447
  var SCENE_BOUNDARY_EPSILON_SECONDS = 0.05;
7448
7448
  var UNRESOLVED_TARGET = "__unresolved__";
7449
7449
  function targetHasNoStableIdentity(selector, identity) {
7450
7450
  if (identity) return false;
7451
- return selector === UNRESOLVED_TARGET || selector === "dwell/hold" || selector.startsWith("proxy \u2192 ");
7451
+ return selector === UNRESOLVED_TARGET || selector === "dwell/hold" || selector.startsWith("proxy ");
7452
7452
  }
7453
7453
  function unwrapRaw(value) {
7454
7454
  if (typeof value === "number") return value;
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-HVW7ABXD.js";
13
13
  import {
14
14
  DEFAULT_REGISTRY_URL
15
- } from "./chunk-YZTVHRJ2.js";
15
+ } from "./chunk-2XEBNYG5.js";
16
16
 
17
17
  // src/utils/projectConfig.ts
18
18
  import { readFileSync, writeFileSync } from "fs";
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-AWDFDFI3.js";
15
15
  import {
16
16
  isBlockedNetworkHost
17
- } from "./chunk-IZPN423R.js";
17
+ } from "./chunk-2F6LWCSF.js";
18
18
  import {
19
19
  DOMParser,
20
20
  parseHTML
@@ -9,7 +9,7 @@ import {
9
9
  parseStrictFiniteTimingNumber,
10
10
  resolveNaturalMediaTimelineDuration,
11
11
  resolveTimedImageDurationSeconds
12
- } from "./chunk-QBYHNRHU.js";
12
+ } from "./chunk-GV7I3ZSQ.js";
13
13
  import {
14
14
  CANVAS_DIMENSIONS,
15
15
  isCompositionElement,
@@ -17,7 +17,7 @@ import {
17
17
  isTextElement,
18
18
  keyframesToGsapAnimations,
19
19
  serializeGsapAnimations
20
- } from "./chunk-LFNQDTSH.js";
20
+ } from "./chunk-VYKPBRCB.js";
21
21
  import {
22
22
  COMPOSITION_ATTRIBUTES,
23
23
  parseStartExpression
@@ -0,0 +1,215 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ DEFAULT_HISTORY_ROOT,
9
+ HistoryBusyError,
10
+ MAX_WINDOW_IDLE_MS,
11
+ openProjectHistory,
12
+ readProjectHistory
13
+ } from "./chunk-7FYFEXD2.js";
14
+ import {
15
+ resolveProject
16
+ } from "./chunk-JQ57FAYN.js";
17
+ import {
18
+ findPreviewServerForProject,
19
+ studioApiUrl
20
+ } from "./chunk-DQBY7FRR.js";
21
+
22
+ // src/utils/historyOwner.ts
23
+ import { randomUUID } from "crypto";
24
+ import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "fs";
25
+ import { dirname, join, resolve } from "path";
26
+ var historyDeps = {
27
+ historyRoot: resolve(process.env.HYPERFRAMES_HISTORY_ROOT || DEFAULT_HISTORY_ROOT),
28
+ findServer: (projectDir) => findPreviewServerForProject(projectDir),
29
+ /** A turn with no write for this long has ended, through a preview or not. */
30
+ turnIdleMs: MAX_WINDOW_IDLE_MS,
31
+ ownerWaitMs: void 0,
32
+ now: () => Date.now()
33
+ };
34
+ var Refusal = class extends Error {
35
+ };
36
+ var turnFile = (dir) => join(dir, ".hyperframes", "history-turn.json");
37
+ function readTurn(dir) {
38
+ try {
39
+ const turn = JSON.parse(readFileSync(turnFile(dir), "utf-8"));
40
+ return typeof turn.lastWriteAt === "number" ? { ...turn, parts: turn.parts ?? [] } : null;
41
+ } catch {
42
+ return null;
43
+ }
44
+ }
45
+ function writeTurn(dir, turn) {
46
+ if (!turn) return rmSync(turnFile(dir), { force: true });
47
+ mkdirSync(dirname(turnFile(dir)), { recursive: true });
48
+ writeFileSync(turnFile(dir), JSON.stringify(turn));
49
+ }
50
+ var lastTurnsFile = (dir) => join(dir, ".hyperframes", "history-turns.json");
51
+ function readLastTurns(dir) {
52
+ try {
53
+ const turns = JSON.parse(readFileSync(lastTurnsFile(dir), "utf-8"));
54
+ return turns && typeof turns === "object" ? turns : {};
55
+ } catch {
56
+ return {};
57
+ }
58
+ }
59
+ function lastTurnParts(dir, name) {
60
+ return readLastTurns(dir)[name] ?? null;
61
+ }
62
+ var samePart = (a, b) => a.who.kind === b.who.kind && a.who.name === b.who.name && a.label === b.label && a.startedAt === b.startedAt;
63
+ async function endTurn(owner, turn, dir) {
64
+ const entry = await owner.end(turn.id);
65
+ const cut = (await owner.list()).filter((other) => samePart(other, entry ?? turn));
66
+ const own = entry ? [entry.id] : [];
67
+ const parts = [.../* @__PURE__ */ new Set([...turn.parts, ...cut.map((part) => part.id), ...own])];
68
+ const draft = `${lastTurnsFile(dir)}.${process.pid}.tmp`;
69
+ mkdirSync(dirname(draft), { recursive: true });
70
+ writeFileSync(draft, JSON.stringify({ ...readLastTurns(dir), [turn.who.name]: parts }));
71
+ renameSync(draft, lastTurnsFile(dir));
72
+ writeTurn(dir, null);
73
+ return { entry, parts };
74
+ }
75
+ function previewOwner(route) {
76
+ const call = async (path, body, signal) => {
77
+ const init = {
78
+ ...body && {
79
+ method: "POST",
80
+ headers: { "content-type": "application/json" },
81
+ body: JSON.stringify(body)
82
+ },
83
+ ...signal && { signal }
84
+ };
85
+ const response = await fetch(route(path), init);
86
+ if (response.ok) return response;
87
+ const error = await response.json().catch(() => null);
88
+ throw new Refusal(error?.error ?? `The preview answered ${response.status}.`);
89
+ };
90
+ const json = async (path, body, signal) => (await call(path, body, signal)).json();
91
+ const list = async () => (await json("")).entries;
92
+ return {
93
+ via: "preview",
94
+ list,
95
+ peek: async (point) => (await json(`/peek/${encodeURIComponent(point)}`)).files,
96
+ blob: async (hash) => Buffer.from(await (await call(`/blob/${hash}`)).arrayBuffer()),
97
+ undo: (id, who, mode) => json("/undo", { entryId: id, who, mode }),
98
+ restore: (point, who) => json("/restore", { point, who }),
99
+ pin: async (id, pinned) => void await json("/pin", { entryId: id, pinned }),
100
+ begin: async (who, label, exclusive) => {
101
+ const opened = await json("/window", {
102
+ who,
103
+ label,
104
+ idleMs: historyDeps.turnIdleMs,
105
+ ...exclusive && { exclusive: true }
106
+ });
107
+ return { id: opened.windowId, startedAt: opened.startedAt ?? historyDeps.now() };
108
+ },
109
+ // A preview restarted since begin committed the window on its way down.
110
+ end: (id) => json(`/window/${id}/close`, {}).then((closed) => closed.entry).catch(async () => (await list()).find((entry) => entry.id === id) ?? null),
111
+ checkpoint: async () => void await json("/checkpoint", {}, AbortSignal.timeout(5e3)),
112
+ close: async () => {
113
+ }
114
+ };
115
+ }
116
+ async function directOwner(projectDir) {
117
+ let turn = null;
118
+ const history = await openProjectHistory({
119
+ projectDir,
120
+ historyRoot: historyDeps.historyRoot,
121
+ now: () => historyDeps.now(),
122
+ pruneGoneProjectsBudgetMs: 1e3,
123
+ ownerWaitMs: historyDeps.ownerWaitMs,
124
+ closedWindowAfterOwnership: () => {
125
+ turn = readTurn(projectDir);
126
+ return turn ? {
127
+ id: turn.id,
128
+ who: turn.who,
129
+ label: turn.label,
130
+ startedAt: turn.startedAt,
131
+ lastWriteAt: turn.lastWriteAt,
132
+ idleMs: historyDeps.turnIdleMs
133
+ } : void 0;
134
+ }
135
+ });
136
+ return {
137
+ turn,
138
+ owner: {
139
+ via: "direct",
140
+ list: async () => history.list(),
141
+ peek: async (point) => history.peek(point),
142
+ blob: (hash) => history.readBlob(hash),
143
+ undo: (id, who, mode) => history.undo(id, { who, ...mode && { mode } }),
144
+ restore: (point, who) => history.restore(point, who),
145
+ pin: async (id, pinned) => history.pin(id, pinned),
146
+ // Opening filed every earlier write; the turn's own writes are filed to it when the next open passes it.
147
+ begin: async () => ({ id: randomUUID(), startedAt: historyDeps.now() }),
148
+ end: async (id) => history.list().find((entry) => entry.id === id) ?? null,
149
+ checkpoint: () => history.checkpoint(),
150
+ close: () => history.close()
151
+ }
152
+ };
153
+ }
154
+ async function connect(projectDir) {
155
+ const server = await historyDeps.findServer(projectDir);
156
+ if (server) {
157
+ const route = (path) => studioApiUrl(server, `history${path}`);
158
+ const status = await fetch(route("")).then(
159
+ (response) => response.status,
160
+ () => 404
161
+ );
162
+ if (status !== 404) return { owner: previewOwner(route), turn: readTurn(projectDir) };
163
+ }
164
+ return directOwner(projectDir);
165
+ }
166
+ async function withOwner(dir, task) {
167
+ const { dir: projectDir } = resolveProject(dir);
168
+ const { owner, turn } = await connect(projectDir);
169
+ try {
170
+ return await task(owner, turn, projectDir);
171
+ } finally {
172
+ try {
173
+ if (owner.via === "direct" && turn) {
174
+ const kept = (await owner.list()).find((entry) => entry.id === turn.id);
175
+ if (readTurn(projectDir)?.id === turn.id) {
176
+ const lastWriteAt = kept ? kept.endedAt : turn.lastWriteAt;
177
+ const parts = kept ? [...turn.parts, kept.id] : turn.parts;
178
+ writeTurn(projectDir, { ...turn, via: "direct", id: randomUUID(), lastWriteAt, parts });
179
+ }
180
+ }
181
+ } finally {
182
+ await owner.close();
183
+ }
184
+ }
185
+ }
186
+ async function withReader(dir, task) {
187
+ try {
188
+ return await withOwner(dir, (owner) => task(owner));
189
+ } catch (error) {
190
+ if (!(error instanceof HistoryBusyError)) throw error;
191
+ }
192
+ const view = readProjectHistory({
193
+ projectDir: resolveProject(dir).dir,
194
+ historyRoot: historyDeps.historyRoot
195
+ });
196
+ return task({
197
+ via: "direct",
198
+ list: async () => view.list(),
199
+ peek: async (point) => view.peek(point),
200
+ // The owner may have pruned a blob since its log was read.
201
+ blob: (hash) => view.readBlob(hash).catch((error) => {
202
+ throw error.code === "ENOENT" ? new Refusal("That point is no longer kept") : error;
203
+ })
204
+ });
205
+ }
206
+
207
+ export {
208
+ historyDeps,
209
+ Refusal,
210
+ writeTurn,
211
+ lastTurnParts,
212
+ endTurn,
213
+ withOwner,
214
+ withReader
215
+ };