@datamoc/mw_games 0.42.0 → 0.44.2

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 (333) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +84 -1
  3. package/REFERENCE.md +134 -6
  4. package/api-surface.json +1814 -116
  5. package/data/microgm-essential.PROVENANCE.md +13 -0
  6. package/data/microgm-essential.sf2 +0 -0
  7. package/data/soundfont-catalog.json +8 -0
  8. package/dist/actors/Resource.d.ts.map +1 -1
  9. package/dist/actors/Resource.js +2 -3
  10. package/dist/actors/Resource.js.map +1 -1
  11. package/dist/audio/AdaptiveMusic.d.ts +85 -0
  12. package/dist/audio/AdaptiveMusic.d.ts.map +1 -0
  13. package/dist/audio/AdaptiveMusic.js +230 -0
  14. package/dist/audio/AdaptiveMusic.js.map +1 -0
  15. package/dist/audio/AudioLoader.d.ts +33 -0
  16. package/dist/audio/AudioLoader.d.ts.map +1 -0
  17. package/dist/audio/AudioLoader.js +58 -0
  18. package/dist/audio/AudioLoader.js.map +1 -0
  19. package/dist/audio/AudioViews.d.ts +70 -0
  20. package/dist/audio/AudioViews.d.ts.map +1 -0
  21. package/dist/audio/AudioViews.js +119 -0
  22. package/dist/audio/AudioViews.js.map +1 -0
  23. package/dist/audio/BusBudget.d.ts +89 -0
  24. package/dist/audio/BusBudget.d.ts.map +1 -0
  25. package/dist/audio/BusBudget.js +120 -0
  26. package/dist/audio/BusBudget.js.map +1 -0
  27. package/dist/audio/Channels.d.ts +66 -1
  28. package/dist/audio/Channels.d.ts.map +1 -1
  29. package/dist/audio/Channels.js +119 -31
  30. package/dist/audio/Channels.js.map +1 -1
  31. package/dist/audio/CoreHost.d.ts +114 -0
  32. package/dist/audio/CoreHost.d.ts.map +1 -0
  33. package/dist/audio/CoreHost.js +335 -0
  34. package/dist/audio/CoreHost.js.map +1 -0
  35. package/dist/audio/DecoderGuard.d.ts +139 -0
  36. package/dist/audio/DecoderGuard.d.ts.map +1 -0
  37. package/dist/audio/DecoderGuard.js +208 -0
  38. package/dist/audio/DecoderGuard.js.map +1 -0
  39. package/dist/audio/Fft.d.ts +3 -0
  40. package/dist/audio/Fft.d.ts.map +1 -0
  41. package/dist/audio/Fft.js +45 -0
  42. package/dist/audio/Fft.js.map +1 -0
  43. package/dist/audio/LoopTags.d.ts +18 -0
  44. package/dist/audio/LoopTags.d.ts.map +1 -1
  45. package/dist/audio/LoopTags.js +20 -0
  46. package/dist/audio/LoopTags.js.map +1 -1
  47. package/dist/audio/Midi.d.ts +35 -0
  48. package/dist/audio/Midi.d.ts.map +1 -1
  49. package/dist/audio/Midi.js +71 -1
  50. package/dist/audio/Midi.js.map +1 -1
  51. package/dist/audio/MidiRender.d.ts +47 -0
  52. package/dist/audio/MidiRender.d.ts.map +1 -1
  53. package/dist/audio/MidiRender.js +100 -2
  54. package/dist/audio/MidiRender.js.map +1 -1
  55. package/dist/audio/MidiSynth.d.ts +147 -0
  56. package/dist/audio/MidiSynth.d.ts.map +1 -0
  57. package/dist/audio/MidiSynth.js +205 -0
  58. package/dist/audio/MidiSynth.js.map +1 -0
  59. package/dist/audio/MusicPlayer.d.ts +80 -0
  60. package/dist/audio/MusicPlayer.d.ts.map +1 -0
  61. package/dist/audio/MusicPlayer.js +147 -0
  62. package/dist/audio/MusicPlayer.js.map +1 -0
  63. package/dist/audio/Playable.d.ts +7 -0
  64. package/dist/audio/Playable.d.ts.map +1 -1
  65. package/dist/audio/Playable.js.map +1 -1
  66. package/dist/audio/Positional.d.ts +12 -4
  67. package/dist/audio/Positional.d.ts.map +1 -1
  68. package/dist/audio/Positional.js +5 -2
  69. package/dist/audio/Positional.js.map +1 -1
  70. package/dist/audio/Resample.d.ts +61 -0
  71. package/dist/audio/Resample.d.ts.map +1 -0
  72. package/dist/audio/Resample.js +97 -0
  73. package/dist/audio/Resample.js.map +1 -0
  74. package/dist/audio/SampleDecoder.d.ts +16 -2
  75. package/dist/audio/SampleDecoder.d.ts.map +1 -1
  76. package/dist/audio/SampleDecoder.js +10 -6
  77. package/dist/audio/SampleDecoder.js.map +1 -1
  78. package/dist/audio/Settings.d.ts +99 -0
  79. package/dist/audio/Settings.d.ts.map +1 -0
  80. package/dist/audio/Settings.js +134 -0
  81. package/dist/audio/Settings.js.map +1 -0
  82. package/dist/audio/Sfx.d.ts +148 -0
  83. package/dist/audio/Sfx.d.ts.map +1 -0
  84. package/dist/audio/Sfx.js +213 -0
  85. package/dist/audio/Sfx.js.map +1 -0
  86. package/dist/audio/Sound.d.ts +2 -0
  87. package/dist/audio/Sound.d.ts.map +1 -1
  88. package/dist/audio/Sound.js +3 -0
  89. package/dist/audio/Sound.js.map +1 -1
  90. package/dist/audio/SoundFont.d.ts +5 -3
  91. package/dist/audio/SoundFont.d.ts.map +1 -1
  92. package/dist/audio/SoundFont.js +10 -8
  93. package/dist/audio/SoundFont.js.map +1 -1
  94. package/dist/audio/SpectralDistance.d.ts +34 -0
  95. package/dist/audio/SpectralDistance.d.ts.map +1 -0
  96. package/dist/audio/SpectralDistance.js +64 -0
  97. package/dist/audio/SpectralDistance.js.map +1 -0
  98. package/dist/audio/StreamChannel.d.ts +150 -0
  99. package/dist/audio/StreamChannel.d.ts.map +1 -0
  100. package/dist/audio/StreamChannel.js +390 -0
  101. package/dist/audio/StreamChannel.js.map +1 -0
  102. package/dist/audio/StreamPlayable.d.ts +73 -0
  103. package/dist/audio/StreamPlayable.d.ts.map +1 -0
  104. package/dist/audio/StreamPlayable.js +130 -0
  105. package/dist/audio/StreamPlayable.js.map +1 -0
  106. package/dist/audio/Synth.d.ts +1 -1
  107. package/dist/audio/Synth.d.ts.map +1 -1
  108. package/dist/audio/Synth.js +4 -0
  109. package/dist/audio/Synth.js.map +1 -1
  110. package/dist/audio/SyxBank.d.ts +73 -0
  111. package/dist/audio/SyxBank.d.ts.map +1 -0
  112. package/dist/audio/SyxBank.js +130 -0
  113. package/dist/audio/SyxBank.js.map +1 -0
  114. package/dist/audio/Underrun.d.ts +25 -0
  115. package/dist/audio/Underrun.d.ts.map +1 -0
  116. package/dist/audio/Underrun.js +18 -0
  117. package/dist/audio/Underrun.js.map +1 -0
  118. package/dist/audio/Wav.d.ts +56 -0
  119. package/dist/audio/Wav.d.ts.map +1 -0
  120. package/dist/audio/Wav.js +164 -0
  121. package/dist/audio/Wav.js.map +1 -0
  122. package/dist/audio/WebMidi.d.ts +58 -0
  123. package/dist/audio/WebMidi.d.ts.map +1 -0
  124. package/dist/audio/WebMidi.js +79 -0
  125. package/dist/audio/WebMidi.js.map +1 -0
  126. package/dist/audio/humanize/Onsets.d.ts.map +1 -1
  127. package/dist/audio/humanize/Onsets.js +1 -44
  128. package/dist/audio/humanize/Onsets.js.map +1 -1
  129. package/dist/audio/index.d.ts +43 -7
  130. package/dist/audio/index.d.ts.map +1 -1
  131. package/dist/audio/index.js +21 -3
  132. package/dist/audio/index.js.map +1 -1
  133. package/dist/battle/AttackPreview.d.ts.map +1 -1
  134. package/dist/battle/AttackPreview.js +8 -8
  135. package/dist/battle/AttackPreview.js.map +1 -1
  136. package/dist/battle/StatStages.d.ts.map +1 -1
  137. package/dist/battle/StatStages.js +2 -1
  138. package/dist/battle/StatStages.js.map +1 -1
  139. package/dist/board/Engine.d.ts +2 -0
  140. package/dist/board/Engine.d.ts.map +1 -1
  141. package/dist/board/Engine.js +1 -1
  142. package/dist/board/Engine.js.map +1 -1
  143. package/dist/board/HexSkirmish.d.ts.map +1 -1
  144. package/dist/board/HexSkirmish.js +11 -72
  145. package/dist/board/HexSkirmish.js.map +1 -1
  146. package/dist/board/Tactics.d.ts.map +1 -1
  147. package/dist/board/Tactics.js +3 -5
  148. package/dist/board/Tactics.js.map +1 -1
  149. package/dist/board/tourney.d.ts.map +1 -1
  150. package/dist/board/tourney.js +2 -19
  151. package/dist/board/tourney.js.map +1 -1
  152. package/dist/core/Handles.js +7 -7
  153. package/dist/core/Handles.js.map +1 -1
  154. package/dist/mw_games.global.js +25 -22
  155. package/dist/mwl/conditions.d.ts +12 -0
  156. package/dist/mwl/conditions.d.ts.map +1 -1
  157. package/dist/mwl/conditions.js +49 -8
  158. package/dist/mwl/conditions.js.map +1 -1
  159. package/dist/mwl/index.d.ts +13 -0
  160. package/dist/mwl/index.d.ts.map +1 -1
  161. package/dist/mwl/index.js +7 -0
  162. package/dist/mwl/index.js.map +1 -1
  163. package/dist/mwl/objects.d.ts +31 -0
  164. package/dist/mwl/objects.d.ts.map +1 -0
  165. package/dist/mwl/objects.js +83 -0
  166. package/dist/mwl/objects.js.map +1 -0
  167. package/dist/mwl/package-container.d.ts +185 -0
  168. package/dist/mwl/package-container.d.ts.map +1 -0
  169. package/dist/mwl/package-container.js +446 -0
  170. package/dist/mwl/package-container.js.map +1 -0
  171. package/dist/mwl/package-document.d.ts +217 -0
  172. package/dist/mwl/package-document.d.ts.map +1 -0
  173. package/dist/mwl/package-document.js +639 -0
  174. package/dist/mwl/package-document.js.map +1 -0
  175. package/dist/mwl/package-rom.d.ts +37 -0
  176. package/dist/mwl/package-rom.d.ts.map +1 -0
  177. package/dist/mwl/package-rom.js +96 -0
  178. package/dist/mwl/package-rom.js.map +1 -0
  179. package/dist/mwl/package-verify.d.ts +34 -0
  180. package/dist/mwl/package-verify.d.ts.map +1 -0
  181. package/dist/mwl/package-verify.js +111 -0
  182. package/dist/mwl/package-verify.js.map +1 -0
  183. package/dist/mwl/package.d.ts +184 -0
  184. package/dist/mwl/package.d.ts.map +1 -0
  185. package/dist/mwl/package.js +382 -0
  186. package/dist/mwl/package.js.map +1 -0
  187. package/dist/mwl/schema.d.ts +1 -1
  188. package/dist/mwl/schema.d.ts.map +1 -1
  189. package/dist/mwl/tables.d.ts +2 -0
  190. package/dist/mwl/tables.d.ts.map +1 -1
  191. package/dist/mwl/tables.js +13 -0
  192. package/dist/mwl/tables.js.map +1 -1
  193. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  194. package/dist/physics/PhysicsWorld.js +4 -3
  195. package/dist/physics/PhysicsWorld.js.map +1 -1
  196. package/dist/physics/XpbdWorld.d.ts +23 -5
  197. package/dist/physics/XpbdWorld.d.ts.map +1 -1
  198. package/dist/physics/XpbdWorld.js +91 -6
  199. package/dist/physics/XpbdWorld.js.map +1 -1
  200. package/dist/testing/FakeAudio.d.ts +149 -0
  201. package/dist/testing/FakeAudio.d.ts.map +1 -0
  202. package/dist/testing/FakeAudio.js +219 -0
  203. package/dist/testing/FakeAudio.js.map +1 -0
  204. package/dist/testing/index.d.ts +18 -0
  205. package/dist/testing/index.d.ts.map +1 -1
  206. package/dist/testing/index.js +22 -0
  207. package/dist/testing/index.js.map +1 -1
  208. package/dist/threads/index.d.ts +2 -2
  209. package/dist/threads/index.d.ts.map +1 -1
  210. package/dist/threads/index.js +1 -1
  211. package/dist/threads/index.js.map +1 -1
  212. package/dist/threads/spawn.d.ts +32 -0
  213. package/dist/threads/spawn.d.ts.map +1 -1
  214. package/dist/threads/spawn.js +35 -11
  215. package/dist/threads/spawn.js.map +1 -1
  216. package/dist/three-d/Collision3D.d.ts +46 -2
  217. package/dist/three-d/Collision3D.d.ts.map +1 -1
  218. package/dist/three-d/Collision3D.js +46 -2
  219. package/dist/three-d/Collision3D.js.map +1 -1
  220. package/dist/three-d/Grid.d.ts +12 -1
  221. package/dist/three-d/Grid.d.ts.map +1 -1
  222. package/dist/three-d/Grid.js +12 -1
  223. package/dist/three-d/Grid.js.map +1 -1
  224. package/dist/three-d/Vox.d.ts +13 -1
  225. package/dist/three-d/Vox.d.ts.map +1 -1
  226. package/dist/three-d/Vox.js +13 -1
  227. package/dist/three-d/Vox.js.map +1 -1
  228. package/dist/two-d/Game.d.ts +32 -1
  229. package/dist/two-d/Game.d.ts.map +1 -1
  230. package/dist/two-d/Game.js +105 -14
  231. package/dist/two-d/Game.js.map +1 -1
  232. package/dist/two-d/Scene2D.d.ts +24 -0
  233. package/dist/two-d/Scene2D.d.ts.map +1 -1
  234. package/dist/two-d/Scene2D.js +30 -0
  235. package/dist/two-d/Scene2D.js.map +1 -1
  236. package/dist/two-d/render/HazeLayer.d.ts.map +1 -1
  237. package/dist/two-d/render/HazeLayer.js +2 -1
  238. package/dist/two-d/render/HazeLayer.js.map +1 -1
  239. package/dist/two-d/render/ImageModifiers.d.ts +4 -2
  240. package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
  241. package/dist/two-d/render/ImageModifiers.js +13 -8
  242. package/dist/two-d/render/ImageModifiers.js.map +1 -1
  243. package/dist/two-d/render/NeonGlow.d.ts.map +1 -1
  244. package/dist/two-d/render/NeonGlow.js +2 -1
  245. package/dist/two-d/render/NeonGlow.js.map +1 -1
  246. package/dist/two-d/render/Particles.d.ts.map +1 -1
  247. package/dist/two-d/render/Particles.js +2 -1
  248. package/dist/two-d/render/Particles.js.map +1 -1
  249. package/dist/two-d/render/SceneTransition.d.ts +301 -0
  250. package/dist/two-d/render/SceneTransition.d.ts.map +1 -0
  251. package/dist/two-d/render/SceneTransition.js +458 -0
  252. package/dist/two-d/render/SceneTransition.js.map +1 -0
  253. package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
  254. package/dist/two-d/render/ScreenEffects.js +2 -1
  255. package/dist/two-d/render/ScreenEffects.js.map +1 -1
  256. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
  257. package/dist/two-d/render/SkeletalSprite.js +2 -1
  258. package/dist/two-d/render/SkeletalSprite.js.map +1 -1
  259. package/dist/two-d/render/Types2D.d.ts +2 -2
  260. package/dist/two-d/render/Types2D.d.ts.map +1 -1
  261. package/dist/two-d/render/Types2D.js +2 -2
  262. package/dist/two-d/render/Types2D.js.map +1 -1
  263. package/dist/two-d/render/index.d.ts +2 -0
  264. package/dist/two-d/render/index.d.ts.map +1 -1
  265. package/dist/two-d/render/index.js +1 -0
  266. package/dist/two-d/render/index.js.map +1 -1
  267. package/dist/two-d/ui/Bar.d.ts.map +1 -1
  268. package/dist/two-d/ui/Bar.js +3 -5
  269. package/dist/two-d/ui/Bar.js.map +1 -1
  270. package/dist/two-d/ui/Button.d.ts +23 -0
  271. package/dist/two-d/ui/Button.d.ts.map +1 -1
  272. package/dist/two-d/ui/Button.js +37 -0
  273. package/dist/two-d/ui/Button.js.map +1 -1
  274. package/dist/two-d/ui/Dropdown.d.ts +5 -1
  275. package/dist/two-d/ui/Dropdown.d.ts.map +1 -1
  276. package/dist/two-d/ui/Dropdown.js +8 -1
  277. package/dist/two-d/ui/Dropdown.js.map +1 -1
  278. package/dist/two-d/ui/DropdownView.d.ts +63 -3
  279. package/dist/two-d/ui/DropdownView.d.ts.map +1 -1
  280. package/dist/two-d/ui/DropdownView.js +168 -9
  281. package/dist/two-d/ui/DropdownView.js.map +1 -1
  282. package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
  283. package/dist/two-d/ui/FloatingText.js +2 -1
  284. package/dist/two-d/ui/FloatingText.js.map +1 -1
  285. package/dist/two-d/ui/IconGrid.d.ts.map +1 -1
  286. package/dist/two-d/ui/IconGrid.js +2 -1
  287. package/dist/two-d/ui/IconGrid.js.map +1 -1
  288. package/dist/two-d/ui/ListView.d.ts.map +1 -1
  289. package/dist/two-d/ui/ListView.js +2 -1
  290. package/dist/two-d/ui/ListView.js.map +1 -1
  291. package/dist/two-d/ui/ScrollBox.d.ts +96 -0
  292. package/dist/two-d/ui/ScrollBox.d.ts.map +1 -1
  293. package/dist/two-d/ui/ScrollBox.js +218 -5
  294. package/dist/two-d/ui/ScrollBox.js.map +1 -1
  295. package/dist/two-d/ui/ScrollText.d.ts +131 -0
  296. package/dist/two-d/ui/ScrollText.d.ts.map +1 -0
  297. package/dist/two-d/ui/ScrollText.js +218 -0
  298. package/dist/two-d/ui/ScrollText.js.map +1 -0
  299. package/dist/two-d/ui/Slider.d.ts.map +1 -1
  300. package/dist/two-d/ui/Slider.js +4 -4
  301. package/dist/two-d/ui/Slider.js.map +1 -1
  302. package/dist/two-d/ui/Tooltip.d.ts +70 -1
  303. package/dist/two-d/ui/Tooltip.d.ts.map +1 -1
  304. package/dist/two-d/ui/Tooltip.js +115 -3
  305. package/dist/two-d/ui/Tooltip.js.map +1 -1
  306. package/dist/two-d/ui/Window.d.ts +35 -2
  307. package/dist/two-d/ui/Window.d.ts.map +1 -1
  308. package/dist/two-d/ui/Window.js +58 -3
  309. package/dist/two-d/ui/Window.js.map +1 -1
  310. package/dist/two-d/ui/index.d.ts +7 -5
  311. package/dist/two-d/ui/index.d.ts.map +1 -1
  312. package/dist/two-d/ui/index.js +3 -2
  313. package/dist/two-d/ui/index.js.map +1 -1
  314. package/dist/version.d.ts +1 -1
  315. package/dist/version.js +1 -1
  316. package/package.json +14 -3
  317. package/sbom.cdx.json +19 -260
  318. package/tools/audio.d.mts +75 -0
  319. package/tools/audio.mjs +437 -0
  320. package/tools/browser-driver.mjs +3 -3
  321. package/tools/browser-smoke.mjs +19 -2
  322. package/tools/build-tablebases.mjs +7 -3
  323. package/tools/compile-openings.mjs +7 -3
  324. package/tools/compile-resources.d.mts +2 -0
  325. package/tools/compile-resources.mjs +13 -1
  326. package/tools/emit-page.d.mts +6 -0
  327. package/tools/emit-page.mjs +43 -3
  328. package/tools/find-chrome.mjs +4 -2
  329. package/tools/init.mjs +11 -3
  330. package/tools/mwl.mjs +144 -2
  331. package/tools/play-uci.mjs +9 -5
  332. package/tools/vite.mjs +9 -1
  333. package/tools.md +2 -1
