framefields 2.8.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-CxAUxVyA.d.mts → audio-Ccpl9mjV.d.mts} +3 -3
- package/dist/{audio-CxAUxVyA.d.mts.map → audio-Ccpl9mjV.d.mts.map} +1 -1
- package/dist/{audio-CGVJlZb9.mjs → audio-vatRe308.mjs} +3 -3
- package/dist/{audio-CGVJlZb9.mjs.map → audio-vatRe308.mjs.map} +1 -1
- package/dist/cli/check-worker.mjs +43 -43
- package/dist/components/index.d.mts +10 -10
- package/dist/components/index.mjs +42 -42
- package/dist/{dist-C5eZw8ms.mjs → dist-BbwtlSZO.mjs} +2 -2
- package/dist/{dist-C5eZw8ms.mjs.map → dist-BbwtlSZO.mjs.map} +1 -1
- package/dist/{dist-CnFcSau0.mjs → dist-CFe1fC9l.mjs} +2289 -212
- package/dist/dist-CFe1fC9l.mjs.map +1 -0
- package/dist/effects/index.d.mts +4 -4
- package/dist/effects/index.mjs +34 -34
- package/dist/{effects-DdvkiI3u.mjs → effects-CCyfjbhZ.mjs} +2 -2
- package/dist/{effects-DdvkiI3u.mjs.map → effects-CCyfjbhZ.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-k_89s1HO.mjs → fonts-C1mgtkCa.mjs} +2 -2
- package/dist/{fonts-k_89s1HO.mjs.map → fonts-C1mgtkCa.mjs.map} +1 -1
- package/dist/{gpu-BoyykRdD.mjs → gpu-CU2tEKJJ.mjs} +2 -2
- package/dist/{gpu-BoyykRdD.mjs.map → gpu-CU2tEKJJ.mjs.map} +1 -1
- package/dist/{index-CPFKis94.d.mts → index-7Z9_a_iB.d.mts} +3 -3
- package/dist/{index-CPFKis94.d.mts.map → index-7Z9_a_iB.d.mts.map} +1 -1
- package/dist/{index-CFKMZDv1.d.mts → index-BIjMAW1h.d.mts} +2 -2
- package/dist/{index-CFKMZDv1.d.mts.map → index-BIjMAW1h.d.mts.map} +1 -1
- package/dist/{index-Ds9_v60R.d.mts → index-BwRrsP_V.d.mts} +181 -13
- package/dist/index-BwRrsP_V.d.mts.map +1 -0
- package/dist/{index-BukqOGDa.d.mts → index-CFoAmh7q.d.mts} +3 -3
- package/dist/{index-BukqOGDa.d.mts.map → index-CFoAmh7q.d.mts.map} +1 -1
- package/dist/{index-CPeaSZoz.d.mts → index-CJL0JAU8.d.mts} +2 -2
- package/dist/{index-CPeaSZoz.d.mts.map → index-CJL0JAU8.d.mts.map} +1 -1
- package/dist/{index-Ced1Ry4S.d.mts → index-D5UDyVMb.d.mts} +211 -9
- package/dist/index-D5UDyVMb.d.mts.map +1 -0
- package/dist/{index-B_nooAhS.d.mts → index-UDDAfHAF.d.mts} +4 -4
- package/dist/{index-B_nooAhS.d.mts.map → index-UDDAfHAF.d.mts.map} +1 -1
- package/dist/index.d.mts +11 -11
- package/dist/index.mjs +49 -49
- package/dist/preview/index.d.mts +3 -3
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-DHqCrFhG.mjs → preview-WXbsf6Dv.mjs} +2 -2
- package/dist/{preview-DHqCrFhG.mjs.map → preview-WXbsf6Dv.mjs.map} +1 -1
- package/dist/preview-engine/{chunk-K5F4ZW6T.mjs → chunk-7U34VKNO.mjs} +1 -1
- package/dist/preview-engine/chunk-FKG27DVO.mjs +4 -0
- package/dist/preview-engine/chunk-KFNVUGNN.mjs +1974 -0
- package/dist/preview-engine/chunk-NKAVHU7H.mjs +480 -0
- package/dist/preview-engine/chunk-PYX6Q2EJ.mjs +2403 -0
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/renderers-KPCQGBIY.mjs +228 -0
- package/dist/{program-CqQDWfSV.mjs → program-Cq4gP9Dd.mjs} +5 -6
- package/dist/program-Cq4gP9Dd.mjs.map +1 -0
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/renderer-01zxT4CK.mjs +5 -0
- package/dist/renderer-35LHkj36.mjs +5 -0
- package/dist/{renderer-Cx2Sw9Ib.mjs → renderer-AMBVtZ_G.mjs} +3 -3
- package/dist/{renderer-Cx2Sw9Ib.mjs.map → renderer-AMBVtZ_G.mjs.map} +1 -1
- package/dist/renderer-B0OIdCGj.mjs +5 -0
- package/dist/renderer-B3IPtkK9.mjs +5 -0
- package/dist/{renderer-DCyp-jzQ.mjs → renderer-B4iCFvJh.mjs} +3 -3
- package/dist/{renderer-DCyp-jzQ.mjs.map → renderer-B4iCFvJh.mjs.map} +1 -1
- package/dist/{renderer-DsGE9qtz.mjs → renderer-BD00i68i.mjs} +3 -3
- package/dist/{renderer-DsGE9qtz.mjs.map → renderer-BD00i68i.mjs.map} +1 -1
- package/dist/{renderer-CuK1lPnA.mjs → renderer-BEuU7qlG.mjs} +2 -2
- package/dist/{renderer-CuK1lPnA.mjs.map → renderer-BEuU7qlG.mjs.map} +1 -1
- package/dist/{renderer-BuYRrBRf.mjs → renderer-BGPnCRFI.mjs} +3 -3
- package/dist/{renderer-BuYRrBRf.mjs.map → renderer-BGPnCRFI.mjs.map} +1 -1
- package/dist/{renderer-D7FuHXiz.mjs → renderer-BIGILDEA.mjs} +2 -2
- package/dist/{renderer-D7FuHXiz.mjs.map → renderer-BIGILDEA.mjs.map} +1 -1
- package/dist/{renderer-4GwADfB0.mjs → renderer-BLU0PQTB.mjs} +3 -3
- package/dist/{renderer-4GwADfB0.mjs.map → renderer-BLU0PQTB.mjs.map} +1 -1
- package/dist/renderer-BMC39abo.mjs +5 -0
- package/dist/{renderer-DS-Gv-3w.mjs → renderer-BNzT34UV.mjs} +2 -2
- package/dist/renderer-BQj3nlAI.mjs +5 -0
- package/dist/{renderer-DqMZiy5N.mjs → renderer-BWlMAacF.mjs} +2 -2
- package/dist/{renderer-DqMZiy5N.mjs.map → renderer-BWlMAacF.mjs.map} +1 -1
- package/dist/{renderer-DXu0nrzo.d.mts → renderer-BX7jS14r.d.mts} +2 -2
- package/dist/{renderer-DXu0nrzo.d.mts.map → renderer-BX7jS14r.d.mts.map} +1 -1
- package/dist/{renderer-DPUULdjh.mjs → renderer-BXAgUuAq.mjs} +2 -2
- package/dist/{renderer-DPUULdjh.mjs.map → renderer-BXAgUuAq.mjs.map} +1 -1
- package/dist/{renderer-Cn34qZC4.mjs → renderer-BZKkT-6Q.mjs} +2 -2
- package/dist/{renderer-Cn34qZC4.mjs.map → renderer-BZKkT-6Q.mjs.map} +1 -1
- package/dist/{renderer-BcHpcLq3.mjs → renderer-BdbGTz7z.mjs} +3 -3
- package/dist/{renderer-BcHpcLq3.mjs.map → renderer-BdbGTz7z.mjs.map} +1 -1
- package/dist/{renderer-Dhi0Q1cI.mjs → renderer-BeFiQfzV.mjs} +69 -69
- package/dist/{renderer-Dhi0Q1cI.mjs.map → renderer-BeFiQfzV.mjs.map} +1 -1
- package/dist/{renderer-kg8-ngnB.mjs → renderer-BeQrWrOa.mjs} +2 -2
- package/dist/{renderer-kg8-ngnB.mjs.map → renderer-BeQrWrOa.mjs.map} +1 -1
- package/dist/{renderer-Ca-LoeJh.mjs → renderer-BioUC9zE.mjs} +2 -2
- package/dist/{renderer-Ca-LoeJh.mjs.map → renderer-BioUC9zE.mjs.map} +1 -1
- package/dist/{renderer-wH_l-jMH.mjs → renderer-Bkqg-U2F.mjs} +3 -3
- package/dist/{renderer-wH_l-jMH.mjs.map → renderer-Bkqg-U2F.mjs.map} +1 -1
- package/dist/{renderer-Sj11W1xq.mjs → renderer-BlVmbzPs.mjs} +2 -2
- package/dist/renderer-BnBvSmp_.mjs +5 -0
- package/dist/{renderer-Qd-HCwKj.mjs → renderer-Br4UZvfL.mjs} +3 -3
- package/dist/{renderer-Qd-HCwKj.mjs.map → renderer-Br4UZvfL.mjs.map} +1 -1
- package/dist/{renderer-DX5ZpEBB.mjs → renderer-BrWOcJ9Q.mjs} +3 -3
- package/dist/{renderer-DX5ZpEBB.mjs.map → renderer-BrWOcJ9Q.mjs.map} +1 -1
- package/dist/renderer-BsDSpTpL.mjs +5 -0
- package/dist/renderer-BtW6_gvE.mjs +5 -0
- package/dist/renderer-By8U44Rt.mjs +5 -0
- package/dist/{renderer-XnWe1hSL.mjs → renderer-C-5RNIeX.mjs} +2 -2
- package/dist/{renderer-XnWe1hSL.mjs.map → renderer-C-5RNIeX.mjs.map} +1 -1
- package/dist/renderer-C3lDmxuX.mjs +5 -0
- package/dist/renderer-C6SZAE_x.mjs +5 -0
- package/dist/{renderer-DSM5c7UA.mjs → renderer-C8rxyjaE.mjs} +2 -2
- package/dist/{renderer-DSM5c7UA.mjs.map → renderer-C8rxyjaE.mjs.map} +1 -1
- package/dist/renderer-CA3IVeZj.mjs +5 -0
- package/dist/{renderer-DYT4iPi-.mjs → renderer-CAagaRag.mjs} +2 -2
- package/dist/{renderer-DYT4iPi-.mjs.map → renderer-CAagaRag.mjs.map} +1 -1
- package/dist/{renderer-CaE0rp9j.mjs → renderer-CCSzKnvs.mjs} +2 -2
- package/dist/{renderer-CaE0rp9j.mjs.map → renderer-CCSzKnvs.mjs.map} +1 -1
- package/dist/renderer-CFoCH_mO.mjs +5 -0
- package/dist/renderer-CLhZqJF8.mjs +6 -0
- package/dist/{renderer-Bw5jGUo5.mjs → renderer-COQc1jn6.mjs} +2 -2
- package/dist/{renderer-Bw5jGUo5.mjs.map → renderer-COQc1jn6.mjs.map} +1 -1
- package/dist/{renderer-DB7PM7nZ.mjs → renderer-CP2FOWyJ.mjs} +3 -3
- package/dist/{renderer-DB7PM7nZ.mjs.map → renderer-CP2FOWyJ.mjs.map} +1 -1
- package/dist/{renderer-DXsV3mZD.mjs → renderer-CUq2qgyc.mjs} +3 -3
- package/dist/{renderer-DXsV3mZD.mjs.map → renderer-CUq2qgyc.mjs.map} +1 -1
- package/dist/{renderer-DYfNgEhK.mjs → renderer-CXWAdRqn.mjs} +2 -2
- package/dist/{renderer-DYfNgEhK.mjs.map → renderer-CXWAdRqn.mjs.map} +1 -1
- package/dist/renderer-CYJXQS8E.mjs +5 -0
- package/dist/{renderer-JDLYPnRh.mjs → renderer-CZyJ72JZ.mjs} +2 -2
- package/dist/{renderer-JDLYPnRh.mjs.map → renderer-CZyJ72JZ.mjs.map} +1 -1
- package/dist/renderer-C_vj6_WJ.mjs +5 -0
- package/dist/{renderer-4F4FypvN.mjs → renderer-Ce8VPaog.mjs} +2 -2
- package/dist/{renderer-4F4FypvN.mjs.map → renderer-Ce8VPaog.mjs.map} +1 -1
- package/dist/{renderer-4a4koLCl.mjs → renderer-CeX7uUXB.mjs} +2 -2
- package/dist/{renderer-4a4koLCl.mjs.map → renderer-CeX7uUXB.mjs.map} +1 -1
- package/dist/renderer-CeqfC6OR.mjs +5 -0
- package/dist/{renderer-NvGahExL.mjs → renderer-Ci9x2WUd.mjs} +3 -3
- package/dist/{renderer-NvGahExL.mjs.map → renderer-Ci9x2WUd.mjs.map} +1 -1
- package/dist/{renderer-iA7rxZmR.mjs → renderer-CiMIftlS.mjs} +3 -3
- package/dist/{renderer-iA7rxZmR.mjs.map → renderer-CiMIftlS.mjs.map} +1 -1
- package/dist/{renderer-CpEU-TRR.mjs → renderer-CjklM-KD.mjs} +2 -2
- package/dist/{renderer-CpEU-TRR.mjs.map → renderer-CjklM-KD.mjs.map} +1 -1
- package/dist/{renderer-CNVzJIBz.mjs → renderer-Cjx3x7xM.mjs} +3 -3
- package/dist/{renderer-CNVzJIBz.mjs.map → renderer-Cjx3x7xM.mjs.map} +1 -1
- package/dist/renderer-CkZCGMAc.mjs +5 -0
- package/dist/renderer-Clxju1r9.mjs +5 -0
- package/dist/{renderer-l-K6iZLC.mjs → renderer-CrgfMDbh.mjs} +3 -3
- package/dist/{renderer-l-K6iZLC.mjs.map → renderer-CrgfMDbh.mjs.map} +1 -1
- package/dist/{renderer-fv9WvK0d.mjs → renderer-CsilJwL-.mjs} +3 -3
- package/dist/{renderer-fv9WvK0d.mjs.map → renderer-CsilJwL-.mjs.map} +1 -1
- package/dist/{renderer-DBN6SV8L.mjs → renderer-CxEBV-w0.mjs} +2 -2
- package/dist/{renderer-DBN6SV8L.mjs.map → renderer-CxEBV-w0.mjs.map} +1 -1
- package/dist/{renderer-Bw3tlr9I.mjs → renderer-CyWRvKUI.mjs} +2 -2
- package/dist/{renderer-Bw3tlr9I.mjs.map → renderer-CyWRvKUI.mjs.map} +1 -1
- package/dist/renderer-CyWtKBF7.mjs +5 -0
- package/dist/{renderer-BlUfAZyK.mjs → renderer-D-17HVPb.mjs} +3 -3
- package/dist/{renderer-BlUfAZyK.mjs.map → renderer-D-17HVPb.mjs.map} +1 -1
- package/dist/renderer-D27STGoB.mjs +5 -0
- package/dist/{renderer-BUV6IH0o.mjs → renderer-D2JOseb1.mjs} +2 -2
- package/dist/{renderer-BUV6IH0o.mjs.map → renderer-D2JOseb1.mjs.map} +1 -1
- package/dist/{renderer-BYIa_hnS.mjs → renderer-D3K9FEQk.mjs} +3 -3
- package/dist/{renderer-BYIa_hnS.mjs.map → renderer-D3K9FEQk.mjs.map} +1 -1
- package/dist/{renderer-bE6yZ_Ef.mjs → renderer-D41gHat4.mjs} +3 -3
- package/dist/{renderer-bE6yZ_Ef.mjs.map → renderer-D41gHat4.mjs.map} +1 -1
- package/dist/{renderer-C7SYbHgB.mjs → renderer-D6X9vWkN.mjs} +2 -2
- package/dist/{renderer-C7SYbHgB.mjs.map → renderer-D6X9vWkN.mjs.map} +1 -1
- package/dist/renderer-D78Aq9YK.mjs +5 -0
- package/dist/{renderer-ClxmV_id.mjs → renderer-D7Cu9OZx.mjs} +2 -2
- package/dist/{renderer-ClxmV_id.mjs.map → renderer-D7Cu9OZx.mjs.map} +1 -1
- package/dist/{renderer-DO15Nj-w.mjs → renderer-D7Kk7VxM.mjs} +3 -3
- package/dist/{renderer-DO15Nj-w.mjs.map → renderer-D7Kk7VxM.mjs.map} +1 -1
- package/dist/{renderer-DZKZup7n.mjs → renderer-D8CMakyz.mjs} +3 -3
- package/dist/{renderer-DZKZup7n.mjs.map → renderer-D8CMakyz.mjs.map} +1 -1
- package/dist/{renderer-DbO4xZBb.mjs → renderer-DEcbSNQd.mjs} +3 -3
- package/dist/{renderer-DbO4xZBb.mjs.map → renderer-DEcbSNQd.mjs.map} +1 -1
- package/dist/{renderer-DjWBBISJ.mjs → renderer-DGPaKIFf.mjs} +2 -2
- package/dist/renderer-DHEffABL.mjs +5 -0
- package/dist/{renderer-CTr_Zi08.mjs → renderer-DIPyUVX2.mjs} +3 -3
- package/dist/{renderer-CTr_Zi08.mjs.map → renderer-DIPyUVX2.mjs.map} +1 -1
- package/dist/{renderer-D_Mf-Zft.d.mts → renderer-DKgPVOLL.d.mts} +2 -2
- package/dist/{renderer-D_Mf-Zft.d.mts.map → renderer-DKgPVOLL.d.mts.map} +1 -1
- package/dist/{renderer-BrXkb-9N.mjs → renderer-DPn2DhMU.mjs} +2 -2
- package/dist/{renderer-BrXkb-9N.mjs.map → renderer-DPn2DhMU.mjs.map} +1 -1
- package/dist/{renderer-CyELq6P6.mjs → renderer-DRGa6tlX.mjs} +2 -2
- package/dist/{renderer-CyELq6P6.mjs.map → renderer-DRGa6tlX.mjs.map} +1 -1
- package/dist/{renderer-Crl8q_vD.mjs → renderer-DSpTGqUU.mjs} +3 -3
- package/dist/{renderer-Crl8q_vD.mjs.map → renderer-DSpTGqUU.mjs.map} +1 -1
- package/dist/{renderer-vVKNp3ri.mjs → renderer-DTgO5LPf.mjs} +3 -3
- package/dist/{renderer-vVKNp3ri.mjs.map → renderer-DTgO5LPf.mjs.map} +1 -1
- package/dist/renderer-DUuNCgzW.mjs +5 -0
- package/dist/renderer-DVD5pzRq.mjs +5 -0
- package/dist/{renderer-C55eLbl1.mjs → renderer-DgLt0TPo.mjs} +2 -2
- package/dist/{renderer-C55eLbl1.mjs.map → renderer-DgLt0TPo.mjs.map} +1 -1
- package/dist/{renderer-BHwbnT6S.mjs → renderer-Dk45W8Zd.mjs} +3 -3
- package/dist/{renderer-BHwbnT6S.mjs.map → renderer-Dk45W8Zd.mjs.map} +1 -1
- package/dist/{renderer-Dv5yE4LE.mjs → renderer-DlZwbO-A.mjs} +2 -2
- package/dist/{renderer-Dv5yE4LE.mjs.map → renderer-DlZwbO-A.mjs.map} +1 -1
- package/dist/{renderer-CaRPsrbX.mjs → renderer-DnPzvIHK.mjs} +2 -2
- package/dist/{renderer-CCnrG0Pd.mjs → renderer-DoRazdp_.mjs} +2 -2
- package/dist/{renderer-CCnrG0Pd.mjs.map → renderer-DoRazdp_.mjs.map} +1 -1
- package/dist/{renderer-CeIXVu9F.mjs → renderer-DsAoxQ8O.mjs} +2 -2
- package/dist/{renderer-CeIXVu9F.mjs.map → renderer-DsAoxQ8O.mjs.map} +1 -1
- package/dist/renderer-Dsp6xDw5.mjs +5 -0
- package/dist/renderer-DuC-BFXR.mjs +5 -0
- package/dist/renderer-DuWs_Wsv.mjs +5 -0
- package/dist/{renderer-8pS82_mX.mjs → renderer-DveQQCi8.mjs} +3 -3
- package/dist/{renderer-8pS82_mX.mjs.map → renderer-DveQQCi8.mjs.map} +1 -1
- package/dist/{renderer-Dypn26aP.mjs → renderer-DxHICEk3.mjs} +3 -3
- package/dist/{renderer-Dypn26aP.mjs.map → renderer-DxHICEk3.mjs.map} +1 -1
- package/dist/{renderer-DfTnsfy9.mjs → renderer-DxbFjINv.mjs} +3 -3
- package/dist/{renderer-DfTnsfy9.mjs.map → renderer-DxbFjINv.mjs.map} +1 -1
- package/dist/{renderer-jvgqy4Td.mjs → renderer-Gw1ICOJ3.mjs} +3 -3
- package/dist/{renderer-jvgqy4Td.mjs.map → renderer-Gw1ICOJ3.mjs.map} +1 -1
- package/dist/{renderer-j-3XB8YI.mjs → renderer-LY2MiIj0.mjs} +3 -3
- package/dist/{renderer-j-3XB8YI.mjs.map → renderer-LY2MiIj0.mjs.map} +1 -1
- package/dist/{renderer-BLrhcSex.mjs → renderer-LwrcnEtI.mjs} +3 -3
- package/dist/{renderer-BLrhcSex.mjs.map → renderer-LwrcnEtI.mjs.map} +1 -1
- package/dist/renderer-OSgsiIrW.mjs +5 -0
- package/dist/renderer-OZaMFYtZ.mjs +5 -0
- package/dist/renderer-T79TmHET.mjs +5 -0
- package/dist/{renderer-7Tx-L9Vf.mjs → renderer-U-12BOhe.mjs} +2 -2
- package/dist/{renderer-7Tx-L9Vf.mjs.map → renderer-U-12BOhe.mjs.map} +1 -1
- package/dist/renderer-UhsC9oTU.mjs +5 -0
- package/dist/renderer-WYZV1jWf.mjs +5 -0
- package/dist/renderer-Y7evDjHH.mjs +5 -0
- package/dist/{renderer-CQkZUsvc.mjs → renderer-cg06hb82.mjs} +3 -3
- package/dist/{renderer-CQkZUsvc.mjs.map → renderer-cg06hb82.mjs.map} +1 -1
- package/dist/{renderer-DRLtfxdW.mjs → renderer-eAVNsuX8.mjs} +95 -16
- package/dist/renderer-eAVNsuX8.mjs.map +1 -0
- package/dist/renderer-mcePkmUe.mjs +5 -0
- package/dist/{renderer-CT_aJBk2.mjs → renderer-uorPCWdC.mjs} +3 -3
- package/dist/{renderer-CT_aJBk2.mjs.map → renderer-uorPCWdC.mjs.map} +1 -1
- package/dist/{renderer-BMnX_-PZ.mjs → renderer-xLQ_nkmy.mjs} +3 -3
- package/dist/{renderer-BMnX_-PZ.mjs.map → renderer-xLQ_nkmy.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-fYqxoIKK.mjs → renderers-CP8CFWDs-ywy4xljX.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-fYqxoIKK.mjs.map → renderers-CP8CFWDs-ywy4xljX.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +4 -4
- package/dist/{src-DggYlKaX.mjs → src-B0KFNjj4.mjs} +289 -59
- package/dist/src-B0KFNjj4.mjs.map +1 -0
- package/package.json +58 -58
- package/dist/dist-CnFcSau0.mjs.map +0 -1
- package/dist/index-Ced1Ry4S.d.mts.map +0 -1
- package/dist/index-Ds9_v60R.d.mts.map +0 -1
- package/dist/preview-engine/chunk-3OXRGTQ2.mjs +0 -2390
- package/dist/preview-engine/chunk-7EYVBRN3.mjs +0 -480
- package/dist/preview-engine/chunk-7WBDEZ2A.mjs +0 -1974
- package/dist/preview-engine/chunk-HPP52AQI.mjs +0 -4
- package/dist/preview-engine/renderers-CCOEGTZJ.mjs +0 -228
- package/dist/program-CqQDWfSV.mjs.map +0 -1
- package/dist/renderer-68XHoE2b.mjs +0 -5
- package/dist/renderer-AqUForA-.mjs +0 -5
- package/dist/renderer-B0J-uGBG.mjs +0 -5
- package/dist/renderer-BF2R0rwb.mjs +0 -5
- package/dist/renderer-BLrO9lqK.mjs +0 -5
- package/dist/renderer-BMy8jXhL.mjs +0 -5
- package/dist/renderer-BUxENp9L.mjs +0 -5
- package/dist/renderer-C-ebryrM.mjs +0 -5
- package/dist/renderer-C8Gbs3kr.mjs +0 -5
- package/dist/renderer-CFZvMv2-.mjs +0 -5
- package/dist/renderer-CGXW7mOs.mjs +0 -5
- package/dist/renderer-CNq6OGbb.mjs +0 -5
- package/dist/renderer-CO-Ddz6-.mjs +0 -5
- package/dist/renderer-CRdxAsP7.mjs +0 -5
- package/dist/renderer-CZLo0ALi.mjs +0 -5
- package/dist/renderer-CdvVUkhR.mjs +0 -5
- package/dist/renderer-Cjg7kmTq.mjs +0 -5
- package/dist/renderer-CxKymhVa.mjs +0 -5
- package/dist/renderer-Cxlpu3pN.mjs +0 -5
- package/dist/renderer-Cz6qZ2Ii.mjs +0 -5
- package/dist/renderer-DDGvF2YA.mjs +0 -5
- package/dist/renderer-DFxtOKpi.mjs +0 -5
- package/dist/renderer-DGBNjTsB.mjs +0 -6
- package/dist/renderer-DRLtfxdW.mjs.map +0 -1
- package/dist/renderer-DUFcdZmw.mjs +0 -5
- package/dist/renderer-DUMu6EOH.mjs +0 -5
- package/dist/renderer-DdULrvJo.mjs +0 -5
- package/dist/renderer-DoaOOP6_.mjs +0 -5
- package/dist/renderer-DqmZqV-a.mjs +0 -5
- package/dist/renderer-LxTQ2E-G.mjs +0 -5
- package/dist/renderer-SpU-RddZ.mjs +0 -5
- package/dist/renderer-W6ahCM9z.mjs +0 -5
- package/dist/renderer-gGqtzw-S.mjs +0 -5
- package/dist/renderer-l0Wn1AoV.mjs +0 -5
- package/dist/renderer-rpXHvMZG.mjs +0 -5
- package/dist/renderer-twdsKOiz.mjs +0 -5
- package/dist/renderer-uJz-eIqO.mjs +0 -5
- package/dist/src-DggYlKaX.mjs.map +0 -1
|
@@ -1,1974 +0,0 @@
|
|
|
1
|
-
import{a as Nd}from"./chunk-2YJ2EW2B.mjs";import{M as Yi,N as Xi,S as eu,T as tu,W as Rn,X as Nn,c as K,d as mt,v as qs,w as Rd,x as Zs,y as Ks}from"./chunk-3OXRGTQ2.mjs";import{a as An,b as Cn}from"./chunk-3F6JGYSP.mjs";import{a as Wi,b as Ws}from"./chunk-JJ7D26WR.mjs";import{a as Dn,c as Hs,d as Ys}from"./chunk-7EYVBRN3.mjs";import{o as Xs}from"./chunk-HPP52AQI.mjs";import{$ as wo,E as po,G as On,I as fo,J as Kt,K as ho,O as Bn,R as Ln,T as Qt,U as Mt,V as go,W as bo,X as et,Y as yo,_ as xo,aa as Tt,b as io,ba as vo,ca as So,da as ko,ea as Po,fa as Or,ga as Mo,ha as To,ia as Ao,ja as Co,ka as Do,l as oo,la as Br,m as ao,ma as dt,n as so,na as Ro,oa as No,p as Fr,pa as Fo,s as uo,w as lo,x as co,z as mo}from"./chunk-LLB3AGBQ.mjs";import{$ as Rr,S as ru,V as Ki,X as Fn,a as Xt,aa as Qi,ba as Ji,d as Ls,da as eo,e as Mn,ea as to,f as Pt,fa as ro,ga as Nr}from"./chunk-U2IFQMS3.mjs";import{a as Fd}from"./chunk-BREZX5L5.mjs";import{a as Zi}from"./chunk-OGSZZ4JO.mjs";import{a as qi}from"./chunk-LGQSJCKE.mjs";import{i as Gi}from"./chunk-6ISHV73H.mjs";import{c as Us}from"./chunk-6E3JSPJN.mjs";import{d as no}from"./chunk-2CECZN67.mjs";import{a as ue}from"./chunk-3DXMWDQ3.mjs";import{a as Js}from"./chunk-NIPWL6Z5.mjs";import{f as Es,i as Is,j as Vs,k as zs,n as Tn}from"./chunk-JXUENEQO.mjs";import{a as l}from"./chunk-6FULVULN.mjs";import{c as Qs}from"./chunk-P4Y3PMJF.mjs";import{h as js,j as $s}from"./chunk-RECQ74RP.mjs";import{e as qt}from"./chunk-32WC4FRR.mjs";import{a as Yt,l as Bs,t as Cr}from"./chunk-F4F2UDRX.mjs";import{a as Ve}from"./chunk-GN3NDRLI.mjs";import{j as Zt,y as Hi}from"./chunk-BJXNKMSY.mjs";import{m as Dr}from"./chunk-VEDMJBJV.mjs";import{r as be,t as Ui}from"./chunk-QEWDIPJ7.mjs";import{a as _s}from"./chunk-OGPJTUAL.mjs";import{a as Gs}from"./chunk-354GX6IB.mjs";import{c as $i,h as _i}from"./chunk-5RRKGN2U.mjs";import{o as G}from"./chunk-BDZ3TSOT.mjs";import{b as Os,d as Ar,f as x,g as h}from"./chunk-Y4NIR77Z.mjs";var _m=Os((rT,$m)=>{h();var Ci=()=>new Proxy(function(){},{get:(t,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":Ci(),apply:()=>Ci(),construct:()=>Ci()});$m.exports=Ci()});var id=Os((e3,nd)=>{h();var Ei=()=>new Proxy(function(){},{get:(t,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":Ei(),apply:()=>Ei(),construct:()=>Ei()});nd.exports=Ei()});h();h();h();h();var Od=t=>!t.source||t.source.type==="keyframe";function Lr(t){let e=[],r=new Map;for(let n of t){if(!Od(n)){e.push(n);continue}let i=r.get(n.prop);if(!i){let a={...n,keyframes:[...n.keyframes??[]]};r.set(n.prop,a),e.push(a);continue}let o=new Map(i.keyframes.map(a=>[a.frame,a]));for(let a of n.keyframes??[])o.set(a.frame,a);i.keyframes=[...o.values()].sort((a,s)=>a.frame-s.frame)}return e}function nu(t,e){if(!t)return e;let r=Oo(t);if(!r||r.name==="none")return e;let{name:n,dir:i,params:o}=r,a=Math.max(0,Math.min(1,e)),s=u=>i==="in"?u(a):i==="out"?1-u(1-a):a<.5?u(a*2)/2:1-u((1-a)*2)/2;switch(n){case"power1":return s(u=>u*u);case"power2":return s(u=>u*u*u);case"power3":return s(u=>u*u*u*u);case"sine":return s(u=>1-Math.cos(u*Math.PI/2));case"circ":return s(u=>1-Math.sqrt(Math.max(0,1-u*u)));case"expo":return s(u=>u===0?0:2**(10*(u-1)));case"back":{let u=o?.[0]??1.70158,c=u+1;return s(d=>c*d*d*d-u*d*d)}case"bounce":{let u=c=>{if(c<.36363636363636365)return 7.5625*c*c;if(c<.7272727272727273){let f=c-.5454545454545454;return 7.5625*f*f+.75}if(c<.9090909090909091){let f=c-.8181818181818182;return 7.5625*f*f+.9375}let p=c-2.625/2.75;return 7.5625*p*p+.984375};return i==="out"?u(a):i==="in"?1-u(1-a):a<.5?(1-u(1-2*a))/2:(1+u(2*a-1))/2}default:return a}}function Oo(t){if(t){if(typeof t=="object"&&"name"in t&&"dir"in t)return t;if(typeof t=="string"){let e=t.trim(),r=e.match(/^([a-zA-Z0-9]+)(?:\.([a-zA-Z]+))?(?:\(([^)]+)\))?$/);if(r){let u=r[1].toLowerCase(),c=u==="linear"?"none":u,d=(r[2]||"out").toLowerCase(),m="out";d==="in"?m="in":d==="out"?m="out":d==="inout"&&(m="inOut");let p;return r[3]&&(p=r[3].split(",").map(f=>Number.parseFloat(f.trim())).filter(f=>!Number.isNaN(f))),{name:c,dir:m,...p&&p.length>0?{params:p}:{}}}let n=e.indexOf(".");if(n===-1){let u=e.toLowerCase();return{name:u==="linear"?"none":u,dir:"out"}}let i=e.slice(0,n).toLowerCase(),o=i==="linear"?"none":i,a=e.slice(n+1).toLowerCase(),s="out";return a==="in"?s="in":a==="out"?s="out":a==="inout"&&(s="inOut"),{name:o,dir:s}}}}var re=class t{tracks=[];frameStep;defaultRepeat;defaultYoyo;constructor(e=[]){this.tracks=[...e]}static create(){return new t}static stepped(e=2){return new t().stepped(e)}stepped(e=2){return this.frameStep=Math.max(1,Math.min(24,Math.round(e))),this}static fromTo(e,r,n,i={}){return new t().fromTo(e,r,n,i)}static keys(e,r,n){return new t().keys(e,r,n)}static signal(e,r,n={}){return new t().signal(e,r,n)}static colorSignal(e,r,n){return new t().colorSignal(e,r,n)}static kineticSweep(e=-1,r=1,n=0,i=24,o="power2.out"){return new t().kineticSweep(e,r,n,i,o)}static typewriter(e=0,r=30,n="linear"){return new t().typewriter(e,r,n)}static letterSpacing(e,r,n=0,i=24,o="power2.out"){return new t().letterSpacing(e,r,n,i,o)}static wiggle(e,r={}){return new t().wiggle(e,r)}static spring(e,r={}){return new t().spring(e,r)}static firstMargin(e,r,n={}){return new t().firstMargin(e,r,n)}static strokeWidth(e,r,n={}){return new t().fromTo("strokeWidth",e,r,n)}static rotateX(e,r,n={}){return new t().fromTo("rotateX",e,r,n)}static rotateY(e,r,n={}){return new t().fromTo("rotateY",e,r,n)}static rotateZ(e,r,n={}){return new t().fromTo("rotateZ",e,r,n)}static rotation(e,r,n={}){return new t().fromTo("rotation",e,r,n)}static scale(e,r,n={}){return new t().fromTo("scale",e,r,n)}static scaleX(e,r,n={}){return new t().fromTo("scaleX",e,r,n)}static scaleY(e,r,n={}){return new t().fromTo("scaleY",e,r,n)}addTrack(e){return this.tracks.push(e),this}repeat(e=-1,r){this.defaultRepeat=e;for(let n of this.tracks)(!r||n.prop===r)&&(n.repeat=e);return this}yoyo(e=!0,r){this.defaultYoyo=e;for(let n of this.tracks)(!r||n.prop===r)&&(n.yoyo=e);return this}loop(e={},r){return this.repeat(-1,r),e.yoyo&&this.yoyo(!0,r),this}fromTo(e,r,n,i={}){let o=i.from??i.start??i.fromFrame??0,a=i.to??i.end??i.toFrame??(i.durationFrames!==void 0?o+i.durationFrames:o+24),s=Oo(i.ease),u=this.tracks.find(d=>d.prop===e&&(!d.source||d.source.type==="keyframe"));if(!u){let d={id:`${e}_fromTo_${this.tracks.length}`,prop:e,keyframes:[],...this.defaultRepeat!==void 0&&{repeat:this.defaultRepeat},...this.defaultYoyo!==void 0&&{yoyo:this.defaultYoyo}};this.tracks.push(d),u=d}i.repeat!==void 0&&(u.repeat=i.repeat),i.yoyo!==void 0&&(u.yoyo=i.yoyo),i.durationFrames!==void 0&&(u.durationFrames=i.durationFrames);let c=u.id;return u.keyframes.length===0&&o>0&&u.keyframes.push({id:`${c}_k0`,frame:0,value:r}),(u.keyframes.length===0||u.keyframes[u.keyframes.length-1].frame<o)&&u.keyframes.push({id:`${c}_k_${o}`,frame:o,value:r}),u.keyframes.push({id:`${c}_k_${a}`,frame:a,value:n,...s&&{ease:s}}),u.keyframes.sort((d,m)=>d.frame-m.frame),this}keyframe(e,r,n,i){let o=this.tracks.find(c=>c.prop===e&&(!c.source||c.source.type==="keyframe"));if(!o){let c={id:`${e}_track_${this.tracks.length}`,prop:e,keyframes:[],...this.defaultRepeat!==void 0&&{repeat:this.defaultRepeat},...this.defaultYoyo!==void 0&&{yoyo:this.defaultYoyo}};this.tracks.push(c),o=c}let a=Oo(i),s={id:`k_${o.keyframes.length}_f${r}`,frame:r,value:n,...a&&{ease:a}},u=o.keyframes.findIndex(c=>c.frame===r);return u>=0?o.keyframes[u]=s:o.keyframes.push(s),o.keyframes.sort((c,d)=>c.frame-d.frame),this}keys(e,r,n){for(let[i,o,a]of r)this.keyframe(e,Math.round(i),o,a);if(n){let i=this.tracks.find(o=>o.prop===e&&(!o.source||o.source.type==="keyframe"));i&&(n.repeat!==void 0&&(i.repeat=n.repeat),n.yoyo!==void 0&&(i.yoyo=n.yoyo),n.durationFrames!==void 0&&(i.durationFrames=n.durationFrames))}return this}fadeIn(e=0,r=20,n="power2.out"){return this.fromTo("opacity",0,1,{from:e,to:r,ease:n})}fadeOut(e,r,n="power2.in"){return this.fromTo("opacity",1,0,{from:e,to:r,ease:n})}slideInY(e,r,n=0,i=24,o="power2.out"){return this.fromTo("y",e,r,{from:n,to:i,ease:o})}slideInX(e,r,n=0,i=24,o="power2.out"){return this.fromTo("x",e,r,{from:n,to:i,ease:o})}kineticSweep(e=-1,r=1,n=0,i=24,o="power2.out"){return this.fromTo("offset",e,r,{from:n,to:i,ease:o})}typewriter(e=0,r=30,n="linear"){return this.fromTo("text",0,1,{from:e,to:r,ease:n})}letterSpacing(e,r,n=0,i=24,o="power2.out"){return this.fromTo("letterSpacing",e,r,{from:n,to:i,ease:o})}firstMargin(e,r,n={}){return this.fromTo("firstMargin",e,r,n)}lastMargin(e,r,n={}){return this.fromTo("lastMargin",e,r,n)}baselineShift(e,r,n={}){return this.fromTo("baselineShift",e,r,n)}rotateX(e,r,n={}){return this.fromTo("rotateX",e,r,n)}rotateY(e,r,n={}){return this.fromTo("rotateY",e,r,n)}rotateZ(e,r,n={}){return this.fromTo("rotateZ",e,r,n)}scaleX(e,r,n={}){return this.fromTo("scaleX",e,r,n)}scaleY(e,r,n={}){return this.fromTo("scaleY",e,r,n)}scale(e,r,n={}){return this.fromTo("scale",e,r,n)}perspective(e,r,n={}){return this.fromTo("perspective",e,r,n)}translateZ(e,r,n={}){return this.fromTo("translateZ",e,r,n)}tilt3D(e){let r=e.start??e.fromFrame,n=e.end??e.toFrame,i=e.ease,o=e.from??{},a=e.to,s=["rotateX","rotateY","rotateZ","translateZ","perspective"];for(let u of s){let c=a[u];if(c!==void 0){let d=o[u]??0;this.fromTo(u,d,c,{from:r,to:n,fromFrame:r,toFrame:n,ease:i})}}return this}signal(e,r,n={}){let{handleId:i,inline:o}=Yi(r),a=`${e}_sig_${i}_${this.tracks.length}`,s={type:"signal",inputHandleId:i,multiplier:n.multiplier??1,offset:n.offset??0,smoothingWindowFrames:n.smoothing??0,signalMode:n.mode??"continuous",threshold:n.threshold??.15,accumulateThreshold:n.threshold??.15,debounceFrames:n.debounceFrames??2,channel:n.channel??"primary"};return o&&Xi(s,o),this.tracks.push({id:a,prop:e,source:s,keyframes:[]}),this}colorSignal(e,r,n){let{handleId:i,inline:o}=Yi(r),a=`${e}_colorSig_${i}_${this.tracks.length}`,s={type:"signal",inputHandleId:i,multiplier:n.multiplier??1,offset:n.offset??0,smoothingWindowFrames:n.smoothing??0,colorMode:n.colorMode??"interpolate",colorA:n.colorA,colorB:n.colorB,colorThreshold:n.threshold,channel:"primary"};return o&&Xi(s,o),this.tracks.push({id:a,prop:e,source:s,keyframes:[]}),this}wiggle(e,r={}){let n=`${e}_wiggle_${this.tracks.length}`,i={type:"wiggle",frequency:r.frequency??2,amplitude:r.amplitude??20,octaves:r.octaves??1,seed:r.seed??1234};return this.tracks.push({id:n,prop:e,source:i,keyframes:[]}),this}spring(e,r={}){let n=`${e}_spring_${this.tracks.length}`,i={type:"springOvershoot",damping:r.damping??12,stiffness:r.stiffness??180,mass:r.mass??1};return this.tracks.push({id:n,prop:e,source:i,keyframes:[]}),this}followPath(e,r={}){let n=r.start??r.fromFrame??0,i=r.end??r.toFrame??60,o=Math.max(1,i-n),a=r.samples??Math.max(8,Math.min(60,Math.round(o/2))),s=e.totalLength??1,u=r.fromProgress??0,c=r.toProgress??1;r.fromDistance!==void 0&&s>0&&(u=r.fromDistance/s),r.toDistance!==void 0&&s>0&&(c=r.toDistance/s);let d=r.autoOrient??!0,m=r.banking??0,p=r.pitchOffset??0,f=r.yawOffset??0,b=r.rollOffset??0,g=!1,y=!1,k=!1,S=[];for(let M=0;M<=a;M++){let w=M/a,A=nu(r.ease,w),v=u+A*(c-u),N=Math.round(n+w*o),C=[0,0,0],O=[1,0,0],$=[0,0,0];if(typeof e.getFrameAt=="function"){let T=e.getFrameAt(v);C=T.position,O=T.tangent,$=T.rotation??[0,0,0]}else{let T=e.getPointAt(v);C=T.position,T.tangent&&(O=T.tangent);let W=Math.asin(Math.max(-1,Math.min(1,-O[1])))*(180/Math.PI),Y=Math.atan2(O[0],O[2])*(180/Math.PI),_=Math.atan2(O[1],O[0])*(180/Math.PI);$=[W,Y,_]}let z=$[0]+p,L=$[1]+f,P=(Math.abs(O[2])<1e-4?Math.atan2(O[1],O[0])*(180/Math.PI):$[2])+b;if(m!==0){let T=Math.min(1,v+.02),W=Math.max(0,v-.02),Y=e.getPointAt(T),_=e.getPointAt(W),V=Y.tangent??[1,0,0],ee=_.tangent??[1,0,0],oe=Math.atan2(V[0],V[2]),ge=Math.atan2(ee[0],ee[2]),ce=oe-ge;P-=ce*m*57.2958}Math.abs(C[2])>1e-4&&(g=!0),Math.abs(z)>1e-4&&(y=!0),Math.abs(L)>1e-4&&(k=!0),S.push({f:N,x:C[0],y:C[1],z:C[2],rx:z,ry:L,rz:P})}for(let M of S)this.keyframe("x",M.f,M.x),this.keyframe("y",M.f,M.y),g&&this.keyframe("z",M.f,M.z),d&&(this.keyframe("rotateZ",M.f,M.rz),y&&this.keyframe("rotateX",M.f,M.rx),k&&this.keyframe("rotateY",M.f,M.ry));return this}applyTo(e){return e.animation=this.toSpec(),e}merge(...e){return this.tracks=Lr([...this.tracks,...e.flatMap(r=>r.tracks)]),this}static merge(...e){let r=new t;return r.tracks=Lr(e.flatMap(n=>n.tracks)),r}toSpec(){return{tracks:this.tracks,...this.frameStep!==void 0&&{frameStep:this.frameStep}}}toJSON(){return this.toSpec()}},Bo=class t extends re{static camera(){return new t}dolly(e,r,n={}){if(typeof e=="object"){let i=e,o=i.start??i.fromFrame??0,a=i.end??i.toFrame??0;return this.fromTo("cameraZ",i.fromDistance,i.toDistance,{from:o,to:a,ease:i.ease})}return this.fromTo("cameraZ",e,r??e,n)}orbit(e){let r=e.start??e.fromFrame??0,n=e.end??e.toFrame??0;return e.azimuth&&this.fromTo("orbitAzimuth",e.azimuth.from??0,e.azimuth.to,{from:r,to:n,ease:e.ease}),e.elevation&&this.fromTo("orbitElevation",e.elevation.from??0,e.elevation.to,{from:r,to:n,ease:e.ease}),e.radius&&this.fromTo("orbitRadius",e.radius.from??1500,e.radius.to,{from:r,to:n,ease:e.ease}),this}truck(e,r,n={}){return this.fromTo("cameraX",e,r,n)}pedestal(e,r,n={}){return this.fromTo("cameraY",e,r,n)}pan(e,r,n={}){return this.fromTo("cameraYaw",e,r,n)}tilt(e,r,n={}){return this.fromTo("cameraPitch",e,r,n)}roll(e,r,n={}){return this.fromTo("cameraRoll",e,r,n)}rackFocus(e){let r=e.start??e.fromFrame??0,n=e.end??e.toFrame??0;return this.fromTo("focusDistance",e.fromDistance,e.toDistance,{from:r,to:n,ease:e.ease??"power2.inOut"}),e.toFStop!==void 0&&this.fromTo("fStop",e.fromFStop??2.8,e.toFStop,{from:r,to:n,ease:e.ease??"power2.inOut"}),this}handheld(e){let r=e.start??e.fromFrame??0,n=e.end??e.toFrame??0;return this.fromTo("shakeTranslation",0,e.translationAmplitude,{from:r,to:n}),this.fromTo("shakeRotation",0,e.rotationAmplitude,{from:r,to:n}),this}followPath3D(e,r={}){let n=r.start??r.fromFrame??0,i=r.end??r.toFrame??60,o=Math.max(1,i-n),a=r.samples??Math.max(8,Math.min(60,Math.round(o/2))),s=r.mode??(r.target?"lookAtTarget":"leadTarget"),u=r.fromProgress??0,c=r.toProgress??1,d=r.lookAhead??.05;for(let m=0;m<=a;m++){let p=m/a,f=nu(r.ease,p),b=u+f*(c-u),g=Math.round(n+p*o),y=[0,0,0],k=[0,0,0];if(typeof e.getFrameAt=="function"){let S=e.getFrameAt(b);y=S.position,k=S.rotation??[0,0,0]}else y=e.getPointAt(b).position;if(this.keyframe("cameraX",g,y[0]),this.keyframe("cameraY",g,y[1]),this.keyframe("cameraZ",g,y[2]),s==="lookAtTarget"){let S=r.target??[y[0],y[1],0];this.keyframe("targetX",g,S[0]),this.keyframe("targetY",g,S[1]),this.keyframe("targetZ",g,S[2])}else if(s==="leadTarget"){let S=Math.min(1,b+d),M=e.getPointAt(S);this.keyframe("targetX",g,M.position[0]),this.keyframe("targetY",g,M.position[1]),this.keyframe("targetZ",g,M.position[2])}else s==="orientAlongPath"&&(this.keyframe("cameraPitch",g,k[0]),this.keyframe("cameraYaw",g,k[1]),this.keyframe("cameraRoll",g,k[2]))}return this}};h();var Lo=class t{samples=[];frames=[];totalLength=0;constructor(e){if(e.length<2)throw new Error("Path3D requires at least 2 coordinate samples");this.samples=e,this.totalLength=e[e.length-1].distance,this.computeRotationMinimizingFrames()}computeRotationMinimizingFrames(){let e=this.samples.length;this.frames=new Array(e);let r=this.samples[0].tangent,n=[0,-1,0];Math.abs(K.dot(r,n))>.95&&(n=[0,0,1]);let i=K.normalize(K.subtract(n,K.multiplyScalar(r,K.dot(n,r))));K.lengthSq(i)<1e-4&&(i=[1,0,0]);let o=K.normalize(K.cross(r,i));this.frames[0]={normal:i,binormal:o,rotation:this.eulerFromFrame(r,i,o)};for(let a=0;a<e-1;a++){let s=this.samples[a].position,u=this.samples[a+1].position,c=this.samples[a].tangent,d=this.samples[a+1].tangent,m=this.frames[a].normal,p=K.subtract(u,s),f=K.dot(p,p),b;if(f>1e-8){let y=K.subtract(c,K.multiplyScalar(p,2*K.dot(p,c)/f)),k=K.subtract(m,K.multiplyScalar(p,2*K.dot(p,m)/f)),S=K.subtract(d,y),M=K.dot(S,S);M>1e-8?b=K.subtract(k,K.multiplyScalar(S,2*K.dot(S,k)/M)):b=k}else b=m;b=K.normalize(K.subtract(b,K.multiplyScalar(d,K.dot(d,b))));let g=K.normalize(K.cross(d,b));this.frames[a+1]={normal:b,binormal:g,rotation:this.eulerFromFrame(d,b,g)}}}eulerFromFrame(e,r,n){let i=Math.asin(Math.max(-1,Math.min(1,-e[1])))*(180/Math.PI),o=Math.atan2(e[0],e[2])*(180/Math.PI),a=Math.atan2(r[0],r[1])*(180/Math.PI);return[i,o,a]}getPointAt(e){let n=Math.max(0,Math.min(1,e))*this.totalLength;return this.getPointAtDistance(n)}getPointAtDistance(e){let r=Math.max(0,Math.min(this.totalLength,e)),n=this.samples.length,i=0,o=n-1;for(;i<o;){let M=i+o>>1;this.samples[M].distance<r?i=M+1:o=M}let a=Math.max(1,i),s=a-1,u=this.samples[s],c=this.samples[a],d=c.distance-u.distance,m=d>1e-6?(r-u.distance)/d:0,p=K.lerp(u.position,c.position,m),f=K.normalize(K.lerp(u.tangent,c.tangent,m)),b=this.frames[s],g=this.frames[a],y=K.normalize(K.lerp(b.normal,g.normal,m)),k=K.normalize(K.cross(f,y)),S=[b.rotation[0]+(g.rotation[0]-b.rotation[0])*m,b.rotation[1]+(g.rotation[1]-b.rotation[1])*m,b.rotation[2]+(g.rotation[2]-b.rotation[2])*m];return{position:p,tangent:f,normal:y,binormal:k,distance:r,t:this.totalLength>0?r/this.totalLength:0,rotation:S}}static catmullRom(e,r={}){if(e.length<2)throw new Error("Catmull-Rom spline requires at least 2 waypoints");let n=!!r.closed,i=r.samplesPerSegment??40,o=[];if(n)o.push(e[e.length-1]),o.push(...e),o.push(e[0]),o.push(e[1]);else{let u=e[0],c=e[1],d=e[e.length-1],m=e[e.length-2];o.push(K.subtract(u,K.subtract(c,u))),o.push(...e),o.push(K.add(d,K.subtract(d,m)))}let a=n?e.length:e.length-1,s=[];for(let u=0;u<a;u++){let c=o[u],d=o[u+1],m=o[u+2],p=o[u+3],f=u===a-1?i:i-1;for(let b=0;b<=f;b++){let g=b/i,y=g*g,k=y*g,S=-.5*k+y-.5*g,M=1.5*k-2.5*y+1,w=-1.5*k+2*y+.5*g,A=.5*k-.5*y,v=[S*c[0]+M*d[0]+w*m[0]+A*p[0],S*c[1]+M*d[1]+w*m[1]+A*p[1],S*c[2]+M*d[2]+w*m[2]+A*p[2]],N=-1.5*y+2*g-.5,C=4.5*y-5*g,O=-4.5*y+4*g+.5,$=1.5*y-1*g,z=[N*c[0]+C*d[0]+O*m[0]+$*p[0],N*c[1]+C*d[1]+O*m[1]+$*p[1],N*c[2]+C*d[2]+O*m[2]+$*p[2]],L=K.normalize(z);s.push({position:v,tangent:L})}}return t.fromRawSamples(s)}static fromRawSamples(e){let r=0,n=e.map((i,o)=>(o>0&&(r+=K.distance(i.position,e[o-1].position)),{position:i.position,tangent:i.tangent,distance:r}));if(n.length===0)throw new TypeError("Path3D needs samples");return new t(n)}static bezier(e,r=50){if(e.length===0)throw new Error("Bezier path requires at least 1 segment");let n=[];for(let i=0;i<e.length;i++){let o=e[i],a=i===e.length-1?r:r-1;for(let s=0;s<=a;s++){let u=s/r,c=1-u,d=c*c,m=d*c,p=u*u,f=p*u,b=[m*o.p0[0]+3*d*u*o.p1[0]+3*c*p*o.p2[0]+f*o.p3[0],m*o.p0[1]+3*d*u*o.p1[1]+3*c*p*o.p2[1]+f*o.p3[1],m*o.p0[2]+3*d*u*o.p1[2]+3*c*p*o.p2[2]+f*o.p3[2]],g=[3*d*(o.p1[0]-o.p0[0])+6*c*u*(o.p2[0]-o.p1[0])+3*p*(o.p3[0]-o.p2[0]),3*d*(o.p1[1]-o.p0[1])+6*c*u*(o.p2[1]-o.p1[1])+3*p*(o.p3[1]-o.p2[1]),3*d*(o.p1[2]-o.p0[2])+6*c*u*(o.p2[2]-o.p1[2])+3*p*(o.p3[2]-o.p2[2])],y=K.normalize(g);n.push({position:b,tangent:y})}}return t.fromRawSamples(n)}static helix(e){let{center:r,radius:n,pitch:i,turns:o,axis:a="z",samplesPerTurn:s=60}=e,u=Math.max(10,Math.round(o*s)),c=[];for(let d=0;d<=u;d++){let m=d/u,p=m*o*Math.PI*2,f=(m-.5)*i*o,b=Math.cos(p),g=Math.sin(p),y,k;a==="z"?(y=[r[0]+n*b,r[1]+n*g,r[2]+f],k=[-n*g,n*b,i*o/(o*Math.PI*2)]):a==="y"?(y=[r[0]+n*b,r[1]+f,r[2]+n*g],k=[-n*g,i*o/(o*Math.PI*2),n*b]):(y=[r[0]+f,r[1]+n*b,r[2]+n*g],k=[i*o/(o*Math.PI*2),-n*g,n*b]),c.push({position:y,tangent:K.normalize(k)})}return t.fromRawSamples(c)}static circle(e){let{center:r,radius:n,startAngleDeg:i=0,endAngleDeg:o=360,samples:a=128}=e,s=i*Math.PI/180,u=o*Math.PI/180,c=[];for(let d=0;d<=a;d++){let m=s+(u-s)*(d/a),p=Math.cos(m),f=Math.sin(m),b=[r[0]+n*p,r[1],r[2]+n*f],g=[-n*f,0,n*p];c.push({position:b,tangent:K.normalize(g)})}return t.fromRawSamples(c)}};h();var Eo=class t{name;props={};selectors=[];constructor(e){this.name=e}static create(e){return new t(e)}skew(e,r=0){return this.props.skew=e,this.props.skewAxis=r,this}anchor(e,r="character",n=0,i=0){return this.props.anchor={grouping:r,preset:e,anchorX:.5,anchorY:.5,offsetX:n,offsetY:i},this}anchorNormalized(e,r,n="character"){return this.props.anchor={grouping:n,preset:"custom",anchorX:e,anchorY:r,offsetX:0,offsetY:0},this}translateZ(e){return this.props.translateZ=e,this}tilt3D(e=0,r=0,n=0){return this.props.rotationX=e,this.props.rotationY=r,this.props.rotationZ=n,this}rotationX(e){return this.props.rotationX=e,this}rotationY(e){return this.props.rotationY=e,this}rotationZ(e){return this.props.rotationZ=e,this}volumetricFormation(e="cylinder",r=300,n=120,i=360,o=1200,a="y"){return this.props.formation={mode:e,radius:r,pitch:n,totalAngle:i,perspective:o,axis:a},this}lineSpacing(e,r=0){return this.props.lineSpacing=e,this.props.lineAnchor=r,this}lineAnchor(e){return this.props.lineAnchor=e,this}spring(e=180,r=12,n=1,i=0){return this.props.spring={stiffness:e,damping:r,mass:n,initialVelocity:i,overshootMultiplier:1},this}stroke(e,r="#ffffff",n=1){return this.props.stroke={strokeWidth:e,strokeColor:r,strokeAlign:"center",fillOpacity:n,dashOffset:0},this}variableFont(e){return this.props.variableAxes=e,this}chromaticGlitch(e,r=0,n=-e,i=0){return this.props.chromaticGlitch={redShiftX:e,redShiftY:r,blueShiftX:n,blueShiftY:i,sliceProbability:0,sliceAmplitude:0},this}audioSpectrum(e,r=60,n=16e3,i=2.5){return this.props.audioSpectrum={signalChannel:e,minFreqHz:r,maxFreqHz:n,scaleAxis:"scaleY",minScale:.2,maxScale:i,peakDecay:.8},this}longShadow(e=45,r=40,n="#000000",i=.8,o=0,a=16){return this.props.longShadow={angle:e,length:r,color:n,startOpacity:i,endOpacity:o,steps:a},this}particleDissolve(e=0,r=90,n=120){return this.props.particleDissolve={progress:e,dispersalAngle:r,maxDisplacement:n,turbulence:.5,particleSize:2},this}addExpressionSelector(e,r="add"){return this.selectors.push({type:"expression",expression:e,mode:r,amount:1}),this}expressionSelector(e,r="add"){return this.addExpressionSelector(e,r)}x(e){return this.props.x=e,this}y(e){return this.props.y=e,this}scale(e){return this.props.scale=e,this}scaleX(e){return this.props.scaleX=e,this}scaleY(e){return this.props.scaleY=e,this}rotation(e){return this.props.rotation=e,this}opacity(e){return this.props.opacity=e,this}blur(e){return this.props.blur=e,this}fillColor(e){return this.props.fillColor=e,this}build(){return{name:this.name,selectors:this.selectors,props:this.props}}};h();var iu=l.enum(["character","word","line","all"]),ou=l.enum(["center","baseline","bottom_left","bottom_center","bottom_right","top_left","top_center","top_right","custom"]),au=l.object({grouping:iu.default("character"),preset:ou.default("center"),anchorX:l.number().default(.5),anchorY:l.number().default(.5),offsetX:l.number().default(0),offsetY:l.number().default(0)}),Bd=l.object({skew:l.number().min(-90).max(90),skewAxis:l.number().default(0)}),Ld=l.object({lineSpacing:l.number(),lineAnchor:l.number().min(0).max(1).default(0)}),su=l.enum(["planar","vortex","cylinder","helix"]),Io=l.object({mode:su.default("planar"),radius:l.number().default(300),pitch:l.number().default(120),totalAngle:l.number().default(360),axis:l.enum(["x","y","z"]).default("y"),perspective:l.number().positive().default(1200)}),Ed=l.object({translateZ:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),rotationZ:l.number().optional(),formation:Io.optional()}),uu=l.object({stiffness:l.number().positive().default(180),damping:l.number().positive().default(12),mass:l.number().positive().default(1),initialVelocity:l.number().default(0),overshootMultiplier:l.number().min(.5).max(3).default(1)}),Id=l.object({type:l.literal("expression"),name:l.string().optional(),expression:l.string(),mode:l.enum(["add","subtract","intersect","min","max","difference"]).default("add"),amount:l.number().default(1)}),lu=l.object({strokeWidth:l.number().min(0).default(0),strokeColor:l.string().default("#ffffff"),strokeAlign:l.enum(["center","inside","outside"]).default("center"),fillOpacity:l.number().min(0).max(1).default(1),dashArray:l.tuple([l.number(),l.number()]).optional(),dashOffset:l.number().default(0)}),Vo=l.object({direction:l.enum(["left","right","up","down"]).default("left"),velocity:l.number().default(120),loop:l.boolean().default(!0),repeatGap:l.number().default(80),snap:l.object({enabled:l.boolean().default(!1),granularity:l.enum(["character","word","line"]).default("word"),stopIndex:l.number().default(0),decelEase:l.string().default("cubic.out")}).optional()}),cu=l.object({weight:l.number().min(100).max(1e3).optional(),width:l.number().min(50).max(200).optional(),slant:l.number().min(-25).max(25).optional(),italic:l.number().min(0).max(1).optional(),opticalSize:l.number().min(6).max(144).optional()}),mu=l.object({redShiftX:l.number().default(0),redShiftY:l.number().default(0),blueShiftX:l.number().default(0),blueShiftY:l.number().default(0),sliceProbability:l.number().min(0).max(1).default(0),sliceAmplitude:l.number().default(0)}),du=l.object({signalChannel:l.string(),minFreqHz:l.number().default(60),maxFreqHz:l.number().default(16e3),scaleAxis:l.enum(["scaleY","scaleX","scale","y"]).default("scaleY"),minScale:l.number().default(.2),maxScale:l.number().default(2.5),peakDecay:l.number().min(0).max(.99).default(.8)}),pu=l.object({angle:l.number().default(45),length:l.number().min(0).default(0),color:l.string().default("#000000"),startOpacity:l.number().min(0).max(1).default(.8),endOpacity:l.number().min(0).max(1).default(0),steps:l.number().int().min(4).max(64).default(16)}),fu=l.object({progress:l.number().min(0).max(1).default(0),dispersalAngle:l.number().default(90),maxDisplacement:l.number().default(120),turbulence:l.number().default(.5),particleSize:l.number().default(2)}),hu=l.object({x:l.number().optional(),y:l.number().optional(),translateZ:l.number().optional(),scale:l.number().optional(),scaleX:l.number().optional(),scaleY:l.number().optional(),rotation:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),rotationZ:l.number().optional(),formation:Io.optional(),skew:l.number().optional(),skewAxis:l.number().optional(),tracking:l.number().optional(),lineSpacing:l.number().optional(),lineAnchor:l.number().optional(),anchor:au.optional(),opacity:l.number().optional(),blur:l.number().optional(),fillColor:l.string().optional(),stroke:lu.optional(),variableAxes:cu.optional(),chromaticGlitch:mu.optional(),longShadow:pu.optional(),particleDissolve:fu.optional(),audioSpectrum:du.optional(),spring:uu.optional()}),zo=l.object({name:l.string().default("AdvancedAnimator"),selectors:l.array(l.record(l.string(),l.unknown())).default([]),props:hu});h();h();var Er=l.object({x:l.number(),y:l.number()}),gu=l.object({p0:Er,p1:Er,p2:Er,p3:Er}),bu=l.discriminatedUnion("type",[l.object({type:l.literal("svg"),d:l.string().min(1,"SVG path string cannot be empty")}),l.object({type:l.literal("bezier"),segments:l.array(gu).min(1)}),l.object({type:l.literal("ellipse"),cx:l.number(),cy:l.number(),rx:l.number().positive(),ry:l.number().positive(),startAngleDeg:l.number().default(0),endAngleDeg:l.number().default(360)}),l.object({type:l.literal("wave"),startX:l.number(),startY:l.number(),length:l.number().positive(),amplitude:l.number(),frequency:l.number().positive(),phaseDeg:l.number().default(0)})]),Jt=l.object({path:bu,firstMargin:l.number().default(0),lastMargin:l.number().default(0),reversePath:l.boolean().default(!1),perpendicularToPath:l.boolean().default(!0),forceAlignment:l.boolean().default(!1),loop:l.boolean().default(!1),baselineOffset:l.enum(["baseline","center","ascender","descender"]).default("baseline"),baselineShift:l.number().default(0)}),yu=l.enum(["bar","underscore","block","custom"]),xu=l.object({enabled:l.boolean().default(!0),style:yu.default("bar"),customChar:l.string().default("|"),color:l.string().optional(),blinkFrequency:l.number().min(0).default(2),hideOnComplete:l.boolean().default(!1),width:l.number().positive().default(2.5),spacing:l.number().default(3)}),wu=l.discriminatedUnion("mode",[l.object({mode:l.literal("constant")}),l.object({mode:l.literal("human"),jitter:l.number().min(0).max(1).default(.35),commaPauseMultiplier:l.number().min(1).default(3),sentencePauseMultiplier:l.number().min(1).default(5.5),paragraphPauseMultiplier:l.number().min(1).default(7)})]),vu=l.object({enabled:l.boolean().default(!1),charset:l.enum(["ascii","alphanumeric","matrix","binary","hex","custom"]).default("alphanumeric"),customCharset:l.string().optional(),scrambleFramesPerChar:l.number().int().min(1).default(8),highlightProbability:l.number().min(0).max(1).default(.25),scrambleColor:l.string().optional()}),En=l.object({granularity:l.enum(["character","word","line"]).default("character"),cursor:xu.default({enabled:!0,style:"bar",customChar:"|",blinkFrequency:2,hideOnComplete:!1,width:2.5,spacing:3}),cadence:wu.default({mode:"human",jitter:.35,commaPauseMultiplier:3,sentencePauseMultiplier:5.5,paragraphPauseMultiplier:7}),scramble:vu.default({enabled:!1,charset:"alphanumeric",scrambleFramesPerChar:8,highlightProbability:.25}),soundSync:l.boolean().default(!1)}),In=l.enum(["characters","characters_excluding_spaces","words","lines"]),Su=l.enum(["percentage","index"]),ku=l.enum(["square","ramp_up","ramp_down","triangle","round","smooth"]),Vn=l.enum(["add","subtract","intersect","min","max","difference"]),Pu=l.object({type:l.literal("range"),start:l.number().default(0),end:l.number().default(1),offset:l.number().default(0),units:Su.default("percentage"),basedOn:In.default("characters"),shape:ku.default("square"),mode:Vn.default("add"),amount:l.number().min(-1).max(1).default(1),easeHigh:l.number().min(-1).max(1).default(0),easeLow:l.number().min(-1).max(1).default(0),randomizeOrder:l.boolean().default(!1),randomSeed:l.number().int().default(12345)}),Mu=l.object({type:l.literal("wiggly"),wigglesPerSecond:l.number().positive().default(2),correlation:l.number().min(0).max(1).default(.5),temporalPhaseDeg:l.number().default(0),spatialPhaseDeg:l.number().default(0),minAmount:l.number().min(-1).max(1).default(-1),maxAmount:l.number().min(-1).max(1).default(1),randomSeed:l.number().int().default(42),basedOn:In.default("characters"),mode:Vn.default("intersect")}),Tu=l.object({type:l.literal("signal"),signalId:l.string(),multiplier:l.number().default(1),offset:l.number().default(0),phaseSpread:l.number().default(0),basedOn:In.default("characters"),mode:Vn.default("add")}),Au=l.discriminatedUnion("type",[Pu,Mu,Tu]),Cu=l.object({x:l.number().optional(),y:l.number().optional(),z:l.number().optional(),scale:l.number().optional(),scaleX:l.number().optional(),scaleY:l.number().optional(),rotation:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),skew:l.number().optional(),skewAxis:l.number().optional(),tracking:l.number().optional(),lineSpacing:l.number().optional(),opacity:l.number().min(0).max(1).optional(),fillColor:l.string().optional(),strokeColor:l.string().optional(),strokeWidth:l.number().min(0).optional(),blur:l.number().min(0).optional(),characterOffset:l.number().int().optional()}),Du=l.enum(["character","word","line","all"]),Ru=l.object({grouping:Du.default("character"),anchorX:l.number().default(.5),anchorY:l.number().default(.8)}),er=l.object({name:l.string().default("Animator"),selectors:l.array(Au).min(1),props:Cu,anchor:Ru.default({grouping:"character",anchorX:.5,anchorY:.8})}),Vd=l.object({text:l.string(),fontFamily:l.string().default("Inter"),fontSize:l.number().positive().default(24),fontWeight:l.union([l.number(),l.string()]).default(400),fill:l.string().default("#ffffff"),letterSpacing:l.number().default(0),lineHeight:l.number().positive().default(1.2),textAlign:l.enum(["left","center","right"]).default("left"),pathOptions:Jt.optional(),typewriter:En.optional(),animators:l.array(er).default([])});var jo=class t{options={firstMargin:0,lastMargin:0,reversePath:!1,perpendicularToPath:!0,forceAlignment:!1,loop:!1,baselineOffset:"baseline",baselineShift:0};static fromSvg(e){let r=new t;return r.options.path={type:"svg",d:e},r}static fromBezier(e){let r=new t;return r.options.path={type:"bezier",segments:e},r}static fromCurve(e){return t.fromBezier([e])}static circularBadge(e,r,n){let i=new t;return i.options.path={type:"ellipse",cx:e,cy:r,rx:n,ry:n,startAngleDeg:0,endAngleDeg:360},i.options.loop=!0,i}static ellipse(e,r,n,i,o=0,a=360){let s=new t;return s.options.path={type:"ellipse",cx:e,cy:r,rx:n,ry:i,startAngleDeg:o,endAngleDeg:a},s.options.loop=Math.abs(a-o)>=360,s}static wave(e,r,n,i,o,a=0){let s=new t;return s.options.path={type:"wave",startX:e,startY:r,length:n,amplitude:i,frequency:o,phaseDeg:a},s}firstMargin(e){return this.options.firstMargin=e,this}lastMargin(e){return this.options.lastMargin=e,this}reversePath(e){return this.options.reversePath=e,this}perpendicularToPath(e){return this.options.perpendicularToPath=e,this}forceAlignment(e){return this.options.forceAlignment=e,this}loop(e){return this.options.loop=e,this}baselineOffset(e){return this.options.baselineOffset=e,this}baselineShift(e){return this.options.baselineShift=e,this}build(){return Jt.parse(this.options)}},$o=class t{name="Animator";selectors=[];props={};anchor={grouping:"character",anchorX:.5,anchorY:.8};static create(e){let r=new t;return r.name=e,r}addRangeSelector(e){let r=e.easeHigh??0,n=Math.abs(r)>1?r/100:r,i=e.easeLow??0,o=Math.abs(i)>1?i/100:i;return this.selectors.push({type:"range",start:e.start??0,end:e.end??1,offset:e.offset??0,units:"percentage",basedOn:e.basedOn??"characters",shape:e.shape??"smooth",mode:e.mode??"add",amount:1,easeHigh:Math.max(-1,Math.min(1,n)),easeLow:Math.max(-1,Math.min(1,o)),randomizeOrder:e.randomizeOrder??!1,randomSeed:e.randomSeed??12345}),this}addWigglySelector(e){return this.selectors.push({type:"wiggly",wigglesPerSecond:e.wigglesPerSecond??2,correlation:e.correlation??.5,temporalPhaseDeg:0,spatialPhaseDeg:0,minAmount:e.minAmount??-1,maxAmount:e.maxAmount??1,randomSeed:e.randomSeed??42,basedOn:"characters",mode:e.mode??"intersect"}),this}addSignalSelector(e,r=1,n=0,i=0,o="add"){return this.selectors.push({type:"signal",signalId:e,multiplier:r,offset:i,phaseSpread:n,basedOn:"characters",mode:o}),this}x(e){return this.props.x=e,this}y(e){return this.props.y=e,this}z(e){return this.props.z=e,this}scale(e){return this.props.scale=e,this}scaleX(e){return this.props.scaleX=e,this}scaleY(e){return this.props.scaleY=e,this}rotation(e){return this.props.rotation=e,this}rotationX(e){return this.props.rotationX=e,this}rotationY(e){return this.props.rotationY=e,this}skew(e){return this.props.skew=e,this}skewAxis(e){return this.props.skewAxis=e,this}opacity(e){return this.props.opacity=e,this}blur(e){return this.props.blur=e,this}fill(e){return this.fillColor(e)}fillColor(e){return this.props.fillColor=e,this}strokeColor(e){return this.props.strokeColor=e,this}strokeWidth(e){return this.props.strokeWidth=e,this}tracking(e){return this.props.tracking=e,this}lineSpacing(e){return this.props.lineSpacing=e,this}characterOffset(e){return this.props.characterOffset=e,this}anchorGrouping(e,r=.5,n=.8){return this.anchor={grouping:e,anchorX:r,anchorY:n},this}build(){return er.parse({name:this.name,selectors:this.selectors,props:this.props,anchor:this.anchor})}};h();h();var Nu=`
|
|
2
|
-
struct CameraUniforms {
|
|
3
|
-
viewMatrix: mat4x4<f32>,
|
|
4
|
-
projMatrix: mat4x4<f32>,
|
|
5
|
-
viewProjMatrix: mat4x4<f32>,
|
|
6
|
-
invViewProjMatrix: mat4x4<f32>,
|
|
7
|
-
cameraPos: vec3<f32>,
|
|
8
|
-
near: f32,
|
|
9
|
-
cameraDir: vec3<f32>,
|
|
10
|
-
far: f32,
|
|
11
|
-
dofParams: vec4<f32>,
|
|
12
|
-
screenParams: vec4<f32>,
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
struct ModelUniforms {
|
|
16
|
-
modelMatrix: mat4x4<f32>,
|
|
17
|
-
normalMatrix: mat4x4<f32>,
|
|
18
|
-
colorTint: vec4<f32>,
|
|
19
|
-
params: vec4<f32>, // opacity, borderRadius, twoSided, unused
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
struct GlassUniforms {
|
|
23
|
-
// 0..15: ior, roughness, f0, transmission
|
|
24
|
-
ior: f32,
|
|
25
|
-
roughness: f32,
|
|
26
|
-
f0: f32,
|
|
27
|
-
transmission: f32,
|
|
28
|
-
// 16..31: dispersion, envIntensity, fresnelPower, unused
|
|
29
|
-
dispersion: f32,
|
|
30
|
-
envIntensity: f32,
|
|
31
|
-
fresnelPower: f32,
|
|
32
|
-
_pad0: f32,
|
|
33
|
-
// 32..47: viewportWidth, viewportHeight, unused, unused
|
|
34
|
-
viewportWidth: f32,
|
|
35
|
-
viewportHeight: f32,
|
|
36
|
-
_pad1: f32,
|
|
37
|
-
_pad2: f32,
|
|
38
|
-
// 48..63: tint (r, g, b, a)
|
|
39
|
-
tintColor: vec4<f32>,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
@group(0) @binding(0) var<uniform> camera: CameraUniforms;
|
|
43
|
-
@group(1) @binding(0) var<uniform> model: ModelUniforms;
|
|
44
|
-
@group(2) @binding(0) var<uniform> glass: GlassUniforms;
|
|
45
|
-
@group(3) @binding(0) var backdropSampler: sampler;
|
|
46
|
-
@group(3) @binding(1) var backdropTexture: texture_2d<f32>;
|
|
47
|
-
|
|
48
|
-
struct VertexInput {
|
|
49
|
-
@location(0) position: vec3<f32>,
|
|
50
|
-
@location(1) uv: vec2<f32>,
|
|
51
|
-
@location(2) normal: vec3<f32>,
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
struct VertexOutput {
|
|
55
|
-
@builtin(position) clipPos: vec4<f32>,
|
|
56
|
-
@location(0) worldPos: vec3<f32>,
|
|
57
|
-
@location(1) worldNormal: vec3<f32>,
|
|
58
|
-
@location(2) uv: vec2<f32>,
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
@vertex
|
|
62
|
-
fn vs_main(in: VertexInput) -> VertexOutput {
|
|
63
|
-
var out: VertexOutput;
|
|
64
|
-
let worldPos4 = model.modelMatrix * vec4<f32>(in.position, 1.0);
|
|
65
|
-
out.worldPos = worldPos4.xyz;
|
|
66
|
-
let normal4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
|
|
67
|
-
out.worldNormal = normalize(normal4.xyz);
|
|
68
|
-
out.uv = in.uv;
|
|
69
|
-
out.clipPos = camera.viewProjMatrix * worldPos4;
|
|
70
|
-
return out;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@fragment
|
|
74
|
-
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
|
|
75
|
-
let V = normalize(camera.cameraPos - in.worldPos);
|
|
76
|
-
var N = normalize(in.worldNormal);
|
|
77
|
-
|
|
78
|
-
// Dynamic normal flip for two-sided surfaces viewed from behind
|
|
79
|
-
if (dot(N, V) < 0.0) {
|
|
80
|
-
N = -N;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
let NdotV = max(dot(N, V), 0.0001);
|
|
84
|
-
|
|
85
|
-
// 1. Schlick Fresnel Reflectance
|
|
86
|
-
let F = glass.f0 + (1.0 - glass.f0) * pow(1.0 - NdotV, max(1.0, glass.fresnelPower));
|
|
87
|
-
|
|
88
|
-
// 2. Refraction Ray Direction with Chromatic Dispersion
|
|
89
|
-
let ior = max(1.0, glass.ior);
|
|
90
|
-
let disp = max(0.0, glass.dispersion);
|
|
91
|
-
let eta_g = 1.0 / ior;
|
|
92
|
-
let eta_r = 1.0 / max(1.0, ior - disp);
|
|
93
|
-
let eta_b = 1.0 / (ior + disp);
|
|
94
|
-
|
|
95
|
-
let R_refl = reflect(-V, N);
|
|
96
|
-
let R_refr_r = refract(-V, N, eta_r);
|
|
97
|
-
let R_refr_g = refract(-V, N, eta_g);
|
|
98
|
-
let R_refr_b = refract(-V, N, eta_b);
|
|
99
|
-
|
|
100
|
-
let screenUv = in.clipPos.xy / vec2<f32>(glass.viewportWidth, glass.viewportHeight);
|
|
101
|
-
|
|
102
|
-
// 3. Screen-Space Refraction Lookup with Chromatic Aberration Offset
|
|
103
|
-
let refractOffsetScale = 0.035 * (1.0 - glass.roughness * 0.4);
|
|
104
|
-
let uv_r = clamp(screenUv + R_refr_r.xy * refractOffsetScale, vec2<f32>(0.001), vec2<f32>(0.999));
|
|
105
|
-
let uv_g = clamp(screenUv + R_refr_g.xy * refractOffsetScale, vec2<f32>(0.001), vec2<f32>(0.999));
|
|
106
|
-
let uv_b = clamp(screenUv + R_refr_b.xy * refractOffsetScale, vec2<f32>(0.001), vec2<f32>(0.999));
|
|
107
|
-
|
|
108
|
-
// Roughness mip/jitter level
|
|
109
|
-
let mipLevel = glass.roughness * 5.0;
|
|
110
|
-
let sampleR = textureSampleLevel(backdropTexture, backdropSampler, uv_r, mipLevel).r;
|
|
111
|
-
let sampleG = textureSampleLevel(backdropTexture, backdropSampler, uv_g, mipLevel).g;
|
|
112
|
-
let sampleB = textureSampleLevel(backdropTexture, backdropSampler, uv_b, mipLevel).b;
|
|
113
|
-
|
|
114
|
-
let transmittedColor = vec3<f32>(sampleR, sampleG, sampleB) * glass.tintColor.rgb * model.colorTint.rgb;
|
|
115
|
-
|
|
116
|
-
// 4. Procedural Studio HDRI Environment Reflection (Warm key + cool rim highlights)
|
|
117
|
-
let envAngle = atan2(R_refl.z, R_refl.x);
|
|
118
|
-
let envElevation = R_refl.y;
|
|
119
|
-
let studioKey = pow(max(0.0, dot(R_refl, normalize(vec3<f32>(0.6, 0.8, -0.5)))), 32.0) * 1.5;
|
|
120
|
-
let studioRim = pow(max(0.0, dot(R_refl, normalize(vec3<f32>(-0.7, 0.3, 0.6)))), 16.0) * 0.8;
|
|
121
|
-
let ambientSky = mix(vec3<f32>(0.92, 0.94, 0.98), vec3<f32>(0.98, 0.96, 0.92), envElevation * 0.5 + 0.5);
|
|
122
|
-
let envColor = (ambientSky * 0.6 + vec3<f32>(1.0, 0.98, 0.95) * studioKey + vec3<f32>(0.85, 0.92, 1.0) * studioRim) * glass.envIntensity;
|
|
123
|
-
|
|
124
|
-
// 5. Energy-Conserving Blend with Premultiplied Alpha
|
|
125
|
-
let blendedRGB = mix(transmittedColor, envColor, F);
|
|
126
|
-
let alpha = clamp((F + (1.0 - glass.transmission) * 0.6) * model.params.x, 0.0, 1.0);
|
|
127
|
-
|
|
128
|
-
return vec4<f32>(blendedRGB * alpha, alpha);
|
|
129
|
-
}
|
|
130
|
-
`;var _o=class{device;pipeline;cameraLayout;modelLayout;glassLayout;backdropLayout;modelPool;glassPool;vertexBuffer;indexBuffer;modelData=new Float32Array(40);glassData=new Float32Array(16);constructor(e,r,n="depth24plus",i){this.device=e,this.modelPool=new Hi(160,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.glassPool=new Hi(64,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let o=e.createShaderModule({label:"pbr-glass.wgsl",code:Nu});this.cameraLayout=i??e.createBindGroupLayout({label:"GlassCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"GlassModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.glassLayout=e.createBindGroupLayout({label:"GlassUniformLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.backdropLayout=e.createBindGroupLayout({label:"GlassBackdropLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]});let a=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.glassLayout,this.backdropLayout]});this.pipeline=e.createRenderPipeline({label:"PBRGlassPipeline",layout:a,vertex:{module:o,entryPoint:"vs_main",buffers:[{arrayStride:32,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"}]}]},fragment:{module:o,entryPoint:"fs_main",targets:[{format:r,blend:Xs}]},depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"}});let s=new Float32Array([-.5,-.5,0,0,0,0,0,-1,.5,-.5,0,1,0,0,0,-1,.5,.5,0,1,1,0,0,-1,-.5,.5,0,0,1,0,0,-1]),u=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=e.createBuffer({size:s.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(s),this.vertexBuffer.unmap(),this.indexBuffer=e.createBuffer({size:u.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(u),this.indexBuffer.unmap()}resetPools(){this.modelPool.reset(),this.glassPool.reset()}draw(e,r,n,i,o){qs(this.modelData,o.modelMatrix,o.normalMatrix,o.colorTint),this.modelData[36]=o.opacity??1,this.modelData[37]=0,this.modelData[38]=1,this.modelData[39]=0;let a=this.modelPool.getBuffer(this.device,this.modelData);this.glassData[0]=o.ior??1.49,this.glassData[1]=o.roughness??.15,this.glassData[2]=o.f0??.04,this.glassData[3]=o.transmission??.92,this.glassData[4]=o.dispersion??.015,this.glassData[5]=o.envIntensity??.65,this.glassData[6]=o.fresnelPower??5,this.glassData[7]=0,this.glassData[8]=o.viewportWidth,this.glassData[9]=o.viewportHeight,this.glassData[10]=0,this.glassData[11]=0;let s=o.tintColor??[1,1,1,1];this.glassData[12]=s[0],this.glassData[13]=s[1],this.glassData[14]=s[2],this.glassData[15]=s[3];let u=this.glassPool.getBuffer(this.device,this.glassData),c=this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:a}}]}),d=this.device.createBindGroup({layout:this.glassLayout,entries:[{binding:0,resource:{buffer:u}}]}),m=this.device.createBindGroup({layout:this.backdropLayout,entries:[{binding:0,resource:i},{binding:1,resource:n.createView()}]});e.setPipeline(this.pipeline),e.setBindGroup(0,r),e.setBindGroup(1,c),e.setBindGroup(2,d),e.setBindGroup(3,m),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}destroy(){this.modelPool.destroy(),this.glassPool.destroy(),this.vertexBuffer.destroy(),this.indexBuffer.destroy()}};h();h();var Fu=`
|
|
131
|
-
struct MotionBlurUniforms {
|
|
132
|
-
shutterFraction: f32, // shutterAngle / 360.0
|
|
133
|
-
sampleCount: u32, // e.g. 16
|
|
134
|
-
maxVelocity: f32, // in pixels
|
|
135
|
-
tileDilation: u32,
|
|
136
|
-
viewportWidth: f32,
|
|
137
|
-
viewportHeight: f32,
|
|
138
|
-
depthThreshold: f32,
|
|
139
|
-
curveType: u32, // 0: box, 1: gaussian, 2: triangle
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
@group(0) @binding(0) var colorTexture: texture_2d<f32>;
|
|
143
|
-
@group(0) @binding(1) var velocityTexture: texture_2d<f32>;
|
|
144
|
-
@group(0) @binding(2) var depthTexture: texture_depth_2d;
|
|
145
|
-
@group(0) @binding(3) var colorSampler: sampler;
|
|
146
|
-
@group(0) @binding(4) var<uniform> u: MotionBlurUniforms;
|
|
147
|
-
|
|
148
|
-
fn computeVertexPos(vertexIndex: u32) -> vec4<f32> {
|
|
149
|
-
var pos = array<vec2<f32>, 4>(
|
|
150
|
-
vec2<f32>(-1.0, -1.0),
|
|
151
|
-
vec2<f32>( 1.0, -1.0),
|
|
152
|
-
vec2<f32>(-1.0, 1.0),
|
|
153
|
-
vec2<f32>( 1.0, 1.0)
|
|
154
|
-
);
|
|
155
|
-
return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
@vertex
|
|
159
|
-
fn vs(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
|
|
160
|
-
return computeVertexPos(vertexIndex);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
@vertex
|
|
164
|
-
fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
|
|
165
|
-
return computeVertexPos(vertexIndex);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
fn executeMotionBlur(pos: vec4<f32>) -> vec4<f32> {
|
|
169
|
-
let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
|
|
170
|
-
let centerDepth = textureLoad(depthTexture, vec2<i32>(pos.xy), 0);
|
|
171
|
-
let rawVel = textureSampleLevel(velocityTexture, colorSampler, uv, 0.0).xy;
|
|
172
|
-
|
|
173
|
-
// Scale velocity by shutter exposure fraction
|
|
174
|
-
var vel = rawVel * u.shutterFraction;
|
|
175
|
-
let speed = length(vel);
|
|
176
|
-
|
|
177
|
-
if (speed < 0.5) {
|
|
178
|
-
return textureSampleLevel(colorTexture, colorSampler, uv, 0.0);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Clamp to configured max velocity limit
|
|
182
|
-
if (speed > u.maxVelocity) {
|
|
183
|
-
vel = (vel / speed) * u.maxVelocity;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
let velUV = vel / vec2<f32>(u.viewportWidth, u.viewportHeight);
|
|
187
|
-
let halfSamples = f32(u.sampleCount) * 0.5;
|
|
188
|
-
|
|
189
|
-
var accumColor = vec4<f32>(0.0);
|
|
190
|
-
var totalWeight = 0.0;
|
|
191
|
-
|
|
192
|
-
for (var i = 0u; i < u.sampleCount; i = i + 1u) {
|
|
193
|
-
let t = (f32(i) - halfSamples) / halfSamples;
|
|
194
|
-
let sampleUV = uv + velUV * t;
|
|
195
|
-
|
|
196
|
-
if (sampleUV.x < 0.0 || sampleUV.x > 1.0 || sampleUV.y < 0.0 || sampleUV.y > 1.0) {
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
let sampleDepth = textureSampleLevel(depthTexture, colorSampler, sampleUV, 0);
|
|
201
|
-
let depthDelta = abs(sampleDepth - centerDepth);
|
|
202
|
-
let depthWeight = clamp(1.0 - depthDelta / max(u.depthThreshold, 0.0001), 0.05, 1.0);
|
|
203
|
-
|
|
204
|
-
var curveW = 1.0;
|
|
205
|
-
if (u.curveType == 1u) {
|
|
206
|
-
curveW = exp(-2.5 * t * t);
|
|
207
|
-
} else if (u.curveType == 2u) {
|
|
208
|
-
curveW = 1.0 - abs(t);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
let w = curveW * depthWeight;
|
|
212
|
-
let sampleCol = textureSampleLevel(colorTexture, colorSampler, sampleUV, 0.0);
|
|
213
|
-
|
|
214
|
-
accumColor += sampleCol * w;
|
|
215
|
-
totalWeight += w;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (totalWeight <= 0.0) {
|
|
219
|
-
return textureSampleLevel(colorTexture, colorSampler, uv, 0.0);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
return accumColor / totalWeight;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
@fragment
|
|
226
|
-
fn fs(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
|
|
227
|
-
return executeMotionBlur(pos);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
@fragment
|
|
231
|
-
fn fs_motion_blur(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> {
|
|
232
|
-
return executeMotionBlur(pos);
|
|
233
|
-
}
|
|
234
|
-
`;var Uo=class{device;pipeline;bindGroupLayout;uniformBuffer;sampler;constructor(e){this.device=e;let r=e.createShaderModule({label:"motion-blur-shader",code:Fu});this.bindGroupLayout=e.createBindGroupLayout({label:"motion-blur-bgl",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:4,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]});let n=e.createPipelineLayout({label:"motion-blur-layout",bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=e.createRenderPipeline({label:"motion-blur-pipeline",layout:n,vertex:{module:r,entryPoint:"vs_main"},fragment:{module:r,entryPoint:"fs_motion_blur",targets:[{format:"rgba8unorm",blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-strip"}}),this.uniformBuffer=e.createBuffer({label:"motion-blur-uniforms",size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.sampler=e.createSampler({label:"motion-blur-sampler",magFilter:"linear",minFilter:"linear"})}render(e,r,n,i,o,a){let s=(a.shutterAngle??180)/360,u=a.sampleCount??16,c=a.maxVelocity??64,d=a.depthThreshold??.05,m=a.curveType==="box"?0:a.curveType==="triangle"?2:1,p=new ArrayBuffer(32),f=new Float32Array(p),b=new Uint32Array(p);f[0]=s,b[1]=u,f[2]=c,b[3]=16,f[4]=a.width,f[5]=a.height,f[6]=d,b[7]=m,this.device.queue.writeBuffer(this.uniformBuffer,0,p);let g=this.device.createBindGroup({label:"motion-blur-bg",layout:this.bindGroupLayout,entries:[{binding:0,resource:r},{binding:1,resource:n},{binding:2,resource:i},{binding:3,resource:this.sampler},{binding:4,resource:{buffer:this.uniformBuffer}}]}),y=e.beginRenderPass({label:"motion-blur-pass",colorAttachments:[{view:o,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});y.setPipeline(this.pipeline),y.setBindGroup(0,g),y.draw(4),y.end()}destroy(){this.uniformBuffer.destroy()}};h();var Go=class{shadowDepthTexture;shadowDepthView;shadowComparisonSampler;lightViewProjMatrix;constructor(e,r=2048){this.lightViewProjMatrix=mt.identity(),this.shadowDepthTexture=e.createTexture({label:"shadow-depth-map",size:[r,r,1],format:"depth32float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),this.shadowDepthView=this.shadowDepthTexture.createView({label:"shadow-depth-view"}),this.shadowComparisonSampler=e.createSampler({label:"shadow-pcf-sampler",compare:"less-equal",magFilter:"linear",minFilter:"linear"})}computeDirectionalLightMatrix(e,r,n=2e3,i=10,o=4e3){let a=mt.lookAt(e,r,[0,1,0]),s=n*.5,u=mt.orthographic(-s,s,-s,s,i,o);return this.lightViewProjMatrix=mt.multiply(u,a),this.lightViewProjMatrix}destroy(){this.shadowDepthTexture.destroy()}};h();h();var Ou=`
|
|
235
|
-
struct SSAOUniforms {
|
|
236
|
-
projMatrix: mat4x4<f32>,
|
|
237
|
-
invProjMatrix: mat4x4<f32>,
|
|
238
|
-
viewMatrix: mat4x4<f32>,
|
|
239
|
-
radius: f32,
|
|
240
|
-
bias: f32,
|
|
241
|
-
intensity: f32,
|
|
242
|
-
sampleCount: u32,
|
|
243
|
-
viewportWidth: f32,
|
|
244
|
-
viewportHeight: f32,
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
@group(0) @binding(0) var depthTexture: texture_depth_2d;
|
|
248
|
-
@group(0) @binding(1) var normalTexture: texture_2d<f32>;
|
|
249
|
-
@group(0) @binding(2) var noiseTexture: texture_2d<f32>;
|
|
250
|
-
@group(0) @binding(3) var colorSampler: sampler;
|
|
251
|
-
@group(0) @binding(4) var<storage, read> kernelSamples: array<vec4<f32>>;
|
|
252
|
-
@group(0) @binding(5) var<uniform> u: SSAOUniforms;
|
|
253
|
-
|
|
254
|
-
@vertex
|
|
255
|
-
fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
|
|
256
|
-
var pos = array<vec2<f32>, 4>(
|
|
257
|
-
vec2<f32>(-1.0, -1.0),
|
|
258
|
-
vec2<f32>( 1.0, -1.0),
|
|
259
|
-
vec2<f32>(-1.0, 1.0),
|
|
260
|
-
vec2<f32>( 1.0, 1.0)
|
|
261
|
-
);
|
|
262
|
-
return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
fn reconstructViewPos(uv: vec2<f32>, depth: f32) -> vec3<f32> {
|
|
266
|
-
let clipPos = vec4<f32>(uv.x * 2.0 - 1.0, (1.0 - uv.y) * 2.0 - 1.0, depth, 1.0);
|
|
267
|
-
let viewPos = u.invProjMatrix * clipPos;
|
|
268
|
-
return viewPos.xyz / viewPos.w;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
@fragment
|
|
272
|
-
fn fs_ssao(@builtin(position) pos: vec4<f32>) -> @location(0) f32 {
|
|
273
|
-
let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
|
|
274
|
-
let depth = textureSampleLevel(depthTexture, colorSampler, uv, 0);
|
|
275
|
-
|
|
276
|
-
if (depth >= 1.0) {
|
|
277
|
-
return 1.0;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
let rawNormal = textureSampleLevel(normalTexture, colorSampler, uv, 0.0).xyz;
|
|
281
|
-
let normal = normalize(rawNormal * 2.0 - 1.0);
|
|
282
|
-
let viewPos = reconstructViewPos(uv, depth);
|
|
283
|
-
|
|
284
|
-
let noiseUV = pos.xy / 4.0;
|
|
285
|
-
let randomVec = normalize(textureSampleLevel(noiseTexture, colorSampler, noiseUV, 0.0).xyz * 2.0 - 1.0);
|
|
286
|
-
|
|
287
|
-
let tangent = normalize(randomVec - normal * dot(randomVec, normal));
|
|
288
|
-
let bitangent = cross(normal, tangent);
|
|
289
|
-
let TBN = mat3x3<f32>(tangent, bitangent, normal);
|
|
290
|
-
|
|
291
|
-
var occlusion = 0.0;
|
|
292
|
-
let count = min(u.sampleCount, arrayLength(&kernelSamples));
|
|
293
|
-
|
|
294
|
-
for (var i = 0u; i < count; i = i + 1u) {
|
|
295
|
-
let sampleDir = TBN * kernelSamples[i].xyz;
|
|
296
|
-
let samplePos = viewPos + sampleDir * u.radius;
|
|
297
|
-
|
|
298
|
-
let offset = u.projMatrix * vec4<f32>(samplePos, 1.0);
|
|
299
|
-
var sampleUV = vec2<f32>(
|
|
300
|
-
(offset.x / offset.w) * 0.5 + 0.5,
|
|
301
|
-
(1.0 - (offset.y / offset.w)) * 0.5
|
|
302
|
-
);
|
|
303
|
-
|
|
304
|
-
if (sampleUV.x < 0.0 || sampleUV.x > 1.0 || sampleUV.y < 0.0 || sampleUV.y > 1.0) {
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
let sampleDepthVal = textureSampleLevel(depthTexture, colorSampler, sampleUV, 0);
|
|
309
|
-
let sampleViewZ = reconstructViewPos(sampleUV, sampleDepthVal).z;
|
|
310
|
-
|
|
311
|
-
let rangeCheck = smoothstep(0.0, 1.0, u.radius / max(abs(viewPos.z - sampleViewZ), 0.001));
|
|
312
|
-
if (sampleViewZ >= samplePos.z + u.bias) {
|
|
313
|
-
occlusion += rangeCheck;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
let ao = 1.0 - (occlusion / f32(max(count, 1u))) * u.intensity;
|
|
318
|
-
return clamp(ao, 0.0, 1.0);
|
|
319
|
-
}
|
|
320
|
-
`,Bu=`
|
|
321
|
-
struct BlurUniforms {
|
|
322
|
-
viewportWidth: f32,
|
|
323
|
-
viewportHeight: f32,
|
|
324
|
-
blurRadius: i32,
|
|
325
|
-
depthThreshold: f32,
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
@group(0) @binding(0) var ssaoTexture: texture_2d<f32>;
|
|
329
|
-
@group(0) @binding(1) var depthTexture: texture_depth_2d;
|
|
330
|
-
@group(0) @binding(2) var colorSampler: sampler;
|
|
331
|
-
@group(0) @binding(3) var<uniform> u: BlurUniforms;
|
|
332
|
-
|
|
333
|
-
@vertex
|
|
334
|
-
fn vs_main(@builtin(vertex_index) vertexIndex: u32) -> @builtin(position) vec4<f32> {
|
|
335
|
-
var pos = array<vec2<f32>, 4>(
|
|
336
|
-
vec2<f32>(-1.0, -1.0),
|
|
337
|
-
vec2<f32>( 1.0, -1.0),
|
|
338
|
-
vec2<f32>(-1.0, 1.0),
|
|
339
|
-
vec2<f32>( 1.0, 1.0)
|
|
340
|
-
);
|
|
341
|
-
return vec4<f32>(pos[vertexIndex], 0.0, 1.0);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
@fragment
|
|
345
|
-
fn fs_blur(@builtin(position) pos: vec4<f32>) -> @location(0) f32 {
|
|
346
|
-
let uv = pos.xy / vec2<f32>(u.viewportWidth, u.viewportHeight);
|
|
347
|
-
let centerDepth = textureSampleLevel(depthTexture, colorSampler, uv, 0);
|
|
348
|
-
let centerAO = textureSampleLevel(ssaoTexture, colorSampler, uv, 0.0).r;
|
|
349
|
-
|
|
350
|
-
if (centerDepth >= 1.0) {
|
|
351
|
-
return 1.0;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
var result = 0.0;
|
|
355
|
-
var totalWeight = 0.0;
|
|
356
|
-
let texelSize = 1.0 / vec2<f32>(u.viewportWidth, u.viewportHeight);
|
|
357
|
-
let r = u.blurRadius;
|
|
358
|
-
|
|
359
|
-
for (var x = -r; x <= r; x = x + 1) {
|
|
360
|
-
for (var y = -r; y <= r; y = y + 1) {
|
|
361
|
-
let offsetUV = uv + vec2<f32>(f32(x), f32(y)) * texelSize;
|
|
362
|
-
let sampleDepth = textureSampleLevel(depthTexture, colorSampler, offsetUV, 0);
|
|
363
|
-
let depthDelta = abs(sampleDepth - centerDepth);
|
|
364
|
-
|
|
365
|
-
let spatialW = exp(-f32(x * x + y * y) / f32(2 * r * r));
|
|
366
|
-
let depthW = clamp(1.0 - depthDelta / max(u.depthThreshold, 0.0001), 0.0, 1.0);
|
|
367
|
-
let w = spatialW * depthW;
|
|
368
|
-
|
|
369
|
-
let sampleAO = textureSampleLevel(ssaoTexture, colorSampler, offsetUV, 0.0).r;
|
|
370
|
-
result += sampleAO * w;
|
|
371
|
-
totalWeight += w;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
if (totalWeight <= 0.0) {
|
|
376
|
-
return centerAO;
|
|
377
|
-
}
|
|
378
|
-
return result / totalWeight;
|
|
379
|
-
}
|
|
380
|
-
`;var Wo=class{device;ssaoPipeline;blurPipeline;ssaoBindGroupLayout;blurBindGroupLayout;ssaoUniformBuffer;blurUniformBuffer;kernelBuffer;noiseTexture;sampler;constructor(e){this.device=e,this.noiseTexture=e.createTexture({label:"ssao-noise-tex",size:[4,4,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});let r=new Uint8Array(64);for(let a=0;a<16;a++)r[a*4+0]=Math.floor(Math.random()*255),r[a*4+1]=Math.floor(Math.random()*255),r[a*4+2]=128,r[a*4+3]=255;e.queue.writeTexture({texture:this.noiseTexture},r,{bytesPerRow:16},[4,4,1]);let n=new Float32Array(128);for(let a=0;a<32;a++){let s=Math.random(),u=Math.random(),c=Math.acos(Math.sqrt(1-s)),d=2*Math.PI*u,m=(a+1)/32;m=.1+.9*(m*m),n[a*4+0]=Math.sin(c)*Math.cos(d)*m,n[a*4+1]=Math.sin(c)*Math.sin(d)*m,n[a*4+2]=Math.cos(c)*m,n[a*4+3]=0}this.kernelBuffer=e.createBuffer({label:"ssao-kernel-buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),e.queue.writeBuffer(this.kernelBuffer,0,n);let i=e.createShaderModule({label:"ssao-shader",code:Ou});this.ssaoBindGroupLayout=e.createBindGroupLayout({label:"ssao-bgl",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:4,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.ssaoPipeline=e.createRenderPipeline({label:"ssao-eval-pipeline",layout:e.createPipelineLayout({bindGroupLayouts:[this.ssaoBindGroupLayout]}),vertex:{module:i,entryPoint:"vs_main"},fragment:{module:i,entryPoint:"fs_ssao",targets:[{format:"r8unorm"}]},primitive:{topology:"triangle-strip"}}),this.ssaoUniformBuffer=e.createBuffer({label:"ssao-uniforms",size:256,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let o=e.createShaderModule({label:"ssao-blur-shader",code:Bu});this.blurBindGroupLayout=e.createBindGroupLayout({label:"ssao-blur-bgl",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.blurPipeline=e.createRenderPipeline({label:"ssao-blur-pipeline",layout:e.createPipelineLayout({bindGroupLayouts:[this.blurBindGroupLayout]}),vertex:{module:o,entryPoint:"vs_main"},fragment:{module:o,entryPoint:"fs_blur",targets:[{format:"r8unorm"}]},primitive:{topology:"triangle-strip"}}),this.blurUniformBuffer=e.createBuffer({label:"ssao-blur-uniforms",size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.sampler=e.createSampler({label:"ssao-sampler",magFilter:"linear",minFilter:"linear",addressModeU:"repeat",addressModeV:"repeat"})}render(e,r,n,i,o,a){let s=a.invProjMatrix??mt.invert(a.projMatrix)??mt.identity(),u=new Float32Array(64);u.set(a.projMatrix,0),u.set(s,16),u.set(a.viewMatrix,32),u[48]=a.radius??45,u[49]=a.bias??.025,u[50]=a.intensity??1.5,new Uint32Array(u.buffer)[51]=a.kernelSamples??16,u[52]=a.width,u[53]=a.height,this.device.queue.writeBuffer(this.ssaoUniformBuffer,0,u);let c=this.device.createBindGroup({label:"ssao-eval-bg",layout:this.ssaoBindGroupLayout,entries:[{binding:0,resource:r},{binding:1,resource:n},{binding:2,resource:this.noiseTexture.createView()},{binding:3,resource:this.sampler},{binding:4,resource:{buffer:this.kernelBuffer}},{binding:5,resource:{buffer:this.ssaoUniformBuffer}}]}),d=e.beginRenderPass({label:"ssao-eval-pass",colorAttachments:[{view:i,loadOp:"clear",storeOp:"store",clearValue:{r:1,g:1,b:1,a:1}}]});d.setPipeline(this.ssaoPipeline),d.setBindGroup(0,c),d.draw(4),d.end();let m=new ArrayBuffer(32),p=new Float32Array(m),f=new Int32Array(m);p[0]=a.width,p[1]=a.height,f[2]=a.blurRadius??4,p[3]=a.depthThreshold??.05,this.device.queue.writeBuffer(this.blurUniformBuffer,0,m);let b=this.device.createBindGroup({label:"ssao-blur-bg",layout:this.blurBindGroupLayout,entries:[{binding:0,resource:i},{binding:1,resource:r},{binding:2,resource:this.sampler},{binding:3,resource:{buffer:this.blurUniformBuffer}}]}),g=e.beginRenderPass({label:"ssao-blur-pass",colorAttachments:[{view:o,loadOp:"clear",storeOp:"store",clearValue:{r:1,g:1,b:1,a:1}}]});g.setPipeline(this.blurPipeline),g.setBindGroup(0,b),g.draw(4),g.end()}destroy(){this.ssaoUniformBuffer.destroy(),this.blurUniformBuffer.destroy(),this.noiseTexture.destroy()}};h();var zd=["background","fill","fillColor","strokeColor","borderColor","gradientEndColor","emissive","color"],Lu=2e3;function jd(t){for(let{segment:e}of $d().segment(t))if(_s(e)==="emoji")return!0;return!1}var Eu;function $d(){return Eu??=new Intl.Segmenter(void 0,{granularity:"grapheme"}),Eu}function _d(t){let e=t.spans??[];return[t.text,...e.map(r=>r.text)].filter(r=>typeof r=="string").join("")}var Iu=3;function Ho(t){return t.animation?.tracks??[]}var Vu=(t,e)=>Ho(t).some(r=>e.includes(r.prop)),Ud=new Set(["box","flex","block","group"]);function zu(t){if(t.kind==="text"||t.kind==="light"||t.kind==="camera")return!1;if(!Ud.has(String(t.kind)))return!0;let e=t.background;return typeof e=="string"&&e!==""&&e!=="transparent"?!0:(t.children??[]).some(zu)}var Gd=t=>[...t].sort((e,r)=>(Number(e.zIndex)||0)-(Number(r.zIndex)||0));function zn(t){if(typeof t!="string"||t.includes("gradient("))return null;let e=$i(t);return e&&e[3]>.99?t:null}function Yo(t,e={}){let r=[],n=(g,y,k,S)=>r.push({severity:g,code:y,message:k,...S&&{layerId:S}}),i=t.width,o=t.height,a=!1,s=[],u=!1,c=[],d=[],m=[],p=(g,y,k)=>{let S=String(g.id??"?");e.emojiFont===!1&&g.kind==="text"&&jd(_d(g))&&m.push(S);for(let C of zd){let O=g[C];typeof O!="string"||O===""||O==="transparent"||(O.includes("gradient(")?Us(O)||n("error","invalid_gradient",`\`${C}\` on '${S}' is not a gradient this renderer reads: ${O}. It draws nothing.`,S):$i(O)||n("warning","unknown_color",`\`${C}: "${O}"\` on '${S}' is not a color (hex, rgb(), hsl(), oklch() or a CSS name). It draws transparent.`,S))}if(g.kind==="light"){let C=g.lightType??"directional";C==="environment"&&(a=!0),C==="ambient"&&s.push(S),g.castShadow&&(C==="directional"||C==="spot"?d.push(S):n("warning","shadow_unsupported_light",`'${S}' is a ${String(C)} light: only directional and spot lights cast shadows.`,S));return}if(g.kind==="camera")return;if(g.kind==="media"){let C=g.inputHandleId;typeof C=="string"&&(g.dataType??"Video")==="Image"&&(/\.(json|lottie)(\?.*)?$/i.test(C)?n("error","unsupported_image_format",`'${S}' is an image layer with source '${C}', which is a Lottie vector animation. Use Layer.lottie() instead.`,S):/\.(mp4|mov|webm|mkv)(\?.*)?$/i.test(C)?n("error","unsupported_image_format",`'${S}' is an image layer with video source '${C}'. Use Layer.video() instead.`,S):/\.(mp3|wav|ogg|m4a|aac)(\?.*)?$/i.test(C)&&n("error","unsupported_image_format",`'${S}' is an image layer with audio source '${C}'. Use Layer.audio() instead.`,S))}let M=!!g.is3D||typeof g.z=="number"&&g.z!==0;if((M||g.kind==="model3d")&&(u=!0),(g.roughness!==void 0||g.metallic!==void 0)&&c.push(S),g.kind==="text"&&y&&!Vu(g,["fill","color"])){let C=zn(g.fill??g.color),O=zn(g.background)??y;if(C){let $=_i.contrast(C,O);$<Iu&&n("warning","low_contrast_text",`Text '${S}' (${C}) on ${O} has contrast ${$.toFixed(2)}:1 (aim for \u2265 ${Iu}; ${_i.readableOn(O)} reads well).`,S)}}if(k&&!M&&g.position==="absolute"&&typeof g.x=="number"&&typeof g.y=="number"&&typeof g.width=="number"&&typeof g.height=="number"&&!Vu(g,["x","y","translateX","translateY","scale","scaleX","scaleY","rotation"])){let{x:C,y:O,width:$,height:z}=g;(C+$<=0||O+z<=0||C>=i||O>=o)&&n("warning","offscreen_layer",`'${S}' sits entirely outside the ${i}\xD7${o} canvas (x ${C}, y ${O}) and never moves in.`,S)}let w=Ho(g).reduce((C,O)=>C+(O.keyframes?.length??0),0);w>Lu&&n("warning","large_animation",`'${S}' has ${w} keyframes across its tracks (over ${Lu}). Keying every frame is rarely needed: key the turning points and let eases fill in, or drive the prop from a signal.`,S);for(let C of Ho(g)){let O=C.keyframes??[];(!C.source||C.source.type==="keyframe")&&O.length>=2&&O.every($=>JSON.stringify($.value)===JSON.stringify(O[0].value))&&n("info","static_track",`'${S}' animates \`${C.prop}\` but every keyframe holds ${JSON.stringify(O[0].value)}.`,S)}let A=zn(g.background)??y,v=g.children,N=g.x===0&&g.y===0&&g.width===i&&g.height===o;f(v??[],A,k&&N)},f=(g,y,k)=>{let S=y;for(let M of Gd(g))p(M,S,k),zu(M)&&(S=null)},b=zn(t.backgroundColor)??null;if(f(t.layout,b,!0),m.length>0){let g=m.slice(0,3).map(y=>`'${y}'`).join(", ");n("warning","missing_emoji_font",`${m.length===1?"Text":`${m.length} text layers`} ${g}${m.length>3?", \u2026":""} ${m.length===1?"has":"have"} emoji, but no emoji font is registered, so the emoji draw nothing. Run \`npx framefields fonts add emoji\` and call the generated \`registerFonts()\`, or \`FontManager.registerEmojiFont(path)\` with a color emoji font.`,m[0])}return a&&s.length>0&&n("info","ambient_with_environment",`The environment already fills shadows with light; ambient light ${s.join(", ")} adds flat light on top (remove it, or lower it, if the scene looks washed out).`),d.length>1&&n("info","multiple_shadow_lights",`${d.length} lights cast shadows (${d.join(", ")}); only the first one does.`),u&&c.length>0&&!a&&n("info","pbr_without_environment",`roughness / metallic are set (${c.slice(0,3).join(", ")}${c.length>3?", \u2026":""}) but the scene has no Layer.environment(): add one for physically based shading, reflections and tone mapping.`),r}h();var ju=l.union([l.number().min(0),l.enum(["auto","fit","fill"]),l.custom()]),Wd=l.enum(["rect","circle","ellipse","polygon","star","arrow","path"]),$u=l.union([l.instanceof(Xt),l.object({op:l.string().min(1)}).passthrough(),l.custom(t=>!!(t&&typeof t=="object"&&"op"in t&&typeof t.op=="string"))]),Hd=l.enum(["x","y","scale","rotation","opacity","width","height","volume","hidden","muted","gap","padding","borderRadius","fontSize","text","fill","color","letterSpacing","d","trimStart","trimEnd","trimOffset","strokeWidth","strokeDashOffset","cornerRadius","starInnerRadiusRatio","fillColor","strokeColor","borderColor","borderWidth","motionBlurShutter","rangeStart","rangeEnd","offset","animatorRangeStart","animatorRangeEnd","animatorOffset","firstMargin","lastMargin","baselineShift","rotateX","rotateY","rotateZ","perspective","translateZ","perspectiveOriginX","perspectiveOriginY","cameraX","cameraY","cameraZ","targetX","targetY","targetZ","cameraPitch","cameraYaw","cameraRoll","cameraFov","cameraZoom","focalLength","focusDistance","fStop","maxBlurRadius","shakeTranslation","shakeRotation","orbitRadius","orbitAzimuth","orbitElevation","z","scaleZ","intensity","angle","radius","penumbra","decay","shininess","roughness","specularIntensity","ambientIntensity","metallic","ior","dispersion","transmission","fresnelPower","envIntensity","animationProgress","animationTime","animationSpeed","wireframe","scaleX","scaleY","emissive","emissiveIntensity","exposure"]),Xo=l.enum(["alpha","alpha-inverted","luma","luma-inverted"]),_u=l.enum(["lit","unlit","toon","glass","acrylic","frosted","metallic"]);var Yd=l.enum(["interpolate","hueRotate","threshold"]),Xd=l.object({name:l.enum(["none","power1","power2","power3","sine","circ","expo","back","elastic","bounce","spring","cubic","hold"]),dir:l.enum(["in","out","inOut"]),params:l.array(l.number()).optional()}).strict().superRefine((t,e)=>{if(t.name==="spring"&&t.params){let[r,n,i]=t.params;r!==void 0&&r<=0&&e.addIssue({code:l.ZodIssueCode.custom,message:"Spring damping must be greater than 0.",path:["params",0]}),n!==void 0&&n<=0&&e.addIssue({code:l.ZodIssueCode.custom,message:"Spring stiffness must be greater than 0.",path:["params",1]}),i!==void 0&&i<=0&&e.addIssue({code:l.ZodIssueCode.custom,message:"Spring mass must be greater than 0.",path:["params",2]})}}),qd=l.object({id:l.string().min(1),frame:l.number().int().min(0),value:l.union([l.number(),l.boolean(),l.string()]),ease:Xd.optional(),presetGroupId:l.string().optional(),presetType:l.string().optional(),spatialTangentIn:l.object({x:l.number(),y:l.number()}).optional(),spatialTangentOut:l.object({x:l.number(),y:l.number()}).optional()}).strict(),Zd=l.enum(["continuous","accumulate"]),Kd=l.discriminatedUnion("type",[l.object({type:l.literal("keyframe")}),l.object({type:l.literal("signal"),inputHandleId:l.string(),multiplier:l.number().default(1),offset:l.number().default(0),smoothingWindowFrames:l.number().min(0).default(0),colorMode:Yd.optional(),colorA:l.string().optional(),colorB:l.string().optional(),colorThreshold:l.number().optional(),signalMode:Zd.optional(),threshold:l.number().optional(),accumulateThreshold:l.number().optional(),debounceFrames:l.number().int().min(0).optional(),channel:l.string().optional()}),l.object({type:l.literal("wiggle"),frequency:l.number().default(2),amplitude:l.number().default(50),octaves:l.number().int().min(1).max(4).default(1),seed:l.number().default(1234)}),l.object({type:l.literal("springOvershoot"),damping:l.number().default(12),stiffness:l.number().default(180),mass:l.number().default(1)})]),Qd=l.preprocess(t=>{if(!t||typeof t!="object")return t;let e=t;if(e.type==="signal"){let r=typeof e.threshold=="number"?e.threshold:typeof e.accumulateThreshold=="number"?e.accumulateThreshold:.15;return{type:"signal",inputHandleId:e.inputHandleId??e.handleId,multiplier:e.multiplier??e.amplitude??1,offset:e.offset??0,smoothingWindowFrames:e.smoothingWindowFrames??e.smoothing??0,colorMode:e.colorMode,colorA:e.colorA,colorB:e.colorB,colorThreshold:e.colorThreshold,signalMode:e.signalMode??"continuous",threshold:r,accumulateThreshold:r,debounceFrames:e.debounceFrames??2,channel:typeof e.channel=="string"?e.channel:"primary"}}return t},Kd),Jd=(t,e)=>{if(t?.tracks)for(let r=0;r<t.tracks.length;r++){let n=t.tracks[r],i=n.keyframes??[];(!n.source||n.source.type==="keyframe")&&i.length<1&&e.addIssue({code:l.ZodIssueCode.custom,message:`Track for property '${n.prop}' must have at least 1 keyframe.`,path:["tracks",r,"keyframes"]});let a=n.prop==="hidden"||n.prop==="muted",s=n.prop==="fillColor"||n.prop==="strokeColor"||n.prop==="fill"||n.prop==="color";for(let u=0;u<i.length;u++){let c=i[u];if(u>0){let m=i[u-1];c.frame<m.frame?e.addIssue({code:l.ZodIssueCode.custom,message:"Keyframes must be sorted in ascending order of frame.",path:["tracks",r,"keyframes",u]}):c.frame===m.frame&&e.addIssue({code:l.ZodIssueCode.custom,message:"Duplicate keyframes at the same frame are not allowed.",path:["tracks",r,"keyframes",u]})}let d=typeof c.value;a?d!=="boolean"&&e.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for discrete property '${n.prop}' must be a boolean.`,path:["tracks",r,"keyframes",u,"value"]}):s?d!=="string"&&e.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for color property '${n.prop}' must be a string.`,path:["tracks",r,"keyframes",u,"value"]}):d!=="number"||Number.isNaN(c.value)||!Number.isFinite(c.value)?e.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for numeric property '${n.prop}' must be a finite number.`,path:["tracks",r,"keyframes",u,"value"]}):(n.prop==="volume"||n.prop==="trimStart"||n.prop==="trimEnd")&&(c.value<0||c.value>1)&&e.addIssue({code:l.ZodIssueCode.custom,message:`Keyframe value for property '${n.prop}' must be between 0 and 1.`,path:["tracks",r,"keyframes",u,"value"]})}}},ep=l.object({id:l.string().min(1),prop:Hd,source:Qd.optional(),keyframes:l.array(qd).default([]),repeat:l.number().int().optional(),yoyo:l.boolean().optional(),durationFrames:l.number().int().min(1).optional()}).strict(),qo=l.object({tracks:l.array(ep).max(24),frameStep:l.number().int().min(1).max(24).optional()}).strict().superRefine(Jd),At={id:l.string().min(1),inputHandleId:l.string().optional(),position:l.enum(["relative","absolute"]).default("relative"),x:l.union([l.number(),l.custom()]).default(0),y:l.union([l.number(),l.custom()]).default(0),width:ju.optional(),height:ju.optional(),grow:l.number().min(0).optional(),flexShrink:l.number().min(0).optional(),flexBasis:l.number().min(0).optional(),alignSelf:l.enum(["auto","start","center","end","stretch","baseline"]).optional(),aspectRatio:l.number().positive().optional(),zIndex:l.number().int().default(0),hidden:l.boolean().default(!1),opacity:l.number().min(0).max(1).default(1),blendMode:l.string().optional(),effects:l.array($u).optional(),rotation:l.number().default(0),scale:l.number().min(0).default(1),scaleX:l.number().default(1),scaleY:l.number().default(1),anchorX:l.number().min(0).max(1).default(.5),anchorY:l.number().min(0).max(1).default(.5),startFrame:l.number().int().min(0).default(0),durationFrames:l.number().int().min(1).optional(),motionBlurShutter:l.number().min(0).max(360).optional(),rotateX:l.number().default(0),rotateY:l.number().default(0),rotateZ:l.number().default(0),perspective:l.number().min(0).default(0),perspectiveOriginX:l.number().default(.5),perspectiveOriginY:l.number().default(.5),translateZ:l.number().default(0),backfaceVisibility:l.enum(["visible","hidden"]).default("visible"),transformStyle:l.enum(["flat","preserve-3d"]).default("flat"),is3D:l.boolean().default(!1),z:l.union([l.number(),l.custom()]).default(0),scaleZ:l.number().default(1),twoSided:l.boolean().default(!0),material:_u.default("lit"),ior:l.number().min(1).max(3).optional(),roughness:l.number().min(0).max(1).optional(),shininess:l.number().min(1).max(512).default(32),specularIntensity:l.number().min(0).default(.5),metallic:l.number().min(0).max(1).optional(),ambientIntensity:l.number().min(0).default(1),transmission:l.number().min(0).max(1).optional(),dispersion:l.number().min(0).max(1).optional(),fresnelPower:l.number().min(1).max(10).optional(),envIntensity:l.number().min(0).max(10).optional(),emissive:ue.optional(),emissiveIntensity:l.number().min(0).optional(),castShadow:l.boolean().optional(),matte:l.object({node:l.custom(t=>typeof t=="object"&&t!==null),mode:Xo.optional()}).optional(),matteId:l.string().optional(),matteOf:l.string().optional(),matteMode:Xo.optional(),animation:qo.default({tracks:[]}),vision:l.unknown().optional(),relighting:l.unknown().optional()},Uu=l.object({color:ue,offset:l.object({x:l.number(),y:l.number()}).optional(),blurRadius:l.number().min(0).optional()}).strict(),tp=l.object({x:l.number().optional(),y:l.number().optional(),scale:l.number().optional(),scaleX:l.number().optional(),scaleY:l.number().optional(),rotation:l.number().optional(),rotationX:l.number().optional(),rotationY:l.number().optional(),opacity:l.number().optional(),blur:l.number().optional(),color:l.string().optional()}).strict(),Gu=l.object({id:l.string(),unit:l.enum(["character","word","line"]).default("character"),rangeStart:l.number().min(0).max(1).default(0),rangeEnd:l.number().min(0).max(1).default(1),offset:l.number().min(-1).max(1).default(0),easing:l.string().default("power2.out"),transform:tp.optional()}),rp={waveRise(t={}){return{id:t.id??"wave-rise",unit:t.unit??"character",rangeStart:t.rangeStart??0,rangeEnd:t.rangeEnd??1,offset:t.offset??-1,easing:t.easing??"power2.out",transform:{y:t.y??40,rotationX:t.rotationX??45,opacity:t.opacity??0,blur:t.blur??0}}},wordPop(t={}){return{id:t.id??"word-pop",unit:"word",rangeStart:0,rangeEnd:1,offset:-1,easing:t.easing??"back.out(1.6)",transform:{scale:t.scale??0,y:t.y??20,opacity:0}}},blurIn(t={}){return{id:t.id??"blur-in",unit:t.unit??"character",rangeStart:0,rangeEnd:1,offset:-1,easing:t.easing??"power3.out",transform:{blur:t.blur??16,y:t.y??20,opacity:t.opacity??0}}},flip3D(t={}){return{id:t.id??"flip-3d",unit:t.unit??"character",rangeStart:0,rangeEnd:1,offset:-1,easing:t.easing??"back.out(1.4)",transform:{rotationX:t.rotationX??90,opacity:0}}},colorSweep(t){return{id:t.id??"color-sweep",unit:t.unit??"character",rangeStart:0,rangeEnd:.5,offset:-.5,easing:t.easing??"power2.inOut",transform:{color:t.color}}}},np=l.object({focalLength:l.number().min(5).max(500).default(50),fov:l.number().min(5).max(160).optional(),sensorWidth:l.number().default(36),near:l.number().min(.1).default(1),far:l.number().min(10).default(5e4),zoom:l.number().min(.01).default(1)}).strict(),ip=l.object({enabled:l.boolean().default(!1),focusDistance:l.number().min(1).default(1e3),fStop:l.number().min(.5).max(64).default(2.8),maxBlurRadius:l.number().min(0).max(128).default(32),apertureBlades:l.number().int().min(0).max(12).default(0),anamorphicRatio:l.number().min(.5).max(3).default(1)}).strict(),op=l.object({translationAmplitude:l.number().min(0).default(0),rotationAmplitude:l.number().min(0).default(0),frequency:l.number().min(.1).max(60).default(2.5),octaves:l.number().int().min(1).max(6).default(3),seed:l.number().default(42)}).strict(),Wu=l.object({id:l.string().min(1),kind:l.literal("camera"),mode:l.enum(["lookAt","free","orbit"]).default("lookAt"),x:l.number().optional(),y:l.number().optional(),z:l.number().optional(),targetX:l.number().optional(),targetY:l.number().optional(),targetZ:l.number().optional(),pitch:l.number().default(0),yaw:l.number().default(0),roll:l.number().default(0),lens:np.optional(),dof:ip.optional(),shake:op.optional(),startFrame:l.number().int().min(0).default(0),durationFrames:l.number().int().min(1).optional(),animation:qo.default({tracks:[]})}).strict(),Hu=l.enum(["ambient","directional","point","spot","environment"]),Yu=l.enum(["studio","soft","sunset","night","neutral"]),Xu=l.enum(["neutral","agx","aces","none"]),qu=l.object({color:ue,start:l.number().min(0),end:l.number().min(0),opacity:l.number().min(0).max(1).optional()}).strict(),Zu=l.object({intensity:l.number().min(0).max(10).optional(),threshold:l.number().min(0).max(16).optional(),knee:l.number().min(0).max(1).optional(),radius:l.number().min(1).max(8).optional()}).strict(),Ku=l.object({y:l.number(),color:ue.optional(),reflectivity:l.number().min(0).max(1).optional(),roughness:l.number().min(0).max(1).optional(),fadeDistance:l.number().min(0).optional(),opacity:l.number().min(0).max(1).optional()}).strict(),Qu=l.object({id:l.string().min(1),kind:l.literal("light"),lightType:Hu.default("directional"),color:ue.default("#ffffff"),intensity:l.number().default(1),x:l.number().optional(),y:l.number().optional(),z:l.number().optional(),targetX:l.number().optional(),targetY:l.number().optional(),targetZ:l.number().optional(),direction:l.tuple([l.number(),l.number(),l.number()]).optional(),radius:l.number().min(0).default(1e3),decay:l.number().min(0).default(2),angle:l.number().min(0).max(180).default(45),penumbra:l.number().min(0).max(1).default(.2),castShadow:l.boolean().optional(),shadowSoftness:l.number().min(0).max(64).optional(),shadowDarkness:l.number().min(0).max(1).optional(),shadowMapSize:l.number().int().min(256).max(8192).optional(),preset:Yu.optional(),top:ue.optional(),horizon:ue.optional(),bottom:ue.optional(),softboxes:l.number().min(0).optional(),rotation:l.number().optional(),exposure:l.number().min(-16).max(16).optional(),toneMapping:Xu.optional(),fog:qu.optional(),floor:Ku.optional(),bloom:l.union([l.boolean(),Zu]).optional(),startFrame:l.number().int().min(0).default(0),durationFrames:l.number().int().min(1).optional(),animation:qo.default({tracks:[]})}).strict(),Zo=()=>l.array(l.lazy(()=>Ko)),Ju=l.object({...At,kind:l.literal("flex"),dir:l.enum(["row","column"]).default("row"),gap:l.number().min(0).default(0),padding:l.number().min(0).default(0),justify:l.enum(["start","center","end","space-between","space-around"]).default("start"),align:l.enum(["start","center","end","stretch"]).default("start"),wrap:l.boolean().default(!1),staggerFrames:l.number().min(0).default(0),staggerDirection:l.enum(["forward","reverse","center-out"]).default("forward"),overflow:l.enum(["visible","hidden"]).default("hidden"),background:ue.optional(),borderRadius:l.number().min(0).optional(),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),children:Zo().optional()}).strict(),ap=l.object({...At,kind:l.literal("block"),gap:l.number().min(0).default(0),padding:l.number().min(0).default(0),align:l.enum(["start","center","end","stretch"]).default("start"),staggerFrames:l.number().min(0).default(0),staggerDirection:l.enum(["forward","reverse","center-out"]).default("forward"),overflow:l.enum(["visible","hidden"]).default("hidden"),background:ue.optional(),borderRadius:l.number().min(0).optional(),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),children:Zo().optional()}).strict(),el=l.object({...At,kind:l.literal("box"),background:ue,borderRadius:l.number().min(0).optional(),padding:l.number().min(0).default(0),staggerFrames:l.number().min(0).default(0),staggerDirection:l.enum(["forward","reverse","center-out"]).default("forward"),overflow:l.enum(["visible","hidden"]).default("hidden"),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),children:Zo().optional()}).strict(),tl=l.object({background:ue,borderRadius:l.number().min(0).optional(),paddingX:l.number().min(0).optional(),paddingY:l.number().min(0).optional()}).strict(),rl=l.object({text:l.union([l.string(),l.custom(t=>!!(t&&typeof t=="object"&&"get"in t))]),fontFamily:l.string().optional(),fontSize:l.union([l.number().positive(),l.custom(t=>!!(t&&typeof t=="object"&&"get"in t))]).optional(),fontWeight:l.union([l.number().int(),l.string()]).optional(),fontStyle:l.enum(["normal","italic"]).optional(),fill:l.union([ue,l.custom(t=>!!(t&&typeof t=="object"&&"get"in t))]).optional(),letterSpacing:l.number().optional(),baselineShift:l.number().optional(),opacity:l.union([l.number().min(0).max(1),l.custom(t=>!!(t&&typeof t=="object"&&"get"in t))]).optional(),mark:tl.optional()}).strict(),sp={text:l.string().default(""),spans:l.array(rl).optional(),fontFamily:l.string().optional(),fontSize:l.number().positive().optional(),fontWeight:l.union([l.number().int(),l.string()]).optional(),fontStyle:l.string().optional(),fill:ue,align:l.enum(["start","center","end"]).optional(),direction:l.enum(["ltr","rtl","auto"]).optional(),verticalAlign:l.enum(["top","middle","bottom"]).optional(),lineHeight:l.number().positive().optional(),letterSpacing:l.number().optional(),background:ue,borderRadius:l.number().min(0).optional(),padding:l.number().min(0).optional(),stroke:ue,strokeWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),textShadow:l.string().optional(),shadows:l.array(Uu).optional(),pathOptions:Jt.optional(),typewriter:En.optional(),marquee:Vo.optional(),animators:l.array(l.union([Gu,er,zo])).optional()},nl=l.object({...At,...sp,kind:l.literal("text")}).strict(),il=l.object({...At,kind:l.literal("media"),inputHandleId:l.string().min(1),src:l.string().optional(),dataType:l.string().optional(),fit:l.enum(["cover","contain","fill","none"]).default("contain"),dpr:l.number().min(1).max(4).optional(),borderRadius:l.number().min(0).optional(),borderColor:ue.optional(),borderWidth:l.number().min(0).optional(),strokeAlign:l.enum(["inside","center","outside"]).optional(),strokeRadius:l.number().min(0).optional(),volume:l.number().min(0).max(1).default(1),muted:l.boolean().default(!1),trimStartSec:l.number().min(0).optional(),timeRemap:Is.optional(),fontFamily:l.string().optional(),fontSize:l.number().positive().optional(),fontWeight:l.union([l.number().int(),l.string()]).optional(),fontStyle:l.string().optional(),fill:ue,align:l.enum(["start","center","end"]).optional(),direction:l.enum(["ltr","rtl","auto"]).optional(),verticalAlign:l.enum(["top","middle","bottom"]).optional(),lineHeight:l.number().positive().optional(),letterSpacing:l.number().optional(),background:ue,padding:l.number().min(0).optional(),stroke:ue,strokeWidth:l.number().min(0).optional(),textShadow:l.string().optional(),shadows:l.array(Uu).optional(),maxWidth:l.number().optional()}).strict().superRefine((t,e)=>{if(!t.timeRemap)return;t.trimStartSec!==void 0&&e.addIssue({code:"custom",path:["timeRemap"],message:"timeRemap cannot be combined with trimStartSec"}),t.dataType!=="Video"&&t.dataType!=="Audio"&&e.addIssue({code:"custom",path:["timeRemap"],message:"timeRemap requires video or audio media"});let r=Vs(t.timeRemap,t.durationFrames??0);r&&e.addIssue({code:"custom",path:["timeRemap"],message:r})}),up={shapeType:Wd.default("rect"),borderRadius:l.number().min(0).optional(),radiusTL:l.number().min(0).optional(),radiusTR:l.number().min(0).optional(),radiusBR:l.number().min(0).optional(),radiusBL:l.number().min(0).optional(),polygonSides:l.number().int().min(3).max(64).optional(),starPoints:l.number().int().min(3).max(64).optional(),starInnerRadiusRatio:l.number().min(.01).max(.99).optional(),arrowHeadWidth:l.number().min(0).optional(),arrowHeadLength:l.number().min(0).optional(),arrowShaftWidth:l.number().min(1).optional(),d:l.string().optional(),fillType:l.enum(["solid","linear","radial","none"]).default("solid"),fillColor:ue.default("#3b82f6"),gradientEndColor:ue.optional(),gradientAngle:l.number().default(0),strokeColor:ue.default("#ffffff"),strokeWidth:l.number().min(0).default(0),strokeDashArray:l.string().optional(),strokeDashOffset:l.number().default(0),strokeLineCap:l.enum(["butt","round","square"]).default("round"),strokeLineJoin:l.enum(["miter","round","bevel"]).default("round"),strokeAlign:l.enum(["inside","center","outside"]).optional(),trimStart:l.number().min(0).max(1).default(0),trimEnd:l.number().min(0).max(1).default(1),trimOffset:l.number().default(0)},ol=l.object({...At,...up,kind:l.literal("shape")}).strict(),lp=l.object({offset:l.number().min(0).max(1),color:l.string()}),al=l.object({...At,kind:l.literal("model3d"),src:l.string().default(""),modelFormat:l.enum(["obj","fbx","gltf","glb","stl","ply","vox","3ds","off","auto"]).default("auto"),modelData:l.unknown().optional(),animationName:l.string().optional(),animationProgress:l.number().min(0).max(1).default(0),animationTime:l.number().min(0).default(0),animationSpeed:l.number().default(1),loop:l.boolean().default(!0),wireframe:l.boolean().default(!1),texture:l.string().optional(),center:l.boolean().optional(),normalizeSize:l.number().optional(),scaleX:l.number().default(1),scaleY:l.number().default(1),audioDeform:l.record(l.string(),l.unknown()).optional(),color:ue.optional(),colorTint:ue.optional(),text3dOptions:l.unknown().optional(),primitive3d:l.unknown().optional(),instances3d:l.unknown().optional(),swarm3d:l.unknown().optional()}).strict(),Ko=l.lazy(()=>l.discriminatedUnion("kind",[Ju,ap,el,nl,il,ol,Wu,Qu,al])),cp=l.object({width:l.number().int().min(1).max(4096),height:l.number().int().min(1).max(4096),backgroundColor:ue,volume:l.number().min(0).max(1).default(1),fps:l.number().int().min(1).max(120).default(24),mode:l.enum(["Video","Image"]).default("Video"),antialias3d:l.boolean().optional(),layout:l.array(Ko).default([]),fonts:l.array(l.string()).optional(),signals:l.record(l.string(),l.unknown()).optional(),effects:l.array($u).optional(),vision:l.unknown().optional(),onRequestFrame:l.custom().optional()}).strict();h();var sl=l.enum(["cut","carrierMatchCut","cameraWhip","focusPullDissolve","irisAperture","pushDirectional"]),ul=l.object({sourceLayerId:l.string(),targetLayerId:l.string(),mode:l.enum(["exact","preserveVelocity","morph"]).default("preserveVelocity"),blendFrames:l.number().int().min(0).max(30).default(0)}).strict(),ll=l.object({id:l.string(),chapter:l.enum(["hook","tension","solution","feature_spotlight","outro","custom"]).default("custom"),durationMs:l.number().positive().optional(),durationFrames:l.number().int().positive().optional(),transitionOut:l.object({type:sl.default("cut"),durationFrames:l.number().int().min(0).default(0),carrier:ul.optional(),whipDirection:l.enum(["left","right","up","down"]).default("left")}).default({type:"cut",durationFrames:0,whipDirection:"left"})}).passthrough();function mp(t,e){return{x:t.x,y:t.y,scale:t.scale,vx:t.vx,vy:t.vy,...e}}function cl(t,e=60){Mn(e);let r=t.map(s=>dp(s,e)),n=0,i=0,o=[];for(let[s,u]of t.entries()){let c=r[s],d=n+c;if(!Number.isSafeInteger(d))throw new Error(`Scene '${u.id}' exceeds the safe frame range`);o.push({sceneId:u.id,startFrame:n,durationFrames:c}),i=Math.max(i,d);let m=u.transitionOverlap??u.transitionOut?.durationFrames??0;if(!Number.isSafeInteger(m)||m<0)throw new Error(`Scene '${u.id}' overlap must be a nonnegative safe integer`);if(s+1<t.length&&m>Math.min(c,r[s+1]))throw new Error(`Scene '${u.id}' overlap exceeds an adjacent scene duration`);n=d-(s+1<t.length?m:0)}let a=Math.round(i/e*1e3);if(!Number.isFinite(a))throw new Error("Sequence duration exceeds the finite range");return{totalFrames:i,totalDurationMs:a,sceneOffsets:o}}function dp(t,e){if(t.durationMs!==void 0&&(!Number.isFinite(t.durationMs)||t.durationMs<=0))throw new Error(`Scene '${t.id}' durationMs must be finite and positive`);let r=t.durationFrames??(t.durationMs===void 0?60:Math.round(t.durationMs/1e3*e));if(!Number.isSafeInteger(r)||r<=0)throw new Error(`Scene '${t.id}' duration must resolve to a positive safe integer frame count`);return r}function pp(t,e,r){let n=t.startFrame??0,i=t.durationFrames??r.durationFrames-n;if(!Number.isSafeInteger(n)||n<0||!Number.isSafeInteger(i)||i<=0||n+i>r.durationFrames)throw new Error(`Scene '${e}', layer '${t.id}': window must fit within frames [0, ${r.durationFrames})`);return{...t,startFrame:r.startFrame+n,durationFrames:i}}var Ir=class t{id;chapter;durationMs;durationFrames;transitionOut;layout;constructor(e){ll.parse(e),this.id=e.id,this.chapter=e.chapter??"custom",this.durationMs=e.durationMs,this.durationFrames=e.durationFrames,this.transitionOut={type:e.transitionOut?.type??"cut",durationFrames:e.transitionOut?.durationFrames??0,carrier:e.transitionOut?.carrier,whipDirection:e.transitionOut?.whipDirection??"left"},this.layout=e.layout??[]}static create(e){return new t(e)}},Qo=class t{fps;width;height;backgroundColor;fonts;signals;scenes=[];constructor(e={}){if(this.fps=e.fps??60,this.width=e.width??1920,this.height=e.height??1080,this.backgroundColor=e.backgroundColor??"#ffffff",this.fonts=e.fonts,this.signals=e.signals,e.scenes)for(let r of e.scenes)this.addScene(r)}static create(e={}){return new t(e)}addScene(e){let r=e instanceof Ir?e:new Ir(e);return this.scenes.push(r),this}getScenes(){return this.scenes}calculateTimeline(){return cl(this.scenes,this.fps)}toProgram(){let e=this.calculateTimeline(),r=[];for(let n=0;n<this.scenes.length;n++){let i=this.scenes[n],o=e.sceneOffsets[n];if(o)for(let a of i.layout)r.push(pp(a,i.id,o))}return{width:this.width,height:this.height,backgroundColor:this.backgroundColor,fps:this.fps,volume:1,mode:"Video",layout:r,fonts:this.fonts,signals:this.signals}}};h();var jn=t=>t<0?0:t>1?1:t,fp={none:()=>t=>t,linear:()=>t=>t,power1:()=>t=>t*t,power2:()=>t=>t*t*t,cubic:()=>t=>t*t*t,power3:()=>t=>t**4,sine:()=>t=>1-Math.cos(t*Math.PI/2),circ:()=>t=>1-Math.sqrt(Math.max(0,1-t*t)),expo:()=>t=>t===0?0:2**(10*(t-1)),back:([t=1.70158])=>e=>(t+1)*e*e*e-t*e*e,elastic:([t=1,e=.3])=>{let r=Math.max(1,t),n=e/(2*Math.PI)*Math.asin(1/r);return i=>i===0||i===1?i:-(r*2**(10*(i-1))*Math.sin((i-1-n)*(2*Math.PI)/e))},bounce:()=>t=>1-hp(1-t)};function hp(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-1.5/2.75)**2+.75:t<2.5/2.75?7.5625*(t-2.25/2.75)**2+.9375:7.5625*(t-2.625/2.75)**2+.984375}var ml=new Map;function gp(t){if(!t)return s=>jn(s);let e=ml.get(t);if(e)return e;let r=t.trim().match(/^([a-zA-Z0-9]+)(?:\.([a-zA-Z]+))?(?:\(([^)]*)\))?$/);if(!r)throw new Error(`Unknown ease "${t}"`);let n=(r[1]??"").toLowerCase(),i=(r[2]??"out").toLowerCase(),o=(r[3]??"").split(",").map(s=>Number.parseFloat(s)).filter(s=>!Number.isNaN(s)),a;if(n==="hold")a=s=>s>=1?1:0;else{let s=fp[n];if(!s)throw new Error(`Unknown ease "${t}"`);let u=s(o);if(i==="in")a=c=>u(jn(c));else if(i==="inout")a=c=>{let d=jn(c);return d<.5?u(d*2)/2:1-u((1-d)*2)/2};else if(i==="out")a=c=>1-u(1-jn(c));else throw new Error(`Unknown ease direction in "${t}"`)}return ml.set(t,a),a}function $n(t,e){return gp(t)(e)}var Vr=(t,e=3)=>{let r=10**e;return Math.round(t*r)/r},Jo=t=>t[t.length-1];function bp(t){let e=new Map;for(let r of t)e.set(r[0],r);return[...e.values()].sort((r,n)=>r[0]-n[0])}function yp(t){let e=[];for(let r of t){for(;e.length>0&&Jo(e)[0]>=r[0];)e.pop();e.push(r)}return e}function m0(t,e){let r=t[0];if(!r)return 0;if(e<=r[0])return r[1];for(let n=1;n<t.length;n++){let[i,o]=t[n-1],[a,s,u]=t[n];if(e>a)continue;if(u==="hold")return e===a?s:o;let c=$n(typeof u=="string"?u:void 0,(e-i)/Math.max(1,a-i));return o+(s-o)*c}return Jo(t)[1]}var dl=class{constructor(e){this.initial=e}initial;changes=[];to(e,r,n,i="power2.out"){return this.changes.push({start:e,end:Math.max(e,r),to:n,ease:i}),this}set(e,r){return this.to(e,e,r)}keys(){let e=[[0,this.initial]],r=this.initial;for(let n of[...this.changes].sort((i,o)=>i.start-o.start)){let i=Jo(e),o=Math.max(n.start,i[0]+(n.end===n.start?1:0));o>i[0]&&e.push([o,r]);let a=Math.max(n.end,o);a===o?e[e.length-1]=[o,n.to,"hold"]:e.push([a,n.to,n.ease]),r=n.to}return yp(e)}},pl=class{book=new Map;key(e,r,n){let i=this.book.get(e)??new Map;return this.book.set(e,i),i.set(r,[...i.get(r)??[],...n]),this}apply(){for(let[e,r]of this.book){let n=re.create();for(let[i,o]of r)n.keys(i,bp(o));e.animate(n)}}};var tt=2048,xp=42,wp=30,vp=48,fl=-60;function Sp(t,e){let r=t.length;for(let n=1,i=0;n<r;n++){let o=r>>1;for(;i&o;o>>=1)i^=o;i^=o,n<i&&([t[n],t[i]]=[t[i],t[n]],[e[n],e[i]]=[e[i],e[n]])}for(let n=2;n<=r;n<<=1){let i=-2*Math.PI/n,o=Math.cos(i),a=Math.sin(i);for(let s=0;s<r;s+=n){let u=1,c=0;for(let d=0;d<n/2;d++){let m=s+d,p=m+n/2,f=t[p]*u-e[p]*c,b=t[p]*c+e[p]*u;t[p]=t[m]-f,e[p]=e[m]-b,t[m]=t[m]+f,e[m]=e[m]+b;let g=u*o-c*a;c=u*a+c*o,u=g}}}}function hl(t,e){if(t.length===0)return 0;let r=[...t].sort((n,i)=>n-i);return r[Math.min(r.length-1,Math.floor(e*r.length))]}var _n=t=>20*Math.log10(t+1e-9),gl=t=>t<0?0:t>1?1:t;function kp(t,e,r){return Array.from({length:t+1},(n,i)=>e*(r/e)**(i/t))}function bl(t,e,r={}){let n=r.fps??30,i=r.bands??32,o=r.minHz??50,a=Math.min(r.maxHz??12e3,e/2),s=Math.max(0,...t.map(z=>z.length)),u=new Float32Array(s);for(let z of t)for(let L=0;L<z.length;L++)u[L]=u[L]+z[L]/t.length;let c=Math.ceil(s/e*n),d=e/n,m=Float64Array.from({length:tt},(z,L)=>.5-.5*Math.cos(2*Math.PI*L/(tt-1))),p=kp(i,o,a),f=e/tt,b=p.slice(0,-1).map((z,L)=>{let P=Math.max(1,Math.floor(z/f)),T=Math.max(P+1,Math.ceil(p[L+1]/f));return[P,Math.min(tt/2,T)]}),g=p.filter(z=>z<150).length,y=Array.from({length:i},()=>new Array(c)),k=new Array(c),S=new Array(c).fill(0),M=null,w=new Float64Array(tt),A=new Float64Array(tt);for(let z=0;z<c;z++){let P=Math.round((z+.5)*d)-tt/2;for(let V=0;V<tt;V++){let ee=u[P+V];w[V]=(ee??0)*m[V],A[V]=0}Sp(w,A);let T=[];b.forEach(([V,ee],oe)=>{let ge=0;for(let E=V;E<ee;E++)ge+=Math.hypot(w[E],A[E]);let ce=ge/(ee-V)*(4/tt);y[oe][z]=ce,oe<Math.max(1,g)&&T.push(ce)}),M&&(S[z]=T.reduce((V,ee,oe)=>V+Math.max(0,ee-(M[oe]??0)),0)),M=T;let W=Math.round(z*d),Y=Math.min(s,Math.round((z+1)*d)),_=0;for(let V=W;V<Y;V++)_+=u[V]**2;k[z]=Math.sqrt(_/Math.max(1,Y-W))}let v=y.map(z=>hl(z.map(_n),.98)),N=Math.max(...v),C=y.map((z,L)=>{let P=Math.max(v[L],N-wp,fl-20);return z.map(T=>Vr(gl(1-(P-_n(T))/xp)))}),O=Math.max(fl,hl(k.map(_n),.98)),$=k.map(z=>Vr(gl(1-(O-_n(z))/vp)));return{fps:n,frames:c,bands:C,level:$,beats:Pp(S,n)}}function Pp(t,e){let r=Math.max(2,Math.round(e*.5)),n=Math.max(1,Math.round(e*.15)),i=Math.max(0,...t),o=[];for(let a=1;a<t.length;a++){let s=t[a];if(s<=i*.08||s<t[a-1]||s<(t[a+1]??0))continue;let u=t.slice(Math.max(0,a-r),a+r+1),c=u.reduce((p,f)=>p+f,0)/u.length,d=Math.sqrt(u.reduce((p,f)=>p+(f-c)**2,0)/u.length);if(s<c+1.5*d)continue;let m=o[o.length-1];m!==void 0&&a-m<n||o.push(a)}return o}function g0(t,e){let r=t.length;if(r===0)return[];let n=t[0]?.length??0;return Array.from({length:e},(i,o)=>{let a=Math.floor(o*r/e),s=Math.max(a+1,Math.floor((o+1)*r/e));return Array.from({length:n},(u,c)=>{let d=0;for(let m=a;m<s;m++)d+=t[m][c]??0;return Vr(d/(s-a))})})}function b0(t,e){if(e<=0)return[...t];let r=1/(e+1),n=0;return t.map(i=>(n=i>=n?i:n+(i-n)*r,Vr(n)))}function y0(){return l.object({fps:l.number().positive(),frames:l.number().int().min(0),bands:l.array(l.array(l.number())),level:l.array(l.number()),beats:l.array(l.number().int())})}h();function yl(t,e=0,r={}){let n=r.tolerance??.25;if(t.length===0)return[];if(t.length===1)return[[e,t[0]]];let i=new Uint8Array(t.length);i[0]=1,i[t.length-1]=1;let o=[[0,t.length-1]];for(;o.length>0;){let[s,u]=o.pop(),c=t[s],d=t[u],m=-1,p=n;for(let f=s+1;f<u;f++){let b=(f-s)/(u-s),g=Math.abs(t[f]-(c+(d-c)*b));g>p&&(p=g,m=f)}m!==-1&&(i[m]=1,o.push([s,m],[m,u]))}let a=[];for(let s=0;s<t.length;s++)i[s]&&a.push([e+s,t[s]]);return a}function v0(t,e,r,n){let i=[];for(let o=e;o<=r;o++)i.push(t(o));return yl(i,e,n)}function Un(t,{stiffness:e=170,damping:r=26,mass:n=1}={}){if(t<=0)return 0;let i=Math.sqrt(e/n),o=r/(2*Math.sqrt(e*n));if(o<1){let d=i*Math.sqrt(1-o*o);return 1-Math.exp(-o*i*t)*(Math.cos(d*t)+o*i/d*Math.sin(d*t))}if(o===1)return 1-Math.exp(-i*t)*(1+i*t);let a=-i*(o-Math.sqrt(o*o-1)),s=-i*(o+Math.sqrt(o*o-1)),u=a/(a-s);return 1-((1-u)*Math.exp(a*t)+u*Math.exp(s*t))}function Mp(t,e,r=.001,n=600){let i=0;for(let o=0;o<=n;o++)Math.abs(1-Un(o/t,e))>r&&(i=o);return Math.min(n,i+1)}function S0(t,e,r,n,i,o=Math.max(1e-4,Math.abs(r-e)*.002)){let a=Mp(n,i),s=Array.from({length:a+1},(u,c)=>c===a?r:e+(r-e)*Un(c/n,i));return yl(s,t,{tolerance:o})}function k0(t,e,r,n,i={stiffness:230,damping:24}){let o=[...t].sort((m,p)=>m[0]-p[0]),a=new Array(r+1),s=e,u=e,c=0,d=0;for(let m=0;m<=r;m++){for(;d<o.length&&o[d][0]<=m;)s=s+(u-s)*Un((m-c)/n,i),u=o[d][1],c=o[d][0],d++;a[m]=s+(u-s)*Un((m-c)/n,i)}return a}h();var Tp={white:[255,255,255,1],black:[0,0,0,1],transparent:[0,0,0,0]};function zr(t){let e=t.trim().toLowerCase(),r=Tp[e];if(r)return[...r];let n=e.match(/^#([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/);if(n?.[1]){let o=n[1].length<=4?[...n[1]].map(s=>s+s).join(""):n[1],a=s=>Number.parseInt(o.slice(s,s+2),16);return[a(0),a(2),a(4),o.length===8?a(6)/255:1]}let i=e.match(/^rgba?\(([^)]*)\)$/);if(i?.[1]){let o=i[1].split(/[\s,/]+/).filter(Boolean);if(o.length!==3&&o.length!==4)return null;let a=(m,p)=>m.endsWith("%")?Number.parseFloat(m)/100*p:Number(m),[s,u,c]=o.slice(0,3).map(m=>a(m,255)),d=o[3]===void 0?1:a(o[3],1);return[s,u,c,d].some(m=>m===void 0||Number.isNaN(m))?null:[s,u,c,d]}return null}var ta=([t,e,r,n])=>`rgba(${Math.round(t)},${Math.round(e)},${Math.round(r)},${+n.toFixed(3)})`;function T0(t,e){let r=zr(t);return r?ta([r[0],r[1],r[2],e]):t}function A0(t){let e=zr(t);return ta(e?[e[0],e[1],e[2],0]:[0,0,0,0])}function xl(t,e,r){let n=zr(t),i=zr(e);if(!n||!i)return t;let o=n.map((a,s)=>a+(i[s]-a)*r);return o[3]<1?ta(o):`#${o.slice(0,3).map(a=>Math.round(a).toString(16).padStart(2,"0")).join("")}`}function ea(t){let e=zr(t);if(!e)return null;let r=n=>{let i=n/255;return i<=.03928?i/12.92:((i+.055)/1.055)**2.4};return .2126*r(e[0])+.7152*r(e[1])+.0722*r(e[2])}function Gn(t,e){let r=ea(t),n=ea(e);if(r===null||n===null)return null;let[i,o]=r>n?[r,n]:[n,r];return(i+.05)/(o+.05)}function wl(t){return(ea(t)??0)>.179}function C0(t,e="#ffffff",r="#0b0c0e"){return(Gn(e,t)??0)>=(Gn(r,t)??0)?e:r}h();h();h();h();function ra(t){let e=t>>>0,r=()=>{e=e+2654435769>>>0;let n=e;return n=Math.imul(n^n>>>16,2246822507)>>>0,n=Math.imul(n^n>>>13,3266489909)>>>0,n=(n^n>>>16)>>>0,n/4294967296};return{next:r,range:(n,i)=>n+(i-n)*r(),int:(n,i)=>n+Math.floor(r()*(i-n+1)),pick:n=>{if(n.length===0)throw new Error("rng.pick: empty list");return n[Math.floor(r()*n.length)]},spread:n=>(r()*2-1)*n}}function Ap(t){let e=2166136261;for(let r=0;r<t.length;r++)e^=t.charCodeAt(r),e=Math.imul(e,16777619)>>>0;return e>>>0}function jr(t,e){return ra((Math.imul(t>>>0,2654435761)^Ap(String(e)))>>>0)}function B0(t,e){return na(e),Math.round(t*e)}function L0(t,e){return na(e),t/e}function E0(t,e){return Math.round(t*e)}function I0(t,e){return!e||e<=0?Math.round(t):Math.round(Math.round(t/e)*e)}function Wn(t,e){return na(e),Math.max(1,Math.round(t*e/30))}function V0(t,e,r="forward",n=1){return t<=0?[]:Cp(t,r,n).map(o=>Math.round(o*e))}function Cp(t,e,r=1){let n=Array.from({length:t},(o,a)=>a),i=(t-1)/2;switch(e){case"forward":return n;case"reverse":return n.map(o=>t-1-o);case"center":return n.map(o=>Math.abs(o-i));case"edges":return n.map(o=>i-Math.abs(o-i));case"random":{let o=ra(r),a=[...n];for(let u=a.length-1;u>0;u--){let c=Math.floor(o.next()*(u+1));[a[u],a[c]]=[a[c],a[u]]}let s=new Array(t);return a.forEach((u,c)=>{s[u]=c}),s}}}var Dp=(t,e)=>({start:t,end:t+Math.max(0,e)}),z0=(t,e)=>t>=e.start&&t<=e.end;function j0(t){if(t.length===0)return{start:0,end:0};let e=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(let n of t)e=Math.min(e,n.start),r=Math.max(r,n.end);return{start:e,end:r}}function $0(t,e=0,r=0){let n=[],i=e;for(let o of t)n.push(Dp(i,o)),i+=o+r;return n}function na(t){if(!(t>0)||!Number.isFinite(t))throw new Error(`fps must be a positive number, got ${t}`)}var $r=["none","fade","rise","drop","scale","pop","slide-left","slide-right","slide-up","slide-down","tilt","mask-up","mask-down","mask-left","mask-right"];function ia(t,e,r,n=30){if(t===!1||t===void 0)return null;let i=typeof t=="string"?{preset:t}:t;if(i.preset==="none")return null;if(!$r.includes(i.preset))throw new Error(`Unknown motion preset "${i.preset}". Use one of: ${$r.join(", ")}.`);return{preset:i.preset,duration:Math.max(1,Math.round(i.duration??Wn(r.motion.speed.base,n))),ease:i.ease??(i.preset==="pop"?r.motion.ease.snap:e==="enter"?r.motion.ease.enter:r.motion.ease.exit),distance:i.distance??(i.preset.startsWith("slide-")?120:40)*r.scale,delay:Math.max(0,Math.round(i.delay??0)),blur:Rp(i.blur??i.preset.startsWith("slide-"))}}var Rp=t=>t===!0?90:t===!1?0:Math.max(0,Math.min(360,t)),vl=t=>t.preset.startsWith("mask-");function Sl(t,e){switch(t.preset){case"mask-up":return[0,e?.height??t.distance];case"mask-down":return[0,-(e?.height??t.distance)];case"mask-left":return[e?.width??t.distance,0];case"mask-right":return[-(e?.width??t.distance),0];case"rise":case"slide-up":return[0,t.distance];case"drop":case"slide-down":return[0,-t.distance];case"slide-left":return[t.distance,0];case"slide-right":return[-t.distance,0];default:return[0,0]}}function kl(t,e=0,r){let n=e+t.delay,i=n+t.duration,o=re.create();vl(t)||o.keys("opacity",[[n,0],[i,1,t.ease]]);let[a,s]=Sl(t,r);return a!==0&&o.keys("x",[[n,a],[i,0,t.ease]]),s!==0&&o.keys("y",[[n,s],[i,0,t.ease]]),t.preset==="scale"&&o.keys("scale",[[n,.92],[i,1,t.ease]]),t.preset==="pop"&&o.keys("scale",[[n,.6],[i,1,t.ease]]),t.preset==="tilt"&&(o.keys("perspective",[[n,1200]]),o.keys("rotateX",[[n,28],[i,0,t.ease]]),o.keys("translateZ",[[n,-160],[i,0,t.ease]])),o}function Pl(t,e,r){let n=e-t.delay,i=Math.max(0,n-t.duration),o=re.create();vl(t)||o.keys("opacity",[[i,1],[n,0,t.ease]]);let[a,s]=Sl(t,r);return a!==0&&o.keys("x",[[i,0],[n,-a,t.ease]]),s!==0&&o.keys("y",[[i,0],[n,-s,t.ease]]),t.preset==="scale"&&o.keys("scale",[[i,1],[n,.92,t.ease]]),t.preset==="pop"&&o.keys("scale",[[i,1],[n,.6,t.ease]]),t.preset==="tilt"&&(o.keys("perspective",[[i,1200]]),o.keys("rotateX",[[i,0],[n,-28,t.ease]]),o.keys("translateZ",[[i,0],[n,-160,t.ease]])),o}h();var Hn={ease:{enter:"expo.out",exit:"power2.in",move:"power3.inOut",snap:"back.out(1.6)"},speed:{fast:8,base:16,slow:30},spring:{settle:{stiffness:230,damping:24},base:{stiffness:260,damping:20},pop:{stiffness:320,damping:14}}},oa={regular:400,medium:500,semibold:600,bold:700,heavy:800},ua={low:{opacity:.32,distance:3,size:10,edge:.07},mid:{opacity:.4,distance:10,size:30,edge:.08},high:{opacity:.5,distance:22,size:60,edge:.1}},Ml={low:{opacity:.1,distance:2,size:8,edge:0},mid:{opacity:.14,distance:8,size:26,edge:0},high:{opacity:.2,distance:18,size:54,edge:0}},aa={radius:{sm:6,md:12,lg:24,pill:999},stroke:{hair:1,base:2,bold:4}},sa={display:"Inter",body:"Inter",mono:"JetBrains Mono"},Tl={graphite:{mode:"dark",color:{bg:"#0d0e11",surface:"#16181d",raised:"#1f2229",line:"#2b2f38",ink:"#f3f4f6",muted:"#8b909c",accent:"#5b8cff",accent2:"#b07cff",positive:"#3ecf8e",negative:"#ff5c5c",highlight:"#ffd23f",shadow:"#000000"},font:sa,weight:oa,...aa,elevation:ua,motion:Hn,scale:1},paper:{mode:"light",color:{bg:"#f4f1ea",surface:"#fffdf8",raised:"#ffffff",line:"#dcd6c8",ink:"#1a1814",muted:"#6b665c",accent:"#e0451f",accent2:"#1f5fe0",positive:"#1f8a4c",negative:"#c8282d",highlight:"#ffe066",shadow:"#3b2f1e"},font:sa,weight:oa,...aa,elevation:Ml,motion:Hn,scale:1},signal:{mode:"dark",color:{bg:"#000000",surface:"#111111",raised:"#1c1c1c",line:"#333333",ink:"#ffffff",muted:"#a3a3a3",accent:"#c6ff00",accent2:"#ff2e88",positive:"#00e676",negative:"#ff1744",highlight:"#c6ff00",shadow:"#000000"},font:sa,weight:oa,...aa,elevation:ua,motion:{...Hn,ease:{...Hn.ease,enter:"back.out(1.8)"},speed:{fast:6,base:12,slow:24},spring:{settle:{stiffness:300,damping:26},base:{stiffness:340,damping:22},pop:{stiffness:400,damping:14}}},scale:1}};function _r(t={},e=Tl.graphite){let r=Al(e,t);t.mode===void 0&&t.color?.bg!==void 0&&(r.mode=wl(r.color.bg)?"light":"dark",t.elevation===void 0&&(r.elevation=r.mode==="light"?Ml:ua));let n=Gn(r.color.ink,r.color.surface);if(n!==null&&n<4.5)throw new Error(`Theme contrast too low: ink ${r.color.ink} on surface ${r.color.surface} is ${n.toFixed(2)}:1 (needs 4.5:1).`);return r}function Z0(t,e,r=30){return Wn(t.motion.speed[e],r)}function Al(t,e){if(e===void 0)return t;if(t===null||e===null||typeof t!="object"||typeof e!="object"||Array.isArray(t)||Array.isArray(e))return e;let r={...t};for(let[n,i]of Object.entries(e))r[n]=Al(r[n],i);return r}function Np(t,e){let r={};for(let[n,i]of Object.entries(t))r[n]=i.map(o=>{let a={...o,frame:o.frame+e};return typeof o.end=="number"&&(a.end=o.end+e),a});return r}function Fp(t,{rest:e=0,peak:r=1,attack:n=0,release:i=8,ease:o="power2.out"}={}){let a=t.map(u=>typeof u=="number"?u:u.frame).sort((u,c)=>u-c),s=new Map;for(let u of a){let c=Math.max(0,u-n);s.has(c)||s.set(c,[c,e]),s.set(u,[u,r]),s.set(u+i,[u+i,e,o])}return[...s.values()].sort((u,c)=>u[0]-c[0])}var Op=()=>l.custom(t=>typeof t=="function",{message:"Expected a function"});function Cl(){return l.union([l.enum($r),l.object({preset:l.enum($r),duration:l.number().int().positive().optional(),ease:l.string().optional(),distance:l.number().optional(),delay:l.number().int().min(0).optional(),blur:l.union([l.boolean(),l.number().min(0).max(360)]).optional()})])}var Dl;function Bp(){return Dl??=Lp(),Dl}function Lp(){return l.object({id:l.string().min(1).optional(),at:l.number().int().min(0).optional(),duration:l.number().int().positive().optional(),hold:l.number().int().min(0).optional(),enter:l.union([Cl(),l.literal(!1)]).optional(),exit:l.union([Cl(),l.literal(!1)]).optional(),x:l.number().optional(),y:l.number().optional(),width:l.number().positive().optional(),height:l.number().positive().optional(),position:l.enum(["absolute","relative"]).optional(),theme:l.custom(t=>typeof t=="object"&&t!==null).optional(),seed:l.number().int().optional(),fps:l.number().positive().optional(),canvas:l.object({width:l.number().positive(),height:l.number().positive()}).strict().optional(),customize:Op().optional()})}function nx(t){return t}function Ep(t){let e=t.theme?_r(t.theme):void 0;return r=>n=>r({...t,...n,theme:n.theme&&e?_r(n.theme,e):n.theme??e})}function Ip(t,e=0){if(!Number.isFinite(t.span.end))throw new Error("after(): this component is open-ended (it stays until its parent ends). Give it a `duration`, or use its cues.");return t.span.end+e}var Vp=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();function Rl(t,e){let r;return n=>{r??=Bp().extend(e.props()).strict();let i=r.safeParse(n??{});if(!i.success){let o=Object.keys(r.shape),a=i.error.issues.map(u=>{let c=u.path.join(".")||"(props)",d=u.code==="unrecognized_keys"&&u.path.length===0?zp(u.keys,o):"";return` - ${c}: ${u.message}${d}`}).join(`
|
|
381
|
-
`),s=typeof n?.id=="string"?`${e.name}#${n.id}`:e.name;throw new Error(`${s}: invalid props
|
|
382
|
-
${a}`)}return $p(t,e,i.data)}}function zp(t,e){let r=t.flatMap(n=>{let i,o=3;for(let a of e){let s=jp(n.toLowerCase(),a.toLowerCase());s<o&&([i,o]=[a,s])}return i?[`"${n}" \u2192 "${i}"`]:[]});return r.length>0?` (did you mean ${r.join(", ")}?)`:""}function jp(t,e){let r=Array.from({length:e.length+1},(n,i)=>i);for(let n=1;n<=t.length;n++){let i=[n];for(let o=1;o<=e.length;o++)i[o]=Math.min(r[o]+1,i[o-1]+1,r[o-1]+(t[n-1]===e[o-1]?0:1));r=i}return r[e.length]}function $p(t,e,r){let n=_r(r.theme??{}),i=r.fps??30,o=r.seed??1,a=r.id??t.autoId(Vp(e.name)),s=e.defaults??{},u=r.hold??s.hold??0,c={host:t,theme:n,fps:i,seed:o,id:a,partId:P=>`${a}-${P}`,rng:P=>jr(o,P),requested:{width:r.width,height:r.height,duration:r.duration,at:r.at??0},hold:u,canvas:r.canvas??{width:1920*n.scale,height:1080*n.scale}},d=e.build(c,r),m=ia(r.enter===void 0?s.enter:r.enter,"enter",n,i),p=ia(r.exit===void 0?s.exit:r.exit,"exit",n,i),f=d.duration===null||d.openEnded===!0&&!p&&!d.afterHold,b=r.duration??(f||d.duration===null?null:Math.max(1,d.duration+u+(d.afterHold??0)+(p?p.duration+p.delay:0)));if(b===null&&p)throw new Error(`${e.name}: an exit needs a known end. Give \`duration\`, or drop \`exit\`.`);let g=r.width??d.width,y=r.height??d.height,k=Math.max(m?.blur??0,p?.blur??0),S=m?.preset.startsWith("mask-")||p?.preset.startsWith("mask-"),M=t.box({id:c.partId("stage"),position:"absolute",x:0,y:0,width:g,height:y,overflow:"visible",...k>0&&{motionBlurShutter:k},children:d.children}),w={width:g,height:y};m&&M.animate(kl(m,0,w)),p&&b!==null&&M.animate(Pl(p,b,w));let A=r.x===void 0&&r.y===void 0&&!r.position?d.origin:void 0,v=r.x!==void 0||r.y!==void 0||A!==void 0,N=r.x??A?.[0]??0,C=r.y??A?.[1]??0,O=t.box({id:a,...v?{position:"absolute",x:N,y:C}:r.position?{position:r.position}:{},width:g,height:y,overflow:S?"hidden":"visible",startFrame:r.at??0,...b!==null&&{durationFrames:b},children:[M]}),$={...d.parts,root:O,stage:M};r.customize?.($),la(O);let z=r.at??0,L=Np(d.cues,z);if(Object.defineProperties(O,{cues:{value:L,enumerable:!1},span:{value:{start:z,end:b===null?Number.POSITIVE_INFINITY:z+b,duration:b??Number.POSITIVE_INFINITY},enumerable:!1},part:{value:P=>$[P],enumerable:!1},partNames:{value:Object.keys($),enumerable:!1}}),d.api){let P=d.api({x:v?N:0,y:v?C:0,width:g,height:y,absolute:v,start:z});for(let[T,W]of Object.entries(P))Object.defineProperty(O,T,{value:W,enumerable:!1})}return O}function la(t){let e=t;for(let r of e.animation?.tracks??[]){let n=r.keyframes?.[0];!n||n.frame<=0||r.repeat||r.keyframes?.unshift({id:`${n.id}-hold`,frame:0,value:n.value})}for(let r of e.children??[])la(r);e.matte?.node&&la(e.matte.node)}h();h();var Nl=(t,e)=>Math.hypot(e[0]-t[0],e[1]-t[1]),Fl=(t,e,r)=>[t[0]+(e[0]-t[0])*r,t[1]+(e[1]-t[1])*r];function Ol(t,e=16){if(t.length<2)return t.map(n=>[n[0],n[1]]);let r=[[t[0][0],t[0][1]]];for(let n=0;n<t.length-1;n++){let i=t[Math.max(0,n-1)],o=t[n],a=t[n+1],s=t[Math.min(t.length-1,n+2)];for(let u=1;u<=e;u++)r.push(_p(i,o,a,s,u/e))}return r}function _p(t,e,r,n,i){let o=(k,S)=>Math.max(1e-6,Math.sqrt(Nl(k,S))),s=0+o(t,e),u=s+o(e,r),c=u+o(r,n),d=s+(u-s)*i,m=(k,S,M,w)=>w===M?k:Fl(k,S,(d-M)/(w-M)),p=m(t,e,0,s),f=m(e,r,s,u),b=m(r,n,u,c),g=m(p,f,0,u),y=m(f,b,s,c);return m(g,y,s,u)}function ax(t){if(t.length===0)throw new Error("arcPath: no points");let e=[0];for(let i=1;i<t.length;i++)e.push(e[i-1]+Nl(t[i-1],t[i]));let r=e[e.length-1],n=i=>{if(t.length===1||r===0)return[0,0];let o=Math.min(1,Math.max(0,i))*r,a=0,s=e.length-1;for(;s-a>1;){let c=a+s>>1;e[c]<=o?a=c:s=c}let u=e[s]-e[a];return[a,u>0?(o-e[a])/u:0]};return{points:t,length:r,at(i){let[o,a]=n(i);return t.length===1?[t[0][0],t[0][1]]:Fl(t[o],t[Math.min(o+1,t.length-1)],a)},angleAt(i){let[o]=n(i),a=t[Math.min(o,t.length-2)]??t[0],s=t[Math.min(o+1,t.length-1)];return Math.atan2(s[1]-a[1],s[0]-a[0])}}}function rt(t,e=!1){if(t.length===0)return"";let r=a=>Math.round(a*100)/100,[n,...i]=t,o=[`M${r(n[0])} ${r(n[1])}`];for(let a of i)o.push(`L${r(a[0])} ${r(a[1])}`);return e&&o.push("Z"),o.join(" ")}function sx(t,e,r=0,n=0){let i=c=>Math.round(c*1e3)/1e3,o=t.match(/[a-zA-Z]|[-+]?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/gi)??[],a=[],s="",u=0;for(let c of o){if(/^[a-zA-Z]$/.test(c)){s=c,u=0,a.push(s);continue}let d=Number(c),m=s.toUpperCase(),p=s!==m;if(m==="A"){let f=u%7;u++,f===2||f===3||f===4?a.push(String(d)):f<2||p?a.push(String(i(d*e))):a.push(String(i(d*e+(f===5?r:n))));continue}p?a.push(String(i(d*e))):m==="H"?a.push(String(i(d*e+r))):m==="V"?a.push(String(i(d*e+n))):(a.push(String(i(d*e+(u%2===0?r:n)))),u++)}return a.join(" ").replace(/ ?([a-zA-Z]) ?/g,"$1")}function dx(t,e,r="power2.inOut"){return[[t,0],[t+Math.max(1,e),1,r]]}function Ur(t,{wobble:e=0,seed:r=1}={},n=0){if(e<=0||t.length===0)return t.map(c=>[c[0],c[1]]);let i=jr(r,`wobble:${n}`),o=Math.max(2,Math.min(8,Math.ceil(t.length/6))),a=Array.from({length:o},()=>i.spread(e)),s=Array.from({length:o},()=>i.spread(e)),u=(c,d)=>{let m=d*(c.length-1),p=Math.min(c.length-2,Math.floor(m)),f=m-p,b=f*f*(3-2*f);return c[p]*(1-b)+c[p+1]*b};return t.map((c,d)=>{let m=t.length===1?0:d/(t.length-1);return[c[0]+u(a,m),c[1]+u(s,m)]})}function px(t,{padding:e=0,wobble:r=0,seed:n=1}={},i=0){let o=t.x+t.width/2,a=t.y+t.height/2,s=t.width/2+e,u=t.height/2+e,c=jr(n,`ellipse:${i}`),d=r>0?-Math.PI*.6+c.spread(.3):0,m=r>0?Math.PI*2*1.08:Math.PI*2,p=64,f=[];for(let b=0;b<=p;b++){let g=d+m*b/p,y=r>0?1+(b/p-.5)*.06:1;f.push([o+Math.cos(g)*s*y,a+Math.sin(g)*u*y])}return rt(Ur(f,{wobble:r,seed:n},i),r<=0)}function fx(t,{padding:e=0,wobble:r=0,seed:n=1}={},i=0){let o=t.x-e,a=t.y-e,s=t.x+t.width+e,u=t.y+t.height+e,c=[[o,a],[s,a],[s,u],[o,u],[o,a]];if(r<=0)return rt(c.slice(0,4),!0);let d=s-o,m=[[o+d*.06,a]];for(let p=0;p<4;p++){let f=c[p],b=c[p+1];for(let g=1;g<=8;g++){let y=g/8;p===0&&f[0]+(b[0]-f[0])*y<o+d*.06||m.push([f[0]+(b[0]-f[0])*y,f[1]+(b[1]-f[1])*y])}}return m.push([o+d*.14,a+(u-a)*.01]),rt(Ur(m,{wobble:r,seed:n},i))}function hx(t,e,{wobble:r=0,seed:n=1}={},i=0){let o=r>0?16:1,a=[];for(let s=0;s<=o;s++){let u=s/o;a.push([t[0]+(e[0]-t[0])*u,t[1]+(e[1]-t[1])*u])}return rt(Ur(a,{wobble:r,seed:n},i))}function gx(t,e,{amplitude:r=6,waves:n,wobble:i=0,seed:o=1}={},a=0){let s=Math.hypot(e[0]-t[0],e[1]-t[1]),u=n??Math.max(2,Math.round(s/28)),c=Math.atan2(e[1]-t[1],e[0]-t[0]),d=-Math.sin(c),m=Math.cos(c),p=u*8,f=[];for(let b=0;b<=p;b++){let g=b/p,y=Math.sin(g*u*Math.PI*2)*r;f.push([t[0]+(e[0]-t[0])*g+d*y,t[1]+(e[1]-t[1])*g+m*y])}return rt(Ur(f,{wobble:i,seed:o},a))}function bx(t,e,{curve:r="arc",headSize:n=18,wobble:i=0,seed:o=1}={},a=0){let s=e[0]-t[0],u=e[1]-t[1],c=Math.hypot(s,u)||1,d=-u/c,m=s/c,p=r==="straight"?0:r==="arc"?.18:.35,f=r==="swoop"?[t,[t[0]+s*.3+d*c*p,t[1]+u*.3+m*c*p],[t[0]+s*.75-d*c*p*.4,t[1]+u*.75-m*c*p*.4],e]:[t,[t[0]+s*.5+d*c*p,t[1]+u*.5+m*c*p],e],b=p===0?[t,e]:Ol(f,12),g=Ur(b,{wobble:i,seed:o},a),y=g[g.length-2]??t,k=Math.atan2(e[1]-y[1],e[0]-y[0]),S=A=>[e[0]-Math.cos(k+A*.5)*n,e[1]-Math.sin(k+A*.5)*n],M=S(1),w=S(-1);return{shaft:rt(g),head:`${rt([M,e])} ${rt([e,w]).replace(/^M/,"L")}`}}function yx(t,{start:e,end:r,every:n,variants:i=3}){let o=Array.from({length:Math.max(1,i)},(u,c)=>t(c));if(n<=0||o.length===1)return[[e,o[0]]];let a=[],s=0;for(let u=e;u<=r;u+=n)a.push([u,o[s%o.length],"hold"]),s++;return a}h();var Yn={char:"textIndex",word:"wordIndex",line:"lineIndex"},Up=t=>String(Math.round(t*1e4)/1e4),pt=t=>`[${t.map(Up).join(",")}]`;function Sx(t,e,r,n){let i=Math.max(1,Math.round(e.duration)),o=Array.from({length:i+1},(d,m)=>$n(e.ease,m/i)),a=Yn[t],s=d=>`(${d}[${a}]??${d}[${d}.length-1])`,u=r==="enter"?"1-v":"v",c=n?`(${u})*${s("F")}`:u;return["((S,L,F)=>{",`const t=frame-${s("S")};`,"const k=floor(t);",`const v=t<=0?L[0]:t>=${i}?L[${i}]:L[k]+(L[k+1]-L[k])*(t-k);`,`return ${c};`,`})(${pt(e.starts)},${pt(o)},${n?pt(n):"0"})`].join("")}function kx(t,e,r,n){let i=Yn[t],o=n?`*(${pt(n)}[${i}]??0)`:"";return`((S,E)=>{const s=S[${i}];return s!==undefined&&frame>=s&&frame<E[${i}]?1${o}:0;})(${pt(e)},${pt(r)})`}function Px(t,e){return`((S)=>frame<(S[${Yn[t]}]??S[S.length-1])?1:0)(${pt(e)})`}function Mx(t,e){return e.filter((r,n)=>t[n]!==`
|
|
383
|
-
`)}function Tx(t,e){return`(${pt(e)}[${Yn[t]}]??0)`}function Ax(t,e,r){return{name:t,selectors:[{type:"expression",expression:e,mode:"add",amount:1}],props:r}}function Cx(t,e){let r={textIndex:e.textIndex??0,wordIndex:e.wordIndex??0,lineIndex:e.lineIndex??0,frame:e.frame,floor:Math.floor,clamp:(o,a,s)=>Math.max(a,Math.min(s,o)),abs:Math.abs,min:Math.min,max:Math.max},n=new Function(...Object.keys(r),`return (${t});`),i=Number(n(...Object.values(r)));return Number.isFinite(i)?Math.max(-1,Math.min(1,i)):0}h();var Gp={titles:{landscape:{x:.06,top:.08,bottom:.1},portrait:{x:.08,top:.1,bottom:.24}},captions:{landscape:{x:.1,top:.08,bottom:.1},portrait:{x:.08,top:.12,bottom:.22}}};function Nx(t,e,r=Gp.titles){if(e&&typeof e=="object")return e;let{width:n,height:i}=t,a=(e?e==="portrait":i>n)?r.portrait:r.landscape;return{x:n*a.x,y:i*a.top,width:n*(1-2*a.x),height:i*(1-a.top-a.bottom)}}h();function Bx(t){if(!/^[A-Z][A-Za-z0-9]+$/.test(t.name))throw new Error(`Component name must be PascalCase: "${t.name}"`);if(t.summary.length>200)throw new Error(`${t.name}: summary must be one sentence (\u2264 200 chars).`);return t}h();var Bl;function Vx(){return Bl??=l.custom(t=>t!=null&&(Array.isArray(t)||typeof t=="object"||typeof t=="function"),{message:"Expected a target: [x, y], a rect, { node }, { text }, { track } or (frame) => point"}),Bl}h();function Wp(t,e){let r=t.elevation[e],n=t.scale;return{...r.opacity>0&&{dropShadow:{color:t.color.shadow,opacity:r.opacity,angle:90,distance:r.distance*n,size:r.size*n}},...r.edge>0&&{innerShadow:{color:"#ffffff",opacity:r.edge,angle:270,distance:Math.max(1,n),size:0,blendMode:"normal"}}}}function _x(t,e,r,n){if(n===!1)return e;let i=Wp(r,n);return Object.keys(i).length>0?t.style(e,i):e}function Ux(t,e,r=.05){if(e.mode==="light"||r<=0)return t;let n=xl(t,"#ffffff",r);return n===t?t:`linear-gradient(180deg, ${n} 0%, ${t} 100%)`}h();h();function Hx(t){let e=[];for(let r of t.matchAll(/\S+/g)){let n=r.index??0;e.push({text:r[0],start:n,end:n+r[0].length,index:e.length})}return e}function Ll(t,e,r=0){if(typeof e=="string"){let o=0;for(let a=0;;a++){let s=t.indexOf(e,o);if(s<0)return null;if(a===r)return[s,s+e.length];o=s+Math.max(1,e.length)}}let n=e.flags.includes("g")?e.flags:`${e.flags}g`,i=0;for(let o of t.matchAll(new RegExp(e.source,n))){if(i===r)return[o.index??0,(o.index??0)+o[0].length];i++}return null}function Hp(t,e,r){if(!r.width||!r.align||r.align==="left")return 0;let n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;for(let a of t.glyphs)a.line!==e||a.char.trim()===""||(n=Math.min(n,a.x),i=Math.max(i,a.x+a.width));if(!Number.isFinite(n))return 0;let o=r.width-(i-n);return(r.align==="center"?o/2:o)-n}function El(t,e,r,n){let i=new Map;for(let o of t.glyphs){if(o.index<e||o.index>=r||o.char.trim()==="")continue;let a=i.get(o.line)??{min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};a.min=Math.min(a.min,o.x),a.max=Math.max(a.max,o.x+o.width-(n.letterSpacing??0)),i.set(o.line,a)}return[...i.entries()].sort(([o],[a])=>o-a).map(([o,a])=>{let s=Hp(t,o,n);return{x:a.min+s,y:o*t.lineHeight,width:a.max-a.min,height:t.lineHeight}})}var Il=t=>Array.isArray(t)&&t.length===2&&t.every(e=>typeof e=="number"),Yp=t=>typeof t=="object"&&t!==null&&["x","y","width","height"].every(e=>typeof t[e]=="number"),He=t=>typeof t=="number"&&Number.isFinite(t)?t:void 0;function Xn(t,e,r){if(typeof t=="function")return t(e);if(t&&typeof t.get=="function"){let n=e/r;return t.get({frame:e,fps:r,time:n,duration:0,durationMs:0,progress:0,deltaTime:1/r})}throw new Error("Tracked target values must be signals or (frame) => number.")}function Zx(t,e={}){if(typeof t=="function")return{kind:"dynamic",anchor:"center",at:i=>{let o=t(i);return Il(o)?{x:o[0],y:o[1],width:0,height:0}:o}};if(Il(t))return{kind:"static",anchor:"center",rects:[{x:t[0],y:t[1],width:0,height:0}]};if(Yp(t))return{kind:"static",anchor:"center",rects:[t]};if("track"in t){let i=t.track,o=e.fps??30;return{kind:"dynamic",anchor:t.anchor??"center",at:a=>({x:Xn(i.x,a,o),y:Xn(i.y,a,o),width:Xn(i.width,a,o),height:Xn(i.height,a,o)})}}if("text"in t)return{kind:"static",anchor:t.anchor??"tip",rects:Zp(t,e)};let r=t.node,n=Xp(r);if(!n)throw new Error(`Target node "${r.id??"?"}" has no absolute geometry. Give it numeric x, y, width and height, or target a rect.`);return{kind:"static",anchor:t.anchor??"center",rects:[n]}}function Xp(t){let e=He(t.x),r=He(t.y),n=He(t.width),i=He(t.height);return e===void 0||r===void 0||n===void 0||i===void 0?null:{x:e,y:r,width:n,height:i}}function qp(t,e){let r=t.text,n=typeof r.text=="string"?r.text:typeof r.content=="string"?r.content:null;if(n===null)throw new Error("Text target node has no string content.");let i=He(r.x),o=He(r.y);if(i===void 0||o===void 0)throw new Error(`Text target "${r.id??"?"}" needs numeric x and y so its glyphs can be placed.`);if(!e.measure)throw new Error("Text targets need a measure function.");let a=r.fontFamily??e.textDefaults?.fontFamily;if(!a)throw new Error("Text target has no fontFamily.");let s={...e.textDefaults,fontFamily:a,fontSize:He(r.fontSize)??e.textDefaults?.fontSize,fontWeight:r.fontWeight??e.textDefaults?.fontWeight,letterSpacing:He(r.letterSpacing)??e.textDefaults?.letterSpacing,lineHeight:He(r.lineHeight)??e.textDefaults?.lineHeight,width:He(r.width),align:Kp(r.align),direction:r.direction},u=t.range??(t.match!==void 0?Ll(n,t.match,t.nth??0):[0,n.length]);if(!u)throw new Error(`Text target: "${String(t.match)}" not found in "${n}".`);return{content:n,metrics:e.measure(n,s),options:s,range:[u[0],u[1]],x:i,y:o}}function Zp(t,e){let r=qp(t,e),n=El(r.metrics,r.range[0],r.range[1],r.options);if(n.length===0)throw new Error("Text target range covers no glyphs.");return n.map(i=>({...i,x:i.x+r.x,y:i.y+r.y}))}function Kp(t){return t==="center"?"center":t==="end"||t==="right"?"right":"left"}function Qp(t){if(t.length===0)return{x:0,y:0,width:0,height:0};let e=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,i=Number.NEGATIVE_INFINITY;for(let o of t)e=Math.min(e,o.x),r=Math.min(r,o.y),n=Math.max(n,o.x+o.width),i=Math.max(i,o.y+o.height);return{x:e,y:r,width:n-e,height:i-r}}function Vl(t,e="center",r=!1){let{x:n,y:i,width:o,height:a}=t;switch(e){case"tip":return r?[n,i+a/2]:[n+o/2,i+a/2];case"center":return[n+o/2,i+a/2];case"top":return[n+o/2,i];case"bottom":return[n+o/2,i+a];case"left":return[n,i+a/2];case"right":return[n+o,i+a/2];case"top-left":return[n,i];case"top-right":return[n+o,i];case"bottom-left":return[n,i+a];case"bottom-right":return[n+o,i+a]}}function Kx(t,e=0,r=!1){if(t.kind==="dynamic")return Vl(t.at(e),t.anchor,r);let n=t.rects[0];return Vl(t.anchor==="tip"?n:Qp(t.rects),t.anchor,r)}h();function ew(t,e,r,n,i=0){let o=r/e,a=[],s=i;for(let u=0;u<t.length;u++){let c=t[u-1]??"",d=u===0?0:o*(1+n.spread(.3));c===" "&&(d+=o*.6),/[.,!?;:]/.test(c)&&(d+=o*3),s+=d,a.push(Math.max(i,Math.round(s)))}for(let u=1;u<a.length;u++)a[u]=Math.max(a[u],a[u-1]+1);return a}h();h();var Gr=class{textures=new Map;set(e,r){this.textures.set(e,r)}get(e){return this.textures.get(e)}has(e){return this.textures.has(e)}getOutputs(){return{canny:this.textures.get("canny"),depth:this.textures.get("depth"),normals:this.textures.get("normals"),poseSkeleton:this.textures.get("poseSkeleton"),segmentationMask:this.textures.get("segmentationMask"),faceLandmarks:this.textures.get("faceLandmarks"),motionVectors:this.textures.get("motionVectors"),deflickered:this.textures.get("deflickered")}}createBindGroupEntry(e,r){let n=this.textures.get(e);if(!n)throw new Error(`[ControlNetMultiplexer] Cannot create bind group entry: conditioning texture "${e}" is not registered in VRAM.`);return{binding:r,resource:n.createView({label:`controlnet_${e}_view`})}}exportTensorView(e){let r=this.textures.get(e);if(!r)throw new Error(`[ControlNetMultiplexer] Conditioning tensor "${e}" not found in multiplexer.`);return{texture:r,width:r.width,height:r.height,format:r.format}}async readPixelsAsync(e,r){let n=this.textures.get(r);if(!n)throw new Error(`[ControlNetMultiplexer] Cannot read pixels: conditioning texture "${r}" is missing.`);let i=n.width,o=n.height,a=n.format,s=4;a==="rgba16float"||a==="rg32float"?s=8:a==="r32float"?s=4:a==="rgba32float"&&(s=16);let u=i*s,c=Math.ceil(u/256)*256,d=c*o,m=e.createBuffer({size:d,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ,label:`controlnet_readback_staging_${r}`}),p=e.createCommandEncoder({label:`readback_encoder_${r}`});p.copyTextureToBuffer({texture:n},{buffer:m,bytesPerRow:c,rowsPerImage:o},[i,o,1]),e.queue.submit([p.finish()]),await m.mapAsync(GPUMapMode.READ);let f=m.getMappedRange(),b=new Uint8Array(i*o*s),g=new Uint8Array(f);if(c===u)b.set(g.subarray(0,i*o*s));else for(let y=0;y<o;y++){let k=y*c,S=y*u;b.set(g.subarray(k,k+u),S)}return m.unmap(),m.destroy(),{width:i,height:o,format:a,data:b}}destroy(){for(let e of this.textures.values())try{e.destroy()}catch{}this.textures.clear()}};h();h();h();var zl=`
|
|
384
|
-
struct CannyParams {
|
|
385
|
-
lowThreshold: f32,
|
|
386
|
-
highThreshold: f32,
|
|
387
|
-
width: u32,
|
|
388
|
-
height: u32,
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
@group(0) @binding(0) var inputTex: texture_2d<f32>;
|
|
392
|
-
@group(0) @binding(1) var magnitudeTex: texture_storage_2d<rgba16float, write>;
|
|
393
|
-
@group(0) @binding(2) var<uniform> params: CannyParams;
|
|
394
|
-
|
|
395
|
-
fn getLuma(coord: vec2<i32>, maxCoord: vec2<i32>) -> f32 {
|
|
396
|
-
let clamped = clamp(coord, vec2<i32>(0), maxCoord);
|
|
397
|
-
let c = textureLoad(inputTex, clamped, 0);
|
|
398
|
-
return dot(c.rgb, vec3<f32>(0.299, 0.587, 0.114));
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
@compute @workgroup_size(16, 16)
|
|
402
|
-
fn computeSobel(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
403
|
-
if (id.x >= params.width || id.y >= params.height) { return; }
|
|
404
|
-
|
|
405
|
-
let x = i32(id.x);
|
|
406
|
-
let y = i32(id.y);
|
|
407
|
-
let maxCoord = vec2<i32>(i32(params.width) - 1, i32(params.height) - 1);
|
|
408
|
-
|
|
409
|
-
let p00 = getLuma(vec2<i32>(x - 1, y - 1), maxCoord);
|
|
410
|
-
let p10 = getLuma(vec2<i32>(x, y - 1), maxCoord);
|
|
411
|
-
let p20 = getLuma(vec2<i32>(x + 1, y - 1), maxCoord);
|
|
412
|
-
let p01 = getLuma(vec2<i32>(x - 1, y), maxCoord);
|
|
413
|
-
let p21 = getLuma(vec2<i32>(x + 1, y), maxCoord);
|
|
414
|
-
let p02 = getLuma(vec2<i32>(x - 1, y + 1), maxCoord);
|
|
415
|
-
let p12 = getLuma(vec2<i32>(x, y + 1), maxCoord);
|
|
416
|
-
let p22 = getLuma(vec2<i32>(x + 1, y + 1), maxCoord);
|
|
417
|
-
|
|
418
|
-
let gx = (p20 + 2.0 * p21 + p22) - (p00 + 2.0 * p01 + p02);
|
|
419
|
-
let gy = (p02 + 2.0 * p12 + p22) - (p00 + 2.0 * p10 + p20);
|
|
420
|
-
|
|
421
|
-
let mag = sqrt(gx * gx + gy * gy);
|
|
422
|
-
let angle = atan2(gy, gx);
|
|
423
|
-
|
|
424
|
-
// Quantize angle into 4 sectors (0: 0 deg, 1: 45 deg, 2: 90 deg, 3: 135 deg)
|
|
425
|
-
var sector: f32 = 0.0;
|
|
426
|
-
let a = (angle * 180.0 / 3.14159265 + 180.0) % 180.0;
|
|
427
|
-
if ((a >= 0.0 && a < 22.5) || (a >= 157.5 && a <= 180.0)) {
|
|
428
|
-
sector = 0.0;
|
|
429
|
-
} else if (a >= 22.5 && a < 67.5) {
|
|
430
|
-
sector = 1.0;
|
|
431
|
-
} else if (a >= 67.5 && a < 112.5) {
|
|
432
|
-
sector = 2.0;
|
|
433
|
-
} else {
|
|
434
|
-
sector = 3.0;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
textureStore(magnitudeTex, id.xy, vec4<f32>(mag, sector, 0.0, 1.0));
|
|
438
|
-
}
|
|
439
|
-
`,jl=`
|
|
440
|
-
struct CannyParams {
|
|
441
|
-
lowThreshold: f32,
|
|
442
|
-
highThreshold: f32,
|
|
443
|
-
width: u32,
|
|
444
|
-
height: u32,
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
@group(0) @binding(0) var magnitudeTex: texture_2d<f32>;
|
|
448
|
-
@group(0) @binding(1) var edgeTex: texture_storage_2d<rgba8unorm, write>;
|
|
449
|
-
@group(0) @binding(2) var<uniform> params: CannyParams;
|
|
450
|
-
|
|
451
|
-
@compute @workgroup_size(16, 16)
|
|
452
|
-
fn computeNonMaxSuppression(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
453
|
-
if (id.x >= params.width || id.y >= params.height) { return; }
|
|
454
|
-
|
|
455
|
-
let x = i32(id.x);
|
|
456
|
-
let y = i32(id.y);
|
|
457
|
-
let maxCoord = vec2<i32>(i32(params.width) - 1, i32(params.height) - 1);
|
|
458
|
-
|
|
459
|
-
let center = textureLoad(magnitudeTex, vec2<i32>(x, y), 0);
|
|
460
|
-
let mag = center.r;
|
|
461
|
-
let sector = u32(round(center.g));
|
|
462
|
-
|
|
463
|
-
var n1 = 0.0;
|
|
464
|
-
var n2 = 0.0;
|
|
465
|
-
|
|
466
|
-
switch (sector) {
|
|
467
|
-
case 0u: {
|
|
468
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y), vec2<i32>(0), maxCoord), 0).r;
|
|
469
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y), vec2<i32>(0), maxCoord), 0).r;
|
|
470
|
-
}
|
|
471
|
-
case 1u: {
|
|
472
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
|
|
473
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
|
|
474
|
-
}
|
|
475
|
-
case 2u: {
|
|
476
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y - 1), vec2<i32>(0), maxCoord), 0).r;
|
|
477
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y + 1), vec2<i32>(0), maxCoord), 0).r;
|
|
478
|
-
}
|
|
479
|
-
default: {
|
|
480
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
|
|
481
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
var edge = 0.0;
|
|
486
|
-
// Non-maximum suppression along gradient sector with directional tie-breaking
|
|
487
|
-
if (mag > n1 && mag >= n2 && mag > 0.0) {
|
|
488
|
-
if (mag >= params.highThreshold) {
|
|
489
|
-
edge = 1.0;
|
|
490
|
-
} else if (mag >= params.lowThreshold) {
|
|
491
|
-
edge = 0.5;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
textureStore(edgeTex, id.xy, vec4<f32>(edge, edge, edge, 1.0));
|
|
496
|
-
}
|
|
497
|
-
`,$l=`
|
|
498
|
-
struct CannyParams {
|
|
499
|
-
lowThreshold: f32,
|
|
500
|
-
highThreshold: f32,
|
|
501
|
-
width: u32,
|
|
502
|
-
height: u32,
|
|
503
|
-
};
|
|
504
|
-
|
|
505
|
-
@group(0) @binding(0) var magnitudeTex: texture_2d<f32>;
|
|
506
|
-
@group(0) @binding(1) var edgeTex: texture_storage_2d<r32float, write>;
|
|
507
|
-
@group(0) @binding(2) var<uniform> params: CannyParams;
|
|
508
|
-
|
|
509
|
-
@compute @workgroup_size(16, 16)
|
|
510
|
-
fn computeNonMaxSuppression(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
511
|
-
if (id.x >= params.width || id.y >= params.height) { return; }
|
|
512
|
-
|
|
513
|
-
let x = i32(id.x);
|
|
514
|
-
let y = i32(id.y);
|
|
515
|
-
let maxCoord = vec2<i32>(i32(params.width) - 1, i32(params.height) - 1);
|
|
516
|
-
|
|
517
|
-
let center = textureLoad(magnitudeTex, vec2<i32>(x, y), 0);
|
|
518
|
-
let mag = center.r;
|
|
519
|
-
let sector = u32(round(center.g));
|
|
520
|
-
|
|
521
|
-
var n1 = 0.0;
|
|
522
|
-
var n2 = 0.0;
|
|
523
|
-
|
|
524
|
-
switch (sector) {
|
|
525
|
-
case 0u: {
|
|
526
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y), vec2<i32>(0), maxCoord), 0).r;
|
|
527
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y), vec2<i32>(0), maxCoord), 0).r;
|
|
528
|
-
}
|
|
529
|
-
case 1u: {
|
|
530
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
|
|
531
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
|
|
532
|
-
}
|
|
533
|
-
case 2u: {
|
|
534
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y - 1), vec2<i32>(0), maxCoord), 0).r;
|
|
535
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x, y + 1), vec2<i32>(0), maxCoord), 0).r;
|
|
536
|
-
}
|
|
537
|
-
default: {
|
|
538
|
-
n1 = textureLoad(magnitudeTex, clamp(vec2<i32>(x - 1, y - 1), vec2<i32>(0), maxCoord), 0).r;
|
|
539
|
-
n2 = textureLoad(magnitudeTex, clamp(vec2<i32>(x + 1, y + 1), vec2<i32>(0), maxCoord), 0).r;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
var edge = 0.0;
|
|
544
|
-
// Non-maximum suppression along gradient sector with directional tie-breaking
|
|
545
|
-
if (mag > n1 && mag >= n2 && mag > 0.0) {
|
|
546
|
-
if (mag >= params.highThreshold) {
|
|
547
|
-
edge = 1.0;
|
|
548
|
-
} else if (mag >= params.lowThreshold) {
|
|
549
|
-
edge = 0.5;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
textureStore(edgeTex, id.xy, vec4<f32>(edge, 0.0, 0.0, 1.0));
|
|
554
|
-
}
|
|
555
|
-
`;var Wr=class{constructor(e){this.device=e;let r=e.createShaderModule({label:"canny_sobel.wgsl",code:zl});this.sobelPipeline=e.createComputePipeline({label:"CannySobelPipeline",layout:"auto",compute:{module:r,entryPoint:"computeSobel"}});let n=e.createShaderModule({label:"canny_nms_rgba8.wgsl",code:jl});this.nmsRgba8Pipeline=e.createComputePipeline({label:"CannyNmsRgba8Pipeline",layout:"auto",compute:{module:n,entryPoint:"computeNonMaxSuppression"}});let i=e.createShaderModule({label:"canny_nms_r32f.wgsl",code:$l});this.nmsR32fPipeline=e.createComputePipeline({label:"CannyNmsR32fPipeline",layout:"auto",compute:{module:i,entryPoint:"computeNonMaxSuppression"}}),this.uniformBuffer=e.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"canny_uniform_buffer"})}device;sobelPipeline;nmsRgba8Pipeline;nmsR32fPipeline;uniformBuffer;cachedIntermediateTexture;cachedOutputTexture;execute(e,r={}){let n=e.width,i=e.height,o=r.low??.1,a=r.high??.3,s=r.outputFormat??"rgba8unorm",u=new ArrayBuffer(16),c=new Float32Array(u),d=new Uint32Array(u);c[0]=o,c[1]=a,d[2]=n,d[3]=i,this.device.queue.writeBuffer(this.uniformBuffer,0,u),(!this.cachedIntermediateTexture||this.cachedIntermediateTexture.width!==n||this.cachedIntermediateTexture.height!==i)&&(this.cachedIntermediateTexture?.destroy(),this.cachedIntermediateTexture=this.device.createTexture({label:"canny_magnitude_intermediate",size:[n,i],format:"rgba16float",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING})),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i||this.cachedOutputTexture.format!==s)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({label:`canny_edge_output_${s}`,size:[n,i],format:s,usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}));let m=this.device.createCommandEncoder({label:"canny_command_encoder"}),p=this.device.createBindGroup({layout:this.sobelPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:e.createView()},{binding:1,resource:this.cachedIntermediateTexture.createView()},{binding:2,resource:{buffer:this.uniformBuffer}}]}),f=m.beginComputePass({label:"canny_sobel_pass"});f.setPipeline(this.sobelPipeline),f.setBindGroup(0,p),f.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),f.end();let b=s==="r32float"?this.nmsR32fPipeline:this.nmsRgba8Pipeline,g=this.device.createBindGroup({layout:b.getBindGroupLayout(0),entries:[{binding:0,resource:this.cachedIntermediateTexture.createView()},{binding:1,resource:this.cachedOutputTexture.createView()},{binding:2,resource:{buffer:this.uniformBuffer}}]}),y=m.beginComputePass({label:"canny_nms_pass"});return y.setPipeline(b),y.setBindGroup(0,g),y.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),y.end(),this.device.queue.submit([m.finish()]),this.cachedOutputTexture}destroy(){this.cachedIntermediateTexture?.destroy(),this.cachedOutputTexture?.destroy(),this.uniformBuffer.destroy()}};h();h();var _l=`
|
|
556
|
-
struct DepthNormalParams {
|
|
557
|
-
width: u32,
|
|
558
|
-
height: u32,
|
|
559
|
-
depthScale: f32,
|
|
560
|
-
_pad: f32,
|
|
561
|
-
};
|
|
562
|
-
|
|
563
|
-
@group(0) @binding(0) var depthTex: texture_2d<f32>;
|
|
564
|
-
@group(0) @binding(1) var normalTex: texture_storage_2d<rgba16float, write>;
|
|
565
|
-
@group(0) @binding(2) var<uniform> params: DepthNormalParams;
|
|
566
|
-
|
|
567
|
-
@compute @workgroup_size(16, 16)
|
|
568
|
-
fn computeNormals(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
569
|
-
if (id.x >= params.width || id.y >= params.height) { return; }
|
|
570
|
-
|
|
571
|
-
let c = id.xy;
|
|
572
|
-
let maxX = params.width - 1u;
|
|
573
|
-
let maxY = params.height - 1u;
|
|
574
|
-
|
|
575
|
-
let left = textureLoad(depthTex, vec2<u32>(max(c.x - 1u, 0u), c.y), 0).r;
|
|
576
|
-
let right = textureLoad(depthTex, vec2<u32>(min(c.x + 1u, maxX), c.y), 0).r;
|
|
577
|
-
let up = textureLoad(depthTex, vec2<u32>(c.x, max(c.y - 1u, 0u)), 0).r;
|
|
578
|
-
let down = textureLoad(depthTex, vec2<u32>(c.x, min(c.y + 1u, maxY)), 0).r;
|
|
579
|
-
|
|
580
|
-
let dx = (right - left) * 0.5 * params.depthScale;
|
|
581
|
-
let dy = (down - up) * 0.5 * params.depthScale;
|
|
582
|
-
|
|
583
|
-
let normal = normalize(vec3<f32>(-dx, -dy, 1.0));
|
|
584
|
-
// Pack [-1, 1] range to [0, 1]
|
|
585
|
-
let packedColor = vec4<f32>(normal * 0.5 + 0.5, 1.0);
|
|
586
|
-
textureStore(normalTex, id.xy, packedColor);
|
|
587
|
-
}
|
|
588
|
-
`,Ul=`
|
|
589
|
-
struct DepthNormalParams {
|
|
590
|
-
width: u32,
|
|
591
|
-
height: u32,
|
|
592
|
-
depthScale: f32,
|
|
593
|
-
_pad: f32,
|
|
594
|
-
};
|
|
595
|
-
|
|
596
|
-
@group(0) @binding(0) var depthTex: texture_2d<f32>;
|
|
597
|
-
@group(0) @binding(1) var normalTex: texture_storage_2d<rgba8unorm, write>;
|
|
598
|
-
@group(0) @binding(2) var<uniform> params: DepthNormalParams;
|
|
599
|
-
|
|
600
|
-
@compute @workgroup_size(16, 16)
|
|
601
|
-
fn computeNormals(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
602
|
-
if (id.x >= params.width || id.y >= params.height) { return; }
|
|
603
|
-
|
|
604
|
-
let c = id.xy;
|
|
605
|
-
let maxX = params.width - 1u;
|
|
606
|
-
let maxY = params.height - 1u;
|
|
607
|
-
|
|
608
|
-
let left = textureLoad(depthTex, vec2<u32>(max(c.x - 1u, 0u), c.y), 0).r;
|
|
609
|
-
let right = textureLoad(depthTex, vec2<u32>(min(c.x + 1u, maxX), c.y), 0).r;
|
|
610
|
-
let up = textureLoad(depthTex, vec2<u32>(c.x, max(c.y - 1u, 0u)), 0).r;
|
|
611
|
-
let down = textureLoad(depthTex, vec2<u32>(c.x, min(c.y + 1u, maxY)), 0).r;
|
|
612
|
-
|
|
613
|
-
let dx = (right - left) * 0.5 * params.depthScale;
|
|
614
|
-
let dy = (down - up) * 0.5 * params.depthScale;
|
|
615
|
-
|
|
616
|
-
let normal = normalize(vec3<f32>(-dx, -dy, 1.0));
|
|
617
|
-
// Pack [-1, 1] range to [0, 1]
|
|
618
|
-
let packedColor = vec4<f32>(normal * 0.5 + 0.5, 1.0);
|
|
619
|
-
textureStore(normalTex, id.xy, packedColor);
|
|
620
|
-
}
|
|
621
|
-
`;var Hr=class{constructor(e){this.device=e;let r=e.createShaderModule({label:"depth_normals_rgba16f.wgsl",code:_l});this.normalRgba16fPipeline=e.createComputePipeline({label:"DepthNormalsRgba16fPipeline",layout:"auto",compute:{module:r,entryPoint:"computeNormals"}});let n=e.createShaderModule({label:"depth_normals_rgba8.wgsl",code:Ul});this.normalRgba8Pipeline=e.createComputePipeline({label:"DepthNormalsRgba8Pipeline",layout:"auto",compute:{module:n,entryPoint:"computeNormals"}}),this.uniformBuffer=e.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"depth_normals_uniform_buffer"})}device;normalRgba16fPipeline;normalRgba8Pipeline;uniformBuffer;cachedOutputTexture;execute(e,r={}){let n=e.width,i=e.height,o=r.depthScale??1,a=r.outputFormat??"rgba16float",s=new ArrayBuffer(16),u=new Uint32Array(s),c=new Float32Array(s);u[0]=n,u[1]=i,c[2]=o,c[3]=0,this.device.queue.writeBuffer(this.uniformBuffer,0,s),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i||this.cachedOutputTexture.format!==a)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({label:`normal_output_${a}`,size:[n,i],format:a,usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}));let d=a==="rgba8unorm"?this.normalRgba8Pipeline:this.normalRgba16fPipeline,m=this.device.createCommandEncoder({label:"depth_normals_command_encoder"}),p=this.device.createBindGroup({layout:d.getBindGroupLayout(0),entries:[{binding:0,resource:e.createView()},{binding:1,resource:this.cachedOutputTexture.createView()},{binding:2,resource:{buffer:this.uniformBuffer}}]}),f=m.beginComputePass({label:"depth_normals_compute_pass"});return f.setPipeline(d),f.setBindGroup(0,p),f.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),f.end(),this.device.queue.submit([m.finish()]),this.cachedOutputTexture}destroy(){this.cachedOutputTexture?.destroy(),this.uniformBuffer.destroy()}};h();h();var Gl=`
|
|
622
|
-
struct FaceSegment {
|
|
623
|
-
start: vec2<f32>,
|
|
624
|
-
end: vec2<f32>,
|
|
625
|
-
color: vec4<f32>,
|
|
626
|
-
radius: f32,
|
|
627
|
-
enabled: f32,
|
|
628
|
-
pad: vec2<f32>,
|
|
629
|
-
};
|
|
630
|
-
|
|
631
|
-
struct FaceParams {
|
|
632
|
-
width: u32,
|
|
633
|
-
height: u32,
|
|
634
|
-
numSegments: u32,
|
|
635
|
-
pad: u32,
|
|
636
|
-
};
|
|
637
|
-
|
|
638
|
-
@group(0) @binding(0) var outputTex: texture_storage_2d<rgba8unorm, write>;
|
|
639
|
-
@group(0) @binding(1) var<uniform> params: FaceParams;
|
|
640
|
-
@group(0) @binding(2) var<storage, read> segments: array<FaceSegment>;
|
|
641
|
-
|
|
642
|
-
@compute @workgroup_size(16, 16)
|
|
643
|
-
fn computeFaceLandmarks(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
644
|
-
if (id.x >= params.width || id.y >= params.height) {
|
|
645
|
-
return;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
let p = vec2<f32>(f32(id.x) + 0.5, f32(id.y) + 0.5);
|
|
649
|
-
var outColor = vec4<f32>(0.0, 0.0, 0.0, 1.0); // Solid black background for SDXL ControlNet
|
|
650
|
-
|
|
651
|
-
let count = params.numSegments;
|
|
652
|
-
for (var i = 0u; i < count; i = i + 1u) {
|
|
653
|
-
let seg = segments[i];
|
|
654
|
-
if (seg.enabled < 0.5) {
|
|
655
|
-
continue;
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
let ab = seg.end - seg.start;
|
|
659
|
-
let ap = p - seg.start;
|
|
660
|
-
let l2 = dot(ab, ab);
|
|
661
|
-
|
|
662
|
-
var t: f32 = 0.0;
|
|
663
|
-
if (l2 > 0.0001) {
|
|
664
|
-
t = clamp(dot(ap, ab) / l2, 0.0, 1.0);
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
let closest = seg.start + t * ab;
|
|
668
|
-
let dist = length(p - closest);
|
|
669
|
-
|
|
670
|
-
if (dist <= seg.radius) {
|
|
671
|
-
let edgeAlpha = clamp(seg.radius - dist + 0.5, 0.0, 1.0);
|
|
672
|
-
outColor = vec4<f32>(mix(outColor.rgb, seg.color.rgb, edgeAlpha * seg.color.a), 1.0);
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
textureStore(outputTex, id.xy, outColor);
|
|
677
|
-
}
|
|
678
|
-
`;function nt(t,e){let r=[];for(let n=0;n<t.length-1;n++)r.push({from:t[n],to:t[n+1],color:e});return r}var Yr=[...nt([70,63,105,66,107],[0,1,1,1]),...nt([300,293,334,296,336],[0,1,1,1]),...nt([33,160,158,133,153,144,33],[0,1,0,1]),...nt([263,387,385,362,380,373,263],[0,1,0,1]),...nt([168,6,197,195,4],[1,1,0,1]),...nt([98,97,2,326,327],[1,1,0,1]),...nt([61,185,40,39,37,0,267,269,270,409,291,375,321,405,314,17,84,181,91,146,61],[1,.2,.2,1]),...nt([78,95,88,178,87,14,317,402,318,324,308,415,310,311,312,13,82,81,80,191,78],[1,0,.8,1]),...nt([10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109,10],[.9,.9,.9,1])],qn=class{constructor(e){this.device=e;let r=e.createShaderModule({label:"face_landmarks.wgsl",code:Gl});this.computePipeline=e.createComputePipeline({label:"FaceLandmarksComputePipeline",layout:"auto",compute:{module:r,entryPoint:"computeFaceLandmarks"}}),this.uniformBuffer=e.createBuffer({size:64,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"face_landmarks_uniform_buffer"});let n=Math.max(256,Yr.length*48);this.storageBuffer=e.createBuffer({size:n,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,label:"face_landmarks_storage_buffer"})}device;computePipeline;uniformBuffer;storageBuffer;cachedOutputTexture;execute(e,r={}){let n=r.width??1024,i=r.height??1024,o=r.lineWidth??4,a=Math.max(1,o/2),s=new Uint32Array(4);s[0]=n,s[1]=i,s[2]=Yr.length,s[3]=0,this.device.queue.writeBuffer(this.uniformBuffer,0,s);let u=new Float32Array(Yr.length*12);for(let p=0;p<Yr.length;p++){let f=Yr[p],b=e[f.from],g=e[f.to],y=p*12;if(!b||!g||(b.visibility??1)<.2||(g.visibility??1)<.2){u[y+9]=0;continue}u[y+0]=b.x*n,u[y+1]=b.y*i,u[y+2]=g.x*n,u[y+3]=g.y*i,u[y+4]=f.color[0],u[y+5]=f.color[1],u[y+6]=f.color[2],u[y+7]=f.color[3],u[y+8]=a,u[y+9]=1,u[y+10]=0,u[y+11]=0}this.device.queue.writeBuffer(this.storageBuffer,0,u),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({size:{width:n,height:i},format:"rgba8unorm",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC|GPUTextureUsage.COPY_DST,label:"face_landmarks_output_texture"}));let c=this.device.createBindGroup({label:"FaceLandmarksBindGroup",layout:this.computePipeline.getBindGroupLayout(0),entries:[{binding:0,resource:this.cachedOutputTexture.createView()},{binding:1,resource:{buffer:this.uniformBuffer}},{binding:2,resource:{buffer:this.storageBuffer}}]}),d=this.device.createCommandEncoder({label:"FaceLandmarksCommandEncoder"}),m=d.beginComputePass({label:"FaceLandmarksComputePass"});return m.setPipeline(this.computePipeline),m.setBindGroup(0,c),m.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16)),m.end(),this.device.queue.submit([d.finish()]),this.cachedOutputTexture}destroy(){this.uniformBuffer.destroy(),this.storageBuffer.destroy(),this.cachedOutputTexture?.destroy()}};h();h();var Wl=`
|
|
679
|
-
struct SegParams {
|
|
680
|
-
threshold: f32,
|
|
681
|
-
feather: f32,
|
|
682
|
-
width: u32,
|
|
683
|
-
height: u32,
|
|
684
|
-
};
|
|
685
|
-
|
|
686
|
-
@group(0) @binding(0) var inputTex: texture_2d<f32>;
|
|
687
|
-
@group(0) @binding(1) var outputTex: texture_storage_2d<rgba8unorm, write>;
|
|
688
|
-
@group(0) @binding(2) var<uniform> params: SegParams;
|
|
689
|
-
|
|
690
|
-
@compute @workgroup_size(16, 16)
|
|
691
|
-
fn computeSegmentation(@builtin(global_invocation_id) id: vec3<u32>) {
|
|
692
|
-
if (id.x >= params.width || id.y >= params.height) {
|
|
693
|
-
return;
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
let coord = vec2<i32>(i32(id.x), i32(id.y));
|
|
697
|
-
let sample = textureLoad(inputTex, coord, 0);
|
|
698
|
-
|
|
699
|
-
// Luminance or alpha channel extraction
|
|
700
|
-
let rawAlpha = max(sample.a, dot(sample.rgb, vec3<f32>(0.299, 0.587, 0.114)));
|
|
701
|
-
|
|
702
|
-
let lower = max(0.0, params.threshold - params.feather);
|
|
703
|
-
let upper = min(1.0, params.threshold + params.feather);
|
|
704
|
-
let alpha = smoothstep(lower, upper, rawAlpha);
|
|
705
|
-
|
|
706
|
-
textureStore(outputTex, id.xy, vec4<f32>(alpha, alpha, alpha, 1.0));
|
|
707
|
-
}
|
|
708
|
-
`;var Zn=class{constructor(e){this.device=e;let r=e.createShaderModule({label:"segmentation.wgsl",code:Wl});this.computePipeline=e.createComputePipeline({label:"SegmentationComputePipeline",layout:"auto",compute:{module:r,entryPoint:"computeSegmentation"}}),this.uniformBuffer=e.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,label:"segmentation_uniform_buffer"})}device;computePipeline;uniformBuffer;cachedOutputTexture;execute(e,r={}){let n=e.width,i=e.height,o=r.threshold??.5,a=r.feather??.05,s=new ArrayBuffer(16),u=new Float32Array(s),c=new Uint32Array(s);u[0]=o,u[1]=a,c[2]=n,c[3]=i,this.device.queue.writeBuffer(this.uniformBuffer,0,s),(!this.cachedOutputTexture||this.cachedOutputTexture.width!==n||this.cachedOutputTexture.height!==i)&&(this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=this.device.createTexture({label:"segmentation_output_texture",size:[n,i],format:"rgba8unorm",usage:GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_SRC}));let d=this.device.createCommandEncoder({label:"segmentation_command_encoder"}),m=this.device.createBindGroup({label:"segmentation_bind_group",layout:this.computePipeline.getBindGroupLayout(0),entries:[{binding:0,resource:e.createView({label:"segmentation_input_view"})},{binding:1,resource:this.cachedOutputTexture.createView({label:"segmentation_output_view"})},{binding:2,resource:{buffer:this.uniformBuffer}}]}),p=d.beginComputePass({label:"segmentation_compute_pass"});return p.setPipeline(this.computePipeline),p.setBindGroup(0,m),p.dispatchWorkgroups(Math.ceil(n/16),Math.ceil(i/16),1),p.end(),this.device.queue.submit([d.finish()]),this.cachedOutputTexture}destroy(){this.cachedOutputTexture?.destroy(),this.cachedOutputTexture=void 0,this.uniformBuffer.destroy()}};var tr=class t{constructor(e){this.source=e;this.id=`tensor-${Math.random().toString(36).slice(2,9)}`}source;id;cannyOptions;depthNormalsOptions;poseSkeletonOptions;faceLandmarksOptions;segmentationOptions;opticalFlowOptions;deflickerOptions;multiplexer=new Gr;cannyPipeline;depthNormalsPipeline;posePipeline;facePipeline;segmentationPipeline;opticalFlowPipeline;deflickerPipeline;prevInputTexture;static from(e){return new t(e)}canny(e={}){return this.cannyOptions=e,this}depthNormals(e={}){return this.depthNormalsOptions=e,this}poseSkeleton(e={}){return this.poseSkeletonOptions=e,this}pose(e,r={}){return this.poseSkeletonOptions={...r,landmarks:e},this}faceLandmarks(e={}){return this.faceLandmarksOptions=e,this}face(e,r={}){return this.faceLandmarksOptions={...r,landmarks:e},this}segmentation(e={}){return this.segmentationOptions=e,this}opticalFlow(e={}){return this.opticalFlowOptions=e,this}deflicker(e={}){return this.deflickerOptions=e,this}getMultiplexer(){return this.multiplexer}async execute(e,r){let n=r;if(!n&&typeof this.source?.createView=="function"&&(n=this.source),!n)throw new Error("[TensorPipeline.execute] No GPUTexture available for tensor compute execution. Pass a valid GPUTexture to execute() or initialize with a GPUTexture source.");if(this.cannyOptions){this.cannyPipeline||(this.cannyPipeline=new Wr(e));let i=this.cannyPipeline.execute(n,this.cannyOptions);this.multiplexer.set("canny",i)}if(this.depthNormalsOptions){this.depthNormalsPipeline||(this.depthNormalsPipeline=new Hr(e));let i=this.depthNormalsPipeline.execute(n,this.depthNormalsOptions);this.multiplexer.set("normals",i)}if(this.poseSkeletonOptions?.landmarks){this.posePipeline||(this.posePipeline=new ru(e));let i=this.posePipeline.execute(this.poseSkeletonOptions.landmarks,{width:this.poseSkeletonOptions.width??n.width,height:this.poseSkeletonOptions.height??n.height,lineWidth:this.poseSkeletonOptions.lineWidth});this.multiplexer.set("poseSkeleton",i)}if(this.faceLandmarksOptions?.landmarks){this.facePipeline||(this.facePipeline=new qn(e));let i=this.facePipeline.execute(this.faceLandmarksOptions.landmarks,{width:this.faceLandmarksOptions.width??n.width,height:this.faceLandmarksOptions.height??n.height,lineWidth:this.faceLandmarksOptions.lineWidth});this.multiplexer.set("faceLandmarks",i)}if(this.segmentationOptions){this.segmentationPipeline||(this.segmentationPipeline=new Zn(e));let i=this.segmentationPipeline.execute(n,this.segmentationOptions);this.multiplexer.set("segmentationMask",i)}if(this.opticalFlowOptions){this.opticalFlowPipeline||(this.opticalFlowPipeline=new qi(e));let i=this.prevInputTexture??n,o=this.opticalFlowPipeline.execute(i,n,this.opticalFlowOptions);this.multiplexer.set("motionVectors",o)}if(this.deflickerOptions){this.deflickerPipeline||(this.deflickerPipeline=new Zi(e));let i=this.deflickerPipeline.execute(n,this.deflickerOptions);this.multiplexer.set("deflickered",i)}return this.prevInputTexture=n,this.multiplexer.getOutputs()}toConfig(){return{canny:this.cannyOptions,depthNormals:this.depthNormalsOptions,poseSkeleton:this.poseSkeletonOptions,faceLandmarks:this.faceLandmarksOptions,segmentation:this.segmentationOptions,opticalFlow:this.opticalFlowOptions,deflicker:this.deflickerOptions}}toNode(){return{id:this.id,kind:"tensor",source:this.source,config:this.toConfig()}}destroy(){this.cannyPipeline?.destroy(),this.depthNormalsPipeline?.destroy(),this.posePipeline?.destroy(),this.facePipeline?.destroy(),this.segmentationPipeline?.destroy(),this.opticalFlowPipeline?.destroy(),this.deflickerPipeline?.destroy(),this.multiplexer.destroy()}};h();var Lw=t=>{if(!t)return"srcOver";switch(t){case"source-over":return"srcOver";case"source-in":return"srcIn";case"source-out":return"srcOut";case"source-atop":return"srcATop";case"destination-over":return"dstOver";case"destination-in":return"dstIn";case"destination-out":return"dstOut";case"destination-atop":return"dstATop";case"copy":return"src";case"xor":return"xor";case"multiply":return"multiply";case"screen":return"screen";case"overlay":return"overlay";case"darken":return"darken";case"lighten":case"lighter":return"lighten";case"color-dodge":return"colorDodge";case"color-burn":return"colorBurn";case"hard-light":return"hardLight";case"soft-light":return"softLight";case"difference":return"difference";case"exclusion":return"exclusion";case"hue":return"hue";case"saturation":return"saturation";case"color":return"color";case"luminosity":return"luminosity";default:return"srcOver"}},Ew=t=>t==="destination-in"||t==="source-in";h();function zw(t,e,r,n,i="outside"){if(i==="inside"){let o=n/2;return{x:o,y:o,width:Math.max(0,t-n),height:Math.max(0,e-n),radius:r===0?0:Math.max(0,r-o)}}if(i==="outside"){let o=n/2;return{x:-o,y:-o,width:t+n,height:e+n,radius:r===0?0:r+o}}return{x:0,y:0,width:t,height:e,radius:r}}h();function Hl(t){if(t.operation?.op==="source")return Qs(t).sourceUrl;for(let e of t.children??[]){let r=Hl(e);if(r)return r}}async function Yl(t,e){let r=async n=>{let i=n.operation;if(i?.op==="CompositorLayer"&&i.timeRemap&&i.durationFrames){let o=Hl(n);if(!o)throw new Error(`Time remap on '${i.id}' has no media source`);let a=[],s=await qt.acquire(o);try{let c=i.dataType==="Video"?await s.getPrimaryVideoTrack():null,d=i.dataType==="Video"&&(i.muted||i.volume===0)?null:await s.getPrimaryAudioTrack();if(i.dataType==="Video"&&!c)throw new Error(`Time remap on '${i.id}': source has no video track`);if(i.dataType==="Audio"&&!d)throw new Error(`Time remap on '${i.id}': source has no audio track`);for(let m of[c,d])m&&a.push({first:await s.getFirstTimestamp([m]),last:await m.computeDuration()})}finally{qt.release(o)}let u=c=>{for(let{first:d,last:m}of a)if(c.min<d-1e-8||c.max>m+1e-8||c.maxIncluded&&c.max>=m-1e-8)throw new Error(`Time remap on '${i.id}' requests source ${c.min.toFixed(6)}\u2013${c.max.toFixed(6)}s outside ${d.toFixed(6)}\u2013${m.toFixed(6)}s`)};i.timeRemap.kind==="recorded"?i.timeRemap.recorder.checkRange(u):u(Tn(i.timeRemap,0,i.durationFrames,e))}for(let o of n.children??[])await r(o)};await r(t)}h();var Xl=new Map;function Z(t){let e=(Xl.get(t)??0)+1;return Xl.set(t,e),`${t}-auto-${e}`}h();h();h();h();var $e=class extends Error{status;body;requestId;type;constructor({message:e,status:r,body:n,requestId:i,type:o}){super(e),this.name="ApiError",this.status=r,this.body=n,this.requestId=i??"",this.type=o}},Xr=class extends $e{constructor(e){super(e),this.name="ValidationError"}get fieldErrors(){return Array.isArray(this.body?.detail)?this.body.detail:[]}getFieldErrors(e){return this.fieldErrors.filter(r=>r.loc[r.loc.length-1]===e)}};function Jp(t,e){if(t?.error?.message)return t.error.message;if(typeof t?.detail=="string")return t.detail;if(Array.isArray(t?.detail)){let r=t.detail[0];if(r?.msg)return`${r.msg} (${(r.loc??[]).join(".")})`}return typeof t?.message=="string"?t.message:e}async function Kn(t){let e=await t.text().catch(()=>""),r=e||void 0;try{r=e?JSON.parse(e):void 0}catch{}let n=typeof r=="object"&&r!==null?r:void 0,i={message:Jp(n,`${t.status} ${t.statusText}`.trim()),status:t.status,body:r,requestId:t.headers.get("x-framefields-request-id")??void 0,type:n?.error?.type};return t.status===422&&Array.isArray(n?.detail)?new Xr(i):new $e(i)}h();h();var ca="https://api.framefields.dev/v1/ai/proxy",ql,Zl=t=>typeof x<"u"?x.env?.[t]:void 0;function Kl(t){ql=t}function ef(){let t=ql??Zl("FRAMEFIELDS_API_KEY");if(!t)throw new Error("framefields ai: no API key. Set FRAMEFIELDS_API_KEY or call ai.config({ apiKey }). Create a key at https://framefields.dev/dashboard/keys");return t}function tf({service:t,path:e,query:r}){let n=new URLSearchParams;for(let[o,a]of Object.entries(r??{}))a!==void 0&&n.set(o,a);let i=n.size?`?${n}`:"";return`${t}/${e.replace(/^\/+/,"")}${i}`}async function ma(t){let e={Authorization:`Key ${ef()}`,Accept:t.accept??"application/json","x-framefields-target":tf(t)},r=t.body!==void 0;r&&(e["Content-Type"]="application/json");let n=await fetch(Zl("FRAMEFIELDS_AI_PROXY_URL")??ca,{method:t.method??(r?"POST":"GET"),headers:e,body:r?JSON.stringify(t.body):void 0,signal:t.signal});if(!n.ok)throw await Kn(n);return n}async function it(t){let e=await ma(t);return{data:await e.json(),requestId:e.headers.get("x-framefields-request-id")??""}}var rf=90*1024*1024,Ql=10*1024*1024,nf=3,of={"image/jpeg":"jpg","image/png":"png","image/webp":"webp","video/mp4":"mp4","audio/mpeg":"mp3","audio/wav":"wav"};function af(t,e){return"name"in t&&typeof t.name=="string"&&t.name?t.name:`${Date.now()}.${of[e]??"bin"}`}function Jl(t,e){let r=t.type||"application/octet-stream";return it({service:"storage",path:e?"upload/initiate-multipart":"upload/initiate",body:{content_type:r,file_name:af(t,r)}}).then(n=>n.data)}async function pa(t,e){let r=await fetch(t,e);if(!r.ok)throw await Kn(r);return r}async function sf(t,e){for(let r=1;;r++)try{return await(await pa(t,{method:"PUT",body:e})).json()}catch(n){if(r>=nf)throw n}}async function uf(t){let e=await Jl(t,!0),r=new URL(e.upload_url),n=o=>`${r.origin}${r.pathname}/${o}${r.search}`,i=[];for(let o=0;o<t.size;o+=Ql){let a=t.slice(o,Math.min(o+Ql,t.size));i.push(await sf(n(i.length+1),a))}return await pa(n("complete"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({parts:i.map(({partNumber:o,etag:a})=>({partNumber:o,etag:a}))})}),e.file_url}async function ec(t){if(t.size>rf)return uf(t);let e=await Jl(t,!1);return await pa(e.upload_url,{method:"PUT",body:t,headers:{"Content-Type":t.type||"application/octet-stream"}}),e.file_url}var lf=t=>typeof t=="object"&&t!==null&&Object.getPrototypeOf(t)===Object.prototype;async function da(t){if(t instanceof Blob)return await ec(t);if(Array.isArray(t))return await Promise.all(t.map(e=>da(e)));if(lf(t)){let e=await Promise.all(Object.entries(t).map(async([r,n])=>[r,await da(n)]));return Object.fromEntries(e)}return t}var Ct={upload:ec,transformInput:da};var cf=new Set([429,502,503,504]),mf=4,tc=(t,e)=>new Promise((r,n)=>{e?.throwIfAborted();let i=setTimeout(r,t);e?.addEventListener("abort",()=>{clearTimeout(i),n(e.reason)},{once:!0})});async function rc(t,e){for(let r=1;;r++)try{return await t()}catch(n){if(!(n instanceof $e&&cf.has(n.status))||r>=mf)throw n;await tc(500*2**r,e)}}var fa=(t,e,r="")=>`${t}/requests/${encodeURIComponent(e)}${r}`;async function nc(t,{input:e,abortSignal:r}){let{data:n}=await it({service:"queue",path:t,body:await Ct.transformInput(e)??{},signal:r});return n}function ic(t,{requestId:e,logs:r,abortSignal:n}){return rc(async()=>{let{data:i}=await it({service:"queue",path:fa(t,e,"/status"),query:{logs:r?"1":void 0},signal:n});return i},n)}function oc(t,{requestId:e,abortSignal:r}){return rc(async()=>{let{data:n}=await it({service:"queue",path:fa(t,e),signal:r});return{data:n,requestId:e}},r)}async function df(t,{requestId:e,abortSignal:r}){await it({service:"queue",path:fa(t,e,"/cancel"),method:"PUT",signal:r})}async function ac(t,e){let r=e.pollInterval??500;for(;;){let n=await ic(t,e);if(e.onQueueUpdate?.(n),n.status==="COMPLETED")return n;await tc(r,e.abortSignal)}}var sc={submit:nc,status:ic,result:oc,cancel:df,subscribeToStatus:ac};async function uc(t,e){let{request_id:r}=await nc(t,e);return e.onEnqueue?.(r),await ac(t,{...e,requestId:r}),oc(t,{requestId:r,abortSignal:e.abortSignal})}h();async function*pf(t){let e=new TextDecoder,r="";for await(let i of t){r+=e.decode(i,{stream:!0}).replace(/\r\n?/g,`
|
|
709
|
-
`);let o=r.indexOf(`
|
|
710
|
-
|
|
711
|
-
`);for(;o!==-1;){let a=r.slice(0,o);r=r.slice(o+2);let s=lc(a);s&&(yield s),o=r.indexOf(`
|
|
712
|
-
|
|
713
|
-
`)}}let n=lc(r);n&&(yield n)}function lc(t){let e="message",r=[];for(let n of t.split(`
|
|
714
|
-
`))n.startsWith("data:")?r.push(n.slice(5).replace(/^ /,"")):n.startsWith("event:")&&(e=n.slice(6).trim());return r.length?{event:e,data:r.join(`
|
|
715
|
-
`)}:null}async function*ff(t,e){for await(let{event:r,data:n}of pf(t)){let i=JSON.parse(n);if(r==="error")throw new $e({message:"The model stream ended with an error",status:500,body:i,requestId:e});yield i}}async function cc(t,{input:e,abortSignal:r}){let n=new AbortController,i=r?AbortSignal.any([r,n.signal]):n.signal,o=await ma({service:"run",path:`${t}/stream`,body:await Ct.transformInput(e)??{},accept:"text/event-stream",signal:i}),a=o.headers.get("x-framefields-request-id")??"";if(!o.body)throw new $e({message:"Empty stream",status:502,requestId:a});let s=ff(o.body,a),u,c;async function*d(){for await(let f of s)u=f,yield f}let m=d(),p=async()=>{let f=await m.next();for(;!f.done;)f=await m.next();if(u===void 0)throw new $e({message:"Stream had no output",status:502,requestId:a});return u};return{requestId:a,[Symbol.asyncIterator]:()=>m,done:()=>(c??=p(),c),abort:()=>n.abort()}}async function hf(t,{input:e,abortSignal:r}){return it({service:"run",path:t,body:await Ct.transformInput(e)??{},signal:r})}var gf={config(t){Kl(t.apiKey)},run:hf,subscribe:uc,stream:cc,queue:sc,storage:Ct};h();function bf(t,...e){let r=[];for(let n=0;n<t.length;n++){let i=t[n];if(i&&r.push({text:i}),n<e.length){let o=e[n];if(o==null)continue;if(Array.isArray(o))for(let a of o)typeof a=="string"?a&&r.push({text:a}):a&&typeof a=="object"&&"text"in a&&r.push(a);else typeof o=="object"&&"text"in o?r.push(o):typeof o=="object"&&"get"in o&&typeof o.get=="function"?r.push({text:o}):r.push({text:String(o)})}}return r}function yf(t,e={}){return{text:t,...e}}function xf(t,e={}){return{text:t,fontWeight:e.fontWeight??700,...e}}function wf(t,e={}){return{text:t,fontStyle:"italic",...e}}function vf(t,e={}){return{text:t,fill:e.fill??"#6366f1",...e}}function Sf(t,e,r={}){return{text:t,fill:e,...r}}function kf(t,e,r={}){return{text:t,fontSize:e,...r}}function Pf(t,e={}){let{bg:r,fill:n,radius:i,paddingX:o,paddingY:a,...s}=e;return{text:t,fill:n,mark:{background:r??"#6366f133",borderRadius:i??4,paddingX:o??6,paddingY:a??2},...s}}function Mf(t,e={}){return{text:t,baselineShift:e.baselineShift??-8,...e}}function Tf(t,e={}){return{text:t,baselineShift:e.baselineShift??6,...e}}function Af(t,e={}){return{text:t,fontFamily:e.fontFamily??"JetBrains Mono",mark:e.mark??{background:"#ffffff18",borderRadius:4,paddingX:6,paddingY:2},...e}}function Qn(t){if(typeof t=="string")return{text:t};if(!Array.isArray(t))return{text:String(t)};let e=[],r="";for(let n of t)if(typeof n=="string")n&&(e.push({text:n}),r+=n);else if(n&&typeof n=="object"&&"text"in n){let i=n;e.push(i);let o=typeof i.text=="string"?i.text:i.text&&typeof i.text=="object"&&"get"in i.text&&typeof i.text.get=="function"?String(i.text.get()):String(i.text??"");r+=o}return{text:r,spans:e.length>0?e:void 0}}function Cf(t){if(!t||!t.includes("<"))return[{text:t}];let e=[],r=/<(\/?[a-zA-Z0-9_-]+)([^>]*)>/g,n=0,i=[],o=()=>{let s={};for(let u of i)Object.assign(s,u.style);return s};for(;;){let s=r.exec(t);if(!s)break;let u=t.slice(n,s.index);u&&e.push({text:u,...o()}),n=s.index+s[0].length;let c=s[1].toLowerCase(),d=s[2];if(c.startsWith("/")){let m=c.slice(1);for(let p=i.length-1;p>=0;p--)if(i[p].tag===m){i.splice(p,1);break}}else{let m={},p=/([a-zA-Z0-9_-]+)=["']([^"']*)["']/g;for(;;){let b=p.exec(d);if(!b)break;m[b[1].toLowerCase()]=b[2]}let f={};if(c==="b"||c==="strong")f.fontWeight=700,(m.color||m.fill)&&(f.fill=m.color??m.fill);else if(c==="i"||c==="em")f.fontStyle="italic",(m.color||m.fill)&&(f.fill=m.color??m.fill);else if(c==="accent")f.fill="#6366f1";else if(c==="color")f.fill=m.value??m.hex??m.fill;else if(c==="size"){let b=parseFloat(m.value??m.px??m.pt??"0");b>0&&(f.fontSize=b)}else if(c==="mark")f.mark={background:m.bg??m.background??"#6366f133",borderRadius:m.radius?parseFloat(m.radius):4,paddingX:m.paddingx?parseFloat(m.paddingx):6,paddingY:m.paddingy?parseFloat(m.paddingy):2},(m.color||m.fill)&&(f.fill=m.color??m.fill);else if(c==="sup")f.baselineShift=-8;else if(c==="sub")f.baselineShift=6;else if(c==="code")f.fontFamily="JetBrains Mono",f.mark={background:m.bg??"#ffffff18",borderRadius:4,paddingX:6,paddingY:2};else if(c==="span"){if((m.color||m.fill)&&(f.fill=m.color??m.fill),m.fontfamily&&(f.fontFamily=m.fontfamily),m.fontsize&&(f.fontSize=parseFloat(m.fontsize)),m.fontweight){let b=parseInt(m.fontweight,10);f.fontWeight=Number.isNaN(b)?m.fontweight:b}(m.fontstyle==="italic"||m.fontstyle==="normal")&&(f.fontStyle=m.fontstyle),m.letterspacing&&(f.letterSpacing=parseFloat(m.letterspacing)),m.baselineshift&&(f.baselineShift=parseFloat(m.baselineshift)),m.opacity&&(f.opacity=parseFloat(m.opacity))}i.push({tag:c,style:f})}}let a=t.slice(n);return a&&e.push({text:a,...o()}),e}h();h();h();h();h();h();function mc(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function Dt(t,e){if(!isFinite(t)||t===0)return null;var r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"),n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}function Ye(t){return t=Dt(Math.abs(t)),t?t[1]:NaN}h();function dc(t,e){return function(r,n){for(var i=r.length,o=[],a=0,s=t[0],u=0;i>0&&s>0&&(u+s+1>n&&(s=Math.max(1,n-u)),o.push(r.substring(i-=s,i+s)),!((u+=s+1)>n));)s=t[a=(a+1)%t.length];return o.reverse().join(e)}}h();function pc(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}h();var Df=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function ft(t){if(!(e=Df.exec(t)))throw new Error("invalid format: "+t);var e;return new Jn({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}ft.prototype=Jn.prototype;function Jn(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}Jn.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};h();function fc(t){e:for(var e=t.length,r=1,n=-1,i;r<e;++r)switch(t[r]){case".":n=i=r;break;case"0":n===0&&(n=r),i=r;break;default:if(!+t[r])break e;n>0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}h();h();var qr;function hc(t,e){var r=Dt(t,e);if(!r)return qr=void 0,t.toPrecision(e);var n=r[0],i=r[1],o=i-(qr=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,a=n.length;return o===a?n:o>a?n+new Array(o-a+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Dt(t,Math.max(0,e+o-1))[0]}h();function ha(t,e){var r=Dt(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var ga={"%":(t,e)=>(t*100).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:mc,e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>ha(t*100,e),r:ha,s:hc,X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};h();function ba(t){return t}var gc=Array.prototype.map,bc=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];function yc(t){var e=t.grouping===void 0||t.thousands===void 0?ba:dc(gc.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",o=t.numerals===void 0?ba:pc(gc.call(t.numerals,String)),a=t.percent===void 0?"%":t.percent+"",s=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function c(m,p){m=ft(m);var f=m.fill,b=m.align,g=m.sign,y=m.symbol,k=m.zero,S=m.width,M=m.comma,w=m.precision,A=m.trim,v=m.type;v==="n"?(M=!0,v="g"):ga[v]||(w===void 0&&(w=12),A=!0,v="g"),(k||f==="0"&&b==="=")&&(k=!0,f="0",b="=");var N=(p&&p.prefix!==void 0?p.prefix:"")+(y==="$"?r:y==="#"&&/[boxX]/.test(v)?"0"+v.toLowerCase():""),C=(y==="$"?n:/[%p]/.test(v)?a:"")+(p&&p.suffix!==void 0?p.suffix:""),O=ga[v],$=/[defgprs%]/.test(v);w=w===void 0?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,w)):Math.max(0,Math.min(20,w));function z(L){var P=N,T=C,W,Y,_;if(v==="c")T=O(L)+T,L="";else{L=+L;var V=L<0||1/L<0;if(L=isNaN(L)?u:O(Math.abs(L),w),A&&(L=fc(L)),V&&+L==0&&g!=="+"&&(V=!1),P=(V?g==="("?g:s:g==="-"||g==="("?"":g)+P,T=(v==="s"&&!isNaN(L)&&qr!==void 0?bc[8+qr/3]:"")+T+(V&&g==="("?")":""),$){for(W=-1,Y=L.length;++W<Y;)if(_=L.charCodeAt(W),48>_||_>57){T=(_===46?i+L.slice(W+1):L.slice(W))+T,L=L.slice(0,W);break}}}M&&!k&&(L=e(L,1/0));var ee=P.length+L.length+T.length,oe=ee<S?new Array(S-ee+1).join(f):"";switch(M&&k&&(L=e(oe+L,oe.length?S-T.length:1/0),oe=""),b){case"<":L=P+L+T+oe;break;case"=":L=P+oe+L+T;break;case"^":L=oe.slice(0,ee=oe.length>>1)+P+L+T+oe.slice(ee);break;default:L=oe+P+L+T;break}return o(L)}return z.toString=function(){return m+""},z}function d(m,p){var f=Math.max(-8,Math.min(8,Math.floor(Ye(p)/3)))*3,b=Math.pow(10,-f),g=c((m=ft(m),m.type="f",m),{suffix:bc[8+f/3]});return function(y){return g(b*y)}}return{format:c,formatPrefix:d}}var ei,rr,ti;ya({thousands:",",grouping:[3],currency:["$",""]});function ya(t){return ei=yc(t),rr=ei.format,ti=ei.formatPrefix,ei}h();function xa(t){return Math.max(0,-Ye(Math.abs(t)))}h();function wa(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(Ye(e)/3)))*3-Ye(Math.abs(t)))}h();function va(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Ye(e)-Ye(t))+1}h();h();h();h();h();function Rt(t,e){return t==null||e==null?NaN:t<e?-1:t>e?1:t>=e?0:NaN}h();h();function Sa(t,e){return t==null||e==null?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function Nt(t){let e,r,n;t.length!==2?(e=Rt,r=(s,u)=>Rt(t(s),u),n=(s,u)=>t(s)-u):(e=t===Rt||t===Sa?t:Rf,r=t,n=t);function i(s,u,c=0,d=s.length){if(c<d){if(e(u,u)!==0)return d;do{let m=c+d>>>1;r(s[m],u)<0?c=m+1:d=m}while(c<d)}return c}function o(s,u,c=0,d=s.length){if(c<d){if(e(u,u)!==0)return d;do{let m=c+d>>>1;r(s[m],u)<=0?c=m+1:d=m}while(c<d)}return c}function a(s,u,c=0,d=s.length){let m=i(s,u,c,d-1);return m>c&&n(s[m-1],u)>-n(s[m],u)?m-1:m}return{left:i,center:a,right:o}}function Rf(){return 0}h();function ka(t){return t===null?NaN:+t}var xc=Nt(Rt),wc=xc.right,Nf=xc.left,Ff=Nt(ka).center,Pa=wc;h();var nr=class extends Map{constructor(e,r=Lf){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(vc(this,e))}has(e){return super.has(vc(this,e))}set(e,r){return super.set(Of(this,e),r)}delete(e){return super.delete(Bf(this,e))}};function vc({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function Of({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function Bf({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function Lf(t){return t!==null&&typeof t=="object"?t.valueOf():t}h();var Ef=Math.sqrt(50),If=Math.sqrt(10),Vf=Math.sqrt(2);function ri(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),o=n/Math.pow(10,i),a=o>=Ef?10:o>=If?5:o>=Vf?2:1,s,u,c;return i<0?(c=Math.pow(10,-i)/a,s=Math.round(t*c),u=Math.round(e*c),s/c<t&&++s,u/c>e&&--u,c=-c):(c=Math.pow(10,i)*a,s=Math.round(t/c),u=Math.round(e/c),s*c<t&&++s,u*c>e&&--u),u<s&&.5<=r&&r<2?ri(t,e,r*2):[s,u,c]}function ni(t,e,r){if(e=+e,t=+t,r=+r,!(r>0))return[];if(t===e)return[t];let n=e<t,[i,o,a]=n?ri(e,t,r):ri(t,e,r);if(!(o>=i))return[];let s=o-i+1,u=new Array(s);if(n)if(a<0)for(let c=0;c<s;++c)u[c]=(o-c)/-a;else for(let c=0;c<s;++c)u[c]=(o-c)*a;else if(a<0)for(let c=0;c<s;++c)u[c]=(i+c)/-a;else for(let c=0;c<s;++c)u[c]=(i+c)*a;return u}function Zr(t,e,r){return e=+e,t=+t,r=+r,ri(t,e,r)[2]}function ir(t,e,r){e=+e,t=+t,r=+r;let n=e<t,i=n?Zr(e,t,r):Zr(t,e,r);return(n?-1:1)*(i<0?1/-i:i)}h();function ii(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,o=new Array(i);++n<i;)o[n]=t+n*r;return o}h();function ht(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}h();var Sc=Symbol("implicit");function oi(){var t=new nr,e=[],r=[],n=Sc;function i(o){let a=t.get(o);if(a===void 0){if(n!==Sc)return n;t.set(o,a=e.push(o)-1)}return r[a%r.length]}return i.domain=function(o){if(!arguments.length)return e.slice();e=[],t=new nr;for(let a of o)t.has(a)||t.set(a,e.push(a)-1);return i},i.range=function(o){return arguments.length?(r=Array.from(o),i):r.slice()},i.unknown=function(o){return arguments.length?(n=o,i):n},i.copy=function(){return oi(e,r).unknown(n)},ht.apply(i,arguments),i}function Kr(){var t=oi().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,o,a,s=!1,u=0,c=0,d=.5;delete t.unknown;function m(){var p=e().length,f=i<n,b=f?i:n,g=f?n:i;o=(g-b)/Math.max(1,p-u+c*2),s&&(o=Math.floor(o)),b+=(g-b-o*(p-u))*d,a=o*(1-u),s&&(b=Math.round(b),a=Math.round(a));var y=ii(p).map(function(k){return b+o*k});return r(f?y.reverse():y)}return t.domain=function(p){return arguments.length?(e(p),m()):e()},t.range=function(p){return arguments.length?([n,i]=p,n=+n,i=+i,m()):[n,i]},t.rangeRound=function(p){return[n,i]=p,n=+n,i=+i,s=!0,m()},t.bandwidth=function(){return a},t.step=function(){return o},t.round=function(p){return arguments.length?(s=!!p,m()):s},t.padding=function(p){return arguments.length?(u=Math.min(1,c=+p),m()):u},t.paddingInner=function(p){return arguments.length?(u=Math.min(1,p),m()):u},t.paddingOuter=function(p){return arguments.length?(c=+p,m()):c},t.align=function(p){return arguments.length?(d=Math.max(0,Math.min(1,p)),m()):d},t.copy=function(){return Kr(e(),[n,i]).round(s).paddingInner(u).paddingOuter(c).align(d)},ht.apply(m(),arguments)}h();h();h();h();h();h();h();function ai(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function Ma(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}function en(){}var Qr=.7,li=1/Qr,or="\\s*([+-]?\\d+)\\s*",Jr="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",Xe="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",zf=/^#([0-9a-f]{3,8})$/,jf=new RegExp(`^rgb\\(${or},${or},${or}\\)$`),$f=new RegExp(`^rgb\\(${Xe},${Xe},${Xe}\\)$`),_f=new RegExp(`^rgba\\(${or},${or},${or},${Jr}\\)$`),Uf=new RegExp(`^rgba\\(${Xe},${Xe},${Xe},${Jr}\\)$`),Gf=new RegExp(`^hsl\\(${Jr},${Xe},${Xe}\\)$`),Wf=new RegExp(`^hsla\\(${Jr},${Xe},${Xe},${Jr}\\)$`),kc={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};ai(en,gt,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Pc,formatHex:Pc,formatHex8:Hf,formatHsl:Yf,formatRgb:Mc,toString:Mc});function Pc(){return this.rgb().formatHex()}function Hf(){return this.rgb().formatHex8()}function Yf(){return Nc(this).formatHsl()}function Mc(){return this.rgb().formatRgb()}function gt(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=zf.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?Tc(e):r===3?new Ie(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?si(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?si(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=jf.exec(t))?new Ie(e[1],e[2],e[3],1):(e=$f.exec(t))?new Ie(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=_f.exec(t))?si(e[1],e[2],e[3],e[4]):(e=Uf.exec(t))?si(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Gf.exec(t))?Dc(e[1],e[2]/100,e[3]/100,1):(e=Wf.exec(t))?Dc(e[1],e[2]/100,e[3]/100,e[4]):kc.hasOwnProperty(t)?Tc(kc[t]):t==="transparent"?new Ie(NaN,NaN,NaN,0):null}function Tc(t){return new Ie(t>>16&255,t>>8&255,t&255,1)}function si(t,e,r,n){return n<=0&&(t=e=r=NaN),new Ie(t,e,r,n)}function Xf(t){return t instanceof en||(t=gt(t)),t?(t=t.rgb(),new Ie(t.r,t.g,t.b,t.opacity)):new Ie}function ar(t,e,r,n){return arguments.length===1?Xf(t):new Ie(t,e,r,n??1)}function Ie(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}ai(Ie,ar,Ma(en,{brighter(t){return t=t==null?li:Math.pow(li,t),new Ie(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Qr:Math.pow(Qr,t),new Ie(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Ie(Ot(this.r),Ot(this.g),Ot(this.b),ci(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Ac,formatHex:Ac,formatHex8:qf,formatRgb:Cc,toString:Cc}));function Ac(){return`#${Ft(this.r)}${Ft(this.g)}${Ft(this.b)}`}function qf(){return`#${Ft(this.r)}${Ft(this.g)}${Ft(this.b)}${Ft((isNaN(this.opacity)?1:this.opacity)*255)}`}function Cc(){let t=ci(this.opacity);return`${t===1?"rgb(":"rgba("}${Ot(this.r)}, ${Ot(this.g)}, ${Ot(this.b)}${t===1?")":`, ${t})`}`}function ci(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Ot(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Ft(t){return t=Ot(t),(t<16?"0":"")+t.toString(16)}function Dc(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new _e(t,e,r,n)}function Nc(t){if(t instanceof _e)return new _e(t.h,t.s,t.l,t.opacity);if(t instanceof en||(t=gt(t)),!t)return new _e;if(t instanceof _e)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),o=Math.max(e,r,n),a=NaN,s=o-i,u=(o+i)/2;return s?(e===o?a=(r-n)/s+(r<n)*6:r===o?a=(n-e)/s+2:a=(e-r)/s+4,s/=u<.5?o+i:2-o-i,a*=60):s=u>0&&u<1?0:a,new _e(a,s,u,t.opacity)}function Fc(t,e,r,n){return arguments.length===1?Nc(t):new _e(t,e,r,n??1)}function _e(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}ai(_e,Fc,Ma(en,{brighter(t){return t=t==null?li:Math.pow(li,t),new _e(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Qr:Math.pow(Qr,t),new _e(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new Ie(Ta(t>=240?t-240:t+120,i,n),Ta(t,i,n),Ta(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new _e(Rc(this.h),ui(this.s),ui(this.l),ci(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=ci(this.opacity);return`${t===1?"hsl(":"hsla("}${Rc(this.h)}, ${ui(this.s)*100}%, ${ui(this.l)*100}%${t===1?")":`, ${t})`}`}}));function Rc(t){return t=(t||0)%360,t<0?t+360:t}function ui(t){return Math.max(0,Math.min(1,t||0))}function Ta(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}h();h();function Aa(t,e,r,n,i){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*r+(1+3*t+3*o-3*a)*n+a*i)/6}function Oc(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],o=t[n+1],a=n>0?t[n-1]:2*i-o,s=n<e-1?t[n+2]:2*o-i;return Aa((r-n/e)*e,a,i,o,s)}}h();function Bc(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],o=t[n%e],a=t[(n+1)%e],s=t[(n+2)%e];return Aa((r-n/e)*e,i,o,a,s)}}h();h();var tn=t=>()=>t;function Zf(t,e){return function(r){return t+r*e}}function Kf(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function Lc(t){return(t=+t)==1?mi:function(e,r){return r-e?Kf(e,r,t):tn(isNaN(e)?r:e)}}function mi(t,e){var r=e-t;return r?Zf(t,r):tn(isNaN(t)?e:t)}var Ca=(function t(e){var r=Lc(e);function n(i,o){var a=r((i=ar(i)).r,(o=ar(o)).r),s=r(i.g,o.g),u=r(i.b,o.b),c=mi(i.opacity,o.opacity);return function(d){return i.r=a(d),i.g=s(d),i.b=u(d),i.opacity=c(d),i+""}}return n.gamma=t,n})(1);function Ec(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),o=new Array(r),a,s;for(a=0;a<r;++a)s=ar(e[a]),n[a]=s.r||0,i[a]=s.g||0,o[a]=s.b||0;return n=t(n),i=t(i),o=t(o),s.opacity=1,function(u){return s.r=n(u),s.g=i(u),s.b=o(u),s+""}}}var OS=Ec(Oc),BS=Ec(Bc);h();h();function Ic(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(o){for(i=0;i<r;++i)n[i]=t[i]*(1-o)+e[i]*o;return n}}function Vc(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function zc(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),o=new Array(r),a;for(a=0;a<n;++a)i[a]=Bt(t[a],e[a]);for(;a<r;++a)o[a]=e[a];return function(s){for(a=0;a<n;++a)o[a]=i[a](s);return o}}h();function jc(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}h();function bt(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}h();function $c(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=Bt(t[i],e[i]):n[i]=e[i];return function(o){for(i in r)n[i]=r[i](o);return n}}h();var Ra=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Da=new RegExp(Ra.source,"g");function Qf(t){return function(){return t}}function Jf(t){return function(e){return t(e)+""}}function _c(t,e){var r=Ra.lastIndex=Da.lastIndex=0,n,i,o,a=-1,s=[],u=[];for(t=t+"",e=e+"";(n=Ra.exec(t))&&(i=Da.exec(e));)(o=i.index)>r&&(o=e.slice(r,o),s[a]?s[a]+=o:s[++a]=o),(n=n[0])===(i=i[0])?s[a]?s[a]+=i:s[++a]=i:(s[++a]=null,u.push({i:a,x:bt(n,i)})),r=Da.lastIndex;return r<e.length&&(o=e.slice(r),s[a]?s[a]+=o:s[++a]=o),s.length<2?u[0]?Jf(u[0].x):Qf(e):(e=u.length,function(c){for(var d=0,m;d<e;++d)s[(m=u[d]).i]=m.x(c);return s.join("")})}function Bt(t,e){var r=typeof e,n;return e==null||r==="boolean"?tn(e):(r==="number"?bt:r==="string"?(n=gt(e))?(e=n,Ca):_c:e instanceof gt?Ca:e instanceof Date?jc:Vc(e)?Ic:Array.isArray(e)?zc:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?$c:bt)(t,e)}h();function Na(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}h();function Fa(t){return function(){return t}}h();function Oa(t){return+t}var Uc=[0,1];function sr(t){return t}function Ba(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:Fa(isNaN(e)?NaN:.5)}function eh(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function th(t,e,r){var n=t[0],i=t[1],o=e[0],a=e[1];return i<n?(n=Ba(i,n),o=r(a,o)):(n=Ba(n,i),o=r(o,a)),function(s){return o(n(s))}}function rh(t,e,r){var n=Math.min(t.length,e.length)-1,i=new Array(n),o=new Array(n),a=-1;for(t[n]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++a<n;)i[a]=Ba(t[a],t[a+1]),o[a]=r(e[a],e[a+1]);return function(s){var u=Pa(t,s,1,n)-1;return o[u](i[u](s))}}function di(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function nh(){var t=Uc,e=Uc,r=Bt,n,i,o,a=sr,s,u,c;function d(){var p=Math.min(t.length,e.length);return a!==sr&&(a=eh(t[0],t[p-1])),s=p>2?rh:th,u=c=null,m}function m(p){return p==null||isNaN(p=+p)?o:(u||(u=s(t.map(n),e,r)))(n(a(p)))}return m.invert=function(p){return a(i((c||(c=s(e,t.map(n),bt)))(p)))},m.domain=function(p){return arguments.length?(t=Array.from(p,Oa),d()):t.slice()},m.range=function(p){return arguments.length?(e=Array.from(p),d()):e.slice()},m.rangeRound=function(p){return e=Array.from(p),r=Na,d()},m.clamp=function(p){return arguments.length?(a=p?!0:sr,d()):a!==sr},m.interpolate=function(p){return arguments.length?(r=p,d()):r},m.unknown=function(p){return arguments.length?(o=p,m):o},function(p,f){return n=p,i=f,d()}}function rn(){return nh()(sr,sr)}h();function La(t,e,r,n){var i=ir(t,e,r),o;switch(n=ft(n??",f"),n.type){case"s":{var a=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(o=wa(i,a))&&(n.precision=o),ti(n,a)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(o=va(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=o-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(o=xa(i))&&(n.precision=o-(n.type==="%")*2);break}}return rr(n)}function ih(t){var e=t.domain;return t.ticks=function(r){var n=e();return ni(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return La(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,o=n.length-1,a=n[i],s=n[o],u,c,d=10;for(s<a&&(c=a,a=s,s=c,c=i,i=o,o=c);d-- >0;){if(c=Zr(a,s,r),c===u)return n[i]=a,n[o]=s,e(n);if(c>0)a=Math.floor(a/c)*c,s=Math.ceil(s/c)*c;else if(c<0)a=Math.ceil(a*c)/c,s=Math.floor(s*c)/c;else break;u=c}return t},t}function ur(){var t=rn();return t.copy=function(){return di(t,ur())},ht.apply(t,arguments),ih(t)}h();function Ea(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],o=t[n],a;return o<i&&(a=r,r=n,n=a,a=i,i=o,o=a),t[r]=e.floor(i),t[n]=e.ceil(o),t}h();h();h();var Ia=new Date,Va=new Date;function de(t,e,r,n){function i(o){return t(o=arguments.length===0?new Date:new Date(+o)),o}return i.floor=o=>(t(o=new Date(+o)),o),i.ceil=o=>(t(o=new Date(o-1)),e(o,1),t(o),o),i.round=o=>{let a=i(o),s=i.ceil(o);return o-a<s-o?a:s},i.offset=(o,a)=>(e(o=new Date(+o),a==null?1:Math.floor(a)),o),i.range=(o,a,s)=>{let u=[];if(o=i.ceil(o),s=s==null?1:Math.floor(s),!(o<a)||!(s>0))return u;let c;do u.push(c=new Date(+o)),e(o,s),t(o);while(c<o&&o<a);return u},i.filter=o=>de(a=>{if(a>=a)for(;t(a),!o(a);)a.setTime(a-1)},(a,s)=>{if(a>=a)if(s<0)for(;++s<=0;)for(;e(a,-1),!o(a););else for(;--s>=0;)for(;e(a,1),!o(a););}),r&&(i.count=(o,a)=>(Ia.setTime(+o),Va.setTime(+a),t(Ia),t(Va),Math.floor(r(Ia,Va))),i.every=o=>(o=Math.floor(o),!isFinite(o)||!(o>0)?null:o>1?i.filter(n?a=>n(a)%o===0:a=>i.count(0,a)%o===0):i)),i}h();var nn=de(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);nn.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?de(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):nn);var $k=nn.range;h();var qe=de(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),Gc=qe.range;h();var pi=de(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),oh=pi.range,lr=de(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),ah=lr.range;h();var fi=de(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),sh=fi.range,cr=de(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),uh=cr.range;h();var It=de(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),lh=It.range,Vt=de(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),ch=Vt.range,hi=de(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),mh=hi.range;h();function zt(t){return de(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}var jt=zt(0),mr=zt(1),Hc=zt(2),Yc=zt(3),yt=zt(4),Xc=zt(5),qc=zt(6),Zc=jt.range,dh=mr.range,ph=Hc.range,fh=Yc.range,hh=yt.range,gh=Xc.range,bh=qc.range;function $t(t){return de(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var ot=$t(0),dr=$t(1),Kc=$t(2),Qc=$t(3),xt=$t(4),Jc=$t(5),em=$t(6),tm=ot.range,yh=dr.range,xh=Kc.range,wh=Qc.range,vh=xt.range,Sh=Jc.range,kh=em.range;h();var gi=de(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),Ph=gi.range,pr=de(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),Mh=pr.range;h();var Ue=de(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());Ue.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:de(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});var Th=Ue.range,ze=de(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());ze.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:de(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});var Ah=ze.range;h();function nm(t,e,r,n,i,o){let a=[[qe,1,1e3],[qe,5,5*1e3],[qe,15,15*1e3],[qe,30,30*1e3],[o,1,6e4],[o,5,5*6e4],[o,15,15*6e4],[o,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function s(c,d,m){let p=d<c;p&&([c,d]=[d,c]);let f=m&&typeof m.range=="function"?m:u(c,d,m),b=f?f.range(c,+d+1):[];return p?b.reverse():b}function u(c,d,m){let p=Math.abs(d-c)/m,f=Nt(([,,y])=>y).right(a,p);if(f===a.length)return t.every(ir(c/31536e6,d/31536e6,m));if(f===0)return nn.every(Math.max(ir(c,d,m),1));let[b,g]=a[p/a[f-1][2]<a[f][2]/p?f-1:f];return b.every(g)}return[s,u]}var[za,ja]=nm(ze,pr,ot,hi,cr,lr),[Dh,Rh]=nm(Ue,gi,jt,It,fi,pi);h();h();h();function $a(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function _a(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function an(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function Ua(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,o=t.days,a=t.shortDays,s=t.months,u=t.shortMonths,c=sn(i),d=un(i),m=sn(o),p=un(o),f=sn(a),b=un(a),g=sn(s),y=un(s),k=sn(u),S=un(u),M={a:_,A:V,b:ee,B:oe,c:null,d:lm,e:lm,f:Jh,g:lg,G:mg,H:Zh,I:Kh,j:Qh,L:fm,m:eg,M:tg,p:ge,q:ce,Q:dm,s:pm,S:rg,u:ng,U:ig,V:og,w:ag,W:sg,x:null,X:null,y:ug,Y:cg,Z:dg,"%":mm},w={a:E,A:j,b:H,B:Q,c:null,d:cm,e:cm,f:gg,g:Tg,G:Cg,H:pg,I:fg,j:hg,L:gm,m:bg,M:yg,p:X,q:te,Q:dm,s:pm,S:xg,u:wg,U:vg,V:Sg,w:kg,W:Pg,x:null,X:null,y:Mg,Y:Ag,Z:Dg,"%":mm},A={a:$,A:z,b:L,B:P,c:T,d:sm,e:sm,f:Hh,g:am,G:om,H:um,I:um,j:_h,L:Wh,m:$h,M:Uh,p:O,q:jh,Q:Xh,s:qh,S:Gh,u:Lh,U:Eh,V:Ih,w:Bh,W:Vh,x:W,X:Y,y:am,Y:om,Z:zh,"%":Yh};M.x=v(r,M),M.X=v(n,M),M.c=v(e,M),w.x=v(r,w),w.X=v(n,w),w.c=v(e,w);function v(F,I){return function(q){var R=[],Se=-1,me=0,Ce=F.length,De,Qe,xn;for(q instanceof Date||(q=new Date(+q));++Se<Ce;)F.charCodeAt(Se)===37&&(R.push(F.slice(me,Se)),(Qe=im[De=F.charAt(++Se)])!=null?De=F.charAt(++Se):Qe=De==="e"?" ":"0",(xn=I[De])&&(De=xn(q,Qe)),R.push(De),me=Se+1);return R.push(F.slice(me,Se)),R.join("")}}function N(F,I){return function(q){var R=an(1900,void 0,1),Se=C(R,F,q+="",0),me,Ce;if(Se!=q.length)return null;if("Q"in R)return new Date(R.Q);if("s"in R)return new Date(R.s*1e3+("L"in R?R.L:0));if(I&&!("Z"in R)&&(R.Z=0),"p"in R&&(R.H=R.H%12+R.p*12),R.m===void 0&&(R.m="q"in R?R.q:0),"V"in R){if(R.V<1||R.V>53)return null;"w"in R||(R.w=1),"Z"in R?(me=_a(an(R.y,0,1)),Ce=me.getUTCDay(),me=Ce>4||Ce===0?dr.ceil(me):dr(me),me=Vt.offset(me,(R.V-1)*7),R.y=me.getUTCFullYear(),R.m=me.getUTCMonth(),R.d=me.getUTCDate()+(R.w+6)%7):(me=$a(an(R.y,0,1)),Ce=me.getDay(),me=Ce>4||Ce===0?mr.ceil(me):mr(me),me=It.offset(me,(R.V-1)*7),R.y=me.getFullYear(),R.m=me.getMonth(),R.d=me.getDate()+(R.w+6)%7)}else("W"in R||"U"in R)&&("w"in R||(R.w="u"in R?R.u%7:"W"in R?1:0),Ce="Z"in R?_a(an(R.y,0,1)).getUTCDay():$a(an(R.y,0,1)).getDay(),R.m=0,R.d="W"in R?(R.w+6)%7+R.W*7-(Ce+5)%7:R.w+R.U*7-(Ce+6)%7);return"Z"in R?(R.H+=R.Z/100|0,R.M+=R.Z%100,_a(R)):$a(R)}}function C(F,I,q,R){for(var Se=0,me=I.length,Ce=q.length,De,Qe;Se<me;){if(R>=Ce)return-1;if(De=I.charCodeAt(Se++),De===37){if(De=I.charAt(Se++),Qe=A[De in im?I.charAt(Se++):De],!Qe||(R=Qe(F,q,R))<0)return-1}else if(De!=q.charCodeAt(R++))return-1}return R}function O(F,I,q){var R=c.exec(I.slice(q));return R?(F.p=d.get(R[0].toLowerCase()),q+R[0].length):-1}function $(F,I,q){var R=f.exec(I.slice(q));return R?(F.w=b.get(R[0].toLowerCase()),q+R[0].length):-1}function z(F,I,q){var R=m.exec(I.slice(q));return R?(F.w=p.get(R[0].toLowerCase()),q+R[0].length):-1}function L(F,I,q){var R=k.exec(I.slice(q));return R?(F.m=S.get(R[0].toLowerCase()),q+R[0].length):-1}function P(F,I,q){var R=g.exec(I.slice(q));return R?(F.m=y.get(R[0].toLowerCase()),q+R[0].length):-1}function T(F,I,q){return C(F,e,I,q)}function W(F,I,q){return C(F,r,I,q)}function Y(F,I,q){return C(F,n,I,q)}function _(F){return a[F.getDay()]}function V(F){return o[F.getDay()]}function ee(F){return u[F.getMonth()]}function oe(F){return s[F.getMonth()]}function ge(F){return i[+(F.getHours()>=12)]}function ce(F){return 1+~~(F.getMonth()/3)}function E(F){return a[F.getUTCDay()]}function j(F){return o[F.getUTCDay()]}function H(F){return u[F.getUTCMonth()]}function Q(F){return s[F.getUTCMonth()]}function X(F){return i[+(F.getUTCHours()>=12)]}function te(F){return 1+~~(F.getUTCMonth()/3)}return{format:function(F){var I=v(F+="",M);return I.toString=function(){return F},I},parse:function(F){var I=N(F+="",!1);return I.toString=function(){return F},I},utcFormat:function(F){var I=v(F+="",w);return I.toString=function(){return F},I},utcParse:function(F){var I=N(F+="",!0);return I.toString=function(){return F},I}}}var im={"-":"",_:" ",0:"0"},Pe=/^\s*\d+/,Nh=/^%/,Fh=/[\\^$*+?|[\]().{}]/g;function se(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",o=i.length;return n+(o<r?new Array(r-o+1).join(e)+i:i)}function Oh(t){return t.replace(Fh,"\\$&")}function sn(t){return new RegExp("^(?:"+t.map(Oh).join("|")+")","i")}function un(t){return new Map(t.map((e,r)=>[e.toLowerCase(),r]))}function Bh(t,e,r){var n=Pe.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function Lh(t,e,r){var n=Pe.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function Eh(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function Ih(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function Vh(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function om(t,e,r){var n=Pe.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function am(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function zh(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function jh(t,e,r){var n=Pe.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function $h(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function sm(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function _h(t,e,r){var n=Pe.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function um(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function Uh(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function Gh(t,e,r){var n=Pe.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function Wh(t,e,r){var n=Pe.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function Hh(t,e,r){var n=Pe.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function Yh(t,e,r){var n=Nh.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function Xh(t,e,r){var n=Pe.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function qh(t,e,r){var n=Pe.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function lm(t,e){return se(t.getDate(),e,2)}function Zh(t,e){return se(t.getHours(),e,2)}function Kh(t,e){return se(t.getHours()%12||12,e,2)}function Qh(t,e){return se(1+It.count(Ue(t),t),e,3)}function fm(t,e){return se(t.getMilliseconds(),e,3)}function Jh(t,e){return fm(t,e)+"000"}function eg(t,e){return se(t.getMonth()+1,e,2)}function tg(t,e){return se(t.getMinutes(),e,2)}function rg(t,e){return se(t.getSeconds(),e,2)}function ng(t){var e=t.getDay();return e===0?7:e}function ig(t,e){return se(jt.count(Ue(t)-1,t),e,2)}function hm(t){var e=t.getDay();return e>=4||e===0?yt(t):yt.ceil(t)}function og(t,e){return t=hm(t),se(yt.count(Ue(t),t)+(Ue(t).getDay()===4),e,2)}function ag(t){return t.getDay()}function sg(t,e){return se(mr.count(Ue(t)-1,t),e,2)}function ug(t,e){return se(t.getFullYear()%100,e,2)}function lg(t,e){return t=hm(t),se(t.getFullYear()%100,e,2)}function cg(t,e){return se(t.getFullYear()%1e4,e,4)}function mg(t,e){var r=t.getDay();return t=r>=4||r===0?yt(t):yt.ceil(t),se(t.getFullYear()%1e4,e,4)}function dg(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+se(e/60|0,"0",2)+se(e%60,"0",2)}function cm(t,e){return se(t.getUTCDate(),e,2)}function pg(t,e){return se(t.getUTCHours(),e,2)}function fg(t,e){return se(t.getUTCHours()%12||12,e,2)}function hg(t,e){return se(1+Vt.count(ze(t),t),e,3)}function gm(t,e){return se(t.getUTCMilliseconds(),e,3)}function gg(t,e){return gm(t,e)+"000"}function bg(t,e){return se(t.getUTCMonth()+1,e,2)}function yg(t,e){return se(t.getUTCMinutes(),e,2)}function xg(t,e){return se(t.getUTCSeconds(),e,2)}function wg(t){var e=t.getUTCDay();return e===0?7:e}function vg(t,e){return se(ot.count(ze(t)-1,t),e,2)}function bm(t){var e=t.getUTCDay();return e>=4||e===0?xt(t):xt.ceil(t)}function Sg(t,e){return t=bm(t),se(xt.count(ze(t),t)+(ze(t).getUTCDay()===4),e,2)}function kg(t){return t.getUTCDay()}function Pg(t,e){return se(dr.count(ze(t)-1,t),e,2)}function Mg(t,e){return se(t.getUTCFullYear()%100,e,2)}function Tg(t,e){return t=bm(t),se(t.getUTCFullYear()%100,e,2)}function Ag(t,e){return se(t.getUTCFullYear()%1e4,e,4)}function Cg(t,e){var r=t.getUTCDay();return t=r>=4||r===0?xt(t):xt.ceil(t),se(t.getUTCFullYear()%1e4,e,4)}function Dg(){return"+0000"}function mm(){return"%"}function dm(t){return+t}function pm(t){return Math.floor(+t/1e3)}var fr,ym,xm,bi,wm;Ga({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function Ga(t){return fr=Ua(t),ym=fr.format,xm=fr.parse,bi=fr.utcFormat,wm=fr.utcParse,fr}function Rg(t){return new Date(t)}function Ng(t){return t instanceof Date?+t:+new Date(+t)}function Wa(t,e,r,n,i,o,a,s,u,c){var d=rn(),m=d.invert,p=d.domain,f=c(".%L"),b=c(":%S"),g=c("%I:%M"),y=c("%I %p"),k=c("%a %d"),S=c("%b %d"),M=c("%B"),w=c("%Y");function A(v){return(u(v)<v?f:s(v)<v?b:a(v)<v?g:o(v)<v?y:n(v)<v?i(v)<v?k:S:r(v)<v?M:w)(v)}return d.invert=function(v){return new Date(m(v))},d.domain=function(v){return arguments.length?p(Array.from(v,Ng)):p().map(Rg)},d.ticks=function(v){var N=p();return t(N[0],N[N.length-1],v??10)},d.tickFormat=function(v,N){return N==null?A:c(N)},d.nice=function(v){var N=p();return(!v||typeof v.range!="function")&&(v=e(N[0],N[N.length-1],v??10)),v?p(Ea(N,v)):d},d.copy=function(){return di(d,Wa(t,e,r,n,i,o,a,s,u,c))},d}h();function yi(){return ht.apply(Wa(za,ja,ze,pr,ot,Vt,cr,lr,qe,bi).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}h();h();h();function J(t){return function(){return t}}h();var Ha=Math.abs,Ae=Math.atan2,wt=Math.cos,vm=Math.max,xi=Math.min,Ge=Math.sin,_t=Math.sqrt,Le=1e-12,hr=Math.PI,ln=hr/2,gr=2*hr;function Sm(t){return t>1?0:t<-1?hr:Math.acos(t)}function Ya(t){return t>=1?ln:t<=-1?-ln:Math.asin(t)}h();h();h();var Xa=Math.PI,qa=2*Xa,Ut=1e-6,Fg=qa-Ut;function km(t){this._+=t[0];for(let e=1,r=t.length;e<r;++e)this._+=arguments[e]+t[e]}function Og(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return km;let r=10**e;return function(n){this._+=n[0];for(let i=1,o=n.length;i<o;++i)this._+=Math.round(arguments[i]*r)/r+n[i]}}var Gt=class{constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?km:Og(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,o,a){this._append`C${+e},${+r},${+n},${+i},${this._x1=+o},${this._y1=+a}`}arcTo(e,r,n,i,o){if(e=+e,r=+r,n=+n,i=+i,o=+o,o<0)throw new Error(`negative radius: ${o}`);let a=this._x1,s=this._y1,u=n-e,c=i-r,d=a-e,m=s-r,p=d*d+m*m;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>Ut)if(!(Math.abs(m*u-c*d)>Ut)||!o)this._append`L${this._x1=e},${this._y1=r}`;else{let f=n-a,b=i-s,g=u*u+c*c,y=f*f+b*b,k=Math.sqrt(g),S=Math.sqrt(p),M=o*Math.tan((Xa-Math.acos((g+p-y)/(2*k*S)))/2),w=M/S,A=M/k;Math.abs(w-1)>Ut&&this._append`L${e+w*d},${r+w*m}`,this._append`A${o},${o},0,0,${+(m*f>d*b)},${this._x1=e+A*u},${this._y1=r+A*c}`}}arc(e,r,n,i,o,a){if(e=+e,r=+r,n=+n,a=!!a,n<0)throw new Error(`negative radius: ${n}`);let s=n*Math.cos(i),u=n*Math.sin(i),c=e+s,d=r+u,m=1^a,p=a?i-o:o-i;this._x1===null?this._append`M${c},${d}`:(Math.abs(this._x1-c)>Ut||Math.abs(this._y1-d)>Ut)&&this._append`L${c},${d}`,n&&(p<0&&(p=p%qa+qa),p>Fg?this._append`A${n},${n},0,1,${m},${e-s},${r-u}A${n},${n},0,1,${m},${this._x1=c},${this._y1=d}`:p>Ut&&this._append`A${n},${n},0,${+(p>=Xa)},${m},${this._x1=e+n*Math.cos(o)},${this._y1=r+n*Math.sin(o)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};function Pm(){return new Gt}Pm.prototype=Gt.prototype;function br(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new Gt(e)}function Bg(t){return t.innerRadius}function Lg(t){return t.outerRadius}function Eg(t){return t.startAngle}function Ig(t){return t.endAngle}function Vg(t){return t&&t.padAngle}function zg(t,e,r,n,i,o,a,s){var u=r-t,c=n-e,d=a-i,m=s-o,p=m*u-d*c;if(!(p*p<Le))return p=(d*(e-o)-m*(t-i))/p,[t+p*u,e+p*c]}function wi(t,e,r,n,i,o,a){var s=t-r,u=e-n,c=(a?o:-o)/_t(s*s+u*u),d=c*u,m=-c*s,p=t+d,f=e+m,b=r+d,g=n+m,y=(p+b)/2,k=(f+g)/2,S=b-p,M=g-f,w=S*S+M*M,A=i-o,v=p*g-b*f,N=(M<0?-1:1)*_t(vm(0,A*A*w-v*v)),C=(v*M-S*N)/w,O=(-v*S-M*N)/w,$=(v*M+S*N)/w,z=(-v*S+M*N)/w,L=C-y,P=O-k,T=$-y,W=z-k;return L*L+P*P>T*T+W*W&&(C=$,O=z),{cx:C,cy:O,x01:-d,y01:-m,x11:C*(i/A-1),y11:O*(i/A-1)}}function vi(){var t=Bg,e=Lg,r=J(0),n=null,i=Eg,o=Ig,a=Vg,s=null,u=br(c);function c(){var d,m,p=+t.apply(this,arguments),f=+e.apply(this,arguments),b=i.apply(this,arguments)-ln,g=o.apply(this,arguments)-ln,y=Ha(g-b),k=g>b;if(s||(s=d=u()),f<p&&(m=f,f=p,p=m),!(f>Le))s.moveTo(0,0);else if(y>gr-Le)s.moveTo(f*wt(b),f*Ge(b)),s.arc(0,0,f,b,g,!k),p>Le&&(s.moveTo(p*wt(g),p*Ge(g)),s.arc(0,0,p,g,b,k));else{var S=b,M=g,w=b,A=g,v=y,N=y,C=a.apply(this,arguments)/2,O=C>Le&&(n?+n.apply(this,arguments):_t(p*p+f*f)),$=xi(Ha(f-p)/2,+r.apply(this,arguments)),z=$,L=$,P,T;if(O>Le){var W=Ya(O/p*Ge(C)),Y=Ya(O/f*Ge(C));(v-=W*2)>Le?(W*=k?1:-1,w+=W,A-=W):(v=0,w=A=(b+g)/2),(N-=Y*2)>Le?(Y*=k?1:-1,S+=Y,M-=Y):(N=0,S=M=(b+g)/2)}var _=f*wt(S),V=f*Ge(S),ee=p*wt(A),oe=p*Ge(A);if($>Le){var ge=f*wt(M),ce=f*Ge(M),E=p*wt(w),j=p*Ge(w),H;if(y<hr)if(H=zg(_,V,E,j,ge,ce,ee,oe)){var Q=_-H[0],X=V-H[1],te=ge-H[0],F=ce-H[1],I=1/Ge(Sm((Q*te+X*F)/(_t(Q*Q+X*X)*_t(te*te+F*F)))/2),q=_t(H[0]*H[0]+H[1]*H[1]);z=xi($,(p-q)/(I-1)),L=xi($,(f-q)/(I+1))}else z=L=0}N>Le?L>Le?(P=wi(E,j,_,V,f,L,k),T=wi(ge,ce,ee,oe,f,L,k),s.moveTo(P.cx+P.x01,P.cy+P.y01),L<$?s.arc(P.cx,P.cy,L,Ae(P.y01,P.x01),Ae(T.y01,T.x01),!k):(s.arc(P.cx,P.cy,L,Ae(P.y01,P.x01),Ae(P.y11,P.x11),!k),s.arc(0,0,f,Ae(P.cy+P.y11,P.cx+P.x11),Ae(T.cy+T.y11,T.cx+T.x11),!k),s.arc(T.cx,T.cy,L,Ae(T.y11,T.x11),Ae(T.y01,T.x01),!k))):(s.moveTo(_,V),s.arc(0,0,f,S,M,!k)):s.moveTo(_,V),!(p>Le)||!(v>Le)?s.lineTo(ee,oe):z>Le?(P=wi(ee,oe,ge,ce,p,-z,k),T=wi(_,V,E,j,p,-z,k),s.lineTo(P.cx+P.x01,P.cy+P.y01),z<$?s.arc(P.cx,P.cy,z,Ae(P.y01,P.x01),Ae(T.y01,T.x01),!k):(s.arc(P.cx,P.cy,z,Ae(P.y01,P.x01),Ae(P.y11,P.x11),!k),s.arc(0,0,p,Ae(P.cy+P.y11,P.cx+P.x11),Ae(T.cy+T.y11,T.cx+T.x11),k),s.arc(T.cx,T.cy,z,Ae(T.y11,T.x11),Ae(T.y01,T.x01),!k))):s.arc(0,0,p,A,w,k)}if(s.closePath(),d)return s=null,d+""||null}return c.centroid=function(){var d=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,m=(+i.apply(this,arguments)+ +o.apply(this,arguments))/2-hr/2;return[wt(m)*d,Ge(m)*d]},c.innerRadius=function(d){return arguments.length?(t=typeof d=="function"?d:J(+d),c):t},c.outerRadius=function(d){return arguments.length?(e=typeof d=="function"?d:J(+d),c):e},c.cornerRadius=function(d){return arguments.length?(r=typeof d=="function"?d:J(+d),c):r},c.padRadius=function(d){return arguments.length?(n=d==null?null:typeof d=="function"?d:J(+d),c):n},c.startAngle=function(d){return arguments.length?(i=typeof d=="function"?d:J(+d),c):i},c.endAngle=function(d){return arguments.length?(o=typeof d=="function"?d:J(+d),c):o},c.padAngle=function(d){return arguments.length?(a=typeof d=="function"?d:J(+d),c):a},c.context=function(d){return arguments.length?(s=d??null,c):s},c}h();h();var v2=Array.prototype.slice;function vt(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}h();function Mm(t){this._context=t}Mm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}}};function Wt(t){return new Mm(t)}h();h();function Si(t){return t[0]}function ki(t){return t[1]}function cn(t,e){var r=J(!0),n=null,i=Wt,o=null,a=br(s);t=typeof t=="function"?t:t===void 0?Si:J(t),e=typeof e=="function"?e:e===void 0?ki:J(e);function s(u){var c,d=(u=vt(u)).length,m,p=!1,f;for(n==null&&(o=i(f=a())),c=0;c<=d;++c)!(c<d&&r(m=u[c],c,u))===p&&((p=!p)?o.lineStart():o.lineEnd()),p&&o.point(+t(m,c,u),+e(m,c,u));if(f)return o=null,f+""||null}return s.x=function(u){return arguments.length?(t=typeof u=="function"?u:J(+u),s):t},s.y=function(u){return arguments.length?(e=typeof u=="function"?u:J(+u),s):e},s.defined=function(u){return arguments.length?(r=typeof u=="function"?u:J(!!u),s):r},s.curve=function(u){return arguments.length?(i=u,n!=null&&(o=i(n)),s):i},s.context=function(u){return arguments.length?(u==null?n=o=null:o=i(n=u),s):n},s}function Za(t,e,r){var n=null,i=J(!0),o=null,a=Wt,s=null,u=br(c);t=typeof t=="function"?t:t===void 0?Si:J(+t),e=typeof e=="function"?e:e===void 0?J(0):J(+e),r=typeof r=="function"?r:r===void 0?ki:J(+r);function c(m){var p,f,b,g=(m=vt(m)).length,y,k=!1,S,M=new Array(g),w=new Array(g);for(o==null&&(s=a(S=u())),p=0;p<=g;++p){if(!(p<g&&i(y=m[p],p,m))===k)if(k=!k)f=p,s.areaStart(),s.lineStart();else{for(s.lineEnd(),s.lineStart(),b=p-1;b>=f;--b)s.point(M[b],w[b]);s.lineEnd(),s.areaEnd()}k&&(M[p]=+t(y,p,m),w[p]=+e(y,p,m),s.point(n?+n(y,p,m):M[p],r?+r(y,p,m):w[p]))}if(S)return s=null,S+""||null}function d(){return cn().defined(i).curve(a).context(o)}return c.x=function(m){return arguments.length?(t=typeof m=="function"?m:J(+m),n=null,c):t},c.x0=function(m){return arguments.length?(t=typeof m=="function"?m:J(+m),c):t},c.x1=function(m){return arguments.length?(n=m==null?null:typeof m=="function"?m:J(+m),c):n},c.y=function(m){return arguments.length?(e=typeof m=="function"?m:J(+m),r=null,c):e},c.y0=function(m){return arguments.length?(e=typeof m=="function"?m:J(+m),c):e},c.y1=function(m){return arguments.length?(r=m==null?null:typeof m=="function"?m:J(+m),c):r},c.lineX0=c.lineY0=function(){return d().x(t).y(e)},c.lineY1=function(){return d().x(t).y(r)},c.lineX1=function(){return d().x(n).y(e)},c.defined=function(m){return arguments.length?(i=typeof m=="function"?m:J(!!m),c):i},c.curve=function(m){return arguments.length?(a=m,o!=null&&(s=a(o)),c):a},c.context=function(m){return arguments.length?(m==null?o=s=null:s=a(o=m),c):o},c}h();h();function Tm(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}h();function Am(t){return t}function Ka(){var t=Am,e=Tm,r=null,n=J(0),i=J(gr),o=J(0);function a(s){var u,c=(s=vt(s)).length,d,m,p=0,f=new Array(c),b=new Array(c),g=+n.apply(this,arguments),y=Math.min(gr,Math.max(-gr,i.apply(this,arguments)-g)),k,S=Math.min(Math.abs(y)/c,o.apply(this,arguments)),M=S*(y<0?-1:1),w;for(u=0;u<c;++u)(w=b[f[u]=u]=+t(s[u],u,s))>0&&(p+=w);for(e!=null?f.sort(function(A,v){return e(b[A],b[v])}):r!=null&&f.sort(function(A,v){return r(s[A],s[v])}),u=0,m=p?(y-c*M)/p:0;u<c;++u,g=k)d=f[u],w=b[d],k=g+(w>0?w*m:0)+M,b[d]={data:s[d],index:u,value:w,startAngle:g,endAngle:k,padAngle:S};return b}return a.value=function(s){return arguments.length?(t=typeof s=="function"?s:J(+s),a):t},a.sortValues=function(s){return arguments.length?(e=s,r=null,a):e},a.sort=function(s){return arguments.length?(r=s,e=null,a):r},a.startAngle=function(s){return arguments.length?(n=typeof s=="function"?s:J(+s),a):n},a.endAngle=function(s){return arguments.length?(i=typeof s=="function"?s:J(+s),a):i},a.padAngle=function(s){return arguments.length?(o=typeof s=="function"?s:J(+s),a):o},a}h();function Cm(t){return t<0?-1:1}function Dm(t,e,r){var n=t._x1-t._x0,i=e-t._x1,o=(t._y1-t._y0)/(n||i<0&&-0),a=(r-t._y1)/(i||n<0&&-0),s=(o*i+a*n)/(n+i);return(Cm(o)+Cm(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(s))||0}function Rm(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function Qa(t,e,r){var n=t._x0,i=t._y0,o=t._x1,a=t._y1,s=(o-n)/3;t._context.bezierCurveTo(n+s,i+s*e,o-s,a-s*r,o,a)}function Pi(t){this._context=t}Pi.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:Qa(this,this._t0,Rm(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,Qa(this,Rm(this,r=Dm(this,t,e)),r);break;default:Qa(this,this._t0,r=Dm(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}}};function jg(t){this._context=new Nm(t)}(jg.prototype=Object.create(Pi.prototype)).point=function(t,e){Pi.prototype.point.call(this,e,t)};function Nm(t){this._context=t}Nm.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,r,n,i,o){this._context.bezierCurveTo(e,t,n,r,o,i)}};function Ja(t){return new Pi(t)}h();function Fm(t,e){this._context=t,this._t=e}Fm.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&this._point===2&&this._context.lineTo(this._x,this._y),(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e}};function es(t){return new Fm(t,1)}h();h();function ts(t,e){if((a=t.length)>1)for(var r=1,n,i,o=t[e[0]],a,s=o.length;r<a;++r)for(i=o,o=t[e[r]],n=0;n<s;++n)o[n][1]+=o[n][0]=isNaN(i[n][1])?i[n][0]:i[n][1]}h();function rs(t){for(var e=t.length,r=new Array(e);--e>=0;)r[e]=e;return r}function $g(t,e){return t[e]}function _g(t){let e=[];return e.key=t,e}function ns(){var t=J([]),e=rs,r=ts,n=$g;function i(o){var a=Array.from(t.apply(this,arguments),_g),s,u=a.length,c=-1,d;for(let m of o)for(s=0,++c;s<u;++s)(a[s][c]=[0,+n(m,a[s].key,c,o)]).data=m;for(s=0,d=vt(e(a));s<u;++s)a[d[s]].index=s;return r(a,d),a}return i.keys=function(o){return arguments.length?(t=typeof o=="function"?o:J(Array.from(o)),i):t},i.value=function(o){return arguments.length?(n=typeof o=="function"?o:J(+o),i):n},i.order=function(o){return arguments.length?(e=o==null?rs:typeof o=="function"?o:J(Array.from(o)),i):e},i.offset=function(o){return arguments.length?(r=o??ts,i):r},i}h();function is(t,e){if((u=t.length)>0)for(var r,n=0,i,o,a,s,u,c=t[e[0]].length;n<c;++n)for(a=s=0,r=0;r<u;++r)(o=(i=t[e[r]][n])[1]-i[0])>0?(i[0]=a,i[1]=a+=o):o<0?(i[1]=s,i[0]=s+=o):(i[0]=0,i[1]=o)}var Em=["#6366f1","#22d3ee","#f59e0b","#ec4899","#10b981","#8b5cf6","#f97316","#3b82f6"],Ug=t=>typeof t=="object"&&t!==null&&"open"in t&&"close"in t,Gg=t=>typeof t=="object"&&t!==null&&"label"in t&&"value"in t;function Wg(t){return t==="linear"?Wt:t==="step"?es:Ja}function os(t,e){let r=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(t.trim());if(!r)return t;let n=r[1];n.length===3&&(n=[...n].map(o=>o+o).join(""));let i=parseInt(n,16);return`rgba(${i>>16&255}, ${i>>8&255}, ${i&255}, ${e})`}function Om(t){if(!t?.format)return null;if(typeof t.format=="function")return t.format;let e=rr(t.format);return r=>typeof r=="number"?e(r):String(r)}function ne(t){return Math.round(t*100)/100}function yr(t,e=0,r=t.duration){return re.create().fromTo("opacity",0,1,{start:t.start+e,end:t.start+e+Math.max(1,r),ease:"power2.out"})}function Im(t,e,r){let n=e.id??Z("chart"),i=t.width??(typeof e.width=="number"?e.width:960),o=t.height??(typeof e.height=="number"?e.height:540),a=t.type??"line",s=t.fontSize??18,u=t.fontFamily??r,c=t.textColor??"#94a3b8",d=t.textColor??"#e2e8f0",m=t.gridColor??"rgba(148, 163, 184, 0.18)",p=t.colors?.length?t.colors:Em,f=t.cornerRadius??4,b=t.animate===!1?void 0:t.animate??{},g={enabled:b!==void 0,start:b?.start??0,duration:b?.duration??30,stagger:b?.stagger??-1,ease:b?.ease??"power3.out"},y=[],k=(P,T,W,Y={},_="")=>{let V=B.text(P,{id:`${n}-label-${_||y.length}`,position:"absolute",x:ne(T.x),y:ne(T.y),width:ne(T.width),height:ne(T.height),fontFamily:u,fontSize:s,fontWeight:Y.weight??500,fill:Y.color??c,align:W,verticalAlign:"middle"});g.enabled&&V.animate(yr(g,Y.delay??0)),y.push(V)},S=Math.ceil(s*1.4);a==="pie"||a==="donut"?M():A();for(let P of y)Vm(P);return B.box({background:t.background??"transparent",...e,id:n,width:i,height:o,children:y});function M(){let P=w(),T=P.reduce((Q,X)=>Q+Math.max(0,X.value),0),W=t.legend??!0,Y=N({top:16,right:W?O(P.map(Q=>Q.label)):16,bottom:16,left:16}),_=C(Y),V=Math.max(1,Math.min(_.width,_.height)/2),ee=V*(t.innerRadius??(a==="donut"?.6:0)),oe=_.x+_.width/2,ge=_.y+_.height/2,ce=4,E=Ka().sort(null).value(Q=>Math.max(0,Q.value)).padAngle(P.length>1?.012:0)(P),j=vi().innerRadius(ee).outerRadius(V).cornerRadius(Math.min(f,(V-ee)/2)),H=v(E.length);E.forEach((Q,X)=>{let te=j(Q);if(!te)return;let F=P[X].color??p[X%p.length],I=B.shape("path",{id:`${n}-slice-${X}`,position:"absolute",x:ne(oe-V-ce),y:ne(ge-V-ce),width:ne(2*(V+ce)),height:ne(2*(V+ce)),d:Hg(te,V+ce,V+ce),fillColor:F,anchorX:.5,anchorY:.5});if(g.enabled){let q=g.start+X*H;I.animate(re.create().fromTo("opacity",0,1,{start:q,end:q+g.duration*.5}).fromTo("scale",.85,1,{start:q,end:q+g.duration,ease:g.ease}))}if(y.push(I),t.valueLabels&&T>0&&Q.value>0){let[q,R]=vi().innerRadius(ee||V*.55).outerRadius(V).centroid(Q),Se=`${Math.round(Q.value/T*100)}%`;k(Se,{x:oe+q-60,y:ge+R-S/2,width:120,height:S},"center",{delay:X*H+g.duration*.5,color:"#ffffff",weight:700},`value-${X}`)}}),W&&$(P.map((Q,X)=>({name:Q.label,color:Q.color??p[X%p.length]})),{x:_.x+_.width+24,y:_.y,height:_.height})}function w(){return(t.data??t.series?.[0]?.data??[]).map((T,W)=>{if(Gg(T))return T;let Y=typeof T=="number"?T:Array.isArray(T)?Number(T[1]):Number(T.y);return{label:t.categories?.[W]??(Array.isArray(T)?String(T[0]):typeof T=="object"&&T?String(T.x):`${W+1}`),value:Y}})}function A(){let P=t.series?.length?[...t.series]:t.data?[{data:t.data}]:[];if(P.length===0)return;let T=D=>D.type??a??"line",W=(D,U)=>D.color??p[U%p.length],Y=P.map(D=>D.data.map((U,ie)=>Ug(U)?{x:U.x,y:U.close}:typeof U=="number"?{x:t.categories?.[ie]??ie,y:U}:Array.isArray(U)?{x:U[0],y:Number(U[1])}:{x:U.x,y:Number(U.y)})),_=P.some(D=>T(D)==="bar"||T(D)==="candlestick"),V=Y.flat().map(D=>D.x),ee=_||V.some(D=>typeof D=="string")?"band":V.some(D=>D instanceof Date)?"time":"linear",oe=D=>T(D)==="bar"||T(D)==="area",ge=!!t.stacked,ce=ee==="band"?[...new Set(V.map(String))]:[],E=new Map;if(ge){let D=P.map((fe,Me)=>Me).filter(fe=>oe(P[fe])),U=ce.length?ce:[...new Set(V.map(fe=>+fe))].sort((fe,Me)=>fe-Me).map(String),ie=U.map(fe=>{let Me={};for(let Re of D){let Ne=Y[Re].find(ke=>String(ee==="band"?ke.x:+ke.x)===fe);Me[Re]=Ne?.y??0}return Me});ns().keys(D.map(String)).offset(is)(ie).forEach(fe=>{let Me=Number(fe.key);E.set(Me,Y[Me].map(Re=>{let Ne=U.indexOf(String(ee==="band"?Re.x:+Re.x));return[fe[Ne][0],fe[Ne][1]]}))})}let j=[0];P.forEach((D,U)=>{let ie=E.get(U);if(T(D)==="candlestick")for(let pe of D.data)j.push(pe.high,pe.low);else if(ie)for(let[pe,fe]of ie)j.push(pe,fe);else for(let pe of Y[U])j.push(pe.y)}),P.every(D=>T(D)==="candlestick"||T(D)==="scatter"||T(D)==="line")&&j.shift();let H=t.yAxis??{},Q=t.xAxis??{},X=H.ticks??5,te=H.min??Math.min(...j),F=H.max??Math.max(...j);(!Number.isFinite(te)||!Number.isFinite(F))&&([te,F]=[0,1]),te===F&&([te,F]=[te-1,F+1]);let I=ur().domain([te,F]);(H.min===void 0||H.max===void 0)&&I.nice(X);let q=Om(H)??(D=>I.tickFormat(X)(D)),R=I.ticks(X),Se=P.map((D,U)=>({name:D.name??`Series ${U+1}`,color:W(D,U)})),me=t.legend??P.length>1,Ce=H.show!==!1,De=Q.show!==!1,Qe=Ce?Math.max(...R.map(D=>q(D).length))*s*.7+20:0,xn=N({top:(me?S+20:0)+Math.ceil(S/2),right:20,bottom:De?S+14:12,left:Math.max(16,Math.ceil(Qe))}),ae=C(xn),Ps=S+6,Ms=t.valueLabels?P.flatMap((D,U)=>T(D)==="bar"?Y[U].map(ie=>ie.y):[]):[],Md=Ms.some(D=>D>0)?Ps:0,Td=Ms.some(D=>D<0)?Ps:0;I.range([ae.height-Td,Md]);let Je;if(ee==="band")Je=Kr().domain(ce).range([0,ae.width]).paddingInner(_?.28:0).paddingOuter(_?.14:.5);else if(ee==="time"){let D=V.map(U=>+new Date(U));Je=yi().domain([Math.min(...D),Math.max(...D)]).range([0,ae.width])}else{let D=V.map(Number);Je=ur().domain([Q.min??Math.min(...D),Q.max??Math.max(...D)]).range([0,ae.width])}let Ts=D=>{if(ee==="band"){let U=Je;return(U(String(D))??0)+U.bandwidth()/2}return Je(ee==="time"?new Date(D):Number(D))},As=0;H.grid!==!1&&R.forEach((D,U)=>{let ie=B.box({id:`${n}-ygrid-${U}`,position:"absolute",x:ae.x,y:ne(ae.y+I(D)-.5),width:ae.width,height:1,background:m});g.enabled&&ie.animate(yr(g,As,g.duration/2)),y.push(ie)}),Ce&&R.forEach((D,U)=>{k(q(D),{x:0,y:ae.y+I(D)-S/2,width:ae.x-12,height:S},"end",{},`y-${U}`)});let Pr=[],wn=Om(Q);if(ee==="band"){let D=Je,U=Math.max(1,Math.ceil(ce.length/Math.max(1,Math.floor(ae.width/(s*4)))));ce.forEach((ie,pe)=>{pe%U===0&&Pr.push({pos:(D(ie)??0)+D.bandwidth()/2,text:wn?wn(ie):ie})})}else{let D=Je,U=Q.ticks??Math.max(2,Math.floor(ae.width/(s*6))),ie=D.tickFormat(U);for(let pe of D.ticks(U))Pr.push({pos:D(pe),text:wn?wn(ee==="time"?new Date(pe):pe):ie(pe)})}if(Q.grid&&Pr.forEach((D,U)=>{let ie=B.box({id:`${n}-xgrid-${U}`,position:"absolute",x:ne(ae.x+D.pos-.5),y:ae.y,width:1,height:ae.height,background:m});g.enabled&&ie.animate(yr(g,As,g.duration/2)),y.push(ie)}),De){let D=Math.max(s*3,ae.width/Math.max(1,Pr.length));Pr.forEach((U,ie)=>{k(U.text,{x:ae.x+U.pos-D/2,y:ae.y+ae.height+10,width:D,height:S},"center",{},`x-${ie}`)})}let[Ad,Cd]=I.domain();if(Ad<=0&&Cd>=0&&_){let D=B.box({id:`${n}-zero`,position:"absolute",x:ae.x,y:ne(ae.y+I(0)-1),width:ae.width,height:2,background:os("#94a3b8",.45)});g.enabled&&D.animate(yr(g,0,g.duration/2)),y.push(D)}let vn=P.map((D,U)=>U).filter(D=>T(P[D])==="bar"),Dd=[...vn,...P.map((D,U)=>U).filter(D=>T(P[D])==="candlestick"),...P.map((D,U)=>U).filter(D=>T(P[D])==="area"),...P.map((D,U)=>U).filter(D=>T(P[D])==="line"),...P.map((D,U)=>U).filter(D=>T(P[D])==="scatter")],lt=ee==="band"?Je:null,Cs=lt?v(ce.length):0,Ds=D=>lt?ce.indexOf(String(D)):0;Dd.forEach((D,U)=>{let ie=P[D],pe=W(ie,D),fe=T(ie),Me=Y[D],Re=E.get(D);if(fe==="bar"&<){let Ne=ge?1:vn.length,ke=ge?0:vn.indexOf(D),Fe=lt.bandwidth()/Ne,he=Ne>1?Math.min(4,Fe*.12):0;Me.forEach((Oe,We)=>{let[ct,Te]=Re?Re[We]:[0,Oe.y],xe=ae.y+I(Math.max(ct,Te)),Sn=ae.y+I(Math.min(ct,Te)),Be=Math.max(0,Sn-xe),Mr=ae.x+(lt(String(Oe.x))??0)+ke*Fe+he/2,kt=Oe.y>=0?"up":"down",kn=B.box({id:`${n}-bar-${D}-${We}`,position:"absolute",x:ne(Mr),y:ne(xe),width:ne(Math.max(1,Fe-he)),height:ne(Be),background:pe,borderRadius:Math.min(f,(Fe-he)/2,Be/2)}),Ns=Ds(Oe.x)*Cs+(ge?vn.indexOf(D)*g.duration*.6:0);if(g.enabled){let Tr=g.start+Ns,Pn=Tr+g.duration,Fs=re.create().fromTo("height",0,ne(Be),{start:Tr,end:Pn,ease:g.ease});kt==="up"&&Fs.fromTo("y",ne(xe+Be),ne(xe),{start:Tr,end:Pn,ease:g.ease}),kn.animate(Fs)}if(y.push(kn),t.valueLabels){let Tr=q(Oe.y),Pn=kt==="up"?xe-S-4:xe+Be+4;k(Tr,{x:Mr-30,y:Pn,width:Fe-he+60,height:S},"center",{delay:Ns+g.duration*.6,color:d,weight:600},`value-${D}-${We}`)}});return}if(fe==="candlestick"&<){let Ne=t.upColor??"#22c55e",ke=t.downColor??"#ef4444",Fe=lt.bandwidth();ie.data.forEach((he,Oe)=>{let We=he.close>=he.open?Ne:ke,ct=ae.x+(lt(String(he.x))??0)+Fe/2,Te=Ds(he.x)*Cs,xe=[["wick",{x:ct-Math.max(1,Fe*.06),y:ae.y+I(he.high),width:Math.max(2,Fe*.12),height:Math.max(1,I(he.low)-I(he.high))}],["body",{x:ct-Fe/2,y:ae.y+I(Math.max(he.open,he.close)),width:Fe,height:Math.max(2,Math.abs(I(he.open)-I(he.close)))}]];for(let[Sn,Be]of xe){let Mr=B.box({id:`${n}-candle-${D}-${Oe}-${Sn}`,position:"absolute",x:ne(Be.x),y:ne(Be.y),width:ne(Be.width),height:ne(Be.height),background:We,borderRadius:Sn==="body"?Math.min(f/2,Be.width/2):0});if(g.enabled){let kt=g.start+Te,kn=Be.y+Be.height/2;Mr.animate(re.create().fromTo("height",0,ne(Be.height),{start:kt,end:kt+g.duration,ease:g.ease}).fromTo("y",ne(kn),ne(Be.y),{start:kt,end:kt+g.duration,ease:g.ease}))}y.push(Mr)}});return}if(fe==="line"||fe==="area"){let Ne=ie.strokeWidth??3,ke=Math.ceil(Ne*2+(ie.pointRadius??0)+2),Fe=Me.map((Te,xe)=>({x:Ts(Te.x)+ke,top:I(Re?Re[xe][1]:Te.y)+ke,base:I(Re?Re[xe][0]:Math.max(I.domain()[0],Math.min(0,I.domain()[1])))+ke})),he=Wg(ie.curve),Oe={x:ae.x-ke,y:ae.y-ke,width:ae.width+2*ke,height:ae.height+2*ke},We=U*(g.duration/3);if(fe==="area"){let Te=Za().x(xe=>xe.x).y0(xe=>xe.base).y1(xe=>xe.top).curve(he)(Fe);if(Te){let xe=B.shape("path",{id:`${n}-area-${D}`,position:"absolute",...Bm(Oe),d:Lm(Te),fillType:"linear",fillColor:os(pe,.45),gradientEndColor:os(pe,.02),gradientAngle:90});g.enabled&&xe.animate(yr(g,We+g.duration*.4,g.duration)),y.push(xe)}}let ct=cn().x(Te=>Te.x).y(Te=>Te.top).curve(he)(Fe);if(ct&&Ne>0){let Te=B.shape("path",{id:`${n}-line-${D}`,position:"absolute",...Bm(Oe),d:Lm(ct),fillType:"none",strokeColor:pe,strokeWidth:Ne,strokeLineCap:"round",strokeLineJoin:"round"});g.enabled&&Te.animate(re.create().fromTo("trimEnd",0,1,{start:g.start+We,end:g.start+We+g.duration*1.5,ease:"power2.inOut"})),y.push(Te)}(ie.pointRadius??0)>0&&Rs(D,Me,pe,ie.pointRadius??0,We+g.duration*.5,Re);return}fe==="scatter"&&Rs(D,Me,pe,ie.pointRadius??6,U*(g.duration/3),Re)}),me&&z(Se);function Rs(D,U,ie,pe,fe,Me){let Re=v(U.length);U.forEach((Ne,ke)=>{let Fe=I(Me?Me[ke][1]:Ne.y),he=B.shape("circle",{id:`${n}-point-${D}-${ke}`,position:"absolute",x:ne(ae.x+Ts(Ne.x)-pe),y:ne(ae.y+Fe-pe),width:ne(pe*2),height:ne(pe*2),fillColor:ie,anchorX:.5,anchorY:.5});if(g.enabled){let Oe=g.start+fe+ke*Re;he.animate(re.create().fromTo("scale",0,1,{start:Oe,end:Oe+g.duration*.6,ease:"back.out(2)"}).fromTo("opacity",0,1,{start:Oe,end:Oe+6}))}y.push(he)})}}function v(P){return!g.enabled||P<=1?0:g.stagger>=0?g.stagger:Math.min(4,g.duration/P)}function N(P){let T=t.padding;return typeof T=="number"?{top:T,right:T,bottom:T,left:T}:{top:T?.top??P.top,right:T?.right??P.right,bottom:T?.bottom??P.bottom,left:T?.left??P.left}}function C(P){return{x:P.left,y:P.top,width:Math.max(1,i-P.left-P.right),height:Math.max(1,o-P.top-P.bottom)}}function O(P){let T=Math.max(0,...P.map(W=>W.length));return Math.min(i*.4,T*s*.6+s+48)}function $(P,T){let W=S+8,Y=T.y+Math.max(0,(T.height-P.length*W)/2);P.forEach((_,V)=>{L(_,T.x,Y+V*W,V)})}function z(P){let T=P.map(_=>_.name.length*s*.6+s+28),W=T.reduce((_,V)=>_+V,0),Y=Math.max(0,i-W-20);P.forEach((_,V)=>{L(_,Y,4,V),Y+=T[V]})}function L(P,T,W,Y){let _=Math.round(s*.7),V=B.box({id:`${n}-legend-swatch-${Y}`,position:"absolute",x:ne(T),y:ne(W+(S-_)/2),width:_,height:_,borderRadius:Math.round(_/4),background:P.color});g.enabled&&V.animate(yr(g,0,g.duration/2)),y.push(V),k(P.name,{x:T+_+8,y:W,width:P.name.length*s*.6+12,height:S},"start",{color:t.textColor??"#cbd5e1"},`legend-${Y}`)}}function Vm(t){for(let e of t.animation?.tracks??[])for(let r of e.keyframes??[])r.frame=Math.round(r.frame);for(let e of t.children??[])Vm(e)}function Bm(t){return{x:ne(t.x),y:ne(t.y),width:ne(t.width),height:ne(t.height)}}function Lm(t){return t.replace(/-?\d*\.\d{3,}(?:e-?\d+)?/gi,e=>String(ne(Number(e))))}function Hg(t,e,r){let n=[],i=/([MLAZ])([^MLAZ]*)/gi;for(let[,o,a]of t.matchAll(i)){let s=(a.match(/-?\d*\.?\d+(?:e-?\d+)?/gi)??[]).map(Number);if(o.toUpperCase()==="A")for(let u=0;u+6<s.length;u+=7)s[u+5]+=e,s[u+6]+=r;else if(o.toUpperCase()!=="Z")for(let u=0;u+1<s.length;u+=2)s[u]+=e,s[u+1]+=r;n.push(o+s.map(ne).join(","))}return n.join("")}h();var zm=24,Yg=1,mn=class{source;fps;compositionFps;startFrame;trimStartSec;smoothing;options;results=new Map;sourceWidth=0;sourceHeight=0;cellW=0;cellH=0;cell;queue=Promise.resolve();runner;cacheLoaded;unsaved=0;unsavedSubjects=0;blurred=new Map;smoothed=new Map;personView;subjects=new Map;wantSubjects=!1;subjectsLoaded;constructor(e,r,n={}){this.source=e,this.options=n,this.compositionFps=r,this.fps=n.fps??r,this.startFrame=Math.round(n.startFrame??0),this.trimStartSec=n.trimStartSec??0,this.smoothing=Math.max(0,Math.round(n.smoothing??2)),this.cell=Math.max(1,Math.round(n.maskCell??8))}get person(){return this.personView??=new Mi(this),this.personView}ready(e,r=e){let[n,i]=this.window(e,r);return this.queue=this.queue.then(()=>this.compute(n,i)),this.queue}isReady(e){let[r,n]=this.window(e,e);for(let i=r;i<=n;i++)if(!this.results.has(i))return!1;return!0}keepSubjects(){this.wantSubjects=!0}subject(e,r){let n=e*this.fps/r;if(!this.options.timeRemap&&Math.abs(n-Math.round(n))>1e-6)return;let i=this.options.timeRemap?Math.floor(n+1e-6):Math.round(n),o=this.subjects.get(i);if(o===void 0)return o;if(o===null||!this.sourceWidth)return null;let a=this.sourceWidth,s=this.sourceHeight;return{category:o.category,mask:eb(o,a*s),width:a,height:s,area:o.area,coverage:o.area/(a*s),detectionIndex:-1}}clipFrame(e){return this.options.timeRemap?zs(this.options.timeRemap,this.localFrame(e),this.compositionFps)*this.fps:((e-this.startFrame)/this.compositionFps+this.trimStartSec)*this.fps}localFrame(e){let r=Math.max(0,e-this.startFrame);return this.options.durationFrames===void 0?r:Math.min(r,Math.max(0,this.options.durationFrames-1))}window(e,r){let n=this.options.timeRemap?Tn(this.options.timeRemap,this.localFrame(Math.min(e,r)),this.localFrame(Math.max(e,r)),this.compositionFps):void 0,i=Math.floor(n?n.min*this.fps:this.clipFrame(Math.min(e,r))),o=Math.ceil(n?n.max*this.fps:this.clipFrame(Math.max(e,r)));return[Math.max(0,i-zm-this.smoothing),Math.max(0,o+this.smoothing)]}analysed(e){return this.results.has(e)&&(!this.wantSubjects||this.subjects.has(e))}async compute(e,r){this.cacheLoaded??=this.loadCache(),await this.cacheLoaded,this.wantSubjects&&(this.subjectsLoaded??=this.loadSubjects(),await this.subjectsLoaded);let n=!1;for(let s=e;s<=r;s++)this.analysed(s)||(n=!0);if(!n)return;let i=this.options.pose??!0,o=this.options.mask??!0;this.runner??=Rr.create({modelsDir:this.options.modelsDir,baseUrl:this.options.baseUrl,...this.options.confidence!==void 0&&{confidence:this.options.confidence},...this.options.variant!==void 0&&{variant:this.options.variant}});let a=Dn.getVideo(this.source,!0,"clip-vision");for(let s=e;s<=r;s++){if(this.analysed(s))continue;let u=await qg(await a.getFrame(s/this.fps));if(!u){this.results.set(s,{kp:null,mask:null}),this.wantSubjects&&this.subjects.set(s,null);continue}this.sourceWidth||this.setSize(u.width,u.height);let c=this.results.get(s),d=c?.kp??null,m=c?.mask??null;if(i&&!c){let f=(await this.runner.pose(u)).people[0];if(f){d=new Float32Array(51);for(let[b,g]of f.keypoints.entries())d.set([g.x,g.y,g.visibility],b*3)}}let p=o&&!c||this.wantSubjects?await this.runner.segment(u):void 0;if(p&&this.wantSubjects){let f=Ji(p.masks);this.subjects.set(s,f?{category:f.category,area:f.area,...Jg(f.mask)}:null),this.unsavedSubjects++}if(p&&o&&!c){let f=Zg(p);f&&(m=new Uint8Array(this.cellW*this.cellH),Qg(f,u.width,u.height,this.cell,m,this.cellW,this.cellH))}this.results.set(s,{kp:d,mask:m}),c||this.unsaved++,this.unsaved>=24&&await this.saveCache(),this.unsavedSubjects>=24&&await this.saveSubjects()}this.unsaved>0&&await this.saveCache(),this.unsavedSubjects>0&&await this.saveSubjects()}setSize(e,r){this.sourceWidth=e,this.sourceHeight=r,this.cellW=Math.ceil(e/this.cell),this.cellH=Math.ceil(r/this.cell)}size(){return{width:this.sourceWidth,height:this.sourceHeight}}result(e){return this.results.get(Math.max(0,e))}keypoint(e,r){r=Math.max(0,r);let n=`${e}:${r}`,i=this.smoothed.get(n);if(i)return i;let o=s=>{let u=0,c=0,d=0,m=0;for(let p=s-this.smoothing;p<=s+this.smoothing;p++){let f=this.mustHave(p<0?0:p);if(!f.kp)continue;let b=f.kp[e*3+2],g=(this.smoothing+1-Math.abs(p-s))*b*b;u+=f.kp[e*3]*g,c+=f.kp[e*3+1]*g,d+=b*g,m+=g}return m>1e-6?[u/m,c/m,d/m]:null},a=null;for(let s=0;s<=zm&&!a;s++)r-s>=0&&(a=o(r-s));return a??=[this.sourceWidth/2,this.sourceHeight/2,0],this.smoothed.set(n,a),a}blurredMask(e){if(e=Math.max(0,e),this.blurred.has(e))return this.blurred.get(e)??null;this.mustHave(e);let r=Kg(this.results,e,this.smoothing),n=r?tb(r,this.cellW,this.cellH,2):null;return this.blurred.set(e,n),n}grid(){return{cell:this.cell,width:this.cellW,height:this.cellH}}mustHave(e){let r=this.results.get(e);if(r)return r;throw new Error(`ClipVision "${this.source}": frame ${e} is not analysed yet. Read it while rendering (the composition prepares each frame), in a live physics world, or after \`await clip.ready(frame)\`.`)}cacheFile;async cachePath(){if(this.cacheFile!==void 0)return this.cacheFile;if(this.cacheFile=null,this.options.cacheDir===!1||typeof x>"u"||!x.versions?.node)return null;try{let[e,r,n,i]=await Promise.all([import("./shims/fs.mjs"),import("./shims/path.mjs"),import("./shims/os.mjs"),import("./crypto-TRDUAUC5.mjs")]),o=e.statSync(this.source),a=this.options.cacheDir??x.env.FRAMEFIELDS_VISION_CACHE_DIR??r.join(n.homedir(),".cache","framefields","vision"),s=this.options,u=JSON.stringify([Yg,r.resolve(this.source),o.size,o.mtimeMs,this.fps,s.pose??!0,s.mask??!0,this.cell,s.variant??"s",s.confidence??null]),c=i.createHash("sha256").update(u).digest("hex").slice(0,24);e.mkdirSync(a,{recursive:!0}),this.cacheFile=r.join(a,`${r.basename(this.source)}.${c}.json`)}catch{this.cacheFile=null}return this.cacheFile}async loadCache(){let e=await this.cachePath();if(e)try{let r=await import("./shims/fs.mjs");if(!r.existsSync(e))return;let n=JSON.parse(r.readFileSync(e,"utf8"));if(n.cell!==this.cell)return;this.setSize(n.width,n.height);for(let[i,o]of Object.entries(n.frames))this.results.set(Number(i),{kp:o.kp?Float32Array.from(o.kp):null,mask:o.mask?new Uint8Array(Buffer.from(o.mask,"base64")):null})}catch{}}async saveCache(){this.unsaved=0;let e=await this.cachePath();if(!e||!this.sourceWidth)return;let r={};for(let[o,a]of this.results)r[o]={kp:a.kp?Array.from(a.kp,s=>Math.round(s*100)/100):null,mask:a.mask?Buffer.from(a.mask).toString("base64"):null};let n=await import("./shims/fs.mjs"),i=`${e}.${x.pid}.tmp`;n.writeFileSync(i,JSON.stringify({width:this.sourceWidth,height:this.sourceHeight,cell:this.cell,frames:r})),n.renameSync(i,e)}async subjectsPath(){let e=await this.cachePath();return e?e.replace(/\.json$/,".subjects.json"):null}async loadSubjects(){let e=await this.subjectsPath();if(e)try{let r=await import("./shims/fs.mjs");if(!r.existsSync(e))return;let n=JSON.parse(r.readFileSync(e,"utf8"));if(this.sourceWidth&&n.width!==this.sourceWidth)return;this.sourceWidth||this.setSize(n.width,n.height);for(let[i,o]of Object.entries(n.frames)){let a=Buffer.from(o?.lengths??"","base64");this.subjects.set(Number(i),o&&{category:o.category,area:o.area,values:new Uint8Array(Buffer.from(o.values,"base64")),lengths:new Uint32Array(a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength))})}}catch{}}async saveSubjects(){this.unsavedSubjects=0;let e=await this.subjectsPath();if(!e||!this.sourceWidth)return;let r={};for(let[o,a]of this.subjects)r[o]=a&&{category:a.category,area:a.area,values:Buffer.from(a.values).toString("base64"),lengths:Buffer.from(a.lengths.buffer,a.lengths.byteOffset,a.lengths.byteLength).toString("base64")};let n=await import("./shims/fs.mjs"),i=`${e}.${x.pid}.tmp`;n.writeFileSync(i,JSON.stringify({width:this.sourceWidth,height:this.sourceHeight,frames:r})),n.renameSync(i,e)}},Mi=class t{constructor(e,r,n){this.clip=e;this.t=r;this.placement=n}clip;t;placement;place(e){return new t(this.clip,void 0,e)}transform(){if(this.t)return this.t;let e=this.placement,{width:r,height:n}=this.clip.size();if(!e||!r)return{sx:1,sy:1,ox:0,oy:0};let i=e.width/r,o=e.height/n;if(e.fit!=="fill"){let a=e.fit==="contain"?Math.min(i,o):Math.max(i,o);i=a,o=a}return{sx:i,sy:o,ox:(e.x??0)+(e.width-r*i)/2,oy:(e.y??0)+(e.height-n*o)/2}}point(e,r){let n=Xg(e),i=this.clip.clipFrame(r),o=Math.floor(i),a=i-o,s=this.clip.keypoint(n,o),u=a>0?this.clip.keypoint(n,o+1):s,c=this.transform();return{x:(s[0]+(u[0]-s[0])*a)*c.sx+c.ox,y:(s[1]+(u[1]-s[1])*a)*c.sy+c.oy,visibility:s[2]+(u[2]-s[2])*a}}signals(e){let r=n=>Cr.builder({type:"custom",fn:i=>this.point(e,i.frame)[n]});return{x:r("x"),y:r("y"),visibility:r("visibility")}}silhouetteGrid(e){let r=this.clip.blurredMask(Math.round(this.clip.clipFrame(e)));if(!r)return null;let{cell:n,width:i,height:o}=this.clip.grid(),a=this.transform();return{data:r,width:i,height:o,originX:a.ox,originY:a.oy,scaleX:n*a.sx,scaleY:n*a.sy}}sample(e,r,n){let i=this.clip.blurredMask(Math.round(this.clip.clipFrame(e)));if(!i)return{alpha:0,gx:0,gy:0};let{cell:o,width:a,height:s}=this.clip.grid(),u=this.transform(),c=(r-u.ox)/u.sx/o-.5,d=(n-u.oy)/u.sy/o-.5,m=(f,b)=>f<0||b<0||f>=a||b>=s?0:i[b*a+f],p=(f,b)=>{let g=Math.floor(f),y=Math.floor(b),k=f-g,S=b-y,M=m(g,y)+(m(g+1,y)-m(g,y))*k,w=m(g,y+1)+(m(g+1,y+1)-m(g,y+1))*k;return M+(w-M)*S};return{alpha:p(c,d),gx:(p(c+1,d)-p(c-1,d))/(2*o*u.sx),gy:(p(c,d+1)-p(c,d-1))/(2*o*u.sy)}}};function Xg(t){let e=Fn.indexOf(t);if(e<0)throw new Error(`Unknown keypoint "${t}". Use one of ${Fn.join(", ")}.`);return e}async function qg(t){if(!t||t.width<=0)return null;if(t.buffer)return{data:t.buffer,width:t.width,height:t.height};let r=t.canvas?.getContext("2d");return r?{data:r.getImageData(0,0,t.width,t.height).data,width:t.width,height:t.height}:null}function Zg(t){return Ji(t.masks,{classes:["person"],overlap:.2,maxGrowth:3.5})?.mask}function as(t){if(!t)return 0;let e=0;for(let r=0;r<t.length;r++)e+=t[r];return e}function Kg(t,e,r){let n=t.get(e)?.mask??null;if(r<=0)return n;let i=as(n),o=-1,a=null,s=-1,u=null,c=Math.max(1e3,i*1.35);for(let p=1;p<=r+1;p++){if(o<0&&e-p>=0){let f=t.get(e-p)?.mask??null;as(f)>c&&(o=e-p,a=f)}if(s<0){let f=t.get(e+p)?.mask??null;as(f)>c&&(s=e+p,u=f)}}if(!a&&!u)return n;let d=a??u;if(!d)return n;let m=n?new Uint8Array(n):new Uint8Array(d.length);if(a&&u&&s>o){let p=(e-o)/(s-o);for(let f=0;f<m.length;f++){let b=Math.round(a[f]+(u[f]-a[f])*p);b>m[f]&&(m[f]=b)}}else for(let p=0;p<m.length;p++)d[p]>m[p]&&(m[p]=d[p]);return m}function Qg(t,e,r,n,i,o,a){for(let s=0;s<a;s++)for(let u=0;u<o;u++){let c=0,d=0;for(let m=s*n;m<Math.min(r,(s+1)*n);m++)for(let p=u*n;p<Math.min(e,(u+1)*n);p++)c+=t[m*e+p],d++;i[s*o+u]=d?Math.round(c/d):0}}function Jg(t){let e=0;for(let a=1;a<=t.length;a++)(a===t.length||t[a]!==t[a-1])&&e++;let r=new Uint8Array(e),n=new Uint32Array(e),i=0,o=0;for(let a=1;a<=t.length;a++)(a===t.length||t[a]!==t[o])&&(r[i]=t[o],n[i++]=a-o,o=a);return{values:r,lengths:n}}function eb(t,e){let r=new Uint8Array(e),n=0;for(let i=0;i<t.values.length;i++){let o=Math.min(e,n+t.lengths[i]);t.values[i]!==0&&r.fill(t.values[i],n,o),n=o}return r}function tb(t,e,r,n){let i=new Float32Array(e*r),o=new Float32Array(e*r);for(let a=0;a<r;a++)for(let s=0;s<e;s++){let u=0,c=0;for(let d=-n;d<=n;d++){let m=s+d;m>=0&&m<e&&(u+=t[a*e+m],c++)}i[a*e+s]=u/c/255}for(let a=0;a<r;a++)for(let s=0;s<e;s++){let u=0,c=0;for(let d=-n;d<=n;d++){let m=a+d;m>=0&&m<r&&(u+=i[m*e+s],c++)}o[a*e+s]=u/c}return o}h();var Ti=class{constructor(e){this.fps=e}fps;entries=new Map;reached=-1;resolver(e){let{live:r,compositionDurationFrames:n}=e,i={fps:this.fps,compositionDurationFrames:n,signals:e.signals};return(o,a)=>{let s=`${a.id}\0${a.startFrame}\0${a.durationFrames}`,u=this.entries.get(s);if(u&&u.live===r&&u.compositionFrames===n&&rb(u.binding,o))return u.resolved;let c=r?{kind:"recorded",recorder:new Es({mode:o.mode,fps:this.fps,startFrame:a.startFrame,durationFrames:a.durationFrames,sourceStartSec:o.sourceStartSec,sample:eu(o,i)})}:tu(o,a,i);return this.entries.set(s,{binding:o,live:r,compositionFrames:n,resolved:c}),c}}framesBefore(e){if(!this.recorders().some(i=>!i.complete&&i.nextFrame<e))return[];let n=[];for(let i=this.reached+1;i<e;i++)n.push(i);return n}advance(e){for(let r of this.recorders())r.advance(e)}reach(e){e>this.reached&&(this.reached=e);for(let[,r]of this.entries){if(r.resolved.kind!=="recorded")continue;let n=r.resolved.recorder;n.ensure(e),e>=r.compositionFrames-1&&!n.complete&&n.nextFrame>n.startFrame&&n.close()}}get pending(){return this.recorders().some(e=>!e.complete)}recorders(){let e=[];for(let{resolved:r}of this.entries.values())r.kind==="recorded"&&e.push(r.recorder);return e}};function rb(t,e){return t.signal===e.signal&&t.mode===e.mode&&t.sourceStartSec===e.sourceStartSec}function ss(t,e){let r=t.fps>0?e/t.fps:0;return{...t,frame:e,time:r,progress:t.duration>0?Math.max(0,Math.min(1,r/t.duration)):0}}var jm=new WeakMap,nb=0;function Ai(t){if(!t)return"";if(t.kind==="rate"||t.kind==="keyframes")return JSON.stringify(t);let e=t.kind==="sampled"?t.history:t.recorder,r=jm.get(e);return r===void 0&&(r=++nb,jm.set(e,r)),`${t.kind}:${r}`}h();h();var ib={rotation:.2,rotateX:.2,rotateY:.2,rotateZ:.2};function je(t,e,r){if(typeof t=="number")return t;if(typeof t=="function")return t(e);let n=e/r;return t.get({frame:e,fps:r,time:n,duration:0,durationMs:0,progress:0,deltaTime:1/r})}function Ht(t,e){let r=e-t;return r-=Math.round(r/360)*360,t+r}function ob(t,e){let r=t.length;if(r===0)return[];let n=new Uint8Array(r);n[0]=1,n[r-1]=1;let i=[[0,r-1]];for(;i.length>0;){let[a,s]=i.pop(),u=-1,c=e;for(let d=a+1;d<s;d++){let m=(d-a)/(s-a),p=t[a]+(t[s]-t[a])*m,f=Math.abs(t[d]-p);f>c&&(c=f,u=d)}u>=0&&(n[u]=1,i.push([a,u],[u,s]))}let o=[];for(let a=0;a<r;a++)n[a]&&o.push([a,ab(t[a]),"none"]);return o.length===2&&o[0][1]===o[1][1]&&o.pop(),o}function ab(t){return Math.round(t*1e4)/1e4}var us=class{constructor(e,r,n){this.length=e;this.fps=r;this.ensure=n}length;fps;ensure;channels=new Map;signals=new Map;channel(e){let r=this.channels.get(e);return r||(r=new Float32Array(this.length),this.channels.set(e,r)),r}signal(e){let r=this.signals.get(e);if(!r){let n=this.channel(e),i=this.fps;r=Cr.builder({type:"custom",fn:o=>{this.ensure();let a=o.fps&&o.fps!==i?o.frame/o.fps*i:o.frame,s=Math.max(0,Math.min(n.length-1,Math.round(a)));return n[s]}}),this.signals.set(e,r)}return r}},xr=class{constructor(e,r,n){this.sim=e;this.gravity=r;if(!(n.fps>0))throw new Error("Physics: `fps` must be > 0.");if(!(n.frames>=1)||!Number.isInteger(n.frames))throw new Error("Physics: `frames` must be a positive integer.");this.fps=n.fps,this.frames=n.frames,this.startFrame=Math.max(0,Math.round(n.startFrame??0)),this.pixelsPerMeter=n.pixelsPerMeter??100,this.substeps=Math.max(1,Math.round(n.substeps??4)),this.impactDecay=Math.max(.5,n.impactDecay??8),this.impactReference=n.impactReference??1500,this.worldRecording=this.newRecording()}sim;gravity;fps;frames;startFrame;pixelsPerMeter;substeps;impactDecay;impactReference;bodies=[];forces=[];impulses=[];fields=[];worldRecording;allCollisions=[];locked=!1;liveMode=!1;stepper;chain=Promise.resolve();get collisions(){return this.ensureSimulated(),this.allCollisions}get impact(){return this.worldRecording.signal("impact")}simulate(){if(this.liveMode)throw new Error("Physics: this world is live; it steps as frames render.");return this.ensureSimulated(),this}bakeKeyframes(e={}){if(this.locked)throw new Error("Physics: bakeKeyframes() must come before simulate(), live() or reading any body signal.");return this.bakeDefault=e,this.ensureSimulated(),this}live(e,r={}){if(this.locked)throw new Error("Physics: live() must come before simulate() or reading any body signal.");this.locked=!0,this.liveMode=!0;let n=async i=>{await e.prepareVision?.(i);for(let o of r.inputs??[])await o.ready(i)};this.prepareInputs=n;for(let i of this.bodies)this.bind(i);return e.onPrepareFrame(i=>this.advanceTo(i.frame)),this}advanceTo(e){return this.chain=this.chain.then(async()=>{let r=Math.min(this.frames-1,Math.round(e)-this.startFrame);this.stepper||(await this.prepareInputs?.(this.startFrame),this.stepper=this.begin());let n=this.stepper;for(;n.current<r;){let i=n.current+1;await this.prepareInputs?.(this.startFrame+i),this.stepFrame(n,i)}n.current===this.frames-1&&!n.freed&&(n.freed=!0,this.sim.free())}),this.chain}prepareInputs;bakeDefault;newRecording(){return new us(this.startFrame+this.frames,this.fps,()=>this.ensureSimulated())}assertOpen(){if(this.locked)throw new Error("Physics: the world has already started; add every body, joint and force before simulate(), live() or reading signals.")}addBody(e){return this.assertOpen(),this.bodies.push(e),e}addForce(e,r){this.assertOpen(),this.forces.push({body:e,accel:r})}addField(e,r){this.assertOpen(),this.fields.push({accel:e,...r&&{targets:new Set(r)}})}addImpulse(e,r,n){this.assertOpen(),this.impulses.push({body:e,frame:Math.round(r),dv:n})}ensureSimulated(){if(this.locked)return;this.locked=!0;let e=this.begin();for(let r=1;r<this.frames;r++)this.stepFrame(e,r);e.freed=!0,this.sim.free();for(let r of this.bodies)this.bind(r)}begin(){let{startFrame:e}=this,r=this.bodies,n=new Map;for(let o of r)n.set(o.sim,o);for(let o of r)o.startFrame>0&&o.sim.setEnabled(!1);let i=new Map;for(let o of r){o.record(e,-1),o.recording.channel("impact");let a=o.kinematicTarget?.(e);a&&i.set(o,a)}this.worldRecording.channel("impact");for(let o of[...r.map(a=>a.recording),this.worldRecording])for(let a of o.channels.values())a.fill(a[e]);return{current:0,freed:!1,bySim:n,kinematicFrom:i,level:new Map(r.map(o=>[o,0]))}}stepFrame(e,r){let{fps:n,startFrame:i,substeps:o}=this,a=1/(n*o),s=this.bodies,u=i+r,c=this.gravity.length,d=new Map;for(let w of s)w.startFrame>0&&r===w.startFrame+1&&w.sim.setEnabled(!0),d.set(w,w.sim.velocity());let m=w=>w.type==="dynamic"&&r>w.startFrame,p=new Map;for(let w of s)p.set(w,this.gravity.map(A=>m(w)?A*w.gravityScale/n:0));for(let w of this.impulses){if(w.frame!==r)continue;let A=w.body;if(!m(A))continue;let v=A.sim.mass();A.sim.applyImpulse(w.dv.map(C=>C*v));let N=p.get(A);for(let C=0;C<c;C++)N[C]+=w.dv[C]}let f=this.forces.filter(w=>m(w.body)).map(w=>{let A=w.body,v=w.accel(u),N=p.get(A);for(let C=0;C<c;C++)N[C]+=v[C]/n;return{body:A,a:v}}),b=new Map;for(let w of s){let A=w.kinematicTarget?.(u);A&&b.set(w,A)}let g=new Set,y=[];for(let w=1;w<=o;w++){for(let{body:A,a:v}of f){let N=A.sim.mass();A.sim.applyImpulse(v.map(C=>C*N*a))}for(let A of this.fields)for(let v of s){if(!m(v)||A.targets&&!A.targets.has(v))continue;let N=A.accel(v,u);if(!N)continue;let C=v.sim.mass();v.sim.applyImpulse(N.map($=>$*C*a));let O=p.get(v);for(let $=0;$<c;$++)O[$]+=N[$]*a}for(let[A,v]of b){let N=e.kinematicFrom.get(A)??v,C=w/o;A.sim.setKinematicTarget(sb(N.position,v.position,C),this.lerpRotation(N.rotation,v.rotation,C))}this.sim.step(a);for(let[A,v]of this.sim.drainCollisionStarts()){let N=e.bySim.get(A),C=e.bySim.get(v);if(!N||!C)continue;let O=`${s.indexOf(N)}:${s.indexOf(C)}`;g.has(O)||(g.add(O),y.push([N,C]))}}e.kinematicFrom=b;for(let w of s)w.record(u,u-1);let k=new Map;if(y.length>0){let w=this.pixelsPerMeter,A=v=>{if(v.type!=="dynamic")return 0;let N=v.sim.velocity(),C=d.get(v),O=p.get(v),$=0;for(let z=0;z<c;z++){let L=N[z]-(C[z]+O[z]);$+=L*L}return Math.sqrt($)*w};for(let[v,N]of y){let C=Math.max(A(v),A(N));for(let[O,$]of[[v,N],[N,v]]){k.set(O,Math.max(k.get(O)??0,C));let z={frame:u,with:$,speed:C};O.collisions.push(z),O===v&&this.allCollisions.push({...z,body:v})}}}let S=Math.exp(-1/this.impactDecay),M=0;for(let w of s){let A=Math.max((k.get(w)??0)/this.impactReference,(e.level.get(w)??0)*S);e.level.set(w,A),w.recording.channel("impact")[u]=A,A>M&&(M=A)}this.worldRecording.channel("impact")[u]=M,e.current=r}bind(e){let r=e.layer,n=e.output??(this.bakeDefault?"keyframes":"signals");if(typeof r?.animate!="function"||n==="none"||e.type==="fixed")return;let i=e.boundChannels();if(n==="keyframes"&&this.liveMode)throw new Error('Physics: live worlds bind signals; drop `output: "keyframes"` or use simulate().');if(n==="signals"){let s=re.create();for(let[u,c]of i)s.signal(u,e.recording.signal(c));r.animate(s);return}let o=this.bakeDefault?.tolerance??.25,a=re.create();for(let[s,u]of i){let d=e.recording.channel(u).subarray(this.startFrame),m=ib[s]??1;a.keys(s,ob(d,o*m))}r.animate(a)}};function sb(t,e,r){return t.map((n,i)=>n+(e[i]-n)*r)}var ls=(t,e)=>t===void 0?e:typeof t=="number"?[t,t]:t,dn=class extends Xt{op="Particles";particleStatic;particleState;options;constructor(e){super({}),this.options=e;let r=e.emitter??{},n=s=>typeof s=="number"?s:void 0,i=e.width,o=e.height,a=(Array.isArray(e.color)?e.color:[e.color??"#ffffff"]).map(s=>{let u=Gs(s);return[u.r,u.g,u.b,u.a]});this.particleStatic={max:Math.max(1,Math.round(e.max??2e4)),seed:Math.round(e.seed??1)>>>0,layer:{x:e.x??0,y:e.y??0,width:i,height:o},emitter:{shape:r.shape??"rect",x:n(r.x)??(r.shape==="circle"||r.shape==="ring"||r.shape==="point"?i/2:0),y:n(r.y)??(r.shape==="circle"||r.shape==="ring"||r.shape==="point"?o/2:0),width:r.width??i,height:r.height??(r.shape==="line"?0:o),radius:r.radius??Math.min(i,o)/4,radial:r.radial??!1},lifetime:ls(e.lifetime,[2,4]),speed:ls(e.speed,[40,160]),direction:e.direction??-90,spread:e.spread??360,bounds:e.bounds??"none",floor:e.floor??null,bounce:e.bounce??.3,size:ls(e.size,[6,0]),sizeJitter:e.sizeJitter??.5,fade:e.fade??[.1,.3],shape:e.shape??"circle",stretch:e.stretch??.04,blend:e.blend??"normal",colors:a.slice(0,8),colorBySpeed:e.colorBySpeed??null,opacity:e.opacity??1,substeps:e.substeps??2,prewarm:e.prewarm??0}}particleFrame(e,r){let n=this.options,i=(g,y)=>g===void 0?y:je(g,e,r),o=e-(n.startFrame??0),a=(n.emitter?.bursts??[]).filter(g=>Math.round(g.frame)===o).reduce((g,y)=>g+y.count,0),s=n.gravity,u=Array.isArray(s)?[i(s[0],0),i(s[1],0)]:[0,i(s,0)],c=null;n.push&&(c={strength:i(n.push.strength,6e3),sweep:i(n.push.sweep,6e4),mask:n.push.person.silhouetteGrid(e),previous:n.push.person.silhouetteGrid(Math.max(0,e-1))});let d=n.emitter?.x,m=n.emitter?.y,p=d!==void 0&&typeof d!="number"||m!==void 0&&typeof m!="number",f=g=>({x:d===void 0?this.particleStatic.emitter.x:je(d,g,r),y:m===void 0?this.particleStatic.emitter.y:je(m,g,r)}),b;if(p){let g=f(e),y=f(Math.max(0,e-1));b={x:g.x,y:g.y,previousX:y.x,previousY:y.y}}return{...b&&{emitter:b},rate:i(n.emitter?.rate,1e3),burst:a,gravity:u,drag:i(n.drag,.4),noise:{strength:i(n.noise?.strength,0),scale:n.noise?.scale??300,speed:n.noise?.speed??.3},attractors:(n.attractors??[]).map(g=>({x:i(g.x,0),y:i(g.y,0),strength:i(g.strength,0),radius:g.radius??200})),push:c}}};h();var ve=Ar(_m(),1);h();var Di=Ar(Rd(),1);function ub(t=64){if(!Number.isSafeInteger(t)||t<1)throw new Error("[FrameGrid] maxFrames must be a positive safe integer.");return Math.min(t,120)}function cs(t,e){if(t>e)throw new Error(`[FrameGrid] Requested frames exceeds the safety threshold of ${e}. Increase stepFrames/stepMs or narrow the start/end range.`)}function Um(t,e,r,n,i){if(!Number.isFinite(t)||!Number.isFinite(e)||t<0||e<t)throw new Error(`[FrameGrid] Invalid ${i} range: start${i==="frame"?"Frame":"Ms"} must be <= end${i==="frame"?"Frame":"Ms"}; bounds must be finite and nonnegative.`);if(!Number.isFinite(r)||r<=0)throw new Error(`[FrameGrid] Invalid ${i==="frame"?"stepFrames":"stepMs"}: ${r}. Must be > 0 and finite.`);if(i==="frame"&&![t,e,r].every(Number.isSafeInteger))throw new Error("[FrameGrid] Frame bounds and stepFrames must be safe integers.");let o=[];for(let a=0;;a++){let s=t+a*r;if(!Number.isFinite(s))throw new Error("[FrameGrid] Range arithmetic overflow.");if(a>0&&s<=o[a-1])throw new Error("[FrameGrid] Step does not advance the sampling range.");if(s>e)break;cs(a+1,n),o.push(s)}return o}function ms(t,e=24,r){let n=t.fps??e;Mn(n);let i=ub(t.maxFrames),o;if(t.frames?.length?(cs(t.frames.length,i),o=t.frames.map(a=>Pt({frame:a},n))):t.timesMs?.length?(cs(t.timesMs.length,i),o=t.timesMs.map(a=>Pt({atMs:a},n))):o=lb(t,n,r,i),!o.length)throw new Error("[FrameGrid] Zero frames were resolved for sampling.");return{samples:o,fps:n}}function lb(t,e,r,n){let i=r===void 0?void 0:Ls(r,e)-1;if(t.startMs!==void 0||t.endMs!==void 0||t.stepMs!==void 0){let s=t.startMs??0,u=t.endMs??(i===void 0?s+1e3:i/e*1e3);return Um(s,u,t.stepMs??5e3/e,n,"millisecond").map(c=>Pt({atMs:c},e))}let o=t.startFrame??0,a=t.endFrame??Math.min(o+30,i??o+30);return Um(o,a,t.stepFrames??5,n,"frame").map(s=>Pt({frame:s},e))}function ds(t,e,r){let n=r.gap??12,i=r.padding??16,a=r.showHeader??!0?54:0,s=r.maxGridWidth??4096,u=r.maxGridHeight??4096,c=r.columns;(!c||c<=0)&&(t<=4?c=t:t<=9?c=3:t<=16?c=4:t<=25?c=5:c=6),c=Math.min(c,t);let d=Math.ceil(t/c),m=Math.max(120,Math.min(r.cellWidth??320,960)),p=r.cellHeight??Math.round(m/(e>0?e:16/9)),f=c*m+(c-1)*n+i*2,b=d*p+(d-1)*n+i*2+a;if(f>s||b>u){let g=Math.min((s-(c-1)*n-i*2)/(c*m),(u-(d-1)*n-i*2-a)/(d*p));if(g<.25)throw new Error(`[FrameGrid] Cannot fit ${t} cells (${c}x${d}) into max dimensions [${s}x${u}]. Reduce cell count or decrease cellWidth.`);m=Math.max(100,Math.floor(m*g)),p=Math.round(m/(e>0?e:16/9)),f=c*m+(c-1)*n+i*2,b=d*p+(d-1)*n+i*2+a}return{columns:c,rows:d,cellWidth:m,cellHeight:p,totalWidth:f,totalHeight:b,headerHeight:a,gap:n,padding:i}}async function pn(t,e={}){let r=t.fps??24,n=t.durationMs,{samples:i,fps:o}=ms(e,r,n),a=t.width??1920,s=t.height??1080,u=a>0&&s>0?a/s:16/9,c=ds(i.length,u,e),d=e.renderer??new ve.HeadlessMediaRenderer,m=[];for(let y of i){let k=await t.renderFrame({frame:y.frame,fps:o,renderer:d});m.push(k)}let p=new Di.Canvas(c.totalWidth,c.totalHeight),f=p.getContext("2d");if(f.fillStyle=e.backgroundColor??"#090a0f",f.fillRect(0,0,c.totalWidth,c.totalHeight),e.showHeader!==!1&&c.headerHeight>0){let y=e.headerText??`FrameGrid Conformance Review | Frames ${i[0].frame}\u2013${i[i.length-1].frame} (Count: ${i.length})`,k=`${a}\xD7${s} @ ${o} FPS | Cell: ${c.cellWidth}\xD7${c.cellHeight}px | Step: ${e.stepFrames?`${e.stepFrames}f`:e.stepMs?`${e.stepMs}ms`:"Custom"}`;f.fillStyle="#f8fafc",f.font="bold 15px sans-serif",f.fillText(y,c.padding,c.padding+18),f.fillStyle="#94a3b8",f.font="12px sans-serif",f.fillText(k,c.padding,c.padding+36),f.strokeStyle="#1e2433",f.lineWidth=1,f.beginPath(),f.moveTo(c.padding,c.padding+46),f.lineTo(c.totalWidth-c.padding,c.padding+46),f.stroke()}let b=e.showLabels??!0;for(let y=0;y<i.length;y++){let k=i[y],S=y%c.columns,M=Math.floor(y/c.columns),w=c.padding+S*(c.cellWidth+c.gap),A=c.padding+c.headerHeight+M*(c.cellHeight+c.gap),v=await(0,Di.loadImage)(m[y]);if(f.drawImage(v,w,A,c.cellWidth,c.cellHeight),f.strokeStyle="#262b3d",f.lineWidth=1,f.strokeRect(w,A,c.cellWidth,c.cellHeight),b){let N=`F:${k.frame} \u2022 ${Math.round(k.timeMs)}ms`;f.font="bold 11px sans-serif";let O=f.measureText(N).width+14,$=20,z=w+6,L=A+6;f.fillStyle="#090a0fee",f.beginPath(),f.roundRect(z,L,O,$,4),f.fill(),f.strokeStyle="#6366f155",f.lineWidth=1,f.stroke(),f.fillStyle="#e2e8f0",f.fillText(N,z+7,L+14)}}let g=await p.toBuffer("png");return e.outputPath&&await Dr.writeFile(e.outputPath,g),g}h();h();function Gm(t){let e;if(Array.isArray(t.mesh))e=t.mesh;else if(t.mesh&&typeof t.mesh=="object"&&"kind"in t.mesh)e=[t.mesh];else if(t.mesh&&typeof t.mesh=="object"&&t.mesh.type==="shard"){let i=Math.max(1,t.mesh.variants??8);e=[];for(let o=0;o<i;o++)e.push(Ee.shard({radius:20,facets:t.mesh.facets??12+o%6,seed:(t.seed??1)*31+o*17,irregularity:t.mesh.irregularity??.35}))}else if(t.mesh==="sphere")e=[Ee.sphere({radius:20})];else if(t.mesh==="roundedBox")e=[Ee.roundedBox({size:[30,30,30]})];else if(t.mesh==="cylinder")e=[Ee.cylinder({radius:15,height:35})];else{e=[];for(let o=0;o<8;o++)e.push(Ee.shard({radius:20,facets:10+o%8*2,seed:(t.seed??42)+o*13,irregularity:.35+o%3*.1}))}let r={id:t.id??Z("swarm3d"),kind:"model3d",x:0,y:0,z:0,opacity:1,twoSided:!0,material:t.material??"lit",roughness:t.roughness??.35,metallic:t.metallic??.7,specularIntensity:t.specularIntensity??.5,ambientIntensity:t.ambientIntensity??1,startFrame:t.startFrame,durationFrames:t.durationFrames,swarm3d:{...t,meshVariants:e}},n=e[0];return n&&(n.modelData&&(r.modelData=n.modelData),n.primitive3d&&(r.primitive3d=n.primitive3d)),B.model(r)}var mb=["material","shininess","roughness","specularIntensity","metallic","ambientIntensity","ior","transmission","dispersion","fresnelPower","envIntensity","emissive","emissiveIntensity","castShadow"];function wr(t){let e=t,r={};for(let n of mb)e[n]!==void 0&&(r[n]=e[n]);return r}function db(t){return t==="lit"||t==="unlit"||t==="toon"?t:void 0}function Ri(t,e,r){let n=Object.fromEntries(Object.entries({...e,color:r.color,material:db(r.material),shininess:r.shininess,roughness:r.roughness,metallic:r.metallic}).filter(([,i])=>i!==void 0));return B.model({id:r.id??Z(t),modelData:Ks(n),primitive3d:n,is3D:!0,x:r.x??0,y:r.y??0,z:r.z??0,rotateX:r.rotateX??0,rotateY:r.rotateY??0,rotateZ:r.rotateZ??0,scale:r.scale??1,scaleX:r.scaleX??1,scaleY:r.scaleY??1,scaleZ:r.scaleZ??1,opacity:r.opacity??1,color:r.tint,material:r.material,shininess:r.shininess??32,roughness:r.roughness,specularIntensity:r.specularIntensity??.5,ambientIntensity:r.ambientIntensity??1,metallic:r.metallic,...wr({emissive:r.emissive,emissiveIntensity:r.emissiveIntensity,castShadow:r.castShadow}),twoSided:!1,wireframe:r.wireframe,startFrame:r.startFrame,durationFrames:r.durationFrames})}function Ni(t,e){let r=e.faces??e.items??[];for(let[n,i]of Object.entries(e))Object.defineProperty(t,n,{value:i,enumerable:!1,configurable:!0});return Object.defineProperty(t,Symbol.iterator,{value:function*(){yield*r},enumerable:!1,configurable:!0}),t}function pb(t){let e=t.scale??1,r=Math.max(Math.abs(e*(t.scaleX??1)),Math.abs(e*(t.scaleY??1)));return r>0?r:1}var Ee={cube(t){let e=t.size,[r,n,i]=typeof e=="number"?[e,e,e]:e,o=t.twoSided??!0,a={front:"#3b82f6",back:"#1d4ed8",left:"#2563eb",right:"#1e40af",top:"#60a5fa",bottom:"#172554"},s=(f,b,g,y,k,S)=>{if(b&&typeof b=="object"&&"kind"in b){let w=b;return w.position="absolute",w.is3D=!0,w.twoSided=o,w.material=w.material??t.material??"lit",w.shininess=w.shininess??t.shininess??32,w.specularIntensity=w.specularIntensity??t.specularIntensity??.5,t.roughness!==void 0&&w.roughness===void 0&&(w.roughness=t.roughness),t.metallic!==void 0&&w.metallic===void 0&&(w.metallic=t.metallic),t.ambientIntensity!==void 0&&w.ambientIntensity===void 0&&(w.ambientIntensity=t.ambientIntensity),Object.assign(w,S),w}let M=typeof b=="string"?{background:b}:b??{background:g};return B.box({id:`${t.id??"cube"}-${f}`,position:"absolute",width:y,height:k,is3D:!0,twoSided:o,material:M.material??t.material??"lit",shininess:M.shininess??t.shininess??32,specularIntensity:M.specularIntensity??t.specularIntensity??.5,roughness:M.roughness??t.roughness,metallic:M.metallic??t.metallic,ambientIntensity:M.ambientIntensity??t.ambientIntensity??1,...wr({emissive:M.emissive??t.emissive,emissiveIntensity:M.emissiveIntensity??t.emissiveIntensity,castShadow:M.castShadow??t.castShadow}),background:M.background??g,borderRadius:M.borderRadius??0,borderWidth:M.borderWidth,borderColor:M.borderColor,opacity:M.opacity??1,children:M.children??[],...S})},u=r/2,c=n/2,d=i/2,m=[s("front",t.faces?.front,a.front,r,n,{x:0,y:0,z:-d,rotateX:0,rotateY:0,rotateZ:0}),s("back",t.faces?.back,a.back,r,n,{x:0,y:0,z:d,rotateX:0,rotateY:180,rotateZ:0}),s("left",t.faces?.left,a.left,i,n,{x:-u,y:0,z:0,rotateX:0,rotateY:90,rotateZ:0}),s("right",t.faces?.right,a.right,i,n,{x:u,y:0,z:0,rotateX:0,rotateY:-90,rotateZ:0}),s("top",t.faces?.top,a.top,r,i,{x:0,y:-c,z:0,rotateX:-90,rotateY:0,rotateZ:0}),s("bottom",t.faces?.bottom,a.bottom,r,i,{x:0,y:c,z:0,rotateX:90,rotateY:0,rotateZ:0})],p=B.box({id:t.id??Z("cube"),position:"absolute",x:t.x??0,y:t.y??0,z:t.z??0,width:r,height:n,is3D:!0,transformStyle:"preserve-3d",rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,opacity:t.opacity??1,background:"transparent",children:m});return Ni(p,{faces:m})},carousel(t){let{items:e,radius:r,faceInward:n=!1,twoSided:i=!0}=t,o=e.length,a=o>0?360/o:0,s=e.map((c,d)=>{let m=d*a,p=m*Math.PI/180,f=r*Math.sin(p),b=-r*Math.cos(p),g=n?180-m:-m,y=c;return y.position="absolute",y.is3D=!0,y.twoSided=i,y.x=f,y.y=0,y.z=b,y.rotateY=g,y}),u=B.box({id:t.id??Z("carousel"),position:"absolute",x:t.x??0,y:t.y??0,z:t.z??0,width:t.itemWidth??200,height:t.itemHeight??200,is3D:!0,transformStyle:"preserve-3d",rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,opacity:t.opacity??1,background:"transparent",children:s});return Ni(u,{items:s})},prism(t){let{sides:e,radius:r,height:n,twoSided:i=!0}=t,o=Math.max(3,e),a=2*r*Math.tan(Math.PI/o),s=360/o,u=[];for(let d=0;d<o;d++){let m=d*s,p=m*Math.PI/180,f=r*Math.sin(p),b=r*Math.cos(p),g=t.sideConfigs?.[d],y=typeof g=="string"?g:g?.background??`hsl(${d*360/o}, 70%, 50%)`;u.push(B.box({id:`${t.id??"prism"}-panel-${d}`,position:"absolute",width:a,height:n,is3D:!0,twoSided:i,x:f,y:0,z:b,rotateY:m,background:y}))}let c=B.box({id:t.id??Z("prism"),position:"absolute",x:t.x??0,y:t.y??0,z:t.z??0,width:a,height:n,is3D:!0,transformStyle:"preserve-3d",rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,opacity:t.opacity??1,background:"transparent",children:u});return Ni(c,{faces:u})},plane(t){return B.box({id:t.id??Z("plane"),position:"absolute",width:t.width,height:t.height,x:t.x??0,y:t.y??0,z:t.z??0,is3D:!0,twoSided:t.twoSided??!0,rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,background:t.background??"#3b82f6",borderRadius:t.borderRadius??0,opacity:t.opacity??1,...wr(t),children:t.children??[]})},grid(t){let{width:e,height:r}=t,n=t.id??Z("grid"),i=Math.max(1,Math.round(t.divisions??10)),o=t.lineWidth??2,a=t.color??"rgba(59, 130, 246, 0.5)",s=(p,f,b,g,y)=>B.box({id:`${n}-${p}`,position:"absolute",x:f,y:b,z:0,width:g,height:y,is3D:!0,twoSided:!0,material:"unlit",background:a}),u=4096,c=[],d=Math.ceil(r/u),m=Math.ceil(e/u);for(let p=0;p<=i;p++){let f=p/i-.5;for(let b=0;b<d;b++){let g=r/d,y=-r/2+g*(b+.5);c.push(s(`v${p}-${b}`,f*e,y,o,g))}for(let b=0;b<m;b++){let g=e/m,y=-e/2+g*(b+.5);c.push(s(`h${p}-${b}`,y,f*r,g,o))}}return B.box({id:n,position:"absolute",width:e,height:r,x:t.x??0,y:t.y??0,z:t.z??0,is3D:!0,transformStyle:"preserve-3d",rotateX:t.rotateX??90,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,background:"transparent",opacity:t.opacity??1,children:c})},text(t){return t.extrusionDepth&&t.extrusionDepth>0?Ee.extrudedText({...t,depth:t.extrusionDepth}):B.text(t.text,{id:t.id??Z("text3d"),position:"absolute",x:t.x??0,y:t.y??0,z:t.z??0,is3D:!0,twoSided:t.twoSided??!0,rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,fontSize:t.fontSize??48,fontFamily:t.fontFamily,fontWeight:t.fontWeight??"bold",fontStyle:t.fontStyle,fill:t.fill??"#ffffff",align:t.align??"center",direction:t.direction,verticalAlign:t.verticalAlign??"middle",letterSpacing:t.letterSpacing,lineHeight:t.lineHeight,material:t.material??"lit",shininess:t.shininess??64,roughness:t.roughness,specularIntensity:t.specularIntensity??.8,ambientIntensity:t.ambientIntensity??1,metallic:t.metallic,...wr(t),opacity:t.opacity??1,background:t.background,borderRadius:t.borderRadius,padding:t.padding,stroke:t.stroke,strokeWidth:t.strokeWidth})},extrudedText(t){let{depth:e,text:r,fill:n="#ffffff",bevelColor:i}=t,o,a=(t.curveTolerance??.1)/pb(t),s=(t.fontFamily?Zt.getParsed(t.fontFamily):null)??Zt.getParsed("Inter")??Zt.getParsed("Unbounded")??Zt.getFirstParsed();s&&(o=Zs({text:r,font:s,fontSize:t.fontSize??48,depth:e,fill:n,bevelColor:i,curveSegments:t.curveSegments,curveTolerance:a,align:t.align,direction:t.direction,verticalAlign:t.verticalAlign,letterSpacing:t.letterSpacing,material:t.material==="lit"||t.material==="unlit"||t.material==="toon"?t.material:void 0,shininess:t.shininess,roughness:t.roughness,metallic:t.metallic}).modelData);let u=B.model({id:t.id??Z("extruded-text"),modelData:o,is3D:!0,x:t.x??0,y:t.y??0,z:t.z??0,rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,scale:t.scale??1,scaleX:t.scaleX??1,scaleY:t.scaleY??1,scaleZ:t.scaleZ??1,opacity:t.opacity??1,material:t.material,shininess:t.shininess??32,roughness:t.roughness,specularIntensity:t.specularIntensity??.8,ambientIntensity:t.ambientIntensity??1,metallic:t.metallic,...wr(t),twoSided:t.twoSided??!0,text3dOptions:{...t,curveTolerance:a}});return Ni(u,{faces:[u],items:[u]})},roundedBox(t){return Ri("rounded-box",{type:"roundedBox",width:t.width,height:t.height,depth:t.depth,radius:t.radius,segments:t.segments,taper:t.taper},t)},sphere(t){return Ri("sphere",{type:"sphere",radius:t.radius,segments:t.segments},t)},cylinder(t){return Ri("cylinder",{type:"cylinder",radius:t.radius,radiusTop:t.radiusTop,radiusBottom:t.radiusBottom,height:t.height,segments:t.segments,openEnded:t.openEnded},t)},shard(t={}){return Ri("shard",{type:"shard",radius:t.radius,size:t.size,facets:t.facets,seed:t.seed,irregularity:t.irregularity},t)},instances(t){let e=Array.isArray(t.mesh)?t.mesh[0]:t.mesh,r={id:t.id??Z("instances3d"),kind:"model3d",x:t.x??0,y:t.y??0,z:t.z??0,rotateX:t.rotateX??0,rotateY:t.rotateY??0,rotateZ:t.rotateZ??0,scale:t.scale??1,color:t.color,colorTint:t.colorTint,opacity:t.opacity??1,twoSided:t.twoSided??!0,wireframe:t.wireframe??!1,material:t.material??"lit",roughness:t.roughness,metallic:t.metallic,specularIntensity:t.specularIntensity,ambientIntensity:t.ambientIntensity,startFrame:t.startFrame,durationFrames:t.durationFrames,instances3d:{...t},...wr(t)};if(e){let n=e;n.modelData&&(r.modelData=n.modelData),n.primitive3d&&(r.primitive3d=n.primitive3d),n.src&&(r.src=n.src)}return B.model(r)},swarm(t={}){return Gm(t)},model(t={}){return B.model(t)},obj(t,e={}){return B.obj(t,e)},fbx(t,e={}){return B.fbx(t,e)},gltf(t,e={}){return B.gltf(t,e)},glb(t,e={}){return B.glb(t,e)},stl(t,e={}){return B.stl(t,e)},ply(t,e={}){return B.ply(t,e)},vox(t,e={}){return B.vox(t,e)},threeDS(t,e={}){return B.threeDS(t,e)},off(t,e={}){return B.off(t,e)}};h();var ps=(t,e,r)=>{switch(t){case"left":return{dx:-e,dy:0};case"right":return{dx:e,dy:0};case"up":return{dx:0,dy:-r};default:return{dx:0,dy:r}}};function at(t,e,r){return{kind:t,frames:Math.max(0,Math.round(e)),build:r}}var Wm={cut:()=>at("cut",0,()=>({})),crossfade:(t=15,e="sine.inOut")=>at("crossfade",t,r=>({incoming:re.keys("opacity",[[0,0],[r.frames,1,e]])})),fadeThrough:(t=20,e="sine.inOut")=>at("fadeThrough",t,r=>{let n=Math.max(1,Math.floor(r.frames/2));return{outgoing:re.keys("opacity",[[r.outStart,1],[r.outStart+n,0,e]]),incoming:re.keys("opacity",[[0,0],[n,0],[r.frames,1,e]])}}),push:(t="left",e=18,r="power3.inOut")=>at("push",e,n=>{let{dx:i,dy:o}=ps(t,n.width,n.height),a=re.create(),s=re.create();return i!==0?(a.keys("x",[[n.outStart,n.outRest.x],[n.outStart+n.frames,n.outRest.x+i,r]]),s.keys("x",[[0,n.inRest.x-i],[n.frames,n.inRest.x,r]])):(a.keys("y",[[n.outStart,n.outRest.y],[n.outStart+n.frames,n.outRest.y+o,r]]),s.keys("y",[[0,n.inRest.y-o],[n.frames,n.inRest.y,r]])),{outgoing:a,incoming:s}}),slide:(t="left",e=18,r="power3.out")=>at("slide",e,n=>{let{dx:i,dy:o}=ps(t,n.width,n.height),a=i!==0?"x":"y",s=i!==0?n.inRest.x:n.inRest.y;return{outgoing:re.keys("opacity",[[n.outStart,1],[n.outStart+n.frames,.6,r]]),incoming:re.keys(a,[[0,s-(i||o)],[n.frames,s,r]])}}),zoom:(t=18,e="power2.inOut")=>at("zoom",t,r=>({outgoing:re.create().keys("scale",[[r.outStart,1],[r.outStart+r.frames,1.25,e]]).keys("opacity",[[r.outStart,1],[r.outStart+r.frames,0,e]]),incoming:re.create().keys("scale",[[0,.85],[r.frames,1,e]]).keys("opacity",[[0,0],[r.frames,1,e]])})),whip:(t="left",e=10)=>{let r=Wm.push(t,e,"expo.inOut");return at("whip",e,n=>({...r.build(n),sceneProps:{motionBlurShutter:360}}))},wipe:(t="left",e=18,r="power2.inOut")=>at("wipe",e,n=>{let{dx:i,dy:o}=ps(t,n.width,n.height),a=i!==0?"x":"y",s=i!==0?n.inRest.x:n.inRest.y;return{incomingMatte:B.box({id:Z("wipe-matte"),position:"absolute",x:n.inRest.x,y:n.inRest.y,width:n.width,height:n.height,background:"#ffffff"}).animate(re.keys(a,[[0,s-(i||o)],[n.frames,s,r]]))}}),iris:(t=20,e={})=>at("iris",t,r=>{let[n,i]=e.at??[.5,.5],o=r.inRest.x+n*r.width,a=r.inRest.y+i*r.height,s=Math.hypot(Math.max(n,1-n)*r.width,Math.max(i,1-i)*r.height);return{incomingMatte:B.shape("circle",{id:Z("iris-matte"),position:"absolute",x:o-s,y:a-s,width:s*2,height:s*2,fillColor:"#ffffff"}).animate(re.keys("scale",[[0,0],[r.frames,1,e.ease??"power2.inOut"]]))}})};function Fi(t,e,r){let n=t[e];return typeof n=="number"?n:r}function Hm(t,e={}){let r=[],n=[],i=0;t.forEach((a,s)=>{let u=s===0?void 0:a.transition,c=Math.min(u?.frames??0,t[s-1]?.duration??0),d=Math.max(0,i-c),m=Math.max(1,Math.round(a.duration));n.push(d);let p=a.scene;(p.position===void 0||p.position==="relative")&&(p.position="absolute",p.x??=0,p.y??=0),p.startFrame=d,p.durationFrames=m,r.push(p),i=d+m}),t.forEach((a,s)=>{if(s===0||!a.transition||a.transition.frames===0)return;let u=r[s-1],c=r[s],d=Math.min(a.transition.frames,t[s-1].duration),m=e.width??Fi(c,"width",1920),p=e.height??Fi(c,"height",1080),f=a.transition.build({width:m,height:p,frames:d,outStart:t[s-1].duration-d,outRest:{x:typeof u.x=="number"?u.x:0,y:typeof u.y=="number"?u.y:0},inRest:{x:typeof c.x=="number"?c.x:0,y:typeof c.y=="number"?c.y:0}}),b=(g,y)=>{if(!y)return;let k=g.animation?.tracks??[];g.animation=re.merge({tracks:k},y).toSpec()};b(u,f.outgoing),b(c,f.incoming),f.sceneProps&&(Object.assign(u,f.sceneProps),Object.assign(c,f.sceneProps)),f.incomingMatte&&(c.matte={node:f.incomingMatte,mode:"alpha"})});let o=B.box({id:e.id??Z("sequence"),position:"absolute",x:0,y:0,width:e.width??Fi(r[0]??{},"width",1920),height:e.height??Fi(r[0]??{},"height",1080),startFrame:e.startFrame??0,durationFrames:Math.max(1,i),children:r});return Object.defineProperty(o,"totalFrames",{value:i,enumerable:!1}),Object.defineProperty(o,"sceneStarts",{value:n,enumerable:!1}),o}h();var fb={studio:{environment:"studio",envIntensity:1,key:{dir:[-.55,-1,-.7],color:"#fff6ec",intensity:1.1},rim:{dir:[.9,-.5,.9],color:"#dbe8ff",intensity:.9}},soft:{environment:"soft",envIntensity:1,key:{dir:[-.4,-1,-.8],color:"#ffffff",intensity:1}},sunset:{environment:"sunset",envIntensity:.9,key:{dir:[-1,-.35,-.3],color:"#ffb27a",intensity:2.2},fill:{dir:[.8,-.6,-.4],color:"#7f9cff",intensity:.35}},dramatic:{environment:"night",envIntensity:.8,key:{dir:[-.8,-1,-.35],color:"#ffffff",intensity:2.4},rim:{dir:[.7,-.4,1],color:"#8fb4ff",intensity:1.8}}};function hb([t,e,r],n){let i=n*Math.PI/180,o=Math.cos(i),a=Math.sin(i);return[o*t+a*r,e,-a*t+o*r]}function Ym(t,e,r,n){let[i,o,a]=hb(t,n),s=Math.hypot(i,o,a)||1;return{x:e[0]+i/s*r,y:e[1]+o/s*r,z:e[2]+a/s*r,targetX:e[0],targetY:e[1],targetZ:e[2]}}function Oi(t,e){let r=fb[t],n=e.target??[960,540,0],i=e.distance??1600,o=e.rotation??0,a=e.intensity??1,s=e.id??Z(`lighting-${t}`),u=[st.environment(r.environment,{id:`${s}-environment`,intensity:r.envIntensity*a,rotation:o,exposure:e.exposure,toneMapping:e.toneMapping,fog:e.fog,bloom:e.bloom}),st.directional({id:`${s}-key`,color:r.key.color,intensity:r.key.intensity*a,...Ym(r.key.dir,n,i,o),castShadow:e.shadows??!0,shadowSoftness:e.shadowSoftness??3})];for(let[c,d]of[["rim",r.rim],["fill",r.fill]])d&&u.push(st.directional({id:`${s}-${c}`,color:d.color,intensity:d.intensity*a,...Ym(d.dir,n,i,o)}));return u}var gb={studio:(t={})=>Oi("studio",t),soft:(t={})=>Oi("soft",t),sunset:(t={})=>Oi("sunset",t),dramatic:(t={})=>Oi("dramatic",t)};h();h();var bb="@dimforge/rapier2d-deterministic-compat",yb="@dimforge/rapier3d-deterministic-compat";async function Xm(t,e){let r;try{r=await e()}catch(i){throw new Error(`Physics needs the optional dependency "${t}". Install it with \`npm i ${t}\`.`,{cause:i})}let n=r.default??r;return await n.init(),n}var qm,Zm;async function gs(t){if(t===2){qm??=Xm(bb,()=>import("./rapier-ZL2QGRPX.mjs"));let r=await qm;return{createWorld2D:n=>new fs(r,n),createWorld3D:()=>{throw new Error("This backend was loaded for 2D.")}}}Zm??=Xm(yb,()=>import("./rapier-EQTGTIYW.mjs"));let e=await Zm;return{createWorld2D:()=>{throw new Error("This backend was loaded for 3D.")},createWorld3D:r=>new hs(e,r)}}var fs=class{constructor(e,r){this.R=e;this.world=new e.World({x:r[0],y:r[1]}),this.events=new e.EventQueue(!0)}R;world;events;byCollider=new Map;started=[];addBody(e){let r=this.R,n=Km(r,e.type).setTranslation(e.position[0],e.position[1]).setRotation(e.angle).setLinvel(e.velocity[0],e.velocity[1]).setAngvel(e.angularVelocity).setLinearDamping(e.linearDamping).setAngularDamping(e.angularDamping).setGravityScale(e.gravityScale).setCcdEnabled(e.ccd).setEnabled(e.enabled);e.lockRotation&&n.lockRotations();let i=this.world.createRigidBody(n),o=this.world.createCollider(xb(r,e.shape).setDensity(e.density).setFriction(e.friction).setRestitution(e.restitution).setActiveEvents(r.ActiveEvents.COLLISION_EVENTS).setSensor(e.sensor??!1),i),a={raw:i,position:()=>{let s=i.translation();return[s.x,s.y]},rotation:()=>i.rotation(),velocity:()=>{let s=i.linvel();return[s.x,s.y]},angularVelocity:()=>i.angvel(),sleeping:()=>i.isSleeping(),mass:()=>i.mass(),setEnabled:s=>i.setEnabled(s),applyImpulse:([s,u])=>i.applyImpulse({x:s,y:u},!0),setKinematicTarget:([s,u],c)=>{i.setNextKinematicTranslation({x:s,y:u}),i.setNextKinematicRotation(c)}};return this.byCollider.set(o.handle,a),a}addJoint(e,r,n){let i=this.R,o={x:n.anchorA[0],y:n.anchorA[1]},a={x:n.anchorB[0],y:n.anchorB[1]},s;switch(n.type){case"revolute":case"spherical":s=i.JointData.revolute(o,a);break;case"fixed":s=i.JointData.fixed(o,0,a,0);break;case"rope":s=i.JointData.rope(n.length,o,a);break;case"spring":s=i.JointData.spring(n.restLength,n.stiffness,n.damping,o,a);break}this.world.createImpulseJoint(s,Bi(e),Bi(r),!0).setContactsEnabled(!1)}step(e){this.world.timestep=e,this.world.step(this.events),this.events.drainCollisionEvents((r,n,i)=>{if(!i)return;let o=this.byCollider.get(r),a=this.byCollider.get(n);o&&a&&this.started.push([o,a])})}drainCollisionStarts(){return this.started.splice(0)}free(){this.events.free(),this.world.free()}},hs=class{constructor(e,r){this.R=e;this.world=new e.World({x:r[0],y:r[1],z:r[2]}),this.events=new e.EventQueue(!0)}R;world;events;byCollider=new Map;started=[];addBody(e){let r=this.R,[n,i,o,a]=e.rotation,s=Km(r,e.type).setTranslation(e.position[0],e.position[1],e.position[2]).setRotation({x:n,y:i,z:o,w:a}).setLinvel(e.velocity[0],e.velocity[1],e.velocity[2]).setAngvel(vr(e.lockRotation?[0,0,0]:e.angularVelocity.map((p,f)=>e.enabledRotations&&!e.enabledRotations[f]?0:p))).setLinearDamping(e.linearDamping).setAngularDamping(e.angularDamping).setGravityScale(e.gravityScale).setCcdEnabled(e.ccd).setEnabled(e.enabled);e.lockRotation?s.lockRotations():e.enabledRotations&&s.enabledRotations(...e.enabledRotations);let u=this.world.createRigidBody(s),c=wb(r,e.shape),d=this.world.createCollider(c.setDensity(e.density).setFriction(e.friction).setRestitution(e.restitution).setActiveEvents(r.ActiveEvents.COLLISION_EVENTS).setSensor(e.sensor??!1),u),m={raw:u,position:()=>{let p=u.translation();return[p.x,p.y,p.z]},rotation:()=>{let p=u.rotation();return[p.x,p.y,p.z,p.w]},velocity:()=>{let p=u.linvel();return[p.x,p.y,p.z]},angularVelocity:()=>{let p=u.angvel();return[p.x,p.y,p.z]},sleeping:()=>u.isSleeping(),mass:()=>u.mass(),setEnabled:p=>u.setEnabled(p),applyImpulse:p=>u.applyImpulse(vr(p),!0),setKinematicTarget:(p,[f,b,g,y])=>{u.setNextKinematicTranslation(vr(p)),u.setNextKinematicRotation({x:f,y:b,z:g,w:y})}};return this.byCollider.set(d.handle,m),m}addJoint(e,r,n){let i=this.R,o=vr(n.anchorA),a=vr(n.anchorB),s;switch(n.type){case"revolute":s=i.JointData.revolute(o,a,vr(n.axis??[0,0,1]));break;case"spherical":s=i.JointData.spherical(o,a);break;case"fixed":{let u={x:0,y:0,z:0,w:1};s=i.JointData.fixed(o,u,a,u);break}case"rope":s=i.JointData.rope(n.length,o,a);break;case"spring":s=i.JointData.spring(n.restLength,n.stiffness,n.damping,o,a);break}this.world.createImpulseJoint(s,Bi(e),Bi(r),!0).setContactsEnabled(!1)}step(e){this.world.timestep=e,this.world.step(this.events),this.events.drainCollisionEvents((r,n,i)=>{if(!i)return;let o=this.byCollider.get(r),a=this.byCollider.get(n);o&&a&&this.started.push([o,a])})}drainCollisionStarts(){return this.started.splice(0)}free(){this.events.free(),this.world.free()}};function vr([t,e,r]){return{x:t,y:e,z:r}}function Bi(t){return t.raw}function Km(t,e){let r=t.RigidBodyDesc;return e==="fixed"?r.fixed():e==="kinematic"?r.kinematicPositionBased():r.dynamic()}function xb(t,e){switch(e.kind){case"ball":return t.ColliderDesc.ball(e.radius);case"box":{let r=Math.min(e.radius??0,e.hx/2,e.hy/2);return r>0?t.ColliderDesc.roundCuboid(e.hx-r,e.hy-r,r):t.ColliderDesc.cuboid(e.hx,e.hy)}case"hull":{let r=t.ColliderDesc.convexHull(new Float32Array(e.points));if(!r)throw new Error("Physics: could not build a convex hull for this shape.");return r}}}function wb(t,e){switch(e.kind){case"ball":return t.ColliderDesc.ball(e.radius);case"box":{let r=Math.min(e.radius??0,e.hx/2,e.hy/2,e.hz/2);return r>0?t.ColliderDesc.roundCuboid(e.hx-r,e.hy-r,e.hz-r,r):t.ColliderDesc.cuboid(e.hx,e.hy,e.hz)}case"cylinder":return t.ColliderDesc.cylinder(e.halfHeight,e.radius);case"hull":{let r=t.ColliderDesc.convexHull(new Float32Array(e.points));if(!r)throw new Error("Physics: could not build a convex hull for this shape.");return r}}}h();var fn=class{constructor(e,r,n,i,o,a,s){this.world=e;this.type=n;this.layer=i;this.frame=o;this.options=a;this.sim=r,this.recording=s}world;type;layer;frame;options;collisions=[];recording;sim;get startFrame(){return Math.max(0,Math.round(this.options.startFrame??0))}get gravityScale(){return this.options.gravityScale??1}get output(){return this.options.output}get x(){return this.recording.signal("x")}get y(){return this.recording.signal("y")}get rotation(){return this.recording.signal("rotation")}get centerX(){return this.recording.signal("centerX")}get centerY(){return this.recording.signal("centerY")}get vx(){return this.recording.signal("vx")}get vy(){return this.recording.signal("vy")}get speed(){return this.recording.signal("speed")}get angularVelocity(){return this.recording.signal("angularVelocity")}get impact(){return this.recording.signal("impact")}get sleeping(){return this.recording.signal("sleeping")}kinematicTarget(e){let r=this.options.follow;if(this.type!=="kinematic"||!r)return;let n=this.frame,i=this.world.fps,o=r.x===void 0?void 0:je(r.x,e,i),a=r.y===void 0?void 0:je(r.y,e,i),s=r.rotation===void 0?n.rotation:je(r.rotation,e,i),u=this.initialLayerXY(),c=ed(o??u[0],a??u[1],s,n),d=this.world.pixelsPerMeter;return{position:[c[0]/d,c[1]/d],rotation:s*Math.PI/180}}initialLayerXY(){let e=this.layer;return[Number(e?.x??0),Number(e?.y??0)]}record(e,r){let n=this.world.pixelsPerMeter,[i,o]=this.sim.position(),a=i*n,s=o*n,u=this.recording,c=u.channel("rotation"),d=this.sim.rotation()*180/Math.PI;c[e]=r<0?Ht(this.frame.rotation,d):Ht(c[r],d);let[m,p]=Mb(a,s,c[e],this.frame);u.channel("x")[e]=m,u.channel("y")[e]=p,u.channel("centerX")[e]=a,u.channel("centerY")[e]=s;let[f,b]=this.sim.velocity();u.channel("vx")[e]=f*n,u.channel("vy")[e]=b*n,u.channel("speed")[e]=Math.hypot(f,b)*n,u.channel("angularVelocity")[e]=this.sim.angularVelocity()*180/Math.PI,u.channel("sleeping")[e]=this.sim.sleeping()?1:0}boundChannels(){let e=[["x","x"],["y","y"]];return this.options.lockRotation||e.push(["rotation","rotation"]),e}localAnchor(e){if(!e)return[0,0];let r=this.world.pixelsPerMeter,[n,i]=this.sim.position(),o=-this.sim.rotation(),a=e[0]/r-n,s=e[1]/r-i;return[a*Math.cos(o)-s*Math.sin(o),a*Math.sin(o)+s*Math.cos(o)]}center(){let e=this.world.pixelsPerMeter,[r,n]=this.sim.position();return[r*e,n*e]}},Sr=class extends xr{constructor(e,r){let n=r.pixelsPerMeter??100,i=r.gravity??2400,o=typeof i=="number"?[0,i/n]:[i[0]/n,i[1]/n],a=e.createWorld2D(o);super(a,o,r)}body(e,r={}){this.assertOpen();let i=typeof e.kind=="string"?e:void 0,o=Sb(e,r),a=this.pixelsPerMeter,s=r.type??"dynamic",[u,c]=ed(o.x,o.y,o.rotation,o),d=r.velocity??[0,0],m={type:s,position:[u/a,c/a],angle:o.rotation*Math.PI/180,velocity:[d[0]/a,d[1]/a],angularVelocity:(r.angularVelocity??0)*Math.PI/180,linearDamping:r.linearDamping??0,angularDamping:r.angularDamping??0,gravityScale:r.gravityScale??1,lockRotation:r.lockRotation??!1,ccd:r.ccd??!1,enabled:!0,sensor:r.sensor??!1,density:r.density??1,friction:r.friction??.6,restitution:r.restitution??.3,shape:Qm(o.shape,1/a)},p=this.sim.addBody(m),f=new fn(this,p,s,i,o,r,this.newRecording());return this.addBody(f)}ground(e){return this.body({x:-1e6/2,y:e.y,width:1e6,height:2e3},{type:"fixed",friction:e.friction,restitution:e.restitution??.2})}walls(e){let{width:r,height:n}=e,i=e.x??0,o=e.y??0,a=e.thickness??400,s={type:"fixed",friction:e.friction,restitution:e.restitution??.2},u=n*4+a,c={floor:this.body({x:i-a,y:o+n,width:r+2*a,height:a},s),left:this.body({x:i-a,y:o+n-u,width:a,height:u},s),right:this.body({x:i+r,y:o+n-u,width:a,height:u},s),ceiling:void 0};return e.ceiling&&(c.ceiling=this.body({x:i-a,y:o-a,width:r+2*a,height:a},s)),c}pin(e,r){let n=r??e.center(),i=this.anchorBody(n);return this.joint(e,i,{type:"revolute",anchorA:e.localAnchor(n),anchorB:[0,0]}),this}hinge(e,r,n){return this.joint(e,r,{type:"revolute",anchorA:e.localAnchor(n),anchorB:r.localAnchor(n)}),this}weld(e,r){let n=e.center();return this.joint(e,r,{type:"fixed",anchorA:[0,0],anchorB:r.localAnchor(n)}),this}spring(e,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(e,r,n.anchorA,n.anchorB),s=this.pixelsPerMeter,u=(n.length??Math.hypot(a[0]-o[0],a[1]-o[1]))/s,c=vb(e,i),d=2*Math.PI*(n.frequency??2);return this.joint(e,i,{type:"spring",anchorA:e.localAnchor(o),anchorB:i.localAnchor(a),restLength:u,stiffness:c*d*d,damping:2*(n.dampingRatio??.2)*c*d}),this}rope(e,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(e,r,n.anchorA,n.anchorB),s=n.length??Math.hypot(a[0]-o[0],a[1]-o[1]);return this.joint(e,i,{type:"rope",anchorA:e.localAnchor(o),anchorB:i.localAnchor(a),length:s/this.pixelsPerMeter}),this}force(e,r){let n=this.pixelsPerMeter;return this.addForce(e,i=>[r.x===void 0?0:je(r.x,i,this.fps)/n,r.y===void 0?0:je(r.y,i,this.fps)/n]),this}field(e,r={}){let n=this.pixelsPerMeter;return this.addField((i,o)=>{let[a,s]=i.sim.position(),[u,c]=i.sim.velocity(),d=e({x:a*n,y:s*n,vx:u*n,vy:c*n,frame:o,body:i});return d?[d[0]/n,d[1]/n]:null},r.bodies),this}impulse(e,r,n){let i=this.pixelsPerMeter;return this.addImpulse(e,r,[n[0]/i,n[1]/i]),this}lerpRotation(e,r,n){return e+(r-e)*n}joint(e,r,n){this.assertOpen(),this.sim.addJoint(e.sim,r.sim,n)}anchorBody(e){return this.body({x:e[0]-.5,y:e[1]-.5,width:1,height:1},{type:"fixed",output:"none",sensor:!0})}endpoints(e,r,n,i){let o=n??e.center();if(Array.isArray(r)){let a=i??r;return{other:this.anchorBody(a),pa:o,pb:a}}return{other:r,pa:o,pb:i??r.center()}}};function vb(t,e){let r=t.type==="dynamic"?t.sim.mass():0,n=e.type==="dynamic"?e.sim.mass():0;return r>0&&n>0?r*n/(r+n):Math.max(r,n,.001)}function Ke(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function Sb(t,e){let r=typeof t.id=="string"?` "${t.id}"`:"";if(typeof t.x!="number"||typeof t.y!="number")throw new Error(`Physics: layer${r} needs numeric \`x\` and \`y\` (absolute position) to become a body.`);let n=e.size?.[0]??(typeof t.width=="number"?t.width:void 0),i=e.size?.[1]??(typeof t.height=="number"?t.height:void 0);if((n===void 0||i===void 0)&&t.kind==="text"){let s=Ve.measure(String(t.text??""),{fontFamily:String(t.fontFamily??"Inter"),fontSize:Ke(t.fontSize,48),fontWeight:t.fontWeight,letterSpacing:Ke(t.letterSpacing,0),lineHeight:typeof t.lineHeight=="number"?t.lineHeight:void 0});n??=s.width,i??=s.height}if(n===void 0||i===void 0||n<=0||i<=0)throw new Error(`Physics: layer${r} needs a numeric \`width\` and \`height\` (or the \`size\` option) to become a body.`);let o=Ke(t.scale,1);return{...{x:t.x,y:t.y,width:n,height:i,scale:o,anchorX:Ke(t.anchorX,.5),anchorY:Ke(t.anchorY,.5),rotation:Ke(t.rotation,0)},shape:Qm(kb(t,n,i,e.shape??"auto"),o)}}function kb(t,e,r,n){let o=t.kind==="shape"?String(t.shapeType??"rect"):"rect",a=Ke(t.borderRadius,Ke(t.cornerRadius,0)),s={kind:"box",hx:e/2,hy:r/2,radius:a};if(n==="box")return s;if(n==="circle"||n==="auto"&&o==="circle")return{kind:"ball",radius:Math.min(e,r)/2};if(n==="auto"&&o==="rect")return s;if(n==="hull"||n==="auto"){let u=Pb(t,o,e,r);return u.length>=6?{kind:"hull",points:u}:s}return s}function Pb(t,e,r,n){let i=e==="path"?String(t.d??""):Ys({shapeType:e,width:r,height:n,cornerRadius:Ke(t.cornerRadius,Ke(t.borderRadius,0)),polygonSides:t.polygonSides,starPoints:t.starPoints,starInnerRadiusRatio:t.starInnerRadiusRatio,arrowHeadWidth:t.arrowHeadWidth,arrowHeadLength:t.arrowHeadLength,arrowShaftWidth:t.arrowShaftWidth}),o=[];for(let a of Hs(i))o.push(a.p0.x-r/2,a.p0.y-n/2,a.p1.x-r/2,a.p1.y-n/2);return o}function Qm(t,e){switch(t.kind){case"ball":return{kind:"ball",radius:t.radius*e};case"box":return{kind:"box",hx:t.hx*e,hy:t.hy*e,radius:(t.radius??0)*e};case"hull":return{kind:"hull",points:t.points.map(r=>r*e)}}}function Jm(t,e){let r=t*Math.PI/180,n=(.5-e.anchorX)*e.width*e.scale,i=(.5-e.anchorY)*e.height*e.scale;return[n*Math.cos(r)-i*Math.sin(r),n*Math.sin(r)+i*Math.cos(r)]}function ed(t,e,r,n){let[i,o]=Jm(r,n);return[t+n.anchorX*n.width+i,e+n.anchorY*n.height+o]}function Mb(t,e,r,n){let[i,o]=Jm(r,n);return[t-i-n.anchorX*n.width,e-o-n.anchorY*n.height]}h();var St=Math.PI/180;function rd(t,e,r){let n=s=>s*St/2,i=[Math.sin(n(t)),0,0,Math.cos(n(t))],o=[0,Math.sin(n(e)),0,Math.cos(n(e))],a=[0,0,Math.sin(n(r)),Math.cos(n(r))];return Li(Li(a,o),i)}function Li(t,e){let[r,n,i,o]=t,[a,s,u,c]=e;return[o*a+r*c+n*u-i*s,o*s-r*u+n*c+i*a,o*u+r*s-n*a+i*c,o*c-r*a-n*s-i*u]}function Tb(t,e){let[r,n,i,o]=t,a=1-2*(n*n+i*i),s=2*(r*n+o*i),u=2*(r*i-o*n),c=2*(n*i+o*r),d=1-2*(r*r+n*n),m=2*(r*n-o*i),p=1-2*(r*r+i*i),f=Math.max(-1,Math.min(1,-u)),b;if(Math.abs(f)>.999999){let A=Math.asin(f),v=e?e[0]*St:0,N=Math.atan2(-m,p)+(f>0?v:-v);b=[v,A,N]}else b=[Math.atan2(c,d),Math.asin(f),Math.atan2(s,a)];let g=[b[0]/St,b[1]/St,b[2]/St];if(!e)return g;let y=[g[0]+180,180-g[1],g[2]+180],k=A=>[Ht(e[0],A[0]),Ht(e[1],A[1]),Ht(e[2],A[2])],S=k(g),M=k(y),w=A=>Math.abs(A[0]-e[0])+Math.abs(A[1]-e[1])+Math.abs(A[2]-e[2]);return w(S)<=w(M)?S:M}var hn=class{constructor(e,r,n,i,o,a,s){this.world=e;this.type=n;this.layer=i;this.start=o;this.options=a;this.sim=r,this.recording=s}world;type;layer;start;options;collisions=[];recording;sim;get startFrame(){return Math.max(0,Math.round(this.options.startFrame??0))}get gravityScale(){return this.options.gravityScale??1}get output(){return this.options.output}get x(){return this.recording.signal("x")}get y(){return this.recording.signal("y")}get z(){return this.recording.signal("z")}get rotateX(){return this.recording.signal("rotateX")}get rotateY(){return this.recording.signal("rotateY")}get rotateZ(){return this.recording.signal("rotateZ")}get vx(){return this.recording.signal("vx")}get vy(){return this.recording.signal("vy")}get vz(){return this.recording.signal("vz")}get speed(){return this.recording.signal("speed")}get impact(){return this.recording.signal("impact")}get sleeping(){return this.recording.signal("sleeping")}kinematicTarget(e){let r=this.options.follow;if(this.type!=="kinematic"||!r)return;let n=this.world.fps,i=(u,c)=>u===void 0?c:je(u,e,n),o=this.start.position,a=this.start.rotation,s=this.world.pixelsPerMeter;return{position:[i(r.x,o[0])/s,i(r.y,o[1])/s,i(r.z,o[2])/s],rotation:rd(i(r.rotateX,a[0]),i(r.rotateY,a[1]),i(r.rotateZ,a[2]))}}record(e,r){let n=this.world.pixelsPerMeter,i=this.recording,[o,a,s]=this.sim.position();i.channel("x")[e]=o*n,i.channel("y")[e]=a*n,i.channel("z")[e]=s*n;let u=i.channel("rotateX"),c=i.channel("rotateY"),d=i.channel("rotateZ"),m=r<0?this.start.rotation:[u[r],c[r],d[r]],p=Tb(this.sim.rotation(),m);u[e]=p[0],c[e]=p[1],d[e]=p[2];let[f,b,g]=this.sim.velocity();i.channel("vx")[e]=f*n,i.channel("vy")[e]=b*n,i.channel("vz")[e]=g*n,i.channel("speed")[e]=Math.hypot(f,b,g)*n,i.channel("sleeping")[e]=this.sim.sleeping()?1:0}boundChannels(){let e=[["x","x"],["y","y"],["z","z"]];return this.options.lockRotation!==!0&&e.push(["rotateX","rotateX"],["rotateY","rotateY"],["rotateZ","rotateZ"]),e}localAnchor(e){if(!e)return[0,0,0];let r=this.world.pixelsPerMeter,n=this.sim.position(),[i,o,a,s]=this.sim.rotation(),u=[e[0]/r-n[0],e[1]/r-n[1],e[2]/r-n[2]];return Ab(u,[-i,-o,-a,s])}center(){let e=this.world.pixelsPerMeter,[r,n,i]=this.sim.position();return[r*e,n*e,i*e]}};function Ab(t,e){let r=Li(Li(e,[t[0],t[1],t[2],0]),[-e[0],-e[1],-e[2],e[3]]);return[r[0],r[1],r[2]]}var kr=class extends xr{constructor(e,r){let n=r.pixelsPerMeter??100,i=r.gravity??2400,o=typeof i=="number"?[0,i/n,0]:[i[0]/n,i[1]/n,i[2]/n];super(e.createWorld3D(o),o,r)}body(e,r={}){this.assertOpen();let i=typeof e.kind=="string"?e:void 0,o=e,a=[le(r.x??o.x,0),le(r.y??o.y,0),le(r.z??o.z,0)],s=[le(r.rotateX??o.rotateX,0),le(r.rotateY??o.rotateY,0),le(r.rotateZ??o.rotateZ,0)],u=this.pixelsPerMeter,c=r.type??"dynamic",d=r.velocity??[0,0,0],m=r.angularVelocity??[0,0,0],p={type:c,position:[a[0]/u,a[1]/u,a[2]/u],rotation:rd(s[0],s[1],s[2]),velocity:[d[0]/u,d[1]/u,d[2]/u],angularVelocity:[m[0]*St,m[1]*St,m[2]*St],linearDamping:r.linearDamping??0,angularDamping:r.angularDamping??0,gravityScale:r.gravityScale??1,lockRotation:r.lockRotation===!0,...typeof r.lockRotation=="object"&&{enabledRotations:[!r.lockRotation.x,!r.lockRotation.y,!r.lockRotation.z]},ccd:r.ccd??!1,enabled:!0,sensor:r.sensor??!1,density:r.density??1,friction:r.friction??.6,restitution:r.restitution??.3,shape:Rb(Cb(o,r),1/u)},f=this.sim.addBody(p),b=new hn(this,f,c,i,{position:a,rotation:s},r,this.newRecording());return this.addBody(b)}ground(e){return this.body({x:0,y:e.y+2e3/2,z:0,width:1e6,height:2e3,depth:1e6},{type:"fixed",friction:e.friction,restitution:e.restitution??.2})}walls(e){let{width:r,height:n,depth:i}=e,[o,a,s]=[e.x??0,e.y??0,e.z??0],u=e.thickness??400,c={type:"fixed",friction:e.friction,restitution:e.restitution??.2},d=n*4,m=a+n/2-d/2;return[this.body({x:o,y:a+n/2+u/2,z:s,width:r+2*u,height:u,depth:i+2*u},c),this.body({x:o-r/2-u/2,y:m,z:s,width:u,height:d,depth:i+2*u},c),this.body({x:o+r/2+u/2,y:m,z:s,width:u,height:d,depth:i+2*u},c),this.body({x:o,y:m,z:s-i/2-u/2,width:r,height:d,depth:u},c),this.body({x:o,y:m,z:s+i/2+u/2,width:r,height:d,depth:u},c)]}pin(e,r){let n=r??e.center(),i=this.anchorBody(n);return this.joint(e,i,{type:"spherical",anchorA:e.localAnchor(n),anchorB:[0,0,0]}),this}hinge(e,r,n,i=[0,0,1]){return this.joint(e,r,{type:"revolute",anchorA:e.localAnchor(n),anchorB:r.localAnchor(n),axis:i}),this}weld(e,r){return this.joint(e,r,{type:"fixed",anchorA:[0,0,0],anchorB:r.localAnchor(e.center())}),this}spring(e,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(e,r,n.anchorA,n.anchorB),s=this.pixelsPerMeter,u=(n.length??td(o,a))/s,c=e.type==="dynamic"?e.sim.mass():0,d=i.type==="dynamic"?i.sim.mass():0,m=c>0&&d>0?c*d/(c+d):Math.max(c,d,.001),p=2*Math.PI*(n.frequency??2);return this.joint(e,i,{type:"spring",anchorA:e.localAnchor(o),anchorB:i.localAnchor(a),restLength:u,stiffness:m*p*p,damping:2*(n.dampingRatio??.2)*m*p}),this}rope(e,r,n={}){let{other:i,pa:o,pb:a}=this.endpoints(e,r,n.anchorA,n.anchorB);return this.joint(e,i,{type:"rope",anchorA:e.localAnchor(o),anchorB:i.localAnchor(a),length:(n.length??td(o,a))/this.pixelsPerMeter}),this}force(e,r){let n=this.pixelsPerMeter,i=(o,a)=>o===void 0?0:je(o,a,this.fps)/n;return this.addForce(e,o=>[i(r.x,o),i(r.y,o),i(r.z,o)]),this}field(e,r={}){let n=this.pixelsPerMeter;return this.addField((i,o)=>{let[a,s,u]=i.sim.position(),[c,d,m]=i.sim.velocity(),p=e({x:a*n,y:s*n,z:u*n,vx:c*n,vy:d*n,vz:m*n,frame:o,body:i});return p?[p[0]/n,p[1]/n,p[2]/n]:null},r.bodies),this}impulse(e,r,n){let i=this.pixelsPerMeter;return this.addImpulse(e,r,[n[0]/i,n[1]/i,n[2]/i]),this}lerpRotation(e,r,n){let i=e[0]*r[0]+e[1]*r[1]+e[2]*r[2]+e[3]*r[3]<0?-1:1,o=e.map((s,u)=>s+(r[u]*i-s)*n),a=Math.hypot(...o)||1;return o.map(s=>s/a)}joint(e,r,n){this.assertOpen(),this.sim.addJoint(e.sim,r.sim,n)}anchorBody(e){return this.body({x:e[0],y:e[1],z:e[2],width:1,height:1,depth:1},{type:"fixed",output:"none",sensor:!0})}endpoints(e,r,n,i){let o=n??e.center();if(Array.isArray(r)){let a=i??r;return{other:this.anchorBody(a),pa:o,pb:a}}return{other:r,pa:o,pb:i??r.center()}}};function td(t,e){return Math.hypot(e[0]-t[0],e[1]-t[1],e[2]-t[2])}function le(t,e){return typeof t=="number"&&Number.isFinite(t)?t:e}function Cb(t,e){let r=typeof t.id=="string"?` "${t.id}"`:"",n=le(t.scale,1),i=[n*le(t.scaleX,1),n*le(t.scaleY,1),n*le(t.scaleZ,1)],o=i[0]===i[1]&&i[1]===i[2],a=t.primitive3d??{},s=e.shape??"auto",u=()=>{let g=Db(t.modelData);if(g)return{kind:"hull",points:g.map((y,k)=>y*i[k%3])}};if(e.size||s==="box"){let[g,y,k]=e.size??bs(t,a)??[0,0,0];if(g>0&&y>0&&k>0)return{kind:"box",hx:g*i[0]/2,hy:y*i[1]/2,hz:k*i[2]/2,radius:a.type==="roundedBox"?le(a.radius,0)*Math.min(...i):0}}if(s==="hull"){let g=u();if(g)return g}if((s==="sphere"||s==="auto"&&a.type==="sphere")&&(o||s==="sphere")){let g=le(a.radius,0)||Math.max(...bs(t,a)??[0])/2;if(g>0)return{kind:"ball",radius:g*Math.max(...i)}}let d=le(a.radiusTop,le(a.radius,0)),m=le(a.radiusBottom,le(a.radius,0));if((s==="cylinder"||s==="auto"&&a.type==="cylinder")&&d===m&&d>0&&i[0]===i[2])return{kind:"cylinder",halfHeight:le(a.height,0)*i[1]/2,radius:d*i[0]};if(s==="auto"&&a.type==="roundedBox"&&(a.taper??1)===1){let[g,y,k]=[le(a.width,0),le(a.height,0),le(a.depth,0)];return{kind:"box",hx:g*i[0]/2,hy:y*i[1]/2,hz:k*i[2]/2,radius:le(a.radius,0)*Math.min(...i)}}let f=u();if(f)return f;let b=bs(t,a);if(b)return{kind:"box",hx:b[0]*i[0]/2,hy:b[1]*i[1]/2,hz:b[2]*i[2]/2};throw new Error(`Physics: layer${r} has no mesh or size to build a 3D collider from; pass \`size: [w, h, d]\`.`)}function bs(t,e){if(e.type==="roundedBox")return[le(e.width,0),le(e.height,0),le(e.depth,0)];if(e.type==="sphere"){let r=le(e.radius,0)*2;return[r,r,r]}if(e.type==="cylinder"){let r=Math.max(le(e.radiusTop,le(e.radius,0)),le(e.radiusBottom,le(e.radius,0)))*2;return[r,le(e.height,0),r]}if(typeof t.width=="number"&&typeof t.height=="number"&&typeof t.depth=="number")return[t.width,t.height,t.depth]}function Db(t){let e=t?.meshes;if(!e?.length)return;let r=0;for(let a of e)r+=(a.positions?.length??0)/3;if(r<4)return;let n=Math.max(1,Math.floor(r/4096)),i=[],o=0;for(let a of e){let s=a.positions;if(s)for(let u=0;u<s.length;u+=3,o++)o%n===0&&i.push(s[u],s[u+1],s[u+2])}return i}function Rb(t,e){switch(t.kind){case"ball":return{kind:"ball",radius:t.radius*e};case"box":return{kind:"box",hx:t.hx*e,hy:t.hy*e,hz:t.hz*e,radius:(t.radius??0)*e};case"cylinder":return{kind:"cylinder",halfHeight:t.halfHeight*e,radius:t.radius*e};case"hull":return{kind:"hull",points:t.points.map(r=>r*e)}}}var Nb={async world2d(t){return new Sr(await gs(2),t)},async world3d(t){return new kr(await gs(3),t)}};h();var ye=(...t)=>t,Fb={pixelArt:(t={})=>ye(new Kt({palette:t.palette??"pico8",pixelSize:t.pixelSize??6,dither:.4})),gameBoy:(t={})=>ye(new Kt({palette:"gameboy",pixelSize:t.pixelSize??4,dither:.6})),teletext:(t={})=>ye(new Kt({palette:"teletext",pixelSize:t.pixelSize??10})),ledWall:(t={})=>ye(new fo({size:t.size??14,shape:"circle",gap:.18})),ascii:(t={})=>ye(new io({cellSize:t.cellSize??10,colorMode:t.matrix?"green":"source",bg:t.matrix?"#020a04":"#0b0b0b"})),oneBit:(t={})=>ye(new uo({mode:"bayer",scale:t.scale??2,dark:t.dark??"#111111",light:t.light??"#f2efe6"})),risograph:(t={})=>{let e=t.inkA??"#1d3fbb",r=t.inkB??"#ff5fa2",n=t.paper??"#f4efe4";return ye(new Tt({stops:[{position:0,color:e},{position:.55,color:r},{position:1,color:n}]}),new Kt({palette:"custom",colors:[e,r,n],dither:.8,pixelSize:2}),new et({strength:.2}))},cartoon:(t={})=>ye(new Ln({levels:t.levels??4,edgeColor:t.ink??"#111111",saturation:1.3})),comic:(t={})=>ye(new Ln({levels:4,edgeWidth:1.5,saturation:1.4}),new Or({frequency:t.dotFrequency??70,opacity:.35})),thermal:()=>ye(new Tt({stops:[{position:0,color:"#000010"},{position:.25,color:"#3b0a7a"},{position:.5,color:"#c4205f"},{position:.75,color:"#ff9a1f"},{position:1,color:"#fffbe0"}]})),vhs:(t={})=>ye(new Fr({tracking:t.tracking??.5,chroma:4,curvature:.04,scanlines:.25,mask:.05,noise:.15}),new Bn({amount:3})),crt:(t={})=>ye(new Fr({curvature:t.curvature??.15,scanlines:.5,mask:.35})),glitch:(t={})=>ye(new Bn({amount:t.amount??18}),new Fr({tracking:1,chroma:6,curvature:0,scanlines:.1,mask:0,vignette:0})),oilPainting:(t={})=>ye(new On({style:"oil",radius:t.brush??5})),watercolor:(t={})=>ye(new On({style:"watercolor",radius:t.brush??6,paper:.5})),topographic:(t={})=>ye(new so({levels:t.levels??16,fill:"flat",lineColor:t.ink??"#5a3a1a",fillColor:t.paper??"#f3ead8"})),kaleidoscope:(t={})=>ye(new co({segments:t.segments??8,rotation:t.rotation??0})),opArt:(t={})=>ye(new po({pattern:t.pattern??"stripes",frequency:t.frequency??60})),holographic:(t={})=>ye(new lo({strength:t.strength??.7,shift:t.shift??0})),noir:()=>ye(new Tt({stops:[{position:0,color:"#000000"},{position:.55,color:"#8a8a8a"},{position:1,color:"#ffffff"}]}),new et({strength:.35}),new Qt({strength:.6})),film:()=>ye(new et({strength:.25}),new Qt({strength:.35}))};h();var yd=Ar(Nd(),1),ji=Ar(Fd(),1);Ui();var Ss=Ar(id(),1);h();Ui();var gn=G.dirname(An(import.meta.url)),od=["import","meta","url"].join("."),Ob=Wi(import.meta.url),bn="/@framefields/engine",sd={framefields:"index.ts","framefields/effects":"effects/index.ts","framefields/audio":"audio/index.ts","framefields/signals":"signals/index.ts","framefields/fonts":"fonts/index.ts","framefields/components":"components/index.ts"},ys={path:"path","path/posix":"path",url:"url",os:"os",fs:"fs","fs/promises":"fs-promises",module:"module"},ad=new Set(["sharp","skia-canvas","node-av","onnxruntime-node","@resvg/resvg-js","@napi-rs/webcodecs","@mediabunny/server","@mediabunny/mp3-encoder","webgpu","pino","pino-pretty","dotenv","esbuild","@framefields/renderer","framefields/renderer","framefields/preview"]),Bb=`
|
|
716
|
-
const stub = () => new Proxy(function () {}, {
|
|
717
|
-
get: (_t, k) => (k === "__esModule" ? true : k === Symbol.toPrimitive ? () => "" : stub()),
|
|
718
|
-
apply: () => stub(),
|
|
719
|
-
construct: () => stub(),
|
|
720
|
-
});
|
|
721
|
-
module.exports = stub();
|
|
722
|
-
`;async function Lb(t){let{build:e}=await import("./esbuild-DZUM7TEX.mjs"),r=G.resolve(gn,".."),n=G.join(gn,"shims"),i={player:G.join(gn,"player.ts")};for(let[o,a]of Object.entries(sd))i[pd(o)]=G.join(r,a);for(let o of new Set(Object.values(ys)))i[`shims/${o}`]=G.join(n,`${o}.ts`);await be.promises.rm(t,{recursive:!0,force:!0}),await e({...dd,entryPoints:i,outdir:t,outExtension:{".js":".mjs"},splitting:!0,minify:!0,conditions:["development","browser","import"],define:{"process.env.NODE_ENV":'"production"',global:"globalThis"},inject:[G.join(n,"process.ts")],plugins:[{name:"framefields-engine",setup(o){o.onResolve({filter:/^framefields-preview:renderers$/},()=>({path:zb()})),fd(o,a=>({path:G.join(n,`${a}.ts`)}))}}]})}async function ud(t){let{build:e}=await import("./esbuild-DZUM7TEX.mjs"),r=G.resolve(t.entry),n=s=>({path:`${bn}/${s}.mjs`,external:!0}),i={modelsDir:t.modelsDir,ortBase:t.ortBase},o=await e({...dd,entryPoints:["framefields-preview:entry"],write:!1,metafile:!0,sourcemap:"inline",plugins:[{name:"framefields-project",setup(s){s.onResolve({filter:/^framefields-preview:entry$/},()=>({path:"entry",namespace:"framefields-preview"})),s.onLoad({filter:/.*/,namespace:"framefields-preview"},()=>({contents:[`import { startPlayer } from ${JSON.stringify(`${bn}/player.mjs`)};`,`import * as mod from ${JSON.stringify(r)};`,`startPlayer(mod, ${JSON.stringify(t.exportName)}, ${JSON.stringify(i)});`].join(`
|
|
723
|
-
`),resolveDir:G.dirname(r),loader:"js"})),s.onResolve({filter:/^\/@framefields\/engine\//},u=>({path:u.path,external:!0})),s.onResolve({filter:/^framefields(\/|$)/},u=>sd[u.path]?n(pd(u.path)):void 0),fd(s,u=>n(`shims/${u}`)),Vb(s)}}]}),a=Object.keys(o.metafile?.inputs??{}).filter(s=>!s.includes(":")&&!s.includes("node_modules")).map(s=>G.resolve(s));return{code:o.outputFiles[0].text,inputs:a}}var Ii;function Eb(t){return[t,G.join(t,"..")].map(e=>G.join(e,"preview-engine")).find(e=>be.existsSync(G.join(e,"player.mjs")))}function ld(){let t=Eb(gn);return t?Promise.resolve(t):(Ii??=(async()=>{let e=G.join(Gi.tmpdir(),`framefields-preview-engine-${x.pid}`);return await Lb(e),e})(),Ii.catch(()=>{Ii=void 0}),Ii)}function cd(){return x.env.FRAMEFIELDS_MODELS_DIR?G.resolve(x.env.FRAMEFIELDS_MODELS_DIR):G.join(Gi.homedir(),".cache","framefields","models")}var Ib="1.30.0";function md(t){for(let e of[t,gn])try{let r=Wi(G.join(e,"noop.js")).resolve("onnxruntime-web"),n=G.dirname(r);return{base:`/@fs${n}/`,dir:n}}catch{}return{base:`https://cdn.jsdelivr.net/npm/onnxruntime-web@${Ib}/dist/`}}var dd={bundle:!0,format:"esm",platform:"browser",target:"es2022",mainFields:["browser","module","main"],logLevel:"silent"};function pd(t){return t==="framefields"?"framefields":t.slice(12)}function fd(t,e){t.onResolve({filter:/^(node:)?[a-z_/]+$/},r=>{let n=r.path.replace(/^node:/,"");if(ys[n])return e(ys[n]);if(r.path.startsWith("node:")||Ws(n))return{path:n,namespace:"framefields-stub"}}),t.onResolve({filter:/.*/},r=>{let n=jb(r.path);if(n&&(ad.has(n)||ad.has(r.path)))return{path:r.path,namespace:"framefields-stub"}}),t.onLoad({filter:/.*/,namespace:"framefields-stub"},()=>({contents:Bb,loader:"js"}))}function Vb(t){t.onLoad({filter:/\.[cm]?[jt]sx?$/},async e=>{if(e.path.includes(`${G.sep}node_modules${G.sep}`))return;let r=await be.promises.readFile(e.path,"utf8");if(r.includes(od))return{contents:`const __framefieldsFileUrl = ${JSON.stringify(Cn(e.path).href)};
|
|
724
|
-
${r.replaceAll(od,"__framefieldsFileUrl")}`,loader:$b(e.path)}})}function zb(){let t=Ob.resolve("@framefields/renderer"),e=G.join(G.dirname(t),"..","src","generated","node-renderers.ts");if(!be.existsSync(e))throw new Error(`[framefields] node renderer list not found at ${e}`);return e}function jb(t){if(t.startsWith(".")||t.startsWith("/"))return;let e=t.split("/");return t.startsWith("@")?e.slice(0,2).join("/"):e[0]}function $b(t){return t.endsWith(".tsx")?"tsx":t.endsWith(".jsx")?"jsx":/\.[cm]?ts$/.test(t)?"ts":"js"}h();Ui();var zi=class{constructor(e){this.dir=e;this.file=G.join(e,"notes.json")}dir;file;async list(){try{let e=JSON.parse(await be.promises.readFile(this.file,"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async add(e){let r=await this.list(),n=r.reduce((a,s)=>Math.max(a,s.id),0)+1,i={id:n,frame:Math.max(0,Math.round(Number(e.frame)||0)),time:yn(Number(e.time)||0,3),x:yn(Vi(e.x),4),y:yn(Vi(e.y),4),...e.w!==void 0&&e.h!==void 0&&{w:yn(Vi(e.w),4),h:yn(Vi(e.h),4)},text:String(e.text??"").trim(),done:!1,created:new Date().toISOString()};await this.ensureDir();let o=/^data:image\/jpeg;base64,(.+)$/.exec(e.image??"");return o&&(i.image=G.join(this.dir,`note-${n}.jpg`),await be.promises.writeFile(i.image,Buffer.from(o[1],"base64"))),await this.save([...r,i]),i}async update(e,r){let n=await this.list(),i=n.find(o=>o.id===e);if(i)return typeof r.done=="boolean"&&(i.done=r.done),typeof r.text=="string"&&r.text.trim()&&(i.text=r.text.trim()),await this.save(n),i}async remove(e){let r=await this.list(),n=r.find(i=>i.id===e);if(n)return n.image&&await be.promises.rm(n.image,{force:!0}),await this.save(r.filter(i=>i!==n)),n}async save(e){await this.ensureDir();let r=`${this.file}.${x.pid}.tmp`;await be.promises.writeFile(r,`${JSON.stringify(e,null," ")}
|
|
725
|
-
`),await be.promises.rename(r,this.file)}async ensureDir(){await be.promises.mkdir(this.dir,{recursive:!0});let e=G.join(G.dirname(this.dir),".gitignore");be.existsSync(e)||await be.promises.writeFile(e,`*
|
|
726
|
-
`)}};function hd(t,e){let r=i=>`${Math.round(i*100)}%`,n=t.w!==void 0&&t.h!==void 0?`area ${r(t.x)},${r(t.y)} to ${r(t.x+t.w)},${r(t.y+t.h)}`:`spot ${r(t.x)},${r(t.y)}`;return`note ${t.id} at ${_b(t.frame,e)} (frame ${t.frame}), ${n}: ${t.text}`}function _b(t,e){let r=t/e,n=Math.floor(r/60);return`${n}:${(r-n*60).toFixed(2).padStart(5,"0")}`}function Vi(t){let e=Number(t);return Number.isFinite(e)?Math.min(1,Math.max(0,e)):0}function yn(t,e){return Number(t.toFixed(e))}h();var gd=`<!doctype html>
|
|
727
|
-
<html lang="en">
|
|
728
|
-
<head>
|
|
729
|
-
<meta charset="utf-8">
|
|
730
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
731
|
-
<title>framefields preview</title>
|
|
732
|
-
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 512 512%22%3E%3Cg fill=%22none%22 stroke=%22%233B82F6%22 stroke-linecap=%22round%22%3E%3Cpath d=%22M184 56H86q-30 0-30 30v98M328 56h98q30 0 30 30v98M184 456H86q-30 0-30-30v-98M328 456h98q30 0 30-30v-98%22 stroke-width=%2234%22/%3E%3Cpath d=%22M176 182v148m0-148c0 74 60 74 100 74%22 stroke-width=%2228%22/%3E%3C/g%3E%3Cg fill=%22%233B82F6%22%3E%3Ccircle cx=%22176%22 cy=%22172%22 r=%2232%22/%3E%3Ccircle cx=%22176%22 cy=%22340%22 r=%2232%22/%3E%3Cpath d=%22M284 200l78 56-78 56z%22 stroke=%22%233B82F6%22 stroke-width=%2234%22 stroke-linejoin=%22round%22/%3E%3C/g%3E%3C/svg%3E">
|
|
733
|
-
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
734
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
735
|
-
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
736
|
-
<style>
|
|
737
|
-
:root {
|
|
738
|
-
--bg: #0e0f11; --surface: #16171a; --surface-2: #1d1e22; --surface-3: #26282d;
|
|
739
|
-
--line: #2a2c31; --line-2: #3a3c43;
|
|
740
|
-
--ink: #ededf0; --ink-2: #a6a8b0; --ink-3: #74777f;
|
|
741
|
-
--stage: #060607;
|
|
742
|
-
--primary-bg: #ededf0; --primary-ink: #0e0f11;
|
|
743
|
-
--brand: #3b82f6; --focus: #5eaefc; --ok: #4fbf7a; --bad: #f27d8d;
|
|
744
|
-
--wave: #4b4e57;
|
|
745
|
-
--radius: 10px;
|
|
746
|
-
--font: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
747
|
-
color-scheme: dark;
|
|
748
|
-
}
|
|
749
|
-
@media (prefers-color-scheme: light) {
|
|
750
|
-
:root {
|
|
751
|
-
--bg: #f5f5f6; --surface: #ffffff; --surface-2: #f0f0f2; --surface-3: #e6e6e9;
|
|
752
|
-
--line: #e2e2e6; --line-2: #cfcfd5;
|
|
753
|
-
--ink: #15161a; --ink-2: #53555d; --ink-3: #85878f;
|
|
754
|
-
--stage: #0b0b0c;
|
|
755
|
-
--primary-bg: #15161a; --primary-ink: #ffffff;
|
|
756
|
-
--brand: #2563eb; --focus: #1c74cc; --ok: #23874a; --bad: #cf4057;
|
|
757
|
-
--wave: #c2c3ca;
|
|
758
|
-
color-scheme: light;
|
|
759
|
-
}
|
|
760
|
-
}
|
|
761
|
-
* { box-sizing: border-box; }
|
|
762
|
-
html, body { height: 100%; margin: 0; overflow: hidden; background: var(--bg); color: var(--ink); }
|
|
763
|
-
body {
|
|
764
|
-
display: flex; flex-direction: column; height: 100dvh;
|
|
765
|
-
font: 13.5px/1.45 var(--font); -webkit-font-smoothing: antialiased;
|
|
766
|
-
font-feature-settings: "cv11", "ss03";
|
|
767
|
-
}
|
|
768
|
-
button, input { font: inherit; color: inherit; }
|
|
769
|
-
button { cursor: pointer; }
|
|
770
|
-
button:focus-visible, input:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
|
771
|
-
.tnum { font-variant-numeric: tabular-nums; }
|
|
772
|
-
.grow { flex: 1; }
|
|
773
|
-
.spinner {
|
|
774
|
-
width: 12px; height: 12px; border-radius: 50%; flex: none;
|
|
775
|
-
border: 1.5px solid var(--line-2); border-top-color: var(--ink); animation: spin .8s linear infinite;
|
|
776
|
-
}
|
|
777
|
-
@keyframes spin { to { transform: rotate(360deg); } }
|
|
778
|
-
.dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex: none; }
|
|
779
|
-
|
|
780
|
-
/* \u2500\u2500 Top bar \u2500\u2500 */
|
|
781
|
-
.top { flex: none; display: flex; align-items: center; gap: 10px; padding: 0 20px; height: 50px; border-bottom: 1px solid var(--line); min-width: 0; }
|
|
782
|
-
.logo { width: 22px; height: 22px; flex: none; color: var(--brand); }
|
|
783
|
-
.sep { width: 1px; height: 18px; background: var(--line-2); flex: none; margin: 0 2px; }
|
|
784
|
-
.top h1 { font-size: 14px; font-weight: 600; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
785
|
-
.spec { color: var(--ink-3); font-size: 12px; white-space: nowrap; }
|
|
786
|
-
@media (max-width: 640px) { .spec { display: none; } }
|
|
787
|
-
.chip {
|
|
788
|
-
display: inline-flex; align-items: center; gap: 8px; height: 26px; padding: 0 10px; white-space: nowrap;
|
|
789
|
-
border: 1px solid var(--line); border-radius: 999px; color: var(--ink-2); font-size: 12px; background: var(--surface);
|
|
790
|
-
}
|
|
791
|
-
.chip[data-state="ready"] .dot { color: var(--ok); }
|
|
792
|
-
.chip[data-state="none"] .dot, .chip[data-state="offline"] .dot { color: var(--ink-3); }
|
|
793
|
-
.chip[data-state="error"] { color: var(--bad); }
|
|
794
|
-
|
|
795
|
-
/* \u2500\u2500 Player: one screen, no page scroll; the picture takes the space left \u2500\u2500 */
|
|
796
|
-
.player {
|
|
797
|
-
flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 10px;
|
|
798
|
-
width: 100%; max-width: 1600px; margin: 0 auto; padding: 16px 20px 20px;
|
|
799
|
-
}
|
|
800
|
-
@media (max-width: 640px) { .player { padding: 12px; } }
|
|
801
|
-
.stage-wrap { flex: 1 1 0; min-height: 96px; container-type: size; display: grid; place-items: center; }
|
|
802
|
-
.stage {
|
|
803
|
-
position: relative; background: var(--stage); border-radius: var(--radius); overflow: hidden;
|
|
804
|
-
box-shadow: 0 0 0 1px var(--line); user-select: none; -webkit-user-select: none;
|
|
805
|
-
aspect-ratio: var(--ar, 16 / 9); width: min(100cqw, calc(100cqh * var(--ar-n, 1.7778)));
|
|
806
|
-
}
|
|
807
|
-
.stage canvas { display: block; width: 100%; height: 100%; }
|
|
808
|
-
.stage-msg {
|
|
809
|
-
position: absolute; inset: 0; display: none; place-items: center; padding: 24px; text-align: center;
|
|
810
|
-
color: #fff; background: rgb(0 0 0 / .72); font-size: 13px; line-height: 1.5; white-space: pre-wrap; overflow: auto;
|
|
811
|
-
}
|
|
812
|
-
.stage-msg.on { display: grid; }
|
|
813
|
-
/* Buffering: a centred spinning arc over the picture, like YouTube's. It
|
|
814
|
-
fades in after a beat so brief waits don't flash it. */
|
|
815
|
-
.buffering {
|
|
816
|
-
position: absolute; left: 50%; top: 50%; width: clamp(36px, 9cqmin, 64px); aspect-ratio: 1;
|
|
817
|
-
transform: translate(-50%, -50%); pointer-events: none; opacity: 0; visibility: hidden;
|
|
818
|
-
transition: opacity .15s, visibility 0s .15s; filter: drop-shadow(0 0 3px rgb(0 0 0 / .45));
|
|
819
|
-
}
|
|
820
|
-
.buffering.on { opacity: 1; visibility: visible; transition: opacity .2s .25s, visibility 0s .25s; }
|
|
821
|
-
.buffering svg { width: 100%; height: 100%; animation: yt-rotate 1.4s linear infinite; }
|
|
822
|
-
.buffering circle {
|
|
823
|
-
fill: none; stroke: #fff; stroke-width: 3.6; stroke-linecap: round;
|
|
824
|
-
stroke-dasharray: 1 150; stroke-dashoffset: 0; animation: yt-dash 1.4s ease-in-out infinite;
|
|
825
|
-
}
|
|
826
|
-
@keyframes yt-rotate { to { transform: rotate(360deg); } }
|
|
827
|
-
@keyframes yt-dash {
|
|
828
|
-
0% { stroke-dasharray: 1 150; stroke-dashoffset: 0; }
|
|
829
|
-
50% { stroke-dasharray: 90 150; stroke-dashoffset: -35; }
|
|
830
|
-
100% { stroke-dasharray: 90 150; stroke-dashoffset: -124; }
|
|
831
|
-
}
|
|
832
|
-
@media (prefers-reduced-motion: reduce) { .buffering circle, .play-btn .spin circle { animation: none; stroke-dasharray: 70 150; } }
|
|
833
|
-
|
|
834
|
-
/* \u2500\u2500 Transport \u2500\u2500 */
|
|
835
|
-
.transport { flex: none; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; row-gap: 6px; }
|
|
836
|
-
.icon-btn {
|
|
837
|
-
width: 32px; height: 32px; display: inline-grid; place-items: center; border-radius: 8px;
|
|
838
|
-
border: 0; background: transparent; color: var(--ink-2); flex: none;
|
|
839
|
-
}
|
|
840
|
-
.icon-btn:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
|
|
841
|
-
.icon-btn:disabled { opacity: .35; cursor: default; }
|
|
842
|
-
.icon-btn svg { width: 16px; height: 16px; }
|
|
843
|
-
.play-btn {
|
|
844
|
-
width: 36px; height: 36px; border-radius: 50%; border: 0; display: inline-grid; place-items: center; flex: none;
|
|
845
|
-
background: var(--primary-bg); color: var(--primary-ink); margin: 0 2px;
|
|
846
|
-
}
|
|
847
|
-
.play-btn:hover:not(:disabled) { filter: brightness(.9); }
|
|
848
|
-
.play-btn:disabled { opacity: .4; cursor: default; }
|
|
849
|
-
.play-btn svg { width: 14px; height: 14px; }
|
|
850
|
-
.play-btn .spin { display: none; width: 20px; height: 20px; animation: yt-rotate 1.4s linear infinite; }
|
|
851
|
-
.play-btn .spin circle {
|
|
852
|
-
fill: none; stroke: currentColor; stroke-width: 5; stroke-linecap: round;
|
|
853
|
-
stroke-dasharray: 1 150; animation: yt-dash 1.4s ease-in-out infinite;
|
|
854
|
-
}
|
|
855
|
-
.play-btn.loading .spin { display: block; }
|
|
856
|
-
.play-btn.loading svg:not(.spin) { display: none !important; }
|
|
857
|
-
.timecode { display: flex; align-items: baseline; gap: 5px; margin-left: 8px; font-size: 13px; white-space: nowrap; }
|
|
858
|
-
.timecode .dim { color: var(--ink-3); }
|
|
859
|
-
.timecode .frame { color: var(--ink-3); font-size: 11.5px; margin-left: 6px; }
|
|
860
|
-
.fps { margin-left: 10px; color: var(--ink-3); font-size: 11.5px; white-space: nowrap; }
|
|
861
|
-
input[type="range"].slider { -webkit-appearance: none; appearance: none; width: 72px; height: 4px; border-radius: 2px; background: var(--line-2); margin: 0 8px 0 0; }
|
|
862
|
-
input[type="range"].slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; border-radius: 50%; background: var(--ink); border: 0; }
|
|
863
|
-
input[type="range"].slider::-moz-range-thumb { width: 12px; height: 12px; border-radius: 50%; background: var(--ink); border: 0; }
|
|
864
|
-
input[type="range"].slider:disabled { opacity: .35; }
|
|
865
|
-
|
|
866
|
-
/* \u2500\u2500 Timeline \u2500\u2500 */
|
|
867
|
-
.timeline {
|
|
868
|
-
flex: none; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface);
|
|
869
|
-
padding: 0 14px; user-select: none; -webkit-user-select: none; touch-action: none; cursor: pointer;
|
|
870
|
-
}
|
|
871
|
-
.tl-inner { position: relative; }
|
|
872
|
-
.ruler { position: relative; height: 22px; border-bottom: 1px solid var(--line); }
|
|
873
|
-
.tick { position: absolute; bottom: 0; width: 1px; height: 4px; background: var(--line-2); }
|
|
874
|
-
.tick.major { height: 8px; background: var(--ink-3); }
|
|
875
|
-
.tick span { position: absolute; bottom: 9px; left: 4px; font-size: 10.5px; line-height: 1; color: var(--ink-3); white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
876
|
-
.wave-lane { position: relative; height: 48px; }
|
|
877
|
-
@media (max-height: 600px) { .wave-lane { height: 30px; } }
|
|
878
|
-
.wave-lane canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
|
|
879
|
-
.wave-state { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 8px; color: var(--ink-3); font-size: 12px; }
|
|
880
|
-
.wave-state.shimmer {
|
|
881
|
-
background: linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--ink) 6%, transparent) 50%, transparent 100%);
|
|
882
|
-
background-size: 200% 100%; animation: shimmer 1.4s linear infinite;
|
|
883
|
-
}
|
|
884
|
-
@keyframes shimmer { from { background-position: 100% 0; } to { background-position: -100% 0; } }
|
|
885
|
-
.playhead { position: absolute; top: 0; bottom: 0; width: 0; pointer-events: none; z-index: 3; }
|
|
886
|
-
.playhead::before { content: ""; position: absolute; top: 0; bottom: 0; left: -0.5px; width: 1px; background: var(--ink); }
|
|
887
|
-
.playhead::after { content: ""; position: absolute; top: 0; left: -5px; width: 10px; height: 11px; background: var(--ink); clip-path: polygon(0 0, 100% 0, 100% 55%, 50% 100%, 0 55%); }
|
|
888
|
-
.hover-line { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--line-2); display: none; pointer-events: none; }
|
|
889
|
-
.hover-time {
|
|
890
|
-
position: absolute; top: -28px; transform: translateX(-50%); display: none; pointer-events: none;
|
|
891
|
-
font-size: 11px; line-height: 1; background: var(--surface-3); color: var(--ink); padding: 5px 7px; border-radius: 5px;
|
|
892
|
-
white-space: nowrap; z-index: 4; font-variant-numeric: tabular-nums;
|
|
893
|
-
}
|
|
894
|
-
/* \u2500\u2500 Notes: pinned to a spot (or an area) and a moment \u2500\u2500 */
|
|
895
|
-
.stage.can-note { cursor: crosshair; }
|
|
896
|
-
.overlay { position: absolute; inset: 0; pointer-events: none; }
|
|
897
|
-
.pin {
|
|
898
|
-
position: absolute; width: 22px; height: 22px; margin: -11px 0 0 -11px; padding: 0; border-radius: 50%;
|
|
899
|
-
display: grid; place-items: center; pointer-events: auto; cursor: pointer;
|
|
900
|
-
background: var(--brand); color: #fff; font-size: 11px; font-weight: 600; line-height: 1;
|
|
901
|
-
border: 2px solid #fff; box-shadow: 0 1px 5px rgb(0 0 0 / .55); transition: transform .12s;
|
|
902
|
-
}
|
|
903
|
-
.pin:hover, .pin.active { transform: scale(1.18); }
|
|
904
|
-
.pin.done { background: #6b6e76; }
|
|
905
|
-
.pin.draft { animation: pin-pulse 1.5s ease-out infinite; }
|
|
906
|
-
.pin svg { width: 11px; height: 11px; }
|
|
907
|
-
@keyframes pin-pulse {
|
|
908
|
-
from { box-shadow: 0 0 0 0 rgb(59 130 246 / .6), 0 1px 5px rgb(0 0 0 / .55); }
|
|
909
|
-
to { box-shadow: 0 0 0 14px rgb(59 130 246 / 0), 0 1px 5px rgb(0 0 0 / .55); }
|
|
910
|
-
}
|
|
911
|
-
.area {
|
|
912
|
-
position: absolute; border: 1.5px solid var(--brand); border-radius: 3px;
|
|
913
|
-
background: rgb(59 130 246 / .12); box-shadow: 0 0 0 1px rgb(0 0 0 / .35);
|
|
914
|
-
}
|
|
915
|
-
.area.done { border-color: #9a9da5; background: rgb(255 255 255 / .05); }
|
|
916
|
-
.marquee { position: absolute; display: none; border: 1.5px dashed #fff; background: rgb(59 130 246 / .16); border-radius: 3px; pointer-events: none; }
|
|
917
|
-
.stage-hint, .toast {
|
|
918
|
-
position: absolute; left: 50%; transform: translateX(-50%); pointer-events: none; white-space: nowrap;
|
|
919
|
-
padding: 6px 11px; border-radius: 999px; font-size: 12px; color: #fff; background: rgb(0 0 0 / .62);
|
|
920
|
-
backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); opacity: 0; transition: opacity .15s;
|
|
921
|
-
}
|
|
922
|
-
.stage-hint { top: 12px; }
|
|
923
|
-
.stage.can-note.hint:hover .stage-hint { opacity: 1; }
|
|
924
|
-
.toast { bottom: 14px; }
|
|
925
|
-
.toast.on { opacity: 1; }
|
|
926
|
-
|
|
927
|
-
.pop {
|
|
928
|
-
position: fixed; z-index: 20; width: 280px; display: none; padding: 10px 10px 8px;
|
|
929
|
-
background: var(--surface); border: 1px solid var(--line-2); border-radius: 12px;
|
|
930
|
-
box-shadow: 0 12px 32px rgb(0 0 0 / .35);
|
|
931
|
-
}
|
|
932
|
-
.pop.on { display: block; }
|
|
933
|
-
.pop-head { display: flex; align-items: center; gap: 8px; font-size: 11.5px; color: var(--ink-3); margin-bottom: 6px; }
|
|
934
|
-
.badge {
|
|
935
|
-
min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; display: inline-grid; place-items: center; flex: none;
|
|
936
|
-
background: var(--brand); color: #fff; font-size: 10.5px; font-weight: 600;
|
|
937
|
-
}
|
|
938
|
-
.badge.done { background: var(--ink-3); }
|
|
939
|
-
.pop textarea {
|
|
940
|
-
display: block; width: 100%; min-height: 54px; max-height: 180px; resize: none; padding: 2px 2px 0;
|
|
941
|
-
border: 0; outline: none; background: transparent; color: var(--ink); font: inherit; line-height: 1.45;
|
|
942
|
-
}
|
|
943
|
-
.pop textarea::placeholder { color: var(--ink-3); }
|
|
944
|
-
.pop-text { white-space: pre-wrap; overflow-wrap: anywhere; padding: 0 2px; max-height: 200px; overflow: auto; }
|
|
945
|
-
.pop-foot { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 11.5px; color: var(--ink-3); }
|
|
946
|
-
.pop-foot .err { color: var(--bad); }
|
|
947
|
-
.btn {
|
|
948
|
-
height: 26px; padding: 0 10px; border-radius: 7px; border: 0; font-size: 12px; font-weight: 500;
|
|
949
|
-
display: inline-flex; align-items: center; gap: 6px; background: transparent; color: var(--ink-2); white-space: nowrap;
|
|
950
|
-
}
|
|
951
|
-
.btn:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
|
|
952
|
-
.btn.primary { background: var(--primary-bg); color: var(--primary-ink); }
|
|
953
|
-
.btn.primary:hover:not(:disabled) { background: var(--primary-bg); filter: brightness(.9); }
|
|
954
|
-
.btn.danger:hover:not(:disabled) { color: var(--bad); }
|
|
955
|
-
.btn:disabled { opacity: .4; cursor: default; }
|
|
956
|
-
.btn svg { width: 13px; height: 13px; }
|
|
957
|
-
.x-btn { width: 22px; height: 22px; padding: 0; justify-content: center; margin-right: -4px; }
|
|
958
|
-
|
|
959
|
-
.transport { position: relative; }
|
|
960
|
-
.notes-btn { height: 32px; padding: 0 9px 0 8px; margin-right: 6px; font-size: 12.5px; }
|
|
961
|
-
.notes-btn svg { width: 15px; height: 15px; }
|
|
962
|
-
.notes-btn .badge { background: var(--surface-3); color: var(--ink-2); }
|
|
963
|
-
.notes-btn .badge.open { background: var(--brand); color: #fff; }
|
|
964
|
-
.notes-panel {
|
|
965
|
-
position: absolute; right: 0; bottom: calc(100% + 8px); z-index: 15; width: min(360px, calc(100vw - 24px));
|
|
966
|
-
max-height: min(440px, 62vh); display: none; flex-direction: column; overflow: hidden;
|
|
967
|
-
background: var(--surface); border: 1px solid var(--line-2); border-radius: 12px; box-shadow: 0 12px 32px rgb(0 0 0 / .35);
|
|
968
|
-
}
|
|
969
|
-
.notes-panel.on { display: flex; }
|
|
970
|
-
.np-head { flex: none; display: flex; align-items: center; gap: 8px; padding: 8px 8px 8px 14px; border-bottom: 1px solid var(--line); }
|
|
971
|
-
.np-head h2 { margin: 0; font-size: 13px; font-weight: 600; }
|
|
972
|
-
.np-list { overflow: auto; padding: 4px; }
|
|
973
|
-
.np-empty { padding: 22px 18px; text-align: center; color: var(--ink-3); font-size: 12.5px; }
|
|
974
|
-
.np-foot { flex: none; padding: 8px 14px; border-top: 1px solid var(--line); color: var(--ink-3); font-size: 11.5px; overflow-wrap: anywhere; }
|
|
975
|
-
.note-row {
|
|
976
|
-
display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: start; padding: 8px 8px 8px 10px;
|
|
977
|
-
border-radius: 8px; cursor: pointer;
|
|
978
|
-
}
|
|
979
|
-
.note-row:hover { background: var(--surface-2); }
|
|
980
|
-
.note-row .badge { margin-top: 1px; }
|
|
981
|
-
.note-row .when { font-size: 11.5px; color: var(--ink-3); }
|
|
982
|
-
.note-row .text { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
|
|
983
|
-
.note-row.done .text { color: var(--ink-3); text-decoration: line-through; }
|
|
984
|
-
.check {
|
|
985
|
-
width: 20px; height: 20px; border-radius: 50%; padding: 0; display: grid; place-items: center; margin-top: 1px;
|
|
986
|
-
border: 1.5px solid var(--line-2); background: transparent; color: transparent;
|
|
987
|
-
}
|
|
988
|
-
.check:hover { border-color: var(--ok); color: var(--ok); }
|
|
989
|
-
.check.on { background: var(--ok); border-color: var(--ok); color: #fff; }
|
|
990
|
-
.check svg { width: 11px; height: 11px; }
|
|
991
|
-
|
|
992
|
-
.note-marks { position: absolute; left: 0; right: 0; top: 22px; bottom: 0; pointer-events: none; z-index: 2; }
|
|
993
|
-
.note-mark {
|
|
994
|
-
position: absolute; top: 5px; width: 14px; height: 14px; margin-left: -7px; padding: 0; border: 0; border-radius: 50%;
|
|
995
|
-
display: grid; place-items: center; pointer-events: auto; cursor: pointer;
|
|
996
|
-
background: var(--brand); color: #fff; font-size: 8.5px; font-weight: 700; box-shadow: 0 0 0 2px var(--surface);
|
|
997
|
-
}
|
|
998
|
-
.note-mark::after { content: ""; position: absolute; top: 14px; left: 6.5px; width: 1px; height: 30px; background: var(--brand); opacity: .45; }
|
|
999
|
-
.note-mark.done { background: var(--ink-3); }
|
|
1000
|
-
.note-mark.stacked::after { display: none; }
|
|
1001
|
-
.note-mark.done::after { background: var(--ink-3); }
|
|
1002
|
-
.note-mark:hover { transform: scale(1.2); }
|
|
1003
|
-
</style>
|
|
1004
|
-
</head>
|
|
1005
|
-
<body>
|
|
1006
|
-
<header class="top">
|
|
1007
|
-
<svg class="logo" viewBox="0 0 512 512" aria-label="framefields" role="img"><g fill="none" stroke="currentColor" stroke-linecap="round"><path d="M184 56H86q-30 0-30 30v98M328 56h98q30 0 30 30v98M184 456H86q-30 0-30-30v-98M328 456h98q30 0 30-30v-98" stroke-width="34" stroke-linejoin="round"/><path d="M176 182v148m0-148c0 74 60 74 100 74" stroke-width="28"/></g><g fill="currentColor"><circle cx="176" cy="172" r="32"/><circle cx="176" cy="340" r="32"/><path d="M284 200l78 56-78 56z" stroke="currentColor" stroke-width="34" stroke-linejoin="round"/></g></svg>
|
|
1008
|
-
<span class="sep" aria-hidden="true"></span>
|
|
1009
|
-
<h1 id="title">framefields preview</h1>
|
|
1010
|
-
<span class="grow"></span>
|
|
1011
|
-
<span class="spec tnum" id="spec"></span>
|
|
1012
|
-
<span class="chip" id="chip" data-state="mixing" role="status" aria-live="polite"><span class="spinner"></span><span>Mixing audio</span></span>
|
|
1013
|
-
</header>
|
|
1014
|
-
|
|
1015
|
-
<main class="player" aria-label="Player">
|
|
1016
|
-
<div class="stage-wrap">
|
|
1017
|
-
<div class="stage" id="stage">
|
|
1018
|
-
<canvas id="canvas" aria-label="Rendered frame"></canvas>
|
|
1019
|
-
<div class="stage-msg" id="stageMsg" role="alert"></div>
|
|
1020
|
-
<div class="overlay" id="pins"></div>
|
|
1021
|
-
<div class="marquee" id="marquee"></div>
|
|
1022
|
-
<div class="stage-hint" id="stageHint">Click to pin a note \xB7 drag to mark an area</div>
|
|
1023
|
-
<div class="toast" id="toast" role="status" aria-live="polite"></div>
|
|
1024
|
-
<div class="buffering" id="buffering" role="status" aria-label="Loading"><svg viewBox="0 0 50 50"><circle cx="25" cy="25" r="20"/></svg></div>
|
|
1025
|
-
</div>
|
|
1026
|
-
</div>
|
|
1027
|
-
|
|
1028
|
-
<div class="transport">
|
|
1029
|
-
<button class="icon-btn" id="prev" title="Previous frame" aria-label="Previous frame">
|
|
1030
|
-
<svg viewBox="0 0 16 16" fill="currentColor"><path d="M3 3h1.6v10H3zM13 3.6v8.8a.6.6 0 0 1-.92.5L5.8 8.5a.6.6 0 0 1 0-1l6.28-4.4a.6.6 0 0 1 .92.5z"/></svg>
|
|
1031
|
-
</button>
|
|
1032
|
-
<button class="play-btn" id="play" title="Play" aria-label="Play" disabled>
|
|
1033
|
-
<svg id="playIcon" viewBox="0 0 16 16" fill="currentColor"><path d="M4.5 2.9v10.2a.7.7 0 0 0 1.06.6l8.1-5.1a.7.7 0 0 0 0-1.2l-8.1-5.1a.7.7 0 0 0-1.06.6z"/></svg>
|
|
1034
|
-
<svg class="spin" viewBox="0 0 50 50" aria-hidden="true"><circle cx="25" cy="25" r="18"/></svg>
|
|
1035
|
-
<svg id="pauseIcon" viewBox="0 0 16 16" fill="currentColor" style="display:none"><rect x="3.5" y="2.5" width="3.2" height="11" rx=".8"/><rect x="9.3" y="2.5" width="3.2" height="11" rx=".8"/></svg>
|
|
1036
|
-
</button>
|
|
1037
|
-
<button class="icon-btn" id="next" title="Next frame" aria-label="Next frame">
|
|
1038
|
-
<svg viewBox="0 0 16 16" fill="currentColor"><path d="M11.4 3H13v10h-1.6zM3 3.6v8.8a.6.6 0 0 0 .92.5l6.28-4.4a.6.6 0 0 0 0-1L3.92 3.1A.6.6 0 0 0 3 3.6z"/></svg>
|
|
1039
|
-
</button>
|
|
1040
|
-
<div class="timecode tnum">
|
|
1041
|
-
<span id="tcNow">0:00.00</span><span class="dim">/</span><span class="dim" id="tcDur">0:00.00</span>
|
|
1042
|
-
<span class="frame" id="tcFrame">frame 0</span>
|
|
1043
|
-
</div>
|
|
1044
|
-
<span class="fps tnum" id="fps" role="status" hidden></span>
|
|
1045
|
-
<span class="grow"></span>
|
|
1046
|
-
<button class="btn notes-btn" id="notesBtn" title="Notes" aria-haspopup="dialog" aria-expanded="false" hidden>
|
|
1047
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"><path d="M3 2.75h10a1.25 1.25 0 0 1 1.25 1.25v6.5A1.25 1.25 0 0 1 13 11.75H7.5L4.5 14v-2.25H3A1.25 1.25 0 0 1 1.75 10.5V4A1.25 1.25 0 0 1 3 2.75z"/></svg>
|
|
1048
|
-
Notes <span class="badge" id="notesCount">0</span>
|
|
1049
|
-
</button>
|
|
1050
|
-
<div class="notes-panel" id="notesPanel" role="dialog" aria-label="Notes">
|
|
1051
|
-
<div class="np-head">
|
|
1052
|
-
<h2>Notes</h2><span class="grow"></span>
|
|
1053
|
-
<button class="btn" id="notesCopy" title="Copy the open notes, to paste into a chat">
|
|
1054
|
-
<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.25" y="5.25" width="8" height="8" rx="1.5"/><path d="M10.75 3.5V3.25a1.5 1.5 0 0 0-1.5-1.5h-5.5a1.5 1.5 0 0 0-1.5 1.5v5.5a1.5 1.5 0 0 0 1.5 1.5H4"/></svg>
|
|
1055
|
-
<span id="notesCopyLabel">Copy</span>
|
|
1056
|
-
</button>
|
|
1057
|
-
<button class="btn x-btn" id="notesClose" title="Close" aria-label="Close"><svg viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"/></svg></button>
|
|
1058
|
-
</div>
|
|
1059
|
-
<div class="np-list" id="notesList"></div>
|
|
1060
|
-
<div class="np-foot" id="notesFoot"></div>
|
|
1061
|
-
</div>
|
|
1062
|
-
<button class="icon-btn" id="mute" title="Mute" aria-label="Mute" disabled>
|
|
1063
|
-
<svg id="volIcon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6h2.2L8 3.2v9.6L4.7 10H2.5z" fill="currentColor" stroke="none"/><path d="M10.6 5.6a3.4 3.4 0 0 1 0 4.8M12.4 3.9a5.8 5.8 0 0 1 0 8.2"/></svg>
|
|
1064
|
-
<svg id="muteIcon" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" style="display:none"><path d="M2.5 6h2.2L8 3.2v9.6L4.7 10H2.5z" fill="currentColor" stroke="none"/><path d="M10.5 6l3.5 4M14 6l-3.5 4"/></svg>
|
|
1065
|
-
</button>
|
|
1066
|
-
<input class="slider" type="range" id="volume" min="0" max="1" step="0.01" value="0.9" aria-label="Volume" disabled>
|
|
1067
|
-
</div>
|
|
1068
|
-
|
|
1069
|
-
<div class="timeline" id="timeline" aria-label="Timeline">
|
|
1070
|
-
<div class="tl-inner" id="tlInner">
|
|
1071
|
-
<div class="ruler" id="ruler"></div>
|
|
1072
|
-
<div class="note-marks" id="noteMarks"></div>
|
|
1073
|
-
<div class="wave-lane">
|
|
1074
|
-
<canvas id="wave"></canvas>
|
|
1075
|
-
<div class="wave-state shimmer" id="waveState"><span class="spinner"></span>Mixing audio</div>
|
|
1076
|
-
</div>
|
|
1077
|
-
<div class="hover-line" id="hoverLine"></div>
|
|
1078
|
-
<div class="hover-time" id="hoverTime"></div>
|
|
1079
|
-
<div class="playhead" id="playhead"></div>
|
|
1080
|
-
</div>
|
|
1081
|
-
</div>
|
|
1082
|
-
</main>
|
|
1083
|
-
|
|
1084
|
-
<div class="pop" id="pop" role="dialog" aria-label="Note"></div>
|
|
1085
|
-
|
|
1086
|
-
<script>
|
|
1087
|
-
(function () {
|
|
1088
|
-
var $ = function (id) { return document.getElementById(id); };
|
|
1089
|
-
var stage = $("stage"), timeline = $("timeline"), tlInner = $("tlInner");
|
|
1090
|
-
|
|
1091
|
-
var meta = null, session = null, frame = 0, shown = -1, playing = false, playToken = 0;
|
|
1092
|
-
var player = null;
|
|
1093
|
-
|
|
1094
|
-
// \u2500\u2500 Helpers \u2500\u2500
|
|
1095
|
-
function fmt(f) {
|
|
1096
|
-
var s = f / meta.fps, m = Math.floor(s / 60);
|
|
1097
|
-
return m + ":" + (s - m * 60).toFixed(2).padStart(5, "0");
|
|
1098
|
-
}
|
|
1099
|
-
function last() { return meta.frameCount - 1; }
|
|
1100
|
-
function clampFrame(f) { return Math.max(0, Math.min(last(), Math.round(f))); }
|
|
1101
|
-
function pct(f) { return meta.frameCount > 1 ? (f / last()) * 100 : 0; }
|
|
1102
|
-
function el(tag, cls, text) {
|
|
1103
|
-
var e = document.createElement(tag);
|
|
1104
|
-
if (cls) e.className = cls;
|
|
1105
|
-
if (text != null) e.textContent = text;
|
|
1106
|
-
return e;
|
|
1107
|
-
}
|
|
1108
|
-
function sleep(ms) { return new Promise(function (r) { setTimeout(r, ms); }); }
|
|
1109
|
-
|
|
1110
|
-
// \u2500\u2500 Reporting: errors and the engine's warnings go to the preview's
|
|
1111
|
-
// terminal too, so whoever runs it sees them without opening this tab.
|
|
1112
|
-
// Once each; frame numbers aside, playback repeats the same one per frame \u2500\u2500
|
|
1113
|
-
var reportedKeys = new Set();
|
|
1114
|
-
function errText(x) {
|
|
1115
|
-
if (x && x.message) return x.stack && x.stack.indexOf(x.message) >= 0 ? x.stack.split("\\n").slice(0, 4).join("\\n") : x.message;
|
|
1116
|
-
return typeof x === "string" ? x : String(x);
|
|
1117
|
-
}
|
|
1118
|
-
function report(level, parts) {
|
|
1119
|
-
var text = parts.map(errText).join(" ").trim(), key = level + text.replace(/\\d+/g, "#");
|
|
1120
|
-
if (!text || reportedKeys.has(key) || reportedKeys.size > 100) return;
|
|
1121
|
-
reportedKeys.add(key);
|
|
1122
|
-
fetch("/@framefields/log", {
|
|
1123
|
-
method: "POST",
|
|
1124
|
-
headers: { "content-type": "application/json" },
|
|
1125
|
-
body: JSON.stringify({ level: level, message: text.slice(0, 4000) }),
|
|
1126
|
-
keepalive: true
|
|
1127
|
-
}).catch(function () {});
|
|
1128
|
-
}
|
|
1129
|
-
["error", "warn"].forEach(function (name) {
|
|
1130
|
-
var original = console[name].bind(console);
|
|
1131
|
-
console[name] = function () {
|
|
1132
|
-
original.apply(null, arguments);
|
|
1133
|
-
var args = Array.prototype.slice.call(arguments);
|
|
1134
|
-
// Errors from anywhere; warnings only from the engine (fonts, renderers).
|
|
1135
|
-
if (name === "error" || (typeof args[0] === "string" && args[0].indexOf("[framefields]") === 0)) {
|
|
1136
|
-
report(name === "error" ? "error" : "warning", args);
|
|
1137
|
-
}
|
|
1138
|
-
};
|
|
1139
|
-
});
|
|
1140
|
-
|
|
1141
|
-
// \u2500\u2500 Frames: drawn in this tab by the composition's own code \u2500\u2500
|
|
1142
|
-
function setTime(f) {
|
|
1143
|
-
frame = f;
|
|
1144
|
-
$("tcNow").textContent = fmt(f);
|
|
1145
|
-
$("tcFrame").textContent = "frame " + f;
|
|
1146
|
-
$("playhead").style.left = pct(f) + "%";
|
|
1147
|
-
if (!playing && notesOn) renderPins();
|
|
1148
|
-
}
|
|
1149
|
-
function show(f) {
|
|
1150
|
-
setTime(f);
|
|
1151
|
-
if (!player) return Promise.resolve();
|
|
1152
|
-
$("buffering").classList.add("on");
|
|
1153
|
-
// Calls made while a frame draws collapse to the latest.
|
|
1154
|
-
return player.render(f).then(function (drawn) {
|
|
1155
|
-
shown = drawn;
|
|
1156
|
-
if (!stalled) $("buffering").classList.remove("on");
|
|
1157
|
-
});
|
|
1158
|
-
}
|
|
1159
|
-
function seek(f) {
|
|
1160
|
-
stop();
|
|
1161
|
-
var done = show(clampFrame(f));
|
|
1162
|
-
keepPosition();
|
|
1163
|
-
scheduleWarm();
|
|
1164
|
-
return done;
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
// \u2500\u2500 Position in the address: #t=12.5 opens there, and a reload (the next
|
|
1168
|
-
// preview taking over) comes back to the same moment \u2500\u2500
|
|
1169
|
-
function startFrame() {
|
|
1170
|
-
var m = /[#&]t=([\\d.]+)/.exec(location.hash), n = /[#&]frame=(\\d+)/.exec(location.hash);
|
|
1171
|
-
if (m) return clampFrame(Number(m[1]) * meta.fps);
|
|
1172
|
-
if (n) return clampFrame(Number(n[1]));
|
|
1173
|
-
return 0;
|
|
1174
|
-
}
|
|
1175
|
-
function keepPosition() {
|
|
1176
|
-
var at = frame > 0 ? "#t=" + Number((frame / meta.fps).toFixed(3)) : location.pathname;
|
|
1177
|
-
try { history.replaceState(null, "", at); } catch (e) {}
|
|
1178
|
-
}
|
|
1179
|
-
|
|
1180
|
-
// \u2500\u2500 Analysing ahead: while paused, frames after the playhead are drawn
|
|
1181
|
-
// off-screen so vision results are cached before they play \u2500\u2500
|
|
1182
|
-
var warmTimer = null, warmToken = 0, warmed = new Set();
|
|
1183
|
-
function scheduleWarm() {
|
|
1184
|
-
clearTimeout(warmTimer);
|
|
1185
|
-
warmToken++;
|
|
1186
|
-
if (!player || !player.hasVision || playing) return;
|
|
1187
|
-
warmTimer = setTimeout(warmAhead, 1000);
|
|
1188
|
-
}
|
|
1189
|
-
async function warmAhead() {
|
|
1190
|
-
var token = ++warmToken;
|
|
1191
|
-
var end = Math.min(last(), frame + Math.round(meta.fps * 20));
|
|
1192
|
-
for (var f = frame + 1; f <= end && token === warmToken && !playing; f++) {
|
|
1193
|
-
if (warmed.has(f)) continue;
|
|
1194
|
-
if (!(await player.warm(f))) { scheduleWarm(); return; }
|
|
1195
|
-
warmed.add(f);
|
|
1196
|
-
await sleep(0);
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
function showError(err) {
|
|
1200
|
-
report("error", [err]);
|
|
1201
|
-
pageState = "error";
|
|
1202
|
-
$("buffering").classList.remove("on");
|
|
1203
|
-
$("stageMsg").textContent = String((err && err.message) || err);
|
|
1204
|
-
$("stageMsg").classList.add("on");
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
// \u2500\u2500 Audio \u2500\u2500
|
|
1208
|
-
var audio = { state: "mixing", error: "", buffer: null, peaks: null, ctx: null, gain: null, src: null, muted: false, volume: 0.9 };
|
|
1209
|
-
var AUDIO_LABEL = { mixing: "Mixing audio", loading: "Loading audio", ready: "Audio ready", none: "No audio", error: "Audio failed" };
|
|
1210
|
-
var offline = false;
|
|
1211
|
-
|
|
1212
|
-
function renderChip() {
|
|
1213
|
-
var chip = $("chip"), state, label, busy;
|
|
1214
|
-
if (offline) { state = "offline"; label = "Preview stopped"; busy = false; }
|
|
1215
|
-
else { state = audio.state; label = AUDIO_LABEL[audio.state]; busy = state === "mixing" || state === "loading"; }
|
|
1216
|
-
chip.dataset.state = state;
|
|
1217
|
-
chip.title = offline ? "The preview command isn't running. This tab reconnects when it starts again." : audio.error || "";
|
|
1218
|
-
chip.replaceChildren(el("span", busy ? "spinner" : "dot"), el("span", null, label));
|
|
1219
|
-
}
|
|
1220
|
-
function setAudioStatus(state, error) {
|
|
1221
|
-
audio.state = state;
|
|
1222
|
-
audio.error = error || "";
|
|
1223
|
-
var busy = state === "mixing" || state === "loading", ws = $("waveState");
|
|
1224
|
-
ws.classList.toggle("shimmer", busy);
|
|
1225
|
-
ws.style.display = state === "ready" ? "none" : "flex";
|
|
1226
|
-
ws.replaceChildren();
|
|
1227
|
-
if (busy) ws.append(el("span", "spinner"));
|
|
1228
|
-
ws.append(document.createTextNode(state === "none" ? "No audio in this composition" : state === "error" ? "Audio could not be mixed" : AUDIO_LABEL[state]));
|
|
1229
|
-
var usable = state === "ready" && !!audio.buffer;
|
|
1230
|
-
$("mute").disabled = !usable;
|
|
1231
|
-
$("volume").disabled = !usable;
|
|
1232
|
-
renderChip();
|
|
1233
|
-
drawWave();
|
|
1234
|
-
}
|
|
1235
|
-
function loadAudio(status) {
|
|
1236
|
-
stopClock();
|
|
1237
|
-
audio.buffer = null;
|
|
1238
|
-
audio.peaks = null;
|
|
1239
|
-
if (!status || status.state !== "ready") { setAudioStatus(status ? status.state : "none", status && status.error); return; }
|
|
1240
|
-
audio.peaks = status.peaks;
|
|
1241
|
-
setAudioStatus("loading");
|
|
1242
|
-
if (!audio.ctx) {
|
|
1243
|
-
var Ctx = window.AudioContext || window.webkitAudioContext;
|
|
1244
|
-
audio.ctx = new Ctx();
|
|
1245
|
-
audio.gain = audio.ctx.createGain();
|
|
1246
|
-
audio.gain.connect(audio.ctx.destination);
|
|
1247
|
-
applyVolume();
|
|
1248
|
-
}
|
|
1249
|
-
fetch("/audio")
|
|
1250
|
-
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.arrayBuffer(); })
|
|
1251
|
-
.then(function (data) { return audio.ctx.decodeAudioData(data); })
|
|
1252
|
-
.then(function (buf) { audio.buffer = buf; setAudioStatus("ready"); })
|
|
1253
|
-
.catch(function (err) { setAudioStatus("error", String((err && err.message) || err)); });
|
|
1254
|
-
}
|
|
1255
|
-
function applyVolume() {
|
|
1256
|
-
if (audio.gain) audio.gain.gain.value = audio.muted ? 0 : audio.volume;
|
|
1257
|
-
$("volIcon").style.display = audio.muted ? "none" : "";
|
|
1258
|
-
$("muteIcon").style.display = audio.muted ? "" : "none";
|
|
1259
|
-
$("mute").title = audio.muted ? "Unmute" : "Mute";
|
|
1260
|
-
$("mute").setAttribute("aria-label", audio.muted ? "Unmute" : "Mute");
|
|
1261
|
-
}
|
|
1262
|
-
// The clock for real-time playback: the soundtrack when there is one,
|
|
1263
|
-
// otherwise the wall clock. Audio as master keeps picture and sound in sync.
|
|
1264
|
-
function startClock(f0) {
|
|
1265
|
-
if (audio.buffer && audio.ctx) {
|
|
1266
|
-
audio.ctx.resume();
|
|
1267
|
-
var src = audio.ctx.createBufferSource();
|
|
1268
|
-
src.buffer = audio.buffer;
|
|
1269
|
-
src.connect(audio.gain);
|
|
1270
|
-
var startAt = audio.ctx.currentTime + 0.06, offset = f0 / meta.fps;
|
|
1271
|
-
if (offset < audio.buffer.duration) src.start(startAt, offset);
|
|
1272
|
-
audio.src = src;
|
|
1273
|
-
return function () { return Math.max(0, audio.ctx.currentTime - startAt); };
|
|
1274
|
-
}
|
|
1275
|
-
var t0 = performance.now();
|
|
1276
|
-
return function () { return (performance.now() - t0) / 1000; };
|
|
1277
|
-
}
|
|
1278
|
-
function stopClock() {
|
|
1279
|
-
if (!audio.src) return;
|
|
1280
|
-
try { audio.src.stop(); } catch (e) {}
|
|
1281
|
-
audio.src.disconnect();
|
|
1282
|
-
audio.src = null;
|
|
1283
|
-
}
|
|
1284
|
-
|
|
1285
|
-
// \u2500\u2500 Playback \u2500\u2500
|
|
1286
|
-
var stalled = false;
|
|
1287
|
-
// Waiting on frames mid-playback: the play button and the picture both spin.
|
|
1288
|
-
function setStalled(on) {
|
|
1289
|
-
stalled = on;
|
|
1290
|
-
$("play").classList.toggle("loading", on);
|
|
1291
|
-
$("buffering").classList.toggle("on", on);
|
|
1292
|
-
}
|
|
1293
|
-
function setPlayingUi(on) {
|
|
1294
|
-
$("playIcon").style.display = on ? "none" : "";
|
|
1295
|
-
$("pauseIcon").style.display = on ? "" : "none";
|
|
1296
|
-
$("play").title = on ? "Pause" : "Play";
|
|
1297
|
-
$("play").setAttribute("aria-label", on ? "Pause" : "Play");
|
|
1298
|
-
}
|
|
1299
|
-
function play() {
|
|
1300
|
-
if (playing || !player) return;
|
|
1301
|
-
playing = true;
|
|
1302
|
-
clearTimeout(warmTimer);
|
|
1303
|
-
warmToken++;
|
|
1304
|
-
var token = ++playToken;
|
|
1305
|
-
var alive = function () { return playing && token === playToken; };
|
|
1306
|
-
setPlayingUi(true);
|
|
1307
|
-
if (openId != null) closePop();
|
|
1308
|
-
if (draft && !draft.text.trim()) cancelDraft();
|
|
1309
|
-
if (notesOn) renderPins();
|
|
1310
|
-
if (frame >= last()) frame = 0;
|
|
1311
|
-
playFrames(alive).finally(function () { if (token === playToken && playing) pause(); });
|
|
1312
|
-
}
|
|
1313
|
-
function stop() {
|
|
1314
|
-
playing = false;
|
|
1315
|
-
stopClock();
|
|
1316
|
-
setStalled(false);
|
|
1317
|
-
setPlayingUi(false);
|
|
1318
|
-
meter.stop();
|
|
1319
|
-
renderFps();
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
// \u2500\u2500 Frame rate reached: distinct frames shown per second while playing,
|
|
1323
|
-
// over the last 2 s, stalls included. The film's own rate is in meta \u2500\u2500
|
|
1324
|
-
var meter = (function () {
|
|
1325
|
-
var started = null, lastFrame = null, samples = [], lastFps = null;
|
|
1326
|
-
function read() {
|
|
1327
|
-
if (started === null) return { state: "paused", fps: lastFps };
|
|
1328
|
-
var now = performance.now(), elapsed = Math.min(2000, now - started);
|
|
1329
|
-
samples = samples.filter(function (t) { return t > now - 2000; });
|
|
1330
|
-
if (elapsed < 1000) return { state: "measuring", fps: null };
|
|
1331
|
-
// Counting whole frames in the window can overshoot the film's rate.
|
|
1332
|
-
return { state: "playing", fps: Math.min(meta ? meta.fps : Infinity, (samples.length * 1000) / elapsed) };
|
|
1333
|
-
}
|
|
1334
|
-
return {
|
|
1335
|
-
read: read,
|
|
1336
|
-
start: function () { started = performance.now(); lastFrame = null; samples = []; },
|
|
1337
|
-
stop: function () {
|
|
1338
|
-
if (started === null) return;
|
|
1339
|
-
// A playback too short to measure leaves no rate, not an older one.
|
|
1340
|
-
var r = read();
|
|
1341
|
-
lastFps = r.state === "playing" ? r.fps : null;
|
|
1342
|
-
started = null;
|
|
1343
|
-
samples = [];
|
|
1344
|
-
},
|
|
1345
|
-
record: function (f) {
|
|
1346
|
-
if (started === null || f === lastFrame) return;
|
|
1347
|
-
lastFrame = f;
|
|
1348
|
-
samples.push(performance.now());
|
|
1349
|
-
}
|
|
1350
|
-
};
|
|
1351
|
-
})();
|
|
1352
|
-
function renderFps() {
|
|
1353
|
-
var r = meter.read(), out = $("fps");
|
|
1354
|
-
out.hidden = r.state === "paused" && r.fps === null;
|
|
1355
|
-
if (out.hidden) return;
|
|
1356
|
-
out.textContent = r.state === "measuring" ? "\u2026 fps" : r.fps.toFixed(1) + " fps";
|
|
1357
|
-
out.title = (r.state === "paused" ? "Frame rate the last playback reached" : "Frame rate playback reaches") + (meta ? "; the film runs at " + meta.fps + " fps" : "");
|
|
1358
|
-
}
|
|
1359
|
-
setInterval(function () { if (playing) renderFps(); }, 500);
|
|
1360
|
-
// Pausing settles on exactly the frame the timecode shows.
|
|
1361
|
-
function pause() { stop(); keepPosition(); show(frame).then(scheduleWarm); }
|
|
1362
|
-
function togglePlay() { playing ? pause() : play(); }
|
|
1363
|
-
|
|
1364
|
-
// Real time: nothing is rendered ahead. Each turn draws the frame due on
|
|
1365
|
-
// the clock straight to the screen, and frames that drawing missed are
|
|
1366
|
-
// skipped. Playback starts at once and the sound keeps its speed; a device
|
|
1367
|
-
// that can't keep up shows fewer frames, and the frame rate says how many.
|
|
1368
|
-
async function playFrames(alive) {
|
|
1369
|
-
meter.start();
|
|
1370
|
-
renderFps();
|
|
1371
|
-
// A soundtrack still downloading would start late: wait for it.
|
|
1372
|
-
if (audio.state === "loading") {
|
|
1373
|
-
setStalled(true);
|
|
1374
|
-
while (alive() && audio.state === "loading") await sleep(50);
|
|
1375
|
-
// A newer playback may be waiting too: only this one's own stall ends here.
|
|
1376
|
-
if (!alive()) return;
|
|
1377
|
-
setStalled(false);
|
|
1378
|
-
}
|
|
1379
|
-
var f0 = frame, clock = startClock(f0), presented = -1;
|
|
1380
|
-
while (alive()) {
|
|
1381
|
-
var due = Math.min(last(), f0 + Math.floor(clock() * meta.fps));
|
|
1382
|
-
if (due === presented) { await sleep(4); continue; }
|
|
1383
|
-
setTime(due);
|
|
1384
|
-
// Each frame is drawn once; caching it would cost a texture and a copy per frame.
|
|
1385
|
-
var drawn = await player.render(due, { cache: false });
|
|
1386
|
-
if (!alive()) return;
|
|
1387
|
-
presented = shown = drawn;
|
|
1388
|
-
meter.record(drawn);
|
|
1389
|
-
if (drawn >= last()) return;
|
|
1390
|
-
}
|
|
1391
|
-
}
|
|
1392
|
-
|
|
1393
|
-
// \u2500\u2500 Timeline \u2500\u2500
|
|
1394
|
-
function frameAtX(clientX) {
|
|
1395
|
-
var r = tlInner.getBoundingClientRect();
|
|
1396
|
-
return clampFrame(Math.min(1, Math.max(0, (clientX - r.left) / r.width)) * last());
|
|
1397
|
-
}
|
|
1398
|
-
function renderRuler() {
|
|
1399
|
-
var ruler = $("ruler"), width = tlInner.clientWidth || 800, dur = last() / meta.fps;
|
|
1400
|
-
ruler.replaceChildren();
|
|
1401
|
-
if (dur <= 0) return;
|
|
1402
|
-
var steps = [0.5, 1, 2, 5, 10, 15, 30, 60, 120, 300, 600];
|
|
1403
|
-
var major = steps.find(function (s) { return (s / dur) * width >= 80; }) || 1200, minor = major / 5;
|
|
1404
|
-
for (var i = 0; i * minor <= dur + 1e-6; i++) {
|
|
1405
|
-
var t = i * minor, isMajor = i % 5 === 0, x = (t / dur) * width;
|
|
1406
|
-
var tick = el("div", "tick" + (isMajor ? " major" : ""));
|
|
1407
|
-
tick.style.left = (t / dur) * 100 + "%";
|
|
1408
|
-
if (isMajor && x < width - 34) {
|
|
1409
|
-
var m = Math.floor(t / 60), s = Math.round((t - m * 60) * 10) / 10;
|
|
1410
|
-
tick.append(el("span", null, m + ":" + (s < 10 ? "0" : "") + s));
|
|
1411
|
-
}
|
|
1412
|
-
ruler.append(tick);
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
function drawWave() {
|
|
1416
|
-
var canvas = $("wave"), dpr = window.devicePixelRatio || 1;
|
|
1417
|
-
var w = canvas.clientWidth, h = canvas.clientHeight;
|
|
1418
|
-
canvas.width = Math.round(w * dpr);
|
|
1419
|
-
canvas.height = Math.round(h * dpr);
|
|
1420
|
-
var ctx = canvas.getContext("2d");
|
|
1421
|
-
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
1422
|
-
ctx.clearRect(0, 0, w, h);
|
|
1423
|
-
var peaks = audio.peaks;
|
|
1424
|
-
if (!peaks || !peaks.length || !meta) return;
|
|
1425
|
-
var videoSec = Math.max(1e-6, last() / meta.fps);
|
|
1426
|
-
var audioSec = audio.buffer ? audio.buffer.duration : videoSec;
|
|
1427
|
-
var spanPx = Math.min(1, audioSec / videoSec) * w, mid = h / 2;
|
|
1428
|
-
ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue("--wave").trim();
|
|
1429
|
-
for (var x = 0; x < spanPx; x += 3) {
|
|
1430
|
-
var v = Math.max(peaks[Math.floor((x / spanPx) * peaks.length)] || 0, 0.015);
|
|
1431
|
-
var bh = Math.max(1, Math.sqrt(v) * (h - 8));
|
|
1432
|
-
ctx.fillRect(x, mid - bh / 2, 2, bh);
|
|
1433
|
-
}
|
|
1434
|
-
}
|
|
1435
|
-
|
|
1436
|
-
var dragging = false;
|
|
1437
|
-
timeline.addEventListener("pointerdown", function (e) {
|
|
1438
|
-
if (!meta || e.button !== 0) return;
|
|
1439
|
-
timeline.setPointerCapture(e.pointerId);
|
|
1440
|
-
dragging = true;
|
|
1441
|
-
seek(frameAtX(e.clientX));
|
|
1442
|
-
});
|
|
1443
|
-
timeline.addEventListener("pointermove", function (e) {
|
|
1444
|
-
if (!meta) return;
|
|
1445
|
-
var f = frameAtX(e.clientX), r = tlInner.getBoundingClientRect();
|
|
1446
|
-
var x = Math.min(r.width, Math.max(0, e.clientX - r.left));
|
|
1447
|
-
$("hoverLine").style.display = "block";
|
|
1448
|
-
$("hoverLine").style.left = x + "px";
|
|
1449
|
-
$("hoverTime").style.display = "block";
|
|
1450
|
-
$("hoverTime").style.left = x + "px";
|
|
1451
|
-
$("hoverTime").textContent = fmt(f);
|
|
1452
|
-
if (dragging && f !== frame) seek(f);
|
|
1453
|
-
});
|
|
1454
|
-
timeline.addEventListener("pointerleave", function () {
|
|
1455
|
-
$("hoverLine").style.display = "none";
|
|
1456
|
-
$("hoverTime").style.display = "none";
|
|
1457
|
-
});
|
|
1458
|
-
timeline.addEventListener("pointerup", function () { dragging = false; });
|
|
1459
|
-
timeline.addEventListener("pointercancel", function () { dragging = false; });
|
|
1460
|
-
|
|
1461
|
-
// \u2500\u2500 Notes: pause, click the picture (or drag an area) and say what should
|
|
1462
|
-
// change. Each is saved with its moment, its spot and a picture of the
|
|
1463
|
-
// frame with the spot marked, for whoever edits the film \u2500\u2500
|
|
1464
|
-
var notes = [], notesOn = false, draft = null, openId = null, saving = false, press = null;
|
|
1465
|
-
var pop = $("pop"), pins = $("pins"), NL = String.fromCharCode(10);
|
|
1466
|
-
var ICON_CHECK = '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8.5l3 3 6-7"/></svg>';
|
|
1467
|
-
var ICON_X = '<svg viewBox="0 0 16 16" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"/></svg>';
|
|
1468
|
-
|
|
1469
|
-
function pct1(v) { return Math.round(v * 100) + "%"; }
|
|
1470
|
-
function whereText(n) {
|
|
1471
|
-
return n.w != null ? "area " + pct1(n.x) + "," + pct1(n.y) + " to " + pct1(n.x + n.w) + "," + pct1(n.y + n.h) : "spot " + pct1(n.x) + "," + pct1(n.y);
|
|
1472
|
-
}
|
|
1473
|
-
function noteById(id) { return notes.find(function (n) { return n.id === id; }); }
|
|
1474
|
-
function openCount() { return notes.filter(function (n) { return !n.done; }).length; }
|
|
1475
|
-
|
|
1476
|
-
function renderNotes() {
|
|
1477
|
-
renderPins();
|
|
1478
|
-
renderMarks();
|
|
1479
|
-
renderList();
|
|
1480
|
-
var open = openCount(), count = $("notesCount");
|
|
1481
|
-
count.textContent = String(open || notes.length);
|
|
1482
|
-
count.classList.toggle("open", open > 0);
|
|
1483
|
-
$("notesBtn").title = open + " open of " + notes.length;
|
|
1484
|
-
}
|
|
1485
|
-
function renderPins() {
|
|
1486
|
-
if (!meta) return;
|
|
1487
|
-
stage.classList.toggle("can-note", notesOn && !!player && !playing);
|
|
1488
|
-
stage.classList.toggle("hint", notes.length === 0 && !draft);
|
|
1489
|
-
pins.replaceChildren();
|
|
1490
|
-
if (playing) return;
|
|
1491
|
-
var here = notes.filter(function (n) { return n.frame === frame; });
|
|
1492
|
-
if (draft && draft.frame === frame) here.push(draft);
|
|
1493
|
-
here.forEach(function (n) {
|
|
1494
|
-
if (n.w != null) {
|
|
1495
|
-
var a = el("div", "area" + (n.done ? " done" : ""));
|
|
1496
|
-
a.style.left = n.x * 100 + "%"; a.style.top = n.y * 100 + "%";
|
|
1497
|
-
a.style.width = n.w * 100 + "%"; a.style.height = n.h * 100 + "%";
|
|
1498
|
-
pins.append(a);
|
|
1499
|
-
}
|
|
1500
|
-
var pin = el("button", "pin" + (n.done ? " done" : "") + (n === draft ? " draft" : "") + (n.id === openId ? " active" : ""));
|
|
1501
|
-
pin.style.left = n.x * 100 + "%"; pin.style.top = n.y * 100 + "%";
|
|
1502
|
-
if (n === draft) { pin.setAttribute("aria-label", "New note"); }
|
|
1503
|
-
else {
|
|
1504
|
-
if (n.done) pin.innerHTML = ICON_CHECK; else pin.textContent = String(n.id);
|
|
1505
|
-
pin.title = n.text;
|
|
1506
|
-
pin.setAttribute("aria-label", "Note " + n.id);
|
|
1507
|
-
pin.addEventListener("click", function (e) { e.stopPropagation(); openCard(n.id); });
|
|
1508
|
-
}
|
|
1509
|
-
pins.append(pin);
|
|
1510
|
-
});
|
|
1511
|
-
}
|
|
1512
|
-
function renderMarks() {
|
|
1513
|
-
var marks = $("noteMarks");
|
|
1514
|
-
marks.replaceChildren();
|
|
1515
|
-
if (!meta) return;
|
|
1516
|
-
// Notes close together stack, up to three high.
|
|
1517
|
-
var width = tlInner.clientWidth || 800, lanes = [];
|
|
1518
|
-
notes.slice().sort(function (a, b) { return a.frame - b.frame || a.id - b.id; }).forEach(function (n) {
|
|
1519
|
-
var x = (pct(n.frame) / 100) * width, lane = lanes.findIndex(function (end) { return x - end >= 16; });
|
|
1520
|
-
if (lane < 0) lane = lanes.length < 3 ? lanes.length : 2;
|
|
1521
|
-
lanes[lane] = x;
|
|
1522
|
-
var m = el("button", "note-mark" + (n.done ? " done" : "") + (lane ? " stacked" : ""), String(n.id));
|
|
1523
|
-
m.style.left = pct(n.frame) + "%";
|
|
1524
|
-
m.style.top = 4 + lane * 15 + "px";
|
|
1525
|
-
m.title = n.id + " \xB7 " + fmt(n.frame) + " \xB7 " + n.text;
|
|
1526
|
-
m.addEventListener("pointerdown", function (e) { e.stopPropagation(); });
|
|
1527
|
-
m.addEventListener("click", function (e) { e.stopPropagation(); goToNote(n.id); });
|
|
1528
|
-
marks.append(m);
|
|
1529
|
-
});
|
|
1530
|
-
}
|
|
1531
|
-
function renderList() {
|
|
1532
|
-
var list = $("notesList");
|
|
1533
|
-
list.replaceChildren();
|
|
1534
|
-
$("notesCopy").disabled = openCount() === 0;
|
|
1535
|
-
if (!notes.length) {
|
|
1536
|
-
list.append(el("div", "np-empty", "Pause and click the picture to pin a note to that spot and moment. Drag to mark an area."));
|
|
1537
|
-
}
|
|
1538
|
-
notes.slice().sort(function (a, b) { return a.frame - b.frame || a.id - b.id; }).forEach(function (n) {
|
|
1539
|
-
var row = el("div", "note-row" + (n.done ? " done" : ""));
|
|
1540
|
-
var body = el("div");
|
|
1541
|
-
body.append(el("div", "when tnum", fmt(n.frame) + " \xB7 frame " + n.frame), el("div", "text", n.text));
|
|
1542
|
-
var check = el("button", "check" + (n.done ? " on" : ""));
|
|
1543
|
-
check.innerHTML = ICON_CHECK;
|
|
1544
|
-
check.title = n.done ? "Reopen" : "Mark done";
|
|
1545
|
-
check.setAttribute("aria-label", check.title);
|
|
1546
|
-
check.addEventListener("click", function (e) { e.stopPropagation(); setDone(n.id, !n.done); });
|
|
1547
|
-
row.append(el("span", "badge" + (n.done ? " done" : ""), String(n.id)), body, check);
|
|
1548
|
-
row.addEventListener("click", function () { goToNote(n.id); });
|
|
1549
|
-
list.append(row);
|
|
1550
|
-
});
|
|
1551
|
-
var dir = meta && meta.notesDir ? meta.notesDir.split("/").slice(-2).join("/") : "";
|
|
1552
|
-
$("notesFoot").textContent = "Saved in " + dir + " with a picture of each spot. Ask your agent to go through them.";
|
|
1553
|
-
}
|
|
1554
|
-
|
|
1555
|
-
function notesRequest(body) {
|
|
1556
|
-
return fetch("/@framefields/notes", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body) })
|
|
1557
|
-
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); });
|
|
1558
|
-
}
|
|
1559
|
-
function upsert(note) {
|
|
1560
|
-
var i = notes.findIndex(function (n) { return n.id === note.id; });
|
|
1561
|
-
if (i >= 0) notes[i] = note; else notes.push(note);
|
|
1562
|
-
renderNotes();
|
|
1563
|
-
}
|
|
1564
|
-
function setDone(id, done) {
|
|
1565
|
-
notesRequest({ op: "update", id: id, done: done }).then(function (n) {
|
|
1566
|
-
upsert(n);
|
|
1567
|
-
if (openId === id) openCard(id);
|
|
1568
|
-
}, function () { toast("Couldn't save. Is the preview running?"); });
|
|
1569
|
-
}
|
|
1570
|
-
function removeNote(id) {
|
|
1571
|
-
notesRequest({ op: "remove", id: id }).then(function () {
|
|
1572
|
-
notes = notes.filter(function (n) { return n.id !== id; });
|
|
1573
|
-
closePop();
|
|
1574
|
-
renderNotes();
|
|
1575
|
-
}, function () { toast("Couldn't delete. Is the preview running?"); });
|
|
1576
|
-
}
|
|
1577
|
-
function goToNote(id) {
|
|
1578
|
-
var n = noteById(id);
|
|
1579
|
-
if (!n) return;
|
|
1580
|
-
$("notesPanel").classList.remove("on");
|
|
1581
|
-
$("notesBtn").setAttribute("aria-expanded", "false");
|
|
1582
|
-
seek(n.frame).then(function () { openCard(id); });
|
|
1583
|
-
}
|
|
1584
|
-
|
|
1585
|
-
var toastTimer = null;
|
|
1586
|
-
function toast(text) {
|
|
1587
|
-
var t = $("toast");
|
|
1588
|
-
t.textContent = text;
|
|
1589
|
-
t.classList.add("on");
|
|
1590
|
-
clearTimeout(toastTimer);
|
|
1591
|
-
toastTimer = setTimeout(function () { t.classList.remove("on"); }, 2200);
|
|
1592
|
-
}
|
|
1593
|
-
|
|
1594
|
-
// \u2500\u2500 Placing a note on the picture \u2500\u2500
|
|
1595
|
-
function fracAt(e) {
|
|
1596
|
-
var r = stage.getBoundingClientRect();
|
|
1597
|
-
return { x: Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)), y: Math.min(1, Math.max(0, (e.clientY - r.top) / r.height)), r: r };
|
|
1598
|
-
}
|
|
1599
|
-
stage.addEventListener("pointerdown", function (e) {
|
|
1600
|
-
if (e.button !== 0 || !player || e.target.closest(".pin")) return;
|
|
1601
|
-
if (playing) { pause(); return; }
|
|
1602
|
-
if (!notesOn) return;
|
|
1603
|
-
if (draft && pop.querySelector("textarea") && pop.querySelector("textarea").value.trim()) {
|
|
1604
|
-
pop.querySelector("textarea").focus();
|
|
1605
|
-
return;
|
|
1606
|
-
}
|
|
1607
|
-
cancelDraft();
|
|
1608
|
-
var p = fracAt(e);
|
|
1609
|
-
press = { x: p.x, y: p.y, cx: e.clientX, cy: e.clientY, area: null };
|
|
1610
|
-
stage.setPointerCapture(e.pointerId);
|
|
1611
|
-
e.preventDefault();
|
|
1612
|
-
});
|
|
1613
|
-
stage.addEventListener("pointermove", function (e) {
|
|
1614
|
-
if (!press) return;
|
|
1615
|
-
var p = fracAt(e);
|
|
1616
|
-
if (!press.area && Math.hypot(e.clientX - press.cx, e.clientY - press.cy) < 6) return;
|
|
1617
|
-
press.area = { x: Math.min(press.x, p.x), y: Math.min(press.y, p.y), w: Math.abs(p.x - press.x), h: Math.abs(p.y - press.y) };
|
|
1618
|
-
var m = $("marquee");
|
|
1619
|
-
m.style.display = "block";
|
|
1620
|
-
m.style.left = press.area.x * 100 + "%"; m.style.top = press.area.y * 100 + "%";
|
|
1621
|
-
m.style.width = press.area.w * 100 + "%"; m.style.height = press.area.h * 100 + "%";
|
|
1622
|
-
});
|
|
1623
|
-
function endPress() {
|
|
1624
|
-
if (!press) return;
|
|
1625
|
-
var a = press.area;
|
|
1626
|
-
$("marquee").style.display = "none";
|
|
1627
|
-
draft = a && a.w > 0.01 && a.h > 0.01
|
|
1628
|
-
? { frame: frame, x: a.x, y: a.y, w: a.w, h: a.h, text: "" }
|
|
1629
|
-
: { frame: frame, x: press.x, y: press.y, text: "" };
|
|
1630
|
-
press = null;
|
|
1631
|
-
openComposer();
|
|
1632
|
-
}
|
|
1633
|
-
stage.addEventListener("pointerup", endPress);
|
|
1634
|
-
stage.addEventListener("pointercancel", function () { press = null; $("marquee").style.display = "none"; });
|
|
1635
|
-
|
|
1636
|
-
// \u2500\u2500 The popover: writing a note, or reading one \u2500\u2500
|
|
1637
|
-
var popAnchor = null;
|
|
1638
|
-
function placePop() {
|
|
1639
|
-
if (!popAnchor || !pop.classList.contains("on")) return;
|
|
1640
|
-
var r = stage.getBoundingClientRect(), n = popAnchor;
|
|
1641
|
-
var ax = r.left + (n.x + (n.w || 0)) * r.width, ay = r.top + (n.y + (n.h || 0)) * r.height;
|
|
1642
|
-
var w = pop.offsetWidth, h = pop.offsetHeight, gap = 16;
|
|
1643
|
-
var left = ax + gap + w <= innerWidth - 8 ? ax + gap : ax - gap - w - (n.w || 0) * r.width;
|
|
1644
|
-
var top = ay + gap + h <= innerHeight - 8 ? ay + gap / 2 : ay - h - gap / 2 - (n.h || 0) * r.height;
|
|
1645
|
-
pop.style.left = Math.max(8, Math.min(innerWidth - w - 8, left)) + "px";
|
|
1646
|
-
pop.style.top = Math.max(8, Math.min(innerHeight - h - 8, top)) + "px";
|
|
1647
|
-
}
|
|
1648
|
-
function showPop(anchor) {
|
|
1649
|
-
popAnchor = anchor;
|
|
1650
|
-
pop.classList.add("on");
|
|
1651
|
-
placePop();
|
|
1652
|
-
}
|
|
1653
|
-
function closePop() {
|
|
1654
|
-
pop.classList.remove("on");
|
|
1655
|
-
pop.replaceChildren();
|
|
1656
|
-
popAnchor = null;
|
|
1657
|
-
openId = null;
|
|
1658
|
-
renderPins();
|
|
1659
|
-
}
|
|
1660
|
-
function cancelDraft() {
|
|
1661
|
-
if (!draft) return;
|
|
1662
|
-
draft = null;
|
|
1663
|
-
closePop();
|
|
1664
|
-
}
|
|
1665
|
-
function openComposer() {
|
|
1666
|
-
openId = null;
|
|
1667
|
-
var head = el("div", "pop-head");
|
|
1668
|
-
head.append(el("span", "badge", "+"), el("span", "tnum", fmt(draft.frame) + " \xB7 " + (draft.w != null ? "area" : "spot")));
|
|
1669
|
-
var ta = document.createElement("textarea");
|
|
1670
|
-
ta.placeholder = "What should change here?";
|
|
1671
|
-
ta.rows = 2;
|
|
1672
|
-
ta.setAttribute("aria-label", "Note");
|
|
1673
|
-
var foot = el("div", "pop-foot"), status = el("span", "grow", "Enter to add");
|
|
1674
|
-
var cancel = el("button", "btn", "Cancel"), add = el("button", "btn primary", "Add note");
|
|
1675
|
-
add.disabled = true;
|
|
1676
|
-
foot.append(status, cancel, add);
|
|
1677
|
-
pop.replaceChildren(head, ta, foot);
|
|
1678
|
-
ta.addEventListener("input", function () {
|
|
1679
|
-
draft.text = ta.value;
|
|
1680
|
-
add.disabled = !ta.value.trim() || saving;
|
|
1681
|
-
ta.style.height = "auto";
|
|
1682
|
-
ta.style.height = Math.min(180, ta.scrollHeight) + "px";
|
|
1683
|
-
placePop();
|
|
1684
|
-
});
|
|
1685
|
-
ta.addEventListener("keydown", function (e) {
|
|
1686
|
-
if (e.key === "Enter" && !e.shiftKey && !e.isComposing) { e.preventDefault(); saveDraft(ta, add, status); }
|
|
1687
|
-
if (e.key === "Escape") { e.preventDefault(); cancelDraft(); }
|
|
1688
|
-
});
|
|
1689
|
-
cancel.addEventListener("click", cancelDraft);
|
|
1690
|
-
add.addEventListener("click", function () { saveDraft(ta, add, status); });
|
|
1691
|
-
renderPins();
|
|
1692
|
-
showPop(draft);
|
|
1693
|
-
ta.focus();
|
|
1694
|
-
}
|
|
1695
|
-
async function saveDraft(ta, add, status) {
|
|
1696
|
-
var d = draft, text = ta.value.trim();
|
|
1697
|
-
if (!d || !text || saving) return;
|
|
1698
|
-
saving = true;
|
|
1699
|
-
ta.readOnly = true;
|
|
1700
|
-
add.disabled = true;
|
|
1701
|
-
status.className = "grow";
|
|
1702
|
-
status.textContent = "Saving\u2026";
|
|
1703
|
-
try {
|
|
1704
|
-
var image = null;
|
|
1705
|
-
try { image = await capture(d); } catch (err) { report("warning", ["[framefields] no picture for the note:", err]); }
|
|
1706
|
-
var note = await notesRequest({ op: "add", note: { frame: d.frame, time: d.frame / meta.fps, x: d.x, y: d.y, w: d.w, h: d.h, text: text, image: image } });
|
|
1707
|
-
if (draft === d) draft = null;
|
|
1708
|
-
closePop();
|
|
1709
|
-
upsert(note);
|
|
1710
|
-
toast("Note " + note.id + " saved");
|
|
1711
|
-
} catch (err) {
|
|
1712
|
-
status.className = "grow err";
|
|
1713
|
-
status.textContent = "Couldn't save. Is the preview running?";
|
|
1714
|
-
ta.readOnly = false;
|
|
1715
|
-
add.disabled = false;
|
|
1716
|
-
} finally {
|
|
1717
|
-
saving = false;
|
|
1718
|
-
}
|
|
1719
|
-
}
|
|
1720
|
-
// The frame with the spot marked, small enough to read at a glance.
|
|
1721
|
-
async function capture(d) {
|
|
1722
|
-
var bmp = await player.snapshot(d.frame);
|
|
1723
|
-
var scale = Math.min(1, 1600 / bmp.width), w = Math.round(bmp.width * scale), h = Math.round(bmp.height * scale);
|
|
1724
|
-
var c = document.createElement("canvas");
|
|
1725
|
-
c.width = w; c.height = h;
|
|
1726
|
-
var g = c.getContext("2d");
|
|
1727
|
-
g.drawImage(bmp, 0, 0, w, h);
|
|
1728
|
-
bmp.close();
|
|
1729
|
-
var lw = Math.max(3, w / 400);
|
|
1730
|
-
function mark(draw) {
|
|
1731
|
-
// Dark, white, then blue: it reads on any picture.
|
|
1732
|
-
g.lineWidth = lw + 5; g.strokeStyle = "rgba(0,0,0,0.5)"; draw();
|
|
1733
|
-
g.lineWidth = lw + 2.5; g.strokeStyle = "#fff"; draw();
|
|
1734
|
-
g.lineWidth = lw; g.strokeStyle = "#3b82f6"; draw();
|
|
1735
|
-
}
|
|
1736
|
-
if (d.w != null) {
|
|
1737
|
-
mark(function () { g.strokeRect(d.x * w, d.y * h, d.w * w, d.h * h); });
|
|
1738
|
-
} else {
|
|
1739
|
-
var rad = Math.max(16, w / 40);
|
|
1740
|
-
mark(function () { g.beginPath(); g.arc(d.x * w, d.y * h, rad, 0, Math.PI * 2); g.stroke(); });
|
|
1741
|
-
g.fillStyle = "#3b82f6";
|
|
1742
|
-
g.beginPath(); g.arc(d.x * w, d.y * h, lw, 0, Math.PI * 2); g.fill();
|
|
1743
|
-
}
|
|
1744
|
-
return c.toDataURL("image/jpeg", 0.88);
|
|
1745
|
-
}
|
|
1746
|
-
function openCard(id) {
|
|
1747
|
-
var n = noteById(id);
|
|
1748
|
-
if (!n) return;
|
|
1749
|
-
if (draft) cancelDraft();
|
|
1750
|
-
openId = id;
|
|
1751
|
-
var head = el("div", "pop-head");
|
|
1752
|
-
var close = el("button", "btn x-btn");
|
|
1753
|
-
close.innerHTML = ICON_X;
|
|
1754
|
-
close.title = "Close";
|
|
1755
|
-
close.setAttribute("aria-label", "Close");
|
|
1756
|
-
close.addEventListener("click", closePop);
|
|
1757
|
-
head.append(el("span", "badge" + (n.done ? " done" : ""), String(n.id)), el("span", "tnum grow", fmt(n.frame) + " \xB7 frame " + n.frame), close);
|
|
1758
|
-
var foot = el("div", "pop-foot");
|
|
1759
|
-
var done = el("button", "btn");
|
|
1760
|
-
done.innerHTML = ICON_CHECK;
|
|
1761
|
-
done.append(document.createTextNode(n.done ? "Reopen" : "Mark done"));
|
|
1762
|
-
done.addEventListener("click", function () { setDone(n.id, !n.done); });
|
|
1763
|
-
var del = el("button", "btn danger", "Delete");
|
|
1764
|
-
del.addEventListener("click", function () { removeNote(n.id); });
|
|
1765
|
-
foot.append(done, el("span", "grow"), del);
|
|
1766
|
-
pop.replaceChildren(head, el("div", "pop-text", n.text), foot);
|
|
1767
|
-
renderPins();
|
|
1768
|
-
showPop(n);
|
|
1769
|
-
}
|
|
1770
|
-
|
|
1771
|
-
document.addEventListener("pointerdown", function (e) {
|
|
1772
|
-
if (pop.classList.contains("on") && !pop.contains(e.target) && !stage.contains(e.target) && !e.target.closest(".note-mark, .note-row")) {
|
|
1773
|
-
if (openId != null) closePop();
|
|
1774
|
-
else if (draft && !draft.text.trim()) cancelDraft();
|
|
1775
|
-
}
|
|
1776
|
-
var panel = $("notesPanel");
|
|
1777
|
-
if (panel.classList.contains("on") && !panel.contains(e.target) && !$("notesBtn").contains(e.target)) {
|
|
1778
|
-
panel.classList.remove("on");
|
|
1779
|
-
$("notesBtn").setAttribute("aria-expanded", "false");
|
|
1780
|
-
}
|
|
1781
|
-
});
|
|
1782
|
-
document.addEventListener("keydown", function (e) {
|
|
1783
|
-
if (e.key !== "Escape") return;
|
|
1784
|
-
if (openId != null) closePop();
|
|
1785
|
-
$("notesPanel").classList.remove("on");
|
|
1786
|
-
$("notesBtn").setAttribute("aria-expanded", "false");
|
|
1787
|
-
});
|
|
1788
|
-
window.addEventListener("resize", placePop);
|
|
1789
|
-
new ResizeObserver(placePop).observe(stage);
|
|
1790
|
-
|
|
1791
|
-
$("notesBtn").addEventListener("click", function () {
|
|
1792
|
-
var on = $("notesPanel").classList.toggle("on");
|
|
1793
|
-
$("notesBtn").setAttribute("aria-expanded", String(on));
|
|
1794
|
-
});
|
|
1795
|
-
$("notesClose").addEventListener("click", function () {
|
|
1796
|
-
$("notesPanel").classList.remove("on");
|
|
1797
|
-
$("notesBtn").setAttribute("aria-expanded", "false");
|
|
1798
|
-
});
|
|
1799
|
-
// The open notes as text, for a chat that can't read the notes folder.
|
|
1800
|
-
$("notesCopy").addEventListener("click", function () {
|
|
1801
|
-
var lines = ["Notes on the preview of " + JSON.stringify(meta.title) + ":"];
|
|
1802
|
-
notes.filter(function (n) { return !n.done; }).sort(function (a, b) { return a.frame - b.frame; }).forEach(function (n) {
|
|
1803
|
-
lines.push("- Note " + n.id + " at " + fmt(n.frame) + " (frame " + n.frame + "), " + whereText(n) + ": " + n.text + (n.image ? " [picture: " + n.image + "]" : ""));
|
|
1804
|
-
});
|
|
1805
|
-
var text = lines.join(NL), label = $("notesCopyLabel");
|
|
1806
|
-
var done = function () { label.textContent = "Copied"; setTimeout(function () { label.textContent = "Copy"; }, 1600); };
|
|
1807
|
-
(navigator.clipboard ? navigator.clipboard.writeText(text) : Promise.reject()).then(done, function () {
|
|
1808
|
-
var t = document.createElement("textarea");
|
|
1809
|
-
t.value = text;
|
|
1810
|
-
document.body.append(t);
|
|
1811
|
-
t.select();
|
|
1812
|
-
try { document.execCommand("copy"); done(); } catch (e) {}
|
|
1813
|
-
t.remove();
|
|
1814
|
-
});
|
|
1815
|
-
});
|
|
1816
|
-
|
|
1817
|
-
function loadNotes() {
|
|
1818
|
-
if (!notesOn) return;
|
|
1819
|
-
fetch("/@framefields/notes").then(function (r) { return r.json(); }).then(function (list) {
|
|
1820
|
-
notes = Array.isArray(list) ? list : [];
|
|
1821
|
-
renderNotes();
|
|
1822
|
-
}, function () {});
|
|
1823
|
-
}
|
|
1824
|
-
|
|
1825
|
-
// \u2500\u2500 Wiring \u2500\u2500
|
|
1826
|
-
$("play").addEventListener("click", togglePlay);
|
|
1827
|
-
$("prev").addEventListener("click", function () { seek(frame - 1); });
|
|
1828
|
-
$("next").addEventListener("click", function () { seek(frame + 1); });
|
|
1829
|
-
$("mute").addEventListener("click", function () { audio.muted = !audio.muted; applyVolume(); });
|
|
1830
|
-
$("volume").addEventListener("input", function (e) { audio.volume = Number(e.target.value); audio.muted = audio.volume === 0; applyVolume(); });
|
|
1831
|
-
|
|
1832
|
-
// A hidden tab's timers are throttled, so playback would stutter: pause.
|
|
1833
|
-
document.addEventListener("visibilitychange", function () {
|
|
1834
|
-
if (document.hidden && playing) pause();
|
|
1835
|
-
});
|
|
1836
|
-
|
|
1837
|
-
// \u2500\u2500 For scripts and agents driving the page: seek, play, and read the
|
|
1838
|
-
// state instead of clicking at coordinates \u2500\u2500
|
|
1839
|
-
var pageState = "loading";
|
|
1840
|
-
window.framefieldsPreview = {
|
|
1841
|
-
/** Shows the frame at a time in seconds; resolves once it is drawn. */
|
|
1842
|
-
seek: function (sec) { return ready().then(function () { return seek(Number(sec) * meta.fps); }); },
|
|
1843
|
-
/** Shows a frame by number; resolves once it is drawn. */
|
|
1844
|
-
seekFrame: function (f) { return ready().then(function () { return seek(f); }); },
|
|
1845
|
-
play: function () { return ready().then(play); },
|
|
1846
|
-
/** Notes pinned on the page, as saved in notes.json. */
|
|
1847
|
-
notes: function () { return notes.slice(); },
|
|
1848
|
-
pause: function () { if (playing) pause(); },
|
|
1849
|
-
/** Where the preview is: loading, ready or error, and what it shows. */
|
|
1850
|
-
state: function () {
|
|
1851
|
-
var rate = meter.read().fps;
|
|
1852
|
-
return {
|
|
1853
|
-
state: pageState,
|
|
1854
|
-
error: pageState === "error" ? $("stageMsg").textContent : null,
|
|
1855
|
-
frame: frame,
|
|
1856
|
-
time: meta ? Number((frame / meta.fps).toFixed(3)) : 0,
|
|
1857
|
-
playing: playing,
|
|
1858
|
-
buffering: stalled,
|
|
1859
|
-
audio: audio.state,
|
|
1860
|
-
connected: !offline,
|
|
1861
|
-
// Frames shown per second over the last 2 s of playback (the last
|
|
1862
|
-
// playback's while paused), and how long the last frame took to draw.
|
|
1863
|
-
playbackFps: rate == null ? null : Number(rate.toFixed(1)),
|
|
1864
|
-
renderMs: player ? Math.round(player.lastRenderMs) : null,
|
|
1865
|
-
meta: meta && { title: meta.title, width: meta.width, height: meta.height, fps: meta.fps, frameCount: meta.frameCount, duration: Number((last() / meta.fps).toFixed(3)) }
|
|
1866
|
-
};
|
|
1867
|
-
}
|
|
1868
|
-
};
|
|
1869
|
-
var readyWaiters = [];
|
|
1870
|
-
function ready() {
|
|
1871
|
-
if (player) return Promise.resolve();
|
|
1872
|
-
if (pageState === "error") return Promise.reject(new Error($("stageMsg").textContent));
|
|
1873
|
-
return new Promise(function (resolve, reject) { readyWaiters.push([resolve, reject]); });
|
|
1874
|
-
}
|
|
1875
|
-
function settleReady(err) {
|
|
1876
|
-
readyWaiters.splice(0).forEach(function (w) { err ? w[1](err) : w[0](); });
|
|
1877
|
-
}
|
|
1878
|
-
|
|
1879
|
-
function applyMeta(m) {
|
|
1880
|
-
meta = m;
|
|
1881
|
-
document.title = m.title + " \xB7 preview";
|
|
1882
|
-
$("title").textContent = m.title;
|
|
1883
|
-
$("spec").textContent = m.width + "\xD7" + m.height + " \xB7 " + m.fps + " fps \xB7 " + fmt(last());
|
|
1884
|
-
$("tcDur").textContent = fmt(last());
|
|
1885
|
-
stage.style.setProperty("--ar", m.width + " / " + m.height);
|
|
1886
|
-
stage.style.setProperty("--ar-n", String(m.width / m.height));
|
|
1887
|
-
renderRuler();
|
|
1888
|
-
}
|
|
1889
|
-
|
|
1890
|
-
new ResizeObserver(function () {
|
|
1891
|
-
if (!meta) return;
|
|
1892
|
-
renderRuler();
|
|
1893
|
-
drawWave();
|
|
1894
|
-
renderMarks();
|
|
1895
|
-
}).observe(tlInner);
|
|
1896
|
-
|
|
1897
|
-
// When the preview command ends the event stream drops and the browser keeps
|
|
1898
|
-
// retrying. The next preview of this project (same port) says hello with a
|
|
1899
|
-
// new session, and this tab reloads into it.
|
|
1900
|
-
var events = new EventSource("/events");
|
|
1901
|
-
events.addEventListener("hello", function (e) {
|
|
1902
|
-
var s = JSON.parse(e.data).session;
|
|
1903
|
-
if (session && s !== session) { location.reload(); return; }
|
|
1904
|
-
offline = false;
|
|
1905
|
-
renderChip();
|
|
1906
|
-
});
|
|
1907
|
-
events.addEventListener("error", function () {
|
|
1908
|
-
if (!meta) return;
|
|
1909
|
-
if (playing) { stop(); keepPosition(); }
|
|
1910
|
-
offline = true;
|
|
1911
|
-
renderChip();
|
|
1912
|
-
});
|
|
1913
|
-
events.addEventListener("notes", function (e) {
|
|
1914
|
-
notes = JSON.parse(e.data);
|
|
1915
|
-
if (openId != null && !noteById(openId)) closePop();
|
|
1916
|
-
renderNotes();
|
|
1917
|
-
});
|
|
1918
|
-
events.addEventListener("audio", function (e) {
|
|
1919
|
-
if (meta) loadAudio(JSON.parse(e.data));
|
|
1920
|
-
});
|
|
1921
|
-
|
|
1922
|
-
fetch("/meta").then(function (r) { return r.json(); }).then(function (m) {
|
|
1923
|
-
session = m.session;
|
|
1924
|
-
applyMeta(m);
|
|
1925
|
-
notesOn = !!m.notesDir;
|
|
1926
|
-
$("notesBtn").hidden = !notesOn;
|
|
1927
|
-
loadNotes();
|
|
1928
|
-
loadAudio(m.audio);
|
|
1929
|
-
setTime(startFrame());
|
|
1930
|
-
$("buffering").classList.add("on");
|
|
1931
|
-
whenPlayer();
|
|
1932
|
-
});
|
|
1933
|
-
|
|
1934
|
-
// The composition's bundle (loaded below) announces its player.
|
|
1935
|
-
function whenPlayer() {
|
|
1936
|
-
if (!window.framefieldsPlayer) return;
|
|
1937
|
-
window.framefieldsPlayer.then(function (p) {
|
|
1938
|
-
player = p;
|
|
1939
|
-
$("play").disabled = false;
|
|
1940
|
-
show(frame).then(function () {
|
|
1941
|
-
pageState = "ready";
|
|
1942
|
-
renderPins();
|
|
1943
|
-
document.documentElement.dataset.preview = "ready";
|
|
1944
|
-
settleReady();
|
|
1945
|
-
scheduleWarm();
|
|
1946
|
-
});
|
|
1947
|
-
}, function (err) {
|
|
1948
|
-
showError(err);
|
|
1949
|
-
document.documentElement.dataset.preview = "error";
|
|
1950
|
-
settleReady(err instanceof Error ? err : new Error(String(err)));
|
|
1951
|
-
});
|
|
1952
|
-
}
|
|
1953
|
-
window.addEventListener("framefields:player", function () { if (meta) whenPlayer(); });
|
|
1954
|
-
window.addEventListener("error", function (e) {
|
|
1955
|
-
if (!player) showError(e.error || e.message);
|
|
1956
|
-
else report("error", [e.error || e.message]);
|
|
1957
|
-
});
|
|
1958
|
-
window.addEventListener("unhandledrejection", function (e) { report("error", [e.reason]); });
|
|
1959
|
-
})();
|
|
1960
|
-
<\/script>
|
|
1961
|
-
<script type="module" src="/@framefields/player.js"><\/script>
|
|
1962
|
-
</body>
|
|
1963
|
-
</html>
|
|
1964
|
-
`;var Ub=1200,xd="x-framefields-preview",Gb="/@framefields/player.js";async function Wb(t,e={}){let r=t.entry instanceof URL||String(t.entry).startsWith("file:")?An(t.entry):G.resolve(String(t.entry)),n=t.export??"default",i=cd(),o=md(G.dirname(r)),a=[...e.root===void 0?[Yb(G.dirname(r))]:Array.isArray(e.root)?e.root:[e.root],i,o.dir].filter(E=>!!E).map(E=>G.resolve(E)),s=new Set,u=e.idleCloseMs??5e3,c,d=e.title??"framefields preview",m=(0,ji.randomUUID)(),p=e.log===!1?()=>{}:e.log??(E=>console.error(E)),f=E=>p(`[framefields preview] ${E}`),b=new Set,g=!1,y=e.notesDir===!1?void 0:new zi(G.resolve(e.notesDir??G.join(x.cwd(),".framefields","preview-notes"))),k=Promise.resolve(),S=await Hb(r,n),M=await Kb(S,d,m,y?.dir??null),w,A=()=>{if(!w){let E=ud({entry:r,exportName:n,modelsDir:i,ortBase:o.base}).then(j=>j.code);w=E,E.catch(j=>{f(`could not build ${G.relative(x.cwd(),r)}:
|
|
1965
|
-
${qb(j)}`),w===E&&(w=void 0)})}return w},v=ld();v.catch(()=>{});let N={state:e.audio===!1?"none":"mixing"},C;function O(E,j){for(let H of s)H.write(`event: ${E}
|
|
1966
|
-
data: ${JSON.stringify(j)}
|
|
1967
|
-
|
|
1968
|
-
`)}function $(E){N=E,O("audio",N)}function z(){if(N.state!=="mixing")return;if(!S.toVirtualMediaAsync&&!S.toVirtualMedia){$({state:"none"});return}let E=e.renderer??new ve.HeadlessMediaRenderer;(async()=>{let j=S.toVirtualMediaAsync?await S.toVirtualMediaAsync():S.toVirtualMedia();return await S.prepareMediaTime?.(),E.renderAudio(j,{fps:M.fps})})().then(({channels:j,sampleRate:H})=>{let Q=j[0]??new Float32Array(0),X=j[1]??Q,te=ey(Q,X,Ub);if(Q.length===0||Math.max(...te)<.001){$({state:"none"});return}C=no([Q,X],{sampleRate:H}),$({state:"ready",durationSec:Q.length/H,peaks:te.map(F=>Math.round(F*1e3)/1e3)})},j=>{$({state:"error",error:j instanceof Error?j.message:String(j)})})}let L,P=new Promise(E=>{L=E}),T;function W(E="closed"){return T??=new Promise(j=>{clearTimeout(c),E==="idle"&&f("stopped: its tab was closed"),E==="replaced"&&f("stopped: a newer preview took over");for(let H of s)H.end();s.clear(),Y.close(()=>{j(),L(E)}),Y.closeAllConnections()}),T}let Y=Ss.default.createServer(async(E,j)=>{let H=new URL(E.url??"/","http://localhost");j.setHeader("cross-origin-opener-policy","same-origin"),j.setHeader("cross-origin-embedder-policy","credentialless");try{if(E.method==="GET"&&H.pathname==="/"){j.writeHead(200,{"content-type":"text/html; charset=utf-8","cache-control":"no-store"}),j.end(gd);return}if(E.method==="GET"&&H.pathname==="/meta"){ut(j,200,{...M,audio:N});return}if(E.method==="GET"&&H.pathname.startsWith(`${bn}/`)){let X=await v,te=G.resolve(X,`.${H.pathname.slice(bn.length)}`);if(xs(X,te)&&await ws(te)){await vs(E,j,te);return}ut(j,404,{error:"not found"});return}if(E.method==="GET"&&H.pathname===Gb){let X;try{await v,X=await A()}catch(te){let F=te instanceof Error?te.message:String(te);X=`throw new Error(${JSON.stringify(`Could not build the preview:
|
|
1969
|
-
${F}`)});`}j.writeHead(200,{"content-type":"text/javascript; charset=utf-8","cache-control":"no-store"}),j.end(X);return}if(E.method==="GET"&&H.pathname==="/@framefields/stat"){let X=G.resolve(H.searchParams.get("path")??""),te=-1;a.some(F=>xs(F,X))&&(te=await be.promises.stat(X).then(F=>F.isFile()?F.size:-1,()=>-1)),ut(j,200,{exists:te>=0,size:Math.max(0,te)});return}if(E.method==="GET"&&H.pathname==="/events"){j.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-store",connection:"keep-alive"}),j.write(`retry: 1000
|
|
1970
|
-
`),j.write(`event: hello
|
|
1971
|
-
data: ${JSON.stringify({session:M.session})}
|
|
1972
|
-
|
|
1973
|
-
`),s.add(j),clearTimeout(c),g||(g=!0,f(u===!1?"page opened":`page opened; the server stops ${Number((u/1e3).toFixed(1))} s after its last tab closes`)),_?.(),E.on("close",()=>{s.delete(j),s.size===0&&u!==!1&&!T&&(c=setTimeout(()=>{s.size===0&&W("idle")},u))});return}if(E.method==="POST"&&H.pathname==="/takeover"&&E.headers[xd]==="1"){ut(j,200,{ok:!0}),setImmediate(()=>{W("replaced")});return}if(E.method==="POST"&&H.pathname==="/@framefields/log"&&E.headers["content-type"]==="application/json"){let X=await bd(E,16384),{message:te,level:F}=JSON.parse(X),I=String(te??"").trim();I&&!b.has(I)&&b.size<200&&(b.add(I),f(`${F==="warning"?"warning":"error"} in the page: ${I}`)),j.writeHead(204).end();return}if(y&&H.pathname==="/@framefields/notes"){if(E.method==="GET"){ut(j,200,await y.list());return}if(E.method==="POST"&&E.headers["content-type"]==="application/json"){let X=JSON.parse(await bd(E,16777216)),te=k.then(()=>Xb(y,X,M.fps,f));k=te.catch(()=>{});let F=await te;O("notes",await y.list()),ut(j,F?200:404,F??{error:"no such note"});return}}if(E.method==="GET"&&H.pathname==="/audio"){if(N.state!=="ready"||!C){ut(j,404,{error:`audio is ${N.state}`});return}j.writeHead(200,{"content-type":"audio/wav","content-length":C.length,"cache-control":"no-store"}),j.end(C);return}let Q=/^\/assets\/fonts\/([^/]+)$/.exec(H.pathname);if(Q&&(E.method==="GET"||E.method==="HEAD")){let X=G.join(x.cwd(),"assets","fonts",decodeURIComponent(Q[1]));if(await ws(X)){await vs(E,j,X);return}}if(E.method==="GET"||E.method==="HEAD"){let X=G.resolve(decodeURIComponent(H.pathname.replace(/^\/@fs(?=\/)/,"")));if(a.some(te=>xs(te,X))&&await ws(X)){await vs(E,j,X);return}}ut(j,404,{error:"not found"})}catch(Q){j.headersSent?j.end():ut(j,500,{error:Q instanceof Error?Q.message:String(Q)})}}),_,V=e.host??"127.0.0.1",ee=e.port??Qb(),oe=E=>new Promise((j,H)=>{let Q=te=>{Y.off("listening",X),H(te)},X=()=>{Y.off("error",Q),j()};Y.once("error",Q),Y.once("listening",X),Y.listen(E,V)});try{await oe(ee)}catch(E){if(E.code!=="EADDRINUSE")throw E;if(await Jb(V,ee))await oe(ee).catch(()=>oe(0));else if(e.port===void 0)await oe(0);else throw E}let{port:ge}=Y.address(),ce=`http://${V.includes(":")?`[${V}]`:V}:${ge}/`;if(A().catch(()=>{}),z(),e.open===!0){let E=await new Promise(j=>{let H=setTimeout(()=>j(!1),2e3);_=()=>{clearTimeout(H),j(!0)},s.size>0&&_()});_=void 0,E||ty(ce)}return{url:ce,closed:P,close:()=>W()}}async function Hb(t,e){let n=(await import(Cn(t).href))[e];if(n===void 0)throw new Error(`[framefields] ${t} has no export named "${e}" to preview.`);return typeof n=="function"?await n():n}function Yb(t){let e;for(let r=t;;r=G.dirname(r)){if(be.existsSync(G.join(r,".git")))return r;if(!e&&be.existsSync(G.join(r,"package.json"))&&(e=r),G.dirname(r)===r)return e??t}}async function Xb(t,e,r,n){if(e.op==="add"&&e.note&&String(e.note.text).trim()){let o=await t.add(e.note),a=[o.image&&`frame with the spot marked: ${o.image}`,`all notes: ${t.file}`];return n(`${hd(o,r)}
|
|
1974
|
-
${a.filter(Boolean).join(" \xB7 ")}`),o}let i=Number(e.id);if(e.op==="update"){let o=await t.update(i,e);return o&&typeof e.done=="boolean"&&n(`note ${i} marked ${o.done?"done":"open"}`),o}if(e.op==="remove"){let o=await t.remove(i);return o&&n(`note ${i} deleted`),o}}function qb(t){return t instanceof Error?t.message:String(t)}function bd(t,e){return new Promise((r,n)=>{let i="";t.setEncoding("utf8"),t.on("data",o=>{i+=o,i.length>e&&(n(new Error("request body too large")),t.destroy())}),t.on("end",()=>r(i)),t.on("error",n)})}function xs(t,e){let r=G.relative(t,e);return!!r&&!r.startsWith("..")&&!G.isAbsolute(r)}async function ws(t){try{return(await be.promises.stat(t)).isFile()}catch{return!1}}var Zb={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif",".svg":"image/svg+xml",".mp4":"video/mp4",".mov":"video/quicktime",".webm":"video/webm",".mp3":"audio/mpeg",".wav":"audio/wav",".m4a":"audio/mp4",".ogg":"audio/ogg",".ttf":"font/ttf",".otf":"font/otf",".woff":"font/woff",".woff2":"font/woff2",".json":"application/json",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".wasm":"application/wasm",".onnx":"application/octet-stream",".srt":"text/plain; charset=utf-8",".txt":"text/plain; charset=utf-8"};async function vs(t,e,r){let{size:n}=await be.promises.stat(r),i=Zb[G.extname(r).toLowerCase()]??"application/octet-stream",o=/^bytes=(\d*)-(\d*)$/.exec(t.headers.range??""),a=0,s=n-1;if(o&&(o[1]||o[2])&&(o[1]?(a=Number(o[1]),o[2]&&(s=Math.min(s,Number(o[2])))):a=Math.max(0,n-Number(o[2])),a>s||a>=n)){e.writeHead(416,{"content-range":`bytes */${n}`}),e.end();return}if(e.writeHead(o?206:200,{"content-type":i,"content-length":s-a+1,"accept-ranges":"bytes","cache-control":"no-cache",...o&&{"content-range":`bytes ${a}-${s}/${n}`}}),t.method==="HEAD"){e.end();return}be.createReadStream(r,{start:a,end:s}).pipe(e)}async function Kb(t,e,r,n){let i=t.fps??24,o=t.durationMs??await t.computeDuration?.()??5e3;return{session:r,notesDir:n,title:e,fps:i,frameCount:Math.max(1,Math.round(o/1e3*i)),width:t.width??1920,height:t.height??1080}}function Qb(){return 41e3+(0,ji.createHash)("sha1").update(x.cwd()).digest().readUInt16BE(0)%900}async function Jb(t,e){let r=await new Promise(n=>{let i=Ss.default.request({host:t,port:e,method:"POST",path:"/takeover",agent:!1,headers:{[xd]:"1"},timeout:1500},o=>{o.resume(),n(o.statusCode===200)});i.on("timeout",()=>i.destroy()),i.on("error",()=>n(!1)),i.end()});return r&&await new Promise(n=>setTimeout(n,150)),r}function ey(t,e,r){let n=new Array(r).fill(0);if(t.length===0)return n;let i=t.length/r;for(let o=0;o<r;o++){let a=Math.floor(o*i),s=Math.min(t.length,Math.floor((o+1)*i)),u=0;for(let c=a;c<s;c++){let d=Math.max(Math.abs(t[c]??0),Math.abs(e[c]??0));d>u&&(u=d)}n[o]=Math.min(1,u)}return n}function ut(t,e,r){t.writeHead(e,{"content-type":"application/json","cache-control":"no-store"}),t.end(JSON.stringify(r))}function ty(t){let[e,r]=x.platform==="darwin"?["open",[t]]:x.platform==="win32"?["cmd",["/c","start","",t]]:["xdg-open",[t]];try{(0,yd.spawn)(e,r,{stdio:"ignore",detached:!0}).on("error",()=>{}).unref()}catch{}}function ks(t,e){return t&&(e&&!t.source&&Object.defineProperty(t,"source",{value:e,enumerable:!0,writable:!0,configurable:!0}),typeof t.section!="function"&&Object.defineProperty(t,"section",{value:(r,n)=>{if(typeof r=="object"&&r!==null&&!("kind"in r)&&!("inputHandleId"in r)&&!("src"in r)){let o=r.source??t.source??e;return B.section(o,t,r)}let i=r??t.source??e;return B.section(i,t,n)},enumerable:!1,writable:!0,configurable:!0}),typeof t.blurEffect!="function"&&Object.defineProperty(t,"blurEffect",{value:r=>new Mt({track:t,...r}),enumerable:!1,writable:!0,configurable:!0}),typeof t.isolate!="function"&&Object.defineProperty(t,"isolate",{value:(r,n)=>B.section(r,t,n),enumerable:!1,writable:!0,configurable:!0}),t)}var ny=Nr.attach;Nr.attach=function(t,e,r){let n=ny.call(this,t,e,r);if(n?.objects){let i=t,o=n.objects.get.bind(n.objects);n.objects.get=s=>ks(o(s),i);let a=n.objects.byCategory.bind(n.objects);n.objects.byCategory=(s,u)=>ks(a(s,u),i),n.objects.primary&&ks(n.objects.primary,i)}return n};var wd=class t{virtualMedia;constructor(e,r="Video"){this.virtualMedia=js(e,r)}static video(e,r){let n=new t(e,"Video");return r&&Object.assign(n.virtualMedia.metadata,r),n}static image(e,r){let n=new t(e,"Image");return r&&Object.assign(n.virtualMedia.metadata,r),n}static lottie(e,r){let n=new t(e,"Lottie");return r&&Object.assign(n.virtualMedia.metadata,r),n}static audio(e,r){let n=new t(e,"Audio");return r&&Object.assign(n.virtualMedia.metadata,r),n}apply(e,r={}){let n;e instanceof iy||typeof e=="object"&&e!==null&&"op"in e?n=e.toOperation():n={op:e,...r};let i=$s(this.virtualMedia,{...n,dataType:this.virtualMedia.operation.dataType});return new t(i)}toVirtualMedia(){return this.virtualMedia}async renderFrame(e={}){return(e.renderer??new ve.HeadlessMediaRenderer).renderFrame(this.virtualMedia,e)}get fps(){return this.virtualMedia.metadata?.fps??void 0}get durationMs(){return this.virtualMedia.metadata?.durationMs??void 0}get width(){return this.virtualMedia.metadata?.width??void 0}get height(){return this.virtualMedia.metadata?.height??void 0}async renderFrameGrid(e={}){return pn(this,e)}async renderVideo(e={},r={}){let n=typeof e=="string"?{...r,outputPath:e}:e,o=await(n.renderer??new ve.HeadlessMediaRenderer).renderVideo(this.virtualMedia,n);return kd(o,n.outputPath)}};async function kd(t,e){if(!e)return t;let r=G.resolve(e);return await Dr.mkdir(G.dirname(r),{recursive:!0}),await Dr.copyFile(t.filePath,r),await t.cleanup(),{...t,filePath:r,cleanup:async()=>{}}}var vd=class t{width;height;fps;durationMs;backgroundColor;antialias3d;fonts;children=[];audioTracks=[];signals={};_frameHooks=[];_prepareHooks=[];_clipVision=new Map;_mediaSignals;_visionConfig;_visionBundle;_effects=[];apply(e){return e instanceof dt?(this.withVision(e),this):(this._effects.push(e),this)}withVision(e={}){this._visionBundle??=new eo({width:this.width,height:this.height,fps:this.fps});let r=e instanceof dt?e.config:e;return this._visionConfig={...r,visionBundle:this._visionBundle},this._visionBundle}vision(e,r={}){let n=typeof e=="string"?e:e.src??e.inputHandleId;if(typeof e!="string"){let a=this.toVirtualMedia({resolveMediaSignal:this.mediaSignalResolver(!0)}),s=Nn(a.children).find(u=>u.operation.id===e.id);if(!s)throw new Error("Add the media layer to the composition before calling comp.vision(layer)");r={startFrame:s.operation.startFrame??e.startFrame,trimStartSec:e.trimStartSec,timeRemap:s.operation.timeRemap,durationFrames:e.durationFrames,...r}}let i=`${n}\0${JSON.stringify({...r,timeRemap:Ai(r.timeRemap)})}`,o=this._clipVision.get(i);return o||(o=new mn(n,this.fps,r),this._clipVision.set(i,o)),o}async prepareVision(e){this.linkClipMattes(),await Promise.all([...this._clipVision.values()].map(r=>r.ready(0,e)))}linkClipMattes(){if(this._clipVision.size===0)return;let e,r=n=>{if(!n||typeof n!="object")return;let i=n;if(i.kind==="media"&&i.dataType==="Video"&&typeof i.inputHandleId=="string"&&i.vision instanceof dt&&!(Qi in i.vision)){e??=new Map(Nn(this.toVirtualMedia().children).map(s=>{let u=s.operation;return[u.id,u]}));let o=e.get(i.id),a=this.clipForMatte(i.src??i.inputHandleId,i.vision,{trimStartSec:i.trimStartSec,startFrame:o?.startFrame??i.startFrame,timeRemap:o?.timeRemap});a&&(a.keepSubjects(),Object.defineProperty(i.vision,Qi,{value:a,enumerable:!1,configurable:!0}))}if(Array.isArray(i.children))for(let o of i.children)r(o)};for(let n of this.children)r(n)}clipForMatte(e,r,n){let i=r.mode??"passthrough";if(!(i!=="matte"&&i!=="mask"&&i!=="crop")&&!(r.matteSource==="selfie"||r.keyBackground===!0||r.classes!==void 0||r.enablePose===!0||r.enableMatte===!0||r.visionBundle!==void 0||(r.maskThreshold??.5)!==.5||r.featherRadius!==void 0))for(let o of this._clipVision.values()){let a=o.options;if(o.source===e&&o.startFrame===(n.startFrame??0)&&o.trimStartSec===(n.trimStartSec??0)&&Ai(a.timeRemap)===Ai(n.timeRemap)&&(a.variant??"s")===(r.variant??"s")&&(a.confidence??.3)===(r.confidence??.3))return o}}async analyzeVisionSequence(e,r={}){let n=r.fps??this.fps,i=this.durationMs??await this.computeDuration(),o=r.totalFrames??Math.max(1,Math.round(i/1e3*n)),a=Rr.create({modelsDir:r.modelsDir,baseUrl:r.baseUrl,...r.confidence!==void 0?{confidence:r.confidence}:{},...r.variant!==void 0?{variant:r.variant}:{}}),s=Dn.getVideo(e,!0);async function*u(){for(let c=0;c<o;c++){let d=await s.getFrame(c/n);d?.buffer&&d.width>0&&d.height>0&&(yield{data:d.buffer,width:d.width,height:d.height})}}try{return await Ki(u(),{runner:a,source:e,fps:n,...r.tasks!==void 0?{tasks:r.tasks}:{},...r.categories!==void 0?{categories:r.categories}:{},...r.pathStride!==void 0?{pathStride:r.pathStride}:{},...r.includeMasks!==void 0?{includeMasks:r.includeMasks}:{},...r.iouThreshold!==void 0?{iouThreshold:r.iouThreshold}:{}})}finally{a.close(),s.destroy()}}onRequestFrame(e){return this._frameHooks.push(e),this}onPrepareFrame(e){return this._prepareHooks.push(e),this}notifyFrame(e){let r=this._mediaSignals?.framesBefore(e.frame)??[];return r.length===0?this.runFrame(e):(async()=>{for(let n of r)await this.runFrame(ss(e,n));await this.runFrame(e)})()}runFrame(e){for(let n of this._frameHooks)n(e);let r=this._mediaSignals;if(r?.advance(e.frame),this._clipVision.size===0&&this._prepareHooks.length===0){r?.reach(e.frame);return}return(async()=>{await this.prepareVision(e.frame);for(let n of this._prepareHooks)await n(e);r?.reach(e.frame)})()}async prepareMediaTime(){let e=this.durationMs??await this.computeDuration(),r=Math.round(e/1e3*this.fps)-1;!this._mediaSignals?.pending||r<0||await this.notifyFrame(ss({frame:0,fps:this.fps,time:0,duration:e/1e3,durationMs:e,progress:0,deltaTime:1/this.fps},r))}mediaSignalResolver(e=this.hasFrameHooks(),r=this.durationMs,n=this.signals){return this._mediaSignals??=new Ti(this.fps),this._mediaSignals.resolver({live:e,compositionDurationFrames:Math.round((r??0)/1e3*this.fps),signals:n})}hasFrameHooks(){return this._frameHooks.length>0||this._prepareHooks.length>0||this._clipVision.size>0}constructor(e){this.width=e.width,this.height=e.height,this.fps=e.fps??60,this.durationMs=e.durationMs??(e.durationFrames!==void 0?e.durationFrames/this.fps*1e3:void 0),this.backgroundColor=e.backgroundColor??"#000000",this.antialias3d=e.antialias3d,this.fonts=e.fonts??[],this.signals=e.signals??{}}static create(e){return new t(e)}addSignal(e,r){return this.signals[e]=r,this}add(e,...r){if(e instanceof tr)this.children.push(e.toNode());else if(e instanceof Nr)this.children.push(e.toNode());else{if(e&&typeof e=="object"&&"node"in e)return this.add(e.node,...r),this;if(Array.isArray(e))for(let n of e)this.add(n);else{let n=e,i=r[0];if(i&&!(i instanceof tr)&&!Array.isArray(i)&&(i instanceof re||"tracks"in i))return n.animation=i instanceof re?i.toSpec():i,this.children.push(n),this;this.children.push(n)}}for(let n of r)n&&!(n instanceof re)&&!("tracks"in n)&&this.add(n);return this}addAudio(e){return this.audioTracks.push(e),this}addSubjectSandwich(e){let r=typeof e.source=="string"?e.source:e.source.inputHandleId??"",n=e.fit??"cover",i=e.feather??4,o=i>1?i/100:i,a=e.variant??"s",s=B.video(r,{width:this.width,height:this.height,position:"absolute",x:0,y:0,fit:n,muted:e.muted??!1,volume:e.muted?0:e.volume??1});this.add(s);for(let c of e.behind)this.add(c);let u=B.video(r,{width:this.width,height:this.height,position:"absolute",x:0,y:0,fit:n,muted:!0,volume:0}).withVision({mode:"matte",enableSegmentation:!0,variant:a,confidence:e.confidence??.25,featherRadius:o,keyBackground:e.keyBackground??!0,backgroundKeyThreshold:e.backgroundKeyThreshold});return this.add(u),this}addSmartFraming(e){let r=typeof e.source=="string"?e.source:e.source.inputHandleId??"",n=Math.max(0,Math.min(.99,e.damping??.8)),i=e.leadHeadroom??.18,o=this.width,a=this.height,s=e.sourceAspect??16/9,u=o/a,c=u<s?Math.round(a*s):o,d=u<s?a:Math.round(o/s),m=o-c,p=a-d,f=e.target,b=new Yt(w=>{if(m>=0)return 0;let A=f.center?.x?f.center.x.get(w):f.bounds?.centerX?f.bounds.centerX.get(w)/o:f.center?.screenX?f.center.screenX.get(w)/o:.5,N=Math.max(0,Math.min(1,A))*c,C=o/2-N;return Math.max(m,Math.min(0,C))},{fps:this.fps,label:"smart_framing_pan_x"}),g=new Yt(w=>{if(p>=0)return 0;let A=f.center?.y?f.center.y.get(w):f.bounds?.centerY?f.bounds.centerY.get(w)/a:f.center?.screenY?f.center.screenY.get(w)/a:.5,N=Math.max(0,Math.min(1,A))*d,C=a*i-N;return Math.max(p,Math.min(0,C))},{fps:this.fps,label:"smart_framing_pan_y"}),y=new Yt(w=>{let A=w.frame;if(A<=0)return b.get(w);let v=b.get({...w,frame:0,time:0}),N=1-n;for(let C=1;C<=A;C++){let O=b.get({...w,frame:C,time:C/w.fps});v=v+N*(O-v)}return v},{fps:this.fps,label:"smart_framing_smooth_x"}),k=new Yt(w=>{let A=w.frame;if(A<=0)return g.get(w);let v=g.get({...w,frame:0,time:0}),N=1-n;for(let C=1;C<=A;C++){let O=g.get({...w,frame:C,time:C/w.fps});v=v+N*(O-v)}return v},{fps:this.fps,label:"smart_framing_smooth_y"}),S=B.box({width:o,height:a,overflow:"hidden",position:"relative"}),M=B.video(r,{width:c,height:d,position:"absolute",x:y,y:k,fit:e.fit??"cover",muted:e.muted??!1,volume:e.muted?0:e.volume??1});return S.children||(S.children=[]),S.children.push(M),this.add(S),this}addSubjectOutline(e,r={}){let n=r.blur??12,i=this.width,o=this.height,a=r.pulseSignal,s=a?new Yt(d=>Math.max(0,Math.min(1,Number(a.get(d))||0)),{fps:this.fps,label:"outline_pulse"}):1,u=typeof r.source=="string"?r.source:r.source?.inputHandleId??"",c=B.box({width:i,height:o,position:"absolute",x:0,y:0,opacity:s});if(u){let d=B.video(u,{width:i,height:o,position:"absolute",x:0,y:0,fit:"cover",muted:!0,volume:0}).withVision({mode:"mask",enableSegmentation:!0});c.children||(c.children=[]),c.children.push(d)}return c.apply(new Mt({strength:n,blurType:"Gaussian"})),this.add(c),this}section(e,r,n){let i,o,a={},s=e!==null&&typeof e=="object"&&"bounds"in e,u=typeof e=="string"||e!==null&&typeof e=="object"&&("kind"in e||"src"in e||"inputHandleId"in e);if(u&&r&&typeof r=="object"&&"bounds"in r?(i=e,o=r,a=n??{}):u&&r?(i=e,a=r):s?(o=e,a=r??{},i=a.source??o.source):e&&typeof e=="object"&&(a=e,i=a.source),!i){let c=this.children.find(d=>d.kind==="media"&&(d.dataType==="Video"||d.dataType==="Image"));c&&(i=c)}return B.section(i??"",o??a,{compositionWidth:this.width,compositionHeight:this.height,...a})}addSection(e,r,n){let i=this.section(e,r,n);return this.add(i),i}async computeDuration(){if(this.durationMs!==void 0)return this.durationMs;let e=0,r=[];for(let n of[...this.children,...this.audioTracks]){if(n.kind==="media"){let i=n.inputHandleId;typeof i=="string"&&(n.dataType==="Video"||n.dataType==="Audio")&&r.push(i)}if(typeof n.durationFrames=="number"){let o=((typeof n.startFrame=="number"?n.startFrame:0)+n.durationFrames)/this.fps*1e3;o>e&&(e=o)}}for(let n of r)try{let o=await(await qt.acquire(n)).computeDuration();if(Number.isFinite(o)&&o>0){let a=Math.round(o*1e3);a>e&&(e=a)}}catch{}return e>0?e:5e3}async registerFont(e,r){let n=await Ve.register(e,r);return n.filePath&&!this.fonts.includes(n.filePath)&&this.fonts.push(n.filePath),this}async registerEmojiFont(e){return await Ve.registerEmojiFont(e),this}toSpec(){let e=[...this.children,...this.audioTracks],r=Ve.getRegisteredFontPaths(),n=Array.from(new Set([...this.fonts,...r]));return{width:this.width,height:this.height,fps:this.fps,mode:"Video",backgroundColor:this.backgroundColor,...this.antialias3d!==void 0&&{antialias3d:this.antialias3d},layout:e,fonts:n,signals:this.signals,...this._effects.length>0&&{effects:this._effects},...this._visionConfig&&{vision:this._visionConfig},...this.hasFrameHooks()&&{onRequestFrame:i=>this.notifyFrame(i)}}}toVirtualMedia(e={}){let r=e.durationMs??this.durationMs,n=e.signals??this.signals;return Rn(this.toSpec(),{isVideoMode:!0,fps:this.fps,durationMs:r,signals:n,resolveMediaSignal:this.mediaSignalResolver(void 0,r,n),...this._effects.length>0&&{effects:this._effects},...this._visionConfig&&{vision:this._visionConfig},...e})}async toVirtualMediaAsync(e={}){let r=e.durationMs??this.durationMs??await this.computeDuration();this.durationMs=r;let n=e.signals??this.signals,i=Rn(this.toSpec(),{isVideoMode:!0,fps:this.fps,durationMs:r,signals:n,resolveMediaSignal:this.mediaSignalResolver(void 0,r,n),...this._effects.length>0&&{effects:this._effects},...this._visionConfig&&{vision:this._visionConfig},...e});return await Yl(i,this.fps),i}async renderFrame(e={}){let{frame:r}=Pt(e,this.fps);if(e.fps!==void 0&&e.fps!==this.fps)throw new Error(`Composition fps is ${this.fps}; cannot render at fps ${e.fps}.`);let n=this.toVirtualMedia();if(this.hasFrameHooks()){let o=r;await this.notifyFrame({frame:o,fps:this.fps,time:this.fps>0?o/this.fps:0,duration:(this.durationMs??0)/1e3,durationMs:this.durationMs??0,progress:this.durationMs&&this.durationMs>0?Math.max(0,Math.min(1,o/this.fps*1e3/this.durationMs)):0,deltaTime:this.fps>0?1/this.fps:0})}return(e.renderer??new ve.HeadlessMediaRenderer).renderFrame(n,{fps:this.fps,frame:r})}async renderFrameGrid(e={}){return pn(this,e)}async renderVideo(e={},r={}){let n=typeof e=="string"?{...r,outputPath:e}:e,o=await(n.renderer??new ve.HeadlessMediaRenderer).renderVideo(this.toVirtualMedia(),n);if(o.qa){let a=this.lint(),s=[...o.qa.issues,...a.map(u=>({severity:u.severity,code:u.code,message:u.message,...u.layerId!==void 0&&{layerId:u.layerId}}))];o.qa={...o.qa,issues:s,passed:o.qa.passed&&!a.some(u=>u.severity==="error")}}return kd(o,n.outputPath)}lint(){return Yo(this.toSpec(),{emojiFont:Ve.hasEmojiFont()})}};function we(t){let e=t;e.animation instanceof re&&(e.animation=e.animation.toSpec()),Object.defineProperty(e,"animate",{value:(...n)=>{let i=n.flat().flatMap(u=>u instanceof re?u.tracks:u.tracks??[]),o=e.animation,a=o?.tracks??[],s=n.flat().map(u=>u.frameStep).filter(u=>u!==void 0).at(-1)??o?.frameStep;return e.animation={tracks:Lr([...a,...i]),...s!==void 0&&s>1&&{frameStep:s}},e},enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"pinToLandmark",{value:(n,i)=>(to(e,n,i),e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"pinToObject",{value:(n,i)=>(ro(e,n,i),e),enumerable:!1,writable:!0,configurable:!0});let r=(n,i)=>(e.matte={node:n,...i&&{mode:i}},e);for(let n of["withMatte","withMask"])Object.defineProperty(e,n,{value:r,enumerable:!1,writable:!0,configurable:!0});return Object.defineProperty(e,"withPbrGlass",{value:n=>(e.glass=n??{},e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"deformWithAudio",{value:n=>(e.audioDeform=n??{},e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withCrop",{value:n=>(e.crop=n instanceof Br?n:new Br(n),e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withVision",{value:n=>(e.vision=n instanceof dt?n:new dt(n),e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withRelighting",{value:n=>(e.relighting=n??{},e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"relight",{value:n=>(e.relighting=n??{},e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withDeflicker",{value:n=>(e.deflicker=n??{},e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"apply",{value:n=>(e.effects||(e.effects=[]),e.effects.push(n),e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withEffect",{value:n=>(e.effects||(e.effects=[]),e.effects.push(n),e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withEffects",{value:n=>(e.effects||(e.effects=[]),e.effects.push(...n),e),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"section",{value:(n={},i)=>n!==null&&typeof n=="object"&&"bounds"in n?B.section(e,n,i):B.section(e,n),enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"blurRegion",{value:(n,i)=>{let o=new Mt({track:n,strength:i?.strength??25,shape:i?.shape??"ellipse",...i});return e.effects||(e.effects=[]),e.effects.push(o),e},enumerable:!1,writable:!0,configurable:!0}),Object.defineProperty(e,"withBlurRegion",{value:(n,i)=>e.blurRegion(n,i),enumerable:!1,writable:!0,configurable:!0}),e}var B={video:(t,e={})=>we({id:e.id??Z("video"),kind:"media",inputHandleId:t,dataType:"Video",fit:e.fit??"cover",...e}),image:(t,e={})=>(typeof t=="string"&&(/\.(json|lottie)(\?.*)?$/i.test(t)||t.startsWith("data:application/json")?console.warn(`[Layer.image] '${t}' is a Lottie vector animation, not a static image. Use Layer.lottie('${t}', options) instead.`):/\.(mp4|mov|webm|mkv)(\?.*)?$/i.test(t)?console.warn(`[Layer.image] '${t}' is a video file, not a static image. Use Layer.video('${t}', options) instead.`):/\.(mp3|wav|ogg|m4a|aac)(\?.*)?$/i.test(t)&&console.warn(`[Layer.image] '${t}' is an audio file, not a static image. Use Layer.audio('${t}', options) instead.`)),we({id:e.id??Z("img"),kind:"media",inputHandleId:t,dataType:"Image",fit:e.fit??"cover",...e})),svg:(t,e={})=>we({id:e.id??Z("svg"),kind:"media",inputHandleId:t,dataType:"SVG",fit:e.fit??"contain",...e}),lottie:(t,e={})=>we({id:e.id??Z("lottie"),kind:"media",inputHandleId:t,dataType:"Lottie",fit:e.fit??"contain",...e}),audio:(t,e={})=>we({id:e.id??Z("audio"),kind:"media",inputHandleId:t,dataType:"Audio",volume:e.volume??1,...e}),text:(t,e={})=>{let r=Array.isArray(t),n=!r&&typeof t=="object"&&t!==null,i=n?t:e,o="",a=i.spans;if(r){let s=Qn(t);o=s.text,a=s.spans}else n?i.spans&&!i.text?o=Qn(i.spans).text:o=i.text??"":o=typeof t=="string"?t:String(t??"");return we({id:i.id??Z("text"),kind:"text",fontFamily:i.fontFamily??Ve.getAll()[0]?.family??"Inter",fontSize:i.fontSize??48,fill:i.fill??"#ffffff",...i,text:i.text??o,spans:i.spans??a})},caption:(t,e={})=>we({id:e.id??Z("caption"),kind:"media",inputHandleId:t,dataType:e.dataType??"Caption",fontFamily:e.fontFamily??Ve.getAll()[0]?.family??"Inter",fontSize:e.fontSize??48,fill:e.fill??"#ffffff",...e}),shape:(t="rect",e={})=>{let{fill:r,...n}=e;return we({id:n.id??Z("shape"),kind:"shape",shapeType:n.shapeType??t,...n,fillColor:n.fillColor??r??"#3b82f6"})},flex:(t={})=>we({id:t.id??Z("flex"),kind:"flex",dir:t.dir??"column",children:t.children??[],...t}),box:(t={})=>we({id:t.id??Z("box"),kind:"box",background:t.background??"transparent",children:t.children??[],...t}),particles:t=>{let e=new dn(t),r={metadata:{width:t.width,height:t.height},operation:{...e.toOperation(),effect:e,dataType:"Video"},children:[]};return we({id:t.id??Z("particles"),kind:"media",dataType:"Video",src:r,position:"absolute",x:t.x??0,y:t.y??0,width:t.width,height:t.height,...t.startFrame!==void 0&&{startFrame:t.startFrame},...t.durationFrames!==void 0&&{durationFrames:t.durationFrames},...t.zIndex!==void 0&&{zIndex:t.zIndex}})},vfx:t=>{let{x:e,y:r,id:n,startFrame:i,durationFrames:o,zIndex:a,...s}=t,u=new ho({outputType:"Video",...s}),c={metadata:{width:t.width,height:t.height},operation:{...u.toOperation(),effect:u,dataType:"Video"},children:[]};return we({id:n??Z("vfx"),kind:"media",dataType:"Video",src:c,position:"absolute",x:e??0,y:r??0,width:t.width,height:t.height,...i!==void 0&&{startFrame:i},...o!==void 0&&{durationFrames:o},...a!==void 0&&{zIndex:a}})},section:(t,e={},r={})=>{let n=t;if(t&&typeof t=="object"&&"toSpec"in t&&"children"in t){let v=(t.children||[]).find(N=>N.kind==="media"&&(N.dataType==="Video"||N.dataType==="Image"));v&&(n=v)}let i=e!==null&&typeof e=="object"&&"bounds"in e,o=i?r:e,a=i?e:void 0,s=o.padding??0,u=typeof n=="string"?n:n?.inputHandleId??n?.src??"",c=typeof n=="object"&&n?.dataType?n.dataType:"Video",d=o.compositionWidth??o.compWidth??(i?o.width:void 0)??1920,m=o.compositionHeight??o.compHeight??(i?o.height:void 0)??1080,p=Array.isArray(o.effects)?[...o.effects]:o.effects?[o.effects]:[],f=a?a.bounds.screenX.multiply(-1).add(s):typeof o.x=="number"?-o.x:o.x&&typeof o.x.multiply=="function"?o.x.multiply(-1):0,b=a?a.bounds.screenY.multiply(-1).add(s):typeof o.y=="number"?-o.y:o.y&&typeof o.y.multiply=="function"?o.y.multiply(-1):0,g=(c==="Image"?B.image(u,{position:"absolute",width:d,height:m,fit:o.fit??"cover",x:f,y:b}):B.video(u,{position:"absolute",width:d,height:m,fit:o.fit??"cover",x:f,y:b})).withEffects(p),y=a?a.bounds.screenWidth.add(s*2):o.width!==void 0?o.width:d,k=a?a.bounds.screenHeight.add(s*2):o.height!==void 0?o.height:m,S=[g,...o.children??[]],M=o.id??(a?Z(`section-track-${a.trackId}`):Z("section")),w=B.box({id:M,position:o.position??"absolute",width:y,height:k,x:a?void 0:o.x,y:a?void 0:o.y,borderRadius:o.borderRadius??0,borderColor:o.borderColor,borderWidth:o.borderWidth,opacity:o.opacity??1,overflow:"hidden",children:S});a&&(w=w.pinToObject(a,{anchor:"topLeft",offsetX:-s,offsetY:-s,hideWhenLost:o.hideWhenLost??!0,smoothFrames:o.smoothFrames}));let A=w;return Object.defineProperty(A,"innerMedia",{value:g,enumerable:!0,writable:!1}),Object.defineProperty(A,"effects",{get:()=>p,enumerable:!0}),Object.defineProperty(A,"addEffect",{value:v=>(p.push(v),g.effects=p,A),enumerable:!0,writable:!1}),Object.defineProperty(A,"withEffect",{value:v=>A.addEffect(v),enumerable:!0,writable:!1}),Object.defineProperty(A,"withEffects",{value:v=>{for(let N of v)A.addEffect(N);return A},enumerable:!0,writable:!1}),A},trackedRegion:(t,e,r={})=>B.section(t,e,r),blurTrackedRegion:(t,e,r={})=>{let{padding:n,borderRadius:i,borderColor:o,borderWidth:a,...s}=r;return B.section(t,e,{padding:n??8,borderRadius:i??12,borderColor:o,borderWidth:a,effects:[new Mt({strength:s.strength??25,blurType:s.blurType??"Gaussian",...s})]})},chart:(t,e={})=>Im(t,e,Ve.getAll()[0]?.family??"Inter"),camera:(t={})=>we({id:t.id??Z("camera"),kind:"camera",mode:t.mode??"lookAt",pitch:t.pitch??0,yaw:t.yaw??0,roll:t.roll??0,...t}),light:(t={})=>we({id:t.id??Z("light"),kind:"light",lightType:t.lightType??"point",color:t.color??"#ffffff",intensity:t.intensity??1,...t}),ambientLight:(t="#ffffff",e=.5,r={})=>st.ambient(t,e,r),sequence:(t,e)=>Hm(t,e),environment:(t="studio",e={})=>st.environment(t,e),directionalLight:(t={})=>st.directional(t),pointLight:(t={})=>st.point(t),spotLight:(t={})=>st.spot(t),cube:t=>Ee.cube(t),carousel3d:t=>Ee.carousel(t),plane3d:t=>Ee.plane(t),prism3d:t=>Ee.prism(t),model:(t={})=>we({id:t.id??Z("model3d"),kind:"model3d",is3D:t.is3D??!0,modelFormat:t.modelFormat??"auto",loop:t.loop??!0,scale:t.scale??1,scaleX:t.scaleX??1,scaleY:t.scaleY??1,scaleZ:t.scaleZ??1,opacity:t.opacity??1,...t}),obj:(t,e={})=>B.model({src:t,modelFormat:"obj",...e}),fbx:(t,e={})=>B.model({src:t,modelFormat:"fbx",...e}),gltf:(t,e={})=>B.model({src:t,modelFormat:"gltf",...e}),glb:(t,e={})=>B.model({src:t,modelFormat:"glb",...e}),stl:(t,e={})=>B.model({src:t,modelFormat:"stl",...e}),ply:(t,e={})=>B.model({src:t,modelFormat:"ply",...e}),vox:(t,e={})=>B.model({src:t,modelFormat:"vox",...e}),threeDS:(t,e={})=>B.model({src:t,modelFormat:"3ds",...e}),off:(t,e={})=>B.model({src:t,modelFormat:"off",...e})},st={environment:(t="studio",e={})=>{let r=typeof t=="string"?{preset:t,...e}:{...t,...e};return we({kind:"light",lightType:"environment",preset:"studio",intensity:1,...r,id:r.id??Z("environment")})},ambient:(t="#ffffff",e=.5,r={})=>we({id:r.id??Z("light-ambient"),kind:"light",lightType:"ambient",color:typeof t=="string"?t:t.color??"#ffffff",intensity:e,...typeof t=="object"&&t,...r}),directional:(t={})=>we({id:t.id??Z("light-directional"),kind:"light",lightType:"directional",color:t.color??"#ffffff",intensity:t.intensity??1,x:t.x??0,y:t.y??-1e3,z:t.z??-1e3,targetX:t.targetX??0,targetY:t.targetY??0,targetZ:t.targetZ??0,...t}),point:(t={})=>we({id:t.id??Z("light-point"),kind:"light",lightType:"point",color:t.color??"#ffffff",intensity:t.intensity??1,x:t.x??0,y:t.y??0,z:t.z??-500,radius:t.radius??1e3,decay:t.decay??1,...t}),spot:(t={})=>we({id:t.id??Z("light-spot"),kind:"light",lightType:"spot",color:t.color??"#ffffff",intensity:t.intensity??1,x:t.x??0,y:t.y??-500,z:t.z??-1e3,targetX:t.targetX??0,targetY:t.targetY??0,targetZ:t.targetZ??0,angle:t.angle??45,penumbra:t.penumbra??.2,radius:t.radius??2e3,decay:t.decay??1,...t})};function EC(t,e={},r={}){return B.section(t,e,r)}function IC(t,e,r={}){return typeof t=="object"&&"blurRegion"in t?t.blurRegion(e,r):B.blurTrackedRegion(t,e,r)}function VC(t,e,r={}){return B.section(t,e,r)}var iy=Object.assign(Xt,go,{blur:t=>new Mt(t),vignette:t=>new Qt(t),colorBalance:t=>new oo(t),colorKey:t=>new ao(t),levels:t=>new bo(t),filmGrain:t=>new et(t),curves:t=>new xo(t),selectiveColor:t=>new wo(t),gradientMap:t=>new Tt(t),shadowsHighlights:t=>new vo(t),applyLut:t=>new So(t),unsharpMask:t=>new ko(t),highPass:t=>new Po(t),halftoneScreen:t=>new Or(t),tileOffset:t=>new Mo(t),motionBlur:t=>new To(t),ssao:t=>new Ao(t),pbrGlass:t=>new Co(t),depthOfField:t=>new Do(t),crop:t=>new Br(t),vision:t=>new dt(t),relight3d:t=>new Ro(t),modulate:t=>new Fo(t),deflicker:t=>new No(t),custom:(t,e={})=>new yo(t,e)});var oy=/\.(png|jpe?g|webp|gif|avif|tiff?|bmp)(\?.*)?$/i,ay=/\.svg(\?.*)?$/i;function sy(t){let e=r=>r?{...r,enabled:!0}:void 0;return new mo({...t.dropShadow&&{dropShadow:e(t.dropShadow)},...t.outerGlow&&{outerGlow:e(t.outerGlow)},...t.innerShadow&&{innerShadow:e(t.innerShadow)},...t.stroke&&{stroke:e(t.stroke)}})}function uy(t,e){let r=Math.max(16,Math.round(t)),n=Math.max(16,Math.round(e));return`data:image/svg+xml;utf8,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${n}"><rect width="${r}" height="${n}" fill="#808080"/></svg>`)}`}var Pd={box:t=>B.box(t),flex:t=>B.flex(t),text:(t,e)=>B.text(t,e),shape:(t,e)=>B.shape(t,e),measure:(t,e)=>Ve.measure(t,e),fonts:()=>Ve.getAll().map(t=>t.family),autoId:Z,media:(t,e)=>ay.test(t)?B.svg(t,e):oy.test(t)?B.image(t,e):B.video(t,{muted:!0,...e}),style:(t,e)=>(t.withEffect(sy(e)),t),cutout:(t,{mode:e="person",...r})=>B.video(t,{muted:!0,volume:0,fit:"cover",...r}).withVision({mode:"matte",enableSegmentation:!0,variant:e==="subject"?"m":"s",confidence:.25,featherRadius:.04,keyBackground:!0}),particles:t=>B.particles(t),signal:(t,e)=>Bs([...t],e),grain:({id:t,x:e,y:r,width:n,height:i,strength:o,size:a})=>B.svg(uy(n,i),{id:t,position:"absolute",x:e,y:r,width:n,height:i,fit:"fill",blendMode:"soft-light"}).withEffect(new et({strength:o,...a!==void 0&&{size:a},shadows:1,midtones:1,highlights:1})),extrudedText:({fontWeight:t,...e})=>Ee.extrudedText({...e,...t!==void 0&&{fontWeight:String(t)},align:"center",verticalAlign:"middle"}),matte:(t,e,r="alpha")=>(t.withMatte(e,r),t)};h();async function Sd(t,e={}){let r=await Js(t);if(!r||r.channels.length===0)throw new Error(`analyzeAudio: could not decode audio from ${t}`);return bl(r.channels,r.sampleRate,e)}function ry(t){return Rl(Pd,t)}export{Lo as a,Eo as b,iu as c,ou as d,au as e,Bd as f,Ld as g,su as h,Io as i,Ed as j,uu as k,Id as l,lu as m,Vo as n,cu as o,mu as p,du as q,pu as r,fu as s,hu as t,zo as u,Er as v,gu as w,bu as x,Jt as y,yu as z,xu as A,wu as B,vu as C,En as D,In as E,Su as F,ku as G,Vn as H,Pu as I,Mu as J,Tu as K,Au as L,Cu as M,Du as N,Ru as O,er as P,Vd as Q,jo as R,$o as S,_o as T,Uo as U,Go as V,Wo as W,Lw as X,Ew as Y,zw as Z,Lr as _,re as $,Bo as aa,Yo as ba,Xo as ca,_u as da,Gu as ea,rp as fa,Wu as ga,Hu as ha,Yu as ia,Xu as ja,qu as ka,Zu as la,Ku as ma,Qu as na,Ju as oa,el as pa,tl as qa,rl as ra,nl as sa,il as ta,ol as ua,lp as va,al as wa,Ko as xa,cp as ya,sl as za,ul as Aa,ll as Ba,mp as Ca,cl as Da,Ir as Ea,Qo as Fa,Gr as Ga,Wr as Ha,Hr as Ia,tr as Ja,$e as Ka,Xr as La,ca as Ma,gf as Na,bf as Oa,yf as Pa,xf as Qa,wf as Ra,vf as Sa,Sf as Ta,kf as Ua,Pf as Va,Mf as Wa,Tf as Xa,Af as Ya,Qn as Za,Cf as _a,Em as $a,mn as ab,Mi as bb,dn as cb,ms as db,ds as eb,pn as fb,ve as gb,Ee as hb,Wm as ib,gb as jb,fn as kb,Sr as lb,hn as mb,kr as nb,Nb as ob,Fb as pb,Wb as qb,gp as rb,$n as sb,Vr as tb,Jo as ub,bp as vb,yp as wb,m0 as xb,dl as yb,pl as zb,kp as Ab,bl as Bb,g0 as Cb,b0 as Db,y0 as Eb,yl as Fb,v0 as Gb,Un as Hb,Mp as Ib,S0 as Jb,k0 as Kb,zr as Lb,T0 as Mb,A0 as Nb,xl as Ob,ea as Pb,Gn as Qb,wl as Rb,C0 as Sb,ra as Tb,Ap as Ub,jr as Vb,B0 as Wb,L0 as Xb,E0 as Yb,I0 as Zb,Wn as _b,V0 as $b,Cp as ac,Dp as bc,z0 as cc,j0 as dc,$0 as ec,$r as fc,ia as gc,kl as hc,Pl as ic,Tl as jc,_r as kc,Z0 as lc,Np as mc,Fp as nc,Bp as oc,nx as pc,Ep as qc,Ip as rc,Rl as sc,la as tc,Nl as uc,Fl as vc,Ol as wc,ax as xc,rt as yc,sx as zc,dx as Ac,Ur as Bc,px as Cc,fx as Dc,hx as Ec,gx as Fc,bx as Gc,yx as Hc,Yn as Ic,Sx as Jc,kx as Kc,Px as Lc,Mx as Mc,Tx as Nc,Ax as Oc,Cx as Pc,Gp as Qc,Nx as Rc,Bx as Sc,Vx as Tc,Wp as Uc,_x as Vc,Ux as Wc,Hx as Xc,Ll as Yc,Hp as Zc,El as _c,Zx as $c,qp as ad,Qp as bd,Vl as cd,Kx as dd,ew as ed,Sd as fd,ry as gd,wd as hd,vd as id,B as jd,st as kd,EC as ld,IC as md,VC as nd,iy as od};
|