hyperframes 0.8.169 → 0.8.171

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 (181) hide show
  1. package/dist/{add-7GLP4BPM.js → add-VMMGTSGT.js} +12 -11
  2. package/dist/{animatedGifPrep-NEBEGVSO.js → animatedGifPrep-MVP5LCEM.js} +5 -5
  3. package/dist/api.js +11 -11
  4. package/dist/{asset-RORTT5HS.js → asset-ZERIT5FT.js} +2 -2
  5. package/dist/{assetCataloger-RLJ6MDGF.js → assetCataloger-RN5A2SVA.js} +5 -5
  6. package/dist/{audio-OKDGU7TY.js → audio-RQUGFWYT.js} +11 -11
  7. package/dist/{auth-QWYNCU5U.js → auth-I3FNB6N2.js} +1 -1
  8. package/dist/{autoUpdate-EDJJPWAU.js → autoUpdate-IBAS4JVK.js} +2 -2
  9. package/dist/{backgroundChecks-KQR6FGVU.js → backgroundChecks-7UQBIPQC.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-YKTTAIHH.js → batchRender-KWBVAUE3.js} +3 -3
  12. package/dist/{beats-I6AGLTLW.js → beats-F2GFGFCV.js} +4 -4
  13. package/dist/{benchmark-NBSV7PNB.js → benchmark-XPQYX3OX.js} +8 -8
  14. package/dist/{browser-FPEL5FGW.js → browser-QCV62F7R.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-TYQXMNSU.js → bundleWithLocalizedFonts-42V34HJF.js} +2 -2
  16. package/dist/{capture-FXGOI23U.js → capture-OKPMCIAC.js} +8 -8
  17. package/dist/{capture-5BRJJMZB.js → capture-WE32B5UZ.js} +2 -2
  18. package/dist/{catalog-SG3ZIS45.js → catalog-2LWFMJM3.js} +12 -11
  19. package/dist/{catch-up-ETXUT6Q5.js → catch-up-OWUGMOBS.js} +4 -4
  20. package/dist/{check-KXNNIEUR.js → check-7BK6UM3M.js} +35 -34
  21. package/dist/{checkBrowser-546UMI3N.js → checkBrowser-VG745SEX.js} +32 -31
  22. package/dist/{chunk-YZRS3COO.js → chunk-4QIJFIR5.js} +1 -1
  23. package/dist/{chunk-UCNQE52B.js → chunk-4RXJG3SY.js} +197 -26
  24. package/dist/{chunk-JPN7SVWC.js → chunk-5GQB63WX.js} +7 -7
  25. package/dist/{chunk-FSX7GTBB.js → chunk-5HLJ4JMB.js} +1 -1
  26. package/dist/{chunk-FQJDV2RI.js → chunk-6I24ZSCR.js} +1 -1
  27. package/dist/chunk-6M3IPJS6.js +3803 -0
  28. package/dist/{chunk-7635SDI5.js → chunk-77QCYRQH.js} +2 -2
  29. package/dist/{chunk-TJSTGSAW.js → chunk-7FMUTGOH.js} +2 -77
  30. package/dist/{chunk-QD5VJOQK.js → chunk-7YZSOHSC.js} +3 -3
  31. package/dist/{chunk-AP5AVVAB.js → chunk-A3SQJCPU.js} +1 -1
  32. package/dist/{chunk-XK5SZNYE.js → chunk-AAYNQ7WL.js} +9 -9
  33. package/dist/{chunk-T4HL3SZH.js → chunk-AGHHZIZN.js} +1 -1
  34. package/dist/{chunk-A6K7M46D.js → chunk-AWSVUIWG.js} +1 -1
  35. package/dist/{chunk-RUYYAL3T.js → chunk-BMPNGUYD.js} +2 -2
  36. package/dist/{chunk-BNEKKUPG.js → chunk-BYFG74OA.js} +2 -2
  37. package/dist/{chunk-VCXVZRR2.js → chunk-CO6V4KXX.js} +1 -1
  38. package/dist/{chunk-5ETJPA5Z.js → chunk-CSABTZ6S.js} +9 -9
  39. package/dist/{chunk-DCG22HKT.js → chunk-D2QELIQB.js} +72 -22
  40. package/dist/{chunk-J5Z56PU3.js → chunk-EDGJ2OMH.js} +1 -1
  41. package/dist/{chunk-SJPNVLYS.js → chunk-ERJHLFPD.js} +2 -2
  42. package/dist/{chunk-P24X6CGY.js → chunk-FAORS3UR.js} +28 -13
  43. package/dist/{chunk-EEP5Y5IE.js → chunk-FE2XTCTM.js} +18 -1
  44. package/dist/{chunk-TVDXMJ43.js → chunk-GBWSBTEE.js} +1 -1
  45. package/dist/{chunk-JGYHWVXQ.js → chunk-GMJ3ILLW.js} +34 -13
  46. package/dist/{chunk-K5PU5ISL.js → chunk-GSABLXZV.js} +1 -1
  47. package/dist/{chunk-KA4LSAD5.js → chunk-GU5FLCZV.js} +1 -1
  48. package/dist/{chunk-YT6TFGIS.js → chunk-IWLOARQZ.js} +2 -2
  49. package/dist/{chunk-EFP25BUY.js → chunk-JAERN4RH.js} +1 -1
  50. package/dist/chunk-JHOCK3DG.js +27 -0
  51. package/dist/{chunk-5SQHHBAR.js → chunk-JMJTXBVF.js} +22 -12
  52. package/dist/{chunk-NKG3LTPI.js → chunk-KQCWIE76.js} +2 -2
  53. package/dist/{chunk-S6U7YLPJ.js → chunk-KUW4LWY6.js} +1 -1
  54. package/dist/{chunk-PVTHDNDZ.js → chunk-L32QQH2K.js} +1 -1
  55. package/dist/{chunk-TEFHMDVR.js → chunk-LMMFO5UV.js} +2 -2
  56. package/dist/{chunk-CESKA6VO.js → chunk-NSJLCWLG.js} +1 -1
  57. package/dist/{chunk-MCPDZWZY.js → chunk-NYCJCQNY.js} +4 -4
  58. package/dist/{chunk-2F4HJFGW.js → chunk-PAFCKH3S.js} +2 -2
  59. package/dist/{chunk-U7P2XTRY.js → chunk-PECICVTJ.js} +2 -2
  60. package/dist/{chunk-GVX2443P.js → chunk-PH3RS5X4.js} +2 -2
  61. package/dist/{chunk-Q5K73VW3.js → chunk-PXA4S6OE.js} +2 -2
  62. package/dist/{chunk-O3J7BHBU.js → chunk-QZUVPWC4.js} +1 -1
  63. package/dist/{chunk-ZFJ5RI7A.js → chunk-RSW6LGGW.js} +3 -3
  64. package/dist/{chunk-EELTMBCC.js → chunk-RTW6WSC7.js} +4 -3
  65. package/dist/{chunk-CNP6AMFM.js → chunk-SLTUINB4.js} +2 -2
  66. package/dist/{chunk-RZKQ3G6B.js → chunk-T5LGOTQR.js} +1 -1
  67. package/dist/{chunk-WAVFNZB7.js → chunk-TZ3I23TZ.js} +21 -7
  68. package/dist/{chunk-QLHXC4E6.js → chunk-UJQQITCY.js} +1 -1
  69. package/dist/{chunk-XZNHVWDD.js → chunk-UUP4KOMD.js} +4 -4
  70. package/dist/{chunk-UISU4SYG.js → chunk-V2T7FFPB.js} +1 -1
  71. package/dist/{chunk-7FHFPHEM.js → chunk-VKFYI7AQ.js} +182 -77
  72. package/dist/{chunk-QABAVWEX.js → chunk-W47D3KOB.js} +1 -1
  73. package/dist/{chunk-YLAREDAU.js → chunk-X3U6KEID.js} +1 -1
  74. package/dist/{chunk-5FWVFCQM.js → chunk-XGFYN53T.js} +2 -2
  75. package/dist/{chunk-M4N6IHCQ.js → chunk-XRQBHOBT.js} +7 -1
  76. package/dist/{chunk-XJQ6NN2L.js → chunk-ZBUGFQ7Y.js} +51 -25
  77. package/dist/{clean-ARH23EGW.js → clean-FCBNQ3W2.js} +13 -13
  78. package/dist/cli.js +53 -53
  79. package/dist/{cloud-GBY7MRZM.js → cloud-3FZBQBOM.js} +4 -4
  80. package/dist/{cloudrun-HBVA5UZB.js → cloudrun-CDFL5JBL.js} +9 -11
  81. package/dist/{compare-Z4YNESYN.js → compare-E4332OOZ.js} +26 -25
  82. package/dist/{compiler-6WJ5SVTD.js → compiler-GU5GPO5A.js} +2 -2
  83. package/dist/{component-AR4MS4R7.js → component-VKSV3OKW.js} +3 -3
  84. package/dist/{compositions-ERZVZBYW.js → compositions-GOVXHFXC.js} +9 -9
  85. package/dist/{delete-NWSW3BET.js → delete-JYZTEBLQ.js} +2 -2
  86. package/dist/{deterministicFonts-KXVO7QEL.js → deterministicFonts-RWGQPEZU.js} +2 -2
  87. package/dist/{dist-VKLSNKRZ.js → dist-IDZRZHGE.js} +2 -2
  88. package/dist/{doctor-P4QZQRCB.js → doctor-ND3FZM6S.js} +7 -7
  89. package/dist/{events-F2UVJQIC.js → events-27JU7QRQ.js} +2 -2
  90. package/dist/{events-SV46AWMI.js → events-VL2JIO4R.js} +3 -3
  91. package/dist/{feedback-XS4IK6SW.js → feedback-PKVQWCVT.js} +6 -6
  92. package/dist/{figma-DELISEUP.js → figma-FZ4T4SE3.js} +3 -3
  93. package/dist/fontLocalizeCli.js +9 -9
  94. package/dist/{get-DNGXCEFB.js → get-HUAIHWXR.js} +2 -2
  95. package/dist/{gpuPolicy-JG5PUOJP.js → gpuPolicy-QWJYZLVJ.js} +5 -5
  96. package/dist/{grade-compare-F46JWE4O.js → grade-compare-CJ2ROYD6.js} +26 -25
  97. package/dist/{help-XVEBMX3U.js → help-OJ3QDJYS.js} +1 -1
  98. package/dist/{history-NS4PKG4S.js → history-P4LA65T5.js} +7 -7
  99. package/dist/hyperframe-runtime.js +58 -57
  100. package/dist/hyperframe.manifest.json +1 -1
  101. package/dist/hyperframe.runtime.iife.js +58 -57
  102. package/dist/hyperframes-player.global.js +3 -3
  103. package/dist/{info-DJ6VNESS.js → info-QHRJW6Y3.js} +7 -7
  104. package/dist/{init-TSRTMVRN.js → init-AG6YVVJN.js} +21 -20
  105. package/dist/{inspect-VTZXXDJ4.js → inspect-TT66DYEC.js} +27 -26
  106. package/dist/{installer-3ERHU4CD.js → installer-5ZKUQBWW.js} +4 -4
  107. package/dist/{keyframes-6DN7BOYJ.js → keyframes-CJJGCW3R.js} +6 -6
  108. package/dist/{lambda-RCOIEGL6.js → lambda-3BMEOSP7.js} +10 -12
  109. package/dist/{layout-FFGRLVK4.js → layout-BSDCTMJK.js} +27 -26
  110. package/dist/{lint-MBYIDFKS.js → lint-6CL2R2FK.js} +6 -6
  111. package/dist/{list-KEZDFW5R.js → list-5VYOLEFN.js} +2 -2
  112. package/dist/{login-7ZV374QL.js → login-PNRREAOC.js} +4 -4
  113. package/dist/{media-treatment-LGWWRXAX.js → media-treatment-KHJX73WZ.js} +8 -8
  114. package/dist/{models-TC4K6UQP.js → models-INX67ETR.js} +8 -8
  115. package/dist/{motionShot-4E3RTV5O.js → motionShot-VIUXVMTV.js} +12 -12
  116. package/dist/{normalize-audio-XCGB2IQP.js → normalize-audio-T5QMN476.js} +4 -4
  117. package/dist/{open-JNNJSNTH.js → open-T57KLGFX.js} +4 -4
  118. package/dist/{parakeetRunner-S3DG4BJB.js → parakeetRunner-PCCBODBS.js} +8 -8
  119. package/dist/{pipeline-3SIYCBLU.js → pipeline-GDC7SL5N.js} +5 -5
  120. package/dist/{play-LBPOOD3V.js → play-TQWHYMAT.js} +19 -18
  121. package/dist/{present-PWEN5SDL.js → present-U5OFT6IF.js} +14 -14
  122. package/dist/{preview-IS32RLKM.js → preview-WWTDQQSB.js} +20 -16
  123. package/dist/{producer-4UUUEPPS.js → producer-23NJEJRO.js} +1 -1
  124. package/dist/{projectConfig-K347VIO3.js → projectConfig-OXNA35QN.js} +7 -6
  125. package/dist/{publication-4CQS532O.js → publication-GY3OJ6VH.js} +2 -2
  126. package/dist/{publish-OJYF37FY.js → publish-WZD4NLWM.js} +8 -7
  127. package/dist/{remove-background-HO6YL2HU.js → remove-background-Q7CQ3PJF.js} +6 -6
  128. package/dist/{render-L76SEAMC.js → render-24JWWXMA.js} +3 -3
  129. package/dist/{render-QBQYF2NC.js → render-FTVXKXSQ.js} +24 -23
  130. package/dist/{render-Q6QAXJCN.js → render-RZUU76V5.js} +8 -8
  131. package/dist/{render-batch-JLANN5Y2.js → render-batch-FCR7RX6U.js} +7 -20
  132. package/dist/renderSetupWorker.js +9 -1
  133. package/dist/{resolver-EDUM4DHG.js → resolver-4SPHOGY7.js} +5 -4
  134. package/dist/{sherpa-QEM5XYHD.js → sherpa-VMADZBF7.js} +7 -7
  135. package/dist/skills/media-use/SKILL.md +3 -3
  136. package/dist/skills/media-use/audio/references/requirements.md +7 -7
  137. package/dist/skills/media-use/audio/references/sfx.md +19 -13
  138. package/dist/skills/media-use/audio/scripts/audio.mjs +9 -9
  139. package/dist/skills/media-use/audio/scripts/audio.test.mjs +17 -10
  140. package/dist/skills/media-use/audio/scripts/lib/media-record.mjs +7 -3
  141. package/dist/skills/media-use/audio/scripts/lib/media-record.test.mjs +22 -3
  142. package/dist/skills/media-use/audio/scripts/lib/openverse.mjs +134 -0
  143. package/dist/skills/media-use/audio/scripts/lib/sfx.mjs +120 -89
  144. package/dist/skills/media-use/audio/scripts/lib/sfx.test.mjs +222 -12
  145. package/dist/skills/media-use/references/audio.md +1 -1
  146. package/dist/skills/media-use/references/resolve.md +1 -1
  147. package/dist/skills/media-use/references/setup-providers.md +13 -12
  148. package/dist/skills/media-use/scripts/lib/heygen-cli.mjs +4 -7
  149. package/dist/skills/media-use/scripts/lib/heygen-cli.test.mjs +5 -5
  150. package/dist/skills/media-use/scripts/lib/manifest.d.mts +1 -0
  151. package/dist/skills/media-use/scripts/lib/manifest.mjs +9 -6
  152. package/dist/skills/media-use/scripts/lib/openverse.mjs +134 -0
  153. package/dist/skills/media-use/scripts/lib/openverse.test.mjs +219 -0
  154. package/dist/skills/media-use/scripts/lib/registry.mjs +4 -2
  155. package/dist/skills/media-use/scripts/lib/registry.test.mjs +13 -13
  156. package/dist/skills/media-use/scripts/lib/sfx-provider.mjs +23 -13
  157. package/dist/skills/media-use/scripts/resolve.mjs +45 -55
  158. package/dist/{skills-FSZK6FIG.js → skills-7LBLAEH4.js} +5 -5
  159. package/dist/{skillsUpdateCheck-3354HXDJ.js → skillsUpdateCheck-AHK7CQUP.js} +3 -3
  160. package/dist/{snapshot-5VVMFEMM.js → snapshot-DOS6NQXM.js} +29 -28
  161. package/dist/{src-RYILCNU7.js → src-J6KABXGZ.js} +8 -8
  162. package/dist/{src-ZGMLMQ3B.js → src-VFTQPSQD.js} +4 -4
  163. package/dist/{staticProjectServer-PIVSGEAO.js → staticProjectServer-2YNWMUSU.js} +15 -14
  164. package/dist/studio/assets/{hyperframes-player-B04Yx96S.js → hyperframes-player-DohJxMIU.js} +2 -2
  165. package/dist/studio/assets/{index-D2e0J6kh.js → index-BOkm4Ooc.js} +101 -101
  166. package/dist/studio/assets/{index-D9CDX_Rr.js → index-DfwtrPPt.js} +1 -1
  167. package/dist/studio/index.html +1 -1
  168. package/dist/{studio-api-PHADR6VB.js → studio-api-NEBM56HH.js} +8 -8
  169. package/dist/{studioServer-5AVDKN5V.js → studioServer-LYDRHW7D.js} +45 -39
  170. package/dist/{telemetry-JCTHMPSB.js → telemetry-FAYON6XS.js} +3 -3
  171. package/dist/{timeline-QU2F6R2M.js → timeline-UKJ53XLC.js} +16 -16
  172. package/dist/{tokens-YYK4G36C.js → tokens-SO3ZXEFM.js} +2 -2
  173. package/dist/{transcribe-7ORH7R6O.js → transcribe-IM5UNBSH.js} +6 -6
  174. package/dist/{transcribe-PRG4FLLA.js → transcribe-PS5XSTXN.js} +12 -12
  175. package/dist/{updateCheck-NV7QNANK.js → updateCheck-ZV422M72.js} +2 -2
  176. package/dist/{upgrade-UZXN36J2.js → upgrade-GHG5FWZJ.js} +2 -2
  177. package/dist/{urlDownloader-AW57H722.js → urlDownloader-BOLOMGC7.js} +4 -4
  178. package/dist/{validate-QD53ABUM.js → validate-K4ZGXH2M.js} +20 -20
  179. package/dist/{video-VLVPYQQR.js → video-HUNOZDLT.js} +5 -5
  180. package/package.json +1 -1
  181. package/dist/chunk-BIV5HVTQ.js +0 -3803
