@ignix-social/editor 0.1.0
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/LICENSE +190 -0
- package/NOTICE +54 -0
- package/README.md +23 -0
- package/bin/ignix-editor.mjs +8 -0
- package/package.json +53 -0
- package/patches/index.mjs +53 -0
- package/scripts/build-ffmpeg-macos.sh +35 -0
- package/scripts/build-whisper-macos.sh +21 -0
- package/scripts/vendor.mjs +41 -0
- package/skills/ignix-editor/SKILL.md +132 -0
- package/src/audio.mjs +31 -0
- package/src/binaries.json +46 -0
- package/src/binaries.mjs +83 -0
- package/src/cli.mjs +254 -0
- package/src/prepare.mjs +74 -0
- package/src/runtime/ignix-frame.js +92 -0
- package/src/transcribe.mjs +71 -0
- package/src/validate.mjs +71 -0
- package/templates/blank/index.html +41 -0
- package/vendor/hyperframes/README.md +181 -0
- package/vendor/hyperframes/UPSTREAM.json +12 -0
- package/vendor/hyperframes/bin/hyperframes-localize-fonts.mjs +12 -0
- package/vendor/hyperframes/bin/hyperframes.mjs +11 -0
- package/vendor/hyperframes/dist/add-LR3ZR2A5.js +79 -0
- package/vendor/hyperframes/dist/agentPromptGenerator-VIIPZCJ3.js +143 -0
- package/vendor/hyperframes/dist/animatedGifPrep-P2T6YM7Z.js +34 -0
- package/vendor/hyperframes/dist/asset-BE2DOV72.js +26 -0
- package/vendor/hyperframes/dist/assetCataloger-VBLPHX24.js +340 -0
- package/vendor/hyperframes/dist/auth-RCQB2ZT7.js +60 -0
- package/vendor/hyperframes/dist/autoUpdate-RJAX3DAZ.js +268 -0
- package/vendor/hyperframes/dist/backgroundChecks-H2LCUIMJ.js +61 -0
- package/vendor/hyperframes/dist/backgroundChecksWorker.js +26 -0
- package/vendor/hyperframes/dist/batchRender-FT7AP7XH.js +355 -0
- package/vendor/hyperframes/dist/beat-analyzer.global.js +338 -0
- package/vendor/hyperframes/dist/beats-Y2EOP72P.js +309 -0
- package/vendor/hyperframes/dist/benchmark-MZ7GY3JW.js +231 -0
- package/vendor/hyperframes/dist/browser-HUTAMRQE.js +237 -0
- package/vendor/hyperframes/dist/bundleWithLocalizedFonts-5QOPOB5D.js +52 -0
- package/vendor/hyperframes/dist/capture-RLZA6EMR.js +4079 -0
- package/vendor/hyperframes/dist/capture-SZZ4IYJK.js +290 -0
- package/vendor/hyperframes/dist/captureFile-LYOJOUIE.js +15 -0
- package/vendor/hyperframes/dist/captureTimeout-PA4FYWT5.js +27 -0
- package/vendor/hyperframes/dist/catalog-KYU55EWR.js +1001 -0
- package/vendor/hyperframes/dist/check-TCG4PXLR.js +1697 -0
- package/vendor/hyperframes/dist/checkBrowser-RPMO4OW5.js +1032 -0
- package/vendor/hyperframes/dist/chunk-2EAXUCCE.js +88 -0
- package/vendor/hyperframes/dist/chunk-2EGFTPWD.js +1077 -0
- package/vendor/hyperframes/dist/chunk-2PSPARWP.js +6058 -0
- package/vendor/hyperframes/dist/chunk-2YN64IN5.js +5747 -0
- package/vendor/hyperframes/dist/chunk-3GXQPCJC.js +682 -0
- package/vendor/hyperframes/dist/chunk-3ZP5DXE7.js +15 -0
- package/vendor/hyperframes/dist/chunk-4NWOGZZS.js +1990 -0
- package/vendor/hyperframes/dist/chunk-4PFZPP2N.js +587 -0
- package/vendor/hyperframes/dist/chunk-4THIAPBL.js +128 -0
- package/vendor/hyperframes/dist/chunk-4YYJOFKS.js +28 -0
- package/vendor/hyperframes/dist/chunk-54HJ63Q2.js +29 -0
- package/vendor/hyperframes/dist/chunk-5ETJX6WM.js +89 -0
- package/vendor/hyperframes/dist/chunk-5IAKAQA7.js +389 -0
- package/vendor/hyperframes/dist/chunk-5Z63TBTX.js +37 -0
- package/vendor/hyperframes/dist/chunk-6BEFEWFB.js +25 -0
- package/vendor/hyperframes/dist/chunk-6CSYCFQV.js +68 -0
- package/vendor/hyperframes/dist/chunk-6CTIGJY7.js +154 -0
- package/vendor/hyperframes/dist/chunk-7HG4BFIN.js +93 -0
- package/vendor/hyperframes/dist/chunk-7JZ4FXP2.js +118 -0
- package/vendor/hyperframes/dist/chunk-A2Z4Z4VL.js +2961 -0
- package/vendor/hyperframes/dist/chunk-AMKC3AXA.js +25 -0
- package/vendor/hyperframes/dist/chunk-AVUUN2XD.js +4847 -0
- package/vendor/hyperframes/dist/chunk-AWDFDFI3.js +46 -0
- package/vendor/hyperframes/dist/chunk-AWNBM3MZ.js +94 -0
- package/vendor/hyperframes/dist/chunk-BXCMXMJQ.js +73 -0
- package/vendor/hyperframes/dist/chunk-BZ56MTDX.js +6 -0
- package/vendor/hyperframes/dist/chunk-CFKU7HTK.js +171 -0
- package/vendor/hyperframes/dist/chunk-CWPVM2QV.js +308 -0
- package/vendor/hyperframes/dist/chunk-DPVXBVLL.js +31292 -0
- package/vendor/hyperframes/dist/chunk-DQBY7FRR.js +397 -0
- package/vendor/hyperframes/dist/chunk-E6RPWJVC.js +213 -0
- package/vendor/hyperframes/dist/chunk-EISRN4E6.js +294 -0
- package/vendor/hyperframes/dist/chunk-EOVYQ3IG.js +143 -0
- package/vendor/hyperframes/dist/chunk-F3WZGU7C.js +479 -0
- package/vendor/hyperframes/dist/chunk-FCSIGXXP.js +366 -0
- package/vendor/hyperframes/dist/chunk-FI4I7CME.js +56 -0
- package/vendor/hyperframes/dist/chunk-FLWXXDNS.js +15 -0
- package/vendor/hyperframes/dist/chunk-GK4AIFIH.js +11171 -0
- package/vendor/hyperframes/dist/chunk-GMECXFAN.js +57 -0
- package/vendor/hyperframes/dist/chunk-GULOKZLI.js +155 -0
- package/vendor/hyperframes/dist/chunk-H4YZZ2VQ.js +68 -0
- package/vendor/hyperframes/dist/chunk-H6QMKUYA.js +477 -0
- package/vendor/hyperframes/dist/chunk-HBBJFK6I.js +273 -0
- package/vendor/hyperframes/dist/chunk-HRUGC23L.js +212 -0
- package/vendor/hyperframes/dist/chunk-HVW7ABXD.js +19 -0
- package/vendor/hyperframes/dist/chunk-HW6OYASV.js +344 -0
- package/vendor/hyperframes/dist/chunk-HWKCIWQT.js +3578 -0
- package/vendor/hyperframes/dist/chunk-I465DBM6.js +1214 -0
- package/vendor/hyperframes/dist/chunk-IGLEPPTN.js +24 -0
- package/vendor/hyperframes/dist/chunk-IGNAAHS3.js +433 -0
- package/vendor/hyperframes/dist/chunk-IHFUKJOR.js +85 -0
- package/vendor/hyperframes/dist/chunk-IQ3OUQ5Z.js +213 -0
- package/vendor/hyperframes/dist/chunk-ISN5GRYI.js +20 -0
- package/vendor/hyperframes/dist/chunk-IUZFXWSV.js +446 -0
- package/vendor/hyperframes/dist/chunk-JH556Q42.js +647 -0
- package/vendor/hyperframes/dist/chunk-JTHMTOMQ.js +601 -0
- package/vendor/hyperframes/dist/chunk-K2EQN4VU.js +405 -0
- package/vendor/hyperframes/dist/chunk-K2FTXJYH.js +16044 -0
- package/vendor/hyperframes/dist/chunk-K4WIOZFP.js +32 -0
- package/vendor/hyperframes/dist/chunk-K4WKGXRC.js +18 -0
- package/vendor/hyperframes/dist/chunk-KBJUXVOJ.js +172 -0
- package/vendor/hyperframes/dist/chunk-KC5XXX3X.js +590 -0
- package/vendor/hyperframes/dist/chunk-KNU5COPB.js +29 -0
- package/vendor/hyperframes/dist/chunk-KZI44OPA.js +185 -0
- package/vendor/hyperframes/dist/chunk-L3YOGIPG.js +48 -0
- package/vendor/hyperframes/dist/chunk-LAOCA3MQ.js +189 -0
- package/vendor/hyperframes/dist/chunk-LCSMOLGX.js +312 -0
- package/vendor/hyperframes/dist/chunk-LFGJWOVA.js +61 -0
- package/vendor/hyperframes/dist/chunk-LHSR3M4M.js +498 -0
- package/vendor/hyperframes/dist/chunk-LYNI3FOL.js +123 -0
- package/vendor/hyperframes/dist/chunk-M2WBOQ2Q.js +54 -0
- package/vendor/hyperframes/dist/chunk-MRF4AMKD.js +104 -0
- package/vendor/hyperframes/dist/chunk-MWB3ZIFM.js +852 -0
- package/vendor/hyperframes/dist/chunk-NGKM64BP.js +39 -0
- package/vendor/hyperframes/dist/chunk-NXMYHJAL.js +43 -0
- package/vendor/hyperframes/dist/chunk-OAF4XJOW.js +192 -0
- package/vendor/hyperframes/dist/chunk-OFQWTKPW.js +117 -0
- package/vendor/hyperframes/dist/chunk-P6LJ4Y32.js +4662 -0
- package/vendor/hyperframes/dist/chunk-PBN6GBJE.js +108 -0
- package/vendor/hyperframes/dist/chunk-PDAMK4Q5.js +28 -0
- package/vendor/hyperframes/dist/chunk-PFCFR3KZ.js +20 -0
- package/vendor/hyperframes/dist/chunk-PJ3HDUCY.js +108 -0
- package/vendor/hyperframes/dist/chunk-PMRBLBUP.js +152 -0
- package/vendor/hyperframes/dist/chunk-PPQUYWTW.js +240 -0
- package/vendor/hyperframes/dist/chunk-Q5X2B5WT.js +29 -0
- package/vendor/hyperframes/dist/chunk-Q7IU7MOR.js +351 -0
- package/vendor/hyperframes/dist/chunk-QC4FJVLM.js +371 -0
- package/vendor/hyperframes/dist/chunk-QNYYOUU3.js +1318 -0
- package/vendor/hyperframes/dist/chunk-RDNNAKEP.js +161 -0
- package/vendor/hyperframes/dist/chunk-RMHUQGRK.js +657 -0
- package/vendor/hyperframes/dist/chunk-RQVDTPGD.js +6 -0
- package/vendor/hyperframes/dist/chunk-RVCWIIZ7.js +68 -0
- package/vendor/hyperframes/dist/chunk-S3D6GE5W.js +72 -0
- package/vendor/hyperframes/dist/chunk-S3S4TGEH.js +424 -0
- package/vendor/hyperframes/dist/chunk-S7NPLFWV.js +11395 -0
- package/vendor/hyperframes/dist/chunk-SHB5VDMH.js +51 -0
- package/vendor/hyperframes/dist/chunk-TCLGPL65.js +860 -0
- package/vendor/hyperframes/dist/chunk-THXFSPLV.js +40 -0
- package/vendor/hyperframes/dist/chunk-TJSTGSAW.js +354 -0
- package/vendor/hyperframes/dist/chunk-TQFG7HTI.js +1024 -0
- package/vendor/hyperframes/dist/chunk-TVCRUG2S.js +265 -0
- package/vendor/hyperframes/dist/chunk-TWWSYAKJ.js +24 -0
- package/vendor/hyperframes/dist/chunk-U7CZBDMV.js +27 -0
- package/vendor/hyperframes/dist/chunk-UEZXMWG3.js +139 -0
- package/vendor/hyperframes/dist/chunk-UYEZTK4U.js +61 -0
- package/vendor/hyperframes/dist/chunk-VC76R6W2.js +27 -0
- package/vendor/hyperframes/dist/chunk-VFCKXTBB.js +159 -0
- package/vendor/hyperframes/dist/chunk-VWG7OQKU.js +22 -0
- package/vendor/hyperframes/dist/chunk-VXVRPIJA.js +105 -0
- package/vendor/hyperframes/dist/chunk-WBLXWOYK.js +15 -0
- package/vendor/hyperframes/dist/chunk-WERLJGIC.js +20 -0
- package/vendor/hyperframes/dist/chunk-WMQNIQDJ.js +2057 -0
- package/vendor/hyperframes/dist/chunk-WPHMNO44.js +4528 -0
- package/vendor/hyperframes/dist/chunk-X5HWXQPU.js +113 -0
- package/vendor/hyperframes/dist/chunk-X7MTZ4T2.js +6 -0
- package/vendor/hyperframes/dist/chunk-XH4DSOS5.js +59 -0
- package/vendor/hyperframes/dist/chunk-XS4EJSKU.js +23 -0
- package/vendor/hyperframes/dist/chunk-XT5P4QMO.js +181 -0
- package/vendor/hyperframes/dist/chunk-XT7X6QCP.js +6 -0
- package/vendor/hyperframes/dist/chunk-XUHOIDKG.js +6 -0
- package/vendor/hyperframes/dist/chunk-XUXGIA7H.js +485 -0
- package/vendor/hyperframes/dist/chunk-XZABUQTX.js +113 -0
- package/vendor/hyperframes/dist/chunk-Y6W4DVPS.js +356 -0
- package/vendor/hyperframes/dist/chunk-YEIFI443.js +44 -0
- package/vendor/hyperframes/dist/chunk-YQZNILVH.js +375 -0
- package/vendor/hyperframes/dist/chunk-Z27A7NUB.js +65 -0
- package/vendor/hyperframes/dist/chunk-Z6B37SNM.js +3081 -0
- package/vendor/hyperframes/dist/chunk-ZJUKFZ2P.js +10954 -0
- package/vendor/hyperframes/dist/chunk-ZKDMAOFU.js +32 -0
- package/vendor/hyperframes/dist/chunk-ZMXUQLI2.js +17219 -0
- package/vendor/hyperframes/dist/chunk-ZTZ7NCJT.js +58 -0
- package/vendor/hyperframes/dist/chunk-ZTZA4UWZ.js +108 -0
- package/vendor/hyperframes/dist/clean-W57E5YQ3.js +293 -0
- package/vendor/hyperframes/dist/cli.js +495 -0
- package/vendor/hyperframes/dist/cloud-FFTJGZ24.js +70 -0
- package/vendor/hyperframes/dist/cloudrun-AJUTHUEA.js +763 -0
- package/vendor/hyperframes/dist/colors-HKWSZCGK.js +15 -0
- package/vendor/hyperframes/dist/commands/contrast-audit.browser.js +459 -0
- package/vendor/hyperframes/dist/commands/layout-audit.browser.js +2102 -0
- package/vendor/hyperframes/dist/commands/motion-sample.browser.js +74 -0
- package/vendor/hyperframes/dist/commands/motion-signature.browser.js +374 -0
- package/vendor/hyperframes/dist/compare-AYCTT55F.js +421 -0
- package/vendor/hyperframes/dist/compiler-QO36EXLS.js +121 -0
- package/vendor/hyperframes/dist/component-VFFR2O7T.js +176 -0
- package/vendor/hyperframes/dist/compositions-QTVN3U2A.js +228 -0
- package/vendor/hyperframes/dist/contactSheet-27SRU7A4.js +22 -0
- package/vendor/hyperframes/dist/delete-ZAKYCB7I.js +114 -0
- package/vendor/hyperframes/dist/deploy-MX76RZ36.js +101 -0
- package/vendor/hyperframes/dist/destroy-H2TZBYHH.js +42 -0
- package/vendor/hyperframes/dist/deterministicFonts-HAEMV4TM.js +50 -0
- package/vendor/hyperframes/dist/dist-EWXJGN63.js +129 -0
- package/vendor/hyperframes/dist/dist-FNNGCKFS.js +29 -0
- package/vendor/hyperframes/dist/dist-S3PJNPXQ.js +392 -0
- package/vendor/hyperframes/dist/docker/Dockerfile.render +65 -0
- package/vendor/hyperframes/dist/docs/compositions.md +67 -0
- package/vendor/hyperframes/dist/docs/data-attributes.md +27 -0
- package/vendor/hyperframes/dist/docs/examples.md +19 -0
- package/vendor/hyperframes/dist/docs/gsap.md +26 -0
- package/vendor/hyperframes/dist/docs/rendering.md +35 -0
- package/vendor/hyperframes/dist/docs/troubleshooting.md +29 -0
- package/vendor/hyperframes/dist/docs-QAPJEGLS.js +131 -0
- package/vendor/hyperframes/dist/doctor-AI7C3FON.js +67 -0
- package/vendor/hyperframes/dist/dom-IROKGVJI.js +14 -0
- package/vendor/hyperframes/dist/dotEnv-AECLXQSO.js +14 -0
- package/vendor/hyperframes/dist/events-7LALYNKZ.js +92 -0
- package/vendor/hyperframes/dist/events-FQY3HGKZ.js +88 -0
- package/vendor/hyperframes/dist/feedback-WCMDMSTK.js +472 -0
- package/vendor/hyperframes/dist/ffmpeg-QIUFEFTY.js +35 -0
- package/vendor/hyperframes/dist/figma-64WY462P.js +63 -0
- package/vendor/hyperframes/dist/fontData.generated-NXAOI4GH.js +13 -0
- package/vendor/hyperframes/dist/fontLocalizeCli.js +132 -0
- package/vendor/hyperframes/dist/get-FPOMJMZB.js +103 -0
- package/vendor/hyperframes/dist/gpuPolicy-2ZUZE5D6.js +38 -0
- package/vendor/hyperframes/dist/grade-compare-E2CKPST4.js +647 -0
- package/vendor/hyperframes/dist/gsapParser-DIYYX6JT.js +2846 -0
- package/vendor/hyperframes/dist/gsapParserAcorn-E3GEIRZB.js +28 -0
- package/vendor/hyperframes/dist/help-YRQIDDML.js +197 -0
- package/vendor/hyperframes/dist/history-PP5NDRV3.js +571 -0
- package/vendor/hyperframes/dist/hyperframe-runtime.js +1081 -0
- package/vendor/hyperframes/dist/hyperframe.manifest.json +22 -0
- package/vendor/hyperframes/dist/hyperframe.runtime.iife.js +1081 -0
- package/vendor/hyperframes/dist/hyperframes-player.global.js +474 -0
- package/vendor/hyperframes/dist/hyperframes-slideshow.global.js +149 -0
- package/vendor/hyperframes/dist/info-SEX3B7JL.js +153 -0
- package/vendor/hyperframes/dist/init-U3AKHO5B.js +1147 -0
- package/vendor/hyperframes/dist/inspect-Q3K6EDEK.js +97 -0
- package/vendor/hyperframes/dist/installer-K6O5WF44.js +37 -0
- package/vendor/hyperframes/dist/keyframes-DC64JCI3.js +2602 -0
- package/vendor/hyperframes/dist/lambda-D7UMN4DJ.js +451 -0
- package/vendor/hyperframes/dist/layout-XSPPDHOO.js +86 -0
- package/vendor/hyperframes/dist/lib-TPG2ZMAX.js +128 -0
- package/vendor/hyperframes/dist/lint-7DQZE7L3.js +164 -0
- package/vendor/hyperframes/dist/lintProject-OHBBM3DJ.js +27 -0
- package/vendor/hyperframes/dist/list-4K5MVDQX.js +162 -0
- package/vendor/hyperframes/dist/login-NTX4OWXL.js +377 -0
- package/vendor/hyperframes/dist/logout-Q654A3SI.js +100 -0
- package/vendor/hyperframes/dist/manager-67P2XFXQ.js +34 -0
- package/vendor/hyperframes/dist/manager-CT3D67CG.js +38 -0
- package/vendor/hyperframes/dist/manager-GFN75DM4.js +30 -0
- package/vendor/hyperframes/dist/media-treatment-5FYAOPNL.js +972 -0
- package/vendor/hyperframes/dist/media-use-4XXGABIL.js +113 -0
- package/vendor/hyperframes/dist/models-C4E4IWJD.js +137 -0
- package/vendor/hyperframes/dist/motionShot-S4MIGMT5.js +614 -0
- package/vendor/hyperframes/dist/normalize-O76AC4HE.js +333 -0
- package/vendor/hyperframes/dist/normalize-audio-CSFTXLXD.js +276 -0
- package/vendor/hyperframes/dist/open-2ZD6BHZG.js +115 -0
- package/vendor/hyperframes/dist/pipeline-TNGWUZQC.js +54 -0
- package/vendor/hyperframes/dist/play-CTMUXX6E.js +349 -0
- package/vendor/hyperframes/dist/policies-FSDZVS2E.js +292 -0
- package/vendor/hyperframes/dist/preflight-SMNV6RW2.js +45 -0
- package/vendor/hyperframes/dist/present-WQVHV5CR.js +350 -0
- package/vendor/hyperframes/dist/preview-JOJXTH75.js +1820 -0
- package/vendor/hyperframes/dist/producer-ECLEN5RP.js +13 -0
- package/vendor/hyperframes/dist/progress-FBIEEB7Y.js +73 -0
- package/vendor/hyperframes/dist/projectConfig-HYJMJ5BY.js +56 -0
- package/vendor/hyperframes/dist/publication-HQ5Y3KBM.js +29 -0
- package/vendor/hyperframes/dist/publish-VHDYQASC.js +430 -0
- package/vendor/hyperframes/dist/refresh-K24ETHMA.js +53 -0
- package/vendor/hyperframes/dist/remove-background-W2YX2NVH.js +253 -0
- package/vendor/hyperframes/dist/render-AO5VX3YI.js +177 -0
- package/vendor/hyperframes/dist/render-LNO62LEL.js +2367 -0
- package/vendor/hyperframes/dist/render-TTQI7TGN.js +796 -0
- package/vendor/hyperframes/dist/render-batch-YH7CTWNY.js +284 -0
- package/vendor/hyperframes/dist/renderCancellation-JPIHE47X.js +35 -0
- package/vendor/hyperframes/dist/renderSetupWorker.js +79 -0
- package/vendor/hyperframes/dist/resolver-IZ647GBZ.js +38 -0
- package/vendor/hyperframes/dist/runtimeVersion.js +18 -0
- package/vendor/hyperframes/dist/screenshotCapture-ECBTLCU6.js +179 -0
- package/vendor/hyperframes/dist/shaderTransitionWorker.js +44 -0
- package/vendor/hyperframes/dist/sherpa-KKLNW6U2.js +314 -0
- package/vendor/hyperframes/dist/sherpaWorker.js +77 -0
- package/vendor/hyperframes/dist/sites-TNVKZS73.js +52 -0
- package/vendor/hyperframes/dist/skill-ZHVLH7KX.js +15 -0
- package/vendor/hyperframes/dist/skills/hyperframes/SKILL.md +152 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/brief-contract.md +108 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/brief-format.md +72 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/capability-menu.md +47 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/frame-worker-core.md +80 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/intent-interview.md +73 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/pitch-round.md +40 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/plugin-installation.md +43 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/production-loop.md +26 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/review-loop.md +37 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/route-briefs.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/embedded-captions.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/faceless-explainer.md +12 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/general-video.md +12 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/motion-graphics.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/music-to-video.md +12 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/pr-to-video.md +28 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/product-launch-video.md +13 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/remotion-to-hyperframes.md +9 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/slideshow.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/talking-head-recut.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/script-format.md +52 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/skill-lifecycle.md +35 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/storyboard-format.md +99 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/subagent-dispatch.md +35 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/workflow-catalog.md +10 -0
- package/vendor/hyperframes/dist/skills/hyperframes/scripts/lib/frame-packets-core.mjs +194 -0
- package/vendor/hyperframes/dist/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
- package/vendor/hyperframes/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/SKILL.md +189 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/beats.md +19 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/cloud.md +163 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/cloudrun.md +62 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/compare-and-batch.md +105 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/doctor-browser.md +57 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/init-and-scaffold.md +74 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/lambda.md +185 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +132 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/preview-render.md +193 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +134 -0
- package/vendor/hyperframes/dist/skills/media-use/SKILL.md +100 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/CREDITS.md +35 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/chime.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/click-soft.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/click.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/error.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-1.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-2.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-3.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/impact-bass-1.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/impact-bass-2.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/key-press.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/manifest.json +97 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/notification.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/ping.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/pop.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/riser.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/sparkle.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/typing.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh-cinematic.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh-short.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/bgm.md +76 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/authoring.md +163 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/motion.md +87 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/transcript-handling.md +97 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/remove-background.md +143 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/requirements.md +29 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/sfx.md +42 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/transcribe.md +52 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/tts-to-captions.md +35 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/tts.md +260 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/audio.mjs +311 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/audio.test.mjs +159 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +131 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-tts.mjs +122 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-tts.test.mjs +38 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-voice.mjs +98 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-voice.test.mjs +233 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/audio-meta.mjs +39 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/audio-meta.test.mjs +136 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm-volume.mjs +4 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm.mjs +257 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm.test.mjs +74 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/concurrency.mjs +14 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/concurrency.test.mjs +41 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.mjs +43 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.py +52 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.test.mjs +86 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth_test.py +90 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-tts.mjs +122 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-tts.test.mjs +243 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/heygen.mjs +197 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/heygen.test.mjs +185 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/media-record.mjs +114 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/media-record.test.mjs +205 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/python.mjs +77 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/python.test.mjs +136 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/sfx.mjs +165 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/sfx.test.mjs +121 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.mjs +389 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.spawn.test.mjs +158 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.test.mjs +230 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lyria-recipe.py +136 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/wait-bgm.mjs +175 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/wait-bgm.test.mjs +108 -0
- package/vendor/hyperframes/dist/skills/media-use/luts/README.md +28 -0
- package/vendor/hyperframes/dist/skills/media-use/luts/index.json +57 -0
- package/vendor/hyperframes/dist/skills/media-use/references/audio.md +20 -0
- package/vendor/hyperframes/dist/skills/media-use/references/grading.md +160 -0
- package/vendor/hyperframes/dist/skills/media-use/references/media-treatment-recipes.md +929 -0
- package/vendor/hyperframes/dist/skills/media-use/references/media-treatments.md +202 -0
- package/vendor/hyperframes/dist/skills/media-use/references/memory.md +37 -0
- package/vendor/hyperframes/dist/skills/media-use/references/meta.md +61 -0
- package/vendor/hyperframes/dist/skills/media-use/references/operations.md +327 -0
- package/vendor/hyperframes/dist/skills/media-use/references/resolve.md +150 -0
- package/vendor/hyperframes/dist/skills/media-use/references/setup-providers.md +80 -0
- package/vendor/hyperframes/dist/skills/media-use/references/telemetry-dashboard.md +49 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/audio-duck.mjs +113 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/compatibility.test.mjs +96 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/dither.mjs +328 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/dither.test.mjs +176 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/eval.mjs +369 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/adopt.mjs +128 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/adopt.test.mjs +95 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bgm-provider.mjs +20 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/brand-provider.mjs +59 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +119 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +139 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cache.mjs +148 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/candidates.mjs +91 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/candidates.test.mjs +155 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/codex-provider.mjs +161 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/codex-provider.test.mjs +34 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.d.mts +3 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.mjs +45 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.test.mjs +79 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/coverage.test.mjs +136 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-build.mjs +181 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-build.test.mjs +80 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-validate.mjs +198 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-validate.test.mjs +125 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cutlist.mjs +184 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cutlist.test.mjs +162 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/duck.mjs +95 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/duck.test.mjs +153 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/error-diffusion.mjs +230 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/error-diffusion.test.mjs +102 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ff-binaries.mjs +37 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/freeze.mjs +72 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/freeze.test.mjs +138 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/grade-analyzer.mjs +265 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/grade-analyzer.test.mjs +285 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-cli.mjs +191 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-cli.test.mjs +301 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-search.mjs +45 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-search.test.mjs +49 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-video-provider.mjs +138 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +435 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/image-provider.mjs +44 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/index-gen.mjs +63 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-media-search.mjs +32 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-models.mjs +318 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-models.test.mjs +220 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-run.mjs +78 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-run.test.mjs +121 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/logo-provider.mjs +244 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/logo-provider.test.mjs +298 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ltx-video-provider.mjs +94 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +316 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/lut-preset-provider.mjs +271 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +199 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.d.mts +19 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.mjs +279 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.test.mjs +397 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/match.mjs +47 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-fetch.mjs +85 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-fetch.test.mjs +197 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-home.mjs +20 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-home.test.mjs +61 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-search.d.mts +9 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-search.mjs +107 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/mflux-provider.mjs +128 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/mflux-provider.test.mjs +174 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/misses.mjs +49 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/misses.test.mjs +89 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/npx-sync.mjs +31 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/npx-sync.test.mjs +50 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/parakeet-words.mjs +27 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/parakeet-words.test.mjs +44 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/prefs-store.mjs +180 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/prefs-store.test.mjs +189 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/probe.mjs +41 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/probe.test.mjs +148 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/providers.mjs +5 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/recipe-store.mjs +367 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/recipe-store.test.mjs +367 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/registry.mjs +212 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/registry.test.mjs +262 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/search.mjs +24 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/search.test.mjs +32 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/sfx-provider.mjs +23 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/specs.mjs +132 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/specs.test.mjs +157 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/stats.mjs +117 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/stats.test.mjs +165 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/svg-sanitize.mjs +21 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/telemetry.mjs +210 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/telemetry.test.mjs +437 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/test-home.test.mjs +10 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/transcriptCutFade.mjs +21 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/transcriptCutFade.test.mjs +33 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/tts-local-provider.mjs +94 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/tts-local-provider.test.mjs +72 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/usage.mjs +57 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/usage.test.mjs +54 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/voice-provider.mjs +57 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/voice-provider.test.mjs +46 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/words.mjs +18 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/prefs.mjs +70 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/recipe.mjs +103 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/resolve.mjs +1369 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcribe.mjs +194 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcribe.test.mjs +112 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcript-cut.mjs +270 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcript-cut.test.mjs +117 -0
- package/vendor/hyperframes/dist/skills-MJ2J4GEM.js +808 -0
- package/vendor/hyperframes/dist/skillsUpdateCheck-TKTYQN5R.js +26 -0
- package/vendor/hyperframes/dist/slideshow-EJ4IMY6P.js +24 -0
- package/vendor/hyperframes/dist/snapshot-KIVDUUMN.js +875 -0
- package/vendor/hyperframes/dist/src-6YQBJGWR.js +202 -0
- package/vendor/hyperframes/dist/src-PVYUYV3M.js +471 -0
- package/vendor/hyperframes/dist/state-KAXGHF77.js +26 -0
- package/vendor/hyperframes/dist/staticProjectServer-7EU666GS.js +49 -0
- package/vendor/hyperframes/dist/status-YM52BQ6S.js +311 -0
- package/vendor/hyperframes/dist/studio/assets/hyperframes-player-Cp8e_Zst.js +473 -0
- package/vendor/hyperframes/dist/studio/assets/index-BX3KHhGX.js +71 -0
- package/vendor/hyperframes/dist/studio/assets/index-CASEBNy2.js +1 -0
- package/vendor/hyperframes/dist/studio/assets/index-D11atkBt.css +1 -0
- package/vendor/hyperframes/dist/studio/assets/index-DMTt9nTf.js +531 -0
- package/vendor/hyperframes/dist/studio/assets/index-oE1pOdAy.js +399 -0
- package/vendor/hyperframes/dist/studio/chunk-5VSXRGIX.js +948 -0
- package/vendor/hyperframes/dist/studio/chunk-5VSXRGIX.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-7UQWVN52.js +938 -0
- package/vendor/hyperframes/dist/studio/chunk-7UQWVN52.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-EEXSYY5F.js +190 -0
- package/vendor/hyperframes/dist/studio/chunk-EEXSYY5F.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-FOEID72M.js +1441 -0
- package/vendor/hyperframes/dist/studio/chunk-FOEID72M.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-PZ5AY32C.js +10 -0
- package/vendor/hyperframes/dist/studio/chunk-PZ5AY32C.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-TDWGXBUT.js +1103 -0
- package/vendor/hyperframes/dist/studio/chunk-TDWGXBUT.js.map +1 -0
- package/vendor/hyperframes/dist/studio/domEditingLayers-IEVLO54Z.js +47 -0
- package/vendor/hyperframes/dist/studio/domEditingLayers-IEVLO54Z.js.map +1 -0
- package/vendor/hyperframes/dist/studio/favicon.svg +14 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/audio.svg +7 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/captions.svg +5 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/composition.svg +12 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/image.svg +18 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/music.svg +10 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/text.svg +3 -0
- package/vendor/hyperframes/dist/studio/index.css +165 -0
- package/vendor/hyperframes/dist/studio/index.css.map +1 -0
- package/vendor/hyperframes/dist/studio/index.d.ts +4296 -0
- package/vendor/hyperframes/dist/studio/index.html +23 -0
- package/vendor/hyperframes/dist/studio/index.js +99693 -0
- package/vendor/hyperframes/dist/studio/index.js.map +1 -0
- package/vendor/hyperframes/dist/studio/player.d.ts +30 -0
- package/vendor/hyperframes/dist/studio/player.js +10 -0
- package/vendor/hyperframes/dist/studio/player.js.map +1 -0
- package/vendor/hyperframes/dist/studio/styles/tailwind-preset.d.ts +39 -0
- package/vendor/hyperframes/dist/studio/styles/tailwind-preset.js +50 -0
- package/vendor/hyperframes/dist/studio/styles/tailwind-preset.js.map +1 -0
- package/vendor/hyperframes/dist/studio/styles.css +1 -0
- package/vendor/hyperframes/dist/studio/ui.d.ts +296 -0
- package/vendor/hyperframes/dist/studio/ui.js +66 -0
- package/vendor/hyperframes/dist/studio/ui.js.map +1 -0
- package/vendor/hyperframes/dist/studio-api-PNQZRPX5.js +136 -0
- package/vendor/hyperframes/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
- package/vendor/hyperframes/dist/studioServer-UWRBPIOJ.js +1457 -0
- package/vendor/hyperframes/dist/synthesize-K62TIZWI.js +182 -0
- package/vendor/hyperframes/dist/system-EZYZNUFD.js +44 -0
- package/vendor/hyperframes/dist/telemetry-2YC4SGQU.js +144 -0
- package/vendor/hyperframes/dist/telemetry-QMYM4WME.js +95 -0
- package/vendor/hyperframes/dist/templates/_shared/AGENTS.md +107 -0
- package/vendor/hyperframes/dist/templates/_shared/CLAUDE.md +107 -0
- package/vendor/hyperframes/dist/templates/blank/index.html +55 -0
- package/vendor/hyperframes/dist/templates/from-file/index.html +75 -0
- package/vendor/hyperframes/dist/templates/warm-grain/compositions/captions.html +154 -0
- package/vendor/hyperframes/dist/templates/warm-grain/compositions/graphics.html +162 -0
- package/vendor/hyperframes/dist/templates/warm-grain/compositions/intro.html +87 -0
- package/vendor/hyperframes/dist/templates/warm-grain/index.html +264 -0
- package/vendor/hyperframes/dist/templates/warm-grain/registry-item.json +34 -0
- package/vendor/hyperframes/dist/timeline-77Z3BBQM.js +1377 -0
- package/vendor/hyperframes/dist/tokens-OBGTYE4Z.js +92 -0
- package/vendor/hyperframes/dist/transcribe-7NVFHCGA.js +387 -0
- package/vendor/hyperframes/dist/transcribe-BNSJRR4M.js +62 -0
- package/vendor/hyperframes/dist/tts-P3LIPIL5.js +234 -0
- package/vendor/hyperframes/dist/updateCheck-UDWIJ4ZQ.js +39 -0
- package/vendor/hyperframes/dist/upgrade-CT3CPO3E.js +231 -0
- package/vendor/hyperframes/dist/urlDownloader-H6WRI2UE.js +39 -0
- package/vendor/hyperframes/dist/usage-EC3KFUIJ.js +2139 -0
- package/vendor/hyperframes/dist/validate-65QDZJWZ.js +70 -0
- package/vendor/hyperframes/dist/video-FGSGKRSV.js +261 -0
- package/vendor/hyperframes/dist/workspaceBuildCheck-TOLGAI4T.js +133 -0
- package/vendor/hyperframes/package.json +80 -0
|
@@ -0,0 +1,1077 @@
|
|
|
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
|
+
serveStaticProjectHtml
|
|
9
|
+
} from "./chunk-KBJUXVOJ.js";
|
|
10
|
+
import {
|
|
11
|
+
AUDIT_SEEK_OPTIONS,
|
|
12
|
+
installPageFunctionGuard,
|
|
13
|
+
seekCompositionTimeline,
|
|
14
|
+
waitForCompositionFonts,
|
|
15
|
+
waitForRuntimeReady
|
|
16
|
+
} from "./chunk-YQZNILVH.js";
|
|
17
|
+
import {
|
|
18
|
+
launchManagedBrowser,
|
|
19
|
+
resolveManagedGpuMode
|
|
20
|
+
} from "./chunk-7HG4BFIN.js";
|
|
21
|
+
import {
|
|
22
|
+
resolveDiagnosticNavigationTimeoutMs
|
|
23
|
+
} from "./chunk-HRUGC23L.js";
|
|
24
|
+
import {
|
|
25
|
+
resolveProject
|
|
26
|
+
} from "./chunk-S3D6GE5W.js";
|
|
27
|
+
import {
|
|
28
|
+
c
|
|
29
|
+
} from "./chunk-ZTZA4UWZ.js";
|
|
30
|
+
import {
|
|
31
|
+
defineCommand
|
|
32
|
+
} from "./chunk-S3S4TGEH.js";
|
|
33
|
+
import {
|
|
34
|
+
failCommand,
|
|
35
|
+
setCommandExitCode
|
|
36
|
+
} from "./chunk-PBN6GBJE.js";
|
|
37
|
+
import {
|
|
38
|
+
printDeprecationNotice,
|
|
39
|
+
withMeta
|
|
40
|
+
} from "./chunk-HW6OYASV.js";
|
|
41
|
+
import {
|
|
42
|
+
normalizeErrorMessage
|
|
43
|
+
} from "./chunk-KNU5COPB.js";
|
|
44
|
+
|
|
45
|
+
// src/commands/layout.ts
|
|
46
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
47
|
+
import { dirname, join as join2 } from "path";
|
|
48
|
+
import { fileURLToPath } from "url";
|
|
49
|
+
|
|
50
|
+
// src/utils/layoutAudit.ts
|
|
51
|
+
function buildLayoutSampleTimes({ duration, samples, at }) {
|
|
52
|
+
if (at?.length) {
|
|
53
|
+
return uniqueSortedTimes(
|
|
54
|
+
at.filter(
|
|
55
|
+
(time) => Number.isFinite(time) && time >= 0 && (duration <= 0 || time <= duration)
|
|
56
|
+
)
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
if (!Number.isFinite(duration) || duration <= 0 || samples <= 0) return [];
|
|
60
|
+
const count = Math.max(1, Math.floor(samples));
|
|
61
|
+
return Array.from({ length: count }, (_, index) => roundTime((index + 0.5) / count * duration));
|
|
62
|
+
}
|
|
63
|
+
function summarizeLayoutIssues(issues) {
|
|
64
|
+
const errorCount = issues.filter((issue) => issue.severity === "error").length;
|
|
65
|
+
const warningCount = issues.filter((issue) => issue.severity === "warning").length;
|
|
66
|
+
const infoCount = issues.filter((issue) => issue.severity === "info").length;
|
|
67
|
+
return {
|
|
68
|
+
ok: errorCount === 0,
|
|
69
|
+
errorCount,
|
|
70
|
+
warningCount,
|
|
71
|
+
infoCount,
|
|
72
|
+
issueCount: issues.length
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function formatLayoutIssue(issue) {
|
|
76
|
+
const timeLabel = issue.occurrences && issue.occurrences > 1 ? `t=${formatNumber(issue.firstSeen ?? issue.time)}-${formatNumber(issue.lastSeen ?? issue.time)}s (${issue.occurrences} samples)` : `t=${formatNumber(issue.time)}s`;
|
|
77
|
+
const parts = [
|
|
78
|
+
timeLabel,
|
|
79
|
+
issue.code,
|
|
80
|
+
issue.selector,
|
|
81
|
+
issue.containerSelector ? `inside ${issue.containerSelector}` : "",
|
|
82
|
+
issue.overflow ? `overflowed ${formatOverflow(issue.overflow)}` : "",
|
|
83
|
+
issue.text ? quoteText(issue.text) : ""
|
|
84
|
+
].filter(Boolean);
|
|
85
|
+
const line = `${parts.join(" ")} \u2014 ${issue.message}`;
|
|
86
|
+
return issue.fixHint ? `${line}
|
|
87
|
+
Fix: ${issue.fixHint}` : line;
|
|
88
|
+
}
|
|
89
|
+
function dedupeLayoutIssues(issues) {
|
|
90
|
+
const seen = /* @__PURE__ */ new Set();
|
|
91
|
+
const result = [];
|
|
92
|
+
for (const issue of issues) {
|
|
93
|
+
const key = [
|
|
94
|
+
issue.code,
|
|
95
|
+
issue.severity,
|
|
96
|
+
issue.time.toFixed(3),
|
|
97
|
+
issue.selector,
|
|
98
|
+
issue.containerSelector ?? "",
|
|
99
|
+
issue.text ?? "",
|
|
100
|
+
issue.overflow ? formatOverflow(issue.overflow) : "",
|
|
101
|
+
framePositionKey(issue)
|
|
102
|
+
].join("|");
|
|
103
|
+
if (seen.has(key)) continue;
|
|
104
|
+
seen.add(key);
|
|
105
|
+
result.push(issue);
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
var CONTENT_OVERLAP_HELD_ERROR_MS = 500;
|
|
110
|
+
var HELD_ACROSS_SAMPLES_MIN_OCCURRENCES = 2;
|
|
111
|
+
var PERSISTENCE_TIERED_CODES = /* @__PURE__ */ new Set([
|
|
112
|
+
"text_box_overflow",
|
|
113
|
+
"clipped_text",
|
|
114
|
+
"canvas_overflow",
|
|
115
|
+
"container_overflow",
|
|
116
|
+
"content_overlap",
|
|
117
|
+
"text_occluded",
|
|
118
|
+
"escaped_container",
|
|
119
|
+
"panel_out_of_canvas",
|
|
120
|
+
"canvas_content_at_edge",
|
|
121
|
+
"connector_detached",
|
|
122
|
+
"connector_orphan"
|
|
123
|
+
]);
|
|
124
|
+
var CONTIGUOUS_SAMPLE_GAP_MS = CONTENT_OVERLAP_HELD_ERROR_MS * 2;
|
|
125
|
+
var TEXT_AGNOSTIC_KEY_CODES = /* @__PURE__ */ new Set([
|
|
126
|
+
"content_overlap",
|
|
127
|
+
"text_occluded"
|
|
128
|
+
]);
|
|
129
|
+
function collapseStaticLayoutIssues(issues, totalSampleCount) {
|
|
130
|
+
const groups = /* @__PURE__ */ new Map();
|
|
131
|
+
for (const issue of issues) {
|
|
132
|
+
const key = staticIssueKey(issue);
|
|
133
|
+
const existing = groups.get(key);
|
|
134
|
+
if (!existing) {
|
|
135
|
+
groups.set(key, {
|
|
136
|
+
issue,
|
|
137
|
+
firstSeen: issue.time,
|
|
138
|
+
lastSeen: issue.time,
|
|
139
|
+
occurrences: 1,
|
|
140
|
+
times: [issue.time]
|
|
141
|
+
});
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
existing.firstSeen = Math.min(existing.firstSeen, issue.time);
|
|
145
|
+
existing.lastSeen = Math.max(existing.lastSeen, issue.time);
|
|
146
|
+
existing.occurrences += 1;
|
|
147
|
+
existing.times.push(issue.time);
|
|
148
|
+
}
|
|
149
|
+
const sampleCount = totalSampleCount ?? new Set(issues.map((issue) => issue.time)).size;
|
|
150
|
+
const multiSampleRun = sampleCount > 1;
|
|
151
|
+
return [...groups.values()].map(
|
|
152
|
+
({ issue, firstSeen, lastSeen, occurrences, times }) => applyPersistenceTier(
|
|
153
|
+
{
|
|
154
|
+
...issue,
|
|
155
|
+
time: firstSeen,
|
|
156
|
+
firstSeen,
|
|
157
|
+
lastSeen,
|
|
158
|
+
occurrences,
|
|
159
|
+
heldMs: longestContiguousRunMs(times)
|
|
160
|
+
},
|
|
161
|
+
multiSampleRun
|
|
162
|
+
)
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
function longestContiguousRunMs(times) {
|
|
166
|
+
const sorted = [...new Set(times)].sort((a, b) => a - b);
|
|
167
|
+
const first = sorted[0];
|
|
168
|
+
const last = sorted.at(-1);
|
|
169
|
+
if (first === void 0 || last === void 0) return 0;
|
|
170
|
+
let longest = 0;
|
|
171
|
+
let runStart = first;
|
|
172
|
+
let previous = first;
|
|
173
|
+
for (const current of sorted) {
|
|
174
|
+
if ((current - previous) * 1e3 > CONTIGUOUS_SAMPLE_GAP_MS) {
|
|
175
|
+
longest = Math.max(longest, previous - runStart);
|
|
176
|
+
runStart = current;
|
|
177
|
+
}
|
|
178
|
+
previous = current;
|
|
179
|
+
}
|
|
180
|
+
return Math.max(longest, last - runStart) * 1e3;
|
|
181
|
+
}
|
|
182
|
+
function applyPersistenceTier(issue, multiSampleRun) {
|
|
183
|
+
if (!multiSampleRun) return issue;
|
|
184
|
+
if (!PERSISTENCE_TIERED_CODES.has(issue.code)) return issue;
|
|
185
|
+
const occurrences = issue.occurrences ?? 1;
|
|
186
|
+
if (occurrences <= 1) {
|
|
187
|
+
return { ...issue, severity: "info" };
|
|
188
|
+
}
|
|
189
|
+
if (issue.code === "content_overlap" && isContentOverlapHeldLongEnough(issue, occurrences)) {
|
|
190
|
+
return { ...issue, severity: "error" };
|
|
191
|
+
}
|
|
192
|
+
if (issue.code === "canvas_overflow" && isCanvasBreachHeldLarge(issue, occurrences)) {
|
|
193
|
+
return { ...issue, severity: "warning" };
|
|
194
|
+
}
|
|
195
|
+
return issue;
|
|
196
|
+
}
|
|
197
|
+
function isCanvasBreachHeldLarge(issue, occurrences) {
|
|
198
|
+
if (occurrences < HELD_ACROSS_SAMPLES_MIN_OCCURRENCES || !issue.overflow || !issue.containerRect) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const breach = Math.max(
|
|
202
|
+
...Object.values(issue.overflow).filter((value) => typeof value === "number")
|
|
203
|
+
);
|
|
204
|
+
if (breach < Math.min(issue.containerRect.width, issue.containerRect.height) * 0.05) return false;
|
|
205
|
+
const container = issue.containerRect;
|
|
206
|
+
const overlapX = Math.min(issue.rect.right, container.right) - Math.max(issue.rect.left, container.left);
|
|
207
|
+
const overlapY = Math.min(issue.rect.bottom, container.bottom) - Math.max(issue.rect.top, container.top);
|
|
208
|
+
return overlapX > 0 && overlapY > 0;
|
|
209
|
+
}
|
|
210
|
+
function isContentOverlapHeldLongEnough(issue, occurrences) {
|
|
211
|
+
if (occurrences < HELD_ACROSS_SAMPLES_MIN_OCCURRENCES) return false;
|
|
212
|
+
const firstSeen = issue.firstSeen ?? issue.time;
|
|
213
|
+
const lastSeen = issue.lastSeen ?? issue.time;
|
|
214
|
+
const heldMs = issue.heldMs ?? (lastSeen - firstSeen) * 1e3;
|
|
215
|
+
return heldMs >= CONTENT_OVERLAP_HELD_ERROR_MS;
|
|
216
|
+
}
|
|
217
|
+
function limitLayoutIssues(issues, maxIssues) {
|
|
218
|
+
const limit = Math.max(1, Math.floor(maxIssues));
|
|
219
|
+
const sortedIssues = [...issues].sort((a, b) => {
|
|
220
|
+
const severityDelta = severityRank(a.severity) - severityRank(b.severity);
|
|
221
|
+
if (severityDelta !== 0) return severityDelta;
|
|
222
|
+
return a.time - b.time;
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
issues: sortedIssues.slice(0, limit),
|
|
226
|
+
totalIssueCount: issues.length,
|
|
227
|
+
truncated: issues.length > limit
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function severityRank(severity) {
|
|
231
|
+
if (severity === "error") return 0;
|
|
232
|
+
if (severity === "warning") return 1;
|
|
233
|
+
return 2;
|
|
234
|
+
}
|
|
235
|
+
function staticIssueKey(issue) {
|
|
236
|
+
return [
|
|
237
|
+
issue.code,
|
|
238
|
+
issue.severity,
|
|
239
|
+
issue.selector,
|
|
240
|
+
issue.containerSelector ?? "",
|
|
241
|
+
TEXT_AGNOSTIC_KEY_CODES.has(issue.code) ? "" : issue.text ?? "",
|
|
242
|
+
issue.overflow ? formatOverflow(issue.overflow) : "",
|
|
243
|
+
framePositionKey(issue)
|
|
244
|
+
].join("|");
|
|
245
|
+
}
|
|
246
|
+
function framePositionKey(issue) {
|
|
247
|
+
return issue.code === "frame_out_of_frame" || issue.code === "connector_detached" || issue.code === "connector_orphan" ? `${Math.round(issue.rect.left)},${Math.round(issue.rect.top)}` : "";
|
|
248
|
+
}
|
|
249
|
+
function uniqueSortedTimes(times) {
|
|
250
|
+
const rounded = times.map(roundTime);
|
|
251
|
+
return [...new Set(rounded)].sort((a, b) => a - b);
|
|
252
|
+
}
|
|
253
|
+
function buildTransitionSampleTimes({
|
|
254
|
+
duration,
|
|
255
|
+
boundaries,
|
|
256
|
+
cap
|
|
257
|
+
}) {
|
|
258
|
+
if (!Number.isFinite(duration) || duration <= 0) return { times: [], dropped: 0 };
|
|
259
|
+
const inRange = uniqueSortedTimes(
|
|
260
|
+
boundaries.filter((time) => Number.isFinite(time) && time >= 0 && time <= duration)
|
|
261
|
+
);
|
|
262
|
+
const withMidpoints = [...inRange];
|
|
263
|
+
for (let i = 0; i < inRange.length - 1; i++) {
|
|
264
|
+
const current = inRange[i];
|
|
265
|
+
const next = inRange[i + 1];
|
|
266
|
+
if (current === void 0 || next === void 0) continue;
|
|
267
|
+
withMidpoints.push(roundTime((current + next) / 2));
|
|
268
|
+
}
|
|
269
|
+
const merged = uniqueSortedTimes(withMidpoints);
|
|
270
|
+
if (cap === void 0 || merged.length <= Math.max(2, cap)) {
|
|
271
|
+
return { times: merged, dropped: 0 };
|
|
272
|
+
}
|
|
273
|
+
const limit = Math.max(2, cap);
|
|
274
|
+
const strided = [];
|
|
275
|
+
for (let i = 0; i < limit; i++) {
|
|
276
|
+
const pick = merged[Math.floor(i * (merged.length - 1) / (limit - 1))];
|
|
277
|
+
if (pick !== void 0) strided.push(pick);
|
|
278
|
+
}
|
|
279
|
+
const times = uniqueSortedTimes(strided);
|
|
280
|
+
return { times, dropped: merged.length - times.length };
|
|
281
|
+
}
|
|
282
|
+
function mergeSampleTimes(...lists) {
|
|
283
|
+
return uniqueSortedTimes(lists.flat());
|
|
284
|
+
}
|
|
285
|
+
function formatOverflow(overflow) {
|
|
286
|
+
return ["left", "right", "top", "bottom"].flatMap((side) => {
|
|
287
|
+
const value = overflow[side];
|
|
288
|
+
return value == null ? [] : `${side} ${formatNumber(value)}px`;
|
|
289
|
+
}).join(", ");
|
|
290
|
+
}
|
|
291
|
+
function quoteText(text) {
|
|
292
|
+
const normalized = text.replace(/\s+/g, " ").trim();
|
|
293
|
+
const truncated = normalized.length > 80 ? `${normalized.slice(0, 77)}...` : normalized;
|
|
294
|
+
return `"${truncated}"`;
|
|
295
|
+
}
|
|
296
|
+
function formatNumber(value) {
|
|
297
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(2).replace(/0+$/, "").replace(/\.$/, "");
|
|
298
|
+
}
|
|
299
|
+
function roundTime(value) {
|
|
300
|
+
return Math.round(value * 1e3) / 1e3;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// src/utils/motionAudit.ts
|
|
304
|
+
var APPEAR_OPACITY = 0.5;
|
|
305
|
+
var FRAME_TOLERANCE = 1;
|
|
306
|
+
var DEFAULT_MAX_STATIC_SEC = 2;
|
|
307
|
+
var ZERO_RECT = { left: 0, top: 0, right: 0, bottom: 0, width: 0, height: 0 };
|
|
308
|
+
function ambiguousIssue(selector) {
|
|
309
|
+
return {
|
|
310
|
+
code: "motion_selector_ambiguous",
|
|
311
|
+
severity: "error",
|
|
312
|
+
time: 0,
|
|
313
|
+
selector,
|
|
314
|
+
message: `${selector} matches multiple elements \u2014 use a more specific selector so the assertion targets exactly one.`,
|
|
315
|
+
rect: ZERO_RECT,
|
|
316
|
+
fixHint: "Use #id or :nth-child() instead of a class selector when multiple elements share the same class."
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function round(value) {
|
|
320
|
+
return Math.round(value * 100) / 100;
|
|
321
|
+
}
|
|
322
|
+
function everMatched(frames, selector) {
|
|
323
|
+
return frames.some((frame) => frame.data[selector] != null);
|
|
324
|
+
}
|
|
325
|
+
function firstAppear(frames, selector) {
|
|
326
|
+
for (const frame of frames) {
|
|
327
|
+
const sample = frame.data[selector];
|
|
328
|
+
if (sample && sample.visible && sample.opacity >= APPEAR_OPACITY) {
|
|
329
|
+
return { time: frame.time, rect: sample.rect };
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
function missingIssue(selector, time) {
|
|
335
|
+
return {
|
|
336
|
+
code: "motion_selector_missing",
|
|
337
|
+
severity: "error",
|
|
338
|
+
time,
|
|
339
|
+
selector,
|
|
340
|
+
message: `${selector} matched no element in any sampled frame \u2014 check the selector`,
|
|
341
|
+
rect: ZERO_RECT,
|
|
342
|
+
fixHint: "Verify the selector exists in the composition and is spelled correctly."
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function appearsBy(frames, selector, bySec) {
|
|
346
|
+
if (!everMatched(frames, selector)) return [missingIssue(selector, 0)];
|
|
347
|
+
const appear = firstAppear(frames, selector);
|
|
348
|
+
if (appear && appear.time <= bySec) return [];
|
|
349
|
+
return [
|
|
350
|
+
{
|
|
351
|
+
code: "motion_appears_late",
|
|
352
|
+
severity: "error",
|
|
353
|
+
time: appear ? appear.time : bySec,
|
|
354
|
+
selector,
|
|
355
|
+
message: appear ? `appears at ${round(appear.time)}s but should be visible by ${round(bySec)}s (check its entrance reveal fires under seek)` : `never reaches visible opacity but should be visible by ${round(bySec)}s (check its entrance reveal fires under seek)`,
|
|
356
|
+
rect: appear ? appear.rect : ZERO_RECT,
|
|
357
|
+
fixHint: "The renderer seeks a paused timeline; a forward-only reveal can be skipped. Ensure the entrance is applied at this time, not only played through."
|
|
358
|
+
}
|
|
359
|
+
];
|
|
360
|
+
}
|
|
361
|
+
function before(frames, a, b) {
|
|
362
|
+
const issues = [];
|
|
363
|
+
if (!everMatched(frames, a)) issues.push(missingIssue(a, 0));
|
|
364
|
+
if (!everMatched(frames, b)) issues.push(missingIssue(b, 0));
|
|
365
|
+
if (issues.length > 0) return issues;
|
|
366
|
+
const appearA = firstAppear(frames, a);
|
|
367
|
+
const appearB = firstAppear(frames, b);
|
|
368
|
+
const timeA = appearA ? appearA.time : Number.POSITIVE_INFINITY;
|
|
369
|
+
const timeB = appearB ? appearB.time : Number.POSITIVE_INFINITY;
|
|
370
|
+
if (timeA < timeB) return [];
|
|
371
|
+
const label = (t) => Number.isFinite(t) ? `${round(t)}s` : "never";
|
|
372
|
+
return [
|
|
373
|
+
{
|
|
374
|
+
code: "motion_out_of_order",
|
|
375
|
+
severity: "error",
|
|
376
|
+
time: Number.isFinite(timeA) ? timeA : 0,
|
|
377
|
+
selector: a,
|
|
378
|
+
message: `${a} should appear before ${b}, but ${a} appears at ${label(timeA)} and ${b} at ${label(timeB)} \u2014 reorder the entrances`,
|
|
379
|
+
rect: appearA ? appearA.rect : ZERO_RECT,
|
|
380
|
+
fixHint: `Make ${a}'s entrance land before ${b}'s on the timeline.`
|
|
381
|
+
}
|
|
382
|
+
];
|
|
383
|
+
}
|
|
384
|
+
function isOffFrame(r, canvas) {
|
|
385
|
+
return r.left < -FRAME_TOLERANCE || r.top < -FRAME_TOLERANCE || r.right > canvas.width + FRAME_TOLERANCE || r.bottom > canvas.height + FRAME_TOLERANCE;
|
|
386
|
+
}
|
|
387
|
+
function staysInFrame(frames, selector, canvas) {
|
|
388
|
+
if (!everMatched(frames, selector)) return [missingIssue(selector, 0)];
|
|
389
|
+
const appear = firstAppear(frames, selector);
|
|
390
|
+
if (!appear) return [];
|
|
391
|
+
for (const frame of frames) {
|
|
392
|
+
const sample = frame.data[selector];
|
|
393
|
+
if (frame.time < appear.time || !sample || !sample.visible) continue;
|
|
394
|
+
if (!isOffFrame(sample.rect, canvas)) continue;
|
|
395
|
+
const r = sample.rect;
|
|
396
|
+
return [
|
|
397
|
+
{
|
|
398
|
+
code: "motion_off_frame",
|
|
399
|
+
severity: "error",
|
|
400
|
+
time: frame.time,
|
|
401
|
+
selector,
|
|
402
|
+
message: `${selector} drifts off the ${canvas.width}\xD7${canvas.height} canvas at ${round(frame.time)}s (box ${r.left},${r.top}\u2192${r.right},${r.bottom})`,
|
|
403
|
+
rect: r,
|
|
404
|
+
fixHint: "Clamp the element's motion so its box stays within the canvas for the whole shot."
|
|
405
|
+
}
|
|
406
|
+
];
|
|
407
|
+
}
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
410
|
+
function keepsMoving(frames, within, maxStaticSec) {
|
|
411
|
+
const scope = within ?? "*";
|
|
412
|
+
if (within && frames.every((frame) => !frame.liveness[scope])) {
|
|
413
|
+
return [missingIssue(within, 0)];
|
|
414
|
+
}
|
|
415
|
+
const issues = [];
|
|
416
|
+
const first = frames[0];
|
|
417
|
+
if (!first) return issues;
|
|
418
|
+
let runStart = first.time;
|
|
419
|
+
let runSig = first.liveness[scope] ?? "";
|
|
420
|
+
const flush = (endTime) => {
|
|
421
|
+
const span = endTime - runStart;
|
|
422
|
+
if (span > maxStaticSec) {
|
|
423
|
+
issues.push({
|
|
424
|
+
code: "motion_frozen",
|
|
425
|
+
severity: "error",
|
|
426
|
+
time: runStart,
|
|
427
|
+
selector: within ?? "composition",
|
|
428
|
+
message: `nothing moves${within ? ` within ${within}` : ""} between ${round(runStart)}s and ${round(endTime)}s (${round(span)}s static) \u2014 should keep moving`,
|
|
429
|
+
rect: ZERO_RECT,
|
|
430
|
+
fixHint: "Add or extend motion so no shot freezes for this long, or shorten the static hold."
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
};
|
|
434
|
+
let lastTime = runStart;
|
|
435
|
+
for (const frame of frames.slice(1)) {
|
|
436
|
+
lastTime = frame.time;
|
|
437
|
+
const sig = frame.liveness[scope] ?? "";
|
|
438
|
+
if (sig !== runSig) {
|
|
439
|
+
flush(frame.time);
|
|
440
|
+
runStart = frame.time;
|
|
441
|
+
runSig = sig;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
flush(lastTime);
|
|
445
|
+
return issues;
|
|
446
|
+
}
|
|
447
|
+
function evaluateMotion(frames, assertions, canvas) {
|
|
448
|
+
if (frames.length === 0) return [];
|
|
449
|
+
return assertions.flatMap((assertion) => {
|
|
450
|
+
switch (assertion.kind) {
|
|
451
|
+
case "appearsBy":
|
|
452
|
+
return appearsBy(frames, assertion.selector, assertion.bySec);
|
|
453
|
+
case "before":
|
|
454
|
+
return before(frames, assertion.a, assertion.b);
|
|
455
|
+
case "staysInFrame":
|
|
456
|
+
return staysInFrame(frames, assertion.selector, canvas);
|
|
457
|
+
case "keepsMoving":
|
|
458
|
+
return keepsMoving(
|
|
459
|
+
frames,
|
|
460
|
+
assertion.withinSelector,
|
|
461
|
+
assertion.maxStaticSec ?? DEFAULT_MAX_STATIC_SEC
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
function assertionTargets(assertion) {
|
|
467
|
+
switch (assertion.kind) {
|
|
468
|
+
case "appearsBy":
|
|
469
|
+
case "staysInFrame":
|
|
470
|
+
return { selectors: [assertion.selector], scopes: [] };
|
|
471
|
+
case "before":
|
|
472
|
+
return { selectors: [assertion.a, assertion.b], scopes: [] };
|
|
473
|
+
case "keepsMoving":
|
|
474
|
+
return { selectors: [], scopes: [assertion.withinSelector ?? "*"] };
|
|
475
|
+
default: {
|
|
476
|
+
const exhaustive = assertion;
|
|
477
|
+
void exhaustive;
|
|
478
|
+
return { selectors: [], scopes: [] };
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
function collectSamplingTargets(assertions) {
|
|
483
|
+
const selectors = /* @__PURE__ */ new Set();
|
|
484
|
+
const scopes = /* @__PURE__ */ new Set();
|
|
485
|
+
for (const assertion of assertions) {
|
|
486
|
+
const targets = assertionTargets(assertion);
|
|
487
|
+
for (const selector of targets.selectors) selectors.add(selector);
|
|
488
|
+
for (const scope of targets.scopes) scopes.add(scope);
|
|
489
|
+
}
|
|
490
|
+
return { selectors: [...selectors], livenessScopes: [...scopes] };
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// src/utils/motionSpec.ts
|
|
494
|
+
import { existsSync, readFileSync, readdirSync } from "fs";
|
|
495
|
+
import { basename, join } from "path";
|
|
496
|
+
function isObject(value) {
|
|
497
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
498
|
+
}
|
|
499
|
+
function isSelector(value) {
|
|
500
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
501
|
+
}
|
|
502
|
+
function isPositive(value) {
|
|
503
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
504
|
+
}
|
|
505
|
+
var VALIDATORS = {
|
|
506
|
+
appearsBy: (raw, at) => {
|
|
507
|
+
if (!isSelector(raw.selector))
|
|
508
|
+
return `${at} (appearsBy): "selector" must be a non-empty string`;
|
|
509
|
+
if (typeof raw.bySec !== "number" || !Number.isFinite(raw.bySec) || raw.bySec < 0)
|
|
510
|
+
return `${at} (appearsBy): "bySec" must be a number >= 0`;
|
|
511
|
+
return { kind: "appearsBy", selector: raw.selector, bySec: raw.bySec };
|
|
512
|
+
},
|
|
513
|
+
before: (raw, at) => {
|
|
514
|
+
if (!isSelector(raw.a)) return `${at} (before): "a" must be a non-empty string`;
|
|
515
|
+
if (!isSelector(raw.b)) return `${at} (before): "b" must be a non-empty string`;
|
|
516
|
+
return { kind: "before", a: raw.a, b: raw.b };
|
|
517
|
+
},
|
|
518
|
+
staysInFrame: (raw, at) => {
|
|
519
|
+
if (!isSelector(raw.selector))
|
|
520
|
+
return `${at} (staysInFrame): "selector" must be a non-empty string`;
|
|
521
|
+
return { kind: "staysInFrame", selector: raw.selector };
|
|
522
|
+
},
|
|
523
|
+
keepsMoving: (raw, at) => {
|
|
524
|
+
if (raw.withinSelector !== void 0 && !isSelector(raw.withinSelector))
|
|
525
|
+
return `${at} (keepsMoving): "withinSelector" must be a non-empty string when present`;
|
|
526
|
+
if (raw.withinSelector === "*")
|
|
527
|
+
return `${at} (keepsMoving): "withinSelector" cannot be "*" \u2014 omit it for whole-composition liveness`;
|
|
528
|
+
if (raw.maxStaticSec !== void 0 && !isPositive(raw.maxStaticSec))
|
|
529
|
+
return `${at} (keepsMoving): "maxStaticSec" must be a number > 0 when present`;
|
|
530
|
+
const assertion = { kind: "keepsMoving" };
|
|
531
|
+
if (isSelector(raw.withinSelector)) assertion.withinSelector = raw.withinSelector;
|
|
532
|
+
if (isPositive(raw.maxStaticSec)) assertion.maxStaticSec = raw.maxStaticSec;
|
|
533
|
+
return assertion;
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
function validateAssertion(raw, index) {
|
|
537
|
+
const at = `assertions[${index}]`;
|
|
538
|
+
if (!isObject(raw)) return `${at}: must be an object`;
|
|
539
|
+
const validator = typeof raw.kind === "string" ? VALIDATORS[raw.kind] : void 0;
|
|
540
|
+
if (!validator) return `${at}: unknown assertion kind ${JSON.stringify(raw.kind)}`;
|
|
541
|
+
return validator(raw, at);
|
|
542
|
+
}
|
|
543
|
+
function parseMotionSpec(raw) {
|
|
544
|
+
if (!isObject(raw)) return { ok: false, errors: ["spec must be a JSON object"] };
|
|
545
|
+
if (raw.version !== void 0 && raw.version !== 1)
|
|
546
|
+
return {
|
|
547
|
+
ok: false,
|
|
548
|
+
errors: [`spec version ${raw.version} is not supported \u2014 upgrade the hyperframes CLI`]
|
|
549
|
+
};
|
|
550
|
+
if (!Array.isArray(raw.assertions))
|
|
551
|
+
return { ok: false, errors: ['spec must have an "assertions" array'] };
|
|
552
|
+
if (raw.duration !== void 0 && (typeof raw.duration !== "number" || !Number.isFinite(raw.duration) || raw.duration <= 0))
|
|
553
|
+
return { ok: false, errors: ['"duration" must be a positive number when present'] };
|
|
554
|
+
const assertions = [];
|
|
555
|
+
const errors = [];
|
|
556
|
+
raw.assertions.forEach((entry, index) => {
|
|
557
|
+
const result = validateAssertion(entry, index);
|
|
558
|
+
if (typeof result === "string") errors.push(result);
|
|
559
|
+
else assertions.push(result);
|
|
560
|
+
});
|
|
561
|
+
if (errors.length > 0) return { ok: false, errors };
|
|
562
|
+
if (assertions.length === 0) return { ok: false, errors: ["spec has no assertions"] };
|
|
563
|
+
const spec = { assertions };
|
|
564
|
+
if (typeof raw.duration === "number") spec.duration = raw.duration;
|
|
565
|
+
return { ok: true, spec };
|
|
566
|
+
}
|
|
567
|
+
function findMotionSpec(projectDir) {
|
|
568
|
+
if (!existsSync(projectDir)) return null;
|
|
569
|
+
const entries = readdirSync(projectDir);
|
|
570
|
+
const sidecars = entries.filter((name) => name.endsWith(".motion.json")).sort();
|
|
571
|
+
if (!sidecars[0]) return null;
|
|
572
|
+
if (sidecars.length === 1) return join(projectDir, sidecars[0]);
|
|
573
|
+
const htmlBases = new Set(
|
|
574
|
+
entries.filter((name) => name.endsWith(".html")).map((name) => basename(name, ".html"))
|
|
575
|
+
);
|
|
576
|
+
const matched = sidecars.filter((name) => htmlBases.has(basename(name, ".motion.json")));
|
|
577
|
+
if (matched.length > 1) {
|
|
578
|
+
throw new Error(
|
|
579
|
+
`ambiguous motion sidecars in ${projectDir}: ${matched.join(", ")} each match a composition \u2014 remove the sidecars you do not need, or use one composition per project`
|
|
580
|
+
);
|
|
581
|
+
}
|
|
582
|
+
return join(projectDir, matched[0] ?? sidecars[0]);
|
|
583
|
+
}
|
|
584
|
+
function readMotionSpec(path) {
|
|
585
|
+
let raw;
|
|
586
|
+
try {
|
|
587
|
+
raw = JSON.parse(readFileSync(path, "utf-8"));
|
|
588
|
+
} catch (err) {
|
|
589
|
+
return { ok: false, errors: [`could not read ${basename(path)}: ${err.message}`] };
|
|
590
|
+
}
|
|
591
|
+
return parseMotionSpec(raw);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// src/commands/layout.ts
|
|
595
|
+
var __filename = fileURLToPath(import.meta.url);
|
|
596
|
+
var __dirname = dirname(__filename);
|
|
597
|
+
var LAYOUT_SEEK_OPTIONS = AUDIT_SEEK_OPTIONS;
|
|
598
|
+
var INSPECT_SCHEMA_VERSION = 1;
|
|
599
|
+
var MOTION_FPS = 20;
|
|
600
|
+
var MOTION_MAX_SAMPLES = 300;
|
|
601
|
+
var examples = [
|
|
602
|
+
["Inspect visual layout across the current composition", "hyperframes layout"],
|
|
603
|
+
["Inspect a specific project", "hyperframes layout ./my-video"],
|
|
604
|
+
["Output agent-readable JSON", "hyperframes layout --json"],
|
|
605
|
+
["Use explicit hero-frame timestamps", "hyperframes layout --at 1.5,4.0,7.25"],
|
|
606
|
+
[
|
|
607
|
+
"Also sample at tween boundaries to catch transient overlaps",
|
|
608
|
+
"hyperframes layout --at-transitions"
|
|
609
|
+
],
|
|
610
|
+
[
|
|
611
|
+
"Verify motion intent (add a *.motion.json sidecar next to the composition)",
|
|
612
|
+
"hyperframes layout --json"
|
|
613
|
+
]
|
|
614
|
+
];
|
|
615
|
+
function buildMotionSampleTimes(duration) {
|
|
616
|
+
if (!Number.isFinite(duration) || duration <= 0) return [];
|
|
617
|
+
const count = Math.min(MOTION_MAX_SAMPLES, Math.max(2, Math.ceil(duration * MOTION_FPS) + 1));
|
|
618
|
+
const step = duration / (count - 1);
|
|
619
|
+
return Array.from({ length: count }, (_, index) => Math.round(index * step * 1e3) / 1e3);
|
|
620
|
+
}
|
|
621
|
+
async function getCompositionDuration(page) {
|
|
622
|
+
return page.evaluate(() => {
|
|
623
|
+
const win = window;
|
|
624
|
+
if (typeof win.__hf?.duration === "number" && win.__hf.duration > 0) return win.__hf.duration;
|
|
625
|
+
const playerDuration = win.__player?.duration;
|
|
626
|
+
if (typeof playerDuration === "function") return playerDuration();
|
|
627
|
+
if (typeof playerDuration === "number" && playerDuration > 0) return playerDuration;
|
|
628
|
+
const root = document.querySelector("[data-composition-id][data-duration]");
|
|
629
|
+
const attrDuration = root ? parseFloat(root.getAttribute("data-duration") ?? "0") : 0;
|
|
630
|
+
if (attrDuration > 0) return attrDuration;
|
|
631
|
+
const timelines = win.__timelines;
|
|
632
|
+
if (timelines) {
|
|
633
|
+
for (const timeline of Object.values(timelines)) {
|
|
634
|
+
const duration = timeline.duration;
|
|
635
|
+
if (typeof duration === "function") return duration();
|
|
636
|
+
if (typeof duration === "number" && duration > 0) return duration;
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return 0;
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
async function collectTweenBoundaries(page) {
|
|
643
|
+
return page.evaluate(() => {
|
|
644
|
+
const callOr = (fn, self, fallback) => typeof fn === "function" ? fn.call(self) : fallback;
|
|
645
|
+
const toTimelineTime = (root, anim, localTime) => {
|
|
646
|
+
let time = localTime;
|
|
647
|
+
let node = anim;
|
|
648
|
+
while (node && node !== root) {
|
|
649
|
+
time = callOr(node.startTime, node, 0) + time / (callOr(node.timeScale, node, 1) || 1);
|
|
650
|
+
node = node.parent;
|
|
651
|
+
}
|
|
652
|
+
return time;
|
|
653
|
+
};
|
|
654
|
+
const tweenBoundaries = (root, tween) => {
|
|
655
|
+
if (typeof tween.duration !== "function") return [];
|
|
656
|
+
const start = toTimelineTime(root, tween, 0);
|
|
657
|
+
const end = toTimelineTime(root, tween, tween.duration());
|
|
658
|
+
return [start, end].filter((time) => Number.isFinite(time));
|
|
659
|
+
};
|
|
660
|
+
const timelineBoundaries = (timeline) => {
|
|
661
|
+
try {
|
|
662
|
+
const tweens = timeline.getChildren?.(true, true, false) ?? [];
|
|
663
|
+
return tweens.flatMap((tween) => tweenBoundaries(timeline, tween));
|
|
664
|
+
} catch {
|
|
665
|
+
return [];
|
|
666
|
+
}
|
|
667
|
+
};
|
|
668
|
+
const win = window;
|
|
669
|
+
return Object.values(win.__timelines ?? {}).flatMap(timelineBoundaries);
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
async function bundleProjectHtml(projectDir) {
|
|
673
|
+
const { bundleToSingleHtml } = await import("./compiler-QO36EXLS.js");
|
|
674
|
+
return bundleToSingleHtml(projectDir);
|
|
675
|
+
}
|
|
676
|
+
async function alignViewportToComposition(page, url) {
|
|
677
|
+
const size = await page.evaluate(() => {
|
|
678
|
+
const root = document.querySelector("[data-composition-id][data-width][data-height]");
|
|
679
|
+
const width = root ? parseInt(root.getAttribute("data-width") ?? "", 10) : 0;
|
|
680
|
+
const height = root ? parseInt(root.getAttribute("data-height") ?? "", 10) : 0;
|
|
681
|
+
return {
|
|
682
|
+
width: Number.isFinite(width) && width > 0 ? Math.min(width, 4096) : 1920,
|
|
683
|
+
height: Number.isFinite(height) && height > 0 ? Math.min(height, 4096) : 1080
|
|
684
|
+
};
|
|
685
|
+
});
|
|
686
|
+
await page.setViewport(size);
|
|
687
|
+
await page.goto(url, {
|
|
688
|
+
waitUntil: "domcontentloaded",
|
|
689
|
+
timeout: resolveDiagnosticNavigationTimeoutMs()
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
async function runLayoutAudit(projectDir, opts) {
|
|
693
|
+
const { ensureBrowser } = await import("./manager-CT3D67CG.js");
|
|
694
|
+
const puppeteer = await import("puppeteer-core");
|
|
695
|
+
const { buildChromeArgs } = await import("./src-PVYUYV3M.js");
|
|
696
|
+
const { assertWebGpuAdapterAvailable, compositionRequiresWebGpu, resolveLocalBrowserGpuMode } = await import("./gpuPolicy-2ZUZE5D6.js");
|
|
697
|
+
const html = await bundleProjectHtml(projectDir);
|
|
698
|
+
const server = await serveStaticProjectHtml(
|
|
699
|
+
projectDir,
|
|
700
|
+
html,
|
|
701
|
+
"Failed to bind local layout audit server"
|
|
702
|
+
);
|
|
703
|
+
let chromeBrowser;
|
|
704
|
+
try {
|
|
705
|
+
const browser = await ensureBrowser();
|
|
706
|
+
const requestedGpuMode = resolveLocalBrowserGpuMode();
|
|
707
|
+
const resolvedGpuMode = await resolveManagedGpuMode(requestedGpuMode, browser.executablePath);
|
|
708
|
+
const requiresWebGpu = compositionRequiresWebGpu(html);
|
|
709
|
+
chromeBrowser = await launchManagedBrowser(puppeteer.default, {
|
|
710
|
+
headless: true,
|
|
711
|
+
executablePath: browser.executablePath,
|
|
712
|
+
args: buildChromeArgs(
|
|
713
|
+
{ width: 1920, height: 1080, captureMode: "screenshot", requiresWebGpu },
|
|
714
|
+
{ browserGpuMode: resolvedGpuMode }
|
|
715
|
+
)
|
|
716
|
+
});
|
|
717
|
+
const page = await chromeBrowser.newPage();
|
|
718
|
+
await installPageFunctionGuard(page);
|
|
719
|
+
await page.setViewport({ width: 1920, height: 1080 });
|
|
720
|
+
await page.goto(server.url, {
|
|
721
|
+
waitUntil: "domcontentloaded",
|
|
722
|
+
timeout: resolveDiagnosticNavigationTimeoutMs()
|
|
723
|
+
});
|
|
724
|
+
await assertWebGpuAdapterAvailable(page, requiresWebGpu);
|
|
725
|
+
await alignViewportToComposition(page, server.url);
|
|
726
|
+
await waitForRuntimeReady(page, opts.timeout);
|
|
727
|
+
await waitForCompositionFonts(page, 750);
|
|
728
|
+
await new Promise((resolveSettle) => setTimeout(resolveSettle, 250));
|
|
729
|
+
const duration = await getCompositionDuration(page);
|
|
730
|
+
const baseSamples = buildLayoutSampleTimes({ duration, samples: opts.samples, at: opts.at });
|
|
731
|
+
let transitionSamples = [];
|
|
732
|
+
let transitionSamplesDropped = 0;
|
|
733
|
+
if (opts.atTransitions) {
|
|
734
|
+
const boundaries = await collectTweenBoundaries(page);
|
|
735
|
+
const transitions = buildTransitionSampleTimes({
|
|
736
|
+
duration,
|
|
737
|
+
boundaries,
|
|
738
|
+
cap: opts.maxTransitionSamples
|
|
739
|
+
});
|
|
740
|
+
transitionSamples = transitions.times;
|
|
741
|
+
transitionSamplesDropped = transitions.dropped;
|
|
742
|
+
}
|
|
743
|
+
const samples = mergeSampleTimes(baseSamples, transitionSamples);
|
|
744
|
+
const issues = await collectLayoutIssues(page, samples, opts.tolerance);
|
|
745
|
+
let motionSamples = 0;
|
|
746
|
+
if (opts.motion) {
|
|
747
|
+
const motion = await runMotionPass(page, opts.motion, duration);
|
|
748
|
+
issues.push(...motion.issues);
|
|
749
|
+
motionSamples = motion.sampleCount;
|
|
750
|
+
}
|
|
751
|
+
return {
|
|
752
|
+
duration,
|
|
753
|
+
samples,
|
|
754
|
+
transitionSamples,
|
|
755
|
+
transitionSamplesDropped,
|
|
756
|
+
rawIssues: dedupeLayoutIssues(issues),
|
|
757
|
+
motionSamples
|
|
758
|
+
};
|
|
759
|
+
} finally {
|
|
760
|
+
await chromeBrowser?.close().catch(() => {
|
|
761
|
+
});
|
|
762
|
+
await server.close();
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
function loadBrowserScript(name) {
|
|
766
|
+
const candidates = [join2(__dirname, name), join2(__dirname, "commands", name)];
|
|
767
|
+
for (const candidate of candidates) {
|
|
768
|
+
if (existsSync2(candidate)) return readFileSync2(candidate, "utf-8");
|
|
769
|
+
}
|
|
770
|
+
throw new Error(`Missing browser script ${name}`);
|
|
771
|
+
}
|
|
772
|
+
function loadLayoutAuditScript() {
|
|
773
|
+
return loadBrowserScript("layout-audit.browser.js");
|
|
774
|
+
}
|
|
775
|
+
async function collectLayoutIssues(page, samples, tolerance) {
|
|
776
|
+
if (samples.length === 0) return [];
|
|
777
|
+
await page.addScriptTag({ content: loadLayoutAuditScript() });
|
|
778
|
+
const issues = [];
|
|
779
|
+
for (const time of samples) {
|
|
780
|
+
await seekCompositionTimeline(page, time, LAYOUT_SEEK_OPTIONS);
|
|
781
|
+
const sampleIssues = await page.evaluate(
|
|
782
|
+
(auditOptions) => {
|
|
783
|
+
const win = window;
|
|
784
|
+
return win.__hyperframesLayoutAudit?.(auditOptions) ?? [];
|
|
785
|
+
},
|
|
786
|
+
{ time, tolerance }
|
|
787
|
+
);
|
|
788
|
+
issues.push(...sampleIssues);
|
|
789
|
+
}
|
|
790
|
+
return issues;
|
|
791
|
+
}
|
|
792
|
+
async function findAmbiguousSelectors(page, selectors) {
|
|
793
|
+
if (selectors.length === 0) return [];
|
|
794
|
+
const multiMatch = await page.evaluate(
|
|
795
|
+
(sels) => sels.filter((sel) => {
|
|
796
|
+
try {
|
|
797
|
+
return document.querySelectorAll(sel).length > 1;
|
|
798
|
+
} catch {
|
|
799
|
+
return false;
|
|
800
|
+
}
|
|
801
|
+
}),
|
|
802
|
+
selectors
|
|
803
|
+
);
|
|
804
|
+
return multiMatch.map(ambiguousIssue);
|
|
805
|
+
}
|
|
806
|
+
async function collectMotionFrames(page, times, selectors, livenessScopes) {
|
|
807
|
+
const frames = [];
|
|
808
|
+
for (const time of times) {
|
|
809
|
+
await seekCompositionTimeline(page, time, LAYOUT_SEEK_OPTIONS);
|
|
810
|
+
const sample = await page.evaluate(
|
|
811
|
+
(options) => {
|
|
812
|
+
const win = window;
|
|
813
|
+
return win.__hyperframesMotionSample?.(options) ?? { data: {}, liveness: {} };
|
|
814
|
+
},
|
|
815
|
+
{ selectors, livenessScopes }
|
|
816
|
+
);
|
|
817
|
+
frames.push({ time, data: sample.data, liveness: sample.liveness });
|
|
818
|
+
}
|
|
819
|
+
return frames;
|
|
820
|
+
}
|
|
821
|
+
async function runMotionPass(page, spec, duration) {
|
|
822
|
+
const times = buildMotionSampleTimes(spec.duration ?? duration);
|
|
823
|
+
if (times.length === 0) return { issues: [], sampleCount: 0 };
|
|
824
|
+
const { selectors, livenessScopes } = collectSamplingTargets(spec.assertions);
|
|
825
|
+
const ambiguous = await findAmbiguousSelectors(page, selectors);
|
|
826
|
+
if (ambiguous.length > 0) return { issues: ambiguous, sampleCount: 0 };
|
|
827
|
+
const canvas = await page.evaluate(() => ({
|
|
828
|
+
width: window.innerWidth,
|
|
829
|
+
height: window.innerHeight
|
|
830
|
+
}));
|
|
831
|
+
await page.addScriptTag({ content: loadBrowserScript("motion-signature.browser.js") });
|
|
832
|
+
await page.addScriptTag({ content: loadBrowserScript("motion-sample.browser.js") });
|
|
833
|
+
const frames = await collectMotionFrames(page, times, selectors, livenessScopes);
|
|
834
|
+
return { issues: evaluateMotion(frames, spec.assertions, canvas), sampleCount: frames.length };
|
|
835
|
+
}
|
|
836
|
+
function resolveMotionSpec(specPath, json) {
|
|
837
|
+
const parsed = readMotionSpec(specPath);
|
|
838
|
+
if (parsed.ok) return parsed.spec;
|
|
839
|
+
const message = `Invalid motion spec ${specPath}: ${parsed.errors.join("; ")}`;
|
|
840
|
+
if (json) {
|
|
841
|
+
console.log(
|
|
842
|
+
JSON.stringify(
|
|
843
|
+
withMeta(
|
|
844
|
+
{
|
|
845
|
+
schemaVersion: INSPECT_SCHEMA_VERSION,
|
|
846
|
+
ok: false,
|
|
847
|
+
error: message,
|
|
848
|
+
issues: [],
|
|
849
|
+
errorCount: 0,
|
|
850
|
+
warningCount: 0,
|
|
851
|
+
infoCount: 0,
|
|
852
|
+
issueCount: 0
|
|
853
|
+
},
|
|
854
|
+
{ deprecated: true }
|
|
855
|
+
),
|
|
856
|
+
null,
|
|
857
|
+
2
|
|
858
|
+
)
|
|
859
|
+
);
|
|
860
|
+
} else {
|
|
861
|
+
console.error(`${c.error("\u2717")} ${message}`);
|
|
862
|
+
}
|
|
863
|
+
failCommand();
|
|
864
|
+
}
|
|
865
|
+
function parseAt(value) {
|
|
866
|
+
if (!value) return void 0;
|
|
867
|
+
const times = String(value).split(",").map((entry) => parseFloat(entry.trim())).filter((time) => Number.isFinite(time) && time >= 0);
|
|
868
|
+
return times.length > 0 ? times : void 0;
|
|
869
|
+
}
|
|
870
|
+
function createInspectCommand(commandName) {
|
|
871
|
+
return defineCommand({
|
|
872
|
+
meta: {
|
|
873
|
+
name: commandName,
|
|
874
|
+
description: "Inspect rendered composition layout for text/container overflow, plus optional motion verification via a *.motion.json sidecar (deprecated, use check)"
|
|
875
|
+
},
|
|
876
|
+
args: {
|
|
877
|
+
dir: { type: "positional", description: "Project directory", required: false },
|
|
878
|
+
json: { type: "boolean", description: "Output agent-readable JSON", default: false },
|
|
879
|
+
samples: {
|
|
880
|
+
type: "string",
|
|
881
|
+
description: "Number of midpoint samples across the duration (default: 9)",
|
|
882
|
+
default: "9"
|
|
883
|
+
},
|
|
884
|
+
at: {
|
|
885
|
+
type: "string",
|
|
886
|
+
description: "Comma-separated timestamps in seconds (e.g., --at 1.5,4,7.25)"
|
|
887
|
+
},
|
|
888
|
+
"at-transitions": {
|
|
889
|
+
type: "boolean",
|
|
890
|
+
description: "Also sample at every tween start/end boundary (plus segment midpoints) to catch transient overlaps at transition seams",
|
|
891
|
+
default: false
|
|
892
|
+
},
|
|
893
|
+
"max-transition-samples": {
|
|
894
|
+
type: "string",
|
|
895
|
+
description: "Optional cap on transition-derived samples; when it truncates, the omitted count is reported (default: unlimited)"
|
|
896
|
+
},
|
|
897
|
+
tolerance: {
|
|
898
|
+
type: "string",
|
|
899
|
+
description: "Allowed pixel overflow before reporting an issue (default: 2)",
|
|
900
|
+
default: "2"
|
|
901
|
+
},
|
|
902
|
+
timeout: {
|
|
903
|
+
type: "string",
|
|
904
|
+
description: "Ms to wait for runtime to initialize (default: 5000)",
|
|
905
|
+
default: "5000"
|
|
906
|
+
},
|
|
907
|
+
"max-issues": {
|
|
908
|
+
type: "string",
|
|
909
|
+
description: "Maximum issues to print or return after static collapse (default: 80)",
|
|
910
|
+
default: "80"
|
|
911
|
+
},
|
|
912
|
+
"collapse-static": {
|
|
913
|
+
type: "boolean",
|
|
914
|
+
description: "Collapse repeated static issues across samples (default: true)",
|
|
915
|
+
default: true
|
|
916
|
+
},
|
|
917
|
+
strict: {
|
|
918
|
+
type: "boolean",
|
|
919
|
+
description: "Exit non-zero on warnings too",
|
|
920
|
+
default: false
|
|
921
|
+
}
|
|
922
|
+
},
|
|
923
|
+
// Pre-existing command-run branching; U1 only swapped the seek internals.
|
|
924
|
+
// fallow-ignore-next-line complexity
|
|
925
|
+
async run({ args }) {
|
|
926
|
+
printDeprecationNotice(commandName);
|
|
927
|
+
const project = resolveProject(args.dir);
|
|
928
|
+
const samples = Math.max(1, parseInt(args.samples, 10) || 9);
|
|
929
|
+
const tolerance = Math.max(0, parseFloat(args.tolerance) || 2);
|
|
930
|
+
const timeout = Math.max(500, parseInt(args.timeout, 10) || 5e3);
|
|
931
|
+
const maxIssues = Math.max(1, parseInt(args["max-issues"], 10) || 80);
|
|
932
|
+
const at = parseAt(args.at);
|
|
933
|
+
const atTransitions = !!args["at-transitions"];
|
|
934
|
+
const maxTransitionSamplesRaw = parseInt(args["max-transition-samples"], 10);
|
|
935
|
+
const maxTransitionSamples = Number.isFinite(maxTransitionSamplesRaw) && maxTransitionSamplesRaw > 0 ? maxTransitionSamplesRaw : void 0;
|
|
936
|
+
const strict = !!args.strict;
|
|
937
|
+
const collapseStatic = args["collapse-static"] !== false;
|
|
938
|
+
const motionSpecPath = findMotionSpec(project.dir);
|
|
939
|
+
const motionSpec = motionSpecPath ? resolveMotionSpec(motionSpecPath, !!args.json) : void 0;
|
|
940
|
+
if (!args.json) {
|
|
941
|
+
const baseLabel = at ? `${at.length} explicit timestamp(s)` : `${samples} timeline samples`;
|
|
942
|
+
const sampleLabel = atTransitions ? `${baseLabel} + transition boundaries` : baseLabel;
|
|
943
|
+
const motionLabel = motionSpec ? ` + motion spec (${motionSpec.assertions.length} assertion(s))` : "";
|
|
944
|
+
console.log(
|
|
945
|
+
`${c.accent("\u25C6")} Inspecting layout for ${c.accent(project.name)} (${sampleLabel}${motionLabel})`
|
|
946
|
+
);
|
|
947
|
+
}
|
|
948
|
+
try {
|
|
949
|
+
const result = await runLayoutAudit(project.dir, {
|
|
950
|
+
samples,
|
|
951
|
+
at,
|
|
952
|
+
atTransitions,
|
|
953
|
+
maxTransitionSamples,
|
|
954
|
+
timeout,
|
|
955
|
+
tolerance,
|
|
956
|
+
motion: motionSpec
|
|
957
|
+
});
|
|
958
|
+
if (!args.json && result.transitionSamplesDropped > 0) {
|
|
959
|
+
console.log(
|
|
960
|
+
`${c.warn("\u26A0")} ${result.transitionSamplesDropped} transition sample(s) omitted by --max-transition-samples; raise or drop it to sample every boundary`
|
|
961
|
+
);
|
|
962
|
+
}
|
|
963
|
+
const allIssues = collapseStatic ? collapseStaticLayoutIssues(result.rawIssues, result.samples.length) : result.rawIssues;
|
|
964
|
+
const limited = limitLayoutIssues(allIssues, maxIssues);
|
|
965
|
+
const summary = summarizeLayoutIssues(allIssues);
|
|
966
|
+
const ok = summary.errorCount === 0 && (!strict || summary.warningCount === 0);
|
|
967
|
+
if (args.json) {
|
|
968
|
+
console.log(
|
|
969
|
+
JSON.stringify(
|
|
970
|
+
withMeta(
|
|
971
|
+
{
|
|
972
|
+
schemaVersion: INSPECT_SCHEMA_VERSION,
|
|
973
|
+
duration: result.duration,
|
|
974
|
+
samples: result.samples,
|
|
975
|
+
transitionSamples: atTransitions ? result.transitionSamples : void 0,
|
|
976
|
+
transitionSamplesDropped: atTransitions ? result.transitionSamplesDropped : void 0,
|
|
977
|
+
tolerance,
|
|
978
|
+
strict,
|
|
979
|
+
collapseStatic,
|
|
980
|
+
motionSpec: motionSpec ? motionSpecPath : void 0,
|
|
981
|
+
motionSamples: motionSpec ? result.motionSamples : void 0,
|
|
982
|
+
...summary,
|
|
983
|
+
totalIssueCount: limited.totalIssueCount,
|
|
984
|
+
truncated: limited.truncated,
|
|
985
|
+
ok,
|
|
986
|
+
issues: limited.issues
|
|
987
|
+
},
|
|
988
|
+
{ deprecated: true }
|
|
989
|
+
),
|
|
990
|
+
null,
|
|
991
|
+
2
|
|
992
|
+
)
|
|
993
|
+
);
|
|
994
|
+
setCommandExitCode(ok ? 0 : 1);
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
997
|
+
if (result.samples.length === 0) {
|
|
998
|
+
console.log();
|
|
999
|
+
console.log(
|
|
1000
|
+
`${c.error("\u2717")} Could not determine composition duration \u2014 no layout samples run`
|
|
1001
|
+
);
|
|
1002
|
+
failCommand();
|
|
1003
|
+
}
|
|
1004
|
+
console.log();
|
|
1005
|
+
if (limited.issues.length === 0) {
|
|
1006
|
+
console.log(
|
|
1007
|
+
`${c.success("\u25C7")} 0 layout issues across ${result.samples.length} sample(s)`
|
|
1008
|
+
);
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
for (const issue of limited.issues) {
|
|
1012
|
+
const icon = issue.severity === "error" ? c.error("\u2717") : issue.severity === "warning" ? c.warn("\u26A0") : c.dim("\u2139");
|
|
1013
|
+
const formatted = formatLayoutIssue(issue).replace(/\n/g, "\n ");
|
|
1014
|
+
console.log(` ${icon} ${c.dim(formatted)}`);
|
|
1015
|
+
}
|
|
1016
|
+
console.log();
|
|
1017
|
+
const parts = [
|
|
1018
|
+
`${summary.errorCount} error(s)`,
|
|
1019
|
+
`${summary.warningCount} warning(s)`,
|
|
1020
|
+
`${summary.infoCount} info(s)`
|
|
1021
|
+
];
|
|
1022
|
+
const suffix = limited.truncated ? c.dim(`, truncated at ${maxIssues} issue(s)`) : "";
|
|
1023
|
+
console.log(`${ok ? c.success("\u25C7") : c.error("\u25C7")} ${parts.join(", ")}${suffix}`);
|
|
1024
|
+
setCommandExitCode(ok ? 0 : 1);
|
|
1025
|
+
return;
|
|
1026
|
+
} catch (err) {
|
|
1027
|
+
const message = normalizeErrorMessage(err);
|
|
1028
|
+
if (args.json) {
|
|
1029
|
+
console.log(
|
|
1030
|
+
JSON.stringify(
|
|
1031
|
+
withMeta(
|
|
1032
|
+
{
|
|
1033
|
+
schemaVersion: INSPECT_SCHEMA_VERSION,
|
|
1034
|
+
ok: false,
|
|
1035
|
+
error: message,
|
|
1036
|
+
issues: [],
|
|
1037
|
+
errorCount: 0,
|
|
1038
|
+
warningCount: 0,
|
|
1039
|
+
infoCount: 0,
|
|
1040
|
+
issueCount: 0
|
|
1041
|
+
},
|
|
1042
|
+
{ deprecated: true }
|
|
1043
|
+
),
|
|
1044
|
+
null,
|
|
1045
|
+
2
|
|
1046
|
+
)
|
|
1047
|
+
);
|
|
1048
|
+
failCommand();
|
|
1049
|
+
}
|
|
1050
|
+
console.error(`${c.error("\u2717")} Inspect failed: ${message}`);
|
|
1051
|
+
failCommand();
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1055
|
+
}
|
|
1056
|
+
var layout_default = createInspectCommand("layout");
|
|
1057
|
+
|
|
1058
|
+
export {
|
|
1059
|
+
buildLayoutSampleTimes,
|
|
1060
|
+
formatLayoutIssue,
|
|
1061
|
+
dedupeLayoutIssues,
|
|
1062
|
+
collapseStaticLayoutIssues,
|
|
1063
|
+
limitLayoutIssues,
|
|
1064
|
+
buildTransitionSampleTimes,
|
|
1065
|
+
mergeSampleTimes,
|
|
1066
|
+
ambiguousIssue,
|
|
1067
|
+
evaluateMotion,
|
|
1068
|
+
assertionTargets,
|
|
1069
|
+
collectSamplingTargets,
|
|
1070
|
+
findMotionSpec,
|
|
1071
|
+
readMotionSpec,
|
|
1072
|
+
examples,
|
|
1073
|
+
loadBrowserScript,
|
|
1074
|
+
parseAt,
|
|
1075
|
+
createInspectCommand,
|
|
1076
|
+
layout_default
|
|
1077
|
+
};
|