@@ -1,4 +1,4 @@
1
- import { Container, Graphics } from 'pixi.js';
1
+ import { Container, Graphics, Rectangle } from 'pixi.js';
2
2
  import { Signal } from '../../core/Signal.js';
3
3
  import { theme, themeChanged } from './theme.js';
4
4
  /**
@@ -16,10 +16,90 @@ import { theme, themeChanged } from './theme.js';
16
16
  export function scrollOffset(offset, contentSize, viewportSize) {
17
17
  return Math.max(0, Math.min(Math.max(0, contentSize - viewportSize), offset));
18
18
  }
19
+ /**
20
+ * Touch scrolling as plain numbers: feed it pointer positions and it says how far the content moves
21
+ * while the finger is down, then keeps coasting after release with a friction that decays the speed.
22
+ * No pointer events or clock of its own, so it is the same under a test as under a finger.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { ScrollDrag } from '@datamoc/mw_games/two-d/ui';
27
+ *
28
+ * const drag = new ScrollDrag();
29
+ * drag.start(200, 0);
30
+ * console.log(drag.move(170, 0.1)); // 30: the content follows the finger up
31
+ * drag.end();
32
+ * console.log(drag.step(1 / 60) > 0); // true: it keeps coasting
33
+ * ```
34
+ */
35
+ export class ScrollDrag {
36
+ /**
37
+ * @param friction fraction of the speed lost per second of coasting; 0.92 when omitted
38
+ * @param minSpeed the speed, in pixels per second, below which it counts as at rest; 8 when omitted
39
+ */
40
+ constructor(friction = 0.92, minSpeed = 8) {
41
+ /** content pixels per second the content keeps moving at after release; 0 when at rest */
42
+ this.velocity = 0;
43
+ this.dragging = false;
44
+ /** how far the pointer has travelled since `start`, to tell a drag from a tap */
45
+ this.travelled = 0;
46
+ this.lastY = 0;
47
+ this.lastTime = 0;
48
+ this.friction = friction;
49
+ this.minSpeed = minSpeed;
50
+ }
51
+ start(y, time) {
52
+ this.dragging = true;
53
+ this.velocity = 0;
54
+ this.travelled = 0;
55
+ this.lastY = y;
56
+ this.lastTime = time;
57
+ }
58
+ /** @returns how far the content should move for this pointer position */
59
+ move(y, time) {
60
+ if (!this.dragging)
61
+ return 0;
62
+ const delta = this.lastY - y;
63
+ const dt = time - this.lastTime;
64
+ if (dt > 0)
65
+ this.velocity = this.velocity * 0.4 + (delta / dt) * 0.6;
66
+ this.travelled += Math.abs(delta);
67
+ this.lastY = y;
68
+ this.lastTime = time;
69
+ return delta;
70
+ }
71
+ end() {
72
+ this.dragging = false;
73
+ if (Math.abs(this.velocity) < this.minSpeed)
74
+ this.velocity = 0;
75
+ }
76
+ /** @returns how far the content coasts in `dt` seconds, 0 once it has stopped */
77
+ step(dt) {
78
+ if (this.dragging || this.velocity === 0)
79
+ return 0;
80
+ const delta = this.velocity * dt;
81
+ this.velocity *= (1 - this.friction) ** dt;
82
+ if (Math.abs(this.velocity) < this.minSpeed)
83
+ this.velocity = 0;
84
+ return delta;
85
+ }
86
+ /** stops coasting, for when the content hit an end */
87
+ stop() {
88
+ this.velocity = 0;
89
+ }
90
+ }
19
91
  /**
20
92
  * A clipped viewport with a scrollbar: put rows in `content` and they scroll inside the box,
21
93
  * everything outside it hidden by a mask. The scrollbar is drawn from the theme; the wheel,
22
94
  * `scrollBy` and `scrollIntoView` all run through `scrollOffset`, so they clamp the same way.
95
+ * The box owns its `hitArea` (its viewport, kept current by `resize` and `setContentHeight`),
96
+ * so a wheel over the empty part of the viewport reaches it instead of needing a row under
97
+ * the pointer to bubble from.
98
+ *
99
+ * `touch: true` lets a finger drag the content (a drag ends the tap on the rows under it) and coast
100
+ * on release, `keyboard: true` makes `handleKey` scroll by line, page and to the ends, the scrollbar's
101
+ * thumb can be dragged and its track clicked, and `autoHeight` sizes the viewport to the content up
102
+ * to `height`. Call `update(dt)` each frame for the coasting.
23
103
  *
24
104
  * @example
25
105
  * ```ts
@@ -36,16 +116,23 @@ export class ScrollBox extends Container {
36
116
  this.onChange = new Signal();
37
117
  /** add the rows to scroll here */
