pixi-effects 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +11 -8
- package/ai/SKILL.md +4 -3
- package/ai/reference/cheatsheet.md +16 -2
- package/ai/reference/pitfalls.md +6 -2
- package/ai/reference/recipes.md +76 -10
- package/ai/template.html +15 -8
- package/ai/tools/check.mjs +17 -1
- package/ai/tools/render.mjs +23 -10
- package/dist/{Base-CyvSLoCP.d.ts → Base-CYH9vPCH.d.ts} +1 -1
- package/dist/{Base-CwUxTfja.d.cts → Base-W3sQzGPO.d.cts} +1 -1
- package/dist/Composition-7TEKHZNQ.cjs +14 -0
- package/dist/{Composition-EKVTUYCI.cjs.map → Composition-7TEKHZNQ.cjs.map} +1 -1
- package/dist/Composition-HIISJAX2.js +5 -0
- package/dist/{Composition-NJCOMGD7.js.map → Composition-HIISJAX2.js.map} +1 -1
- package/dist/Controller.cjs +58 -0
- package/dist/Controller.cjs.map +1 -1
- package/dist/Controller.d.cts +13 -3
- package/dist/Controller.d.ts +13 -3
- package/dist/Controller.js +58 -0
- package/dist/Controller.js.map +1 -1
- package/dist/{Movie-w3GliuP3.d.cts → Movie-CY2QPVVM.d.cts} +149 -2
- package/dist/{Movie-puD9oZPg.d.ts → Movie-EBF6_RfX.d.ts} +149 -2
- package/dist/Presenter.cjs +671 -0
- package/dist/Presenter.cjs.map +1 -0
- package/dist/Presenter.d.cts +123 -0
- package/dist/Presenter.d.ts +123 -0
- package/dist/Presenter.js +669 -0
- package/dist/Presenter.js.map +1 -0
- package/dist/{chunk-WDGAVOMS.js → chunk-3IPDNC3E.js} +8 -5
- package/dist/chunk-3IPDNC3E.js.map +1 -0
- package/dist/{chunk-S3ZI4MKS.cjs → chunk-6NWJLVCA.cjs} +3 -3
- package/dist/{chunk-S3ZI4MKS.cjs.map → chunk-6NWJLVCA.cjs.map} +1 -1
- package/dist/{chunk-JAMNDBXW.js → chunk-C6QHKYC5.js} +3 -3
- package/dist/{chunk-JAMNDBXW.js.map → chunk-C6QHKYC5.js.map} +1 -1
- package/dist/{chunk-4WJUSDJJ.cjs → chunk-F7NCHS6Q.cjs} +31 -28
- package/dist/chunk-F7NCHS6Q.cjs.map +1 -0
- package/dist/index.cjs +884 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +234 -5
- package/dist/index.d.ts +234 -5
- package/dist/index.js +856 -40
- package/dist/index.js.map +1 -1
- package/dist/loader.css +110 -0
- package/dist/three.cjs +5 -5
- package/dist/three.d.cts +2 -2
- package/dist/three.d.ts +2 -2
- package/dist/three.js +1 -1
- package/dist/{types-BXu28nJj.d.cts → types-mpqQO8MJ.d.cts} +39 -1
- package/dist/{types-BXu28nJj.d.ts → types-mpqQO8MJ.d.ts} +39 -1
- package/docs/api.md +94 -1
- package/docs/dsl.md +77 -0
- package/llms-full.txt +273 -18
- package/llms.txt +3 -3
- package/package.json +9 -2
- package/dist/Composition-EKVTUYCI.cjs +0 -14
- package/dist/Composition-NJCOMGD7.js +0 -5
- package/dist/chunk-4WJUSDJJ.cjs.map +0 -1
- package/dist/chunk-WDGAVOMS.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Presenter.ts"],"names":[],"mappings":";;;AAwBA,IAAM,WAAA,GAAc,CAAC,QAAA,EAAU,UAAA,EAAY,gBAAA,EAAkB,SAAS,WAAA,EAAa,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAC5H,IAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,cAAc,WAAA,EAAa,GAAA,EAAK,OAAA,EAAS,UAAU,CAAC,CAAA;AAC/E,IAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,aAAa,SAAA,EAAW,WAAA,EAAa,QAAQ,CAAC,CAAA;AACzE,IAAM,KAAA,GAAQ,CAAC,EAAA,KAAuB;AAAE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAAG,EAAA,OAAO,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAC,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,GAAI,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAI,CAAA;AACrK,IAAM,OAAA,GAAU,IAAA;AAChB,IAAM,SAAA,GAAY,GAAA;AAClB,IAAM,QAAA,GAAW,EAAA;AAEjB,IAAM,GAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAsCZ,SAAS,aAAA,GAAsB;AAC7B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,SAAS,IAAA,CAAK,aAAA,CAAc,6BAA6B,CAAA,EAAG;AACnG,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACzC,EAAA,EAAA,CAAG,YAAA,CAAa,wBAAwB,EAAE,CAAA;AAC1C,EAAA,EAAA,CAAG,WAAA,GAAc,GAAA;AACjB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAC9B;AAEA,IAAM,IAAA,GAAgC;AAAA,EACpC,CAAC,iDAAuC,+BAA+B,CAAA;AAAA,EACvE,CAAC,qCAA2B,eAAe,CAAA;AAAA,EAC3C,CAAC,gBAAgB,0BAA0B,CAAA;AAAA,EAC3C,CAAC,sBAAsB,mBAAmB,CAAA;AAAA,EAC1C,CAAC,YAAY,cAAc,CAAA;AAAA,EAC3B,CAAC,YAAY,cAAc,CAAA;AAAA,EAC3B,CAAC,KAAK,kDAAkD,CAAA;AAAA,EACxD,CAAC,KAAK,8DAA8D,CAAA;AAAA,EACpE,CAAC,KAAK,YAAY,CAAA;AAAA,EAClB,CAAC,OAAO,wCAAwC,CAAA;AAAA,EAChD,CAAC,uBAAa,qBAAqB;AACrC,CAAA;AAEA,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAgCV,IAAM,YAAN,MAAgB;AAAA,EACZ,KAAA;AAAA,EACA,OAAA;AAAA,EAED,GAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,IAAA;AAAA,EACA,SAAA,GAAgC,IAAA;AAAA,EAChC,OAAA,GAA8B,IAAA;AAAA,EAC9B,UAAA,GAAiC,IAAA;AAAA,EACjC,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAkD,IAAA;AAAA,EAClD,WAAA,GAAoD,IAAA;AAAA,EACpD,YAAA,GAAqD,IAAA;AAAA,EACrD,SAAA,GAAkD,IAAA;AAAA,EAClD,UAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA;AAAA,EAEd,MAAA,uBAAa,GAAA,EAAoB;AAAA,EACjC,aAAA,GAAsC,IAAA;AAAA,EACtC,MAAA;AAAA,EACA,IAAA,GAA8I,IAAA;AAAA,EAC9I,MAAA,GAAS,EAAA;AAAA,EACT,MAAA,GAA0C,IAAA;AAAA,EAC1C,MAAA,GAAS,KAAA;AAAA,EACT,YAAA,GAAe,EAAA;AAAA,EACf,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EAEd,KAAA,GAAQ,CAAC,CAAA,KAAqB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EAC9C,MAAA,GAAS,CAAC,CAAA,KAAiB,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,EAC5C,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC9B,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,EAAO;AAAA,EAC5B,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,EAAY;AAAA,EACjC,aAAA,GAAgB,CAAC,CAAA,KAAoB;AAAE,IAAA,IAAA,CAAK,SAAS,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAG,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EAAO,CAAA;AAAA,EAC1G,WAAA,GAAc,CAAC,CAAA,KAAoB,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAAA,EACzD,aAAA,GAAgB,MAAM,IAAA,CAAK,IAAA,EAAK;AAAA,EAChC,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,EAAY;AAAA,EACjC,aAAA,GAAgB,KAAA;AAAA,EAChB,qBAAqB,MAAM;AACjC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,iBAAA,KAAsB,IAAA,CAAK,GAAA;AAChD,IAAA,IAAI,KAAK,aAAA,IAAiB,CAAC,GAAA,EAAK,IAAA,CAAK,QAAQ,MAAA,IAAS;AACtD,IAAA,IAAA,CAAK,aAAA,GAAgB,GAAA;AAAA,EACvB,CAAA;AAAA,EAEA,WAAA,CAAY,OAAc,OAAA,EAA2B;AACnD,IAAA,IAAI,CAAC,WAAW,CAAC,OAAA,CAAQ,QAAQ,MAAM,IAAI,MAAM,wDAAwD,CAAA;AACzG,IAAA,kBAAA,CAAmB,WAAA,EAAa,SAAS,WAAW,CAAA;AACpD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAAQ,QAAA,EAAU,QAAQ,QAAA,IAAY,IAAA;AAAA,MAAM,cAAA,EAAgB,QAAQ,cAAA,IAAkB,IAAA;AAAA,MAAM,KAAA,EAAO,QAAQ,KAAA,IAAS,IAAA;AAAA,MACpI,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAA;AAAA,MAAM,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,MAAM,IAAA,EAAM,QAAQ,IAAA,IAAQ,KAAA;AAAA,MAAO,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAAQ,QAAQ,OAAA,CAAQ;AAAA,KACvJ;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU,CAAA,MAAO,CAAA,EAAG;AACpC,MAAA,OAAA,CAAQ,KAAK,kKAAkK,CAAA;AAAA,IACjL;AACA,IAAA,aAAA,EAAc;AACd,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA;AAC5B,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,cAAc,CAAA;AACvD,IAAA,IAAA,CAAK,GAAA,CAAI,YAAA,CAAa,cAAA,EAAgB,EAAE,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,KAAK,SAAA,GAAY,iBAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,WAAA,CAAY,aAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACvF,IAAA,IAAA,CAAK,KAAK,SAAA,GAAY;AAAA,MAAA,EAClB,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,0HAAA,GAA6H,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,8FAAA,EAKhE,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,IAAA,EAAO,CAAC,YAAY,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,WAAA,CAAA;AACvJ,IAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,aAAa,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AACxD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,cAAc,CAAA;AACxD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AAEjE,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,KAAA,CAAM,MAAA;AACjC,IAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAAE,MAAA,MAAA,CAAO,MAAM,MAAA,GAAS,SAAA;AAAW,MAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAAA,IAAG;AACpH,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AAAE,MAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAAG,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAAA,IAAG;AAC9I,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AACzD,IAAA,IAAI,KAAK,OAAA,CAAQ,QAAA,WAAmB,gBAAA,CAAiB,SAAA,EAAW,KAAK,KAAK,CAAA;AAC1E,IAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,kBAAkB,CAAA;AACrE,IAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAC5B,IAAA,KAAA,CAAM,EAAA,CAAG,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAC9B,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,MAAM,CAAA;AAC5C,IAAA,IAAI;AAAE,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAAG,CAAA,SAAE;AAAU,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAA,IAAG;AAC7F,IAAA,MAAM,KAAK,eAAA,EAAgB;AAC3B,IAAA,MAAM,KAAK,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA,EAGA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,QAAA,CAAS,sBAAsB,IAAA,CAAK,GAAA,QAAW,QAAA,CAAS,cAAA,IAAiB,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC/F;AAAA,EAEA,IAAA,GAAsB;AAAE,IAAA,IAAA,CAAK,aAAA,EAAc;AAAG,IAAA,OAAO,KAAK,GAAA,CAAI,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EAAG;AAAA,EACxF,IAAA,GAAsB;AAAE,IAAA,IAAA,CAAK,aAAA,EAAc;AAAG,IAAA,OAAO,KAAK,GAAA,CAAI,MAAM,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EAAG;AAAA;AAAA,EAGxF,SAAS,IAAA,EAAuC;AAC9C,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,WAAA,EAAa,IAAI,CAAA;AAC3C,IAAA,IAAI,IAAA,KAAS,KAAA,EAAO,IAAA,CAAK,aAAA,EAAc;AAAA,EACzC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA;AAC5B,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA;AAClD,IAAA,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,kBAAkB,CAAA;AACxE,IAAA,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AAChD,IAAA,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAC5D,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAC5D,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,IAAA,CAAK,SAAA,EAAW,KAAK,WAAA,EAAa,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,SAAS,CAAA,EAAG,IAAI,CAAA,eAAgB,CAAC,CAAA;AAC5G,IAAA,MAAA,CAAO,KAAA,CAAM,SAAS,IAAA,CAAK,YAAA;AAC3B,IAAA,IAAA,CAAK,KAAK,MAAA,EAAO;AACjB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,gBAAgB,cAAc,CAAA;AAC9D,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,aAAA;AACxB,MAAA,IAAI,MAAA,EAAQ;AAAE,QAAA,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAG,QAAA,IAAA,CAAK,IAAI,MAAA,EAAO;AAAA,MAAG;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA,EAIQ,eAAe,MAAA,EAAwC;AAC7D,IAAA,MAAM,SAAS,MAAA,CAAO,aAAA;AACtB,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oEAAoE,CAAA;AACjG,IAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,MAAM,CAAA,CAAE,QAAA;AACrC,IAAA,IAAI,GAAA,KAAQ,cAAc,GAAA,KAAQ,UAAA,IAAc,QAAQ,OAAA,IAAW,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5F,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,sBAAA;AACjB,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,4DAAA;AACrB,IAAA,MAAA,CAAO,YAAA,CAAa,MAAM,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,IAAI,EAAA,EAAwC;AAClD,IAAA,OAAO,EAAA,EAAG,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AAAE,MAAA,OAAA,CAAQ,IAAA,CAAK,4BAA4B,GAAG,CAAA;AAAA,IAAG,CAAC,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,IAAI;AAAE,MAAA,MAAM,IAAI,iBAAA,IAAoB;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAgF;AAAA,EACjI;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,SAAS,iBAAA,KAAsB,IAAA,CAAK,GAAA,EAAK,KAAK,KAAK,IAAA,EAAK;AAAA,SACvD,KAAK,KAAK,eAAA,EAAgB;AAAA,EACjC;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,YAAA,EAAc;AAAE,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAG,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IAAM;AACpF,IAAA,IAAI,KAAK,SAAA,EAAW;AAAE,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAAG,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IAAM;AAAA,EAC7E;AAAA,EAEQ,WAAW,CAAA,EAAoB;AACrC,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,IAAe,CAAA,CAAE,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,WAAW,CAAA,KAAM,KAAA,EAAO;AAChH,MAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AAAE,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAM,QAAA,KAAK,KAAK,IAAA,EAAK;AAAA,MAAG,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,OAAA,GAAU,GAAI,CAAA;AAAA,IAC7G;AAAA,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,MAAM;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,KAAK,IAAA,CAAK,IAAI,YAAY;AAAE,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA;AAAG,QAAA,MAAM,IAAA,CAAK,MAAM,IAAA,EAAK;AAAA,MAAG,CAAC,CAAA;AAAA,IAC7F,GAAG,GAAG,CAAA;AAAA,EACR;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,IAAA,MAAM,QAAQ,CAAA,CAAE,SAAA,IAAa,GAAG,KAAA,GAAQ,CAAA,CAAE,OAAO,MAAA,IAAU,CAAA;AAC3D,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAI,GAAG,CAAA,CAAE,SAAA,IAAa,CAAA,GAAI,CAAA,CAAE,SAAA,GAAY,CAAA,GAAI,QAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,GAAK,EAAA;AACpG,MAAA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,KAAA,GAAQ,IAAI,EAAA,GAAK,MAAA;AAAA,IAClD;AACA,IAAA,IAAI,KAAK,OAAA,EAAS,IAAA,CAAK,QAAQ,WAAA,GAAc,CAAA,CAAE,aAAa,IAAA,IAAQ,EAAA;AACpE,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,MAAM,WAAA,CAAY,WAAA,EAAa,MAAA,CAAO,KAAA,GAAQ,KAAK,CAAA,CAAE,SAAA,GAAY,CAAA,IAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AACrH,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAC3C,IAAA,IAAI,KAAK,OAAA,CAAQ,cAAA,OAAqB,OAAA,CAAQ,MAAA,CAAO,MAAM,MAAA,GAAS,SAAA;AACpE,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,WAAW,MAAM;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,IACrC,GAAG,OAAO,CAAA;AAAA,EACZ;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,IAAA,CAAK,SAAS,CAAA,OAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAA,GAAK,EAAA;AAC7D,IAAA,IAAA,CAAK,OAAO,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,MAAA,GAAS,SAAS,OAAO,CAAA;AACtE,IAAA,IAAI,IAAA,CAAK,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,UAAA,CAAW,MAAM;AAAE,MAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAI,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAAG,CAAA,EAAG,SAAS,CAAA,GAAI,IAAA;AAAA,EAC3G;AAAA;AAAA,EAGQ,SAAS,EAAA,EAAsB;AACrC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,WAAW,MAAM,KAAA,EAAO;AAAE,MAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAG,MAAA;AAAA,IAAQ;AACtF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAW,MAAM,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAG,MAAA;AAAA,IAAQ;AAChH,IAAA,EAAA,EAAG;AAAA,EACL;AAAA,EAEQ,UAAU,CAAA,EAAwB;AACxC,IAAA,IAAI,KAAK,SAAA,IAAa,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,IAAW,EAAE,MAAA,EAAQ;AAC1D,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,IAAI,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,UAAA,IAAc,CAAA,CAAE,OAAA,KAAY,QAAA,IAAY,CAAA,CAAE,iBAAA,CAAA,EAAoB;AAC/G,IAAA,MAAM,IAAI,CAAA,CAAE,GAAA;AACZ,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK;AAAE,MAAA,IAAA,CAAK,cAAA,EAAe;AAAG,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA;AAAA,IAAQ;AACjF,IAAA,IAAI,IAAA,CAAK,cAAa,EAAG;AAAE,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA,IAAK,cAAA,EAAe;AAAG,MAAA;AAAA,IAAQ;AACtF,IAAA,IAAI,KAAK,GAAA,IAAO,CAAA,IAAK,GAAA,IAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AAAE,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AAAG,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAAG,CAAA,MAAA,IACrG,CAAA,KAAM,OAAA,IAAW,IAAA,CAAK,MAAA,EAAQ;AACrC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA;AAAG,MAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAI,MAAA,IAAA,CAAK,UAAA,EAAW;AACxE,MAAA,IAAA,CAAK,SAAS,MAAM;AAAE,QAAA,IAAA,CAAK,aAAA,EAAc;AAAG,QAAA,KAAK,KAAK,GAAA,CAAI,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,MAAG,CAAC,CAAA;AAAA,IAC/F,CAAA,MAAA,IACS,CAAA,KAAM,WAAA,IAAe,IAAA,CAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAA;AAAG,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAAG,CAAA,MAAA,IAC/F,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,SAAA,IACtD,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,SAAS,MAAM,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,SAAA,IACtD,CAAA,KAAM,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,MAAM;AAAE,MAAA,IAAA,CAAK,aAAA,EAAc;AAAG,MAAA,KAAK,KAAK,GAAA,CAAI,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAAG,CAAC,CAAA;AAAA,SAAA,IACxG,CAAA,KAAM,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,MAAM;AAAE,MAAA,IAAA,CAAK,aAAA,EAAc;AAAG,MAAA,KAAK,KAAK,GAAA,CAAI,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAA,CAAK,MAAM,KAAA,EAAO,MAAA,IAAU,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,IAAG,CAAC,CAAA;AAAA,SAAA,IACtJ,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAQ,YAAA,CAAa,WAAW,CAAA,KAAM,OAAA,GAAU,QAAQ,OAAO,CAAA;AAAA,SAAA,IACvH,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAQ,YAAA,CAAa,WAAW,CAAA,KAAM,OAAA,GAAU,QAAQ,OAAO,CAAA;AAAA,SAAA,IACvH,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,OAAU,mBAAA,EAAoB;AAAA,SAAA,IACjD,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,OAAU,gBAAA,EAAiB;AAAA,SAAA,IAC9C,MAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,KAAK,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,KAAK,MAAA,CAAO,YAAA,CAAa,WAAW,CAAA,KAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,SAAA,IAC9I,MAAM,QAAA,EAAU;AACvB,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAW,CAAA,KAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAA,WAAA,IAC1F,IAAA,CAAK,QAAQ,YAAA,CAAa,WAAW,MAAM,KAAA,EAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,WAAA,IACrE,KAAK,MAAA,EAAQ;AAAE,QAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AAAI,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MAAG,CAAA,MAAA,IACpD,QAAA,CAAS,iBAAA,KAAsB,IAAA,CAAK,KAAK,OAAA,GAAU,KAAA;AAAA,WAAA,IACnD,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,IACpD,OACK,OAAA,GAAU,KAAA;AACf,IAAA,IAAI,OAAA,IAAW,cAAA,EAAe;AAAA,EAChC;AAAA;AAAA,EAIQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,QAAQ,CAAC,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA,OAAa,kBAAA,EAAmB;AAAA,cACtD,iBAAA,EAAkB;AAAA,EAC9B;AAAA;AAAA,EAGA,iBAAA,GAAmC;AACjC,IAAA,IAAI,KAAK,IAAA,IAAQ,CAAC,IAAA,CAAK,IAAA,CAAK,IAAI,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,KAAA,EAAM;AAAG,MAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,IAAK;AACvF,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,+BAA+B,iCAAiC,CAAA;AAC5F,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,OAAA,CAAQ,KAAK,sHAAsH,CAAA;AAAG,MAAA,OAAO,IAAA;AAAA,IAAM;AAC/J,IAAA,MAAM,MAAM,GAAA,CAAI,QAAA;AAChB,IAAA,GAAA,CAAI,KAAA,GAAQ,gBAAA;AACZ,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,IAAA,KAAA,CAAM,WAAA,GAAc,QAAA;AACpB,IAAA,GAAA,CAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAC1B,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,KAAK,OAAA,CAAQ,MAAA;AACvC,IAAA,GAAA,CAAI,IAAA,CAAK,SAAA,GAAY,CAAA,mCAAA,EAAsC,KAAK,MAAM,MAAM,CAAA;AAAA,wFAAA,EACU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,CAAA;AAOxK,IAAA,MAAM,MAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,KAAK,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,QAAQ,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA,MAAO,CAAC,CAAA,GAAI,IAAI,aAAA,CAAc,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA;AACrH,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,MAAM,UAAU,MAAM;AAAE,MAAA,IAAI,KAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,GAAA,KAAQ,GAAA,OAAU,kBAAA,EAAmB;AAAA,IAAG,CAAA;AAC3F,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAAE,MAAA,GAAA,CAAI,KAAA,CAAO,cAAc,KAAA,CAAM,IAAA,CAAK,KAAI,GAAI,IAAA,CAAK,KAAM,OAAO,CAAA;AAAA,IAAG,GAAG,GAAI,CAAA;AAC1G,IAAA,IAAA,CAAK,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,KAAK,OAAA,EAAQ;AAChD,IAAC,GAAA,CAAI,aAAA,CAAc,aAAa,CAAA,CAAkB,gBAAA,CAAiB,SAAS,MAAM,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAClG,IAAC,GAAA,CAAI,aAAA,CAAc,UAAU,CAAA,CAAkB,gBAAA,CAAiB,SAAS,MAAM,KAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAC/F,IAAC,IAAI,aAAA,CAAc,WAAW,CAAA,CAAkB,gBAAA,CAAiB,SAAS,MAAM;AAAE,MAAA,IAAA,CAAK,IAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI;AAAG,MAAA,GAAA,CAAI,MAAO,WAAA,GAAc,OAAA;AAAA,IAAS,CAAC,CAAA;AACtJ,IAAA,IAAI,KAAK,OAAA,CAAQ,QAAA,MAAc,gBAAA,CAAiB,SAAA,EAAW,KAAK,KAAK,CAAA;AACrE,IAAA,GAAA,CAAI,gBAAA,GAAmB,YAAY,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACnC,IAAA,KAAK,KAAK,YAAA,EAAa;AACvB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,aAAA,CAAc,EAAE,KAAK,CAAA;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI;AAAE,MAAA,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,KAAK,CAAA;AAAG,MAAA,CAAA,CAAE,GAAA,CAAI,mBAAA,GAAsB,UAAA,EAAY,CAAA,CAAE,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAmC;AAChK,IAAA,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ;AAAE,MAAA,IAAI;AAAE,QAAA,CAAA,CAAE,IAAI,KAAA,EAAM;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAe;AAAA,IAAE;AAAA,EACrE;AAAA;AAAA,EAGQ,MAAA,GAAe;AACrB,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ;AACxB,IAAA,MAAM,CAAA,GAAI,EAAE,GAAA,CAAI,GAAA;AAChB,IAAA,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA;AAAA,EAC5E;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,IAAI,IAAA,CAAK,IAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,GAAA,CAAI,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,EAAC;AAC1B,IAAA,MAAM,KAAA,GAAQ,EAAE,SAAA,IAAa,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,EAAE,SAAA,IAAa,EAAA;AAC3B,IAAA,CAAA,CAAE,GAAA,CAAI,KAAA,CAAO,WAAA,GAAc,KAAA,GAAQ,IAAI,CAAA,EAAG,CAAA,CAAE,SAAA,IAAa,CAAA,GAAI,EAAE,SAAA,GAAY,CAAA,GAAI,QAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,GAAK,EAAA;AAClG,IAAA,CAAA,CAAE,GAAA,CAAI,KAAA,CAAO,WAAA,GAAc,CAAA,CAAE,WAAA,EAAa,IAAA,KAAS,GAAA,GAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,IAAQ,EAAA,GAAK,EAAA,CAAA;AAEpF,IAAA,MAAM,IAAA,GAAO,MAAM,CAAA,GAAI,CAAA,GAAI,KAAK,SAAA,GAAY,KAAA,CAAM,IAAI,CAAA,EAAG,SAAA;AACzD,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,CAAA,CAAE,SAAA,KAAc,SAAA,IAAa,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,CAAE,KAAA;AAC9F,IAAA,CAAA,CAAE,GAAA,CAAI,MAAO,WAAA,GAAc,KAAA;AAC3B,IAAA,CAAA,CAAE,IAAI,KAAA,CAAO,YAAA,CAAa,cAAc,MAAA,CAAO,KAAA,KAAU,EAAE,CAAC,CAAA;AAC5D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC1B,IAAA,CAAA,CAAE,IAAI,OAAA,CAAS,YAAA,CAAa,YAAY,MAAA,CAAO,CAAC,IAAI,CAAC,CAAA;AACrD,IAAA,MAAM,MAAM,IAAA,GAAO,IAAA,CAAK,OAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AACjD,IAAA,IAAI,KAAK,CAAA,CAAE,GAAA,CAAI,IAAA,CAAM,YAAA,CAAa,OAAO,GAAG,CAAA;AAAA,SAAQ,CAAA,CAAE,GAAA,CAAI,IAAA,CAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvF;AAAA;AAAA,EAIQ,SAAA,GAAoB;AAAE,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAA,IAAS,IAAI,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AAAA,EAAG;AAAA,EAChF,YAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAW,CAAA,KAAM,MAAA;AAAA,EAAQ;AAAA,EAEvF,cAAA,GAAuB;AAC7B,IAAA,IAAI,IAAA,CAAK,cAAa,EAAG;AAAE,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAG,MAAA;AAAA,IAAQ;AACvF,IAAA,IAAI,IAAA,CAAK,SAAA,EAAU,CAAE,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,MAAM,KAAA,EAAM;AAC3C,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAA,EAAa,MAAM,CAAA;AAChD,IAAA,KAAK,KAAK,YAAA,EAAa;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,mBAAmB,YAAY;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,MAAM,UAAA,CAAW;AAAA,UAC1B,KAAA,EAAO,OAAA;AAAA,UAAS,EAAA,EAAI,SAAA;AAAA,UAAW,IAAA,EAAM,YAAA;AAAA,UAAc,OAAA,EAAS,IAAA;AAAA,UAAM,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACjI,SAAS,CAAA,GAAA,KAAO;AAAE,YAAA,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,KAAe,CAAA;AAAG,YAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,UAAG;AAAA,SACvG,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,IAAA,CAAK,8DAA8D,GAAG,CAAA;AAC9E,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,MACvB;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGQ,UAAU,IAAA,EAAkC;AAClD,IAAA,MAAM,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,IAAI,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,KAAc,IAAI,CAAA;AACvE,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,KAAK,CAAA,GAAI,MAAA;AAAA,EAC1E;AAAA,EAEQ,QAAQ,SAAA,EAAyB;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,SAAS,CAAA;AACzC,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AACvC,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,KAAK,OAAA,CAAQ,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAC,CAAC,CAAA;AACxE,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,WAAA,CAAY,WAAA,EAAa,MAAA,CAAO,IAAI,CAAC,CAAA;AACvD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,WAAA,CAAY,YAAA,EAAc,GAAG,KAAK,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAClE,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AACxB,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,aAAa,CAAC,CAAA;AACrD,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,MAAA,IAAA,CAAK,aAAa,cAAA,EAAgB,MAAA,CAAO,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,CAAA,KAAM,OAAO,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA,qDAAA,EAAwD,CAAA,GAAI,CAAC,CAAA,+CAAA,CAAA;AAC9E,MAAC,KAAK,aAAA,CAAc,eAAe,CAAA,CAAkB,WAAA,GAAc,EAAE,IAAA,IAAQ,EAAA;AAC7E,MAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM;AAAE,QAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAG,QAAA,IAAA,CAAK,aAAA,EAAc;AAAG,QAAA,KAAK,KAAK,GAAA,CAAI,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MAAG,CAAC,CAAA;AAC/J,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,IAAI,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAClB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AAAA,EACrB;AAAA,EAEQ,UAAU,IAAA,EAAoB;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAO,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AAAI,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AACxB,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,IAAA,CAAK,UAAU,CAAA;AAAA,EACxC;AAAA,EAEQ,OAAO,CAAA,EAAiB;AAC9B,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAA,CAAK,OAAO,QAAQ,CAAA;AACtC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5D,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,CAAA,KAAM,IAAA,CAAK,WAAW,CAAC,CAAC,CAAA;AACvF,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA,EAAG,iBAAiB,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,EAChE;AAAA,EAEQ,kBAAkB,CAAA,EAA2B;AACnD,IAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,MAAA,CAAO,MAAM,gBAAA,CAAiB,WAAW,CAAC,CAAA,IAAK,CAAA;AACxE,IAAA,QAAQ,EAAE,GAAA;AAAK,MACb,KAAK,YAAA;AAAc,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,CAAC,CAAA;AAAG,QAAA,OAAO,IAAA;AAAA,MAC7D,KAAK,WAAA;AAAa,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,CAAC,CAAA;AAAG,QAAA,OAAO,IAAA;AAAA,MAC5D,KAAK,WAAA;AAAa,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,IAAI,CAAA;AAAG,QAAA,OAAO,IAAA;AAAA,MAC/D,KAAK,SAAA;AAAW,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,IAAI,CAAA;AAAG,QAAA,OAAO,IAAA;AAAA,MAC7D,KAAK,OAAA,EAAS;AAAE,QAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAAa,QAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAG,QAAA,IAAA,CAAK,aAAA,EAAc;AAAG,QAAA,KAAK,KAAK,GAAA,CAAI,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAG,QAAA,OAAO,IAAA;AAAA,MAAM;AAAA,MACtL,KAAK,QAAA;AAAU,QAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAAG,QAAA,OAAO,IAAA;AAAA,MAC1E;AAAS,QAAA,OAAO,SAAA,CAAU,IAAI,CAAA,CAAE,GAAG,KAAK,SAAA,CAAU,GAAA,CAAI,EAAE,GAAG,CAAA;AAAA;AAC7D,EACF;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAO,MAAA;AAAA,IAAQ;AAChD,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,KAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EACtC;AAAA,EAEQ,gBAAgB,CAAA,EAAuB;AAC7C,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AAAQ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACrC,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,EAAA,GAAK,EAAE,OAAA,GAAU,CAAA,CAAE,GAAG,EAAA,GAAK,CAAA,CAAE,UAAU,CAAA,CAAE,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,MAAM,EAAA,GAAK,CAAA,GAAI,KAAK,IAAA,EAAK,GAAI,IAAA,CAAK,IAAA,EAAK,CAAE,CAAA;AAAA,EAC/D;AACF","file":"Presenter.js","sourcesContent":["import type { Movie, StopEvent } from './core/Movie';\nimport type { Stop } from './core/stops';\nimport { warnUnknownOptions } from './core/options';\n\nexport interface PresenterOptions {\n canvas: HTMLCanvasElement;\n /** Keys on the page: arrows, Space, Enter, PageUp / PageDown, Home / End, page number + Enter, B / W, F, ?, Esc. Default true. */\n keyboard?: boolean;\n /** A click (or tap) on the picture is \"next\". Default true. */\n clickToAdvance?: boolean;\n /** A swipe to the left is \"next\", to the right \"back\" (touch screens). Default true. */\n swipe?: boolean;\n /** The page counter, the page name and a progress line (they fade out when nothing happens). Default true. */\n indicator?: boolean;\n /** Stops with `advance: seconds` move on by themselves. Default true. */\n autoAdvance?: boolean;\n /** Run off the end: go back to the start and play again (a kiosk, a looping demo). Default false. */\n loop?: boolean;\n /** The accent of the progress line (any CSS colour). */\n accent?: string;\n /** Called when the audience-facing session is over: Escape with nothing left to close, or fullscreen left. (`Controller`'s Present button uses it to bring its bar back.) */\n onExit?: () => void;\n}\n\nconst OPTION_KEYS = ['canvas', 'keyboard', 'clickToAdvance', 'swipe', 'indicator', 'autoAdvance', 'loop', 'accent', 'onExit'] as const;\nconst NEXT_KEYS = new Set(['ArrowRight', 'ArrowDown', ' ', 'Enter', 'PageDown']);\nconst PREV_KEYS = new Set(['ArrowLeft', 'ArrowUp', 'Backspace', 'PageUp']);\nconst clock = (ms: number): string => { const s = Math.floor(ms / 1000); return `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`; };\nconst IDLE_MS = 2500;\nconst DIGITS_MS = 2000;\nconst SWIPE_PX = 50;\n\nconst CSS = `\n.movie-presenter { position: absolute; inset: 0; z-index: 3; pointer-events: none; font: 500 13px/1.3 system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif; color: #fff; }\n.movie-presenter .mp-info { position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%); white-space: nowrap; display: flex; align-items: baseline; gap: 12px; padding: 6px 12px; border-radius: 999px; background: rgba(0, 0, 0, 0.45); transition: opacity 0.4s ease; }\n.movie-presenter .mp-title { opacity: 0.75; }\n.movie-presenter .mp-title:empty { display: none; }\n.movie-presenter .mp-counter { font-variant-numeric: tabular-nums; letter-spacing: 0.04em; }\n.movie-presenter .mp-progress { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgba(255, 255, 255, 0.14); transition: opacity 0.4s ease; }\n.movie-presenter .mp-progress::after { content: ''; position: absolute; inset: 0; background: var(--mp-accent, #ffffff); transform-origin: 0 50%; transform: scaleX(var(--mp-fill, 0)); transition: transform 0.4s ease; }\n.movie-presenter[data-idle=\"true\"] .mp-info, .movie-presenter[data-idle=\"true\"] .mp-progress { opacity: 0; }\n.movie-presenter .mp-cover { position: absolute; inset: 0; z-index: 4; opacity: 0; pointer-events: none; background: #000; transition: opacity 0.25s ease; }\n.movie-presenter .mp-cover[data-mode=\"black\"] { opacity: 1; pointer-events: auto; background: #000; }\n.movie-presenter .mp-cover[data-mode=\"white\"] { opacity: 1; pointer-events: auto; background: #fff; }\n.movie-presenter .mp-jump { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); padding: 10px 22px; border-radius: 12px; background: rgba(0, 0, 0, 0.6); font-size: 34px; font-weight: 600; letter-spacing: 0.06em; opacity: 0; transition: opacity 0.15s ease; }\n.movie-presenter .mp-jump[data-active=\"true\"] { opacity: 1; }\n.movie-presenter .mp-help { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 5; padding: 18px 26px; border-radius: 14px; background: rgba(12, 14, 24, 0.92); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); pointer-events: auto; }\n.movie-presenter .mp-help[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-help h3 { margin: 0 0 10px; font-size: 13px; letter-spacing: 0.12em; opacity: 0.7; }\n.movie-presenter .mp-help dl { display: grid; grid-template-columns: auto auto; gap: 6px 22px; margin: 0; }\n.movie-presenter .mp-help dt { opacity: 0.95; font-weight: 600; white-space: nowrap; }\n.movie-presenter .mp-help dd { margin: 0; opacity: 0.75; }\n.movie-presenter .mp-wait { position: absolute; inset: 0; z-index: 7; display: grid; place-items: center; background: #000; font-size: 13px; letter-spacing: 0.4em; opacity: 0.9; padding-left: 0.4em; }\n.movie-presenter .mp-wait[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-overview { position: absolute; inset: 0; z-index: 6; display: flex; flex-direction: column; gap: 14px; padding: 26px 30px 18px; overflow: auto; background: rgba(8, 10, 18, 0.985); pointer-events: auto; }\n.movie-presenter .mp-overview[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-grid { display: grid; grid-template-columns: repeat(var(--mp-cols, 3), minmax(0, 1fr)); gap: 14px; }\n.movie-presenter .mp-cell { position: relative; aspect-ratio: var(--mp-ratio, 16 / 9); overflow: hidden; border-radius: 8px; background: #000; border: 2px solid transparent; cursor: pointer; }\n.movie-presenter .mp-cell img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.movie-presenter .mp-cell[data-current=\"true\"] { border-color: rgba(255, 255, 255, 0.45); }\n.movie-presenter .mp-cell[data-selected=\"true\"] { border-color: var(--mp-accent, #ffffff); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.18); }\n.movie-presenter .mp-cell-label { position: absolute; left: 0; right: 0; bottom: 0; display: flex; gap: 8px; align-items: baseline; padding: 18px 10px 7px; background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent); font-size: 12px; }\n.movie-presenter .mp-cell-num { font-weight: 700; font-variant-numeric: tabular-nums; }\n.movie-presenter .mp-cell-name { opacity: 0.85; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.movie-presenter .mp-overview-hint { margin-top: auto; opacity: 0.55; font-size: 12px; letter-spacing: 0.04em; }\n[data-pr-wrap] .movie-controller { display: none !important; }\n[data-pr-wrap]:fullscreen { width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background: #000; }\n[data-pr-wrap]:fullscreen > canvas { width: 100% !important; height: 100% !important; max-width: none !important; max-height: none !important; object-fit: contain; border-radius: 0; }\n@media (prefers-reduced-motion: reduce) { .movie-presenter * { transition: none !important; } }\n`;\nfunction installStyles(): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-movie-presenter]')) return;\n const el = document.createElement('style');\n el.setAttribute('data-movie-presenter', '');\n el.textContent = CSS;\n document.head.appendChild(el);\n}\n\nconst HELP: Array<[string, string]> = [\n ['→ ↓ Space Enter PageDown click', 'next (plays to the next stop)'],\n ['← ↑ Backspace PageUp', 'back one stop'],\n ['Home / End', 'first page / last stop'],\n ['number, then Enter', 'jump to that page'],\n ['B or .', 'black screen'],\n ['W or ,', 'white screen'],\n ['G', 'overview of all pages (arrows + Enter, or click)'],\n ['P', 'presenter view: notes, next picture, timer (a second window)'],\n ['F', 'fullscreen'],\n ['Esc', 'close this / black screen / fullscreen'],\n ['swipe ← →', 'next / back (touch)'],\n];\n\nconst VIEW_CSS = `\nhtml, body { margin: 0; height: 100%; background: #0c0e16; color: #e8ecf8; font: 500 15px/1.4 system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif; }\n.pv { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); gap: 18px; height: 100%; padding: 18px; box-sizing: border-box; }\n.pv-label { margin: 0 0 6px; font-size: 11px; font-weight: 700; letter-spacing: 0.18em; opacity: 0.55; }\n.pv-main { display: flex; flex-direction: column; min-height: 0; }\n.pv-now { width: 100%; height: auto; background: #000; border-radius: 8px; }\n.pv-side { display: flex; flex-direction: column; gap: 12px; min-height: 0; }\n.pv-top { display: flex; align-items: baseline; gap: 14px; }\n.pv-count { font-size: 30px; font-weight: 700; font-variant-numeric: tabular-nums; }\n.pv-title { flex: 1; opacity: 0.75; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.pv-timer { font-size: 30px; font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: 0.04em; }\n.pv-nextbox { position: relative; aspect-ratio: var(--pv-ratio, 16 / 9); background: #000; border-radius: 8px; overflow: hidden; }\n.pv-next { display: block; width: 100%; height: 100%; object-fit: cover; }\n.pv-nextbox[data-end=\"true\"] .pv-next { display: none; }\n.pv-end { position: absolute; inset: 0; display: none; place-items: center; opacity: 0.6; letter-spacing: 0.2em; font-size: 12px; }\n.pv-nextbox[data-end=\"true\"] .pv-end { display: grid; }\n.pv-notes { flex: 1; min-height: 80px; overflow: auto; padding: 12px 14px; border-radius: 8px; background: #151927; font-size: 20px; line-height: 1.5; white-space: pre-wrap; }\n.pv-notes[data-empty=\"true\"] { opacity: 0.4; font-size: 14px; }\n.pv-notes[data-empty=\"true\"]::before { content: 'No notes for this page.'; }\n.pv-buttons { display: flex; gap: 10px; }\n.pv button { font: inherit; color: inherit; border: 0; border-radius: 8px; padding: 10px 16px; background: #232a40; cursor: pointer; }\n.pv button:hover { background: #2e3754; }\n.pv .pv-nextbtn { flex: 1; background: #3b5bdb; font-weight: 600; }\n.pv .pv-nextbtn:hover { background: #4c6ef5; }\n.pv .pv-reset { padding: 4px 10px; font-size: 12px; opacity: 0.7; }\n`;\n\n/**\n * A presentation player for a movie with `stops` (`composition.stops`): it stops where the stops are, and moves on with the keys,\n * a click, a tap or a swipe, like slides with animation. It draws only a small page counter, the page name and a progress line (they\n * fade out when idle), and a black / white screen, a list of keys (`?`) and fullscreen (`F`). Use it instead of `Controller` on the page.\n */\nexport class Presenter {\n readonly movie: Movie;\n readonly options: Required<Omit<PresenterOptions, 'accent' | 'onExit'>> & { accent?: string; onExit?: () => void };\n\n private box: HTMLElement;\n private wrappedHere = false;\n private root: HTMLDivElement;\n private counterEl: HTMLElement | null = null;\n private titleEl: HTMLElement | null = null;\n private progressEl: HTMLElement | null = null;\n private coverEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private jumpEl!: HTMLElement;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private digitsTimer: ReturnType<typeof setTimeout> | null = null;\n private advanceTimer: ReturnType<typeof setTimeout> | null = null;\n private loopTimer: ReturnType<typeof setTimeout> | null = null;\n private overviewEl!: HTMLElement;\n private gridEl!: HTMLElement;\n private overviewSel = 0;\n /** A picture of every stop (by stop index), made once before the talk: for the overview and the presenter view's \"next\". */\n private thumbs = new Map<number, string>();\n private thumbsPromise: Promise<void> | null = null;\n private waitEl!: HTMLElement;\n private view: { win: Window; timer: ReturnType<typeof setInterval>; started: number; els: Record<string, HTMLElement>; onClose: () => void } | null = null;\n private digits = '';\n private downAt: { x: number; y: number } | null = null;\n private swiped = false;\n private canvasCursor = '';\n private destroyed = false;\n private wasWrapAttr = false;\n\n private onKey = (e: KeyboardEvent) => this.handleKey(e);\n private onStop = (e: StopEvent) => this.handleStop(e);\n private onSeeked = () => this.refresh();\n private onFrame = () => this.mirror();\n private onEnded = () => this.handleEnded();\n private onPointerDown = (e: PointerEvent) => { this.downAt = { x: e.clientX, y: e.clientY }; this.swiped = false; };\n private onPointerUp = (e: PointerEvent) => this.handlePointerUp(e);\n private onPointerMove = () => this.wake();\n private onClick = () => this.handleClick();\n private wasFullscreen = false;\n private onFullscreenChange = () => {\n const now = document.fullscreenElement === this.box;\n if (this.wasFullscreen && !now) this.options.onExit?.();\n this.wasFullscreen = now;\n };\n\n constructor(movie: Movie, options: PresenterOptions) {\n if (!options || !options.canvas) throw new Error('Presenter requires options.canvas (HTMLCanvasElement).');\n warnUnknownOptions('Presenter', options, OPTION_KEYS);\n this.movie = movie;\n this.options = {\n canvas: options.canvas, keyboard: options.keyboard ?? true, clickToAdvance: options.clickToAdvance ?? true, swipe: options.swipe ?? true,\n indicator: options.indicator ?? true, autoAdvance: options.autoAdvance ?? true, loop: options.loop ?? false, accent: options.accent, onExit: options.onExit,\n };\n if ((movie.stops?.length ?? 0) === 0) {\n console.warn('pixi-effects: Presenter: this movie has no stops, so there is nowhere to pause; add `stops: [2, 5, 9]` (seconds) to the composition. next() and back still work.');\n }\n installStyles();\n const canvas = this.options.canvas;\n this.box = this.positioningBox(canvas);\n this.wasWrapAttr = this.box.hasAttribute('data-pr-wrap');\n this.box.setAttribute('data-pr-wrap', '');\n this.root = document.createElement('div');\n this.root.className = 'movie-presenter';\n this.root.setAttribute('data-idle', 'false');\n if (this.options.accent) this.root.style.setProperty('--mp-accent', this.options.accent);\n this.root.innerHTML = `\n ${this.options.indicator ? '<div class=\"mp-progress\"></div><div class=\"mp-info\"><span class=\"mp-title\"></span><span class=\"mp-counter\"></span></div>' : ''}\n <div class=\"mp-wait\" data-open=\"false\">Preparing…</div>\n <div class=\"mp-jump\" data-active=\"false\"></div>\n <div class=\"mp-overview\" data-open=\"false\" role=\"dialog\" aria-label=\"Pages\"><div class=\"mp-grid\"></div><div class=\"mp-overview-hint\">← → ↑ ↓ choose · Enter or click: go · G or Esc: close</div></div>\n <div class=\"mp-cover\" data-mode=\"off\"></div>\n <div class=\"mp-help\" data-open=\"false\" role=\"dialog\" aria-label=\"Keys\"><h3>KEYS</h3><dl>${HELP.map(([k, d]) => `<dt>${k}</dt><dd>${d}</dd>`).join('')}</dl></div>`;\n this.box.appendChild(this.root);\n this.counterEl = this.root.querySelector('.mp-counter');\n this.titleEl = this.root.querySelector('.mp-title');\n this.progressEl = this.root.querySelector('.mp-progress');\n this.coverEl = this.root.querySelector('.mp-cover') as HTMLElement;\n this.helpEl = this.root.querySelector('.mp-help') as HTMLElement;\n this.jumpEl = this.root.querySelector('.mp-jump') as HTMLElement;\n this.waitEl = this.root.querySelector('.mp-wait') as HTMLElement;\n this.overviewEl = this.root.querySelector('.mp-overview') as HTMLElement;\n this.gridEl = this.root.querySelector('.mp-grid') as HTMLElement;\n this.coverEl.addEventListener('click', () => this.setCover('off'));\n\n this.canvasCursor = canvas.style.cursor;\n if (this.options.clickToAdvance) { canvas.style.cursor = 'pointer'; canvas.addEventListener('click', this.onClick); }\n if (this.options.swipe) { canvas.addEventListener('pointerdown', this.onPointerDown); canvas.addEventListener('pointerup', this.onPointerUp); }\n canvas.addEventListener('pointermove', this.onPointerMove);\n if (this.options.keyboard) document.addEventListener('keydown', this.onKey);\n document.addEventListener('fullscreenchange', this.onFullscreenChange);\n movie.on('stop', this.onStop);\n movie.on('seeked', this.onSeeked);\n movie.on('ended', this.onEnded);\n this.refresh();\n this.wake();\n }\n\n /** Enter presentation: ask for fullscreen (a browser needs a click or key press for that) and play to the first stop. */\n async start(): Promise<void> {\n this.waitEl.setAttribute('data-open', 'true'); // \"Preparing\": the pictures are made before the audience sees a thing\n try { await this.ensureThumbs(); } finally { this.waitEl.setAttribute('data-open', 'false'); }\n await this.enterFullscreen();\n await this.next();\n }\n\n /** Leave fullscreen. */\n async exit(): Promise<void> {\n if (document.fullscreenElement === this.box) await document.exitFullscreen?.().catch(() => {});\n }\n\n next(): Promise<void> { this.cancelAdvance(); return this.run(() => this.movie.next()); }\n prev(): Promise<void> { this.cancelAdvance(); return this.run(() => this.movie.prev()); }\n\n /** Black out (`'black'`), white out (`'white'`) or bring the picture back (`'off'`). */\n setCover(mode: 'black' | 'white' | 'off'): void {\n this.coverEl.setAttribute('data-mode', mode);\n if (mode !== 'off') this.cancelAdvance();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n const canvas = this.options.canvas;\n document.removeEventListener('keydown', this.onKey);\n document.removeEventListener('fullscreenchange', this.onFullscreenChange);\n canvas.removeEventListener('click', this.onClick);\n canvas.removeEventListener('pointerdown', this.onPointerDown);\n canvas.removeEventListener('pointerup', this.onPointerUp);\n canvas.removeEventListener('pointermove', this.onPointerMove);\n this.closePresenterView();\n this.movie.off('stop', this.onStop);\n this.movie.off('seeked', this.onSeeked);\n this.movie.off('ended', this.onEnded);\n for (const t of [this.idleTimer, this.digitsTimer, this.advanceTimer, this.loopTimer]) if (t) clearTimeout(t);\n canvas.style.cursor = this.canvasCursor;\n this.root.remove();\n if (!this.wasWrapAttr) this.box.removeAttribute('data-pr-wrap');\n if (this.wrappedHere) {\n const parent = this.box.parentElement;\n if (parent) { parent.insertBefore(canvas, this.box); this.box.remove(); }\n }\n }\n\n // ── internals ──\n\n private positioningBox(canvas: HTMLCanvasElement): HTMLElement {\n const parent = canvas.parentElement;\n if (!parent) throw new Error('Presenter: canvas must be attached to the DOM before constructing.');\n const pos = getComputedStyle(parent).position;\n if (pos === 'relative' || pos === 'absolute' || pos === 'fixed' || pos === 'sticky') return parent;\n const wrap = document.createElement('div');\n wrap.className = 'movie-presenter-wrap';\n wrap.style.cssText = 'position: relative; display: inline-block; line-height: 0;';\n parent.insertBefore(wrap, canvas);\n wrap.appendChild(canvas);\n this.wrappedHere = true;\n return wrap;\n }\n\n private run(fn: () => Promise<void>): Promise<void> {\n return fn().catch(err => { console.warn('pixi-effects: Presenter:', err); });\n }\n\n private async enterFullscreen(): Promise<void> {\n const box = this.box as HTMLElement & { requestFullscreen?: () => Promise<void> };\n try { await box.requestFullscreen?.(); } catch { /* the browser said no (no gesture, or iPhone Safari): present in the page */ }\n }\n\n private toggleFullscreen(): void {\n if (document.fullscreenElement === this.box) void this.exit();\n else void this.enterFullscreen();\n }\n\n private cancelAdvance(): void {\n if (this.advanceTimer) { clearTimeout(this.advanceTimer); this.advanceTimer = null; }\n if (this.loopTimer) { clearTimeout(this.loopTimer); this.loopTimer = null; }\n }\n\n private handleStop(e: StopEvent): void {\n this.refresh();\n this.cancelAdvance();\n if (this.options.autoAdvance && e.stop.advance !== undefined && this.coverEl.getAttribute('data-mode') === 'off') {\n this.advanceTimer = setTimeout(() => { this.advanceTimer = null; void this.next(); }, e.stop.advance * 1000);\n }\n }\n\n private handleEnded(): void {\n this.refresh();\n if (!this.options.loop) return;\n this.cancelAdvance();\n this.loopTimer = setTimeout(() => {\n this.loopTimer = null;\n void this.run(async () => { await this.movie.gotoFrame(0, true); await this.movie.next(); });\n }, 800);\n }\n\n private refresh(): void {\n const m = this.movie;\n const pages = m.pageCount ?? 0, stops = m.stops?.length ?? 0;\n if (this.counterEl) {\n this.counterEl.textContent = pages > 0 ? `${m.pageIndex >= 0 ? m.pageIndex + 1 : '–'} / ${pages}` : '';\n this.counterEl.style.display = pages > 0 ? '' : 'none';\n }\n if (this.titleEl) this.titleEl.textContent = m.currentStop?.page ?? '';\n if (this.progressEl) this.progressEl.style.setProperty('--mp-fill', String(stops > 0 ? (m.stopIndex + 1) / stops : 0));\n this.refreshView();\n }\n\n private wake(): void {\n this.root.setAttribute('data-idle', 'false');\n if (this.options.clickToAdvance) this.options.canvas.style.cursor = 'pointer';\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = setTimeout(() => {\n this.root.setAttribute('data-idle', 'true');\n this.options.canvas.style.cursor = 'none';\n }, IDLE_MS);\n }\n\n private showDigits(): void {\n this.jumpEl.textContent = this.digits ? `→ ${this.digits}` : '';\n this.jumpEl.setAttribute('data-active', this.digits ? 'true' : 'false');\n if (this.digitsTimer) clearTimeout(this.digitsTimer);\n this.digitsTimer = this.digits ? setTimeout(() => { this.digits = ''; this.showDigits(); }, DIGITS_MS) : null;\n }\n\n /** Something that moves the presentation: if the screen is blacked out (or the key list is open) the first press only brings it back. */\n private navigate(go: () => void): void {\n if (this.coverEl.getAttribute('data-mode') !== 'off') { this.setCover('off'); return; }\n if (this.helpEl.getAttribute('data-open') === 'true') { this.helpEl.setAttribute('data-open', 'false'); return; }\n go();\n }\n\n private handleKey(e: KeyboardEvent): void {\n if (this.destroyed || e.ctrlKey || e.metaKey || e.altKey) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.tagName === 'SELECT' || t.isContentEditable)) return;\n const k = e.key;\n let handled = true;\n this.wake();\n if (k === 'g' || k === 'G') { this.toggleOverview(); e.preventDefault(); return; }\n if (this.overviewOpen()) { if (this.handleOverviewKey(e)) e.preventDefault(); return; }\n if (k >= '0' && k <= '9' && k.length === 1) { this.digits = (this.digits + k).slice(0, 4); this.showDigits(); }\n else if (k === 'Enter' && this.digits) {\n const page = Number(this.digits) - 1; this.digits = ''; this.showDigits();\n this.navigate(() => { this.cancelAdvance(); void this.run(() => this.movie.goToPage(page)); });\n }\n else if (k === 'Backspace' && this.digits) { this.digits = this.digits.slice(0, -1); this.showDigits(); }\n else if (NEXT_KEYS.has(k)) this.navigate(() => void this.next());\n else if (PREV_KEYS.has(k)) this.navigate(() => void this.prev());\n else if (k === 'Home') this.navigate(() => { this.cancelAdvance(); void this.run(() => this.movie.goToPage(0)); });\n else if (k === 'End') this.navigate(() => { this.cancelAdvance(); void this.run(() => this.movie.goToStop(Math.max(0, (this.movie.stops?.length ?? 1) - 1))); });\n else if (k === 'b' || k === 'B' || k === '.') this.setCover(this.coverEl.getAttribute('data-mode') === 'black' ? 'off' : 'black');\n else if (k === 'w' || k === 'W' || k === ',') this.setCover(this.coverEl.getAttribute('data-mode') === 'white' ? 'off' : 'white');\n else if (k === 'p' || k === 'P') this.togglePresenterView();\n else if (k === 'f' || k === 'F') this.toggleFullscreen();\n else if (k === '?' || k === 'h' || k === 'H') this.helpEl.setAttribute('data-open', this.helpEl.getAttribute('data-open') === 'true' ? 'false' : 'true');\n else if (k === 'Escape') {\n if (this.helpEl.getAttribute('data-open') === 'true') this.helpEl.setAttribute('data-open', 'false');\n else if (this.coverEl.getAttribute('data-mode') !== 'off') this.setCover('off');\n else if (this.digits) { this.digits = ''; this.showDigits(); }\n else if (document.fullscreenElement === this.box) handled = false; // the browser's own Escape leaves fullscreen (and the change ends the session)\n else if (this.options.onExit) this.options.onExit();\n }\n else handled = false;\n if (handled) e.preventDefault();\n }\n\n // ── the presenter view: a second window for the speaker ──\n\n private togglePresenterView(): void {\n if (this.view && !this.view.win.closed) this.closePresenterView();\n else this.openPresenterView();\n }\n\n /** Open the speaker's window: what is on screen (live), the next picture, the notes of the page, a timer, and next / back. Returns it (null if the browser blocked the popup). */\n openPresenterView(): Window | null {\n if (this.view && !this.view.win.closed) { this.view.win.focus(); return this.view.win; }\n this.closePresenterView();\n const win = window.open('', 'pixi-effects-presenter-view', 'popup=yes,width=1180,height=720');\n if (!win) { console.warn('pixi-effects: Presenter: the browser blocked the presenter view popup; allow popups for this page and press P again.'); return null; }\n const doc = win.document;\n doc.title = 'Presenter view';\n const style = doc.createElement('style');\n style.textContent = VIEW_CSS;\n doc.head.appendChild(style);\n const { width, height } = this.options.canvas;\n doc.body.innerHTML = `<div class=\"pv\" style=\"--pv-ratio: ${width} / ${height}\">\n <div class=\"pv-main\"><div class=\"pv-label\">NOW</div><canvas class=\"pv-now\" width=\"${Math.min(width, 960)}\" height=\"${Math.round(height * Math.min(width, 960) / width)}\"></canvas></div>\n <div class=\"pv-side\">\n <div class=\"pv-top\"><span class=\"pv-count\"></span><span class=\"pv-title\"></span><span class=\"pv-timer\">00:00</span><button class=\"pv-reset\" type=\"button\">reset</button></div>\n <div><div class=\"pv-label\">NEXT</div><div class=\"pv-nextbox\" data-end=\"false\"><img class=\"pv-next\" alt=\"\"><div class=\"pv-end\">END OF THE TALK</div></div></div>\n <div class=\"pv-notes\" data-empty=\"true\"></div>\n <div class=\"pv-buttons\"><button class=\"pv-prev\" type=\"button\">◀ Back</button><button class=\"pv-nextbtn\" type=\"button\">Next ▶</button></div>\n </div></div>`;\n const els: Record<string, HTMLElement> = {};\n for (const c of ['count', 'title', 'timer', 'next', 'nextbox', 'notes', 'now']) els[c] = doc.querySelector(`.pv-${c}`) as HTMLElement;\n const started = Date.now();\n const onClose = () => { if (this.view && this.view.win === win) this.closePresenterView(); };\n const timer = setInterval(() => { els.timer!.textContent = clock(Date.now() - this.view!.started); }, 1000);\n this.view = { win, timer, started, els, onClose };\n (doc.querySelector('.pv-nextbtn') as HTMLElement).addEventListener('click', () => void this.next());\n (doc.querySelector('.pv-prev') as HTMLElement).addEventListener('click', () => void this.prev());\n (doc.querySelector('.pv-reset') as HTMLElement).addEventListener('click', () => { this.view!.started = Date.now(); els.timer!.textContent = '00:00'; });\n if (this.options.keyboard) doc.addEventListener('keydown', this.onKey);\n win.addEventListener?.('pagehide', onClose);\n this.movie.on('frame', this.onFrame);\n void this.ensureThumbs();\n this.refreshView();\n this.mirror();\n return win;\n }\n\n closePresenterView(): void {\n const v = this.view;\n if (!v) return;\n this.view = null;\n clearInterval(v.timer);\n this.movie.off('frame', this.onFrame);\n try { v.win.document.removeEventListener('keydown', this.onKey); v.win.removeEventListener?.('pagehide', v.onClose); } catch { /* the window is already gone */ }\n if (!v.win.closed) { try { v.win.close(); } catch { /* ignore */ } }\n }\n\n /** Copy what the movie has just drawn into the view (called from the `frame` event, right after the render, when the canvas can be read). */\n private mirror(): void {\n const v = this.view;\n if (!v || v.win.closed) return;\n const c = v.els.now as HTMLCanvasElement;\n c.getContext('2d')?.drawImage(this.options.canvas, 0, 0, c.width, c.height);\n }\n\n private refreshView(): void {\n const v = this.view;\n if (!v || v.win.closed) return;\n const m = this.movie;\n const stops = m.stops ?? [];\n const pages = m.pageCount ?? 0;\n const cur = m.stopIndex ?? -1;\n v.els.count!.textContent = pages > 0 ? `${m.pageIndex >= 0 ? m.pageIndex + 1 : '–'} / ${pages}` : '';\n v.els.title!.textContent = m.currentStop?.page ?? (cur < 0 ? stops[0]?.page ?? '' : '');\n // the notes of the page the talk is in (before the first stop: of the first page, \"coming up\"): the latest ones written on or before this stop\n const upTo = cur < 0 ? 0 : cur, pageIndex = stops[upTo]?.pageIndex;\n let notes = '';\n for (const s of stops) if (s.pageIndex === pageIndex && s.index <= upTo && s.notes) notes = s.notes;\n v.els.notes!.textContent = notes;\n v.els.notes!.setAttribute('data-empty', String(notes === ''));\n const next = stops[cur + 1];\n v.els.nextbox!.setAttribute('data-end', String(!next));\n const src = next ? this.thumbs.get(next.index) : undefined;\n if (src) v.els.next!.setAttribute('src', src); else v.els.next!.removeAttribute('src');\n }\n\n // ── the overview ──\n\n private pageStops(): Stop[] { return (this.movie.stops ?? []).filter(s => s.pageStart); }\n private overviewOpen(): boolean { return this.overviewEl.getAttribute('data-open') === 'true'; }\n\n private toggleOverview(): void {\n if (this.overviewOpen()) { this.overviewEl.setAttribute('data-open', 'false'); return; }\n if (this.pageStops().length === 0) return;\n this.cancelAdvance();\n if (this.movie.isPlaying) this.movie.pause();\n this.helpEl.setAttribute('data-open', 'false');\n this.buildOverview();\n this.overviewEl.setAttribute('data-open', 'true');\n void this.ensureThumbs();\n }\n\n /**\n * Make a picture of every stop, once. Taking them moves the playhead through the stops and back, which the audience would see:\n * `start()` does it before anything is shown (behind a \"Preparing\" cover), and an overview opened before that does it on the spot.\n */\n ensureThumbs(): Promise<void> {\n this.thumbsPromise ??= (async () => {\n try {\n await this.movie.stopImages({\n which: 'stops', as: 'dataURL', type: 'image/jpeg', quality: 0.72, scale: Math.min(1, 480 / Math.max(1, this.options.canvas.width)),\n onImage: img => { this.thumbs.set(img.stop.index, img.image as string); this.onThumb(img.stop.index); },\n });\n } catch (err) {\n console.warn('pixi-effects: Presenter: could not make the page pictures:', err);\n this.thumbsPromise = null;\n }\n })();\n return this.thumbsPromise;\n }\n\n /** A page's picture is its last stop's (the page fully built). */\n private pageThumb(page: number): string | undefined {\n const stops = (this.movie.stops ?? []).filter(s => s.pageIndex === page);\n return stops.length ? this.thumbs.get(stops[stops.length - 1]!.index) : undefined;\n }\n\n private onThumb(stopIndex: number): void {\n const stop = this.movie.stops?.[stopIndex];\n if (stop) this.fillThumb(stop.pageIndex);\n this.refreshView();\n }\n\n private buildOverview(): void {\n const pages = this.pageStops();\n const { width, height } = this.options.canvas;\n const cols = Math.min(5, Math.max(2, Math.ceil(Math.sqrt(pages.length))));\n this.gridEl.style.setProperty('--mp-cols', String(cols));\n this.gridEl.style.setProperty('--mp-ratio', `${width} / ${height}`);\n this.gridEl.innerHTML = '';\n const current = Math.max(0, this.movie.pageIndex ?? 0);\n pages.forEach((s, i) => {\n const cell = document.createElement('div');\n cell.className = 'mp-cell';\n cell.setAttribute('data-current', String(i === this.movie.pageIndex));\n cell.setAttribute('data-selected', String(i === current));\n cell.innerHTML = `<div class=\"mp-cell-label\"><span class=\"mp-cell-num\">${i + 1}</span><span class=\"mp-cell-name\"></span></div>`;\n (cell.querySelector('.mp-cell-name') as HTMLElement).textContent = s.page ?? '';\n cell.addEventListener('click', () => { this.overviewEl.setAttribute('data-open', 'false'); this.cancelAdvance(); void this.run(() => this.movie.goToPage(i)); });\n this.gridEl.appendChild(cell);\n this.fillThumb(i);\n });\n this.overviewSel = current;\n }\n\n private fillThumb(page: number): void {\n const cell = this.gridEl.children[page] as HTMLElement | undefined;\n const src = this.pageThumb(page);\n if (!cell || !src || cell.querySelector('img')) return;\n const img = document.createElement('img');\n img.alt = ''; img.src = src;\n cell.insertBefore(img, cell.firstChild);\n }\n\n private select(i: number): void {\n const cells = [...this.gridEl.children] as HTMLElement[];\n this.overviewSel = Math.min(cells.length - 1, Math.max(0, i));\n cells.forEach((c, k) => c.setAttribute('data-selected', String(k === this.overviewSel)));\n cells[this.overviewSel]?.scrollIntoView?.({ block: 'nearest' });\n }\n\n private handleOverviewKey(e: KeyboardEvent): boolean {\n const cols = Number(this.gridEl.style.getPropertyValue('--mp-cols')) || 3;\n switch (e.key) {\n case 'ArrowRight': this.select(this.overviewSel + 1); return true;\n case 'ArrowLeft': this.select(this.overviewSel - 1); return true;\n case 'ArrowDown': this.select(this.overviewSel + cols); return true;\n case 'ArrowUp': this.select(this.overviewSel - cols); return true;\n case 'Enter': { const page = this.overviewSel; this.overviewEl.setAttribute('data-open', 'false'); this.cancelAdvance(); void this.run(() => this.movie.goToPage(page)); return true; }\n case 'Escape': this.overviewEl.setAttribute('data-open', 'false'); return true;\n default: return NEXT_KEYS.has(e.key) || PREV_KEYS.has(e.key); // swallowed: the presentation does not move underneath\n }\n }\n\n private handleClick(): void {\n if (this.swiped) { this.swiped = false; return; }\n this.wake();\n this.navigate(() => void this.next());\n }\n\n private handlePointerUp(e: PointerEvent): void {\n const d = this.downAt; this.downAt = null;\n if (!d) return;\n const dx = e.clientX - d.x, dy = e.clientY - d.y;\n if (Math.abs(dx) < SWIPE_PX || Math.abs(dy) > Math.abs(dx)) return;\n this.swiped = true;\n this.wake();\n this.navigate(() => void (dx < 0 ? this.next() : this.prev()));\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Sequence, lintTiming, lintText, summarizeWarnings, buildSequenceTree, CameraSequence, describeLayer, NullSequence, cameraBasis, homeCamera, collectPropKeys, projectLayer, NEAR, DEG } from './chunk-
|
|
1
|
+
import { Sequence, lintTiming, lintText, summarizeWarnings, buildSequenceTree, CameraSequence, describeLayer, NullSequence, cameraBasis, homeCamera, collectPropKeys, projectLayer, NEAR, DEG } from './chunk-C6QHKYC5.js';
|
|
2
2
|
import { suggestName } from './chunk-DKGG7WD4.js';
|
|
3
3
|
import { Container, Rectangle, PerspectiveMesh, Texture, Matrix, RenderTexture } from 'pixi.js';
|
|
4
|
+
import { gsap } from 'gsap';
|
|
4
5
|
|
|
5
6
|
// src/space/camera.ts
|
|
6
7
|
function pickActiveCamera(cams, t, compEnd) {
|
|
@@ -366,8 +367,10 @@ var CompositionSequence = class extends Sequence {
|
|
|
366
367
|
super.bindTimeline(timeline, offset);
|
|
367
368
|
const childOffset = offset + this.at;
|
|
368
369
|
for (const child of this._children) {
|
|
369
|
-
|
|
370
|
-
child.
|
|
370
|
+
const own = gsap.timeline({ defaults: { ease: "none" } });
|
|
371
|
+
child.bindTimeline(own, childOffset);
|
|
372
|
+
child.maskSequence?.bindTimeline(own, childOffset);
|
|
373
|
+
timeline.add(own, 0);
|
|
371
374
|
}
|
|
372
375
|
const overlap = findOverlap(this._cameras.map((c) => c.window()));
|
|
373
376
|
if (overlap) {
|
|
@@ -489,5 +492,5 @@ function frameOf(child) {
|
|
|
489
492
|
}
|
|
490
493
|
|
|
491
494
|
export { CompositionSequence };
|
|
492
|
-
//# sourceMappingURL=chunk-
|
|
493
|
-
//# sourceMappingURL=chunk-
|
|
495
|
+
//# sourceMappingURL=chunk-3IPDNC3E.js.map
|
|
496
|
+
//# sourceMappingURL=chunk-3IPDNC3E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/space/camera.ts","../src/space/depth.ts","../src/space/Layer3D.ts","../src/space/lint.ts","../src/core/blend.ts","../src/sequences/Composition.ts"],"names":["i","frameOf","Container"],"mappings":"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","file":"chunk-3IPDNC3E.js","sourcesContent":["/** A camera layer's lifespan on the global timeline, seconds. */\nexport interface CameraWindow { start: number; end: number }\n\n/**\n * The active camera at time `t`: the last-listed (top-most) camera whose\n * lifespan covers `t`. Windows are [start, end), except that a camera running\n * to the end of its composition also covers the final instant `t === compEnd`.\n */\nexport function pickActiveCamera<T extends CameraWindow>(\n cams: readonly T[],\n t: number,\n compEnd: number,\n): T | null {\n for (let i = cams.length - 1; i >= 0; i--) {\n const c = cams[i]!;\n const inside = t >= c.start && (t < c.end || (c.end >= compEnd && t <= compEnd));\n if (inside) return c;\n }\n return null;\n}\n\n/** First pair of camera indices whose lifespans strictly overlap, or null. */\nexport function findOverlap(cams: readonly CameraWindow[]): [number, number] | null {\n for (let i = 0; i < cams.length; i++) {\n for (let j = i + 1; j < cams.length; j++) {\n const a = cams[i]!;\n const b = cams[j]!;\n if (a.start < b.end && b.start < a.end) return [i, j];\n }\n }\n return null;\n}\n","export interface DepthItem {\n /** Position in the composition's stack (monotonic; gaps allowed). */\n stackIndex: number;\n threeD: boolean;\n /** Camera-space depth (larger = farther). Only read for threeD items. */\n depth: number;\n}\n\nconst finite = (n: number): number => (Number.isFinite(n) ? n : 0);\n\n/**\n * zIndex per item. Non-3D items keep their stack index. Each run of\n * consecutive threeD items is redistributed over the same index slots,\n * farthest first (drawn first), ties in stack order.\n */\nexport function assignDepthOrder(items: readonly DepthItem[]): number[] {\n const out = items.map(i => i.stackIndex);\n let i = 0;\n while (i < items.length) {\n if (!items[i]!.threeD) { i++; continue; }\n let j = i;\n while (j + 1 < items.length && items[j + 1]!.threeD) j++;\n const run = items.slice(i, j + 1).map((it, k) => ({ it, pos: i + k }));\n const slots = run.map(r => r.it.stackIndex);\n const farthestFirst = [...run].sort((a, b) => finite(b.it.depth) - finite(a.it.depth));\n farthestFirst.forEach((r, k) => { out[r.pos] = slots[k]!; });\n i = j + 1;\n }\n return out;\n}\n","import { Container, Matrix, PerspectiveMesh, RenderTexture, Texture } from 'pixi.js';\nimport type { Sequence } from '../sequences/Base';\nimport { describeLayer } from '../core/lint';\nimport { DEG, NEAR, projectLayer, type CameraBasis, type LayerTransform, type Rect } from './math';\n\n/** Render textures are capped at this many pixels on the long side; larger layers are downscaled. */\nexport const MAX_TEXTURE_SIZE = 4096;\n/**\n * Render textures are drawn at this multiple of the layer size (until the caps),\n * so a layer enlarged by perspective (z > 0) stays sharp instead of showing\n * jagged edges and soft text.\n */\nexport const SUPERSAMPLE = 2;\n/** Total texture pixels per layer are capped here (≈ one 2048² target); resolution drops to fit. */\nexport const MAX_TEXTURE_PIXELS = 2048 * 2048;\n/** MSAA multiplies target memory ~4x, so only small textures get it (supersampling covers the rest). */\nexport const ANTIALIAS_MAX_PIXELS = 1024 * 1024;\n/** Mesh grid per side. 20 keeps steeply tilted planes free of visible affine warping. */\nexport const MESH_GRID = 20;\n\n/** The slice of a Pixi renderer Layer3D needs (also what tests fake). */\nexport interface SpaceHost {\n render(options: {\n container: Container;\n target: RenderTexture;\n transform: Matrix;\n clear: boolean;\n clearColor: number[];\n }): void;\n}\n\ntype Carrier = Container & { z?: number; rotationX?: number; rotationY?: number };\n\ninterface TextureSize { w: number; h: number; resolution: number; antialias: boolean }\n\n/** Sum of the target's filter paddings: the texture must be this much larger on every side or filter output is clipped. */\nfunction filterPadding(target: Container): number {\n const filters = (target as unknown as { filters?: ReadonlyArray<{ padding?: number }> | null }).filters;\n if (!Array.isArray(filters)) return 0;\n let pad = 0;\n for (const f of filters) pad += f?.padding ?? 0;\n return Number.isFinite(pad) && pad > 0 ? Math.ceil(pad) : 0;\n}\n\nexport function readLayerTransform(target: Container): LayerTransform {\n const c = target as Carrier;\n return {\n x: c.x, y: c.y, z: c.z ?? 0,\n rotationX: (c.rotationX ?? 0) * DEG,\n rotationY: (c.rotationY ?? 0) * DEG,\n rotationZ: c.rotation,\n scaleX: c.scale.x, scaleY: c.scale.y,\n pivotX: c.pivot.x, pivotY: c.pivot.y,\n };\n}\n\n/**\n * Draws one `threeD` sequence: its display object is rendered into a\n * RenderTexture (with its own 2D transform replaced, so layer-local content\n * lands at the texture origin) and shown on a PerspectiveMesh whose four\n * corners come from projecting the layer through the active camera.\n *\n * The sequence's `target` is never in the scene graph; the composition adds\n * `display` instead. `z`, `rotationX`, `rotationY` live on `target` as plain\n * numeric props so GSAP tweens them like any other prop.\n */\nexport class Layer3D {\n readonly display: PerspectiveMesh;\n /** Camera-space depth from the last update (larger = farther). */\n depth = 0;\n private rt: RenderTexture | null = null;\n /**\n * Textures replaced by a bigger / smaller one. Destroying one right away warns \"destroyed while still\n * bound\": the mesh's bind group still points at it until the next render. They go at the next update,\n * by which time a frame has been drawn with the new texture.\n */\n private retired: RenderTexture[] = [];\n private size: TextureSize | null = null;\n private warnedBehind = false;\n\n constructor(\n private readonly seq: Sequence,\n private readonly frameOf: () => Rect,\n ) {\n const target = seq.target as Carrier;\n target.z ??= 0;\n target.rotationX ??= 0;\n target.rotationY ??= 0;\n this.display = new PerspectiveMesh({ texture: Texture.WHITE, verticesX: MESH_GRID, verticesY: MESH_GRID });\n if (seq.spec.name) this.display.label = seq.spec.name;\n this.display.visible = false;\n }\n\n update(host: SpaceHost, basis: CameraBasis): void {\n this.flushRetired();\n const target = this.seq.target as Carrier | null;\n // Pixi skips rendering (and clearing) a container that is not `visible`\n // (e.g. PixiPlugin autoAlpha at alpha 0), which would leave a stale texture.\n if (!target || !target.renderable || !target.visible) return this.hide();\n\n const bounds = this.frameOf();\n const pad = filterPadding(target);\n const needW = Math.ceil(bounds.width + 2 * pad);\n const needH = Math.ceil(bounds.height + 2 * pad);\n if (!(needW >= 1 && needH >= 1) || !Number.isFinite(bounds.x) || !Number.isFinite(bounds.y)) return this.hide();\n\n const size = this.sizeFor(needW, needH);\n // The quad covers exactly the texture's pixel rect in layer space.\n const frame: Rect = { x: bounds.x - pad, y: bounds.y - pad, width: size.w, height: size.h };\n const projected = projectLayer(readLayerTransform(target), frame, basis);\n this.depth = projected.depth;\n if (!projected.visible) {\n if (!this.warnedBehind) {\n this.warnedBehind = true;\n if (projected.depth > NEAR) {\n // the layer's own origin is in front of the camera: a tilt or a large size swings a CORNER past the camera plane\n console.warn(\n `pixi-effects: ${describeLayer(this.seq.spec)}: part of it (a corner) reaches the camera plane (z = ${(target.z ?? 0).toFixed(0)}, rotationX ${(target.rotationX ?? 0).toFixed(0)}°, rotationY ${(target.rotationY ?? 0).toFixed(0)}°), ` +\n `and a layer is hidden whole when any corner is at or behind it. Tilt it less (rotationX / rotationY), make it smaller, or keep the camera further away from it ` +\n `(the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`,\n );\n } else {\n console.warn(\n `pixi-effects: ${describeLayer(this.seq.spec)} is at or behind the camera plane (z = ${(target.z ?? 0).toFixed(0)}) and is hidden. ` +\n `If that is unintended, lower its z or move the camera back (the default camera sits at z = (height/2)/tan(fov/2), about 989 for 720p at fov 40).`,\n );\n }\n }\n return this.hide();\n }\n\n this.ensureTexture(size);\n // `transform` replaces the container's own local transform for this render\n // (Pixi RenderGroupSystem), while `container.alpha` still applies — so the\n // texture carries the layer's alpha and the mesh alpha stays at 1.\n host.render({\n container: target,\n target: this.rt!,\n transform: new Matrix().translate(-frame.x, -frame.y),\n clear: true,\n clearColor: [0, 0, 0, 0],\n });\n this.display.geometry.setCorners(...projected.corners);\n this.display.visible = true;\n }\n\n destroy(): void {\n this.display.destroy();\n this.rt?.destroy(true);\n this.rt = null;\n this.flushRetired();\n }\n\n private flushRetired(): void {\n for (const t of this.retired) t.destroy(true);\n this.retired = [];\n }\n\n private hide(): void {\n this.display.visible = false;\n }\n\n /**\n * Texture size for content of w×h. An existing texture is kept while it is at\n * least that big and at most 2x too big, so content whose bounds change every\n * frame (typewriter text, growing shapes) does not reallocate each frame.\n */\n private sizeFor(w: number, h: number): TextureSize {\n const cur = this.size;\n if (cur && cur.w >= w && cur.h >= h && cur.w <= 2 * w && cur.h <= 2 * h) return cur;\n const resolution = Math.min(\n SUPERSAMPLE,\n MAX_TEXTURE_SIZE / Math.max(w, h),\n Math.sqrt(MAX_TEXTURE_PIXELS / (w * h)),\n );\n const antialias = w * h * resolution * resolution <= ANTIALIAS_MAX_PIXELS;\n return { w, h, resolution, antialias };\n }\n\n private ensureTexture(size: TextureSize): void {\n if (this.rt && this.size === size) return;\n // Same sampling: resize the texture where it is. Replacing it makes Pixi warn that the old one was\n // destroyed while still bound, because the mesh keeps pointing at it until the next render.\n if (this.rt && this.size && this.size.antialias === size.antialias) {\n this.rt.resize(size.w, size.h, size.resolution);\n this.size = size;\n return;\n }\n const next = RenderTexture.create({\n width: size.w, height: size.h, resolution: size.resolution, antialias: size.antialias,\n });\n this.display.texture = next;\n if (this.rt) this.retired.push(this.rt);\n this.rt = next;\n this.size = size;\n }\n}\n","import { collectPropKeys } from './specKeys';\nimport { describeLayer } from '../core/lint';\nimport type { SequenceSpec } from '../types';\n\ntype Warn = (message: string) => void;\nconst defaultWarn: Warn = m => console.warn(m);\n\nconst FOV_HINT = 'perspective is the camera\\'s \"fov\" — add a { type: \"camera\" } layer and set fov in its initial / keyframes';\n\n/** Keys that are never valid for any layer, with a hint at what the author probably meant. */\nconst LAYER_ALIASES: Record<string, string> = {\n rotateX: 'did you mean \"rotationX\"?',\n rotateY: 'did you mean \"rotationY\"?',\n rotateZ: 'did you mean \"rotation\"?',\n rotationZ: 'did you mean \"rotation\" (it is the Z rotation)?',\n translateZ: 'did you mean \"z\"?',\n depth: 'did you mean \"z\"?',\n posZ: 'did you mean \"z\"?',\n perspective: FOV_HINT,\n zoom: FOV_HINT,\n};\n\n/** Camera-only mistakes. */\nconst CAMERA_ALIASES: Record<string, string> = {\n pointOfInterest: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n lookAt: 'did you mean \"lookAtX / lookAtY / lookAtZ\"?',\n};\n\nconst CAMERA_PROPS = ['x', 'y', 'z', 'fov', 'lookAtX', 'lookAtY', 'lookAtZ'];\nconst NEEDS_THREE_D = ['z', 'rotationX', 'rotationY'];\nconst SKEW_KEYS = ['skew', 'skewX', 'skewY'];\n\n/**\n * Warn (never throw) about the inputs an AI author is most likely to get wrong,\n * with a message that says what to change. One call per layer, at build time.\n */\nexport function lintSequence(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const keys = collectPropKeys(spec);\n const explained = new Set<string>();\n\n for (const k of keys) {\n const hint = LAYER_ALIASES[k] ?? (spec.type === 'camera' ? CAMERA_ALIASES[k] : undefined);\n if (hint) {\n explained.add(k);\n warn(`pixi-effects: ${who}: \"${k}\" is not a property — ${hint}`);\n }\n }\n\n if (spec.type === 'camera') {\n const raw = spec as unknown as Record<string, unknown>;\n for (const p of CAMERA_PROPS) {\n if (p in raw) warn(`pixi-effects: ${who}: \"${p}\" must go inside initial / keyframes, not on the camera itself`);\n }\n for (const k of Object.keys(raw)) {\n const hint = CAMERA_ALIASES[k] ?? LAYER_ALIASES[k];\n if (hint) warn(`pixi-effects: ${who}: \"${k}\" is not a property — ${hint} (inside initial)`);\n }\n for (const k of keys) {\n if (!explained.has(k) && !CAMERA_PROPS.includes(k)) {\n warn(`pixi-effects: ${who}: \"${k}\" has no effect on a camera (use ${CAMERA_PROPS.join(', ')})`);\n }\n }\n return;\n }\n\n if (spec.type === 'audio') {\n if (spec.threeD) warn(`pixi-effects: ${who}: threeD has no effect on audio`);\n return;\n }\n\n if (!spec.threeD) {\n for (const k of NEEDS_THREE_D) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" needs threeD: true (it is ignored otherwise)`);\n }\n } else {\n for (const k of SKEW_KEYS) {\n if (keys.has(k)) warn(`pixi-effects: ${who}: \"${k}\" is ignored on threeD layers`);\n }\n }\n}\n","import { describeLayer } from './lint';\n\nconst MODES = ['normal', 'add', 'screen', 'multiply'];\n\n/** Apply a layer's `blendMode` to its display object; an unknown mode warns and is ignored. */\nexport function applyBlendMode(spec: { blendMode?: string; name?: string; type: string }, display: { blendMode?: unknown; filters?: unknown }): void {\n const mode = spec.blendMode;\n if (mode === undefined) return;\n if (!MODES.includes(mode)) {\n console.warn(`pixi-effects: ${describeLayer(spec)}: blendMode \"${mode}\" is not supported (use ${MODES.join(', ')})`);\n return;\n }\n // A container's blend mode applies INSIDE a filter's offscreen pass (against transparent black: multiply gave\n // solid black) and not to the filtered result. With filters, the pass that draws onto the backdrop is the last\n // filter's, so the mode goes there; the container stays normal.\n const filters = display.filters;\n if (Array.isArray(filters) && filters.length > 0) {\n (filters[filters.length - 1] as { blendMode?: unknown }).blendMode = mode;\n return;\n }\n display.blendMode = mode;\n}\n","import { Container, Rectangle } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { NullSequence } from './Null';\nimport { suggestName } from '../core/options';\nimport { buildSequenceTree } from '../core/Composition';\nimport { CameraSequence } from '../space/CameraSequence';\nimport { findOverlap, pickActiveCamera } from '../space/camera';\nimport { assignDepthOrder } from '../space/depth';\nimport { Layer3D, type SpaceHost } from '../space/Layer3D';\nimport { lintSequence } from '../space/lint';\nimport { describeLayer, lintText, lintTiming, summarizeWarnings } from '../core/lint';\nimport { applyBlendMode } from '../core/blend';\nimport { cameraBasis, homeCamera } from '../space/math';\nimport type { CompositionSequenceSpec, AudioDescriptor, CompositionShape, SequenceSpec } from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class CompositionSequence extends Sequence {\n declare spec: CompositionSequenceSpec;\n private _innerContainer: Container | null = null;\n private _compositionShape: CompositionShape | null = null;\n _children: Sequence[] = [];\n private _cameras: CameraSequence[] = [];\n private _layers3d: Layer3D[] = [];\n /** Drawn children in stack order (cameras and target-less sequences excluded). */\n private _visual: Array<{ seq: Sequence; layer: Layer3D | null }> = [];\n /** Layers drawn inside a null layer (`parent`): they are not in the composition's own stack. */\n private _nested: Sequence[] = [];\n /** The null layer each parented layer is drawn inside. */\n private _parentOf = new Map<Sequence, NullSequence>();\n\n async build(): Promise<void> {\n const width = this.spec.width ?? this.parent?.width ?? this.root.width;\n const height = this.spec.height ?? this.parent?.height ?? this.root.height;\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? this.parent?.duration ?? this.root.duration;\n }\n const wrapper = new Container();\n wrapper.cullable = true;\n wrapper.cullableChildren = true;\n wrapper.cullArea = new Rectangle(0, 0, width, height);\n\n const inner = new Container();\n inner.cullable = true;\n inner.cullableChildren = true;\n wrapper.addChild(inner);\n\n this.target = wrapper;\n this.intrinsicWidth = width;\n this.intrinsicHeight = height;\n this._innerContainer = inner;\n this._compositionShape = { width, height, duration: this.duration };\n\n const lateKeyframes: string[] = [];\n for (const s of this.spec.sequences ?? []) {\n lintSequence(s);\n lintTiming(s, this.duration, (message, kind) => (kind === 'late-keyframe' ? lateKeyframes.push(message) : console.warn(message)));\n lintText(s);\n }\n for (const message of summarizeWarnings(lateKeyframes)) console.warn(message);\n\n this._children = await buildSequenceTree(\n this.spec.sequences ?? [],\n this._compositionShape,\n this.root,\n );\n this._resolveParents();\n for (const child of this._children) {\n // Cameras are display-less: they only feed the projection pass.\n if (child instanceof CameraSequence) {\n this._cameras.push(child);\n continue;\n }\n if (!child.target) continue;\n const holder = this._parentOf.get(child);\n const into = holder?.target ?? inner; // a layer with `parent` is drawn inside its null layer\n\n const maskSpec = (child.spec as { mask?: SequenceSpec }).mask;\n\n // threeD layers never enter the scene graph themselves: their display\n // object is rendered into a texture and a perspective mesh stands in.\n if (child.spec.threeD) {\n const layer = new Layer3D(child, frameOf(child));\n inner.addChild(layer.display);\n this._layers3d.push(layer);\n this._visual.push({ seq: child, layer });\n applyBlendMode(child.spec, layer.display);\n if (maskSpec) {\n console.warn(`pixi-effects: ${describeLayer(child.spec)}: mask is not supported on threeD layers yet; ignored`);\n }\n continue;\n }\n\n into.addChild(child.target);\n if (holder) this._nested.push(child);\n else this._visual.push({ seq: child, layer: null });\n applyBlendMode(child.spec, child.target);\n // If this child has a `mask` spec, build the mask sequence in the same\n // composition shape, add its target to the same parent (so its\n // transforms resolve in the same coord space), and wire PIXI's\n // mask channel. PIXI v8 renders mask containers into the stencil /\n // alpha buffer; they don't render as normal children.\n if (maskSpec) {\n // The mask lives and animates with the layer it masks: with no `at` of its own its `at` and\n // `duration` are the layer's, so its keyframes are measured from the layer's start too. An\n // explicit `at` is composition time, exactly like a layer's.\n const lifetime = maskSpec.at === undefined\n ? { at: child.at, duration: maskSpec.duration ?? child.duration }\n : {};\n const built = await buildSequenceTree([{ ...maskSpec, ...lifetime } as SequenceSpec], this._compositionShape, this.root);\n const maskSeq = built[0];\n if (maskSeq?.target) {\n into.addChild(maskSeq.target); // the mask shares the layer's space\n // PIXI v8 `setMask` accepts an `inverse` flag — that's how we\n // expose `maskInverted` from the spec. Falls back to plain\n // `target.mask = …` for runtimes that don't have setMask\n // (older PIXI builds).\n const inverse = (child.spec as { maskInverted?: boolean }).maskInverted ?? false;\n const t = child.target as Container & {\n setMask?: (opts: { mask: Container | null; inverse?: boolean }) => void;\n mask: Container | null;\n };\n if (typeof t.setMask === 'function') {\n t.setMask({ mask: maskSeq.target, inverse });\n } else {\n t.mask = maskSeq.target;\n }\n child.maskSequence = maskSeq;\n maskSeq.keepHidden = maskSpec.type === 'image' || maskSpec.type === 'video'; // PIXI: a Sprite mask is hidden by renderable = false\n }\n }\n }\n\n if (this._layers3d.length > 0) {\n // Stack order becomes explicit zIndex so threeD layers can be re-sorted\n // by depth each frame without reparenting.\n inner.sortableChildren = true;\n this._visual.forEach((v, i) => {\n (v.layer?.display ?? v.seq.target!).zIndex = i;\n });\n } else if (this._cameras.length > 0) {\n console.warn('pixi-effects: camera has no effect: this composition has no threeD layers');\n }\n\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n // Children's `at` is relative to this composition's start, so push them\n // forward by our absolute start time on the global timeline.\n const childOffset = offset + this.at;\n for (const child of this._children) {\n // Each layer builds its tweens in a small timeline of its own, which is added to the parent once, finished. Adding\n // thousands of tweens one by one to a single timeline makes GSAP re-measure the whole timeline at every add (the cost\n // grows with the square of the count: ~3 s for a piece with 700 particle layers); this way the parent only ever holds\n // one child per layer. Positions stay absolute, so the picture at any time is the same.\n const own = gsap.timeline({ defaults: { ease: 'none' } });\n child.bindTimeline(own, childOffset);\n // The mask shares the maskee's offset — its `at` is interpreted\n // relative to the composition's start, just like the child itself,\n // so a reveal-from-zero animation lines up naturally.\n child.maskSequence?.bindTimeline(own, childOffset);\n timeline.add(own, 0);\n }\n const overlap = findOverlap(this._cameras.map(c => c.window()));\n if (overlap) {\n console.warn(`pixi-effects: cameras #${overlap[0] + 1} and #${overlap[1] + 1} overlap in time; the top-most one wins`);\n }\n }\n\n /**\n * Drawn children in stack order, with the display object that stands in for each (the mesh for a threeD layer).\n * Null layers draw nothing and are left out; the layers inside them follow, with the null layers that carry them.\n */\n layers(): Array<{ seq: Sequence; display: Container; threeD: boolean; carriers: NullSequence[] }> {\n const carriersOf = (seq: Sequence): NullSequence[] => {\n const out: NullSequence[] = [];\n for (let p = this._parentOf.get(seq); p; p = this._parentOf.get(p)) out.push(p);\n return out;\n };\n return [...this._visual.map(v => v.seq), ...this._nested]\n .filter(seq => !(seq instanceof NullSequence))\n .map(seq => {\n const layer = this._visual.find(v => v.seq === seq)?.layer ?? null;\n return {\n seq,\n display: (layer?.display ?? seq.target!) as unknown as Container,\n threeD: layer !== null,\n carriers: carriersOf(seq),\n };\n });\n }\n\n /** Match every `parent: 'name'` to a null layer; anything that cannot work is said out loud and drawn unparented. */\n private _resolveParents(): void {\n const nulls = this._children.filter((c): c is NullSequence => c instanceof NullSequence);\n const nullNames = nulls.map(n => n.spec.name).filter((n): n is string => !!n);\n const warned = new Set<string>();\n for (const child of this._children) {\n const want = child.spec.parent;\n if (want === undefined) continue;\n const who = describeLayer(child.spec);\n if (child instanceof CameraSequence) { console.warn(`pixi-effects: ${who}: a camera cannot have a parent; ignored`); continue; }\n if (child.spec.threeD) { console.warn(`pixi-effects: ${who}: a threeD layer cannot have a parent (parent \"${want}\" ignored)`); continue; }\n const same = this._children.filter(c => c.spec.name === want);\n if (same.length === 0) {\n const hint = suggestName(want, nullNames);\n console.warn(`pixi-effects: ${who}: parent \"${want}\": no layer with that name${hint ? `; did you mean \"${hint}\"?` : ''} (the layer is drawn without a parent)`);\n continue;\n }\n const holder = same.find((c): c is NullSequence => c instanceof NullSequence);\n if (!holder) {\n console.warn(`pixi-effects: ${who}: parent \"${want}\" is a ${same[0]!.spec.type} layer; only { type: 'null' } layers can be parents (the layer is drawn without a parent)`);\n continue;\n }\n if (same.length > 1 && !warned.has(want)) {\n warned.add(want);\n console.warn(`pixi-effects: ${same.length} layers are named \"${want}\"; parent \"${want}\" uses the first null layer with that name`);\n }\n if (holder === child) { console.warn(`pixi-effects: ${who} is its own parent; ignored`); continue; }\n this._parentOf.set(child, holder);\n }\n // a chain that leads back to itself: break it where we find it\n for (const start of this._children) {\n const seen = new Set<Sequence>([start]);\n for (let p = this._parentOf.get(start); p; p = this._parentOf.get(p)) {\n if (p === start) {\n const names = [...seen].map(s => s.spec.name ?? s.spec.type).join(' → ');\n console.warn(`pixi-effects: parent cycle: ${names} → ${start.spec.name ?? start.spec.type}; the parent of \"${start.spec.name ?? start.spec.type}\" is ignored`);\n this._parentOf.delete(start);\n break;\n }\n if (seen.has(p)) break;\n seen.add(p);\n }\n }\n }\n\n override syncFrame(): void {\n super.syncFrame();\n for (const child of this._children) child.syncFrame();\n }\n\n override updateSpace(t: number, host: SpaceHost): void {\n // Inner compositions first: a threeD composition is rendered into its own\n // texture by this level, so its content must already be projected.\n for (const child of this._children) child.updateSpace(t, host);\n if (this._layers3d.length === 0 || !this._compositionShape) return;\n\n const { width, height } = this._compositionShape;\n const compEnd = (this.absoluteStart ?? 0) + (this.duration ?? 0);\n const active = pickActiveCamera(\n this._cameras.map(cam => ({ cam, ...cam.window() })),\n t,\n compEnd,\n );\n const basis = cameraBasis(active ? active.cam.state() : homeCamera(width, height), width, height);\n\n for (const layer of this._layers3d) layer.update(host, basis);\n\n const order = assignDepthOrder(\n this._visual.map((v, i) => ({ stackIndex: i, threeD: v.layer !== null, depth: v.layer?.depth ?? 0 })),\n );\n this._visual.forEach((v, i) => {\n if (v.layer) v.layer.display.zIndex = order[i]!;\n });\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n super.collectAudio(out, baseTime);\n const childBase = baseTime + this.at;\n for (const child of this._children) child.collectAudio(out, childBase);\n }\n\n override destroy(): void {\n for (const l of this._layers3d) l.destroy();\n this._layers3d = [];\n for (const c of this._children) c.destroy();\n super.destroy();\n }\n}\n\n/** Layer-space rectangle a threeD child projects: a composition's frame, otherwise its content bounds. */\nfunction frameOf(child: Sequence): () => { x: number; y: number; width: number; height: number } {\n if (child instanceof CompositionSequence) {\n return () => ({ x: 0, y: 0, width: child.intrinsicWidth, height: child.intrinsicHeight });\n }\n return () => child.target!.getLocalBounds();\n}\n"]}
|
|
@@ -2712,7 +2712,7 @@ function numOrZero(v, scope) {
|
|
|
2712
2712
|
var _CompositionSequence = null;
|
|
2713
2713
|
async function getCompositionSequence() {
|
|
2714
2714
|
if (!_CompositionSequence) {
|
|
2715
|
-
_CompositionSequence = (await import('./Composition-
|
|
2715
|
+
_CompositionSequence = (await import('./Composition-7TEKHZNQ.cjs')).CompositionSequence;
|
|
2716
2716
|
}
|
|
2717
2717
|
return _CompositionSequence;
|
|
2718
2718
|
}
|
|
@@ -2775,5 +2775,5 @@ exports.random = random;
|
|
|
2775
2775
|
exports.registerSequenceType = registerSequenceType;
|
|
2776
2776
|
exports.resolveAt = resolveAt;
|
|
2777
2777
|
exports.summarizeWarnings = summarizeWarnings;
|
|
2778
|
-
//# sourceMappingURL=chunk-
|
|
2779
|
-
//# sourceMappingURL=chunk-
|
|
2778
|
+
//# sourceMappingURL=chunk-6NWJLVCA.cjs.map
|
|
2779
|
+
//# sourceMappingURL=chunk-6NWJLVCA.cjs.map
|