hyperframes 0.7.83 → 0.7.85

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/cli.js CHANGED
@@ -50,7 +50,7 @@ var VERSION;
50
50
  var init_version = __esm({
51
51
  "src/version.ts"() {
52
52
  "use strict";
53
- VERSION = true ? "0.7.83" : "0.0.0-dev";
53
+ VERSION = true ? "0.7.85" : "0.0.0-dev";
54
54
  }
55
55
  });
56
56
 
@@ -66200,6 +66200,12 @@ function appendBrowserDiagnostic(session, text2) {
66200
66200
  }
66201
66201
  async function collectSessionInitTelemetry(page, initStart) {
66202
66202
  const initDurationMs = Date.now() - initStart;
66203
+ let elementCount;
66204
+ try {
66205
+ elementCount = await page.evaluate(() => document.getElementsByTagName("*").length);
66206
+ } catch {
66207
+ elementCount = void 0;
66208
+ }
66203
66209
  let tweenCount = 0;
66204
66210
  try {
66205
66211
  tweenCount = await page.evaluate(() => {
@@ -66222,14 +66228,16 @@ async function collectSessionInitTelemetry(page, initStart) {
66222
66228
  } catch {
66223
66229
  tweenCount = 0;
66224
66230
  }
66225
- return { initDurationMs, tweenCount };
66231
+ return { initDurationMs, tweenCount, elementCount };
66226
66232
  }
66227
66233
  async function recordSessionInitTelemetry(session, initStart) {
66228
66234
  const telemetry = await collectSessionInitTelemetry(session.page, initStart);
66229
66235
  session.initTelemetry = telemetry;
66230
66236
  appendBrowserDiagnostic(
66231
66237
  session,
66232
- `[FrameCapture:INIT] complete initDurationMs=${telemetry.initDurationMs} tweenCount=${telemetry.tweenCount}`
66238
+ `[FrameCapture:INIT] complete initDurationMs=${telemetry.initDurationMs} tweenCount=${telemetry.tweenCount}` + // Omitted rather than zeroed when unmeasured, so the parser reports
66239
+ // absent instead of inventing an empty DOM.
66240
+ (telemetry.elementCount === void 0 ? "" : ` elementCount=${telemetry.elementCount}`)
66233
66241
  );
66234
66242
  }
66235
66243
  function sanitizeDiagnosticUrl(input2) {
@@ -68046,6 +68054,7 @@ function getCapturePerfSummary(session) {
68046
68054
  subTimelineWaitOutcome: session.subTimelineWaitOutcome,
68047
68055
  initDurationMs: session.initTelemetry?.initDurationMs,
68048
68056
  initTweenCount: session.initTelemetry?.tweenCount,
68057
+ initElementCount: session.initTelemetry?.elementCount,
68049
68058
  warnings: cloneCaptureWarnings(session.warnings),
68050
68059
  staticDedupReused: session.staticDedupCount ?? 0,
68051
68060
  staticDedupEnabled: session.staticDedupEnabled ?? false,
@@ -74692,6 +74701,9 @@ function decodeUrlPathVariants2(path2) {
74692
74701
  function isRemoteOrInlineUrl(url) {
74693
74702
  return /^(https?:|data:|blob:|\/\/|#)/i.test(url);
74694
74703
  }
74704
+ function hasUnresolvedTemplatingToken(url) {
74705
+ return /<<[^<>]+>>|\{\{[^{}]+\}\}|\$\{[^{}]+\}/.test(url);
74706
+ }
74695
74707
  function cleanAssetUrl(url) {
74696
74708
  return url.trim().split(/[?#]/, 1)[0] ?? "";
74697
74709
  }
@@ -78406,7 +78418,9 @@ function collectLocalVideoCandidates(projectDir, htmlSources) {
78406
78418
  const re2 = new RegExp(videoSrcRe.source, videoSrcRe.flags);
78407
78419
  let match;
78408
78420
  while ((match = re2.exec(scannable)) !== null) {
78409
- const src = cleanAssetUrl(match[1] ?? "");
78421
+ const rawSrc = match[1] ?? "";
78422
+ if (hasUnresolvedTemplatingToken(rawSrc)) continue;
78423
+ const src = cleanAssetUrl(rawSrc);
78410
78424
  if (!src) continue;
78411
78425
  if (isRemoteOrInlineUrl(src)) continue;
78412
78426
  if (/^__[A-Z_]+__$/.test(src)) continue;
@@ -78632,6 +78646,7 @@ function lintAudioSrcNotFound(projectDir, htmlSources) {
78632
78646
  const src = match[1];
78633
78647
  if (/^(https?:|data:|blob:)/i.test(src)) continue;
78634
78648
  if (/^__[A-Z_]+__$/.test(src)) continue;
78649
+ if (hasUnresolvedTemplatingToken(src)) continue;
78635
78650
  const rootRelative = compSrcPath ? rewriteAssetPath(compSrcPath, src) : src;
78636
78651
  if (!resolveLocalAssetCandidates(projectDir, rootRelative).some(existsSync11)) {
78637
78652
  missingSrcs.push(src);
@@ -78660,6 +78675,7 @@ function lintMissingLocalAsset(projectDir, htmlSources) {
78660
78675
  while ((match = re2.exec(scannable)) !== null) {
78661
78676
  const tagName19 = (match[1] ?? "").toLowerCase();
78662
78677
  const rawSrc = match[2] ?? "";
78678
+ if (hasUnresolvedTemplatingToken(rawSrc)) continue;
78663
78679
  const src = cleanAssetUrl(rawSrc);
78664
78680
  if (!src) continue;
78665
78681
  if (isRemoteOrInlineUrl(src)) continue;
@@ -78695,6 +78711,7 @@ function lintTextureMaskAssetNotFound(projectDir, htmlSources) {
78695
78711
  const pattern = new RegExp(MASK_IMAGE_URL_RE.source, MASK_IMAGE_URL_RE.flags);
78696
78712
  while ((match = pattern.exec(cssSource.content)) !== null) {
78697
78713
  const rawUrl = match[1] ?? match[2] ?? match[3] ?? "";
78714
+ if (hasUnresolvedTemplatingToken(rawUrl)) continue;
78698
78715
  const url = cleanAssetUrl(rawUrl);
78699
78716
  if (!url || isRemoteOrInlineUrl(url)) continue;
78700
78717
  if (/^__[A-Z_]+__$/.test(url)) continue;
@@ -78802,6 +78819,7 @@ function lintMissingOrEmptySubComposition(projectDir, rootHtml) {
78802
78819
  const srcPath = (match[1] ?? "").trim();
78803
78820
  if (!srcPath) continue;
78804
78821
  if (/^__[A-Z_]+__$/.test(srcPath)) continue;
78822
+ if (hasUnresolvedTemplatingToken(srcPath)) continue;
78805
78823
  const filePath = resolve8(projectDir, srcPath);
78806
78824
  if (visited.has(filePath)) continue;
78807
78825
  visited.add(filePath);
@@ -89106,7 +89124,8 @@ function renderObservabilityEventProperties(props) {
89106
89124
  observability_extract_cache_hits: props.observabilityExtractCacheHits,
89107
89125
  observability_extract_cache_misses: props.observabilityExtractCacheMisses,
89108
89126
  observability_init_duration_ms: props.observabilityInitDurationMs,
89109
- observability_init_tween_count: props.observabilityInitTweenCount
89127
+ observability_init_tween_count: props.observabilityInitTweenCount,
89128
+ observability_init_element_count: props.observabilityInitElementCount
89110
89129
  };
89111
89130
  }
89112
89131
  function redactTelemetryMessage(value) {
@@ -96132,7 +96151,8 @@ function renderObservabilityTelemetryPayload(observability) {
96132
96151
  observabilityExtractCacheHits: extraction?.cacheHits,
96133
96152
  observabilityExtractCacheMisses: extraction?.cacheMisses,
96134
96153
  observabilityInitDurationMs: init?.initDurationMs,
96135
- observabilityInitTweenCount: init?.tweenCount
96154
+ observabilityInitTweenCount: init?.tweenCount,
96155
+ observabilityInitElementCount: init?.elementCount
96136
96156
  };
96137
96157
  }
96138
96158
  function renderJobObservabilityTelemetryPayload(job) {
@@ -110999,13 +111019,17 @@ function maxReading(current2, next) {
110999
111019
  function summarizeInitObservability(lines, fallback) {
111000
111020
  let initDurationMs = fallback?.initDurationMs;
111001
111021
  let tweenCount = fallback?.tweenCount;
111022
+ let elementCount = fallback?.elementCount;
111002
111023
  for (const line2 of lines) {
111003
111024
  if (!line2.includes("[FrameCapture:INIT]")) continue;
111004
111025
  initDurationMs = maxReading(initDurationMs, readUnsignedIntAfter(line2, "initDurationMs="));
111005
111026
  tweenCount = maxReading(tweenCount, readUnsignedIntAfter(line2, "tweenCount="));
111027
+ elementCount = maxReading(elementCount, readUnsignedIntAfter(line2, "elementCount="));
111028
+ }
111029
+ if (initDurationMs === void 0 && tweenCount === void 0 && elementCount === void 0) {
111030
+ return void 0;
111006
111031
  }
111007
- if (initDurationMs === void 0 && tweenCount === void 0) return void 0;
111008
- return { initDurationMs, tweenCount };
111032
+ return { initDurationMs, tweenCount, elementCount };
111009
111033
  }
111010
111034
  function summarizeBrowserDiagnostics(lines) {
111011
111035
  let errors = 0;
@@ -121783,10 +121807,15 @@ function envInt(name, fallback) {
121783
121807
  const raw = process.env[name];
121784
121808
  if (raw === void 0 || raw.trim() === "") return fallback;
121785
121809
  const parsed = Number(raw);
121786
- return Number.isFinite(parsed) ? parsed : fallback;
121810
+ return Number.isInteger(parsed) ? parsed : fallback;
121787
121811
  }
121788
121812
  function countElementTags(html) {
121789
- const matches2 = html.match(
121813
+ let markup = html;
121814
+ for (let previous = ""; markup !== previous; ) {
121815
+ previous = markup;
121816
+ markup = markup.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, "");
121817
+ }
121818
+ const matches2 = markup.match(
121790
121819
  /<\/[a-zA-Z]|<(?:img|br|hr|input|source|track|area|base|col|embed|link|meta|param|wbr)\b|<[a-zA-Z][-a-zA-Z0-9]*\b[^>]*\/>/gi
121791
121820
  );
121792
121821
  return matches2 === null ? 0 : matches2.length;
@@ -121795,7 +121824,9 @@ async function resolveCompositionElementCount(probeSession, html) {
121795
121824
  if (probeSession?.isInitialized) {
121796
121825
  try {
121797
121826
  const liveCount = await probeSession.page.evaluate(
121798
- () => document.querySelectorAll("*").length
121827
+ // Live HTMLCollection length — avoids materializing a static NodeList
121828
+ // on the large-DOM comps this gate exists to catch (review nit).
121829
+ () => document.getElementsByTagName("*").length
121799
121830
  );
121800
121831
  if (typeof liveCount === "number" && Number.isFinite(liveCount)) {
121801
121832
  return { count: liveCount, source: "live" };
@@ -121808,6 +121839,7 @@ async function resolveCompositionElementCount(probeSession, html) {
121808
121839
  function mergeWorkerInitObservability(perfs) {
121809
121840
  let initDurationMs;
121810
121841
  let tweenCount;
121842
+ let elementCount;
121811
121843
  for (const perf of perfs) {
121812
121844
  if (perf.initDurationMs !== void 0) {
121813
121845
  initDurationMs = initDurationMs === void 0 ? perf.initDurationMs : Math.max(initDurationMs, perf.initDurationMs);
@@ -121815,9 +121847,14 @@ function mergeWorkerInitObservability(perfs) {
121815
121847
  if (perf.initTweenCount !== void 0) {
121816
121848
  tweenCount = tweenCount === void 0 ? perf.initTweenCount : Math.max(tweenCount, perf.initTweenCount);
121817
121849
  }
121850
+ if (perf.initElementCount !== void 0) {
121851
+ elementCount = elementCount === void 0 ? perf.initElementCount : Math.max(elementCount, perf.initElementCount);
121852
+ }
121818
121853
  }
121819
- if (initDurationMs === void 0 && tweenCount === void 0) return void 0;
121820
- return { initDurationMs, tweenCount };
121854
+ if (initDurationMs === void 0 && tweenCount === void 0 && elementCount === void 0) {
121855
+ return void 0;
121856
+ }
121857
+ return { initDurationMs, tweenCount, elementCount };
121821
121858
  }
121822
121859
  function resolveDeShortBand(args) {
121823
121860
  const decisive = args.bandEnabled && args.invertAtBandFloor && !args.invertAtBaseFloor;
@@ -131139,7 +131176,7 @@ var init_init = __esm({
131139
131176
  console.log(
131140
131177
  ` ${c.dim('"Using /hyperframes, create a 15-second intro about [your topic]"')}`
131141
131178
  );
131142
- console.log(` ${c.dim("More patterns: hyperframes.heygen.com/guides/prompting")}`);
131179
+ console.log(` ${c.dim("More patterns: hyperframes.heygen.com/prompting/overview")}`);
131143
131180
  console.log();
131144
131181
  console.log(` ${c.accent("4.")} Preview in the browser:`);
131145
131182
  console.log(` ${c.accent(`cd ${name2}`)} && ${c.accent("npm run dev")}`);
@@ -190268,6 +190305,20 @@ function svgContentHashSlug(svgSource, isLogo) {
190268
190305
  const hash2 = createHash18("sha1").update(svgSource).digest("hex").slice(0, 8);
190269
190306
  return isLogo ? `logo-${hash2}` : `svg-${hash2}`;
190270
190307
  }
190308
+ function toStandaloneSvg(outerHTML) {
190309
+ const open3 = outerHTML.match(/<svg\b[^>]*>/i);
190310
+ if (!open3) return outerHTML;
190311
+ const original = open3[0];
190312
+ let tag = original;
190313
+ const add2 = [];
190314
+ if (!/\sxmlns\s*=/i.test(tag)) add2.push('xmlns="http://www.w3.org/2000/svg"');
190315
+ if (/\sxlink:[a-z-]+\s*=/i.test(outerHTML) && !/\sxmlns:xlink\s*=/i.test(tag)) {
190316
+ add2.push('xmlns:xlink="http://www.w3.org/1999/xlink"');
190317
+ }
190318
+ if (!add2.length) return outerHTML;
190319
+ tag = tag.replace(/^<svg\b/i, `<svg ${add2.join(" ")}`);
190320
+ return outerHTML.replace(original, tag);
190321
+ }
190271
190322
  async function downloadAssets(tokens, outputDir, catalogedAssets, faviconLinks) {
190272
190323
  const assetsDir = join109(outputDir, "assets");
190273
190324
  mkdirSync53(assetsDir, { recursive: true });
@@ -190278,7 +190329,8 @@ async function downloadAssets(tokens, outputDir, catalogedAssets, faviconLinks)
190278
190329
  for (let i2 = 0; i2 < tokens.svgs.length && i2 < 30; i2++) {
190279
190330
  const svg = tokens.svgs[i2];
190280
190331
  if (!svg.outerHTML || svg.outerHTML.length < 50) continue;
190281
- const slug = svgContentHashSlug(svg.outerHTML, !!svg.isLogo);
190332
+ const svgFile = toStandaloneSvg(svg.outerHTML);
190333
+ const slug = svgContentHashSlug(svgFile, !!svg.isLogo);
190282
190334
  let finalSlug = slug;
190283
190335
  let suffix = 2;
190284
190336
  while (usedSvgNames.has(finalSlug)) {
@@ -190289,7 +190341,7 @@ async function downloadAssets(tokens, outputDir, catalogedAssets, faviconLinks)
190289
190341
  const name = `${finalSlug}.svg`;
190290
190342
  const localPath = `assets/svgs/${name}`;
190291
190343
  try {
190292
- writeFileSync45(join109(outputDir, localPath), svg.outerHTML, "utf-8");
190344
+ writeFileSync45(join109(outputDir, localPath), svgFile, "utf-8");
190293
190345
  assets.push({ url: "", localPath, type: "svg" });
190294
190346
  } catch {
190295
190347
  }
@@ -193276,10 +193328,50 @@ var init_scaffolding = __esm({
193276
193328
  // src/capture/screenshotCapture.ts
193277
193329
  var screenshotCapture_exports = {};
193278
193330
  __export(screenshotCapture_exports, {
193279
- captureScrollScreenshots: () => captureScrollScreenshots
193331
+ MAX_PLATE_HEIGHT_PX: () => MAX_PLATE_HEIGHT_PX,
193332
+ captureFullPagePlate: () => captureFullPagePlate,
193333
+ captureScrollScreenshots: () => captureScrollScreenshots,
193334
+ pngHeight: () => pngHeight
193280
193335
  });
193281
193336
  import { writeFileSync as writeFileSync50, mkdirSync as mkdirSync56 } from "fs";
193282
193337
  import { join as join117 } from "path";
193338
+ function pngHeight(buf) {
193339
+ if (buf.length < 24) return null;
193340
+ if (buf[12] !== 73 || buf[13] !== 72 || buf[14] !== 68 || buf[15] !== 82) return null;
193341
+ return (buf[20] << 24 | buf[21] << 16 | buf[22] << 8 | buf[23]) >>> 0;
193342
+ }
193343
+ async function captureFullPagePlate(page, screenshotsDir) {
193344
+ await page.evaluate(
193345
+ `document.querySelectorAll('*').forEach((el) => {
193346
+ const p = getComputedStyle(el).position;
193347
+ if (p === 'fixed' || p === 'sticky') {
193348
+ el.setAttribute('data-hf-plate-position', el.style.position || '');
193349
+ el.style.position = 'static';
193350
+ }
193351
+ })`
193352
+ );
193353
+ try {
193354
+ const docHeight = await page.evaluate(
193355
+ `Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)`
193356
+ );
193357
+ if (docHeight > MAX_PLATE_HEIGHT_PX) return null;
193358
+ const buffer = await page.screenshot({ type: "png", fullPage: true });
193359
+ const produced = pngHeight(buffer);
193360
+ if (produced != null && produced > MAX_PLATE_HEIGHT_PX) return null;
193361
+ writeFileSync50(join117(screenshotsDir, "full-page.png"), buffer);
193362
+ return "screenshots/full-page.png";
193363
+ } finally {
193364
+ try {
193365
+ await page.evaluate(
193366
+ `document.querySelectorAll('[data-hf-plate-position]').forEach((el) => {
193367
+ el.style.position = el.getAttribute('data-hf-plate-position');
193368
+ el.removeAttribute('data-hf-plate-position');
193369
+ })`
193370
+ );
193371
+ } catch {
193372
+ }
193373
+ }
193374
+ }
193283
193375
  async function captureScrollScreenshots(page, outputDir) {
193284
193376
  const screenshotsDir = join117(outputDir, "screenshots");
193285
193377
  mkdirSync56(screenshotsDir, { recursive: true });
@@ -193380,13 +193472,17 @@ async function captureScrollScreenshots(page, outputDir) {
193380
193472
  }
193381
193473
  await page.evaluate(`window.scrollTo(0, 0)`);
193382
193474
  await new Promise((r2) => setTimeout(r2, 200));
193475
+ const plate = await captureFullPagePlate(page, screenshotsDir);
193476
+ if (plate) filePaths.push(plate);
193383
193477
  } catch {
193384
193478
  }
193385
193479
  return filePaths;
193386
193480
  }
193481
+ var MAX_PLATE_HEIGHT_PX;
193387
193482
  var init_screenshotCapture = __esm({
193388
193483
  "src/capture/screenshotCapture.ts"() {
193389
193484
  "use strict";
193485
+ MAX_PLATE_HEIGHT_PX = 16384;
193390
193486
  }
193391
193487
  });
193392
193488
 
@@ -1,4 +1,4 @@
1
- "use strict";var HyperframesPlayer=(()=>{var J=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var Xe=(i,e)=>{for(var t in e)J(i,t,{get:e[t],enumerable:!0})},Ze=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of qe(e))!Ye.call(i,n)&&n!==t&&J(i,n,{get:()=>e[n],enumerable:!(r=Ge(e,n))||r.enumerable});return i};var Qe=i=>Ze(J({},"__esModule",{value:!0}),i);var Lt={};Xe(Lt,{HyperframesPlayer:()=>Q,SPEED_PRESETS:()=>te,formatSpeed:()=>N,formatTime:()=>$});function ye(i){return i.hasRuntime||i.runtimeInjected?!1:!!(i.hasNestedCompositions||i.hasTimelines&&i.attempts>=5)}function I(i){return typeof i=="object"&&i!==null}function Ee(i){return I(i)&&typeof i.getDuration=="function"}function Se(i){return I(i)&&typeof i.duration=="function"&&typeof i.time=="function"&&typeof i.seek=="function"&&typeof i.play=="function"&&typeof i.pause=="function"}var Je="https://cdn.jsdelivr.net/npm/@hyperframes/core@0.7.83/dist/hyperframe.runtime.iife.js";function D(i){if(i===null)return null;let e=Number.parseInt(i,10);return Number.isFinite(e)&&e>0?e:null}function Ke(i){let e=i?.querySelector("[data-composition-id][data-width][data-height]")??i?.querySelector("[data-width][data-height]");if(!e)return null;let t=D(e.getAttribute("data-width")),r=D(e.getAttribute("data-height"));return t!==null&&r!==null?{width:t,height:r}:null}var j=class{constructor(e,t){this._iframe=e;this._callbacks=t}_iframe;_callbacks;_interval=null;_runtimeInjected=!1;get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let e=0;this._interval=setInterval(()=>{e++;try{let t=this._iframe.contentWindow;if(!t)return;let r=!!(t.__hf||t.__player),n=!!(t.__timelines&&Object.keys(t.__timelines).length>0),o=!!this._iframe.contentDocument?.querySelector("[data-composition-src]");if(ye({hasRuntime:r,hasTimelines:n,hasNestedCompositions:o,runtimeInjected:this._runtimeInjected,attempts:e})){this._injectRuntime();return}if(this._runtimeInjected&&!r)return;let s=this._resolvePlaybackDurationAdapter(t);if(s&&s.getDuration()>0){this.stop();let l=Ke(this._iframe.contentDocument);this._callbacks.onReady({duration:s.getDuration(),adapter:s,compositionSize:l});return}}catch{}e>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{let e=this._iframe.contentWindow;return e?this._resolveDirectTimelineAdapterFromWindow(e):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(e){return this._resolveDirectTimelineAdapterFromWindow(e)}hasRuntimeBridge(e){return Reflect.get(e,"__hf")!==void 0||I(Reflect.get(e,"__player"))}_injectRuntime(){this._runtimeInjected=!0;try{let e=this._iframe.contentDocument;if(!e)return;let t=e.createElement("script");t.src=Je,(e.head||e.documentElement).appendChild(t),this._callbacks.onRuntimeInjected?.()}catch{}}_resolveDirectTimelineAdapterFromWindow(e){if(this.hasRuntimeBridge(e))return null;let t=Reflect.get(e,"__timelines");if(!I(t))return null;let r=Object.keys(t);if(r.length===0)return null;let n=this._iframe.contentDocument?.querySelector("[data-composition-id]")?.getAttribute("data-composition-id"),o=n&&n in t?n:r[r.length-1],s=t[o];return Se(s)?s:null}_resolvePlaybackDurationAdapter(e){let t=Reflect.get(e,"__player");if(Ee(t))return{kind:"runtime",getDuration:()=>t.getDuration()};let r=this._resolveDirectTimelineAdapterFromWindow(e);return r?{kind:"direct-timeline",timeline:r,getDuration:()=>r.duration()}:null}};var Te=`
1
+ "use strict";var HyperframesPlayer=(()=>{var J=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var Xe=(i,e)=>{for(var t in e)J(i,t,{get:e[t],enumerable:!0})},Ze=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of qe(e))!Ye.call(i,n)&&n!==t&&J(i,n,{get:()=>e[n],enumerable:!(r=Ge(e,n))||r.enumerable});return i};var Qe=i=>Ze(J({},"__esModule",{value:!0}),i);var Lt={};Xe(Lt,{HyperframesPlayer:()=>Q,SPEED_PRESETS:()=>te,formatSpeed:()=>N,formatTime:()=>$});function ye(i){return i.hasRuntime||i.runtimeInjected?!1:!!(i.hasNestedCompositions||i.hasTimelines&&i.attempts>=5)}function I(i){return typeof i=="object"&&i!==null}function Ee(i){return I(i)&&typeof i.getDuration=="function"}function Se(i){return I(i)&&typeof i.duration=="function"&&typeof i.time=="function"&&typeof i.seek=="function"&&typeof i.play=="function"&&typeof i.pause=="function"}var Je="https://cdn.jsdelivr.net/npm/@hyperframes/core@0.7.85/dist/hyperframe.runtime.iife.js";function D(i){if(i===null)return null;let e=Number.parseInt(i,10);return Number.isFinite(e)&&e>0?e:null}function Ke(i){let e=i?.querySelector("[data-composition-id][data-width][data-height]")??i?.querySelector("[data-width][data-height]");if(!e)return null;let t=D(e.getAttribute("data-width")),r=D(e.getAttribute("data-height"));return t!==null&&r!==null?{width:t,height:r}:null}var j=class{constructor(e,t){this._iframe=e;this._callbacks=t}_iframe;_callbacks;_interval=null;_runtimeInjected=!1;get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let e=0;this._interval=setInterval(()=>{e++;try{let t=this._iframe.contentWindow;if(!t)return;let r=!!(t.__hf||t.__player),n=!!(t.__timelines&&Object.keys(t.__timelines).length>0),o=!!this._iframe.contentDocument?.querySelector("[data-composition-src]");if(ye({hasRuntime:r,hasTimelines:n,hasNestedCompositions:o,runtimeInjected:this._runtimeInjected,attempts:e})){this._injectRuntime();return}if(this._runtimeInjected&&!r)return;let s=this._resolvePlaybackDurationAdapter(t);if(s&&s.getDuration()>0){this.stop();let l=Ke(this._iframe.contentDocument);this._callbacks.onReady({duration:s.getDuration(),adapter:s,compositionSize:l});return}}catch{}e>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{let e=this._iframe.contentWindow;return e?this._resolveDirectTimelineAdapterFromWindow(e):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(e){return this._resolveDirectTimelineAdapterFromWindow(e)}hasRuntimeBridge(e){return Reflect.get(e,"__hf")!==void 0||I(Reflect.get(e,"__player"))}_injectRuntime(){this._runtimeInjected=!0;try{let e=this._iframe.contentDocument;if(!e)return;let t=e.createElement("script");t.src=Je,(e.head||e.documentElement).appendChild(t),this._callbacks.onRuntimeInjected?.()}catch{}}_resolveDirectTimelineAdapterFromWindow(e){if(this.hasRuntimeBridge(e))return null;let t=Reflect.get(e,"__timelines");if(!I(t))return null;let r=Object.keys(t);if(r.length===0)return null;let n=this._iframe.contentDocument?.querySelector("[data-composition-id]")?.getAttribute("data-composition-id"),o=n&&n in t?n:r[r.length-1],s=t[o];return Se(s)?s:null}_resolvePlaybackDurationAdapter(e){let t=Reflect.get(e,"__player");if(Ee(t))return{kind:"runtime",getDuration:()=>t.getDuration()};let r=this._resolveDirectTimelineAdapterFromWindow(e);return r?{kind:"direct-timeline",timeline:r,getDuration:()=>r.duration()}:null}};var Te=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1,6 +1,6 @@
1
1
  # Route: music-to-video
2
2
 
3
- - **Input:** A music track, or a video whose audio becomes the track, with no narration or website capture. User images or videos are optional.
3
+ - **Input:** A music track, a video whose audio becomes the track, or a track generated from a mood brief — with no narration or website capture. User images or videos are optional, so a complete video needs zero supplied assets.
4
4
  - **Output:** A beat-synced MP4 driven by a deterministic beat/energy map (`audiomap.json`). It may become a lyric video, slideshow, visualizer, or kinetic promo without changing pipelines.
5
5
  - **Triggers:** "make a video for this song", "beat-synced video", "lyric video", "music visualizer", "kinetic promo to this beat".
6
6
 
@@ -1,4 +1,4 @@
1
- var ce=Object.defineProperty;var pe=(r,t,e)=>t in r?ce(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var c=(r,t,e)=>pe(r,typeof t!="symbol"?t+"":t,e);import{r as ne,i as me,a as fe}from"./index-DRtvHA1J.js";function _e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function F(r){return typeof r=="object"&&r!==null}function ge(r){return F(r)&&typeof r.getDuration=="function"}function ye(r){return F(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function ve(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const be=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:ve("0.0.0-dev");function H(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isFinite(t)&&t>0?t:null}function we(r){const t=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!t)return null;const e=H(t.getAttribute("data-width")),i=H(t.getAttribute("data-height"));return e!==null&&i!==null?{width:e,height:i}:null}class Ae{constructor(t,e){c(this,"_interval",null);c(this,"_runtimeInjected",!1);this._iframe=t,this._callbacks=e}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let t=0;this._interval=setInterval(()=>{var e;t++;try{const i=this._iframe.contentWindow;if(!i)return;const s=!!(i.__hf||i.__player),o=!!(i.__timelines&&Object.keys(i.__timelines).length>0),d=!!((e=this._iframe.contentDocument)!=null&&e.querySelector("[data-composition-src]"));if(_e({hasRuntime:s,hasTimelines:o,hasNestedCompositions:d,runtimeInjected:this._runtimeInjected,attempts:t})){this._injectRuntime();return}if(this._runtimeInjected&&!s)return;const a=this._resolvePlaybackDurationAdapter(i);if(a&&a.getDuration()>0){this.stop();const h=we(this._iframe.contentDocument);this._callbacks.onReady({duration:a.getDuration(),adapter:a,compositionSize:h});return}}catch{}t>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const t=this._iframe.contentWindow;return t?this._resolveDirectTimelineAdapterFromWindow(t):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(t){return this._resolveDirectTimelineAdapterFromWindow(t)}hasRuntimeBridge(t){return Reflect.get(t,"__hf")!==void 0||F(Reflect.get(t,"__player"))}_injectRuntime(){var t,e;this._runtimeInjected=!0;try{const i=this._iframe.contentDocument;if(!i)return;const s=i.createElement("script");s.src=be,(i.head||i.documentElement).appendChild(s),(e=(t=this._callbacks).onRuntimeInjected)==null||e.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(t){var a,h;if(this.hasRuntimeBridge(t))return null;const e=Reflect.get(t,"__timelines");if(!F(e))return null;const i=Object.keys(e);if(i.length===0)return null;const s=(h=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:h.getAttribute("data-composition-id"),o=s&&s in e?s:i[i.length-1],d=e[o];return ye(d)?d:null}_resolvePlaybackDurationAdapter(t){const e=Reflect.get(t,"__player");if(ge(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const i=this._resolveDirectTimelineAdapterFromWindow(t);return i?{kind:"direct-timeline",timeline:i,getDuration:()=>i.duration()}:null}}const Ee=`
1
+ var ce=Object.defineProperty;var pe=(r,t,e)=>t in r?ce(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var c=(r,t,e)=>pe(r,typeof t!="symbol"?t+"":t,e);import{r as ne,i as me,a as fe}from"./index-DloBOPGY.js";function _e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function F(r){return typeof r=="object"&&r!==null}function ge(r){return F(r)&&typeof r.getDuration=="function"}function ye(r){return F(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function ve(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const be=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:ve("0.0.0-dev");function H(r){if(r===null)return null;const t=Number.parseInt(r,10);return Number.isFinite(t)&&t>0?t:null}function we(r){const t=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!t)return null;const e=H(t.getAttribute("data-width")),i=H(t.getAttribute("data-height"));return e!==null&&i!==null?{width:e,height:i}:null}class Ae{constructor(t,e){c(this,"_interval",null);c(this,"_runtimeInjected",!1);this._iframe=t,this._callbacks=e}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._runtimeInjected=!1;let t=0;this._interval=setInterval(()=>{var e;t++;try{const i=this._iframe.contentWindow;if(!i)return;const s=!!(i.__hf||i.__player),o=!!(i.__timelines&&Object.keys(i.__timelines).length>0),d=!!((e=this._iframe.contentDocument)!=null&&e.querySelector("[data-composition-src]"));if(_e({hasRuntime:s,hasTimelines:o,hasNestedCompositions:d,runtimeInjected:this._runtimeInjected,attempts:t})){this._injectRuntime();return}if(this._runtimeInjected&&!s)return;const a=this._resolvePlaybackDurationAdapter(i);if(a&&a.getDuration()>0){this.stop();const h=we(this._iframe.contentDocument);this._callbacks.onReady({duration:a.getDuration(),adapter:a,compositionSize:h});return}}catch{}t>=40&&(this.stop(),this._callbacks.onError("Composition timeline not found after 8s"))},200)}stop(){this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const t=this._iframe.contentWindow;return t?this._resolveDirectTimelineAdapterFromWindow(t):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(t){return this._resolveDirectTimelineAdapterFromWindow(t)}hasRuntimeBridge(t){return Reflect.get(t,"__hf")!==void 0||F(Reflect.get(t,"__player"))}_injectRuntime(){var t,e;this._runtimeInjected=!0;try{const i=this._iframe.contentDocument;if(!i)return;const s=i.createElement("script");s.src=be,(i.head||i.documentElement).appendChild(s),(e=(t=this._callbacks).onRuntimeInjected)==null||e.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(t){var a,h;if(this.hasRuntimeBridge(t))return null;const e=Reflect.get(t,"__timelines");if(!F(e))return null;const i=Object.keys(e);if(i.length===0)return null;const s=(h=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:h.getAttribute("data-composition-id"),o=s&&s in e?s:i[i.length-1],d=e[o];return ye(d)?d:null}_resolvePlaybackDurationAdapter(t){const e=Reflect.get(t,"__player");if(ge(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const i=this._resolveDirectTimelineAdapterFromWindow(t);return i?{kind:"direct-timeline",timeline:i,getDuration:()=>i.duration()}:null}}const Ee=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1,4 +1,4 @@
1
- import{n as Qi}from"./index-DRtvHA1J.js";/*!
1
+ import{n as Qi}from"./index-DloBOPGY.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
@@ -1 +1 @@
1
- import{g as P}from"./index-DRtvHA1J.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
1
+ import{g as P}from"./index-DloBOPGY.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var g=e[o+x]-t,_=r.some(function(h){if(h.interval===g)return h.count+=1});_||r.push({interval:g,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};