@datamoc/mw_games 0.7.4 → 0.7.7

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 (288) hide show
  1. package/CHANGELOG.md +287 -2
  2. package/README.md +15 -2
  3. package/dist/actors/Inventory.d.ts +7 -1
  4. package/dist/actors/Inventory.d.ts.map +1 -1
  5. package/dist/actors/Inventory.js.map +1 -1
  6. package/dist/actors/craft.d.ts +35 -14
  7. package/dist/actors/craft.d.ts.map +1 -1
  8. package/dist/actors/craft.js +56 -24
  9. package/dist/actors/craft.js.map +1 -1
  10. package/dist/actors/index.d.ts +1 -1
  11. package/dist/actors/index.d.ts.map +1 -1
  12. package/dist/ai/Heuristics.d.ts +232 -0
  13. package/dist/ai/Heuristics.d.ts.map +1 -0
  14. package/dist/ai/Heuristics.js +298 -0
  15. package/dist/ai/Heuristics.js.map +1 -0
  16. package/dist/ai/index.d.ts +4 -0
  17. package/dist/ai/index.d.ts.map +1 -1
  18. package/dist/ai/index.js +2 -0
  19. package/dist/ai/index.js.map +1 -1
  20. package/dist/ai/score.d.ts +126 -0
  21. package/dist/ai/score.d.ts.map +1 -0
  22. package/dist/ai/score.js +121 -0
  23. package/dist/ai/score.js.map +1 -0
  24. package/dist/assets/loader.d.ts +18 -4
  25. package/dist/assets/loader.d.ts.map +1 -1
  26. package/dist/assets/loader.js +40 -11
  27. package/dist/assets/loader.js.map +1 -1
  28. package/dist/audio/Positional.d.ts +125 -0
  29. package/dist/audio/Positional.d.ts.map +1 -0
  30. package/dist/audio/Positional.js +135 -0
  31. package/dist/audio/Positional.js.map +1 -0
  32. package/dist/audio/Sound.d.ts +7 -1
  33. package/dist/audio/Sound.d.ts.map +1 -1
  34. package/dist/audio/Sound.js +8 -2
  35. package/dist/audio/Sound.js.map +1 -1
  36. package/dist/audio/index.d.ts +2 -0
  37. package/dist/audio/index.d.ts.map +1 -1
  38. package/dist/audio/index.js +1 -0
  39. package/dist/audio/index.js.map +1 -1
  40. package/dist/battle/AttackDialog.d.ts +75 -0
  41. package/dist/battle/AttackDialog.d.ts.map +1 -0
  42. package/dist/battle/AttackDialog.js +115 -0
  43. package/dist/battle/AttackDialog.js.map +1 -0
  44. package/dist/battle/AttackPreview.d.ts +70 -0
  45. package/dist/battle/AttackPreview.d.ts.map +1 -0
  46. package/dist/battle/AttackPreview.js +78 -0
  47. package/dist/battle/AttackPreview.js.map +1 -0
  48. package/dist/battle/BattleStats.d.ts +45 -0
  49. package/dist/battle/BattleStats.d.ts.map +1 -0
  50. package/dist/battle/BattleStats.js +63 -0
  51. package/dist/battle/BattleStats.js.map +1 -0
  52. package/dist/battle/UnitSelector.d.ts +72 -0
  53. package/dist/battle/UnitSelector.d.ts.map +1 -0
  54. package/dist/battle/UnitSelector.js +117 -0
  55. package/dist/battle/UnitSelector.js.map +1 -0
  56. package/dist/battle/Whiteboard.d.ts +50 -0
  57. package/dist/battle/Whiteboard.d.ts.map +1 -0
  58. package/dist/battle/Whiteboard.js +94 -0
  59. package/dist/battle/Whiteboard.js.map +1 -0
  60. package/dist/battle/index.d.ts +10 -0
  61. package/dist/battle/index.d.ts.map +1 -1
  62. package/dist/battle/index.js +5 -0
  63. package/dist/battle/index.js.map +1 -1
  64. package/dist/board/FogOfWar.d.ts +32 -2
  65. package/dist/board/FogOfWar.d.ts.map +1 -1
  66. package/dist/board/FogOfWar.js +70 -6
  67. package/dist/board/FogOfWar.js.map +1 -1
  68. package/dist/core/Achievements.d.ts +40 -7
  69. package/dist/core/Achievements.d.ts.map +1 -1
  70. package/dist/core/Achievements.js +51 -7
  71. package/dist/core/Achievements.js.map +1 -1
  72. package/dist/core/Blob.d.ts +13 -2
  73. package/dist/core/Blob.d.ts.map +1 -1
  74. package/dist/core/Blob.js +16 -2
  75. package/dist/core/Blob.js.map +1 -1
  76. package/dist/core/Hex.d.ts +26 -6
  77. package/dist/core/Hex.d.ts.map +1 -1
  78. package/dist/core/Hex.js +40 -13
  79. package/dist/core/Hex.js.map +1 -1
  80. package/dist/core/Input.d.ts +36 -0
  81. package/dist/core/Input.d.ts.map +1 -1
  82. package/dist/core/Input.js +63 -1
  83. package/dist/core/Input.js.map +1 -1
  84. package/dist/core/Random.d.ts +93 -0
  85. package/dist/core/Random.d.ts.map +1 -1
  86. package/dist/core/Random.js +177 -0
  87. package/dist/core/Random.js.map +1 -1
  88. package/dist/core/SyncGuard.d.ts +57 -0
  89. package/dist/core/SyncGuard.d.ts.map +1 -0
  90. package/dist/core/SyncGuard.js +116 -0
  91. package/dist/core/SyncGuard.js.map +1 -0
  92. package/dist/core/index.d.ts +3 -1
  93. package/dist/core/index.d.ts.map +1 -1
  94. package/dist/core/index.js +2 -1
  95. package/dist/core/index.js.map +1 -1
  96. package/dist/i18n/Po.d.ts +51 -0
  97. package/dist/i18n/Po.d.ts.map +1 -0
  98. package/dist/i18n/Po.js +176 -0
  99. package/dist/i18n/Po.js.map +1 -0
  100. package/dist/i18n/index.d.ts +2 -0
  101. package/dist/i18n/index.d.ts.map +1 -1
  102. package/dist/i18n/index.js +1 -0
  103. package/dist/i18n/index.js.map +1 -1
  104. package/dist/mw_games.global.js +104 -98
  105. package/dist/mwl/MapFile.d.ts +41 -0
  106. package/dist/mwl/MapFile.d.ts.map +1 -0
  107. package/dist/mwl/MapFile.js +43 -0
  108. package/dist/mwl/MapFile.js.map +1 -0
  109. package/dist/mwl/campaign.d.ts +51 -0
  110. package/dist/mwl/campaign.d.ts.map +1 -0
  111. package/dist/mwl/campaign.js +58 -0
  112. package/dist/mwl/campaign.js.map +1 -0
  113. package/dist/mwl/carryover.d.ts +79 -0
  114. package/dist/mwl/carryover.d.ts.map +1 -0
  115. package/dist/mwl/carryover.js +63 -0
  116. package/dist/mwl/carryover.js.map +1 -0
  117. package/dist/mwl/content.d.ts +10 -0
  118. package/dist/mwl/content.d.ts.map +1 -1
  119. package/dist/mwl/content.js +8 -0
  120. package/dist/mwl/content.js.map +1 -1
  121. package/dist/mwl/hooks.d.ts +6 -5
  122. package/dist/mwl/hooks.d.ts.map +1 -1
  123. package/dist/mwl/hooks.js.map +1 -1
  124. package/dist/mwl/index.d.ts +8 -2
  125. package/dist/mwl/index.d.ts.map +1 -1
  126. package/dist/mwl/index.js +4 -1
  127. package/dist/mwl/index.js.map +1 -1
  128. package/dist/mwl/runtime.d.ts +140 -7
  129. package/dist/mwl/runtime.d.ts.map +1 -1
  130. package/dist/mwl/runtime.js +427 -33
  131. package/dist/mwl/runtime.js.map +1 -1
  132. package/dist/mwl/schema.d.ts.map +1 -1
  133. package/dist/mwl/schema.js +97 -18
  134. package/dist/mwl/schema.js.map +1 -1
  135. package/dist/roguelike/MultiTurnBeam.d.ts +50 -12
  136. package/dist/roguelike/MultiTurnBeam.d.ts.map +1 -1
  137. package/dist/roguelike/MultiTurnBeam.js +100 -53
  138. package/dist/roguelike/MultiTurnBeam.js.map +1 -1
  139. package/dist/roguelike/Targeting.d.ts +94 -0
  140. package/dist/roguelike/Targeting.d.ts.map +1 -1
  141. package/dist/roguelike/Targeting.js +123 -0
  142. package/dist/roguelike/Targeting.js.map +1 -1
  143. package/dist/roguelike/index.d.ts +3 -1
  144. package/dist/roguelike/index.d.ts.map +1 -1
  145. package/dist/roguelike/index.js +1 -0
  146. package/dist/roguelike/index.js.map +1 -1
  147. package/dist/simulation/CampaignSave.d.ts +68 -0
  148. package/dist/simulation/CampaignSave.d.ts.map +1 -0
  149. package/dist/simulation/CampaignSave.js +54 -0
  150. package/dist/simulation/CampaignSave.js.map +1 -0
  151. package/dist/simulation/EventPresentation.d.ts +111 -0
  152. package/dist/simulation/EventPresentation.d.ts.map +1 -0
  153. package/dist/simulation/EventPresentation.js +120 -0
  154. package/dist/simulation/EventPresentation.js.map +1 -0
  155. package/dist/simulation/index.d.ts +4 -0
  156. package/dist/simulation/index.d.ts.map +1 -1
  157. package/dist/simulation/index.js +2 -0
  158. package/dist/simulation/index.js.map +1 -1
  159. package/dist/two-d/pixi-interop.d.ts +18 -6
  160. package/dist/two-d/pixi-interop.d.ts.map +1 -1
  161. package/dist/two-d/pixi-interop.js +18 -6
  162. package/dist/two-d/pixi-interop.js.map +1 -1
  163. package/dist/two-d/render/AnimatedSprite.d.ts +74 -7
  164. package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
  165. package/dist/two-d/render/AnimatedSprite.js +88 -26
  166. package/dist/two-d/render/AnimatedSprite.js.map +1 -1
  167. package/dist/two-d/render/Camera.d.ts +64 -4
  168. package/dist/two-d/render/Camera.d.ts.map +1 -1
  169. package/dist/two-d/render/Camera.js +132 -11
  170. package/dist/two-d/render/Camera.js.map +1 -1
  171. package/dist/two-d/render/Halo.d.ts +58 -0
  172. package/dist/two-d/render/Halo.d.ts.map +1 -0
  173. package/dist/two-d/render/Halo.js +48 -0
  174. package/dist/two-d/render/Halo.js.map +1 -0
  175. package/dist/two-d/render/ImageModifiers.d.ts +174 -0
  176. package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
  177. package/dist/two-d/render/ImageModifiers.js +438 -1
  178. package/dist/two-d/render/ImageModifiers.js.map +1 -1
  179. package/dist/two-d/render/LightningArc.d.ts +57 -0
  180. package/dist/two-d/render/LightningArc.d.ts.map +1 -0
  181. package/dist/two-d/render/LightningArc.js +91 -0
  182. package/dist/two-d/render/LightningArc.js.map +1 -0
  183. package/dist/two-d/render/PaletteRemap.d.ts +135 -0
  184. package/dist/two-d/render/PaletteRemap.d.ts.map +1 -0
  185. package/dist/two-d/render/PaletteRemap.js +181 -0
  186. package/dist/two-d/render/PaletteRemap.js.map +1 -0
  187. package/dist/two-d/render/Particles.d.ts +26 -0
  188. package/dist/two-d/render/Particles.d.ts.map +1 -1
  189. package/dist/two-d/render/Particles.js +23 -2
  190. package/dist/two-d/render/Particles.js.map +1 -1
  191. package/dist/two-d/render/SpriteAttachment.d.ts +55 -0
  192. package/dist/two-d/render/SpriteAttachment.d.ts.map +1 -0
  193. package/dist/two-d/render/SpriteAttachment.js +60 -0
  194. package/dist/two-d/render/SpriteAttachment.js.map +1 -0
  195. package/dist/two-d/render/TerrainGraphics.d.ts +142 -0
  196. package/dist/two-d/render/TerrainGraphics.d.ts.map +1 -0
  197. package/dist/two-d/render/TerrainGraphics.js +161 -0
  198. package/dist/two-d/render/TerrainGraphics.js.map +1 -0
  199. package/dist/two-d/render/index.d.ts +13 -3
  200. package/dist/two-d/render/index.d.ts.map +1 -1
  201. package/dist/two-d/render/index.js +6 -1
  202. package/dist/two-d/render/index.js.map +1 -1
  203. package/dist/two-d/stage/StoryScreen.d.ts +110 -0
  204. package/dist/two-d/stage/StoryScreen.d.ts.map +1 -0
  205. package/dist/two-d/stage/StoryScreen.js +178 -0
  206. package/dist/two-d/stage/StoryScreen.js.map +1 -0
  207. package/dist/two-d/stage/index.d.ts +2 -0
  208. package/dist/two-d/stage/index.d.ts.map +1 -1
  209. package/dist/two-d/stage/index.js +1 -0
  210. package/dist/two-d/stage/index.js.map +1 -1
  211. package/dist/two-d/ui/Checkbox.d.ts +44 -0
  212. package/dist/two-d/ui/Checkbox.d.ts.map +1 -0
  213. package/dist/two-d/ui/Checkbox.js +89 -0
  214. package/dist/two-d/ui/Checkbox.js.map +1 -0
  215. package/dist/two-d/ui/DataTable.d.ts +79 -0
  216. package/dist/two-d/ui/DataTable.d.ts.map +1 -0
  217. package/dist/two-d/ui/DataTable.js +164 -0
  218. package/dist/two-d/ui/DataTable.js.map +1 -0
  219. package/dist/two-d/ui/Dropdown.d.ts +72 -0
  220. package/dist/two-d/ui/Dropdown.d.ts.map +1 -0
  221. package/dist/two-d/ui/Dropdown.js +126 -0
  222. package/dist/two-d/ui/Dropdown.js.map +1 -0
  223. package/dist/two-d/ui/FloatingText.d.ts +43 -4
  224. package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
  225. package/dist/two-d/ui/FloatingText.js +52 -5
  226. package/dist/two-d/ui/FloatingText.js.map +1 -1
  227. package/dist/two-d/ui/FloatingTextStack.d.ts +86 -13
  228. package/dist/two-d/ui/FloatingTextStack.d.ts.map +1 -1
  229. package/dist/two-d/ui/FloatingTextStack.js +89 -18
  230. package/dist/two-d/ui/FloatingTextStack.js.map +1 -1
  231. package/dist/two-d/ui/Layout.d.ts +105 -0
  232. package/dist/two-d/ui/Layout.d.ts.map +1 -0
  233. package/dist/two-d/ui/Layout.js +174 -0
  234. package/dist/two-d/ui/Layout.js.map +1 -0
  235. package/dist/two-d/ui/ScrollBox.d.ts +67 -0
  236. package/dist/two-d/ui/ScrollBox.d.ts.map +1 -0
  237. package/dist/two-d/ui/ScrollBox.js +127 -0
  238. package/dist/two-d/ui/ScrollBox.js.map +1 -0
  239. package/dist/two-d/ui/Skins.d.ts +59 -0
  240. package/dist/two-d/ui/Skins.d.ts.map +1 -0
  241. package/dist/two-d/ui/Skins.js +77 -0
  242. package/dist/two-d/ui/Skins.js.map +1 -0
  243. package/dist/two-d/ui/Slider.d.ts +91 -0
  244. package/dist/two-d/ui/Slider.d.ts.map +1 -0
  245. package/dist/two-d/ui/Slider.js +170 -0
  246. package/dist/two-d/ui/Slider.js.map +1 -0
  247. package/dist/two-d/ui/Spinner.d.ts +67 -0
  248. package/dist/two-d/ui/Spinner.d.ts.map +1 -0
  249. package/dist/two-d/ui/Spinner.js +137 -0
  250. package/dist/two-d/ui/Spinner.js.map +1 -0
  251. package/dist/two-d/ui/TabbedList.d.ts +118 -0
  252. package/dist/two-d/ui/TabbedList.d.ts.map +1 -0
  253. package/dist/two-d/ui/TabbedList.js +221 -0
  254. package/dist/two-d/ui/TabbedList.js.map +1 -0
  255. package/dist/two-d/ui/TextModel.d.ts +65 -0
  256. package/dist/two-d/ui/TextModel.d.ts.map +1 -0
  257. package/dist/two-d/ui/TextModel.js +126 -0
  258. package/dist/two-d/ui/TextModel.js.map +1 -0
  259. package/dist/two-d/ui/TreeView.d.ts +68 -0
  260. package/dist/two-d/ui/TreeView.d.ts.map +1 -0
  261. package/dist/two-d/ui/TreeView.js +133 -0
  262. package/dist/two-d/ui/TreeView.js.map +1 -0
  263. package/dist/two-d/ui/Window.d.ts +13 -0
  264. package/dist/two-d/ui/Window.d.ts.map +1 -1
  265. package/dist/two-d/ui/Window.js +23 -0
  266. package/dist/two-d/ui/Window.js.map +1 -1
  267. package/dist/two-d/ui/WindowStack.d.ts.map +1 -1
  268. package/dist/two-d/ui/WindowStack.js +2 -0
  269. package/dist/two-d/ui/WindowStack.js.map +1 -1
  270. package/dist/two-d/ui/index.d.ts +27 -3
  271. package/dist/two-d/ui/index.d.ts.map +1 -1
  272. package/dist/two-d/ui/index.js +14 -2
  273. package/dist/two-d/ui/index.js.map +1 -1
  274. package/dist/two-d/ui/markup.d.ts +127 -0
  275. package/dist/two-d/ui/markup.d.ts.map +1 -0
  276. package/dist/two-d/ui/markup.js +322 -0
  277. package/dist/two-d/ui/markup.js.map +1 -0
  278. package/dist/version.d.ts +1 -1
  279. package/dist/version.js +1 -1
  280. package/dist/world/SideTurns.d.ts +115 -0
  281. package/dist/world/SideTurns.d.ts.map +1 -0
  282. package/dist/world/SideTurns.js +138 -0
  283. package/dist/world/SideTurns.js.map +1 -0
  284. package/dist/world/index.d.ts +2 -0
  285. package/dist/world/index.d.ts.map +1 -1
  286. package/dist/world/index.js +1 -0
  287. package/dist/world/index.js.map +1 -1
  288. package/package.json +8 -3
