@caperjs/core 0.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 (600) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +62 -0
  3. package/cli/add.mjs +197 -0
  4. package/cli/audio/cc.mjs +128 -0
  5. package/cli/audio/index.mjs +42 -0
  6. package/cli/audio/utils.mjs +56 -0
  7. package/cli/create-caper.mjs +8 -0
  8. package/cli/create.mjs +351 -0
  9. package/cli/install-peerdeps.mjs +57 -0
  10. package/cli/update.mjs +9 -0
  11. package/cli/utils.mjs +81 -0
  12. package/cli/vite.mjs +55 -0
  13. package/cli/voiceover/generateVoiceoverCSV.mjs +158 -0
  14. package/cli/voiceover/index.mjs +1 -0
  15. package/cli.mjs +157 -0
  16. package/client.d.ts +7 -0
  17. package/config/assetpack.mjs +212 -0
  18. package/config/tsconfig.base.json +28 -0
  19. package/config/vite.mjs +2464 -0
  20. package/extras/css/accessibility.css +9 -0
  21. package/extras/css/fullscreen.css +28 -0
  22. package/extras/css/loader.css +67 -0
  23. package/extras/llms.txt +1602 -0
  24. package/lib/CaptionsPlugin-Dc8fIrjy.js +277 -0
  25. package/lib/CaptionsPlugin-Dc8fIrjy.js.map +1 -0
  26. package/lib/DataAdapter-BY2114sp.js +84 -0
  27. package/lib/DataAdapter-BY2114sp.js.map +1 -0
  28. package/lib/DebugRenderer-BJMLILqI.js +1385 -0
  29. package/lib/DebugRenderer-BJMLILqI.js.map +1 -0
  30. package/lib/DevToolsPlugin-wQ5rOkn0.js +31 -0
  31. package/lib/DevToolsPlugin-wQ5rOkn0.js.map +1 -0
  32. package/lib/GSAPPlugin-DHhSZKv8.js +350 -0
  33. package/lib/GSAPPlugin-DHhSZKv8.js.map +1 -0
  34. package/lib/LayoutPlugin-B-DF9SYM.js +1271 -0
  35. package/lib/LayoutPlugin-B-DF9SYM.js.map +1 -0
  36. package/lib/SpinePlugin-Dz_3dljz.js +6077 -0
  37. package/lib/SpinePlugin-Dz_3dljz.js.map +1 -0
  38. package/lib/StatsPlugin-Cg82JMBD.js +70 -0
  39. package/lib/StatsPlugin-Cg82JMBD.js.map +1 -0
  40. package/lib/VoiceOverPlugin-BR3ImT8C.js +114 -0
  41. package/lib/VoiceOverPlugin-BR3ImT8C.js.map +1 -0
  42. package/lib/caper.mjs +1233 -0
  43. package/lib/caper.mjs.map +1 -0
  44. package/lib/core/Application.d.ts +268 -0
  45. package/lib/core/Application.d.ts.map +1 -0
  46. package/lib/core/config.d.ts +39 -0
  47. package/lib/core/config.d.ts.map +1 -0
  48. package/lib/core/create.d.ts +41 -0
  49. package/lib/core/create.d.ts.map +1 -0
  50. package/lib/core/globals.d.ts +51 -0
  51. package/lib/core/globals.d.ts.map +1 -0
  52. package/lib/core/index.d.ts +7 -0
  53. package/lib/core/index.d.ts.map +1 -0
  54. package/lib/core/interfaces/IApplication.d.ts +566 -0
  55. package/lib/core/interfaces/IApplication.d.ts.map +1 -0
  56. package/lib/core/interfaces/IApplicationOptions.d.ts +65 -0
  57. package/lib/core/interfaces/IApplicationOptions.d.ts.map +1 -0
  58. package/lib/core/interfaces/ICoreFunctions.d.ts +49 -0
  59. package/lib/core/interfaces/ICoreFunctions.d.ts.map +1 -0
  60. package/lib/core/interfaces/ICoreSignals.d.ts +57 -0
  61. package/lib/core/interfaces/ICoreSignals.d.ts.map +1 -0
  62. package/lib/core/interfaces/IStorageCapability.d.ts +20 -0
  63. package/lib/core/interfaces/IStorageCapability.d.ts.map +1 -0
  64. package/lib/core/interfaces/IStorageCapability.test.d.ts +2 -0
  65. package/lib/core/interfaces/IStorageCapability.test.d.ts.map +1 -0
  66. package/lib/core/interfaces/index.d.ts +7 -0
  67. package/lib/core/interfaces/index.d.ts.map +1 -0
  68. package/lib/core/registries.d.ts +8 -0
  69. package/lib/core/registries.d.ts.map +1 -0
  70. package/lib/core/types.d.ts +12 -0
  71. package/lib/core/types.d.ts.map +1 -0
  72. package/lib/display/AnimatedSprite.d.ts +40 -0
  73. package/lib/display/AnimatedSprite.d.ts.map +1 -0
  74. package/lib/display/Camera.d.ts +102 -0
  75. package/lib/display/Camera.d.ts.map +1 -0
  76. package/lib/display/Container.d.ts +115 -0
  77. package/lib/display/Container.d.ts.map +1 -0
  78. package/lib/display/Entity.d.ts +46 -0
  79. package/lib/display/Entity.d.ts.map +1 -0
  80. package/lib/display/ParticleContainer.d.ts +58 -0
  81. package/lib/display/ParticleContainer.d.ts.map +1 -0
  82. package/lib/display/Scene.d.ts +250 -0
  83. package/lib/display/Scene.d.ts.map +1 -0
  84. package/lib/display/SceneTransition.d.ts +41 -0
  85. package/lib/display/SceneTransition.d.ts.map +1 -0
  86. package/lib/display/SpineAnimation.d.ts +76 -0
  87. package/lib/display/SpineAnimation.d.ts.map +1 -0
  88. package/lib/display/Svg.d.ts +5 -0
  89. package/lib/display/Svg.d.ts.map +1 -0
  90. package/lib/display/index.d.ts +10 -0
  91. package/lib/display/index.d.ts.map +1 -0
  92. package/lib/env.d.ts +6 -0
  93. package/lib/hello.d.ts +2 -0
  94. package/lib/hello.d.ts.map +1 -0
  95. package/lib/index.d.ts +15 -0
  96. package/lib/index.d.ts.map +1 -0
  97. package/lib/mixins/animated.d.ts +53 -0
  98. package/lib/mixins/animated.d.ts.map +1 -0
  99. package/lib/mixins/factory/Factory.d.ts +8 -0
  100. package/lib/mixins/factory/Factory.d.ts.map +1 -0
  101. package/lib/mixins/factory/const.d.ts +67 -0
  102. package/lib/mixins/factory/const.d.ts.map +1 -0
  103. package/lib/mixins/factory/index.d.ts +8 -0
  104. package/lib/mixins/factory/index.d.ts.map +1 -0
  105. package/lib/mixins/factory/methods.d.ts +3 -0
  106. package/lib/mixins/factory/methods.d.ts.map +1 -0
  107. package/lib/mixins/factory/props.d.ts +160 -0
  108. package/lib/mixins/factory/props.d.ts.map +1 -0
  109. package/lib/mixins/factory/registry.d.ts +27 -0
  110. package/lib/mixins/factory/registry.d.ts.map +1 -0
  111. package/lib/mixins/factory/registry.test.d.ts +2 -0
  112. package/lib/mixins/factory/registry.test.d.ts.map +1 -0
  113. package/lib/mixins/factory/schema.d.ts +71 -0
  114. package/lib/mixins/factory/schema.d.ts.map +1 -0
  115. package/lib/mixins/factory/ui-registry.d.ts +20 -0
  116. package/lib/mixins/factory/ui-registry.d.ts.map +1 -0
  117. package/lib/mixins/factory/utils.d.ts +11 -0
  118. package/lib/mixins/factory/utils.d.ts.map +1 -0
  119. package/lib/mixins/focus.d.ts +15 -0
  120. package/lib/mixins/focus.d.ts.map +1 -0
  121. package/lib/mixins/index.d.ts +6 -0
  122. package/lib/mixins/index.d.ts.map +1 -0
  123. package/lib/mixins/interaction.d.ts +20 -0
  124. package/lib/mixins/interaction.d.ts.map +1 -0
  125. package/lib/mixins/signals.d.ts +15 -0
  126. package/lib/mixins/signals.d.ts.map +1 -0
  127. package/lib/plugins/AssetsPlugin.d.ts +79 -0
  128. package/lib/plugins/AssetsPlugin.d.ts.map +1 -0
  129. package/lib/plugins/DataAdapter.d.ts +95 -0
  130. package/lib/plugins/DataAdapter.d.ts.map +1 -0
  131. package/lib/plugins/DevToolsPlugin.d.ts +97 -0
  132. package/lib/plugins/DevToolsPlugin.d.ts.map +1 -0
  133. package/lib/plugins/FullScreenPlugin.d.ts +240 -0
  134. package/lib/plugins/FullScreenPlugin.d.ts.map +1 -0
  135. package/lib/plugins/GSAPPlugin.d.ts +634 -0
  136. package/lib/plugins/GSAPPlugin.d.ts.map +1 -0
  137. package/lib/plugins/KeyboardPlugin.d.ts +53 -0
  138. package/lib/plugins/KeyboardPlugin.d.ts.map +1 -0
  139. package/lib/plugins/LayoutPlugin.d.ts +100 -0
  140. package/lib/plugins/LayoutPlugin.d.ts.map +1 -0
  141. package/lib/plugins/LookupPlugin.d.ts +223 -0
  142. package/lib/plugins/LookupPlugin.d.ts.map +1 -0
  143. package/lib/plugins/Plugin.d.ts +132 -0
  144. package/lib/plugins/Plugin.d.ts.map +1 -0
  145. package/lib/plugins/Plugin.test.d.ts +2 -0
  146. package/lib/plugins/Plugin.test.d.ts.map +1 -0
  147. package/lib/plugins/PopupManagerPlugin.d.ts +108 -0
  148. package/lib/plugins/PopupManagerPlugin.d.ts.map +1 -0
  149. package/lib/plugins/ResizerPlugin.d.ts +62 -0
  150. package/lib/plugins/ResizerPlugin.d.ts.map +1 -0
  151. package/lib/plugins/SceneManagerPlugin.d.ts +122 -0
  152. package/lib/plugins/SceneManagerPlugin.d.ts.map +1 -0
  153. package/lib/plugins/StatsPlugin.d.ts +8 -0
  154. package/lib/plugins/StatsPlugin.d.ts.map +1 -0
  155. package/lib/plugins/TimerPlugin.d.ts +401 -0
  156. package/lib/plugins/TimerPlugin.d.ts.map +1 -0
  157. package/lib/plugins/WebEventsPlugin.d.ts +60 -0
  158. package/lib/plugins/WebEventsPlugin.d.ts.map +1 -0
  159. package/lib/plugins/actions/ActionsPlugin.d.ts +39 -0
  160. package/lib/plugins/actions/ActionsPlugin.d.ts.map +1 -0
  161. package/lib/plugins/actions/constants.d.ts +52 -0
  162. package/lib/plugins/actions/constants.d.ts.map +1 -0
  163. package/lib/plugins/actions/index.d.ts +5 -0
  164. package/lib/plugins/actions/index.d.ts.map +1 -0
  165. package/lib/plugins/actions/methods.d.ts +11 -0
  166. package/lib/plugins/actions/methods.d.ts.map +1 -0
  167. package/lib/plugins/actions/types.d.ts +25 -0
  168. package/lib/plugins/actions/types.d.ts.map +1 -0
  169. package/lib/plugins/audio/AudioChannel.d.ts +46 -0
  170. package/lib/plugins/audio/AudioChannel.d.ts.map +1 -0
  171. package/lib/plugins/audio/AudioChannel.test.d.ts +2 -0
  172. package/lib/plugins/audio/AudioChannel.test.d.ts.map +1 -0
  173. package/lib/plugins/audio/AudioInstance.d.ts +79 -0
  174. package/lib/plugins/audio/AudioInstance.d.ts.map +1 -0
  175. package/lib/plugins/audio/AudioManagerPlugin.d.ts +323 -0
  176. package/lib/plugins/audio/AudioManagerPlugin.d.ts.map +1 -0
  177. package/lib/plugins/audio/VoiceOverPlugin.d.ts +69 -0
  178. package/lib/plugins/audio/VoiceOverPlugin.d.ts.map +1 -0
  179. package/lib/plugins/audio/index.d.ts +4 -0
  180. package/lib/plugins/audio/index.d.ts.map +1 -0
  181. package/lib/plugins/breakpoints/BreakpointPlugin.d.ts +109 -0
  182. package/lib/plugins/breakpoints/BreakpointPlugin.d.ts.map +1 -0
  183. package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts +2 -0
  184. package/lib/plugins/breakpoints/BreakpointPlugin.test.d.ts.map +1 -0
  185. package/lib/plugins/breakpoints/evaluate.d.ts +53 -0
  186. package/lib/plugins/breakpoints/evaluate.d.ts.map +1 -0
  187. package/lib/plugins/breakpoints/evaluate.test.d.ts +2 -0
  188. package/lib/plugins/breakpoints/evaluate.test.d.ts.map +1 -0
  189. package/lib/plugins/breakpoints/index.d.ts +4 -0
  190. package/lib/plugins/breakpoints/index.d.ts.map +1 -0
  191. package/lib/plugins/breakpoints/methods.d.ts +23 -0
  192. package/lib/plugins/breakpoints/methods.d.ts.map +1 -0
  193. package/lib/plugins/breakpoints/types.d.ts +70 -0
  194. package/lib/plugins/breakpoints/types.d.ts.map +1 -0
  195. package/lib/plugins/captions/CaptionsPlugin.d.ts +150 -0
  196. package/lib/plugins/captions/CaptionsPlugin.d.ts.map +1 -0
  197. package/lib/plugins/captions/CaptionsRenderer.d.ts +37 -0
  198. package/lib/plugins/captions/CaptionsRenderer.d.ts.map +1 -0
  199. package/lib/plugins/captions/index.d.ts +3 -0
  200. package/lib/plugins/captions/index.d.ts.map +1 -0
  201. package/lib/plugins/defaults.d.ts +4 -0
  202. package/lib/plugins/defaults.d.ts.map +1 -0
  203. package/lib/plugins/focus/FocusManagerPlugin.d.ts +148 -0
  204. package/lib/plugins/focus/FocusManagerPlugin.d.ts.map +1 -0
  205. package/lib/plugins/focus/FocusOutliner.d.ts +32 -0
  206. package/lib/plugins/focus/FocusOutliner.d.ts.map +1 -0
  207. package/lib/plugins/focus/index.d.ts +3 -0
  208. package/lib/plugins/focus/index.d.ts.map +1 -0
  209. package/lib/plugins/i18nPlugin.d.ts +128 -0
  210. package/lib/plugins/i18nPlugin.d.ts.map +1 -0
  211. package/lib/plugins/index.d.ts +18 -0
  212. package/lib/plugins/index.d.ts.map +1 -0
  213. package/lib/plugins/input/AbstractControls.d.ts +8 -0
  214. package/lib/plugins/input/AbstractControls.d.ts.map +1 -0
  215. package/lib/plugins/input/Controls.d.ts +16 -0
  216. package/lib/plugins/input/Controls.d.ts.map +1 -0
  217. package/lib/plugins/input/InputPlugin.d.ts +52 -0
  218. package/lib/plugins/input/InputPlugin.d.ts.map +1 -0
  219. package/lib/plugins/input/constants.d.ts +8 -0
  220. package/lib/plugins/input/constants.d.ts.map +1 -0
  221. package/lib/plugins/input/index.d.ts +10 -0
  222. package/lib/plugins/input/index.d.ts.map +1 -0
  223. package/lib/plugins/input/interfaces.d.ts +30 -0
  224. package/lib/plugins/input/interfaces.d.ts.map +1 -0
  225. package/lib/plugins/input/keyboard/KeyboardContols.d.ts +28 -0
  226. package/lib/plugins/input/keyboard/KeyboardContols.d.ts.map +1 -0
  227. package/lib/plugins/input/keyboard/index.d.ts +3 -0
  228. package/lib/plugins/input/keyboard/index.d.ts.map +1 -0
  229. package/lib/plugins/input/keyboard/interfaces.d.ts +18 -0
  230. package/lib/plugins/input/keyboard/interfaces.d.ts.map +1 -0
  231. package/lib/plugins/input/methods.d.ts +4 -0
  232. package/lib/plugins/input/methods.d.ts.map +1 -0
  233. package/lib/plugins/input/touch/TouchControls.d.ts +35 -0
  234. package/lib/plugins/input/touch/TouchControls.d.ts.map +1 -0
  235. package/lib/plugins/input/touch/constants.d.ts +14 -0
  236. package/lib/plugins/input/touch/constants.d.ts.map +1 -0
  237. package/lib/plugins/input/touch/index.d.ts +4 -0
  238. package/lib/plugins/input/touch/index.d.ts.map +1 -0
  239. package/lib/plugins/input/touch/interfaces.d.ts +15 -0
  240. package/lib/plugins/input/touch/interfaces.d.ts.map +1 -0
  241. package/lib/plugins/input/types.d.ts +32 -0
  242. package/lib/plugins/input/types.d.ts.map +1 -0
  243. package/lib/plugins/input/utils.d.ts +23 -0
  244. package/lib/plugins/input/utils.d.ts.map +1 -0
  245. package/lib/plugins/spine/SpinePlugin.d.ts +6 -0
  246. package/lib/plugins/spine/SpinePlugin.d.ts.map +1 -0
  247. package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts +31 -0
  248. package/lib/plugins/spine/pixi-spine/BatchableSpineSlot.d.ts.map +1 -0
  249. package/lib/plugins/spine/pixi-spine/Spine.d.ts +211 -0
  250. package/lib/plugins/spine/pixi-spine/Spine.d.ts.map +1 -0
  251. package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts +81 -0
  252. package/lib/plugins/spine/pixi-spine/SpineDebugRenderer.d.ts.map +1 -0
  253. package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts +21 -0
  254. package/lib/plugins/spine/pixi-spine/SpinePipe.d.ts.map +1 -0
  255. package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts +16 -0
  256. package/lib/plugins/spine/pixi-spine/SpineTexture.d.ts.map +1 -0
  257. package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts +10 -0
  258. package/lib/plugins/spine/pixi-spine/assets/atlasLoader.d.ts.map +1 -0
  259. package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts +6 -0
  260. package/lib/plugins/spine/pixi-spine/assets/skeletonLoader.d.ts.map +1 -0
  261. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts +5 -0
  262. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.d.ts.map +1 -0
  263. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts +22 -0
  264. package/lib/plugins/spine/pixi-spine/darktint/DarkTintBatcher.d.ts.map +1 -0
  265. package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts +5 -0
  266. package/lib/plugins/spine/pixi-spine/darktint/DarkTintShader.d.ts.map +1 -0
  267. package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts +51 -0
  268. package/lib/plugins/spine/pixi-spine/darktint/darkTintBit.d.ts.map +1 -0
  269. package/lib/plugins/spine/pixi-spine/index.d.ts +9 -0
  270. package/lib/plugins/spine/pixi-spine/index.d.ts.map +1 -0
  271. package/lib/plugins/spine/pixi-spine/require-shim.d.ts +34 -0
  272. package/lib/plugins/spine/pixi-spine/require-shim.d.ts.map +1 -0
  273. package/lib/registries-CYCaYKZI.js +6885 -0
  274. package/lib/registries-CYCaYKZI.js.map +1 -0
  275. package/lib/signals/Signal.d.ts +16 -0
  276. package/lib/signals/Signal.d.ts.map +1 -0
  277. package/lib/signals/Signal.test.d.ts +2 -0
  278. package/lib/signals/Signal.test.d.ts.map +1 -0
  279. package/lib/signals/index.d.ts +3 -0
  280. package/lib/signals/index.d.ts.map +1 -0
  281. package/lib/store/Store.d.ts +56 -0
  282. package/lib/store/Store.d.ts.map +1 -0
  283. package/lib/store/Store.test.d.ts +2 -0
  284. package/lib/store/Store.test.d.ts.map +1 -0
  285. package/lib/store/index.d.ts +2 -0
  286. package/lib/store/index.d.ts.map +1 -0
  287. package/lib/types/framework.d.ts +46 -0
  288. package/lib/types/gsap.d.ts +23 -0
  289. package/lib/ui/Button.d.ts +162 -0
  290. package/lib/ui/Button.d.ts.map +1 -0
  291. package/lib/ui/FlexContainer.d.ts +109 -0
  292. package/lib/ui/FlexContainer.d.ts.map +1 -0
  293. package/lib/ui/Input.d.ts +384 -0
  294. package/lib/ui/Input.d.ts.map +1 -0
  295. package/lib/ui/Joystick.d.ts +61 -0
  296. package/lib/ui/Joystick.d.ts.map +1 -0
  297. package/lib/ui/Popup.d.ts +109 -0
  298. package/lib/ui/Popup.d.ts.map +1 -0
  299. package/lib/ui/Toast.d.ts +131 -0
  300. package/lib/ui/Toast.d.ts.map +1 -0
  301. package/lib/ui/Toaster.d.ts +188 -0
  302. package/lib/ui/Toaster.d.ts.map +1 -0
  303. package/lib/ui/UICanvas.d.ts +155 -0
  304. package/lib/ui/UICanvas.d.ts.map +1 -0
  305. package/lib/ui/index.d.ts +9 -0
  306. package/lib/ui/index.d.ts.map +1 -0
  307. package/lib/utils/array.d.ts +11 -0
  308. package/lib/utils/array.d.ts.map +1 -0
  309. package/lib/utils/bind.d.ts +21 -0
  310. package/lib/utils/bind.d.ts.map +1 -0
  311. package/lib/utils/canvas.d.ts +2 -0
  312. package/lib/utils/canvas.d.ts.map +1 -0
  313. package/lib/utils/color.d.ts +66 -0
  314. package/lib/utils/color.d.ts.map +1 -0
  315. package/lib/utils/console/Logger.d.ts +15 -0
  316. package/lib/utils/console/Logger.d.ts.map +1 -0
  317. package/lib/utils/console/index.d.ts +2 -0
  318. package/lib/utils/console/index.d.ts.map +1 -0
  319. package/lib/utils/debug.d.ts +34 -0
  320. package/lib/utils/debug.d.ts.map +1 -0
  321. package/lib/utils/define.d.ts +100 -0
  322. package/lib/utils/define.d.ts.map +1 -0
  323. package/lib/utils/env.d.ts +4 -0
  324. package/lib/utils/env.d.ts.map +1 -0
  325. package/lib/utils/events.d.ts +12 -0
  326. package/lib/utils/events.d.ts.map +1 -0
  327. package/lib/utils/framework.d.ts +12 -0
  328. package/lib/utils/framework.d.ts.map +1 -0
  329. package/lib/utils/index.d.ts +28 -0
  330. package/lib/utils/index.d.ts.map +1 -0
  331. package/lib/utils/map.d.ts +31 -0
  332. package/lib/utils/map.d.ts.map +1 -0
  333. package/lib/utils/math.d.ts +15 -0
  334. package/lib/utils/math.d.ts.map +1 -0
  335. package/lib/utils/misc.d.ts +13 -0
  336. package/lib/utils/misc.d.ts.map +1 -0
  337. package/lib/utils/number.d.ts +2 -0
  338. package/lib/utils/number.d.ts.map +1 -0
  339. package/lib/utils/object.d.ts +21 -0
  340. package/lib/utils/object.d.ts.map +1 -0
  341. package/lib/utils/padding.d.ts +4 -0
  342. package/lib/utils/padding.d.ts.map +1 -0
  343. package/lib/utils/pixi.d.ts +42 -0
  344. package/lib/utils/pixi.d.ts.map +1 -0
  345. package/lib/utils/platform.d.ts +20 -0
  346. package/lib/utils/platform.d.ts.map +1 -0
  347. package/lib/utils/point.d.ts +66 -0
  348. package/lib/utils/point.d.ts.map +1 -0
  349. package/lib/utils/promise/Queue.d.ts +60 -0
  350. package/lib/utils/promise/Queue.d.ts.map +1 -0
  351. package/lib/utils/promise/functions.d.ts +14 -0
  352. package/lib/utils/promise/functions.d.ts.map +1 -0
  353. package/lib/utils/promise/index.d.ts +3 -0
  354. package/lib/utils/promise/index.d.ts.map +1 -0
  355. package/lib/utils/random.d.ts +42 -0
  356. package/lib/utils/random.d.ts.map +1 -0
  357. package/lib/utils/rect.d.ts +26 -0
  358. package/lib/utils/rect.d.ts.map +1 -0
  359. package/lib/utils/set.d.ts +15 -0
  360. package/lib/utils/set.d.ts.map +1 -0
  361. package/lib/utils/string.d.ts +3 -0
  362. package/lib/utils/string.d.ts.map +1 -0
  363. package/lib/utils/text.d.ts +3 -0
  364. package/lib/utils/text.d.ts.map +1 -0
  365. package/lib/utils/typefilters.d.ts +4 -0
  366. package/lib/utils/typefilters.d.ts.map +1 -0
  367. package/lib/utils/types.d.ts +209 -0
  368. package/lib/utils/types.d.ts.map +1 -0
  369. package/lib/utils/vite.d.ts +25 -0
  370. package/lib/utils/vite.d.ts.map +1 -0
  371. package/lib/utils/web.d.ts +3 -0
  372. package/lib/utils/web.d.ts.map +1 -0
  373. package/lib/version.d.ts +3 -0
  374. package/lib/version.d.ts.map +1 -0
  375. package/lib/webgl-check.d.ts +2 -0
  376. package/lib/webgl-check.d.ts.map +1 -0
  377. package/package.json +138 -0
  378. package/src/core/Application.ts +1091 -0
  379. package/src/core/config.ts +168 -0
  380. package/src/core/create.ts +186 -0
  381. package/src/core/globals.ts +299 -0
  382. package/src/core/index.ts +6 -0
  383. package/src/core/interfaces/IApplication.ts +628 -0
  384. package/src/core/interfaces/IApplicationOptions.ts +81 -0
  385. package/src/core/interfaces/ICoreFunctions.ts +86 -0
  386. package/src/core/interfaces/ICoreSignals.ts +77 -0
  387. package/src/core/interfaces/IStorageCapability.test.ts +27 -0
  388. package/src/core/interfaces/IStorageCapability.ts +26 -0
  389. package/src/core/interfaces/index.ts +6 -0
  390. package/src/core/registries.ts +7 -0
  391. package/src/core/types.ts +13 -0
  392. package/src/display/AnimatedSprite.ts +227 -0
  393. package/src/display/Camera.ts +371 -0
  394. package/src/display/Container.ts +240 -0
  395. package/src/display/Entity.ts +50 -0
  396. package/src/display/ParticleContainer.ts +107 -0
  397. package/src/display/Scene.ts +305 -0
  398. package/src/display/SceneTransition.ts +108 -0
  399. package/src/display/SpineAnimation.ts +170 -0
  400. package/src/display/Svg.ts +9 -0
  401. package/src/display/index.ts +11 -0
  402. package/src/env.d.ts +6 -0
  403. package/src/hello.ts +20 -0
  404. package/src/index.ts +17 -0
  405. package/src/mixins/animated.ts +340 -0
  406. package/src/mixins/factory/Factory.ts +24 -0
  407. package/src/mixins/factory/const.ts +363 -0
  408. package/src/mixins/factory/index.ts +7 -0
  409. package/src/mixins/factory/methods.ts +21 -0
  410. package/src/mixins/factory/props.ts +207 -0
  411. package/src/mixins/factory/registry.test.ts +83 -0
  412. package/src/mixins/factory/registry.ts +61 -0
  413. package/src/mixins/factory/schema.ts +153 -0
  414. package/src/mixins/factory/ui-registry.ts +54 -0
  415. package/src/mixins/factory/utils.ts +130 -0
  416. package/src/mixins/focus.ts +124 -0
  417. package/src/mixins/index.ts +5 -0
  418. package/src/mixins/interaction.ts +74 -0
  419. package/src/mixins/signals.ts +49 -0
  420. package/src/plugins/AssetsPlugin.ts +407 -0
  421. package/src/plugins/DataAdapter.ts +259 -0
  422. package/src/plugins/DevToolsPlugin.ts +103 -0
  423. package/src/plugins/FullScreenPlugin.ts +359 -0
  424. package/src/plugins/GSAPPlugin.ts +811 -0
  425. package/src/plugins/KeyboardPlugin.ts +160 -0
  426. package/src/plugins/LayoutPlugin.ts +127 -0
  427. package/src/plugins/LookupPlugin.ts +308 -0
  428. package/src/plugins/Plugin.test.ts +73 -0
  429. package/src/plugins/Plugin.ts +200 -0
  430. package/src/plugins/PopupManagerPlugin.ts +263 -0
  431. package/src/plugins/ResizerPlugin.ts +220 -0
  432. package/src/plugins/SceneManagerPlugin.ts +669 -0
  433. package/src/plugins/StatsPlugin.ts +24 -0
  434. package/src/plugins/TimerPlugin.ts +841 -0
  435. package/src/plugins/WebEventsPlugin.ts +132 -0
  436. package/src/plugins/actions/ActionsPlugin.ts +113 -0
  437. package/src/plugins/actions/constants.ts +45 -0
  438. package/src/plugins/actions/index.ts +4 -0
  439. package/src/plugins/actions/methods.ts +28 -0
  440. package/src/plugins/actions/types.ts +47 -0
  441. package/src/plugins/audio/AudioChannel.test.ts +101 -0
  442. package/src/plugins/audio/AudioChannel.ts +164 -0
  443. package/src/plugins/audio/AudioInstance.ts +228 -0
  444. package/src/plugins/audio/AudioManagerPlugin.ts +903 -0
  445. package/src/plugins/audio/VoiceOverPlugin.ts +354 -0
  446. package/src/plugins/audio/index.ts +3 -0
  447. package/src/plugins/breakpoints/BreakpointPlugin.test.ts +228 -0
  448. package/src/plugins/breakpoints/BreakpointPlugin.ts +293 -0
  449. package/src/plugins/breakpoints/evaluate.test.ts +239 -0
  450. package/src/plugins/breakpoints/evaluate.ts +201 -0
  451. package/src/plugins/breakpoints/index.ts +3 -0
  452. package/src/plugins/breakpoints/methods.ts +22 -0
  453. package/src/plugins/breakpoints/types.ts +86 -0
  454. package/src/plugins/captions/CaptionsPlugin.ts +468 -0
  455. package/src/plugins/captions/CaptionsRenderer.ts +184 -0
  456. package/src/plugins/captions/font/Sans.fnt +116 -0
  457. package/src/plugins/captions/font/Sans.png +0 -0
  458. package/src/plugins/captions/index.ts +2 -0
  459. package/src/plugins/defaults.ts +95 -0
  460. package/src/plugins/focus/FocusManagerPlugin.ts +773 -0
  461. package/src/plugins/focus/FocusOutliner.ts +111 -0
  462. package/src/plugins/focus/index.ts +2 -0
  463. package/src/plugins/i18nPlugin.ts +284 -0
  464. package/src/plugins/index.ts +17 -0
  465. package/src/plugins/input/AbstractControls.ts +15 -0
  466. package/src/plugins/input/Controls.ts +55 -0
  467. package/src/plugins/input/InputPlugin.ts +168 -0
  468. package/src/plugins/input/constants.ts +12 -0
  469. package/src/plugins/input/index.ts +9 -0
  470. package/src/plugins/input/interfaces.ts +37 -0
  471. package/src/plugins/input/keyboard/KeyboardContols.ts +182 -0
  472. package/src/plugins/input/keyboard/index.ts +2 -0
  473. package/src/plugins/input/keyboard/interfaces.ts +21 -0
  474. package/src/plugins/input/methods.ts +9 -0
  475. package/src/plugins/input/touch/TouchControls.ts +237 -0
  476. package/src/plugins/input/touch/constants.ts +34 -0
  477. package/src/plugins/input/touch/index.ts +3 -0
  478. package/src/plugins/input/touch/interfaces.ts +15 -0
  479. package/src/plugins/input/types.ts +41 -0
  480. package/src/plugins/input/utils.ts +10 -0
  481. package/src/plugins/spine/SpinePlugin.ts +14 -0
  482. package/src/plugins/spine/pixi-spine/BatchableSpineSlot.ts +138 -0
  483. package/src/plugins/spine/pixi-spine/Spine.ts +897 -0
  484. package/src/plugins/spine/pixi-spine/SpineDebugRenderer.ts +615 -0
  485. package/src/plugins/spine/pixi-spine/SpinePipe.ts +197 -0
  486. package/src/plugins/spine/pixi-spine/SpineTexture.ts +143 -0
  487. package/src/plugins/spine/pixi-spine/assets/atlasLoader.ts +156 -0
  488. package/src/plugins/spine/pixi-spine/assets/skeletonLoader.ts +80 -0
  489. package/src/plugins/spine/pixi-spine/darktint/DarkTintBatchGeometry.ts +92 -0
  490. package/src/plugins/spine/pixi-spine/darktint/DarkTintBatcher.ts +186 -0
  491. package/src/plugins/spine/pixi-spine/darktint/DarkTintShader.ts +74 -0
  492. package/src/plugins/spine/pixi-spine/darktint/darkTintBit.ts +77 -0
  493. package/src/plugins/spine/pixi-spine/index.ts +43 -0
  494. package/src/plugins/spine/pixi-spine/require-shim.ts +43 -0
  495. package/src/signals/Signal.test.ts +54 -0
  496. package/src/signals/Signal.ts +68 -0
  497. package/src/signals/index.ts +10 -0
  498. package/src/store/Store.test.ts +146 -0
  499. package/src/store/Store.ts +192 -0
  500. package/src/store/index.ts +1 -0
  501. package/src/types/framework.d.ts +47 -0
  502. package/src/types/gsap.d.ts +26 -0
  503. package/src/ui/Button.ts +454 -0
  504. package/src/ui/FlexContainer.ts +526 -0
  505. package/src/ui/Input.ts +1274 -0
  506. package/src/ui/Joystick.ts +288 -0
  507. package/src/ui/Popup.ts +242 -0
  508. package/src/ui/Toast.ts +399 -0
  509. package/src/ui/Toaster.ts +409 -0
  510. package/src/ui/UICanvas.ts +812 -0
  511. package/src/ui/index.ts +8 -0
  512. package/src/utils/array.ts +24 -0
  513. package/src/utils/bind.ts +79 -0
  514. package/src/utils/canvas.ts +26 -0
  515. package/src/utils/color.ts +126 -0
  516. package/src/utils/console/Logger.ts +86 -0
  517. package/src/utils/console/index.ts +1 -0
  518. package/src/utils/debug.ts +69 -0
  519. package/src/utils/define.ts +120 -0
  520. package/src/utils/env.ts +3 -0
  521. package/src/utils/events.ts +10 -0
  522. package/src/utils/framework.ts +45 -0
  523. package/src/utils/index.ts +27 -0
  524. package/src/utils/map.ts +59 -0
  525. package/src/utils/math.ts +19 -0
  526. package/src/utils/misc.ts +45 -0
  527. package/src/utils/number.ts +3 -0
  528. package/src/utils/object.ts +43 -0
  529. package/src/utils/padding.ts +43 -0
  530. package/src/utils/pixi.ts +116 -0
  531. package/src/utils/platform.ts +33 -0
  532. package/src/utils/point.ts +123 -0
  533. package/src/utils/promise/Queue.ts +125 -0
  534. package/src/utils/promise/functions.ts +16 -0
  535. package/src/utils/promise/index.ts +2 -0
  536. package/src/utils/random.ts +69 -0
  537. package/src/utils/rect.ts +50 -0
  538. package/src/utils/set.ts +32 -0
  539. package/src/utils/string.ts +9 -0
  540. package/src/utils/text.ts +30 -0
  541. package/src/utils/typefilters.ts +29 -0
  542. package/src/utils/types.ts +426 -0
  543. package/src/utils/vite.ts +41 -0
  544. package/src/utils/web.ts +7 -0
  545. package/src/version.ts +3 -0
  546. package/src/webgl-check.ts +12 -0
  547. package/templates/app/default/.eslintrc.json +21 -0
  548. package/templates/app/default/.meta.json +4 -0
  549. package/templates/app/default/.nvmrc +1 -0
  550. package/templates/app/default/.prettierrc.json +7 -0
  551. package/templates/app/default/README.md +8 -0
  552. package/templates/app/default/assets/audio{m}/music/Cheerful Annoyance.ogg +0 -0
  553. package/templates/app/default/assets/audio{m}/music/Drumming Sticks.ogg +0 -0
  554. package/templates/app/default/assets/audio{m}/music/Game Over.ogg +0 -0
  555. package/templates/app/default/assets/audio{m}/music/Mishief Stroll.ogg +0 -0
  556. package/templates/app/default/assets/audio{m}/music/Night at the Beach.ogg +0 -0
  557. package/templates/app/default/assets/audio{m}/sfx/click.ogg +0 -0
  558. package/templates/app/default/assets/audio{m}/sfx/hover.ogg +0 -0
  559. package/templates/app/default/assets/required{m}/caper.png +0 -0
  560. package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Bold{family=Space Grotesk}{wf}.ttf +0 -0
  561. package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Medium{family=Space Grotesk}{wf}.ttf +0 -0
  562. package/templates/app/default/assets/required{m}/fonts{fix}/SpaceGrotesk-Regular{family=Space Grotesk}{wf}.ttf +0 -0
  563. package/templates/app/default/assets/required{m}/fonts{fix}/Syncopate-Bold{family=Syncopate}{wf}.ttf +0 -0
  564. package/templates/app/default/assets/required{m}/ui{tps}/btn/blue.png +0 -0
  565. package/templates/app/default/assets/required{m}/ui{tps}/btn/green.png +0 -0
  566. package/templates/app/default/assets/required{m}/ui{tps}/btn/grey.png +0 -0
  567. package/templates/app/default/assets/required{m}/ui{tps}/btn/orange.png +0 -0
  568. package/templates/app/default/assets/required{m}/ui{tps}/btn/purple.png +0 -0
  569. package/templates/app/default/assets/required{m}/ui{tps}/btn/red.png +0 -0
  570. package/templates/app/default/assets/required{m}/ui{tps}/btn/yellow.png +0 -0
  571. package/templates/app/default/assets/required{m}/ui{tps}/btn_a/down.png +0 -0
  572. package/templates/app/default/assets/required{m}/ui{tps}/btn_a/over.png +0 -0
  573. package/templates/app/default/assets/required{m}/ui{tps}/btn_a/up.png +0 -0
  574. package/templates/app/default/assets/required{m}/ui{tps}/btn_b/down.png +0 -0
  575. package/templates/app/default/assets/required{m}/ui{tps}/btn_b/over.png +0 -0
  576. package/templates/app/default/assets/required{m}/ui{tps}/btn_b/up.png +0 -0
  577. package/templates/app/default/assets/required{m}/ui{tps}/joystick/base.png +0 -0
  578. package/templates/app/default/assets/required{m}/ui{tps}/joystick/handle.png +0 -0
  579. package/templates/app/default/assets/required{m}/wordmark.svg +1 -0
  580. package/templates/app/default/assets/spine{m}/spineboy-pro.png +0 -0
  581. package/templates/app/default/assets/spine{m}/spineboy-pro.skel +0 -0
  582. package/templates/app/default/assets/spine{m}/spineboy-pro{fix}.atlas +94 -0
  583. package/templates/app/default/caper.config.ts +60 -0
  584. package/templates/app/default/index.html +23 -0
  585. package/templates/app/default/package.template.json +17 -0
  586. package/templates/app/default/public/favicon.ico +0 -0
  587. package/templates/app/default/src/__APPLICATION_NAME__.ts +3 -0
  588. package/templates/app/default/src/main.ts +9 -0
  589. package/templates/app/default/src/scenes/Base.ts +39 -0
  590. package/templates/app/default/src/scenes/Game.ts +34 -0
  591. package/templates/app/default/src/scenes/Splash.ts +70 -0
  592. package/templates/app/default/src/scenes/Start.ts +90 -0
  593. package/templates/app/default/src/utils/Constants.ts +3 -0
  594. package/templates/app/default/tsconfig.json +1 -0
  595. package/templates/plugin/package.template.json +33 -0
  596. package/templates/plugin/src/Plugin.template.ts +24 -0
  597. package/templates/plugin/src/index.template.ts +3 -0
  598. package/templates/plugin/tsconfig.template.json +43 -0
  599. package/templates/plugin/vite-env.template.d.ts +16 -0
  600. package/templates/plugin/vite.config.template.ts +19 -0
