@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,61 @@
1
+ /**
2
+ * Runtime registry for `this.add.entity(id, props)` lookups.
3
+ *
4
+ * The Vite plugin's entity discovery emits a `virtual:caper-entities` module
5
+ * with static imports by default (`defaultDynamic: false` in
6
+ * `discoverLocalClassFiles`). The `caper-runtime` virtual module pulls that
7
+ * list onto `globalThis.Caper.entityList` before the Application starts, so
8
+ * by the time any scene fires `initialize()` and calls `this.add.entity`,
9
+ * the list is in place.
10
+ *
11
+ * This registry is populated lazily on first lookup — no explicit bootstrap
12
+ * step needed. Entities declared with `defineEntity({ dynamic: true })` have
13
+ * an async `module` function and are skipped: the sync factory API can't
14
+ * wait for them. That's an intentional tradeoff — if a project needs code-
15
+ * split entities, they use `add.existing(new Foo(...), props)` with a
16
+ * manual lazy import instead.
17
+ */
18
+
19
+ type EntityConstructor = new (props?: unknown) => unknown;
20
+
21
+ type EntityListItem = {
22
+ id: string;
23
+ active?: boolean;
24
+ module?: EntityConstructor | (() => Promise<unknown>);
25
+ };
26
+
27
+ let registry: Map<string, EntityConstructor> | null = null;
28
+
29
+ function ensureRegistry(): Map<string, EntityConstructor> {
30
+ if (registry) return registry;
31
+ registry = new Map();
32
+ const list: EntityListItem[] =
33
+ (globalThis as unknown as { Caper?: { get?: (key: string) => unknown } }).Caper?.get?.(
34
+ 'entityList',
35
+ ) as EntityListItem[] | undefined ?? [];
36
+ for (const item of list) {
37
+ if (item.active === false) continue;
38
+ if (typeof item.module === 'function' && item.module.prototype) {
39
+ registry.set(item.id, item.module as EntityConstructor);
40
+ }
41
+ // Dynamic (arrow-function) modules have no prototype — skipped, since
42
+ // `this.add.entity` is sync and can't await a dynamic import.
43
+ }
44
+ return registry;
45
+ }
46
+
47
+ export function getEntityCtor(id: string): EntityConstructor | undefined {
48
+ return ensureRegistry().get(id);
49
+ }
50
+
51
+ export function getRegisteredEntityIds(): string[] {
52
+ return [...ensureRegistry().keys()];
53
+ }
54
+
55
+ /**
56
+ * Reset the registry. Test-only — production code should rely on the lazy
57
+ * initialization from `globalThis.Caper.entityList`.
58
+ */
59
+ export function _resetEntityRegistry(): void {
60
+ registry = null;
61
+ }
@@ -0,0 +1,153 @@
1
+ // Import from source files directly (not via the `../../utils` barrel) so
2
+ // the test runtime doesn't transitively pull in display/Container → the
3
+ // Factory mixin chain → const.ts. That cycle is fine for bundled builds
4
+ // but breaks vitest module evaluation when the test imports from here.
5
+ import { omitKeys } from '../../utils/object';
6
+ import {
7
+ resolveAnchor,
8
+ resolvePivot,
9
+ resolvePosition,
10
+ resolveScale,
11
+ resolveUnknownKeys,
12
+ } from './utils';
13
+
14
+ /**
15
+ * Common prop resolvers the schema helper can apply after constructing an
16
+ * instance. Each entry corresponds to one of the `resolveXxx` utilities and
17
+ * reads its inputs from the raw props object — so `'position'` consumes
18
+ * `{ position, x, y }`, `'scale'` consumes `{ scale, scaleX, scaleY }`,
19
+ * etc.
20
+ */
21
+ export type FactoryApply = 'position' | 'scale' | 'pivot' | 'anchor';
22
+
23
+ /**
24
+ * Schema describing a single factory method. Owned by the method's entry in
25
+ * `defaultFactoryMethods`; `buildFactoryMethod` consumes it to produce a
26
+ * typed `(props?: Props) => Instance` function with the standard
27
+ * resolve-position / resolve-scale / resolve-pivot / resolve-anchor
28
+ * post-construct pipeline and an automatic unknown-keys passthrough.
29
+ *
30
+ * The point of pushing every method through this shape is to collapse the
31
+ * copy-paste construction boilerplate in [const.ts](./const.ts): each
32
+ * method becomes (a) `build` — the bespoke constructor call that may
33
+ * reshape the props before handing them to Pixi — and (b) a list of which
34
+ * common resolvers to run. Everything else (unknowns passthrough, optional
35
+ * props guard, etc.) is centralized.
36
+ */
37
+ export interface FactorySchema<Props, Instance> {
38
+ /**
39
+ * Bespoke construction. Receives the raw Caper-shaped props (possibly
40
+ * undefined) and returns a new instance. Any reshaping Caper does for DX
41
+ * — Sprite's `{asset, sheet}` → texture resolution, Text's top-level
42
+ * style flattening, Container's config/extras split — lives here.
43
+ */
44
+ build: (props: Props | undefined) => Instance;
45
+
46
+ /**
47
+ * Which common resolvers to run on the instance after `build` returns.
48
+ * Defaults to `['position', 'scale', 'pivot']` when omitted — the lowest
49
+ * common denominator that every display object supports. Classes with an
50
+ * `anchor` field (Sprite, Text, AnimatedSprite, Spine) opt in to
51
+ * `'anchor'` explicitly.
52
+ */
53
+ applies?: readonly FactoryApply[];
54
+
55
+ /**
56
+ * Keys the `build` callback already consumed — excluded from the
57
+ * unknown-keys passthrough so Caper doesn't try to set them on the
58
+ * instance a second time. For example, Sprite's schema excludes `asset`
59
+ * and `sheet` (consumed by `resolveTexture`), Text's schema excludes
60
+ * `text`, `roundPixels`, `resolution`, `style`, `anchor`, and `pivot`.
61
+ */
62
+ exclude?: readonly string[];
63
+ }
64
+
65
+ const DEFAULT_APPLIES: readonly FactoryApply[] = ['position', 'scale', 'pivot'];
66
+
67
+ /**
68
+ * Keys automatically excluded from the unknown-keys passthrough because
69
+ * they're either consumed by a resolver listed in `applies` or are a
70
+ * shorthand alias for one that is. Listed here so individual schemas don't
71
+ * have to re-declare them.
72
+ */
73
+ const RESOLVER_KEYS: readonly string[] = [
74
+ 'position',
75
+ 'x',
76
+ 'y',
77
+ 'scale',
78
+ 'scaleX',
79
+ 'scaleY',
80
+ 'pivot',
81
+ 'anchor',
82
+ ];
83
+
84
+ /**
85
+ * Build a typed factory method from a schema. The return type preserves
86
+ * the `(props?: Props) => Instance` shape TypeScript uses to drive
87
+ * autocomplete on `this.add.*({...})` call sites.
88
+ *
89
+ * Behavior mirrors the hand-written factory method pattern:
90
+ * 1. Call `schema.build(props)` to get the instance.
91
+ * 2. If props were passed, apply each resolver in `schema.applies`
92
+ * (position / scale / pivot / anchor).
93
+ * 3. Forward any remaining keys to `resolveUnknownKeys` for the common
94
+ * pass-through surface (`alpha`, `visible`, `label`, `eventMode`, etc.)
95
+ * minus any keys the `build` callback already consumed.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * sprite: buildFactoryMethod<Partial<SpriteProps>, Sprite>({
100
+ * build: (props) => new Sprite(props ? resolveTexture(props) : undefined),
101
+ * applies: ['position', 'scale', 'pivot', 'anchor'],
102
+ * exclude: ['asset', 'sheet'],
103
+ * }),
104
+ * ```
105
+ */
106
+ export function buildFactoryMethod<Props, Instance>(
107
+ schema: FactorySchema<Props, Instance>,
108
+ ): (props?: Props) => Instance {
109
+ const applies = schema.applies ?? DEFAULT_APPLIES;
110
+ const applyPosition = applies.includes('position');
111
+ const applyScale = applies.includes('scale');
112
+ const applyPivot = applies.includes('pivot');
113
+ const applyAnchor = applies.includes('anchor');
114
+ const excludeKeys = [...RESOLVER_KEYS, ...(schema.exclude ?? [])];
115
+
116
+ return (props?: Props): Instance => {
117
+ const instance = schema.build(props);
118
+ if (props === undefined || props === null) return instance;
119
+
120
+ // Post-construct resolvers. Each reads from the raw props object so the
121
+ // schema doesn't have to pre-extract them.
122
+ const rawProps = props as unknown as Record<string, unknown>;
123
+ if (applyPosition) {
124
+ resolvePosition(
125
+ { position: rawProps.position as never, x: rawProps.x as never, y: rawProps.y as never },
126
+ instance as unknown as object,
127
+ );
128
+ }
129
+ if (applyScale) {
130
+ resolveScale(
131
+ {
132
+ scale: rawProps.scale as never,
133
+ scaleX: rawProps.scaleX as never,
134
+ scaleY: rawProps.scaleY as never,
135
+ },
136
+ instance as unknown as object,
137
+ );
138
+ }
139
+ if (applyPivot) {
140
+ resolvePivot(rawProps.pivot as never, instance as unknown as object);
141
+ }
142
+ if (applyAnchor) {
143
+ resolveAnchor(rawProps.anchor as never, instance as unknown as object);
144
+ }
145
+
146
+ // Forward any remaining keys via the passthrough. Excludes the keys
147
+ // already handled by the resolvers above plus anything the schema's
148
+ // `build` callback consumed.
149
+ const rest = omitKeys(excludeKeys, rawProps);
150
+ resolveUnknownKeys(rest, instance);
151
+ return instance;
152
+ };
153
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Runtime registry for `this.add.ui(id, props)` lookups.
3
+ *
4
+ * Mirrors the entity registry pattern exactly. The Vite plugin's UI
5
+ * discovery emits a `virtual:caper-uis` module with static imports by
6
+ * default (`defaultDynamic: false`). The `caper-runtime` virtual module
7
+ * pulls that list onto `globalThis.Caper.uiList` before the Application
8
+ * starts.
9
+ *
10
+ * Populated lazily on first lookup — no explicit bootstrap step needed.
11
+ */
12
+
13
+ type UIConstructor = new (props?: unknown) => unknown;
14
+
15
+ type UIListItem = {
16
+ id: string;
17
+ active?: boolean;
18
+ module?: UIConstructor | (() => Promise<unknown>);
19
+ };
20
+
21
+ let registry: Map<string, UIConstructor> | null = null;
22
+
23
+ function ensureRegistry(): Map<string, UIConstructor> {
24
+ if (registry) return registry;
25
+ registry = new Map();
26
+ const list: UIListItem[] =
27
+ (globalThis as unknown as { Caper?: { get?: (key: string) => unknown } }).Caper?.get?.(
28
+ 'uiList',
29
+ ) as UIListItem[] | undefined ?? [];
30
+ for (const item of list) {
31
+ if (item.active === false) continue;
32
+ if (typeof item.module === 'function' && item.module.prototype) {
33
+ registry.set(item.id, item.module as UIConstructor);
34
+ }
35
+ // Dynamic (arrow-function) modules have no prototype — skipped, since
36
+ // `this.add.ui` is sync and can't await a dynamic import.
37
+ }
38
+ return registry;
39
+ }
40
+
41
+ export function getUICtor(id: string): UIConstructor | undefined {
42
+ return ensureRegistry().get(id);
43
+ }
44
+
45
+ export function getRegisteredUIIds(): string[] {
46
+ return [...ensureRegistry().keys()];
47
+ }
48
+
49
+ /**
50
+ * Reset the registry. Test-only.
51
+ */
52
+ export function _resetUIRegistry(): void {
53
+ registry = null;
54
+ }
@@ -0,0 +1,130 @@
1
+ import { Assets, Graphics, Sprite, Spritesheet, Texture } from 'pixi.js';
2
+ import { Logger, PointLike, resolvePointLike } from '../../utils';
3
+
4
+ import { Application } from '../../core/Application';
5
+ import { PositionProps, ScaleProps, TextureProps } from './props';
6
+
7
+ let errorTexture: Texture | undefined;
8
+
9
+ export function resolveUnknownKeys(props: any, entity: any) {
10
+ for (const key in props) {
11
+ try {
12
+ (entity as any)[key] = props[key];
13
+ } catch (e) {
14
+ Logger.warn(`Error setting property ${key}`, e);
15
+ }
16
+ }
17
+ }
18
+
19
+ export function getErrorTexture() {
20
+ if (!errorTexture) {
21
+ const gfx = new Graphics();
22
+ gfx.rect(0, 0, 100, 100);
23
+ gfx.fill({ color: 0xff0000 });
24
+ gfx.stroke({ color: 0xffffff, width: 1, alignment: 0 });
25
+ // draw an X across the rectangle
26
+ gfx.moveTo(0, 0);
27
+ gfx.lineTo(100, 100);
28
+ gfx.moveTo(100, 0);
29
+ gfx.lineTo(0, 100);
30
+ gfx.stroke({ color: 0xffffff, width: 2, alignment: 0.5 });
31
+ errorTexture = Application.getInstance().renderer.generateTexture(gfx);
32
+ gfx.destroy();
33
+ }
34
+ return errorTexture;
35
+ }
36
+
37
+ export function resolveTexture(props?: Partial<TextureProps>): Texture {
38
+ let texture: Texture | undefined;
39
+ const asset = props?.asset;
40
+ const assetAsString = asset as string;
41
+ const sheet = props?.sheet;
42
+ if (asset instanceof Texture) {
43
+ texture = asset;
44
+ } else if (!sheet || sheet?.length === 0) {
45
+ if (Assets.cache.has(assetAsString)) {
46
+ texture = Assets.get(assetAsString)!;
47
+ } else if (Assets.get(assetAsString)) {
48
+ texture = Assets.get(assetAsString).texture!;
49
+ } else {
50
+ Logger.error('Asset "' + asset + '" not loaded into Pixi cache');
51
+ texture = getErrorTexture();
52
+ //throw new Error('Asset "' + asset + '" not loaded into Pixi cache');
53
+ }
54
+ } else {
55
+ if (!Assets.get(sheet)) {
56
+ // throw new Error('Spritesheet "' + sheet + '" not loaded into Pixi cache');
57
+ Logger.error('Spritesheet "' + sheet + '" not loaded into Pixi cache');
58
+ return getErrorTexture();
59
+ } else {
60
+ const spriteSheet: Spritesheet = Assets.get(sheet) as Spritesheet;
61
+ const textures = spriteSheet.textures;
62
+ if (textures !== undefined) {
63
+ // eslint-disable-next-line no-prototype-builtins
64
+ if (textures.hasOwnProperty(assetAsString)) {
65
+ texture = textures[assetAsString];
66
+ } else if (spriteSheet.linkedSheets !== undefined && spriteSheet.linkedSheets.length > 0) {
67
+ for (const linkedSheet of spriteSheet.linkedSheets) {
68
+ // eslint-disable-next-line no-prototype-builtins
69
+ if (linkedSheet.textures !== undefined && linkedSheet.textures.hasOwnProperty(assetAsString)) {
70
+ texture = linkedSheet.textures[assetAsString];
71
+ break;
72
+ }
73
+ }
74
+ if (texture === undefined) {
75
+ Logger.error(
76
+ 'Asset "' + asset + '" not found inside spritesheet "' + asset + "' or any of its linked sheets",
77
+ );
78
+ texture = getErrorTexture();
79
+ }
80
+ } else {
81
+ Logger.error('Asset "' + asset + '" not found inside spritesheet "' + sheet + "'");
82
+ texture = getErrorTexture();
83
+ }
84
+ } else {
85
+ Logger.error('Spritesheet "' + sheet + '" loaded but textures arent?!');
86
+ texture = getErrorTexture();
87
+ }
88
+ }
89
+ }
90
+ return texture || new Sprite().texture;
91
+ }
92
+
93
+ export function resolvePosition(props: Partial<PositionProps>, entity: any) {
94
+ const pos = resolvePointLike(props.position, false, props.x, props.y);
95
+ entity.x = pos.x;
96
+ entity.y = pos.y;
97
+ }
98
+
99
+ export function resolveScale(props: Partial<ScaleProps>, entity: any) {
100
+ if (!props) {
101
+ return;
102
+ }
103
+ if (props.scale === undefined) {
104
+ if (props.scaleX === undefined && props.scaleY === undefined) {
105
+ return;
106
+ }
107
+ if (props.scaleX === undefined) {
108
+ props.scaleX = 1;
109
+ }
110
+ if (props.scaleY === undefined) {
111
+ props.scaleY = 1;
112
+ }
113
+ }
114
+ const scale = resolvePointLike(props.scale, false, props.scaleX, props.scaleY);
115
+ entity.scale.set(scale.x, scale.y);
116
+ }
117
+
118
+ export function resolveAnchor(anchor: PointLike | undefined, entity: any) {
119
+ if (anchor !== undefined) {
120
+ const anchorPoint = resolvePointLike(anchor);
121
+ entity.anchor.set(anchorPoint.x, anchorPoint.y);
122
+ }
123
+ }
124
+
125
+ export function resolvePivot(pivot: PointLike | undefined, entity: any) {
126
+ if (pivot !== undefined) {
127
+ const pivotPoint = resolvePointLike(pivot);
128
+ entity.pivot.set(pivotPoint.x, pivotPoint.y);
129
+ }
130
+ }
@@ -0,0 +1,124 @@
1
+ import type { DestroyOptions, PointerEvents } from 'pixi.js';
2
+ import { Container, FederatedEvent } from 'pixi.js';
3
+ import type { Constructor, PointLike } from '../utils';
4
+
5
+ import { Application } from '../core/Application';
6
+ import type { IFocusable } from '../plugins';
7
+ import { Signal } from '../signals';
8
+
9
+ /**
10
+ * The Focusable function is a higher-order function that adds focus-related functionality to a given class.
11
+ *
12
+ * @param {TBase extends Constructor<Container>} Base - The base class to add focus functionality to.
13
+ *
14
+ * @returns {TBase & Constructor<IFocusable>} The modified class with focus functionality.
15
+ */
16
+ export function Focusable<TBase extends Constructor<Container>>(Base: TBase): TBase & Constructor<IFocusable> {
17
+ return class extends Base implements IFocusable {
18
+ _accessibleDiv: HTMLElement;
19
+ isFocused = false;
20
+ isKeyDown = false;
21
+ focusEnabled = true;
22
+ tabIndex = 0;
23
+ // pixi accessibility options
24
+ accessible = false;
25
+ accessibleType: keyof HTMLElementTagNameMap | undefined = 'button';
26
+ accessibleTitle = 'Focusable';
27
+ accessibleHint = 'Press enter to focus';
28
+ accessiblePointerEvents: PointerEvents = 'auto';
29
+ accessibleChildren = true;
30
+ // signals
31
+ onFocus = new Signal<(focusable: IFocusable) => void>();
32
+ onFocusIn = new Signal<(focusable: IFocusable) => void>();
33
+ onFocusOut = new Signal<(focusable: IFocusable) => void>();
34
+ onBlur = new Signal<(focusable: IFocusable) => void>();
35
+
36
+ private _eventsDisabled: boolean = false;
37
+
38
+ constructor(...args: any[]) {
39
+ super(...args);
40
+ this.eventMode = 'static';
41
+ this.on('mouseover', this._onMouseOver);
42
+ this.on('mousedown', this._onMouseDown);
43
+ this.on('click', this._handleClick);
44
+ this.on('tap', this._handleClick);
45
+ }
46
+
47
+ get app() {
48
+ return Application.getInstance();
49
+ }
50
+
51
+ public destroy(options?: DestroyOptions): void {
52
+ this.off('mouseover', this._onMouseOver);
53
+ this.off('mousedown', this._onMouseDown);
54
+ this.off('click', this._handleClick);
55
+ this.off('tap', this._handleClick);
56
+ super.destroy(options);
57
+ }
58
+
59
+ public focusIn() {
60
+ if (this.app.focus.active) {
61
+ // @ts-expect-error Argument of type { type: string; } is not assignable to parameter of type FederatedPointerEvent
62
+ this.emit('pointerover', { type: 'pointerover' });
63
+ }
64
+ }
65
+
66
+ public blur() {
67
+ if (!this.isKeyDown) {
68
+ window.removeEventListener('keyup', this._handleKeyUp.bind(this));
69
+ }
70
+ }
71
+
72
+ public focusOut() {
73
+ if (!this.isKeyDown) {
74
+ window.removeEventListener('keyup', this._handleKeyUp.bind(this));
75
+ }
76
+ if (this.app.focus.active) {
77
+ // @ts-expect-error Argument of type { type: string; } is not assignable to parameter of type FederatedPointerEvent
78
+ this.emit('pointerout', { type: 'pointerout' });
79
+ }
80
+ }
81
+
82
+ public click() {}
83
+
84
+ public getFocusPosition() {
85
+ return null;
86
+ }
87
+
88
+ public getFocusArea() {
89
+ return this.getBounds();
90
+ }
91
+
92
+ public getFocusSize(): PointLike | null {
93
+ return [this.getFocusArea().width, this.getFocusArea().height];
94
+ }
95
+
96
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
97
+ protected _onMouseOver(_e: MouseEvent) {
98
+ this.app.focus.setFocus(this);
99
+ }
100
+
101
+ protected _onMouseDown(e: FederatedEvent) {
102
+ this._maybeEmit('pointerdown', e);
103
+ }
104
+
105
+ protected _handleClick(e: FederatedEvent) {
106
+ this._maybeEmit('click', e);
107
+ this.click();
108
+ }
109
+
110
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
111
+ protected _handleKeyUp(_e: KeyboardEvent) {}
112
+
113
+ private _maybeEmit(type: string, e: FederatedEvent) {
114
+ if (this._eventsDisabled || e.type) {
115
+ return;
116
+ }
117
+ this._eventsDisabled = true;
118
+ this.emit(type, { type });
119
+ this._eventsDisabled = false;
120
+ }
121
+ } as unknown as TBase & Constructor<IFocusable>;
122
+ }
123
+
124
+ Focusable.INITTED = false;
@@ -0,0 +1,5 @@
1
+ export * from './signals';
2
+ export * from './animated';
3
+ export * from './focus';
4
+ export * from './interaction';
5
+ export * from './factory';
@@ -0,0 +1,74 @@
1
+ import type { AllFederatedEventMap, DestroyOptions } from 'pixi.js';
2
+ import { Container, FederatedEvent } from 'pixi.js';
3
+ import { Signal } from '../signals';
4
+
5
+ import { type Constructor } from '../utils';
6
+
7
+ // gets all the event names from the PIXI event map
8
+ type InteractionEventName = keyof AllFederatedEventMap;
9
+
10
+ export type InteractionSignal = Signal<(event: FederatedEvent) => void>;
11
+
12
+ /**
13
+ * Represents an interactive element.
14
+ */
15
+ export interface IInteractive {
16
+ onInteraction: (eventName: InteractionEventName) => InteractionSignal;
17
+ }
18
+
19
+ /**
20
+ * Adds interactive functionality to a container.
21
+ *
22
+ * @param {Constructor<Container>} Base - The base container class.
23
+ * @returns {Constructor<IInteractive>} - The extended container class with interactive functionality.
24
+ */
25
+ export function Interactive<TBase extends Constructor<Container>>(Base: TBase): TBase & Constructor<IInteractive> {
26
+ return class extends Base implements IInteractive {
27
+ private _signals: Map<InteractionEventName, InteractionSignal> = new Map();
28
+
29
+ constructor(...args: any[]) {
30
+ super(...args);
31
+ this._emitSignal = this._emitSignal.bind(this);
32
+ this.eventMode = 'static';
33
+ }
34
+
35
+ /**
36
+ * Handles interaction events and returns the corresponding signal.
37
+ *
38
+ * @param {InteractionEventName} eventName - The name of the interaction event.
39
+ * @return {InteractionSignal} The signal associated with the interaction event.
40
+ */
41
+ public onInteraction(eventName: InteractionEventName) {
42
+ if (!this._signals.has(eventName)) {
43
+ const signal = new Signal<(event: FederatedEvent) => void>();
44
+ this._signals.set(eventName, signal);
45
+ this.on(eventName, this._emitSignal);
46
+ }
47
+ return this._signals.get(eventName) as InteractionSignal;
48
+ }
49
+
50
+ public destroy(options: DestroyOptions): void {
51
+ for (const eventName of this._signals.keys()) {
52
+ this.off(eventName, this._emitSignal);
53
+ }
54
+ this._signals.clear();
55
+ super.destroy(options);
56
+ }
57
+
58
+ /**
59
+ * Emits a signal with the given event.
60
+ *
61
+ * @param {FederatedEvent} event - The event to emit.
62
+ *
63
+ * @return {void}
64
+ */
65
+ private _emitSignal(event: FederatedEvent) {
66
+ const signalName = event.type as InteractionEventName;
67
+ const signal = this._signals.get(signalName);
68
+
69
+ if (signal) {
70
+ signal.emit(event);
71
+ }
72
+ }
73
+ } as unknown as TBase & Constructor<IInteractive>;
74
+ }
@@ -0,0 +1,49 @@
1
+ import { DestroyOptions } from 'pixi.js';
2
+ import { SignalConnection, SignalConnections } from '../signals';
3
+ import type { Constructor } from '../utils';
4
+
5
+ /**
6
+ * Interface for animated entities.
7
+ */
8
+ export interface ISignalContainer {
9
+ signalConnections: SignalConnections;
10
+
11
+ destroy(options?: DestroyOptions): void;
12
+
13
+ addSignalConnection(...args: SignalConnection[]): void;
14
+ connectSignal(...args: SignalConnection[]): void;
15
+ connectAction(...args: SignalConnection[]): void;
16
+ }
17
+
18
+ export function WithSignals<TBase extends Constructor<any>>(Base: TBase): TBase & Constructor<ISignalContainer> {
19
+ return class extends Base implements ISignalContainer {
20
+ signalConnections: SignalConnections = new SignalConnections();
21
+
22
+ /**
23
+ * Add signal connections to the container.
24
+ * @param args - The signal connections to add.
25
+ */
26
+ public addSignalConnection(...args: SignalConnection[]) {
27
+ for (const connection of args) {
28
+ this.signalConnections.add(connection);
29
+ }
30
+ }
31
+
32
+ public connectSignal(...args: SignalConnection[]) {
33
+ for (const connection of args) {
34
+ this.signalConnections.add(connection);
35
+ }
36
+ }
37
+
38
+ public connectAction(...args: SignalConnection[]) {
39
+ for (const connection of args) {
40
+ this.signalConnections.add(connection);
41
+ }
42
+ }
43
+
44
+ destroy(options?: DestroyOptions): void {
45
+ this.signalConnections.disconnectAll();
46
+ super.destroy(options);
47
+ }
48
+ } as unknown as TBase & Constructor<ISignalContainer>;
49
+ }