@@ -20,7 +20,7 @@ import {
20
20
  typeDirPath,
21
21
  updateRecord,
22
22
  withFigmaErrors
23
- } from "./chunk-PVTHDNDZ.js";
23
+ } from "./chunk-L32QQH2K.js";
24
24
  import {
25
25
  defineCommand
26
26
  } from "./chunk-S3S4TGEH.js";
@@ -229,7 +229,7 @@ var asset_default = defineCommand({
229
229
  rendered > 0 ? `(${results.length} nodes, ${rendered} rendered in 1 figma request)` : `(${results.length} nodes, all reused from cache \u2014 no figma request)`
230
230
  );
231
231
  }
232
- const { trackFigmaImport } = await import("./telemetry-JCTHMPSB.js");
232
+ const { trackFigmaImport } = await import("./telemetry-FAYON6XS.js");
233
233
  trackFigmaImport({
234
234
  phase: "asset",
235
235
  reused: results.every((r) => r.reused),
@@ -11,7 +11,6 @@ import { existsSync, lstatSync, readdirSync, realpathSync } from "fs";
11
11
  import { homedir, platform } from "os";
12
12
  import { join, resolve } from "path";
13
13
  var SYSTEM_FONT_SIZE_LIMIT = 5 * 1024 * 1024;
14
- var PROFILER_TIMEOUT_MS = 5e3;
15
14
  var FC_MATCH_TIMEOUT_MS = 3e3;
16
15
  var FONT_EXT_RE = /\.(otf|ttf|ttc|woff2?)$/i;
17
16
  var FORMAT_PRIORITY = {
@@ -178,59 +177,6 @@ function pickBestCandidate(candidates) {
178
177
  const best = candidates[0];
179
178
  return { path: best.path, format: best.format };
180
179
  }
181
- var profilerCache = null;
182
- function getSystemProfilerIndex() {
183
- if (profilerCache)
184
- return profilerCache;
185
- profilerCache = /* @__PURE__ */ new Map();
186
- if (platform() !== "darwin")
187
- return profilerCache;
188
- try {
189
- const raw = execFileSync("system_profiler", ["SPFontsDataType", "-json"], {
190
- encoding: "utf8",
191
- maxBuffer: 12 * 1024 * 1024,
192
- timeout: PROFILER_TIMEOUT_MS
193
- });
194
- const parsed = JSON.parse(raw);
195
- if (!parsed?.SPFontsDataType || !Array.isArray(parsed.SPFontsDataType))
196
- return profilerCache;
197
- for (const fontEntry of parsed.SPFontsDataType) {
198
- if (!fontEntry?.typefaces || !Array.isArray(fontEntry.typefaces))
199
- continue;
200
- for (const typeface of fontEntry.typefaces) {
201
- if (!typeface)
202
- continue;
203
- const family = typeface.family ?? typeface.fullname ?? typeface._name;
204
- if (typeof family !== "string")
205
- continue;
206
- const filePath = typeface.path;
207
- if (typeof filePath !== "string" || !FONT_EXT_RE.test(filePath))
208
- continue;
209
- const normalized = normalizeName(family);
210
- const ext = filePath.match(FONT_EXT_RE)?.[1] ?? "ttf";
211
- const entry = {
212
- family: normalized,
213
- path: filePath,
214
- format: extensionToFormat(ext),
215
- isRegular: isRegularWeight(filePath)
216
- };
217
- const list = profilerCache.get(normalized) ?? [];
218
- list.push(entry);
219
- profilerCache.set(normalized, list);
220
- }
221
- }
222
- } catch {
223
- }
224
- return profilerCache;
225
- }
226
- function locateViaSystemProfiler(targetFamily) {
227
- const index = getSystemProfilerIndex();
228
- const entries = index.get(targetFamily);
229
- if (!entries || entries.length === 0)
230
- return null;
231
- const candidates = entries.filter((e) => isRegularFile(e.path) && isPathBounded(e.path)).map((e) => ({ path: e.path, format: e.format, isRegular: e.isRegular }));
232
- return pickBestCandidate(candidates);
233
- }
234
180
  function locateViaFcMatch(targetFamily) {
235
181
  if (platform() !== "linux")
236
182
  return null;
@@ -258,11 +204,7 @@ function locateSystemFont(family) {
258
204
  const cached = cache.get(normalized);
259
205
  if (cached !== void 0)
260
206
  return cached;
261
- let result = null;
262
- result = locateViaSystemProfiler(normalized);
263
- if (!result) {
264
- result = locateViaFcMatch(normalized);
265
- }
207
+ let result = locateViaFcMatch(normalized);
266
208
  if (!result) {
267
209
  const allCandidates = [];
268
210
  for (const dir of fontDirectories()) {
@@ -308,18 +250,6 @@ function locateSystemFontVariants(family) {
308
250
  if (!normalized)
309
251
  return [];
310
252
  const variants = [];
311
- const profilerIndex = getSystemProfilerIndex();
312
- const profilerEntries = profilerIndex.get(normalized);
313
- if (profilerEntries && profilerEntries.length > 0) {
314
- for (const e of profilerEntries) {
315
- if (!isRegularFile(e.path) || !isPathBounded(e.path))
316
- continue;
317
- const { weight, style } = inferWeightAndStyle(e.path);
318
- variants.push({ path: e.path, format: e.format, weight, style });
319
- }
320
- if (variants.length > 0)
321
- return dedupeVariants(variants);
322
- }
323
253
  const allCandidates = [];
324
254
  for (const dir of fontDirectories()) {
325
255
  allCandidates.push(...collectCandidatesFromDir(dir, normalized));
@@ -339,16 +269,11 @@ function dedupeVariants(variants) {
339
269
  }
340
270
  return Array.from(seen.values());
341
271
  }
342
- function getSystemProfilerFamilies() {
343
- const index = getSystemProfilerIndex();
344
- return Array.from(index.keys());
345
- }
346
272
 
347
273
  export {
348
274
  SYSTEM_FONT_SIZE_LIMIT,
349
275
  fontDirectories,
350
276
  collectFontFileEntries,
351
277
  locateSystemFont,
352
- locateSystemFontVariants,
353
- getSystemProfilerFamilies
278
+ locateSystemFontVariants
354
279
  };
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  getMimeType,
9
9
  injectMediaCodecMapIntoHtml
10
- } from "./chunk-XJQ6NN2L.js";
10
+ } from "./chunk-ZBUGFQ7Y.js";
11
11
  import {
12
12
  PROXY_VARIANT_CONFIG,
13
13
  ProxyCapacityError,
@@ -18,10 +18,10 @@ import {
18
18
  recordProxyRequest,
19
19
  resolveProxy,
20
20
  resolveProxyVariantRequest
21
- } from "./chunk-T4HL3SZH.js";
21
+ } from "./chunk-AGHHZIZN.js";
22
22
  import {
23
23
  resolveAutoProxy
24
- } from "./chunk-J5Z56PU3.js";
24
+ } from "./chunk-EDGJ2OMH.js";
25
25
  import {
26
26
  decodeWellFormedEscapes
27
27
  } from "./chunk-BSQ7XANM.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-K2FLNJVB.js";
10
10
  import {
11
11
  trackCommandFailure
12
- } from "./chunk-FQJDV2RI.js";
12
+ } from "./chunk-6I24ZSCR.js";
13
13
  import {
14
14
  failCommand
15
15
  } from "./chunk-PBN6GBJE.js";
@@ -9,17 +9,17 @@ import {
9
9
  resolveCliChromeGpuMode,
10
10
  seekCompositionTimeline,
11
11
  waitForRuntimeReady
12
- } from "./chunk-DCG22HKT.js";
12
+ } from "./chunk-D2QELIQB.js";
13
13
  import {
14
14
  launchManagedBrowser,
15
15
  resolveManagedGpuMode
16
- } from "./chunk-WAVFNZB7.js";
16
+ } from "./chunk-TZ3I23TZ.js";
17
17
  import {
18
18
  resolveCompositionViewportFromHtml
19
19
  } from "./chunk-FH7WODJH.js";
20
20
  import {
21
21
  resolveProject
22
- } from "./chunk-AP5AVVAB.js";
22
+ } from "./chunk-A3SQJCPU.js";
23
23
  import {
24
24
  defineCommand
25
25
  } from "./chunk-S3S4TGEH.js";
@@ -33,7 +33,7 @@ import {
33
33
  import {
34
34
  printDeprecationNotice,
35
35
  withMeta
36
- } from "./chunk-K5PU5ISL.js";
36
+ } from "./chunk-GSABLXZV.js";
37
37
  import {
38
38
  decodeWellFormedEscapes
39
39
  } from "./chunk-BSQ7XANM.js";
@@ -228,7 +228,7 @@ function extractCompositionErrorsFromLint(lintResult) {
228
228
  async function localizeRemoteAssets(html) {
229
229
  let dir;
230
230
  try {
231
- const { loadProducer } = await import("./producer-4UUUEPPS.js");
231
+ const { loadProducer } = await import("./producer-23NJEJRO.js");
232
232
  const { localizeRemoteMediaSources, localizeRemoteImageSources, localizeRemoteFontFaces } = await loadProducer();
233
233
  dir = mkdtempSync(join(tmpdir(), "hf-validate-assets-"));
234
234
  const assetDir = dir;
@@ -249,9 +249,9 @@ async function localizeRemoteAssets(html) {
249
249
  }
250
250
  async function validateInBrowser(project, opts) {
251
251
  const projectDir = project.dir;
252
- const { bundleToSingleHtml } = await import("./compiler-6WJ5SVTD.js");
252
+ const { bundleToSingleHtml } = await import("./compiler-GU5GPO5A.js");
253
253
  const { ensureBrowser } = await import("./manager-HEUPD2YB.js");
254
- const { serveStaticProjectHtml } = await import("./staticProjectServer-PIVSGEAO.js");
254
+ const { serveStaticProjectHtml } = await import("./staticProjectServer-2YNWMUSU.js");
255
255
  const { lintProject } = await import("./lintProject-PXB5Y6TX.js");
256
256
  const lintResult = await lintProject(projectDir);
257
257
  const compositionErrors = extractCompositionErrorsFromLint(lintResult);
@@ -273,9 +273,9 @@ async function validateInBrowser(project, opts) {
273
273
  try {
274
274
  const browser = await ensureBrowser();
275
275
  const puppeteer = await import("puppeteer-core");
276
- const { buildChromeArgs, analyzeClipMediaFit } = await import("./src-ZGMLMQ3B.js");
276
+ const { buildChromeArgs, analyzeClipMediaFit } = await import("./src-VFTQPSQD.js");
277
277
  const requestedGpuMode = resolveCliChromeGpuMode();
278
- const { assertWebGpuAdapterAvailable, compositionRequiresWebGpu, resolveLocalWebGpu } = await import("./gpuPolicy-JG5PUOJP.js");
278
+ const { assertWebGpuAdapterAvailable, compositionRequiresWebGpu, resolveLocalWebGpu } = await import("./gpuPolicy-QWJYZLVJ.js");
279
279
  const resolvedGpuMode = await resolveManagedGpuMode(requestedGpuMode, browser.executablePath);
280
280
  const requiresWebGpu = compositionRequiresWebGpu(html);
281
281
  const { gpuConfig, softwareWebGpu } = resolveLocalWebGpu(resolvedGpuMode, requiresWebGpu);
@@ -9,7 +9,7 @@ import {
9
9
  formatPreviewProxyBox,
10
10
  hdrToSdrToneMapFilter,
11
11
  parseFirstFrameColour
12
- } from "./chunk-O3J7BHBU.js";
12
+ } from "./chunk-QZUVPWC4.js";
13
13
  import {
14
14
  decodeAuthoredAttribute,
15
15
  scanHtmlOpeningTags
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  setHostHandlesSigint
9
- } from "./chunk-7FHFPHEM.js";
9
+ } from "./chunk-VKFYI7AQ.js";
10
10
  import {
11
11
  processAncestorSnapshot,
12
12
  processIdentity,
@@ -7,10 +7,10 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  trackLintReport,
9
9
  trackLintRuleStreak
10
- } from "./chunk-FQJDV2RI.js";
10
+ } from "./chunk-6I24ZSCR.js";
11
11
  import {
12
12
  shouldTrack
13
- } from "./chunk-FSX7GTBB.js";
13
+ } from "./chunk-5HLJ4JMB.js";
14
14
  import {
15
15
  LINT_RULE_COUNT,
16
16
  LINT_RULE_GROUP_COUNTS
@@ -6,8 +6,8 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/version.ts
9
- var VERSION = true ? "0.8.169" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.169" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.171" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.171" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  updateNoticesSuppressed
9
- } from "./chunk-K5PU5ISL.js";
9
+ } from "./chunk-GSABLXZV.js";
10
10
  import {
11
11
  hostAnswers
12
12
  } from "./chunk-K4WIOZFP.js";
@@ -10,21 +10,21 @@ import {
10
10
  seekCompositionTimeline,
11
11
  waitForCompositionFonts,
12
12
  waitForRuntimeReady
13
- } from "./chunk-DCG22HKT.js";
13
+ } from "./chunk-D2QELIQB.js";
14
14
  import {
15
15
  gotoWhenSent,
16
16
  launchManagedBrowser,
17
17
  resolveManagedGpuMode
18
- } from "./chunk-WAVFNZB7.js";
18
+ } from "./chunk-TZ3I23TZ.js";
19
19
  import {
20
20
  resolveDiagnosticNavigationTimeoutMs
21
- } from "./chunk-TEFHMDVR.js";
21
+ } from "./chunk-LMMFO5UV.js";
22
22
  import {
23
23
  resolveProject
24
- } from "./chunk-AP5AVVAB.js";
24
+ } from "./chunk-A3SQJCPU.js";
25
25
  import {
26
26
  serveStaticProjectHtml
27
- } from "./chunk-QD5VJOQK.js";
27
+ } from "./chunk-7YZSOHSC.js";
28
28
  import {
29
29
  defineCommand
30
30
  } from "./chunk-S3S4TGEH.js";
