joopjs 2.0.5 → 2.1.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.
Files changed (146) hide show
  1. package/.claude/skills/auth.md +235 -0
  2. package/.claude/skills/banking.md +377 -0
  3. package/.claude/skills/encryption.md +265 -0
  4. package/.claude/skills/finance.md +248 -0
  5. package/.claude/skills/observables.md +270 -0
  6. package/.claude/skills/security.md +240 -0
  7. package/.claude/skills/setup.md +196 -0
  8. package/.cursor/rules/joopjs.mdc +150 -0
  9. package/.github/copilot-instructions.md +143 -0
  10. package/.windsurf/rules/joopjs.md +226 -0
  11. package/CHANGELOG.md +81 -0
  12. package/README.md +47 -7
  13. package/ai-rules/AGENTS.md +241 -0
  14. package/ai-rules/GEMINI.md +183 -0
  15. package/dist/ai/index.js +15 -3
  16. package/dist/ai/index.js.map +1 -1
  17. package/dist/ai/index.mjs +15 -3
  18. package/dist/ai/index.mjs.map +1 -1
  19. package/dist/analytics/index.js +10 -2
  20. package/dist/analytics/index.js.map +1 -1
  21. package/dist/analytics/index.mjs +10 -2
  22. package/dist/analytics/index.mjs.map +1 -1
  23. package/dist/angular/index.d.mts +98 -27
  24. package/dist/angular/index.d.ts +98 -27
  25. package/dist/angular/index.js +44 -0
  26. package/dist/angular/index.js.map +1 -1
  27. package/dist/angular/index.mjs +39 -1
  28. package/dist/angular/index.mjs.map +1 -1
  29. package/dist/api/index.js +15 -3
  30. package/dist/api/index.js.map +1 -1
  31. package/dist/api/index.mjs +15 -3
  32. package/dist/api/index.mjs.map +1 -1
  33. package/dist/auth/index.js +15 -3
  34. package/dist/auth/index.js.map +1 -1
  35. package/dist/auth/index.mjs +15 -3
  36. package/dist/auth/index.mjs.map +1 -1
  37. package/dist/banking/index.js +15 -3
  38. package/dist/banking/index.js.map +1 -1
  39. package/dist/banking/index.mjs +15 -3
  40. package/dist/banking/index.mjs.map +1 -1
  41. package/dist/cache/index.js +15 -3
  42. package/dist/cache/index.js.map +1 -1
  43. package/dist/cache/index.mjs +15 -3
  44. package/dist/cache/index.mjs.map +1 -1
  45. package/dist/{index-DFqEoX_l.d.ts → consent.service-CIHNtx9h.d.ts} +1 -2
  46. package/dist/{index-B_ksKpS1.d.mts → consent.service-DQ-JAEJx.d.mts} +1 -2
  47. package/dist/core/index.d.mts +34 -1
  48. package/dist/core/index.d.ts +34 -1
  49. package/dist/core/index.js +56 -5
  50. package/dist/core/index.js.map +1 -1
  51. package/dist/core/index.mjs +54 -6
  52. package/dist/core/index.mjs.map +1 -1
  53. package/dist/deeplink/index.js +15 -3
  54. package/dist/deeplink/index.js.map +1 -1
  55. package/dist/deeplink/index.mjs +15 -3
  56. package/dist/deeplink/index.mjs.map +1 -1
  57. package/dist/device/index.js +15 -3
  58. package/dist/device/index.js.map +1 -1
  59. package/dist/device/index.mjs +15 -3
  60. package/dist/device/index.mjs.map +1 -1
  61. package/dist/forms/index.js +15 -3
  62. package/dist/forms/index.js.map +1 -1
  63. package/dist/forms/index.mjs +15 -3
  64. package/dist/forms/index.mjs.map +1 -1
  65. package/dist/i18n/index.js +15 -3
  66. package/dist/i18n/index.js.map +1 -1
  67. package/dist/i18n/index.mjs +15 -3
  68. package/dist/i18n/index.mjs.map +1 -1
  69. package/dist/index.d.mts +2 -2
  70. package/dist/index.d.ts +2 -2
  71. package/dist/index.js +50 -8
  72. package/dist/index.js.map +1 -1
  73. package/dist/index.mjs +50 -8
  74. package/dist/index.mjs.map +1 -1
  75. package/dist/{joop-CA3DMeOO.d.ts → joop-Dim2yEKG.d.ts} +1 -1
  76. package/dist/{joop-Bx7Iwj5p.d.mts → joop-GkQw13f9.d.mts} +1 -1
  77. package/dist/native-bridge/index.js +10 -2
  78. package/dist/native-bridge/index.js.map +1 -1
  79. package/dist/native-bridge/index.mjs +10 -2
  80. package/dist/native-bridge/index.mjs.map +1 -1
  81. package/dist/network/index.js +15 -3
  82. package/dist/network/index.js.map +1 -1
  83. package/dist/network/index.mjs +15 -3
  84. package/dist/network/index.mjs.map +1 -1
  85. package/dist/observability/index.js +15 -3
  86. package/dist/observability/index.js.map +1 -1
  87. package/dist/observability/index.mjs +15 -3
  88. package/dist/observability/index.mjs.map +1 -1
  89. package/dist/pwa/index.js +15 -3
  90. package/dist/pwa/index.js.map +1 -1
  91. package/dist/pwa/index.mjs +15 -3
  92. package/dist/pwa/index.mjs.map +1 -1
  93. package/dist/react/index.d.mts +2 -2
  94. package/dist/react/index.d.ts +2 -2
  95. package/dist/react/index.js +15 -3
  96. package/dist/react/index.js.map +1 -1
  97. package/dist/react/index.mjs +15 -3
  98. package/dist/react/index.mjs.map +1 -1
  99. package/dist/router/index.js +15 -3
  100. package/dist/router/index.js.map +1 -1
  101. package/dist/router/index.mjs +15 -3
  102. package/dist/router/index.mjs.map +1 -1
  103. package/dist/security/index.js +15 -3
  104. package/dist/security/index.js.map +1 -1
  105. package/dist/security/index.mjs +15 -3
  106. package/dist/security/index.mjs.map +1 -1
  107. package/dist/session/index.js +15 -3
  108. package/dist/session/index.js.map +1 -1
  109. package/dist/session/index.mjs +15 -3
  110. package/dist/session/index.mjs.map +1 -1
  111. package/dist/state/index.js +15 -3
  112. package/dist/state/index.js.map +1 -1
  113. package/dist/state/index.mjs +15 -3
  114. package/dist/state/index.mjs.map +1 -1
  115. package/dist/storage/index.js +15 -3
  116. package/dist/storage/index.js.map +1 -1
  117. package/dist/storage/index.mjs +15 -3
  118. package/dist/storage/index.mjs.map +1 -1
  119. package/dist/sync/index.js +15 -3
  120. package/dist/sync/index.js.map +1 -1
  121. package/dist/sync/index.mjs +15 -3
  122. package/dist/sync/index.mjs.map +1 -1
  123. package/dist/theme/index.js +15 -3
  124. package/dist/theme/index.js.map +1 -1
  125. package/dist/theme/index.mjs +15 -3
  126. package/dist/theme/index.mjs.map +1 -1
  127. package/dist/ui/index.js +15 -3
  128. package/dist/ui/index.js.map +1 -1
  129. package/dist/ui/index.mjs +15 -3
  130. package/dist/ui/index.mjs.map +1 -1
  131. package/dist/utilities/index.js +46 -4
  132. package/dist/utilities/index.js.map +1 -1
  133. package/dist/utilities/index.mjs +46 -4
  134. package/dist/utilities/index.mjs.map +1 -1
  135. package/dist/vue/index.d.mts +2 -2
  136. package/dist/vue/index.d.ts +2 -2
  137. package/dist/vue/index.js +15 -3
  138. package/dist/vue/index.js.map +1 -1
  139. package/dist/vue/index.mjs +15 -3
  140. package/dist/vue/index.mjs.map +1 -1
  141. package/dist/workflow/index.js +15 -3
  142. package/dist/workflow/index.js.map +1 -1
  143. package/dist/workflow/index.mjs +15 -3
  144. package/dist/workflow/index.mjs.map +1 -1
  145. package/package.json +96 -32
  146. package/scripts/setup-ai.mjs +133 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/index.ts","../../src/theme/theme.service.ts"],"names":[],"mappings":";AAOO,IAAM,cAAN,MAAqB;AAAA,EAClB,aAA4B,EAAC;AAAA,EAErC,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAAA,EAEA,KAAK,KAAA,EAAgB;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAMO,IAAM,mBAAA,GAAN,cAAqC,WAAA,CAAe;AAAA,EACjD,MAAA;AAAA,EAER,YAAY,YAAA,EAAiB;AAC3B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,KAAK,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAAA,EAES,UAAU,QAAA,EAAoC;AACrD,IAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,IAAA,OAAO,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,EACjC;AAAA,EAES,YAAA,GAAkC;AACzC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAKO,IAAM,iBAAN,MAAwB;AAAA,EAC7B,YAAoB,YAAA,EAAsD;AAAtD,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAAuD;AAAA,EAAvD,YAAA;AAAA,EAEpB,UAAU,QAAA,EAAoC;AAC5C,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,OAAA,GAAyB;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,KAAK;AAAE,MAAA,MAAA,GAAS,CAAA;AAAA,IAAG,CAAC,CAAA;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;AC7CA,IAAM,YAAA,GAAe,gBAAA;AAEd,IAAM,mBAAN,MAAuB;AAAA,EACpB,UAAuB,EAAC;AAAA,EACxB,QAAA,GAAW,IAAI,mBAAA,CAA4B,EAAE,CAAA;AAAA,EAC7C,IAAA,GAAO,IAAI,mBAAA,CAA4B,CAAC,CAAA;AAAA,EAEhD,MAAM,KAAK,WAAA,EAAyD;AAClE,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,WAAW,CAAA;AACnC,MAAA,IAAA,CAAK,OAAA,GAAU,MAAM,GAAA,CAAI,IAAA,EAAK;AAAA,IAChC;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAA,GAAsB;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAAS;AAAA,EAE7C,UAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEA,UAAU,IAAA,EAAqC;AAC7C,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,IAAI,CAAA;AAAA,EACpD;AAAA,EAEA,QAAQ,EAAA,EAAmC;AACzC,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,EAC3C;AAAA,EAEA,SAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC5B,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,OAAA,EAAS,EAAE,QAAA,CAAS,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,EAAG,SAAA,IAAa;AAAA,KACpE,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,KAAA,EAAiC;AACrC,IAAA,MAAM,WAAW,OAAO,KAAA,KAAU,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,KAAA;AACrE,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AACxC,IAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,UAAU,EAAA,EAAkB;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAC7B,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,EAAW;AAC9B,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,UAAU,IAAA,EAAoC;AAC5C,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3E,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,EAAK,GAAG;AAAA,CAAI,CAAA;AAAA,EACjC;AAAA,EAEA,aAAA,GAAwB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAS,QAAA,EAAS;AAAA,EAAG;AAAA,EAC3D,WAAA,GAAsB;AAAE,IAAA,OAAO,IAAA,CAAK,KAAK,QAAA,EAAS;AAAA,EAAG;AAAA,EACrD,OAAA,GAAU;AAAE,IAAA,OAAO,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EAAG;AAAA,EACjD,SAAA,GAAY;AAAE,IAAA,OAAO,IAAA,CAAK,KAAK,YAAA,EAAa;AAAA,EAAG;AAAA,EAE/C,WAAA,GAAoB;AAClB,IAAA,QAAA,CAAS,cAAA,CAAe,YAAY,CAAA,EAAG,MAAA,EAAO;AAAA,EAChD;AAAA,EAEQ,cAAc,KAAA,EAA0B;AAC9C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,OAAA,IAAW,MAAM,QAAA,EAAU;AACpC,MAAA,MAAM,CAAA,GAAI,QAAQ,MAAA,IAAU,OAAA,CAAQ,KAAK,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACjE,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACnD;AACA,MAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,QAAA,KAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACzD,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,cAAA,IAAkB,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACzC,UAAA,KAAA,CAAM,IAAA,CAAK,YAAY,EAAE,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,MAAM,UAAA,EAAY,KAAA,CAAM,KAAK,CAAA,sBAAA,EAAyB,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA;AAC7E,IAAA,IAAI,MAAM,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAG,CAAA;AACvE,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA,EAEQ,cAAc,IAAA,EAAoB;AACxC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAI,GAAA,GAAM,QAAA,CAAS,cAAA,CAAe,YAAY,CAAA;AAC9C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,QAAA,CAAS,cAAc,OAAO,CAAA;AACpC,MAAA,GAAA,CAAI,EAAA,GAAK,YAAA;AACT,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,EAAY,IAAI;AAAA,CAAA,CAAA;AAAA,EACpC;AACF","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopThemeColor {\n name: string;\n value: string;\n contrastText?: string;\n}\n\nexport interface JoopThemePalette {\n name: string;\n prefix: string;\n contrastPrefix?: string;\n baseColor?: string;\n colors: JoopThemeColor[];\n}\n\nexport interface JoopTheme {\n id: number;\n themeName: string;\n palettes: JoopThemePalette[];\n isDefault?: boolean;\n fontFamily?: string;\n fontSize?: string;\n}\n\nexport interface JoopThemeInfo {\n id: number;\n themeName: string;\n primary: string;\n}\n\nconst STYLE_TAG_ID = '__joop_theme__';\n\nexport class JoopThemeService {\n private _themes: JoopTheme[] = [];\n private _active$ = new JoopBehaviorSubject<string>('');\n private _id$ = new JoopBehaviorSubject<number>(0);\n\n async load(themesOrUrl: JoopTheme[] | string): Promise<JoopTheme[]> {\n if (Array.isArray(themesOrUrl)) {\n this._themes = themesOrUrl;\n } else {\n const res = await fetch(themesOrUrl);\n this._themes = await res.json();\n }\n return this._themes;\n }\n\n getAll(): JoopTheme[] { return this._themes; }\n\n getDefault(): JoopTheme | undefined {\n return this._themes.find(t => t.isDefault) ?? this._themes[0];\n }\n\n getByName(name: string): JoopTheme | undefined {\n return this._themes.find(t => t.themeName === name);\n }\n\n getById(id: number): JoopTheme | undefined {\n return this._themes.find(t => t.id === id);\n }\n\n getMapped(): JoopThemeInfo[] {\n return this._themes.map(t => ({\n id: t.id,\n themeName: t.themeName,\n primary: t.palettes.find(p => p.name === 'Primary')?.baseColor ?? '',\n }));\n }\n\n /** Inject a theme's palette as CSS custom properties on :root */\n apply(theme: JoopTheme | string): void {\n const resolved = typeof theme === 'string' ? this.getByName(theme) : theme;\n if (!resolved) return;\n\n const vars = this._buildCssVars(resolved);\n this._injectStyles(vars);\n this._active$.next(resolved.themeName);\n this._id$.next(resolved.id);\n }\n\n applyById(id: number): void {\n const theme = this.getById(id);\n if (theme) this.apply(theme);\n }\n\n applyDefault(): void {\n const theme = this.getDefault();\n if (theme) this.apply(theme);\n }\n\n /** Apply arbitrary CSS custom properties to :root */\n applyVars(vars: Record<string, string>): void {\n const css = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`).join('\\n');\n this._injectStyles(`\\n${css}\\n`);\n }\n\n getActiveName(): string { return this._active$.getValue(); }\n getActiveId(): number { return this._id$.getValue(); }\n active$() { return this._active$.asObservable(); }\n activeId$() { return this._id$.asObservable(); }\n\n clearStyles(): void {\n document.getElementById(STYLE_TAG_ID)?.remove();\n }\n\n private _buildCssVars(theme: JoopTheme): string {\n const lines: string[] = [];\n for (const palette of theme.palettes) {\n const p = palette.prefix ?? palette.name.toLowerCase().slice(0, 2);\n if (palette.baseColor) {\n lines.push(` --joop-${p}: ${palette.baseColor};`);\n }\n for (const color of palette.colors) {\n lines.push(` --joop-${p}-${color.name}: ${color.value};`);\n if (color.contrastText) {\n const cp = palette.contrastPrefix ?? `${p}-c`;\n lines.push(` --joop-${cp}-${color.name}: ${color.contrastText};`);\n }\n }\n }\n if (theme.fontFamily) lines.push(` --joop-font-family: ${theme.fontFamily};`);\n if (theme.fontSize) lines.push(` --joop-font-size: ${theme.fontSize};`);\n return lines.join('\\n');\n }\n\n private _injectStyles(vars: string): void {\n if (typeof document === 'undefined') return;\n let tag = document.getElementById(STYLE_TAG_ID) as HTMLStyleElement | null;\n if (!tag) {\n tag = document.createElement('style');\n tag.id = STYLE_TAG_ID;\n document.head.appendChild(tag);\n }\n tag.textContent = `:root {\\n${vars}\\n}`;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/theme/theme.service.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopThemeColor {\n name: string;\n value: string;\n contrastText?: string;\n}\n\nexport interface JoopThemePalette {\n name: string;\n prefix: string;\n contrastPrefix?: string;\n baseColor?: string;\n colors: JoopThemeColor[];\n}\n\nexport interface JoopTheme {\n id: number;\n themeName: string;\n palettes: JoopThemePalette[];\n isDefault?: boolean;\n fontFamily?: string;\n fontSize?: string;\n}\n\nexport interface JoopThemeInfo {\n id: number;\n themeName: string;\n primary: string;\n}\n\nconst STYLE_TAG_ID = '__joop_theme__';\n\nexport class JoopThemeService {\n private _themes: JoopTheme[] = [];\n private _active$ = new JoopBehaviorSubject<string>('');\n private _id$ = new JoopBehaviorSubject<number>(0);\n\n async load(themesOrUrl: JoopTheme[] | string): Promise<JoopTheme[]> {\n if (Array.isArray(themesOrUrl)) {\n this._themes = themesOrUrl;\n } else {\n const res = await fetch(themesOrUrl);\n this._themes = await res.json();\n }\n return this._themes;\n }\n\n getAll(): JoopTheme[] { return this._themes; }\n\n getDefault(): JoopTheme | undefined {\n return this._themes.find(t => t.isDefault) ?? this._themes[0];\n }\n\n getByName(name: string): JoopTheme | undefined {\n return this._themes.find(t => t.themeName === name);\n }\n\n getById(id: number): JoopTheme | undefined {\n return this._themes.find(t => t.id === id);\n }\n\n getMapped(): JoopThemeInfo[] {\n return this._themes.map(t => ({\n id: t.id,\n themeName: t.themeName,\n primary: t.palettes.find(p => p.name === 'Primary')?.baseColor ?? '',\n }));\n }\n\n /** Inject a theme's palette as CSS custom properties on :root */\n apply(theme: JoopTheme | string): void {\n const resolved = typeof theme === 'string' ? this.getByName(theme) : theme;\n if (!resolved) return;\n\n const vars = this._buildCssVars(resolved);\n this._injectStyles(vars);\n this._active$.next(resolved.themeName);\n this._id$.next(resolved.id);\n }\n\n applyById(id: number): void {\n const theme = this.getById(id);\n if (theme) this.apply(theme);\n }\n\n applyDefault(): void {\n const theme = this.getDefault();\n if (theme) this.apply(theme);\n }\n\n /** Apply arbitrary CSS custom properties to :root */\n applyVars(vars: Record<string, string>): void {\n const css = Object.entries(vars).map(([k, v]) => ` ${k}: ${v};`).join('\\n');\n this._injectStyles(`\\n${css}\\n`);\n }\n\n getActiveName(): string { return this._active$.getValue(); }\n getActiveId(): number { return this._id$.getValue(); }\n active$() { return this._active$.asObservable(); }\n activeId$() { return this._id$.asObservable(); }\n\n clearStyles(): void {\n document.getElementById(STYLE_TAG_ID)?.remove();\n }\n\n private _buildCssVars(theme: JoopTheme): string {\n const lines: string[] = [];\n for (const palette of theme.palettes) {\n const p = palette.prefix ?? palette.name.toLowerCase().slice(0, 2);\n if (palette.baseColor) {\n lines.push(` --joop-${p}: ${palette.baseColor};`);\n }\n for (const color of palette.colors) {\n lines.push(` --joop-${p}-${color.name}: ${color.value};`);\n if (color.contrastText) {\n const cp = palette.contrastPrefix ?? `${p}-c`;\n lines.push(` --joop-${cp}-${color.name}: ${color.contrastText};`);\n }\n }\n }\n if (theme.fontFamily) lines.push(` --joop-font-family: ${theme.fontFamily};`);\n if (theme.fontSize) lines.push(` --joop-font-size: ${theme.fontSize};`);\n return lines.join('\\n');\n }\n\n private _injectStyles(vars: string): void {\n if (typeof document === 'undefined') return;\n let tag = document.getElementById(STYLE_TAG_ID) as HTMLStyleElement | null;\n if (!tag) {\n tag = document.createElement('style');\n tag.id = STYLE_TAG_ID;\n document.head.appendChild(tag);\n }\n tag.textContent = `:root {\\n${vars}\\n}`;\n }\n}\n"]}
package/dist/ui/index.js CHANGED
@@ -1,6 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  // src/events/index.ts
4
+ var _onListenerError = (error) => {
5
+ console.error("[joopjs] a subject subscriber threw during emission:", error);
6
+ };
4
7
  var JoopSubject = class {
5
8
  _listeners = [];
6
9
  subscribe(listener) {
@@ -10,8 +13,13 @@ var JoopSubject = class {
10
13
  };
11
14
  }
12
15
  next(value) {
13
- for (const listener of this._listeners) {
14
- listener(value);
16
+ const listeners = this._listeners.slice();
17
+ for (const listener of listeners) {
18
+ try {
19
+ listener(value);
20
+ } catch (error) {
21
+ _onListenerError(error);
22
+ }
15
23
  }
16
24
  }
17
25
  asObservable() {
@@ -32,7 +40,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
32
40
  super.next(value);
33
41
  }
34
42
  subscribe(listener) {
35
- listener(this._value);
43
+ try {
44
+ listener(this._value);
45
+ } catch (error) {
46
+ _onListenerError(error);
47
+ }
36
48
  return super.subscribe(listener);
37
49
  }
38
50
  asObservable() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/index.ts","../../src/ui/loader.service.ts","../../src/ui/alert.service.ts","../../src/ui/pagination.service.ts","../../src/ui/print.service.ts","../../src/ui/a11y.service.ts","../../src/ui/virtual-scroll.ts","../../src/ui/banking-keyboard.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopLoaderConfig {\n delayMs?: number;\n}\n\nexport class JoopLoaderService {\n private _count = 0;\n private _loading$ = new JoopBehaviorSubject<boolean>(false);\n private _delayTimer: ReturnType<typeof setTimeout> | null = null;\n private _cfg: JoopLoaderConfig;\n\n constructor(config: JoopLoaderConfig = {}) {\n this._cfg = config;\n }\n\n /** Increment loader counter — shows loader when count goes 0 → 1 */\n show(): void {\n this._count++;\n if (this._count === 1) {\n if (this._cfg.delayMs && this._cfg.delayMs > 0) {\n this._delayTimer = setTimeout(() => this._loading$.next(true), this._cfg.delayMs);\n } else {\n this._loading$.next(true);\n }\n }\n }\n\n /** Decrement loader counter — hides loader when count reaches 0 */\n hide(): void {\n if (this._count > 0) this._count--;\n if (this._count === 0) {\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n }\n\n /** Force-show regardless of count */\n forceShow(): void {\n this._count = Math.max(this._count, 1);\n this._loading$.next(true);\n }\n\n /** Force-hide and reset counter */\n reset(): void {\n this._count = 0;\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n\n isLoading(): boolean { return this._loading$.getValue(); }\n isLoading$() { return this._loading$.asObservable(); }\n get pendingCount(): number { return this._count; }\n}\n","import { JoopSubject, JoopBehaviorSubject } from '../events';\n\nexport type JoopAlertType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface JoopToastOptions {\n type?: JoopAlertType;\n duration?: number;\n position?: 'top' | 'bottom' | 'top-right' | 'bottom-right';\n closeable?: boolean;\n}\n\nexport interface JoopDialogButton {\n label: string;\n action: string;\n style?: 'primary' | 'secondary' | 'danger';\n}\n\nexport interface JoopDialogOptions {\n title?: string;\n message: string;\n type?: JoopAlertType;\n buttons?: JoopDialogButton[];\n closeable?: boolean;\n htmlContent?: boolean;\n}\n\nexport interface JoopInlineAlert {\n message: string;\n type: JoopAlertType;\n closeable?: boolean;\n}\n\nconst COLORS: Record<JoopAlertType, { bg: string; border: string; icon: string }> = {\n success: { bg: '#d4edda', border: '#28a745', icon: '✓' },\n error: { bg: '#f8d7da', border: '#dc3545', icon: '✕' },\n warning: { bg: '#fff3cd', border: '#ffc107', icon: '⚠' },\n info: { bg: '#d1ecf1', border: '#17a2b8', icon: 'ℹ' },\n};\n\nconst TOAST_CONTAINER_ID = '__joop_toast_container__';\nconst OVERLAY_ID = '__joop_dialog_overlay__';\n\nexport class JoopAlertService {\n private _inline$ = new JoopBehaviorSubject<JoopInlineAlert | null>(null);\n private _open$ = new JoopSubject<string>();\n\n inline$() { return this._inline$.asObservable(); }\n open$() { return this._open$.asObservable(); }\n\n showInline(data: JoopInlineAlert): void { this._inline$.next(data); }\n hideInline(): void { this._inline$.next(null); }\n\n toast(message: string, options: JoopToastOptions = {}): void {\n if (typeof document === 'undefined') return;\n const { type = 'info', duration = 3000, position = 'bottom', closeable = false } = options;\n const c = COLORS[type];\n\n const container = this._getToastContainer(position);\n const toast = document.createElement('div');\n toast.setAttribute('role', 'alert');\n Object.assign(toast.style, {\n background: c.bg,\n borderLeft: `4px solid ${c.border}`,\n padding: '12px 16px',\n marginBottom: '8px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n fontSize: '14px',\n maxWidth: '320px',\n opacity: '0',\n transition: 'opacity 0.2s ease',\n cursor: closeable ? 'pointer' : 'default',\n });\n\n const icon = document.createElement('span');\n icon.textContent = c.icon;\n icon.style.fontWeight = 'bold';\n\n const text = document.createElement('span');\n text.textContent = message;\n text.style.flex = '1';\n\n toast.appendChild(icon);\n toast.appendChild(text);\n\n if (closeable) {\n const btn = document.createElement('button');\n btn.textContent = '×';\n Object.assign(btn.style, { background: 'none', border: 'none', cursor: 'pointer', fontSize: '16px', padding: '0 4px' });\n btn.onclick = () => this._removeToast(toast);\n toast.appendChild(btn);\n }\n\n container.appendChild(toast);\n requestAnimationFrame(() => { toast.style.opacity = '1'; });\n\n if (duration > 0) {\n setTimeout(() => this._removeToast(toast), duration);\n }\n\n this._open$.next('toast');\n }\n\n dialog(options: JoopDialogOptions): Promise<string> {\n return new Promise(resolve => {\n if (typeof document === 'undefined') { resolve('close'); return; }\n\n const { title, message, type = 'info', closeable = true, htmlContent = false } = options;\n const buttons: JoopDialogButton[] = options.buttons ?? [{ label: 'OK', action: 'ok', style: 'primary' }];\n const c = COLORS[type];\n\n const overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n Object.assign(overlay.style, {\n position: 'fixed', inset: '0', background: 'rgba(0,0,0,0.5)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: '99999',\n });\n\n const dialog = document.createElement('div');\n Object.assign(dialog.style, {\n background: '#fff', borderRadius: '8px', padding: '24px', minWidth: '280px', maxWidth: '480px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.2)', position: 'relative',\n });\n\n if (title) {\n const h = document.createElement('h3');\n h.textContent = title;\n Object.assign(h.style, { margin: '0 0 12px', fontSize: '18px', color: c.border });\n dialog.appendChild(h);\n }\n\n const msg = document.createElement('div');\n if (htmlContent) { msg.innerHTML = message; } else { msg.textContent = message; }\n Object.assign(msg.style, { marginBottom: '20px', fontSize: '14px', lineHeight: '1.5' });\n dialog.appendChild(msg);\n\n const btnRow = document.createElement('div');\n Object.assign(btnRow.style, { display: 'flex', gap: '8px', justifyContent: 'flex-end' });\n\n const finish = (action: string) => { overlay.remove(); resolve(action); };\n\n for (const btn of buttons) {\n const el = document.createElement('button');\n el.textContent = btn.label;\n const isPrimary = btn.style === 'primary';\n const isDanger = btn.style === 'danger';\n Object.assign(el.style, {\n padding: '8px 16px', borderRadius: '4px', cursor: 'pointer', fontSize: '14px',\n border: 'none',\n background: isDanger ? '#dc3545' : isPrimary ? c.border : '#e9ecef',\n color: isPrimary || isDanger ? '#fff' : '#333',\n });\n el.onclick = () => finish(btn.action);\n btnRow.appendChild(el);\n }\n dialog.appendChild(btnRow);\n\n if (closeable) {\n const closeBtn = document.createElement('button');\n closeBtn.textContent = '×';\n Object.assign(closeBtn.style, {\n position: 'absolute', top: '12px', right: '16px', background: 'none', border: 'none',\n cursor: 'pointer', fontSize: '20px', color: '#666',\n });\n closeBtn.onclick = () => finish('close');\n overlay.addEventListener('click', (e) => { if (e.target === overlay) finish('close'); });\n dialog.appendChild(closeBtn);\n }\n\n overlay.appendChild(dialog);\n document.body.appendChild(overlay);\n this._open$.next('dialog');\n });\n }\n\n dismiss(): void {\n document.getElementById(OVERLAY_ID)?.remove();\n document.getElementById(TOAST_CONTAINER_ID)?.remove();\n this._inline$.next(null);\n }\n\n private _getToastContainer(position: string): HTMLElement {\n const existing = document.getElementById(TOAST_CONTAINER_ID);\n if (existing) return existing;\n const container = document.createElement('div');\n container.id = TOAST_CONTAINER_ID;\n const top = position.startsWith('top');\n const right = position.endsWith('right');\n Object.assign(container.style, {\n position: 'fixed',\n [top ? 'top' : 'bottom']: '16px',\n [right ? 'right' : 'left']: right ? '16px' : '50%',\n transform: right ? 'none' : 'translateX(-50%)',\n zIndex: '99998',\n display: 'flex',\n flexDirection: top ? 'column' : 'column-reverse',\n alignItems: right ? 'flex-end' : 'center',\n });\n document.body.appendChild(container);\n return container;\n }\n\n private _removeToast(el: HTMLElement): void {\n el.style.opacity = '0';\n setTimeout(() => el.remove(), 200);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopPageState {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n hasPrev: boolean;\n hasNext: boolean;\n from: number;\n to: number;\n}\n\nexport class JoopPaginationService {\n private _state$ = new JoopBehaviorSubject<JoopPageState>(this._compute(1, 10, 0));\n\n private _compute(page: number, pageSize: number, total: number): JoopPageState {\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const clamped = Math.min(Math.max(1, page), totalPages);\n const from = total === 0 ? 0 : (clamped - 1) * pageSize + 1;\n const to = Math.min(clamped * pageSize, total);\n return { page: clamped, pageSize, total, totalPages, hasPrev: clamped > 1, hasNext: clamped < totalPages, from, to };\n }\n\n private _update(patch: Partial<{ page: number; pageSize: number; total: number }>): void {\n const { page, pageSize, total } = this._state$.getValue();\n const next = { page, pageSize, total, ...patch };\n this._state$.next(this._compute(next.page, next.pageSize, next.total));\n }\n\n setTotal(total: number): void { this._update({ total, page: 1 }); }\n setPage(page: number): void { this._update({ page }); }\n setPageSize(size: number): void { this._update({ pageSize: size, page: 1 }); }\n\n nextPage(): void { const s = this._state$.getValue(); if (s.hasNext) this._update({ page: s.page + 1 }); }\n prevPage(): void { const s = this._state$.getValue(); if (s.hasPrev) this._update({ page: s.page - 1 }); }\n firstPage(): void { this._update({ page: 1 }); }\n lastPage(): void { this._update({ page: this._state$.getValue().totalPages }); }\n\n getState(): JoopPageState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n\n /** Returns page numbers for pagination UI — with ellipsis as -1 */\n getPages(maxVisible = 7): number[] {\n const { page, totalPages } = this._state$.getValue();\n if (totalPages <= maxVisible) return Array.from({ length: totalPages }, (_, i) => i + 1);\n\n const pages: number[] = [];\n const half = Math.floor(maxVisible / 2);\n let start = Math.max(2, page - half);\n let end = Math.min(totalPages - 1, page + half);\n\n if (page - half < 2) end = Math.min(totalPages - 1, maxVisible - 1);\n if (page + half > totalPages - 1) start = Math.max(2, totalPages - maxVisible + 2);\n\n pages.push(1);\n if (start > 2) pages.push(-1); // ellipsis\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < totalPages - 1) pages.push(-1); // ellipsis\n pages.push(totalPages);\n return pages;\n }\n\n reset(): void { this._state$.next(this._compute(1, this._state$.getValue().pageSize, 0)); }\n}\n","export interface JoopPrintOptions {\n styles?: string;\n title?: string;\n bodyClass?: string;\n}\n\nexport class JoopPrintService {\n /** Print the current page */\n print(): void { window.print(); }\n\n /** Print a specific element by ID or reference */\n printElement(elementOrId: HTMLElement | string, options: JoopPrintOptions = {}): void {\n const el = typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId;\n if (!el) return;\n this.printHtml(el.outerHTML, options);\n }\n\n /** Open a new window with custom HTML and print it */\n printHtml(html: string, options: JoopPrintOptions = {}): void {\n const win = window.open('', '_blank', 'width=800,height=600');\n if (!win) return;\n\n const { styles = '', title = document.title, bodyClass = '' } = options;\n const defaultStyles = `\n body { font-family: Arial, sans-serif; font-size: 12pt; margin: 20mm; }\n @media print { body { margin: 0; } }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: left; }\n th { background: #f5f5f5; font-weight: bold; }\n `;\n\n win.document.write(`<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>${title}</title>\n <style>${defaultStyles}${styles}</style>\n</head>\n<body class=\"${bodyClass}\">${html}</body>\n</html>`);\n win.document.close();\n win.focus();\n setTimeout(() => { win.print(); win.close(); }, 300);\n }\n\n /** Print a plain-text receipt in a monospace layout */\n printReceipt(lines: string[], options: JoopPrintOptions = {}): void {\n const html = `<pre style=\"font-family:monospace;font-size:11pt;white-space:pre-wrap\">${lines.join('\\n')}</pre>`;\n this.printHtml(html, { ...options, styles: `${options.styles ?? ''}body{margin:10mm;}` });\n }\n\n /** Build a receipt-style text block for printing */\n buildReceiptText(\n title: string,\n rows: Array<[label: string, value: string]>,\n width = 42,\n ): string[] {\n const line = '─'.repeat(width);\n const center = (s: string) => s.padStart(Math.floor((width + s.length) / 2)).padEnd(width);\n const row = ([l, v]: [string, string]) => `${l.padEnd(width - v.length - 2)} ${v}`;\n return [center(title), line, ...rows.map(row), line];\n }\n}\n","export type JoopAriaLivePoliteness = 'assertive' | 'polite' | 'off';\n\nexport interface JoopFocusTrapOptions {\n initialFocus?: string; // CSS selector\n returnFocusOnDeactivate?: boolean;\n}\n\nexport class JoopA11yService {\n private _liveRegions = new Map<JoopAriaLivePoliteness, HTMLElement>();\n private _trapStack: Array<{ el: HTMLElement; prev: Element | null; release: () => void }> = [];\n private _skipLink: HTMLElement | null = null;\n private _focusHandlers: Array<(el: Element) => void> = [];\n private _focusListener: ((e: FocusEvent) => void) | null = null;\n\n // ── ARIA Live Regions ────────────────────────────────────────────────────\n\n announce(message: string, politeness: JoopAriaLivePoliteness = 'polite'): void {\n const region = this._getOrCreateLiveRegion(politeness);\n // Clear and re-set to force screen reader re-announcement\n region.textContent = '';\n setTimeout(() => { region.textContent = message; }, 50);\n }\n\n private _getOrCreateLiveRegion(politeness: JoopAriaLivePoliteness): HTMLElement {\n if (!this._liveRegions.has(politeness)) {\n const el = document.createElement('div');\n el.setAttribute('aria-live', politeness);\n el.setAttribute('aria-atomic', 'true');\n el.setAttribute('aria-relevant', 'additions text');\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n document.body.appendChild(el);\n this._liveRegions.set(politeness, el);\n }\n return this._liveRegions.get(politeness)!;\n }\n\n clearAnnouncements(): void {\n for (const el of this._liveRegions.values()) el.textContent = '';\n }\n\n // ── Focus Trap ───────────────────────────────────────────────────────────\n\n trapFocus(container: HTMLElement, opts: JoopFocusTrapOptions = {}): () => void {\n const prev = document.activeElement;\n const focusable = (): NodeListOf<HTMLElement> =>\n container.querySelectorAll<HTMLElement>('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])');\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const elements = Array.from(focusable());\n if (!elements.length) { e.preventDefault(); return; }\n const first = elements[0], last = elements[elements.length - 1];\n if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n };\n\n container.addEventListener('keydown', handleKeydown);\n\n const initialEl = opts.initialFocus\n ? container.querySelector<HTMLElement>(opts.initialFocus)\n : focusable()[0];\n initialEl?.focus();\n\n const release = () => {\n container.removeEventListener('keydown', handleKeydown);\n if (opts.returnFocusOnDeactivate !== false && prev instanceof HTMLElement) prev.focus();\n };\n\n this._trapStack.push({ el: container, prev, release });\n return release;\n }\n\n releaseFocus(): void {\n const entry = this._trapStack.pop();\n entry?.release();\n }\n\n releaseAllTraps(): void {\n while (this._trapStack.length) this.releaseFocus();\n }\n\n // ── Skip Link ────────────────────────────────────────────────────────────\n\n createSkipLink(targetId: string, label = 'Skip to main content'): HTMLElement {\n const link = document.createElement('a');\n link.href = `#${targetId}`;\n link.textContent = label;\n link.className = 'joop-skip-link';\n Object.assign(link.style, {\n position: 'absolute', top: '-9999px', left: '0',\n zIndex: '9999', padding: '8px 16px',\n background: '#fff', color: '#000', textDecoration: 'underline',\n });\n link.addEventListener('focus', () => { link.style.top = '0'; });\n link.addEventListener('blur', () => { link.style.top = '-9999px'; });\n document.body.insertBefore(link, document.body.firstChild);\n this._skipLink = link;\n return link;\n }\n\n removeSkipLink(): void { this._skipLink?.remove(); this._skipLink = null; }\n\n // ── Keyboard helpers ─────────────────────────────────────────────────────\n\n /** Start tracking focus changes */\n trackFocus(): () => void {\n const handler = (e: FocusEvent) => {\n if (e.target instanceof Element) this._focusHandlers.forEach(h => h(e.target as Element));\n };\n document.addEventListener('focusin', handler);\n this._focusListener = handler;\n return () => { document.removeEventListener('focusin', handler); this._focusListener = null; };\n }\n\n onFocusChange(handler: (el: Element) => void): () => void {\n this._focusHandlers.push(handler);\n return () => { this._focusHandlers = this._focusHandlers.filter(h => h !== handler); };\n }\n\n /** Set visible page title + meta description */\n setPageTitle(title: string, suffix?: string): void {\n document.title = suffix ? `${title} — ${suffix}` : title;\n }\n\n /** Make an element visually hidden but accessible */\n visuallyHide(el: HTMLElement): void {\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n }\n\n /** Get all focusable elements within a container */\n getFocusable(container: HTMLElement = document.body): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ));\n }\n\n /** Check whether an element is visible and not hidden from accessibility */\n isAccessible(el: HTMLElement): boolean {\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && style.visibility !== 'hidden' && el.getAttribute('aria-hidden') !== 'true';\n }\n\n destroy(): void {\n for (const el of this._liveRegions.values()) el.remove();\n this._liveRegions.clear();\n this.releaseAllTraps();\n this.removeSkipLink();\n if (this._focusListener) document.removeEventListener('focusin', this._focusListener);\n }\n}\n","export interface JoopVirtualScrollOptions {\n itemHeight: number;\n overscan?: number; // extra rows to render above/below visible area\n}\n\nexport interface JoopVirtualRange {\n start: number;\n end: number;\n offsetTop: number;\n}\n\nexport type JoopRenderFn<T> = (item: T, index: number) => HTMLElement;\n\nexport class JoopVirtualScroll<T = unknown> {\n private _container: HTMLElement | null = null;\n private _items: T[] = [];\n private _renderFn: JoopRenderFn<T> | null = null;\n private _opts: Required<JoopVirtualScrollOptions> = { itemHeight: 40, overscan: 3 };\n private _scrollListener: (() => void) | null = null;\n private _rangeHandlers: Array<(range: JoopVirtualRange) => void> = [];\n private _innerEl: HTMLElement | null = null;\n private _spacerTop: HTMLElement | null = null;\n private _spacerBottom: HTMLElement | null = null;\n private _rendered: HTMLElement[] = [];\n private _lastRange: JoopVirtualRange = { start: 0, end: 0, offsetTop: 0 };\n\n attach(container: HTMLElement, items: T[], renderFn: JoopRenderFn<T>, opts?: Partial<JoopVirtualScrollOptions>): void {\n this.detach();\n this._container = container;\n this._items = items;\n this._renderFn = renderFn;\n if (opts) Object.assign(this._opts, opts);\n\n container.style.overflow = 'auto';\n container.style.position = 'relative';\n\n this._spacerTop = _spacer();\n this._innerEl = document.createElement('div');\n this._spacerBottom = _spacer();\n\n container.appendChild(this._spacerTop);\n container.appendChild(this._innerEl);\n container.appendChild(this._spacerBottom);\n\n const render = () => this._render();\n container.addEventListener('scroll', render);\n this._scrollListener = () => container.removeEventListener('scroll', render);\n this._render();\n }\n\n detach(): void {\n this._scrollListener?.();\n this._spacerTop?.remove();\n this._innerEl?.remove();\n this._spacerBottom?.remove();\n this._scrollListener = null;\n this._container = null;\n this._rendered = [];\n }\n\n updateItems(items: T[]): void {\n this._items = items;\n this._render();\n }\n\n scrollTo(index: number): void {\n if (!this._container) return;\n this._container.scrollTop = index * this._opts.itemHeight;\n }\n\n getVisibleRange(): JoopVirtualRange { return { ...this._lastRange }; }\n\n onRangeChange(handler: (range: JoopVirtualRange) => void): () => void {\n this._rangeHandlers.push(handler);\n return () => { this._rangeHandlers = this._rangeHandlers.filter(h => h !== handler); };\n }\n\n private _render(): void {\n if (!this._container || !this._innerEl || !this._spacerTop || !this._spacerBottom || !this._renderFn) return;\n\n const scrollTop = this._container.scrollTop;\n const viewHeight = this._container.clientHeight;\n const { itemHeight, overscan } = this._opts;\n const total = this._items.length;\n\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const end = Math.min(total, Math.ceil((scrollTop + viewHeight) / itemHeight) + overscan);\n\n this._lastRange = { start, end, offsetTop: start * itemHeight };\n this._rangeHandlers.forEach(h => h(this._lastRange));\n\n this._spacerTop.style.height = `${start * itemHeight}px`;\n this._spacerBottom.style.height = `${(total - end) * itemHeight}px`;\n\n this._innerEl.innerHTML = '';\n this._rendered = [];\n for (let i = start; i < end; i++) {\n const el = this._renderFn(this._items[i], i);\n el.style.height = `${itemHeight}px`;\n this._innerEl.appendChild(el);\n this._rendered.push(el);\n }\n }\n}\n\nfunction _spacer(): HTMLElement {\n const el = document.createElement('div');\n el.style.height = '0';\n el.style.pointerEvents = 'none';\n return el;\n}\n","export type JoopKeyboardMode = 'pin' | 'amount' | 'otp' | 'numeric';\n\nexport interface JoopBankingKeyboardConfig {\n mode?: JoopKeyboardMode;\n scramble?: boolean; // shuffle key layout on each render, default true\n haptic?: boolean; // trigger vibration on key press, default true\n maskInput?: boolean; // show dots instead of digits, default true for pin/otp\n maxLength?: number;\n theme?: 'light' | 'dark';\n}\n\nexport interface JoopBankingKeyboardOptions extends JoopBankingKeyboardConfig {\n onInput?: (value: string) => void;\n onSubmit?: (value: string) => void;\n onClear?: () => void;\n}\n\nfunction shuffle<T>(arr: T[]): T[] {\n const a = [...arr];\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]];\n }\n return a;\n}\n\nexport class JoopBankingKeyboard {\n private _container: HTMLElement | null = null;\n private _value = '';\n private readonly _config: Required<Omit<JoopBankingKeyboardConfig, 'maxLength'>> & { maxLength?: number };\n private readonly _opts: JoopBankingKeyboardOptions;\n\n constructor(opts: JoopBankingKeyboardOptions = {}) {\n this._opts = opts;\n this._config = {\n mode: opts.mode ?? 'pin',\n scramble: opts.scramble ?? true,\n haptic: opts.haptic ?? true,\n maskInput: opts.maskInput ?? (opts.mode === 'amount' ? false : true),\n maxLength: opts.maxLength,\n theme: opts.theme ?? 'light',\n };\n }\n\n render(container: HTMLElement): void {\n this._container = container;\n this._container.innerHTML = '';\n this._container.setAttribute('role', 'application');\n this._container.setAttribute('aria-label', 'Secure keyboard');\n this._container.style.cssText = `\n display: grid; gap: 8px; padding: 12px;\n background: ${this._config.theme === 'dark' ? '#1a1a2e' : '#f8f9fa'};\n border-radius: 12px; user-select: none; touch-action: manipulation;\n `;\n this._renderDisplay();\n this._renderKeys();\n }\n\n getValue(): string { return this._value; }\n\n clear(): void {\n this._value = '';\n this._opts.onClear?.();\n this._opts.onInput?.('');\n this._refresh();\n }\n\n destroy(): void {\n if (this._container) { this._container.innerHTML = ''; this._container = null; }\n }\n\n private _renderDisplay(): void {\n if (!this._container) return;\n const display = document.createElement('div');\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : 16);\n const dots = this._config.maskInput\n ? Array.from({ length: maxLen }, (_, i) => `<span style=\"\n display:inline-block; width:12px; height:12px; border-radius:50%; margin:0 4px;\n background:${i < this._value.length ? '#2563eb' : '#d1d5db'};\n transition:background .15s;\n \"></span>`).join('')\n : `<span style=\"font-size:24px;font-weight:700;letter-spacing:4px;color:${this._config.theme === 'dark' ? '#fff' : '#111'}\">${this._value || ' '}</span>`;\n\n display.style.cssText = 'text-align:center; padding:12px 0; min-height:40px;';\n display.innerHTML = dots;\n this._container.appendChild(display);\n }\n\n private _renderKeys(): void {\n if (!this._container) return;\n let digits = ['1','2','3','4','5','6','7','8','9','0'];\n if (this._config.scramble) {\n const numericPart = shuffle(['1','2','3','4','5','6','7','8','9']);\n digits = [...numericPart, '0'];\n }\n\n const grid = document.createElement('div');\n grid.style.cssText = 'display:grid; grid-template-columns: repeat(3,1fr); gap:8px;';\n\n const btnStyle = (bg: string, color: string) =>\n `background:${bg}; color:${color}; border:none; border-radius:10px; font-size:22px;\n font-weight:600; padding:16px; cursor:pointer; transition:opacity .1s;\n -webkit-tap-highlight-color:transparent;`;\n\n const keyColor = this._config.theme === 'dark' ? '#2a2a3e' : '#ffffff';\n const textColor = this._config.theme === 'dark' ? '#e2e8f0' : '#1a202c';\n\n // Render digit keys\n digits.slice(0, 9).forEach(d => {\n const btn = this._makeKey(d, btnStyle(keyColor, textColor));\n grid.appendChild(btn);\n });\n\n // Bottom row: clear | 0 | backspace\n if (this._config.mode === 'amount' || this._config.mode === 'numeric') {\n const decBtn = this._makeKey('.', btnStyle(keyColor, textColor));\n grid.appendChild(decBtn);\n } else {\n grid.appendChild(this._makeSpacer());\n }\n\n const zeroBtn = this._makeKey('0', btnStyle(keyColor, textColor));\n grid.appendChild(zeroBtn);\n\n const backBtn = this._makeKey('⌫', btnStyle('#ef4444', '#fff'));\n backBtn.setAttribute('aria-label', 'Backspace');\n backBtn.addEventListener('click', () => {\n this._value = this._value.slice(0, -1);\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n grid.appendChild(backBtn);\n\n this._container.appendChild(grid);\n\n // Submit / clear row\n const actionRow = document.createElement('div');\n actionRow.style.cssText = 'display:flex; gap:8px; margin-top:4px;';\n\n const clearBtn = document.createElement('button');\n clearBtn.textContent = 'Clear';\n clearBtn.style.cssText = btnStyle('#6b7280', '#fff') + 'flex:1; font-size:14px; padding:12px;';\n clearBtn.addEventListener('click', () => this.clear());\n\n const submitBtn = document.createElement('button');\n submitBtn.textContent = 'Submit';\n submitBtn.style.cssText = btnStyle('#2563eb', '#fff') + 'flex:2; font-size:14px; padding:12px;';\n submitBtn.addEventListener('click', () => {\n this._opts.onSubmit?.(this._value);\n });\n\n actionRow.appendChild(clearBtn);\n actionRow.appendChild(submitBtn);\n this._container.appendChild(actionRow);\n }\n\n private _makeKey(label: string, style: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.textContent = label;\n btn.style.cssText = style;\n btn.addEventListener('click', () => {\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : (this._config.mode === 'otp' ? 6 : 16));\n if (this._value.length >= maxLen) return;\n if (this._config.haptic && navigator.vibrate) navigator.vibrate(10);\n this._value += label;\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n return btn;\n }\n\n private _makeSpacer(): HTMLDivElement {\n const el = document.createElement('div');\n return el;\n }\n\n private _refresh(): void {\n if (!this._container) return;\n this.render(this._container);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/events/index.ts","../../src/ui/loader.service.ts","../../src/ui/alert.service.ts","../../src/ui/pagination.service.ts","../../src/ui/print.service.ts","../../src/ui/a11y.service.ts","../../src/ui/virtual-scroll.ts","../../src/ui/banking-keyboard.ts"],"names":[],"mappings":";;;AAQA,IAAI,gBAAA,GAA6C,CAAC,KAAA,KAAU;AAE1D,EAAA,OAAA,CAAQ,KAAA,CAAM,wDAAwD,KAAK,CAAA;AAC7E,CAAA;AAWO,IAAM,cAAN,MAAqB;AAAA,EAClB,aAA4B,EAAC;AAAA,EAErC,UAAU,QAAA,EAAoC;AAC5C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF;AAAA,EAEA,KAAK,KAAA,EAAgB;AAInB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM;AACxC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAMO,IAAM,mBAAA,GAAN,cAAqC,WAAA,CAAe;AAAA,EACjD,MAAA;AAAA,EAER,YAAY,YAAA,EAAiB;AAC3B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AAAA,EAChB;AAAA,EAEA,QAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAES,KAAK,KAAA,EAAgB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAAA,EAES,UAAU,QAAA,EAAoC;AACrD,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IACtB,SAAS,KAAA,EAAO;AACd,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,EACjC;AAAA,EAES,YAAA,GAAkC;AACzC,IAAA,OAAO,IAAI,cAAA,CAAkB,CAAA,QAAA,KAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EACnE;AACF,CAAA;AAKO,IAAM,iBAAN,MAAwB;AAAA,EAC7B,YAAoB,YAAA,EAAsD;AAAtD,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAAuD;AAAA,EAAvD,YAAA;AAAA,EAEpB,UAAU,QAAA,EAAoC;AAC5C,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,OAAA,GAAyB;AACvB,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,CAAA,KAAK;AAAE,MAAA,MAAA,GAAS,CAAA;AAAA,IAAG,CAAC,CAAA;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;ACjGO,IAAM,oBAAN,MAAwB;AAAA,EACrB,MAAA,GAAS,CAAA;AAAA,EACT,SAAA,GAAY,IAAI,mBAAA,CAA6B,KAAK,CAAA;AAAA,EAClD,WAAA,GAAoD,IAAA;AAAA,EACpD,IAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,MAAA,EAAA;AACL,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAI,KAAK,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,WAAA,GAAc,UAAA,CAAW,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAAA,MAClF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,GAAa;AACX,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAA,EAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAI,KAAK,WAAA,EAAa;AAAE,QAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAG,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,MAAM;AACjF,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA;AACrC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,EAC1B;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAI,KAAK,WAAA,EAAa;AAAE,MAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAG,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IAAM;AACjF,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAA,GAAqB;AAAE,IAAA,OAAO,IAAA,CAAK,UAAU,QAAA,EAAS;AAAA,EAAG;AAAA,EACzD,UAAA,GAAa;AAAE,IAAA,OAAO,IAAA,CAAK,UAAU,YAAA,EAAa;AAAA,EAAG;AAAA,EACrD,IAAI,YAAA,GAAuB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AACnD;;;ACrBA,IAAM,MAAA,GAA8E;AAAA,EAClF,SAAS,EAAE,EAAA,EAAI,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,QAAA,EAAI;AAAA,EACvD,OAAS,EAAE,EAAA,EAAI,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,QAAA,EAAI;AAAA,EACvD,SAAS,EAAE,EAAA,EAAI,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,QAAA,EAAI;AAAA,EACvD,MAAS,EAAE,EAAA,EAAI,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAM,QAAA;AACrD,CAAA;AAEA,IAAM,kBAAA,GAAqB,0BAAA;AAC3B,IAAM,UAAA,GAAa,yBAAA;AAEZ,IAAM,mBAAN,MAAuB;AAAA,EACpB,QAAA,GAAW,IAAI,mBAAA,CAA4C,IAAI,CAAA;AAAA,EAC/D,MAAA,GAAS,IAAI,WAAA,EAAoB;AAAA,EAEzC,OAAA,GAAU;AAAE,IAAA,OAAO,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EAAG;AAAA,EACjD,KAAA,GAAQ;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,EAAa;AAAA,EAAG;AAAA,EAE7C,WAAW,IAAA,EAA6B;AAAE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EAAG;AAAA,EACpE,UAAA,GAAmB;AAAE,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EAAG;AAAA,EAE/C,KAAA,CAAM,OAAA,EAAiB,OAAA,GAA4B,EAAC,EAAS;AAC3D,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,QAAA,GAAW,KAAM,QAAA,GAAW,QAAA,EAAU,SAAA,GAAY,KAAA,EAAM,GAAI,OAAA;AACnF,IAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AAErB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,OAAO,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACzB,YAAY,CAAA,CAAE,EAAA;AAAA,MACd,UAAA,EAAY,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,MACjC,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAc,KAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAW,4BAAA;AAAA,MACX,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,UAAA,EAAY,mBAAA;AAAA,MACZ,MAAA,EAAQ,YAAY,SAAA,GAAY;AAAA,KACjC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,cAAc,CAAA,CAAE,IAAA;AACrB,IAAA,IAAA,CAAK,MAAM,UAAA,GAAa,MAAA;AAExB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,IAAA,IAAA,CAAK,MAAM,IAAA,GAAO,GAAA;AAElB,IAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AACtB,IAAA,KAAA,CAAM,YAAY,IAAI,CAAA;AAEtB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,WAAA,GAAc,MAAA;AAClB,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,YAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AACtH,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAC3C,MAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AAAA,IACvB;AAEA,IAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAC3B,IAAA,qBAAA,CAAsB,MAAM;AAAE,MAAA,KAAA,CAAM,MAAM,OAAA,GAAU,GAAA;AAAA,IAAK,CAAC,CAAA;AAE1D,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,UAAA,CAAW,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,GAAG,QAAQ,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA,EAEA,OAAO,OAAA,EAA6C;AAClD,IAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC5B,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAAE,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAA;AAAA,MAAQ;AAEjE,MAAA,MAAM,EAAE,OAAO,OAAA,EAAS,IAAA,GAAO,QAAQ,SAAA,GAAY,IAAA,EAAM,WAAA,GAAc,KAAA,EAAM,GAAI,OAAA;AACjF,MAAA,MAAM,OAAA,GAA8B,OAAA,CAAQ,OAAA,IAAW,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,CAAA;AACvG,MAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AAErB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,MAAA,OAAA,CAAQ,EAAA,GAAK,UAAA;AACb,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,QAC3B,QAAA,EAAU,OAAA;AAAA,QAAS,KAAA,EAAO,GAAA;AAAA,QAAK,UAAA,EAAY,iBAAA;AAAA,QAC3C,OAAA,EAAS,MAAA;AAAA,QAAQ,UAAA,EAAY,QAAA;AAAA,QAAU,cAAA,EAAgB,QAAA;AAAA,QAAU,MAAA,EAAQ;AAAA,OAC1E,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,QAC1B,UAAA,EAAY,MAAA;AAAA,QAAQ,YAAA,EAAc,KAAA;AAAA,QAAO,OAAA,EAAS,MAAA;AAAA,QAAQ,QAAA,EAAU,OAAA;AAAA,QAAS,QAAA,EAAU,OAAA;AAAA,QACvF,SAAA,EAAW,4BAAA;AAAA,QAA8B,QAAA,EAAU;AAAA,OACpD,CAAA;AAED,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA;AACrC,QAAA,CAAA,CAAE,WAAA,GAAc,KAAA;AAChB,QAAA,MAAA,CAAO,MAAA,CAAO,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,CAAA;AAChF,QAAA,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,IAAI,WAAA,EAAa;AAAE,QAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAAA,MAAS,CAAA,MAAO;AAAE,QAAA,GAAA,CAAI,WAAA,GAAc,OAAA;AAAA,MAAS;AAChF,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAQ,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,CAAA;AACtF,MAAA,MAAA,CAAO,YAAY,GAAG,CAAA;AAEtB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,UAAA,EAAY,CAAA;AAEvF,MAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAmB;AAAE,QAAA,OAAA,CAAQ,MAAA,EAAO;AAAG,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAAG,CAAA;AAExE,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC1C,QAAA,EAAA,CAAG,cAAc,GAAA,CAAI,KAAA;AACrB,QAAA,MAAM,SAAA,GAAY,IAAI,KAAA,KAAU,SAAA;AAChC,QAAA,MAAM,QAAA,GAAW,IAAI,KAAA,KAAU,QAAA;AAC/B,QAAA,MAAA,CAAO,MAAA,CAAO,GAAG,KAAA,EAAO;AAAA,UACtB,OAAA,EAAS,UAAA;AAAA,UAAY,YAAA,EAAc,KAAA;AAAA,UAAO,MAAA,EAAQ,SAAA;AAAA,UAAW,QAAA,EAAU,MAAA;AAAA,UACvE,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,QAAA,GAAW,SAAA,GAAY,SAAA,GAAY,EAAE,MAAA,GAAS,SAAA;AAAA,UAC1D,KAAA,EAAO,SAAA,IAAa,QAAA,GAAW,MAAA,GAAS;AAAA,SACzC,CAAA;AACD,QAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AACpC,QAAA,MAAA,CAAO,YAAY,EAAE,CAAA;AAAA,MACvB;AACA,MAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AAEzB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,QAAA,QAAA,CAAS,WAAA,GAAc,MAAA;AACvB,QAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,UAC5B,QAAA,EAAU,UAAA;AAAA,UAAY,GAAA,EAAK,MAAA;AAAA,UAAQ,KAAA,EAAO,MAAA;AAAA,UAAQ,UAAA,EAAY,MAAA;AAAA,UAAQ,MAAA,EAAQ,MAAA;AAAA,UAC9E,MAAA,EAAQ,SAAA;AAAA,UAAW,QAAA,EAAU,MAAA;AAAA,UAAQ,KAAA,EAAO;AAAA,SAC7C,CAAA;AACD,QAAA,QAAA,CAAS,OAAA,GAAU,MAAM,MAAA,CAAO,OAAO,CAAA;AACvC,QAAA,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA,QAAG,CAAC,CAAA;AACvF,QAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAAA,MAC7B;AAEA,MAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACjC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,QAAA,CAAS,cAAA,CAAe,UAAU,CAAA,EAAG,MAAA,EAAO;AAC5C,IAAA,QAAA,CAAS,cAAA,CAAe,kBAAkB,CAAA,EAAG,MAAA,EAAO;AACpD,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EACzB;AAAA,EAEQ,mBAAmB,QAAA,EAA+B;AACxD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,kBAAkB,CAAA;AAC3D,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,SAAA,CAAU,EAAA,GAAK,kBAAA;AACf,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AACvC,IAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,MAC7B,QAAA,EAAU,OAAA;AAAA,MACV,CAAC,GAAA,GAAM,KAAA,GAAQ,QAAQ,GAAG,MAAA;AAAA,MAC1B,CAAC,KAAA,GAAQ,OAAA,GAAU,MAAM,GAAG,QAAQ,MAAA,GAAS,KAAA;AAAA,MAC7C,SAAA,EAAW,QAAQ,MAAA,GAAS,kBAAA;AAAA,MAC5B,MAAA,EAAQ,OAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,MAAM,QAAA,GAAW,gBAAA;AAAA,MAChC,UAAA,EAAY,QAAQ,UAAA,GAAa;AAAA,KAClC,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AACnC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,aAAa,EAAA,EAAuB;AAC1C,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,GAAA;AACnB,IAAA,UAAA,CAAW,MAAM,EAAA,CAAG,MAAA,EAAO,EAAG,GAAG,CAAA;AAAA,EACnC;AACF;;;ACpMO,IAAM,wBAAN,MAA4B;AAAA,EACzB,OAAA,GAAU,IAAI,mBAAA,CAAmC,IAAA,CAAK,SAAS,CAAA,EAAG,EAAA,EAAI,CAAC,CAAC,CAAA;AAAA,EAExE,QAAA,CAAS,IAAA,EAAc,QAAA,EAAkB,KAAA,EAA8B;AAC7E,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,KAAA,GAAQ,QAAQ,CAAC,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,GAAG,UAAU,CAAA;AACtD,IAAA,MAAM,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAA,CAAK,OAAA,GAAU,KAAK,QAAA,GAAW,CAAA;AAC1D,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,UAAU,KAAK,CAAA;AAC7C,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,OAAA,GAAU,CAAA,EAAG,OAAA,EAAS,OAAA,GAAU,UAAA,EAAY,MAAM,EAAA,EAAG;AAAA,EACrH;AAAA,EAEQ,QAAQ,KAAA,EAAyE;AACvF,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAM,GAAI,IAAA,CAAK,QAAQ,QAAA,EAAS;AACxD,IAAA,MAAM,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,GAAG,KAAA,EAAM;AAC/C,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACvE;AAAA,EAEA,SAAS,KAAA,EAAqB;AAAE,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,CAAA;AAAA,EAAG;AAAA,EAClE,QAAQ,IAAA,EAAoB;AAAE,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA;AAAA,EAAG;AAAA,EACtD,YAAY,IAAA,EAAoB;AAAE,IAAA,IAAA,CAAK,QAAQ,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAAA,EAAG;AAAA,EAE7E,QAAA,GAAiB;AAAE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAS;AAAG,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA;AAAA,EAAG;AAAA,EACzG,QAAA,GAAiB;AAAE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAS;AAAG,IAAA,IAAI,CAAA,CAAE,SAAS,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA;AAAA,EAAG;AAAA,EACzG,SAAA,GAAkB;AAAE,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA;AAAA,EAAG;AAAA,EAC/C,QAAA,GAAiB;AAAE,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,QAAQ,QAAA,EAAS,CAAE,YAAY,CAAA;AAAA,EAAG;AAAA,EAE/E,QAAA,GAA0B;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAS;AAAA,EAAG;AAAA,EAC5D,MAAA,GAAS;AAAE,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAa;AAAA,EAAG;AAAA;AAAA,EAG/C,QAAA,CAAS,aAAa,CAAA,EAAa;AACjC,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,IAAA,CAAK,QAAQ,QAAA,EAAS;AACnD,IAAA,IAAI,UAAA,IAAc,UAAA,EAAY,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAA,EAAW,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEvF,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AACtC,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,IAAI,CAAA;AACnC,IAAA,IAAI,MAAM,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,CAAA,EAAG,OAAO,IAAI,CAAA;AAE9C,IAAA,IAAI,IAAA,GAAO,OAAO,CAAA,EAAG,GAAA,GAAM,KAAK,GAAA,CAAI,UAAA,GAAa,CAAA,EAAG,UAAA,GAAa,CAAC,CAAA;AAClE,IAAA,IAAI,IAAA,GAAO,IAAA,GAAO,UAAA,GAAa,CAAA,EAAG,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,UAAA,GAAa,UAAA,GAAa,CAAC,CAAA;AAEjF,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAC5B,IAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAC/C,IAAA,IAAI,GAAA,GAAM,UAAA,GAAa,CAAA,EAAG,KAAA,CAAM,KAAK,EAAE,CAAA;AACvC,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AAAE,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAS,CAAE,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,EAAG;AAC5F;;;AC1DO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAE5B,KAAA,GAAc;AAAE,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EAAG;AAAA;AAAA,EAGhC,YAAA,CAAa,WAAA,EAAmC,OAAA,GAA4B,EAAC,EAAS;AACpF,IAAA,MAAM,KAAK,OAAO,WAAA,KAAgB,WAAW,QAAA,CAAS,cAAA,CAAe,WAAW,CAAA,GAAI,WAAA;AACpF,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA,EAGA,SAAA,CAAU,IAAA,EAAc,OAAA,GAA4B,EAAC,EAAS;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,UAAU,sBAAsB,CAAA;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,EAAE,SAAS,EAAA,EAAI,KAAA,GAAQ,SAAS,KAAA,EAAO,SAAA,GAAY,IAAG,GAAI,OAAA;AAChE,IAAA,MAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAQtB,IAAA,GAAA,CAAI,SAAS,KAAA,CAAM,CAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAIZ,KAAK,CAAA;AAAA,SAAA,EACL,aAAa,GAAG,MAAM,CAAA;AAAA;AAAA,aAAA,EAElB,SAAS,KAAK,IAAI,CAAA;AAAA,OAAA,CACzB,CAAA;AACJ,IAAA,GAAA,CAAI,SAAS,KAAA,EAAM;AACnB,IAAA,GAAA,CAAI,KAAA,EAAM;AACV,IAAA,UAAA,CAAW,MAAM;AAAE,MAAA,GAAA,CAAI,KAAA,EAAM;AAAG,MAAA,GAAA,CAAI,KAAA,EAAM;AAAA,IAAG,GAAG,GAAG,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,YAAA,CAAa,KAAA,EAAiB,OAAA,GAA4B,EAAC,EAAS;AAClE,IAAA,MAAM,IAAA,GAAO,CAAA,uEAAA,EAA0E,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA,CAAA;AACvG,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,kBAAA,CAAA,EAAsB,CAAA;AAAA,EAC1F;AAAA;AAAA,EAGA,gBAAA,CACE,KAAA,EACA,IAAA,EACA,KAAA,GAAQ,EAAA,EACE;AACV,IAAA,MAAM,IAAA,GAAO,QAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAc,CAAA,CAAE,SAAS,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,MAAA,IAAU,CAAC,CAAC,CAAA,CAAE,OAAO,KAAK,CAAA;AACzF,IAAA,MAAM,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAwB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,KAAK,CAAC,CAAA,CAAA;AACjF,IAAA,OAAO,CAAC,MAAA,CAAO,KAAK,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAI,CAAA;AAAA,EACrD;AACF;;;ACvDO,IAAM,kBAAN,MAAsB;AAAA,EACnB,YAAA,uBAAmB,GAAA,EAAyC;AAAA,EAC5D,aAAoF,EAAC;AAAA,EACrF,SAAA,GAAgC,IAAA;AAAA,EAChC,iBAA+C,EAAC;AAAA,EAChD,cAAA,GAAmD,IAAA;AAAA;AAAA,EAI3D,QAAA,CAAS,OAAA,EAAiB,UAAA,GAAqC,QAAA,EAAgB;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,UAAU,CAAA;AAErD,IAAA,MAAA,CAAO,WAAA,GAAc,EAAA;AACrB,IAAA,UAAA,CAAW,MAAM;AAAE,MAAA,MAAA,CAAO,WAAA,GAAc,OAAA;AAAA,IAAS,GAAG,EAAE,CAAA;AAAA,EACxD;AAAA,EAEQ,uBAAuB,UAAA,EAAiD;AAC9E,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,EAAG;AACtC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,YAAA,CAAa,aAAa,UAAU,CAAA;AACvC,MAAA,EAAA,CAAG,YAAA,CAAa,eAAe,MAAM,CAAA;AACrC,MAAA,EAAA,CAAG,YAAA,CAAa,iBAAiB,gBAAgB,CAAA;AACjD,MAAA,MAAA,CAAO,MAAA,CAAO,GAAG,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,GAAA,EAAK,QAAA,EAAU,UAAU,IAAA,EAAM,eAAA,EAAiB,YAAY,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AACzK,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAC5B,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAAA,EACzC;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,KAAA,MAAW,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO,KAAM,WAAA,GAAc,EAAA;AAAA,EAChE;AAAA;AAAA,EAIA,SAAA,CAAU,SAAA,EAAwB,IAAA,GAA6B,EAAC,EAAe;AAC7E,IAAA,MAAM,OAAO,QAAA,CAAS,aAAA;AACtB,IAAA,MAAM,SAAA,GAAY,MAChB,SAAA,CAAU,gBAAA,CAA8B,sIAAsI,CAAA;AAEhL,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AACrB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AACvC,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA;AAAA,MAAQ;AACpD,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA,EAAG,OAAO,QAAA,CAAS,QAAA,CAAS,SAAS,CAAC,CAAA;AAC9D,MAAA,IAAI,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,KAAA,EAAO;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MAAG,WAC/E,CAAC,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,kBAAkB,IAAA,EAAM;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MAAG;AAAA,IAChG,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,GACnB,SAAA,CAAU,aAAA,CAA2B,KAAK,YAAY,CAAA,GACtD,SAAA,EAAU,CAAE,CAAC,CAAA;AACjB,IAAA,SAAA,EAAW,KAAA,EAAM;AAEjB,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,SAAA,CAAU,mBAAA,CAAoB,WAAW,aAAa,CAAA;AACtD,MAAA,IAAI,KAAK,uBAAA,KAA4B,KAAA,IAAS,IAAA,YAAgB,WAAA,OAAkB,KAAA,EAAM;AAAA,IACxF,CAAA;AAEA,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,SAAS,CAAA;AACrD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,EAAI;AAClC,IAAA,KAAA,EAAO,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,YAAA,EAAa;AAAA,EACnD;AAAA;AAAA,EAIA,cAAA,CAAe,QAAA,EAAkB,KAAA,GAAQ,sBAAA,EAAqC;AAC5E,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,QAAQ,CAAA,CAAA;AACxB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,gBAAA;AACjB,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACxB,QAAA,EAAU,UAAA;AAAA,MAAY,GAAA,EAAK,SAAA;AAAA,MAAW,IAAA,EAAM,GAAA;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MAAQ,OAAA,EAAS,UAAA;AAAA,MACzB,UAAA,EAAY,MAAA;AAAA,MAAQ,KAAA,EAAO,MAAA;AAAA,MAAQ,cAAA,EAAgB;AAAA,KACpD,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,MAAM;AAAE,MAAA,IAAA,CAAK,MAAM,GAAA,GAAM,GAAA;AAAA,IAAK,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,MAAM;AAAE,MAAA,IAAA,CAAK,MAAM,GAAA,GAAM,SAAA;AAAA,IAAW,CAAC,CAAA;AACnE,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,QAAA,CAAS,KAAK,UAAU,CAAA;AACzD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,GAAuB;AAAE,IAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AAAG,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EAAM;AAAA;AAAA;AAAA,EAK1E,UAAA,GAAyB;AACvB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,CAAA,CAAE,MAAA,YAAkB,OAAA,EAAS,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,CAAA,CAAE,MAAiB,CAAC,CAAA;AAAA,IAC1F,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,OAAO,CAAA;AAC5C,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,OAAO,MAAM;AAAE,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,OAAO,CAAA;AAAG,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IAAM,CAAA;AAAA,EAC/F;AAAA,EAEA,cAAc,OAAA,EAA4C;AACxD,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,EACvF;AAAA;AAAA,EAGA,YAAA,CAAa,OAAe,MAAA,EAAuB;AACjD,IAAA,QAAA,CAAS,QAAQ,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,QAAA,EAAM,MAAM,CAAA,CAAA,GAAK,KAAA;AAAA,EACrD;AAAA;AAAA,EAGA,aAAa,EAAA,EAAuB;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,GAAG,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,GAAA,EAAK,QAAA,EAAU,UAAU,IAAA,EAAM,eAAA,EAAiB,YAAY,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC3K;AAAA;AAAA,EAGA,YAAA,CAAa,SAAA,GAAyB,QAAA,CAAS,IAAA,EAAqB;AAClE,IAAA,OAAO,KAAA,CAAM,KAAK,SAAA,CAAU,gBAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,aAAa,EAAA,EAA0B;AACrC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,EAAE,CAAA;AACxC,IAAA,OAAO,KAAA,CAAM,YAAY,MAAA,IAAU,KAAA,CAAM,eAAe,QAAA,IAAY,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA,KAAM,MAAA;AAAA,EACzG;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAA,MAAW,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO,KAAM,MAAA,EAAO;AACvD,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAI,KAAK,cAAA,EAAgB,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,cAAc,CAAA;AAAA,EACtF;AACF;;;ACxIO,IAAM,oBAAN,MAAqC;AAAA,EAClC,UAAA,GAAiC,IAAA;AAAA,EACjC,SAAc,EAAC;AAAA,EACf,SAAA,GAAoC,IAAA;AAAA,EACpC,KAAA,GAA4C,EAAE,UAAA,EAAY,EAAA,EAAI,UAAU,CAAA,EAAE;AAAA,EAC1E,eAAA,GAAuC,IAAA;AAAA,EACvC,iBAA2D,EAAC;AAAA,EAC5D,QAAA,GAA+B,IAAA;AAAA,EAC/B,UAAA,GAAiC,IAAA;AAAA,EACjC,aAAA,GAAoC,IAAA;AAAA,EACpC,YAA2B,EAAC;AAAA,EAC5B,aAA+B,EAAE,KAAA,EAAO,GAAG,GAAA,EAAK,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,EAExE,MAAA,CAAO,SAAA,EAAwB,KAAA,EAAY,QAAA,EAA2B,IAAA,EAAgD;AACpH,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,IAAI,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAExC,IAAA,SAAA,CAAU,MAAM,QAAA,GAAW,MAAA;AAC3B,IAAA,SAAA,CAAU,MAAM,QAAA,GAAW,UAAA;AAE3B,IAAA,IAAA,CAAK,aAAa,OAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAQ;AAE7B,IAAA,SAAA,CAAU,WAAA,CAAY,KAAK,UAAU,CAAA;AACrC,IAAA,SAAA,CAAU,WAAA,CAAY,KAAK,QAAQ,CAAA;AACnC,IAAA,SAAA,CAAU,WAAA,CAAY,KAAK,aAAa,CAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAQ;AAClC,IAAA,SAAA,CAAU,gBAAA,CAAiB,UAAU,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAM,SAAA,CAAU,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAC3E,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,eAAA,IAAkB;AACvB,IAAA,IAAA,CAAK,YAAY,MAAA,EAAO;AACxB,IAAA,IAAA,CAAK,UAAU,MAAA,EAAO;AACtB,IAAA,IAAA,CAAK,eAAe,MAAA,EAAO;AAC3B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACpB;AAAA,EAEA,YAAY,KAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAA,CAAK,UAAA,CAAW,SAAA,GAAY,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,UAAA;AAAA,EACjD;AAAA,EAEA,eAAA,GAAoC;AAAE,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,UAAA,EAAW;AAAA,EAAG;AAAA,EAErE,cAAc,OAAA,EAAwD;AACpE,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM;AAAE,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,EACvF;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,QAAA,IAAY,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,aAAA,IAAiB,CAAC,KAAK,SAAA,EAAW;AAEtG,IAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,SAAA;AAClC,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,CAAW,YAAA;AACnC,IAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAS,GAAI,IAAA,CAAK,KAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,MAAA;AAE1B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,SAAA,GAAY,UAAU,CAAA,GAAI,QAAQ,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,MAAM,SAAA,GAAY,UAAA,IAAc,UAAU,CAAA,GAAI,QAAQ,CAAA;AAEvF,IAAA,IAAA,CAAK,aAAa,EAAE,KAAA,EAAO,GAAA,EAAK,SAAA,EAAW,QAAQ,UAAA,EAAW;AAC9D,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,UAAU,CAAC,CAAA;AAEnD,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAQ,UAAU,CAAA,EAAA,CAAA;AACpD,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,MAAA,GAAS,CAAA,EAAA,CAAI,KAAA,GAAQ,OAAO,UAAU,CAAA,EAAA,CAAA;AAE/D,IAAA,IAAA,CAAK,SAAS,SAAA,GAAY,EAAA;AAC1B,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA;AAC3C,MAAA,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,QAAA,CAAS,YAAY,EAAE,CAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAEA,SAAS,OAAA,GAAuB;AAC9B,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,EAAA,EAAA,CAAG,MAAM,MAAA,GAAS,GAAA;AAClB,EAAA,EAAA,CAAG,MAAM,aAAA,GAAgB,MAAA;AACzB,EAAA,OAAO,EAAA;AACT;;;AC7FA,SAAS,QAAW,GAAA,EAAe;AACjC,EAAA,MAAM,CAAA,GAAI,CAAC,GAAG,GAAG,CAAA;AACjB,EAAA,KAAA,IAAS,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,IAAK,IAAI,CAAA,CAAE,CAAA;AAC5C,IAAA,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,CAAA;AACT;AAEO,IAAM,sBAAN,MAA0B;AAAA,EACvB,UAAA,GAAiC,IAAA;AAAA,EACjC,MAAA,GAAS,EAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,IAAA,EAAW,KAAK,IAAA,IAAa,KAAA;AAAA,MAC7B,QAAA,EAAW,KAAK,QAAA,IAAa,IAAA;AAAA,MAC7B,MAAA,EAAW,KAAK,MAAA,IAAa,IAAA;AAAA,MAC7B,WAAW,IAAA,CAAK,SAAA,KAAc,IAAA,CAAK,IAAA,KAAS,WAAW,KAAA,GAAQ,IAAA,CAAA;AAAA,MAC/D,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAW,KAAK,KAAA,IAAa;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,OAAO,SAAA,EAA8B;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAClB,IAAA,IAAA,CAAK,WAAW,SAAA,GAAY,EAAA;AAC5B,IAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,MAAA,EAAQ,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,YAAA,EAAc,iBAAiB,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAA,CAAW,MAAM,OAAA,GAAU;AAAA;AAAA,kBAAA,EAEhB,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA,IAAA,CAAA;AAGrE,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAEA,QAAA,GAAmB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAEzC,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,EAAA;AACd,IAAA,IAAA,CAAK,MAAM,OAAA,IAAU;AACrB,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,CAAA;AACvB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AAAE,MAAA,IAAA,CAAK,WAAW,SAAA,GAAY,EAAA;AAAI,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IAAM;AAAA,EACjF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,SAAA,KAAc,KAAK,OAAA,CAAQ,IAAA,KAAS,QAAQ,CAAA,GAAI,EAAA,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,GACtB,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA;AAAA;AAAA,qBAAA,EAE1B,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA,iBAAA,CAEnD,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GACnB,wEAAwE,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,UAAU,MAAG,CAAA,OAAA,CAAA;AAElJ,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,qDAAA;AACxB,IAAA,OAAA,CAAQ,SAAA,GAAY,IAAA;AACpB,IAAA,IAAA,CAAK,UAAA,CAAW,YAAY,OAAO,CAAA;AAAA,EACrC;AAAA,EAEQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAI,MAAA,GAAS,CAAC,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAG,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,EAAU;AACzB,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,CAAC,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAA,EAAI,GAAG,CAAC,CAAA;AACjE,MAAA,MAAA,GAAS,CAAC,GAAG,WAAA,EAAa,GAAG,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAM,OAAA,GAAU,8DAAA;AAErB,IAAA,MAAM,WAAW,CAAC,EAAA,EAAY,UAC5B,CAAA,WAAA,EAAc,EAAE,WAAW,KAAK,CAAA;AAAA;AAAA,+CAAA,CAAA;AAIlC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAG9D,IAAA,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAA,KAAK;AAC9B,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,GAAG,QAAA,CAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAC1D,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACtB,CAAC,CAAA;AAGD,IAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,KAAS,YAAY,IAAA,CAAK,OAAA,CAAQ,SAAS,SAAA,EAAW;AACrE,MAAA,MAAM,SAAS,IAAA,CAAK,QAAA,CAAS,KAAK,QAAA,CAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAC/D,MAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,KAAK,QAAA,CAAS,QAAA,EAAU,SAAS,CAAC,CAAA;AAChE,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAExB,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,UAAK,QAAA,CAAS,SAAA,EAAW,MAAM,CAAC,CAAA;AAC9D,IAAA,OAAA,CAAQ,YAAA,CAAa,cAAc,WAAW,CAAA;AAC9C,IAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,MAAM;AACtC,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAA;AACrC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,MAAM,CAAA;AAChC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAExB,IAAA,IAAA,CAAK,UAAA,CAAW,YAAY,IAAI,CAAA;AAGhC,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU,wCAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,WAAA,GAAc,OAAA;AACvB,IAAA,QAAA,CAAS,KAAA,CAAM,OAAA,GAAU,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA,GAAI,uCAAA;AACvD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAErD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,IAAA,SAAA,CAAU,WAAA,GAAc,QAAA;AACxB,IAAA,SAAA,CAAU,KAAA,CAAM,OAAA,GAAU,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA,GAAI,uCAAA;AACxD,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM;AACxC,MAAA,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,MAAM,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAC9B,IAAA,SAAA,CAAU,YAAY,SAAS,CAAA;AAC/B,IAAA,IAAA,CAAK,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,EACvC;AAAA,EAEQ,QAAA,CAAS,OAAe,KAAA,EAAkC;AAChE,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,KAAA;AACpB,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAClC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,SAAA,KAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,KAAA,GAAQ,CAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,QAAQ,CAAA,GAAI,EAAA,CAAA;AAC/G,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,MAAA,EAAQ;AAClC,MAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,IAAU,UAAU,OAAA,EAAS,SAAA,CAAU,QAAQ,EAAE,CAAA;AAClE,MAAA,IAAA,CAAK,MAAA,IAAU,KAAA;AACf,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,MAAM,CAAA;AAChC,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAA8B;AACpC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,EAC7B;AACF","file":"index.js","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Reports a subscriber that threw during emission, without aborting delivery\n * to the remaining subscribers. Defaults to console.error; override to route\n * to your own logger (e.g. in a banking app where dropped events matter).\n */\nlet _onListenerError: (error: unknown) => void = (error) => {\n // eslint-disable-next-line no-console\n console.error('[joopjs] a subject subscriber threw during emission:', error);\n};\n\n/** Override how subscriber errors are reported during emission. */\nexport function setSubjectErrorHandler(handler: (error: unknown) => void): void {\n _onListenerError = handler;\n}\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n // Snapshot so a subscribe()/unsubscribe() triggered by a listener can't\n // disturb this emission, and isolate each listener so one that throws\n // doesn't deprive later subscribers of the value.\n const listeners = this._listeners.slice();\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n _onListenerError(error);\n }\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n try {\n listener(this._value);\n } catch (error) {\n _onListenerError(error);\n }\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopLoaderConfig {\n delayMs?: number;\n}\n\nexport class JoopLoaderService {\n private _count = 0;\n private _loading$ = new JoopBehaviorSubject<boolean>(false);\n private _delayTimer: ReturnType<typeof setTimeout> | null = null;\n private _cfg: JoopLoaderConfig;\n\n constructor(config: JoopLoaderConfig = {}) {\n this._cfg = config;\n }\n\n /** Increment loader counter — shows loader when count goes 0 → 1 */\n show(): void {\n this._count++;\n if (this._count === 1) {\n if (this._cfg.delayMs && this._cfg.delayMs > 0) {\n this._delayTimer = setTimeout(() => this._loading$.next(true), this._cfg.delayMs);\n } else {\n this._loading$.next(true);\n }\n }\n }\n\n /** Decrement loader counter — hides loader when count reaches 0 */\n hide(): void {\n if (this._count > 0) this._count--;\n if (this._count === 0) {\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n }\n\n /** Force-show regardless of count */\n forceShow(): void {\n this._count = Math.max(this._count, 1);\n this._loading$.next(true);\n }\n\n /** Force-hide and reset counter */\n reset(): void {\n this._count = 0;\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n\n isLoading(): boolean { return this._loading$.getValue(); }\n isLoading$() { return this._loading$.asObservable(); }\n get pendingCount(): number { return this._count; }\n}\n","import { JoopSubject, JoopBehaviorSubject } from '../events';\n\nexport type JoopAlertType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface JoopToastOptions {\n type?: JoopAlertType;\n duration?: number;\n position?: 'top' | 'bottom' | 'top-right' | 'bottom-right';\n closeable?: boolean;\n}\n\nexport interface JoopDialogButton {\n label: string;\n action: string;\n style?: 'primary' | 'secondary' | 'danger';\n}\n\nexport interface JoopDialogOptions {\n title?: string;\n message: string;\n type?: JoopAlertType;\n buttons?: JoopDialogButton[];\n closeable?: boolean;\n htmlContent?: boolean;\n}\n\nexport interface JoopInlineAlert {\n message: string;\n type: JoopAlertType;\n closeable?: boolean;\n}\n\nconst COLORS: Record<JoopAlertType, { bg: string; border: string; icon: string }> = {\n success: { bg: '#d4edda', border: '#28a745', icon: '✓' },\n error: { bg: '#f8d7da', border: '#dc3545', icon: '✕' },\n warning: { bg: '#fff3cd', border: '#ffc107', icon: '⚠' },\n info: { bg: '#d1ecf1', border: '#17a2b8', icon: 'ℹ' },\n};\n\nconst TOAST_CONTAINER_ID = '__joop_toast_container__';\nconst OVERLAY_ID = '__joop_dialog_overlay__';\n\nexport class JoopAlertService {\n private _inline$ = new JoopBehaviorSubject<JoopInlineAlert | null>(null);\n private _open$ = new JoopSubject<string>();\n\n inline$() { return this._inline$.asObservable(); }\n open$() { return this._open$.asObservable(); }\n\n showInline(data: JoopInlineAlert): void { this._inline$.next(data); }\n hideInline(): void { this._inline$.next(null); }\n\n toast(message: string, options: JoopToastOptions = {}): void {\n if (typeof document === 'undefined') return;\n const { type = 'info', duration = 3000, position = 'bottom', closeable = false } = options;\n const c = COLORS[type];\n\n const container = this._getToastContainer(position);\n const toast = document.createElement('div');\n toast.setAttribute('role', 'alert');\n Object.assign(toast.style, {\n background: c.bg,\n borderLeft: `4px solid ${c.border}`,\n padding: '12px 16px',\n marginBottom: '8px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n fontSize: '14px',\n maxWidth: '320px',\n opacity: '0',\n transition: 'opacity 0.2s ease',\n cursor: closeable ? 'pointer' : 'default',\n });\n\n const icon = document.createElement('span');\n icon.textContent = c.icon;\n icon.style.fontWeight = 'bold';\n\n const text = document.createElement('span');\n text.textContent = message;\n text.style.flex = '1';\n\n toast.appendChild(icon);\n toast.appendChild(text);\n\n if (closeable) {\n const btn = document.createElement('button');\n btn.textContent = '×';\n Object.assign(btn.style, { background: 'none', border: 'none', cursor: 'pointer', fontSize: '16px', padding: '0 4px' });\n btn.onclick = () => this._removeToast(toast);\n toast.appendChild(btn);\n }\n\n container.appendChild(toast);\n requestAnimationFrame(() => { toast.style.opacity = '1'; });\n\n if (duration > 0) {\n setTimeout(() => this._removeToast(toast), duration);\n }\n\n this._open$.next('toast');\n }\n\n dialog(options: JoopDialogOptions): Promise<string> {\n return new Promise(resolve => {\n if (typeof document === 'undefined') { resolve('close'); return; }\n\n const { title, message, type = 'info', closeable = true, htmlContent = false } = options;\n const buttons: JoopDialogButton[] = options.buttons ?? [{ label: 'OK', action: 'ok', style: 'primary' }];\n const c = COLORS[type];\n\n const overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n Object.assign(overlay.style, {\n position: 'fixed', inset: '0', background: 'rgba(0,0,0,0.5)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: '99999',\n });\n\n const dialog = document.createElement('div');\n Object.assign(dialog.style, {\n background: '#fff', borderRadius: '8px', padding: '24px', minWidth: '280px', maxWidth: '480px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.2)', position: 'relative',\n });\n\n if (title) {\n const h = document.createElement('h3');\n h.textContent = title;\n Object.assign(h.style, { margin: '0 0 12px', fontSize: '18px', color: c.border });\n dialog.appendChild(h);\n }\n\n const msg = document.createElement('div');\n if (htmlContent) { msg.innerHTML = message; } else { msg.textContent = message; }\n Object.assign(msg.style, { marginBottom: '20px', fontSize: '14px', lineHeight: '1.5' });\n dialog.appendChild(msg);\n\n const btnRow = document.createElement('div');\n Object.assign(btnRow.style, { display: 'flex', gap: '8px', justifyContent: 'flex-end' });\n\n const finish = (action: string) => { overlay.remove(); resolve(action); };\n\n for (const btn of buttons) {\n const el = document.createElement('button');\n el.textContent = btn.label;\n const isPrimary = btn.style === 'primary';\n const isDanger = btn.style === 'danger';\n Object.assign(el.style, {\n padding: '8px 16px', borderRadius: '4px', cursor: 'pointer', fontSize: '14px',\n border: 'none',\n background: isDanger ? '#dc3545' : isPrimary ? c.border : '#e9ecef',\n color: isPrimary || isDanger ? '#fff' : '#333',\n });\n el.onclick = () => finish(btn.action);\n btnRow.appendChild(el);\n }\n dialog.appendChild(btnRow);\n\n if (closeable) {\n const closeBtn = document.createElement('button');\n closeBtn.textContent = '×';\n Object.assign(closeBtn.style, {\n position: 'absolute', top: '12px', right: '16px', background: 'none', border: 'none',\n cursor: 'pointer', fontSize: '20px', color: '#666',\n });\n closeBtn.onclick = () => finish('close');\n overlay.addEventListener('click', (e) => { if (e.target === overlay) finish('close'); });\n dialog.appendChild(closeBtn);\n }\n\n overlay.appendChild(dialog);\n document.body.appendChild(overlay);\n this._open$.next('dialog');\n });\n }\n\n dismiss(): void {\n document.getElementById(OVERLAY_ID)?.remove();\n document.getElementById(TOAST_CONTAINER_ID)?.remove();\n this._inline$.next(null);\n }\n\n private _getToastContainer(position: string): HTMLElement {\n const existing = document.getElementById(TOAST_CONTAINER_ID);\n if (existing) return existing;\n const container = document.createElement('div');\n container.id = TOAST_CONTAINER_ID;\n const top = position.startsWith('top');\n const right = position.endsWith('right');\n Object.assign(container.style, {\n position: 'fixed',\n [top ? 'top' : 'bottom']: '16px',\n [right ? 'right' : 'left']: right ? '16px' : '50%',\n transform: right ? 'none' : 'translateX(-50%)',\n zIndex: '99998',\n display: 'flex',\n flexDirection: top ? 'column' : 'column-reverse',\n alignItems: right ? 'flex-end' : 'center',\n });\n document.body.appendChild(container);\n return container;\n }\n\n private _removeToast(el: HTMLElement): void {\n el.style.opacity = '0';\n setTimeout(() => el.remove(), 200);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopPageState {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n hasPrev: boolean;\n hasNext: boolean;\n from: number;\n to: number;\n}\n\nexport class JoopPaginationService {\n private _state$ = new JoopBehaviorSubject<JoopPageState>(this._compute(1, 10, 0));\n\n private _compute(page: number, pageSize: number, total: number): JoopPageState {\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const clamped = Math.min(Math.max(1, page), totalPages);\n const from = total === 0 ? 0 : (clamped - 1) * pageSize + 1;\n const to = Math.min(clamped * pageSize, total);\n return { page: clamped, pageSize, total, totalPages, hasPrev: clamped > 1, hasNext: clamped < totalPages, from, to };\n }\n\n private _update(patch: Partial<{ page: number; pageSize: number; total: number }>): void {\n const { page, pageSize, total } = this._state$.getValue();\n const next = { page, pageSize, total, ...patch };\n this._state$.next(this._compute(next.page, next.pageSize, next.total));\n }\n\n setTotal(total: number): void { this._update({ total, page: 1 }); }\n setPage(page: number): void { this._update({ page }); }\n setPageSize(size: number): void { this._update({ pageSize: size, page: 1 }); }\n\n nextPage(): void { const s = this._state$.getValue(); if (s.hasNext) this._update({ page: s.page + 1 }); }\n prevPage(): void { const s = this._state$.getValue(); if (s.hasPrev) this._update({ page: s.page - 1 }); }\n firstPage(): void { this._update({ page: 1 }); }\n lastPage(): void { this._update({ page: this._state$.getValue().totalPages }); }\n\n getState(): JoopPageState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n\n /** Returns page numbers for pagination UI — with ellipsis as -1 */\n getPages(maxVisible = 7): number[] {\n const { page, totalPages } = this._state$.getValue();\n if (totalPages <= maxVisible) return Array.from({ length: totalPages }, (_, i) => i + 1);\n\n const pages: number[] = [];\n const half = Math.floor(maxVisible / 2);\n let start = Math.max(2, page - half);\n let end = Math.min(totalPages - 1, page + half);\n\n if (page - half < 2) end = Math.min(totalPages - 1, maxVisible - 1);\n if (page + half > totalPages - 1) start = Math.max(2, totalPages - maxVisible + 2);\n\n pages.push(1);\n if (start > 2) pages.push(-1); // ellipsis\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < totalPages - 1) pages.push(-1); // ellipsis\n pages.push(totalPages);\n return pages;\n }\n\n reset(): void { this._state$.next(this._compute(1, this._state$.getValue().pageSize, 0)); }\n}\n","export interface JoopPrintOptions {\n styles?: string;\n title?: string;\n bodyClass?: string;\n}\n\nexport class JoopPrintService {\n /** Print the current page */\n print(): void { window.print(); }\n\n /** Print a specific element by ID or reference */\n printElement(elementOrId: HTMLElement | string, options: JoopPrintOptions = {}): void {\n const el = typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId;\n if (!el) return;\n this.printHtml(el.outerHTML, options);\n }\n\n /** Open a new window with custom HTML and print it */\n printHtml(html: string, options: JoopPrintOptions = {}): void {\n const win = window.open('', '_blank', 'width=800,height=600');\n if (!win) return;\n\n const { styles = '', title = document.title, bodyClass = '' } = options;\n const defaultStyles = `\n body { font-family: Arial, sans-serif; font-size: 12pt; margin: 20mm; }\n @media print { body { margin: 0; } }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: left; }\n th { background: #f5f5f5; font-weight: bold; }\n `;\n\n win.document.write(`<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>${title}</title>\n <style>${defaultStyles}${styles}</style>\n</head>\n<body class=\"${bodyClass}\">${html}</body>\n</html>`);\n win.document.close();\n win.focus();\n setTimeout(() => { win.print(); win.close(); }, 300);\n }\n\n /** Print a plain-text receipt in a monospace layout */\n printReceipt(lines: string[], options: JoopPrintOptions = {}): void {\n const html = `<pre style=\"font-family:monospace;font-size:11pt;white-space:pre-wrap\">${lines.join('\\n')}</pre>`;\n this.printHtml(html, { ...options, styles: `${options.styles ?? ''}body{margin:10mm;}` });\n }\n\n /** Build a receipt-style text block for printing */\n buildReceiptText(\n title: string,\n rows: Array<[label: string, value: string]>,\n width = 42,\n ): string[] {\n const line = '─'.repeat(width);\n const center = (s: string) => s.padStart(Math.floor((width + s.length) / 2)).padEnd(width);\n const row = ([l, v]: [string, string]) => `${l.padEnd(width - v.length - 2)} ${v}`;\n return [center(title), line, ...rows.map(row), line];\n }\n}\n","export type JoopAriaLivePoliteness = 'assertive' | 'polite' | 'off';\n\nexport interface JoopFocusTrapOptions {\n initialFocus?: string; // CSS selector\n returnFocusOnDeactivate?: boolean;\n}\n\nexport class JoopA11yService {\n private _liveRegions = new Map<JoopAriaLivePoliteness, HTMLElement>();\n private _trapStack: Array<{ el: HTMLElement; prev: Element | null; release: () => void }> = [];\n private _skipLink: HTMLElement | null = null;\n private _focusHandlers: Array<(el: Element) => void> = [];\n private _focusListener: ((e: FocusEvent) => void) | null = null;\n\n // ── ARIA Live Regions ────────────────────────────────────────────────────\n\n announce(message: string, politeness: JoopAriaLivePoliteness = 'polite'): void {\n const region = this._getOrCreateLiveRegion(politeness);\n // Clear and re-set to force screen reader re-announcement\n region.textContent = '';\n setTimeout(() => { region.textContent = message; }, 50);\n }\n\n private _getOrCreateLiveRegion(politeness: JoopAriaLivePoliteness): HTMLElement {\n if (!this._liveRegions.has(politeness)) {\n const el = document.createElement('div');\n el.setAttribute('aria-live', politeness);\n el.setAttribute('aria-atomic', 'true');\n el.setAttribute('aria-relevant', 'additions text');\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n document.body.appendChild(el);\n this._liveRegions.set(politeness, el);\n }\n return this._liveRegions.get(politeness)!;\n }\n\n clearAnnouncements(): void {\n for (const el of this._liveRegions.values()) el.textContent = '';\n }\n\n // ── Focus Trap ───────────────────────────────────────────────────────────\n\n trapFocus(container: HTMLElement, opts: JoopFocusTrapOptions = {}): () => void {\n const prev = document.activeElement;\n const focusable = (): NodeListOf<HTMLElement> =>\n container.querySelectorAll<HTMLElement>('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])');\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const elements = Array.from(focusable());\n if (!elements.length) { e.preventDefault(); return; }\n const first = elements[0], last = elements[elements.length - 1];\n if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n };\n\n container.addEventListener('keydown', handleKeydown);\n\n const initialEl = opts.initialFocus\n ? container.querySelector<HTMLElement>(opts.initialFocus)\n : focusable()[0];\n initialEl?.focus();\n\n const release = () => {\n container.removeEventListener('keydown', handleKeydown);\n if (opts.returnFocusOnDeactivate !== false && prev instanceof HTMLElement) prev.focus();\n };\n\n this._trapStack.push({ el: container, prev, release });\n return release;\n }\n\n releaseFocus(): void {\n const entry = this._trapStack.pop();\n entry?.release();\n }\n\n releaseAllTraps(): void {\n while (this._trapStack.length) this.releaseFocus();\n }\n\n // ── Skip Link ────────────────────────────────────────────────────────────\n\n createSkipLink(targetId: string, label = 'Skip to main content'): HTMLElement {\n const link = document.createElement('a');\n link.href = `#${targetId}`;\n link.textContent = label;\n link.className = 'joop-skip-link';\n Object.assign(link.style, {\n position: 'absolute', top: '-9999px', left: '0',\n zIndex: '9999', padding: '8px 16px',\n background: '#fff', color: '#000', textDecoration: 'underline',\n });\n link.addEventListener('focus', () => { link.style.top = '0'; });\n link.addEventListener('blur', () => { link.style.top = '-9999px'; });\n document.body.insertBefore(link, document.body.firstChild);\n this._skipLink = link;\n return link;\n }\n\n removeSkipLink(): void { this._skipLink?.remove(); this._skipLink = null; }\n\n // ── Keyboard helpers ─────────────────────────────────────────────────────\n\n /** Start tracking focus changes */\n trackFocus(): () => void {\n const handler = (e: FocusEvent) => {\n if (e.target instanceof Element) this._focusHandlers.forEach(h => h(e.target as Element));\n };\n document.addEventListener('focusin', handler);\n this._focusListener = handler;\n return () => { document.removeEventListener('focusin', handler); this._focusListener = null; };\n }\n\n onFocusChange(handler: (el: Element) => void): () => void {\n this._focusHandlers.push(handler);\n return () => { this._focusHandlers = this._focusHandlers.filter(h => h !== handler); };\n }\n\n /** Set visible page title + meta description */\n setPageTitle(title: string, suffix?: string): void {\n document.title = suffix ? `${title} — ${suffix}` : title;\n }\n\n /** Make an element visually hidden but accessible */\n visuallyHide(el: HTMLElement): void {\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n }\n\n /** Get all focusable elements within a container */\n getFocusable(container: HTMLElement = document.body): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ));\n }\n\n /** Check whether an element is visible and not hidden from accessibility */\n isAccessible(el: HTMLElement): boolean {\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && style.visibility !== 'hidden' && el.getAttribute('aria-hidden') !== 'true';\n }\n\n destroy(): void {\n for (const el of this._liveRegions.values()) el.remove();\n this._liveRegions.clear();\n this.releaseAllTraps();\n this.removeSkipLink();\n if (this._focusListener) document.removeEventListener('focusin', this._focusListener);\n }\n}\n","export interface JoopVirtualScrollOptions {\n itemHeight: number;\n overscan?: number; // extra rows to render above/below visible area\n}\n\nexport interface JoopVirtualRange {\n start: number;\n end: number;\n offsetTop: number;\n}\n\nexport type JoopRenderFn<T> = (item: T, index: number) => HTMLElement;\n\nexport class JoopVirtualScroll<T = unknown> {\n private _container: HTMLElement | null = null;\n private _items: T[] = [];\n private _renderFn: JoopRenderFn<T> | null = null;\n private _opts: Required<JoopVirtualScrollOptions> = { itemHeight: 40, overscan: 3 };\n private _scrollListener: (() => void) | null = null;\n private _rangeHandlers: Array<(range: JoopVirtualRange) => void> = [];\n private _innerEl: HTMLElement | null = null;\n private _spacerTop: HTMLElement | null = null;\n private _spacerBottom: HTMLElement | null = null;\n private _rendered: HTMLElement[] = [];\n private _lastRange: JoopVirtualRange = { start: 0, end: 0, offsetTop: 0 };\n\n attach(container: HTMLElement, items: T[], renderFn: JoopRenderFn<T>, opts?: Partial<JoopVirtualScrollOptions>): void {\n this.detach();\n this._container = container;\n this._items = items;\n this._renderFn = renderFn;\n if (opts) Object.assign(this._opts, opts);\n\n container.style.overflow = 'auto';\n container.style.position = 'relative';\n\n this._spacerTop = _spacer();\n this._innerEl = document.createElement('div');\n this._spacerBottom = _spacer();\n\n container.appendChild(this._spacerTop);\n container.appendChild(this._innerEl);\n container.appendChild(this._spacerBottom);\n\n const render = () => this._render();\n container.addEventListener('scroll', render);\n this._scrollListener = () => container.removeEventListener('scroll', render);\n this._render();\n }\n\n detach(): void {\n this._scrollListener?.();\n this._spacerTop?.remove();\n this._innerEl?.remove();\n this._spacerBottom?.remove();\n this._scrollListener = null;\n this._container = null;\n this._rendered = [];\n }\n\n updateItems(items: T[]): void {\n this._items = items;\n this._render();\n }\n\n scrollTo(index: number): void {\n if (!this._container) return;\n this._container.scrollTop = index * this._opts.itemHeight;\n }\n\n getVisibleRange(): JoopVirtualRange { return { ...this._lastRange }; }\n\n onRangeChange(handler: (range: JoopVirtualRange) => void): () => void {\n this._rangeHandlers.push(handler);\n return () => { this._rangeHandlers = this._rangeHandlers.filter(h => h !== handler); };\n }\n\n private _render(): void {\n if (!this._container || !this._innerEl || !this._spacerTop || !this._spacerBottom || !this._renderFn) return;\n\n const scrollTop = this._container.scrollTop;\n const viewHeight = this._container.clientHeight;\n const { itemHeight, overscan } = this._opts;\n const total = this._items.length;\n\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const end = Math.min(total, Math.ceil((scrollTop + viewHeight) / itemHeight) + overscan);\n\n this._lastRange = { start, end, offsetTop: start * itemHeight };\n this._rangeHandlers.forEach(h => h(this._lastRange));\n\n this._spacerTop.style.height = `${start * itemHeight}px`;\n this._spacerBottom.style.height = `${(total - end) * itemHeight}px`;\n\n this._innerEl.innerHTML = '';\n this._rendered = [];\n for (let i = start; i < end; i++) {\n const el = this._renderFn(this._items[i], i);\n el.style.height = `${itemHeight}px`;\n this._innerEl.appendChild(el);\n this._rendered.push(el);\n }\n }\n}\n\nfunction _spacer(): HTMLElement {\n const el = document.createElement('div');\n el.style.height = '0';\n el.style.pointerEvents = 'none';\n return el;\n}\n","export type JoopKeyboardMode = 'pin' | 'amount' | 'otp' | 'numeric';\n\nexport interface JoopBankingKeyboardConfig {\n mode?: JoopKeyboardMode;\n scramble?: boolean; // shuffle key layout on each render, default true\n haptic?: boolean; // trigger vibration on key press, default true\n maskInput?: boolean; // show dots instead of digits, default true for pin/otp\n maxLength?: number;\n theme?: 'light' | 'dark';\n}\n\nexport interface JoopBankingKeyboardOptions extends JoopBankingKeyboardConfig {\n onInput?: (value: string) => void;\n onSubmit?: (value: string) => void;\n onClear?: () => void;\n}\n\nfunction shuffle<T>(arr: T[]): T[] {\n const a = [...arr];\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]];\n }\n return a;\n}\n\nexport class JoopBankingKeyboard {\n private _container: HTMLElement | null = null;\n private _value = '';\n private readonly _config: Required<Omit<JoopBankingKeyboardConfig, 'maxLength'>> & { maxLength?: number };\n private readonly _opts: JoopBankingKeyboardOptions;\n\n constructor(opts: JoopBankingKeyboardOptions = {}) {\n this._opts = opts;\n this._config = {\n mode: opts.mode ?? 'pin',\n scramble: opts.scramble ?? true,\n haptic: opts.haptic ?? true,\n maskInput: opts.maskInput ?? (opts.mode === 'amount' ? false : true),\n maxLength: opts.maxLength,\n theme: opts.theme ?? 'light',\n };\n }\n\n render(container: HTMLElement): void {\n this._container = container;\n this._container.innerHTML = '';\n this._container.setAttribute('role', 'application');\n this._container.setAttribute('aria-label', 'Secure keyboard');\n this._container.style.cssText = `\n display: grid; gap: 8px; padding: 12px;\n background: ${this._config.theme === 'dark' ? '#1a1a2e' : '#f8f9fa'};\n border-radius: 12px; user-select: none; touch-action: manipulation;\n `;\n this._renderDisplay();\n this._renderKeys();\n }\n\n getValue(): string { return this._value; }\n\n clear(): void {\n this._value = '';\n this._opts.onClear?.();\n this._opts.onInput?.('');\n this._refresh();\n }\n\n destroy(): void {\n if (this._container) { this._container.innerHTML = ''; this._container = null; }\n }\n\n private _renderDisplay(): void {\n if (!this._container) return;\n const display = document.createElement('div');\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : 16);\n const dots = this._config.maskInput\n ? Array.from({ length: maxLen }, (_, i) => `<span style=\"\n display:inline-block; width:12px; height:12px; border-radius:50%; margin:0 4px;\n background:${i < this._value.length ? '#2563eb' : '#d1d5db'};\n transition:background .15s;\n \"></span>`).join('')\n : `<span style=\"font-size:24px;font-weight:700;letter-spacing:4px;color:${this._config.theme === 'dark' ? '#fff' : '#111'}\">${this._value || ' '}</span>`;\n\n display.style.cssText = 'text-align:center; padding:12px 0; min-height:40px;';\n display.innerHTML = dots;\n this._container.appendChild(display);\n }\n\n private _renderKeys(): void {\n if (!this._container) return;\n let digits = ['1','2','3','4','5','6','7','8','9','0'];\n if (this._config.scramble) {\n const numericPart = shuffle(['1','2','3','4','5','6','7','8','9']);\n digits = [...numericPart, '0'];\n }\n\n const grid = document.createElement('div');\n grid.style.cssText = 'display:grid; grid-template-columns: repeat(3,1fr); gap:8px;';\n\n const btnStyle = (bg: string, color: string) =>\n `background:${bg}; color:${color}; border:none; border-radius:10px; font-size:22px;\n font-weight:600; padding:16px; cursor:pointer; transition:opacity .1s;\n -webkit-tap-highlight-color:transparent;`;\n\n const keyColor = this._config.theme === 'dark' ? '#2a2a3e' : '#ffffff';\n const textColor = this._config.theme === 'dark' ? '#e2e8f0' : '#1a202c';\n\n // Render digit keys\n digits.slice(0, 9).forEach(d => {\n const btn = this._makeKey(d, btnStyle(keyColor, textColor));\n grid.appendChild(btn);\n });\n\n // Bottom row: clear | 0 | backspace\n if (this._config.mode === 'amount' || this._config.mode === 'numeric') {\n const decBtn = this._makeKey('.', btnStyle(keyColor, textColor));\n grid.appendChild(decBtn);\n } else {\n grid.appendChild(this._makeSpacer());\n }\n\n const zeroBtn = this._makeKey('0', btnStyle(keyColor, textColor));\n grid.appendChild(zeroBtn);\n\n const backBtn = this._makeKey('⌫', btnStyle('#ef4444', '#fff'));\n backBtn.setAttribute('aria-label', 'Backspace');\n backBtn.addEventListener('click', () => {\n this._value = this._value.slice(0, -1);\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n grid.appendChild(backBtn);\n\n this._container.appendChild(grid);\n\n // Submit / clear row\n const actionRow = document.createElement('div');\n actionRow.style.cssText = 'display:flex; gap:8px; margin-top:4px;';\n\n const clearBtn = document.createElement('button');\n clearBtn.textContent = 'Clear';\n clearBtn.style.cssText = btnStyle('#6b7280', '#fff') + 'flex:1; font-size:14px; padding:12px;';\n clearBtn.addEventListener('click', () => this.clear());\n\n const submitBtn = document.createElement('button');\n submitBtn.textContent = 'Submit';\n submitBtn.style.cssText = btnStyle('#2563eb', '#fff') + 'flex:2; font-size:14px; padding:12px;';\n submitBtn.addEventListener('click', () => {\n this._opts.onSubmit?.(this._value);\n });\n\n actionRow.appendChild(clearBtn);\n actionRow.appendChild(submitBtn);\n this._container.appendChild(actionRow);\n }\n\n private _makeKey(label: string, style: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.textContent = label;\n btn.style.cssText = style;\n btn.addEventListener('click', () => {\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : (this._config.mode === 'otp' ? 6 : 16));\n if (this._value.length >= maxLen) return;\n if (this._config.haptic && navigator.vibrate) navigator.vibrate(10);\n this._value += label;\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n return btn;\n }\n\n private _makeSpacer(): HTMLDivElement {\n const el = document.createElement('div');\n return el;\n }\n\n private _refresh(): void {\n if (!this._container) return;\n this.render(this._container);\n }\n}\n"]}
package/dist/ui/index.mjs CHANGED
@@ -1,4 +1,7 @@
1
1
  // src/events/index.ts
2
+ var _onListenerError = (error) => {
3
+ console.error("[joopjs] a subject subscriber threw during emission:", error);
4
+ };
2
5
  var JoopSubject = class {
3
6
  _listeners = [];
4
7
  subscribe(listener) {
@@ -8,8 +11,13 @@ var JoopSubject = class {
8
11
  };
9
12
  }
10
13
  next(value) {
11
- for (const listener of this._listeners) {
12
- listener(value);
14
+ const listeners = this._listeners.slice();
15
+ for (const listener of listeners) {
16
+ try {
17
+ listener(value);
18
+ } catch (error) {
19
+ _onListenerError(error);
20
+ }
13
21
  }
14
22
  }
15
23
  asObservable() {
@@ -30,7 +38,11 @@ var JoopBehaviorSubject = class extends JoopSubject {
30
38
  super.next(value);
31
39
  }
32
40
  subscribe(listener) {
33
- listener(this._value);
41
+ try {
42
+ listener(this._value);
43
+ } catch (error) {
44
+ _onListenerError(error);
45
+ }
34
46
  return super.subscribe(listener);
35
47
  }
36
48
  asObservable() {