@@ -0,0 +1,200 @@
1
+ import type { IApplication, ICoreFunctions, ICoreSignals } from '../core';
2
+ import { coreFunctionRegistry, coreSignalRegistry } from '../core';
3
+ import { Application } from '../core/Application';
4
+ import { SignalConnection, SignalConnections } from '../signals';
5
+ import { type AppTypeOverrides, bindAllMethods, ImportListItemModule } from '../utils';
6
+
7
+ /**
8
+ * Public contract for a Caper plugin. A plugin is a long-lived object
9
+ * with `initialize` / `postInitialize` / `destroy` lifecycle hooks,
10
+ * registered at app bootstrap and accessed via `app.getPlugin(id)`.
11
+ *
12
+ * **Lifecycle order** (per plugin):
13
+ *
14
+ * 1. `constructor` — instantiated by the framework. Don't reference
15
+ * the app yet; it isn't attached.
16
+ * 2. `initialize(options, app)` — set up internal state, parse options,
17
+ * open connections, register signals. Awaited by the framework
18
+ * before any other plugin's `initialize` runs (when ordered by
19
+ * `requires`). Don't call out to other plugins here unless they
20
+ * are listed in your `requires` — order isn't guaranteed otherwise.
21
+ * 3. `postInitialize(app)` — runs after every plugin has finished
22
+ * `initialize`. Safe to look up sibling plugins via `app.getPlugin`
23
+ * regardless of `requires`. Use for cross-plugin wiring.
24
+ * 4. (use phase) — the plugin is live; signal handlers fire, exposed
25
+ * methods are called from scenes / other plugins / the app.
26
+ * 5. `destroy()` — called when the app shuts down. Tear down
27
+ * connections, disconnect signals, free resources. The base class
28
+ * already disconnects everything added via `addSignalConnection`.
29
+ *
30
+ * Discovery: plugin classes under `src/plugins/` are auto-discovered
31
+ * by the Vite plugin if they default-export a class. Annotate with
32
+ * `definePlugin({ id, requires })` for the canonical id and any
33
+ * dependency declarations:
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * import { definePlugin, IApplication, Plugin } from '@caperjs/core';
38
+ *
39
+ * export const plugin = definePlugin({
40
+ * id: 'leaderboard',
41
+ * requires: ['firebase'], // firebase initializes first
42
+ * });
43
+ *
44
+ * export default class LeaderboardPlugin extends Plugin {
45
+ * public readonly id = 'leaderboard';
46
+ *
47
+ * async initialize(_options, app) {
48
+ * this.firebase = app.getPlugin('firebase'); // guaranteed to exist
49
+ * }
50
+ * }
51
+ * ```
52
+ */
53
+ export interface IPlugin<O = any> {
54
+ /** Unique plugin id. Must match the `definePlugin({ id })` value. */
55
+ id: string;
56
+
57
+ /** The owning application instance. Available after registration. */
58
+ app: IApplication;
59
+
60
+ /** Resolved options after `initialize` merges defaults with the user's. */
61
+ readonly options: O;
62
+
63
+ /**
64
+ * Set up the plugin. Called once at bootstrap, awaited before any
65
+ * dependent plugin's `initialize` runs. Use this to parse options,
66
+ * open connections, and register signals.
67
+ *
68
+ * @param options Partial options from `caper.config.ts plugins[]`.
69
+ * @param app The application instance, fully constructed but possibly
70
+ * mid-bootstrap (other plugins may not yet be initialized — see
71
+ * `requires` and `postInitialize`).
72
+ */
73
+ initialize(options: Partial<O>, app: IApplication): Promise<void> | void;
74
+
75
+ /**
76
+ * Cross-plugin wiring hook. Called after every plugin has finished
77
+ * `initialize`. Safe to look up siblings via `app.getPlugin(id)` here
78
+ * regardless of `requires` — they're all live.
79
+ */
80
+ postInitialize(_app: IApplication): Promise<void> | void;
81
+
82
+ /** Tear down. Called on app shutdown. */
83
+ destroy(): void;
84
+
85
+ /**
86
+ * Track a signal connection so it gets auto-disconnected on `destroy`.
87
+ * Prefer this over storing connections manually.
88
+ */
89
+ addSignalConnection(...args: SignalConnection[]): void;
90
+
91
+ /** Disconnect every connection added via `addSignalConnection`. */
92
+ clearSignalConnections(): void;
93
+
94
+ /** Register methods this plugin exposes via the core function registry. */
95
+ registerCoreFunctions(): void;
96
+
97
+ /** Register signals this plugin exposes via the core signal registry. */
98
+ registerCoreSignals(): void;
99
+ }
100
+
101
+ export interface PluginListItem {
102
+ id: string;
103
+ path: string;
104
+ module?: ImportListItemModule<IPlugin>;
105
+ assets?: string[];
106
+ plugins?: string[];
107
+ /**
108
+ * IDs of other plugins that must initialize before this one. Populated
109
+ * from `definePlugin({ requires: [...] })` for local plugins; carried
110
+ * through discovery to bootstrap so the framework can topologically
111
+ * sort the active plugin set.
112
+ */
113
+ requires?: string[];
114
+ }
115
+
116
+ export class Plugin<O = any> implements IPlugin<O> {
117
+ private readonly __caper_method_binding_root = true;
118
+ // A collection of signal connections.
119
+ protected _signalConnections: SignalConnections = new SignalConnections();
120
+
121
+ protected _options: O;
122
+
123
+ get options(): O {
124
+ return this._options;
125
+ }
126
+
127
+ constructor(public id: string = 'Plugin') {
128
+ bindAllMethods(this);
129
+ }
130
+
131
+ public get app(): AppTypeOverrides['App'] {
132
+ return Application.getInstance();
133
+ }
134
+
135
+ public destroy(): void {
136
+ this._signalConnections.disconnectAll();
137
+ }
138
+
139
+ public initialize(options?: Partial<O>, _app?: IApplication): Promise<void> | void;
140
+
141
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
142
+ public async initialize(_options: Partial<O>, _app?: IApplication): Promise<void> {
143
+ return Promise.resolve(undefined);
144
+ }
145
+
146
+ public postInitialize(_app: IApplication): Promise<void> | void;
147
+
148
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
149
+ public async postInitialize(_app: IApplication): Promise<void> {
150
+ return Promise.resolve(undefined);
151
+ }
152
+
153
+ /**
154
+ * Add signal connections to the container.
155
+ * @param args - The signal connections to add.
156
+ */
157
+ public addSignalConnection(...args: SignalConnection[]) {
158
+ for (const connection of args) {
159
+ this._signalConnections.add(connection);
160
+ }
161
+ }
162
+
163
+ public clearSignalConnections() {
164
+ this._signalConnections.disconnectAll();
165
+ }
166
+
167
+ /**
168
+ * @override
169
+ * @protected
170
+ */
171
+ public registerCoreFunctions(): void {
172
+ const functions = this.getCoreFunctions();
173
+ functions.forEach((f) => {
174
+ const fName = f as keyof ICoreFunctions;
175
+ // @ts-expect-error implicit any
176
+ coreFunctionRegistry[fName] = this[f];
177
+ });
178
+ }
179
+
180
+ /**
181
+ * @override
182
+ * @protected
183
+ */
184
+ public registerCoreSignals(): void {
185
+ const signals = this.getCoreSignals();
186
+ signals.forEach((s) => {
187
+ const sName = s as keyof ICoreSignals;
188
+ // @ts-expect-error implicit any
189
+ coreSignalRegistry[sName] = this[s];
190
+ });
191
+ }
192
+
193
+ protected getCoreFunctions(): string[] {
194
+ return [];
195
+ }
196
+
197
+ protected getCoreSignals(): string[] {
198
+ return [];
199
+ }
200
+ }
@@ -0,0 +1,263 @@
1
+ import { Container } from '../display';
2
+ import { Signal } from '../signals';
3
+ import type { IPopup, PopupConfig, PopupConstructor } from '../ui';
4
+ import { bindAllMethods, getLastMapEntry } from '../utils';
5
+ import type { PopupId, PopupInstance, PopupProps } from '../utils';
6
+ import type { IPlugin } from './Plugin';
7
+ import { Plugin } from './Plugin';
8
+
9
+ type PopupListItem = {
10
+ id: string | number;
11
+ active?: boolean;
12
+ module?: PopupConstructor | (() => Promise<unknown>);
13
+ };
14
+
15
+ /**`
16
+ * Interface for PopupManager
17
+ */
18
+ export interface IPopupManagerPlugin extends IPlugin {
19
+ readonly view: Container; // The view of the PopupManager
20
+ readonly current: IPopup | undefined; // The current active popup
21
+ readonly hasActivePopups: boolean; // Whether there are any active popups
22
+ readonly popupCount: number; // The count of popups
23
+ readonly currentPopupId: string | number | undefined; // The id of the current popup
24
+ // signals
25
+ onShowPopup: Signal<(detail: PopupSignalDetail) => void>; // Signal for when a popup is shown
26
+ onHidePopup: Signal<(detail: PopupSignalDetail) => void>; // Signal for when a popup is hidden
27
+ onPopupChanged: Signal<(detail: PopupSignalDetail) => void>; // Signal for when a popup is changed
28
+
29
+ /**
30
+ * Show a discovered popup by id. The `config.data` field is narrowed to
31
+ * the popup's declared data type (if it extends `Popup<MyData>`). Awaits
32
+ * the full show lifecycle (initialize → beforeShow → show animation).
33
+ */
34
+ showPopup<K extends PopupId>(id: K, config?: PopupProps<K>): Promise<PopupInstance<K> | undefined>;
35
+
36
+ /** Alias for `showPopup` — shorter when called as `this.popups.show(...)`. */
37
+ show<K extends PopupId>(id: K, config?: PopupProps<K>): Promise<PopupInstance<K> | undefined>;
38
+
39
+ hidePopup<T = any>(id: string | number, data?: any): Promise<IPopup<T> | undefined>; // Hide a popup
40
+
41
+ removeAllPopups(animate?: boolean): void; // Remove all popups
42
+ }
43
+
44
+ export type PopupSignalDetail<T = any> = { id: string | number; data?: T };
45
+
46
+ /**
47
+ * PopupManager
48
+ */
49
+
50
+ export class PopupManagerPlugin extends Plugin implements IPopupManagerPlugin {
51
+ public readonly id: string = 'popups'; // The id of the PopupManager
52
+ public readonly view = new Container(); // The view of the PopupManager
53
+
54
+ // signals
55
+ public onShowPopup: Signal<(detail: PopupSignalDetail) => void> = new Signal<(detail: PopupSignalDetail) => void>(); // Signal for when a popup is shown
56
+ public onHidePopup: Signal<(detail: PopupSignalDetail) => void> = new Signal<(detail: PopupSignalDetail) => void>(); // Signal for when a popup is hidden
57
+ public onPopupChanged: Signal<(detail: PopupSignalDetail) => void> = new Signal<
58
+ (detail: PopupSignalDetail) => void
59
+ >(); // Signal for when a popup is changed
60
+ // Map entries may start out as a dynamic-import function (from discovery)
61
+ // and get replaced with the resolved constructor on first `show()` call.
62
+ private _popups: Map<string | number, PopupConstructor | (() => Promise<unknown>)> = new Map();
63
+ private _activePopups: Map<string | number, IPopup> = new Map(); // Map of active popups
64
+
65
+ private _currentPopupId: string | number | undefined = undefined; // The id of the current popup
66
+
67
+ get currentPopupId(): string | number | undefined {
68
+ return this._currentPopupId;
69
+ }
70
+
71
+ get popupCount(): number {
72
+ return this._popups.size;
73
+ }
74
+
75
+ get current(): IPopup | undefined {
76
+ if (this._currentPopupId === undefined) {
77
+ return undefined;
78
+ }
79
+ return this._activePopups.get(this._currentPopupId);
80
+ }
81
+
82
+ get hasActivePopups(): boolean {
83
+ return this._activePopups.size > 0;
84
+ }
85
+
86
+ /**
87
+ * Initialize the PopupManager. Reads the discovered `popupList` from the
88
+ * `caper-runtime` global and pre-registers every active popup. Dynamic
89
+ * imports are stored as-is and resolved on first `show()` call.
90
+ */
91
+ initialize(): void {
92
+ bindAllMethods(this);
93
+ this.view.label = 'PopupManager';
94
+ this._setupAppListeners();
95
+ this._registerDiscoveredPopups();
96
+ }
97
+
98
+ /**
99
+ * Destroy the PopupManager
100
+ */
101
+ destroy(): void {
102
+ this._activePopups.clear();
103
+ super.destroy();
104
+ }
105
+
106
+ /**
107
+ * Show a discovered popup by id.
108
+ * @param id - The id of the popup (typed against `AppPopups`).
109
+ * @param config - The configuration for the popup. `config.data` is
110
+ * narrowed via the popup class's `Popup<T>` generic.
111
+ * @returns a promise resolving to the popup instance.
112
+ */
113
+ async showPopup<K extends PopupId>(
114
+ id: K,
115
+ config: PopupProps<K> = {} as PopupProps<K>,
116
+ ): Promise<PopupInstance<K> | undefined> {
117
+ const resolved = await this._resolvePopupCtor(id);
118
+ if (!resolved) return;
119
+
120
+ const typedConfig = config as Partial<PopupConfig<any>> & { id?: string | number };
121
+ typedConfig.id = id;
122
+ const instance = this.view.add.existing(new resolved(id, typedConfig as Partial<PopupConfig>));
123
+ instance.initialize();
124
+ this.app.focus.clearFocus();
125
+ instance.beforeShow();
126
+ await instance.show();
127
+
128
+ this.app.focus.setFocusLayer(id);
129
+ instance.afterShow();
130
+
131
+ this._activePopups.set(id, instance);
132
+ this._currentPopupId = id;
133
+
134
+ return new Promise((resolve) => {
135
+ this.app.ticker.addOnce(() => {
136
+ this.onShowPopup.emit({ id, data: typedConfig?.data });
137
+ instance.start();
138
+ this.onPopupChanged.emit({ id, data: typedConfig?.data });
139
+ resolve(instance as PopupInstance<K>);
140
+ });
141
+ });
142
+ }
143
+
144
+ /** Alias for `showPopup`. */
145
+ show<K extends PopupId>(id: K, config?: PopupProps<K>): Promise<PopupInstance<K> | undefined> {
146
+ return this.showPopup(id, config);
147
+ }
148
+
149
+ /**
150
+ * Hide a popup
151
+ * @param id - The id of the popup
152
+ * @param data
153
+ * @returns a promise resolving to the popup, if it exists
154
+ */
155
+ async hidePopup<T = any>(id: string | number, data?: T): Promise<IPopup<T> | undefined> {
156
+ const popup = this._activePopups.get(id);
157
+ if (popup) {
158
+ popup.beforeHide();
159
+ await popup.hide();
160
+ this.view.removeChild(popup as any);
161
+ this._activePopups.delete(id);
162
+ this._currentPopupId = getLastMapEntry(this._activePopups)?.[0] || undefined;
163
+ return new Promise((resolve) => {
164
+ this.app.ticker.addOnce(() => {
165
+ this.onHidePopup.emit({ id, data });
166
+ popup.end();
167
+ this.onPopupChanged.emit({ id, data });
168
+ resolve(popup);
169
+ popup.restoreActionContext();
170
+ });
171
+ });
172
+ }
173
+ return;
174
+ }
175
+
176
+ /**
177
+ * Remove all popups
178
+ * @param animate - Whether to animate the removal
179
+ */
180
+ removeAllPopups(animate: boolean = false): void {
181
+ if (animate) {
182
+ this._activePopups.forEach((popup) => {
183
+ popup.hide();
184
+ });
185
+ } else {
186
+ this._activePopups.clear();
187
+ this.view.removeChildren();
188
+ }
189
+ }
190
+
191
+ protected getCoreFunctions() {
192
+ return ['hidePopup', 'showPopup', 'removeAllPopups'];
193
+ }
194
+
195
+ protected getCoreSignals() {
196
+ return ['onShowPopup', 'onHidePopup', 'onPopupChanged'];
197
+ }
198
+
199
+ /**
200
+ * Setup application listeners
201
+ * @private
202
+ */
203
+ private _setupAppListeners(): void {
204
+ this.addSignalConnection(this.app.scenes.onSceneChangeStart.connect(() => this.removeAllPopups()));
205
+ this.app.keyboard.onKeyUp('Escape').connect(this._handleEscape);
206
+ }
207
+
208
+ /**
209
+ * Pull every active popup off `globalThis.Caper.popupList` (populated by
210
+ * the `caper-runtime` virtual module before the Application starts) and
211
+ * seed the registry. Entries stay as dynamic-import functions until the
212
+ * first `show()` call resolves them.
213
+ */
214
+ private _registerDiscoveredPopups(): void {
215
+ const list: PopupListItem[] =
216
+ ((globalThis as unknown as { Caper?: { get?: (key: string) => unknown } }).Caper?.get?.(
217
+ 'popupList',
218
+ ) as PopupListItem[] | undefined) ?? [];
219
+ for (const item of list) {
220
+ if (item.active === false || !item.module) continue;
221
+ this._popups.set(item.id, item.module);
222
+ }
223
+ }
224
+
225
+ /**
226
+ * Ensure the popup constructor for `id` is loaded and return it. Resolves
227
+ * dynamic-import functions on first access, caches the result back onto
228
+ * the registry so subsequent shows are synchronous.
229
+ */
230
+ private async _resolvePopupCtor(id: string | number): Promise<PopupConstructor | undefined> {
231
+ const entry = this._popups.get(id);
232
+ if (!entry) {
233
+ const known = [...this._popups.keys()].map((k) => `'${String(k)}'`).join(', ');
234
+ throw new Error(
235
+ `[caper] Unknown popup id '${String(id)}'. ` +
236
+ `Known: ${known.length > 0 ? known : '(none — discovery may have failed)'}`,
237
+ );
238
+ }
239
+ // Already a constructor (has prototype)
240
+ if (typeof entry === 'function' && (entry as PopupConstructor).prototype) {
241
+ return entry as PopupConstructor;
242
+ }
243
+ // Dynamic import function — resolve and cache
244
+ const mod = (await (entry as () => Promise<unknown>)()) as { default?: PopupConstructor };
245
+ const ctor = mod?.default;
246
+ if (!ctor) {
247
+ throw new Error(`[caper] Popup '${String(id)}' module did not export a default class.`);
248
+ }
249
+ this._popups.set(id, ctor);
250
+ return ctor;
251
+ }
252
+
253
+ /**
254
+ * Handle escape key press
255
+ * if the current popup should close when escape is pressed (true by default), closes it
256
+ * @private
257
+ */
258
+ private _handleEscape() {
259
+ if (this.current && this.current.config.closeOnEscape) {
260
+ void this.hidePopup(this.current.id);
261
+ }
262
+ }
263
+ }
@@ -0,0 +1,220 @@
1
+ import { Graphics } from 'pixi.js';
2
+
3
+ import { Container } from '../display';
4
+ import type { Size } from '../utils';
5
+ import type { IPlugin } from './Plugin';
6
+ import { Plugin } from './Plugin';
7
+
8
+ /**
9
+ * Interface for Resizer module.
10
+ */
11
+ export interface IResizerPlugin extends IPlugin {
12
+ readonly size: Size;
13
+ readonly scale: number;
14
+ resize(): Promise<Size>;
15
+ }
16
+
17
+ /**
18
+ * Configuration options for the Resizer plugin
19
+ */
20
+ export type ResizerPluginOptions = {
21
+ /** Whether to scroll the window to the top when resizing */
22
+ autoScroll: boolean;
23
+ /** The minimum width at which the renderer will resize. Also controls aspect ratio in letterbox mode */
24
+ minWidth: number;
25
+ /** The minimum height of the canvas. Also controls aspect ratio in letterbox mode */
26
+ minHeight: number;
27
+ /** Whether to letterbox the canvas to maintain aspect ratio */
28
+ letterbox: boolean;
29
+ /** Whether to center the canvas (particularly useful in letterbox mode) */
30
+ center: boolean;
31
+ /** Whether to draw debug information for visualizing canvas bounds */
32
+ debug: boolean;
33
+ };
34
+
35
+ /**
36
+ * Default options for Resizer module.
37
+ */
38
+ const defaultOptions: ResizerPluginOptions = {
39
+ autoScroll: false,
40
+ minWidth: 0,
41
+ minHeight: 0,
42
+ letterbox: false,
43
+ center: false,
44
+ debug: false,
45
+ };
46
+
47
+ export class ResizerPlugin extends Plugin<ResizerPluginOptions> implements IResizerPlugin {
48
+ public readonly id = 'resizer';
49
+ private _debugContainer: Container;
50
+ private _gfx: Graphics;
51
+ private _size: Size;
52
+ private _scale: number;
53
+ private _resizeId: number | null;
54
+
55
+ get size(): Size {
56
+ return this._size;
57
+ }
58
+
59
+ get scale(): number {
60
+ return this._scale;
61
+ }
62
+
63
+ /**
64
+ * Initializes the Resizer module.
65
+ */
66
+ async initialize(options: Partial<ResizerPluginOptions>) {
67
+ this._options = { ...defaultOptions, ...options };
68
+ }
69
+
70
+ /**
71
+ * Post-initialization of the Resizer module.
72
+ * when this is called, the renderer is already created, and the dom element has been appended
73
+ */
74
+ async postInitialize() {
75
+ this.resize();
76
+ }
77
+
78
+ async resize(): Promise<Size> {
79
+ this._cancelResize!();
80
+ return new Promise((resolve) => {
81
+ this._resizeId = requestAnimationFrame(() => {
82
+ this._resize();
83
+ resolve(this._size);
84
+ });
85
+ });
86
+ }
87
+
88
+ _cancelResize = (): void => {
89
+ if (this._resizeId) {
90
+ cancelAnimationFrame(this._resizeId);
91
+ this._resizeId = null;
92
+ }
93
+ };
94
+
95
+ _resizeInternal(w: number, h: number, minWidth: number, minHeight: number, letterbox: boolean) {
96
+ const aspectRatio = minWidth / minHeight;
97
+ let canvasWidth = w;
98
+ let canvasHeight = h;
99
+
100
+ if (letterbox) {
101
+ if (minWidth < minHeight) {
102
+ canvasWidth = canvasHeight * aspectRatio;
103
+ } else {
104
+ canvasHeight = canvasWidth / aspectRatio;
105
+ }
106
+ }
107
+
108
+ const scaleX = canvasWidth < minWidth ? minWidth / canvasWidth : 1;
109
+ const scaleY = canvasHeight < minHeight ? minHeight / canvasHeight : 1;
110
+ const scale = scaleX > scaleY ? scaleX : scaleY;
111
+ const width = Math.floor(canvasWidth * scale);
112
+ const height = Math.floor(canvasHeight * scale);
113
+
114
+ return { width, height, aspectRatio };
115
+ }
116
+ /**
117
+ * Resizes the application based on window size and module options.
118
+ */
119
+
120
+ _resize() {
121
+ const minWidth = this._options.minWidth;
122
+ const minHeight = this._options.minHeight;
123
+ const letterbox = this._options.letterbox;
124
+ const center = this._options.center;
125
+
126
+ let canvasWidth = minWidth;
127
+ let canvasHeight = minHeight;
128
+
129
+ if (this.app.config.resizeToContainer) {
130
+ const canvas = this.app.renderer.canvas;
131
+ const el = canvas?.parentElement;
132
+ const bounds = el?.getBoundingClientRect();
133
+ if (bounds) {
134
+ canvasWidth = bounds.width;
135
+ canvasHeight = bounds.height;
136
+ }
137
+ }
138
+
139
+ const { width, height, aspectRatio } = this._resizeInternal(
140
+ canvasWidth,
141
+ canvasHeight,
142
+ minWidth,
143
+ minHeight,
144
+ letterbox,
145
+ );
146
+
147
+ // Calculate renderer and canvas sizes based on current dimensions
148
+ const scaleX = canvasWidth < minWidth ? minWidth / canvasWidth : 1;
149
+ const scaleY = canvasHeight < minHeight ? minHeight / canvasHeight : 1;
150
+ const scale = scaleX > scaleY ? scaleX : scaleY;
151
+
152
+ this._scale = scale;
153
+
154
+ // Update canvas style dimensions and scroll window up to avoid issues on mobile resize
155
+ if (letterbox) {
156
+ if (canvasWidth > canvasHeight) {
157
+ // Calculate dimensions based on width
158
+ let styleWidth = canvasWidth;
159
+ let styleHeight = canvasWidth / aspectRatio;
160
+
161
+ // Constrain height if it exceeds container
162
+ if (styleHeight > canvasHeight) {
163
+ styleHeight = canvasHeight;
164
+ styleWidth = styleHeight * aspectRatio;
165
+ }
166
+
167
+ this.app.renderer.canvas.style.width = `${styleWidth}px`;
168
+ this.app.renderer.canvas.style.height = `${styleHeight}px`;
169
+ } else {
170
+ // Calculate dimensions based on height
171
+ let styleHeight = canvasHeight;
172
+ let styleWidth = canvasHeight * aspectRatio;
173
+
174
+ // Constrain width if it exceeds container
175
+ if (styleWidth > canvasWidth) {
176
+ styleWidth = canvasWidth;
177
+ styleHeight = styleWidth / aspectRatio;
178
+ }
179
+
180
+ this.app.renderer.canvas.style.height = `${styleHeight}px`;
181
+ this.app.renderer.canvas.style.width = `${styleWidth}px`;
182
+ }
183
+ if (center) {
184
+ this.app.renderer.canvas.style.position = 'absolute';
185
+ this.app.renderer.canvas.style.left = '50%';
186
+ this.app.renderer.canvas.style.top = '50%';
187
+ this.app.renderer.canvas.style.transform = `translate3d(-50%, -50%, 0)`;
188
+ }
189
+ } else {
190
+ this.app.renderer.canvas.style.width = `${canvasWidth}px`;
191
+ this.app.renderer.canvas.style.height = `${canvasHeight}px`;
192
+ }
193
+
194
+ if (this._options.autoScroll) {
195
+ window?.scrollTo(0, 0);
196
+ }
197
+
198
+ // Update renderer and navigation screens dimensions
199
+ this.app.renderer.resize(width, height);
200
+ this._size = { width, height };
201
+
202
+ if (this._options.debug) {
203
+ this._drawDebug();
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Draws debug information if debug option is enabled.
209
+ */
210
+ private _drawDebug() {
211
+ if (!this._debugContainer) {
212
+ this._debugContainer = this.app.stage.addChild(new Container());
213
+ this._gfx = this._debugContainer.add.graphics();
214
+ }
215
+
216
+ this._gfx.clear();
217
+ this._gfx.rect(0, 0, this._size.width, this._size.height);
218
+ this._gfx.stroke({ width: 4, color: 0x000fff });
219
+ }
220
+ }