38
118
  this.content = new Container();
119
+ this.hit = new Rectangle(0, 0, 0, 0);
39
120
  this.maskShape = new Graphics();
40
121
  this.track = new Graphics();
41
122
  this.thumb = new Graphics();
123
+ this.dragMoved = false;
124
+ this.thumbGrab = null;
42
125
  this.themeListener = () => this.draw();
43
126
  this.handleWheel = (event) => {
44
127
  this.scrollBy(event.deltaY);
45
128
  };
46
129
  this.width_ = options.width;
47
- this.height_ = options.height;
130
+ this.maxHeight_ = options.height;
131
+ this.auto = options.autoHeight ?? false;
132
+ this.lineHeight = options.lineHeight ?? 24;
133
+ this.drag = options.touch ? new ScrollDrag() : null;
48
134
  this.contentHeight_ = Math.max(0, options.contentHeight ?? 0);
135
+ this.height_ = this.fit();
49
136
  this.offset_ = scrollOffset(options.offset ?? 0, this.contentHeight_, this.height_);
50
137
  this.addChild(this.content);
51
138
  this.addChild(this.maskShape);
@@ -54,6 +141,30 @@ export class ScrollBox extends Container {
54
141
  this.content.mask = this.maskShape;
55
142
  this.eventMode = 'static';
56
143
  this.on('wheel', this.handleWheel);
144
+ if (this.drag) {
145
+ this.on('pointerdown', (event) => this.dragStart(event.global.y, performance.now() / 1000));
146
+ this.on('globalpointermove', (event) => this.dragMove(event.global.y, performance.now() / 1000));
147
+ this.on('pointerup', () => this.dragEnd());
148
+ this.on('pointerupoutside', () => this.dragEnd());
149
+ //a drag that ended over a row is not a click on that row
150
+ this.on('pointerupcapture', (event) => {
151
+ if (this.dragMoved)
152
+ event.stopPropagation();
153
+ });
154
+ }
155
+ this.track.eventMode = 'static';
156
+ this.thumb.eventMode = 'static';
157
+ this.thumb.on('pointerdown', (event) => {
158
+ event.stopPropagation();
159
+ this.thumbDragStart(event.global.y);
160
+ });
161
+ this.thumb.on('globalpointermove', (event) => this.thumbDragMove(event.global.y));
162
+ this.thumb.on('pointerup', () => (this.thumbGrab = null));
163
+ this.thumb.on('pointerupoutside', () => (this.thumbGrab = null));
164
+ this.track.on('pointerdown', (event) => {
165
+ event.stopPropagation();
166
+ this.scrollToThumbCentre(this.toLocal(event.global).y);
167
+ });
57
168
  this.draw();
58
169
  themeChanged.add(this.themeListener);
59
170
  }
