@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.
- package/CHANGELOG.md +287 -2
- package/README.md +15 -2
- package/dist/actors/Inventory.d.ts +7 -1
- package/dist/actors/Inventory.d.ts.map +1 -1
- package/dist/actors/Inventory.js.map +1 -1
- package/dist/actors/craft.d.ts +35 -14
- package/dist/actors/craft.d.ts.map +1 -1
- package/dist/actors/craft.js +56 -24
- package/dist/actors/craft.js.map +1 -1
- package/dist/actors/index.d.ts +1 -1
- package/dist/actors/index.d.ts.map +1 -1
- package/dist/ai/Heuristics.d.ts +232 -0
- package/dist/ai/Heuristics.d.ts.map +1 -0
- package/dist/ai/Heuristics.js +298 -0
- package/dist/ai/Heuristics.js.map +1 -0
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/score.d.ts +126 -0
- package/dist/ai/score.d.ts.map +1 -0
- package/dist/ai/score.js +121 -0
- package/dist/ai/score.js.map +1 -0
- package/dist/assets/loader.d.ts +18 -4
- package/dist/assets/loader.d.ts.map +1 -1
- package/dist/assets/loader.js +40 -11
- package/dist/assets/loader.js.map +1 -1
- package/dist/audio/Positional.d.ts +125 -0
- package/dist/audio/Positional.d.ts.map +1 -0
- package/dist/audio/Positional.js +135 -0
- package/dist/audio/Positional.js.map +1 -0
- package/dist/audio/Sound.d.ts +7 -1
- package/dist/audio/Sound.d.ts.map +1 -1
- package/dist/audio/Sound.js +8 -2
- package/dist/audio/Sound.js.map +1 -1
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +1 -0
- package/dist/audio/index.js.map +1 -1
- package/dist/battle/AttackDialog.d.ts +75 -0
- package/dist/battle/AttackDialog.d.ts.map +1 -0
- package/dist/battle/AttackDialog.js +115 -0
- package/dist/battle/AttackDialog.js.map +1 -0
- package/dist/battle/AttackPreview.d.ts +70 -0
- package/dist/battle/AttackPreview.d.ts.map +1 -0
- package/dist/battle/AttackPreview.js +78 -0
- package/dist/battle/AttackPreview.js.map +1 -0
- package/dist/battle/BattleStats.d.ts +45 -0
- package/dist/battle/BattleStats.d.ts.map +1 -0
- package/dist/battle/BattleStats.js +63 -0
- package/dist/battle/BattleStats.js.map +1 -0
- package/dist/battle/UnitSelector.d.ts +72 -0
- package/dist/battle/UnitSelector.d.ts.map +1 -0
- package/dist/battle/UnitSelector.js +117 -0
- package/dist/battle/UnitSelector.js.map +1 -0
- package/dist/battle/Whiteboard.d.ts +50 -0
- package/dist/battle/Whiteboard.d.ts.map +1 -0
- package/dist/battle/Whiteboard.js +94 -0
- package/dist/battle/Whiteboard.js.map +1 -0
- package/dist/battle/index.d.ts +10 -0
- package/dist/battle/index.d.ts.map +1 -1
- package/dist/battle/index.js +5 -0
- package/dist/battle/index.js.map +1 -1
- package/dist/board/FogOfWar.d.ts +32 -2
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +70 -6
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/core/Achievements.d.ts +40 -7
- package/dist/core/Achievements.d.ts.map +1 -1
- package/dist/core/Achievements.js +51 -7
- package/dist/core/Achievements.js.map +1 -1
- package/dist/core/Blob.d.ts +13 -2
- package/dist/core/Blob.d.ts.map +1 -1
- package/dist/core/Blob.js +16 -2
- package/dist/core/Blob.js.map +1 -1
- package/dist/core/Hex.d.ts +26 -6
- package/dist/core/Hex.d.ts.map +1 -1
- package/dist/core/Hex.js +40 -13
- package/dist/core/Hex.js.map +1 -1
- package/dist/core/Input.d.ts +36 -0
- package/dist/core/Input.d.ts.map +1 -1
- package/dist/core/Input.js +63 -1
- package/dist/core/Input.js.map +1 -1
- package/dist/core/Random.d.ts +93 -0
- package/dist/core/Random.d.ts.map +1 -1
- package/dist/core/Random.js +177 -0
- package/dist/core/Random.js.map +1 -1
- package/dist/core/SyncGuard.d.ts +57 -0
- package/dist/core/SyncGuard.d.ts.map +1 -0
- package/dist/core/SyncGuard.js +116 -0
- package/dist/core/SyncGuard.js.map +1 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/i18n/Po.d.ts +51 -0
- package/dist/i18n/Po.d.ts.map +1 -0
- package/dist/i18n/Po.js +176 -0
- package/dist/i18n/Po.js.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/mw_games.global.js +104 -98
- package/dist/mwl/MapFile.d.ts +41 -0
- package/dist/mwl/MapFile.d.ts.map +1 -0
- package/dist/mwl/MapFile.js +43 -0
- package/dist/mwl/MapFile.js.map +1 -0
- package/dist/mwl/campaign.d.ts +51 -0
- package/dist/mwl/campaign.d.ts.map +1 -0
- package/dist/mwl/campaign.js +58 -0
- package/dist/mwl/campaign.js.map +1 -0
- package/dist/mwl/carryover.d.ts +79 -0
- package/dist/mwl/carryover.d.ts.map +1 -0
- package/dist/mwl/carryover.js +63 -0
- package/dist/mwl/carryover.js.map +1 -0
- package/dist/mwl/content.d.ts +10 -0
- package/dist/mwl/content.d.ts.map +1 -1
- package/dist/mwl/content.js +8 -0
- package/dist/mwl/content.js.map +1 -1
- package/dist/mwl/hooks.d.ts +6 -5
- package/dist/mwl/hooks.d.ts.map +1 -1
- package/dist/mwl/hooks.js.map +1 -1
- package/dist/mwl/index.d.ts +8 -2
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +4 -1
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/runtime.d.ts +140 -7
- package/dist/mwl/runtime.d.ts.map +1 -1
- package/dist/mwl/runtime.js +427 -33
- package/dist/mwl/runtime.js.map +1 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/schema.js +97 -18
- package/dist/mwl/schema.js.map +1 -1
- package/dist/roguelike/MultiTurnBeam.d.ts +50 -12
- package/dist/roguelike/MultiTurnBeam.d.ts.map +1 -1
- package/dist/roguelike/MultiTurnBeam.js +100 -53
- package/dist/roguelike/MultiTurnBeam.js.map +1 -1
- package/dist/roguelike/Targeting.d.ts +94 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -1
- package/dist/roguelike/Targeting.js +123 -0
- package/dist/roguelike/Targeting.js.map +1 -1
- package/dist/roguelike/index.d.ts +3 -1
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +1 -0
- package/dist/roguelike/index.js.map +1 -1
- package/dist/simulation/CampaignSave.d.ts +68 -0
- package/dist/simulation/CampaignSave.d.ts.map +1 -0
- package/dist/simulation/CampaignSave.js +54 -0
- package/dist/simulation/CampaignSave.js.map +1 -0
- package/dist/simulation/EventPresentation.d.ts +111 -0
- package/dist/simulation/EventPresentation.d.ts.map +1 -0
- package/dist/simulation/EventPresentation.js +120 -0
- package/dist/simulation/EventPresentation.js.map +1 -0
- package/dist/simulation/index.d.ts +4 -0
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +2 -0
- package/dist/simulation/index.js.map +1 -1
- package/dist/two-d/pixi-interop.d.ts +18 -6
- package/dist/two-d/pixi-interop.d.ts.map +1 -1
- package/dist/two-d/pixi-interop.js +18 -6
- package/dist/two-d/pixi-interop.js.map +1 -1
- package/dist/two-d/render/AnimatedSprite.d.ts +74 -7
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
- package/dist/two-d/render/AnimatedSprite.js +88 -26
- package/dist/two-d/render/AnimatedSprite.js.map +1 -1
- package/dist/two-d/render/Camera.d.ts +64 -4
- package/dist/two-d/render/Camera.d.ts.map +1 -1
- package/dist/two-d/render/Camera.js +132 -11
- package/dist/two-d/render/Camera.js.map +1 -1
- package/dist/two-d/render/Halo.d.ts +58 -0
- package/dist/two-d/render/Halo.d.ts.map +1 -0
- package/dist/two-d/render/Halo.js +48 -0
- package/dist/two-d/render/Halo.js.map +1 -0
- package/dist/two-d/render/ImageModifiers.d.ts +174 -0
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
- package/dist/two-d/render/ImageModifiers.js +438 -1
- package/dist/two-d/render/ImageModifiers.js.map +1 -1
- package/dist/two-d/render/LightningArc.d.ts +57 -0
- package/dist/two-d/render/LightningArc.d.ts.map +1 -0
- package/dist/two-d/render/LightningArc.js +91 -0
- package/dist/two-d/render/LightningArc.js.map +1 -0
- package/dist/two-d/render/PaletteRemap.d.ts +135 -0
- package/dist/two-d/render/PaletteRemap.d.ts.map +1 -0
- package/dist/two-d/render/PaletteRemap.js +181 -0
- package/dist/two-d/render/PaletteRemap.js.map +1 -0
- package/dist/two-d/render/Particles.d.ts +26 -0
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +23 -2
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/SpriteAttachment.d.ts +55 -0
- package/dist/two-d/render/SpriteAttachment.d.ts.map +1 -0
- package/dist/two-d/render/SpriteAttachment.js +60 -0
- package/dist/two-d/render/SpriteAttachment.js.map +1 -0
- package/dist/two-d/render/TerrainGraphics.d.ts +142 -0
- package/dist/two-d/render/TerrainGraphics.d.ts.map +1 -0
- package/dist/two-d/render/TerrainGraphics.js +161 -0
- package/dist/two-d/render/TerrainGraphics.js.map +1 -0
- package/dist/two-d/render/index.d.ts +13 -3
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +6 -1
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/stage/StoryScreen.d.ts +110 -0
- package/dist/two-d/stage/StoryScreen.d.ts.map +1 -0
- package/dist/two-d/stage/StoryScreen.js +178 -0
- package/dist/two-d/stage/StoryScreen.js.map +1 -0
- package/dist/two-d/stage/index.d.ts +2 -0
- package/dist/two-d/stage/index.d.ts.map +1 -1
- package/dist/two-d/stage/index.js +1 -0
- package/dist/two-d/stage/index.js.map +1 -1
- package/dist/two-d/ui/Checkbox.d.ts +44 -0
- package/dist/two-d/ui/Checkbox.d.ts.map +1 -0
- package/dist/two-d/ui/Checkbox.js +89 -0
- package/dist/two-d/ui/Checkbox.js.map +1 -0
- package/dist/two-d/ui/DataTable.d.ts +79 -0
- package/dist/two-d/ui/DataTable.d.ts.map +1 -0
- package/dist/two-d/ui/DataTable.js +164 -0
- package/dist/two-d/ui/DataTable.js.map +1 -0
- package/dist/two-d/ui/Dropdown.d.ts +72 -0
- package/dist/two-d/ui/Dropdown.d.ts.map +1 -0
- package/dist/two-d/ui/Dropdown.js +126 -0
- package/dist/two-d/ui/Dropdown.js.map +1 -0
- package/dist/two-d/ui/FloatingText.d.ts +43 -4
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +52 -5
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.d.ts +86 -13
- package/dist/two-d/ui/FloatingTextStack.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.js +89 -18
- package/dist/two-d/ui/FloatingTextStack.js.map +1 -1
- package/dist/two-d/ui/Layout.d.ts +105 -0
- package/dist/two-d/ui/Layout.d.ts.map +1 -0
- package/dist/two-d/ui/Layout.js +174 -0
- package/dist/two-d/ui/Layout.js.map +1 -0
- package/dist/two-d/ui/ScrollBox.d.ts +67 -0
- package/dist/two-d/ui/ScrollBox.d.ts.map +1 -0
- package/dist/two-d/ui/ScrollBox.js +127 -0
- package/dist/two-d/ui/ScrollBox.js.map +1 -0
- package/dist/two-d/ui/Skins.d.ts +59 -0
- package/dist/two-d/ui/Skins.d.ts.map +1 -0
- package/dist/two-d/ui/Skins.js +77 -0
- package/dist/two-d/ui/Skins.js.map +1 -0
- package/dist/two-d/ui/Slider.d.ts +91 -0
- package/dist/two-d/ui/Slider.d.ts.map +1 -0
- package/dist/two-d/ui/Slider.js +170 -0
- package/dist/two-d/ui/Slider.js.map +1 -0
- package/dist/two-d/ui/Spinner.d.ts +67 -0
- package/dist/two-d/ui/Spinner.d.ts.map +1 -0
- package/dist/two-d/ui/Spinner.js +137 -0
- package/dist/two-d/ui/Spinner.js.map +1 -0
- package/dist/two-d/ui/TabbedList.d.ts +118 -0
- package/dist/two-d/ui/TabbedList.d.ts.map +1 -0
- package/dist/two-d/ui/TabbedList.js +221 -0
- package/dist/two-d/ui/TabbedList.js.map +1 -0
- package/dist/two-d/ui/TextModel.d.ts +65 -0
- package/dist/two-d/ui/TextModel.d.ts.map +1 -0
- package/dist/two-d/ui/TextModel.js +126 -0
- package/dist/two-d/ui/TextModel.js.map +1 -0
- package/dist/two-d/ui/TreeView.d.ts +68 -0
- package/dist/two-d/ui/TreeView.d.ts.map +1 -0
- package/dist/two-d/ui/TreeView.js +133 -0
- package/dist/two-d/ui/TreeView.js.map +1 -0
- package/dist/two-d/ui/Window.d.ts +13 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +23 -0
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/WindowStack.d.ts.map +1 -1
- package/dist/two-d/ui/WindowStack.js +2 -0
- package/dist/two-d/ui/WindowStack.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +27 -3
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +14 -2
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/two-d/ui/markup.d.ts +127 -0
- package/dist/two-d/ui/markup.d.ts.map +1 -0
- package/dist/two-d/ui/markup.js +322 -0
- package/dist/two-d/ui/markup.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/world/SideTurns.d.ts +115 -0
- package/dist/world/SideTurns.d.ts.map +1 -0
- package/dist/world/SideTurns.js +138 -0
- package/dist/world/SideTurns.js.map +1 -0
- package/dist/world/index.d.ts +2 -0
- package/dist/world/index.d.ts.map +1 -1
- package/dist/world/index.js +1 -0
- package/dist/world/index.js.map +1 -1
- package/package.json +8 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollBox.js","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollBox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Texture2D } from '../render/Types2D.ts';
|
|
2
|
+
export type WidgetState = 'idle' | 'hover' | 'pressed' | 'disabled' | 'selected' | 'focused';
|
|
3
|
+
/**
|
|
4
|
+
* The visual a widget draws itself with in one state. Every field is optional and each falls back
|
|
5
|
+
* independently as `Skins.resolve` walks its chain, so a skin can override just one channel of a
|
|
6
|
+
* widget's look - its pressed background, say - and keep the rest.
|
|
7
|
+
*/
|
|
8
|
+
export interface Skin {
|
|
9
|
+
background?: number;
|
|
10
|
+
border?: number;
|
|
11
|
+
borderWidth?: number;
|
|
12
|
+
text?: number;
|
|
13
|
+
padding?: number;
|
|
14
|
+
texture?: Texture2D;
|
|
15
|
+
/** how many pixels of `texture` are its fixed border */
|
|
16
|
+
borderInset?: number;
|
|
17
|
+
}
|
|
18
|
+
export type SkinStates = Partial<Record<WidgetState, Skin>>;
|
|
19
|
+
/** A widget's entry: a bare skin, meaning its idle look, or one look per state. */
|
|
20
|
+
export type SkinData = Skin | SkinStates;
|
|
21
|
+
/**
|
|
22
|
+
* Per-widget and per-state skins, looked up by name - the data-driven half of what GUI2 puts in
|
|
23
|
+
* `data/gui/*.cfg`, and the thing the one global `Theme` has no room for.
|
|
24
|
+
*
|
|
25
|
+
* A lookup walks a fixed chain so a caller never gets `undefined`: the widget's own state, its
|
|
26
|
+
* idle look, the wildcard widget's state, the wildcard's idle look, then an empty skin. That is
|
|
27
|
+
* what lets a game define a shared `*` skin once and override only the two widgets it cares about,
|
|
28
|
+
* and what makes a state a widget never defined fall back rather than disappear.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { Skins } from '@datamoc/mw_games/two-d/ui';
|
|
33
|
+
*
|
|
34
|
+
* const skins = new Skins();
|
|
35
|
+
* skins.define('*', 'idle', { background: 0x101018, text: 0xe8e8f0 });
|
|
36
|
+
* skins.define('button', 'pressed', { background: 0xffe680, text: 0x101018 });
|
|
37
|
+
*
|
|
38
|
+
* console.log(skins.resolve('button', 'pressed').text); // 0x101018, the override
|
|
39
|
+
* console.log(skins.resolve('label', 'idle').background); // 0x101018, the wildcard
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class Skins {
|
|
43
|
+
private readonly map;
|
|
44
|
+
/** the wildcard widget every lookup falls back to */
|
|
45
|
+
static readonly ANY = "*";
|
|
46
|
+
define(widget: string, state: WidgetState, skin: Skin): void;
|
|
47
|
+
has(widget: string): boolean;
|
|
48
|
+
widgets(): string[];
|
|
49
|
+
/** the skin a widget draws in a state, following the fallback chain to an empty skin */
|
|
50
|
+
resolve(widget: string, state?: WidgetState): Skin;
|
|
51
|
+
/** every state a widget has an entry for, not counting the wildcard fallback */
|
|
52
|
+
statesOf(widget: string): WidgetState[];
|
|
53
|
+
/**
|
|
54
|
+
* Builds a registry from plain data - the shape a config file would parse into. An entry with
|
|
55
|
+
* any state key is read as one look per state; anything else is that widget's idle look.
|
|
56
|
+
*/
|
|
57
|
+
static from(data: Readonly<Record<string, SkinData>>): Skins;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=Skins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skins.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/Skins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7F;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,UAAU,CAAC;AAIzC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IAErD,qDAAqD;IACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO;IAE1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAI3D;IAED,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3B;IAED,OAAO,IAAI,MAAM,EAAE,CAElB;IAED,wFAAwF;IACxF,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,WAAoB,GAAG,IAAI,CAQzD;IAED,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAGtC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,CAa3D;CACD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const STATES = ['idle', 'hover', 'pressed', 'disabled', 'selected', 'focused'];
|
|
2
|
+
/**
|
|
3
|
+
* Per-widget and per-state skins, looked up by name - the data-driven half of what GUI2 puts in
|
|
4
|
+
* `data/gui/*.cfg`, and the thing the one global `Theme` has no room for.
|
|
5
|
+
*
|
|
6
|
+
* A lookup walks a fixed chain so a caller never gets `undefined`: the widget's own state, its
|
|
7
|
+
* idle look, the wildcard widget's state, the wildcard's idle look, then an empty skin. That is
|
|
8
|
+
* what lets a game define a shared `*` skin once and override only the two widgets it cares about,
|
|
9
|
+
* and what makes a state a widget never defined fall back rather than disappear.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { Skins } from '@datamoc/mw_games/two-d/ui';
|
|
14
|
+
*
|
|
15
|
+
* const skins = new Skins();
|
|
16
|
+
* skins.define('*', 'idle', { background: 0x101018, text: 0xe8e8f0 });
|
|
17
|
+
* skins.define('button', 'pressed', { background: 0xffe680, text: 0x101018 });
|
|
18
|
+
*
|
|
19
|
+
* console.log(skins.resolve('button', 'pressed').text); // 0x101018, the override
|
|
20
|
+
* console.log(skins.resolve('label', 'idle').background); // 0x101018, the wildcard
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class Skins {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.map = new Map();
|
|
26
|
+
}
|
|
27
|
+
/** the wildcard widget every lookup falls back to */
|
|
28
|
+
static { this.ANY = '*'; }
|
|
29
|
+
define(widget, state, skin) {
|
|
30
|
+
const states = this.map.get(widget) ?? {};
|
|
31
|
+
states[state] = { ...states[state], ...skin };
|
|
32
|
+
this.map.set(widget, states);
|
|
33
|
+
}
|
|
34
|
+
has(widget) {
|
|
35
|
+
return this.map.has(widget);
|
|
36
|
+
}
|
|
37
|
+
widgets() {
|
|
38
|
+
return [...this.map.keys()];
|
|
39
|
+
}
|
|
40
|
+
/** the skin a widget draws in a state, following the fallback chain to an empty skin */
|
|
41
|
+
resolve(widget, state = 'idle') {
|
|
42
|
+
return (this.map.get(widget)?.[state] ??
|
|
43
|
+
this.map.get(widget)?.idle ??
|
|
44
|
+
this.map.get(Skins.ANY)?.[state] ??
|
|
45
|
+
this.map.get(Skins.ANY)?.idle ??
|
|
46
|
+
{});
|
|
47
|
+
}
|
|
48
|
+
/** every state a widget has an entry for, not counting the wildcard fallback */
|
|
49
|
+
statesOf(widget) {
|
|
50
|
+
const states = this.map.get(widget);
|
|
51
|
+
return states ? STATES.filter((state) => states[state] !== undefined) : [];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Builds a registry from plain data - the shape a config file would parse into. An entry with
|
|
55
|
+
* any state key is read as one look per state; anything else is that widget's idle look.
|
|
56
|
+
*/
|
|
57
|
+
static from(data) {
|
|
58
|
+
const skins = new Skins();
|
|
59
|
+
for (const [widget, value] of Object.entries(data)) {
|
|
60
|
+
if (isStateMap(value)) {
|
|
61
|
+
for (const state of STATES) {
|
|
62
|
+
const skin = value[state];
|
|
63
|
+
if (skin)
|
|
64
|
+
skins.define(widget, state, skin);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
skins.define(widget, 'idle', value);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return skins;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function isStateMap(value) {
|
|
75
|
+
return STATES.some((state) => value[state] !== undefined);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=Skins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skins.js","sourceRoot":"","sources":["../../../src/two-d/ui/Skins.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,GAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAEvG;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,KAAK;IAAlB;QACkB,QAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IAsDtD,CAAC;IApDA,qDAAqD;aACrC,QAAG,GAAG,GAAG,AAAN,CAAO;IAE1B,MAAM,CAAC,MAAc,EAAE,KAAkB,EAAE,IAAU;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,MAAc;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,wFAAwF;IACxF,OAAO,CAAC,MAAc,EAAE,KAAK,GAAgB,MAAM;QAClD,OAAO,CACN,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI;YAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI;YAC7B,EAAE,CACF,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,QAAQ,CAAC,MAAc;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,IAAwC;QACnD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC1B,IAAI,IAAI;wBAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,SAAS,UAAU,CAAC,KAAe;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAE,KAAoB,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.ts';
|
|
3
|
+
export interface SliderOptions {
|
|
4
|
+
width: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
min?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
/** the value grid; 0 or omitted is continuous */
|
|
9
|
+
step?: number;
|
|
10
|
+
value?: number;
|
|
11
|
+
/** the draggable knob's diameter; defaults to the track height */
|
|
12
|
+
knobSize?: number;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Where `value` sits in `[min, max]`, 0 to 1, clamped. A degenerate range reads 0 rather than
|
|
17
|
+
* dividing by zero.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { sliderFraction } from '@datamoc/mw_games/two-d/ui';
|
|
22
|
+
*
|
|
23
|
+
* console.log(sliderFraction(30, 0, 60)); // 0.5
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function sliderFraction(value: number, min?: number, max?: number): number;
|
|
27
|
+
/**
|
|
28
|
+
* The value at a 0-to-1 position on the track, snapped to `step` and clamped to `[min, max]`.
|
|
29
|
+
* The snap is rounded to the step's own number of decimals, so a 0.1 step reads `0.3` rather
|
|
30
|
+
* than `0.30000000000000004`.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* import { sliderValueAt } from '@datamoc/mw_games/two-d/ui';
|
|
35
|
+
*
|
|
36
|
+
* console.log(sliderValueAt(0.5, 0, 10, 1)); // 5
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function sliderValueAt(fraction: number, min?: number, max?: number, step?: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* A draggable knob on a track, for a volume, difficulty or zoom setting.
|
|
42
|
+
*
|
|
43
|
+
* The track is drawn from the theme and a partial fill shows where the knob is; the value is
|
|
44
|
+
* always a number in `[min, max]`, and `sliderValueAt` is the arithmetic that turns a click or
|
|
45
|
+
* drag into one, exported so a game routing input itself gets the same snapping.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { Slider } from '@datamoc/mw_games/two-d/ui';
|
|
50
|
+
*
|
|
51
|
+
* const volume = new Slider({ width: 200, min: 0, max: 100, step: 5, value: 40 });
|
|
52
|
+
* volume.onChange.add((value) => console.log('volume', value));
|
|
53
|
+
* volume.setValue(75);
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare class Slider extends Container {
|
|
57
|
+
readonly onChange: Signal<number>;
|
|
58
|
+
private track;
|
|
59
|
+
private fill;
|
|
60
|
+
private knob;
|
|
61
|
+
private width_;
|
|
62
|
+
private height_;
|
|
63
|
+
private knobSize;
|
|
64
|
+
private min;
|
|
65
|
+
private max;
|
|
66
|
+
private step;
|
|
67
|
+
private value_;
|
|
68
|
+
private disabled_;
|
|
69
|
+
private dragging;
|
|
70
|
+
private readonly themeListener;
|
|
71
|
+
constructor(options: SliderOptions);
|
|
72
|
+
/** the current value, in `[min, max]` */
|
|
73
|
+
get value(): number;
|
|
74
|
+
/** where the knob sits, 0 to 1 */
|
|
75
|
+
get fraction(): number;
|
|
76
|
+
get disabled(): boolean;
|
|
77
|
+
setDisabled(disabled: boolean): void;
|
|
78
|
+
setValue(value: number): void;
|
|
79
|
+
/** moves the knob to a 0-to-1 position, the arithmetic a track click uses */
|
|
80
|
+
setFraction(fraction: number): void;
|
|
81
|
+
resize(width: number, height: number): void;
|
|
82
|
+
private get trackLength();
|
|
83
|
+
private snap;
|
|
84
|
+
private fractionAt;
|
|
85
|
+
private readonly handleDown;
|
|
86
|
+
private readonly handleMove;
|
|
87
|
+
private readonly handleUp;
|
|
88
|
+
private draw;
|
|
89
|
+
destroy(options?: Parameters<Container['destroy']>[0]): void;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=Slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/Slider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAI,EAAE,GAAG,SAAI,GAAG,MAAM,CAGtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAI,EAAE,GAAG,SAAI,EAAE,IAAI,SAAI,GAAG,MAAM,CAOlF;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACpC,QAAQ,CAAC,QAAQ,iBAAwB;IAEzC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,IAAI,CAAkB;IAE9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAEnD,YAAY,OAAO,EAAE,aAAa,EAyBjC;IAED,yCAAyC;IACzC,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,kCAAkC;IAClC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAInC;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAS5B;IAED,6EAA6E;IAC7E,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI1C;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAIzB;IAEF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGzB;IAEF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAEvB;IAEF,OAAO,CAAC,IAAI;IAyBH,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAGpE;CACD"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { Container, Graphics } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.js';
|
|
3
|
+
import { theme, themeChanged } from './theme.js';
|
|
4
|
+
/**
|
|
5
|
+
* Where `value` sits in `[min, max]`, 0 to 1, clamped. A degenerate range reads 0 rather than
|
|
6
|
+
* dividing by zero.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { sliderFraction } from '@datamoc/mw_games/two-d/ui';
|
|
11
|
+
*
|
|
12
|
+
* console.log(sliderFraction(30, 0, 60)); // 0.5
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export function sliderFraction(value, min = 0, max = 1) {
|
|
16
|
+
if (!(max > min))
|
|
17
|
+
return 0;
|
|
18
|
+
return Math.max(0, Math.min(1, (value - min) / (max - min)));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The value at a 0-to-1 position on the track, snapped to `step` and clamped to `[min, max]`.
|
|
22
|
+
* The snap is rounded to the step's own number of decimals, so a 0.1 step reads `0.3` rather
|
|
23
|
+
* than `0.30000000000000004`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { sliderValueAt } from '@datamoc/mw_games/two-d/ui';
|
|
28
|
+
*
|
|
29
|
+
* console.log(sliderValueAt(0.5, 0, 10, 1)); // 5
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function sliderValueAt(fraction, min = 0, max = 1, step = 0) {
|
|
33
|
+
const clamped = Math.max(0, Math.min(1, fraction));
|
|
34
|
+
const raw = min + clamped * (max - min);
|
|
35
|
+
if (!(step > 0))
|
|
36
|
+
return raw;
|
|
37
|
+
const decimals = (String(step).split('.')[1] ?? '').length;
|
|
38
|
+
const snapped = min + Math.round((raw - min) / step) * step;
|
|
39
|
+
return Number(Math.max(min, Math.min(max, snapped)).toFixed(decimals));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A draggable knob on a track, for a volume, difficulty or zoom setting.
|
|
43
|
+
*
|
|
44
|
+
* The track is drawn from the theme and a partial fill shows where the knob is; the value is
|
|
45
|
+
* always a number in `[min, max]`, and `sliderValueAt` is the arithmetic that turns a click or
|
|
46
|
+
* drag into one, exported so a game routing input itself gets the same snapping.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { Slider } from '@datamoc/mw_games/two-d/ui';
|
|
51
|
+
*
|
|
52
|
+
* const volume = new Slider({ width: 200, min: 0, max: 100, step: 5, value: 40 });
|
|
53
|
+
* volume.onChange.add((value) => console.log('volume', value));
|
|
54
|
+
* volume.setValue(75);
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export class Slider extends Container {
|
|
58
|
+
constructor(options) {
|
|
59
|
+
super();
|
|
60
|
+
this.onChange = new Signal();
|
|
61
|
+
this.track = new Graphics();
|
|
62
|
+
this.fill = new Graphics();
|
|
63
|
+
this.knob = new Graphics();
|
|
64
|
+
this.dragging = false;
|
|
65
|
+
this.themeListener = () => this.draw();
|
|
66
|
+
this.handleDown = (event) => {
|
|
67
|
+
if (this.disabled_)
|
|
68
|
+
return;
|
|
69
|
+
this.dragging = true;
|
|
70
|
+
this.setFraction(this.fractionAt(this.toLocal(event.global).x));
|
|
71
|
+
};
|
|
72
|
+
this.handleMove = (event) => {
|
|
73
|
+
if (!this.dragging || this.disabled_)
|
|
74
|
+
return;
|
|
75
|
+
this.setFraction(this.fractionAt(this.toLocal(event.global).x));
|
|
76
|
+
};
|
|
77
|
+
this.handleUp = () => {
|
|
78
|
+
this.dragging = false;
|
|
79
|
+
};
|
|
80
|
+
this.width_ = options.width;
|
|
81
|
+
this.height_ = options.height ?? 6;
|
|
82
|
+
this.knobSize = options.knobSize ?? Math.max(12, this.height_ * 2);
|
|
83
|
+
this.min = options.min ?? 0;
|
|
84
|
+
this.max = options.max ?? 1;
|
|
85
|
+
this.step = options.step ?? 0;
|
|
86
|
+
this.value_ = this.snap(options.value ?? this.min);
|
|
87
|
+
this.disabled_ = options.disabled ?? false;
|
|
88
|
+
this.addChild(this.track);
|
|
89
|
+
this.addChild(this.fill);
|
|
90
|
+
this.addChild(this.knob);
|
|
91
|
+
this.draw();
|
|
92
|
+
this.eventMode = 'static';
|
|
93
|
+
this.cursor = 'pointer';
|
|
94
|
+
this.on('pointerdown', this.handleDown);
|
|
95
|
+
this.on('pointermove', this.handleMove);
|
|
96
|
+
this.on('pointerup', this.handleUp);
|
|
97
|
+
this.on('pointerupoutside', this.handleUp);
|
|
98
|
+
themeChanged.add(this.themeListener);
|
|
99
|
+
}
|
|
100
|
+
/** the current value, in `[min, max]` */
|
|
101
|
+
get value() {
|
|
102
|
+
return this.value_;
|
|
103
|
+
}
|
|
104
|
+
/** where the knob sits, 0 to 1 */
|
|
105
|
+
get fraction() {
|
|
106
|
+
return sliderFraction(this.value_, this.min, this.max);
|
|
107
|
+
}
|
|
108
|
+
get disabled() {
|
|
109
|
+
return this.disabled_;
|
|
110
|
+
}
|
|
111
|
+
setDisabled(disabled) {
|
|
112
|
+
this.disabled_ = disabled;
|
|
113
|
+
this.cursor = disabled ? 'default' : 'pointer';
|
|
114
|
+
this.draw();
|
|
115
|
+
}
|
|
116
|
+
setValue(value) {
|
|
117
|
+
const snapped = this.snap(value);
|
|
118
|
+
if (snapped === this.value_) {
|
|
119
|
+
this.draw();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.value_ = snapped;
|
|
123
|
+
this.draw();
|
|
124
|
+
this.onChange.dispatch(snapped);
|
|
125
|
+
}
|
|
126
|
+
/** moves the knob to a 0-to-1 position, the arithmetic a track click uses */
|
|
127
|
+
setFraction(fraction) {
|
|
128
|
+
this.setValue(sliderValueAt(fraction, this.min, this.max, this.step));
|
|
129
|
+
}
|
|
130
|
+
resize(width, height) {
|
|
131
|
+
this.width_ = width;
|
|
132
|
+
this.height_ = height;
|
|
133
|
+
this.draw();
|
|
134
|
+
}
|
|
135
|
+
get trackLength() {
|
|
136
|
+
return Math.max(0, this.width_ - this.knobSize);
|
|
137
|
+
}
|
|
138
|
+
snap(value) {
|
|
139
|
+
return sliderValueAt(sliderFraction(value, this.min, this.max), this.min, this.max, this.step);
|
|
140
|
+
}
|
|
141
|
+
fractionAt(localX) {
|
|
142
|
+
return this.trackLength > 0 ? Math.max(0, Math.min(1, (localX - this.knobSize / 2) / this.trackLength)) : 0;
|
|
143
|
+
}
|
|
144
|
+
draw() {
|
|
145
|
+
const t = theme();
|
|
146
|
+
const color = this.disabled_ ? t.color.textDim : t.color.textHighlight;
|
|
147
|
+
const trackColor = t.color.panelFill;
|
|
148
|
+
const top = (this.knobSize - this.height_) / 2;
|
|
149
|
+
this.track
|
|
150
|
+
.clear()
|
|
151
|
+
.roundRect(0, top, this.width_, this.height_, this.height_ / 2)
|
|
152
|
+
.fill({ color: trackColor });
|
|
153
|
+
const knobX = this.knobSize / 2 + this.fraction * this.trackLength;
|
|
154
|
+
this.fill.clear();
|
|
155
|
+
if (knobX > this.knobSize / 2) {
|
|
156
|
+
this.fill
|
|
157
|
+
.roundRect(this.knobSize / 2, top, knobX - this.knobSize / 2, this.height_, this.height_ / 2)
|
|
158
|
+
.fill({ color });
|
|
159
|
+
}
|
|
160
|
+
this.knob
|
|
161
|
+
.clear()
|
|
162
|
+
.circle(knobX, this.knobSize / 2, this.knobSize / 2)
|
|
163
|
+
.fill({ color });
|
|
164
|
+
}
|
|
165
|
+
destroy(options) {
|
|
166
|
+
themeChanged.remove(this.themeListener);
|
|
167
|
+
super.destroy(options);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=Slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.js","sourceRoot":"","sources":["../../../src/two-d/ui/Slider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Steps a number by `delta`, snapped to `step` and kept in `[min, max]`. With `wrap`, passing
|
|
5
|
+
* the top starts again at the bottom and dropping below the bottom lands on the top; without it,
|
|
6
|
+
* the value clamps - a level cap or a bag size, where wrapping would be a surprise.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { spinValue } from '@datamoc/mw_games/two-d/ui';
|
|
11
|
+
*
|
|
12
|
+
* console.log(spinValue(10, 1, 0, 10, 1)); // 10, clamped
|
|
13
|
+
* console.log(spinValue(10, 1, 0, 10, 1, true)); // 0, wrapped
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function spinValue(value: number, delta: number, min: number, max: number, step?: number, wrap?: boolean): number;
|
|
17
|
+
export interface SpinnerOptions {
|
|
18
|
+
width?: number;
|
|
19
|
+
height?: number;
|
|
20
|
+
min?: number;
|
|
21
|
+
max?: number;
|
|
22
|
+
step?: number;
|
|
23
|
+
value?: number;
|
|
24
|
+
/** wrap past the ends instead of clamping */
|
|
25
|
+
wrap?: boolean;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A small up/down stepper: tap the top half to add one step, the bottom half to take one away.
|
|
30
|
+
* It draws only the arrows; the current value is a `Label` the game puts beside it, the same
|
|
31
|
+
* split `Checkbox` and `Slider` keep from their captions.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { Spinner } from '@datamoc/mw_games/two-d/ui';
|
|
36
|
+
*
|
|
37
|
+
* const level = new Spinner({ min: 1, max: 99, value: 1 });
|
|
38
|
+
* level.increment();
|
|
39
|
+
* console.log(level.value); // 2
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class Spinner extends Container {
|
|
43
|
+
readonly onChange: Signal<number>;
|
|
44
|
+
private face;
|
|
45
|
+
private width_;
|
|
46
|
+
private height_;
|
|
47
|
+
private min;
|
|
48
|
+
private max;
|
|
49
|
+
private step;
|
|
50
|
+
private value_;
|
|
51
|
+
private wrap;
|
|
52
|
+
private disabled_;
|
|
53
|
+
private readonly themeListener;
|
|
54
|
+
constructor(options?: SpinnerOptions);
|
|
55
|
+
get value(): number;
|
|
56
|
+
get disabled(): boolean;
|
|
57
|
+
setDisabled(disabled: boolean): void;
|
|
58
|
+
setValue(value: number): void;
|
|
59
|
+
increment(): void;
|
|
60
|
+
decrement(): void;
|
|
61
|
+
resize(width: number, height: number): void;
|
|
62
|
+
private commit;
|
|
63
|
+
private readonly handleTap;
|
|
64
|
+
private draw;
|
|
65
|
+
destroy(options?: Parameters<Container['destroy']>[0]): void;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=Spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/Spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,IAAI,UAAQ,GAAG,MAAM,CAUhH;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAQ,SAAQ,SAAS;IACrC,QAAQ,CAAC,QAAQ,iBAAwB;IAEzC,OAAO,CAAC,IAAI,CAAkB;IAE9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAEnD,YAAY,OAAO,GAAE,cAAmB,EAoBvC;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAInC;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED,SAAS,IAAI,IAAI,CAEhB;IAED,SAAS,IAAI,IAAI,CAEhB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI1C;IAED,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAEF,OAAO,CAAC,IAAI;IA0BH,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAGpE;CACD"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Container, Graphics } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.js';
|
|
3
|
+
import { theme, themeChanged } from './theme.js';
|
|
4
|
+
/**
|
|
5
|
+
* Steps a number by `delta`, snapped to `step` and kept in `[min, max]`. With `wrap`, passing
|
|
6
|
+
* the top starts again at the bottom and dropping below the bottom lands on the top; without it,
|
|
7
|
+
* the value clamps - a level cap or a bag size, where wrapping would be a surprise.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { spinValue } from '@datamoc/mw_games/two-d/ui';
|
|
12
|
+
*
|
|
13
|
+
* console.log(spinValue(10, 1, 0, 10, 1)); // 10, clamped
|
|
14
|
+
* console.log(spinValue(10, 1, 0, 10, 1, true)); // 0, wrapped
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function spinValue(value, delta, min, max, step = 1, wrap = false) {
|
|
18
|
+
if (!(max > min))
|
|
19
|
+
return min;
|
|
20
|
+
const grid = step > 0 ? step : 1;
|
|
21
|
+
const decimals = (String(grid).split('.')[1] ?? '').length;
|
|
22
|
+
const steps = Math.round((value - min) / grid) + Math.round(delta);
|
|
23
|
+
const count = Math.round((max - min) / grid) + 1;
|
|
24
|
+
let index = steps;
|
|
25
|
+
if (wrap)
|
|
26
|
+
index = ((index % count) + count) % count;
|
|
27
|
+
else
|
|
28
|
+
index = Math.max(0, Math.min(count - 1, index));
|
|
29
|
+
return Number((min + index * grid).toFixed(decimals));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A small up/down stepper: tap the top half to add one step, the bottom half to take one away.
|
|
33
|
+
* It draws only the arrows; the current value is a `Label` the game puts beside it, the same
|
|
34
|
+
* split `Checkbox` and `Slider` keep from their captions.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { Spinner } from '@datamoc/mw_games/two-d/ui';
|
|
39
|
+
*
|
|
40
|
+
* const level = new Spinner({ min: 1, max: 99, value: 1 });
|
|
41
|
+
* level.increment();
|
|
42
|
+
* console.log(level.value); // 2
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class Spinner extends Container {
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
super();
|
|
48
|
+
this.onChange = new Signal();
|
|
49
|
+
this.face = new Graphics();
|
|
50
|
+
this.themeListener = () => this.draw();
|
|
51
|
+
this.handleTap = (event) => {
|
|
52
|
+
if (this.disabled_)
|
|
53
|
+
return;
|
|
54
|
+
const local = this.toLocal(event.global);
|
|
55
|
+
if (local.y < this.height_ / 2)
|
|
56
|
+
this.increment();
|
|
57
|
+
else
|
|
58
|
+
this.decrement();
|
|
59
|
+
};
|
|
60
|
+
this.width_ = options.width ?? 24;
|
|
61
|
+
this.height_ = options.height ?? 32;
|
|
62
|
+
this.min = options.min ?? 0;
|
|
63
|
+
this.max = options.max ?? 9;
|
|
64
|
+
this.step = options.step ?? 1;
|
|
65
|
+
this.wrap = options.wrap ?? false;
|
|
66
|
+
this.disabled_ = options.disabled ?? false;
|
|
67
|
+
this.value_ = spinValue(options.value ?? this.min, 0, this.min, this.max, this.step, false);
|
|
68
|
+
this.addChild(this.face);
|
|
69
|
+
this.draw();
|
|
70
|
+
this.eventMode = 'static';
|
|
71
|
+
this.cursor = 'pointer';
|
|
72
|
+
this.on('pointertap', this.handleTap);
|
|
73
|
+
themeChanged.add(this.themeListener);
|
|
74
|
+
}
|
|
75
|
+
get value() {
|
|
76
|
+
return this.value_;
|
|
77
|
+
}
|
|
78
|
+
get disabled() {
|
|
79
|
+
return this.disabled_;
|
|
80
|
+
}
|
|
81
|
+
setDisabled(disabled) {
|
|
82
|
+
this.disabled_ = disabled;
|
|
83
|
+
this.cursor = disabled ? 'default' : 'pointer';
|
|
84
|
+
this.draw();
|
|
85
|
+
}
|
|
86
|
+
setValue(value) {
|
|
87
|
+
this.commit(spinValue(value, 0, this.min, this.max, this.step, this.wrap));
|
|
88
|
+
}
|
|
89
|
+
increment() {
|
|
90
|
+
this.commit(spinValue(this.value_, 1, this.min, this.max, this.step, this.wrap));
|
|
91
|
+
}
|
|
92
|
+
decrement() {
|
|
93
|
+
this.commit(spinValue(this.value_, -1, this.min, this.max, this.step, this.wrap));
|
|
94
|
+
}
|
|
95
|
+
resize(width, height) {
|
|
96
|
+
this.width_ = width;
|
|
97
|
+
this.height_ = height;
|
|
98
|
+
this.draw();
|
|
99
|
+
}
|
|
100
|
+
commit(next) {
|
|
101
|
+
if (next === this.value_) {
|
|
102
|
+
this.draw();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.value_ = next;
|
|
106
|
+
this.draw();
|
|
107
|
+
this.onChange.dispatch(next);
|
|
108
|
+
}
|
|
109
|
+
draw() {
|
|
110
|
+
const t = theme();
|
|
111
|
+
const color = this.disabled_ ? t.color.textDim : t.color.textHighlight;
|
|
112
|
+
this.face
|
|
113
|
+
.clear()
|
|
114
|
+
.roundRect(0, 0, this.width_, this.height_, 4)
|
|
115
|
+
.fill({ color: t.color.panelFill })
|
|
116
|
+
.stroke({ color: t.color.panelBorder, width: 1 });
|
|
117
|
+
const cx = this.width_ / 2;
|
|
118
|
+
const arrow = Math.min(this.width_ / 4, this.height_ / 5);
|
|
119
|
+
this.face
|
|
120
|
+
.moveTo(cx - arrow, arrow * 1.6)
|
|
121
|
+
.lineTo(cx, arrow * 0.6)
|
|
122
|
+
.lineTo(cx + arrow, arrow * 1.6)
|
|
123
|
+
.closePath()
|
|
124
|
+
.fill({ color });
|
|
125
|
+
this.face
|
|
126
|
+
.moveTo(cx - arrow, this.height_ - arrow * 1.6)
|
|
127
|
+
.lineTo(cx, this.height_ - arrow * 0.6)
|
|
128
|
+
.lineTo(cx + arrow, this.height_ - arrow * 1.6)
|
|
129
|
+
.closePath()
|
|
130
|
+
.fill({ color });
|
|
131
|
+
}
|
|
132
|
+
destroy(options) {
|
|
133
|
+
themeChanged.remove(this.themeListener);
|
|
134
|
+
super.destroy(options);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../../src/two-d/ui/Spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK;IACvG,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,IAAI;QAAE,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;;QAC/C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAcD;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,OAAQ,SAAQ,SAAS;IAgBrC,YAAY,OAAO,GAAmB,EAAE;QACvC,KAAK,EAAE,CAAC;QAhBA,aAAQ,GAAG,IAAI,MAAM,EAAU,CAAC;QAEjC,SAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAWb,kBAAa,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAkElC,cAAS,GAAG,CAAC,KAA2C,EAAQ,EAAE;YAClF,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC;gBAAE,IAAI,CAAC,SAAS,EAAE,CAAC;;gBAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,CAAC,CAAC;QAlED,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE5F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEtC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,QAAiB;QAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,QAAQ,CAAC,KAAa;QACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,SAAS;QACR,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,SAAS;QACR,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,MAAc;QACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,IAAY;QAC1B,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IASO,IAAI;QACX,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;QAEvE,IAAI,CAAC,IAAI;aACP,KAAK,EAAE;aACP,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;aAC7C,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;aAClC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI;aACP,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC;aAC/B,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC;aACvB,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC;aAC/B,SAAS,EAAE;aACX,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI;aACP,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;aAC9C,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;aACtC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;aAC9C,SAAS,EAAE;aACX,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnB,CAAC;IAEQ,OAAO,CAAC,OAA6C;QAC7D,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;CACD"}
|