@@ -0,0 +1,178 @@
1
+ import { Container, Sprite, Texture } from 'pixi.js';
2
+ import { Signal } from '../../core/Signal.js';
3
+ import { Label } from '../ui/Label.js';
4
+ import { theme } from '../ui/theme.js';
5
+ /**
6
+ * The beats of a story screen and where the reader is in them, with no renderer attached - the
7
+ * same split `TabbedList` keeps, so the advance/back/skip rules are testable without a DOM.
8
+ *
9
+ * Music is reported as a signal rather than played: the sequence says *what* track a beat wants,
10
+ * and the game decides whether to crossfade, loop or ignore it. A beat with no `music` reports
11
+ * `null`, so a reader who turns the page to a silent beat gets the previous track stopped.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { StorySequence } from '@datamoc/mw_games/two-d/stage';
16
+ *
17
+ * const story = new StorySequence([
18
+ * { title: 'Prologue', text: 'The war begins.', music: 'intro.ogg' },
19
+ * { text: 'And so it went.' },
20
+ * ]);
21
+ * story.onMusic.add((track) => console.log(track)); // 'intro.ogg', then null
22
+ * story.advance();
23
+ * console.log(story.done); // true, only one page was left
24
+ * ```
25
+ */
26
+ export class StorySequence {
27
+ constructor(beats) {
28
+ this.onChange = new Signal();
29
+ this.onMusic = new Signal();
30
+ this.index = 0;
31
+ this.beats = beats;
32
+ }
33
+ get length() {
34
+ return this.beats.length;
35
+ }
36
+ /** the beat on screen, 0 when empty */
37
+ get position() {
38
+ return this.index;
39
+ }
40
+ /** the beat on screen; `null` for an empty story */
41
+ get current() {
42
+ return this.beats[this.index] ?? null;
43
+ }
44
+ /** whether the last beat is the one on screen */
45
+ get done() {
46
+ return this.beats.length === 0 || this.index >= this.beats.length - 1;
47
+ }
48
+ /** the music the current beat wants, or `null` for silence */
49
+ get music() {
50
+ return this.current?.music ?? null;
51
+ }
52
+ /** moves to a beat, clamped to the ends; reports the beat and its music either way */
53
+ goTo(index) {
54
+ const next = Math.max(0, Math.min(this.beats.length - 1, index));
55
+ this.index = next;
56
+ this.report();
57
+ }
58
+ /** turns one page; false when there was no next page */
59
+ advance() {
60
+ if (this.done)
61
+ return false;
62
+ this.goTo(this.index + 1);
63
+ return true;
64
+ }
65
+ /** turns back one page; false when already at the first */
66
+ back() {
67
+ if (this.index === 0)
68
+ return false;
69
+ this.goTo(this.index - 1);
70
+ return true;
71
+ }
72
+ /** jumps to the last beat, the "skip" a player who has read it before reaches for */
73
+ skip() {
74
+ this.goTo(this.beats.length - 1);
75
+ }
76
+ restart() {
77
+ this.goTo(0);
78
+ }
79
+ report() {
80
+ const beat = this.current;
81
+ if (beat)
82
+ this.onChange.dispatch(beat);
83
+ this.onMusic.dispatch(this.music);
84
+ }
85
+ }
86
+ /**
87
+ * A full-screen story beat: a backdrop image, a title and the text over it, advanced by a click -
88
+ * the campaign interlude a scenario shows between maps.
89
+ *
90
+ * `DialogueStage` is the visual-novel model: characters standing on a backdrop, a box under them
91
+ * doing the talking. This is the other shape an interlude needs and that one is not - one page of
92
+ * prose filling the screen, no cast, page forward on any input - so it reuses the same `Label`
93
+ * everything else lays words out with and leaves the sequencing to `StorySequence`, the part worth
94
+ * testing without a renderer. Feeding it `MwlWorld.story` from an `.mwl` scenario is the intended
95
+ * use: both carry the same `{ text, title, image, music }` shape.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * import { StoryScreen, StorySequence } from '@datamoc/mw_games/two-d/stage';
100
+ *
101
+ * const sequence = new StorySequence([{ title: 'Prologue', text: 'The war begins.' }]);
102
+ * const screen = new StoryScreen({ sequence, width: 960, height: 540 });
103
+ * console.log(screen.current?.title); // 'Prologue'
104
+ * ```
105
+ */
106
+ export class StoryScreen extends Container {
107
+ constructor(options) {
108
+ super();
109
+ this.backdrop = new Sprite(Texture.EMPTY);
110
+ this.handleAdvance = () => {
111
+ this.advance();
112
+ };
113
+ this.handleBeat = (beat) => {
114
+ this.applyBeat(beat);
115
+ };
116
+ this.sequence = options.sequence;
117
+ this.textureFor = options.textureFor ?? (() => null);
118
+ this.playMusic = options.playMusic ?? (() => { });
119
+ this.width_ = options.width;
120
+ this.height_ = options.height;
121
+ this.titleLabel = new Label({ text: '', color: theme().color.textHighlight });
122
+ this.textLabel = new Label({ text: '', wrapWidth: this.width_ * 0.8 });
123
+ this.addChild(this.backdrop);
124
+ this.addChild(this.titleLabel);
125
+ this.addChild(this.textLabel);
126
+ this.eventMode = 'static';
127
+ this.on('pointertap', this.handleAdvance);
128
+ this.sequence.onChange.add(this.handleBeat);
129
+ this.sequence.onMusic.add(this.playMusic);
130
+ this.applyBeat(this.sequence.current);
131
+ }
132
+ /** the beat on screen */
133
+ get current() {
134
+ return this.sequence.current;
135
+ }
136
+ /** turns one page; false when the story is over, the caller's cue to change scene */
137
+ advance() {
138
+ return this.sequence.advance();
139
+ }
140
+ /** jumps to the end, for a player who has already read it */
141
+ skip() {
142
+ this.sequence.skip();
143
+ }
144
+ resize(width, height) {
145
+ this.width_ = width;
146
+ this.height_ = height;
147
+ this.applyBeat(this.current);
148
+ }
149
+ applyBeat(beat) {
150
+ if (!beat) {
151
+ this.backdrop.visible = false;
152
+ return;
153
+ }
154
+ const texture = beat.image ? this.textureFor(beat.image) : null;
155
+ this.backdrop.visible = texture !== null;
156
+ if (texture) {
157
+ this.backdrop.texture = texture;
158
+ //cover the screen without distorting the art, the way a backdrop changes aspect
159
+ const scale = Math.max(this.width_ / texture.width, this.height_ / texture.height);
160
+ this.backdrop.scale.set(scale);
161
+ this.backdrop.x = (this.width_ - texture.width * scale) / 2;
162
+ this.backdrop.y = (this.height_ - texture.height * scale) / 2;
163
+ }
164
+ this.titleLabel.setText(beat.title ?? '');
165
+ this.titleLabel.x = this.width_ * 0.1;
166
+ this.titleLabel.y = this.height_ * 0.12;
167
+ this.textLabel.setText(beat.text);
168
+ this.textLabel.x = this.width_ * 0.1;
169
+ this.textLabel.y = this.height_ * 0.24;
170
+ this.textLabel.style.wordWrapWidth = this.width_ * 0.8;
171
+ }
172
+ destroy(options) {
173
+ this.sequence.onChange.remove(this.handleBeat);
174
+ this.sequence.onMusic.remove(this.playMusic);
175
+ super.destroy(options);
176
+ }
177
+ }
178
+ //# sourceMappingURL=StoryScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoryScreen.js","sourceRoot":"","sources":["../../../src/two-d/stage/StoryScreen.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,6 @@ export { StageScript } from './script.ts';
4
4
  export type { StageCommand, StageChoice, StoryScript, ScriptOptions, ScriptState, HistoryEntry } from './script.ts';
