@ansh-ui/core 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/behaviours.cjs +20 -15
- package/dist/behaviours.d.cts +2 -2
- package/dist/behaviours.d.ts +2 -2
- package/dist/behaviours.js +3 -2
- package/dist/{chunk-56NNBIAO.js → chunk-2DOA43UB.js} +1047 -18
- package/dist/chunk-2DOA43UB.js.map +1 -0
- package/dist/{chunk-7MYTSAPR.js → chunk-37GPMMMT.js} +3 -3
- package/dist/{chunk-7MYTSAPR.js.map → chunk-37GPMMMT.js.map} +1 -1
- package/dist/{chunk-23GSSIMK.cjs → chunk-4ORYTFY3.cjs} +3 -3
- package/dist/{chunk-23GSSIMK.cjs.map → chunk-4ORYTFY3.cjs.map} +1 -1
- package/dist/{chunk-MMO7KO53.cjs → chunk-FNR4B3KY.cjs} +3 -3
- package/dist/{chunk-MMO7KO53.cjs.map → chunk-FNR4B3KY.cjs.map} +1 -1
- package/dist/{chunk-BOQQHICI.js → chunk-GQH5ZHPB.js} +3 -3
- package/dist/{chunk-BOQQHICI.js.map → chunk-GQH5ZHPB.js.map} +1 -1
- package/dist/{chunk-R7UJ7MWP.cjs → chunk-OSNUN5JJ.cjs} +1070 -34
- package/dist/chunk-OSNUN5JJ.cjs.map +1 -0
- package/dist/{chunk-GHBRGMSO.cjs → chunk-PZF3YXVE.cjs} +6 -6
- package/dist/{chunk-GHBRGMSO.cjs.map → chunk-PZF3YXVE.cjs.map} +1 -1
- package/dist/{chunk-UJBXY6QC.cjs → chunk-SSAWZIO2.cjs} +150 -28
- package/dist/chunk-SSAWZIO2.cjs.map +1 -0
- package/dist/{chunk-C6XPQO2O.js → chunk-WLOGUD3G.js} +126 -5
- package/dist/{chunk-C6XPQO2O.js.map → chunk-WLOGUD3G.js.map} +1 -1
- package/dist/{chunk-KTUBCQC3.js → chunk-YHSCAGCI.js} +3 -3
- package/dist/{chunk-KTUBCQC3.js.map → chunk-YHSCAGCI.js.map} +1 -1
- package/dist/color.cjs +39 -39
- package/dist/color.d.cts +5 -4
- package/dist/color.d.ts +5 -4
- package/dist/color.js +3 -3
- package/dist/effects.cjs +53 -25
- package/dist/effects.d.cts +4 -4
- package/dist/effects.d.ts +4 -4
- package/dist/effects.js +4 -4
- package/dist/{index-CQEEPu-D.d.ts → index-DN0bQII7.d.ts} +47 -2
- package/dist/{index-DHOfsEIn.d.cts → index-DmJ3i1Tr.d.cts} +330 -4
- package/dist/{index-Dl8GCsya.d.cts → index-Dv3gw7Mb.d.cts} +47 -2
- package/dist/{index-CCdpefMp.d.ts → index-SO8zHlVo.d.ts} +330 -4
- package/dist/index.cjs +186 -154
- package/dist/index.d.cts +10 -9
- package/dist/index.d.ts +10 -9
- package/dist/index.js +9 -9
- package/dist/math.d.cts +3 -2
- package/dist/math.d.ts +3 -2
- package/dist/noise.d.cts +2 -1
- package/dist/noise.d.ts +2 -1
- package/dist/{palette-6HkVltYU.d.ts → palette-Dcomsp9R.d.cts} +2 -1
- package/dist/{palette-6HkVltYU.d.cts → palette-Dcomsp9R.d.ts} +2 -1
- package/dist/{random--4mSc5Lp.d.cts → random-YnhdaiIx.d.cts} +2 -1
- package/dist/{random--4mSc5Lp.d.ts → random-YnhdaiIx.d.ts} +2 -1
- package/dist/{reduced-motion-D0LUgZle.d.cts → reduced-motion-DaeXwgzb.d.cts} +2 -1
- package/dist/{reduced-motion-D0LUgZle.d.ts → reduced-motion-DaeXwgzb.d.ts} +2 -1
- package/package.json +1 -1
- package/dist/chunk-56NNBIAO.js.map +0 -1
- package/dist/chunk-R7UJ7MWP.cjs.map +0 -1
- package/dist/chunk-UJBXY6QC.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kernel/types.ts","../src/kernel/clock.ts","../src/kernel/budget.ts","../src/kernel/ticker.ts","../src/a11y/reduced-motion.ts","../src/observers/pool.ts","../src/observers/pointer.ts","../src/plugins/registry.ts"],"names":["clamp","percentileSorted","set","damp"],"mappings":";;;;;AAyCO,IAAM,YAAA,GAAsC,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS,MAAM;;;ACF/E,IAAM,QAAN,MAAY;AAAA,EACT,QAAA;AAAA,EACA,KAAA;AAAA,EAEA,cAAA,GAAiB,CAAA;AAAA,EACjB,aAAA,GAAgB,CAAA;AAAA,EAChB,eAAA,GAAkB,CAAA;AAAA,EAClB,UAAA,GAAa,CAAA;AAAA,EACb,OAAA,GAAU,KAAA;AAAA;AAAA,EAGV,cAAA,GAAiB,CAAA;AAAA,EAEzB,WAAA,CAAY,OAAA,GAAwB,EAAC,EAAG;AACtC,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,CAAQ,QAAA,IAAY,IAAI,EAAE,CAAA;AACzD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,SAAA,IAAa,CAAA;AAAA,EACpC;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,UAAU,KAAA,EAAe;AAG3B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,MAAM,SAAA,EAAyB;AAC7B,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAA;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,SAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAAA,EACjB;AAAA;AAAA,EAGA,KAAK,SAAA,EAAgC;AACnC,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,SAAA,GAAY,IAAA,CAAK,iBAAiB,GAAI,CAAA;AACpE,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AAErB,IAAA,MAAM,QAAQA,uBAAA,CAAM,QAAA,EAAU,GAAG,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,KAAA;AACvD,IAAA,IAAA,CAAK,eAAA,IAAmB,KAAA;AACxB,IAAA,IAAA,CAAK,UAAA,EAAA;AAEL,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,eAAA;AAAA,MACX,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAO,IAAA,CAAK,UAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAA,CAAW,KAAA,EAAe,IAAA,EAAc,QAAA,GAAW,CAAA,EAAW;AAC5D,IAAA,IAAA,CAAK,cAAA,IAAkB,KAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,QAAA,EAAU,KAAK,KAAA,CAAM,IAAA,CAAK,cAAA,GAAiB,IAAI,CAAC,CAAA;AACvE,IAAA,IAAA,CAAK,kBAAkB,KAAA,GAAQ,IAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,IAAA,GAAO,QAAA,OAAe,cAAA,GAAiB,CAAA;AACjE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,cAAA,IAAkB,GAAA;AAAA,EACtD;AACF;;;AChGO,IAAM,cAAN,MAAkB;AAAA,EACN,KAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EAET,aAAA;AAAA,EACA,cAAA;AAAA,EAEA,KAAA;AAAA,EACA,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,CAAA;AAAA,EACT,UAAoB,EAAC;AAAA,EAErB,YAAA,GAAe,CAAA;AAAA,EACf,QAAA,GAAW,EAAA;AAAA,EACX,QAAA,GAAW,CAAA;AAAA,EACX,QAAA,GAAW,CAAA;AAAA;AAAA,EAGX,kBAA4B,EAAC;AAAA,EAC7B,eAAA,GAAkB,KAAA;AAAA,EAE1B,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,IAAA,CAAK,QAAQA,uBAAA,CAAM,OAAA,CAAQ,KAAA,IAAS,GAAA,EAAK,KAAK,CAAC,CAAA;AAC/C,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,eAAe,GAAG,CAAA;AACzD,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,eAAe,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,aAAaA,uBAAA,CAAM,OAAA,CAAQ,UAAA,IAAc,IAAA,EAAM,MAAM,CAAC,CAAA;AAE3D,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,aAAA,KAAkB,MAAA;AAChD,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,GAAA,GAAO,EAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,CAAK,KAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,QAAgB,QAAA,EAAwB;AAC7C,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,aAAa,CAAA,GAAI,QAAA;AAEvB,MAAA,IAAA,CAAK,QAAA,IAAA,CAAa,UAAA,GAAa,IAAA,CAAK,QAAA,IAAY,GAAA;AAChD,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,iBAAA,CAAkB,WAAW,GAAI,CAAA;AAAA,IAClE;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAA,CAAU,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,UAAA;AACvC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,MAAA,EAAA;AAExC,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBAAkB,UAAA,EAA0B;AAClD,IAAA,IAAI,KAAK,eAAA,EAAiB;AAE1B,IAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,GAAa,EAAA,EAAI;AAEvC,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,UAAU,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,EAAA,EAAI;AAEtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAM,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAChE,IAAA,MAAM,MAAA,GAASC,kCAAA,CAAiB,MAAA,EAAQ,GAAG,CAAA;AAC3C,IAAA,MAAM,KAAK,GAAA,GAAO,MAAA;AAElB,IAAA,MAAM,YAAA,GAAe,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAC5D,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,YAAA,GAAe,QAAA;AACnB,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,EAAE,CAAA;AACnC,MAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,QAAA,YAAA,GAAe,QAAA;AACf,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,gBAAgB,GAAA,GAAO,OAAA;AAC5B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,EAC1B;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,MAAM,CAAA,EAAG;AAGb,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,KAAW,CAAA,OAAQ,OAAA,GAAU,IAAI,MAAM,CAAC,CAAA;AACzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC1D,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,SAAS,CAAA;AAE3B,IAAA,IAAA,CAAK,QAAA,GAAWA,kCAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,GAAWA,kCAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,EACrD;AAAA,EAEQ,aAAa,QAAA,EAAwB;AAG3C,IAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AAEtB,IAAA,MAAM,SAAS,IAAA,CAAK,QAAA;AACpB,IAAA,MAAM,EAAA,GAAKD,uBAAA,CAAM,QAAA,EAAU,CAAA,EAAG,GAAG,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAE1B,MAAA,MAAM,WAAWA,uBAAA,CAAM,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AACvD,MAAA,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,WAAA,GAAc,QAAA,GAAW,EAAA;AAAA,IACrD,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,GAAW,MAAA,GAAS,GAAA,EAAK;AAEvC,MAAA,IAAA,CAAK,YAAA,IAAgB,KAAK,WAAA,GAAc,EAAA;AAAA,IAC1C;AAEA,IAAA,IAAA,CAAK,eAAeA,uBAAA,CAAM,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,YAAA;AAAA,MACd,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAA,EAAU,KAAK,YAAA,GAAe;AAAA,KAChC;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,YAAA,GAAeA,uBAAA,CAAM,KAAA,EAAO,IAAA,CAAK,YAAY,CAAC,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACnB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,EAClB;AACF;AAEA,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AAC/C,EAAA,OAAO,CAAA,GAAI,CAAA;AACb;;;AChKA,IAAM,sBAAA,GAAyB,CAAA;AAExB,IAAM,SAAN,MAAa;AAAA,EACD,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,uBAAa,GAAA,EAA8B;AAAA,EAC3C,SAAA;AAAA,EAEA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EAET,MAAA,GAAwB,IAAA;AAAA,EACxB,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAC/B,QAAA,GAAW,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,WAAA,uBAAkB,GAAA,EAAgB;AAAA;AAAA,EAGlC,YAA6B,EAAC;AAAA,EAE9B,SAAA,uBAAgB,GAAA,EAAoC;AAAA,EAE3C,KAAA,GAAoB;AAAA,IACnC,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO,CAAA;AAAA,IACP,GAAA,EAAK,EAAA;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EAEA,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AAUtC,IAAA,MAAM,MACJ,OAAA,CAAQ,SAAA,KACP,OAAO,qBAAA,KAA0B,UAAA,GAC9B,sBAAsB,IAAA,CAAK,UAAU,CAAA,GACrC,CAAC,OAA4B,UAAA,CAAW,MAAM,GAAG,GAAA,EAAK,GAAG,EAAE,CAAA,CAAA;AAEjE,IAAA,MAAM,GAAA,GACJ,OAAA,CAAQ,SAAA,KACP,OAAO,oBAAA,KAAyB,UAAA,GAC7B,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA,GACpC,CAAC,CAAA,KAAc,aAAa,CAA6C,CAAA,CAAA;AAE/E,IAAA,IAAA,CAAK,QAAA,GAAW,GAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,GAAA,IAAO,GAAA;AAE/B,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc,IAAA,CAAK,OAAO,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,GAAA,CAAI,QAAA,EAAyB,OAAA,GAA4B,EAAC,EAAgB;AACxE,IAAA,IAAI,IAAA,CAAK,UAAU,OAAO,IAAA;AAE1B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,OAAA;AAC/B,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC7B,IAAI,IAAA,CAAK,MAAA,EAAA;AAAA,MACT,QAAA;AAAA,MACA,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,MAC9B,IAAA,EAAM,QAAQ,IAAA,IAAQ,WAAA;AAAA,MACtB,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,IAAA,CAAK,KAAK,UAAU,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,KAAK,CAAA;AAE1B,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,KAAA,EAAM;AAE/B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACrC,MAAA,IAAI,KAAA,IAAS,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACpC,MAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,CAAA,EAAG,IAAA,CAAK,IAAA,EAAK;AAAA,IAC5C,CAAA;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,QAAA,EAA+B;AAClC,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,KAAA,EAAM;AAAA,EACjC;AAAA;AAAA,EAGA,SAAA,GAAiC;AAC/B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,IAAA,CAAK,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACpD;AAAA,EAEA,IAAI,eAAA,GAA0B;AAC5B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,WAAY,IAAA,CAAK,MAAA;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,OAAA,GAAkE;AAChE,IAAA,MAAM,MAAM,EAAC;AACb,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,EAAC;AACxC,MAAA,GAAA,CAAI,KAAK,CAAA,GAAI,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,EAAE;AAAA,IACpE;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM;AAC3C,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,EAAS;AAChC,IAAA,IAAI,KAAK,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,SAChD,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACvC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAI,IAAA,CAAK,WAAW,IAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,CAAA;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAA,CAAM,SAAS,QAAA,EAAgB;AAC7B,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,MAAA,CAAO,SAAS,QAAA,EAAgB;AAC9B,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,MAAM,CAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,IAAA,GAAO,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,IAAK,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA,OAAQ,KAAA,EAAM;AAAA,EACxE;AAAA,EAEA,IAAI,QAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,IAAI,aAAA,GAA0B;AAC5B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,MAAA,KAAW,IAAA;AAAA,EACzB;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,KAAA,CAAM,SAAA;AAAA,EACpB;AAAA,EAEA,IAAI,UAAU,KAAA,EAAe;AAC3B,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,KAAA;AAAA,EACzB;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,OAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAA,CAAK,OAAA,GAAU,GAAA,GAAO,EAAA,EAAgB;AACpC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,OAAA;AACzC,IAAA,IAAI,CAAC,KAAK,KAAA,CAAM,SAAA,OAAgB,KAAA,CAAM,KAAA,CAAM,YAAY,OAAO,CAAA;AAC/D,IAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,OAAQ,MAAA,GAAS,CAAA;AACvD,IAAA,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AACxB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACrB;AAAA,EAEA,YAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAO;AAAA,EAC5B;AAAA;AAAA,EAGA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,SAAS,QAAA,EAAuD;AAC9D,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAMiB,IAAA,GAAO,CAAC,SAAA,KAA4B;AACnD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAIvB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,eAAA,GAAkB,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,CAAA,EAAI;AAC7F,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACvC;AAAA,EACF,CAAA;AAAA,EAEQ,SAAS,SAAA,EAAyB;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAExC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,KAAA,CAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,KAAA,CAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,KAAA,CAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,KAAA,CAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,KAAA,CAAM,YAAY,MAAA,CAAO,SAAA;AACzB,IAAA,KAAA,CAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA;AAC5B,IAAA,KAAA,CAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,GAAA;AAEjC,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,EAAS;AAEhC,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,CAAA,OAAQ,eAAA,EAAgB;AAEpD,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAIhC,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,KAAK,KAAA,EAAM;AACvD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,QAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,IAAI,CAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AACnB,MAAA,IAAA,CAAK,YAAY,EAAC;AAClB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,CAAC,EAAE,KAAK,CAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,WAAA,CAAY,OAAO,eAAe,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,UAAS,GAAI,SAAA,EAAW,OAAO,QAAQ,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,GAAO,CAAA,EAAG;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAClC,MAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,EAAW,QAAA,CAAS,MAAM,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,MAAA,CAAO,UAAA,EAAwB,KAAA,EAAmB,IAAA,EAA0B;AAClF,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,SAAS,KAAK,CAAA;AACzB,MAAA,IAAI,UAAA,CAAW,UAAA,GAAa,CAAA,EAAG,UAAA,CAAW,UAAA,GAAa,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,UAAA,CAAW,UAAA,EAAA;AACX,MAAA,WAAA,CAAY,KAAA,EAAO,WAAW,IAAI,CAAA;AAElC,MAAA,IAAI,UAAA,CAAW,cAAc,sBAAA,EAAwB;AACnD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACrC,QAAA,IAAI,KAAA,IAAS,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACpC,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,+BAAA,EAAkC,UAAA,CAAW,IAAI,CAAA,QAAA,EAC5C,sBAAsB,CAAA,0DAAA;AAAA,SAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,WAAA,EAAa;AACpC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAElC,MAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AAAA,IACtE;AACA,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;AAEA,SAAS,WAAA,CAAY,OAAgB,MAAA,EAAsB;AACzD,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,MAAM,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AACpE;AAEA,SAAS,IAAA,GAAa;AAAC;AAGhB,SAAS,GAAA,GAAc;AAC5B,EAAA,OAAO,OAAO,WAAA,KAAgB,WAAA,IAAe,OAAO,WAAA,CAAY,GAAA,KAAQ,UAAA,GACpE,WAAA,CAAY,GAAA,EAAI,GAChB,IAAA,CAAK,GAAA,EAAI;AACf;AAMA,IAAI,YAAA,GAA8B,IAAA;AAQ3B,SAAS,SAAA,GAAoB;AAClC,EAAA,IAAI,YAAA,KAAiB,IAAA,EAAM,YAAA,GAAe,IAAI,MAAA,EAAO;AACrD,EAAA,OAAO,YAAA;AACT;AAQO,SAAS,UAAU,MAAA,EAAsB;AAC9C,EAAA,IAAI,YAAA,IAAgB,YAAA,KAAiB,MAAA,EAAQ,YAAA,CAAa,OAAA,EAAQ;AAClE,EAAA,YAAA,GAAe,MAAA;AACjB;AAGO,SAAS,WAAA,GAAoB;AAClC,EAAA,IAAI,YAAA,eAA2B,OAAA,EAAQ;AACvC,EAAA,YAAA,GAAe,IAAA;AACjB;;;ACtaA,IAAM,KAAA,GAAQ,kCAAA;AAEd,IAAI,QAAA,GAA8B,MAAA;AAClC,IAAI,UAAA,GAAoC,IAAA;AACxC,IAAI,gBAAA,GAAmB,KAAA;AACvB,IAAI,WAAA,GAAc,KAAA;AAElB,IAAM,SAAA,uBAAgB,GAAA,EAAgC;AAEtD,SAAS,UAAA,GAAmB;AAC1B,EAAA,IAAI,eAAe,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACxE,EAAA,WAAA,GAAc,IAAA;AAEd,EAAA,UAAA,GAAa,MAAA,CAAO,WAAW,KAAK,CAAA;AACpC,EAAA,gBAAA,GAAmB,UAAA,CAAW,OAAA;AAE9B,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAgD;AAC/D,IAAA,gBAAA,GAAmB,KAAA,CAAM,OAAA;AACzB,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AAIA,EAAA,IAAI,OAAO,UAAA,CAAW,gBAAA,KAAqB,UAAA,EAAY;AACrD,IAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,OAA2C,CAAA;AAAA,EACnF,CAAA,MAAA,IAAW,OAAO,UAAA,CAAW,WAAA,KAAgB,UAAA,EAAY;AACvD,IAAA,UAAA,CAAW,YAAY,OAA2C,CAAA;AAAA,EACpE;AACF;AAEA,SAAS,MAAA,GAAe;AACtB,EAAA,MAAM,QAAQ,oBAAA,EAAqB;AACnC,EAAA,KAAA,MAAW,QAAA,IAAY,SAAA,EAAW,QAAA,CAAS,KAAK,CAAA;AAClD;AASO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI,QAAA,KAAa,UAAU,OAAO,IAAA;AAClC,EAAA,IAAI,QAAA,KAAa,SAAS,OAAO,KAAA;AACjC,EAAA,UAAA,EAAW;AACX,EAAA,OAAO,gBAAA;AACT;AAQO,SAAS,qBAAqB,IAAA,EAA+B;AAClE,EAAA,IAAI,aAAa,IAAA,EAAM;AACvB,EAAA,QAAA,GAAW,IAAA;AACX,EAAA,MAAA,EAAO;AACT;AAEO,SAAS,oBAAA,GAA0C;AACxD,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,sBAAsB,QAAA,EAAmD;AACvF,EAAA,UAAA,EAAW;AACX,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,QAAA,CAAS,sBAAsB,CAAA;AAC/B,EAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AACxC;AAiBO,SAAS,aAAA,CACd,QAAA,GAAkC,QAAA,EAClC,UAAA,GAAa,IAAA,EACK;AAClB,EAAA,IAAI,CAAC,oBAAA,EAAqB,IAAK,QAAA,KAAa,MAAA,EAAQ;AAClD,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,WAAW,CAAA,EAAE;AAAA,EAC1D;AAEA,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,WAAW,CAAA,EAAE;AAAA,IAC1D,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAW,CAAA,EAAE;AAAA,IAC3D,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,WAAW,UAAA,EAAW;AAAA;AAEvE;AAGO,SAAS,kBAAA,GAA2B;AACzC,EAAA,QAAA,GAAW,MAAA;AACX,EAAA,SAAA,CAAU,KAAA,EAAM;AAClB;;;AC1GA,IAAM,iBAAA,uBAAwB,GAAA,EAAmC;AAEjE,SAAS,gBAAgB,MAAA,EAAoC;AAC3D,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,CAAA;AACtC,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAC,GAAG,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA,GAAI,CAAC,SAAS,CAAA;AAG/F,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,GAAI,UAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,IAAc,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACzE;AAEA,IAAM,QAAA,uBAAe,OAAA,EAAoC;AACzD,IAAI,WAAA,GAAc,CAAA;AAElB,SAAS,aAAa,IAAA,EAAkC;AACtD,EAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,GAAM,CAAA,IAAA,EAAO,EAAE,WAAW,CAAA,CAAA;AAC1B,IAAA,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,mBAAA,CACd,OAAA,EACA,QAAA,EACA,MAAA,GAA6B,EAAC,EACjB;AACb,EAAA,IAAI,OAAO,oBAAA,KAAyB,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAE/D,EAAA,MAAM,GAAA,GAAM,gBAAgB,MAAM,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA;AAEpC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,SAAA,uBAAgB,OAAA,EAA4C;AAClE,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,KAAY;AACX,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,MAAME,IAAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACtC,UAAA,IAAI,CAACA,IAAAA,EAAK;AAGV,UAAA,KAAA,MAAW,MAAM,CAAC,GAAGA,IAAG,CAAA,KAAM,KAAK,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAO,IAAA,IAAQ,IAAA;AAAA,QACrB,UAAA,EAAY,OAAO,UAAA,IAAc,KAAA;AAAA,QACjC,SAAA,EAAW,OAAO,SAAA,IAAa;AAAA;AACjC,KACF;AACA,IAAA,IAAA,GAAO,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,CAAA,EAAE;AACvC,IAAA,iBAAA,CAAkB,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,uBAAU,GAAA,EAAI;AACd,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAC/B,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,EAAA;AAAA,EACP;AACA,EAAA,GAAA,CAAI,IAAI,QAAQ,CAAA;AAEhB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,QAAA,GAAW,IAAA;AAEX,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAC3B,IAAA,IAAI,WAAA,CAAY,OAAO,CAAA,EAAG;AAE1B,IAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,IAAA,OAAA,CAAQ,QAAA,CAAS,UAAU,OAAO,CAAA;AAClC,IAAA,OAAA,CAAQ,KAAA,EAAA;AAER,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAS,UAAA,EAAW;AAC5B,MAAA,iBAAA,CAAkB,OAAO,GAAG,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AACF;AAuBA,IAAM,WAAA,uBAAkB,GAAA,EAA+C;AAShE,SAAS,aAAA,CACd,OAAA,EACA,QAAA,EACA,GAAA,GAAgC,aAAA,EACnB;AACb,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AAEzD,EAAA,IAAI,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAE9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,SAAA,uBAAgB,OAAA,EAAsC;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AAC/C,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAMA,IAAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACtC,QAAA,IAAI,CAACA,IAAAA,EAAK;AACV,QAAA,MAAM,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,QAAA,KAAA,MAAW,MAAM,CAAC,GAAGA,IAAG,CAAA,KAAM,IAAI,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,GAAO,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,CAAA,EAAE;AACvC,IAAA,WAAA,CAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,uBAAU,GAAA,EAAI;AACd,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAC/B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,KAAK,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAGN,MAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,KAAA,EAAA;AAAA,EACP;AACA,EAAA,GAAA,CAAI,IAAI,QAAQ,CAAA;AAEhB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,QAAA,GAAW,IAAA;AAEX,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACjD,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAC3B,IAAA,IAAI,WAAA,CAAY,OAAO,CAAA,EAAG;AAE1B,IAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,IAAA,OAAA,CAAQ,QAAA,CAAS,UAAU,OAAO,CAAA;AAClC,IAAA,OAAA,CAAQ,KAAA,EAAA;AAER,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAS,UAAA,EAAW;AAC5B,MAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AACF;AASA,SAAS,eAAe,KAAA,EAAwC;AAC9D,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,KAAqB,QAAA,GAAW,gBAAA,GAAmB,CAAA;AAEtE,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,UAAA,EAAY,UAAA,IAAc,KAAA,CAAM,WAAA,CAAY,KAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,UAAA,EAAY,SAAA,IAAa,KAAA,CAAM,WAAA,CAAY,MAAA;AAE1D,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,yBAAA,GAA4B,CAAC,CAAA;AAE1D,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,kBAAkB,cAAA,EAAgB,UAAA,IAAc,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,IACtE,mBAAmB,cAAA,EAAgB,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,SAAS,GAAG,CAAA;AAAA,IACvE;AAAA,GACF;AACF;AAGO,SAAS,iBAAA,GAA8D;AAC5E,EAAA,OAAO,EAAE,YAAA,EAAc,iBAAA,CAAkB,IAAA,EAAM,MAAA,EAAQ,YAAY,IAAA,EAAK;AAC1E;AAGO,SAAS,kBAAA,GAA2B;AACzC,EAAA,KAAA,MAAW,QAAQ,iBAAA,CAAkB,MAAA,EAAO,EAAG,IAAA,CAAK,SAAS,UAAA,EAAW;AACxE,EAAA,KAAA,MAAW,QAAQ,WAAA,CAAY,MAAA,EAAO,EAAG,IAAA,CAAK,SAAS,UAAA,EAAW;AAClE,EAAA,iBAAA,CAAkB,KAAA,EAAM;AACxB,EAAA,WAAA,CAAY,KAAA,EAAM;AACpB;;;AClLO,SAAS,YAAA,CAAa,OAAA,EAAsB,OAAA,GAA0B,EAAC,EAAmB;AAC/F,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACvC,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,KAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,EAAQ,CAAA,IAAK,GAAA;AACrC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,EAAQ,CAAA,IAAK,GAAA;AAErC,EAAA,IAAI,IAAA,GAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAElD,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,CAAA,EAAG,CAAA;AAAA,IACH,CAAA,EAAG,CAAA;AAAA,IACH,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,OAAA,EAAS,CAAA;AAAA,IACT,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,SAAA,EAAW,CAAA;AAAA,IACX,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,GAAA;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,MAAM,GAAA,GAAM,QAAQ,qBAAA,EAAsB;AAC1C,IAAA,IAAA,GAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,KAAK,CAAA;AAAA,MAC5B,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,MAAM;AAAA,KAChC;AAEA,IAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AACrB,MAAA,OAAA,GAAU,KAAK,KAAA,GAAQ,OAAA;AACvB,MAAA,OAAA,GAAU,KAAK,MAAA,GAAS,OAAA;AACxB,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,KAAA,CAAM,CAAA,GAAI,OAAA;AACV,MAAA,KAAA,CAAM,CAAA,GAAI,OAAA;AAAA,IACZ;AAAA,EACF,CAAA;AAEA,EAAA,OAAA,EAAQ;AAER,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA8B;AACnD,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA;AAE/B,IAAA,MAAM,MAAA,GAAS,KAAK,CAAA,IAAK,CAAA,IAAK,KAAK,KAAA,IAAS,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,IAAA,CAAK,MAAA;AAChE,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,IAAgB,CAAC,MAAM,IAAA,EAAM;AAC3C,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,CAAA,GAAI,CAAA;AACV,IAAA,KAAA,CAAM,CAAA,GAAI,CAAA;AACV,IAAA,KAAA,CAAM,KAAKF,uBAAA,CAAM,CAAA,GAAI,IAAA,CAAK,KAAA,EAAO,GAAG,CAAC,CAAA;AACrC,IAAA,KAAA,CAAM,KAAKA,uBAAA,CAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAC,CAAA;AACtC,IAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,QAAA,GAAW,CAAA,GAAI,MAAM,QAAA,GAAW,GAAA;AACvD,IAAA,KAAA,CAAM,IAAA,GAAQ,MAAM,WAAA,IAAwC,OAAA;AAC5D,IAAA,IAAI,MAAA,QAAc,UAAA,GAAa,IAAA;AAE/B,IAAA,OAAA,GAAU,CAAA;AACV,IAAA,OAAA,GAAU,CAAA;AAEV,IAAA,IAAI,OAAA,EAAS;AAGX,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,CAAA,GAAI,MAAO,KAAA,CAAM,SAAA,GAAY,iBAAiB,GAAI,CAAA;AACtE,MAAA,KAAA,CAAM,SAAA,GAAA,CAAa,IAAI,KAAA,IAAS,EAAA;AAChC,MAAA,KAAA,CAAM,SAAA,GAAA,CAAa,IAAI,KAAA,IAAS,EAAA;AAAA,IAClC;AACA,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,aAAA,GAAgB,KAAA,CAAM,SAAA;AACtB,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA;AAEA,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA8B;AACpD,IAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,IAAA,KAAA,CAAM,UAAA,GAAa,IAAA;AACnB,IAAA,KAAA,CAAM,IAAA,GAAQ,MAAM,WAAA,IAAwC,OAAA;AAE5D,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAY;AACjC,IAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,IAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,IAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAClB,IAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAClB,IAAA,OAAA,GAAU,KAAA;AAGV,IAAA,OAAA,GAAU,KAAK,KAAA,GAAQ,OAAA;AACvB,IAAA,OAAA,GAAU,KAAK,MAAA,GAAS,OAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA8B;AACnD,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,IAAA,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,QAAA,GAAW,CAAA,GAAI,MAAM,QAAA,GAAW,GAAA;AACvD,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA8B;AACjD,IAAA,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,IAAA,KAAA,CAAM,QAAA,GAAW,CAAA;AAEjB,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,OAAA,EAAS,cAAA,EAAe;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,IAAA,EAAK;AAChC,EAAA,OAAA,CAAQ,gBAAA,CAAiB,cAAA,EAAgB,cAAA,EAAgB,OAAO,CAAA;AAChE,EAAA,OAAA,CAAQ,gBAAA,CAAiB,cAAA,EAAgB,cAAA,EAAgB,OAAO,CAAA;AAChE,EAAA,OAAA,CAAQ,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAe,OAAO,CAAA;AAC9D,EAAA,OAAA,CAAQ,gBAAA,CAAiB,eAAA,EAAiB,cAAA,EAAgB,OAAO,CAAA;AAEjE,EAAA,MAAM,UAAA,GAA0B,eAAe,MAAA,GAAS,OAAA;AACxD,EAAA,UAAA,CAAW,gBAAA,CAAiB,aAAA,EAAe,aAAA,EAAgC,OAAO,CAAA;AAClF,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,WAAA,EAA8B,OAAO,CAAA;AAG1E,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,EAAQ;AAC/B,EAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAA,EAAU,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC5E,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA;AAEnD,EAAA,MAAM,SAAS,SAAA,EAAU;AAIzB,EAAA,MAAM,WAAW,MAAA,CAAO,GAAA;AAAA,IACtB,MAAM;AAGJ,MAAA,MAAM,GAAA,GAAM,QAAQ,qBAAA,EAAsB;AAC1C,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,IAAA,CAAK,IAAA,IAAQ,GAAA,CAAI,GAAA,KAAQ,IAAA,CAAK,GAAA,IAAO,GAAA,CAAI,KAAA,KAAU,IAAA,CAAK,KAAA,EAAO;AAC9E,QAAA,IAAA,GAAO;AAAA,UACL,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,KAAK,CAAA;AAAA,UAC5B,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,MAAM;AAAA,SAChC;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,cAAA;AAAe,GACxC;AAEA,EAAA,MAAM,cAAc,MAAA,CAAO,GAAA;AAAA,IACzB,CAAC,EAAE,KAAA,EAAM,KAAM;AACb,MAAA,KAAA,CAAM,UAAUG,sBAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,WAAW,KAAK,CAAA;AAC7D,MAAA,KAAA,CAAM,UAAUA,sBAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,WAAW,KAAK,CAAA;AAC7D,MAAA,KAAA,CAAM,WAAWH,uBAAA,CAAM,KAAA,CAAM,UAAU,IAAA,CAAK,KAAA,EAAO,GAAG,CAAC,CAAA;AACvD,MAAA,KAAA,CAAM,WAAWA,uBAAA,CAAM,KAAA,CAAM,UAAU,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,gBAAA;AAAiB,GAC7C;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,OAAA,CAAQ,mBAAA,CAAoB,gBAAgB,cAAc,CAAA;AAC1D,MAAA,OAAA,CAAQ,mBAAA,CAAoB,gBAAgB,cAAc,CAAA;AAC1D,MAAA,OAAA,CAAQ,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACxD,MAAA,OAAA,CAAQ,mBAAA,CAAoB,iBAAiB,cAAc,CAAA;AAC3D,MAAA,UAAA,CAAW,mBAAA,CAAoB,eAAe,aAA8B,CAAA;AAC5E,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAA4B,CAAA;AACpE,MAAA,MAAA,CAAO,oBAAoB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAA8B,CAAA;AACxF,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC7C,MAAA,QAAA,EAAS;AACT,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,GACF;AACF;;;ACnOO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CACkB,YAChB,IAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,8BAA8B,UAAU,CAAA,EAAA,CAAA,IACrC,OAAO,CAAA,CAAA,EAAI,IAAI,KAAK,EAAA,CAAA,GACrB,CAAA,0DAAA;AAAA,KACJ;AAPgB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAQhB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AAAA,EATkB,UAAA;AAUpB;AAEO,IAAM,WAAN,MAAe;AAAA,EACH,OAAA,uBAAc,GAAA,EAAkC;AAAA,EAChD,OAAA,uBAAc,GAAA,EAAoB;AAAA,EAClC,YAAA,uBAAmB,GAAA,EAAoB;AAAA;AAAA,EAEvC,SAAA,uBAAgB,GAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY7D,QAAA,CAAY,SAAA,EAAmB,GAAA,EAAa,KAAA,EAAgB;AAC1D,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,uBAAa,GAAA,EAAI;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AAGnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,WAAW,GAAG,CAAA,+BAAA,EAAkC,SAAS,CAAA,oBAAA,EACnC,SAAS,OAAO,GAAG,CAAA,oCAAA;AAAA,OAC3C;AAAA,IACF;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,GAAA,CAAO,WAAmB,GAAA,EAA4B;AACpD,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,IAAI,GAAG,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAA,CAAW,WAAmB,GAAA,EAAgB;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAO,SAAA,EAAW,GAAG,CAAA;AACxC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACrC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,WAAA,EAAc,GAAG,CAAA,oBAAA,EAAuB,SAAS,CAAA,EAAA,CAAA,IAC9C,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,CAAA,YAAA,EAAe,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAAA,OACrE;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,WAAmB,GAAA,EAAsB;AAC3C,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,IAAK,KAAA;AAAA,EAClD;AAAA,EAEA,UAAA,CAAW,WAAmB,GAAA,EAAsB;AAClD,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,IAAK,KAAA;AAAA,EACrD;AAAA,EAEA,KAAK,SAAA,EAA6B;AAChC,IAAA,OAAO,CAAC,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,IAAA,EAAK,IAAK,EAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EAC/D;AAAA,EAEA,UAAa,SAAA,EAAuC;AAClD,IAAA,OAAO,CAAC,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG,OAAA,EAAQ,IAAK,EAAG,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,UAAA,EAAkC;AACxC,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,UAAU,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA,EAClC;AAAA,EAEA,MAAA,CAAO,YAA4B,IAAA,EAAqB;AACtD,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,UAAU,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,EAC/C;AAAA,EAEA,SAAS,UAAA,EAAqC;AAC5C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAkB,UAAA,EAAkC;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,eAAA,CAAgB,UAAA,EAAY,KAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,gBAAA,GAAqC;AACnC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAY,EAAE,IAAA,EAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,EAAsB;AACxB,IAAA,IAAI,KAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,GAAG,OAAO,IAAA;AAE1C,IAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG;AAC5C,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AACpC,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,QAAA;AAAA,UACA,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,kDAAA;AAAA,SACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,UAAU,IAAI,CAAA;AACrB,IAAA,KAAA,MAAW,cAAc,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG,IAAA,CAAK,QAAQ,UAAU,CAAA;AACvE,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,IAAA,EAAuB;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAA,CAAO,YAAY,IAAI,CAAA;AACvB,IAAA,KAAA,MAAW,UAAA,IAAc,OAAO,QAAA,IAAY,IAAI,IAAA,CAAK,YAAA,CAAa,OAAO,UAAU,CAAA;AACnF,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,GAAwD;AACtD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,MAAA,EAAQ,EAAE,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA,CAAE,OAAA,IAAW,SAAQ,CAAE,CAAA;AAAA,EAChG;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC7D,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF;AAEA,IAAI,MAAA,GAA0B,IAAA;AAGvB,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAA,GAAS,IAAI,QAAA,EAAS;AAEtB,IAAA,MAAA,CAAO,QAAQ,mBAAmB,CAAA;AAClC,IAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAC5B,IAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,aAAA,GAAsB;AACpC,EAAA,MAAA,EAAQ,KAAA,EAAM;AACd,EAAA,MAAA,GAAS,IAAA;AACX","file":"chunk-MMO7KO53.cjs","sourcesContent":["/**\n * Everything a frame callback receives.\n *\n * Passed as a single frozen-by-convention object rather than positional arguments so that new\n * fields can be added without breaking every subscriber in the ecosystem.\n */\nexport interface FrameState {\n /** Scaled seconds since the ticker started, excluding paused time. */\n time: number\n /** Scaled, clamped seconds since the previous frame. Use this for all motion. */\n delta: number\n /** Unscaled, unclamped seconds since the previous frame. For profiling only. */\n rawDelta: number\n /** Monotonically increasing frame index. */\n frame: number\n /** Smoothed frames per second. */\n fps: number\n /**\n * Adaptive quality in `[0, 1]`. Multiply expensive work by this — particle counts, render\n * resolution, octave counts — so the effect degrades gracefully instead of dropping frames.\n */\n quality: number\n /** Raw `performance.now()` timestamp for this frame. */\n timestamp: number\n}\n\n/**\n * Scheduling phases, executed in this order every frame.\n *\n * The separation exists to make layout thrashing structurally impossible. If one component\n * reads `getBoundingClientRect()` while another has already written a style, the browser must\n * synchronously recompute layout — and with N components interleaving, that happens N times\n * per frame. By collecting all reads before any write, it happens at most once.\n *\n * - `read` — measure the DOM. Never mutate here.\n * - `compute` — pure calculation: physics, interpolation, layout maths. Touch no DOM.\n * - `write` — mutate styles, draw to canvas. Never measure here.\n * - `post` — bookkeeping after the visual work: analytics, `onComplete` callbacks.\n */\nexport type FramePhase = 'read' | 'compute' | 'write' | 'post'\n\nexport const FRAME_PHASES: readonly FramePhase[] = ['read', 'compute', 'write', 'post']\n\nexport type FrameCallback = (state: FrameState) => void\n\nexport interface SubscribeOptions {\n /** Which phase to run in. Default `'write'` — the common case for drawing effects. */\n phase?: FramePhase\n /**\n * Ordering within the phase. Lower runs first. Default `0`.\n *\n * Use this for genuine dependencies (a parallax container must position before its children\n * measure), not as a general-purpose knob — over-ordered systems are hard to reason about.\n */\n priority?: number\n /** Label used in error messages and the dev inspector. */\n name?: string\n}\n\n/** Returned by `ticker.add()`. Idempotent — calling it twice is safe. */\nexport type Unsubscribe = () => void\n","import { clamp } from '../math/scalar'\n\n/**\n * Time keeping for the ticker.\n *\n * Two decisions here matter more than they look:\n *\n * **Delta clamping.** When a tab is backgrounded, `requestAnimationFrame` stops. On return,\n * the first frame's delta is however long the user was away — seconds, or minutes. Feeding\n * that into a physics integrator sends every particle to infinity, and into a tween makes it\n * jump to its end. We clamp to `maxDelta` so the worst case is one slightly-long frame.\n *\n * **Seconds, not milliseconds.** Every public duration in Ansh is in seconds, because\n * that is what designers and CSS authors think in, and because it keeps spring constants at\n * human-readable magnitudes. Conversion happens once, here.\n */\nexport interface ClockOptions {\n /**\n * Largest delta the clock will report, in seconds. Default `1 / 15` (≈67 ms), which is\n * two dropped frames at 30 FPS — slow enough to notice, small enough to be harmless.\n */\n maxDelta?: number\n /** Multiplier on the passage of time. `0.5` is slow motion, `2` is double speed. Default `1`. */\n timeScale?: number\n}\n\nexport interface FrameTiming {\n /** Scaled seconds elapsed since the clock started, excluding paused time. */\n readonly time: number\n /** Scaled, clamped seconds since the previous frame. */\n readonly delta: number\n /** Unscaled, unclamped seconds since the previous frame. Use for profiling, not motion. */\n readonly rawDelta: number\n /** Monotonically increasing frame counter. */\n readonly frame: number\n /** The raw `performance.now()` timestamp for this frame. */\n readonly timestamp: number\n}\n\nexport class Clock {\n private maxDelta: number\n private scale: number\n\n private startTimestamp = 0\n private lastTimestamp = 0\n private accumulatedTime = 0\n private frameIndex = 0\n private running = false\n\n /** Leftover time for the fixed-step accumulator. */\n private fixedRemainder = 0\n\n constructor(options: ClockOptions = {}) {\n this.maxDelta = Math.max(1e-4, options.maxDelta ?? 1 / 15)\n this.scale = options.timeScale ?? 1\n }\n\n get timeScale(): number {\n return this.scale\n }\n\n set timeScale(value: number) {\n // Negative time would break every monotonicity assumption downstream; zero is a valid\n // \"freeze\" and is handled by the tick maths naturally.\n this.scale = Math.max(0, value)\n }\n\n get isRunning(): boolean {\n return this.running\n }\n\n get elapsed(): number {\n return this.accumulatedTime\n }\n\n start(timestamp: number): void {\n this.startTimestamp = timestamp\n this.lastTimestamp = timestamp\n this.running = true\n }\n\n /**\n * Resume after a pause.\n *\n * Only `lastTimestamp` is reset, so the delta for the resumed frame is small rather than\n * \"however long the pause lasted\". `accumulatedTime` continues from where it stopped, which\n * is what makes pause/resume invisible to animations mid-flight.\n */\n resume(timestamp: number): void {\n this.lastTimestamp = timestamp\n this.running = true\n }\n\n pause(): void {\n this.running = false\n }\n\n reset(): void {\n this.startTimestamp = 0\n this.lastTimestamp = 0\n this.accumulatedTime = 0\n this.frameIndex = 0\n this.fixedRemainder = 0\n this.running = false\n }\n\n /** Advance the clock and produce this frame's timing. */\n tick(timestamp: number): FrameTiming {\n const rawDelta = Math.max(0, (timestamp - this.lastTimestamp) / 1000)\n this.lastTimestamp = timestamp\n\n const delta = clamp(rawDelta, 0, this.maxDelta) * this.scale\n this.accumulatedTime += delta\n this.frameIndex++\n\n return {\n time: this.accumulatedTime,\n delta,\n rawDelta,\n frame: this.frameIndex,\n timestamp,\n }\n }\n\n /**\n * Number of fixed-size physics steps to run for a variable-length frame.\n *\n * Verlet and spring-constraint integrators are only stable at a fixed step; running them\n * with a variable delta makes stiffness frame-rate dependent, so a 144 Hz monitor gets\n * different physics from a 60 Hz one. This accumulates the leftover and reports whole steps.\n *\n * `maxSteps` bounds the work when a long frame has queued up many steps — better to fall\n * slightly behind real time than to spiral into an ever-longer catch-up.\n */\n fixedSteps(delta: number, step: number, maxSteps = 4): number {\n this.fixedRemainder += delta\n const steps = Math.min(maxSteps, Math.floor(this.fixedRemainder / step))\n this.fixedRemainder -= steps * step\n // Discard a backlog we've decided not to run, otherwise it accumulates indefinitely.\n if (this.fixedRemainder > step * maxSteps) this.fixedRemainder = 0\n return steps\n }\n\n /** Fraction of the way into the next fixed step, for interpolating rendered positions. */\n get fixedAlpha(): number {\n return this.fixedRemainder\n }\n\n get totalWallTime(): number {\n return (this.lastTimestamp - this.startTimestamp) / 1000\n }\n}\n","import { clamp, percentileSorted } from '../math/scalar'\n\n/**\n * Adaptive frame budgeting.\n *\n * The premise: an effect authored on a MacBook Pro will drop frames on a mid-range Android\n * phone, and the author will never see it. Rather than asking developers to hand-tune particle\n * counts per device — which nobody does — the kernel measures how long frames actually take and\n * publishes a single `quality` scalar in `[0, 1]`. Effects scale their own cost against it.\n *\n * Why p95 rather than the mean: a mean is dominated by the many cheap frames and hides the\n * occasional 40 ms stall that the user actually perceives as a stutter. p95 tracks the bad\n * frames, which are the ones worth reacting to.\n *\n * Quality moves slowly and asymmetrically — quick to shed work when frames are expensive, slow\n * to add it back. Oscillating between quality levels is more visually distracting than simply\n * running at the lower one, so hysteresis is deliberate.\n */\n\nexport interface FrameBudgetOptions {\n /**\n * Target frame duration in milliseconds. Defaults to the display's refresh interval as\n * measured at runtime, falling back to 16.67 ms.\n */\n targetFrameMs?: number\n /**\n * Fraction of the frame Ansh is allowed to spend. The rest is left for the browser's\n * own work — style, layout, paint, compositing — plus the host application. Default `0.5`.\n */\n share?: number\n /** Rolling window size in frames. Default `90` (≈1.5 s at 60 FPS). */\n window?: number\n /** How fast quality drops when over budget, per second. Default `0.6`. */\n degradeRate?: number\n /** How fast quality recovers when under budget, per second. Default `0.12`. */\n recoverRate?: number\n /** Floor on quality, so an effect never disappears entirely. Default `0.25`. */\n minQuality?: number\n}\n\nexport interface BudgetReport {\n /** Adaptive quality in `[minQuality, 1]`. Multiply your work by this. */\n quality: number\n /** Smoothed frames per second. */\n fps: number\n /** Median frame cost attributable to Ansh, in milliseconds. */\n p50: number\n /** 95th-percentile Ansh frame cost, in milliseconds. */\n p95: number\n /** The budget being measured against, in milliseconds. */\n budgetMs: number\n /** `true` while quality is below 1 — useful for a dev-mode indicator. */\n degraded: boolean\n}\n\nexport class FrameBudget {\n private readonly share: number\n private readonly windowSize: number\n private readonly degradeRate: number\n private readonly recoverRate: number\n private readonly minQuality: number\n\n private targetFrameMs: number\n private explicitTarget: boolean\n\n private costs: Float32Array\n private cursor = 0\n private filled = 0\n private scratch: number[] = []\n\n private qualityValue = 1\n private fpsValue = 60\n private p50Value = 0\n private p95Value = 0\n\n /** Frame intervals used to detect the display refresh rate. */\n private intervalSamples: number[] = []\n private refreshDetected = false\n\n constructor(options: FrameBudgetOptions = {}) {\n this.share = clamp(options.share ?? 0.5, 0.1, 1)\n this.windowSize = Math.max(15, Math.floor(options.window ?? 90))\n this.degradeRate = Math.max(0, options.degradeRate ?? 0.6)\n this.recoverRate = Math.max(0, options.recoverRate ?? 0.12)\n this.minQuality = clamp(options.minQuality ?? 0.25, 0.05, 1)\n\n this.explicitTarget = options.targetFrameMs !== undefined\n this.targetFrameMs = options.targetFrameMs ?? 1000 / 60\n this.costs = new Float32Array(this.windowSize)\n }\n\n get quality(): number {\n return this.qualityValue\n }\n\n get budgetMs(): number {\n return this.targetFrameMs * this.share\n }\n\n /**\n * Record one frame.\n *\n * @param costMs Milliseconds spent inside Ansh callbacks this frame.\n * @param rawDelta Unscaled seconds since the previous frame, for FPS and refresh detection.\n */\n record(costMs: number, rawDelta: number): void {\n if (rawDelta > 0) {\n const instantFps = 1 / rawDelta\n // Exponential smoothing; 0.1 settles in roughly a third of a second.\n this.fpsValue += (instantFps - this.fpsValue) * 0.1\n if (!this.explicitTarget) this.detectRefreshRate(rawDelta * 1000)\n }\n\n this.costs[this.cursor] = costMs\n this.cursor = (this.cursor + 1) % this.windowSize\n if (this.filled < this.windowSize) this.filled++\n\n this.recomputePercentiles()\n this.adaptQuality(rawDelta)\n }\n\n /**\n * Infer the display refresh rate from observed frame intervals.\n *\n * Assuming 60 Hz wastes half the available budget on a 120 Hz display and overspends on a\n * 30 Hz one. We take the median of the first 40 intervals (median, not mean, so a couple of\n * long startup frames don't skew it) and snap to the nearest common rate.\n */\n private detectRefreshRate(intervalMs: number): void {\n if (this.refreshDetected) return\n // Ignore obvious outliers: sub-millisecond frames and anything slower than 20 FPS.\n if (intervalMs < 1 || intervalMs > 50) return\n\n this.intervalSamples.push(intervalMs)\n if (this.intervalSamples.length < 40) return\n\n const sorted = this.intervalSamples.slice().sort((a, b) => a - b)\n const median = percentileSorted(sorted, 0.5)\n const hz = 1000 / median\n\n const COMMON_RATES = [30, 48, 60, 72, 90, 120, 144, 165, 240]\n let nearest = 60\n let bestDistance = Infinity\n for (const rate of COMMON_RATES) {\n const distance = Math.abs(rate - hz)\n if (distance < bestDistance) {\n bestDistance = distance\n nearest = rate\n }\n }\n\n this.targetFrameMs = 1000 / nearest\n this.refreshDetected = true\n this.intervalSamples = []\n }\n\n private recomputePercentiles(): void {\n const n = this.filled\n if (n === 0) return\n\n // Reuse one scratch array; this runs every frame and must not allocate.\n if (this.scratch.length !== n) this.scratch = new Array(n)\n for (let i = 0; i < n; i++) this.scratch[i] = this.costs[i]\n this.scratch.sort(ascending)\n\n this.p50Value = percentileSorted(this.scratch, 0.5)\n this.p95Value = percentileSorted(this.scratch, 0.95)\n }\n\n private adaptQuality(rawDelta: number): void {\n // Wait for a representative window before reacting; the first frames of a page are\n // always slow (layout, font loading, JIT warm-up) and are not a signal about capability.\n if (this.filled < 30) return\n\n const budget = this.budgetMs\n const dt = clamp(rawDelta, 0, 0.1)\n\n if (this.p95Value > budget) {\n // Scale the response to how badly we're over: 2× over budget sheds twice as fast.\n const severity = clamp(this.p95Value / budget - 1, 0, 2)\n this.qualityValue -= this.degradeRate * severity * dt\n } else if (this.p95Value < budget * 0.6) {\n // Only recover when there is comfortable headroom, not the instant we scrape under.\n this.qualityValue += this.recoverRate * dt\n }\n\n this.qualityValue = clamp(this.qualityValue, this.minQuality, 1)\n }\n\n report(): BudgetReport {\n return {\n quality: this.qualityValue,\n fps: this.fpsValue,\n p50: this.p50Value,\n p95: this.p95Value,\n budgetMs: this.budgetMs,\n degraded: this.qualityValue < 0.999,\n }\n }\n\n /** Force quality to a fixed value, disabling adaptation. Used by `performance=\"high\"`. */\n lockQuality(value: number): void {\n this.qualityValue = clamp(value, this.minQuality, 1)\n this.filled = 0\n this.cursor = 0\n this.costs.fill(0)\n }\n\n reset(): void {\n this.costs.fill(0)\n this.cursor = 0\n this.filled = 0\n this.qualityValue = 1\n this.p50Value = 0\n this.p95Value = 0\n }\n}\n\nfunction ascending(a: number, b: number): number {\n return a - b\n}\n","import { Clock, type ClockOptions } from './clock'\nimport { FrameBudget, type BudgetReport, type FrameBudgetOptions } from './budget'\nimport {\n FRAME_PHASES,\n type FrameCallback,\n type FramePhase,\n type FrameState,\n type SubscribeOptions,\n type Unsubscribe,\n} from './types'\n\n/**\n * The Ansh ticker — the page's single animation loop.\n *\n * Why one loop rather than one per component:\n *\n * - **Ordering.** With N independent `requestAnimationFrame` callbacks, execution order is\n * registration order, which is effectively random across a component tree. One loop gives\n * us phases, so reads and writes never interleave.\n * - **Cost.** One callback, one closure, one place to measure. Adaptive quality is only\n * possible if something knows the total frame cost.\n * - **Control.** Global pause on tab blur, on reduced-motion, on low battery — implemented\n * once instead of in eighty components.\n * - **Correctness.** Every animation on the page shares one clock, so nothing drifts out of\n * sync with anything else.\n *\n * The loop is lazy: it starts when the first subscriber is added and stops when the last one\n * leaves, so a page that mounts no effects pays nothing.\n */\n\ninterface Subscriber {\n readonly id: number\n readonly callback: FrameCallback\n readonly priority: number\n readonly name: string\n /** Consecutive throws. A repeatedly-failing subscriber is evicted rather than spamming. */\n errorCount: number\n}\n\nexport interface TickerOptions extends ClockOptions {\n budget?: FrameBudgetOptions\n /**\n * Schedule frames yourself instead of using `requestAnimationFrame`.\n * Tests inject a manual driver; a worker-based renderer could supply its own.\n */\n scheduler?: (callback: (timestamp: number) => void) => number\n canceller?: (handle: number) => void\n /**\n * Read the current time. Defaults to `performance.now()`.\n *\n * Must share a time origin with whatever `scheduler` passes to its callback — in the browser\n * `requestAnimationFrame` and `performance.now()` already do. An injected scheduler on its own\n * clock must supply this too, otherwise the first frame's delta is computed between two unrelated\n * timelines and clamps to zero.\n */\n now?: () => number\n /** Start automatically when the first subscriber is added. Default `true`. */\n autoStart?: boolean\n}\n\nconst MAX_CONSECUTIVE_ERRORS = 3\n\nexport class Ticker {\n private readonly clock: Clock\n private readonly budget: FrameBudget\n private readonly phases = new Map<FramePhase, Subscriber[]>()\n private readonly autoStart: boolean\n\n private readonly schedule: (callback: (timestamp: number) => void) => number\n private readonly cancel: (handle: number) => void\n private readonly readTime: () => number\n\n private handle: number | null = null\n private nextId = 1\n private paused = false\n private pauseReasons = new Set<string>()\n private disposed = false\n\n /**\n * Phase arrays are rebuilt lazily rather than re-sorted on every add/remove: components\n * mount in bursts, and sorting once before the next frame is cheaper than sorting per call.\n */\n private dirtyPhases = new Set<FramePhase>()\n\n /** Callbacks queued to run exactly once on the next frame. */\n private onceQueue: FrameCallback[] = []\n\n private listeners = new Set<(report: BudgetReport) => void>()\n\n private readonly state: FrameState = {\n time: 0,\n delta: 0,\n rawDelta: 0,\n frame: 0,\n fps: 60,\n quality: 1,\n timestamp: 0,\n }\n\n constructor(options: TickerOptions = {}) {\n this.clock = new Clock(options)\n this.budget = new FrameBudget(options.budget)\n this.autoStart = options.autoStart ?? true\n\n // Fall back to a timer during SSR and in test environments without rAF, so that code paths\n // depending on the ticker don't have to branch on environment.\n //\n // `.bind(globalThis)` is load-bearing, not defensive. `requestAnimationFrame` is a method on\n // `window`, and the browser rejects it when invoked with any other receiver — storing the bare\n // reference and later calling it as `this.schedule(...)` sets `this` to the Ticker and throws\n // \"Illegal invocation\", so nothing on the page animates at all. jsdom is lenient about this and\n // the test suite always injects its own scheduler, so it only surfaces in a real browser.\n const raf =\n options.scheduler ??\n (typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame.bind(globalThis)\n : (cb: (t: number) => void) => setTimeout(() => cb(now()), 16) as unknown as number)\n\n const caf =\n options.canceller ??\n (typeof cancelAnimationFrame === 'function'\n ? cancelAnimationFrame.bind(globalThis)\n : (h: number) => clearTimeout(h as unknown as ReturnType<typeof setTimeout>))\n\n this.schedule = raf\n this.cancel = caf\n this.readTime = options.now ?? now\n\n for (const phase of FRAME_PHASES) this.phases.set(phase, [])\n }\n\n // -------------------------------------------------------------------------\n // Subscription\n // -------------------------------------------------------------------------\n\n /**\n * Register a per-frame callback.\n *\n * @returns An idempotent unsubscribe function. Always call it on unmount — the leak harness\n * in the test suite fails the build if a component forgets.\n */\n add(callback: FrameCallback, options: SubscribeOptions = {}): Unsubscribe {\n if (this.disposed) return noop\n\n const phase = options.phase ?? 'write'\n const subscriber: Subscriber = {\n id: this.nextId++,\n callback,\n priority: options.priority ?? 0,\n name: options.name ?? 'anonymous',\n errorCount: 0,\n }\n\n const list = this.phases.get(phase)\n if (!list) return noop\n\n list.push(subscriber)\n this.dirtyPhases.add(phase)\n\n if (this.autoStart) this.start()\n\n let removed = false\n return () => {\n if (removed) return\n removed = true\n const index = list.indexOf(subscriber)\n if (index >= 0) list.splice(index, 1)\n if (this.subscriberCount === 0) this.stop()\n }\n }\n\n /** Run a callback on the next frame only. Useful for deferring a DOM read past a write. */\n once(callback: FrameCallback): void {\n if (this.disposed) return\n this.onceQueue.push(callback)\n if (this.autoStart) this.start()\n }\n\n /** Resolve on the next frame. `await ticker.nextFrame()` reads well in setup code. */\n nextFrame(): Promise<FrameState> {\n return new Promise((resolve) => this.once(resolve))\n }\n\n get subscriberCount(): number {\n let total = 0\n for (const list of this.phases.values()) total += list.length\n return total\n }\n\n /** Per-phase subscriber counts. Consumed by the dev inspector and the leak harness. */\n inspect(): Record<FramePhase, { count: number; names: string[] }> {\n const out = {} as Record<FramePhase, { count: number; names: string[] }>\n for (const phase of FRAME_PHASES) {\n const list = this.phases.get(phase) ?? []\n out[phase] = { count: list.length, names: list.map((s) => s.name) }\n }\n return out\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n start(): void {\n if (this.disposed || this.handle !== null) return\n const timestamp = this.readTime()\n if (this.clock.isRunning) this.clock.resume(timestamp)\n else this.clock.start(timestamp)\n this.handle = this.schedule(this.loop)\n }\n\n stop(): void {\n if (this.handle === null) return\n this.cancel(this.handle)\n this.handle = null\n this.clock.pause()\n }\n\n /**\n * Pause the ticker, tagged with a reason.\n *\n * Reasons are reference-counted by name so that independent systems can pause without\n * fighting: if the tab is hidden *and* the user prefers reduced motion, both hold a pause,\n * and resuming one doesn't restart animation while the other still applies.\n */\n pause(reason = 'manual'): void {\n this.pauseReasons.add(reason)\n this.paused = true\n this.stop()\n }\n\n resume(reason = 'manual'): void {\n this.pauseReasons.delete(reason)\n if (this.pauseReasons.size > 0) return\n this.paused = false\n if (this.subscriberCount > 0 || this.onceQueue.length > 0) this.start()\n }\n\n get isPaused(): boolean {\n return this.paused\n }\n\n get pausedBecause(): string[] {\n return [...this.pauseReasons]\n }\n\n get isRunning(): boolean {\n return this.handle !== null\n }\n\n get timeScale(): number {\n return this.clock.timeScale\n }\n\n set timeScale(value: number) {\n this.clock.timeScale = value\n }\n\n get time(): number {\n return this.clock.elapsed\n }\n\n /**\n * Advance one frame manually.\n *\n * The escape hatch that makes the whole engine testable: a test can drive 100 deterministic\n * frames without waiting on a real display, and a screenshot harness can seek to an exact\n * frame index.\n */\n step(deltaMs = 1000 / 60): FrameState {\n const timestamp = this.state.timestamp + deltaMs\n if (!this.clock.isRunning) this.clock.start(timestamp - deltaMs)\n this.runFrame(timestamp)\n return this.state\n }\n\n /** Release everything. The ticker cannot be restarted afterwards. */\n dispose(): void {\n this.stop()\n this.disposed = true\n for (const list of this.phases.values()) list.length = 0\n this.onceQueue.length = 0\n this.listeners.clear()\n }\n\n // -------------------------------------------------------------------------\n // Budget\n // -------------------------------------------------------------------------\n\n get quality(): number {\n return this.budget.quality\n }\n\n budgetReport(): BudgetReport {\n return this.budget.report()\n }\n\n /** Disable adaptation and pin quality. Backs the `performance=\"high\" | \"low\"` prop. */\n lockQuality(value: number): void {\n this.budget.lockQuality(value)\n }\n\n /** Subscribe to per-frame budget reports — powers the dev-mode FPS overlay. */\n onBudget(listener: (report: BudgetReport) => void): Unsubscribe {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n // -------------------------------------------------------------------------\n // The loop\n // -------------------------------------------------------------------------\n\n private readonly loop = (timestamp: number): void => {\n this.handle = null\n this.runFrame(timestamp)\n\n // Re-arm only if there is still work. A ticker with no subscribers stops entirely rather\n // than spinning an empty callback for the lifetime of the page.\n if (!this.paused && !this.disposed && (this.subscriberCount > 0 || this.onceQueue.length > 0)) {\n this.handle = this.schedule(this.loop)\n }\n }\n\n private runFrame(timestamp: number): void {\n const timing = this.clock.tick(timestamp)\n\n const state = this.state\n state.time = timing.time\n state.delta = timing.delta\n state.rawDelta = timing.rawDelta\n state.frame = timing.frame\n state.timestamp = timing.timestamp\n state.quality = this.budget.quality\n state.fps = this.budget.report().fps\n\n const startedAt = this.readTime()\n\n if (this.dirtyPhases.size > 0) this.sortDirtyPhases()\n\n for (const phase of FRAME_PHASES) {\n const list = this.phases.get(phase)\n if (!list || list.length === 0) continue\n\n // Iterate a snapshot: a callback may unsubscribe itself or add a sibling, and mutating\n // the array mid-iteration would skip or double-run subscribers.\n const snapshot = list.length === 1 ? list : list.slice()\n for (let i = 0; i < snapshot.length; i++) {\n this.invoke(snapshot[i], state, list)\n }\n }\n\n if (this.onceQueue.length > 0) {\n const queue = this.onceQueue\n this.onceQueue = []\n for (let i = 0; i < queue.length; i++) {\n try {\n queue[i](state)\n } catch (error) {\n reportError(error, 'once callback')\n }\n }\n }\n\n this.budget.record(this.readTime() - startedAt, timing.rawDelta)\n\n if (this.listeners.size > 0) {\n const report = this.budget.report()\n for (const listener of this.listeners) listener(report)\n }\n }\n\n /**\n * Run one subscriber, containing its failures.\n *\n * A throwing callback must not stop every other animation on the page — that turns one\n * component's bug into a whole-page visual failure. We log, and after several consecutive\n * throws we evict the subscriber, because 60 identical stack traces per second is not\n * diagnostics, it's a denial of service on the console.\n */\n private invoke(subscriber: Subscriber, state: FrameState, list: Subscriber[]): void {\n try {\n subscriber.callback(state)\n if (subscriber.errorCount > 0) subscriber.errorCount = 0\n } catch (error) {\n subscriber.errorCount++\n reportError(error, subscriber.name)\n\n if (subscriber.errorCount >= MAX_CONSECUTIVE_ERRORS) {\n const index = list.indexOf(subscriber)\n if (index >= 0) list.splice(index, 1)\n console.error(\n `[ansh] Removed frame callback \"${subscriber.name}\" after ` +\n `${MAX_CONSECUTIVE_ERRORS} consecutive errors. Other animations continue unaffected.`,\n )\n }\n }\n }\n\n private sortDirtyPhases(): void {\n for (const phase of this.dirtyPhases) {\n const list = this.phases.get(phase)\n // Stable sort by priority; ties fall back to registration order via `id`.\n if (list) list.sort((a, b) => a.priority - b.priority || a.id - b.id)\n }\n this.dirtyPhases.clear()\n }\n}\n\nfunction reportError(error: unknown, source: string): void {\n console.error(`[ansh] Error in frame callback \"${source}\":`, error)\n}\n\nfunction noop(): void {}\n\n/** Monotonic clock, falling back to `Date.now()` where `performance` is unavailable. */\nexport function now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now()\n}\n\n// ---------------------------------------------------------------------------\n// The shared instance\n// ---------------------------------------------------------------------------\n\nlet sharedTicker: Ticker | null = null\n\n/**\n * The process-wide ticker.\n *\n * Created lazily on first access so that importing Ansh has no side effects — important\n * for SSR, and for tree-shaking in apps that only use the pure colour or easing modules.\n */\nexport function getTicker(): Ticker {\n if (sharedTicker === null) sharedTicker = new Ticker()\n return sharedTicker\n}\n\n/**\n * Replace the shared ticker.\n *\n * Exists for tests (inject a manually-driven ticker) and for advanced hosts that need a\n * custom scheduler. Disposes the previous instance so subscribers can't leak across the swap.\n */\nexport function setTicker(ticker: Ticker): void {\n if (sharedTicker && sharedTicker !== ticker) sharedTicker.dispose()\n sharedTicker = ticker\n}\n\n/** Tear down the shared ticker. Call between tests to guarantee isolation. */\nexport function resetTicker(): void {\n if (sharedTicker) sharedTicker.dispose()\n sharedTicker = null\n}\n","import type { Unsubscribe } from '../kernel/types'\n\n/**\n * Reduced-motion support.\n *\n * `prefers-reduced-motion` is not a niche preference. It is set by users with vestibular\n * disorders, for whom large-scale parallax and continuous background motion cause genuine\n * physical nausea. Honouring it is not a nice-to-have, and it must not be each component's\n * job to remember — so the kernel owns it and every effect declares a strategy.\n *\n * The strategies exist because \"disable all animation\" is the wrong answer for most effects.\n * A gradient that slowly shifts hue is not what makes people ill; a full-viewport parallax\n * scroll is. So each effect states what it should do, and authors can override per instance.\n */\n\n/**\n * How an effect should behave when the user prefers reduced motion.\n *\n * - `static` — render one frame and stop. The design still reads correctly, nothing moves.\n * The right default for backgrounds.\n * - `slow` — keep animating at a fraction of the speed. Suitable for gentle, small-amplitude\n * motion where stillness would lose meaning (a loading indicator).\n * - `pause` — don't render at all. For effects whose whole purpose is movement.\n * - `none` — ignore the preference. Only correct for motion that conveys required\n * information, e.g. a progress indicator with no other affordance.\n */\nexport type ReducedMotionStrategy = 'static' | 'slow' | 'pause' | 'none'\n\n/** Application-level override, usually surfaced through a `<MotionConfig>` provider. */\nexport type ReducedMotionMode = 'auto' | 'always' | 'never'\n\nconst QUERY = '(prefers-reduced-motion: reduce)'\n\nlet override: ReducedMotionMode = 'auto'\nlet mediaQuery: MediaQueryList | null = null\nlet systemPreference = false\nlet initialised = false\n\nconst listeners = new Set<(reduced: boolean) => void>()\n\nfunction initialise(): void {\n if (initialised || typeof window === 'undefined' || !window.matchMedia) return\n initialised = true\n\n mediaQuery = window.matchMedia(QUERY)\n systemPreference = mediaQuery.matches\n\n const handler = (event: MediaQueryListEvent | MediaQueryList) => {\n systemPreference = event.matches\n notify()\n }\n\n // Safari before 14 only has the deprecated `addListener`. Supporting it costs two lines\n // and covers a non-trivial share of iOS users on older devices.\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handler as (e: MediaQueryListEvent) => void)\n } else if (typeof mediaQuery.addListener === 'function') {\n mediaQuery.addListener(handler as (e: MediaQueryListEvent) => void)\n }\n}\n\nfunction notify(): void {\n const value = prefersReducedMotion()\n for (const listener of listeners) listener(value)\n}\n\n/**\n * Does the user want reduced motion?\n *\n * Returns `false` during SSR. That is the correct default: rendering the static fallback on the\n * server and the animated version on the client would be a hydration mismatch, whereas\n * rendering the animated markup and then immediately stopping it on the client is seamless.\n */\nexport function prefersReducedMotion(): boolean {\n if (override === 'always') return true\n if (override === 'never') return false\n initialise()\n return systemPreference\n}\n\n/**\n * Override the system preference application-wide.\n *\n * `'always'` is genuinely useful in production (an in-app \"reduce motion\" setting), and\n * essential in tests and screenshot harnesses where you need the static frame deterministically.\n */\nexport function setReducedMotionMode(mode: ReducedMotionMode): void {\n if (override === mode) return\n override = mode\n notify()\n}\n\nexport function getReducedMotionMode(): ReducedMotionMode {\n return override\n}\n\n/** Subscribe to preference changes. Fires immediately with the current value. */\nexport function onReducedMotionChange(listener: (reduced: boolean) => void): Unsubscribe {\n initialise()\n listeners.add(listener)\n listener(prefersReducedMotion())\n return () => listeners.delete(listener)\n}\n\nexport interface MotionResolution {\n /** Should the effect run its frame loop at all? */\n animate: boolean\n /** Should it render a single frame before stopping? */\n renderOnce: boolean\n /** Multiplier to apply to the effect's speed. */\n timeScale: number\n}\n\n/**\n * Turn a strategy plus the current preference into concrete instructions.\n *\n * Centralising this means every effect behaves consistently, and that adding a new strategy\n * later is a change in one file rather than eighty.\n */\nexport function resolveMotion(\n strategy: ReducedMotionStrategy = 'static',\n slowFactor = 0.25,\n): MotionResolution {\n if (!prefersReducedMotion() || strategy === 'none') {\n return { animate: true, renderOnce: false, timeScale: 1 }\n }\n\n switch (strategy) {\n case 'static':\n return { animate: false, renderOnce: true, timeScale: 0 }\n case 'pause':\n return { animate: false, renderOnce: false, timeScale: 0 }\n case 'slow':\n return { animate: true, renderOnce: false, timeScale: slowFactor }\n }\n}\n\n/** Reset module state. Test-only. */\nexport function resetReducedMotion(): void {\n override = 'auto'\n listeners.clear()\n}\n","import type { Unsubscribe } from '../kernel/types'\n\n/**\n * Pooled `IntersectionObserver` and `ResizeObserver`.\n *\n * Creating one observer per element is the default pattern in most React/Vue code, and it is\n * measurably wasteful: each observer is a separate object with its own callback and its own\n * entry in the browser's internal bookkeeping. A page with 200 scroll-revealed elements creates\n * 200 observers where 1 would do.\n *\n * These pools key observers by their *configuration*, so every element sharing a threshold\n * and root margin shares one observer. Callbacks are dispatched from a `WeakMap` keyed by\n * element, so unobserving an element cannot leak its callback.\n */\n\n// ---------------------------------------------------------------------------\n// Intersection\n// ---------------------------------------------------------------------------\n\nexport interface IntersectionConfig {\n root?: Element | Document | null\n rootMargin?: string\n /** A single threshold or a list. Lists are sorted so `[0, 1]` and `[1, 0]` share a pool. */\n threshold?: number | readonly number[]\n}\n\ntype IntersectionCallback = (entry: IntersectionObserverEntry) => void\n\ninterface IntersectionPoolEntry {\n observer: IntersectionObserver\n callbacks: WeakMap<Element, Set<IntersectionCallback>>\n /** Live element count, so the observer can be disconnected when it empties. */\n count: number\n}\n\nconst intersectionPools = new Map<string, IntersectionPoolEntry>()\n\nfunction intersectionKey(config: IntersectionConfig): string {\n const threshold = config.threshold ?? 0\n const thresholds = Array.isArray(threshold) ? [...threshold].sort((a, b) => a - b) : [threshold]\n // The root is part of the identity but has no stable serialisation; observers with a custom\n // root get their own pool via an identity tag stamped on the element.\n const rootTag = config.root ? rootIdentity(config.root) : 'viewport'\n return `${rootTag}|${config.rootMargin ?? '0px'}|${thresholds.join(',')}`\n}\n\nconst rootTags = new WeakMap<Element | Document, string>()\nlet rootCounter = 0\n\nfunction rootIdentity(root: Element | Document): string {\n let tag = rootTags.get(root)\n if (!tag) {\n tag = `root${++rootCounter}`\n rootTags.set(root, tag)\n }\n return tag\n}\n\n/**\n * Observe an element's intersection with the viewport (or a custom root).\n *\n * @returns An unsubscribe function. When the last subscriber for an element leaves, the\n * element is unobserved; when the last element leaves a pool, the observer is\n * disconnected and dropped.\n */\nexport function observeIntersection(\n element: Element,\n callback: IntersectionCallback,\n config: IntersectionConfig = {},\n): Unsubscribe {\n if (typeof IntersectionObserver === 'undefined') return () => {}\n\n const key = intersectionKey(config)\n let pool = intersectionPools.get(key)\n\n if (!pool) {\n const callbacks = new WeakMap<Element, Set<IntersectionCallback>>()\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const set = callbacks.get(entry.target)\n if (!set) continue\n // Copy before iterating: a callback commonly unsubscribes itself on first\n // intersection (\"reveal once\"), which would mutate the set mid-iteration.\n for (const cb of [...set]) cb(entry)\n }\n },\n {\n root: config.root ?? null,\n rootMargin: config.rootMargin ?? '0px',\n threshold: config.threshold ?? 0,\n } as IntersectionObserverInit,\n )\n pool = { observer, callbacks, count: 0 }\n intersectionPools.set(key, pool)\n }\n\n let set = pool.callbacks.get(element)\n if (!set) {\n set = new Set()\n pool.callbacks.set(element, set)\n pool.observer.observe(element)\n pool.count++\n }\n set.add(callback)\n\n let released = false\n return () => {\n if (released) return\n released = true\n\n const current = intersectionPools.get(key)\n if (!current) return\n\n const callbackSet = current.callbacks.get(element)\n if (!callbackSet) return\n\n callbackSet.delete(callback)\n if (callbackSet.size > 0) return\n\n current.callbacks.delete(element)\n current.observer.unobserve(element)\n current.count--\n\n if (current.count <= 0) {\n current.observer.disconnect()\n intersectionPools.delete(key)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resize\n// ---------------------------------------------------------------------------\n\nexport interface ResizeInfo {\n width: number\n height: number\n /** Device-pixel dimensions when the browser reports them, else `width`/`height` × DPR. */\n devicePixelWidth: number\n devicePixelHeight: number\n entry: ResizeObserverEntry\n}\n\ntype ResizeCallback = (info: ResizeInfo) => void\n\ninterface ResizePoolEntry {\n observer: ResizeObserver\n callbacks: WeakMap<Element, Set<ResizeCallback>>\n count: number\n}\n\nconst resizePools = new Map<ResizeObserverBoxOptions, ResizePoolEntry>()\n\n/**\n * Observe an element's size.\n *\n * Defaults to the `content-box`, matching CSS layout intuition. Canvas-backed effects pass\n * `'device-pixel-content-box'` where supported, because that gives the exact backing-store\n * size and avoids the half-pixel blurring that comes from rounding CSS pixels ourselves.\n */\nexport function observeResize(\n element: Element,\n callback: ResizeCallback,\n box: ResizeObserverBoxOptions = 'content-box',\n): Unsubscribe {\n if (typeof ResizeObserver === 'undefined') return () => {}\n\n let pool = resizePools.get(box)\n\n if (!pool) {\n const callbacks = new WeakMap<Element, Set<ResizeCallback>>()\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const set = callbacks.get(entry.target)\n if (!set) continue\n const info = describeResize(entry)\n for (const cb of [...set]) cb(info)\n }\n })\n pool = { observer, callbacks, count: 0 }\n resizePools.set(box, pool)\n }\n\n let set = pool.callbacks.get(element)\n if (!set) {\n set = new Set()\n pool.callbacks.set(element, set)\n try {\n pool.observer.observe(element, { box })\n } catch {\n // `device-pixel-content-box` throws in browsers that don't support it; fall back\n // rather than losing resize handling entirely.\n pool.observer.observe(element)\n }\n pool.count++\n }\n set.add(callback)\n\n let released = false\n return () => {\n if (released) return\n released = true\n\n const current = resizePools.get(box)\n if (!current) return\n\n const callbackSet = current.callbacks.get(element)\n if (!callbackSet) return\n\n callbackSet.delete(callback)\n if (callbackSet.size > 0) return\n\n current.callbacks.delete(element)\n current.observer.unobserve(element)\n current.count--\n\n if (current.count <= 0) {\n current.observer.disconnect()\n resizePools.delete(box)\n }\n }\n}\n\n/**\n * Normalise a `ResizeObserverEntry` across browsers.\n *\n * The spec went through several shapes; Safari shipped `contentRect` only for a long while,\n * and `devicePixelContentBoxSize` is still not universal. This picks the most precise\n * available source and always yields both CSS and device-pixel dimensions.\n */\nfunction describeResize(entry: ResizeObserverEntry): ResizeInfo {\n const dpr = typeof devicePixelRatio === 'number' ? devicePixelRatio : 1\n\n const contentBox = entry.contentBoxSize?.[0]\n const width = contentBox?.inlineSize ?? entry.contentRect.width\n const height = contentBox?.blockSize ?? entry.contentRect.height\n\n const devicePixelBox = entry.devicePixelContentBoxSize?.[0]\n\n return {\n width,\n height,\n devicePixelWidth: devicePixelBox?.inlineSize ?? Math.round(width * dpr),\n devicePixelHeight: devicePixelBox?.blockSize ?? Math.round(height * dpr),\n entry,\n }\n}\n\n/** Live pool counts. The leak harness asserts these return to zero after unmount. */\nexport function observerPoolStats(): { intersection: number; resize: number } {\n return { intersection: intersectionPools.size, resize: resizePools.size }\n}\n\n/** Disconnect every pooled observer. Test-only. */\nexport function resetObserverPools(): void {\n for (const pool of intersectionPools.values()) pool.observer.disconnect()\n for (const pool of resizePools.values()) pool.observer.disconnect()\n intersectionPools.clear()\n resizePools.clear()\n}\n","import { clamp, damp } from '../math/scalar'\nimport { getTicker } from '../kernel/ticker'\n\n/**\n * Unified pointer tracking.\n *\n * Three problems this solves that every project re-solves badly:\n *\n * 1. **Mouse, touch and pen are one input.** Pointer Events already unify them; this wraps\n * that so effects never branch on input type. Touch gets a synthetic \"leave\" on `pointerup`\n * because a finger genuinely does leave the surface, which mouse code forgets.\n *\n * 2. **Raw pointer coordinates are jittery.** A cursor moves in discrete jumps and a mesh\n * gradient that follows it exactly looks nervous. We expose both the raw position and a\n * critically-damped smoothed position; effects should use the smoothed one.\n *\n * 3. **Reading `getBoundingClientRect()` per move is a layout read in an event handler** —\n * the classic thrash. The element rect is cached and refreshed in the ticker's `read` phase.\n */\n\nexport interface PointerState {\n /** Position in CSS pixels relative to the element's top-left. */\n x: number\n y: number\n /** Normalised to `[0, 1]` across the element. Clamped, so it stays sane outside the bounds. */\n nx: number\n ny: number\n /** Critically-damped position, in element pixels. Prefer this for anything visual. */\n smoothX: number\n smoothY: number\n /** Normalised smoothed position. */\n smoothNx: number\n smoothNy: number\n /** Velocity in element pixels per second. */\n velocityX: number\n velocityY: number\n /** Is the pointer currently over the element? */\n inside: boolean\n /** Is a button or finger currently down? */\n down: boolean\n /** Normalised pressure in `[0, 1]`. `0.5` for devices that don't report it. */\n pressure: number\n /** `'mouse' | 'pen' | 'touch'`, or `'none'` before the first event. */\n type: 'mouse' | 'pen' | 'touch' | 'none'\n /**\n * Has the pointer ever been over this element?\n *\n * Effects use this to avoid snapping from the element's centre to the cursor on first hover —\n * before any interaction, the \"pointer\" should be treated as absent, not as at (0,0).\n */\n everInside: boolean\n}\n\nexport interface PointerOptions {\n /**\n * Smoothing half-life factor passed to `damp`. Lower is snappier.\n * `0.001` is near-instant, `0.2` is languid. Default `0.005`.\n */\n smoothing?: number\n /** Track movement even when the pointer is outside the element. Default `false`. */\n trackOutside?: boolean\n /**\n * Where the smoothed position rests before first interaction, normalised.\n * Default `{ x: 0.5, y: 0.5 }` — the centre, which is the least surprising neutral pose.\n */\n origin?: { x: number; y: number }\n}\n\nexport interface PointerTracker {\n readonly state: Readonly<PointerState>\n /** Recompute the cached element rect. Called automatically on resize and scroll. */\n refresh(): void\n destroy(): void\n}\n\n/**\n * Attach pointer tracking to an element.\n *\n * Listeners are passive and the only per-event work is arithmetic — no layout reads, no style\n * writes. Smoothing is integrated in the ticker's `compute` phase so it stays frame-rate\n * independent.\n */\nexport function trackPointer(element: HTMLElement, options: PointerOptions = {}): PointerTracker {\n const smoothing = options.smoothing ?? 0.005\n const trackOutside = options.trackOutside ?? false\n const originX = options.origin?.x ?? 0.5\n const originY = options.origin?.y ?? 0.5\n\n let rect = { left: 0, top: 0, width: 1, height: 1 }\n\n const state: PointerState = {\n x: 0,\n y: 0,\n nx: originX,\n ny: originY,\n smoothX: 0,\n smoothY: 0,\n smoothNx: originX,\n smoothNy: originY,\n velocityX: 0,\n velocityY: 0,\n inside: false,\n down: false,\n pressure: 0.5,\n type: 'none',\n everInside: false,\n }\n\n let lastX = 0\n let lastY = 0\n let hasLast = false\n /** Raw target the smoothed value chases, in element pixels. */\n let targetX = 0\n let targetY = 0\n\n const refresh = (): void => {\n const box = element.getBoundingClientRect()\n rect = {\n left: box.left,\n top: box.top,\n width: Math.max(1, box.width),\n height: Math.max(1, box.height),\n }\n // Keep the neutral pose centred as the element resizes.\n if (!state.everInside) {\n targetX = rect.width * originX\n targetY = rect.height * originY\n state.smoothX = targetX\n state.smoothY = targetY\n state.x = targetX\n state.y = targetY\n }\n }\n\n refresh()\n\n const onPointerMove = (event: PointerEvent): void => {\n const x = event.clientX - rect.left\n const y = event.clientY - rect.top\n\n const inside = x >= 0 && x <= rect.width && y >= 0 && y <= rect.height\n if (!inside && !trackOutside && !state.down) {\n state.inside = false\n return\n }\n\n state.x = x\n state.y = y\n state.nx = clamp(x / rect.width, 0, 1)\n state.ny = clamp(y / rect.height, 0, 1)\n state.inside = inside\n state.pressure = event.pressure > 0 ? event.pressure : 0.5\n state.type = (event.pointerType as PointerState['type']) || 'mouse'\n if (inside) state.everInside = true\n\n targetX = x\n targetY = y\n\n if (hasLast) {\n // Velocity from the event's own timing rather than the frame's: pointer events can\n // arrive several times per frame, and coalescing them here would understate speed.\n const dt = Math.max(1 / 1000, (event.timeStamp - lastTimeStamp) / 1000)\n state.velocityX = (x - lastX) / dt\n state.velocityY = (y - lastY) / dt\n }\n lastX = x\n lastY = y\n lastTimeStamp = event.timeStamp\n hasLast = true\n }\n\n let lastTimeStamp = 0\n\n const onPointerEnter = (event: PointerEvent): void => {\n state.inside = true\n state.everInside = true\n state.type = (event.pointerType as PointerState['type']) || 'mouse'\n // Seed the history so the first move doesn't compute a huge velocity from a stale sample.\n hasLast = false\n }\n\n const onPointerLeave = (): void => {\n state.inside = false\n state.down = false\n state.velocityX = 0\n state.velocityY = 0\n hasLast = false\n // Ease back to the neutral pose rather than jumping — the return to rest is part of the\n // interaction, and snapping there reads as a glitch.\n targetX = rect.width * originX\n targetY = rect.height * originY\n }\n\n const onPointerDown = (event: PointerEvent): void => {\n state.down = true\n state.pressure = event.pressure > 0 ? event.pressure : 0.5\n onPointerMove(event)\n }\n\n const onPointerUp = (event: PointerEvent): void => {\n state.down = false\n state.pressure = 0\n // A finger physically leaves the surface; a mouse cursor does not.\n if (event.pointerType === 'touch') onPointerLeave()\n }\n\n const passive = { passive: true } as const\n element.addEventListener('pointerenter', onPointerEnter, passive)\n element.addEventListener('pointerleave', onPointerLeave, passive)\n element.addEventListener('pointerdown', onPointerDown, passive)\n element.addEventListener('pointercancel', onPointerLeave, passive)\n // Move and up are bound to the window so a drag that leaves the element still tracks.\n const moveTarget: EventTarget = trackOutside ? window : element\n moveTarget.addEventListener('pointermove', onPointerMove as EventListener, passive)\n window.addEventListener('pointerup', onPointerUp as EventListener, passive)\n\n // Rect invalidation. Scroll is captured so ancestor scrolling counts, not just the window.\n const onScroll = () => refresh()\n window.addEventListener('scroll', onScroll, { passive: true, capture: true })\n window.addEventListener('resize', onScroll, passive)\n\n const ticker = getTicker()\n\n // Rect refresh lives in `read`, smoothing in `compute`. Two separate subscriptions rather\n // than one, precisely so the phase separation the kernel provides is actually used.\n const stopRead = ticker.add(\n () => {\n // Cheap guard: only re-measure when the element has actually moved. Comparing one\n // number per frame is far cheaper than an unconditional layout read.\n const box = element.getBoundingClientRect()\n if (box.left !== rect.left || box.top !== rect.top || box.width !== rect.width) {\n rect = {\n left: box.left,\n top: box.top,\n width: Math.max(1, box.width),\n height: Math.max(1, box.height),\n }\n }\n },\n { phase: 'read', name: 'pointer:rect' },\n )\n\n const stopCompute = ticker.add(\n ({ delta }) => {\n state.smoothX = damp(state.smoothX, targetX, smoothing, delta)\n state.smoothY = damp(state.smoothY, targetY, smoothing, delta)\n state.smoothNx = clamp(state.smoothX / rect.width, 0, 1)\n state.smoothNy = clamp(state.smoothY / rect.height, 0, 1)\n },\n { phase: 'compute', name: 'pointer:smooth' },\n )\n\n return {\n state,\n refresh,\n destroy() {\n element.removeEventListener('pointerenter', onPointerEnter)\n element.removeEventListener('pointerleave', onPointerLeave)\n element.removeEventListener('pointerdown', onPointerDown)\n element.removeEventListener('pointercancel', onPointerLeave)\n moveTarget.removeEventListener('pointermove', onPointerMove as EventListener)\n window.removeEventListener('pointerup', onPointerUp as EventListener)\n window.removeEventListener('scroll', onScroll, { capture: true } as EventListenerOptions)\n window.removeEventListener('resize', onScroll)\n stopRead()\n stopCompute()\n },\n }\n}\n","/**\n * The plugin registry — Ansh's dependency-injection seam.\n *\n * Three jobs:\n *\n * 1. **Effect discovery.** The CLI and the docs site need to enumerate every available effect\n * without importing all of them. Registration provides that index.\n * 2. **Renderer backends.** `canvas2d` ships today; `webgl` and `webgpu` will register against\n * the same interface. Effects request a *capability*, not a concrete API, so a new backend\n * requires no changes to any effect.\n * 3. **Edition gating.** Pro components declare the capabilities they need. The registry is the\n * one place that decides whether they're available, instead of `if (isPro)` checks scattered\n * through eighty components.\n *\n * Deliberately not a general-purpose IoC container. It is a typed map with lifecycle hooks —\n * enough for the extension points we actually have, and small enough to reason about.\n */\n\nexport type CapabilityName =\n | 'renderer:canvas2d'\n | 'renderer:webgl'\n | 'renderer:webgpu'\n | 'renderer:offscreen'\n | 'worker'\n | 'effect:core'\n | 'effect:pro'\n | 'behaviour:core'\n | 'behaviour:pro'\n | (string & {})\n\nexport interface Plugin {\n readonly name: string\n readonly version?: string\n /** Capabilities this plugin provides once installed. */\n readonly provides?: readonly CapabilityName[]\n /** Capabilities that must already be present. Installation throws if any are missing. */\n readonly requires?: readonly CapabilityName[]\n install?(registry: Registry): void\n uninstall?(registry: Registry): void\n}\n\nexport class CapabilityError extends Error {\n constructor(\n public readonly capability: CapabilityName,\n hint?: string,\n ) {\n super(\n `[ansh] Missing capability \"${capability}\".` +\n (hint ? ` ${hint}` : '') +\n ` See https://ansh.dev/docs/capabilities for the full list.`,\n )\n this.name = 'CapabilityError'\n }\n}\n\nexport class Registry {\n private readonly entries = new Map<string, Map<string, unknown>>()\n private readonly plugins = new Map<string, Plugin>()\n private readonly capabilities = new Set<CapabilityName>()\n /** Human-readable reason a gated capability is unavailable, keyed by capability. */\n private readonly gateHints = new Map<CapabilityName, string>()\n\n // -------------------------------------------------------------------------\n // Namespaced value storage\n // -------------------------------------------------------------------------\n\n /**\n * Store a value under `namespace:key`.\n *\n * Namespacing keeps effects, behaviours, renderers and easings from colliding, and lets\n * `list('effect')` enumerate one kind without filtering.\n */\n register<T>(namespace: string, key: string, value: T): void {\n let bucket = this.entries.get(namespace)\n if (!bucket) {\n bucket = new Map()\n this.entries.set(namespace, bucket)\n }\n if (bucket.has(key)) {\n // Overwriting silently is how you get two components rendering the same name\n // differently depending on import order. Loud is better.\n throw new Error(\n `[ansh] \"${key}\" is already registered under \"${namespace}\". ` +\n `Call unregister(\"${namespace}\", \"${key}\") first if replacement is intended.`,\n )\n }\n bucket.set(key, value)\n }\n\n get<T>(namespace: string, key: string): T | undefined {\n return this.entries.get(namespace)?.get(key) as T | undefined\n }\n\n /** Like {@link get} but throws a helpful error rather than returning `undefined`. */\n require<T>(namespace: string, key: string): T {\n const value = this.get<T>(namespace, key)\n if (value === undefined) {\n const available = this.list(namespace)\n throw new Error(\n `[ansh] No \"${key}\" registered under \"${namespace}\".` +\n (available.length > 0 ? ` Available: ${available.join(', ')}.` : ''),\n )\n }\n return value\n }\n\n has(namespace: string, key: string): boolean {\n return this.entries.get(namespace)?.has(key) ?? false\n }\n\n unregister(namespace: string, key: string): boolean {\n return this.entries.get(namespace)?.delete(key) ?? false\n }\n\n list(namespace: string): string[] {\n return [...(this.entries.get(namespace)?.keys() ?? [])].sort()\n }\n\n entriesOf<T>(namespace: string): Array<[string, T]> {\n return [...(this.entries.get(namespace)?.entries() ?? [])] as Array<[string, T]>\n }\n\n // -------------------------------------------------------------------------\n // Capabilities\n // -------------------------------------------------------------------------\n\n provide(capability: CapabilityName): void {\n this.capabilities.add(capability)\n this.gateHints.delete(capability)\n }\n\n revoke(capability: CapabilityName, hint?: string): void {\n this.capabilities.delete(capability)\n if (hint) this.gateHints.set(capability, hint)\n }\n\n supports(capability: CapabilityName): boolean {\n return this.capabilities.has(capability)\n }\n\n /**\n * Assert a capability is available.\n *\n * This is the edition gate. A Pro effect calls\n * `registry.requireCapability('effect:pro')` in its setup, and in the Free edition that\n * throws with a message explaining what to do — at mount time, with a stack trace pointing\n * at the component, rather than as a mysteriously blank canvas.\n */\n requireCapability(capability: CapabilityName): void {\n if (!this.capabilities.has(capability)) {\n throw new CapabilityError(capability, this.gateHints.get(capability))\n }\n }\n\n listCapabilities(): CapabilityName[] {\n return [...this.capabilities].sort()\n }\n\n // -------------------------------------------------------------------------\n // Plugins\n // -------------------------------------------------------------------------\n\n use(plugin: Plugin): this {\n if (this.plugins.has(plugin.name)) return this\n\n for (const required of plugin.requires ?? []) {\n if (!this.capabilities.has(required)) {\n throw new CapabilityError(\n required,\n `Plugin \"${plugin.name}\" requires it. Install the providing plugin first.`,\n )\n }\n }\n\n plugin.install?.(this)\n for (const capability of plugin.provides ?? []) this.provide(capability)\n this.plugins.set(plugin.name, plugin)\n return this\n }\n\n remove(name: string): boolean {\n const plugin = this.plugins.get(name)\n if (!plugin) return false\n plugin.uninstall?.(this)\n for (const capability of plugin.provides ?? []) this.capabilities.delete(capability)\n this.plugins.delete(name)\n return true\n }\n\n listPlugins(): Array<{ name: string; version: string }> {\n return [...this.plugins.values()].map((p) => ({ name: p.name, version: p.version ?? '0.0.0' }))\n }\n\n /** Wipe everything. Used between tests. */\n clear(): void {\n for (const name of [...this.plugins.keys()]) this.remove(name)\n this.entries.clear()\n this.capabilities.clear()\n this.gateHints.clear()\n }\n}\n\nlet shared: Registry | null = null\n\n/** The process-wide registry, created on first use. */\nexport function getRegistry(): Registry {\n if (shared === null) {\n shared = new Registry()\n // Canvas 2D is always available; everything else is opt-in via a plugin.\n shared.provide('renderer:canvas2d')\n shared.provide('effect:core')\n shared.provide('behaviour:core')\n }\n return shared\n}\n\nexport function resetRegistry(): void {\n shared?.clear()\n shared = null\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/kernel/types.ts","../src/kernel/clock.ts","../src/kernel/budget.ts","../src/kernel/ticker.ts","../src/a11y/reduced-motion.ts","../src/observers/pool.ts","../src/observers/pointer.ts","../src/plugins/registry.ts"],"names":["clamp","percentileSorted","set","damp"],"mappings":"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","file":"chunk-FNR4B3KY.cjs","sourcesContent":["/**\n * Everything a frame callback receives.\n *\n * Passed as a single frozen-by-convention object rather than positional arguments so that new\n * fields can be added without breaking every subscriber in the ecosystem.\n */\nexport interface FrameState {\n /** Scaled seconds since the ticker started, excluding paused time. */\n time: number\n /** Scaled, clamped seconds since the previous frame. Use this for all motion. */\n delta: number\n /** Unscaled, unclamped seconds since the previous frame. For profiling only. */\n rawDelta: number\n /** Monotonically increasing frame index. */\n frame: number\n /** Smoothed frames per second. */\n fps: number\n /**\n * Adaptive quality in `[0, 1]`. Multiply expensive work by this — particle counts, render\n * resolution, octave counts — so the effect degrades gracefully instead of dropping frames.\n */\n quality: number\n /** Raw `performance.now()` timestamp for this frame. */\n timestamp: number\n}\n\n/**\n * Scheduling phases, executed in this order every frame.\n *\n * The separation exists to make layout thrashing structurally impossible. If one component\n * reads `getBoundingClientRect()` while another has already written a style, the browser must\n * synchronously recompute layout — and with N components interleaving, that happens N times\n * per frame. By collecting all reads before any write, it happens at most once.\n *\n * - `read` — measure the DOM. Never mutate here.\n * - `compute` — pure calculation: physics, interpolation, layout maths. Touch no DOM.\n * - `write` — mutate styles, draw to canvas. Never measure here.\n * - `post` — bookkeeping after the visual work: analytics, `onComplete` callbacks.\n */\nexport type FramePhase = 'read' | 'compute' | 'write' | 'post'\n\nexport const FRAME_PHASES: readonly FramePhase[] = ['read', 'compute', 'write', 'post']\n\nexport type FrameCallback = (state: FrameState) => void\n\nexport interface SubscribeOptions {\n /** Which phase to run in. Default `'write'` — the common case for drawing effects. */\n phase?: FramePhase\n /**\n * Ordering within the phase. Lower runs first. Default `0`.\n *\n * Use this for genuine dependencies (a parallax container must position before its children\n * measure), not as a general-purpose knob — over-ordered systems are hard to reason about.\n */\n priority?: number\n /** Label used in error messages and the dev inspector. */\n name?: string\n}\n\n/** Returned by `ticker.add()`. Idempotent — calling it twice is safe. */\nexport type Unsubscribe = () => void\n","import { clamp } from '../math/scalar'\n\n/**\n * Time keeping for the ticker.\n *\n * Two decisions here matter more than they look:\n *\n * **Delta clamping.** When a tab is backgrounded, `requestAnimationFrame` stops. On return,\n * the first frame's delta is however long the user was away — seconds, or minutes. Feeding\n * that into a physics integrator sends every particle to infinity, and into a tween makes it\n * jump to its end. We clamp to `maxDelta` so the worst case is one slightly-long frame.\n *\n * **Seconds, not milliseconds.** Every public duration in Ansh is in seconds, because\n * that is what designers and CSS authors think in, and because it keeps spring constants at\n * human-readable magnitudes. Conversion happens once, here.\n */\nexport interface ClockOptions {\n /**\n * Largest delta the clock will report, in seconds. Default `1 / 15` (≈67 ms), which is\n * two dropped frames at 30 FPS — slow enough to notice, small enough to be harmless.\n */\n maxDelta?: number\n /** Multiplier on the passage of time. `0.5` is slow motion, `2` is double speed. Default `1`. */\n timeScale?: number\n}\n\nexport interface FrameTiming {\n /** Scaled seconds elapsed since the clock started, excluding paused time. */\n readonly time: number\n /** Scaled, clamped seconds since the previous frame. */\n readonly delta: number\n /** Unscaled, unclamped seconds since the previous frame. Use for profiling, not motion. */\n readonly rawDelta: number\n /** Monotonically increasing frame counter. */\n readonly frame: number\n /** The raw `performance.now()` timestamp for this frame. */\n readonly timestamp: number\n}\n\nexport class Clock {\n private maxDelta: number\n private scale: number\n\n private startTimestamp = 0\n private lastTimestamp = 0\n private accumulatedTime = 0\n private frameIndex = 0\n private running = false\n\n /** Leftover time for the fixed-step accumulator. */\n private fixedRemainder = 0\n\n constructor(options: ClockOptions = {}) {\n this.maxDelta = Math.max(1e-4, options.maxDelta ?? 1 / 15)\n this.scale = options.timeScale ?? 1\n }\n\n get timeScale(): number {\n return this.scale\n }\n\n set timeScale(value: number) {\n // Negative time would break every monotonicity assumption downstream; zero is a valid\n // \"freeze\" and is handled by the tick maths naturally.\n this.scale = Math.max(0, value)\n }\n\n get isRunning(): boolean {\n return this.running\n }\n\n get elapsed(): number {\n return this.accumulatedTime\n }\n\n start(timestamp: number): void {\n this.startTimestamp = timestamp\n this.lastTimestamp = timestamp\n this.running = true\n }\n\n /**\n * Resume after a pause.\n *\n * Only `lastTimestamp` is reset, so the delta for the resumed frame is small rather than\n * \"however long the pause lasted\". `accumulatedTime` continues from where it stopped, which\n * is what makes pause/resume invisible to animations mid-flight.\n */\n resume(timestamp: number): void {\n this.lastTimestamp = timestamp\n this.running = true\n }\n\n pause(): void {\n this.running = false\n }\n\n reset(): void {\n this.startTimestamp = 0\n this.lastTimestamp = 0\n this.accumulatedTime = 0\n this.frameIndex = 0\n this.fixedRemainder = 0\n this.running = false\n }\n\n /** Advance the clock and produce this frame's timing. */\n tick(timestamp: number): FrameTiming {\n const rawDelta = Math.max(0, (timestamp - this.lastTimestamp) / 1000)\n this.lastTimestamp = timestamp\n\n const delta = clamp(rawDelta, 0, this.maxDelta) * this.scale\n this.accumulatedTime += delta\n this.frameIndex++\n\n return {\n time: this.accumulatedTime,\n delta,\n rawDelta,\n frame: this.frameIndex,\n timestamp,\n }\n }\n\n /**\n * Number of fixed-size physics steps to run for a variable-length frame.\n *\n * Verlet and spring-constraint integrators are only stable at a fixed step; running them\n * with a variable delta makes stiffness frame-rate dependent, so a 144 Hz monitor gets\n * different physics from a 60 Hz one. This accumulates the leftover and reports whole steps.\n *\n * `maxSteps` bounds the work when a long frame has queued up many steps — better to fall\n * slightly behind real time than to spiral into an ever-longer catch-up.\n */\n fixedSteps(delta: number, step: number, maxSteps = 4): number {\n this.fixedRemainder += delta\n const steps = Math.min(maxSteps, Math.floor(this.fixedRemainder / step))\n this.fixedRemainder -= steps * step\n // Discard a backlog we've decided not to run, otherwise it accumulates indefinitely.\n if (this.fixedRemainder > step * maxSteps) this.fixedRemainder = 0\n return steps\n }\n\n /** Fraction of the way into the next fixed step, for interpolating rendered positions. */\n get fixedAlpha(): number {\n return this.fixedRemainder\n }\n\n get totalWallTime(): number {\n return (this.lastTimestamp - this.startTimestamp) / 1000\n }\n}\n","import { clamp, percentileSorted } from '../math/scalar'\n\n/**\n * Adaptive frame budgeting.\n *\n * The premise: an effect authored on a MacBook Pro will drop frames on a mid-range Android\n * phone, and the author will never see it. Rather than asking developers to hand-tune particle\n * counts per device — which nobody does — the kernel measures how long frames actually take and\n * publishes a single `quality` scalar in `[0, 1]`. Effects scale their own cost against it.\n *\n * Why p95 rather than the mean: a mean is dominated by the many cheap frames and hides the\n * occasional 40 ms stall that the user actually perceives as a stutter. p95 tracks the bad\n * frames, which are the ones worth reacting to.\n *\n * Quality moves slowly and asymmetrically — quick to shed work when frames are expensive, slow\n * to add it back. Oscillating between quality levels is more visually distracting than simply\n * running at the lower one, so hysteresis is deliberate.\n */\n\nexport interface FrameBudgetOptions {\n /**\n * Target frame duration in milliseconds. Defaults to the display's refresh interval as\n * measured at runtime, falling back to 16.67 ms.\n */\n targetFrameMs?: number\n /**\n * Fraction of the frame Ansh is allowed to spend. The rest is left for the browser's\n * own work — style, layout, paint, compositing — plus the host application. Default `0.5`.\n */\n share?: number\n /** Rolling window size in frames. Default `90` (≈1.5 s at 60 FPS). */\n window?: number\n /** How fast quality drops when over budget, per second. Default `0.6`. */\n degradeRate?: number\n /** How fast quality recovers when under budget, per second. Default `0.12`. */\n recoverRate?: number\n /** Floor on quality, so an effect never disappears entirely. Default `0.25`. */\n minQuality?: number\n}\n\nexport interface BudgetReport {\n /** Adaptive quality in `[minQuality, 1]`. Multiply your work by this. */\n quality: number\n /** Smoothed frames per second. */\n fps: number\n /** Median frame cost attributable to Ansh, in milliseconds. */\n p50: number\n /** 95th-percentile Ansh frame cost, in milliseconds. */\n p95: number\n /** The budget being measured against, in milliseconds. */\n budgetMs: number\n /** `true` while quality is below 1 — useful for a dev-mode indicator. */\n degraded: boolean\n}\n\nexport class FrameBudget {\n private readonly share: number\n private readonly windowSize: number\n private readonly degradeRate: number\n private readonly recoverRate: number\n private readonly minQuality: number\n\n private targetFrameMs: number\n private explicitTarget: boolean\n\n private costs: Float32Array\n private cursor = 0\n private filled = 0\n private scratch: number[] = []\n\n private qualityValue = 1\n private fpsValue = 60\n private p50Value = 0\n private p95Value = 0\n\n /** Frame intervals used to detect the display refresh rate. */\n private intervalSamples: number[] = []\n private refreshDetected = false\n\n constructor(options: FrameBudgetOptions = {}) {\n this.share = clamp(options.share ?? 0.5, 0.1, 1)\n this.windowSize = Math.max(15, Math.floor(options.window ?? 90))\n this.degradeRate = Math.max(0, options.degradeRate ?? 0.6)\n this.recoverRate = Math.max(0, options.recoverRate ?? 0.12)\n this.minQuality = clamp(options.minQuality ?? 0.25, 0.05, 1)\n\n this.explicitTarget = options.targetFrameMs !== undefined\n this.targetFrameMs = options.targetFrameMs ?? 1000 / 60\n this.costs = new Float32Array(this.windowSize)\n }\n\n get quality(): number {\n return this.qualityValue\n }\n\n get budgetMs(): number {\n return this.targetFrameMs * this.share\n }\n\n /**\n * Record one frame.\n *\n * @param costMs Milliseconds spent inside Ansh callbacks this frame.\n * @param rawDelta Unscaled seconds since the previous frame, for FPS and refresh detection.\n */\n record(costMs: number, rawDelta: number): void {\n if (rawDelta > 0) {\n const instantFps = 1 / rawDelta\n // Exponential smoothing; 0.1 settles in roughly a third of a second.\n this.fpsValue += (instantFps - this.fpsValue) * 0.1\n if (!this.explicitTarget) this.detectRefreshRate(rawDelta * 1000)\n }\n\n this.costs[this.cursor] = costMs\n this.cursor = (this.cursor + 1) % this.windowSize\n if (this.filled < this.windowSize) this.filled++\n\n this.recomputePercentiles()\n this.adaptQuality(rawDelta)\n }\n\n /**\n * Infer the display refresh rate from observed frame intervals.\n *\n * Assuming 60 Hz wastes half the available budget on a 120 Hz display and overspends on a\n * 30 Hz one. We take the median of the first 40 intervals (median, not mean, so a couple of\n * long startup frames don't skew it) and snap to the nearest common rate.\n */\n private detectRefreshRate(intervalMs: number): void {\n if (this.refreshDetected) return\n // Ignore obvious outliers: sub-millisecond frames and anything slower than 20 FPS.\n if (intervalMs < 1 || intervalMs > 50) return\n\n this.intervalSamples.push(intervalMs)\n if (this.intervalSamples.length < 40) return\n\n const sorted = this.intervalSamples.slice().sort((a, b) => a - b)\n const median = percentileSorted(sorted, 0.5)\n const hz = 1000 / median\n\n const COMMON_RATES = [30, 48, 60, 72, 90, 120, 144, 165, 240]\n let nearest = 60\n let bestDistance = Infinity\n for (const rate of COMMON_RATES) {\n const distance = Math.abs(rate - hz)\n if (distance < bestDistance) {\n bestDistance = distance\n nearest = rate\n }\n }\n\n this.targetFrameMs = 1000 / nearest\n this.refreshDetected = true\n this.intervalSamples = []\n }\n\n private recomputePercentiles(): void {\n const n = this.filled\n if (n === 0) return\n\n // Reuse one scratch array; this runs every frame and must not allocate.\n if (this.scratch.length !== n) this.scratch = new Array(n)\n for (let i = 0; i < n; i++) this.scratch[i] = this.costs[i]\n this.scratch.sort(ascending)\n\n this.p50Value = percentileSorted(this.scratch, 0.5)\n this.p95Value = percentileSorted(this.scratch, 0.95)\n }\n\n private adaptQuality(rawDelta: number): void {\n // Wait for a representative window before reacting; the first frames of a page are\n // always slow (layout, font loading, JIT warm-up) and are not a signal about capability.\n if (this.filled < 30) return\n\n const budget = this.budgetMs\n const dt = clamp(rawDelta, 0, 0.1)\n\n if (this.p95Value > budget) {\n // Scale the response to how badly we're over: 2× over budget sheds twice as fast.\n const severity = clamp(this.p95Value / budget - 1, 0, 2)\n this.qualityValue -= this.degradeRate * severity * dt\n } else if (this.p95Value < budget * 0.6) {\n // Only recover when there is comfortable headroom, not the instant we scrape under.\n this.qualityValue += this.recoverRate * dt\n }\n\n this.qualityValue = clamp(this.qualityValue, this.minQuality, 1)\n }\n\n report(): BudgetReport {\n return {\n quality: this.qualityValue,\n fps: this.fpsValue,\n p50: this.p50Value,\n p95: this.p95Value,\n budgetMs: this.budgetMs,\n degraded: this.qualityValue < 0.999,\n }\n }\n\n /** Force quality to a fixed value, disabling adaptation. Used by `performance=\"high\"`. */\n lockQuality(value: number): void {\n this.qualityValue = clamp(value, this.minQuality, 1)\n this.filled = 0\n this.cursor = 0\n this.costs.fill(0)\n }\n\n reset(): void {\n this.costs.fill(0)\n this.cursor = 0\n this.filled = 0\n this.qualityValue = 1\n this.p50Value = 0\n this.p95Value = 0\n }\n}\n\nfunction ascending(a: number, b: number): number {\n return a - b\n}\n","import { Clock, type ClockOptions } from './clock'\nimport { FrameBudget, type BudgetReport, type FrameBudgetOptions } from './budget'\nimport {\n FRAME_PHASES,\n type FrameCallback,\n type FramePhase,\n type FrameState,\n type SubscribeOptions,\n type Unsubscribe,\n} from './types'\n\n/**\n * The Ansh ticker — the page's single animation loop.\n *\n * Why one loop rather than one per component:\n *\n * - **Ordering.** With N independent `requestAnimationFrame` callbacks, execution order is\n * registration order, which is effectively random across a component tree. One loop gives\n * us phases, so reads and writes never interleave.\n * - **Cost.** One callback, one closure, one place to measure. Adaptive quality is only\n * possible if something knows the total frame cost.\n * - **Control.** Global pause on tab blur, on reduced-motion, on low battery — implemented\n * once instead of in eighty components.\n * - **Correctness.** Every animation on the page shares one clock, so nothing drifts out of\n * sync with anything else.\n *\n * The loop is lazy: it starts when the first subscriber is added and stops when the last one\n * leaves, so a page that mounts no effects pays nothing.\n */\n\ninterface Subscriber {\n readonly id: number\n readonly callback: FrameCallback\n readonly priority: number\n readonly name: string\n /** Consecutive throws. A repeatedly-failing subscriber is evicted rather than spamming. */\n errorCount: number\n}\n\nexport interface TickerOptions extends ClockOptions {\n budget?: FrameBudgetOptions\n /**\n * Schedule frames yourself instead of using `requestAnimationFrame`.\n * Tests inject a manual driver; a worker-based renderer could supply its own.\n */\n scheduler?: (callback: (timestamp: number) => void) => number\n canceller?: (handle: number) => void\n /**\n * Read the current time. Defaults to `performance.now()`.\n *\n * Must share a time origin with whatever `scheduler` passes to its callback — in the browser\n * `requestAnimationFrame` and `performance.now()` already do. An injected scheduler on its own\n * clock must supply this too, otherwise the first frame's delta is computed between two unrelated\n * timelines and clamps to zero.\n */\n now?: () => number\n /** Start automatically when the first subscriber is added. Default `true`. */\n autoStart?: boolean\n}\n\nconst MAX_CONSECUTIVE_ERRORS = 3\n\nexport class Ticker {\n private readonly clock: Clock\n private readonly budget: FrameBudget\n private readonly phases = new Map<FramePhase, Subscriber[]>()\n private readonly autoStart: boolean\n\n private readonly schedule: (callback: (timestamp: number) => void) => number\n private readonly cancel: (handle: number) => void\n private readonly readTime: () => number\n\n private handle: number | null = null\n private nextId = 1\n private paused = false\n private pauseReasons = new Set<string>()\n private disposed = false\n\n /**\n * Phase arrays are rebuilt lazily rather than re-sorted on every add/remove: components\n * mount in bursts, and sorting once before the next frame is cheaper than sorting per call.\n */\n private dirtyPhases = new Set<FramePhase>()\n\n /** Callbacks queued to run exactly once on the next frame. */\n private onceQueue: FrameCallback[] = []\n\n private listeners = new Set<(report: BudgetReport) => void>()\n\n private readonly state: FrameState = {\n time: 0,\n delta: 0,\n rawDelta: 0,\n frame: 0,\n fps: 60,\n quality: 1,\n timestamp: 0,\n }\n\n constructor(options: TickerOptions = {}) {\n this.clock = new Clock(options)\n this.budget = new FrameBudget(options.budget)\n this.autoStart = options.autoStart ?? true\n\n // Fall back to a timer during SSR and in test environments without rAF, so that code paths\n // depending on the ticker don't have to branch on environment.\n //\n // `.bind(globalThis)` is load-bearing, not defensive. `requestAnimationFrame` is a method on\n // `window`, and the browser rejects it when invoked with any other receiver — storing the bare\n // reference and later calling it as `this.schedule(...)` sets `this` to the Ticker and throws\n // \"Illegal invocation\", so nothing on the page animates at all. jsdom is lenient about this and\n // the test suite always injects its own scheduler, so it only surfaces in a real browser.\n const raf =\n options.scheduler ??\n (typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame.bind(globalThis)\n : (cb: (t: number) => void) => setTimeout(() => cb(now()), 16) as unknown as number)\n\n const caf =\n options.canceller ??\n (typeof cancelAnimationFrame === 'function'\n ? cancelAnimationFrame.bind(globalThis)\n : (h: number) => clearTimeout(h as unknown as ReturnType<typeof setTimeout>))\n\n this.schedule = raf\n this.cancel = caf\n this.readTime = options.now ?? now\n\n for (const phase of FRAME_PHASES) this.phases.set(phase, [])\n }\n\n // -------------------------------------------------------------------------\n // Subscription\n // -------------------------------------------------------------------------\n\n /**\n * Register a per-frame callback.\n *\n * @returns An idempotent unsubscribe function. Always call it on unmount — the leak harness\n * in the test suite fails the build if a component forgets.\n */\n add(callback: FrameCallback, options: SubscribeOptions = {}): Unsubscribe {\n if (this.disposed) return noop\n\n const phase = options.phase ?? 'write'\n const subscriber: Subscriber = {\n id: this.nextId++,\n callback,\n priority: options.priority ?? 0,\n name: options.name ?? 'anonymous',\n errorCount: 0,\n }\n\n const list = this.phases.get(phase)\n if (!list) return noop\n\n list.push(subscriber)\n this.dirtyPhases.add(phase)\n\n if (this.autoStart) this.start()\n\n let removed = false\n return () => {\n if (removed) return\n removed = true\n const index = list.indexOf(subscriber)\n if (index >= 0) list.splice(index, 1)\n if (this.subscriberCount === 0) this.stop()\n }\n }\n\n /** Run a callback on the next frame only. Useful for deferring a DOM read past a write. */\n once(callback: FrameCallback): void {\n if (this.disposed) return\n this.onceQueue.push(callback)\n if (this.autoStart) this.start()\n }\n\n /** Resolve on the next frame. `await ticker.nextFrame()` reads well in setup code. */\n nextFrame(): Promise<FrameState> {\n return new Promise((resolve) => this.once(resolve))\n }\n\n get subscriberCount(): number {\n let total = 0\n for (const list of this.phases.values()) total += list.length\n return total\n }\n\n /** Per-phase subscriber counts. Consumed by the dev inspector and the leak harness. */\n inspect(): Record<FramePhase, { count: number; names: string[] }> {\n const out = {} as Record<FramePhase, { count: number; names: string[] }>\n for (const phase of FRAME_PHASES) {\n const list = this.phases.get(phase) ?? []\n out[phase] = { count: list.length, names: list.map((s) => s.name) }\n }\n return out\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n start(): void {\n if (this.disposed || this.handle !== null) return\n const timestamp = this.readTime()\n if (this.clock.isRunning) this.clock.resume(timestamp)\n else this.clock.start(timestamp)\n this.handle = this.schedule(this.loop)\n }\n\n stop(): void {\n if (this.handle === null) return\n this.cancel(this.handle)\n this.handle = null\n this.clock.pause()\n }\n\n /**\n * Pause the ticker, tagged with a reason.\n *\n * Reasons are reference-counted by name so that independent systems can pause without\n * fighting: if the tab is hidden *and* the user prefers reduced motion, both hold a pause,\n * and resuming one doesn't restart animation while the other still applies.\n */\n pause(reason = 'manual'): void {\n this.pauseReasons.add(reason)\n this.paused = true\n this.stop()\n }\n\n resume(reason = 'manual'): void {\n this.pauseReasons.delete(reason)\n if (this.pauseReasons.size > 0) return\n this.paused = false\n if (this.subscriberCount > 0 || this.onceQueue.length > 0) this.start()\n }\n\n get isPaused(): boolean {\n return this.paused\n }\n\n get pausedBecause(): string[] {\n return [...this.pauseReasons]\n }\n\n get isRunning(): boolean {\n return this.handle !== null\n }\n\n get timeScale(): number {\n return this.clock.timeScale\n }\n\n set timeScale(value: number) {\n this.clock.timeScale = value\n }\n\n get time(): number {\n return this.clock.elapsed\n }\n\n /**\n * Advance one frame manually.\n *\n * The escape hatch that makes the whole engine testable: a test can drive 100 deterministic\n * frames without waiting on a real display, and a screenshot harness can seek to an exact\n * frame index.\n */\n step(deltaMs = 1000 / 60): FrameState {\n const timestamp = this.state.timestamp + deltaMs\n if (!this.clock.isRunning) this.clock.start(timestamp - deltaMs)\n this.runFrame(timestamp)\n return this.state\n }\n\n /** Release everything. The ticker cannot be restarted afterwards. */\n dispose(): void {\n this.stop()\n this.disposed = true\n for (const list of this.phases.values()) list.length = 0\n this.onceQueue.length = 0\n this.listeners.clear()\n }\n\n // -------------------------------------------------------------------------\n // Budget\n // -------------------------------------------------------------------------\n\n get quality(): number {\n return this.budget.quality\n }\n\n budgetReport(): BudgetReport {\n return this.budget.report()\n }\n\n /** Disable adaptation and pin quality. Backs the `performance=\"high\" | \"low\"` prop. */\n lockQuality(value: number): void {\n this.budget.lockQuality(value)\n }\n\n /** Subscribe to per-frame budget reports — powers the dev-mode FPS overlay. */\n onBudget(listener: (report: BudgetReport) => void): Unsubscribe {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n // -------------------------------------------------------------------------\n // The loop\n // -------------------------------------------------------------------------\n\n private readonly loop = (timestamp: number): void => {\n this.handle = null\n this.runFrame(timestamp)\n\n // Re-arm only if there is still work. A ticker with no subscribers stops entirely rather\n // than spinning an empty callback for the lifetime of the page.\n if (!this.paused && !this.disposed && (this.subscriberCount > 0 || this.onceQueue.length > 0)) {\n this.handle = this.schedule(this.loop)\n }\n }\n\n private runFrame(timestamp: number): void {\n const timing = this.clock.tick(timestamp)\n\n const state = this.state\n state.time = timing.time\n state.delta = timing.delta\n state.rawDelta = timing.rawDelta\n state.frame = timing.frame\n state.timestamp = timing.timestamp\n state.quality = this.budget.quality\n state.fps = this.budget.report().fps\n\n const startedAt = this.readTime()\n\n if (this.dirtyPhases.size > 0) this.sortDirtyPhases()\n\n for (const phase of FRAME_PHASES) {\n const list = this.phases.get(phase)\n if (!list || list.length === 0) continue\n\n // Iterate a snapshot: a callback may unsubscribe itself or add a sibling, and mutating\n // the array mid-iteration would skip or double-run subscribers.\n const snapshot = list.length === 1 ? list : list.slice()\n for (let i = 0; i < snapshot.length; i++) {\n this.invoke(snapshot[i], state, list)\n }\n }\n\n if (this.onceQueue.length > 0) {\n const queue = this.onceQueue\n this.onceQueue = []\n for (let i = 0; i < queue.length; i++) {\n try {\n queue[i](state)\n } catch (error) {\n reportError(error, 'once callback')\n }\n }\n }\n\n this.budget.record(this.readTime() - startedAt, timing.rawDelta)\n\n if (this.listeners.size > 0) {\n const report = this.budget.report()\n for (const listener of this.listeners) listener(report)\n }\n }\n\n /**\n * Run one subscriber, containing its failures.\n *\n * A throwing callback must not stop every other animation on the page — that turns one\n * component's bug into a whole-page visual failure. We log, and after several consecutive\n * throws we evict the subscriber, because 60 identical stack traces per second is not\n * diagnostics, it's a denial of service on the console.\n */\n private invoke(subscriber: Subscriber, state: FrameState, list: Subscriber[]): void {\n try {\n subscriber.callback(state)\n if (subscriber.errorCount > 0) subscriber.errorCount = 0\n } catch (error) {\n subscriber.errorCount++\n reportError(error, subscriber.name)\n\n if (subscriber.errorCount >= MAX_CONSECUTIVE_ERRORS) {\n const index = list.indexOf(subscriber)\n if (index >= 0) list.splice(index, 1)\n console.error(\n `[ansh] Removed frame callback \"${subscriber.name}\" after ` +\n `${MAX_CONSECUTIVE_ERRORS} consecutive errors. Other animations continue unaffected.`,\n )\n }\n }\n }\n\n private sortDirtyPhases(): void {\n for (const phase of this.dirtyPhases) {\n const list = this.phases.get(phase)\n // Stable sort by priority; ties fall back to registration order via `id`.\n if (list) list.sort((a, b) => a.priority - b.priority || a.id - b.id)\n }\n this.dirtyPhases.clear()\n }\n}\n\nfunction reportError(error: unknown, source: string): void {\n console.error(`[ansh] Error in frame callback \"${source}\":`, error)\n}\n\nfunction noop(): void {}\n\n/** Monotonic clock, falling back to `Date.now()` where `performance` is unavailable. */\nexport function now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now()\n}\n\n// ---------------------------------------------------------------------------\n// The shared instance\n// ---------------------------------------------------------------------------\n\nlet sharedTicker: Ticker | null = null\n\n/**\n * The process-wide ticker.\n *\n * Created lazily on first access so that importing Ansh has no side effects — important\n * for SSR, and for tree-shaking in apps that only use the pure colour or easing modules.\n */\nexport function getTicker(): Ticker {\n if (sharedTicker === null) sharedTicker = new Ticker()\n return sharedTicker\n}\n\n/**\n * Replace the shared ticker.\n *\n * Exists for tests (inject a manually-driven ticker) and for advanced hosts that need a\n * custom scheduler. Disposes the previous instance so subscribers can't leak across the swap.\n */\nexport function setTicker(ticker: Ticker): void {\n if (sharedTicker && sharedTicker !== ticker) sharedTicker.dispose()\n sharedTicker = ticker\n}\n\n/** Tear down the shared ticker. Call between tests to guarantee isolation. */\nexport function resetTicker(): void {\n if (sharedTicker) sharedTicker.dispose()\n sharedTicker = null\n}\n","import type { Unsubscribe } from '../kernel/types'\n\n/**\n * Reduced-motion support.\n *\n * `prefers-reduced-motion` is not a niche preference. It is set by users with vestibular\n * disorders, for whom large-scale parallax and continuous background motion cause genuine\n * physical nausea. Honouring it is not a nice-to-have, and it must not be each component's\n * job to remember — so the kernel owns it and every effect declares a strategy.\n *\n * The strategies exist because \"disable all animation\" is the wrong answer for most effects.\n * A gradient that slowly shifts hue is not what makes people ill; a full-viewport parallax\n * scroll is. So each effect states what it should do, and authors can override per instance.\n */\n\n/**\n * How an effect should behave when the user prefers reduced motion.\n *\n * - `static` — render one frame and stop. The design still reads correctly, nothing moves.\n * The right default for backgrounds.\n * - `slow` — keep animating at a fraction of the speed. Suitable for gentle, small-amplitude\n * motion where stillness would lose meaning (a loading indicator).\n * - `pause` — don't render at all. For effects whose whole purpose is movement.\n * - `none` — ignore the preference. Only correct for motion that conveys required\n * information, e.g. a progress indicator with no other affordance.\n */\nexport type ReducedMotionStrategy = 'static' | 'slow' | 'pause' | 'none'\n\n/** Application-level override, usually surfaced through a `<MotionConfig>` provider. */\nexport type ReducedMotionMode = 'auto' | 'always' | 'never'\n\nconst QUERY = '(prefers-reduced-motion: reduce)'\n\nlet override: ReducedMotionMode = 'auto'\nlet mediaQuery: MediaQueryList | null = null\nlet systemPreference = false\nlet initialised = false\n\nconst listeners = new Set<(reduced: boolean) => void>()\n\nfunction initialise(): void {\n if (initialised || typeof window === 'undefined' || !window.matchMedia) return\n initialised = true\n\n mediaQuery = window.matchMedia(QUERY)\n systemPreference = mediaQuery.matches\n\n const handler = (event: MediaQueryListEvent | MediaQueryList) => {\n systemPreference = event.matches\n notify()\n }\n\n // Safari before 14 only has the deprecated `addListener`. Supporting it costs two lines\n // and covers a non-trivial share of iOS users on older devices.\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', handler as (e: MediaQueryListEvent) => void)\n } else if (typeof mediaQuery.addListener === 'function') {\n mediaQuery.addListener(handler as (e: MediaQueryListEvent) => void)\n }\n}\n\nfunction notify(): void {\n const value = prefersReducedMotion()\n for (const listener of listeners) listener(value)\n}\n\n/**\n * Does the user want reduced motion?\n *\n * Returns `false` during SSR. That is the correct default: rendering the static fallback on the\n * server and the animated version on the client would be a hydration mismatch, whereas\n * rendering the animated markup and then immediately stopping it on the client is seamless.\n */\nexport function prefersReducedMotion(): boolean {\n if (override === 'always') return true\n if (override === 'never') return false\n initialise()\n return systemPreference\n}\n\n/**\n * Override the system preference application-wide.\n *\n * `'always'` is genuinely useful in production (an in-app \"reduce motion\" setting), and\n * essential in tests and screenshot harnesses where you need the static frame deterministically.\n */\nexport function setReducedMotionMode(mode: ReducedMotionMode): void {\n if (override === mode) return\n override = mode\n notify()\n}\n\nexport function getReducedMotionMode(): ReducedMotionMode {\n return override\n}\n\n/** Subscribe to preference changes. Fires immediately with the current value. */\nexport function onReducedMotionChange(listener: (reduced: boolean) => void): Unsubscribe {\n initialise()\n listeners.add(listener)\n listener(prefersReducedMotion())\n return () => listeners.delete(listener)\n}\n\nexport interface MotionResolution {\n /** Should the effect run its frame loop at all? */\n animate: boolean\n /** Should it render a single frame before stopping? */\n renderOnce: boolean\n /** Multiplier to apply to the effect's speed. */\n timeScale: number\n}\n\n/**\n * Turn a strategy plus the current preference into concrete instructions.\n *\n * Centralising this means every effect behaves consistently, and that adding a new strategy\n * later is a change in one file rather than eighty.\n */\nexport function resolveMotion(\n strategy: ReducedMotionStrategy = 'static',\n slowFactor = 0.25,\n): MotionResolution {\n if (!prefersReducedMotion() || strategy === 'none') {\n return { animate: true, renderOnce: false, timeScale: 1 }\n }\n\n switch (strategy) {\n case 'static':\n return { animate: false, renderOnce: true, timeScale: 0 }\n case 'pause':\n return { animate: false, renderOnce: false, timeScale: 0 }\n case 'slow':\n return { animate: true, renderOnce: false, timeScale: slowFactor }\n }\n}\n\n/** Reset module state. Test-only. */\nexport function resetReducedMotion(): void {\n override = 'auto'\n listeners.clear()\n}\n","import type { Unsubscribe } from '../kernel/types'\n\n/**\n * Pooled `IntersectionObserver` and `ResizeObserver`.\n *\n * Creating one observer per element is the default pattern in most React/Vue code, and it is\n * measurably wasteful: each observer is a separate object with its own callback and its own\n * entry in the browser's internal bookkeeping. A page with 200 scroll-revealed elements creates\n * 200 observers where 1 would do.\n *\n * These pools key observers by their *configuration*, so every element sharing a threshold\n * and root margin shares one observer. Callbacks are dispatched from a `WeakMap` keyed by\n * element, so unobserving an element cannot leak its callback.\n */\n\n// ---------------------------------------------------------------------------\n// Intersection\n// ---------------------------------------------------------------------------\n\nexport interface IntersectionConfig {\n root?: Element | Document | null\n rootMargin?: string\n /** A single threshold or a list. Lists are sorted so `[0, 1]` and `[1, 0]` share a pool. */\n threshold?: number | readonly number[]\n}\n\ntype IntersectionCallback = (entry: IntersectionObserverEntry) => void\n\ninterface IntersectionPoolEntry {\n observer: IntersectionObserver\n callbacks: WeakMap<Element, Set<IntersectionCallback>>\n /** Live element count, so the observer can be disconnected when it empties. */\n count: number\n}\n\nconst intersectionPools = new Map<string, IntersectionPoolEntry>()\n\nfunction intersectionKey(config: IntersectionConfig): string {\n const threshold = config.threshold ?? 0\n const thresholds = Array.isArray(threshold) ? [...threshold].sort((a, b) => a - b) : [threshold]\n // The root is part of the identity but has no stable serialisation; observers with a custom\n // root get their own pool via an identity tag stamped on the element.\n const rootTag = config.root ? rootIdentity(config.root) : 'viewport'\n return `${rootTag}|${config.rootMargin ?? '0px'}|${thresholds.join(',')}`\n}\n\nconst rootTags = new WeakMap<Element | Document, string>()\nlet rootCounter = 0\n\nfunction rootIdentity(root: Element | Document): string {\n let tag = rootTags.get(root)\n if (!tag) {\n tag = `root${++rootCounter}`\n rootTags.set(root, tag)\n }\n return tag\n}\n\n/**\n * Observe an element's intersection with the viewport (or a custom root).\n *\n * @returns An unsubscribe function. When the last subscriber for an element leaves, the\n * element is unobserved; when the last element leaves a pool, the observer is\n * disconnected and dropped.\n */\nexport function observeIntersection(\n element: Element,\n callback: IntersectionCallback,\n config: IntersectionConfig = {},\n): Unsubscribe {\n if (typeof IntersectionObserver === 'undefined') return () => {}\n\n const key = intersectionKey(config)\n let pool = intersectionPools.get(key)\n\n if (!pool) {\n const callbacks = new WeakMap<Element, Set<IntersectionCallback>>()\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const set = callbacks.get(entry.target)\n if (!set) continue\n // Copy before iterating: a callback commonly unsubscribes itself on first\n // intersection (\"reveal once\"), which would mutate the set mid-iteration.\n for (const cb of [...set]) cb(entry)\n }\n },\n {\n root: config.root ?? null,\n rootMargin: config.rootMargin ?? '0px',\n threshold: config.threshold ?? 0,\n } as IntersectionObserverInit,\n )\n pool = { observer, callbacks, count: 0 }\n intersectionPools.set(key, pool)\n }\n\n let set = pool.callbacks.get(element)\n if (!set) {\n set = new Set()\n pool.callbacks.set(element, set)\n pool.observer.observe(element)\n pool.count++\n }\n set.add(callback)\n\n let released = false\n return () => {\n if (released) return\n released = true\n\n const current = intersectionPools.get(key)\n if (!current) return\n\n const callbackSet = current.callbacks.get(element)\n if (!callbackSet) return\n\n callbackSet.delete(callback)\n if (callbackSet.size > 0) return\n\n current.callbacks.delete(element)\n current.observer.unobserve(element)\n current.count--\n\n if (current.count <= 0) {\n current.observer.disconnect()\n intersectionPools.delete(key)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resize\n// ---------------------------------------------------------------------------\n\nexport interface ResizeInfo {\n width: number\n height: number\n /** Device-pixel dimensions when the browser reports them, else `width`/`height` × DPR. */\n devicePixelWidth: number\n devicePixelHeight: number\n entry: ResizeObserverEntry\n}\n\ntype ResizeCallback = (info: ResizeInfo) => void\n\ninterface ResizePoolEntry {\n observer: ResizeObserver\n callbacks: WeakMap<Element, Set<ResizeCallback>>\n count: number\n}\n\nconst resizePools = new Map<ResizeObserverBoxOptions, ResizePoolEntry>()\n\n/**\n * Observe an element's size.\n *\n * Defaults to the `content-box`, matching CSS layout intuition. Canvas-backed effects pass\n * `'device-pixel-content-box'` where supported, because that gives the exact backing-store\n * size and avoids the half-pixel blurring that comes from rounding CSS pixels ourselves.\n */\nexport function observeResize(\n element: Element,\n callback: ResizeCallback,\n box: ResizeObserverBoxOptions = 'content-box',\n): Unsubscribe {\n if (typeof ResizeObserver === 'undefined') return () => {}\n\n let pool = resizePools.get(box)\n\n if (!pool) {\n const callbacks = new WeakMap<Element, Set<ResizeCallback>>()\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const set = callbacks.get(entry.target)\n if (!set) continue\n const info = describeResize(entry)\n for (const cb of [...set]) cb(info)\n }\n })\n pool = { observer, callbacks, count: 0 }\n resizePools.set(box, pool)\n }\n\n let set = pool.callbacks.get(element)\n if (!set) {\n set = new Set()\n pool.callbacks.set(element, set)\n try {\n pool.observer.observe(element, { box })\n } catch {\n // `device-pixel-content-box` throws in browsers that don't support it; fall back\n // rather than losing resize handling entirely.\n pool.observer.observe(element)\n }\n pool.count++\n }\n set.add(callback)\n\n let released = false\n return () => {\n if (released) return\n released = true\n\n const current = resizePools.get(box)\n if (!current) return\n\n const callbackSet = current.callbacks.get(element)\n if (!callbackSet) return\n\n callbackSet.delete(callback)\n if (callbackSet.size > 0) return\n\n current.callbacks.delete(element)\n current.observer.unobserve(element)\n current.count--\n\n if (current.count <= 0) {\n current.observer.disconnect()\n resizePools.delete(box)\n }\n }\n}\n\n/**\n * Normalise a `ResizeObserverEntry` across browsers.\n *\n * The spec went through several shapes; Safari shipped `contentRect` only for a long while,\n * and `devicePixelContentBoxSize` is still not universal. This picks the most precise\n * available source and always yields both CSS and device-pixel dimensions.\n */\nfunction describeResize(entry: ResizeObserverEntry): ResizeInfo {\n const dpr = typeof devicePixelRatio === 'number' ? devicePixelRatio : 1\n\n const contentBox = entry.contentBoxSize?.[0]\n const width = contentBox?.inlineSize ?? entry.contentRect.width\n const height = contentBox?.blockSize ?? entry.contentRect.height\n\n const devicePixelBox = entry.devicePixelContentBoxSize?.[0]\n\n return {\n width,\n height,\n devicePixelWidth: devicePixelBox?.inlineSize ?? Math.round(width * dpr),\n devicePixelHeight: devicePixelBox?.blockSize ?? Math.round(height * dpr),\n entry,\n }\n}\n\n/** Live pool counts. The leak harness asserts these return to zero after unmount. */\nexport function observerPoolStats(): { intersection: number; resize: number } {\n return { intersection: intersectionPools.size, resize: resizePools.size }\n}\n\n/** Disconnect every pooled observer. Test-only. */\nexport function resetObserverPools(): void {\n for (const pool of intersectionPools.values()) pool.observer.disconnect()\n for (const pool of resizePools.values()) pool.observer.disconnect()\n intersectionPools.clear()\n resizePools.clear()\n}\n","import { clamp, damp } from '../math/scalar'\nimport { getTicker } from '../kernel/ticker'\n\n/**\n * Unified pointer tracking.\n *\n * Three problems this solves that every project re-solves badly:\n *\n * 1. **Mouse, touch and pen are one input.** Pointer Events already unify them; this wraps\n * that so effects never branch on input type. Touch gets a synthetic \"leave\" on `pointerup`\n * because a finger genuinely does leave the surface, which mouse code forgets.\n *\n * 2. **Raw pointer coordinates are jittery.** A cursor moves in discrete jumps and a mesh\n * gradient that follows it exactly looks nervous. We expose both the raw position and a\n * critically-damped smoothed position; effects should use the smoothed one.\n *\n * 3. **Reading `getBoundingClientRect()` per move is a layout read in an event handler** —\n * the classic thrash. The element rect is cached and refreshed in the ticker's `read` phase.\n */\n\nexport interface PointerState {\n /** Position in CSS pixels relative to the element's top-left. */\n x: number\n y: number\n /** Normalised to `[0, 1]` across the element. Clamped, so it stays sane outside the bounds. */\n nx: number\n ny: number\n /** Critically-damped position, in element pixels. Prefer this for anything visual. */\n smoothX: number\n smoothY: number\n /** Normalised smoothed position. */\n smoothNx: number\n smoothNy: number\n /** Velocity in element pixels per second. */\n velocityX: number\n velocityY: number\n /** Is the pointer currently over the element? */\n inside: boolean\n /** Is a button or finger currently down? */\n down: boolean\n /** Normalised pressure in `[0, 1]`. `0.5` for devices that don't report it. */\n pressure: number\n /** `'mouse' | 'pen' | 'touch'`, or `'none'` before the first event. */\n type: 'mouse' | 'pen' | 'touch' | 'none'\n /**\n * Has the pointer ever been over this element?\n *\n * Effects use this to avoid snapping from the element's centre to the cursor on first hover —\n * before any interaction, the \"pointer\" should be treated as absent, not as at (0,0).\n */\n everInside: boolean\n}\n\nexport interface PointerOptions {\n /**\n * Smoothing half-life factor passed to `damp`. Lower is snappier.\n * `0.001` is near-instant, `0.2` is languid. Default `0.005`.\n */\n smoothing?: number\n /** Track movement even when the pointer is outside the element. Default `false`. */\n trackOutside?: boolean\n /**\n * Where the smoothed position rests before first interaction, normalised.\n * Default `{ x: 0.5, y: 0.5 }` — the centre, which is the least surprising neutral pose.\n */\n origin?: { x: number; y: number }\n}\n\nexport interface PointerTracker {\n readonly state: Readonly<PointerState>\n /** Recompute the cached element rect. Called automatically on resize and scroll. */\n refresh(): void\n destroy(): void\n}\n\n/**\n * Attach pointer tracking to an element.\n *\n * Listeners are passive and the only per-event work is arithmetic — no layout reads, no style\n * writes. Smoothing is integrated in the ticker's `compute` phase so it stays frame-rate\n * independent.\n */\nexport function trackPointer(element: HTMLElement, options: PointerOptions = {}): PointerTracker {\n const smoothing = options.smoothing ?? 0.005\n const trackOutside = options.trackOutside ?? false\n const originX = options.origin?.x ?? 0.5\n const originY = options.origin?.y ?? 0.5\n\n let rect = { left: 0, top: 0, width: 1, height: 1 }\n\n const state: PointerState = {\n x: 0,\n y: 0,\n nx: originX,\n ny: originY,\n smoothX: 0,\n smoothY: 0,\n smoothNx: originX,\n smoothNy: originY,\n velocityX: 0,\n velocityY: 0,\n inside: false,\n down: false,\n pressure: 0.5,\n type: 'none',\n everInside: false,\n }\n\n let lastX = 0\n let lastY = 0\n let hasLast = false\n /** Raw target the smoothed value chases, in element pixels. */\n let targetX = 0\n let targetY = 0\n\n const refresh = (): void => {\n const box = element.getBoundingClientRect()\n rect = {\n left: box.left,\n top: box.top,\n width: Math.max(1, box.width),\n height: Math.max(1, box.height),\n }\n // Keep the neutral pose centred as the element resizes.\n if (!state.everInside) {\n targetX = rect.width * originX\n targetY = rect.height * originY\n state.smoothX = targetX\n state.smoothY = targetY\n state.x = targetX\n state.y = targetY\n }\n }\n\n refresh()\n\n const onPointerMove = (event: PointerEvent): void => {\n const x = event.clientX - rect.left\n const y = event.clientY - rect.top\n\n const inside = x >= 0 && x <= rect.width && y >= 0 && y <= rect.height\n if (!inside && !trackOutside && !state.down) {\n state.inside = false\n return\n }\n\n state.x = x\n state.y = y\n state.nx = clamp(x / rect.width, 0, 1)\n state.ny = clamp(y / rect.height, 0, 1)\n state.inside = inside\n state.pressure = event.pressure > 0 ? event.pressure : 0.5\n state.type = (event.pointerType as PointerState['type']) || 'mouse'\n if (inside) state.everInside = true\n\n targetX = x\n targetY = y\n\n if (hasLast) {\n // Velocity from the event's own timing rather than the frame's: pointer events can\n // arrive several times per frame, and coalescing them here would understate speed.\n const dt = Math.max(1 / 1000, (event.timeStamp - lastTimeStamp) / 1000)\n state.velocityX = (x - lastX) / dt\n state.velocityY = (y - lastY) / dt\n }\n lastX = x\n lastY = y\n lastTimeStamp = event.timeStamp\n hasLast = true\n }\n\n let lastTimeStamp = 0\n\n const onPointerEnter = (event: PointerEvent): void => {\n state.inside = true\n state.everInside = true\n state.type = (event.pointerType as PointerState['type']) || 'mouse'\n // Seed the history so the first move doesn't compute a huge velocity from a stale sample.\n hasLast = false\n }\n\n const onPointerLeave = (): void => {\n state.inside = false\n state.down = false\n state.velocityX = 0\n state.velocityY = 0\n hasLast = false\n // Ease back to the neutral pose rather than jumping — the return to rest is part of the\n // interaction, and snapping there reads as a glitch.\n targetX = rect.width * originX\n targetY = rect.height * originY\n }\n\n const onPointerDown = (event: PointerEvent): void => {\n state.down = true\n state.pressure = event.pressure > 0 ? event.pressure : 0.5\n onPointerMove(event)\n }\n\n const onPointerUp = (event: PointerEvent): void => {\n state.down = false\n state.pressure = 0\n // A finger physically leaves the surface; a mouse cursor does not.\n if (event.pointerType === 'touch') onPointerLeave()\n }\n\n const passive = { passive: true } as const\n element.addEventListener('pointerenter', onPointerEnter, passive)\n element.addEventListener('pointerleave', onPointerLeave, passive)\n element.addEventListener('pointerdown', onPointerDown, passive)\n element.addEventListener('pointercancel', onPointerLeave, passive)\n // Move and up are bound to the window so a drag that leaves the element still tracks.\n const moveTarget: EventTarget = trackOutside ? window : element\n moveTarget.addEventListener('pointermove', onPointerMove as EventListener, passive)\n window.addEventListener('pointerup', onPointerUp as EventListener, passive)\n\n // Rect invalidation. Scroll is captured so ancestor scrolling counts, not just the window.\n const onScroll = () => refresh()\n window.addEventListener('scroll', onScroll, { passive: true, capture: true })\n window.addEventListener('resize', onScroll, passive)\n\n const ticker = getTicker()\n\n // Rect refresh lives in `read`, smoothing in `compute`. Two separate subscriptions rather\n // than one, precisely so the phase separation the kernel provides is actually used.\n const stopRead = ticker.add(\n () => {\n // Cheap guard: only re-measure when the element has actually moved. Comparing one\n // number per frame is far cheaper than an unconditional layout read.\n const box = element.getBoundingClientRect()\n if (box.left !== rect.left || box.top !== rect.top || box.width !== rect.width) {\n rect = {\n left: box.left,\n top: box.top,\n width: Math.max(1, box.width),\n height: Math.max(1, box.height),\n }\n }\n },\n { phase: 'read', name: 'pointer:rect' },\n )\n\n const stopCompute = ticker.add(\n ({ delta }) => {\n state.smoothX = damp(state.smoothX, targetX, smoothing, delta)\n state.smoothY = damp(state.smoothY, targetY, smoothing, delta)\n state.smoothNx = clamp(state.smoothX / rect.width, 0, 1)\n state.smoothNy = clamp(state.smoothY / rect.height, 0, 1)\n },\n { phase: 'compute', name: 'pointer:smooth' },\n )\n\n return {\n state,\n refresh,\n destroy() {\n element.removeEventListener('pointerenter', onPointerEnter)\n element.removeEventListener('pointerleave', onPointerLeave)\n element.removeEventListener('pointerdown', onPointerDown)\n element.removeEventListener('pointercancel', onPointerLeave)\n moveTarget.removeEventListener('pointermove', onPointerMove as EventListener)\n window.removeEventListener('pointerup', onPointerUp as EventListener)\n window.removeEventListener('scroll', onScroll, { capture: true } as EventListenerOptions)\n window.removeEventListener('resize', onScroll)\n stopRead()\n stopCompute()\n },\n }\n}\n","/**\n * The plugin registry — Ansh's dependency-injection seam.\n *\n * Three jobs:\n *\n * 1. **Effect discovery.** The CLI and the docs site need to enumerate every available effect\n * without importing all of them. Registration provides that index.\n * 2. **Renderer backends.** `canvas2d` ships today; `webgl` and `webgpu` will register against\n * the same interface. Effects request a *capability*, not a concrete API, so a new backend\n * requires no changes to any effect.\n * 3. **Edition gating.** Pro components declare the capabilities they need. The registry is the\n * one place that decides whether they're available, instead of `if (isPro)` checks scattered\n * through eighty components.\n *\n * Deliberately not a general-purpose IoC container. It is a typed map with lifecycle hooks —\n * enough for the extension points we actually have, and small enough to reason about.\n */\n\nexport type CapabilityName =\n | 'renderer:canvas2d'\n | 'renderer:webgl'\n | 'renderer:webgpu'\n | 'renderer:offscreen'\n | 'worker'\n | 'effect:core'\n | 'effect:pro'\n | 'behaviour:core'\n | 'behaviour:pro'\n | (string & {})\n\nexport interface Plugin {\n readonly name: string\n readonly version?: string\n /** Capabilities this plugin provides once installed. */\n readonly provides?: readonly CapabilityName[]\n /** Capabilities that must already be present. Installation throws if any are missing. */\n readonly requires?: readonly CapabilityName[]\n install?(registry: Registry): void\n uninstall?(registry: Registry): void\n}\n\nexport class CapabilityError extends Error {\n constructor(\n public readonly capability: CapabilityName,\n hint?: string,\n ) {\n super(\n `[ansh] Missing capability \"${capability}\".` +\n (hint ? ` ${hint}` : '') +\n ` See https://ansh.techiesofepi.com/showcase for the full list.`,\n )\n this.name = 'CapabilityError'\n }\n}\n\nexport class Registry {\n private readonly entries = new Map<string, Map<string, unknown>>()\n private readonly plugins = new Map<string, Plugin>()\n private readonly capabilities = new Set<CapabilityName>()\n /** Human-readable reason a gated capability is unavailable, keyed by capability. */\n private readonly gateHints = new Map<CapabilityName, string>()\n\n // -------------------------------------------------------------------------\n // Namespaced value storage\n // -------------------------------------------------------------------------\n\n /**\n * Store a value under `namespace:key`.\n *\n * Namespacing keeps effects, behaviours, renderers and easings from colliding, and lets\n * `list('effect')` enumerate one kind without filtering.\n */\n register<T>(namespace: string, key: string, value: T): void {\n let bucket = this.entries.get(namespace)\n if (!bucket) {\n bucket = new Map()\n this.entries.set(namespace, bucket)\n }\n if (bucket.has(key)) {\n // Overwriting silently is how you get two components rendering the same name\n // differently depending on import order. Loud is better.\n throw new Error(\n `[ansh] \"${key}\" is already registered under \"${namespace}\". ` +\n `Call unregister(\"${namespace}\", \"${key}\") first if replacement is intended.`,\n )\n }\n bucket.set(key, value)\n }\n\n get<T>(namespace: string, key: string): T | undefined {\n return this.entries.get(namespace)?.get(key) as T | undefined\n }\n\n /** Like {@link get} but throws a helpful error rather than returning `undefined`. */\n require<T>(namespace: string, key: string): T {\n const value = this.get<T>(namespace, key)\n if (value === undefined) {\n const available = this.list(namespace)\n throw new Error(\n `[ansh] No \"${key}\" registered under \"${namespace}\".` +\n (available.length > 0 ? ` Available: ${available.join(', ')}.` : ''),\n )\n }\n return value\n }\n\n has(namespace: string, key: string): boolean {\n return this.entries.get(namespace)?.has(key) ?? false\n }\n\n unregister(namespace: string, key: string): boolean {\n return this.entries.get(namespace)?.delete(key) ?? false\n }\n\n list(namespace: string): string[] {\n return [...(this.entries.get(namespace)?.keys() ?? [])].sort()\n }\n\n entriesOf<T>(namespace: string): Array<[string, T]> {\n return [...(this.entries.get(namespace)?.entries() ?? [])] as Array<[string, T]>\n }\n\n // -------------------------------------------------------------------------\n // Capabilities\n // -------------------------------------------------------------------------\n\n provide(capability: CapabilityName): void {\n this.capabilities.add(capability)\n this.gateHints.delete(capability)\n }\n\n revoke(capability: CapabilityName, hint?: string): void {\n this.capabilities.delete(capability)\n if (hint) this.gateHints.set(capability, hint)\n }\n\n supports(capability: CapabilityName): boolean {\n return this.capabilities.has(capability)\n }\n\n /**\n * Assert a capability is available.\n *\n * This is the edition gate. A Pro effect calls\n * `registry.requireCapability('effect:pro')` in its setup, and in the Free edition that\n * throws with a message explaining what to do — at mount time, with a stack trace pointing\n * at the component, rather than as a mysteriously blank canvas.\n */\n requireCapability(capability: CapabilityName): void {\n if (!this.capabilities.has(capability)) {\n throw new CapabilityError(capability, this.gateHints.get(capability))\n }\n }\n\n listCapabilities(): CapabilityName[] {\n return [...this.capabilities].sort()\n }\n\n // -------------------------------------------------------------------------\n // Plugins\n // -------------------------------------------------------------------------\n\n use(plugin: Plugin): this {\n if (this.plugins.has(plugin.name)) return this\n\n for (const required of plugin.requires ?? []) {\n if (!this.capabilities.has(required)) {\n throw new CapabilityError(\n required,\n `Plugin \"${plugin.name}\" requires it. Install the providing plugin first.`,\n )\n }\n }\n\n plugin.install?.(this)\n for (const capability of plugin.provides ?? []) this.provide(capability)\n this.plugins.set(plugin.name, plugin)\n return this\n }\n\n remove(name: string): boolean {\n const plugin = this.plugins.get(name)\n if (!plugin) return false\n plugin.uninstall?.(this)\n for (const capability of plugin.provides ?? []) this.capabilities.delete(capability)\n this.plugins.delete(name)\n return true\n }\n\n listPlugins(): Array<{ name: string; version: string }> {\n return [...this.plugins.values()].map((p) => ({ name: p.name, version: p.version ?? '0.0.0' }))\n }\n\n /** Wipe everything. Used between tests. */\n clear(): void {\n for (const name of [...this.plugins.keys()]) this.remove(name)\n this.entries.clear()\n this.capabilities.clear()\n this.gateHints.clear()\n }\n}\n\nlet shared: Registry | null = null\n\n/** The process-wide registry, created on first use. */\nexport function getRegistry(): Registry {\n if (shared === null) {\n shared = new Registry()\n // Canvas 2D is always available; everything else is opt-in via a plugin.\n shared.provide('renderer:canvas2d')\n shared.provide('effect:core')\n shared.provide('behaviour:core')\n }\n return shared\n}\n\nexport function resetRegistry(): void {\n shared?.clear()\n shared = null\n}\n"]}
|
|
@@ -888,7 +888,7 @@ function trackPointer(element, options = {}) {
|
|
|
888
888
|
var CapabilityError = class extends Error {
|
|
889
889
|
constructor(capability, hint) {
|
|
890
890
|
super(
|
|
891
|
-
`[ansh] Missing capability "${capability}".` + (hint ? ` ${hint}` : "") + ` See https://ansh.
|
|
891
|
+
`[ansh] Missing capability "${capability}".` + (hint ? ` ${hint}` : "") + ` See https://ansh.techiesofepi.com/showcase for the full list.`
|
|
892
892
|
);
|
|
893
893
|
this.capability = capability;
|
|
894
894
|
this.name = "CapabilityError";
|
|
@@ -1032,5 +1032,5 @@ function resetRegistry() {
|
|
|
1032
1032
|
}
|
|
1033
1033
|
|
|
1034
1034
|
export { CapabilityError, Clock, FRAME_PHASES, FrameBudget, Registry, Ticker, getReducedMotionMode, getRegistry, getTicker, now, observeIntersection, observeResize, observerPoolStats, onReducedMotionChange, prefersReducedMotion, resetObserverPools, resetReducedMotion, resetRegistry, resetTicker, resolveMotion, setReducedMotionMode, setTicker, trackPointer };
|
|
1035
|
-
//# sourceMappingURL=chunk-
|
|
1036
|
-
//# sourceMappingURL=chunk-
|
|
1035
|
+
//# sourceMappingURL=chunk-GQH5ZHPB.js.map
|
|
1036
|
+
//# sourceMappingURL=chunk-GQH5ZHPB.js.map
|