@@ -63,9 +174,17 @@ export class ScrollBox extends Container {
63
174
  get contentHeight() {
64
175
  return this.contentHeight_;
65
176
  }
177
+ /** the viewport's width, the other half of the box's `hitArea` */
178
+ get viewportWidth() {
179
+ return this.width_;
180
+ }
66
181
  get viewportHeight() {
67
182
  return this.height_;
68
183
  }
184
+ /** the viewport's height: the content's, capped at the maximum, when `autoHeight` is on */
185
+ fit() {
186
+ return this.auto ? Math.min(this.maxHeight_, this.contentHeight_) : this.maxHeight_;
187
+ }
69
188
  /** how far the content can scroll; 0 when it all fits */
70
189
  get maxOffset() {
71
190
  return Math.max(0, this.contentHeight_ - this.height_);
@@ -75,11 +194,13 @@ export class ScrollBox extends Container {
75
194
  }
76
195
  setContentHeight(height) {
77
196
  this.contentHeight_ = Math.max(0, height);
197
+ this.height_ = this.fit();
78
198
  this.setOffset(scrollOffset(this.offset_, this.contentHeight_, this.height_));
79
199
  }
80
200
  resize(width, height) {
81
201
  this.width_ = width;
82
- this.height_ = height;
202
+ this.maxHeight_ = height;
203
+ this.height_ = this.fit();
83
204
  this.setOffset(scrollOffset(this.offset_, this.contentHeight_, this.height_));
84
205
  }
85
206
  scrollBy(delta) {
@@ -95,6 +216,96 @@ export class ScrollBox extends Container {
95
216
  else if (top + height > this.offset_ + this.height_)
96
217
  this.scrollTo(top + height - this.height_);
97
218
  }
219
+ /**
220
+ * Scrolls for a key a keyboard-driven list was handed (`KeyboardEvent.key`).
221
+ *
222
+ * @returns true when the key is one this box scrolls by, so a caller can stop it going further
223
+ */
224
+ handleKey(key) {
225
+ const page = Math.max(this.lineHeight, this.height_ - this.lineHeight);
226
+ switch (key) {
227
+ case 'ArrowUp':
228
+ this.scrollBy(-this.lineHeight);
229
+ return true;
230
+ case 'ArrowDown':
231
+ this.scrollBy(this.lineHeight);
232
+ return true;
233
+ case 'PageUp':
234
+ this.scrollBy(-page);
235
+ return true;
236
+ case 'PageDown':
237
+ this.scrollBy(page);
238
+ return true;
239
+ case 'Home':
240
+ this.scrollTo(0);
241
+ return true;
242
+ case 'End':
243
+ this.scrollTo(this.maxOffset);
244
+ return true;
245
+ default:
246
+ return false;
247
+ }
248
+ }
249
+ /** a finger or button went down at `y` (any one coordinate space, `time` in seconds) */
250
+ dragStart(y, time) {
251
+ this.drag?.start(y, time);
252
+ this.dragMoved = false;
253
+ }
254
+ /** the pointer moved while down; the content follows once it has travelled a few pixels */
255
+ dragMove(y, time) {
256
+ const drag = this.drag;
257
+ if (!drag?.dragging)
258
+ return;
259
+ const delta = drag.move(y, time);
260
+ if (!this.dragMoved && drag.travelled < 6)
261
+ return;
262
+ this.dragMoved = true;
263
+ this.scrollBy(delta);
264
+ }
265
+ dragEnd() {
266
+ this.drag?.end();
267
+ }
268
+ /** true once the pointer travelled far enough to count as a drag rather than a tap */
269
+ get dragged() {
270
+ return this.dragMoved;
271
+ }
272
+ /** advances touch coasting; call once a frame from the owning scene's `update` */
273
+ update(dt) {
274
+ const drag = this.drag;
275
+ if (!drag)
276
+ return;
277
+ const before = this.offset_;
278
+ this.scrollBy(drag.step(dt));
279
+ if (this.offset_ === before && drag.velocity !== 0)
280
+ drag.stop();
281
+ }
282
+ /** where the scrollbar's thumb sits and how tall it is, in the box's own space */
283
+ get thumbMetrics() {
284
+ const barWidth = 6;
285
+ const height = Math.max(barWidth, (this.height_ / Math.max(1, this.contentHeight_)) * this.height_);
286
+ const y = this.maxOffset === 0 ? 0 : (this.offset_ / this.maxOffset) * (this.height_ - height);
287
+ return { y, height };
288
+ }
289
+ /** the thumb was grabbed at `y` */
290
+ thumbDragStart(y) {
291
+ this.thumbGrab = { y, offset: this.offset_ };
292
+ }
293
+ /** the thumb moved to `y`: the offset follows in proportion to the thumb's travel */
294
+ thumbDragMove(y) {
295
+ if (!this.thumbGrab)
296
+ return;
297
+ const travel = this.height_ - this.thumbMetrics.height;
298
+ if (travel <= 0)
299
+ return;
300
+ this.scrollTo(this.thumbGrab.offset + ((y - this.thumbGrab.y) / travel) * this.maxOffset);
301
+ }
302
+ /** a click on the track at local `y` puts the thumb's centre there */
303
+ scrollToThumbCentre(y) {
304
+ const travel = this.height_ - this.thumbMetrics.height;
305
+ if (travel <= 0)
306
+ return;
307
+ this.scrollTo(((y - this.thumbMetrics.height / 2) / travel) * this.maxOffset);
308
+ }
98
309
  setOffset(offset) {
99
310
  if (offset === this.offset_) {
100
311
  this.draw();
@@ -105,6 +316,9 @@ export class ScrollBox extends Container {
105
316
  this.onChange.dispatch(offset);
106
317
  }
107
318
  draw() {
319
+ this.hit.width = this.width_;
320
+ this.hit.height = this.height_;
321
+ this.hitArea = this.hit;
108
322
  const t = theme();
109
323
  this.content.y = -this.offset_;
110
324
  this.maskShape.clear().rect(0, 0, this.width_, this.height_).fill({ color: 0xffffff });
@@ -115,8 +329,7 @@ export class ScrollBox extends Container {
115
329
  const barWidth = 6;
116
330
  const x = this.width_ - barWidth;
117
331
  this.track.roundRect(x, 0, barWidth, this.height_, barWidth / 2).fill({ color: t.color.panelFill });
118
- const thumbHeight = Math.max(barWidth, (this.height_ / this.contentHeight_) * this.height_);
119
- const thumbY = (this.offset_ / this.maxOffset) * (this.height_ - thumbHeight);
332
+ const { y: thumbY, height: thumbHeight } = this.thumbMetrics;
120
333
  this.thumb.roundRect(x, thumbY, barWidth, thumbHeight, barWidth / 2).fill({ color: t.color.textHighlight });
121
334
  }
122
335
  destroy(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollBox.js","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollBox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScrollBox.js","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollBox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { Container } from 'pixi.js';
2
+ import { type LabelOptions } from './Label.ts';
3
+ import { ScrollBox } from './ScrollBox.ts';
4
+ /**
5
+ * `text` cut to fit `maxWidth`, ending in `ellipsis`, as measured by `measure` (the width of a string
6
+ * in whatever font the caller draws it with). A text that already fits comes back unchanged.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { ellipsize } from '@datamoc/mw_games/two-d/ui';
11
+ *
12
+ * const width = (text: string) => text.length * 10;
13
+ * console.log(ellipsize('3. Le Fleuve profond (verrouillé)', 150, width)); // 3. Le Fleuve…
14
+ * ```
15
+ */
16
+ export declare function ellipsize(text: string, maxWidth: number, measure: (text: string) => number, ellipsis?: string): string;
17
+ /**
18
+ * `text` wrapped at `maxWidth` and cut to `maxLines`, the last kept line ending in an ellipsis when
19
+ * something was dropped. Words are not split unless one alone is wider than a line.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { truncateLines } from '@datamoc/mw_games/two-d/ui';
24
+ *
25
+ * const width = (text: string) => text.length * 10;
26
+ * console.log(truncateLines('build a bridge across the river gorge', 120, 2, width));
27
+ * // ['build a', 'bridge acr…']
28
+ * ```
29
+ */
30
+ export declare function truncateLines(text: string, maxWidth: number, maxLines: number, measure: (text: string) => number, ellipsis?: string): string[];
31
+ /**
32
+ * How far a line of `textWidth` is shifted to scroll inside `boxWidth`, `time` seconds in: it waits
33
+ * `pause` seconds, slides to its end at `speed` px/s, waits again, then slides back, over and over.
34
+ * A text that fits never moves.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { marqueeOffset } from '@datamoc/mw_games/two-d/ui';
39
+ *
40
+ * console.log(marqueeOffset(300, 200, 0)); // 0, waiting at the start
41
+ * console.log(marqueeOffset(300, 200, 3)); // 100, at the far end
42
+ * console.log(marqueeOffset(150, 200, 3)); // 0, it fits
43
+ * ```
44
+ */
45
+ export declare function marqueeOffset(textWidth: number, boxWidth: number, time: number, speed?: number, pause?: number): number;
46
+ export interface ScrollTextOptions {
47
+ width: number;
48
+ /** the tallest the box grows before the text scrolls instead */
49
+ maxHeight: number;
50
+ text?: string;
51
+ label?: Omit<LabelOptions, 'text' | 'wrapWidth'>;
52
+ /** a finger drag scrolls the text; true when omitted */
53
+ touch?: boolean;
54
+ }
55
+ /**
56
+ * A wrapped `Label` in a `ScrollBox` that sizes itself: the box is as tall as the text up to
57
+ * `maxHeight`, and scrolls (wheel, touch, keys, scrollbar) beyond it, so a long hint, credit list or
58
+ * result message never spills over what is around it. `setText` re-measures and `resize(width)`
59
+ * re-wraps in place; the caller no longer measures the label and feeds `setContentHeight` by hand.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * import { ScrollText } from '@datamoc/mw_games/two-d/ui';
64
+ *
65
+ * const hint = new ScrollText({ width: 220, maxHeight: 60 });
66
+ * hint.setText('Span the gorge with at most 400 of budget. Cables only pull; beams push as well.');
67
+ * console.log(hint.box.viewportHeight <= 60); // true
68
+ * ```
69
+ */
70
+ export declare class ScrollText extends Container {
71
+ readonly box: ScrollBox;
72
+ private readonly body;
73
+ private readonly maxHeight;
74
+ private width_;
75
+ constructor(options: ScrollTextOptions);
76
+ /** the text's own height, which sizes the box; its own method so a test can supply it */
77
+ protected measureHeight(): number;
78
+ private measure;
79
+ /** the current width, what `resize` last set it to */
80
+ get viewWidth(): number;
81
+ /**
82
+ * Sets the width in place: the text re-wraps at the new width and the box resizes and
83
+ * re-measures, so a layout change does not rebuild the widget.
84
+ */
85
+ resize(width: number): void;
86
+ setText(text: string): void;
87
+ /** call each frame for touch coasting */
88
+ update(dt: number): void;
89
+ }
90
+ export interface MarqueeLabelOptions {
91
+ width: number;
92
+ text?: string;
93
+ label?: Omit<LabelOptions, 'text'>;
94
+ /** pixels per second; 40 when omitted */
95
+ speed?: number;
96
+ /** seconds it waits at each end; 1 when omitted */
97
+ pause?: number;
98
+ }
99
+ /**
100
+ * One line of text that stays on one line: when it is wider than `width` it slides back and forth
101
+ * inside a clipped window (`marqueeOffset`), driven by `update(dt)`. Under reduced motion it holds
102
+ * still, cut short with an ellipsis, instead of moving.
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * import { MarqueeLabel } from '@datamoc/mw_games/two-d/ui';
107
+ *
108
+ * const title = new MarqueeLabel({ width: 160, text: 'A very long track title that cannot fit' });
109
+ * title.update(1 / 60); // once a frame from the scene
110
+ * ```
111
+ */
112
+ export declare class MarqueeLabel extends Container {
113
+ private readonly body;
114
+ private readonly clip;
115
+ private readonly speed;
116
+ private readonly pause;
117
+ private readonly width_;
118
+ private readonly labelOptions;
119
+ private source;
120
+ private fullWidth;
121
+ private time;
122
+ constructor(options: MarqueeLabelOptions);
123
+ /** the text's width in pixels; its own method so a test can supply it */
124
+ protected measureWidth(text: string): number;
125
+ setText(text: string): void;
126
+ private apply;
127
+ /** where the text is shifted to now (0 until it has waited out its first pause) */
128
+ get shift(): number;
129
+ update(dt: number): void;
130
+ }
131
+ //# sourceMappingURL=ScrollText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollText.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollText.ts"],"names":[],"mappings":"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"}