5
5
  export { importTwee } from './twee.ts';
6
6
  export type { TwineStory } from './twee.ts';
7
+ export { StoryScreen, StorySequence } from './StoryScreen.ts';
8
+ export type { StoryBeat, StoryScreenOptions } from './StoryScreen.ts';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC9D,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { DialogueStage } from './DialogueStage.js';
2
2
  export { StageScript } from './script.js';
3
3
  export { importTwee } from './twee.js';
4
+ export { StoryScreen, StorySequence } from './StoryScreen.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { Container } from 'pixi.js';
2
+ import { Signal } from '../../core/Signal.ts';
3
+ export interface CheckboxOptions {
4
+ /** the box's side length; the check is drawn inside it */
5
+ size?: number;
6
+ checked?: boolean;
7
+ disabled?: boolean;
8
+ /** the tick's colour; the theme's highlight when omitted */
9
+ color?: number;
10
+ }
11
+ /**
12
+ * A square box that is ticked or not, the toggle a settings row or an option list puts beside its
13
+ * label. It draws only the box and its tick - a caption is a `Label` the game places next to it,
14
+ * so the two can be laid out and translated independently.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * import { Checkbox } from '@datamoc/mw_games/two-d/ui';
19
+ *
20
+ * const fullscreen = new Checkbox({ checked: true });
21
+ * fullscreen.onChange.add((on) => console.log('fullscreen', on));
22
+ * fullscreen.toggle();
23
+ * ```
24
+ */
25
+ export declare class Checkbox extends Container {
26
+ readonly onChange: Signal<boolean>;
27
+ private box;
28
+ private size_;
29
+ private checked_;
30
+ private disabled_;
31
+ private readonly themeListener;
32
+ constructor(options?: CheckboxOptions);
33
+ get checked(): boolean;
34
+ get disabled(): boolean;
35
+ setDisabled(disabled: boolean): void;
36
+ /** sets the box, firing `onChange` only when the value actually moves */
37
+ setChecked(checked: boolean): void;
38
+ toggle(): void;
39
+ resize(size: number): void;
40
+ private readonly handleTap;
41
+ private draw;
42
+ destroy(options?: Parameters<Container['destroy']>[0]): void;
43
+ }
44
+ //# sourceMappingURL=Checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/Checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,MAAM,WAAW,eAAe;IAC/B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACtC,QAAQ,CAAC,QAAQ,kBAAyB;IAE1C,OAAO,CAAC,GAAG,CAAkB;IAE7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAEnD,YAAY,OAAO,GAAE,eAAoB,EAexC;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAInC;IAED,yEAAyE;IACzE,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQjC;IAED,MAAM,IAAI,IAAI,CAEb;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGzB;IAED,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGxB;IAEF,OAAO,CAAC,IAAI;IAoBH,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAGpE;CACD"}
@@ -0,0 +1,89 @@
1
+ import { Container, Graphics } from 'pixi.js';
2
+ import { Signal } from '../../core/Signal.js';
3
+ import { theme, themeChanged } from './theme.js';
4
+ /**
5
+ * A square box that is ticked or not, the toggle a settings row or an option list puts beside its
6
+ * label. It draws only the box and its tick - a caption is a `Label` the game places next to it,
7
+ * so the two can be laid out and translated independently.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { Checkbox } from '@datamoc/mw_games/two-d/ui';
12
+ *
13
+ * const fullscreen = new Checkbox({ checked: true });
14
+ * fullscreen.onChange.add((on) => console.log('fullscreen', on));
15
+ * fullscreen.toggle();
16
+ * ```
17
+ */
18
+ export class Checkbox extends Container {
19
+ constructor(options = {}) {
20
+ super();
21
+ this.onChange = new Signal();
22
+ this.box = new Graphics();
23
+ this.themeListener = () => this.draw();
24
+ this.handleTap = () => {
25
+ if (this.disabled_)
26
+ return;
27
+ this.toggle();
28
+ };
29
+ this.size_ = options.size ?? 20;
30
+ this.checked_ = options.checked ?? false;
31
+ this.disabled_ = options.disabled ?? false;
32
+ this.addChild(this.box);
33
+ this.draw();
34
+ this.eventMode = 'static';
35
+ this.cursor = 'pointer';
36
+ this.on('pointertap', this.handleTap);
37
+ themeChanged.add(this.themeListener);
38
+ }
39
+ get checked() {
40
+ return this.checked_;
41
+ }
42
+ get disabled() {
43
+ return this.disabled_;
44
+ }
45
+ setDisabled(disabled) {
46
+ this.disabled_ = disabled;
47
+ this.cursor = disabled ? 'default' : 'pointer';
48
+ this.draw();
49
+ }
50
+ /** sets the box, firing `onChange` only when the value actually moves */
51
+ setChecked(checked) {
52
+ if (checked === this.checked_) {
53
+ this.draw();
54
+ return;
55
+ }
56
+ this.checked_ = checked;
57
+ this.draw();
58
+ this.onChange.dispatch(checked);
59
+ }
60
+ toggle() {
61
+ this.setChecked(!this.checked_);
62
+ }
63
+ resize(size) {
64
+ this.size_ = size;
65
+ this.draw();
66
+ }
67
+ draw() {
68
+ const t = theme();
69
+ const color = this.disabled_ ? t.color.textDim : t.color.textHighlight;
70
+ this.box
71
+ .clear()
72
+ .roundRect(0, 0, this.size_, this.size_, 4)
73
+ .fill({ color: t.color.panelFill })
74
+ .stroke({ color: this.disabled_ ? t.color.textDim : t.color.panelBorder, width: 2 });
75
+ if (this.checked_) {
76
+ const inset = this.size_ * 0.25;
77
+ this.box
78
+ .moveTo(inset, this.size_ * 0.55)
79
+ .lineTo(this.size_ * 0.45, this.size_ - inset)
80
+ .lineTo(this.size_ - inset, inset)
81
+ .stroke({ color, width: Math.max(2, this.size_ * 0.12), cap: 'round', join: 'round' });
82
+ }
83
+ }
84
+ destroy(options) {
85
+ themeChanged.remove(this.themeListener);
86
+ super.destroy(options);
87
+ }
88
+ }
89
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/two-d/ui/Checkbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { Signal } from '../../core/Signal.ts';
2
+ export interface TableColumn<T> {
3
+ /** the key a sort reads when the column has no `compare` */
4
+ key: string;
5
+ /** the header caption; a game may still draw its own */
6
+ label?: string;
7
+ width?: number;
8
+ align?: 'left' | 'right' | 'center';
9
+ /** how to sort this column; `row[key]` compared generically when omitted */
10
+ compare?: (a: T, b: T) => number;
11
+ }
12
+ export interface DataTableOptions<T> {
13
+ columns: readonly TableColumn<T>[];
14
+ rows?: readonly T[];
15
+ /** rows per page; 0 or omitted means one page, no paging */
16
+ pageSize?: number;
17
+ /** rows the highlight skips, the way `ListView` skips a disabled item */
18
+ disabled?: (row: T) => boolean;
19
+ }
20
+ /**
21
+ * A columned table with a highlighted row, a sort order and paging - the roster or inventory grid
22
+ * that wants headers and a stable sort, where `ListView` is a flat one-column list.
23
+ *
24
+ * Renderer-free, like `TabbedList`: it holds the columns, the rows, the sort, the highlight and
25
+ * the current page, and a game draws the cells. The page is *derived* from the highlighted row
26
+ * rather than tracked beside it, so the two can never disagree; `setPage` is the only thing that
27
+ * moves the highlight on its own, and it lands on the first selectable row of that page.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * import { DataTable } from '@datamoc/mw_games/two-d/ui';
32
+ *
33
+ * const roster = new DataTable({
34
+ * columns: [{ key: 'name' }, { key: 'level' }],
35
+ * rows: [{ name: 'Ash', level: 3 }, { name: 'Bo', level: 1 }],
36
+ * });
37
+ * roster.sortBy('level');
38
+ * console.log(roster.rows[0].name); // 'Bo'
39
+ * ```
40
+ */
41
+ export declare class DataTable<T> {
42
+ readonly onChange: Signal<void>;
43
+ private columns_;
44
+ private rows_;
45
+ private pageSize_;
46
+ private current;
47
+ private sortKey_;
48
+ private ascending;
49
+ private readonly disabledOf;
50
+ constructor(options: DataTableOptions<T>);
51
+ get columns(): readonly TableColumn<T>[];
52
+ get rows(): readonly T[];
53
+ get pageSize(): number;
54
+ get sortKey(): string | null;
55
+ get sortAscending(): boolean;
56
+ get selectedIndex(): number;
57
+ get selected(): T | null;
58
+ /** the page the highlighted row is on, 0 when there is no paging */
59
+ get page(): number;
60
+ /** how many pages there are; at least one, so an empty table still has a page 0 */
61
+ get pageCount(): number;
62
+ get pageRows(): readonly T[];
63
+ setRows(rows: readonly T[]): void;
64
+ setColumns(columns: readonly TableColumn<T>[]): void;
65
+ setPageSize(size: number): void;
66
+ /**
67
+ * Sorts by a column, ascending the first time and toggling on a repeat of the same key.
68
+ * The highlight returns to the first selectable row, since the row it pointed at moved.
69
+ */
70
+ sortBy(key: string): void;
71
+ select(index: number): void;
72
+ /** moves the highlight a row at a time, skipping disabled rows and stopping at the ends */
73
+ move(delta: number): void;
74
+ /** moves to a page and highlights its first selectable row */
75
+ setPage(page: number): void;
76
+ nextPage(delta?: number): void;
77
+ private firstEnabled;
78
+ }
79
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/DataTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAClC,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,SAAS,CAAC,CAAC;IACvB,QAAQ,CAAC,QAAQ,eAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,YAAY,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAMvC;IAED,IAAI,OAAO,IAAI,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAEvC;IAED,IAAI,IAAI,IAAI,SAAS,CAAC,EAAE,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,CAEvB;IAED,oEAAoE;IACpE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mFAAmF;IACnF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,SAAS,CAAC,EAAE,CAI3B;IAED,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,CAIhC;IAED,UAAU,CAAC,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAInD;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG9B;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAYxB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1B;IAED,2FAA2F;IAC3F,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAaxB;IAED,8DAA8D;IAC9D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAY1B;IAED,QAAQ,CAAC,KAAK,SAAI,GAAG,IAAI,CAExB;IAED,OAAO,CAAC,YAAY;CAIpB"}
@@ -0,0 +1,164 @@
1
+ import { Signal } from '../../core/Signal.js';
2
+ /**
3
+ * A columned table with a highlighted row, a sort order and paging - the roster or inventory grid
4
+ * that wants headers and a stable sort, where `ListView` is a flat one-column list.
5
+ *
6
+ * Renderer-free, like `TabbedList`: it holds the columns, the rows, the sort, the highlight and
7
+ * the current page, and a game draws the cells. The page is *derived* from the highlighted row
8
+ * rather than tracked beside it, so the two can never disagree; `setPage` is the only thing that
9
+ * moves the highlight on its own, and it lands on the first selectable row of that page.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { DataTable } from '@datamoc/mw_games/two-d/ui';
14
+ *
15
+ * const roster = new DataTable({
16
+ * columns: [{ key: 'name' }, { key: 'level' }],
17
+ * rows: [{ name: 'Ash', level: 3 }, { name: 'Bo', level: 1 }],
18
+ * });
19
+ * roster.sortBy('level');
20
+ * console.log(roster.rows[0].name); // 'Bo'
21
+ * ```
22
+ */
23
+ export class DataTable {
24
+ constructor(options) {
25
+ this.onChange = new Signal();
26
+ this.current = 0;
27
+ this.sortKey_ = null;
28
+ this.ascending = true;
29
+ this.columns_ = [...options.columns];
30
+ this.rows_ = [...(options.rows ?? [])];
31
+ this.pageSize_ = options.pageSize ?? 0;
32
+ this.disabledOf = options.disabled ?? (() => false);
33
+ this.current = this.firstEnabled();
34
+ }
35
+ get columns() {
36
+ return this.columns_;
37
+ }
38
+ get rows() {
39
+ return this.rows_;
40
+ }
41
+ get pageSize() {
42
+ return this.pageSize_;
43
+ }
44
+ get sortKey() {
45
+ return this.sortKey_;
46
+ }
47
+ get sortAscending() {
48
+ return this.ascending;
49
+ }
50
+ get selectedIndex() {
51
+ return this.current;
52
+ }
53
+ get selected() {
54
+ return this.rows_[this.current] ?? null;
55
+ }
56
+ /** the page the highlighted row is on, 0 when there is no paging */
57
+ get page() {
58
+ return this.pageSize_ > 0 ? Math.floor(this.current / this.pageSize_) : 0;
59
+ }
60
+ /** how many pages there are; at least one, so an empty table still has a page 0 */
61
+ get pageCount() {
62
+ return this.pageSize_ > 0 ? Math.max(1, Math.ceil(this.rows_.length / this.pageSize_)) : 1;
63
+ }
64
+ get pageRows() {
65
+ if (this.pageSize_ <= 0)
66
+ return this.rows_;
67
+ const start = this.page * this.pageSize_;
68
+ return this.rows_.slice(start, start + this.pageSize_);
69
+ }
70
+ setRows(rows) {
71
+ this.rows_ = [...rows];
72
+ this.current = this.firstEnabled();
73
+ this.onChange.dispatch();
74
+ }
75
+ setColumns(columns) {
76
+ this.columns_ = [...columns];
77
+ if (this.sortKey_ && !this.columns_.some((column) => column.key === this.sortKey_))
78
+ this.sortKey_ = null;
79
+ this.onChange.dispatch();
80
+ }
81
+ setPageSize(size) {
82
+ this.pageSize_ = Math.max(0, size);
83
+ this.onChange.dispatch();
84
+ }
85
+ /**
86
+ * Sorts by a column, ascending the first time and toggling on a repeat of the same key.
87
+ * The highlight returns to the first selectable row, since the row it pointed at moved.
88
+ */
89
+ sortBy(key) {
90
+ const column = this.columns_.find((candidate) => candidate.key === key);
91
+ if (!column)
92
+ return;
93
+ if (this.sortKey_ === key)
94
+ this.ascending = !this.ascending;
95
+ else {
96
+ this.sortKey_ = key;
97
+ this.ascending = true;
98
+ }
99
+ const compare = column.compare ?? ((a, b) => genericCompare(valueAt(a, key), valueAt(b, key)));
100
+ this.rows_.sort((a, b) => (this.ascending ? 1 : -1) * compare(a, b));
101
+ this.current = this.firstEnabled();
102
+ this.onChange.dispatch();
103
+ }
104
+ select(index) {
105
+ if (index < 0 || index >= this.rows_.length || this.disabledOf(this.rows_[index]))
106
+ return;
107
+ this.current = index;
108
+ this.onChange.dispatch();
109
+ }
110
+ /** moves the highlight a row at a time, skipping disabled rows and stopping at the ends */
111
+ move(delta) {
112
+ const count = this.rows_.length;
113
+ if (count === 0)
114
+ return;
115
+ let index = this.current;
116
+ for (let tried = 0; tried < count; tried++) {
117
+ index += delta;
118
+ if (index < 0 || index >= count)
119
+ return;
120
+ if (!this.disabledOf(this.rows_[index])) {
121
+ this.current = index;
122
+ this.onChange.dispatch();
123
+ return;
124
+ }
125
+ }
126
+ }
127
+ /** moves to a page and highlights its first selectable row */
128
+ setPage(page) {
129
+ if (this.pageSize_ <= 0)
130
+ return;
131
+ const target = Math.max(0, Math.min(this.pageCount - 1, page));
132
+ const start = target * this.pageSize_;
133
+ const end = Math.min(start + this.pageSize_, this.rows_.length);
134
+ for (let index = start; index < end; index++) {
135
+ if (!this.disabledOf(this.rows_[index])) {
136
+ this.current = index;
137
+ this.onChange.dispatch();
138
+ return;
139
+ }
140
+ }
141
+ }
142
+ nextPage(delta = 1) {
143
+ this.setPage(this.page + delta);
144
+ }
145
+ firstEnabled() {
146
+ const index = this.rows_.findIndex((row) => !this.disabledOf(row));
147
+ return index === -1 ? 0 : index;
148
+ }
149
+ }
150
+ function valueAt(row, key) {
151
+ return row && typeof row === 'object' ? row[key] : undefined;
152
+ }
153
+ function genericCompare(a, b) {
154
+ if (a === b)
155
+ return 0;
156
+ if (a === undefined)
157
+ return -1;
158
+ if (b === undefined)
159
+ return 1;
160
+ if (typeof a === 'number' && typeof b === 'number')
161
+ return a - b;
162
+ return String(a).localeCompare(String(b));
163
+ }
164
+ //# sourceMappingURL=DataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/two-d/ui/DataTable.ts"],"names":[],"mappings":"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"}