framefields 2.5.5 → 2.6.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/README.md +11 -0
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-C9euVW4K.mjs → audio-QBA2VogL.mjs} +3 -3
- package/dist/{audio-C9euVW4K.mjs.map → audio-QBA2VogL.mjs.map} +1 -1
- package/dist/cli.mjs +866 -16
- package/dist/cli.mjs.map +1 -1
- package/dist/components/index.d.mts +2 -2
- package/dist/components/index.mjs +43 -43
- package/dist/{dist-BuirkW-f.mjs → dist-CDwWQYg3.mjs} +2 -2
- package/dist/dist-CDwWQYg3.mjs.map +1 -0
- package/dist/{dist-DBdxM6xv.mjs → dist-nHCqVk-e.mjs} +3 -3
- package/dist/dist-nHCqVk-e.mjs.map +1 -0
- package/dist/effects/index.mjs +34 -34
- package/dist/{effects-B263lgUi.mjs → effects-C-6I4iYW.mjs} +2 -2
- package/dist/{effects-B263lgUi.mjs.map → effects-C-6I4iYW.mjs.map} +1 -1
- package/dist/fonts/index.d.mts +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-DNx6ps2p.mjs → fonts-BieW3VWV.mjs} +7 -3
- package/dist/fonts-BieW3VWV.mjs.map +1 -0
- package/dist/{gpu-BRBIoxMC.mjs → gpu-Bb4WmYYH.mjs} +2 -2
- package/dist/{gpu-BRBIoxMC.mjs.map → gpu-Bb4WmYYH.mjs.map} +1 -1
- package/dist/index-D-Gnyffj.d.mts.map +1 -1
- package/dist/{index-N1tMc5Z9.d.mts → index-E1IrPAm4.d.mts} +629 -203
- package/dist/index-E1IrPAm4.d.mts.map +1 -0
- package/dist/{index-CalU-mpZ.d.mts → index-j5LGVVbm.d.mts} +3 -1
- package/dist/index-j5LGVVbm.d.mts.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +50 -50
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-ChR8Z8Fm.mjs → preview-D6jS38Di.mjs} +2 -2
- package/dist/{preview-ChR8Z8Fm.mjs.map → preview-D6jS38Di.mjs.map} +1 -1
- package/dist/preview-engine/{chunk-ZJLNXN7W.mjs → chunk-AYTP6OGO.mjs} +6 -6
- package/dist/preview-engine/chunk-MLAIEIUF.mjs +1974 -0
- package/dist/preview-engine/chunk-W3I7LKDV.mjs +5 -0
- package/dist/preview-engine/chunk-ZMMNN77R.mjs +3 -0
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/{renderers-WZEV464O.mjs → renderers-4G3UOPA7.mjs} +1 -1
- package/dist/{program-O2bWX0cs.mjs → program-Bf4yHbHC.mjs} +19 -3
- package/dist/program-Bf4yHbHC.mjs.map +1 -0
- package/dist/registry/annotate.json +1 -1
- package/dist/registry/app-frame.json +1 -1
- package/dist/registry/backdrop.json +3 -3
- package/dist/registry/before-after.json +1 -1
- package/dist/registry/callout.json +1 -1
- package/dist/registry/captions.json +7 -1
- package/dist/registry/card-stack.json +3 -3
- package/dist/registry/chat-thread.json +7 -1
- package/dist/registry/code-block.json +8 -2
- package/dist/registry/confetti.json +1 -1
- package/dist/registry/device-frame.json +2 -1
- package/dist/registry/focus-zoom.json +1 -1
- package/dist/registry/logo-reveal.json +1 -1
- package/dist/registry/lower-third.json +1 -1
- package/dist/registry/meter.json +1 -1
- package/dist/registry/mouse-pointer.json +1 -1
- package/dist/registry/selection.json +3 -3
- package/dist/registry/spotlight.json +1 -1
- package/dist/registry/terminal.json +7 -1
- package/dist/registry/text-reveal.json +2 -1
- package/dist/registry/title-card.json +1 -1
- package/dist/registry/toasts.json +1 -1
- package/dist/registry/touch-point.json +4 -4
- package/dist/registry/waveform.json +3 -3
- package/dist/registry/word-cycle.json +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/renderer-4FQmduPw.mjs +5 -0
- package/dist/{renderer-DW21AyEv.mjs → renderer-4v6XYAiX.mjs} +3 -3
- package/dist/{renderer-DW21AyEv.mjs.map → renderer-4v6XYAiX.mjs.map} +1 -1
- package/dist/{renderer-YFHESw3v.mjs → renderer-79mO0b9Y.mjs} +3 -3
- package/dist/{renderer-YFHESw3v.mjs.map → renderer-79mO0b9Y.mjs.map} +1 -1
- package/dist/{renderer-DtqiWq1m.mjs → renderer-AOZWHGT3.mjs} +3 -3
- package/dist/{renderer-DtqiWq1m.mjs.map → renderer-AOZWHGT3.mjs.map} +1 -1
- package/dist/{renderer-Dw3K8KT9.mjs → renderer-B1Ox12RF.mjs} +2 -2
- package/dist/{renderer-Dw3K8KT9.mjs.map → renderer-B1Ox12RF.mjs.map} +1 -1
- package/dist/{renderer-DkM6Ikdf.mjs → renderer-B6vr-B0t.mjs} +3 -3
- package/dist/{renderer-DkM6Ikdf.mjs.map → renderer-B6vr-B0t.mjs.map} +1 -1
- package/dist/renderer-BBCpRuYU.mjs +5 -0
- package/dist/renderer-BBTo_jLO.mjs +5 -0
- package/dist/{renderer-CpDaUeCN.mjs → renderer-BDCS7k5X.mjs} +3 -3
- package/dist/{renderer-CpDaUeCN.mjs.map → renderer-BDCS7k5X.mjs.map} +1 -1
- package/dist/{renderer-DO1TeUqV.mjs → renderer-BFdgbqgW.mjs} +3 -3
- package/dist/{renderer-DO1TeUqV.mjs.map → renderer-BFdgbqgW.mjs.map} +1 -1
- package/dist/{renderer-CEAmByVW.mjs → renderer-BHgYRSu8.mjs} +2 -2
- package/dist/{renderer-CEAmByVW.mjs.map → renderer-BHgYRSu8.mjs.map} +1 -1
- package/dist/{renderer-CA_CwisV.mjs → renderer-BKssznKn.mjs} +2 -2
- package/dist/{renderer-CA_CwisV.mjs.map → renderer-BKssznKn.mjs.map} +1 -1
- package/dist/{renderer-DWG6EXGj.mjs → renderer-BL9vkn6m.mjs} +3 -3
- package/dist/{renderer-DWG6EXGj.mjs.map → renderer-BL9vkn6m.mjs.map} +1 -1
- package/dist/renderer-BLg66ZgG.mjs +5 -0
- package/dist/{renderer-RbMM6Njv.mjs → renderer-BQFxoNzi.mjs} +3 -3
- package/dist/{renderer-RbMM6Njv.mjs.map → renderer-BQFxoNzi.mjs.map} +1 -1
- package/dist/{renderer-x1xlZaH_.mjs → renderer-BQdn_qGp.mjs} +3 -3
- package/dist/{renderer-x1xlZaH_.mjs.map → renderer-BQdn_qGp.mjs.map} +1 -1
- package/dist/{renderer-DkOxEQsg.mjs → renderer-BR35Xp9n.mjs} +3 -3
- package/dist/{renderer-DkOxEQsg.mjs.map → renderer-BR35Xp9n.mjs.map} +1 -1
- package/dist/renderer-BScS8AzG.mjs +5 -0
- package/dist/{renderer-C2MaJKfY.mjs → renderer-BTjveb1Y.mjs} +3 -3
- package/dist/{renderer-C2MaJKfY.mjs.map → renderer-BTjveb1Y.mjs.map} +1 -1
- package/dist/renderer-Bb1cS5mJ.mjs +5 -0
- package/dist/{renderer-Dwh0jaor.mjs → renderer-Bbkf5EIi.mjs} +3 -3
- package/dist/{renderer-Dwh0jaor.mjs.map → renderer-Bbkf5EIi.mjs.map} +1 -1
- package/dist/{renderer-DsnV8tpW.mjs → renderer-BmgyvIC3.mjs} +3 -3
- package/dist/{renderer-DsnV8tpW.mjs.map → renderer-BmgyvIC3.mjs.map} +1 -1
- package/dist/{renderer-BfQdc3RM.mjs → renderer-Bpve7M6S.mjs} +69 -69
- package/dist/{renderer-BfQdc3RM.mjs.map → renderer-Bpve7M6S.mjs.map} +1 -1
- package/dist/renderer-Bpwd9zEY.mjs +5 -0
- package/dist/{renderer-C5QYI1Wu.mjs → renderer-BsnhAgrB.mjs} +2 -2
- package/dist/{renderer-C5QYI1Wu.mjs.map → renderer-BsnhAgrB.mjs.map} +1 -1
- package/dist/{renderer-BlU3Sh_0.mjs → renderer-By5xTRqB.mjs} +3 -3
- package/dist/{renderer-BlU3Sh_0.mjs.map → renderer-By5xTRqB.mjs.map} +1 -1
- package/dist/{renderer-D8m3fuRp.mjs → renderer-BzEQXAdl.mjs} +2 -2
- package/dist/{renderer-D8m3fuRp.mjs.map → renderer-BzEQXAdl.mjs.map} +1 -1
- package/dist/renderer-Bzyd9xi5.mjs +5 -0
- package/dist/{renderer-1NoJLLDa.mjs → renderer-C64g87yU.mjs} +3 -3
- package/dist/{renderer-1NoJLLDa.mjs.map → renderer-C64g87yU.mjs.map} +1 -1
- package/dist/{renderer-Daqvhwjp.mjs → renderer-C6Wb1TZT.mjs} +3 -3
- package/dist/{renderer-Daqvhwjp.mjs.map → renderer-C6Wb1TZT.mjs.map} +1 -1
- package/dist/{renderer-BWNQQZ12.mjs → renderer-CHPLHbAs.mjs} +3 -3
- package/dist/{renderer-BWNQQZ12.mjs.map → renderer-CHPLHbAs.mjs.map} +1 -1
- package/dist/{renderer-B5ZdkcMi.mjs → renderer-CJRu7lLH.mjs} +2 -2
- package/dist/{renderer-B5ZdkcMi.mjs.map → renderer-CJRu7lLH.mjs.map} +1 -1
- package/dist/{renderer-Bvizxddu.mjs → renderer-CMWUtfwn.mjs} +2 -2
- package/dist/{renderer-Bvizxddu.mjs.map → renderer-CMWUtfwn.mjs.map} +1 -1
- package/dist/{renderer-C3tdjg8B.mjs → renderer-CRkgyk08.mjs} +3 -3
- package/dist/{renderer-C3tdjg8B.mjs.map → renderer-CRkgyk08.mjs.map} +1 -1
- package/dist/renderer-CXVssx1k.mjs +5 -0
- package/dist/{renderer-DcApNxER.mjs → renderer-CY0BT6ok.mjs} +2 -2
- package/dist/{renderer-DcApNxER.mjs.map → renderer-CY0BT6ok.mjs.map} +1 -1
- package/dist/renderer-CYFiGLls.mjs +5 -0
- package/dist/{renderer-PhjHSS97.mjs → renderer-CYLP8sD6.mjs} +2 -2
- package/dist/{renderer-PhjHSS97.mjs.map → renderer-CYLP8sD6.mjs.map} +1 -1
- package/dist/{renderer-C6n8y6Pw.mjs → renderer-CY_1u6zi.mjs} +3 -3
- package/dist/{renderer-C6n8y6Pw.mjs.map → renderer-CY_1u6zi.mjs.map} +1 -1
- package/dist/renderer-C__BvvtP.mjs +5 -0
- package/dist/renderer-Ca3YZsoT.mjs +5 -0
- package/dist/{renderer-DADTT3ym.mjs → renderer-CcSBjtRa.mjs} +2 -2
- package/dist/{renderer-CnclEQdA.mjs → renderer-CgdplRri.mjs} +2 -2
- package/dist/{renderer-CnclEQdA.mjs.map → renderer-CgdplRri.mjs.map} +1 -1
- package/dist/{renderer-oR1LvHeO.mjs → renderer-Cn9tU_s5.mjs} +2 -2
- package/dist/{renderer-oR1LvHeO.mjs.map → renderer-Cn9tU_s5.mjs.map} +1 -1
- package/dist/renderer-CnM5iFj9.mjs +5 -0
- package/dist/{renderer-DHdFVpdH.mjs → renderer-Cqp_TUl_.mjs} +2 -2
- package/dist/{renderer-DHdFVpdH.mjs.map → renderer-Cqp_TUl_.mjs.map} +1 -1
- package/dist/{renderer-C8pJFxcL.mjs → renderer-CsOLHKFx.mjs} +2 -2
- package/dist/{renderer-C8pJFxcL.mjs.map → renderer-CsOLHKFx.mjs.map} +1 -1
- package/dist/{renderer-R5Lg65F8.mjs → renderer-D01RT3Ov.mjs} +2 -2
- package/dist/renderer-D1nZrvQx.mjs +5 -0
- package/dist/renderer-D6XjVQME.mjs +5 -0
- package/dist/{renderer-QQDU1b0Z.mjs → renderer-DAONCf_3.mjs} +3 -3
- package/dist/{renderer-QQDU1b0Z.mjs.map → renderer-DAONCf_3.mjs.map} +1 -1
- package/dist/{renderer-DTPmvL1i.mjs → renderer-DAfWLGfy.mjs} +3 -3
- package/dist/{renderer-DTPmvL1i.mjs.map → renderer-DAfWLGfy.mjs.map} +1 -1
- package/dist/{renderer-BvA4sQz5.mjs → renderer-DEeKkljI.mjs} +3 -3
- package/dist/{renderer-BvA4sQz5.mjs.map → renderer-DEeKkljI.mjs.map} +1 -1
- package/dist/{renderer-YBwN9uyj.mjs → renderer-DFYXjAIT.mjs} +5 -5
- package/dist/{renderer-YBwN9uyj.mjs.map → renderer-DFYXjAIT.mjs.map} +1 -1
- package/dist/renderer-DIuMnMF0.mjs +5 -0
- package/dist/{renderer-Dz4muMyE.mjs → renderer-DJHuPNJx.mjs} +2 -2
- package/dist/{renderer-Dz4muMyE.mjs.map → renderer-DJHuPNJx.mjs.map} +1 -1
- package/dist/{renderer-H4-8sBjl.mjs → renderer-DJTXhVNh.mjs} +2 -2
- package/dist/{renderer-H4-8sBjl.mjs.map → renderer-DJTXhVNh.mjs.map} +1 -1
- package/dist/{renderer-BMiZIGkZ.mjs → renderer-DNEFYrQ5.mjs} +2 -2
- package/dist/renderer-DUvvM8EF.mjs +5 -0
- package/dist/renderer-DWogyuMO.mjs +5 -0
- package/dist/renderer-DWsj_LJR.mjs +5 -0
- package/dist/{renderer-DGOY-LBR.mjs → renderer-DYJHFHF4.mjs} +2 -2
- package/dist/{renderer-DGOY-LBR.mjs.map → renderer-DYJHFHF4.mjs.map} +1 -1
- package/dist/{renderer-CVbNiH03.mjs → renderer-DYR4gFEM.mjs} +3 -3
- package/dist/{renderer-CVbNiH03.mjs.map → renderer-DYR4gFEM.mjs.map} +1 -1
- package/dist/renderer-DYun0DJl.mjs +5 -0
- package/dist/renderer-D_6YqD-Z.mjs +5 -0
- package/dist/{renderer-B0IJirDs.mjs → renderer-D_UPFbei.mjs} +3 -3
- package/dist/{renderer-B0IJirDs.mjs.map → renderer-D_UPFbei.mjs.map} +1 -1
- package/dist/renderer-Db9LP86x.mjs +5 -0
- package/dist/{renderer-CFRTJ7cT.mjs → renderer-DgRJG_l-.mjs} +2 -2
- package/dist/{renderer-CFRTJ7cT.mjs.map → renderer-DgRJG_l-.mjs.map} +1 -1
- package/dist/renderer-DhHiC87m.mjs +5 -0
- package/dist/{renderer-BZ5uOfoX.mjs → renderer-DiD3r9tx.mjs} +2 -2
- package/dist/{renderer-BZ5uOfoX.mjs.map → renderer-DiD3r9tx.mjs.map} +1 -1
- package/dist/{renderer-B2no_9zi.mjs → renderer-Dj-y-BtT.mjs} +3 -3
- package/dist/{renderer-B2no_9zi.mjs.map → renderer-Dj-y-BtT.mjs.map} +1 -1
- package/dist/renderer-Dj5jGAkR.mjs +5 -0
- package/dist/{renderer-Bs6BaMLf.mjs → renderer-DlA7kzIs.mjs} +3 -3
- package/dist/{renderer-Bs6BaMLf.mjs.map → renderer-DlA7kzIs.mjs.map} +1 -1
- package/dist/renderer-DlPUQ7RF.mjs +5 -0
- package/dist/renderer-DpIPdgn8.mjs +5 -0
- package/dist/renderer-Dv0C9CEt.mjs +6 -0
- package/dist/{renderer-CFCR_7bq.mjs → renderer-EwSSuJXj.mjs} +3 -3
- package/dist/{renderer-CFCR_7bq.mjs.map → renderer-EwSSuJXj.mjs.map} +1 -1
- package/dist/renderer-Iw8fDL-p.mjs +5 -0
- package/dist/{renderer-tcS585Iy.mjs → renderer-JJibsJfb.mjs} +2 -2
- package/dist/{renderer-tcS585Iy.mjs.map → renderer-JJibsJfb.mjs.map} +1 -1
- package/dist/{renderer-CTy0bSsl.mjs → renderer-KppAWfmJ.mjs} +3 -3
- package/dist/{renderer-CTy0bSsl.mjs.map → renderer-KppAWfmJ.mjs.map} +1 -1
- package/dist/{renderer-CPSg6eEQ.mjs → renderer-LW8MfGjd.mjs} +2 -2
- package/dist/{renderer-CPSg6eEQ.mjs.map → renderer-LW8MfGjd.mjs.map} +1 -1
- package/dist/{renderer-Cg2xS8h8.mjs → renderer-PMjV8x65.mjs} +2 -2
- package/dist/{renderer-Cg2xS8h8.mjs.map → renderer-PMjV8x65.mjs.map} +1 -1
- package/dist/renderer-SLI69Mju.mjs +5 -0
- package/dist/{renderer-DdkPY4hO.mjs → renderer-UArFa4y9.mjs} +2 -2
- package/dist/{renderer-DdkPY4hO.mjs.map → renderer-UArFa4y9.mjs.map} +1 -1
- package/dist/{renderer-B7vXnBUo.mjs → renderer-VwKmjuc6.mjs} +3 -3
- package/dist/{renderer-B7vXnBUo.mjs.map → renderer-VwKmjuc6.mjs.map} +1 -1
- package/dist/renderer-ZVtbb3-P.mjs +5 -0
- package/dist/{renderer-Dk0okoS3.mjs → renderer-bb3puodg.mjs} +2 -2
- package/dist/{renderer-Dk0okoS3.mjs.map → renderer-bb3puodg.mjs.map} +1 -1
- package/dist/{renderer-DVGVcDvB.mjs → renderer-eyvY4Lq4.mjs} +3 -3
- package/dist/{renderer-DVGVcDvB.mjs.map → renderer-eyvY4Lq4.mjs.map} +1 -1
- package/dist/renderer-gHNCu7H5.mjs +5 -0
- package/dist/renderer-gxDNmbtU.mjs +5 -0
- package/dist/renderer-hkK4DNRX.mjs +5 -0
- package/dist/{renderer-CrKYlipx.mjs → renderer-ij448rvt.mjs} +2 -2
- package/dist/{renderer-CrKYlipx.mjs.map → renderer-ij448rvt.mjs.map} +1 -1
- package/dist/{renderer-BrKgtYq4.mjs → renderer-j7aUfyeR.mjs} +3 -3
- package/dist/{renderer-BrKgtYq4.mjs.map → renderer-j7aUfyeR.mjs.map} +1 -1
- package/dist/{renderer-8_d6YNnE.mjs → renderer-kOlfYLtu.mjs} +2 -2
- package/dist/{renderer-8_d6YNnE.mjs.map → renderer-kOlfYLtu.mjs.map} +1 -1
- package/dist/{renderer-D3FJcRA3.mjs → renderer-l1qJE4z-.mjs} +2 -2
- package/dist/{renderer-D3FJcRA3.mjs.map → renderer-l1qJE4z-.mjs.map} +1 -1
- package/dist/{renderer-BKJ8cywK.mjs → renderer-ml2LHmRb.mjs} +2 -2
- package/dist/{renderer-BKJ8cywK.mjs.map → renderer-ml2LHmRb.mjs.map} +1 -1
- package/dist/{renderer-DmTxEeMh.mjs → renderer-mu2mYo5w.mjs} +3 -3
- package/dist/{renderer-DmTxEeMh.mjs.map → renderer-mu2mYo5w.mjs.map} +1 -1
- package/dist/{renderer-Bwxm-kWL.mjs → renderer-ovkctV5a.mjs} +2 -2
- package/dist/renderer-oy6SGDRz.mjs +5 -0
- package/dist/{renderer-CqJou_2L.mjs → renderer-qQmoO5Hk.mjs} +2 -2
- package/dist/{renderer-CqJou_2L.mjs.map → renderer-qQmoO5Hk.mjs.map} +1 -1
- package/dist/renderer-rq7UIcuH.mjs +5 -0
- package/dist/{renderer-BStETpqC.mjs → renderer-rv-AKqCl.mjs} +2 -2
- package/dist/{renderer-BStETpqC.mjs.map → renderer-rv-AKqCl.mjs.map} +1 -1
- package/dist/renderer-xkEJahws.mjs +5 -0
- package/dist/{renderer-BNs31kME.mjs → renderer-yF40Pb-n.mjs} +3 -3
- package/dist/{renderer-BNs31kME.mjs.map → renderer-yF40Pb-n.mjs.map} +1 -1
- package/dist/{renderer-Bag1LFos.mjs → renderer-yFHP9Zj2.mjs} +3 -3
- package/dist/{renderer-Bag1LFos.mjs.map → renderer-yFHP9Zj2.mjs.map} +1 -1
- package/dist/{renderer-CbxfSmYE.mjs → renderer-zOK5DYYn.mjs} +3 -3
- package/dist/{renderer-CbxfSmYE.mjs.map → renderer-zOK5DYYn.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-EZZPEbhW.mjs → renderers-CP8CFWDs-DPLX5EJs.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-EZZPEbhW.mjs.map → renderers-CP8CFWDs-DPLX5EJs.mjs.map} +1 -1
- package/dist/signals/index.mjs +4 -4
- package/dist/{src-r7Suenhp.mjs → src-BnkrNj2W.mjs} +612 -117
- package/dist/src-BnkrNj2W.mjs.map +1 -0
- package/package.json +59 -58
- package/dist/dist-BuirkW-f.mjs.map +0 -1
- package/dist/dist-DBdxM6xv.mjs.map +0 -1
- package/dist/fonts-DNx6ps2p.mjs.map +0 -1
- package/dist/index-CalU-mpZ.d.mts.map +0 -1
- package/dist/index-N1tMc5Z9.d.mts.map +0 -1
- package/dist/preview-engine/chunk-2TCJSHFA.mjs +0 -1974
- package/dist/preview-engine/chunk-Q7XC3FI7.mjs +0 -3
- package/dist/preview-engine/chunk-ZZAZF6VC.mjs +0 -5
- package/dist/program-O2bWX0cs.mjs.map +0 -1
- package/dist/renderer-0441BN0U.mjs +0 -5
- package/dist/renderer-3qDgFc-W.mjs +0 -5
- package/dist/renderer-6AIqTN5Z.mjs +0 -5
- package/dist/renderer-B7MZ5R7u.mjs +0 -5
- package/dist/renderer-BE2rIA4B.mjs +0 -5
- package/dist/renderer-BIQ81ln4.mjs +0 -5
- package/dist/renderer-BKm3_Ob3.mjs +0 -5
- package/dist/renderer-BNdT1Wwf.mjs +0 -5
- package/dist/renderer-BQycs1q_.mjs +0 -5
- package/dist/renderer-Bj7MxXfk.mjs +0 -5
- package/dist/renderer-BjRAGYYC.mjs +0 -5
- package/dist/renderer-BqE2BQ_X.mjs +0 -5
- package/dist/renderer-Bz5BMkOE.mjs +0 -5
- package/dist/renderer-CDOSfB9H.mjs +0 -5
- package/dist/renderer-CT26yQT-.mjs +0 -5
- package/dist/renderer-CZeAbz48.mjs +0 -5
- package/dist/renderer-D50b7kip.mjs +0 -5
- package/dist/renderer-D5LmrO96.mjs +0 -5
- package/dist/renderer-DCvqZ5o_.mjs +0 -5
- package/dist/renderer-DJGJeGEn.mjs +0 -5
- package/dist/renderer-DONvNNXi.mjs +0 -5
- package/dist/renderer-DPaSo--Y.mjs +0 -6
- package/dist/renderer-DfYYokhr.mjs +0 -5
- package/dist/renderer-DlIJhdEM.mjs +0 -5
- package/dist/renderer-DqD3nMtv.mjs +0 -5
- package/dist/renderer-DrIl-uGt.mjs +0 -5
- package/dist/renderer-DyCB3Q1d.mjs +0 -5
- package/dist/renderer-DyJ-iSv6.mjs +0 -5
- package/dist/renderer-Dzs0jV0G.mjs +0 -5
- package/dist/renderer-HIKXw5-Y.mjs +0 -5
- package/dist/renderer-Jgt2g8Wp.mjs +0 -5
- package/dist/renderer-KnZWmT-M.mjs +0 -5
- package/dist/renderer-OMSXddG9.mjs +0 -5
- package/dist/renderer-P78xh6OV.mjs +0 -5
- package/dist/renderer-gaFP1Kak.mjs +0 -5
- package/dist/renderer-lQ8gH7Zd.mjs +0 -5
- package/dist/src-r7Suenhp.mjs.map +0 -1
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["path"],"sources":["../src/cli/add.ts","../src/cli/registry.ts","../src/cli.ts"],"sourcesContent":["/**\n * `framefields add`: copy components' source into a project, the way a\n * shadcn-style registry does. The code becomes the project's own; it\n * imports only `framefields` and `framefields/components` (the toolkit),\n * plus any component it builds on, which is installed alongside it.\n *\n * Where they go is remembered in `framefields.json` at the project root.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport type { Registry, RegistryItem } from \"./registry.js\";\n\nexport const CONFIG_FILE = \"framefields.json\";\n\nexport interface ProjectConfig {\n\t/** Components directory, relative to the project root. */\n\tcomponents: string;\n}\n\n/** The project's config, or the default it would get: `src/components` when there is a `src`. */\nexport function readConfig(cwd: string): {\n\tconfig: ProjectConfig;\n\tsaved: boolean;\n} {\n\tconst file = join(cwd, CONFIG_FILE);\n\tif (existsSync(file)) {\n\t\tconst config = JSON.parse(\n\t\t\treadFileSync(file, \"utf8\"),\n\t\t) as Partial<ProjectConfig>;\n\t\tif (typeof config.components !== \"string\")\n\t\t\tthrow new Error(`${CONFIG_FILE}: \"components\" must be a directory path`);\n\t\treturn { config: config as ProjectConfig, saved: true };\n\t}\n\tconst components = existsSync(join(cwd, \"src\"))\n\t\t? \"src/components\"\n\t\t: \"components\";\n\treturn { config: { components }, saved: false };\n}\n\nexport interface AddOptions {\n\tcwd: string;\n\tregistry: Registry;\n\t/** Components directory; saved to `framefields.json` if there is none yet. */\n\tdir?: string;\n\t/** Replace files that differ from the registry's. */\n\toverwrite?: boolean;\n}\n\nexport interface AddReport {\n\tdir: string;\n\t/** Components in install order (dependencies first). */\n\tcomponents: RegistryItem[];\n\twritten: string[];\n\tunchanged: string[];\n\t/** Files left alone because they differ and `overwrite` is off. */\n\tskipped: string[];\n\tconfigWritten: boolean;\n}\n\n/** Resolve `names` (and what they import) and write their files. */\nexport async function add(\n\tnames: string[],\n\toptions: AddOptions,\n): Promise<AddReport> {\n\tconst { cwd, registry } = options;\n\tconst index = await registry.index();\n\tconst known = new Set(index.map((e) => e.name));\n\tfor (const n of names)\n\t\tif (!known.has(n))\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown component \"${n}\". Run \\`framefields list\\` to see them all.`,\n\t\t\t);\n\n\t// Depth-first, dependencies before dependants.\n\tconst order: RegistryItem[] = [];\n\tconst seen = new Set<string>();\n\tconst visit = async (name: string) => {\n\t\tif (seen.has(name)) return;\n\t\tseen.add(name);\n\t\tconst item = await registry.item(name);\n\t\tfor (const d of item.registryDependencies) await visit(d);\n\t\torder.push(item);\n\t};\n\tfor (const n of names) await visit(n);\n\n\tconst { config, saved } = readConfig(cwd);\n\tconst rel = options.dir ?? config.components;\n\tconst dir = resolve(cwd, rel);\n\tconst report: AddReport = {\n\t\tdir,\n\t\tcomponents: order,\n\t\twritten: [],\n\t\tunchanged: [],\n\t\tskipped: [],\n\t\tconfigWritten: false,\n\t};\n\tfor (const item of order) {\n\t\tfor (const file of item.files) {\n\t\t\tconst target = join(dir, file.path);\n\t\t\tconst shown = relative(cwd, target);\n\t\t\tif (existsSync(target)) {\n\t\t\t\tif (readFileSync(target, \"utf8\") === file.content) {\n\t\t\t\t\treport.unchanged.push(shown);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!options.overwrite) {\n\t\t\t\t\treport.skipped.push(shown);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmkdirSync(dirname(target), { recursive: true });\n\t\t\twriteFileSync(target, file.content);\n\t\t\treport.written.push(shown);\n\t\t}\n\t}\n\tif (!saved) {\n\t\twriteFileSync(\n\t\t\tjoin(cwd, CONFIG_FILE),\n\t\t\t`${JSON.stringify({ components: relative(cwd, dir) || \".\" }, null, \"\\t\")}\\n`,\n\t\t);\n\t\treport.configWritten = true;\n\t}\n\treturn report;\n}\n","/**\n * Reading a component registry: the one shipped in this package's dist, a\n * local folder, or one served over http(s). A registry is `index.json` (the\n * entries) plus `<name>.json` per component (entry, meta and files).\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface RegistryEntry {\n\t/** What `framefields add` takes: `logo-reveal`. */\n\tname: string;\n\t/** The factory the component exports: `LogoReveal`. */\n\ttitle: string;\n\tsummary: string;\n\ttags: readonly string[];\n\texample: string;\n\t/** Other components it imports, installed with it. */\n\tregistryDependencies: string[];\n}\n\nexport interface RegistryItem extends RegistryEntry {\n\tparts: readonly string[];\n\tcues: readonly string[];\n\t/** Paths relative to the components directory. */\n\tfiles: Array<{ path: string; content: string }>;\n}\n\nexport interface Registry {\n\t/** Where it was read from, for messages. */\n\tsource: string;\n\tindex(): Promise<RegistryEntry[]>;\n\titem(name: string): Promise<RegistryItem>;\n}\n\n/** The registry shipped next to this module in dist (`dist/registry`). */\nexport function bundledRegistryPath(): string {\n\treturn fileURLToPath(new URL(\"./registry/\", import.meta.url));\n}\n\n/** `source`: a folder or an http(s) URL. Default: the bundled registry. */\nexport function openRegistry(source?: string, cwd = process.cwd()): Registry {\n\tconst from =\n\t\tsource ?? process.env.FRAMEFIELDS_REGISTRY ?? bundledRegistryPath();\n\tif (/^https?:\\/\\//.test(from)) {\n\t\tconst base = from.endsWith(\"/\") ? from : `${from}/`;\n\t\tconst get = async <T>(file: string): Promise<T> => {\n\t\t\tconst res = await fetch(new URL(file, base));\n\t\t\tif (!res.ok)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${new URL(file, base)}: ${res.status} ${res.statusText}`,\n\t\t\t\t);\n\t\t\treturn (await res.json()) as T;\n\t\t};\n\t\treturn {\n\t\t\tsource: base,\n\t\t\tindex: () => get(\"index.json\"),\n\t\t\titem: (name) => get(`${name}.json`),\n\t\t};\n\t}\n\tconst dir = resolve(cwd, from);\n\tconst read = <T>(file: string): T => {\n\t\tconst path = join(dir, file);\n\t\tif (!existsSync(path)) throw new Error(`No ${file} in registry ${dir}`);\n\t\treturn JSON.parse(readFileSync(path, \"utf8\")) as T;\n\t};\n\treturn {\n\t\tsource: dir,\n\t\tindex: async () => read(\"index.json\"),\n\t\titem: async (name) => read(`${name}.json`),\n\t};\n}\n","#!/usr/bin/env node\n/**\n * The `framefields` command.\n *\n * npx framefields add <name...> copy components into this project\n * npx framefields list the components you can add\n */\nimport { readFileSync } from \"node:fs\";\nimport { relative } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { add } from \"./cli/add.js\";\nimport { openRegistry } from \"./cli/registry.js\";\n\nconst HELP = `Usage: framefields <command> [options]\n\nCommands:\n add <name...> Copy components' source into this project (and the\n components they build on). The code is yours to edit.\n list List the components you can add.\n\nOptions for add:\n --all Add every component.\n --dir <path> Components directory (default: from framefields.json,\n else src/components or components). Saved the first time.\n --overwrite Replace files you have changed.\n\nOptions for both:\n --registry <src> A registry folder or http(s) URL instead of the one\n shipped with this version of framefields.\n -h, --help Show this help.\n\nExample:\n npx framefields add mouse-pointer focus-zoom\n`;\n\nasync function main(argv: string[]): Promise<number> {\n\tconst { values, positionals } = parseArgs({\n\t\targs: argv,\n\t\tallowPositionals: true,\n\t\toptions: {\n\t\t\tall: { type: \"boolean\" },\n\t\t\tdir: { type: \"string\" },\n\t\t\toverwrite: { type: \"boolean\" },\n\t\t\tregistry: { type: \"string\" },\n\t\t\thelp: { type: \"boolean\", short: \"h\" },\n\t\t},\n\t});\n\tconst [command, ...names] = positionals;\n\tif (values.help || !command) {\n\t\tprocess.stdout.write(HELP);\n\t\treturn command || values.help ? 0 : 1;\n\t}\n\tconst cwd = process.cwd();\n\tconst registry = openRegistry(values.registry, cwd);\n\n\tif (command === \"list\") {\n\t\tconst index = await registry.index();\n\t\tconst width = Math.max(...index.map((e) => e.name.length));\n\t\tfor (const e of index)\n\t\t\tprocess.stdout.write(`${e.name.padEnd(width)} ${e.summary}\\n`);\n\t\treturn 0;\n\t}\n\tif (command !== \"add\") {\n\t\tprocess.stderr.write(`Unknown command \"${command}\".\\n\\n${HELP}`);\n\t\treturn 1;\n\t}\n\n\tconst wanted = values.all\n\t\t? (await registry.index()).map((e) => e.name)\n\t\t: names;\n\tif (wanted.length === 0) {\n\t\tprocess.stderr.write(\n\t\t\t\"Name the components to add, e.g. `framefields add mouse-pointer`.\\nRun `framefields list` to see them all.\\n\",\n\t\t);\n\t\treturn 1;\n\t}\n\tconst report = await add(wanted, {\n\t\tcwd,\n\t\tregistry,\n\t\tdir: values.dir,\n\t\toverwrite: values.overwrite,\n\t});\n\tconst log = (line: string) => process.stdout.write(`${line}\\n`);\n\tfor (const f of report.written) log(` wrote ${f}`);\n\tfor (const f of report.unchanged) log(` unchanged ${f}`);\n\tfor (const f of report.skipped)\n\t\tlog(` skipped ${f} (yours differs; --overwrite replaces it)`);\n\tif (report.configWritten) log(\" wrote framefields.json\");\n\tconst extra = report.components.filter((c) => !wanted.includes(c.name));\n\tif (extra.length > 0)\n\t\tlog(`\\nWith what they build on: ${extra.map((c) => c.name).join(\", \")}.`);\n\twarnIfMissingFramefields(cwd, log);\n\tconst first = report.components.find((c) => wanted.includes(c.name));\n\tif (first)\n\t\tlog(\n\t\t\t`\\nimport { ${first.title} } from \"./${first.name}/index.js\"; // from ${relative(cwd, report.dir) || \".\"}`,\n\t\t);\n\treturn 0;\n}\n\n/** Installed components import `framefields`; say so if the project lacks it. */\nfunction warnIfMissingFramefields(cwd: string, log: (s: string) => void) {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(`${cwd}/package.json`, \"utf8\")) as {\n\t\t\tdependencies?: Record<string, string>;\n\t\t\tdevDependencies?: Record<string, string>;\n\t\t};\n\t\tif (!pkg.dependencies?.framefields && !pkg.devDependencies?.framefields)\n\t\t\tlog(\n\t\t\t\t\"\\nThese components import `framefields`: add it with `npm i framefields`.\",\n\t\t\t);\n\t} catch {\n\t\t// No package.json: nothing to check.\n\t}\n}\n\nmain(process.argv.slice(2)).then(\n\t(code) => process.exit(code),\n\t(error: unknown) => {\n\t\tprocess.stderr.write(\n\t\t\t`framefields: ${error instanceof Error ? error.message : String(error)}\\n`,\n\t\t);\n\t\tprocess.exit(1);\n\t},\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["path","fonts","path","path","config"],"sources":["../src/cli/config.ts","../src/cli/fonts.ts","../src/cli/add.ts","../src/cli/templates.ts","../src/cli/init.ts","../src/cli/registry.ts","../src/cli.ts"],"sourcesContent":["/**\n * `framefields.json` at the project root: where installed components live,\n * and which fonts `framefields add` / `framefields fonts add` installed.\n */\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport const CONFIG_FILE = \"framefields.json\";\n\nexport interface ProjectConfig {\n\t/** Components directory, relative to the project root. */\n\tcomponents: string;\n\t/**\n\t * Font files by role (`emoji`), relative to the project root. A role\n\t * set here counts as installed: point it at your own font to use that.\n\t */\n\tfonts?: Partial<Record<string, string>>;\n}\n\n/** The project's config, or the default it would get: `src/components` when there is a `src`. */\nexport function readConfig(cwd: string): {\n\tconfig: ProjectConfig;\n\tsaved: boolean;\n} {\n\tconst file = join(cwd, CONFIG_FILE);\n\tif (existsSync(file)) {\n\t\tconst config = JSON.parse(\n\t\t\treadFileSync(file, \"utf8\"),\n\t\t) as Partial<ProjectConfig>;\n\t\tif (typeof config.components !== \"string\")\n\t\t\tthrow new Error(`${CONFIG_FILE}: \"components\" must be a directory path`);\n\t\tif (\n\t\t\tconfig.fonts !== undefined &&\n\t\t\t(typeof config.fonts !== \"object\" ||\n\t\t\t\tObject.values(config.fonts).some((v) => typeof v !== \"string\"))\n\t\t)\n\t\t\tthrow new Error(\n\t\t\t\t`${CONFIG_FILE}: \"fonts\" must map roles to font file paths, e.g. { \"emoji\": \"assets/fonts/NotoColorEmoji.ttf\" }`,\n\t\t\t);\n\t\treturn { config: config as ProjectConfig, saved: true };\n\t}\n\tconst components = existsSync(join(cwd, \"src\"))\n\t\t? \"src/components\"\n\t\t: \"components\";\n\treturn { config: { components }, saved: false };\n}\n\nexport function writeConfig(cwd: string, config: ProjectConfig): void {\n\twriteFileSync(\n\t\tjoin(cwd, CONFIG_FILE),\n\t\t`${JSON.stringify(config, null, \"\\t\")}\\n`,\n\t);\n}\n","/**\n * Fonts the CLI installs into a project: a catalog of pinned files (URL,\n * size, SHA-256, license), the installer `framefields add` and\n * `framefields fonts add` share, and the generated `fonts.ts` module that\n * registers whatever is installed.\n *\n * framefields ships no fonts in its package (a color emoji font alone is\n * ~10 MB); they're fetched when a project needs one, verified byte for byte,\n * and saved with their license next to them.\n */\nimport { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, posix, relative, resolve, sep } from \"node:path\";\nimport { readConfig, writeConfig } from \"./config.js\";\n\n/** A downloadable file, pinned by size and hash. */\ninterface PinnedFile {\n\turl: string;\n\tsha256: string;\n\tbytes: number;\n}\n\nexport interface FontSpec {\n\t/** What it's for, in a sentence: shown by `fonts list`. */\n\tlabel: string;\n\t/** File name it's saved under. */\n\tfile: string;\n\tfont: PinnedFile;\n\tlicense: PinnedFile & {\n\t\t/** SPDX id. */\n\t\tid: string;\n\t\t/** File name it's saved under, next to the font. */\n\t\tfile: string;\n\t};\n\t/**\n\t * How it registers: as the color emoji font, or as a text family under\n\t * this name (the name themes use: `Inter`, `JetBrains Mono`).\n\t */\n\tregister: { emoji: true } | { family: string };\n}\n\nconst NOTO_EMOJI =\n\t\"https://raw.githubusercontent.com/googlefonts/noto-emoji/v2.051\";\n/** google/fonts at one commit: Inter and JetBrains Mono. */\nconst GOOGLE_FONTS =\n\t\"https://raw.githubusercontent.com/google/fonts/e7db6ca603fd4862010383ff17ffd6cc4ffac1c0\";\n\n/** Installable fonts by role. */\nexport const FONTS: Record<string, FontSpec> = {\n\temoji: {\n\t\tlabel: \"Noto Color Emoji 2.051: color emoji in any text (🎉 ❤️ 👍)\",\n\t\tfile: \"NotoColorEmoji.ttf\",\n\t\tfont: {\n\t\t\turl: `${NOTO_EMOJI}/fonts/NotoColorEmoji.ttf`,\n\t\t\tsha256:\n\t\t\t\t\"72a635cb3d2f3524c51620cdde406b217204e8a6a06c6a096ff8ed4b5fd6e27b\",\n\t\t\tbytes: 10_673_480,\n\t\t},\n\t\tlicense: {\n\t\t\tid: \"OFL-1.1\",\n\t\t\tfile: \"NotoColorEmoji-OFL.txt\",\n\t\t\turl: `${NOTO_EMOJI}/fonts/LICENSE`,\n\t\t\tsha256:\n\t\t\t\t\"6a73f9541c2de74158c0e7cf6b0a58ef774f5a780bf191f2d7ec9cc53efe2bf2\",\n\t\t\tbytes: 4_301,\n\t\t},\n\t\tregister: { emoji: true },\n\t},\n\tsans: googleFont({\n\t\tlabel: \"Inter 4: the built-in themes' display and body face\",\n\t\tfile: \"Inter.ttf\",\n\t\tfamily: \"Inter\",\n\t\tpath: \"ofl/inter/Inter%5Bopsz,wght%5D.ttf\",\n\t\tsha256: \"29160a80ff49ddcab2c97711247e08b1fab27a484a329ce8b813d820dc559031\",\n\t\tbytes: 876_576,\n\t\tlicense: {\n\t\t\tpath: \"ofl/inter/OFL.txt\",\n\t\t\tsha256:\n\t\t\t\t\"5b9321a4298cfeb6b34354164a1c3afc3db114569984c502b9b35d988fd58c57\",\n\t\t\tbytes: 4_377,\n\t\t},\n\t}),\n\tmono: googleFont({\n\t\tlabel: \"JetBrains Mono 2: the built-in themes' code and terminal face\",\n\t\tfile: \"JetBrainsMono.ttf\",\n\t\tfamily: \"JetBrains Mono\",\n\t\tpath: \"ofl/jetbrainsmono/JetBrainsMono%5Bwght%5D.ttf\",\n\t\tsha256: \"48715a42ec242c21e9f02692891e147d022299a52e48d5e413e1a942193ffeda\",\n\t\tbytes: 187_208,\n\t\tlicense: {\n\t\t\tpath: \"ofl/jetbrainsmono/OFL.txt\",\n\t\t\tsha256:\n\t\t\t\t\"b2fe5e8987594e9ffd1d2ca52a2f5d73eb8335243893c5d6254b5ad69269591d\",\n\t\t\tbytes: 4_399,\n\t\t},\n\t}),\n};\n\n/** google/fonts, pinned to one commit. */\nfunction googleFont(o: {\n\tlabel: string;\n\tfile: string;\n\tfamily: string;\n\tpath: string;\n\tsha256: string;\n\tbytes: number;\n\tlicense: { path: string; sha256: string; bytes: number };\n}): FontSpec {\n\tconst at = (path: string) => `${GOOGLE_FONTS}/${path}`;\n\treturn {\n\t\tlabel: o.label,\n\t\tfile: o.file,\n\t\tfont: { url: at(o.path), sha256: o.sha256, bytes: o.bytes },\n\t\tlicense: {\n\t\t\turl: at(o.license.path),\n\t\t\tsha256: o.license.sha256,\n\t\t\tbytes: o.license.bytes,\n\t\t\tid: \"OFL-1.1\",\n\t\t\tfile: o.file.replace(/\\.ttf$/, \"-OFL.txt\"),\n\t\t},\n\t\tregister: { family: o.family },\n\t};\n}\n\n/** Where fonts go when `framefields.json` names no place: the setup skill's layout. */\nexport const DEFAULT_FONTS_DIR = \"assets/fonts\";\n\nexport type Fetch = (url: string) => Promise<{\n\tok: boolean;\n\tstatus: number;\n\tstatusText: string;\n\tarrayBuffer(): Promise<ArrayBuffer>;\n}>;\n\nexport interface FontInstallOptions {\n\tcwd: string;\n\t/** Folder for new font files, relative to `cwd`. Default `assets/fonts`. */\n\tdir?: string;\n\t/** Replace a different file already at the target path. */\n\toverwrite?: boolean;\n\t/** For tests; default the global `fetch`. */\n\tfetch?: Fetch;\n\t/** For tests; default {@link FONTS}. */\n\tcatalog?: Record<string, FontSpec>;\n\t/** Called before a download starts (for progress messages). */\n\tonDownload?: (spec: FontSpec) => void;\n}\n\nexport interface FontInstall {\n\trole: string;\n\t/** Relative to the project root. */\n\tpath: string;\n\t/**\n\t * `installed`: downloaded now. `present`: the pinned file was already\n\t * there. `configured`: `framefields.json` already names a font for the role.\n\t */\n\tstatus: \"installed\" | \"present\" | \"configured\";\n}\n\nconst sha256 = (bytes: Uint8Array) =>\n\tcreateHash(\"sha256\").update(bytes).digest(\"hex\");\n\n/** A project-relative path with forward slashes, as `framefields.json` keeps it. */\nconst projectPath = (cwd: string, path: string) =>\n\trelative(cwd, path).split(sep).join(posix.sep);\n\n/** Install the font for `role` into the project and record it in `framefields.json`. */\nexport async function installFont(\n\trole: string,\n\toptions: FontInstallOptions,\n): Promise<FontInstall> {\n\tconst catalog = options.catalog ?? FONTS;\n\tconst spec = catalog[role];\n\tif (!spec)\n\t\tthrow new Error(\n\t\t\t`Unknown font \"${role}\". Fonts framefields can install: ${Object.keys(catalog).join(\", \")}.`,\n\t\t);\n\tconst { cwd } = options;\n\tconst { config } = readConfig(cwd);\n\tconst configured = config.fonts?.[role];\n\tif (configured && existsSync(resolve(cwd, configured)))\n\t\treturn { role, path: configured, status: \"configured\" };\n\n\tconst target = resolve(cwd, options.dir ?? DEFAULT_FONTS_DIR, spec.file);\n\tconst path = projectPath(cwd, target);\n\tlet status: FontInstall[\"status\"] = \"present\";\n\tconst current = existsSync(target) ? readFileSync(target) : null;\n\tif (!current || sha256(current) !== spec.font.sha256) {\n\t\tif (current && !options.overwrite)\n\t\t\tthrow new Error(\n\t\t\t\t`${path} exists but isn't the pinned ${spec.file}. Pass --overwrite to replace it, or point \"fonts.${role}\" in framefields.json at it to keep using yours.`,\n\t\t\t);\n\t\toptions.onDownload?.(spec);\n\t\tconst get = options.fetch ?? (fetch as unknown as Fetch);\n\t\tconst [font, license] = await Promise.all([\n\t\t\tdownload(spec.font, get),\n\t\t\tdownload(spec.license, get),\n\t\t]);\n\t\tmkdirSync(dirname(target), { recursive: true });\n\t\twriteFileSync(target, font);\n\t\twriteFileSync(join(dirname(target), spec.license.file), license);\n\t\tstatus = \"installed\";\n\t}\n\twriteConfig(cwd, {\n\t\t...config,\n\t\tfonts: { ...config.fonts, [role]: path },\n\t});\n\treturn { role, path, status };\n}\n\nasync function download(file: PinnedFile, get: Fetch): Promise<Uint8Array> {\n\tlet res: Awaited<ReturnType<Fetch>>;\n\ttry {\n\t\tres = await get(file.url);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Couldn't download ${file.url} (${error instanceof Error ? error.message : String(error)}). Check the connection, or download it yourself and point framefields.json \"fonts\" at it.`,\n\t\t);\n\t}\n\tif (!res.ok) throw new Error(`${file.url}: ${res.status} ${res.statusText}`);\n\tconst bytes = new Uint8Array(await res.arrayBuffer());\n\tconst hash = sha256(bytes);\n\tif (bytes.length !== file.bytes || hash !== file.sha256)\n\t\tthrow new Error(\n\t\t\t`${file.url} isn't the pinned file (got ${bytes.length} bytes, sha256 ${hash}; expected ${file.bytes}, ${file.sha256}). Nothing was written.`,\n\t\t);\n\treturn bytes;\n}\n\n/** First line of the generated module: files without it are the user's and left alone. */\nexport const FONTS_MODULE_MARKER =\n\t\"// Generated by framefields from framefields.json.\";\n\nexport interface FontsModule {\n\t/** Relative to the project root. */\n\tpath: string;\n\t/** `skipped`: the file exists without the marker, so it's the user's. */\n\tstatus: \"written\" | \"unchanged\" | \"skipped\";\n\t/** The registration calls, one line each, for printing when `skipped`. */\n\tcalls: string[];\n}\n\n/**\n * Write `<components>/fonts.ts`, which registers every font in\n * `framefields.json`. Call it once before building or rendering:\n * `await registerFonts()`.\n */\nexport function writeFontsModule(\n\tcwd: string,\n\tcomponentsDir: string,\n\tcatalog: Record<string, FontSpec> = FONTS,\n): FontsModule {\n\tconst { config } = readConfig(cwd);\n\tconst target = join(componentsDir, \"fonts.ts\");\n\tconst path = projectPath(cwd, target);\n\tconst fonts = Object.entries(config.fonts ?? {})\n\t\t.filter(([role]) => catalog[role])\n\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t.map(([role, file]) => {\n\t\t\tconst from = relative(componentsDir, resolve(cwd, file as string))\n\t\t\t\t.split(sep)\n\t\t\t\t.join(posix.sep);\n\t\t\tconst url = from.startsWith(\".\") ? from : `./${from}`;\n\t\t\treturn { register: (catalog[role] as FontSpec).register, url };\n\t\t});\n\tconst call = (r: FontSpec[\"register\"], source: string) =>\n\t\t\"family\" in r\n\t\t\t? `register({ family: ${JSON.stringify(r.family)}, source: ${source} })`\n\t\t\t: `registerEmojiFont(${source})`;\n\tconst calls = fonts.map(\n\t\t(f) => `await FontManager.${call(f.register, `asset(\"${f.url}\")`)};`,\n\t);\n\tconst content = `${FONTS_MODULE_MARKER}\n// \\`framefields add\\` and \\`framefields fonts add\\` rewrite it when fonts\n// change; register any other fonts in your own code.\nimport { FontManager } from \"framefields\";\n\n/** A path next to this file as a URL: works in Node and in the browser preview. */\nconst asset = (path: string) => new URL(path, import.meta.url).href;\n\n/**\n * Register the fonts this project installed with framefields. Call it\n * once, before building any text or rendering:\n *\n * \\`\\`\\`ts\n * await registerFonts();\n * \\`\\`\\`\n */\nexport async function registerFonts(): Promise<void> {\n${fonts\n\t// Wrapped the way Biome / Prettier would at 80 columns.\n\t.map((f) =>\n\t\t\"family\" in f.register\n\t\t\t? `\\tawait FontManager.register({\\n\\t\\tfamily: ${JSON.stringify(f.register.family)},\\n\\t\\tsource: asset(\"${f.url}\"),\\n\\t});`\n\t\t\t: `\\tawait FontManager.registerEmojiFont(\\n\\t\\tasset(\"${f.url}\"),\\n\\t);`,\n\t)\n\t.join(\"\\n\")}\n}\n`;\n\tif (existsSync(target)) {\n\t\tconst current = readFileSync(target, \"utf8\");\n\t\tif (current === content) return { path, status: \"unchanged\", calls };\n\t\tif (!current.startsWith(FONTS_MODULE_MARKER))\n\t\t\treturn { path, status: \"skipped\", calls };\n\t}\n\tmkdirSync(componentsDir, { recursive: true });\n\twriteFileSync(target, content);\n\treturn { path, status: \"written\", calls };\n}\n\n/**\n * A hint when fonts land in a Git repo whose `.gitattributes` doesn't send\n * them to LFS (a 10 MB binary bloats every clone), or null.\n */\nexport function lfsHint(cwd: string, fontPath: string): string | null {\n\tif (!existsSync(join(cwd, \".git\"))) return null;\n\tconst attrs = join(cwd, \".gitattributes\");\n\tconst text = existsSync(attrs) ? readFileSync(attrs, \"utf8\") : \"\";\n\tif (/\\.ttf\\b[^\\n]*filter=lfs/.test(text)) return null;\n\tconst dir = posix.dirname(fontPath);\n\treturn `Fonts are large binaries: track them with Git LFS, e.g. \\`git lfs track \"${dir}/**/*.ttf\"\\`.`;\n}\n","/**\n * `framefields add`: copy components' source into a project, the way a\n * shadcn-style registry does. The code becomes the project's own; it\n * imports only `framefields` and `framefields/components` (the toolkit),\n * plus any component it builds on, which is installed alongside it.\n *\n * Where they go is remembered in `framefields.json` at the project root.\n * Components that draw with fonts beyond the theme's (emoji) get them\n * installed too, plus a generated `fonts.ts` that registers them.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { readConfig, writeConfig } from \"./config.js\";\nimport {\n\ttype Fetch,\n\ttype FontInstall,\n\ttype FontSpec,\n\ttype FontsModule,\n\tinstallFont,\n\twriteFontsModule,\n} from \"./fonts.js\";\nimport type { Registry, RegistryItem } from \"./registry.js\";\n\nexport { CONFIG_FILE, type ProjectConfig, readConfig } from \"./config.js\";\n\nexport interface AddOptions {\n\tcwd: string;\n\tregistry: Registry;\n\t/** Components directory; saved to `framefields.json` if there is none yet. */\n\tdir?: string;\n\t/** Replace files that differ from the registry's. */\n\toverwrite?: boolean;\n\t/** Install the fonts components ask for (default true). */\n\tfonts?: boolean;\n\t/** Folder for downloaded fonts. Default `assets/fonts`. */\n\tfontsDir?: string;\n\t/** For tests; default the global `fetch`. */\n\tfetch?: Fetch;\n\t/** For tests; default the built-in font catalog. */\n\tfontCatalog?: Record<string, FontSpec>;\n\t/** Called before a font download starts. */\n\tonDownload?: (spec: FontSpec) => void;\n}\n\nexport interface AddReport {\n\tdir: string;\n\t/** Components in install order (dependencies first). */\n\tcomponents: RegistryItem[];\n\twritten: string[];\n\tunchanged: string[];\n\t/** Files left alone because they differ and `overwrite` is off. */\n\tskipped: string[];\n\tconfigWritten: boolean;\n\t/** Fonts the components asked for, and what happened to each. */\n\tfonts: Array<FontInstall & { why: string; by: string }>;\n\t/** Fonts asked for but not installed (`fonts: false`), with why. */\n\tfontsSkipped: Array<{ role: string; why: string; by: string }>;\n\t/** The generated `fonts.ts`, when any font is installed. */\n\tfontsModule?: FontsModule;\n}\n\n/** Resolve `names` (and what they import) and write their files. */\nexport async function add(\n\tnames: string[],\n\toptions: AddOptions,\n): Promise<AddReport> {\n\tconst { cwd, registry } = options;\n\tconst index = await registry.index();\n\tconst known = new Set(index.map((e) => e.name));\n\tfor (const n of names)\n\t\tif (!known.has(n))\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown component \"${n}\". Run \\`framefields list\\` to see them all.`,\n\t\t\t);\n\n\t// Depth-first, dependencies before dependants.\n\tconst order: RegistryItem[] = [];\n\tconst seen = new Set<string>();\n\tconst visit = async (name: string) => {\n\t\tif (seen.has(name)) return;\n\t\tseen.add(name);\n\t\tconst item = await registry.item(name);\n\t\tfor (const d of item.registryDependencies) await visit(d);\n\t\torder.push(item);\n\t};\n\tfor (const n of names) await visit(n);\n\n\tconst { config, saved } = readConfig(cwd);\n\tconst rel = options.dir ?? config.components;\n\tconst dir = resolve(cwd, rel);\n\tconst report: AddReport = {\n\t\tdir,\n\t\tcomponents: order,\n\t\twritten: [],\n\t\tunchanged: [],\n\t\tskipped: [],\n\t\tconfigWritten: false,\n\t\tfonts: [],\n\t\tfontsSkipped: [],\n\t};\n\tfor (const item of order) {\n\t\tfor (const file of item.files) {\n\t\t\tconst target = join(dir, file.path);\n\t\t\tconst shown = relative(cwd, target);\n\t\t\tif (existsSync(target)) {\n\t\t\t\tif (readFileSync(target, \"utf8\") === file.content) {\n\t\t\t\t\treport.unchanged.push(shown);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!options.overwrite) {\n\t\t\t\t\treport.skipped.push(shown);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmkdirSync(dirname(target), { recursive: true });\n\t\t\twriteFileSync(target, file.content);\n\t\t\treport.written.push(shown);\n\t\t}\n\t}\n\tif (!saved) {\n\t\twriteConfig(cwd, { components: relative(cwd, dir) || \".\" });\n\t\treport.configWritten = true;\n\t}\n\n\t// One install per font, credited to the first component that asks.\n\tconst needs = new Map<string, { why: string; by: string }>();\n\tfor (const item of order)\n\t\tfor (const f of item.fonts ?? [])\n\t\t\tif (!needs.has(f.font)) needs.set(f.font, { why: f.why, by: item.name });\n\tfor (const [role, need] of needs) {\n\t\tif (options.fonts === false) {\n\t\t\treport.fontsSkipped.push({ role, ...need });\n\t\t\tcontinue;\n\t\t}\n\t\tconst done = await installFont(role, {\n\t\t\tcwd,\n\t\t\tdir: options.fontsDir,\n\t\t\toverwrite: options.overwrite,\n\t\t\tfetch: options.fetch,\n\t\t\tcatalog: options.fontCatalog,\n\t\t\tonDownload: options.onDownload,\n\t\t});\n\t\treport.fonts.push({ ...done, ...need });\n\t}\n\tif (report.fonts.length > 0 || readConfig(cwd).config.fonts)\n\t\treport.fontsModule = writeFontsModule(cwd, dir, options.fontCatalog);\n\treturn report;\n}\n","/**\n * The files `framefields init` writes: the project layout the framefields\n * setup skill describes. `film.ts` only builds; `render.ts` renders frames,\n * a grid, the live preview or the video; `theme.ts` holds the numbers.\n */\n\n/**\n * Packages with install scripts. framefields needs exactly one (skia-canvas\n * downloads its native binary); the others work without theirs.\n */\nconst ALLOWED_SCRIPTS = [\"skia-canvas\"];\nconst DENIED_SCRIPTS = [\n\t\"sharp\",\n\t\"webgpu\",\n\t\"onnxruntime-node\",\n\t\"node-av\",\n\t\"esbuild\",\n\t\"protobufjs\",\n];\n\n/** Dev tools the scripts use, at versions the scaffold is tested with. */\nexport const DEV_DEPENDENCIES: Record<string, string> = {\n\t\"@types/node\": \"^24.1.0\",\n\ttsx: \"^4.20.3\",\n\ttypescript: \"^5.8.3\",\n};\n\nexport const SCRIPTS: Record<string, string> = {\n\ttypecheck: \"tsc --noEmit -p .\",\n\tframes: \"tsx src/render.ts frames\",\n\tgrid: \"tsx src/render.ts grid\",\n\tpreview: \"tsx src/render.ts preview\",\n\trender: \"tsx src/render.ts\",\n};\n\n/**\n * The `package.json` fields a framefields project needs. npm reads\n * `allowScripts`, pnpm its `pnpm` block, bun `trustedDependencies`.\n */\nexport function packageFields(o: {\n\tframefieldsVersion: string;\n\tpackageManager?: string;\n}) {\n\treturn {\n\t\ttype: \"module\",\n\t\t...(o.packageManager && { packageManager: o.packageManager }),\n\t\tscripts: SCRIPTS,\n\t\tdependencies: { framefields: `^${o.framefieldsVersion}` },\n\t\tdevDependencies: DEV_DEPENDENCIES,\n\t\tallowScripts: Object.fromEntries([\n\t\t\t...ALLOWED_SCRIPTS.map((p) => [p, true]),\n\t\t\t...DENIED_SCRIPTS.map((p) => [p, false]),\n\t\t]),\n\t\tpnpm: {\n\t\t\tonlyBuiltDependencies: ALLOWED_SCRIPTS,\n\t\t\tignoredBuiltDependencies: DENIED_SCRIPTS,\n\t\t},\n\t\ttrustedDependencies: ALLOWED_SCRIPTS,\n\t};\n}\n\nexport const TSCONFIG = `${JSON.stringify(\n\t{\n\t\tcompilerOptions: {\n\t\t\tmodule: \"NodeNext\",\n\t\t\tmoduleResolution: \"NodeNext\",\n\t\t\ttarget: \"ES2022\",\n\t\t\tstrict: true,\n\t\t\tskipLibCheck: true,\n\t\t\tnoEmit: true,\n\t\t\ttypes: [\"node\"],\n\t\t},\n\t\tinclude: [\"src/**/*\"],\n\t},\n\tnull,\n\t\"\\t\",\n)}\\n`;\n\n/** Lines `init` makes sure `.gitignore` has. */\nexport const GITIGNORE = [\n\t\"node_modules/\",\n\t\"output/\",\n\t\"scratch/\",\n\t\".DS_Store\",\n\t\".env\",\n];\n\n/** Where the AI gateway's keys come from. */\nexport const AI_DASHBOARD = \"https://framefields.dev/dashboard\";\n\n/** Optional settings; `render.ts` loads `.env` when there is one. Commit this, not `.env`. */\nexport const ENV_EXAMPLE = `# Copy to .env (git-ignored). Everything here is optional.\n\n# framefields AI gateway: generate images, video, music, voice and 3D from code.\n# Create a key at ${AI_DASHBOARD}\nFRAMEFIELDS_API_KEY=\n`;\n\n/** Media, LUTs and fonts go to Git LFS; renders stay out of Git. */\nexport const GITATTRIBUTES = [\n\t\"assets/**/*.mp4 filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/**/*.mov filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/**/*.webm filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/**/*.mp3 filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/**/*.wav filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/**/*.cube filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/**/*.lottie filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/fonts/**/*.ttf filter=lfs diff=lfs merge=lfs -text\",\n\t\"assets/fonts/**/*.otf filter=lfs diff=lfs merge=lfs -text\",\n];\n\nexport const THEME_TS = `import { registerFonts as registerInstalledFonts } from \"./components/fonts.js\";\n\nexport const W = 1920;\nexport const H = 1080;\nexport const FPS = 30;\nexport const INK = \"#0E0D0C\";\nexport const PAPER = \"#EEE9E0\";\n/** Installed by \\`framefields init\\` (assets/fonts), registered below. */\nexport const SANS = \"Inter\";\nexport const MONO = \"JetBrains Mono\";\n\n/**\n * Register the film's fonts. Fonts framefields installed\n * (\\`npx framefields fonts add <role>\\`) come from the generated\n * components/fonts.ts; register any others here with \\`FontManager.register\\`.\n */\nexport async function registerFonts(): Promise<void> {\n\tawait registerInstalledFonts();\n}\n`;\n\nexport const FILM_TS = `import { Composition, Layer, LayerAnimation } from \"framefields\";\nimport { FPS, H, INK, PAPER, registerFonts, SANS, W } from \"./theme.js\";\n\nconst DURATION = 3 * FPS; // frames\n\n/** Builds the film. Only builds: no rendering or writes, so tests, the preview and renders share it. */\nexport async function buildFilm(): Promise<Composition> {\n\t// Fonts must be registered before any text layer is built.\n\tawait registerFonts();\n\n\tconst film = new Composition({\n\t\twidth: W,\n\t\theight: H,\n\t\tfps: FPS,\n\t\tdurationMs: (DURATION / FPS) * 1000,\n\t\tbackgroundColor: INK,\n\t});\n\n\tfilm.add(\n\t\tLayer.text(\"Hello, framefields\", {\n\t\t\tid: \"title\",\n\t\t\tposition: \"absolute\",\n\t\t\tx: 0,\n\t\t\ty: H / 2 - 60,\n\t\t\twidth: W,\n\t\t\theight: 120,\n\t\t\tfontFamily: SANS,\n\t\t\tfontSize: 96,\n\t\t\tfontWeight: 700,\n\t\t\tfill: PAPER,\n\t\t\talign: \"center\",\n\t\t}).animate(\n\t\t\tLayerAnimation.create()\n\t\t\t\t.fadeIn(0, 20, \"power2.out\")\n\t\t\t\t.fromTo(\"y\", H / 2 - 20, H / 2 - 60, {\n\t\t\t\t\tstart: 0,\n\t\t\t\t\tend: 30,\n\t\t\t\t\tease: \"expo.out\",\n\t\t\t\t}),\n\t\t),\n\t);\n\n\treturn film;\n}\n`;\n\nexport const RENDER_TS = `import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { HeadlessMediaRenderer, startPreview } from \"framefields\";\nimport { buildFilm } from \"./film.js\";\n\n// Optional settings such as FRAMEFIELDS_API_KEY (see .env.example).\nconst ENV = path.resolve(import.meta.dirname, \"../.env\");\nif (existsSync(ENV)) process.loadEnvFile(ENV);\n\nconst OUT = path.resolve(import.meta.dirname, \"../output\");\n// \\`npm run frames -- 0 30\\` needs the \\`--\\`; pnpm passes it through: drop it.\nconst [mode = \"video\", ...args] = process.argv\n\t.slice(2)\n\t.filter((a) => a !== \"--\");\n\nif (mode === \"preview\") {\n\t// The page runs film.ts itself and renders it with WebGPU in the browser.\n\tconst session = await startPreview({\n\t\tentry: new URL(\"./film.ts\", import.meta.url),\n\t\texport: \"buildFilm\",\n\t});\n\tconsole.log(\\`Preview at \\${session.url}\\`);\n\tawait session.closed; // until its tab closes or the next preview replaces it\n\tprocess.exit(0);\n}\n\nconst film = await buildFilm();\nawait fs.mkdir(OUT, { recursive: true });\n\nif (mode === \"frames\") {\n\tconst renderer = new HeadlessMediaRenderer();\n\tfor (const frame of (args.length ? args : [\"0\"]).map(Number)) {\n\t\tconst png = await film.renderFrame({ frame, renderer });\n\t\tconst file = path.join(OUT, \\`f\\${String(frame).padStart(4, \"0\")}.png\\`);\n\t\tawait fs.writeFile(file, png);\n\t\tconsole.log(\\`Wrote \\${path.relative(process.cwd(), file)}\\`);\n\t}\n} else if (mode === \"grid\") {\n\tconst png = await film.renderFrameGrid({\n\t\tframes: args.length ? args.map(Number) : [0, 10, 20, 30, 45, 60, 75, 89],\n\t\tcolumns: 4,\n\t\tcellWidth: 480,\n\t\tshowLabels: true,\n\t});\n\tawait fs.writeFile(path.join(OUT, \"grid.png\"), png);\n\tconsole.log(\"Wrote output/grid.png\");\n} else {\n\tconst result = await film.renderVideo({\n\t\toutputPath: path.join(OUT, \"output.mp4\"),\n\t\tquality: \"high\",\n\t});\n\tawait result.cleanup?.();\n\tconsole.log(\\`Exported \\${result.filePath}\\`);\n}\n\n// Native GPU and encoder threads keep Node alive; always exit explicitly.\nprocess.exit(0);\n`;\n\nexport function readme(name: string, run: (script: string) => string): string {\n\treturn `# ${name}\n\nA film built with [framefields](https://www.npmjs.com/package/framefields).\n\n\\`\\`\\`bash\n${run(\"typecheck\")}\n${run(\"frames\")} -- 0 30 60 # PNGs in output/\n${run(\"grid\")} # a contact sheet of the motion\n${run(\"preview\")} # play it in the browser\n${run(\"render\")} # output/output.mp4\n\\`\\`\\`\n\n- \\`src/film.ts\\` builds the composition, \\`src/theme.ts\\` holds sizes, colors and fonts,\n \\`src/render.ts\\` renders it.\n- \\`npx framefields list\\` shows ready-made components; \\`npx framefields add <name>\\` copies\n one into \\`src/components/\\`.\n- Optional: the AI gateway generates images, video, music, voice and 3D from code. Copy\n \\`.env.example\\` to \\`.env\\` and set \\`FRAMEFIELDS_API_KEY\\` (keys at ${AI_DASHBOARD}).\n- Footage, audio and fonts live in \\`assets/\\` and are tracked with Git LFS\n (\\`git lfs install\\` once per machine, \\`git lfs pull\\` after cloning).\n`;\n}\n","/**\n * `framefields init [dir]`: a new framefields project, or framefields added\n * to an existing one. Writes the layout the setup skill describes\n * (`package.json` with the install-script approvals framefields needs,\n * `tsconfig.json`, `src/theme.ts` / `film.ts` / `render.ts`, `assets/`,\n * LFS `.gitattributes`, `.gitignore`), installs the themes' fonts and keeps\n * them registered in `src/components/fonts.ts`.\n *\n * It never overwrites: files that exist are left alone, and `package.json`,\n * `.gitignore` and `.gitattributes` gain only what they're missing.\n */\nimport { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { readConfig, writeConfig } from \"./config.js\";\nimport {\n\ttype Fetch,\n\ttype FontInstall,\n\ttype FontSpec,\n\ttype FontsModule,\n\tinstallFont,\n\twriteFontsModule,\n} from \"./fonts.js\";\nimport {\n\tENV_EXAMPLE,\n\tFILM_TS,\n\tGITATTRIBUTES,\n\tGITIGNORE,\n\tpackageFields,\n\tRENDER_TS,\n\treadme,\n\tTHEME_TS,\n\tTSCONFIG,\n} from \"./templates.js\";\n\nexport const PACKAGE_MANAGERS = [\"npm\", \"pnpm\", \"yarn\", \"bun\"] as const;\nexport type PackageManager = (typeof PACKAGE_MANAGERS)[number];\n\n/** Runs a command; resolves with its exit code (127 when it can't start). */\nexport type Runner = (\n\tcommand: string,\n\targs: string[],\n\toptions: { cwd: string; quiet?: boolean },\n) => Promise<number>;\n\nexport interface InitOptions {\n\t/** Where the command runs. */\n\tcwd: string;\n\t/** The project folder, relative to `cwd`. Default `.`. */\n\tdir?: string;\n\t/** Package name. Default: the folder's name, made npm-safe. */\n\tname?: string;\n\t/** Default: the one running the command (`npm_config_user_agent`), else npm. */\n\tpackageManager?: PackageManager;\n\t/** `npm_config_user_agent`, for detecting the package manager and its version. */\n\tuserAgent?: string;\n\t/** Install the themes' fonts, Inter and JetBrains Mono (default true). */\n\tfonts?: boolean;\n\t/** Also install the color emoji font. */\n\temoji?: boolean;\n\t/** `git init` when the folder isn't in a repository yet (default true). */\n\tgit?: boolean;\n\t/** Run the package manager's install afterwards (default false). */\n\tinstall?: boolean;\n\t/** framefields version for `dependencies`. Default: this package's. */\n\tframefieldsVersion?: string;\n\t/** For tests. */\n\trun?: Runner;\n\tfetch?: Fetch;\n\tfontCatalog?: Record<string, FontSpec>;\n\tonDownload?: (spec: FontSpec) => void;\n}\n\nexport interface InitReport {\n\t/** The project folder (absolute). */\n\troot: string;\n\tname: string;\n\tpackageManager: PackageManager;\n\t/** Paths relative to `root`. */\n\twritten: string[];\n\t/** Existing files that gained missing entries. */\n\tmerged: string[];\n\t/** Existing files left as they were. */\n\tunchanged: string[];\n\tfonts: FontInstall[];\n\tfontsModule: FontsModule;\n\tgit: \"initialized\" | \"existing\" | \"skipped\" | \"unavailable\";\n\t/** Whether `git lfs` is available (null when Git was skipped). */\n\tlfs: boolean | null;\n\tinstalled: boolean;\n\t/** `npm run frames` / `pnpm frames` …, for next-step messages. */\n\trunScript(script: string): string;\n}\n\n/** The package manager in `npm_config_user_agent` (`pnpm/10.13.1 npm/? node/v22 …`). */\nexport function detectPackageManager(\n\tuserAgent: string | undefined,\n): { name: PackageManager; version?: string } | null {\n\tconst m = userAgent?.match(/^(npm|pnpm|yarn|bun)\\/(\\d[\\w.+-]*)/);\n\tif (!m) return null;\n\treturn { name: m[1] as PackageManager, version: m[2] };\n}\n\nconst runScriptFor = (pm: PackageManager) => (script: string) =>\n\tpm === \"npm\" || pm === \"bun\" ? `${pm} run ${script}` : `${pm} ${script}`;\n\n/** `My Film!` → `my-film`. */\nexport function packageName(folder: string): string {\n\tconst name = folder\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9._~-]+/g, \"-\")\n\t\t.replace(/^[-._]+|[-._]+$/g, \"\");\n\treturn name || \"framefields-film\";\n}\n\nexport async function init(options: InitOptions): Promise<InitReport> {\n\tconst root = resolve(options.cwd, options.dir ?? \".\");\n\tmkdirSync(root, { recursive: true });\n\tconst detected = detectPackageManager(options.userAgent);\n\tconst pm = options.packageManager ?? detected?.name ?? \"npm\";\n\tconst pmVersion = detected?.name === pm ? detected.version : undefined;\n\tconst run = options.run ?? spawnRunner;\n\tconst report: InitReport = {\n\t\troot,\n\t\tname: \"\",\n\t\tpackageManager: pm,\n\t\twritten: [],\n\t\tmerged: [],\n\t\tunchanged: [],\n\t\tfonts: [],\n\t\tfontsModule: { path: \"\", status: \"unchanged\", calls: [] },\n\t\tgit: \"skipped\",\n\t\tlfs: null,\n\t\tinstalled: false,\n\t\trunScript: runScriptFor(pm),\n\t};\n\tconst fields = packageFields({\n\t\tframefieldsVersion: options.framefieldsVersion ?? ownVersion(),\n\t\t...(pmVersion && { packageManager: `${pm}@${pmVersion}` }),\n\t});\n\n\t// package.json: written whole, or merged without replacing anything.\n\tconst pkgPath = join(root, \"package.json\");\n\tif (existsSync(pkgPath)) {\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t\tif (pkg.type === \"commonjs\")\n\t\t\tthrow new Error(\n\t\t\t\t'package.json has \"type\": \"commonjs\". framefields projects are ES modules: set \"type\": \"module\" (and convert any require() files) first.',\n\t\t\t);\n\t\treport.name =\n\t\t\ttypeof pkg.name === \"string\" ? pkg.name : packageName(basename(root));\n\t\tconst merged = mergePackage(pkg, fields);\n\t\trecord(report, \"package.json\", writeIfChanged(pkgPath, merged, pkg));\n\t} else {\n\t\treport.name = options.name ?? packageName(basename(root));\n\t\twriteJson(pkgPath, {\n\t\t\tname: report.name,\n\t\t\tversion: \"0.0.0\",\n\t\t\tprivate: true,\n\t\t\t...fields,\n\t\t});\n\t\treport.written.push(\"package.json\");\n\t}\n\n\tconst files: Array<[string, string]> = [\n\t\t[\"tsconfig.json\", TSCONFIG],\n\t\t[\"src/theme.ts\", THEME_TS],\n\t\t[\"src/film.ts\", FILM_TS],\n\t\t[\"src/render.ts\", RENDER_TS],\n\t\t[\"assets/footage/.gitkeep\", \"\"],\n\t\t[\".env.example\", ENV_EXAMPLE],\n\t\t[\"README.md\", readme(report.name, report.runScript)],\n\t];\n\tfor (const [path, content] of files) {\n\t\tconst target = join(root, path);\n\t\tif (existsSync(target)) report.unchanged.push(path);\n\t\telse {\n\t\t\tmkdirSync(dirname(target), { recursive: true });\n\t\t\twriteFileSync(target, content);\n\t\t\treport.written.push(path);\n\t\t}\n\t}\n\tfor (const [path, lines] of [\n\t\t[\".gitignore\", GITIGNORE],\n\t\t[\".gitattributes\", GITATTRIBUTES],\n\t] as const)\n\t\trecord(report, path, appendLines(join(root, path), lines));\n\n\t// framefields.json, then fonts (recorded there) and their module.\n\tconst { config, saved } = readConfig(root);\n\tif (!saved) {\n\t\twriteConfig(root, config);\n\t\treport.written.push(\"framefields.json\");\n\t}\n\tconst roles = [\n\t\t...(options.fonts === false ? [] : [\"sans\", \"mono\"]),\n\t\t...(options.emoji ? [\"emoji\"] : []),\n\t];\n\tfor (const role of roles)\n\t\treport.fonts.push(\n\t\t\tawait installFont(role, {\n\t\t\t\tcwd: root,\n\t\t\t\tfetch: options.fetch,\n\t\t\t\tcatalog: options.fontCatalog,\n\t\t\t\tonDownload: options.onDownload,\n\t\t\t}),\n\t\t);\n\t// theme.ts imports it, so it's written even with no fonts installed.\n\treport.fontsModule = writeFontsModule(\n\t\troot,\n\t\tresolve(root, readConfig(root).config.components),\n\t\toptions.fontCatalog,\n\t);\n\n\tif (options.git !== false) {\n\t\tconst inside = await run(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n\t\t\tcwd: root,\n\t\t\tquiet: true,\n\t\t});\n\t\tif (inside === 0) report.git = \"existing\";\n\t\telse if (\n\t\t\t(await run(\"git\", [\"init\", \"-q\"], { cwd: root, quiet: true })) === 0\n\t\t)\n\t\t\treport.git = \"initialized\";\n\t\telse report.git = \"unavailable\";\n\t\tif (report.git !== \"unavailable\")\n\t\t\treport.lfs =\n\t\t\t\t(await run(\"git\", [\"lfs\", \"version\"], { cwd: root, quiet: true })) ===\n\t\t\t\t0;\n\t}\n\n\tif (options.install) {\n\t\tconst code = await run(pm, [\"install\"], { cwd: root });\n\t\tif (code !== 0)\n\t\t\tthrow new Error(\n\t\t\t\t`\\`${pm} install\\` failed (exit ${code}). The project files are written; fix the error and run it again.`,\n\t\t\t);\n\t\treport.installed = true;\n\t}\n\treturn report;\n}\n\n/** Add every field of `fields` the package lacks; existing values win. */\nfunction mergePackage(\n\tpkg: Record<string, unknown>,\n\tfields: ReturnType<typeof packageFields>,\n): Record<string, unknown> {\n\tconst out: Record<string, unknown> = { ...pkg };\n\tconst obj = (v: unknown) =>\n\t\tv && typeof v === \"object\" && !Array.isArray(v)\n\t\t\t? (v as Record<string, unknown>)\n\t\t\t: {};\n\tconst union = (a: unknown, b: readonly string[]) => [\n\t\t...new Set([...(Array.isArray(a) ? (a as string[]) : []), ...b]),\n\t];\n\tout.type ??= fields.type;\n\tif (fields.packageManager) out.packageManager ??= fields.packageManager;\n\tfor (const key of [\n\t\t\"scripts\",\n\t\t\"dependencies\",\n\t\t\"devDependencies\",\n\t\t\"allowScripts\",\n\t] as const) {\n\t\tconst theirs = obj(pkg[key]);\n\t\t// A dependency listed in either block counts as present.\n\t\tconst present =\n\t\t\tkey === \"dependencies\" || key === \"devDependencies\"\n\t\t\t\t? { ...obj(pkg.dependencies), ...obj(pkg.devDependencies) }\n\t\t\t\t: theirs;\n\t\tconst missing = Object.entries(fields[key]).filter(\n\t\t\t([k]) => !(k in present),\n\t\t);\n\t\tif (missing.length > 0)\n\t\t\tout[key] = { ...theirs, ...Object.fromEntries(missing) };\n\t}\n\tconst pnpm = obj(pkg.pnpm);\n\tout.pnpm = {\n\t\t...pnpm,\n\t\tonlyBuiltDependencies: union(\n\t\t\tpnpm.onlyBuiltDependencies,\n\t\t\tfields.pnpm.onlyBuiltDependencies,\n\t\t),\n\t\tignoredBuiltDependencies: union(\n\t\t\tpnpm.ignoredBuiltDependencies,\n\t\t\tfields.pnpm.ignoredBuiltDependencies,\n\t\t),\n\t};\n\tout.trustedDependencies = union(\n\t\tpkg.trustedDependencies,\n\t\tfields.trustedDependencies,\n\t);\n\treturn out;\n}\n\nfunction writeJson(path: string, value: unknown) {\n\twriteFileSync(path, `${JSON.stringify(value, null, \"\\t\")}\\n`);\n}\n\nfunction writeIfChanged(\n\tpath: string,\n\tnext: Record<string, unknown>,\n\tprev: Record<string, unknown>,\n): boolean {\n\tif (JSON.stringify(next) === JSON.stringify(prev)) return false;\n\twriteJson(path, next);\n\treturn true;\n}\n\n/** Create `path` with `lines` (\"written\"), or append the ones it lacks (true if any). */\nfunction appendLines(\n\tpath: string,\n\tlines: readonly string[],\n): \"written\" | boolean {\n\tif (!existsSync(path)) {\n\t\twriteFileSync(path, `${lines.join(\"\\n\")}\\n`);\n\t\treturn \"written\";\n\t}\n\tconst text = readFileSync(path, \"utf8\");\n\tconst have = new Set(text.split(/\\r?\\n/).map((l) => l.trim()));\n\tconst missing = lines.filter((l) => !have.has(l));\n\tif (missing.length === 0) return false;\n\twriteFileSync(\n\t\tpath,\n\t\t`${text}${text.endsWith(\"\\n\") || text === \"\" ? \"\" : \"\\n\"}${missing.join(\"\\n\")}\\n`,\n\t);\n\treturn true;\n}\n\n/** File it under written (new), merged (changed) or unchanged. */\nfunction record(report: InitReport, path: string, result: \"written\" | boolean) {\n\tif (result === \"written\") report.written.push(path);\n\telse if (result) report.merged.push(path);\n\telse report.unchanged.push(path);\n}\n\n/** This package's version, from the nearest `package.json` named framefields. */\nfunction ownVersion(): string {\n\tlet dir = dirname(fileURLToPath(import.meta.url));\n\tfor (;;) {\n\t\tconst file = join(dir, \"package.json\");\n\t\tif (existsSync(file)) {\n\t\t\tconst pkg = JSON.parse(readFileSync(file, \"utf8\")) as {\n\t\t\t\tname?: string;\n\t\t\t\tversion?: string;\n\t\t\t};\n\t\t\tif (pkg.name === \"framefields\" && pkg.version) return pkg.version;\n\t\t}\n\t\tconst up = dirname(dir);\n\t\tif (up === dir) throw new Error(\"Can't find framefields' own package.json\");\n\t\tdir = up;\n\t}\n}\n\nconst spawnRunner: Runner = (command, args, { cwd, quiet }) =>\n\tnew Promise((done) => {\n\t\tconst child = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tstdio: quiet ? \"ignore\" : \"inherit\",\n\t\t\t// Windows needs a shell to find npm.cmd / pnpm.cmd.\n\t\t\tshell: process.platform === \"win32\",\n\t\t});\n\t\tchild.on(\"error\", () => done(127));\n\t\tchild.on(\"close\", (code) => done(code ?? 1));\n\t});\n\n/** Where the project is, as the user would `cd` to it. */\nexport function shownPath(cwd: string, root: string): string {\n\treturn relative(cwd, root) || \".\";\n}\n","/**\n * Reading a component registry: the one shipped in this package's dist, a\n * local folder, or one served over http(s). A registry is `index.json` (the\n * entries) plus `<name>.json` per component (entry, meta and files).\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface RegistryEntry {\n\t/** What `framefields add` takes: `logo-reveal`. */\n\tname: string;\n\t/** The factory the component exports: `LogoReveal`. */\n\ttitle: string;\n\tsummary: string;\n\ttags: readonly string[];\n\texample: string;\n\t/** Other components it imports, installed with it. */\n\tregistryDependencies: string[];\n}\n\nexport interface RegistryItem extends RegistryEntry {\n\tparts: readonly string[];\n\tcues: readonly string[];\n\t/** Fonts to install with it, by role (see `cli/fonts.ts`). */\n\tfonts?: ReadonlyArray<{ font: string; why: string }>;\n\t/** Paths relative to the components directory. */\n\tfiles: Array<{ path: string; content: string }>;\n}\n\nexport interface Registry {\n\t/** Where it was read from, for messages. */\n\tsource: string;\n\tindex(): Promise<RegistryEntry[]>;\n\titem(name: string): Promise<RegistryItem>;\n}\n\n/** The registry shipped next to this module in dist (`dist/registry`). */\nexport function bundledRegistryPath(): string {\n\treturn fileURLToPath(new URL(\"./registry/\", import.meta.url));\n}\n\n/** `source`: a folder or an http(s) URL. Default: the bundled registry. */\nexport function openRegistry(source?: string, cwd = process.cwd()): Registry {\n\tconst from =\n\t\tsource ?? process.env.FRAMEFIELDS_REGISTRY ?? bundledRegistryPath();\n\tif (/^https?:\\/\\//.test(from)) {\n\t\tconst base = from.endsWith(\"/\") ? from : `${from}/`;\n\t\tconst get = async <T>(file: string): Promise<T> => {\n\t\t\tconst res = await fetch(new URL(file, base));\n\t\t\tif (!res.ok)\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${new URL(file, base)}: ${res.status} ${res.statusText}`,\n\t\t\t\t);\n\t\t\treturn (await res.json()) as T;\n\t\t};\n\t\treturn {\n\t\t\tsource: base,\n\t\t\tindex: () => get(\"index.json\"),\n\t\t\titem: (name) => get(`${name}.json`),\n\t\t};\n\t}\n\tconst dir = resolve(cwd, from);\n\tconst read = <T>(file: string): T => {\n\t\tconst path = join(dir, file);\n\t\tif (!existsSync(path)) throw new Error(`No ${file} in registry ${dir}`);\n\t\treturn JSON.parse(readFileSync(path, \"utf8\")) as T;\n\t};\n\treturn {\n\t\tsource: dir,\n\t\tindex: async () => read(\"index.json\"),\n\t\titem: async (name) => read(`${name}.json`),\n\t};\n}\n","#!/usr/bin/env node\n/**\n * The `framefields` command.\n *\n * npx framefields init [dir] start a project (or add framefields to one)\n * npx framefields add <name...> copy components into this project\n * npx framefields list the components you can add\n * npx framefields fonts add <role...> install fonts (emoji)\n * npx framefields fonts list the fonts you can install\n */\nimport { readFileSync } from \"node:fs\";\nimport { relative, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { type AddReport, add } from \"./cli/add.js\";\nimport { readConfig } from \"./cli/config.js\";\nimport {\n\tFONTS,\n\ttype FontSpec,\n\tinstallFont,\n\tlfsHint,\n\twriteFontsModule,\n} from \"./cli/fonts.js\";\nimport {\n\ttype InitReport,\n\tinit,\n\tPACKAGE_MANAGERS,\n\ttype PackageManager,\n\tshownPath,\n} from \"./cli/init.js\";\nimport { openRegistry } from \"./cli/registry.js\";\nimport { AI_DASHBOARD } from \"./cli/templates.js\";\n\nconst HELP = `Usage: framefields <command> [options]\n\nCommands:\n init [dir] Start a framefields project in dir (default: here), or add\n framefields to the project there: package.json, tsconfig,\n src/theme.ts, film.ts, render.ts, assets/, .gitignore,\n LFS .gitattributes, and the themes' fonts. Never\n overwrites; existing files only gain what they lack.\n add <name...> Copy components' source into this project (and the\n components they build on). The code is yours to edit.\n list List the components you can add.\n fonts add <role...>\n Install fonts (pinned, hash-checked, with their license)\n and register them in the generated <components>/fonts.ts.\n fonts list List the fonts you can install.\n\nOptions for init:\n --name <name> Package name (default: the folder's name).\n --pm <manager> npm, pnpm, yarn or bun (default: the one running this).\n --install Install dependencies afterwards.\n --emoji Also install the color emoji font.\n --no-fonts Skip Inter and JetBrains Mono.\n --no-git Don't run \\`git init\\`.\n\nOptions for add:\n --all Add every component.\n --dir <path> Components directory (default: from framefields.json,\n else src/components or components). Saved the first time.\n --overwrite Replace files you have changed.\n --no-fonts Don't install the fonts components ask for (emoji).\n\nOptions for add and fonts add:\n --fonts-dir <path> Where downloaded fonts go (default assets/fonts).\n\nOptions for add and list:\n --registry <src> A registry folder or http(s) URL instead of the one\n shipped with this version of framefields.\n -h, --help Show this help.\n\nExamples:\n npx framefields init my-film --install\n npx framefields add mouse-pointer focus-zoom\n npx framefields fonts add emoji\n`;\n\nasync function main(argv: string[]): Promise<number> {\n\tconst { values, positionals } = parseArgs({\n\t\targs: argv,\n\t\tallowPositionals: true,\n\t\toptions: {\n\t\t\tall: { type: \"boolean\" },\n\t\t\tdir: { type: \"string\" },\n\t\t\toverwrite: { type: \"boolean\" },\n\t\t\t\"no-fonts\": { type: \"boolean\" },\n\t\t\t\"fonts-dir\": { type: \"string\" },\n\t\t\tname: { type: \"string\" },\n\t\t\tpm: { type: \"string\" },\n\t\t\tinstall: { type: \"boolean\" },\n\t\t\temoji: { type: \"boolean\" },\n\t\t\t\"no-git\": { type: \"boolean\" },\n\t\t\tregistry: { type: \"string\" },\n\t\t\thelp: { type: \"boolean\", short: \"h\" },\n\t\t},\n\t});\n\tconst [command, ...names] = positionals;\n\tif (values.help || !command) {\n\t\tprocess.stdout.write(HELP);\n\t\treturn command || values.help ? 0 : 1;\n\t}\n\tconst cwd = process.cwd();\n\tconst log = (line: string) => process.stdout.write(`${line}\\n`);\n\tif (command === \"fonts\") return fonts(names, cwd, values, log);\n\tif (command === \"init\") {\n\t\tif (names.length > 1) {\n\t\t\tprocess.stderr.write(\n\t\t\t\t\"init takes one folder: `framefields init my-film`.\\n\",\n\t\t\t);\n\t\t\treturn 1;\n\t\t}\n\t\tif (values.pm && !PACKAGE_MANAGERS.includes(values.pm as PackageManager)) {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`--pm must be one of ${PACKAGE_MANAGERS.join(\", \")}.\\n`,\n\t\t\t);\n\t\t\treturn 1;\n\t\t}\n\t\tconst report = await init({\n\t\t\tcwd,\n\t\t\tdir: names[0],\n\t\t\tname: values.name,\n\t\t\tpackageManager: values.pm as PackageManager | undefined,\n\t\t\tuserAgent: process.env.npm_config_user_agent,\n\t\t\tfonts: !values[\"no-fonts\"],\n\t\t\temoji: values.emoji,\n\t\t\tgit: !values[\"no-git\"],\n\t\t\tinstall: values.install,\n\t\t\tonDownload,\n\t\t});\n\t\tlogInit(report, cwd, log);\n\t\treturn 0;\n\t}\n\tconst registry = openRegistry(values.registry, cwd);\n\n\tif (command === \"list\") {\n\t\tconst index = await registry.index();\n\t\tconst width = Math.max(...index.map((e) => e.name.length));\n\t\tfor (const e of index)\n\t\t\tprocess.stdout.write(`${e.name.padEnd(width)} ${e.summary}\\n`);\n\t\treturn 0;\n\t}\n\tif (command !== \"add\") {\n\t\tprocess.stderr.write(`Unknown command \"${command}\".\\n\\n${HELP}`);\n\t\treturn 1;\n\t}\n\n\tconst wanted = values.all\n\t\t? (await registry.index()).map((e) => e.name)\n\t\t: names;\n\tif (wanted.length === 0) {\n\t\tprocess.stderr.write(\n\t\t\t\"Name the components to add, e.g. `framefields add mouse-pointer`.\\nRun `framefields list` to see them all.\\n\",\n\t\t);\n\t\treturn 1;\n\t}\n\tconst report = await add(wanted, {\n\t\tcwd,\n\t\tregistry,\n\t\tdir: values.dir,\n\t\toverwrite: values.overwrite,\n\t\tfonts: !values[\"no-fonts\"],\n\t\tfontsDir: values[\"fonts-dir\"],\n\t\tonDownload,\n\t});\n\tfor (const f of report.written) log(` wrote ${f}`);\n\tfor (const f of report.unchanged) log(` unchanged ${f}`);\n\tfor (const f of report.skipped)\n\t\tlog(` skipped ${f} (yours differs; --overwrite replaces it)`);\n\tif (report.configWritten) log(\" wrote framefields.json\");\n\tlogFonts(report, cwd, log);\n\tconst extra = report.components.filter((c) => !wanted.includes(c.name));\n\tif (extra.length > 0)\n\t\tlog(`\\nWith what they build on: ${extra.map((c) => c.name).join(\", \")}.`);\n\twarnIfMissingFramefields(cwd, log);\n\tconst first = report.components.find((c) => wanted.includes(c.name));\n\tif (first)\n\t\tlog(\n\t\t\t`\\nimport { ${first.title} } from \"./${first.name}/index.js\"; // from ${relative(cwd, report.dir) || \".\"}`,\n\t\t);\n\treturn 0;\n}\n\nconst onDownload = (spec: FontSpec) =>\n\tprocess.stdout.write(\n\t\t` fetching ${spec.file} (${(spec.font.bytes / 1e6).toFixed(1)} MB, ${spec.license.id})\\n`,\n\t);\n\n/** What `add` did about fonts, and how to use them. */\nfunction logFonts(report: AddReport, cwd: string, log: (s: string) => void) {\n\tfor (const f of report.fonts)\n\t\tlog(\n\t\t\t` ${f.status === \"installed\" ? \"font \" : \"font ok \"} ${f.path} (${f.role}, for ${f.by}: ${f.why})`,\n\t\t);\n\tfor (const f of report.fontsSkipped)\n\t\tlog(\n\t\t\t` no font ${f.role} for ${f.by} (--no-fonts): ${f.why} Install later with \\`framefields fonts add ${f.role}\\`.`,\n\t\t);\n\tif (report.fontsModule) logFontsModule(report.fontsModule, log);\n\tconst installed = report.fonts.find((f) => f.status === \"installed\");\n\tconst hint = installed && lfsHint(cwd, installed.path);\n\tif (hint) log(`\\n${hint}`);\n\tif (report.fonts.some((f) => f.status !== \"configured\") && report.fontsModule)\n\t\tlog(\n\t\t\t`\\nRegister them once before rendering: \\`await registerFonts()\\` from ${report.fontsModule.path.replace(/\\.ts$/, \".js\")}.`,\n\t\t);\n}\n\nfunction logFontsModule(\n\tm: NonNullable<AddReport[\"fontsModule\"]>,\n\tlog: (s: string) => void,\n) {\n\tif (m.status === \"written\") log(` wrote ${m.path}`);\n\telse if (m.status === \"unchanged\") log(` unchanged ${m.path}`);\n\telse\n\t\tlog(\n\t\t\t` skipped ${m.path} (not generated by framefields). Register the fonts yourself:\\n${m.calls.map((c) => ` ${c}`).join(\"\\n\")}`,\n\t\t);\n}\n\n/** `framefields fonts add <role...>` and `framefields fonts list`. */\nasync function fonts(\n\t[sub, ...roles]: string[],\n\tcwd: string,\n\tvalues: { overwrite?: boolean; \"fonts-dir\"?: string; dir?: string },\n\tlog: (s: string) => void,\n): Promise<number> {\n\tif (sub === \"list\") {\n\t\tconst { config } = readConfig(cwd);\n\t\tfor (const [role, spec] of Object.entries(FONTS))\n\t\t\tlog(\n\t\t\t\t`${role.padEnd(6)} ${spec.label}${config.fonts?.[role] ? ` (installed: ${config.fonts[role]})` : \"\"}`,\n\t\t\t);\n\t\treturn 0;\n\t}\n\tif (sub !== \"add\" || roles.length === 0) {\n\t\tprocess.stderr.write(\n\t\t\t`Usage: framefields fonts add <role...> (roles: ${Object.keys(FONTS).join(\", \")})\\n framefields fonts list\\n`,\n\t\t);\n\t\treturn 1;\n\t}\n\tconst unknown = roles.filter((r) => !FONTS[r]);\n\tif (unknown.length > 0) {\n\t\tprocess.stderr.write(\n\t\t\t`Unknown font ${unknown.map((r) => `\"${r}\"`).join(\", \")}. Fonts framefields can install: ${Object.keys(FONTS).join(\", \")}.\\n`,\n\t\t);\n\t\treturn 1;\n\t}\n\tconst { config, saved } = readConfig(cwd);\n\tconst installs = [];\n\tfor (const role of roles)\n\t\tinstalls.push(\n\t\t\tawait installFont(role, {\n\t\t\t\tcwd,\n\t\t\t\tdir: values[\"fonts-dir\"],\n\t\t\t\toverwrite: values.overwrite,\n\t\t\t\tonDownload,\n\t\t\t}),\n\t\t);\n\tfor (const f of installs)\n\t\tlog(\n\t\t\t` ${f.status === \"installed\" ? \"font \" : \"font ok \"} ${f.path} (${f.role})`,\n\t\t);\n\tif (!saved) log(\" wrote framefields.json\");\n\tconst module = writeFontsModule(\n\t\tcwd,\n\t\tresolve(cwd, values.dir ?? config.components),\n\t);\n\tlogFontsModule(module, log);\n\tconst installed = installs.find((f) => f.status === \"installed\");\n\tconst hint = installed && lfsHint(cwd, installed.path);\n\tif (hint) log(`\\n${hint}`);\n\tlog(\n\t\t`\\nRegister them once before rendering: \\`await registerFonts()\\` from ${module.path.replace(/\\.ts$/, \".js\")}.`,\n\t);\n\treturn 0;\n}\n\nfunction logInit(report: InitReport, cwd: string, log: (s: string) => void) {\n\tconst at = shownPath(cwd, report.root);\n\tfor (const f of report.written) log(` wrote ${f}`);\n\tfor (const f of report.merged)\n\t\tlog(` merged ${f} (added what it lacked)`);\n\tfor (const f of report.unchanged) log(` unchanged ${f}`);\n\tfor (const f of report.fonts)\n\t\tlog(\n\t\t\t` ${f.status === \"installed\" ? \"font \" : \"font ok \"} ${f.path} (${f.role})`,\n\t\t);\n\tlogFontsModule(report.fontsModule, log);\n\tif (report.git === \"initialized\")\n\t\tlog(\" git initialized a repository\");\n\tif (report.git === \"unavailable\")\n\t\tlog(\" git not found: skipped `git init`\");\n\tif (report.lfs === false)\n\t\tlog(\n\t\t\t\"\\nGit LFS isn't installed. Footage and fonts are tracked with it: install it (https://git-lfs.com), then run `git lfs install` once.\",\n\t\t);\n\telse if (report.lfs)\n\t\tlog(\"\\nRun `git lfs install` once on this machine if you haven't yet.\");\n\tconst steps = [\n\t\t...(at === \".\" ? [] : [`cd ${/\\s/.test(at) ? JSON.stringify(at) : at}`]),\n\t\t...(report.installed ? [] : [`${report.packageManager} install`]),\n\t\t`${report.runScript(\"frames\")} -- 0 30 60`,\n\t];\n\tlog(\n\t\t`\\n${report.name} is ready. Next:\\n${steps.map((s) => ` ${s}`).join(\"\\n\")}`,\n\t);\n\tlog(\n\t\t\"\\nThen edit src/film.ts, and run `npx framefields list` for ready-made components.\",\n\t);\n\tlog(\n\t\t`\\nOptional: to generate images, video, music, voice and 3D with the framefields AI gateway, get a key at ${AI_DASHBOARD} and put it in .env as FRAMEFIELDS_API_KEY (see .env.example).`,\n\t);\n}\n\n/** Installed components import `framefields`; say so if the project lacks it. */\nfunction warnIfMissingFramefields(cwd: string, log: (s: string) => void) {\n\ttry {\n\t\tconst pkg = JSON.parse(readFileSync(`${cwd}/package.json`, \"utf8\")) as {\n\t\t\tdependencies?: Record<string, string>;\n\t\t\tdevDependencies?: Record<string, string>;\n\t\t};\n\t\tif (!pkg.dependencies?.framefields && !pkg.devDependencies?.framefields)\n\t\t\tlog(\n\t\t\t\t\"\\nThese components import `framefields`: add it with `npm i framefields`.\",\n\t\t\t);\n\t} catch {\n\t\t// No package.json: nothing to check.\n\t}\n}\n\nmain(process.argv.slice(2)).then(\n\t(code) => process.exit(code),\n\t(error: unknown) => {\n\t\tprocess.stderr.write(\n\t\t\t`framefields: ${error instanceof Error ? error.message : String(error)}\\n`,\n\t\t);\n\t\tprocess.exit(1);\n\t},\n);\n"],"mappings":"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"}
|
|
@@ -3,10 +3,10 @@ import "../index-ocZc12ZS.mjs";
|
|
|
3
3
|
import "../index-3Vdef2KE.mjs";
|
|
4
4
|
import "../renderer-WTvo3wo9.mjs";
|
|
5
5
|
import "../renderer-C-dcd14F.mjs";
|
|
6
|
-
import { $i as
|
|
6
|
+
import { $i as parseColor, $n as Cue, $r as TrackedObjectLike, Aa as toSeconds, Ai as ease$1, Ar as ParticleOptions, Ba as wordRanges, Bi as glyphAnimator, Bn as ArrowCurve, Br as SAFE_INSETS, Ca as targetPoint, Ci as contrastRatio, Cr as MeasureOptions, Da as themes, Di as defineTheme, Dr as MotionPreset, Ea as themeFrames, Ei as defineMeta, Er as MotionOptions, Fa as windowExpression, Fi as evaluateEase, Fn as AnalyzeOptions, Fr as Rect, Gi as isLight, Gn as BaseProps, Gr as Target, Hi as hashString, Hn as AudioLevels, Hr as Spring, Ia as withAlpha, Ii as evaluateGlyphExpression, In as Anchor, Ir as ResolvedMotion, Ji as linePath, Jn as CanvasSize, Jr as TextLayout, Ki as last, Kn as BuildContext, Kr as TargetContext, La as withDefaults, Li as exitAnimation, Ln as Animatable, Lr as ResolvedTarget, Ma as transparent, Mi as elevationStyle, Mr as ProjectDefaults, Na as typingFrames, Ni as ellipsePath, Nr as PropsOf, Oa as toFrames, Oi as dist, Or as MotionPresetName, Pa as valueAt, Pi as enterAnimation, Pr as PulseOptions, Qi as offsetCues, Qn as ComponentMeta, Qr as Track, Ra as within, Ri as findRange, Rn as AnimatableMethods, Rr as Rgba, Sa as surfaceFill, Si as constantExpression, Sr as MeasureFn, Ta as textLayout, Ti as defineComponent, Tr as Metrics, Ui as holdFirstKeys, Un as BakeOptions, Ur as StaggerOrder, Vi as hashRng, Vn as ArrowGeometry, Vr as SafeInsets, Wi as inkOn, Wn as BakedKey, Wr as SyntaxKind, Xi as luminance, Xn as ComponentDefinition, Xr as ThemeInput, Yi as lineShift, Yn as ComponentDefaults, Yr as Theme, Zi as mix, Zn as ComponentExtras, Zr as ThemeName, _a as squigglePath, _i as boilKeys, _r as HandOptions, aa as resolveMotion, ai as analyzeChannels, ar as ElevationLevel, ba as stepExpression, bi as catmullRom, br as LayerStyleConfig, ca as round, ci as arrowPaths, cr as FontRole, da as scheduleExpression, di as bakeFunction, dr as FrameWindow, ea as pulseKeys, ei as UNIT_INDEX, er as Cues, fa as smoothRelease, fi as bakeSamples, fr as GlyphAnimator, ga as springTrack, gi as bind, gr as GrainOptions, ha as springSettleFrames, hi as beats, hr as GlyphUnit, i as analyzeAudio, ia as resampleBands, ii as after, ir as Elevation, ja as transformPathData, ji as elevate, jr as Placement, ka as toPathData, ki as drawOnKeys, kr as MotionSize, la as safeArea, li as ascending, lr as FrameContextLike, ma as springKeys, mi as basePropsSchema, mr as GlyphProps, n as bindComponent, na as rangeRects, ni as Vec2, nr as CutoutOptions, oa as resolveTarget, oi as anchorPoint, or as ExtrudedTextOptions, pa as springAt, pi as bandEdges, pr as GlyphBox, qi as lerp2, qn as BuildResult, qr as TargetNode, r as z, ra as rendererChars, ri as WordRange, rr as EaseFn, sa as rng, si as arcPath, sr as FontNeed, t as ComponentNode, ta as quantize, ti as UnitSchedule, tr as CuesOf, ua as scaleFrames, ui as audioLevelsSchema, ur as FrameValue, va as staggerOffsets, vi as boundsOf, vr as Host, wa as targetSchema, wi as cover, wr as MediaOptions, xa as supersede, xi as chain, xr as MOTION_PRESETS, ya as staggerRanks, yi as boxPath, yr as KeyBook, za as wobblePoints, zi as frameSpan, zn as ArcPath, zr as Rng } from "../index-E1IrPAm4.mjs";
|
|
7
7
|
import "../index-o8LxWdwz.mjs";
|
|
8
8
|
import "../audio-B5mdR8vv.mjs";
|
|
9
9
|
import "../index-D-Gnyffj.mjs";
|
|
10
10
|
import "../index-BhzlG_1Q.mjs";
|
|
11
11
|
import "../index-B4o6F1JC.mjs";
|
|
12
|
-
export { AnalyzeOptions, Anchor, Animatable, AnimatableMethods, ArcPath, ArrowCurve, ArrowGeometry, AudioLevels, BakeOptions, BakedKey, BaseProps, BuildContext, BuildResult, ComponentDefaults, ComponentDefinition, ComponentExtras, ComponentMeta, ComponentNode, Cue, Cues, CuesOf, CutoutOptions, EaseFn, ExtrudedTextOptions, FrameContextLike, FrameValue, FrameWindow, GlyphAnimator, GlyphBox, GlyphProps, GlyphUnit, GrainOptions, HandOptions, Host, LayerStyleConfig, MOTION_PRESETS, MeasureFn, MeasureOptions, MediaOptions, Metrics, MotionOptions, MotionPreset, MotionPresetName, MotionSize, ParticleOptions, Placement, PropsOf, PulseOptions, Rect, ResolvedMotion, ResolvedTarget, Rng, StaggerOrder, Target, TargetContext, TargetNode, TextLayout, Theme, ThemeInput, ThemeName, TrackedObjectLike, UNIT_INDEX, UnitSchedule, Vec2, WordRange, analyzeAudio, analyzeChannels, anchorPoint, arcPath, arrowPaths, audioLevelsSchema, bakeFunction, bakeSamples, bandEdges, basePropsSchema, beats, bind, bindComponent, boilKeys, boundsOf, boxPath, catmullRom, chain, constantExpression, contrastRatio, cover, defineComponent, defineMeta, defineTheme, dist, drawOnKeys, ease$1 as ease, ellipsePath, enterAnimation, evaluateEase, evaluateGlyphExpression, exitAnimation, findRange, frameSpan, glyphAnimator, hashRng, hashString, holdFirstKeys, lerp2, linePath, lineShift, offsetCues, pulseKeys, quantize, rangeRects, rendererChars, resampleBands, resolveMotion, resolveTarget, rng, scaleFrames, scheduleExpression, smoothRelease, springAt, springKeys, springSettleFrames, squigglePath, staggerOffsets, staggerRanks, stepExpression, targetPoint, targetSchema, textLayout, themeFrames, themes, toFrames, toPathData, toSeconds, transformPathData, typingFrames, windowExpression, within, wobblePoints, wordRanges, z };
|
|
12
|
+
export { AnalyzeOptions, Anchor, Animatable, AnimatableMethods, ArcPath, ArrowCurve, ArrowGeometry, AudioLevels, BakeOptions, BakedKey, BaseProps, BuildContext, BuildResult, CanvasSize, ComponentDefaults, ComponentDefinition, ComponentExtras, ComponentMeta, ComponentNode, Cue, Cues, CuesOf, CutoutOptions, EaseFn, Elevation, ElevationLevel, ExtrudedTextOptions, FontNeed, FontRole, FrameContextLike, FrameValue, FrameWindow, GlyphAnimator, GlyphBox, GlyphProps, GlyphUnit, GrainOptions, HandOptions, Host, KeyBook, LayerStyleConfig, MOTION_PRESETS, MeasureFn, MeasureOptions, MediaOptions, Metrics, MotionOptions, MotionPreset, MotionPresetName, MotionSize, ParticleOptions, Placement, ProjectDefaults, PropsOf, PulseOptions, Rect, ResolvedMotion, ResolvedTarget, Rgba, Rng, SAFE_INSETS, SafeInsets, Spring, StaggerOrder, SyntaxKind, Target, TargetContext, TargetNode, TextLayout, Theme, ThemeInput, ThemeName, Track, TrackedObjectLike, UNIT_INDEX, UnitSchedule, Vec2, WordRange, after, analyzeAudio, analyzeChannels, anchorPoint, arcPath, arrowPaths, ascending, audioLevelsSchema, bakeFunction, bakeSamples, bandEdges, basePropsSchema, beats, bind, bindComponent, boilKeys, boundsOf, boxPath, catmullRom, chain, constantExpression, contrastRatio, cover, defineComponent, defineMeta, defineTheme, dist, drawOnKeys, ease$1 as ease, elevate, elevationStyle, ellipsePath, enterAnimation, evaluateEase, evaluateGlyphExpression, exitAnimation, findRange, frameSpan, glyphAnimator, hashRng, hashString, holdFirstKeys, inkOn, isLight, last, lerp2, linePath, lineShift, luminance, mix, offsetCues, parseColor, pulseKeys, quantize, rangeRects, rendererChars, resampleBands, resolveMotion, resolveTarget, rng, round, safeArea, scaleFrames, scheduleExpression, smoothRelease, springAt, springKeys, springSettleFrames, springTrack, squigglePath, staggerOffsets, staggerRanks, stepExpression, supersede, surfaceFill, targetPoint, targetSchema, textLayout, themeFrames, themes, toFrames, toPathData, toSeconds, transformPathData, transparent, typingFrames, valueAt, windowExpression, withAlpha, withDefaults, within, wobblePoints, wordRanges, z };
|
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
import "../chunk-D7gtBK74.mjs";
|
|
2
|
-
import { $ as
|
|
3
|
-
import "../dist-
|
|
4
|
-
import "../renderers-CP8CFWDs-
|
|
2
|
+
import { $ as glyphAnimator, $t as wordRanges, A as boilKeys, At as squigglePath, B as defineTheme, Bt as themes, C as audioLevelsSchema, Ct as scaleFrames, D as basePropsSchema, Dt as springKeys, E as bandEdges, Et as springAt, F as constantExpression, Ft as surfaceFill, G as elevationStyle, Gt as transparent, H as drawOnKeys, Ht as toPathData, I as contrastRatio, It as targetPoint, J as evaluateEase, Jt as windowExpression, K as ellipsePath, Kt as typingFrames, L as cover, Lt as targetSchema, M as boxPath, Mt as staggerRanks, N as catmullRom, Nt as stepExpression, O as beats, Ot as springSettleFrames, P as chain, Pt as supersede, Q as frameSpan, Qt as wobblePoints, R as defineComponent, Rt as textLayout, S as ascending, St as safeArea, T as bakeSamples, Tt as smoothRelease, U as ease, Ut as toSeconds, V as dist, Vt as toFrames, W as elevate, Wt as transformPathData, X as exitAnimation, Xt as withDefaults, Y as evaluateGlyphExpression, Yt as withAlpha, Z as findRange, Zt as within, _ as after, _t as resampleBands, at as last, b as arcPath, bt as rng, ct as lineShift, d as analyzeAudio, dt as offsetCues, et as hashRng, f as KeyBook, ft as parseColor, g as UNIT_INDEX, gt as rendererChars, h as Track, ht as rangeRects, it as isLight, j as boundsOf, jt as staggerOffsets, k as bind, kt as springTrack, l as bindComponent, lt as luminance, m as SAFE_INSETS, mt as quantize, nt as holdFirstKeys, ot as lerp2, p as MOTION_PRESETS, pt as pulseKeys, q as enterAnimation, qt as valueAt, rt as inkOn, st as linePath, tt as hashString, u as z, ut as mix, v as analyzeChannels, vt as resolveMotion, w as bakeFunction, wt as scheduleExpression, x as arrowPaths, xt as round, y as anchorPoint, yt as resolveTarget, z as defineMeta, zt as themeFrames } from "../src-BnkrNj2W.mjs";
|
|
3
|
+
import "../dist-CDwWQYg3.mjs";
|
|
4
|
+
import "../renderers-CP8CFWDs-DPLX5EJs.mjs";
|
|
5
5
|
import "../signals-BrNF9l9s.mjs";
|
|
6
|
-
import "../renderer-
|
|
6
|
+
import "../renderer-D_UPFbei.mjs";
|
|
7
7
|
import "../renderer-CdxNwGeb.mjs";
|
|
8
|
-
import "../renderer-
|
|
9
|
-
import "../renderer-
|
|
10
|
-
import "../renderer-
|
|
11
|
-
import "../renderer-
|
|
12
|
-
import "../renderer-
|
|
13
|
-
import "../renderer-
|
|
8
|
+
import "../renderer-BzEQXAdl.mjs";
|
|
9
|
+
import "../renderer-DgRJG_l-.mjs";
|
|
10
|
+
import "../renderer-Cqp_TUl_.mjs";
|
|
11
|
+
import "../renderer-CMWUtfwn.mjs";
|
|
12
|
+
import "../renderer-CsOLHKFx.mjs";
|
|
13
|
+
import "../renderer-kOlfYLtu.mjs";
|
|
14
14
|
import "../renderer-B7fX0C62.mjs";
|
|
15
|
-
import "../renderer-
|
|
15
|
+
import "../renderer-UArFa4y9.mjs";
|
|
16
16
|
import "../renderer-Duorbrb8.mjs";
|
|
17
|
-
import "../renderer-
|
|
18
|
-
import "../renderer-
|
|
19
|
-
import "../renderer-
|
|
20
|
-
import "../renderer-
|
|
21
|
-
import "../renderer-
|
|
22
|
-
import "../renderer-
|
|
23
|
-
import "../renderer-
|
|
24
|
-
import "../renderer-
|
|
25
|
-
import "../renderer-
|
|
26
|
-
import "../renderer-
|
|
27
|
-
import "../renderer-
|
|
28
|
-
import "../renderer-
|
|
29
|
-
import "../renderer-
|
|
30
|
-
import "../renderer-
|
|
31
|
-
import "../renderer-
|
|
32
|
-
import "../renderer-
|
|
33
|
-
import "../renderer-
|
|
34
|
-
import "../renderer-
|
|
35
|
-
import "../renderer-
|
|
36
|
-
import "../renderer-
|
|
37
|
-
import "../renderer-
|
|
38
|
-
import "../renderer-
|
|
39
|
-
import "../renderer-
|
|
40
|
-
import "../renderer-
|
|
41
|
-
import "../renderer-
|
|
42
|
-
import "../renderer-
|
|
43
|
-
import "../renderer-
|
|
44
|
-
import "../renderer-
|
|
45
|
-
import "../renderer-
|
|
46
|
-
import "../renderer-
|
|
47
|
-
import "../renderer-
|
|
17
|
+
import "../renderer-C64g87yU.mjs";
|
|
18
|
+
import "../renderer-CgdplRri.mjs";
|
|
19
|
+
import "../renderer-BQdn_qGp.mjs";
|
|
20
|
+
import "../renderer-ij448rvt.mjs";
|
|
21
|
+
import "../renderer-BKssznKn.mjs";
|
|
22
|
+
import "../renderer-LW8MfGjd.mjs";
|
|
23
|
+
import "../renderer-qQmoO5Hk.mjs";
|
|
24
|
+
import "../renderer-Bbkf5EIi.mjs";
|
|
25
|
+
import "../renderer-CHPLHbAs.mjs";
|
|
26
|
+
import "../renderer-ml2LHmRb.mjs";
|
|
27
|
+
import "../renderer-DEeKkljI.mjs";
|
|
28
|
+
import "../renderer-eyvY4Lq4.mjs";
|
|
29
|
+
import "../renderer-CY0BT6ok.mjs";
|
|
30
|
+
import "../renderer-l1qJE4z-.mjs";
|
|
31
|
+
import "../renderer-DYJHFHF4.mjs";
|
|
32
|
+
import "../renderer-BDCS7k5X.mjs";
|
|
33
|
+
import "../renderer-JJibsJfb.mjs";
|
|
34
|
+
import "../renderer-DYR4gFEM.mjs";
|
|
35
|
+
import "../renderer-DJHuPNJx.mjs";
|
|
36
|
+
import "../renderer-DJTXhVNh.mjs";
|
|
37
|
+
import "../renderer-bb3puodg.mjs";
|
|
38
|
+
import "../renderer-Cn9tU_s5.mjs";
|
|
39
|
+
import "../renderer-DiD3r9tx.mjs";
|
|
40
|
+
import "../renderer-yFHP9Zj2.mjs";
|
|
41
|
+
import "../renderer-CRkgyk08.mjs";
|
|
42
|
+
import "../renderer-BQFxoNzi.mjs";
|
|
43
|
+
import "../renderer-B1Ox12RF.mjs";
|
|
44
|
+
import "../renderer-CJRu7lLH.mjs";
|
|
45
|
+
import "../renderer-CYLP8sD6.mjs";
|
|
46
|
+
import "../renderer-BsnhAgrB.mjs";
|
|
47
|
+
import "../renderer-rv-AKqCl.mjs";
|
|
48
48
|
|
|
49
|
-
export { MOTION_PRESETS, UNIT_INDEX, analyzeAudio, analyzeChannels, anchorPoint, arcPath, arrowPaths, audioLevelsSchema, bakeFunction, bakeSamples, bandEdges, basePropsSchema, beats, bind, bindComponent, boilKeys, boundsOf, boxPath, catmullRom, chain, constantExpression, contrastRatio, cover, defineComponent, defineMeta, defineTheme, dist, drawOnKeys, ease, ellipsePath, enterAnimation, evaluateEase, evaluateGlyphExpression, exitAnimation, findRange, frameSpan, glyphAnimator, hashRng, hashString, holdFirstKeys, lerp2, linePath, lineShift, offsetCues, pulseKeys, quantize, rangeRects, rendererChars, resampleBands, resolveMotion, resolveTarget, rng, scaleFrames, scheduleExpression, smoothRelease, springAt, springKeys, springSettleFrames, squigglePath, staggerOffsets, staggerRanks, stepExpression, targetPoint, targetSchema, textLayout, themeFrames, themes, toFrames, toPathData, toSeconds, transformPathData, typingFrames, windowExpression, within, wobblePoints, wordRanges, z };
|
|
49
|
+
export { KeyBook, MOTION_PRESETS, SAFE_INSETS, Track, UNIT_INDEX, after, analyzeAudio, analyzeChannels, anchorPoint, arcPath, arrowPaths, ascending, audioLevelsSchema, bakeFunction, bakeSamples, bandEdges, basePropsSchema, beats, bind, bindComponent, boilKeys, boundsOf, boxPath, catmullRom, chain, constantExpression, contrastRatio, cover, defineComponent, defineMeta, defineTheme, dist, drawOnKeys, ease, elevate, elevationStyle, ellipsePath, enterAnimation, evaluateEase, evaluateGlyphExpression, exitAnimation, findRange, frameSpan, glyphAnimator, hashRng, hashString, holdFirstKeys, inkOn, isLight, last, lerp2, linePath, lineShift, luminance, mix, offsetCues, parseColor, pulseKeys, quantize, rangeRects, rendererChars, resampleBands, resolveMotion, resolveTarget, rng, round, safeArea, scaleFrames, scheduleExpression, smoothRelease, springAt, springKeys, springSettleFrames, springTrack, squigglePath, staggerOffsets, staggerRanks, stepExpression, supersede, surfaceFill, targetPoint, targetSchema, textLayout, themeFrames, themes, toFrames, toPathData, toSeconds, transformPathData, transparent, typingFrames, valueAt, windowExpression, withAlpha, withDefaults, within, wobblePoints, wordRanges, z };
|
|
@@ -19041,7 +19041,7 @@ function getOrCreateEmojiTexture(device, char, fontSize) {
|
|
|
19041
19041
|
const emojiSize = Math.max(16, Math.ceil(fontSize * 1.5 * resolutionScale));
|
|
19042
19042
|
const size = Math.ceil(emojiSize / 4) * 4;
|
|
19043
19043
|
if (!!globalThis.__IS_HEADLESS_RENDERER__ || typeof window === "undefined" || typeof globalThis.document === "undefined") {
|
|
19044
|
-
console.warn(`[getOrCreateEmojiTexture] Emoji "${char}" not preloaded. Returning fallback dummy texture.`);
|
|
19044
|
+
if (SlugFontCache.hasEmojiFont()) console.warn(`[getOrCreateEmojiTexture] Emoji "${char}" not preloaded. Returning fallback dummy texture.`);
|
|
19045
19045
|
tex = device.createTexture({
|
|
19046
19046
|
label: `Emoji-Dummy-${char}`,
|
|
19047
19047
|
size: [1, 1],
|
|
@@ -31760,4 +31760,4 @@ if (typeof globalThis !== "undefined") globalThis.__GATEWAI_DELAYS__ = globalThi
|
|
|
31760
31760
|
|
|
31761
31761
|
//#endregion
|
|
31762
31762
|
export { probeVideoSize as $, TextPathSourceSchema as $t, emojiGraphemes as A, getScramblePool as An, EnhancedTextNodeSchema as At, jointMatrices as B, SelectorModeSchema as Bt, drawGifNode as C, evaluateSelectorCombination as Cn, AnchorPresetSchema as Ct, drawSignalNode as D, evaluateVolumetricFormation as Dn, ChromaticGlitchConfigSchema as Dt, drawParagraphNode as E, evaluateTypewriterState as En, AudioSpectrumTypographySchema as Et, getPrimitiveGeometry as F, samplePathChainGeometry as Fn, KineticMarqueeConfigSchema as Ft, measureMaxCaptionHeight as G, Spatial3DPropertiesSchema as Gt, loadModel3D as H, SelectorUnitsSchema as Ht, getRegisteredFontSource as I, signalRegistry as In, LineSpacingDynamicsSchema as It, parseFBX as J, TextAnimatorBuilder as Jt, mediaDecoderCache as K, SpringPhysicsSchema as Kt, getRenderer2D as L, waveToCubicBeziers as Ln, LongShadowConfigSchema as Lt, fitSpansToText as M, parseSvgPathToCubicBeziers as Mn, ExtendedGlyphPropertiesSchema as Mt, generateExtrudedTextGeometry as N, sampleAudioSpectrumScale as Nn, GlyphAnchorGroupingSchema as Nt, drawSvgNode as O, generateArcLengthLUT as On, CubicBezierSegmentSchema as Ot, getHeadlessFontPath as P, sampleCurveGeometry as Pn, GlyphAnchorPointSchema as Pt, poseNodes as Q, TextPathOptionsSchema as Qt, initHeadlessWebGPU as R, ParticleDissolveConfigSchema as Rt, drawCaptionNode as S, evaluateMarqueeOffset as Sn, AnchorGroupingSchema as St, drawLottieNode as T, evaluateSpringProgress as Tn, AudioSignalComputePipeline as Tt, loadOBJ as U, SignalRegistry as Ut, loadFBX as V, SelectorShapeSchema as Vt, lutStore as W, SkewPropertiesSchema as Wt, parseOBJ as X, TextCursorStyleSchema as Xt, parseMTL as Y, TextCursorConfigSchema as Yt, parseSvgPathToSegments as Z, TextPathBuilder as Zt, buildShapeSvgPath as _, distanceToCurveParameter as _n, parseColorToRgb as _t, GlassPipeline as a, TypewriterAnimatorSchema as an, srtLoader as at, colorMatrixWgsl as b, evaluateCubicBezierDerivative as bn, AdvancedTextAnimatorBuilder as bt, Renderer2D as c, Vec2Schema as cn, resolveMediaSourceUrl as ct, ScreenSpaceRelightPipeline as d, buildPathLUT as dn, LIGHT_UNIFORM_SIZE_BYTES as dt, TextRangeSelectorSchema as en, registerHeadlessFont as et, ShadowPipeline as f, buildWGSLSignalFn as fn, Light3D as ft, WebGPUAudioProcessor as g, deterministicWigglyNoise as gn, Vector3Math as gt, SlugPipeline as h, computeRangeSelectorWeight as hn, Path3D as ht, EffectPipeline as i, TextWigglySelectorSchema as in, spansText as it, ensureDevice as j, getShuffledOrder as jn, ExpressionSelectorSchema as jt, drawVideoNode as k, generatePathSegments as kn, DynamicStrokePropertiesSchema as kt, Renderer3D as l, VolumetricFormationConfigSchema as ln, Camera3D as lt, SlugGeometry as m, computeLineLeadingDisplacement as mn, Matrix4Math as mt, AudioLatentTrackCache as n, TextSelectorSchema as nn, setRegisteredFontSource as nt, MotionBlurPipeline as o, TypingCadenceSchema as on, textureCache as ot, SlugFontCache as p, computeAnchorPivotOffset as pn, MAX_LIGHTS as pt, parseColor as q, TextAnchorConfigSchema as qt, AudioMeshDeformPipeline as r, TextSignalSelectorSchema as rn, shaderStore as rt, NodeSurfaceProvider as s, VariableFontAxesSchema as sn, GetFontAssetUrl as st, AudioLatentEngine as t, TextScrambleConfigSchema as tn, resolveTextSpans as tt, SSAOPipeline as u, VolumetricFormationModeSchema as un, ENVIRONMENT_PRESETS as ut, clearAllVideoCache as v, ellipseToCubicBeziers as vn, resolveEnvironment as vt, drawImageNode as w, evaluateSkewMatrix as wn, AnimatableGlyphPropsSchema as wt, describeGpu as x, evaluateExpressionSelector as xn, AdvancedTextAnimatorSchema as xt, clearHeadlessFonts as y, evaluateCubicBezier as yn, AETextAnimatorSchema as yt, inputStore as z, SelectorBasedOnSchema as zt };
|
|
31763
|
-
//# sourceMappingURL=dist-
|
|
31763
|
+
//# sourceMappingURL=dist-CDwWQYg3.mjs.map
|