@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,1091 @@
1
+ import { gsap } from 'gsap';
2
+ import type {
3
+ AppConfig,
4
+ IApplication,
5
+ IApplicationOptions,
6
+ ICaperAutomation,
7
+ ICoreFunctions,
8
+ ICoreSignals,
9
+ PauseConfig,
10
+ } from '.';
11
+ import { coreFunctionRegistry, coreSignalRegistry, generatePluginList, sortPluginsByRequires } from '.';
12
+ import type {
13
+ ActionSignal,
14
+ AppScenes,
15
+ IAssetsPlugin,
16
+ IAudioManagerPlugin,
17
+ IBreakpointPlugin,
18
+ IControls,
19
+ IFocusManagerPlugin,
20
+ Ii18nPlugin,
21
+ IInputPlugin,
22
+ IKeyboardPlugin,
23
+ IPlugin,
24
+ IPopupManagerPlugin,
25
+ IResizerPlugin,
26
+ ISceneManagerPlugin,
27
+ IWebEventsPlugin,
28
+ LoadSceneConfig,
29
+ } from '../plugins';
30
+
31
+ import type {
32
+ AssetInitOptions,
33
+ AssetsManifest,
34
+ DestroyOptions,
35
+ RendererDestroyOptions,
36
+ } from 'pixi.js';
37
+ import { Assets, Container as PIXIContainer, isMobile, Application as PIXIPApplication, Point, TextStyle } from 'pixi.js';
38
+ import type { IDataAdapter } from '../plugins/DataAdapter';
39
+ import type { IStore } from '../store';
40
+ import { Store } from '../store';
41
+ import type {
42
+ AppTypeOverrides,
43
+ Eases,
44
+ ImportList,
45
+ ImportListItem,
46
+ SceneId,
47
+ SceneLoadArgs,
48
+ Size,
49
+ } from '../utils';
50
+ import { bindAllMethods, deepMerge, getDynamicModuleFromImportListItem, isDev, isPromise, Logger } from '../utils';
51
+ import { triggerViteError } from '../utils/vite';
52
+
53
+ import { createFactoryMethods, defaultFactoryMethods } from '../mixins';
54
+ import type { IActionsPlugin } from '../plugins/actions';
55
+ import type { IVoiceOverPlugin } from '../plugins/audio/VoiceOverPlugin';
56
+ import type { ICaptionsPlugin } from '../plugins/captions';
57
+ import { defaultPlugins } from '../plugins/defaults';
58
+ import { type IDevToolsPlugin } from '../plugins/DevToolsPlugin';
59
+ import { IFullScreenPlugin } from '../plugins/FullScreenPlugin';
60
+ import { type IGSAPPlugin } from '../plugins/GSAPPlugin';
61
+ import { ILookupPlugin } from '../plugins/LookupPlugin';
62
+ import { ITimerPlugin } from '../plugins/TimerPlugin';
63
+ import { Signal } from '../signals';
64
+
65
+ type App = AppTypeOverrides['App'];
66
+ type AppContexts = AppTypeOverrides['Contexts'];
67
+ type AppActions = AppTypeOverrides['Actions'];
68
+ type AppPlugins = AppTypeOverrides['Plugins'];
69
+
70
+ function getDefaultResolution() {
71
+ return typeof window !== 'undefined' ? (window.devicePixelRatio > 1 ? 2 : 1) : 2;
72
+ }
73
+
74
+ const defaultApplicationOptions: Partial<IApplicationOptions> = {
75
+ antialias: false,
76
+ autoStart: true,
77
+ resizeToContainer: true,
78
+ backgroundColor: 0x0,
79
+ backgroundAlpha: 1,
80
+ clearBeforeRender: false,
81
+ context: null,
82
+ eventFeatures: undefined,
83
+ eventMode: undefined,
84
+ hello: false,
85
+ powerPreference: 'high-performance',
86
+ premultipliedAlpha: false,
87
+ preserveDrawingBuffer: false,
88
+ resizeTo: undefined,
89
+ sharedTicker: true,
90
+ view: undefined,
91
+ autoDensity: false,
92
+ defaultTextStyle: {
93
+ fontFamily: 'Arial',
94
+ fontSize: 20,
95
+ fontWeight: 'normal',
96
+ fontStyle: 'normal',
97
+ align: 'left',
98
+ breakWords: false,
99
+ fill: 0,
100
+ fontVariant: 'normal',
101
+ leading: 0,
102
+ letterSpacing: 0,
103
+ lineHeight: 0,
104
+ padding: 0,
105
+ stroke: undefined,
106
+ textBaseline: 'alphabetic',
107
+ trim: false,
108
+ whiteSpace: 'pre',
109
+ wordWrap: false,
110
+ wordWrapWidth: 100,
111
+ },
112
+ resolution: getDefaultResolution(), // must be 1 or 2
113
+ useHash: isDev,
114
+ showSceneDebugMenu: isDev,
115
+ showStats: isDev,
116
+ useStore: true,
117
+ useSpine: false,
118
+ useLayout: false,
119
+ useVoiceover: false,
120
+ plugins: [],
121
+ scenes: [],
122
+ defaultSceneLoadMethod: 'immediate',
123
+ assets: {
124
+ manifest: './assets.json',
125
+ },
126
+ };
127
+
128
+ const defaultPauseConfig: PauseConfig = {
129
+ pauseAudio: false,
130
+ pauseAnimations: false,
131
+ pauseTicker: false,
132
+ pauseTimers: false,
133
+ };
134
+
135
+ export class Application extends PIXIPApplication implements IApplication {
136
+ // static properties
137
+ public static containerElement: HTMLElement;
138
+
139
+ // singleton instance
140
+ public static instance: IApplication;
141
+
142
+ // method binding root
143
+ private readonly __caper_method_binding_root = true;
144
+
145
+ // debug overlay (lazy, see getter)
146
+ private _debugContainer: PIXIContainer;
147
+
148
+ // config
149
+ public config: Partial<IApplicationOptions>;
150
+ /**
151
+ * Automation facade for Playwright / agent drivers. Only assigned when
152
+ * automation is enabled (dev env, `config.automation === true`, or
153
+ * `VITE_CAPER_AUTOMATION === 'true'`); otherwise undefined.
154
+ */
155
+ public automation?: ICaperAutomation;
156
+ public plugins: ImportList<IPlugin>;
157
+ public manifest: string | AssetsManifest | undefined;
158
+ public onPause = new Signal<(config: PauseConfig) => void>();
159
+ public onResume = new Signal<(config: PauseConfig) => void>();
160
+ // signals
161
+ public onResize = new Signal<(size: Size) => void>();
162
+ /**
163
+ * Emitted when a plugin throws during initialize/postInitialize. Previously
164
+ * these failures bricked the app silently.
165
+ */
166
+ public onPluginError = new Signal<
167
+ (detail: { id: string; phase: 'initialize' | 'postInitialize'; error: unknown }) => void
168
+ >();
169
+ // plugins
170
+ public readonly _plugins: Map<string, IPlugin> = new Map();
171
+ // default plugins
172
+ protected _assetManager: IAssetsPlugin;
173
+ protected _lookup: ILookupPlugin;
174
+ protected _sceneManager: ISceneManagerPlugin;
175
+ protected _webEventsManager: IWebEventsPlugin;
176
+ protected _fullScreenPlugin: IFullScreenPlugin;
177
+ protected _keyboardManager: IKeyboardPlugin;
178
+ protected _focusManager: IFocusManagerPlugin;
179
+ protected _popupManager: IPopupManagerPlugin;
180
+ protected _timerPlugin: ITimerPlugin;
181
+ protected _audioManager: IAudioManagerPlugin;
182
+ protected _voiceoverPlugin: IVoiceOverPlugin;
183
+ protected _captionsPlugin: ICaptionsPlugin;
184
+ protected _actions: ActionSignal;
185
+ protected _isBooting: boolean = true;
186
+
187
+ protected _env: Record<string, string> = (import.meta as any).env || {};
188
+ protected _makeFactory: typeof defaultFactoryMethods;
189
+
190
+ protected _isFullScreen: boolean = false;
191
+ protected _fullScreenElement: HTMLElement | Window | null = null;
192
+
193
+ get make(): typeof defaultFactoryMethods {
194
+ if (!this._makeFactory) {
195
+ this._makeFactory = createFactoryMethods(defaultFactoryMethods, this, false);
196
+ }
197
+ return this._makeFactory;
198
+ }
199
+
200
+ get env() {
201
+ return this._env;
202
+ }
203
+
204
+ get debugContainer(): PIXIContainer {
205
+ if (!this._debugContainer) {
206
+ this._debugContainer = new PIXIContainer();
207
+ this._debugContainer.label = 'DebugOverlay';
208
+ this._debugContainer.eventMode = 'none';
209
+ this._debugContainer.interactiveChildren = false;
210
+ this.stage.addChild(this._debugContainer);
211
+ }
212
+ return this._debugContainer;
213
+ }
214
+
215
+ protected _paused: boolean = false;
216
+ protected _pauseConfig: Partial<PauseConfig> = {};
217
+
218
+ public get paused(): boolean {
219
+ return this._paused;
220
+ }
221
+
222
+ public pause(config?: Partial<PauseConfig>) {
223
+ this._paused = true;
224
+ this._pauseConfig = { ...defaultPauseConfig, ...config };
225
+ if (config?.pauseAudio) {
226
+ this.audio.pause();
227
+ }
228
+ if (config?.pauseAnimations) {
229
+ gsap?.globalTimeline?.pause();
230
+ }
231
+ if (config?.pauseTicker) {
232
+ this.ticker.stop();
233
+ }
234
+ if (config?.pauseTimers) {
235
+ this.timers.pauseAllTimers();
236
+ }
237
+ if (config?.pauseOther) {
238
+ config.pauseOther.forEach((thing) => {
239
+ if (typeof thing?.pause === 'function') {
240
+ thing.pause();
241
+ }
242
+ });
243
+ }
244
+ this.onPause.emit(this._pauseConfig);
245
+ }
246
+
247
+ public resume() {
248
+ this._paused = false;
249
+ if (this._pauseConfig.pauseAudio) {
250
+ if (this.audio.paused) {
251
+ this.audio.resume();
252
+ }
253
+ }
254
+ if (this._pauseConfig.pauseAnimations) {
255
+ if (gsap?.globalTimeline?.paused()) {
256
+ gsap?.globalTimeline?.resume();
257
+ }
258
+ }
259
+ if (this._pauseConfig.pauseTicker) {
260
+ if (!this.ticker.started) {
261
+ this.ticker.start();
262
+ }
263
+ }
264
+ if (this._pauseConfig.pauseTimers) {
265
+ this.timers.resumeAllTimers();
266
+ }
267
+ if (this._pauseConfig.pauseOther) {
268
+ this._pauseConfig.pauseOther.forEach((thing) => {
269
+ if (typeof thing?.resume === 'function') {
270
+ thing.resume();
271
+ }
272
+ });
273
+ }
274
+ if (this._pauseConfig.clearOnResume) {
275
+ this._pauseConfig = {};
276
+ }
277
+ this.onResume.emit(this._pauseConfig);
278
+ }
279
+
280
+ public togglePause(config?: Partial<PauseConfig>) {
281
+ this._paused = !this._paused;
282
+ if (this._paused) {
283
+ this.pause(config);
284
+ } else {
285
+ this.resume();
286
+ }
287
+ }
288
+
289
+ constructor() {
290
+ super();
291
+ bindAllMethods(this);
292
+ }
293
+
294
+ protected _appVersion: string | number;
295
+
296
+ public get appVersion() {
297
+ try {
298
+ this._appVersion = __CAPER_APP_VERSION;
299
+ } catch (e) {
300
+ this._appVersion = -1;
301
+ }
302
+
303
+ return this._appVersion;
304
+ }
305
+
306
+ protected _appName: string;
307
+
308
+ public get appName(): string {
309
+ if (!this._appName) {
310
+ try {
311
+ this._appName = __CAPER_APP_NAME;
312
+ } catch (e) {
313
+ this._appName = 'n/a';
314
+ }
315
+ }
316
+ return this._appName;
317
+ }
318
+
319
+ protected _i18n: Ii18nPlugin;
320
+
321
+ public get i18n(): Ii18nPlugin {
322
+ if (!this._i18n) {
323
+ this._i18n = this.getPlugin<Ii18nPlugin>('i18n');
324
+ }
325
+ return this._i18n;
326
+ }
327
+
328
+ protected _resizer: IResizerPlugin;
329
+
330
+ public get resizer(): IResizerPlugin {
331
+ if (!this._resizer) {
332
+ this._resizer = this.getPlugin<IResizerPlugin>('resizer');
333
+ }
334
+ return this._resizer;
335
+ }
336
+
337
+ protected _breakpoints: IBreakpointPlugin;
338
+
339
+ public get breakpoints(): IBreakpointPlugin {
340
+ if (!this._breakpoints) {
341
+ this._breakpoints = this.getPlugin<IBreakpointPlugin>('breakpoints');
342
+ }
343
+ return this._breakpoints;
344
+ }
345
+
346
+ // actions
347
+ protected _actionsPlugin: IActionsPlugin<AppContexts>;
348
+
349
+ public get actionsPlugin(): IActionsPlugin<AppContexts> {
350
+ if (!this._actionsPlugin) {
351
+ this._actionsPlugin = this.getPlugin<IActionsPlugin<AppContexts>>('actions');
352
+ }
353
+ return this._actionsPlugin;
354
+ }
355
+
356
+ // input
357
+ protected _input: IInputPlugin;
358
+
359
+ public get input(): IInputPlugin {
360
+ if (!this._input) {
361
+ this._input = this.getPlugin<IInputPlugin>('input');
362
+ }
363
+ return this._input;
364
+ }
365
+
366
+ // controls
367
+ public get controls(): IControls {
368
+ if (!this._input) {
369
+ this._input = this.getPlugin<IInputPlugin>('input');
370
+ }
371
+ return this._input.controls;
372
+ }
373
+
374
+ // animation
375
+ /**
376
+ * The GSAP plugin.
377
+ * @returns The GSAP plugin.
378
+ */
379
+ public get animation(): IGSAPPlugin {
380
+ return this.getPlugin<IGSAPPlugin>('GSAPPlugin');
381
+ }
382
+
383
+ /**
384
+ * The GSAP instance.
385
+ * @returns The GSAP instance.
386
+ */
387
+ public get anim(): typeof gsap {
388
+ return this.getPlugin<IGSAPPlugin>('GSAPPlugin').anim;
389
+ }
390
+ /**
391
+ * Adds one or more GSAP tweens or timelines to a specified animation context.
392
+ * This uses the GSAPPlugin's custom animation context (a Set of tweens/timelines),
393
+ * not a `gsap.Context` instance. If no contextId is provided, animations are added
394
+ * to the plugin's global collection.
395
+ * @param animation - A single GSAP tween/timeline or an array of them.
396
+ * @param contextId - Optional ID of the animation context. Defaults to the global context.
397
+ * @returns The animation(s) that were added.
398
+ */
399
+ public addAnimation(
400
+ animation: gsap.core.Tween | gsap.core.Timeline | (gsap.core.Tween | gsap.core.Timeline)[],
401
+ contextId?: string,
402
+ ): gsap.core.Tween | gsap.core.Timeline | (gsap.core.Tween | gsap.core.Timeline)[] {
403
+ return this.getPlugin<IGSAPPlugin>('GSAPPlugin').addAnimation(animation, contextId);
404
+ }
405
+
406
+ /**
407
+ * Returns the registered eases or ease names.
408
+ * @param namesOnly - If true, returns only the ease names.
409
+ * @returns The registered eases or ease names.
410
+ */
411
+ public eases(namesOnly: boolean = false): Eases | string[] {
412
+ const plugin = this.getPlugin<IGSAPPlugin>('GSAPPlugin');
413
+ return namesOnly ? plugin.easeNames : plugin.eases;
414
+ }
415
+
416
+ // store
417
+ protected _store: IStore;
418
+
419
+ public get store(): IStore {
420
+ return this._store;
421
+ }
422
+
423
+ // size
424
+ protected _center = new Point(0, 0);
425
+ public get center(): Point {
426
+ return this._center;
427
+ }
428
+
429
+ get lookup(): ILookupPlugin {
430
+ if (!this._lookup) {
431
+ this._lookup = this.getPlugin<ILookupPlugin>('lookup');
432
+ }
433
+ return this._lookup;
434
+ }
435
+
436
+ public getChildAtPath(path: string): PIXIContainer | undefined {
437
+ return this.lookup.getChildAtPath(path);
438
+ }
439
+
440
+ public getPathForChild(container: PIXIContainer): string {
441
+ return this.lookup.getPathForChild(container);
442
+ }
443
+
444
+ public getChildrenAtPaths(...paths: string[]): PIXIContainer[] {
445
+ return this.lookup.getChildrenAtPaths(...paths);
446
+ }
447
+
448
+ public getPathsForChildren(...containers: PIXIContainer[]): string[] {
449
+ return this.lookup.getPathsForChildren(...containers);
450
+ }
451
+
452
+ public getAllPaths(): string[] {
453
+ return this.lookup.getAllPaths();
454
+ }
455
+
456
+ public get assets(): IAssetsPlugin {
457
+ if (!this._assetManager) {
458
+ this._assetManager = this.getPlugin<IAssetsPlugin>('assets');
459
+ }
460
+ return this._assetManager;
461
+ }
462
+
463
+ public get scenes(): ISceneManagerPlugin {
464
+ if (!this._sceneManager) {
465
+ this._sceneManager = this.getPlugin<ISceneManagerPlugin>('scenes');
466
+ }
467
+ return this._sceneManager;
468
+ }
469
+
470
+ public loadScene<K extends SceneId>(id: K, ...args: SceneLoadArgs<K>): void;
471
+ public loadScene(scene: LoadSceneConfig | AppScenes): void;
472
+ public loadScene(sceneOrId: LoadSceneConfig | AppScenes | SceneId, ...args: unknown[]): void {
473
+ // The plugin's `loadScene` is overloaded — forward args directly.
474
+ (this.scenes.loadScene as (...a: unknown[]) => unknown)(sceneOrId, ...args);
475
+ }
476
+
477
+ public get webEvents(): IWebEventsPlugin {
478
+ if (!this._webEventsManager) {
479
+ this._webEventsManager = this.getPlugin<IWebEventsPlugin>('webEvents');
480
+ }
481
+ return this._webEventsManager;
482
+ }
483
+
484
+ public get keyboard(): IKeyboardPlugin {
485
+ if (!this._keyboardManager) {
486
+ this._keyboardManager = this.getPlugin<IKeyboardPlugin>('keyboard');
487
+ }
488
+ return this._keyboardManager;
489
+ }
490
+
491
+ public get focus(): IFocusManagerPlugin {
492
+ if (!this._focusManager) {
493
+ this._focusManager = this.getPlugin<IFocusManagerPlugin>('focus');
494
+ }
495
+ return this._focusManager;
496
+ }
497
+
498
+ get size() {
499
+ return this.resizer.size;
500
+ }
501
+
502
+ public get popups(): IPopupManagerPlugin {
503
+ if (!this._popupManager) {
504
+ this._popupManager = this.getPlugin<IPopupManagerPlugin>('popups');
505
+ }
506
+ return this._popupManager;
507
+ }
508
+
509
+ public get timers(): ITimerPlugin {
510
+ if (!this._timerPlugin) {
511
+ this._timerPlugin = this.getPlugin<ITimerPlugin>('timers');
512
+ }
513
+ return this._timerPlugin;
514
+ }
515
+
516
+ public get audio(): IAudioManagerPlugin {
517
+ if (!this._audioManager) {
518
+ this._audioManager = this.getPlugin<IAudioManagerPlugin>('audio');
519
+ }
520
+ return this._audioManager;
521
+ }
522
+
523
+ public get actionContext(): AppContexts {
524
+ return this.actionsPlugin.context;
525
+ }
526
+
527
+ public set actionContext(context: AppContexts) {
528
+ this.actionsPlugin.context = context;
529
+ }
530
+
531
+ public get voiceover(): IVoiceOverPlugin {
532
+ if (!this._voiceoverPlugin) {
533
+ this._voiceoverPlugin = this.getPlugin<IVoiceOverPlugin>('voiceover', this.config.useVoiceover);
534
+ }
535
+ return this._voiceoverPlugin;
536
+ }
537
+
538
+ public get captions(): ICaptionsPlugin {
539
+ if (!this._captionsPlugin) {
540
+ this._captionsPlugin = this.getPlugin<ICaptionsPlugin>('captions', this.config.useVoiceover);
541
+ }
542
+ return this._captionsPlugin;
543
+ }
544
+ /** Fullscreen plugin */
545
+ public get fullScreen(): IFullScreenPlugin {
546
+ if (!this._fullScreenPlugin) {
547
+ this._fullScreenPlugin = this.getPlugin<IFullScreenPlugin>('fullscreen');
548
+ }
549
+ return this._fullScreenPlugin;
550
+ }
551
+
552
+ get fullScreenElement(): HTMLElement | Window | null {
553
+ return this.fullScreen.fullScreenElement;
554
+ }
555
+
556
+ get isFullScreen(): boolean {
557
+ return this.fullScreen.isFullScreen;
558
+ }
559
+
560
+ get canFullscreen(): boolean {
561
+ return this.fullScreen.canFullscreen;
562
+ }
563
+
564
+ public setFullScreenElement(value: HTMLElement | Window | null) {
565
+ this.fullScreen.setFullScreenElement(value);
566
+ }
567
+
568
+ public setFullScreen(value: boolean) {
569
+ this.fullScreen.setFullScreen(value);
570
+ }
571
+
572
+ public toggleFullScreen() {
573
+ this.fullScreen.toggleFullScreen();
574
+ }
575
+ /** End Fullscreen plugin */
576
+
577
+ get isMobile() {
578
+ return isMobile.any;
579
+ }
580
+
581
+ get isTouch() {
582
+ return 'ontouchstart' in window || navigator.maxTouchPoints > 0;
583
+ }
584
+
585
+ get signal(): ICoreSignals {
586
+ return coreSignalRegistry;
587
+ }
588
+
589
+ get signals(): ICoreSignals {
590
+ return this.signal;
591
+ }
592
+
593
+ get func(): ICoreFunctions {
594
+ return coreFunctionRegistry;
595
+ }
596
+
597
+ get exec(): ICoreFunctions {
598
+ return this.func;
599
+ }
600
+
601
+ // views
602
+ protected _views: any[];
603
+
604
+ public get views(): any[] {
605
+ if (!this._views) {
606
+ this._views = [this.scenes.view, this.popups.view];
607
+ if (this.scenes.splash.view) {
608
+ this._views.push(this.scenes.splash.view);
609
+ }
610
+ if (this.scenes.transition) {
611
+ this._views.push(this.scenes.transition);
612
+ }
613
+ if (this.captions?.view) {
614
+ this._views.push(this.captions.view);
615
+ }
616
+ }
617
+
618
+ return this._views;
619
+ }
620
+
621
+ public static getInstance<T extends App = App>(): T {
622
+ if (!Application.instance) {
623
+ Logger.warn('Application not created yet');
624
+ }
625
+
626
+ return Application.instance as T;
627
+ }
628
+
629
+ /**
630
+ * Destroy the application
631
+ * This will destroy all plugins and the store
632
+ * @param {RendererDestroyOptions} rendererDestroyOptions
633
+ * @param {DestroyOptions} options
634
+ */
635
+ public destroy(rendererDestroyOptions?: RendererDestroyOptions, options?: DestroyOptions) {
636
+ this._plugins.forEach((plugin) => {
637
+ plugin.destroy();
638
+ });
639
+ this.store.destroy();
640
+ super.destroy(rendererDestroyOptions, options);
641
+ }
642
+
643
+ public setContainer(container: HTMLElement) {
644
+ Application.containerElement = container;
645
+ }
646
+
647
+ public async initialize(config: Partial<AppConfig>, el?: HTMLElement): Promise<AppTypeOverrides['App']> {
648
+ if (Application.instance) {
649
+ throw new Error('Application is already initialized');
650
+ }
651
+ Application.instance = this as unknown as IApplication;
652
+
653
+ this.config = deepMerge(defaultApplicationOptions, config);
654
+ this.signals.onResize = this.onResize;
655
+
656
+ if (config.container) {
657
+ Application.containerElement = config.container;
658
+ }
659
+ // initialize the logger
660
+ Logger.initialize(this.config.logger);
661
+
662
+ // ensure the resolution is 1 or 2
663
+ if (this.config.resolution !== 1 && this.config.resolution !== 2) {
664
+ const userResolution = this.config.resolution;
665
+ this.config.resolution = getDefaultResolution();
666
+ Logger.warn(
667
+ `App resolution must be 1 or 2, setting to ${this.config.resolution} instead of ${userResolution}. Modify your app config to set the resolution to 1 or 2.`,
668
+ );
669
+ }
670
+
671
+ await this.boot(this.config);
672
+ await this.initAssets();
673
+
674
+ // initialize the pixi application
675
+ await this.init(this.config);
676
+ this.stage.label = 'Stage';
677
+
678
+ if (this.config.defaultTextStyle) {
679
+ const style = { ...defaultApplicationOptions.defaultTextStyle, ...this.config.defaultTextStyle };
680
+ TextStyle.defaultTextStyle = style;
681
+ }
682
+ if (this.config.defaultDropShadow) {
683
+ TextStyle.defaultDropShadow = this.config.defaultDropShadow;
684
+ }
685
+ if (el) {
686
+ el.appendChild(this.canvas as HTMLCanvasElement);
687
+ this.setContainer(el);
688
+ } else {
689
+ throw new Error('No element found to append the view to.');
690
+ }
691
+ await this.registerDefaultPlugins();
692
+
693
+ if (isDev) {
694
+ this.getPlugin<IDevToolsPlugin>('DevToolsPlugin').initializeDevTools(this);
695
+ }
696
+
697
+ this.signals.onLoadRequiredComplete.connectOnce(this.requiredAssetsLoaded);
698
+
699
+ // internal setup
700
+ await this._setup();
701
+
702
+ this.plugins = await generatePluginList(this.config.plugins || []);
703
+
704
+ // register the applications custom plugins (storage-capable or not — one pipeline)
705
+ await this.registerPlugins();
706
+
707
+ await this.setup();
708
+ await this.loadDefaultScene();
709
+
710
+ // focus the canvas
711
+ this.renderer.canvas.focus();
712
+
713
+ if (this.config.container) {
714
+ this.config.container.classList.add('loaded');
715
+ }
716
+
717
+ this._isBooting = false;
718
+ // return the Application instance to the create method, if needed
719
+ return Application.instance as unknown as App;
720
+ }
721
+
722
+ public getPlugin<T extends IPlugin>(pluginName: AppPlugins, debug: boolean = false): T {
723
+ const plugin = this._plugins.get(pluginName) as T;
724
+ if (!plugin && debug) {
725
+ Logger.warn(`Plugin with name "${pluginName}" not found.`);
726
+ }
727
+ return plugin;
728
+ }
729
+
730
+ /**
731
+ * Framework post-initialization. Always runs the plugin `postInitialize` loop and
732
+ * core wiring, then invokes the user-overridable {@link postInitialize} hook last.
733
+ * The runtime (`create()`) calls this — apps should not call it directly, and must
734
+ * NOT need to call `super` from their own `postInitialize` override to get wired up.
735
+ */
736
+ async _postInitialize(): Promise<void> {
737
+ // start plugins
738
+ for (const plugin of this._plugins.values()) {
739
+ try {
740
+ await plugin.postInitialize(this as unknown as IApplication);
741
+ } catch (error) {
742
+ // Surfaced (not just logged) so a plugin that silently fails to wire up —
743
+ // e.g. InputPlugin's controls.connect() — is visible in dev, not invisible.
744
+ triggerViteError({
745
+ message: `Plugin "${plugin.id}" failed in postInitialize: ${error instanceof Error ? error.message : String(error)}`,
746
+ stack: error instanceof Error ? error.stack : undefined,
747
+ });
748
+ this.onPluginError.emit({ id: plugin.id, phase: 'postInitialize', error });
749
+ }
750
+ }
751
+
752
+ this.webEvents.onVisibilityChanged.connect((visible) => {
753
+ if (visible) {
754
+ this.audio.restore();
755
+ this.timers.resumeAllTimers();
756
+ } else {
757
+ this.audio.suspend();
758
+ this.timers.pauseAllTimers();
759
+ }
760
+ });
761
+
762
+ // User hook, run last. Framework wiring above always runs regardless of whether
763
+ // a subclass override calls super, so overriding `postInitialize` is footgun-free.
764
+ await this.postInitialize();
765
+ }
766
+
767
+ /**
768
+ * User-overridable post-initialization hook, invoked after all framework wiring is
769
+ * complete. Override to perform app setup that depends on a fully initialized
770
+ * environment. Safe to override WITHOUT calling `super` — framework post-init lives
771
+ * in {@link _postInitialize}, which the runtime calls.
772
+ */
773
+ async postInitialize(): Promise<void> {}
774
+
775
+ public getUnloadedPlugin(id: string): ImportListItem<IPlugin> | undefined {
776
+ return this.plugins.find((pluginItem) => pluginItem.id === id);
777
+ }
778
+
779
+ async loadPlugin(listItem: ImportListItem, isDefault: boolean = false) {
780
+ if (this._plugins.has(listItem.id)) {
781
+ return await this.registerPlugin(this._plugins.get(listItem.id)!, listItem.options);
782
+ }
783
+ const plugin = await getDynamicModuleFromImportListItem(listItem);
784
+ const pluginInstance = new plugin(listItem.id);
785
+ if (pluginInstance.id !== listItem.id) {
786
+ pluginInstance.id = listItem.id;
787
+ }
788
+ let opts = listItem.options;
789
+ if (isDefault && !opts) {
790
+ opts = this.config[pluginInstance.id as keyof IApplicationOptions];
791
+ }
792
+ return await this.registerPlugin(pluginInstance, opts);
793
+ }
794
+
795
+ /**
796
+ * Gets an ActionSignal for the specified action type
797
+ * @template TActionData - The type of data associated with the action
798
+ * @param {A} action - The action to get the signal for
799
+ * @returns {ActionSignal<TActionData>} A signal that can be used to listen for the action
800
+ * @example
801
+ * // Listen for a 'jump' action
802
+ * app.actions('jump').connect((data) => {
803
+ * player.jump(data.power);
804
+ * });
805
+ */
806
+ public actions<TActionData = any>(action: AppActions): ActionSignal<TActionData> {
807
+ return this.actionsPlugin.getAction<TActionData>(action as string);
808
+ }
809
+
810
+ /**
811
+ * Dispatches an action with optional data
812
+ * @template TActionData - The type of data to send with the action
813
+ * @param {A} action - The action to dispatch
814
+ * @param {TActionData} [data] - Optional data to send with the action
815
+ * @example
816
+ * // Send a 'jump' action with power data
817
+ * app.sendAction('jump', { power: 100 });
818
+ */
819
+ public sendAction<TActionData = any>(action: AppActions, data?: TActionData) {
820
+ this.actionsPlugin.sendAction<TActionData>(action as string, data);
821
+ }
822
+
823
+ /**
824
+ * Dispatches an action with optional data
825
+ * alias for sendAction
826
+ * @template TActionData - The type of data to send with the action
827
+ * @param {A} action - The action to dispatch
828
+ * @param {TActionData} [data] - Optional data to send with the action
829
+ * @example
830
+ * // Send a 'jump' action with power data
831
+ * app.action('jump', { power: 100 });
832
+ */
833
+ public action<TActionData = any>(action: AppActions, data?: TActionData) {
834
+ this.sendAction(action, data);
835
+ }
836
+
837
+ /**
838
+ * Checks if an action is currently active
839
+ * @param {A} action - The action to check
840
+ * @returns {boolean} True if the action is active, false otherwise
841
+ * @example
842
+ * // Check if the 'run' action is active
843
+ * if (app.isActionActive('run')) {
844
+ * player.updateSpeed(runningSpeed);
845
+ * }
846
+ */
847
+ public isActionActive(action: AppActions): boolean {
848
+ return this.actionsPlugin.getActions()[action as string] !== undefined;
849
+ }
850
+
851
+ /**
852
+ * The built-in DataAdapter plugin (in-memory game data with optional
853
+ * localStorage backup). Routed through the plugin registry, not `store` —
854
+ * its API is richer than generic save/load.
855
+ */
856
+ public get data(): IDataAdapter {
857
+ return this.getPlugin<IPlugin & IDataAdapter>('data');
858
+ }
859
+
860
+ protected async boot(config?: Partial<IApplicationOptions>): Promise<void> {
861
+ this.config = { ...defaultApplicationOptions, ...config };
862
+ await this.preInitialize(this.config);
863
+ }
864
+
865
+ protected async preInitialize(config: Partial<IApplicationOptions>): Promise<void> {
866
+ const { id } = config;
867
+ this._appName = id!;
868
+
869
+ if (isDev) {
870
+ await this.loadPlugin({
871
+ id: 'DevToolsPlugin',
872
+ module: () => import('../plugins/DevToolsPlugin'),
873
+ namedExport: 'DevToolsPlugin',
874
+ });
875
+ }
876
+
877
+ if (config.useLayout) {
878
+ await this.loadPlugin({
879
+ id: 'LayoutPlugin',
880
+ module: () => import('../plugins/LayoutPlugin'),
881
+ namedExport: 'LayoutPlugin',
882
+ });
883
+ }
884
+ await this.loadPlugin({
885
+ id: 'GSAPPlugin',
886
+ module: () => import('../plugins/GSAPPlugin'),
887
+ namedExport: 'GSAPPlugin',
888
+ });
889
+ if (config.useSpine) {
890
+ await this.loadPlugin({
891
+ id: 'SpinePlugin',
892
+ module: () => import('../plugins/spine/SpinePlugin'),
893
+ namedExport: 'SpinePlugin',
894
+ });
895
+ }
896
+
897
+ if (this.config.useStore) {
898
+ this._store = new Store();
899
+ this._store.initialize(this as unknown as IApplication);
900
+ // Register the built-in DataAdapter as a normal plugin so it lives in
901
+ // `_plugins` alongside everything else.
902
+ await this.loadPlugin({
903
+ id: 'data',
904
+ module: () => import('../plugins/DataAdapter'),
905
+ namedExport: 'DataAdapter',
906
+ options: this.config.data,
907
+ });
908
+ }
909
+ }
910
+
911
+ // plugins
912
+ protected async registerPlugin(plugin: IPlugin, options?: any) {
913
+ if (this._plugins.has(plugin.id)) {
914
+ Logger.warn(`Plugin with id "${plugin.id}" already registered. Not registering.`);
915
+ return plugin.initialize(options, this as unknown as IApplication);
916
+ }
917
+ plugin.registerCoreFunctions();
918
+ plugin.registerCoreSignals();
919
+ this._plugins.set(plugin.id, plugin);
920
+ try {
921
+ return await plugin.initialize(options, this as unknown as IApplication);
922
+ } catch (error) {
923
+ triggerViteError({
924
+ message: `Plugin "${plugin.id}" failed to initialize: ${error instanceof Error ? error.message : String(error)}`,
925
+ stack: error instanceof Error ? error.stack : undefined,
926
+ });
927
+ this.onPluginError.emit({ id: plugin.id, phase: 'initialize', error });
928
+ return undefined;
929
+ }
930
+ }
931
+
932
+ protected async registerDefaultPlugins() {
933
+ for (let i = 0; i < defaultPlugins.length; i++) {
934
+ const listItem = defaultPlugins[i];
935
+ await this.loadPlugin(listItem, true);
936
+ }
937
+ const showStats = this.config.showStats === true || (isDev && this.config.showStats !== false);
938
+ if (showStats) {
939
+ await this.loadPlugin({
940
+ id: 'stats',
941
+ module: () => import('../plugins/StatsPlugin'),
942
+ namedExport: 'StatsPlugin',
943
+ });
944
+ }
945
+ if (this.config.useVoiceover) {
946
+ await this.loadPlugin({
947
+ id: 'voiceover',
948
+ module: () => import('../plugins/audio/VoiceOverPlugin'),
949
+ namedExport: 'VoiceOverPlugin',
950
+ options: this.config['voiceover' as keyof IApplicationOptions] || undefined,
951
+ });
952
+ await this.loadPlugin({
953
+ id: 'captions',
954
+ module: () => import('../plugins/captions/CaptionsPlugin'),
955
+ namedExport: 'CaptionsPlugin',
956
+ options: this.config['captions' as keyof IApplicationOptions] || undefined,
957
+ });
958
+ }
959
+ }
960
+
961
+ protected async registerPlugins() {
962
+ if (!this.plugins?.length) {
963
+ return;
964
+ }
965
+
966
+ // Topologically sort by `requires` so a plugin's dependencies always
967
+ // initialize first, regardless of the order in caper.config.ts. Fails
968
+ // bootstrap loudly on missing required plugins or dependency cycles —
969
+ // see Plugin docs for the rationale (we want the config file to be
970
+ // the single source of truth for active plugins, not auto-resolve).
971
+ const sorted = sortPluginsByRequires(this.plugins);
972
+
973
+ for (const p of sorted) {
974
+ if (p.autoLoad) {
975
+ await this.loadPlugin(p);
976
+ }
977
+ }
978
+ }
979
+
980
+ /**
981
+ * This is called after the required assets are loaded
982
+ * You can be sure that all the assets on the assets.preload from caper.config are loaded
983
+ * @protected
984
+ */
985
+ protected requiredAssetsLoaded(): Promise<void> | void;
986
+
987
+ protected async requiredAssetsLoaded(): Promise<void> {
988
+ // override me
989
+ }
990
+ /**
991
+ * This is called after the application is initialized
992
+ * You can be sure that
993
+ * - all plugins are registered
994
+ * - the store is created, with all storage adapters registered
995
+ * @protected
996
+ */
997
+ protected setup(): Promise<void> | void;
998
+
999
+ protected async setup(): Promise<void> {
1000
+ // override me to set up application specific stuff
1001
+ }
1002
+
1003
+ protected async initAssets(): Promise<void> {
1004
+ const opts: Partial<AssetInitOptions> = this.config.assets?.initOptions || {};
1005
+ let manifest = this.config.assets?.manifest || opts.manifest;
1006
+ if (isPromise(manifest)) {
1007
+ manifest = await manifest;
1008
+ }
1009
+ opts.manifest = manifest as AssetsManifest;
1010
+ opts.basePath = opts.basePath || './assets';
1011
+ await Assets.init(opts);
1012
+ /** @ts-expect-error manifest is not a public property */
1013
+ this.manifest = Assets.resolver._manifest;
1014
+ }
1015
+
1016
+ protected async loadDefaultScene(): Promise<void> {
1017
+ return this.scenes.loadDefaultScene();
1018
+ }
1019
+
1020
+ private async _resize(): Promise<Size> {
1021
+ // Wait for DOM content to be loaded
1022
+ if (document.readyState !== 'complete') {
1023
+ await new Promise<void>((resolve) => {
1024
+ window.addEventListener('load', () => resolve(), { once: true });
1025
+ });
1026
+ }
1027
+
1028
+ // Add a small delay to ensure canvas dimensions are set
1029
+ await new Promise((resolve) => setTimeout(resolve, 50));
1030
+
1031
+ return new Promise((resolve) => {
1032
+ this.resizer.resize().then((size) => {
1033
+ this._center.set(size.width * 0.5, size.height * 0.5);
1034
+
1035
+ this.views.forEach((view) => {
1036
+ if (!view || !view.position) {
1037
+ return;
1038
+ }
1039
+ view.position.set(this._center.x, this._center.y);
1040
+ });
1041
+ this.onResize.emit(this.size);
1042
+ resolve(size);
1043
+ });
1044
+ });
1045
+ }
1046
+ /**
1047
+ * Called after the application is initialized
1048
+ * Here we add application specific signal listeners, etc
1049
+ * @returns {Promise<void>}
1050
+ * @private
1051
+ */
1052
+ private async _setup(): Promise<void> {
1053
+ // connect onResize signal
1054
+ this.webEvents.onResize.connect(this._resize, -1);
1055
+
1056
+ await this._resize();
1057
+
1058
+ if (this.scenes.splash?.view && this.scenes.splash.zOrder === 'bottom') {
1059
+ this._addSplash();
1060
+ }
1061
+ // scene manager
1062
+ this.scenes.view.label = 'SceneManager';
1063
+ this.stage.addChild(this.scenes.view);
1064
+
1065
+ if (this.scenes.splash?.view && this.scenes.splash.zOrder === 'top') {
1066
+ this._addSplash();
1067
+ }
1068
+
1069
+ if (this.scenes.transition) {
1070
+ this.scenes.transition.label = 'Transition';
1071
+ this.stage.addChild(this.scenes.transition);
1072
+ }
1073
+
1074
+ // popup manager
1075
+ this.stage.addChild(this.popups.view);
1076
+
1077
+ // focus manager
1078
+ this.focus.view.label = 'FocusManager';
1079
+ this.stage.addChild(this.focus.view);
1080
+
1081
+ // is touch device
1082
+ return Promise.resolve();
1083
+ }
1084
+
1085
+ private _addSplash() {
1086
+ if (this.scenes.splash.view) {
1087
+ this.scenes.splash.view.label = 'Splash';
1088
+ this.stage.addChild(this.scenes.splash.view);
1089
+ }
1090
+ }
1091
+ }