@@ -38,7 +38,7 @@ import {
38
38
  import {
39
39
  printDeprecationNotice,
40
40
  withMeta
41
- } from "./chunk-K5PU5ISL.js";
41
+ } from "./chunk-GSABLXZV.js";
42
42
  import {
43
43
  normalizeErrorMessage
44
44
  } from "./chunk-KNU5COPB.js";
@@ -709,7 +709,7 @@ async function collectTweenBoundaries(page) {
709
709
  });
710
710
  }
711
711
  async function bundleProjectHtml(projectDir) {
712
- const { bundleToSingleHtml } = await import("./compiler-6WJ5SVTD.js");
712
+ const { bundleToSingleHtml } = await import("./compiler-GU5GPO5A.js");
713
713
  return bundleToSingleHtml(projectDir);
714
714
  }
715
715
  async function alignViewportToComposition(page, url) {
@@ -728,13 +728,13 @@ async function alignViewportToComposition(page, url) {
728
728
  async function runLayoutAudit(projectDir, opts) {
729
729
  const { ensureBrowser } = await import("./manager-HEUPD2YB.js");
730
730
  const puppeteer = await import("puppeteer-core");
731
- const { buildChromeArgs } = await import("./src-ZGMLMQ3B.js");
731
+ const { buildChromeArgs } = await import("./src-VFTQPSQD.js");
732
732
  const {
733
733
  assertWebGpuAdapterAvailable,
734
734
  compositionRequiresWebGpu,
735
735
  resolveLocalBrowserGpuMode,
736
736
  resolveLocalWebGpu
737
- } = await import("./gpuPolicy-JG5PUOJP.js");
737
+ } = await import("./gpuPolicy-QWJYZLVJ.js");
738
738
  const html = await bundleProjectHtml(projectDir);
739
739
  const server = await serveStaticProjectHtml(
740
740
  projectDir,
@@ -9,28 +9,28 @@ import {
9
9
  launchManagedBrowser,
10
10
  resolveManagedGpuMode,
11
11
  rethrowAfterBrowserCleanup
12
- } from "./chunk-WAVFNZB7.js";
12
+ } from "./chunk-TZ3I23TZ.js";
13
13
  import {
14
14
  resolveCompositionViewportFromHtml
15
15
  } from "./chunk-FH7WODJH.js";
16
16
  import {
17
17
  resolveDiagnosticNavigationTimeoutMs,
18
18
  windowsChromeCrashRemediation
19
- } from "./chunk-TEFHMDVR.js";
19
+ } from "./chunk-LMMFO5UV.js";
20
20
  import {
21
21
  oneProcessOverPipe
22
22
  } from "./chunk-WICIV6R3.js";
23
23
  import {
24
24
  resolveLocalBrowserGpuMode,
25
25
  resolveLocalWebGpu
26
- } from "./chunk-Q5K73VW3.js";
26
+ } from "./chunk-PXA4S6OE.js";
27
27
  import {
28
28
  c
29
29
  } from "./chunk-ZTZA4UWZ.js";
