@panyam/tsappkit 0.3.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +113 -11
- package/dist/index.d.ts +113 -11
- package/dist/index.js +133 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +131 -24
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +4 -2
- package/src/page/IslandPage.ts +25 -0
- package/src/page/load.ts +86 -0
- package/src/page/mount.ts +105 -16
- package/src/page/spec.ts +7 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/EventBus.ts","../src/Component.ts","../src/LifecycleController.ts","../src/ThemeManager.ts","../src/TemplateLoader.ts","../src/Modal.ts","../src/ToastManager.ts","../src/SplashScreen.ts","../src/BasePage.ts","../src/MobileBottomDrawer.ts","../src/page/mount.ts","../src/page/spec.ts","../src/page/IslandPage.ts","../src/DOMUtils.ts","../src/KeyboardShortcutManager.ts"],"names":["KeyboardState"],"mappings":";AA2BA,IAAM,qBAAN,MAAoD;AAAA,EAChD,YAA4B,OAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAwB;AAAA,EAEpD,cAAA,CAAe,SAAA,EAAmB,IAAA,EAAW,OAAA,EAAc,OAAA,EAAoB;AAC3E,IAAA,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,EACrB;AACJ,CAAA;AAUO,IAAM,WAAN,MAAe;AAAA,EAMlB,WAAA,CAAY,YAAqB,KAAA,EAAO;AALxC,IAAA,IAAA,CAAQ,WAAA,uBAAqD,GAAA,EAAI;AACjE,IAAA,IAAA,CAAQ,mBAAA,uBAA8E,GAAA,EAAI;AAC1F,IAAA,IAAA,CAAQ,YAAA,uBAAyD,GAAA,EAAI;AACrE,IAAA,IAAA,CAAQ,SAAA,GAAqB,KAAA;AAGzB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,EAAA,CAAG,WAAmB,OAAA,EAA6B;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA;AAC1D,IAAA,IAAI,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,MAAA,IAAI,KAAK,SAAA,EAAW;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAA8C,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1E;AACA,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,kBAAA,CAAmB,OAAO,CAAA;AACjD,IAAA,WAAA,CAAY,GAAA,CAAI,SAAS,UAAU,CAAA;AACnC,IAAA,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKO,GAAA,CAAI,WAAmB,OAAA,EAA6B;AACvD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA;AAC1D,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,WAAA,CAAY,OAAO,OAAO,CAAA;AAC1B,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AAEnD,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,SAAS,CAAA;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,IAAA,CAAK,WAAmB,OAAA,EAA6B;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,kBAAA,CAAmB,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA,CAAG,IAAI,UAAU,CAAA;AAEhD,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,IAClE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,eAAA,CAAgB,SAAA,EAAmB,OAAA,EAAc,UAAA,EAAmC;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,CAAC,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAE5C,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,WAAA,CAAY,IAAI,UAAU,CAAA;AAC1B,MAAA,IAAI,KAAK,SAAA,EAAW;AAChB,QAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,EAAqC,SAAS,SAAS,UAAA,CAAW,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,MACpG;AAAA,IACJ,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACvB,MAAA,OAAA,CAAQ,IAAI,CAAA,4CAAA,EAA+C,SAAS,SAAS,UAAA,CAAW,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,IAC9G;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,CAAmB,SAAA,EAAmB,OAAA,EAAc,UAAA,EAAmC;AAC1F,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAElD,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA;AAEhD,MAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAC9B,QAAA,OAAA,CAAQ,IAAI,CAAA,sCAAA,EAAyC,SAAS,SAAS,UAAA,CAAW,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,MACxG;AAGA,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,SAAS,CAAA;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,IAAA,CAAc,SAAA,EAAmB,IAAA,EAAU,OAAA,EAAe,OAAA,EAAqB;AAClF,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAClD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAEpD,IAAA,MAAM,eAAA,GAAA,CAAmB,WAAA,EAAa,IAAA,IAAQ,CAAA,KAAM,cAAc,IAAA,IAAQ,CAAA,CAAA;AAC1E,IAAA,IAAI,oBAAoB,CAAA,EAAG;AACvB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,SAAS,CAAA,KAAA,EAAQ,eAAe,CAAA,YAAA,CAAc,CAAA;AAAA,IACtF;AAEA,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,WAAA,CAAY,QAAQ,CAAA,UAAA,KAAc;AAC9B,QAAA,IAAI;AACA,UAAA,UAAA,CAAW,cAAA,CAAe,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAC3D,UAAA,YAAA,EAAA;AAAA,QACJ,SAAS,KAAA,EAAO;AACZ,UAAA,UAAA,EAAA;AACA,UAAA,OAAA,CAAQ,KAAA;AAAA,YACJ,CAAA,iDAAA,EAAoD,SAAS,CAAA,iBAAA,EAC3C,UAAA,CAAW,YAAY,IAAI,CAAA,EAAA,CAAA;AAAA,YAC7C;AAAA,WACJ;AAAA,QACJ;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAGA,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,IAAA,GAAO,CAAA,EAAG;AACvC,MAAA,YAAA,CAAa,QAAQ,CAAA,UAAA,KAAc;AAC/B,QAAA,IAAI;AACA,UAAA,UAAA,CAAW,cAAA,CAAe,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAC3D,UAAA,YAAA,EAAA;AAAA,QACJ,SAAS,KAAA,EAAO;AACZ,UAAA,UAAA,EAAA;AACA,UAAA,OAAA,CAAQ,KAAA;AAAA,YACJ,yCAAyC,SAAS,CAAA,EAAA,CAAA;AAAA,YAClD;AAAA,WACJ;AAAA,QACJ;AAAA,MACJ,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACJ,CAAA,kBAAA,EAAqB,SAAS,CAAA,aAAA,EAC3B,YAAY,aAAa,UAAU,CAAA,OAAA;AAAA,OAC1C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAA0B;AAC7B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,SAAA,EAA2B;AACjD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,GAAG,IAAA,IAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,oBAAoB,KAAA,EAAM;AAC/B,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAAA,IACtD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,OAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAAA,EACrB;AACJ;AAEO,IAAM,mBAAA,GAAqB;AAAA,EAC9B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,eAAA,EAAiB;AACrB;AAEO,IAAM,mBAAA,GAAsB;AAAA,EAC/B,kBAAA,EAAoB,8BAAA;AAAA,EACpB,mBAAA,EAAqB,+BAAA;AAAA,EACrB,qBAAA,EAAuB,iCAAA;AAAA,EACvB,kBAAA,EAAoB,8BAAA;AAAA,EACpB,mBAAA,EAAqB,+BAAA;AAAA,EACrB,oBAAA,EAAsB,gCAAA;AAAA,EACtB,qBAAA,EAAuB;AAC3B;;;ACtOO,IAAe,gBAAf,MAAiF;AAAA,EAGpF,YAA4B,WAAA,EAAqC,WAAA,EAA0B,QAAA,GAA4B,IAAA,EAAsB,YAAqB,KAAA,EAAO;AAA7I,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAqC,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAA4E,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEzI,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,IAAY,IAAI,QAAA,EAAS;AAC1C,IAAA,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,WAAW,CAAA;AAAA,EACpE;AAAA,EAEA,IAAW,QAAA,GAAqB;AAC9B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEO,eAAe,OAAA,EAAuB;AACzC,IAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAG7C,IAAA,IAAA,CAAK,YAAY,SAAA,GAAY,OAAA;AAAA,EAIjC;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,CAAgB,SAAA,EAAmB,MAAA,GAAc,IAAA,EAAY;AACnE,IAAA,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAA,CAAmB,SAAA,EAAmB,MAAA,GAAc,IAAA,EAAY;AACtE,IAAA,IAAA,CAAK,QAAA,CAAS,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKU,IAAA,CAAc,SAAA,EAAmB,IAAA,EAAS,MAAA,EAAa,UAAe,IAAA,EAAY;AACxF,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,WAAW,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,cAAA,CAAe,SAAA,EAAmB,IAAA,EAAW,MAAA,EAAa,OAAA,EAAoB;AAGjF,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9E;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,YAAiD,QAAA,EAA4B;AACnF,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,aAAA,CAAiB,QAAQ,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKU,aAAkD,QAAA,EAAuB;AAC/E,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAoB,QAAQ,CAAC,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKU,GAAA,CAAI,OAAA,EAAiB,IAAA,GAAY,IAAA,EAAY;AACnD,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK,OAAO,IAAI,IAAI,CAAA;AAAA,IACxD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,gBAAA,GAA8D;AAEjE,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,iBAAA,GAA0C;AAAA,EAEjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAA,GAAiC;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAA,GAAmC;AAEtC,IAAA,IAAA,CAAK,WAAA,EAAa,gBAAgB,gBAAgB,CAAA;AAElD,IAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAAA,EACjD;AAAA,EAEA,IAAI,UAAU,SAAA,EAAmB;AAC/B,IAAA,MAAM,CAAC,OAAA,EAAS,KAAK,CAAA,GAAI,IAAA,CAAK,iBAAiB,SAAS,CAAA;AACxD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,YAAY,SAAA,GAAY,OAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAA,EAAiC;AAChD,IAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA,EAIA,YAAY,IAAA,EAAc;AAAA,EAE1B;AAAA;AAAA;AAIJ;;;ACzJO,IAAM,sBAAN,MAA0B;AAAA,EAU7B,WAAA,CAAsB,QAAA,EAAoB,MAAA,GAA6B,EAAC,EAAG;AAArD,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,eAAA,EAAiB,OAAO,eAAA,IAAmB,KAAA;AAAA,MAC3C,oBAAA,EAAsB,KAAA;AAAA,MACtB,kBAAA,EAAoB,OAAO,kBAAA,IAAsB;AAAA,KACrD;AACA,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,oBAAoB,EAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,mBAAmB,aAAA,EAA4C;AAGxE,IAAA,MAAM,IAAA,CAAK,iBAAiB,aAAa,CAAA;AAGzC,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAE9B,IAAA,MAAM,KAAK,QAAA,EAAS;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,aAAA,EAA4C;AACvE,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAkB;AACtC,IAAA,IAAI,KAAA,GAAQ,CAAC,aAAa,CAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,aAAa,CAAA;AAEnC,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,MAAM,cAAc,CAAA;AAAA,IAChC;AACA,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,GAAG,KAAA,EAAA,EAAU;AAC5C,MAAA,MAAM,WAAW,EAAC;AAClB,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,EAA+B;AACpD,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,KAAK,CAAA;AACjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAE,CAAA,GAAI,KAAA,CAAM,QAAO,CAAA,EAAA,EAAK;AACjC,QAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AAGzB,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACxB,UAAA,MAAM,IAAI,KAAA;AAAA,YACN,CAAA,oDAAA,EAAuD,SAAA,CAAU,WAAA,CAAY,IAAI,sDAC7B,KAAK,CAAA,+FAAA;AAAA,WAE7D;AAAA,QACJ;AAEA,QAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,kBAAA,EAAoB,SAAA,EAAW,KAAK,CAAA;AACvE,QAAA,MAAM,MAAA,GAAS,UAAU,gBAAA,EAAiB;AAC1C,QAAA,QAAA,CAAS,KAAK,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,KAA6B;AACvE,UAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,YAAA,IAAA,CAAK,aAAA,CAAc,KAAK,EAAE,CAAA;AAC1B,YAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,UAClB;AACA,UAAA,OAAO,QAAA;AAAA,QACT,CAAC,CAAC,CAAA;AAGF,QAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAG1B,QAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,mBAAA,EAAqB,SAAA,EAAW,KAAK,CAAA;AAAA,MAC5E;AACA,MAAA,KAAA,GAAQ,QAAA;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,kBAAA,GAA2B;AAEnC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,aAAA,EAAe;AACnC,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,QAAA,GAA0B;AAEtC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAkB;AACtC,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAE,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,QAAQ,KAAA,EAAA,EAAS;AAC/D,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,EAAqB;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAC/C,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC3B,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACrB,UAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,QACxC;AACA,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,QAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,kBAAA,EAAqB,IAAA,EAAM,CAAC,CAAA;AAC/D,QAAA,MAAM,MAAA,GAAS,KAAK,QAAA,EAAS;AAC7B,QAAA,QAAA,CAAS,KAAK,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAK,MAAM;AAC7C,UAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,mBAAA,EAAqB,IAAA,EAAM,CAAC,CAAA;AAAA,QACnE,CAAC,CAAC,CAAA;AAAA,MACN;AACA,MAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAA,GAA+B;AAExC,IAAA,KAAA,IAAS,QAAQ,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA,EAAE,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACpE,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,EAAqB;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAC/C,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC3B,QAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,oBAAA,EAAuB,IAAA,EAAM,KAAK,CAAA;AACrE,QAAA,MAAM,MAAA,GAAS,KAAK,UAAA,EAAW;AAC/B,QAAA,QAAA,CAAS,KAAK,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAK,MAAM;AAC7C,UAAA,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,qBAAA,EAAuB,IAAA,EAAM,KAAK,CAAA;AAAA,QACzE,CAAC,CAAC,CAAA;AAAA,MACN;AACA,MAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CACJ,KAAA,EACA,SAAA,EACA,KAAA,EACA,QAAsB,IAAA,EAClB;AACJ,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA;AAAA,MACV,KAAA;AAAA,MACA,EAAE,KAAA,EAAc,OAAA,EAAS,KAAA,IAAS,IAAA,EAAI;AAAA,MACtC,IAAA;AAAA,MACA;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,GAAA,CAAI,YAAoB,IAAA,EAAmB;AAC/C,IAAA,IAAI,IAAA,CAAK,OAAO,kBAAA,EAAoB;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,SAAiB,KAAA,EAAmB;AACjD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaJ;AA5La,mBAAA,CAIK,aAAA,GAAoC;AAAA,EAC9C,kBAAA,EAAoB,IAAA;AAAA,EACpB,cAAA,EAAgB,IAAA;AAAA;AAAA,EAChB,eAAA,EAAiB;AAAA;AACrB,CAAA;;;AC7BG,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EActB,OAAO,UAAA,GAAmB;AACtB,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA;AAE/C,IAAA,IAAI,UAAA,KAAe,cAAa,IAAA,IAC3B,CAAC,cAAc,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,EAAU;AAC5E,MAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,IACjD,CAAA,MAAO;AACH,MAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAAA,IACpD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,KAAA,EAAqB;AACjC,IAAA,IAAI,KAAA,KAAU,cAAa,MAAA,EAAQ;AAC/B,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,EAAS;AAC3D,QAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,MACjD,CAAA,MAAO;AACH,QAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAAA,MACpD;AAAA,IACJ,CAAA,MAAA,IAAW,KAAA,KAAU,aAAA,CAAa,IAAA,EAAM;AACpC,MAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAa,IAAI,CAAA;AAC/C,MAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,IACjD,CAAA,MAAO;AACH,MAAA,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,aAAA,CAAa,KAAK,CAAA;AAChD,MAAA,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAAA,IACpD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAA,GAAiC;AACpC,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA,IAAK,aAAA,CAAa,MAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAa,cAAA,EAAgC;AAChD,IAAA,IAAI,cAAA,KAAmB,cAAa,KAAA,EAAO;AACvC,MAAA,OAAO,aAAA,CAAa,IAAA;AAAA,IACxB,CAAA,MAAA,IAAW,cAAA,KAAmB,aAAA,CAAa,IAAA,EAAM;AAC7C,MAAA,OAAO,aAAA,CAAa,MAAA;AAAA,IACxB,CAAA,MAAO;AACH,MAAA,OAAO,aAAA,CAAa,KAAA;AAAA,IACxB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,YAAA,EAA8B;AAC5C,IAAA,QAAQ,YAAA;AAAc,MAClB,KAAK,aAAA,CAAa,KAAA;AAAO,QAAA,OAAO,aAAA,CAAa,cAAA;AAAA,MAC7C,KAAK,aAAA,CAAa,IAAA;AAAM,QAAA,OAAO,aAAA,CAAa,aAAA;AAAA,MAC5C,KAAK,aAAA,CAAa,MAAA;AAAA,MAClB;AAAS,QAAA,OAAO,aAAA,CAAa,eAAA;AAAA;AACjC,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAc,YAAA,EAA8B;AAC/C,IAAA,QAAQ,YAAA;AAAc,MAClB,KAAK,aAAA,CAAa,KAAA;AAAO,QAAA,OAAO,YAAA;AAAA,MAChC,KAAK,aAAA,CAAa,IAAA;AAAM,QAAA,OAAO,WAAA;AAAA,MAC/B,KAAK,aAAA,CAAa,MAAA;AAAA,MAClB;AAAS,QAAA,OAAO,gBAAA;AAAA;AACpB,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,IAAA,GAAa;AACvB,IAAA,aAAA,CAAa,UAAA,EAAW;AAAA,EAC5B;AACJ,CAAA;AAAA;AAhGa,aAAA,CAEF,KAAA,GAAQ,OAAA;AAFN,aAAA,CAGF,IAAA,GAAO,MAAA;AAHL,aAAA,CAIF,MAAA,GAAS,QAAA;AAAA;AAJP,aAAA,CAOO,cAAA,GAAiB,CAAA,uYAAA,CAAA;AAAA;AAPxB,aAAA,CAQO,aAAA,GAAgB,CAAA,sXAAA,CAAA;AAAA;AARvB,aAAA,CASO,eAAA,GAAkB,CAAA,qcAAA,CAAA;AAT/B,IAAM,YAAA,GAAN;;;ACDA,IAAM,iBAAN,MAAqB;AAAA,EAC1B,WAAA,CAAmB,eAAe,mBAAA,EAAqB;AAApC,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqB,UAAA,EAAwC;AACjE,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,YAAY,CAAA;AAClE,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAA,CAAK,YAAY,CAAA,YAAA,CAAc,CAAA;AACpE,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,aAAA,CAA2B,CAAA,mBAAA,EAAsB,UAAU,CAAA,EAAA,CAAI,CAAA;AACxG,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAM,CAAA,kBAAA,EAAqB,UAAU,CAAA,0BAAA,EAA6B,IAAA,CAAK,YAAY,CAAA,EAAA,CAAI,CAAA;AAC/F,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,eAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,UAAA,EAAmC;AAC1C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,oBAAA,CAAqB,UAAU,CAAA;AAC5D,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,eAAA,CAAgB,SAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,UAAA,EAAmC;AACtC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,oBAAA,CAAqB,UAAU,CAAA;AAC5D,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,mBAAA,GAAsB,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAU,CAAA,CAAE,CAAA;AAC5D,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAAA,EAMhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAA,CAAS,YAAoB,aAAA,EAA4C;AAC9E,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,UAAU,CAAA,0BAAA,CAA4B,CAAA;AAC7E,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,oBAAA,CAAqB,UAAU,CAAA;AAC5D,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEnB,MAAA,aAAA,CAAc,SAAA,GAAY,yDAAyD,UAAU,CAAA,mBAAA,CAAA;AAC7F,MAAA,OAAO,KAAA;AAAA,IACV;AAGA,IAAA,aAAA,CAAc,SAAA,GAAY,EAAA;AAG1B,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AACzD,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,UAAU,CAAA,gCAAA,CAAkC,CAAA;AAAA,IAExE,CAAA,MAAO;AACL,MAAA,aAAA,CAAc,QAAQ,CAAA,KAAA,KAAS;AAC7B,QAAA,aAAA,CAAc,WAAA,CAAY,KAAA,CAAM,SAAA,CAAU,IAAI,CAAgB,CAAA;AAAA,MAChE,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9FO,IAAM,MAAA,GAAN,MAAM,MAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBT,WAAA,GAAc;AATtB;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAAmC,IAAA;AAC3C,IAAA,IAAA,CAAQ,WAAA,GAAmB,IAAA;AAC3B,IAAA,IAAA,CAAQ,gBAAA,GAAsD,IAAA;AAC9D;AAAA,IAAA,IAAA,CAAQ,eAAA,GAAqD,IAAA;AAQ3D,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAA,CAAS,cAAA,CAAe,iBAAiB,CAAA;AAC/D,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA,CAAS,cAAA,CAAe,gBAAgB,CAAA;AAC7D,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,cAAA,CAAe,aAAa,CAAA;AACvD,IAAA,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,eAAe,CAAA;AAC3D,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,cAAA,CAAe,aAAa,CAAA;AAExD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,EAAe;AAEzC,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,WAAA,GAAqB;AACjC,IAAA,IAAI,CAAC,OAAM,QAAA,EAAU;AACnB,MAAA,MAAA,CAAM,QAAA,GAAW,IAAI,MAAA,EAAM;AAAA,IAC7B;AACA,IAAA,OAAO,MAAA,CAAM,QAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,GAAmB;AAEzB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAElD,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,aAAA,EAAe;AACnC,UAAA,IAAA,CAAK,IAAA,EAAK;AAAA,QACZ;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,WAAU,EAAG;AAC1C,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAkB;AACzD,QAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAGjB,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,6CAA6C,CAAA;AAChF,QAAA,IAAI,WAAA,EAAa;AACb,UAAA,IAAA,CAAK,IAAA,EAAK;AACV,UAAA;AAAA,QACJ;AAGA,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,2BAA2B,CAAA;AAC/D,QAAA,IAAI,YAAA,EAAc;AACd,UAAA,MAAM,MAAA,GAAS,YAAA,CAAa,YAAA,CAAa,mBAAmB,CAAA;AAE5D,UAAA,IAAI,MAAA,KAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAkB;AAC9C,YAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,WAAW,CAAA;AAAA,UAC1C,CAAA,MAAA,IAAW,MAAA,KAAW,OAAA,IAAW,IAAA,CAAK,eAAA,EAAiB;AACnD,YAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,WAAW,CAAA;AACrC,YAAA,IAAA,CAAK,IAAA,EAAK;AAAA,UACd;AAAA,QAEJ;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,SAAA,GAAqB;AAC1B,IAAA,OAAO,IAAA,CAAK,iBAAiB,CAAC,IAAA,CAAK,eAAe,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,GAAI,KAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,IAAA,CAAK,UAAA,EAAoB,IAAA,GAAY,IAAA,EAA0B;AACpE,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,KAAK,YAAA,EAAc;AAC5C,MAAA,OAAA,CAAQ,MAAM,4CAA4C,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,IACX;AAIA,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA,CAAe,QAAA,CAAS,UAAA,EAAY,KAAK,YAAY,CAAA;AAC1E,IAAA,IAAI,CAAC,OAAA,EAAS;AAGT,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAC7C,MAAA,UAAA,CAAW,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,GAAA,CAAI,cAAc,GAAG,EAAE,CAAA;AACvE,MAAA,OAAO,IAAA;AAAA,IACX;AAGA,IAAA,IAAA,CAAK,iBAAA,GAAoB,UAAA;AACzB,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,EAAC;AAC5B,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,QAAA,IAAY,IAAA;AAC1C,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAM,OAAA,IAAW,IAAA;AAGxC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC7C,QAAA,IAAI,GAAA,KAAQ,UAAA,KAAe,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,SAAA,CAAA,EAAY;AAChH,UAAA,IAAI,IAAA,CAAK,cAAc,IAAA,CAAK,YAAA,CAAa,QAAQ,GAAG,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,QACtE;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAG7C,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,GAAA,CAAI,cAAc,CAAA;AAAA,IAClD,GAAG,EAAE,CAAA;AAEL,IAAA,MAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,IAAA,GAAsB;AAC3B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAG1B,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,MAAA,CAAO,cAAc,CAAA;AAGnD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAG1C,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAG,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,SAAA,GAAY,EAAA;AACpD,QAAA,OAAA,EAAQ;AAAA,MACV,GAAG,GAAG,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAA,GAAwC;AAC7C,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAAoC;AACzC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,cAAA,GAAsB;AAC3B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW,OAAA,EAAoB;AACpC,IAAA,IAAA,CAAK,cAAc,EAAE,GAAG,IAAA,CAAK,WAAA,EAAa,GAAG,OAAA,EAAQ;AAGrD,IAAA,IAAI,IAAA,CAAK,gBAAgB,OAAA,EAAS;AAChC,MAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,QAAA,IAAI,GAAA,KAAQ,UAAA,KAAe,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,SAAA,CAAA,EAAY;AACjH,UAAA,IAAI,IAAA,CAAK,cAAc,IAAA,CAAK,YAAA,CAAa,QAAQ,GAAG,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,QACtE;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,IAAA,GAAc;AAC1B,IAAA,OAAO,OAAM,WAAA,EAAY;AAAA,EAC3B;AACF,CAAA;AAlOa,MAAA,CACI,QAAA,GAAyB,IAAA;AADnC,IAAM,KAAA,GAAN;;;ACEA,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA;AAAA;AAAA;AAAA,EAUd,WAAA,GAAc;AANtB,IAAA,IAAA,CAAQ,MAAA,uBAAuC,GAAA,EAAI;AACnD,IAAA,IAAA,CAAQ,OAAA,GAAkB,CAAA;AAOtB,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,CAAS,cAAA,CAAe,iBAAiB,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,gBAAgB,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,WAAA,GAA4B;AACtC,IAAA,IAAI,CAAC,cAAa,QAAA,EAAU;AACxB,MAAA,aAAA,CAAa,QAAA,GAAW,IAAI,aAAA,EAAa;AAAA,IAC7C;AACA,IAAA,OAAO,aAAA,CAAa,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,UAAU,KAAA,EAAe,OAAA,EAAiB,IAAA,GAAkB,MAAA,EAAQ,WAAmB,GAAA,EAAc;AACxG,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,UAAU,OAAO,EAAA;AAG9C,IAAA,MAAM,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,OAAA,EAAS,CAAA,CAAA;AAGhD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AAC1C,IAAA,KAAA,CAAM,EAAA,GAAK,EAAA;AACX,IAAA,KAAA,CAAM,SAAA,CAAU,OAAO,QAAQ,CAAA;AAG/B,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,aAAA,CAAc,cAAc,CAAA;AACvD,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,aAAA,CAAc,gBAAgB,CAAA;AAC3D,IAAA,IAAI,YAAA,eAA2B,WAAA,GAAc,KAAA;AAC7C,IAAA,IAAI,cAAA,iBAA+B,WAAA,GAAc,OAAA;AAGjD,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,CAAc,gBAAgB,CAAA;AAC1D,IAAA,IAAI,aAAA,EAAe;AAEf,MAAA,aAAA,CAAc,SAAA,GAAY,EAAA;AAG1B,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,WAAA;AAEJ,MAAA,QAAQ,IAAA;AAAM,QACV,KAAK,SAAA;AACD,UAAA,IAAA,GAAO,iTAAA;AACP,UAAA,WAAA,GAAc,kBAAA;AACd,UAAA;AAAA,QACJ,KAAK,OAAA;AACD,UAAA,IAAA,GAAO,iYAAA;AACP,UAAA,WAAA,GAAc,gBAAA;AACd,UAAA;AAAA,QACJ,KAAK,SAAA;AACD,UAAA,IAAA,GAAO,8XAAA;AACP,UAAA,WAAA,GAAc,mBAAA;AACd,UAAA;AAAA,QACJ,KAAK,MAAA;AAAA,QACL;AACI,UAAA,IAAA,GAAO,2SAAA;AACP,UAAA,WAAA,GAAc,iBAAA;AACd,UAAA;AAAA;AAIR,MAAA,aAAA,CAAc,SAAA,GAAY,IAAA;AAG1B,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,CAAc,aAAa,CAAA;AACvD,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,aAAA,CAAc,SAAA,GAAY,aAAA,CAAc,SAAA,CAAU,OAAA,CAAQ,sBAAsB,WAAW,CAAA;AAAA,MAC/F;AAAA,IACJ;AAGA,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,aAAA,CAAc,cAAc,CAAA;AACtD,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,MAAM;AACxC,QAAA,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,IACL;AAGA,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGzB,IAAA,UAAA,CAAW,MAAM;AACb,MAAA,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,WAAW,CAAA;AAC9C,MAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,aAAa,CAAA;AAAA,IAClD,GAAG,EAAE,CAAA;AAGL,IAAA,IAAI,WAAW,CAAA,EAAG;AACd,MAAA,UAAA,CAAW,MAAM;AACb,QAAA,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,MACrB,GAAG,QAAQ,CAAA;AAAA,IACf;AAEA,IAAA,OAAO,EAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,EAAA,EAAkB;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,IAAA,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,WAAA,EAAa,aAAa,CAAA;AACjD,IAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AAG3C,IAAA,UAAA,CAAW,MAAM;AACb,MAAA,KAAA,CAAM,MAAA,EAAO;AACb,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,IACzB,GAAG,GAAG,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAsB;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAA,KAAO;AAC3B,MAAA,IAAA,CAAK,UAAU,EAAE,CAAA;AAAA,IACrB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,IAAA,GAAqB;AAC/B,IAAA,OAAO,cAAa,WAAA,EAAY;AAAA,EACpC;AACJ,CAAA;AAxJa,aAAA,CACM,QAAA,GAAgC,IAAA;AAD5C,IAAM,YAAA,GAAN;;;ACLA,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxB,OAAO,OAAA,GAAgB;AACrB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAGjB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AAGvB,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB,GAAG,GAAG,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,CAAc,KAAA,EAAgB,OAAA,EAAwB;AAC3D,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,CAAc,qBAAqB,CAAA;AAC1D,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,aAAA,CAAc,uBAAuB,CAAA;AAC9D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,WAAA,GAAc,OAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAe,OAAA,EAAuB;AAC3C,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,OAAO,CAAC,CAAA;AAEzD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,aAAA,CAAc,4BAA4B,CAAA;AACrE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,cAAc,CAAA,CAAA,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,aAAA,CAAc,6BAA6B,CAAA;AACvE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,cAAc,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,OAAA,EAIL;AACP,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,YAAY,MAAA,EAAW;AAChE,MAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,QAAQ,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAA,GAAqB;AAC1B,IAAA,OAAO,CAAC,KAAK,SAAA,IAAa,CAAC,CAAC,QAAA,CAAS,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,EACpE;AACF;AA3Ga,YAAA,CACa,SAAA,GAAY,eAAA;AADzB,YAAA,CAEI,SAAA,GAAY,KAAA;;;ACQtB,IAAe,QAAA,GAAf,cAAgC,aAAA,CAAc;AAAA;AAAA,EASjD,WAAA,CAA4B,WAAA,EAAqB,QAAA,GAA4B,IAAA,EAAsB,YAAqB,KAAA,EAAO;AAE3H,IAAA,KAAA,CAAM,WAAA,EAAa,QAAA,CAAS,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAF7B,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAuE,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAI/F,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAG9B,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA;AAAA,EAGgB,gBAAA,GAA6D;AACzE,IAAA,IAAA,CAAK,IAAI,yCAAyC,CAAA;AAGlD,IAAA,OAAO,KAAK,4BAAA,EAA6B;AAAA,EAC7C;AAAA;AAAA,EAGgB,QAAA,GAAiB;AAC7B,IAAA,IAAA,CAAK,IAAI,2BAA2B,CAAA;AAGpC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKU,wBAAA,GAAiC;AAEvC,IAAA,YAAA,CAAa,IAAA,EAAK;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,IAAA,EAAK;AACxB,IAAA,IAAA,CAAK,YAAA,GAAe,aAAa,IAAA,EAAK;AAGtC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAA,CAAS,cAAA,CAAe,qBAAqB,CAAA;AACtE,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA,CAAS,cAAA,CAAe,mBAAmB,CAAA;AAElE,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,CAAC,KAAK,eAAA,EAAiB;AAClD,MAAA,OAAA,CAAQ,KAAK,0DAA0D,CAAA;AAAA,IAC3E;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKU,cAAA,GAAuB;AAE7B,IAAA,IAAI,KAAK,iBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,kBAAkB,gBAAA,CAAiB,OAAA,EAAS,KAAK,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC3F;AAGA,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAG5B,IAAA,IAAA,CAAK,+BAAA,EAAgC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKU,sBAAA,GAA+B;AACrC,IAAA,MAAM,cAAA,GAAiB,aAAa,sBAAA,EAAuB;AAC3D,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,YAAA,CAAa,cAAc,CAAA;AAC5D,IAAA,YAAA,CAAa,SAAS,WAAW,CAAA;AACjC,IAAA,IAAA,CAAK,uBAAuB,WAAW,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKU,uBAAuB,YAAA,EAA6B;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,IAAqB,CAAC,KAAK,eAAA,EAAiB;AAEtD,IAAA,MAAM,cAAA,GAAiB,YAAA,IAAgB,YAAA,CAAa,sBAAA,EAAuB;AAC3E,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,CAAW,cAAc,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,CAAA,yBAAA,EAA4B,YAAA,CAAa,aAAA,CAAc,cAAc,CAAC,CAAA,CAAA,CAAA;AAEpF,IAAA,IAAA,CAAK,gBAAgB,SAAA,GAAY,OAAA;AACjC,IAAA,IAAA,CAAK,iBAAA,CAAkB,YAAA,CAAa,YAAA,EAAc,KAAK,CAAA;AACvD,IAAA,IAAA,CAAK,iBAAA,CAAkB,YAAA,CAAa,OAAA,EAAS,KAAK,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKU,SAAA,CAAU,KAAA,EAAe,OAAA,EAAiB,IAAA,GAAiD,QAAQ,QAAA,EAAyB;AAClI,IAAA,IAAA,CAAK,YAAA,EAAc,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKU,SAAA,CAAU,YAAoB,IAAA,EAAkB;AACtD,IAAA,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,IAAI,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKU,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,OAAO,IAAA,EAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,GAA0B;AAChC,IAAA,OAAO,aAAa,sBAAA,EAAuB;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKU,UAAA,GAAsB;AAC5B,IAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,+BAAA,GAAwC;AAC9C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,yBAAyB,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,cAAA,CAAe,uBAAuB,CAAA;AAE9D,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACrB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,aAAA,CAAc,yBAAyB,CAAA;AAGrE,IAAA,MAAM,aAAa,MAAM;AACrB,MAAA,MAAA,CAAO,SAAA,CAAU,OAAO,QAAQ,CAAA;AAEhC,MAAA,KAAK,MAAA,CAAO,YAAA;AACZ,MAAA,qBAAA,CAAsB,MAAM;AACxB,QAAA,MAAA,CAAO,SAAA,CAAU,IAAI,MAAM,CAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,IACL,CAAA;AAGA,IAAA,MAAM,cAAc,MAAM;AACtB,MAAA,MAAA,CAAO,SAAA,CAAU,OAAO,MAAM,CAAA;AAE9B,MAAA,UAAA,CAAW,MAAM;AACb,QAAA,MAAA,CAAO,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,MACjC,GAAG,GAAG,CAAA;AAAA,IACV,CAAA;AAGA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACrC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAI,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACnC,QAAA,WAAA,EAAY;AAAA,MAChB,CAAA,MAAO;AACH,QAAA,UAAA,EAAW;AAAA,MACf;AAAA,IACJ,CAAC,CAAA;AAGD,IAAA,IAAI,cAAA,EAAgB;AAChB,MAAA,cAAA,CAAe,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAAA,IACxD;AAGA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACxC,MAAA,IAAI,EAAE,GAAA,KAAQ,QAAA,IAAY,OAAO,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACzD,QAAA,WAAA,EAAY;AAAA,MAChB;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,4BAAA,GAA+C;AAAE,IAAA,OAAO,EAAC;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAK5D,kBAAA,GAA2B;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAK5B,gBAAA,GAAyB;AAC/B,IAAA,IAAA,CAAK,IAAI,4CAA4C,CAAA;AAGrD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,aAAA,CAAc,UAAkB,UAAA,EAAiC;AACvE,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AAChE,MAAA,OAAA,GAAU,QAAA,CAAS,cAAc,KAAK,CAAA;AACtC,MAAA,OAAA,CAAQ,EAAA,GAAK,UAAA;AACb,MAAA,OAAA,CAAQ,SAAA,GAAY,eAAA;AAEpB,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,MAAM,KAAK,QAAA,CAAS,IAAA;AACjE,MAAA,aAAA,CAAc,YAAY,OAAO,CAAA;AAAA,IACrC;AAGA,IAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACb,MAAA,OAAA,CAAQ,EAAA,GAAK,UAAA;AAAA,IACjB;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEU,mBAAA,GAAsB;AAC5B,IAAA,YAAA,CAAa,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,OAAO,mBAAA,CAAuB,QAAA,EAAkB,SAAA,EAAgB,aAAA,EAAuB;AAEnF,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY;AAEtD,MAAA,MAAM,IAAA,GAAO,IAAI,SAAA,CAAU,aAAa,CAAA;AAGxC,MAAC,MAAA,CAAe,QAAQ,CAAA,GAAI,IAAA;AAG5B,MAAA,MAAM,sBAAsB,IAAI,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,oBAAoB,aAAa,CAAA;AAGpG,MAAA,MAAM,mBAAA,CAAoB,mBAAmB,IAAI,CAAA;AAAA,IACrD,CAAC,CAAA;AAAA,EACL;AACJ;;;AC9PO,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmB1E,WAAA,CAAY,WAAA,EAA0B,QAAA,EAAoB,SAAA,GAAqB,KAAA,EAAO;AAClF,IAAA,KAAA,CAAM,sBAAA,EAAwB,WAAA,EAAa,QAAA,EAAU,SAAS,CAAA;AAflE,IAAA,IAAA,CAAQ,MAAA,GAAkB,KAAA;AAI1B;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAsB,CAAA;AAC9B,IAAA,IAAA,CAAQ,aAAA,GAAwB,CAAA;AAChC,IAAA,IAAA,CAAQ,UAAA,GAAsB,KAAA;AAAA,EAU9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAA4C;AAE9C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,WAAA,CAAY,aAAA,CAAc,kBAAkB,CAAA;AACxE,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,WAAA,CAAY,aAAA,CAAc,mBAAmB,CAAA;AACvE,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,aAAA,CAAc,iBAAiB,CAAA;AACtE,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,aAAA,CAAc,mBAAmB,CAAA;AAErE,IAAA,IAAI,CAAC,KAAK,eAAA,IAAmB,CAAC,KAAK,aAAA,IAAiB,CAAC,KAAK,cAAA,EAAgB;AACtE,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC5E;AAGA,IAAA,IAAA,CAAK,UAAA,EAAW;AAEhB,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,GAAmB;AAEvB,IAAA,IAAA,CAAK,eAAA,CAAgB,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAClD,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,eAAA,EAAiB;AACnC,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACf;AAAA,IACJ,CAAC,CAAA;AAGD,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC7C,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACf,CAAC,CAAA;AAAA,IACL;AAGA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACxC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ;AACnC,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACf;AAAA,IACJ,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,YAAA,EAAc,CAAC,CAAA,KAAM,IAAA,CAAK,gBAAA,CAAiB,CAAC,CAAA,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AACpG,IAAA,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA,EAAG,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACnG,IAAA,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,UAAA,EAAY,CAAC,CAAA,KAAM,IAAA,CAAK,cAAA,CAAe,CAAC,CAAA,EAAG,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACpG;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,CAAA,EAAqB;AAE1C,IAAA,MAAM,gBAAA,GAAmB,KAAK,cAAA,CAAe,SAAA;AAG7C,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAChC,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,WAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,CAAA,EAAqB;AACzC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,WAAA;AAGzC,IAAA,IAAI,SAAS,CAAA,EAAG;AAEZ,MAAA,CAAA,CAAE,cAAA,EAAe;AAGjB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AACvC,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,UAAU,CAAA,GAAA,CAAA;AAG7D,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAO,aAAa,GAAI,CAAA;AACpD,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,UAAA,GAAa,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA,CAAA;AAAA,IACpE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,CAAA,EAAqB;AACxC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,WAAA;AACzC,IAAA,MAAM,WAAW,MAAA,GAAS,GAAA;AAG1B,IAAA,IAAI,MAAA,GAAS,GAAA,IAAO,QAAA,GAAW,GAAA,EAAK;AAChC,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf,CAAA,MAAO;AAEH,MAAA,IAAA,CAAK,aAAA,CAAc,MAAM,SAAA,GAAY,EAAA;AACrC,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,UAAA,GAAa,EAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,IAAA,GAAa;AAChB,IAAA,IAAI,KAAK,MAAA,EAAQ;AAEjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAGd,IAAA,IAAA,CAAK,aAAA,CAAc,MAAM,SAAA,GAAY,EAAA;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,UAAA,GAAa,EAAA;AAGxC,IAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAGrC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,eAAA,EAAiB,EAAE,UAAU,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,EAAM,IAAI,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAGd,IAAA,IAAA,CAAK,aAAA,CAAc,MAAM,SAAA,GAAY,EAAA;AACrC,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,UAAA,GAAa,EAAA;AAGxC,IAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAGxC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,eAAA,EAAiB,EAAE,UAAU,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,EAAM,IAAI,CAAA;AAG9E,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,MAAA,GAAe;AAClB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKO,SAAA,GAAqB;AACxB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,OAAA,EAA4B;AAC1C,IAAA,IAAA,CAAK,eAAe,SAAA,GAAY,EAAA;AAChC,IAAA,IAAA,CAAK,cAAA,CAAe,YAAY,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,QAAA,EAA4B;AAC1C,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAA,GAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAChB;AACJ;;;ACnNO,SAAS,aACd,IAAA,EACA,QAAA,EACA,QAAA,EACA,OAAA,EACA,KACA,GAAA,EACK;AACL,EAAA,MAAM,MAAW,EAAC;AAClB,EAAA,IAAI,GAAA;AACJ,EAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AACtG,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,GAAA,CAAI,CAAA,6BAAA,EAAgC,MAAA,CAAO,IAAI,CAAA,yBAAA,CAA2B,CAAA;AAC1E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAC/B,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,GAAA,CAAI,sBAAsB,MAAA,CAAO,IAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAI,CAAA,0BAAA,CAA4B,CAAA;AAC7F,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,GAAA,KAAA,GAAA,GAAQ,OAAA,EAAQ,CAAA;AAChB,MAAA,GAAA,CAAI,KAAK,OAAA,CAAQ,EAAA,EAAI,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IACxC,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAI,CAAA,mBAAA,EAAsB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/G;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;AC9CO,IAAM,eAAA,GAAkB;AA0B/B,IAAM,IAAA,GAAO,mBAAA;AAaN,SAAS,QAAA,CAA6B,MAAiC,MAAA,EAAiE;AAC7I,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,IAAK,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,GAAG,OAAO,IAAA;AAC5F,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,EAAA,IAAM,IAAI,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,SAAS,EAAE,CAAA,IAAK,OAAO,EAAA,CAAG,IAAA,KAAS,YAAY,CAAC,EAAA,CAAG,QAAQ,OAAO,EAAA,CAAG,SAAS,QAAA,IAAY,CAAC,KAAK,IAAA,CAAK,EAAA,CAAG,IAAI,CAAA,EAAG;AACpH,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,GAAI,OAAO,EAAA,CAAG,YAAA,KAAiB,YAAY,EAAE,YAAA,EAAc,GAAG,YAAA,EAAa;AAAA,MAC3E,QAAQ,QAAA,CAAS,EAAA,CAAG,MAAM,CAAA,GAAI,EAAA,CAAG,SAAS;AAAC,KAC5C,CAAA;AAAA,EACH;AACA,EAAA,MAAM,IAAA,GAAiB,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,OAAA,EAAQ;AACrD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAClB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,GAAG,IAAA,EAAK;AAC3B;AAEA,SAAS,SAAS,CAAA,EAA0C;AAC1D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;;;ACzDO,IAAe,UAAA,GAAf,cAAgE,QAAA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpE,cAAc,GAAA,EAAmC;AACzD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEmB,4BAAA,GAA+C;AAChE,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,cAAA,CAAe,eAAe,CAAA,EAAG,WAAA,EAAa,CAAC,GAAA,KAAQ,IAAA,CAAK,aAAA,CAAc,GAAG,CAAC,CAAA;AAC7G,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,eAAe,CAAA,oCAAA,CAAsC,CAAA;AAC7F,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,YAAA;AAAA,MACL,IAAA;AAAA,MACA,KAAK,QAAA,EAAS;AAAA,MACd,CAAC,IAAA,KAAS,QAAA,CAAS,aAAA,CAA2B,CAAA,YAAA,EAAe,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,MACrE,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAAA,MAC3B,IAAA,CAAK,QAAA;AAAA,MACL,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,KACnC;AAAA,EACF;AACF;;;ACrCO,SAAS,iBAAiB,OAAA,EAAsC;AACnE,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAG5C,EAAA,IAAI,OAAA,KAAY,OAAA,IAAW,OAAA,KAAY,UAAA,IAAc,YAAY,QAAA,EAAU;AACvE,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,IAAI,OAAA,CAAQ,eAAA,KAAoB,MAAA,IAAU,OAAA,CAAQ,iBAAA,EAAmB;AACjE,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,KAAM,IAAA,IAC7B,QAAQ,OAAA,CAAQ,UAAU,CAAA,KAAM,IAAA,IAChC,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,KAAM,IAAA,IAC9B,OAAA,CAAQ,OAAA,CAAQ,0BAA0B,CAAA,KAAM,QAChD,OAAA,CAAQ,OAAA,CAAQ,sBAAsB,CAAA,KAAM,IAAA,EAAM;AAClD,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,KAAM,IAAA,EAAM;AACpC,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,iBAAiB,CAAA;AACxC,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,OAAA,CAAQ,EAAE,KACjC,aAAA,CAAc,IAAA,CAAK,CAAA,EAAA,KAAM,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA,KAAM,IAAI,CAAA,EAAG;AAC9D,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,KAAA;AACX;AASO,SAAS,gBAAgB,KAAA,EAA+B;AAC3D,EAAA,OAAO,MAAM,OAAA,IAAW,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA;AACnE;AASO,SAAS,qBAAqB,KAAA,EAA+B;AAChE,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,IAAK,gBAAA,CAAiB,MAAM,CAAA;AAC5D;;;AChCO,IAAK,aAAA,qBAAAA,cAAAA,KAAL;AACH,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,eAAA,eAAA,CAAA,GAAgB,eAAA;AAFR,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAKL,IAAM,0BAAN,MAA8B;AAAA,EAejC,YAAY,MAAA,EAA+B;AAd3C,IAAA,IAAA,CAAQ,SAAA,uBAA6C,GAAA,EAAI;AACzD,IAAA,IAAA,CAAQ,KAAA,GAAuB,QAAA;AAC/B,IAAA,IAAA,CAAQ,cAAA,GAAyB,EAAA;AACjC,IAAA,IAAA,CAAQ,WAAA,GAAsB,EAAA;AAC9B,IAAA,IAAA,CAAQ,aAAA,GAA+B,IAAA;AACvC,IAAA,IAAA,CAAQ,OAAA,GAAkB,GAAA;AAC1B;AAAA,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AACnC,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,kBAAA,GAA8B,KAAA;AACtC;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAuB,GAAA;AAC/B;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAkC,IAAA;AAC1C;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA2B,KAAA;AACnC;AAAA,IAAA,IAAA,CAAQ,aAAA,GAA2E,IAAA;AAG/E,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,IAAA;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,KAAA;AACvD,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,GAAA;AAC3C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,IAAA;AAG7C,IAAA,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AACjC,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC7C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EACpB;AAAA,EAEQ,UAAA,GAAmB;AAEvB,IAAA,QAAA,CAAS,iBAAiB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAGlE,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC9B;AAAA,EAEQ,cAAc,KAAA,EAA4B;AAC9C,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAGrB,IAAA,IAAI,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC1B,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,IAAA,CAAK,UAAU,QAAA,eAAsB;AAC1D,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,MAAA,KAAA,CAAM,cAAA,EAAe;AAGrB,MAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,eAAA,EAAiB;AACjD,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,MAC9B;AAEA,MAAA,IAAA,CAAK,UAAA,EAAW;AAChB,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,eAAsB;AACrC,MAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,eAAA,sBAA6B;AACnD,MAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAAA,IACtC;AAAA,EACJ;AAAA,EAEQ,kBAAkB,KAAA,EAA4B;AAClD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAEvC,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,KAAA,CAAM,cAAA,EAAe;AAGrB,MAAA,IAAI,SAAS,aAAA,IAAiB,CAAC,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,EAAG;AAC1D,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,SAAS,YAAA,EAAc;AAEvB,QAAA,IAAA,CAAK,KAAA,GAAQ,eAAA;AACb,QAAA,IAAA,CAAK,cAAA,GAAiB,GAAA;AACtB,QAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,QAAA,IAAA,CAAK,YAAA,EAAa;AAGlB,QAAA,IAAI,KAAK,aAAA,EAAe;AACpB,UAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAAA,QACtC;AAAA,MACJ,CAAA,MAAO;AAEH,QAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,wBAAwB,KAAA,EAA4B;AACxD,IAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAElB,IAAA,IAAI,GAAA,IAAO,GAAA,IAAO,GAAA,IAAO,GAAA,EAAK;AAE1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAA,CAAK,WAAA,IAAe,GAAA;AACpB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,YAAA,EAAa;AAGlB,MAAA,IAAI,KAAK,kBAAA,EAAoB;AACzB,QAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,MAClC;AAAA,IACJ,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,GAAA,EAAK;AAEvC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,IAC/B,CAAA,MAAA,IAAW,QAAQ,WAAA,EAAa;AAE5B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/C,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,YAAA,EAAa;AAGlB,MAAA,IAAI,KAAK,kBAAA,EAAoB;AACzB,QAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC7B,UAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,qBAAA,GAA8B;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,cAAc,CAAA;AACvD,IAAA,IAAI,QAAA,IAAY,KAAK,WAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA;AAAA,IACnD;AACA,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EACpB;AAAA,EAEQ,eAAA,CAAgB,UAA0B,IAAA,EAAqB;AACnE,IAAA,IAAI;AACA,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,IACzB,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,IACpD;AAAA,EACJ;AAAA,EAEQ,wBAAA,GAAiC;AAErC,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAG5B,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA,CAAO,UAAA,CAAW,MAAM;AAC5C,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAA,EAAG,KAAK,YAAY,CAAA;AAAA,EACxB;AAAA,EAEQ,sBAAA,GAA+B;AACnC,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,MAAA,MAAA,CAAO,YAAA,CAAa,KAAK,gBAAgB,CAAA;AACzC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC9B;AAAA,EACJ;AAAA,EAEQ,cAAA,GAAuB;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,cAAc,CAAA;AACvD,IAAA,IAAI,QAAA,IAAY,KAAK,WAAA,EAAa;AAC9B,MAAA,IAAI;AAEA,QAAA,IAAI,SAAS,cAAA,EAAgB;AACzB,UAAA,QAAA,CAAS,cAAA,CAAe,KAAK,WAAW,CAAA;AACxC,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,QAC3B,CAAA,MAAO;AAEH,UAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,WAAW,CAAA;AACjC,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,QAC3B;AAAA,MACJ,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,oBAAA,GAA6B;AACjC,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,cAAc,CAAA;AACvD,MAAA,IAAI,QAAA,IAAY,SAAS,aAAA,EAAe;AACpC,QAAA,IAAI;AACA,UAAA,QAAA,CAAS,aAAA,EAAc;AAAA,QAC3B,SAAS,KAAA,EAAO;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA,QACnD;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,IAC3B;AAAA,EACJ;AAAA,EAGQ,UAAA,GAAmB;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,EAAA;AACnB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,IAAI,KAAK,aAAA,EAAe;AACpB,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,IACjC;AAAA,EACJ;AAAA,EAEQ,YAAA,GAAqB;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,UAAA,CAAW,MAAM;AACrC,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IACpB,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,EACnB;AAAA,EAEQ,YAAA,GAAqB;AACzB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEQ,YAAA,GAAqB;AACzB,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,MAAA,CAAO,YAAA,CAAa,KAAK,SAAS,CAAA;AAClC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACrB;AAAA,EACJ;AAAA,EAEQ,oBAAA,GAA6B;AAEjC,IAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,cAAA,CAAe,0BAA0B,CAAA;AAC5E,IAAA,IAAI,iBAAA,EAAmB;AACnB,MAAA,iBAAA,CAAkB,MAAA,EAAO;AAAA,IAC7B;AAGA,IAAA,IAAI,IAAA,CAAK,UAAU,QAAA,eAAsB;AACrC,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,SAAA,CAAU,EAAA,GAAK,0BAAA;AACf,IAAA,SAAA,CAAU,SAAA,GAAY,kGAAA;AAEtB,IAAA,IAAI,IAAA,CAAK,UAAU,eAAA,sBAA6B;AAC5C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,cAAc,CAAA;AACvD,MAAA,MAAM,WAAA,GAAc,QAAA,GAAW,QAAA,CAAS,WAAA,GAAc,iBAAA;AACtD,MAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA,0BAAA,EAEN,IAAA,CAAK,cAAA,CAAe,WAAA,EAAa,CAAA;AAAA,gDAAA,EACX,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA;AAAA,wDAAA,EAEf,WAAW,CAAA;AAAA,YAAA,CAAA;AAAA,IAE7D;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,EACvC;AAAA,EAEQ,QAAA,GAAiB;AACrB,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,IAAA,IAAA,CAAK,YAAY,EAAA,GAAK,uBAAA;AACtB,IAAA,IAAA,CAAK,YAAY,SAAA,GAAY,4EAAA;AAE7B,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,WAAA,CAAY,SAAA,GAAY,2FAAA;AAExB,IAAA,WAAA,CAAY,SAAA,GAAY,KAAK,mBAAA,EAAoB;AAEjD,IAAA,IAAA,CAAK,WAAA,CAAY,YAAY,WAAW,CAAA;AACxC,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAG1C,IAAA,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC9C,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,WAAA,EAAa;AAC/B,QAAA,IAAA,CAAK,QAAA,EAAS;AAAA,MAClB;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,QAAA,GAAiB;AACrB,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,IAAA,CAAK,YAAY,MAAA,EAAO;AACxB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACvB;AAAA,EACJ;AAAA,EAEQ,mBAAA,GAA8B;AAClC,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAA8B;AAGrD,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAC/B,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,SAAA;AACtC,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,QAAA,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAAA,MAC/B;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC3C,CAAC,CAAA;AAED,IAAA,IAAI,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAWX,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,QAAA,KAAa;AACxC,MAAA,IAAA,IAAQ;AAAA;AAAA,4FAAA,EAE0E,QAAQ,CAAA;AAAA;AAAA,YAAA,CAAA;AAI1F,MAAA,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAC1B,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,YAAA,GACtB,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,oEAAA,CAAA,GAC7B,QAAA,CAAS,GAAA,CAAI,WAAA,EAAY;AAE/B,QAAA,IAAA,IAAQ;AAAA;AAAA,+EAAA,EAEyD,SAAS,WAAW,CAAA;AAAA,uIAAA,EACoC,UAAU,CAAA;AAAA;AAAA,gBAAA,CAAA;AAAA,MAGvI,CAAC,CAAA;AAED,MAAA,IAAA,IAAQ;AAAA;AAAA;AAAA,YAAA,CAAA;AAAA,IAIZ,CAAC,CAAA;AAGD,IAAA,IAAA,IAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AASR,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEO,OAAA,GAAgB;AACnB,IAAA,QAAA,CAAS,oBAAoB,SAAA,EAAW,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AACrE,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAClB;AAAA,EAEO,QAAA,GAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEO,iBAAA,GAA4B;AAC/B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAChB;AAAA,EAEO,cAAA,GAAyB;AAC5B,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AACJ","file":"index.mjs","sourcesContent":["/**\n * Simple event system for component communication\n * Provides error isolation and idempotent subscriptions\n */\n\n/**\n * Simple event handler function type\n */\nexport type EventHandler = (data?: any) => void;\n\n/**\n * Interface for components that want to receive events via the EventBus\n */\nexport interface EventSubscriber {\n /**\n * Handle incoming events from the EventBus\n * @param eventType - The type of event being handled\n * @param data - The event data payload\n * @param subject - The subject/subject entity (what the event is about)\n * @param emitter - The entity that emitted the event\n */\n handleBusEvent(eventType: string, data: any, subject: any, emitter: any): void;\n}\n\n/**\n * Internal wrapper to adapt a simple function handler to EventSubscriber interface\n */\nclass FunctionSubscriber implements EventSubscriber {\n constructor(public readonly handler: EventHandler) {}\n\n handleBusEvent(eventType: string, data: any, subject: any, emitter: any): void {\n this.handler(data);\n }\n}\n\n/**\n * Synchronous event bus for component communication\n * Features:\n * - Type-safe event names and payloads\n * - Error isolation (one handler failure doesn't stop others)\n * - Source exclusion (events not sent back to source)\n * - Debug logging for troubleshooting\n */\nexport class EventBus {\n private subscribers: Map<string, Set<EventSubscriber>> = new Map();\n private functionSubscribers: Map<string, Map<EventHandler, FunctionSubscriber>> = new Map();\n private onceHandlers: Map<string, Set<FunctionSubscriber>> = new Map();\n private debugMode: boolean = false;\n\n constructor(debugMode: boolean = false) {\n this.debugMode = debugMode;\n }\n\n // ============== Simple Function-Based API ==============\n\n /**\n * Subscribe to an event with a simple handler function\n */\n public on(eventType: string, handler: EventHandler): void {\n if (!this.functionSubscribers.has(eventType)) {\n this.functionSubscribers.set(eventType, new Map());\n }\n\n const handlersMap = this.functionSubscribers.get(eventType)!;\n if (handlersMap.has(handler)) {\n if (this.debugMode) {\n console.log(`[EventBus] Handler already registered for '${eventType}'`);\n }\n return;\n }\n\n const subscriber = new FunctionSubscriber(handler);\n handlersMap.set(handler, subscriber);\n this.addSubscription(eventType, null, subscriber);\n }\n\n /**\n * Unsubscribe a handler function from an event\n */\n public off(eventType: string, handler: EventHandler): void {\n const handlersMap = this.functionSubscribers.get(eventType);\n if (!handlersMap) return;\n\n const subscriber = handlersMap.get(handler);\n if (subscriber) {\n handlersMap.delete(handler);\n this.removeSubscription(eventType, null, subscriber);\n\n if (handlersMap.size === 0) {\n this.functionSubscribers.delete(eventType);\n }\n }\n }\n\n /**\n * Subscribe to an event for one-time execution\n */\n public once(eventType: string, handler: EventHandler): void {\n if (!this.onceHandlers.has(eventType)) {\n this.onceHandlers.set(eventType, new Set());\n }\n\n const subscriber = new FunctionSubscriber(handler);\n this.onceHandlers.get(eventType)!.add(subscriber);\n\n if (this.debugMode) {\n console.log(`[EventBus] Added once handler for '${eventType}'`);\n }\n }\n\n // ============== EventSubscriber-Based API ==============\n\n /**\n * Add a subscription using the EventSubscriber pattern\n * Provides automatic idempotency - same subscriber object won't be added twice\n */\n public addSubscription(eventType: string, subject: any, subscriber: EventSubscriber): void {\n if (!this.subscribers.has(eventType)) {\n this.subscribers.set(eventType, new Set());\n }\n\n const subscribers = this.subscribers.get(eventType)!;\n const wasAdded = !subscribers.has(subscriber);\n\n if (wasAdded) {\n subscribers.add(subscriber);\n if (this.debugMode) {\n console.log(`[EventBus] Added subscription to '${eventType}' for ${subscriber.constructor.name}`);\n }\n } else if (this.debugMode) {\n console.log(`[EventBus] Subscription already exists for '${eventType}' and ${subscriber.constructor.name}`);\n }\n }\n\n /**\n * Remove a subscription using the EventSubscriber pattern\n */\n public removeSubscription(eventType: string, subject: any, subscriber: EventSubscriber): void {\n const subscribers = this.subscribers.get(eventType);\n\n if (subscribers) {\n const wasRemoved = subscribers.delete(subscriber);\n\n if (this.debugMode && wasRemoved) {\n console.log(`[EventBus] Removed subscription from '${eventType}' for ${subscriber.constructor.name}`);\n }\n\n // Clean up empty subscription sets\n if (subscribers.size === 0) {\n this.subscribers.delete(eventType);\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n * @param eventType - The event type to emit\n * @param data - The event data payload\n * @param subject - The subject/subject entity that this event relates to (optional for simple API)\n * @param emitter - The entity that emitted the event (optional for simple API)\n */\n public emit<T = any>(eventType: string, data?: T, subject?: any, emitter?: any): void {\n const subscribers = this.subscribers.get(eventType);\n const onceHandlers = this.onceHandlers.get(eventType);\n\n const subscriberCount = (subscribers?.size || 0) + (onceHandlers?.size || 0);\n if (subscriberCount === 0) {\n return;\n }\n\n if (this.debugMode) {\n console.log(`[EventBus] Emitting '${eventType}' to ${subscriberCount} subscribers`);\n }\n\n let successCount = 0;\n let errorCount = 0;\n\n // Call regular EventSubscriber handlers with error isolation\n if (subscribers) {\n subscribers.forEach(subscriber => {\n try {\n subscriber.handleBusEvent(eventType, data, subject, emitter);\n successCount++;\n } catch (error) {\n errorCount++;\n console.error(\n `[EventBus] Error in EventSubscriber handler for '${eventType}' ` +\n `in subscriber '${subscriber.constructor.name}':`,\n error\n );\n }\n });\n }\n\n // Call one-time handlers and then remove them\n if (onceHandlers && onceHandlers.size > 0) {\n onceHandlers.forEach(subscriber => {\n try {\n subscriber.handleBusEvent(eventType, data, subject, emitter);\n successCount++;\n } catch (error) {\n errorCount++;\n console.error(\n `[EventBus] Error in once handler for '${eventType}':`,\n error\n );\n }\n });\n // Clear once handlers after execution\n this.onceHandlers.delete(eventType);\n }\n\n if (this.debugMode) {\n console.log(\n `[EventBus] Event '${eventType}' completed: ` +\n `${successCount} success, ${errorCount} errors`\n );\n }\n }\n\n /**\n * Get all event types that have subscribers\n */\n public getEventTypes(): string[] {\n return Array.from(this.subscribers.keys());\n }\n\n /**\n * Get subscriber count for an event type\n */\n public getSubscriberCount(eventType: string): number {\n return this.subscribers.get(eventType)?.size || 0;\n }\n\n /**\n * Clear all subscriptions (useful for cleanup)\n */\n public clear(): void {\n this.subscribers.clear();\n this.functionSubscribers.clear();\n this.onceHandlers.clear();\n if (this.debugMode) {\n console.log('[EventBus] All subscriptions cleared');\n }\n }\n\n /**\n * Enable or disable debug logging\n */\n public setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\n }\n}\n\nexport const ComponentEventTypes= {\n COMPONENT_INITIALIZED: 'component-initialized',\n COMPONENT_HYDRATED: 'component-hydrated',\n COMPONENT_ERROR: 'component-error'\n} as const;\n\nexport const LifecycleEventTypes = {\n LOCAL_INIT_STARTED: \"lifecycle-local-init-started\",\n LOCAL_INIT_FINISHED: \"lifecycle-local-init-finished\",\n DEPENDENCIES_INJECTED: \"lifecycle-dependencies-injected\",\n ACTIVATION_STARTED: \"lifecycle-activation-started\",\n ACTIVATION_FINISHED: \"lifecycle-activation-finished\",\n DEACTIVATION_STARTED: \"lifecycle-deactivation-started\",\n DEACTIVATION_FINISHED: \"lifecycle-deactivation-finished\",\n} as const;\n\nexport type LifecycleEventType = typeof LifecycleEventTypes[keyof typeof LifecycleEventTypes];\nexport type ComponentEventType = typeof ComponentEventTypes[keyof typeof ComponentEventTypes];\n","import { EventBus, EventSubscriber, ComponentEventTypes } from './EventBus';\nimport { LCMComponent } from './LCMComponent';\n\n/**\n * Base interface for all UI components\n * Enforces separation of concerns and standard lifecycle\n */\nexport interface Component {\n /**\n * Unique identifier for this component instance\n */\n readonly componentId: string;\n\n /**\n * Root DOM element that this component owns and manages\n */\n readonly rootElement: HTMLElement;\n\n /**\n * Handle dynamic content updates (e.g., from HTMX or server responses)\n * @param newHTML - New HTML content to replace current content\n */\n contentUpdated(newHTML: string): void;\n\n /**\n * Clean up the component and release resources\n * Should unsubscribe from events, clean up DOM, and release memory\n */\n // destroy(): void;\n}\n\n/**\n * Abstract base class implementing common component functionality\n * Provides standard lifecycle management and event bus integration\n *\n * All components auto-initialize in constructor AND implement LCMComponent\n * for coordination with other components when needed.\n */\nexport abstract class BaseComponent implements Component, LCMComponent, EventSubscriber {\n protected _eventBus: EventBus;\n\n constructor(public readonly componentId: string, public readonly rootElement: HTMLElement, eventBus: EventBus | null = null, public readonly debugMode: boolean = false) {\n // Mark as component in DOM for debugging\n this._eventBus = eventBus || new EventBus();\n this.rootElement.setAttribute('data-component', this.componentId);\n }\n\n public get eventBus(): EventBus {\n return this._eventBus\n }\n\n public contentUpdated(newHTML: string): void {\n this.log('Content updated, re-binding to DOM');\n\n // Update the DOM\n this.rootElement.innerHTML = newHTML;\n\n // Note: In pure LCMComponent approach, re-binding should be handled\n // by the component's LCMComponent lifecycle methods if needed\n }\n\n /**\n * Subscribe to an event using the new EventSubscriber pattern\n */\n protected addSubscription(eventType: string, target: any = null): void {\n this.eventBus.addSubscription(eventType, target, this);\n }\n\n /**\n * Unsubscribe from an event using the new EventSubscriber pattern\n */\n protected removeSubscription(eventType: string, target: any = null): void {\n this.eventBus.removeSubscription(eventType, target, this);\n }\n\n /**\n * Emit an event from this component\n */\n protected emit<T = any>(eventType: string, data: T, target: any, emitter: any = null): void {\n this.eventBus.emit(eventType, data, target, emitter || this);\n }\n\n /**\n * Default implementation of EventSubscriber interface\n * Components can override this to handle events\n */\n public handleBusEvent(eventType: string, data: any, target: any, emitter: any): void {\n // Default: no event handling\n // Subclasses should override this method to handle specific events\n if (this.debugMode) {\n console.log(`[${this.componentId}] Received unhandled event: ${eventType}`);\n }\n }\n\n /**\n * Find elements within this component's root element only\n * Enforces separation of concerns - no cross-component DOM access\n */\n protected findElement<T extends HTMLElement = HTMLElement>(selector: string): T | null {\n return this.rootElement.querySelector<T>(selector);\n }\n\n /**\n * Find multiple elements within this component's root element only\n */\n protected findElements<T extends HTMLElement = HTMLElement>(selector: string): T[] {\n return Array.from(this.rootElement.querySelectorAll<T>(selector));\n }\n\n /**\n * Log messages with component identification\n */\n protected log(message: string, data: any = null): void {\n if (this.debugMode) {\n console.log(`[${this.componentId}] ${message}`, data);\n }\n }\n\n /**\n * Default lifecycle method: discover and return child components\n * Override this if your component creates child components that need lifecycle management\n */\n public performLocalInit(): Promise<LCMComponent[]> | LCMComponent[] {\n // Default: no child components\n return [];\n }\n\n /**\n * Default lifecycle method: inject dependencies\n * Override this if your component needs dependencies from other components\n */\n public setupDependencies(): void | Promise<void> {\n // Default: no dependencies needed\n }\n\n /**\n * Default lifecycle method: activate component for coordination\n * Override this if your component needs to coordinate with other components after initialization\n */\n public activate(): void | Promise<void> {\n // Default: no coordination needed - component is already auto-initialized\n }\n\n /**\n * Default lifecycle method: deactivate component\n * Override this if your component needs cleanup during lifecycle management\n */\n public deactivate(): void | Promise<void> {\n // Remove component marker from DOM\n this.rootElement?.removeAttribute('data-component');\n\n this.log('Component deactivated successfully');\n }\n\n set innerHTML(innerHTML: string) {\n const [newHTML, allow] = this.shouldUpdateHtml(innerHTML)\n if (allow) {\n this.rootElement.innerHTML = newHTML\n this.htmlUpdated(newHTML)\n }\n }\n\n // Called BEFORE the HTML is about to be updated. This is an opportunity\n // for subclasses to fix/tweak html being updated and also ignore an update\n // just in case. Default behavior is to return the html as is\n shouldUpdateHtml(html: string): [string, boolean] {\n return [html, true]\n }\n\n // Called after the HTML for the component has been updated.\n // This is an opportunity to rebind any event listeners etc\n htmlUpdated(html: string) {\n // Do nothing\n }\n\n // LCMComponent implementation with default empty methods\n // Components can override these when they need coordination with other components\n}\n","\nimport {\n LCMComponent,\n LCMComponentConfig,\n LCMComponentEvent,\n} from './LCMComponent';\nimport { EventBus, LifecycleEventTypes, LifecycleEventType } from './EventBus';\nimport { ComponentLifecycleEvent } from './events';\n\n/**\n * LifecycleController - Orchestrates breadth-first component initialization\n *\n * This controller implements a breadth-first traversal of the component tree\n * followed by phase-wise initialization with synchronization barriers.\n *\n * Process:\n * 1. Discovery Phase: Traverse component tree to find all components\n * 2. DOM Binding Phase: All components bind to DOM simultaneously\n * 3. Dependency Injection Phase: All components receive dependencies\n * 4. Activation Phase: All components complete initialization\n *\n * Each phase acts as a synchronization barrier - no component can proceed\n * to the next phase until ALL components have completed the current phase.\n */\nexport class LifecycleController {\n private allComponents: LCMComponent[];\n private componentsByLevel: LCMComponent[][];\n private config: Required<LCMComponentConfig>;\n public static DefaultConfig: LCMComponentConfig = {\n enableDebugLogging: true,\n phaseTimeoutMs: 15000, // Increased timeout for component loading\n continueOnError: false // Fail fast for debugging\n }\n\n constructor(protected eventBus: EventBus, config: LCMComponentConfig = {}) {\n this.config = {\n phaseTimeoutMs: config.phaseTimeoutMs ?? 10000,\n continueOnError: config.continueOnError ?? false,\n validateDependencies: false,\n enableDebugLogging: config.enableDebugLogging ?? false\n };\n this.allComponents = [];\n this.componentsByLevel = [];\n }\n\n /**\n * Initialize component tree starting from root component\n *\n * @param rootComponent The root component to start initialization from\n * @param rootName Optional name for the root component (for debugging)\n * @returns Promise that resolves when all components are fully initialized\n */\n public async initializeFromRoot(rootComponent: LCMComponent): Promise<void> {\n // Phase 1 - Performance post-load setup where each parent will have the change\n // to set dependencies on its children (either to its siblings or to itself).\n await this.performLocalInit(rootComponent);\n\n // Phase 2: Dependency Injection - All components receive dependencies\n await this.injectDependencies();\n\n await this.activate();\n }\n\n /**\n * Phase 0: Discover all components via breadth-first traversal\n */\n private async performLocalInit(rootComponent: LCMComponent): Promise<void> {\n const visited = new Set<LCMComponent>();\n let queue = [rootComponent] as LCMComponent[]\n this.allComponents = [rootComponent]\n\n if (this.componentsByLevel.length > 0) {\n throw new Error(\"Already done\")\n }\n for (let level = 0; queue.length > 0; level ++) {\n const newqueue = [] as LCMComponent[];\n const promises = new Array<Promise<LCMComponent[]>>()\n this.componentsByLevel.push(queue)\n for (let i = 0;i < queue.length;i++) {\n const component = queue[i]\n\n // Enforce tree structure: each component should have exactly one parent\n if (visited.has(component)) {\n throw new Error(\n `Component hierarchy integrity violation: Component '${component.constructor.name}' ` +\n `discovered as child of multiple parents at level ${level}. ` +\n `Component hierarchies must form a tree structure where each component has exactly one parent.`\n );\n }\n\n this.emitEvent(LifecycleEventTypes.LOCAL_INIT_STARTED, component, level)\n const result = component.performLocalInit()\n promises.push(Promise.resolve(result).then((children: LCMComponent[]) => {\n for (const ch of children) {\n this.allComponents.push(ch)\n newqueue.push(ch)\n }\n return children\n }))\n\n // now wait for all the promises to finish\n await Promise.all(promises)\n\n // TODO - Handle errors\n this.emitEvent(LifecycleEventTypes.LOCAL_INIT_FINISHED, component, level)\n }\n queue = newqueue\n }\n }\n\n /**\n * Phase 1: Dependency injection.\n * Here all our components are already discovered so we can call directly\n */\n protected injectDependencies(): void {\n // This is guaranteed to be in order of levels\n for (const comp of this.allComponents) {\n comp.setupDependencies()\n }\n }\n\n /**\n * Phase 2: Activate all components\n *\n * Here all our components are already discovered and their dependencies setup\n * so we can call directly\n */\n protected async activate(): Promise<void> {\n // This is guaranteed to be in order of levels\n const visited = new Set<LCMComponent>();\n for (let level = 0;level < this.componentsByLevel.length; level++) {\n const promises = new Array<Promise<void>>()\n const levelComps = this.componentsByLevel[level]\n for (const comp of levelComps) {\n if (visited.has(comp)) {\n throw new Error(\"Comp already visited\")\n }\n visited.add(comp)\n this.emitEvent(LifecycleEventTypes.ACTIVATION_STARTED , comp, 0)\n const result = comp.activate()\n promises.push(Promise.resolve(result).then(() => {\n this.emitEvent(LifecycleEventTypes.ACTIVATION_FINISHED, comp, 0)\n }))\n }\n await Promise.all(promises)\n }\n }\n\n /**\n * Deactivate all components in reverse order. This is usually called when a page quits or a component is\n * deactivated\n */\n public async deactivateAll(): Promise<void> {\n // destruction should leaf to the root so we are removing things from bottom to top\n for (let level = this.componentsByLevel.length - 1;level >= 0; level--) {\n const promises = new Array<Promise<void>>()\n const levelComps = this.componentsByLevel[level]\n for (const comp of levelComps) {\n this.emitEvent(LifecycleEventTypes.DEACTIVATION_STARTED , comp, level)\n const result = comp.deactivate()\n promises.push(Promise.resolve(result).then(() => {\n this.emitEvent(LifecycleEventTypes.DEACTIVATION_FINISHED, comp, level)\n }))\n }\n await Promise.all(promises)\n }\n }\n\n /**\n * Emit lifecycle event to registered callbacks\n */\n private emitEvent(\n event: LifecycleEventType,\n component: LCMComponent,\n level: number,\n error: Error | null = null,\n ): void {\n this.eventBus.emit<ComponentLifecycleEvent>(\n event,\n { error: error, success: error == null},\n this,\n component\n );\n }\n\n /**\n * Log message if debug logging is enabled\n */\n private log(message: string, ...args: any[]): void {\n if (this.config.enableDebugLogging) {\n console.log(`[LifecycleController] ${message}`, ...args);\n }\n }\n\n /**\n * Log error message\n */\n private logError(message: string, error?: any): void {\n console.error(`[LifecycleController] ${message}`, error);\n }\n\n /**\n * Get current status of all components\n */\n /*\n public getComponentStatus(): Array<{ name: string; phase: ComponentPhase }> {\n return Array.from(this.allComponents).map(component => ({\n name: this.getComponentName(component),\n phase: this.componentPhases.get(component) || 'created'\n }));\n }\n */\n}\n","/**\n * Theme management for applications\n */\nexport class ThemeManager {\n // Theme options\n static LIGHT = 'light';\n static DARK = 'dark';\n static SYSTEM = 'system';\n\n // Icons for each theme state\n static readonly LIGHT_ICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-full h-6\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z\" /></svg>`; // Sun icon\n static readonly DARK_ICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-full h-6\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z\" /></svg>`; // Moon icon\n static readonly SYSTEM_ICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-full h-6\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25\" /></svg>`; // Computer icon\n\n /**\n * Initialize theme based on saved preference or system default\n */\n static initialize(): void {\n const savedTheme = localStorage.getItem('theme');\n\n if (savedTheme === ThemeManager.DARK ||\n (!savedTheme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }\n\n /**\n * Set theme and save preference\n */\n static setTheme(theme: string): void {\n if (theme === ThemeManager.SYSTEM) {\n localStorage.removeItem('theme');\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n } else if (theme === ThemeManager.DARK) {\n localStorage.setItem('theme', ThemeManager.DARK);\n document.documentElement.classList.add('dark');\n } else { // LIGHT\n localStorage.setItem('theme', ThemeManager.LIGHT);\n document.documentElement.classList.remove('dark');\n }\n }\n\n /**\n * Get current theme setting (light, dark, or system)\n */\n static getCurrentThemeSetting(): string {\n return localStorage.getItem('theme') || ThemeManager.SYSTEM;\n }\n\n /**\n * Gets the *next* theme in the cycle: Light -> Dark -> System -> Light ...\n */\n static getNextTheme(currentSetting: string): string {\n if (currentSetting === ThemeManager.LIGHT) {\n return ThemeManager.DARK;\n } else if (currentSetting === ThemeManager.DARK) {\n return ThemeManager.SYSTEM;\n } else { // SYSTEM or unknown goes to LIGHT\n return ThemeManager.LIGHT;\n }\n }\n\n /**\n * Gets the appropriate SVG icon string for a given theme setting.\n */\n static getIconSVG(themeSetting: string): string {\n switch (themeSetting) {\n case ThemeManager.LIGHT: return ThemeManager.LIGHT_ICON_SVG;\n case ThemeManager.DARK: return ThemeManager.DARK_ICON_SVG;\n case ThemeManager.SYSTEM:\n default: return ThemeManager.SYSTEM_ICON_SVG;\n }\n }\n\n /**\n * Gets a user-friendly label for the theme setting.\n */\n static getThemeLabel(themeSetting: string): string {\n switch (themeSetting) {\n case ThemeManager.LIGHT: return \"Light Mode\";\n case ThemeManager.DARK: return \"Dark Mode\";\n case ThemeManager.SYSTEM:\n default: return \"System Default\";\n }\n }\n\n\n /**\n * Initialize the ThemeManager (no instance needed for static methods)\n */\n public static init(): void {\n ThemeManager.initialize();\n }\n}\n","\n// Helper to manage our templates\nexport class TemplateLoader {\n constructor(public registryName = \"template-registry\") {\n }\n\n\n /**\n * Finds the specified template wrapper element in the registry.\n * @param templateId The data-template-id of the wrapper element.\n * @returns The wrapper HTMLElement or null if not found.\n */\n private _findTemplateWrapper(templateId: string): HTMLElement | null {\n const templateRegistry = document.getElementById(this.registryName);\n if (!templateRegistry) {\n console.error(`Template registry '#${this.registryName}' not found!`);\n return null;\n }\n const templateWrapper = templateRegistry.querySelector<HTMLElement>(`[data-template-id=\"${templateId}\"]`);\n if (!templateWrapper) {\n console.error(`Template with ID \"${templateId}\" not found in registry '#${this.registryName}'.`);\n return null;\n }\n return templateWrapper;\n }\n\n /**\n * Loads and returns the inner HTML of a template definition.\n * @param templateId The data-template-id of the wrapper element.\n * @returns The innerHTML content as string if it exists otherwise null.\n */\n loadHtml(templateId: string): string | null {\n const templateWrapper = this._findTemplateWrapper(templateId);\n if (!templateWrapper) {\n return null;\n }\n return templateWrapper.innerHTML\n }\n\n /**\n * Loads and clones the child elements of a template definition.\n * @param templateId The data-template-id of the wrapper element.\n * @returns An array of cloned HTMLElement children, or an empty array if not found or has no children.\n */\n load(templateId: string): HTMLElement[] {\n const templateWrapper = this._findTemplateWrapper(templateId);\n if (!templateWrapper) {\n return [];\n }\n\n // Using hidden div: Clone the first child element which is the actual template root\n const templateRootElement = templateWrapper.cloneNode(true) as HTMLElement | null;\n if (!templateRootElement) {\n console.error(`Template content is empty for: ${templateId}`);\n return [];\n }\n // deep clone AND return th children\n return Array.from(templateRootElement.children) as HTMLElement[];\n\n // clond the children instead\n // Clone each child element individually and return as an array\n // const childElements = Array.from(templateWrapper.children) as HTMLElement[];\n // return childElements.map(child => child.cloneNode(true) as HTMLElement);\n }\n\n /**\n * Loads a template's content, clears the target element, and appends the cloned content into it.\n * @param templateId The data-template-id of the wrapper element to load.\n * @param targetElement The HTMLElement where the cloned content should be placed.\n * @returns True if the operation was successful (template found and content appended, even if content was empty), false otherwise.\n */\n public loadInto(templateId: string, targetElement: HTMLElement | null): boolean {\n if (!targetElement) {\n console.error(`Cannot load template \"${templateId}\": Target element is null.`);\n return false;\n }\n\n const templateWrapper = this._findTemplateWrapper(templateId);\n if (!templateWrapper) {\n // Error logged in _findTemplateWrapper\n targetElement.innerHTML = `<div class=\"p-4 text-red-500\">Error loading template '${templateId}' (Not Found)</div>`; // Provide feedback in target\n return false;\n }\n\n // Clear the target element first\n targetElement.innerHTML = '';\n\n // Clone and append children\n const childElements = Array.from(templateWrapper.children) as HTMLElement[];\n if (childElements.length === 0) {\n console.warn(`Template \"${templateId}\" has no child elements to load.`);\n // Still considered successful, just loaded nothing.\n } else {\n childElements.forEach(child => {\n targetElement.appendChild(child.cloneNode(true) as HTMLElement);\n });\n }\n\n return true; // Operation successful\n }\n}\n","import { TemplateLoader } from './TemplateLoader';\n\n/**\n * Modal manager for the application\n * Handles showing and hiding modals with different content\n */\nexport class Modal {\n private static instance: Modal | null = null;\n\n // Modal DOM elements\n private modalContainer: HTMLDivElement\n private modalBackdrop: HTMLElement | null;\n private modalPanel: HTMLElement | null;\n private modalContent: HTMLElement | null;\n private closeButton: HTMLElement | null;\n\n private templateLoader: TemplateLoader;\n\n // Current modal data - including optional callbacks\n private currentTemplateId: string | null = null;\n private currentData: any = null;\n private onSubmitCallback: ((modalData: any) => void) | null = null; // Store the callback\n private onApplyCallback: ((modalData: any) => void) | null = null; // Store the Apply callback\n\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Get modal elements\n this.modalContainer = document.getElementById('modal-container') as HTMLDivElement;\n this.modalBackdrop = document.getElementById('modal-backdrop');\n this.modalPanel = document.getElementById('modal-panel');\n this.modalContent = document.getElementById('modal-content');\n this.closeButton = document.getElementById('modal-close');\n\n this.templateLoader = new TemplateLoader();\n\n this.bindEvents();\n }\n\n /**\n * Get the Modal instance (singleton)\n */\n public static getInstance(): Modal {\n if (!Modal.instance) {\n Modal.instance = new Modal();\n }\n return Modal.instance;\n }\n\n /**\n * Bind event listeners for modal interactions\n */\n private bindEvents(): void {\n // Close button click\n if (this.closeButton) {\n this.closeButton.addEventListener('click', () => this.hide());\n }\n\n // Click on backdrop to close\n if (this.modalBackdrop) {\n this.modalBackdrop.addEventListener('click', (e) => {\n // Only close if clicking directly on the backdrop\n if (e.target === this.modalBackdrop) {\n this.hide();\n }\n });\n }\n\n // Listen for Escape key\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.isVisible()) {\n this.hide();\n }\n });\n\n // --- Event Delegation for Modal Actions ---\n if (this.modalPanel) { // Listen on a persistent parent element\n this.modalPanel.addEventListener('click', (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // Handle generic close/cancel buttons\n const closeButton = target.closest('button[id$=\"-cancel\"], button[id$=\"-close\"]');\n if (closeButton) {\n this.hide();\n return; // Stop further processing\n }\n\n // Handle specific actions like submit\n const actionButton = target.closest('button[data-modal-action]');\n if (actionButton) {\n const action = actionButton.getAttribute('data-modal-action');\n\n if (action === 'submit' && this.onSubmitCallback) {\n this.onSubmitCallback(this.currentData); // Call the stored callback\n } else if (action === 'apply' && this.onApplyCallback) {\n this.onApplyCallback(this.currentData); // Call the Apply callback\n this.hide(); // Typically hide after applying\n }\n // Add more actions (e.g., 'apply', 'revise') later if needed\n }\n });\n }\n }\n\n /**\n * Check if the modal is currently visible\n */\n public isVisible(): boolean {\n return this.modalContainer ? !this.modalContainer.classList.contains('hidden') : false;\n }\n\n /**\n * Show a modal with content from the specified template ID.\n * Uses TemplateLoader to get the content element.\n * @param templateId ID used in `data-template-id` attribute in TemplateRegistry.html\n * @param data Optional data to pass to the modal. Can include callbacks like `onSubmit`.\n * @returns The root HTMLElement of the loaded content, or null if failed.\n */\n public show(templateId: string, data: any = null): HTMLElement | null {\n if (!this.modalContainer || !this.modalContent) {\n console.error(\"Modal container or content area not found.\");\n return null;\n }\n\n // Use TemplateLoader to get the content element\n // Load content directly into the modal content area\n const success = this.templateLoader.loadInto(templateId, this.modalContent);\n if (!success) {\n // Error message is already placed into modalContent by loadInto on failure\n // Ensure modal is still visible\n this.modalContainer.classList.remove('hidden');\n setTimeout(() => this.modalContainer.classList.add('modal-active'), 10);\n return null; // Indicate failure\n }\n\n // Store current modal info\n this.currentTemplateId = templateId;\n this.currentData = data || {}; // Ensure data is an object\n this.onSubmitCallback = data?.onSubmit || null; // Store the submit callback\n this.onApplyCallback = data?.onApply || null; // Store the apply callback\n\n // Set data attributes for non-function data\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (key !== 'onSubmit' && (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')) {\n if (this.modalContent) this.modalContent.dataset[key] = String(value);\n }\n });\n }\n\n // Show modal container\n this.modalContainer.classList.remove('hidden');\n\n // Trigger animations if needed (add active class after a tick)\n setTimeout(() => {\n this.modalContainer.classList.add('modal-active');\n }, 10); // Small delay ensures transition applies correctly\n\n const firstElement = this.modalContent//?.firstElementChild as HTMLElement | null;\n return firstElement;\n }\n\n /**\n * Hide the modal\n */\n public hide(): Promise<void> {\n return new Promise((resolve) => {\n if (!this.modalContainer) return;\n\n // Remove active class first (for animations)\n this.modalContainer.classList.remove('modal-active');\n\n // Hide after a short delay\n setTimeout(() => {\n this.modalContainer.classList.add('hidden');\n\n // Clear current modal info\n this.currentTemplateId = null;\n this.currentData = null;\n this.onSubmitCallback = null; // Clear callback\n this.onApplyCallback = null; // Clear apply callback\n if(this.modalContent) this.modalContent.innerHTML = ''; // Clear content\n resolve();\n }, 200); // Match typical transition duration\n });\n }\n\n /**\n * Get the current modal content element\n */\n public getContentElement(): HTMLElement | null {\n return this.modalContent;\n }\n\n /**\n * Get the current template ID\n */\n public getCurrentTemplate(): string | null {\n return this.currentTemplateId;\n }\n\n /**\n * Get the current modal data\n */\n public getCurrentData(): any {\n return this.currentData;\n }\n\n /**\n * Update modal data (excluding callbacks for now)\n */\n public updateData(newData: any): void {\n this.currentData = { ...this.currentData, ...newData };\n\n // Update data attributes for non-function data\n if (this.modalContent && newData) {\n Object.entries(newData).forEach(([key, value]) => { // Exclude callbacks when setting data attributes\n if (key !== 'onSubmit' && (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')) {\n if (this.modalContent) this.modalContent.dataset[key] = String(value);\n }\n });\n }\n }\n\n /**\n * Initialize the modal component\n */\n public static init(): Modal {\n return Modal.getInstance();\n }\n}\n","/**\n * Toast types for styling\n */\ntype ToastType = 'success' | 'error' | 'info' | 'warning';\n\n/**\n * Manages toast notifications\n */\nexport class ToastManager {\n private static instance: ToastManager | null = null;\n private container: HTMLElement | null;\n private template: HTMLElement | null;\n private toasts: Map<string, HTMLElement> = new Map();\n private counter: number = 0;\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Select the container using its ID from index.html\n this.container = document.getElementById('toast-container');\n this.template = document.getElementById('toast-template');\n }\n\n /**\n * Get the ToastManager instance (singleton)\n */\n public static getInstance(): ToastManager {\n if (!ToastManager.instance) {\n ToastManager.instance = new ToastManager();\n }\n return ToastManager.instance;\n }\n\n /**\n * Show a toast notification\n * @param title Toast title\n * @param message Toast message\n * @param type Toast type for styling\n * @param duration Duration in ms (default: 4000)\n */\n public showToast(title: string, message: string, type: ToastType = 'info', duration: number = 4000): string {\n if (!this.container || !this.template) return '';\n\n // Create a unique ID for this toast\n const id = `toast-${Date.now()}-${this.counter++}`;\n\n // Clone the template\n const toast = this.template.cloneNode(true) as HTMLElement;\n toast.id = id;\n toast.classList.remove('hidden');\n\n // Set content\n const titleElement = toast.querySelector('.toast-title');\n const messageElement = toast.querySelector('.toast-message');\n if (titleElement) titleElement.textContent = title;\n if (messageElement) messageElement.textContent = message;\n\n // Set style based on type\n const iconContainer = toast.querySelector('.flex-shrink-0');\n if (iconContainer) {\n // Clear existing icon\n iconContainer.innerHTML = '';\n\n // Add appropriate icon based on type\n let icon: string;\n let borderColor: string;\n\n switch (type) {\n case 'success':\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-green-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-green-500';\n break;\n case 'error':\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-red-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-red-500';\n break;\n case 'warning':\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-yellow-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-yellow-500';\n break;\n case 'info':\n default:\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-blue-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-blue-500';\n break;\n }\n\n // Add icon\n iconContainer.innerHTML = icon;\n\n // Set border color\n const borderElement = toast.querySelector('.border-l-4');\n if (borderElement) {\n borderElement.className = borderElement.className.replace(/border-[a-z]+-500/g, borderColor);\n }\n }\n\n // Add close button handler\n const closeButton = toast.querySelector('.toast-close');\n if (closeButton) {\n closeButton.addEventListener('click', () => {\n this.hideToast(id);\n });\n }\n\n // Add to container\n this.container.appendChild(toast);\n this.toasts.set(id, toast);\n\n // Show toast with animation\n setTimeout(() => {\n toast.classList.remove('scale-95', 'opacity-0');\n toast.classList.add('scale-100', 'opacity-100');\n }, 10);\n\n // Auto-hide after duration\n if (duration > 0) {\n setTimeout(() => {\n this.hideToast(id);\n }, duration);\n }\n\n return id;\n }\n\n /**\n * Hide a toast notification\n * @param id Toast ID\n */\n public hideToast(id: string): void {\n const toast = this.toasts.get(id);\n if (!toast) return;\n\n // Hide with animation\n toast.classList.remove('scale-100', 'opacity-100');\n toast.classList.add('scale-95', 'opacity-0');\n\n // Remove after animation\n setTimeout(() => {\n toast.remove();\n this.toasts.delete(id);\n }, 300);\n }\n\n /**\n * Hide all toast notifications\n */\n public hideAllToasts(): void {\n this.toasts.forEach((_, id) => {\n this.hideToast(id);\n });\n }\n\n /**\n * Initialize the component\n */\n public static init(): ToastManager {\n return ToastManager.getInstance();\n }\n}\n","/**\n * Utility for managing the splash screen that loads before JavaScript\n */\nexport class SplashScreen {\n private static readonly SPLASH_ID = 'splash-screen';\n private static dismissed = false;\n\n /**\n * Dismiss the splash screen with a fade-out animation\n * Safe to call multiple times - only dismisses once\n */\n static dismiss(): void {\n if (this.dismissed) {\n return;\n }\n\n const splash = document.getElementById(this.SPLASH_ID);\n if (!splash) {\n return;\n }\n\n this.dismissed = true;\n\n // Fade out\n splash.style.opacity = '0';\n\n // Remove from DOM after animation completes\n setTimeout(() => {\n splash.remove();\n }, 300); // Match transition-opacity duration-300 from Tailwind\n }\n\n /**\n * Update the splash screen message (if it hasn't been dismissed yet)\n */\n static updateMessage(title?: string, message?: string): void {\n if (this.dismissed) {\n return;\n }\n\n const splash = document.getElementById(this.SPLASH_ID);\n if (!splash) {\n return;\n }\n\n if (title) {\n const titleEl = splash.querySelector('[data-splash-title]');\n if (titleEl) {\n titleEl.textContent = title;\n }\n }\n\n if (message) {\n const messageEl = splash.querySelector('[data-splash-message]');\n if (messageEl) {\n messageEl.textContent = message;\n }\n }\n }\n\n /**\n * Update the splash screen progress bar\n * @param percent - Progress percentage (0-100)\n */\n static updateProgress(percent: number): void {\n if (this.dismissed) {\n return;\n }\n\n const splash = document.getElementById(this.SPLASH_ID);\n if (!splash) {\n return;\n }\n\n // Clamp between 0-100\n const clampedPercent = Math.max(0, Math.min(100, percent));\n\n const progressBar = splash.querySelector('[data-splash-progress-bar]') as HTMLElement;\n if (progressBar) {\n progressBar.style.width = `${clampedPercent}%`;\n }\n\n const progressText = splash.querySelector('[data-splash-progress-text]');\n if (progressText) {\n progressText.textContent = `${Math.round(clampedPercent)}%`;\n }\n }\n\n /**\n * Update both message and progress at once\n */\n static update(options: {\n title?: string;\n message?: string;\n progress?: number;\n }): void {\n if (options.title !== undefined || options.message !== undefined) {\n this.updateMessage(options.title, options.message);\n }\n if (options.progress !== undefined) {\n this.updateProgress(options.progress);\n }\n }\n\n /**\n * Check if splash screen is still visible\n */\n static isVisible(): boolean {\n return !this.dismissed && !!document.getElementById(this.SPLASH_ID);\n }\n}\n","import { ThemeManager } from './ThemeManager';\nimport { Modal } from './Modal';\nimport { ToastManager } from './ToastManager';\nimport { EventBus } from './EventBus';\nimport { BaseComponent } from './Component';\nimport { LCMComponent } from './LCMComponent';\nimport { SplashScreen } from './SplashScreen';\nimport { LifecycleController } from './LifecycleController';\n\n/**\n * Base class for all pages that provides common UI components and functionality\n * Implements proper LCMComponent lifecycle management for pages\n */\nexport abstract class BasePage extends BaseComponent {\n protected themeManager: typeof ThemeManager;\n protected modal: Modal;\n protected toastManager: ToastManager\n\n protected themeToggleButton: HTMLButtonElement;\n protected themeToggleIcon: HTMLElement;\n\n // Constructor now just uses document as the rootElement\n constructor(public readonly componentId: string, eventBus: EventBus | null = null, public readonly debugMode: boolean = false) {\n // Mark as component in DOM for debugging\n super(componentId, document.body, eventBus, debugMode)\n\n this.initializeBaseComponents();\n\n // Bind base events first\n this.bindBaseEvents();\n }\n\n // LCMComponent Phase 1: Initialize page structure and discover child components\n public override performLocalInit(): Promise<LCMComponent[]> | LCMComponent[] {\n this.log('BasePage: Starting local initialization');\n\n // Then initialize page-specific components and discover children\n return this.initializeSpecificComponents();\n }\n\n // LCMComponent Phase 3: Activate the page (bind events after all components are ready)\n public override activate(): void {\n this.log('BasePage: Activating page');\n\n // Then bind page-specific events\n this.bindSpecificEvents();\n\n this.log('BasePage: Page activation complete');\n }\n\n /**\n * Initialize common UI components that all pages need\n */\n protected initializeBaseComponents(): void {\n // Initialize core UI managers\n ThemeManager.init();\n this.modal = Modal.init();\n this.toastManager = ToastManager.init();\n\n // Get theme toggle elements\n this.themeToggleButton = document.getElementById('theme-toggle-button') as HTMLButtonElement;\n this.themeToggleIcon = document.getElementById('theme-toggle-icon')!;\n\n if (!this.themeToggleButton || !this.themeToggleIcon) {\n console.warn(\"Theme toggle button or icon element not found in Header.\");\n }\n }\n\n /**\n * Bind common event handlers that all pages need\n */\n protected bindBaseEvents(): void {\n // Theme toggle\n if (this.themeToggleButton) {\n this.themeToggleButton.addEventListener('click', this.handleThemeToggleClick.bind(this));\n }\n\n // Initialize theme button state\n this.updateThemeButtonState();\n\n // Initialize responsive header actions dropdown\n this.initializeHeaderActionsDropdown();\n }\n\n /**\n * Handle theme toggle button clicks\n */\n protected handleThemeToggleClick(): void {\n const currentSetting = ThemeManager.getCurrentThemeSetting();\n const nextSetting = ThemeManager.getNextTheme(currentSetting);\n ThemeManager.setTheme(nextSetting);\n this.updateThemeButtonState(nextSetting);\n }\n\n /**\n * Update the theme toggle button state and appearance\n */\n protected updateThemeButtonState(currentTheme?: string): void {\n if (!this.themeToggleButton || !this.themeToggleIcon) return;\n\n const themeToDisplay = currentTheme || ThemeManager.getCurrentThemeSetting();\n const iconSVG = ThemeManager.getIconSVG(themeToDisplay);\n const label = `Toggle theme (currently: ${ThemeManager.getThemeLabel(themeToDisplay)})`;\n\n this.themeToggleIcon.innerHTML = iconSVG;\n this.themeToggleButton.setAttribute('aria-label', label);\n this.themeToggleButton.setAttribute('title', label);\n }\n\n /**\n * Show a toast notification\n */\n protected showToast(title: string, message: string, type: 'success' | 'error' | 'info' | 'warning' = 'info', duration?: number): void {\n this.toastManager?.showToast(title, message, type, duration);\n }\n\n /**\n * Show a modal dialog\n */\n protected showModal(templateId: string, data?: any): void {\n this.modal?.show(templateId, data);\n }\n\n /**\n * Hide the modal dialog\n */\n protected hideModal(): void {\n this.modal?.hide();\n }\n\n /**\n * Get the current theme setting\n */\n protected getCurrentTheme(): string {\n return ThemeManager.getCurrentThemeSetting();\n }\n\n /**\n * Check if the current theme is dark mode\n */\n protected isDarkMode(): boolean {\n return document.documentElement.classList.contains('dark');\n }\n\n /**\n * Initialize responsive header actions drawer\n * On desktop: drawer is always visible, positioned inline with header\n * On mobile: drawer slides down from top when menu button is clicked\n */\n protected initializeHeaderActionsDropdown(): void {\n const menuBtn = document.getElementById('header-actions-menu-btn');\n const drawer = document.getElementById('header-actions-drawer');\n\n if (!menuBtn || !drawer) {\n return; // Elements don't exist on this page\n }\n\n const drawerBackdrop = drawer.querySelector('.header-drawer-backdrop') as HTMLElement;\n\n // Open drawer with animation\n const openDrawer = () => {\n drawer.classList.remove('hidden');\n // Trigger reflow to ensure animation plays\n void drawer.offsetHeight;\n requestAnimationFrame(() => {\n drawer.classList.add('open');\n });\n };\n\n // Close drawer with animation\n const closeDrawer = () => {\n drawer.classList.remove('open');\n // Wait for animation to complete before hiding\n setTimeout(() => {\n drawer.classList.add('hidden');\n }, 300); // Match duration-300 in CSS\n };\n\n // Toggle drawer (mobile only - desktop drawer is always visible via CSS)\n menuBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if (drawer.classList.contains('open')) {\n closeDrawer();\n } else {\n openDrawer();\n }\n });\n\n // Close drawer when backdrop is clicked (mobile only)\n if (drawerBackdrop) {\n drawerBackdrop.addEventListener('click', closeDrawer);\n }\n\n // Close drawer on Escape key (mobile only)\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && drawer.classList.contains('open')) {\n closeDrawer();\n }\n });\n }\n\n /**\n * Abstract method that subclasses must implement to initialize their specific components\n * Should return any child components that need lifecycle management\n */\n protected initializeSpecificComponents(): LCMComponent[] { return []; }\n\n /**\n * Abstract method that subclasses must implement to bind their specific events\n */\n protected bindSpecificEvents(): void {}\n\n /**\n * Component-specific cleanup logic (required by BaseComponent)\n */\n protected destroyComponent(): void {\n this.log('BasePage: Cleaning up base page components');\n\n // Clean up base components\n this.modal = null as any;\n this.toastManager = null as any;\n this.themeToggleButton = null as any;\n this.themeToggleIcon = null as any;\n }\n\n /**\n * Ensure an element exists, create if missing\n * This is acceptable for page-level orchestration to find component root elements\n */\n protected ensureElement(selector: string, fallbackId: string): HTMLElement {\n let element = document.querySelector(selector) as HTMLElement;\n if (!element) {\n console.warn(`Element not found: ${selector}, creating fallback`);\n element = document.createElement('div');\n element.id = fallbackId;\n element.className = 'w-full h-full';\n // Fallback should be more specific than just body\n const mainContainer = document.querySelector('main') || document.body;\n mainContainer.appendChild(element);\n }\n\n // Ensure element has an ID for Phaser container\n if (!element.id) {\n element.id = fallbackId;\n }\n\n return element;\n }\n\n protected dismissSplashScreen() {\n SplashScreen.dismiss();\n }\n\n static loadAfterPageLoaded<T>(pageName: string, PageClass: any, PageClassName: string) {\n // Initialize page when DOM is ready using LifecycleController\n document.addEventListener('DOMContentLoaded', async () => {\n // Create page instance (just basic setup)\n const page = new PageClass(PageClassName);\n\n // Make GameViewerPage available for e2e testing via command interface\n (window as any)[pageName] = page;\n\n // Create lifecycle controller with debug logging\n const lifecycleController = new LifecycleController(page.eventBus, LifecycleController.DefaultConfig);\n\n // Start breadth-first initialization\n await lifecycleController.initializeFromRoot(page);\n });\n }\n}\n","import { BaseComponent } from './Component';\nimport { LCMComponent } from './LCMComponent';\nimport { EventBus } from './EventBus';\n\n/**\n * MobileBottomDrawer - Reusable bottom drawer component for mobile layouts\n *\n * Features:\n * - Slides up from bottom covering 60-70% of viewport\n * - Backdrop overlay that dims the content behind\n * - Auto-closes when backdrop is tapped\n * - Swipe down to close gesture\n * - Smooth slide-up/down animations\n * - Holds any panel content\n */\nexport class MobileBottomDrawer extends BaseComponent implements LCMComponent {\n private backdropElement: HTMLElement;\n private drawerElement: HTMLElement;\n private contentElement: HTMLElement;\n private closeButton: HTMLElement | null;\n private isOpen: boolean = false;\n private onCloseCallback?: () => void;\n\n // Swipe gesture tracking\n private touchStartY: number = 0;\n private touchCurrentY: number = 0;\n private isDragging: boolean = false;\n\n /**\n * Create a MobileBottomDrawer\n * @param rootElement - The root container element for the drawer\n * @param eventBus - Event bus for component communication\n * @param debugMode - Enable debug logging\n */\n constructor(rootElement: HTMLElement, eventBus: EventBus, debugMode: boolean = false) {\n super('mobile-bottom-drawer', rootElement, eventBus, debugMode);\n }\n\n /**\n * Phase 1: Initialize DOM and discover child components\n */\n async performLocalInit(): Promise<LCMComponent[]> {\n // Find drawer elements\n this.backdropElement = this.rootElement.querySelector('.drawer-backdrop') as HTMLElement;\n this.drawerElement = this.rootElement.querySelector('.drawer-container') as HTMLElement;\n this.contentElement = this.rootElement.querySelector('.drawer-content') as HTMLElement;\n this.closeButton = this.rootElement.querySelector('.drawer-close-btn') as HTMLElement;\n\n if (!this.backdropElement || !this.drawerElement || !this.contentElement) {\n throw new Error('MobileBottomDrawer: Required drawer elements not found');\n }\n\n // Bind event listeners\n this.bindEvents();\n\n return [];\n }\n\n /**\n * Bind event listeners for drawer interactions\n */\n private bindEvents(): void {\n // Close drawer on backdrop click\n this.backdropElement.addEventListener('click', (e) => {\n if (e.target === this.backdropElement) {\n this.close();\n }\n });\n\n // Close drawer on close button click\n if (this.closeButton) {\n this.closeButton.addEventListener('click', () => {\n this.close();\n });\n }\n\n // Close drawer on Escape key\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.isOpen) {\n this.close();\n }\n });\n\n // Swipe-to-close gesture on drawer element\n this.drawerElement.addEventListener('touchstart', (e) => this.handleTouchStart(e), { passive: true });\n this.drawerElement.addEventListener('touchmove', (e) => this.handleTouchMove(e), { passive: false });\n this.drawerElement.addEventListener('touchend', (e) => this.handleTouchEnd(e), { passive: true });\n }\n\n /**\n * Handle touch start for swipe gesture\n */\n private handleTouchStart(e: TouchEvent): void {\n // Only track if touching the drawer itself (not scrollable content)\n const contentScrollTop = this.contentElement.scrollTop;\n\n // If content is scrolled down, let normal scrolling happen\n if (contentScrollTop > 0) {\n return;\n }\n\n this.touchStartY = e.touches[0].clientY;\n this.touchCurrentY = this.touchStartY;\n this.isDragging = true;\n }\n\n /**\n * Handle touch move for swipe gesture\n */\n private handleTouchMove(e: TouchEvent): void {\n if (!this.isDragging) return;\n\n this.touchCurrentY = e.touches[0].clientY;\n const deltaY = this.touchCurrentY - this.touchStartY;\n\n // Only allow downward swipes\n if (deltaY > 0) {\n // Prevent default scrolling when swiping down\n e.preventDefault();\n\n // Apply drag transform with resistance\n const dragAmount = Math.min(deltaY, 300); // Cap at 300px\n this.drawerElement.style.transform = `translateY(${dragAmount}px)`;\n\n // Reduce backdrop opacity based on drag amount\n const opacity = Math.max(0, 0.5 - (dragAmount / 600));\n this.backdropElement.style.background = `rgba(0, 0, 0, ${opacity})`;\n }\n }\n\n /**\n * Handle touch end for swipe gesture\n */\n private handleTouchEnd(e: TouchEvent): void {\n if (!this.isDragging) return;\n\n const deltaY = this.touchCurrentY - this.touchStartY;\n const velocity = deltaY / 300; // Rough velocity calculation\n\n // Close if swiped down more than 100px or with high velocity\n if (deltaY > 100 || velocity > 0.3) {\n this.close();\n } else {\n // Snap back to open position\n this.drawerElement.style.transform = '';\n this.backdropElement.style.background = '';\n }\n\n this.isDragging = false;\n }\n\n /**\n * Open the drawer with slide-up animation\n */\n public open(): void {\n if (this.isOpen) return;\n\n this.isOpen = true;\n\n // Reset any drag transform\n this.drawerElement.style.transform = '';\n this.backdropElement.style.background = '';\n\n // Add open class - CSS handles all animations\n this.rootElement.classList.add('open');\n\n // Emit event\n this.eventBus.emit('drawer-opened', { drawerId: this.componentId }, null, this);\n }\n\n /**\n * Close the drawer with slide-down animation\n */\n public close(): void {\n if (!this.isOpen) return;\n\n this.isOpen = false;\n\n // Reset any drag transform\n this.drawerElement.style.transform = '';\n this.backdropElement.style.background = '';\n\n // Remove open class - CSS handles animation\n this.rootElement.classList.remove('open');\n\n // Emit event\n this.eventBus.emit('drawer-closed', { drawerId: this.componentId }, null, this);\n\n // Call close callback if provided\n if (this.onCloseCallback) {\n this.onCloseCallback();\n }\n }\n\n /**\n * Toggle drawer open/closed\n */\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Check if drawer is currently open\n */\n public getIsOpen(): boolean {\n return this.isOpen;\n }\n\n /**\n * Set the content element for the drawer\n * @param element - The element to insert into the drawer content area\n */\n public setContent(element: HTMLElement): void {\n this.contentElement.innerHTML = '';\n this.contentElement.appendChild(element);\n }\n\n /**\n * Set a callback to be called when drawer closes\n * @param callback - Function to call on close\n */\n public setOnClose(callback: () => void): void {\n this.onCloseCallback = callback;\n }\n\n /**\n * Get the content container element\n */\n public getContentContainer(): HTMLElement {\n return this.contentElement;\n }\n}\n","import type { IslandSpec, PageSpec } from \"./spec\";\n\n/**\n * Builds one island in `el`. `ctx` is the page's shared services, whatever\n * the app says they are; `bus` is the page's event bus.\n */\nexport type IslandFactory<Ctx, El, C, B> = (el: El, island: IslandSpec, ctx: Ctx, bus: B) => C;\n\n/** The islands an entry can mount, by name. An entry bundles only what its registry names. */\nexport type Registry<Ctx, El, C, B> = Record<string, IslandFactory<Ctx, El, C, B>>;\n\n/**\n * Mounts every island in `spec` into the element `findSlot` gives for its\n * slot, and returns what the factories built, in spec order. `context` builds\n * the page's shared services; it's called once, before the first island\n * mounts, and not at all on a page with nothing to mount, so a page without\n * islands doesn't start what they'd share. An island the registry doesn't\n * know, a slot that isn't on the page, or a factory that throws is reported\n * through `log` and skipped, so one bad entry doesn't take the rest of the\n * page down with it.\n *\n * Plain types throughout (no DOM), so it runs under node in tests and on a\n * bare page without BasePage.\n */\nexport function mountIslands<Ctx, El, C, B>(\n spec: PageSpec,\n registry: Registry<Ctx, El, C, B>,\n findSlot: (slot: string) => El | null,\n context: () => Ctx,\n bus: B,\n log: (message: string) => void,\n): C[] {\n const out: C[] = [];\n let ctx: Ctx | undefined;\n for (const island of spec.islands) {\n const factory = Object.prototype.hasOwnProperty.call(registry, island.name) ? registry[island.name] : undefined;\n if (!factory) {\n log(`page spec: no island called \"${island.name}\" in this page's registry`);\n continue;\n }\n const el = findSlot(island.slot);\n if (el === null) {\n log(`page spec: island \"${island.name}\" wants slot \"${island.slot}\", which isn't on the page`);\n continue;\n }\n try {\n ctx ??= context();\n out.push(factory(el, island, ctx, bus));\n } catch (err) {\n log(`page spec: island \"${island.name}\" failed to mount: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n return out;\n}\n","/**\n * The page spec: which islands a page mounts, where, and with what config.\n * The server writes it into the page as JSON (goapplib's page.Spec, through\n * templates/page/Islands.html); this reads it back.\n */\n\n/** The id of the script element the server writes the spec into. */\nexport const SPEC_ELEMENT_ID = \"page-spec\";\n\n/** One island: `name` picks its factory, `slot` the element it mounts in (`[data-slot]`). */\nexport interface IslandSpec {\n name: string;\n slot: string;\n /** How the layout shows it (the app's own words: \"page\", \"panel\", \"drawer\"), when it draws differently in each. */\n presentation?: string;\n /** Handed to the factory as is. Always an object. */\n config: Record<string, unknown>;\n}\n\nexport interface PageSpec {\n /** The arrangement of slots, for state kept per layout. */\n layout: string;\n islands: IslandSpec[];\n}\n\n/**\n * Reads an app's own fields from the parsed spec, the ones its Go type adds\n * by embedding page.Spec. Gets the whole object; returns what the app wants\n * kept, already checked.\n */\nexport type SpecExtension<Ext> = (raw: Record<string, unknown>) => Ext;\n\n// Slot names go into an attribute selector, so they must stay plain (as Go checks).\nconst SLOT = /^[a-z][a-z0-9-]*$/;\n\n/**\n * The spec in `text`, or null when there is none or it isn't one. Islands\n * without a name or with a slot name that isn't plain are dropped, and a\n * config that isn't an object becomes {}, so what comes back can be mounted.\n *\n * `extend`, when given, reads the app's own fields; they're merged into the\n * result, but `layout` and `islands` always come from this reading. If it\n * throws, the spec is unreadable and the result is null.\n */\nexport function readSpec(text: string | null | undefined): PageSpec | null;\nexport function readSpec<Ext extends object>(text: string | null | undefined, extend: SpecExtension<Ext>): (PageSpec & Ext) | null;\nexport function readSpec<Ext extends object>(text: string | null | undefined, extend?: SpecExtension<Ext>): PageSpec | (PageSpec & Ext) | null {\n if (!text) return null;\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch {\n return null;\n }\n if (!isObject(raw) || typeof raw.layout !== \"string\" || !Array.isArray(raw.islands)) return null;\n const islands: IslandSpec[] = [];\n for (const is of raw.islands) {\n if (!isObject(is) || typeof is.name !== \"string\" || !is.name || typeof is.slot !== \"string\" || !SLOT.test(is.slot)) continue;\n islands.push({\n name: is.name,\n slot: is.slot,\n ...(typeof is.presentation === \"string\" && { presentation: is.presentation }),\n config: isObject(is.config) ? is.config : {},\n });\n }\n const spec: PageSpec = { layout: raw.layout, islands };\n if (!extend) return spec;\n let ext: Ext;\n try {\n ext = extend(raw);\n } catch {\n return null;\n }\n return { ...ext, ...spec };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n","import { BasePage } from \"../BasePage\";\nimport type { EventBus } from \"../EventBus\";\nimport type { LCMComponent } from \"../LCMComponent\";\nimport { mountIslands, type Registry } from \"./mount\";\nimport { readSpec, SPEC_ELEMENT_ID, type PageSpec } from \"./spec\";\n\n/**\n * A page whose islands come from the page spec. A subclass says which\n * islands it can mount (`registry`) and builds the services they share\n * (`makeContext`); the spec says which islands this page gets and where.\n *\n * `makeContext` is called once with the spec, before the first island\n * mounts, and not at all on a page with no islands to mount. An app whose\n * spec carries more than islands (its Go type embeds page.Spec) reads those\n * fields in `readExtension`, and they arrive typed as `Ext` on the spec\n * `makeContext` gets.\n *\n * A page with no readable `#page-spec` mounts nothing and warns. Subclasses\n * that override initializeSpecificComponents call super and add to what it\n * returns.\n */\nexport abstract class IslandPage<Ctx, Ext extends object = {}> extends BasePage {\n protected abstract registry(): Registry<Ctx, HTMLElement, LCMComponent, EventBus>;\n protected abstract makeContext(spec: PageSpec & Ext): Ctx;\n\n /**\n * The app's own fields from the parsed spec. The default reads none.\n * Throwing makes the spec unreadable, so nothing mounts.\n */\n protected readExtension(raw: Record<string, unknown>): Ext {\n return {} as Ext;\n }\n\n protected override initializeSpecificComponents(): LCMComponent[] {\n const spec = readSpec(document.getElementById(SPEC_ELEMENT_ID)?.textContent, (raw) => this.readExtension(raw));\n if (!spec) {\n console.warn(`page spec: no readable #${SPEC_ELEMENT_ID} on this page, so nothing is mounted`);\n return [];\n }\n return mountIslands(\n spec,\n this.registry(),\n (slot) => document.querySelector<HTMLElement>(`[data-slot=\"${slot}\"]`),\n () => this.makeContext(spec),\n this.eventBus,\n (message) => console.warn(message),\n );\n }\n}\n","/**\n * Common DOM utility functions for consistent behavior across components\n */\n\n/**\n * Checks if the user is currently typing in an input field, textarea, or other editable element.\n * This is used to prevent keyboard shortcuts from interfering with user input.\n *\n * @param element - The target element from a keyboard event\n * @returns true if the user is in an input context, false otherwise\n */\nexport function isInInputContext(element: HTMLElement | null): boolean {\n if (!element) return false;\n\n const tagName = element.tagName.toLowerCase();\n\n // Direct input elements\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n return true;\n }\n\n // Contenteditable elements\n if (element.contentEditable === 'true' || element.isContentEditable) {\n return true;\n }\n\n // Check if element is inside input-related containers\n if (element.closest('input') !== null ||\n element.closest('textarea') !== null ||\n element.closest('select') !== null ||\n element.closest('[contenteditable=\"true\"]') !== null ||\n element.closest('[contenteditable=\"\"]') !== null) {\n return true;\n }\n\n // Check if element is inside a modal (modals often contain forms)\n if (element.closest('.modal') !== null) {\n return true;\n }\n\n // Check for specific input field IDs that might be problematic\n const inputFieldIds = ['map-title-input'];\n if (inputFieldIds.includes(element.id) ||\n inputFieldIds.some(id => element.closest(`#${id}`) !== null)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Checks if modifier keys are pressed (Ctrl, Alt, Cmd, Shift).\n * This is commonly used to filter keyboard shortcuts.\n *\n * @param event - The keyboard event\n * @returns true if any modifier keys are pressed, false otherwise\n */\nexport function hasModifierKeys(event: KeyboardEvent): boolean {\n return event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;\n}\n\n/**\n * Combined check for whether keyboard shortcuts should be ignored.\n * This checks both modifier keys and input context.\n *\n * @param event - The keyboard event\n * @returns true if shortcuts should be ignored, false if they can be processed\n */\nexport function shouldIgnoreShortcut(event: KeyboardEvent): boolean {\n const target = event.target as HTMLElement;\n return hasModifierKeys(event) || isInInputContext(target);\n}\n","/**\n * Generic keyboard shortcut manager for handling multi-key commands\n * across all application pages\n *\n * Current Behavior (default):\n * - User types 'c3' → visual indicator → Enter/timeout → execute\n * - Requires explicit confirmation for execution\n *\n * Future Immediate Mode (when enabled):\n * - User types 'c3' → immediate preview → Escape to cancel\n * - Provides instant feedback with option to cancel\n */\n\nimport { isInInputContext } from './DOMUtils';\n\nexport interface ShortcutConfig {\n key: string;\n handler: (args?: string) => void;\n description: string;\n category?: string;\n requiresArgs?: boolean;\n argType?: 'number' | 'string';\n contextFilter?: (event: KeyboardEvent) => boolean;\n\n // Future: Preview handlers for immediate execution mode\n previewHandler?: (args?: string) => void; // Called immediately as user types\n cancelHandler?: () => void; // Called when user presses Escape\n executeImmediately?: boolean; // Override global immediateExecution setting\n}\n\nexport interface ShortcutManagerConfig {\n shortcuts: ShortcutConfig[];\n helpContainer?: string;\n timeout?: number; // ms to return to normal state (current: 3000ms, immediate mode: 300ms)\n immediateExecution?: boolean; // Enable immediate execution with preview\n previewDelay?: number; // ms delay before preview execution (default: 300ms)\n onStateChange?: (state: KeyboardState, command?: string) => void; // Callback when state changes\n}\n\nexport enum KeyboardState {\n NORMAL = 'normal',\n AWAITING_ARGS = 'awaiting_args'\n}\n\nexport class KeyboardShortcutManager {\n private shortcuts: Map<string, ShortcutConfig> = new Map();\n private state: KeyboardState = KeyboardState.NORMAL;\n private currentCommand: string = '';\n private currentArgs: string = '';\n private helpContainer: string | null = null;\n private timeout: number = 3000; // Default 3 second timeout\n private timeoutId: number | null = null;\n private helpOverlay: HTMLElement | null = null;\n private immediateExecution: boolean = false; // Enable immediate execution mode\n private previewDelay: number = 300; // Default 300ms preview delay\n private previewTimeoutId: number | null = null; // Separate timeout for preview\n private isPreviewActive: boolean = false; // Track if preview is currently active\n private onStateChange: ((state: KeyboardState, command?: string) => void) | null = null;\n\n constructor(config: ShortcutManagerConfig) {\n this.helpContainer = config.helpContainer || null;\n this.timeout = config.timeout || 3000;\n this.immediateExecution = config.immediateExecution || false;\n this.previewDelay = config.previewDelay || 300;\n this.onStateChange = config.onStateChange || null;\n\n // Register shortcuts\n config.shortcuts.forEach(shortcut => {\n this.shortcuts.set(shortcut.key, shortcut);\n });\n\n this.initialize();\n }\n\n private initialize(): void {\n // Global keydown listener\n document.addEventListener('keydown', this.handleKeydown.bind(this));\n\n // Show initial state indicator\n this.updateStateIndicator();\n }\n\n private handleKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n\n // Skip if in input field, textarea, or contenteditable\n if (isInInputContext(target)) {\n return;\n }\n\n // Handle help key\n if (event.key === '?' && this.state === KeyboardState.NORMAL) {\n event.preventDefault();\n this.showHelp();\n return;\n }\n\n // Handle escape key\n if (event.key === 'Escape') {\n event.preventDefault();\n\n // Cancel preview if active in immediate execution mode\n if (this.immediateExecution && this.isPreviewActive) {\n this.cancelCurrentPreview();\n }\n\n this.resetState();\n return;\n }\n\n // Handle state machine\n if (this.state === KeyboardState.NORMAL) {\n this.handleNormalState(event);\n } else if (this.state === KeyboardState.AWAITING_ARGS) {\n this.handleAwaitingArgsState(event);\n }\n }\n\n private handleNormalState(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n const shortcut = this.shortcuts.get(key);\n\n if (shortcut) {\n event.preventDefault();\n\n // Check context filter\n if (shortcut.contextFilter && !shortcut.contextFilter(event)) {\n return;\n }\n\n if (shortcut.requiresArgs) {\n // Enter args waiting state\n this.state = KeyboardState.AWAITING_ARGS;\n this.currentCommand = key;\n this.currentArgs = '';\n this.updateStateIndicator();\n this.startTimeout();\n\n // Notify state change\n if (this.onStateChange) {\n this.onStateChange(this.state, key);\n }\n } else {\n // Execute immediately\n this.executeShortcut(shortcut);\n }\n }\n }\n\n private handleAwaitingArgsState(event: KeyboardEvent): void {\n const key = event.key;\n\n if (key >= '0' && key <= '9') {\n // Add digit to args\n event.preventDefault();\n this.currentArgs += key;\n this.updateStateIndicator();\n this.resetTimeout();\n\n // Handle immediate execution mode\n if (this.immediateExecution) {\n this.schedulePreviewExecution();\n }\n } else if (key === 'Enter' || key === ' ') {\n // Execute command with args\n event.preventDefault();\n this.executeCurrentCommand();\n } else if (key === 'Backspace') {\n // Remove last digit\n event.preventDefault();\n this.currentArgs = this.currentArgs.slice(0, -1);\n this.updateStateIndicator();\n this.resetTimeout();\n\n // Handle immediate execution mode\n if (this.immediateExecution) {\n this.cancelPreviewExecution();\n if (this.currentArgs.length > 0) {\n this.schedulePreviewExecution();\n }\n }\n }\n }\n\n private executeCurrentCommand(): void {\n const shortcut = this.shortcuts.get(this.currentCommand);\n if (shortcut && this.currentArgs) {\n this.executeShortcut(shortcut, this.currentArgs);\n }\n this.resetState();\n }\n\n private executeShortcut(shortcut: ShortcutConfig, args?: string): void {\n try {\n shortcut.handler(args);\n } catch (error) {\n console.error('Error executing shortcut:', error);\n }\n }\n\n private schedulePreviewExecution(): void {\n // Cancel any existing preview timeout\n this.cancelPreviewExecution();\n\n // Schedule preview execution\n this.previewTimeoutId = window.setTimeout(() => {\n this.executePreview();\n }, this.previewDelay);\n }\n\n private cancelPreviewExecution(): void {\n if (this.previewTimeoutId) {\n window.clearTimeout(this.previewTimeoutId);\n this.previewTimeoutId = null;\n }\n\n // Cancel current preview if active\n if (this.isPreviewActive) {\n this.cancelCurrentPreview();\n }\n }\n\n private executePreview(): void {\n const shortcut = this.shortcuts.get(this.currentCommand);\n if (shortcut && this.currentArgs) {\n try {\n // Call preview handler if available\n if (shortcut.previewHandler) {\n shortcut.previewHandler(this.currentArgs);\n this.isPreviewActive = true;\n } else {\n // Fallback to regular handler for immediate execution\n shortcut.handler(this.currentArgs);\n this.isPreviewActive = true;\n }\n } catch (error) {\n console.error('Error executing preview:', error);\n }\n }\n }\n\n private cancelCurrentPreview(): void {\n if (this.isPreviewActive) {\n const shortcut = this.shortcuts.get(this.currentCommand);\n if (shortcut && shortcut.cancelHandler) {\n try {\n shortcut.cancelHandler();\n } catch (error) {\n console.error('Error canceling preview:', error);\n }\n }\n this.isPreviewActive = false;\n }\n }\n\n\n private resetState(): void {\n this.state = KeyboardState.NORMAL;\n this.currentCommand = '';\n this.currentArgs = '';\n this.clearTimeout();\n this.cancelPreviewExecution();\n this.updateStateIndicator();\n this.hideHelp();\n\n // Notify state change\n if (this.onStateChange) {\n this.onStateChange(this.state);\n }\n }\n\n private startTimeout(): void {\n this.timeoutId = window.setTimeout(() => {\n this.resetState();\n }, this.timeout);\n }\n\n private resetTimeout(): void {\n this.clearTimeout();\n this.startTimeout();\n }\n\n private clearTimeout(): void {\n if (this.timeoutId) {\n window.clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n private updateStateIndicator(): void {\n // Remove existing indicator\n const existingIndicator = document.getElementById('keyboard-state-indicator');\n if (existingIndicator) {\n existingIndicator.remove();\n }\n\n // Only show indicator when not in normal state\n if (this.state === KeyboardState.NORMAL) {\n return;\n }\n\n // Create new indicator\n const indicator = document.createElement('div');\n indicator.id = 'keyboard-state-indicator';\n indicator.className = 'fixed top-4 right-4 bg-blue-600 text-white px-3 py-2 rounded-lg shadow-lg z-50 font-mono text-sm';\n\n if (this.state === KeyboardState.AWAITING_ARGS) {\n const shortcut = this.shortcuts.get(this.currentCommand);\n const description = shortcut ? shortcut.description : 'Unknown command';\n indicator.innerHTML = `\n <div class=\"flex items-center space-x-2\">\n <span>${this.currentCommand.toUpperCase()}</span>\n <span class=\"text-blue-200\">${this.currentArgs || '_'}</span>\n </div>\n <div class=\"text-xs text-blue-200 mt-1\">${description}</div>\n `;\n }\n\n document.body.appendChild(indicator);\n }\n\n private showHelp(): void {\n if (this.helpOverlay) {\n this.hideHelp();\n return;\n }\n\n this.helpOverlay = document.createElement('div');\n this.helpOverlay.id = 'keyboard-help-overlay';\n this.helpOverlay.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50';\n\n const helpContent = document.createElement('div');\n helpContent.className = 'bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl max-h-[80vh] overflow-y-auto p-6';\n\n helpContent.innerHTML = this.generateHelpContent();\n\n this.helpOverlay.appendChild(helpContent);\n document.body.appendChild(this.helpOverlay);\n\n // Close on click outside or escape\n this.helpOverlay.addEventListener('click', (e) => {\n if (e.target === this.helpOverlay) {\n this.hideHelp();\n }\n });\n }\n\n private hideHelp(): void {\n if (this.helpOverlay) {\n this.helpOverlay.remove();\n this.helpOverlay = null;\n }\n }\n\n private generateHelpContent(): string {\n const categories = new Map<string, ShortcutConfig[]>();\n\n // Group shortcuts by category\n this.shortcuts.forEach(shortcut => {\n const category = shortcut.category || 'General';\n if (!categories.has(category)) {\n categories.set(category, []);\n }\n categories.get(category)!.push(shortcut);\n });\n\n let html = `\n <div class=\"flex items-center justify-between mb-4\">\n <h2 class=\"text-xl font-bold text-gray-900 dark:text-white\">Keyboard Shortcuts</h2>\n <button class=\"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\" onclick=\"this.closest('#keyboard-help-overlay').remove()\">\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n </button>\n </div>\n `;\n\n categories.forEach((shortcuts, category) => {\n html += `\n <div class=\"mb-6\">\n <h3 class=\"text-lg font-semibold text-gray-800 dark:text-gray-200 mb-3\">${category}</h3>\n <div class=\"space-y-2\">\n `;\n\n shortcuts.forEach(shortcut => {\n const keyDisplay = shortcut.requiresArgs\n ? `${shortcut.key.toUpperCase()}<span class=\"text-blue-600 dark:text-blue-400\"><number></span>`\n : shortcut.key.toUpperCase();\n\n html += `\n <div class=\"flex items-center justify-between py-2 px-3 bg-gray-50 dark:bg-gray-700 rounded\">\n <span class=\"text-sm text-gray-700 dark:text-gray-300\">${shortcut.description}</span>\n <kbd class=\"px-2 py-1 text-xs font-mono bg-gray-200 dark:bg-gray-600 text-gray-800 dark:text-gray-200 rounded\">${keyDisplay}</kbd>\n </div>\n `;\n });\n\n html += `\n </div>\n </div>\n `;\n });\n\n\n html += `\n <div class=\"mt-6 pt-4 border-t border-gray-200 dark:border-gray-600\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center\">\n Press <kbd class=\"px-2 py-1 text-xs font-mono bg-gray-200 dark:bg-gray-600 rounded\">ESC</kbd> to cancel any command or\n <kbd class=\"px-2 py-1 text-xs font-mono bg-gray-200 dark:bg-gray-600 rounded\">?</kbd> to close this help\n </p>\n </div>\n `;\n\n return html;\n }\n\n public destroy(): void {\n document.removeEventListener('keydown', this.handleKeydown.bind(this));\n this.cancelPreviewExecution();\n this.resetState();\n this.hideHelp();\n }\n\n public getState(): KeyboardState {\n return this.state;\n }\n\n public getCurrentCommand(): string {\n return this.currentCommand;\n }\n\n public getCurrentArgs(): string {\n return this.currentArgs;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/EventBus.ts","../src/Component.ts","../src/LifecycleController.ts","../src/ThemeManager.ts","../src/TemplateLoader.ts","../src/Modal.ts","../src/ToastManager.ts","../src/SplashScreen.ts","../src/BasePage.ts","../src/MobileBottomDrawer.ts","../src/page/load.ts","../src/page/mount.ts","../src/page/spec.ts","../src/page/IslandPage.ts","../src/DOMUtils.ts","../src/KeyboardShortcutManager.ts"],"names":["message","c","KeyboardState"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Simple event system for component communication\n * Provides error isolation and idempotent subscriptions\n */\n\n/**\n * Simple event handler function type\n */\nexport type EventHandler = (data?: any) => void;\n\n/**\n * Interface for components that want to receive events via the EventBus\n */\nexport interface EventSubscriber {\n /**\n * Handle incoming events from the EventBus\n * @param eventType - The type of event being handled\n * @param data - The event data payload\n * @param subject - The subject/subject entity (what the event is about)\n * @param emitter - The entity that emitted the event\n */\n handleBusEvent(eventType: string, data: any, subject: any, emitter: any): void;\n}\n\n/**\n * Internal wrapper to adapt a simple function handler to EventSubscriber interface\n */\nclass FunctionSubscriber implements EventSubscriber {\n constructor(public readonly handler: EventHandler) {}\n\n handleBusEvent(eventType: string, data: any, subject: any, emitter: any): void {\n this.handler(data);\n }\n}\n\n/**\n * Synchronous event bus for component communication\n * Features:\n * - Type-safe event names and payloads\n * - Error isolation (one handler failure doesn't stop others)\n * - Source exclusion (events not sent back to source)\n * - Debug logging for troubleshooting\n */\nexport class EventBus {\n private subscribers: Map<string, Set<EventSubscriber>> = new Map();\n private functionSubscribers: Map<string, Map<EventHandler, FunctionSubscriber>> = new Map();\n private onceHandlers: Map<string, Set<FunctionSubscriber>> = new Map();\n private debugMode: boolean = false;\n\n constructor(debugMode: boolean = false) {\n this.debugMode = debugMode;\n }\n\n // ============== Simple Function-Based API ==============\n\n /**\n * Subscribe to an event with a simple handler function\n */\n public on(eventType: string, handler: EventHandler): void {\n if (!this.functionSubscribers.has(eventType)) {\n this.functionSubscribers.set(eventType, new Map());\n }\n\n const handlersMap = this.functionSubscribers.get(eventType)!;\n if (handlersMap.has(handler)) {\n if (this.debugMode) {\n console.log(`[EventBus] Handler already registered for '${eventType}'`);\n }\n return;\n }\n\n const subscriber = new FunctionSubscriber(handler);\n handlersMap.set(handler, subscriber);\n this.addSubscription(eventType, null, subscriber);\n }\n\n /**\n * Unsubscribe a handler function from an event\n */\n public off(eventType: string, handler: EventHandler): void {\n const handlersMap = this.functionSubscribers.get(eventType);\n if (!handlersMap) return;\n\n const subscriber = handlersMap.get(handler);\n if (subscriber) {\n handlersMap.delete(handler);\n this.removeSubscription(eventType, null, subscriber);\n\n if (handlersMap.size === 0) {\n this.functionSubscribers.delete(eventType);\n }\n }\n }\n\n /**\n * Subscribe to an event for one-time execution\n */\n public once(eventType: string, handler: EventHandler): void {\n if (!this.onceHandlers.has(eventType)) {\n this.onceHandlers.set(eventType, new Set());\n }\n\n const subscriber = new FunctionSubscriber(handler);\n this.onceHandlers.get(eventType)!.add(subscriber);\n\n if (this.debugMode) {\n console.log(`[EventBus] Added once handler for '${eventType}'`);\n }\n }\n\n // ============== EventSubscriber-Based API ==============\n\n /**\n * Add a subscription using the EventSubscriber pattern\n * Provides automatic idempotency - same subscriber object won't be added twice\n */\n public addSubscription(eventType: string, subject: any, subscriber: EventSubscriber): void {\n if (!this.subscribers.has(eventType)) {\n this.subscribers.set(eventType, new Set());\n }\n\n const subscribers = this.subscribers.get(eventType)!;\n const wasAdded = !subscribers.has(subscriber);\n\n if (wasAdded) {\n subscribers.add(subscriber);\n if (this.debugMode) {\n console.log(`[EventBus] Added subscription to '${eventType}' for ${subscriber.constructor.name}`);\n }\n } else if (this.debugMode) {\n console.log(`[EventBus] Subscription already exists for '${eventType}' and ${subscriber.constructor.name}`);\n }\n }\n\n /**\n * Remove a subscription using the EventSubscriber pattern\n */\n public removeSubscription(eventType: string, subject: any, subscriber: EventSubscriber): void {\n const subscribers = this.subscribers.get(eventType);\n\n if (subscribers) {\n const wasRemoved = subscribers.delete(subscriber);\n\n if (this.debugMode && wasRemoved) {\n console.log(`[EventBus] Removed subscription from '${eventType}' for ${subscriber.constructor.name}`);\n }\n\n // Clean up empty subscription sets\n if (subscribers.size === 0) {\n this.subscribers.delete(eventType);\n }\n }\n }\n\n /**\n * Emit an event to all subscribers\n * @param eventType - The event type to emit\n * @param data - The event data payload\n * @param subject - The subject/subject entity that this event relates to (optional for simple API)\n * @param emitter - The entity that emitted the event (optional for simple API)\n */\n public emit<T = any>(eventType: string, data?: T, subject?: any, emitter?: any): void {\n const subscribers = this.subscribers.get(eventType);\n const onceHandlers = this.onceHandlers.get(eventType);\n\n const subscriberCount = (subscribers?.size || 0) + (onceHandlers?.size || 0);\n if (subscriberCount === 0) {\n return;\n }\n\n if (this.debugMode) {\n console.log(`[EventBus] Emitting '${eventType}' to ${subscriberCount} subscribers`);\n }\n\n let successCount = 0;\n let errorCount = 0;\n\n // Call regular EventSubscriber handlers with error isolation\n if (subscribers) {\n subscribers.forEach(subscriber => {\n try {\n subscriber.handleBusEvent(eventType, data, subject, emitter);\n successCount++;\n } catch (error) {\n errorCount++;\n console.error(\n `[EventBus] Error in EventSubscriber handler for '${eventType}' ` +\n `in subscriber '${subscriber.constructor.name}':`,\n error\n );\n }\n });\n }\n\n // Call one-time handlers and then remove them\n if (onceHandlers && onceHandlers.size > 0) {\n onceHandlers.forEach(subscriber => {\n try {\n subscriber.handleBusEvent(eventType, data, subject, emitter);\n successCount++;\n } catch (error) {\n errorCount++;\n console.error(\n `[EventBus] Error in once handler for '${eventType}':`,\n error\n );\n }\n });\n // Clear once handlers after execution\n this.onceHandlers.delete(eventType);\n }\n\n if (this.debugMode) {\n console.log(\n `[EventBus] Event '${eventType}' completed: ` +\n `${successCount} success, ${errorCount} errors`\n );\n }\n }\n\n /**\n * Get all event types that have subscribers\n */\n public getEventTypes(): string[] {\n return Array.from(this.subscribers.keys());\n }\n\n /**\n * Get subscriber count for an event type\n */\n public getSubscriberCount(eventType: string): number {\n return this.subscribers.get(eventType)?.size || 0;\n }\n\n /**\n * Clear all subscriptions (useful for cleanup)\n */\n public clear(): void {\n this.subscribers.clear();\n this.functionSubscribers.clear();\n this.onceHandlers.clear();\n if (this.debugMode) {\n console.log('[EventBus] All subscriptions cleared');\n }\n }\n\n /**\n * Enable or disable debug logging\n */\n public setDebugMode(enabled: boolean): void {\n this.debugMode = enabled;\n }\n}\n\nexport const ComponentEventTypes= {\n COMPONENT_INITIALIZED: 'component-initialized',\n COMPONENT_HYDRATED: 'component-hydrated',\n COMPONENT_ERROR: 'component-error'\n} as const;\n\nexport const LifecycleEventTypes = {\n LOCAL_INIT_STARTED: \"lifecycle-local-init-started\",\n LOCAL_INIT_FINISHED: \"lifecycle-local-init-finished\",\n DEPENDENCIES_INJECTED: \"lifecycle-dependencies-injected\",\n ACTIVATION_STARTED: \"lifecycle-activation-started\",\n ACTIVATION_FINISHED: \"lifecycle-activation-finished\",\n DEACTIVATION_STARTED: \"lifecycle-deactivation-started\",\n DEACTIVATION_FINISHED: \"lifecycle-deactivation-finished\",\n} as const;\n\nexport type LifecycleEventType = typeof LifecycleEventTypes[keyof typeof LifecycleEventTypes];\nexport type ComponentEventType = typeof ComponentEventTypes[keyof typeof ComponentEventTypes];\n","import { EventBus, EventSubscriber, ComponentEventTypes } from './EventBus';\nimport { LCMComponent } from './LCMComponent';\n\n/**\n * Base interface for all UI components\n * Enforces separation of concerns and standard lifecycle\n */\nexport interface Component {\n /**\n * Unique identifier for this component instance\n */\n readonly componentId: string;\n\n /**\n * Root DOM element that this component owns and manages\n */\n readonly rootElement: HTMLElement;\n\n /**\n * Handle dynamic content updates (e.g., from HTMX or server responses)\n * @param newHTML - New HTML content to replace current content\n */\n contentUpdated(newHTML: string): void;\n\n /**\n * Clean up the component and release resources\n * Should unsubscribe from events, clean up DOM, and release memory\n */\n // destroy(): void;\n}\n\n/**\n * Abstract base class implementing common component functionality\n * Provides standard lifecycle management and event bus integration\n *\n * All components auto-initialize in constructor AND implement LCMComponent\n * for coordination with other components when needed.\n */\nexport abstract class BaseComponent implements Component, LCMComponent, EventSubscriber {\n protected _eventBus: EventBus;\n\n constructor(public readonly componentId: string, public readonly rootElement: HTMLElement, eventBus: EventBus | null = null, public readonly debugMode: boolean = false) {\n // Mark as component in DOM for debugging\n this._eventBus = eventBus || new EventBus();\n this.rootElement.setAttribute('data-component', this.componentId);\n }\n\n public get eventBus(): EventBus {\n return this._eventBus\n }\n\n public contentUpdated(newHTML: string): void {\n this.log('Content updated, re-binding to DOM');\n\n // Update the DOM\n this.rootElement.innerHTML = newHTML;\n\n // Note: In pure LCMComponent approach, re-binding should be handled\n // by the component's LCMComponent lifecycle methods if needed\n }\n\n /**\n * Subscribe to an event using the new EventSubscriber pattern\n */\n protected addSubscription(eventType: string, target: any = null): void {\n this.eventBus.addSubscription(eventType, target, this);\n }\n\n /**\n * Unsubscribe from an event using the new EventSubscriber pattern\n */\n protected removeSubscription(eventType: string, target: any = null): void {\n this.eventBus.removeSubscription(eventType, target, this);\n }\n\n /**\n * Emit an event from this component\n */\n protected emit<T = any>(eventType: string, data: T, target: any, emitter: any = null): void {\n this.eventBus.emit(eventType, data, target, emitter || this);\n }\n\n /**\n * Default implementation of EventSubscriber interface\n * Components can override this to handle events\n */\n public handleBusEvent(eventType: string, data: any, target: any, emitter: any): void {\n // Default: no event handling\n // Subclasses should override this method to handle specific events\n if (this.debugMode) {\n console.log(`[${this.componentId}] Received unhandled event: ${eventType}`);\n }\n }\n\n /**\n * Find elements within this component's root element only\n * Enforces separation of concerns - no cross-component DOM access\n */\n protected findElement<T extends HTMLElement = HTMLElement>(selector: string): T | null {\n return this.rootElement.querySelector<T>(selector);\n }\n\n /**\n * Find multiple elements within this component's root element only\n */\n protected findElements<T extends HTMLElement = HTMLElement>(selector: string): T[] {\n return Array.from(this.rootElement.querySelectorAll<T>(selector));\n }\n\n /**\n * Log messages with component identification\n */\n protected log(message: string, data: any = null): void {\n if (this.debugMode) {\n console.log(`[${this.componentId}] ${message}`, data);\n }\n }\n\n /**\n * Default lifecycle method: discover and return child components\n * Override this if your component creates child components that need lifecycle management\n */\n public performLocalInit(): Promise<LCMComponent[]> | LCMComponent[] {\n // Default: no child components\n return [];\n }\n\n /**\n * Default lifecycle method: inject dependencies\n * Override this if your component needs dependencies from other components\n */\n public setupDependencies(): void | Promise<void> {\n // Default: no dependencies needed\n }\n\n /**\n * Default lifecycle method: activate component for coordination\n * Override this if your component needs to coordinate with other components after initialization\n */\n public activate(): void | Promise<void> {\n // Default: no coordination needed - component is already auto-initialized\n }\n\n /**\n * Default lifecycle method: deactivate component\n * Override this if your component needs cleanup during lifecycle management\n */\n public deactivate(): void | Promise<void> {\n // Remove component marker from DOM\n this.rootElement?.removeAttribute('data-component');\n\n this.log('Component deactivated successfully');\n }\n\n set innerHTML(innerHTML: string) {\n const [newHTML, allow] = this.shouldUpdateHtml(innerHTML)\n if (allow) {\n this.rootElement.innerHTML = newHTML\n this.htmlUpdated(newHTML)\n }\n }\n\n // Called BEFORE the HTML is about to be updated. This is an opportunity\n // for subclasses to fix/tweak html being updated and also ignore an update\n // just in case. Default behavior is to return the html as is\n shouldUpdateHtml(html: string): [string, boolean] {\n return [html, true]\n }\n\n // Called after the HTML for the component has been updated.\n // This is an opportunity to rebind any event listeners etc\n htmlUpdated(html: string) {\n // Do nothing\n }\n\n // LCMComponent implementation with default empty methods\n // Components can override these when they need coordination with other components\n}\n","\nimport {\n LCMComponent,\n LCMComponentConfig,\n LCMComponentEvent,\n} from './LCMComponent';\nimport { EventBus, LifecycleEventTypes, LifecycleEventType } from './EventBus';\nimport { ComponentLifecycleEvent } from './events';\n\n/**\n * LifecycleController - Orchestrates breadth-first component initialization\n *\n * This controller implements a breadth-first traversal of the component tree\n * followed by phase-wise initialization with synchronization barriers.\n *\n * Process:\n * 1. Discovery Phase: Traverse component tree to find all components\n * 2. DOM Binding Phase: All components bind to DOM simultaneously\n * 3. Dependency Injection Phase: All components receive dependencies\n * 4. Activation Phase: All components complete initialization\n *\n * Each phase acts as a synchronization barrier - no component can proceed\n * to the next phase until ALL components have completed the current phase.\n */\nexport class LifecycleController {\n private allComponents: LCMComponent[];\n private componentsByLevel: LCMComponent[][];\n private config: Required<LCMComponentConfig>;\n public static DefaultConfig: LCMComponentConfig = {\n enableDebugLogging: true,\n phaseTimeoutMs: 15000, // Increased timeout for component loading\n continueOnError: false // Fail fast for debugging\n }\n\n constructor(protected eventBus: EventBus, config: LCMComponentConfig = {}) {\n this.config = {\n phaseTimeoutMs: config.phaseTimeoutMs ?? 10000,\n continueOnError: config.continueOnError ?? false,\n validateDependencies: false,\n enableDebugLogging: config.enableDebugLogging ?? false\n };\n this.allComponents = [];\n this.componentsByLevel = [];\n }\n\n /**\n * Initialize component tree starting from root component\n *\n * @param rootComponent The root component to start initialization from\n * @param rootName Optional name for the root component (for debugging)\n * @returns Promise that resolves when all components are fully initialized\n */\n public async initializeFromRoot(rootComponent: LCMComponent): Promise<void> {\n // Phase 1 - Performance post-load setup where each parent will have the change\n // to set dependencies on its children (either to its siblings or to itself).\n await this.performLocalInit(rootComponent);\n\n // Phase 2: Dependency Injection - All components receive dependencies\n await this.injectDependencies();\n\n await this.activate();\n }\n\n /**\n * Phase 0: Discover all components via breadth-first traversal\n */\n private async performLocalInit(rootComponent: LCMComponent): Promise<void> {\n const visited = new Set<LCMComponent>();\n let queue = [rootComponent] as LCMComponent[]\n this.allComponents = [rootComponent]\n\n if (this.componentsByLevel.length > 0) {\n throw new Error(\"Already done\")\n }\n for (let level = 0; queue.length > 0; level ++) {\n const newqueue = [] as LCMComponent[];\n const promises = new Array<Promise<LCMComponent[]>>()\n this.componentsByLevel.push(queue)\n for (let i = 0;i < queue.length;i++) {\n const component = queue[i]\n\n // Enforce tree structure: each component should have exactly one parent\n if (visited.has(component)) {\n throw new Error(\n `Component hierarchy integrity violation: Component '${component.constructor.name}' ` +\n `discovered as child of multiple parents at level ${level}. ` +\n `Component hierarchies must form a tree structure where each component has exactly one parent.`\n );\n }\n\n this.emitEvent(LifecycleEventTypes.LOCAL_INIT_STARTED, component, level)\n const result = component.performLocalInit()\n promises.push(Promise.resolve(result).then((children: LCMComponent[]) => {\n for (const ch of children) {\n this.allComponents.push(ch)\n newqueue.push(ch)\n }\n return children\n }))\n\n // now wait for all the promises to finish\n await Promise.all(promises)\n\n // TODO - Handle errors\n this.emitEvent(LifecycleEventTypes.LOCAL_INIT_FINISHED, component, level)\n }\n queue = newqueue\n }\n }\n\n /**\n * Phase 1: Dependency injection.\n * Here all our components are already discovered so we can call directly\n */\n protected injectDependencies(): void {\n // This is guaranteed to be in order of levels\n for (const comp of this.allComponents) {\n comp.setupDependencies()\n }\n }\n\n /**\n * Phase 2: Activate all components\n *\n * Here all our components are already discovered and their dependencies setup\n * so we can call directly\n */\n protected async activate(): Promise<void> {\n // This is guaranteed to be in order of levels\n const visited = new Set<LCMComponent>();\n for (let level = 0;level < this.componentsByLevel.length; level++) {\n const promises = new Array<Promise<void>>()\n const levelComps = this.componentsByLevel[level]\n for (const comp of levelComps) {\n if (visited.has(comp)) {\n throw new Error(\"Comp already visited\")\n }\n visited.add(comp)\n this.emitEvent(LifecycleEventTypes.ACTIVATION_STARTED , comp, 0)\n const result = comp.activate()\n promises.push(Promise.resolve(result).then(() => {\n this.emitEvent(LifecycleEventTypes.ACTIVATION_FINISHED, comp, 0)\n }))\n }\n await Promise.all(promises)\n }\n }\n\n /**\n * Deactivate all components in reverse order. This is usually called when a page quits or a component is\n * deactivated\n */\n public async deactivateAll(): Promise<void> {\n // destruction should leaf to the root so we are removing things from bottom to top\n for (let level = this.componentsByLevel.length - 1;level >= 0; level--) {\n const promises = new Array<Promise<void>>()\n const levelComps = this.componentsByLevel[level]\n for (const comp of levelComps) {\n this.emitEvent(LifecycleEventTypes.DEACTIVATION_STARTED , comp, level)\n const result = comp.deactivate()\n promises.push(Promise.resolve(result).then(() => {\n this.emitEvent(LifecycleEventTypes.DEACTIVATION_FINISHED, comp, level)\n }))\n }\n await Promise.all(promises)\n }\n }\n\n /**\n * Emit lifecycle event to registered callbacks\n */\n private emitEvent(\n event: LifecycleEventType,\n component: LCMComponent,\n level: number,\n error: Error | null = null,\n ): void {\n this.eventBus.emit<ComponentLifecycleEvent>(\n event,\n { error: error, success: error == null},\n this,\n component\n );\n }\n\n /**\n * Log message if debug logging is enabled\n */\n private log(message: string, ...args: any[]): void {\n if (this.config.enableDebugLogging) {\n console.log(`[LifecycleController] ${message}`, ...args);\n }\n }\n\n /**\n * Log error message\n */\n private logError(message: string, error?: any): void {\n console.error(`[LifecycleController] ${message}`, error);\n }\n\n /**\n * Get current status of all components\n */\n /*\n public getComponentStatus(): Array<{ name: string; phase: ComponentPhase }> {\n return Array.from(this.allComponents).map(component => ({\n name: this.getComponentName(component),\n phase: this.componentPhases.get(component) || 'created'\n }));\n }\n */\n}\n","/**\n * Theme management for applications\n */\nexport class ThemeManager {\n // Theme options\n static LIGHT = 'light';\n static DARK = 'dark';\n static SYSTEM = 'system';\n\n // Icons for each theme state\n static readonly LIGHT_ICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-full h-6\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z\" /></svg>`; // Sun icon\n static readonly DARK_ICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-full h-6\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z\" /></svg>`; // Moon icon\n static readonly SYSTEM_ICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-full h-6\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25\" /></svg>`; // Computer icon\n\n /**\n * Initialize theme based on saved preference or system default\n */\n static initialize(): void {\n const savedTheme = localStorage.getItem('theme');\n\n if (savedTheme === ThemeManager.DARK ||\n (!savedTheme && window.matchMedia('(prefers-color-scheme: dark)').matches)) {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }\n\n /**\n * Set theme and save preference\n */\n static setTheme(theme: string): void {\n if (theme === ThemeManager.SYSTEM) {\n localStorage.removeItem('theme');\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n } else if (theme === ThemeManager.DARK) {\n localStorage.setItem('theme', ThemeManager.DARK);\n document.documentElement.classList.add('dark');\n } else { // LIGHT\n localStorage.setItem('theme', ThemeManager.LIGHT);\n document.documentElement.classList.remove('dark');\n }\n }\n\n /**\n * Get current theme setting (light, dark, or system)\n */\n static getCurrentThemeSetting(): string {\n return localStorage.getItem('theme') || ThemeManager.SYSTEM;\n }\n\n /**\n * Gets the *next* theme in the cycle: Light -> Dark -> System -> Light ...\n */\n static getNextTheme(currentSetting: string): string {\n if (currentSetting === ThemeManager.LIGHT) {\n return ThemeManager.DARK;\n } else if (currentSetting === ThemeManager.DARK) {\n return ThemeManager.SYSTEM;\n } else { // SYSTEM or unknown goes to LIGHT\n return ThemeManager.LIGHT;\n }\n }\n\n /**\n * Gets the appropriate SVG icon string for a given theme setting.\n */\n static getIconSVG(themeSetting: string): string {\n switch (themeSetting) {\n case ThemeManager.LIGHT: return ThemeManager.LIGHT_ICON_SVG;\n case ThemeManager.DARK: return ThemeManager.DARK_ICON_SVG;\n case ThemeManager.SYSTEM:\n default: return ThemeManager.SYSTEM_ICON_SVG;\n }\n }\n\n /**\n * Gets a user-friendly label for the theme setting.\n */\n static getThemeLabel(themeSetting: string): string {\n switch (themeSetting) {\n case ThemeManager.LIGHT: return \"Light Mode\";\n case ThemeManager.DARK: return \"Dark Mode\";\n case ThemeManager.SYSTEM:\n default: return \"System Default\";\n }\n }\n\n\n /**\n * Initialize the ThemeManager (no instance needed for static methods)\n */\n public static init(): void {\n ThemeManager.initialize();\n }\n}\n","\n// Helper to manage our templates\nexport class TemplateLoader {\n constructor(public registryName = \"template-registry\") {\n }\n\n\n /**\n * Finds the specified template wrapper element in the registry.\n * @param templateId The data-template-id of the wrapper element.\n * @returns The wrapper HTMLElement or null if not found.\n */\n private _findTemplateWrapper(templateId: string): HTMLElement | null {\n const templateRegistry = document.getElementById(this.registryName);\n if (!templateRegistry) {\n console.error(`Template registry '#${this.registryName}' not found!`);\n return null;\n }\n const templateWrapper = templateRegistry.querySelector<HTMLElement>(`[data-template-id=\"${templateId}\"]`);\n if (!templateWrapper) {\n console.error(`Template with ID \"${templateId}\" not found in registry '#${this.registryName}'.`);\n return null;\n }\n return templateWrapper;\n }\n\n /**\n * Loads and returns the inner HTML of a template definition.\n * @param templateId The data-template-id of the wrapper element.\n * @returns The innerHTML content as string if it exists otherwise null.\n */\n loadHtml(templateId: string): string | null {\n const templateWrapper = this._findTemplateWrapper(templateId);\n if (!templateWrapper) {\n return null;\n }\n return templateWrapper.innerHTML\n }\n\n /**\n * Loads and clones the child elements of a template definition.\n * @param templateId The data-template-id of the wrapper element.\n * @returns An array of cloned HTMLElement children, or an empty array if not found or has no children.\n */\n load(templateId: string): HTMLElement[] {\n const templateWrapper = this._findTemplateWrapper(templateId);\n if (!templateWrapper) {\n return [];\n }\n\n // Using hidden div: Clone the first child element which is the actual template root\n const templateRootElement = templateWrapper.cloneNode(true) as HTMLElement | null;\n if (!templateRootElement) {\n console.error(`Template content is empty for: ${templateId}`);\n return [];\n }\n // deep clone AND return th children\n return Array.from(templateRootElement.children) as HTMLElement[];\n\n // clond the children instead\n // Clone each child element individually and return as an array\n // const childElements = Array.from(templateWrapper.children) as HTMLElement[];\n // return childElements.map(child => child.cloneNode(true) as HTMLElement);\n }\n\n /**\n * Loads a template's content, clears the target element, and appends the cloned content into it.\n * @param templateId The data-template-id of the wrapper element to load.\n * @param targetElement The HTMLElement where the cloned content should be placed.\n * @returns True if the operation was successful (template found and content appended, even if content was empty), false otherwise.\n */\n public loadInto(templateId: string, targetElement: HTMLElement | null): boolean {\n if (!targetElement) {\n console.error(`Cannot load template \"${templateId}\": Target element is null.`);\n return false;\n }\n\n const templateWrapper = this._findTemplateWrapper(templateId);\n if (!templateWrapper) {\n // Error logged in _findTemplateWrapper\n targetElement.innerHTML = `<div class=\"p-4 text-red-500\">Error loading template '${templateId}' (Not Found)</div>`; // Provide feedback in target\n return false;\n }\n\n // Clear the target element first\n targetElement.innerHTML = '';\n\n // Clone and append children\n const childElements = Array.from(templateWrapper.children) as HTMLElement[];\n if (childElements.length === 0) {\n console.warn(`Template \"${templateId}\" has no child elements to load.`);\n // Still considered successful, just loaded nothing.\n } else {\n childElements.forEach(child => {\n targetElement.appendChild(child.cloneNode(true) as HTMLElement);\n });\n }\n\n return true; // Operation successful\n }\n}\n","import { TemplateLoader } from './TemplateLoader';\n\n/**\n * Modal manager for the application\n * Handles showing and hiding modals with different content\n */\nexport class Modal {\n private static instance: Modal | null = null;\n\n // Modal DOM elements\n private modalContainer: HTMLDivElement\n private modalBackdrop: HTMLElement | null;\n private modalPanel: HTMLElement | null;\n private modalContent: HTMLElement | null;\n private closeButton: HTMLElement | null;\n\n private templateLoader: TemplateLoader;\n\n // Current modal data - including optional callbacks\n private currentTemplateId: string | null = null;\n private currentData: any = null;\n private onSubmitCallback: ((modalData: any) => void) | null = null; // Store the callback\n private onApplyCallback: ((modalData: any) => void) | null = null; // Store the Apply callback\n\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Get modal elements\n this.modalContainer = document.getElementById('modal-container') as HTMLDivElement;\n this.modalBackdrop = document.getElementById('modal-backdrop');\n this.modalPanel = document.getElementById('modal-panel');\n this.modalContent = document.getElementById('modal-content');\n this.closeButton = document.getElementById('modal-close');\n\n this.templateLoader = new TemplateLoader();\n\n this.bindEvents();\n }\n\n /**\n * Get the Modal instance (singleton)\n */\n public static getInstance(): Modal {\n if (!Modal.instance) {\n Modal.instance = new Modal();\n }\n return Modal.instance;\n }\n\n /**\n * Bind event listeners for modal interactions\n */\n private bindEvents(): void {\n // Close button click\n if (this.closeButton) {\n this.closeButton.addEventListener('click', () => this.hide());\n }\n\n // Click on backdrop to close\n if (this.modalBackdrop) {\n this.modalBackdrop.addEventListener('click', (e) => {\n // Only close if clicking directly on the backdrop\n if (e.target === this.modalBackdrop) {\n this.hide();\n }\n });\n }\n\n // Listen for Escape key\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.isVisible()) {\n this.hide();\n }\n });\n\n // --- Event Delegation for Modal Actions ---\n if (this.modalPanel) { // Listen on a persistent parent element\n this.modalPanel.addEventListener('click', (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // Handle generic close/cancel buttons\n const closeButton = target.closest('button[id$=\"-cancel\"], button[id$=\"-close\"]');\n if (closeButton) {\n this.hide();\n return; // Stop further processing\n }\n\n // Handle specific actions like submit\n const actionButton = target.closest('button[data-modal-action]');\n if (actionButton) {\n const action = actionButton.getAttribute('data-modal-action');\n\n if (action === 'submit' && this.onSubmitCallback) {\n this.onSubmitCallback(this.currentData); // Call the stored callback\n } else if (action === 'apply' && this.onApplyCallback) {\n this.onApplyCallback(this.currentData); // Call the Apply callback\n this.hide(); // Typically hide after applying\n }\n // Add more actions (e.g., 'apply', 'revise') later if needed\n }\n });\n }\n }\n\n /**\n * Check if the modal is currently visible\n */\n public isVisible(): boolean {\n return this.modalContainer ? !this.modalContainer.classList.contains('hidden') : false;\n }\n\n /**\n * Show a modal with content from the specified template ID.\n * Uses TemplateLoader to get the content element.\n * @param templateId ID used in `data-template-id` attribute in TemplateRegistry.html\n * @param data Optional data to pass to the modal. Can include callbacks like `onSubmit`.\n * @returns The root HTMLElement of the loaded content, or null if failed.\n */\n public show(templateId: string, data: any = null): HTMLElement | null {\n if (!this.modalContainer || !this.modalContent) {\n console.error(\"Modal container or content area not found.\");\n return null;\n }\n\n // Use TemplateLoader to get the content element\n // Load content directly into the modal content area\n const success = this.templateLoader.loadInto(templateId, this.modalContent);\n if (!success) {\n // Error message is already placed into modalContent by loadInto on failure\n // Ensure modal is still visible\n this.modalContainer.classList.remove('hidden');\n setTimeout(() => this.modalContainer.classList.add('modal-active'), 10);\n return null; // Indicate failure\n }\n\n // Store current modal info\n this.currentTemplateId = templateId;\n this.currentData = data || {}; // Ensure data is an object\n this.onSubmitCallback = data?.onSubmit || null; // Store the submit callback\n this.onApplyCallback = data?.onApply || null; // Store the apply callback\n\n // Set data attributes for non-function data\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (key !== 'onSubmit' && (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')) {\n if (this.modalContent) this.modalContent.dataset[key] = String(value);\n }\n });\n }\n\n // Show modal container\n this.modalContainer.classList.remove('hidden');\n\n // Trigger animations if needed (add active class after a tick)\n setTimeout(() => {\n this.modalContainer.classList.add('modal-active');\n }, 10); // Small delay ensures transition applies correctly\n\n const firstElement = this.modalContent//?.firstElementChild as HTMLElement | null;\n return firstElement;\n }\n\n /**\n * Hide the modal\n */\n public hide(): Promise<void> {\n return new Promise((resolve) => {\n if (!this.modalContainer) return;\n\n // Remove active class first (for animations)\n this.modalContainer.classList.remove('modal-active');\n\n // Hide after a short delay\n setTimeout(() => {\n this.modalContainer.classList.add('hidden');\n\n // Clear current modal info\n this.currentTemplateId = null;\n this.currentData = null;\n this.onSubmitCallback = null; // Clear callback\n this.onApplyCallback = null; // Clear apply callback\n if(this.modalContent) this.modalContent.innerHTML = ''; // Clear content\n resolve();\n }, 200); // Match typical transition duration\n });\n }\n\n /**\n * Get the current modal content element\n */\n public getContentElement(): HTMLElement | null {\n return this.modalContent;\n }\n\n /**\n * Get the current template ID\n */\n public getCurrentTemplate(): string | null {\n return this.currentTemplateId;\n }\n\n /**\n * Get the current modal data\n */\n public getCurrentData(): any {\n return this.currentData;\n }\n\n /**\n * Update modal data (excluding callbacks for now)\n */\n public updateData(newData: any): void {\n this.currentData = { ...this.currentData, ...newData };\n\n // Update data attributes for non-function data\n if (this.modalContent && newData) {\n Object.entries(newData).forEach(([key, value]) => { // Exclude callbacks when setting data attributes\n if (key !== 'onSubmit' && (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')) {\n if (this.modalContent) this.modalContent.dataset[key] = String(value);\n }\n });\n }\n }\n\n /**\n * Initialize the modal component\n */\n public static init(): Modal {\n return Modal.getInstance();\n }\n}\n","/**\n * Toast types for styling\n */\ntype ToastType = 'success' | 'error' | 'info' | 'warning';\n\n/**\n * Manages toast notifications\n */\nexport class ToastManager {\n private static instance: ToastManager | null = null;\n private container: HTMLElement | null;\n private template: HTMLElement | null;\n private toasts: Map<string, HTMLElement> = new Map();\n private counter: number = 0;\n\n /**\n * Private constructor for singleton pattern\n */\n private constructor() {\n // Select the container using its ID from index.html\n this.container = document.getElementById('toast-container');\n this.template = document.getElementById('toast-template');\n }\n\n /**\n * Get the ToastManager instance (singleton)\n */\n public static getInstance(): ToastManager {\n if (!ToastManager.instance) {\n ToastManager.instance = new ToastManager();\n }\n return ToastManager.instance;\n }\n\n /**\n * Show a toast notification\n * @param title Toast title\n * @param message Toast message\n * @param type Toast type for styling\n * @param duration Duration in ms (default: 4000)\n */\n public showToast(title: string, message: string, type: ToastType = 'info', duration: number = 4000): string {\n if (!this.container || !this.template) return '';\n\n // Create a unique ID for this toast\n const id = `toast-${Date.now()}-${this.counter++}`;\n\n // Clone the template\n const toast = this.template.cloneNode(true) as HTMLElement;\n toast.id = id;\n toast.classList.remove('hidden');\n\n // Set content\n const titleElement = toast.querySelector('.toast-title');\n const messageElement = toast.querySelector('.toast-message');\n if (titleElement) titleElement.textContent = title;\n if (messageElement) messageElement.textContent = message;\n\n // Set style based on type\n const iconContainer = toast.querySelector('.flex-shrink-0');\n if (iconContainer) {\n // Clear existing icon\n iconContainer.innerHTML = '';\n\n // Add appropriate icon based on type\n let icon: string;\n let borderColor: string;\n\n switch (type) {\n case 'success':\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-green-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-green-500';\n break;\n case 'error':\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-red-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-red-500';\n break;\n case 'warning':\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-yellow-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-yellow-500';\n break;\n case 'info':\n default:\n icon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5 text-blue-500\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" /></svg>';\n borderColor = 'border-blue-500';\n break;\n }\n\n // Add icon\n iconContainer.innerHTML = icon;\n\n // Set border color\n const borderElement = toast.querySelector('.border-l-4');\n if (borderElement) {\n borderElement.className = borderElement.className.replace(/border-[a-z]+-500/g, borderColor);\n }\n }\n\n // Add close button handler\n const closeButton = toast.querySelector('.toast-close');\n if (closeButton) {\n closeButton.addEventListener('click', () => {\n this.hideToast(id);\n });\n }\n\n // Add to container\n this.container.appendChild(toast);\n this.toasts.set(id, toast);\n\n // Show toast with animation\n setTimeout(() => {\n toast.classList.remove('scale-95', 'opacity-0');\n toast.classList.add('scale-100', 'opacity-100');\n }, 10);\n\n // Auto-hide after duration\n if (duration > 0) {\n setTimeout(() => {\n this.hideToast(id);\n }, duration);\n }\n\n return id;\n }\n\n /**\n * Hide a toast notification\n * @param id Toast ID\n */\n public hideToast(id: string): void {\n const toast = this.toasts.get(id);\n if (!toast) return;\n\n // Hide with animation\n toast.classList.remove('scale-100', 'opacity-100');\n toast.classList.add('scale-95', 'opacity-0');\n\n // Remove after animation\n setTimeout(() => {\n toast.remove();\n this.toasts.delete(id);\n }, 300);\n }\n\n /**\n * Hide all toast notifications\n */\n public hideAllToasts(): void {\n this.toasts.forEach((_, id) => {\n this.hideToast(id);\n });\n }\n\n /**\n * Initialize the component\n */\n public static init(): ToastManager {\n return ToastManager.getInstance();\n }\n}\n","/**\n * Utility for managing the splash screen that loads before JavaScript\n */\nexport class SplashScreen {\n private static readonly SPLASH_ID = 'splash-screen';\n private static dismissed = false;\n\n /**\n * Dismiss the splash screen with a fade-out animation\n * Safe to call multiple times - only dismisses once\n */\n static dismiss(): void {\n if (this.dismissed) {\n return;\n }\n\n const splash = document.getElementById(this.SPLASH_ID);\n if (!splash) {\n return;\n }\n\n this.dismissed = true;\n\n // Fade out\n splash.style.opacity = '0';\n\n // Remove from DOM after animation completes\n setTimeout(() => {\n splash.remove();\n }, 300); // Match transition-opacity duration-300 from Tailwind\n }\n\n /**\n * Update the splash screen message (if it hasn't been dismissed yet)\n */\n static updateMessage(title?: string, message?: string): void {\n if (this.dismissed) {\n return;\n }\n\n const splash = document.getElementById(this.SPLASH_ID);\n if (!splash) {\n return;\n }\n\n if (title) {\n const titleEl = splash.querySelector('[data-splash-title]');\n if (titleEl) {\n titleEl.textContent = title;\n }\n }\n\n if (message) {\n const messageEl = splash.querySelector('[data-splash-message]');\n if (messageEl) {\n messageEl.textContent = message;\n }\n }\n }\n\n /**\n * Update the splash screen progress bar\n * @param percent - Progress percentage (0-100)\n */\n static updateProgress(percent: number): void {\n if (this.dismissed) {\n return;\n }\n\n const splash = document.getElementById(this.SPLASH_ID);\n if (!splash) {\n return;\n }\n\n // Clamp between 0-100\n const clampedPercent = Math.max(0, Math.min(100, percent));\n\n const progressBar = splash.querySelector('[data-splash-progress-bar]') as HTMLElement;\n if (progressBar) {\n progressBar.style.width = `${clampedPercent}%`;\n }\n\n const progressText = splash.querySelector('[data-splash-progress-text]');\n if (progressText) {\n progressText.textContent = `${Math.round(clampedPercent)}%`;\n }\n }\n\n /**\n * Update both message and progress at once\n */\n static update(options: {\n title?: string;\n message?: string;\n progress?: number;\n }): void {\n if (options.title !== undefined || options.message !== undefined) {\n this.updateMessage(options.title, options.message);\n }\n if (options.progress !== undefined) {\n this.updateProgress(options.progress);\n }\n }\n\n /**\n * Check if splash screen is still visible\n */\n static isVisible(): boolean {\n return !this.dismissed && !!document.getElementById(this.SPLASH_ID);\n }\n}\n","import { ThemeManager } from './ThemeManager';\nimport { Modal } from './Modal';\nimport { ToastManager } from './ToastManager';\nimport { EventBus } from './EventBus';\nimport { BaseComponent } from './Component';\nimport { LCMComponent } from './LCMComponent';\nimport { SplashScreen } from './SplashScreen';\nimport { LifecycleController } from './LifecycleController';\n\n/**\n * Base class for all pages that provides common UI components and functionality\n * Implements proper LCMComponent lifecycle management for pages\n */\nexport abstract class BasePage extends BaseComponent {\n protected themeManager: typeof ThemeManager;\n protected modal: Modal;\n protected toastManager: ToastManager\n\n protected themeToggleButton: HTMLButtonElement;\n protected themeToggleIcon: HTMLElement;\n\n // Constructor now just uses document as the rootElement\n constructor(public readonly componentId: string, eventBus: EventBus | null = null, public readonly debugMode: boolean = false) {\n // Mark as component in DOM for debugging\n super(componentId, document.body, eventBus, debugMode)\n\n this.initializeBaseComponents();\n\n // Bind base events first\n this.bindBaseEvents();\n }\n\n // LCMComponent Phase 1: Initialize page structure and discover child components\n public override performLocalInit(): Promise<LCMComponent[]> | LCMComponent[] {\n this.log('BasePage: Starting local initialization');\n\n // Then initialize page-specific components and discover children\n return this.initializeSpecificComponents();\n }\n\n // LCMComponent Phase 3: Activate the page (bind events after all components are ready)\n public override activate(): void {\n this.log('BasePage: Activating page');\n\n // Then bind page-specific events\n this.bindSpecificEvents();\n\n this.log('BasePage: Page activation complete');\n }\n\n /**\n * Initialize common UI components that all pages need\n */\n protected initializeBaseComponents(): void {\n // Initialize core UI managers\n ThemeManager.init();\n this.modal = Modal.init();\n this.toastManager = ToastManager.init();\n\n // Get theme toggle elements\n this.themeToggleButton = document.getElementById('theme-toggle-button') as HTMLButtonElement;\n this.themeToggleIcon = document.getElementById('theme-toggle-icon')!;\n\n if (!this.themeToggleButton || !this.themeToggleIcon) {\n console.warn(\"Theme toggle button or icon element not found in Header.\");\n }\n }\n\n /**\n * Bind common event handlers that all pages need\n */\n protected bindBaseEvents(): void {\n // Theme toggle\n if (this.themeToggleButton) {\n this.themeToggleButton.addEventListener('click', this.handleThemeToggleClick.bind(this));\n }\n\n // Initialize theme button state\n this.updateThemeButtonState();\n\n // Initialize responsive header actions dropdown\n this.initializeHeaderActionsDropdown();\n }\n\n /**\n * Handle theme toggle button clicks\n */\n protected handleThemeToggleClick(): void {\n const currentSetting = ThemeManager.getCurrentThemeSetting();\n const nextSetting = ThemeManager.getNextTheme(currentSetting);\n ThemeManager.setTheme(nextSetting);\n this.updateThemeButtonState(nextSetting);\n }\n\n /**\n * Update the theme toggle button state and appearance\n */\n protected updateThemeButtonState(currentTheme?: string): void {\n if (!this.themeToggleButton || !this.themeToggleIcon) return;\n\n const themeToDisplay = currentTheme || ThemeManager.getCurrentThemeSetting();\n const iconSVG = ThemeManager.getIconSVG(themeToDisplay);\n const label = `Toggle theme (currently: ${ThemeManager.getThemeLabel(themeToDisplay)})`;\n\n this.themeToggleIcon.innerHTML = iconSVG;\n this.themeToggleButton.setAttribute('aria-label', label);\n this.themeToggleButton.setAttribute('title', label);\n }\n\n /**\n * Show a toast notification\n */\n protected showToast(title: string, message: string, type: 'success' | 'error' | 'info' | 'warning' = 'info', duration?: number): void {\n this.toastManager?.showToast(title, message, type, duration);\n }\n\n /**\n * Show a modal dialog\n */\n protected showModal(templateId: string, data?: any): void {\n this.modal?.show(templateId, data);\n }\n\n /**\n * Hide the modal dialog\n */\n protected hideModal(): void {\n this.modal?.hide();\n }\n\n /**\n * Get the current theme setting\n */\n protected getCurrentTheme(): string {\n return ThemeManager.getCurrentThemeSetting();\n }\n\n /**\n * Check if the current theme is dark mode\n */\n protected isDarkMode(): boolean {\n return document.documentElement.classList.contains('dark');\n }\n\n /**\n * Initialize responsive header actions drawer\n * On desktop: drawer is always visible, positioned inline with header\n * On mobile: drawer slides down from top when menu button is clicked\n */\n protected initializeHeaderActionsDropdown(): void {\n const menuBtn = document.getElementById('header-actions-menu-btn');\n const drawer = document.getElementById('header-actions-drawer');\n\n if (!menuBtn || !drawer) {\n return; // Elements don't exist on this page\n }\n\n const drawerBackdrop = drawer.querySelector('.header-drawer-backdrop') as HTMLElement;\n\n // Open drawer with animation\n const openDrawer = () => {\n drawer.classList.remove('hidden');\n // Trigger reflow to ensure animation plays\n void drawer.offsetHeight;\n requestAnimationFrame(() => {\n drawer.classList.add('open');\n });\n };\n\n // Close drawer with animation\n const closeDrawer = () => {\n drawer.classList.remove('open');\n // Wait for animation to complete before hiding\n setTimeout(() => {\n drawer.classList.add('hidden');\n }, 300); // Match duration-300 in CSS\n };\n\n // Toggle drawer (mobile only - desktop drawer is always visible via CSS)\n menuBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if (drawer.classList.contains('open')) {\n closeDrawer();\n } else {\n openDrawer();\n }\n });\n\n // Close drawer when backdrop is clicked (mobile only)\n if (drawerBackdrop) {\n drawerBackdrop.addEventListener('click', closeDrawer);\n }\n\n // Close drawer on Escape key (mobile only)\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && drawer.classList.contains('open')) {\n closeDrawer();\n }\n });\n }\n\n /**\n * Abstract method that subclasses must implement to initialize their specific components\n * Should return any child components that need lifecycle management\n */\n protected initializeSpecificComponents(): LCMComponent[] { return []; }\n\n /**\n * Abstract method that subclasses must implement to bind their specific events\n */\n protected bindSpecificEvents(): void {}\n\n /**\n * Component-specific cleanup logic (required by BaseComponent)\n */\n protected destroyComponent(): void {\n this.log('BasePage: Cleaning up base page components');\n\n // Clean up base components\n this.modal = null as any;\n this.toastManager = null as any;\n this.themeToggleButton = null as any;\n this.themeToggleIcon = null as any;\n }\n\n /**\n * Ensure an element exists, create if missing\n * This is acceptable for page-level orchestration to find component root elements\n */\n protected ensureElement(selector: string, fallbackId: string): HTMLElement {\n let element = document.querySelector(selector) as HTMLElement;\n if (!element) {\n console.warn(`Element not found: ${selector}, creating fallback`);\n element = document.createElement('div');\n element.id = fallbackId;\n element.className = 'w-full h-full';\n // Fallback should be more specific than just body\n const mainContainer = document.querySelector('main') || document.body;\n mainContainer.appendChild(element);\n }\n\n // Ensure element has an ID for Phaser container\n if (!element.id) {\n element.id = fallbackId;\n }\n\n return element;\n }\n\n protected dismissSplashScreen() {\n SplashScreen.dismiss();\n }\n\n static loadAfterPageLoaded<T>(pageName: string, PageClass: any, PageClassName: string) {\n // Initialize page when DOM is ready using LifecycleController\n document.addEventListener('DOMContentLoaded', async () => {\n // Create page instance (just basic setup)\n const page = new PageClass(PageClassName);\n\n // Make GameViewerPage available for e2e testing via command interface\n (window as any)[pageName] = page;\n\n // Create lifecycle controller with debug logging\n const lifecycleController = new LifecycleController(page.eventBus, LifecycleController.DefaultConfig);\n\n // Start breadth-first initialization\n await lifecycleController.initializeFromRoot(page);\n });\n }\n}\n","import { BaseComponent } from './Component';\nimport { LCMComponent } from './LCMComponent';\nimport { EventBus } from './EventBus';\n\n/**\n * MobileBottomDrawer - Reusable bottom drawer component for mobile layouts\n *\n * Features:\n * - Slides up from bottom covering 60-70% of viewport\n * - Backdrop overlay that dims the content behind\n * - Auto-closes when backdrop is tapped\n * - Swipe down to close gesture\n * - Smooth slide-up/down animations\n * - Holds any panel content\n */\nexport class MobileBottomDrawer extends BaseComponent implements LCMComponent {\n private backdropElement: HTMLElement;\n private drawerElement: HTMLElement;\n private contentElement: HTMLElement;\n private closeButton: HTMLElement | null;\n private isOpen: boolean = false;\n private onCloseCallback?: () => void;\n\n // Swipe gesture tracking\n private touchStartY: number = 0;\n private touchCurrentY: number = 0;\n private isDragging: boolean = false;\n\n /**\n * Create a MobileBottomDrawer\n * @param rootElement - The root container element for the drawer\n * @param eventBus - Event bus for component communication\n * @param debugMode - Enable debug logging\n */\n constructor(rootElement: HTMLElement, eventBus: EventBus, debugMode: boolean = false) {\n super('mobile-bottom-drawer', rootElement, eventBus, debugMode);\n }\n\n /**\n * Phase 1: Initialize DOM and discover child components\n */\n async performLocalInit(): Promise<LCMComponent[]> {\n // Find drawer elements\n this.backdropElement = this.rootElement.querySelector('.drawer-backdrop') as HTMLElement;\n this.drawerElement = this.rootElement.querySelector('.drawer-container') as HTMLElement;\n this.contentElement = this.rootElement.querySelector('.drawer-content') as HTMLElement;\n this.closeButton = this.rootElement.querySelector('.drawer-close-btn') as HTMLElement;\n\n if (!this.backdropElement || !this.drawerElement || !this.contentElement) {\n throw new Error('MobileBottomDrawer: Required drawer elements not found');\n }\n\n // Bind event listeners\n this.bindEvents();\n\n return [];\n }\n\n /**\n * Bind event listeners for drawer interactions\n */\n private bindEvents(): void {\n // Close drawer on backdrop click\n this.backdropElement.addEventListener('click', (e) => {\n if (e.target === this.backdropElement) {\n this.close();\n }\n });\n\n // Close drawer on close button click\n if (this.closeButton) {\n this.closeButton.addEventListener('click', () => {\n this.close();\n });\n }\n\n // Close drawer on Escape key\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.isOpen) {\n this.close();\n }\n });\n\n // Swipe-to-close gesture on drawer element\n this.drawerElement.addEventListener('touchstart', (e) => this.handleTouchStart(e), { passive: true });\n this.drawerElement.addEventListener('touchmove', (e) => this.handleTouchMove(e), { passive: false });\n this.drawerElement.addEventListener('touchend', (e) => this.handleTouchEnd(e), { passive: true });\n }\n\n /**\n * Handle touch start for swipe gesture\n */\n private handleTouchStart(e: TouchEvent): void {\n // Only track if touching the drawer itself (not scrollable content)\n const contentScrollTop = this.contentElement.scrollTop;\n\n // If content is scrolled down, let normal scrolling happen\n if (contentScrollTop > 0) {\n return;\n }\n\n this.touchStartY = e.touches[0].clientY;\n this.touchCurrentY = this.touchStartY;\n this.isDragging = true;\n }\n\n /**\n * Handle touch move for swipe gesture\n */\n private handleTouchMove(e: TouchEvent): void {\n if (!this.isDragging) return;\n\n this.touchCurrentY = e.touches[0].clientY;\n const deltaY = this.touchCurrentY - this.touchStartY;\n\n // Only allow downward swipes\n if (deltaY > 0) {\n // Prevent default scrolling when swiping down\n e.preventDefault();\n\n // Apply drag transform with resistance\n const dragAmount = Math.min(deltaY, 300); // Cap at 300px\n this.drawerElement.style.transform = `translateY(${dragAmount}px)`;\n\n // Reduce backdrop opacity based on drag amount\n const opacity = Math.max(0, 0.5 - (dragAmount / 600));\n this.backdropElement.style.background = `rgba(0, 0, 0, ${opacity})`;\n }\n }\n\n /**\n * Handle touch end for swipe gesture\n */\n private handleTouchEnd(e: TouchEvent): void {\n if (!this.isDragging) return;\n\n const deltaY = this.touchCurrentY - this.touchStartY;\n const velocity = deltaY / 300; // Rough velocity calculation\n\n // Close if swiped down more than 100px or with high velocity\n if (deltaY > 100 || velocity > 0.3) {\n this.close();\n } else {\n // Snap back to open position\n this.drawerElement.style.transform = '';\n this.backdropElement.style.background = '';\n }\n\n this.isDragging = false;\n }\n\n /**\n * Open the drawer with slide-up animation\n */\n public open(): void {\n if (this.isOpen) return;\n\n this.isOpen = true;\n\n // Reset any drag transform\n this.drawerElement.style.transform = '';\n this.backdropElement.style.background = '';\n\n // Add open class - CSS handles all animations\n this.rootElement.classList.add('open');\n\n // Emit event\n this.eventBus.emit('drawer-opened', { drawerId: this.componentId }, null, this);\n }\n\n /**\n * Close the drawer with slide-down animation\n */\n public close(): void {\n if (!this.isOpen) return;\n\n this.isOpen = false;\n\n // Reset any drag transform\n this.drawerElement.style.transform = '';\n this.backdropElement.style.background = '';\n\n // Remove open class - CSS handles animation\n this.rootElement.classList.remove('open');\n\n // Emit event\n this.eventBus.emit('drawer-closed', { drawerId: this.componentId }, null, this);\n\n // Call close callback if provided\n if (this.onCloseCallback) {\n this.onCloseCallback();\n }\n }\n\n /**\n * Toggle drawer open/closed\n */\n public toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Check if drawer is currently open\n */\n public getIsOpen(): boolean {\n return this.isOpen;\n }\n\n /**\n * Set the content element for the drawer\n * @param element - The element to insert into the drawer content area\n */\n public setContent(element: HTMLElement): void {\n this.contentElement.innerHTML = '';\n this.contentElement.appendChild(element);\n }\n\n /**\n * Set a callback to be called when drawer closes\n * @param callback - Function to call on close\n */\n public setOnClose(callback: () => void): void {\n this.onCloseCallback = callback;\n }\n\n /**\n * Get the content container element\n */\n public getContentContainer(): HTMLElement {\n return this.contentElement;\n }\n}\n","/**\n * When an island mounts: its `load` in the page spec (goapplib's\n * page.Island.Load), read and waited for. Every strategy mounts once; an\n * island isn't unmounted when its media query stops matching.\n */\n\n/** A parsed `load`. An empty or missing one is eager. */\nexport type LoadStrategy =\n | { kind: \"eager\" }\n | { kind: \"idle\" }\n | { kind: \"visible\" }\n | { kind: \"media\"; query: string };\n\n/**\n * The strategy `load` names, or null when it isn't one of the forms Go's\n * Validate accepts (`eager`, `idle`, `visible`, `media:<query>`), compared\n * exactly.\n */\nexport function parseLoad(load: string | undefined): LoadStrategy | null {\n switch (load ?? \"\") {\n case \"\":\n case \"eager\":\n return { kind: \"eager\" };\n case \"idle\":\n return { kind: \"idle\" };\n case \"visible\":\n return { kind: \"visible\" };\n }\n const query = load!.startsWith(\"media:\") ? load!.slice(\"media:\".length) : \"\";\n return query.trim() ? { kind: \"media\", query } : null;\n}\n\n/**\n * The browser APIs scheduleMount waits on, so tests can stand them in.\n * `requestIdleCallback` is optional because Safari doesn't have it.\n */\nexport interface LoadEnv {\n requestIdleCallback?: (cb: () => void) => unknown;\n setTimeout: (cb: () => void, ms?: number) => unknown;\n IntersectionObserver: typeof IntersectionObserver;\n matchMedia: (query: string) => MediaQueryList;\n}\n\n/**\n * Calls `mount` once, when `strategy` says the island in `el` should mount:\n * at once for eager; when the browser is idle (or on the next task, without\n * requestIdleCallback) for idle; the first time any of `el` enters the\n * viewport for visible; and at once if the query matches, or else on the\n * first change that makes it match, for media.\n */\nexport function scheduleMount(strategy: LoadStrategy, el: Element, mount: () => void, env: LoadEnv = window): void {\n switch (strategy.kind) {\n case \"eager\":\n mount();\n return;\n case \"idle\":\n if (env.requestIdleCallback) env.requestIdleCallback(mount);\n else env.setTimeout(mount, 1);\n return;\n case \"visible\": {\n let done = false;\n const observer = new env.IntersectionObserver((entries) => {\n if (done || !entries.some((e) => e.isIntersecting)) return;\n done = true;\n observer.disconnect();\n mount();\n });\n observer.observe(el);\n return;\n }\n case \"media\": {\n const mq = env.matchMedia(strategy.query);\n if (mq.matches) {\n mount();\n return;\n }\n const onChange = (e: { matches: boolean }) => {\n if (!e.matches) return;\n mq.removeEventListener(\"change\", onChange);\n mount();\n };\n mq.addEventListener(\"change\", onChange);\n return;\n }\n }\n}\n","import { parseLoad } from \"./load\";\nimport type { IslandSpec, PageSpec } from \"./spec\";\n\n/**\n * Builds one island in `el`. `ctx` is the page's shared services, whatever\n * the app says they are; `bus` is the page's event bus.\n */\nexport type IslandFactory<Ctx, El, C, B> = (el: El, island: IslandSpec, ctx: Ctx, bus: B) => C;\n\nconst LAZY: unique symbol = Symbol(\"lazy island\");\n\n/** A registry entry whose factory is loaded when the island mounts. Made by lazy. */\nexport interface LazyIsland<Ctx, El, C, B> {\n readonly [LAZY]: () => Promise<IslandFactory<Ctx, El, C, B> | { default: IslandFactory<Ctx, El, C, B> }>;\n}\n\n/**\n * A registry entry that loads its island's module only when the island\n * mounts: `hero: lazy(() => import(\"./islands/hero\"))`. With esbuild's\n * --splitting each such module is its own chunk, so a page downloads only the\n * islands its spec names, each when its `load` says. `load` resolves to the\n * factory or to a module whose default export is the factory.\n *\n * A lazy island always mounts late, even an eager one, since its chunk\n * arrives after the page has started; goapplib's page.Assets writes\n * modulepreload links for the eager ones so that wait is short.\n */\nexport function lazy<Ctx, El, C, B>(\n load: () => Promise<IslandFactory<Ctx, El, C, B> | { default: IslandFactory<Ctx, El, C, B> }>,\n): LazyIsland<Ctx, El, C, B> {\n return { [LAZY]: load };\n}\n\n/**\n * The islands an entry can mount, by name: a factory, bundled with the entry,\n * or a lazy entry, loaded as its own chunk when the island mounts.\n */\nexport type Registry<Ctx, El, C, B> = Record<string, IslandFactory<Ctx, El, C, B> | LazyIsland<Ctx, El, C, B>>;\n\n/** How mountIslands handles islands that shouldn't mount at once. */\nexport interface MountOptions<El, C> {\n /**\n * Gets each island whose `load` isn't eager, with the slot it will mount\n * in; call `mount` when it's time (IslandPage passes scheduleMount). An\n * island with a `load` parseLoad doesn't know is logged and mounted at once\n * instead, so it still shows up.\n */\n defer?: (island: IslandSpec, el: El, mount: () => void) => void;\n /** Gets what the factory built for each island mounted later: through `defer`, or from a lazy entry. */\n onLateMount?: (component: C, island: IslandSpec) => void;\n}\n\n/**\n * Mounts every island in `spec` into the element `findSlot` gives for its\n * slot, and returns what the factories built at once, in spec order. With\n * `options.defer`, an island whose `load` isn't eager is handed to it instead\n * and reported through `options.onLateMount` when it mounts; without it,\n * every island mounts now whatever its `load` says. A lazy entry is loaded\n * when its island would mount and is reported through `onLateMount` too, so\n * it's never in the returned list.\n *\n * `context` builds the page's shared services; it's called once, before the\n * first island mounts (eager or late), and not at all on a page with nothing\n * to mount, so a page without islands doesn't start what they'd share. An\n * island the registry doesn't know, a slot that isn't on the page, or a\n * factory that throws (now or later), or a lazy entry that fails to load, is\n * reported through `log` and skipped,\n * so one bad entry doesn't take the rest of the page down with it.\n *\n * Plain types throughout (no DOM), so it runs under node in tests and on a\n * bare page without BasePage.\n */\nexport function mountIslands<Ctx, El, C, B>(\n spec: PageSpec,\n registry: Registry<Ctx, El, C, B>,\n findSlot: (slot: string) => El | null,\n context: () => Ctx,\n bus: B,\n log: (message: string) => void,\n options: MountOptions<El, C> = {},\n): C[] {\n const out: C[] = [];\n let ctx: Ctx | undefined;\n for (const island of spec.islands) {\n const entry = Object.prototype.hasOwnProperty.call(registry, island.name) ? registry[island.name] : undefined;\n if (!entry) {\n log(`page spec: no island called \"${island.name}\" in this page's registry`);\n continue;\n }\n const el = findSlot(island.slot);\n if (el === null) {\n log(`page spec: island \"${island.name}\" wants slot \"${island.slot}\", which isn't on the page`);\n continue;\n }\n const build = (factory: IslandFactory<Ctx, El, C, B>): C | undefined => {\n try {\n ctx ??= context();\n return factory(el, island, ctx, bus);\n } catch (err) {\n log(`page spec: island \"${island.name}\" failed to mount: ${message(err)}`);\n return undefined;\n }\n };\n const mountLate = () => {\n const late = (factory: IslandFactory<Ctx, El, C, B>) => {\n const c = build(factory);\n if (c !== undefined) options.onLateMount?.(c, island);\n };\n if (typeof entry === \"function\") {\n late(entry);\n return;\n }\n // The executor turns a loader that throws into a rejection, logged like any other.\n new Promise<Awaited<ReturnType<(typeof entry)[typeof LAZY]>>>((resolve) => resolve(entry[LAZY]())).then(\n (m) => {\n const factory = typeof m === \"function\" ? m : m?.default;\n if (typeof factory === \"function\") late(factory);\n else log(`page spec: island \"${island.name}\" loaded, but its module has no factory (a default export or the function itself)`);\n },\n (err) => log(`page spec: island \"${island.name}\" failed to load: ${message(err)}`),\n );\n };\n const strategy = parseLoad(island.load);\n if (strategy === null) {\n log(`page spec: island \"${island.name}\" has load \"${island.load}\", which isn't eager, idle, visible or media:<query>; mounting it now`);\n }\n if (options.defer && strategy !== null && strategy.kind !== \"eager\") {\n options.defer(island, el, mountLate);\n continue;\n }\n if (typeof entry !== \"function\") {\n mountLate();\n continue;\n }\n const c = build(entry);\n if (c !== undefined) out.push(c);\n }\n return out;\n}\n\nfunction message(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/**\n * The page spec: which islands a page mounts, where, and with what config.\n * The server writes it into the page as JSON (goapplib's page.Spec, through\n * templates/page/Islands.html); this reads it back.\n */\n\n/** The id of the script element the server writes the spec into. */\nexport const SPEC_ELEMENT_ID = \"page-spec\";\n\n/** One island: `name` picks its factory, `slot` the element it mounts in (`[data-slot]`). */\nexport interface IslandSpec {\n name: string;\n slot: string;\n /** How the layout shows it (the app's own words: \"page\", \"panel\", \"drawer\"), when it draws differently in each. */\n presentation?: string;\n /** Handed to the factory as is. Always an object. */\n config: Record<string, unknown>;\n /**\n * When it mounts: `eager` (also when absent), `idle`, `visible` or\n * `media:<query>` (see parseLoad). IslandPage waits for it; mountIslands\n * does when given a `defer`.\n */\n load?: string;\n}\n\nexport interface PageSpec {\n /** The arrangement of slots, for state kept per layout. */\n layout: string;\n islands: IslandSpec[];\n}\n\n/**\n * Reads an app's own fields from the parsed spec, the ones its Go type adds\n * by embedding page.Spec. Gets the whole object; returns what the app wants\n * kept, already checked.\n */\nexport type SpecExtension<Ext> = (raw: Record<string, unknown>) => Ext;\n\n// Slot names go into an attribute selector, so they must stay plain (as Go checks).\nconst SLOT = /^[a-z][a-z0-9-]*$/;\n\n/**\n * The spec in `text`, or null when there is none or it isn't one. Islands\n * without a name or with a slot name that isn't plain are dropped, and a\n * config that isn't an object becomes {}, so what comes back can be mounted.\n *\n * `extend`, when given, reads the app's own fields; they're merged into the\n * result, but `layout` and `islands` always come from this reading. If it\n * throws, the spec is unreadable and the result is null.\n */\nexport function readSpec(text: string | null | undefined): PageSpec | null;\nexport function readSpec<Ext extends object>(text: string | null | undefined, extend: SpecExtension<Ext>): (PageSpec & Ext) | null;\nexport function readSpec<Ext extends object>(text: string | null | undefined, extend?: SpecExtension<Ext>): PageSpec | (PageSpec & Ext) | null {\n if (!text) return null;\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch {\n return null;\n }\n if (!isObject(raw) || typeof raw.layout !== \"string\" || !Array.isArray(raw.islands)) return null;\n const islands: IslandSpec[] = [];\n for (const is of raw.islands) {\n if (!isObject(is) || typeof is.name !== \"string\" || !is.name || typeof is.slot !== \"string\" || !SLOT.test(is.slot)) continue;\n islands.push({\n name: is.name,\n slot: is.slot,\n ...(typeof is.presentation === \"string\" && { presentation: is.presentation }),\n config: isObject(is.config) ? is.config : {},\n ...(typeof is.load === \"string\" && { load: is.load }),\n });\n }\n const spec: PageSpec = { layout: raw.layout, islands };\n if (!extend) return spec;\n let ext: Ext;\n try {\n ext = extend(raw);\n } catch {\n return null;\n }\n return { ...ext, ...spec };\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n","import { BasePage } from \"../BasePage\";\nimport type { EventBus } from \"../EventBus\";\nimport type { LCMComponent } from \"../LCMComponent\";\nimport { LifecycleController } from \"../LifecycleController\";\nimport { parseLoad, scheduleMount, type LoadStrategy } from \"./load\";\nimport { mountIslands, type Registry } from \"./mount\";\nimport { readSpec, SPEC_ELEMENT_ID, type PageSpec } from \"./spec\";\n\n/**\n * A page whose islands come from the page spec. A subclass says which\n * islands it can mount (`registry`) and builds the services they share\n * (`makeContext`); the spec says which islands this page gets and where.\n *\n * `makeContext` is called once with the spec, before the first island\n * mounts, and not at all on a page with no islands to mount. An app whose\n * spec carries more than islands (its Go type embeds page.Spec) reads those\n * fields in `readExtension`, and they arrive typed as `Ext` on the spec\n * `makeContext` gets.\n *\n * Each island mounts when its `load` says (`eager`, `idle`, `visible`,\n * `media:<query>`; see scheduleMount), and a `lazy` registry entry loads its\n * chunk then. One that mounts later, a lazy eager one included, goes through\n * its own LifecycleController, so it still gets performLocalInit,\n * setupDependencies and activate. A deferred island mustn't be something\n * another island or the page needs at startup: nothing waits for it.\n *\n * A page with no readable `#page-spec` mounts nothing and warns. Subclasses\n * that override initializeSpecificComponents call super and add to what it\n * returns.\n */\nexport abstract class IslandPage<Ctx, Ext extends object = {}> extends BasePage {\n protected abstract registry(): Registry<Ctx, HTMLElement, LCMComponent, EventBus>;\n protected abstract makeContext(spec: PageSpec & Ext): Ctx;\n\n /**\n * The app's own fields from the parsed spec. The default reads none.\n * Throwing makes the spec unreadable, so nothing mounts.\n */\n protected readExtension(raw: Record<string, unknown>): Ext {\n return {} as Ext;\n }\n\n protected override initializeSpecificComponents(): LCMComponent[] {\n const spec = readSpec(document.getElementById(SPEC_ELEMENT_ID)?.textContent, (raw) => this.readExtension(raw));\n if (!spec) {\n console.warn(`page spec: no readable #${SPEC_ELEMENT_ID} on this page, so nothing is mounted`);\n return [];\n }\n return mountIslands(\n spec,\n this.registry(),\n (slot) => document.querySelector<HTMLElement>(`[data-slot=\"${slot}\"]`),\n () => this.makeContext(spec),\n this.eventBus,\n (message) => console.warn(message),\n {\n defer: (island, el, mount) => this.scheduleLoad(parseLoad(island.load) ?? { kind: \"eager\" }, el, mount),\n onLateMount: (component, island) => {\n new LifecycleController(this.eventBus, LifecycleController.DefaultConfig)\n .initializeFromRoot(component)\n .catch((err) => console.warn(`page spec: island \"${island.name}\" failed to start: ${err instanceof Error ? err.message : String(err)}`));\n },\n },\n );\n }\n\n /**\n * Waits for `strategy` and then calls `mount`. Defaults to scheduleMount\n * against the window; a subclass or test can replace how the waiting is done.\n */\n protected scheduleLoad(strategy: LoadStrategy, el: HTMLElement, mount: () => void): void {\n scheduleMount(strategy, el, mount);\n }\n}\n","/**\n * Common DOM utility functions for consistent behavior across components\n */\n\n/**\n * Checks if the user is currently typing in an input field, textarea, or other editable element.\n * This is used to prevent keyboard shortcuts from interfering with user input.\n *\n * @param element - The target element from a keyboard event\n * @returns true if the user is in an input context, false otherwise\n */\nexport function isInInputContext(element: HTMLElement | null): boolean {\n if (!element) return false;\n\n const tagName = element.tagName.toLowerCase();\n\n // Direct input elements\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n return true;\n }\n\n // Contenteditable elements\n if (element.contentEditable === 'true' || element.isContentEditable) {\n return true;\n }\n\n // Check if element is inside input-related containers\n if (element.closest('input') !== null ||\n element.closest('textarea') !== null ||\n element.closest('select') !== null ||\n element.closest('[contenteditable=\"true\"]') !== null ||\n element.closest('[contenteditable=\"\"]') !== null) {\n return true;\n }\n\n // Check if element is inside a modal (modals often contain forms)\n if (element.closest('.modal') !== null) {\n return true;\n }\n\n // Check for specific input field IDs that might be problematic\n const inputFieldIds = ['map-title-input'];\n if (inputFieldIds.includes(element.id) ||\n inputFieldIds.some(id => element.closest(`#${id}`) !== null)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Checks if modifier keys are pressed (Ctrl, Alt, Cmd, Shift).\n * This is commonly used to filter keyboard shortcuts.\n *\n * @param event - The keyboard event\n * @returns true if any modifier keys are pressed, false otherwise\n */\nexport function hasModifierKeys(event: KeyboardEvent): boolean {\n return event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;\n}\n\n/**\n * Combined check for whether keyboard shortcuts should be ignored.\n * This checks both modifier keys and input context.\n *\n * @param event - The keyboard event\n * @returns true if shortcuts should be ignored, false if they can be processed\n */\nexport function shouldIgnoreShortcut(event: KeyboardEvent): boolean {\n const target = event.target as HTMLElement;\n return hasModifierKeys(event) || isInInputContext(target);\n}\n","/**\n * Generic keyboard shortcut manager for handling multi-key commands\n * across all application pages\n *\n * Current Behavior (default):\n * - User types 'c3' → visual indicator → Enter/timeout → execute\n * - Requires explicit confirmation for execution\n *\n * Future Immediate Mode (when enabled):\n * - User types 'c3' → immediate preview → Escape to cancel\n * - Provides instant feedback with option to cancel\n */\n\nimport { isInInputContext } from './DOMUtils';\n\nexport interface ShortcutConfig {\n key: string;\n handler: (args?: string) => void;\n description: string;\n category?: string;\n requiresArgs?: boolean;\n argType?: 'number' | 'string';\n contextFilter?: (event: KeyboardEvent) => boolean;\n\n // Future: Preview handlers for immediate execution mode\n previewHandler?: (args?: string) => void; // Called immediately as user types\n cancelHandler?: () => void; // Called when user presses Escape\n executeImmediately?: boolean; // Override global immediateExecution setting\n}\n\nexport interface ShortcutManagerConfig {\n shortcuts: ShortcutConfig[];\n helpContainer?: string;\n timeout?: number; // ms to return to normal state (current: 3000ms, immediate mode: 300ms)\n immediateExecution?: boolean; // Enable immediate execution with preview\n previewDelay?: number; // ms delay before preview execution (default: 300ms)\n onStateChange?: (state: KeyboardState, command?: string) => void; // Callback when state changes\n}\n\nexport enum KeyboardState {\n NORMAL = 'normal',\n AWAITING_ARGS = 'awaiting_args'\n}\n\nexport class KeyboardShortcutManager {\n private shortcuts: Map<string, ShortcutConfig> = new Map();\n private state: KeyboardState = KeyboardState.NORMAL;\n private currentCommand: string = '';\n private currentArgs: string = '';\n private helpContainer: string | null = null;\n private timeout: number = 3000; // Default 3 second timeout\n private timeoutId: number | null = null;\n private helpOverlay: HTMLElement | null = null;\n private immediateExecution: boolean = false; // Enable immediate execution mode\n private previewDelay: number = 300; // Default 300ms preview delay\n private previewTimeoutId: number | null = null; // Separate timeout for preview\n private isPreviewActive: boolean = false; // Track if preview is currently active\n private onStateChange: ((state: KeyboardState, command?: string) => void) | null = null;\n\n constructor(config: ShortcutManagerConfig) {\n this.helpContainer = config.helpContainer || null;\n this.timeout = config.timeout || 3000;\n this.immediateExecution = config.immediateExecution || false;\n this.previewDelay = config.previewDelay || 300;\n this.onStateChange = config.onStateChange || null;\n\n // Register shortcuts\n config.shortcuts.forEach(shortcut => {\n this.shortcuts.set(shortcut.key, shortcut);\n });\n\n this.initialize();\n }\n\n private initialize(): void {\n // Global keydown listener\n document.addEventListener('keydown', this.handleKeydown.bind(this));\n\n // Show initial state indicator\n this.updateStateIndicator();\n }\n\n private handleKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n\n // Skip if in input field, textarea, or contenteditable\n if (isInInputContext(target)) {\n return;\n }\n\n // Handle help key\n if (event.key === '?' && this.state === KeyboardState.NORMAL) {\n event.preventDefault();\n this.showHelp();\n return;\n }\n\n // Handle escape key\n if (event.key === 'Escape') {\n event.preventDefault();\n\n // Cancel preview if active in immediate execution mode\n if (this.immediateExecution && this.isPreviewActive) {\n this.cancelCurrentPreview();\n }\n\n this.resetState();\n return;\n }\n\n // Handle state machine\n if (this.state === KeyboardState.NORMAL) {\n this.handleNormalState(event);\n } else if (this.state === KeyboardState.AWAITING_ARGS) {\n this.handleAwaitingArgsState(event);\n }\n }\n\n private handleNormalState(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n const shortcut = this.shortcuts.get(key);\n\n if (shortcut) {\n event.preventDefault();\n\n // Check context filter\n if (shortcut.contextFilter && !shortcut.contextFilter(event)) {\n return;\n }\n\n if (shortcut.requiresArgs) {\n // Enter args waiting state\n this.state = KeyboardState.AWAITING_ARGS;\n this.currentCommand = key;\n this.currentArgs = '';\n this.updateStateIndicator();\n this.startTimeout();\n\n // Notify state change\n if (this.onStateChange) {\n this.onStateChange(this.state, key);\n }\n } else {\n // Execute immediately\n this.executeShortcut(shortcut);\n }\n }\n }\n\n private handleAwaitingArgsState(event: KeyboardEvent): void {\n const key = event.key;\n\n if (key >= '0' && key <= '9') {\n // Add digit to args\n event.preventDefault();\n this.currentArgs += key;\n this.updateStateIndicator();\n this.resetTimeout();\n\n // Handle immediate execution mode\n if (this.immediateExecution) {\n this.schedulePreviewExecution();\n }\n } else if (key === 'Enter' || key === ' ') {\n // Execute command with args\n event.preventDefault();\n this.executeCurrentCommand();\n } else if (key === 'Backspace') {\n // Remove last digit\n event.preventDefault();\n this.currentArgs = this.currentArgs.slice(0, -1);\n this.updateStateIndicator();\n this.resetTimeout();\n\n // Handle immediate execution mode\n if (this.immediateExecution) {\n this.cancelPreviewExecution();\n if (this.currentArgs.length > 0) {\n this.schedulePreviewExecution();\n }\n }\n }\n }\n\n private executeCurrentCommand(): void {\n const shortcut = this.shortcuts.get(this.currentCommand);\n if (shortcut && this.currentArgs) {\n this.executeShortcut(shortcut, this.currentArgs);\n }\n this.resetState();\n }\n\n private executeShortcut(shortcut: ShortcutConfig, args?: string): void {\n try {\n shortcut.handler(args);\n } catch (error) {\n console.error('Error executing shortcut:', error);\n }\n }\n\n private schedulePreviewExecution(): void {\n // Cancel any existing preview timeout\n this.cancelPreviewExecution();\n\n // Schedule preview execution\n this.previewTimeoutId = window.setTimeout(() => {\n this.executePreview();\n }, this.previewDelay);\n }\n\n private cancelPreviewExecution(): void {\n if (this.previewTimeoutId) {\n window.clearTimeout(this.previewTimeoutId);\n this.previewTimeoutId = null;\n }\n\n // Cancel current preview if active\n if (this.isPreviewActive) {\n this.cancelCurrentPreview();\n }\n }\n\n private executePreview(): void {\n const shortcut = this.shortcuts.get(this.currentCommand);\n if (shortcut && this.currentArgs) {\n try {\n // Call preview handler if available\n if (shortcut.previewHandler) {\n shortcut.previewHandler(this.currentArgs);\n this.isPreviewActive = true;\n } else {\n // Fallback to regular handler for immediate execution\n shortcut.handler(this.currentArgs);\n this.isPreviewActive = true;\n }\n } catch (error) {\n console.error('Error executing preview:', error);\n }\n }\n }\n\n private cancelCurrentPreview(): void {\n if (this.isPreviewActive) {\n const shortcut = this.shortcuts.get(this.currentCommand);\n if (shortcut && shortcut.cancelHandler) {\n try {\n shortcut.cancelHandler();\n } catch (error) {\n console.error('Error canceling preview:', error);\n }\n }\n this.isPreviewActive = false;\n }\n }\n\n\n private resetState(): void {\n this.state = KeyboardState.NORMAL;\n this.currentCommand = '';\n this.currentArgs = '';\n this.clearTimeout();\n this.cancelPreviewExecution();\n this.updateStateIndicator();\n this.hideHelp();\n\n // Notify state change\n if (this.onStateChange) {\n this.onStateChange(this.state);\n }\n }\n\n private startTimeout(): void {\n this.timeoutId = window.setTimeout(() => {\n this.resetState();\n }, this.timeout);\n }\n\n private resetTimeout(): void {\n this.clearTimeout();\n this.startTimeout();\n }\n\n private clearTimeout(): void {\n if (this.timeoutId) {\n window.clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n private updateStateIndicator(): void {\n // Remove existing indicator\n const existingIndicator = document.getElementById('keyboard-state-indicator');\n if (existingIndicator) {\n existingIndicator.remove();\n }\n\n // Only show indicator when not in normal state\n if (this.state === KeyboardState.NORMAL) {\n return;\n }\n\n // Create new indicator\n const indicator = document.createElement('div');\n indicator.id = 'keyboard-state-indicator';\n indicator.className = 'fixed top-4 right-4 bg-blue-600 text-white px-3 py-2 rounded-lg shadow-lg z-50 font-mono text-sm';\n\n if (this.state === KeyboardState.AWAITING_ARGS) {\n const shortcut = this.shortcuts.get(this.currentCommand);\n const description = shortcut ? shortcut.description : 'Unknown command';\n indicator.innerHTML = `\n <div class=\"flex items-center space-x-2\">\n <span>${this.currentCommand.toUpperCase()}</span>\n <span class=\"text-blue-200\">${this.currentArgs || '_'}</span>\n </div>\n <div class=\"text-xs text-blue-200 mt-1\">${description}</div>\n `;\n }\n\n document.body.appendChild(indicator);\n }\n\n private showHelp(): void {\n if (this.helpOverlay) {\n this.hideHelp();\n return;\n }\n\n this.helpOverlay = document.createElement('div');\n this.helpOverlay.id = 'keyboard-help-overlay';\n this.helpOverlay.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50';\n\n const helpContent = document.createElement('div');\n helpContent.className = 'bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-2xl max-h-[80vh] overflow-y-auto p-6';\n\n helpContent.innerHTML = this.generateHelpContent();\n\n this.helpOverlay.appendChild(helpContent);\n document.body.appendChild(this.helpOverlay);\n\n // Close on click outside or escape\n this.helpOverlay.addEventListener('click', (e) => {\n if (e.target === this.helpOverlay) {\n this.hideHelp();\n }\n });\n }\n\n private hideHelp(): void {\n if (this.helpOverlay) {\n this.helpOverlay.remove();\n this.helpOverlay = null;\n }\n }\n\n private generateHelpContent(): string {\n const categories = new Map<string, ShortcutConfig[]>();\n\n // Group shortcuts by category\n this.shortcuts.forEach(shortcut => {\n const category = shortcut.category || 'General';\n if (!categories.has(category)) {\n categories.set(category, []);\n }\n categories.get(category)!.push(shortcut);\n });\n\n let html = `\n <div class=\"flex items-center justify-between mb-4\">\n <h2 class=\"text-xl font-bold text-gray-900 dark:text-white\">Keyboard Shortcuts</h2>\n <button class=\"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\" onclick=\"this.closest('#keyboard-help-overlay').remove()\">\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n </button>\n </div>\n `;\n\n categories.forEach((shortcuts, category) => {\n html += `\n <div class=\"mb-6\">\n <h3 class=\"text-lg font-semibold text-gray-800 dark:text-gray-200 mb-3\">${category}</h3>\n <div class=\"space-y-2\">\n `;\n\n shortcuts.forEach(shortcut => {\n const keyDisplay = shortcut.requiresArgs\n ? `${shortcut.key.toUpperCase()}<span class=\"text-blue-600 dark:text-blue-400\"><number></span>`\n : shortcut.key.toUpperCase();\n\n html += `\n <div class=\"flex items-center justify-between py-2 px-3 bg-gray-50 dark:bg-gray-700 rounded\">\n <span class=\"text-sm text-gray-700 dark:text-gray-300\">${shortcut.description}</span>\n <kbd class=\"px-2 py-1 text-xs font-mono bg-gray-200 dark:bg-gray-600 text-gray-800 dark:text-gray-200 rounded\">${keyDisplay}</kbd>\n </div>\n `;\n });\n\n html += `\n </div>\n </div>\n `;\n });\n\n\n html += `\n <div class=\"mt-6 pt-4 border-t border-gray-200 dark:border-gray-600\">\n <p class=\"text-sm text-gray-600 dark:text-gray-400 text-center\">\n Press <kbd class=\"px-2 py-1 text-xs font-mono bg-gray-200 dark:bg-gray-600 rounded\">ESC</kbd> to cancel any command or\n <kbd class=\"px-2 py-1 text-xs font-mono bg-gray-200 dark:bg-gray-600 rounded\">?</kbd> to close this help\n </p>\n </div>\n `;\n\n return html;\n }\n\n public destroy(): void {\n document.removeEventListener('keydown', this.handleKeydown.bind(this));\n this.cancelPreviewExecution();\n this.resetState();\n this.hideHelp();\n }\n\n public getState(): KeyboardState {\n return this.state;\n }\n\n public getCurrentCommand(): string {\n return this.currentCommand;\n }\n\n public getCurrentArgs(): string {\n return this.currentArgs;\n }\n}\n"]}
|