30
30
  import {
31
31
  assertWebGpuAdapterAvailable,
32
32
  compositionRequiresWebGpu
33
- } from "./chunk-7FHFPHEM.js";
33
+ } from "./chunk-VKFYI7AQ.js";
34
34
  import {
35
35
  normalizeErrorMessage
36
36
  } from "./chunk-KNU5COPB.js";
@@ -52,7 +52,8 @@ var DENSE_GEOMETRY_SEEK_OPTIONS = {
52
52
  animationFrameSettle: "none",
53
53
  waitForFontsMs: 0,
54
54
  settleMs: 0,
55
- waitForVideoFrames: false
55
+ waitForVideoFrames: false,
56
+ skipWebglDraws: true
56
57
  };
57
58
  function resolveCliChromeGpuMode(envMode = process.env.PRODUCER_BROWSER_GPU_MODE) {
58
59
  return resolveLocalBrowserGpuMode(void 0, envMode);
@@ -113,9 +114,9 @@ async function openSettledCompositionPage(html, url, options) {
113
114
  const { ensureBrowser, findSystemBrowser } = await import("./manager-HEUPD2YB.js");
114
115
  const browser = await ensureBrowser({ signal: options.signal });
115
116
  const puppeteer = await import("puppeteer-core");
116
- const { buildChromeArgs } = await import("./src-ZGMLMQ3B.js");
117
+ const { buildChromeArgs } = await import("./src-VFTQPSQD.js");
117
118
  const requestedGpuMode = options.browserGpuMode ?? resolveCliChromeGpuMode();
118
- const answer = (await import("./staticProjectServer-PIVSGEAO.js")).inProcessAnswer(url);
119
+ const answer = (await import("./staticProjectServer-2YNWMUSU.js")).inProcessAnswer(url);
119
120
  const requiresWebGpu = compositionRequiresWebGpu(html);
120
121
  let softwareWebGpu = false;
121
122
  const launch = async (executablePath) => {
@@ -193,7 +194,7 @@ async function seekCompositionTimeline(page, timeSeconds, options = {}) {
193
194
  await page.evaluate(
194
195
  // Serialized into the page; the seek-target cascade must stay one function.
195
196
  // fallow-ignore-next-line complexity
196
- (t, fallbackToBridgeAndTimelines, exactTime) => {
197
+ (t, fallbackToBridgeAndTimelines, exactTime, skipDraws) => {
197
198
  const getProperty = (target, key) => {
198
199
  if ((typeof target !== "object" || target === null) && typeof target !== "function") {
199
200
  return void 0;
@@ -212,26 +213,75 @@ async function seekCompositionTimeline(page, timeSeconds, options = {}) {
212
213
  const playerSeek = getProperty(player, "seek");
213
214
  const hf = Reflect.get(window, "__hf");
214
215
  const bridgeSeek = getProperty(hf, "seek");
215
- if (call(renderSeek, player, exactTime ? [safe, { exact: true }] : [safe])) {
216
- } else if (fallbackToBridgeAndTimelines && call(bridgeSeek, hf, [safe])) {
217
- } else if (call(playerSeek, player, [safe])) {
218
- } else if (fallbackToBridgeAndTimelines) {
219
- const timelines = Reflect.get(window, "__timelines");
220
- if (typeof timelines === "object" && timelines !== null) {
221
- for (const key of Object.keys(timelines)) {
222
- const timeline = Reflect.get(timelines, key);
223
- call(getProperty(timeline, "pause"), timeline, []);
224
- call(getProperty(timeline, "seek"), timeline, [safe]);
216
+ const gsap = Reflect.get(window, "gsap");
217
+ const ticker = getProperty(gsap, "ticker");
218
+ const seekTo = (time) => {
219
+ if (call(renderSeek, player, exactTime ? [time, { exact: true }] : [time])) {
220
+ } else if (fallbackToBridgeAndTimelines && call(bridgeSeek, hf, [time])) {
221
+ } else if (call(playerSeek, player, [time])) {
222
+ } else if (fallbackToBridgeAndTimelines) {
223
+ const timelines = Reflect.get(window, "__timelines");
224
+ if (typeof timelines === "object" && timelines !== null) {
225
+ for (const key of Object.keys(timelines)) {
226
+ const timeline = Reflect.get(timelines, key);
227
+ call(getProperty(timeline, "pause"), timeline, []);
228
+ call(getProperty(timeline, "seek"), timeline, [time]);
229
+ }
230
+ }
231
+ }
232
+ call(getProperty(ticker, "tick"), ticker, []);
233
+ };
234
+ const gateSlot = /* @__PURE__ */ Symbol.for("hyperframes.webglDrawGate");
235
+ let gate = Reflect.get(window, gateSlot);
236
+ if (skipDraws && !gate) {
237
+ const installed = { skip: false, skipped: false };
238
+ for (const name of ["WebGLRenderingContext", "WebGL2RenderingContext"]) {
239
+ const proto = getProperty(Reflect.get(window, name), "prototype");
240
+ if (!proto) continue;
241
+ for (const method of [
242
+ "clear",
243
+ "drawArrays",
244
+ "drawElements",
245
+ "drawArraysInstanced",
246
+ "drawElementsInstanced",
247
+ "drawRangeElements",
248
+ "blitFramebuffer"
249
+ ]) {
250
+ const draw = getProperty(proto, method);
251
+ if (typeof draw !== "function") continue;
252
+ Reflect.set(proto, method, function(...args) {
253
+ if (!installed.skip) return Reflect.apply(draw, this, args);
254
+ installed.skipped = true;
255
+ return void 0;
256
+ });
225
257
  }
226
258
  }
259
+ Reflect.set(window, gateSlot, installed);
260
+ gate = installed;
227
261
  }
228
- const gsap = Reflect.get(window, "gsap");
229
- const ticker = getProperty(gsap, "ticker");
230
- call(getProperty(ticker, "tick"), ticker, []);
262
+ const seekWithoutDraws = (time) => {
263
+ if (!gate) return seekTo(time);
264
+ gate.skip = true;
265
+ try {
266
+ seekTo(time);
267
+ } finally {
268
+ gate.skip = false;
269
+ }
270
+ };
271
+ if (skipDraws) {
272
+ seekWithoutDraws(safe);
273
+ return;
274
+ }
275
+ if (gate?.skipped) {
276
+ seekWithoutDraws(safe >= 1e-3 ? safe - 1e-3 : safe + 1e-3);
277
+ gate.skipped = false;
278
+ }
279
+ seekTo(safe);
231
280
  },
232
281
  timeSeconds,
233
282
  options.fallbackToBridgeAndTimelines === true,
234
- options.exactTime === true
283
+ options.exactTime === true,
284
+ options.skipWebglDraws === true
235
285
  );
236
286
  await page.evaluate(
237
287
  async (barrier) => {
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-HVW7ABXD.js";
13
13
  import {
14
14
  DEFAULT_REGISTRY_URL
15
- } from "./chunk-EELTMBCC.js";
15
+ } from "./chunk-RTW6WSC7.js";
16
16
 
17
17
  // src/utils/projectConfig.ts
18
18
  import { readFileSync, writeFileSync } from "fs";
@@ -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-7FHFPHEM.js";
23
+ } from "./chunk-VKFYI7AQ.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-ZGMLMQ3B.js");
273
+ const engine = await import("./src-VFTQPSQD.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 };
@@ -40,7 +40,7 @@ import {
40
40
  stripEmbeddedRuntimeScripts,
41
41
  styleElementsFor,
42
42
  warnUnknownEnumValues
43
- } from "./chunk-BIV5HVTQ.js";
43
+ } from "./chunk-6M3IPJS6.js";
44
44
  import {
45
45
  cssVariableName
46
46
  } from "./chunk-VC76R6W2.js";
@@ -134,6 +134,7 @@ import { createHash } from "crypto";
134
134
  // ../core/dist/sceneParts.js
135
135
  var SCENE_PART_ATTR = "data-hf-scene";
136
136
  var SCENE_PARTS_META = "hf-scene-parts";
137
+ var SCENE_FONTS_ATTR = "data-hf-scene-fonts";
137
138
  var SCENE_NO_SWAP_ATTR = "data-hf-scene-no-swap";
138
139
 
139
140
  // ../core/dist/compiler/externalScripts.js
@@ -721,7 +722,12 @@ function fontFaceKey(atRule) {
721
722
  });
722
723
  return decls.join(";");
723
724
  }
724
- function dedupeFontFaceRules(styleTexts) {
725
+ var dedupeFontFaceRules = (styleTexts) => dropFontFaces(styleTexts);
726
+ function hoistFontFaceRules(styleTexts) {
727
+ const faces = [];
728
+ return { styles: dropFontFaces(styleTexts, faces), faces };
729
+ }
730
+ function dropFontFaces(styleTexts, hoisted) {
725
731
  const seen = /* @__PURE__ */ new Set();
726
732
  return [...styleTexts].reverse().map((css) => {
727
733
  if (!css || !/@font-face/i.test(css))
@@ -737,12 +743,14 @@ function dedupeFontFaceRules(styleTexts) {
737
743
  if (!isFontFaceAtRule(node))
738
744
  continue;
739
745
  const key = fontFaceKey(node);
740
- if (seen.has(key)) {
741
- node.remove();
742
- changed = true;
743
- } else {
746
+ if (!seen.has(key)) {
744
747
  seen.add(key);
748
+ if (!hoisted)
749
+ continue;
750
+ hoisted.unshift(node.toString());
745
751
  }
752
+ node.remove();
753
+ changed = true;
746
754
  }
747
755
  return changed ? root.toResult({ map: false }).css : css;
748
756
  }).reverse();
@@ -2859,12 +2867,17 @@ async function bundleProject(projectDir, options) {
2859
2867
  if (srcset)
2860
2868
  el.setAttribute("srcset", rewriteSrcsetWithInlinedAssets(srcset, projectDir, inlineAssets));
2861
2869
  }
2862
- if (!options?.sceneParts) {
2863
- const liveStyles = [...document.querySelectorAll("style")].filter(isAlwaysAppliedStyle);
2864
- const dedupedStyles = dedupeFontFaceRules(liveStyles.map((el) => el.textContent || ""));
2865
- liveStyles.forEach((el, i) => {
2866
- el.textContent = dedupedStyles[i] ?? "";
2867
- });
2870
+ const liveStyles = [...document.querySelectorAll("style")].filter(isAlwaysAppliedStyle);
2871
+ const liveCss = liveStyles.map((el) => el.textContent || "");
2872
+ const { styles, faces } = options?.sceneParts ? hoistFontFaceRules(liveCss) : { styles: dedupeFontFaceRules(liveCss), faces: [] };
2873
+ liveStyles.forEach((el, i) => {
2874
+ el.textContent = styles[i] ?? "";
2875
+ });
2876
+ if (faces.length > 0) {
2877
+ const holder = document.createElement("style");
2878
+ holder.setAttribute(SCENE_FONTS_ATTR, "");
2879
+ holder.textContent = faces.join("\n");
2880
+ document.head.prepend(holder);
2868
2881
  }
2869
2882
  for (const styleEl of document.querySelectorAll("style")) {
2870
2883
  styleEl.textContent = rewriteCssUrlsWithInlinedAssets(styleEl.textContent || "", projectDir, inlineAssets);
@@ -3104,7 +3117,9 @@ function addScenePartsManifest(html, ignore = []) {
3104
3117
  }
3105
3118
  for (const el of parts)
3106
3119
  el.replaceWith(doc.createComment(`hf-scene:${el.getAttribute(SCENE_PART_ATTR)}`));
3107
- for (const el of ignore.flatMap((sel) => [...doc.querySelectorAll(sel)]))
3120
+ for (const el of [...ignore, `style[${SCENE_FONTS_ATTR}]`].flatMap((sel) => [
3121
+ ...doc.querySelectorAll(sel)
3122
+ ]))
3108
3123
  el.remove();
3109
3124
  const manifest = {
3110
3125
  shared: hash(doc.toString()),
@@ -4,6 +4,9 @@ import { dirname as __hf_dirname } from "node:path";
4
4
  var require = __hf_createRequire(import.meta.url);
5
5
  var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ c
9
+ } from "./chunk-ZTZA4UWZ.js";
7
10
  import {
8
11
  VALID_CANVAS_RESOLUTIONS,
9
12
  resolveResolutionFlagPair
@@ -23,6 +26,20 @@ function parseOutputResolutionFlag(raw, options) {
23
26
  );
24
27
  }
25
28
 
29
+ // src/utils/missingPackage.ts
30
+ function isMissingPackageError(error, pkg) {
31
+ return error?.code === "ERR_MODULE_NOT_FOUND" && error instanceof Error && error.message.includes(`Cannot find package '${pkg}'`);
32
+ }
33
+ function missingPackageMessage(pkg, command) {
34
+ return `${c.error(`${pkg} is not installed.`)} The ${c.accent(command)} command needs it at runtime.
35
+ Install it alongside the CLI:
36
+ ${c.accent(`npm install -g ${pkg}`)}
37
+ Or, for an opt-in project setup:
38
+ ${c.accent(`npm install ${pkg}`)}`;
39
+ }
40
+
26
41
  export {
27
- parseOutputResolutionFlag
42
+ parseOutputResolutionFlag,
43
+ isMissingPackageError,
44
+ missingPackageMessage
28
45
  };
@@ -17,7 +17,7 @@ import {
17
17
  isAllowedHtmlAttribute,
18
18
  isSafeAttributeValue,
19
19
  sanitizeRichTextChildren
20
- } from "./chunk-O3J7BHBU.js";
20
+ } from "./chunk-QZUVPWC4.js";
21
21
  import {
22
22
  decodedUrlPath,
23
23
  removeElementWithGsapCascade