@datamoc/mw_games 0.26.1 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +77 -0
- package/api-surface.json +474 -0
- package/dist/ai/Suggest.d.ts +54 -0
- package/dist/ai/Suggest.d.ts.map +1 -0
- package/dist/ai/Suggest.js +48 -0
- package/dist/ai/Suggest.js.map +1 -0
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/core/Random.d.ts +32 -5
- package/dist/core/Random.d.ts.map +1 -1
- package/dist/core/Random.js.map +1 -1
- package/dist/core/Replay.d.ts +28 -4
- package/dist/core/Replay.d.ts.map +1 -1
- package/dist/core/Replay.js +38 -9
- package/dist/core/Replay.js.map +1 -1
- package/dist/core/ReplayFile.d.ts +197 -0
- package/dist/core/ReplayFile.d.ts.map +1 -0
- package/dist/core/ReplayFile.js +257 -0
- package/dist/core/ReplayFile.js.map +1 -0
- package/dist/core/index.d.ts +4 -2
- 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/mw_games.global.js +113 -113
- package/dist/simulation/Training.d.ts +77 -0
- package/dist/simulation/Training.d.ts.map +1 -1
- package/dist/simulation/Training.js +87 -0
- package/dist/simulation/Training.js.map +1 -1
- package/dist/simulation/index.d.ts +2 -2
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +1 -1
- package/dist/simulation/index.js.map +1 -1
- package/dist/two-d/render/Beam.d.ts +93 -0
- package/dist/two-d/render/Beam.d.ts.map +1 -0
- package/dist/two-d/render/Beam.js +154 -0
- package/dist/two-d/render/Beam.js.map +1 -0
- package/dist/two-d/render/Flights.d.ts +79 -0
- package/dist/two-d/render/Flights.d.ts.map +1 -0
- package/dist/two-d/render/Flights.js +120 -0
- package/dist/two-d/render/Flights.js.map +1 -0
- package/dist/two-d/render/Particles.d.ts +48 -0
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +59 -1
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/index.d.ts +5 -1
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +2 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/MessageLog.d.ts +28 -0
- package/dist/two-d/ui/MessageLog.d.ts.map +1 -1
- package/dist/two-d/ui/MessageLog.js +23 -6
- package/dist/two-d/ui/MessageLog.js.map +1 -1
- package/dist/two-d/ui/TextPrompt.d.ts +115 -0
- package/dist/two-d/ui/TextPrompt.d.ts.map +1 -0
- package/dist/two-d/ui/TextPrompt.js +227 -0
- package/dist/two-d/ui/TextPrompt.js.map +1 -0
- package/dist/two-d/ui/index.d.ts +4 -2
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +2 -1
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type Action } from '../../core/Input.ts';
|
|
2
|
+
import { Window } from './Window.ts';
|
|
3
|
+
import { type ScreenReader } from './a11y.ts';
|
|
4
|
+
export interface TextPromptOptions {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
/** the window title; also announced by `Window` itself */
|
|
8
|
+
title?: string;
|
|
9
|
+
/** the one-line question above the field, announced politely on open */
|
|
10
|
+
message?: string;
|
|
11
|
+
/** the field's starting text; the caret starts after it */
|
|
12
|
+
initialValue?: string;
|
|
13
|
+
/** the most characters the field will hold; unlimited when omitted */
|
|
14
|
+
maxLength?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Decides whether the current value may be confirmed: return an error message to
|
|
17
|
+
* keep the prompt open, or null (or '') when the value is fine. Runs only on
|
|
18
|
+
* `confirm`, so typing never nags; the error clears on the next edit.
|
|
19
|
+
*/
|
|
20
|
+
validate?: (value: string) => string | null;
|
|
21
|
+
/** called with the value, then the prompt closes */
|
|
22
|
+
onConfirm: (value: string) => void;
|
|
23
|
+
/** called on `cancel`, then the prompt closes; omit to just close */
|
|
24
|
+
onCancel?: () => void;
|
|
25
|
+
/** dim the world behind; true for a modal window, which this is */
|
|
26
|
+
dims?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Whether a click under the prompt is swallowed rather than reaching the game
|
|
29
|
+
* behind it. On by default: a name not yet given is not something a stray click
|
|
30
|
+
* on the world should be able to act past.
|
|
31
|
+
*/
|
|
32
|
+
blocker?: boolean;
|
|
33
|
+
/** where the stack puts the prompt */
|
|
34
|
+
anchor?: 'center' | 'bottom' | 'top';
|
|
35
|
+
/**
|
|
36
|
+
* Announce the message on open and a validation error on `confirm` through an
|
|
37
|
+
* `a11y.ScreenReader`. Default true; the calls are no-ops where there is no DOM.
|
|
38
|
+
*/
|
|
39
|
+
announce?: boolean;
|
|
40
|
+
/** the reader announcements go to; the shared one by default, a fake in tests */
|
|
41
|
+
announcer?: Pick<ScreenReader, 'announce'>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A modal single-line text field: a name entry, a save-slot label, a seed.
|
|
45
|
+
*
|
|
46
|
+
* Typing arrives through `core.Input`'s `onText`, which is the signal a free text field
|
|
47
|
+
* listens to, so this plays no part in key bindings for characters: whatever the
|
|
48
|
+
* platform turns a key press into lands in the field. Editing and movement arrive as
|
|
49
|
+
* actions instead, which a game binds the way it binds everything else: `left`/`right`
|
|
50
|
+
* move the caret, `backspace`/`delete` edit, `confirm` accepts subject to `validate`,
|
|
51
|
+
* `cancel` gives up. The prompt is modal and swallows each of those while open, so
|
|
52
|
+
* the game underneath never walks away mid-name.
|
|
53
|
+
*
|
|
54
|
+
* `onText` wakes the most recently added listener first, so when two prompts overlap
|
|
55
|
+
* the topmost one gets the keystrokes - the same order the window stack shows them in.
|
|
56
|
+
*
|
|
57
|
+
* An in-progress IME composition previews below the field and only becomes value on
|
|
58
|
+
* commit, so CJK, dead keys and emoji pickers type through the same path the DOM gives
|
|
59
|
+
* every other input rather than through a game-specific workaround.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* import { TextPrompt } from '@datamoc/mw_games/two-d/ui';
|
|
64
|
+
*
|
|
65
|
+
* const prompt = new TextPrompt({
|
|
66
|
+
* width: 320,
|
|
67
|
+
* height: 140,
|
|
68
|
+
* title: 'New hero',
|
|
69
|
+
* message: 'Name your hero (Enter keeps it)',
|
|
70
|
+
* maxLength: 12,
|
|
71
|
+
* validate: (value) => (value.trim() === '' ? 'Give them a name first.' : null),
|
|
72
|
+
* onConfirm: (value) => console.log('named', value),
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare class TextPrompt extends Window {
|
|
77
|
+
private readonly model;
|
|
78
|
+
private readonly validate?;
|
|
79
|
+
private readonly onConfirm;
|
|
80
|
+
private readonly onCancel?;
|
|
81
|
+
private readonly announce;
|
|
82
|
+
private readonly announcer;
|
|
83
|
+
private preview;
|
|
84
|
+
private promptError;
|
|
85
|
+
private messageLabel;
|
|
86
|
+
private valueLabel;
|
|
87
|
+
private previewLabel;
|
|
88
|
+
private errorLabel;
|
|
89
|
+
private caretBar;
|
|
90
|
+
private readonly measurer;
|
|
91
|
+
private readonly lineHeight;
|
|
92
|
+
private readonly valueY;
|
|
93
|
+
private canMeasureCaret;
|
|
94
|
+
private blinkOn;
|
|
95
|
+
private blinkElapsed;
|
|
96
|
+
private readonly promptThemeListener;
|
|
97
|
+
private readonly textListener;
|
|
98
|
+
private readonly compositionListener;
|
|
99
|
+
constructor(options: TextPromptOptions);
|
|
100
|
+
/** the field's current text */
|
|
101
|
+
get value(): string;
|
|
102
|
+
/** the caret's index into `value` */
|
|
103
|
+
get caretIndex(): number;
|
|
104
|
+
/** the last validation error, or null when the value currently passes */
|
|
105
|
+
get error(): string | null;
|
|
106
|
+
handleAction(action: Action): boolean;
|
|
107
|
+
update(dt: number): void;
|
|
108
|
+
destroy(options?: Parameters<Window['destroy']>[0]): void;
|
|
109
|
+
/** runs an edit, dropping a stale validation error only when the text changed */
|
|
110
|
+
private edit;
|
|
111
|
+
private confirm;
|
|
112
|
+
private restylePrompt;
|
|
113
|
+
private render;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=TextPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextPrompt.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/TextPrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import { onComposition, onText } from '../../core/Input.js';
|
|
3
|
+
import { TextModel } from './TextModel.js';
|
|
4
|
+
import { Window } from './Window.js';
|
|
5
|
+
import { Label } from './Label.js';
|
|
6
|
+
import { theme, themeChanged } from './theme.js';
|
|
7
|
+
import { screenReader } from './a11y.js';
|
|
8
|
+
/** seconds per caret blink half-cycle */
|
|
9
|
+
const BLINK_PERIOD = 0.5;
|
|
10
|
+
/**
|
|
11
|
+
* A modal single-line text field: a name entry, a save-slot label, a seed.
|
|
12
|
+
*
|
|
13
|
+
* Typing arrives through `core.Input`'s `onText`, which is the signal a free text field
|
|
14
|
+
* listens to, so this plays no part in key bindings for characters: whatever the
|
|
15
|
+
* platform turns a key press into lands in the field. Editing and movement arrive as
|
|
16
|
+
* actions instead, which a game binds the way it binds everything else: `left`/`right`
|
|
17
|
+
* move the caret, `backspace`/`delete` edit, `confirm` accepts subject to `validate`,
|
|
18
|
+
* `cancel` gives up. The prompt is modal and swallows each of those while open, so
|
|
19
|
+
* the game underneath never walks away mid-name.
|
|
20
|
+
*
|
|
21
|
+
* `onText` wakes the most recently added listener first, so when two prompts overlap
|
|
22
|
+
* the topmost one gets the keystrokes - the same order the window stack shows them in.
|
|
23
|
+
*
|
|
24
|
+
* An in-progress IME composition previews below the field and only becomes value on
|
|
25
|
+
* commit, so CJK, dead keys and emoji pickers type through the same path the DOM gives
|
|
26
|
+
* every other input rather than through a game-specific workaround.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { TextPrompt } from '@datamoc/mw_games/two-d/ui';
|
|
31
|
+
*
|
|
32
|
+
* const prompt = new TextPrompt({
|
|
33
|
+
* width: 320,
|
|
34
|
+
* height: 140,
|
|
35
|
+
* title: 'New hero',
|
|
36
|
+
* message: 'Name your hero (Enter keeps it)',
|
|
37
|
+
* maxLength: 12,
|
|
38
|
+
* validate: (value) => (value.trim() === '' ? 'Give them a name first.' : null),
|
|
39
|
+
* onConfirm: (value) => console.log('named', value),
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export class TextPrompt extends Window {
|
|
44
|
+
constructor(options) {
|
|
45
|
+
super({
|
|
46
|
+
width: options.width,
|
|
47
|
+
height: options.height,
|
|
48
|
+
title: options.title,
|
|
49
|
+
modal: true,
|
|
50
|
+
closable: false,
|
|
51
|
+
dims: options.dims,
|
|
52
|
+
blocker: options.blocker ?? true,
|
|
53
|
+
anchor: options.anchor ?? 'center',
|
|
54
|
+
});
|
|
55
|
+
this.preview = '';
|
|
56
|
+
this.promptError = null;
|
|
57
|
+
this.messageLabel = null;
|
|
58
|
+
this.caretBar = new Graphics();
|
|
59
|
+
this.measurer = new Label();
|
|
60
|
+
this.canMeasureCaret = typeof document !== 'undefined';
|
|
61
|
+
this.blinkOn = true;
|
|
62
|
+
this.blinkElapsed = 0;
|
|
63
|
+
this.promptThemeListener = () => this.restylePrompt();
|
|
64
|
+
this.textListener = (text) => {
|
|
65
|
+
if (this.closed)
|
|
66
|
+
return false;
|
|
67
|
+
this.edit(() => this.model.insert(text));
|
|
68
|
+
return true;
|
|
69
|
+
};
|
|
70
|
+
this.compositionListener = (input) => {
|
|
71
|
+
if (this.closed)
|
|
72
|
+
return false;
|
|
73
|
+
if (input.phase === 'end') {
|
|
74
|
+
this.edit(() => {
|
|
75
|
+
this.preview = '';
|
|
76
|
+
this.model.insert(input.text);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.preview = input.phase === 'start' ? '' : input.text;
|
|
81
|
+
this.render();
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
85
|
+
this.model = new TextModel({ value: options.initialValue ?? '', maxLength: options.maxLength });
|
|
86
|
+
this.validate = options.validate;
|
|
87
|
+
this.onConfirm = options.onConfirm;
|
|
88
|
+
this.onCancel = options.onCancel;
|
|
89
|
+
this.announce = options.announce ?? true;
|
|
90
|
+
this.announcer = options.announcer ?? screenReader;
|
|
91
|
+
const t = theme();
|
|
92
|
+
this.lineHeight = t.font.size * t.font.lineHeight;
|
|
93
|
+
const gap = t.spacing;
|
|
94
|
+
if (options.message !== undefined) {
|
|
95
|
+
this.messageLabel = new Label({ text: options.message });
|
|
96
|
+
this.content.addChild(this.messageLabel);
|
|
97
|
+
}
|
|
98
|
+
this.valueY = this.messageLabel ? this.lineHeight + gap : 0;
|
|
99
|
+
this.valueLabel = new Label();
|
|
100
|
+
this.valueLabel.y = this.valueY;
|
|
101
|
+
this.content.addChild(this.valueLabel);
|
|
102
|
+
this.previewLabel = new Label({ color: t.color.textDim });
|
|
103
|
+
this.previewLabel.y = this.valueY + this.lineHeight + gap;
|
|
104
|
+
this.content.addChild(this.previewLabel);
|
|
105
|
+
this.errorLabel = new Label({ color: t.color.textHighlight });
|
|
106
|
+
this.errorLabel.y = this.previewLabel.y + this.lineHeight + gap;
|
|
107
|
+
this.content.addChild(this.errorLabel);
|
|
108
|
+
this.content.addChild(this.caretBar);
|
|
109
|
+
onText.add(this.textListener);
|
|
110
|
+
onComposition.add(this.compositionListener);
|
|
111
|
+
themeChanged.add(this.promptThemeListener);
|
|
112
|
+
this.render();
|
|
113
|
+
if (this.announce && options.message !== undefined)
|
|
114
|
+
this.announcer.announce(options.message);
|
|
115
|
+
}
|
|
116
|
+
/** the field's current text */
|
|
117
|
+
get value() {
|
|
118
|
+
return this.model.value;
|
|
119
|
+
}
|
|
120
|
+
/** the caret's index into `value` */
|
|
121
|
+
get caretIndex() {
|
|
122
|
+
return this.model.caret;
|
|
123
|
+
}
|
|
124
|
+
/** the last validation error, or null when the value currently passes */
|
|
125
|
+
get error() {
|
|
126
|
+
return this.promptError;
|
|
127
|
+
}
|
|
128
|
+
handleAction(action) {
|
|
129
|
+
if (this.delegate)
|
|
130
|
+
return super.handleAction(action);
|
|
131
|
+
if (this.closed)
|
|
132
|
+
return false;
|
|
133
|
+
switch (action) {
|
|
134
|
+
case 'left':
|
|
135
|
+
this.model.moveCaret(-1);
|
|
136
|
+
this.render();
|
|
137
|
+
return true;
|
|
138
|
+
case 'right':
|
|
139
|
+
this.model.moveCaret(1);
|
|
140
|
+
this.render();
|
|
141
|
+
return true;
|
|
142
|
+
case 'backspace':
|
|
143
|
+
this.edit(() => this.model.backspace());
|
|
144
|
+
return true;
|
|
145
|
+
case 'delete':
|
|
146
|
+
this.edit(() => this.model.deleteForward());
|
|
147
|
+
return true;
|
|
148
|
+
case 'confirm':
|
|
149
|
+
this.confirm();
|
|
150
|
+
return true;
|
|
151
|
+
case 'cancel':
|
|
152
|
+
this.onCancel?.();
|
|
153
|
+
this.close();
|
|
154
|
+
return true;
|
|
155
|
+
default:
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
update(dt) {
|
|
160
|
+
this.blinkElapsed += dt;
|
|
161
|
+
if (this.blinkElapsed < BLINK_PERIOD)
|
|
162
|
+
return;
|
|
163
|
+
this.blinkElapsed = 0;
|
|
164
|
+
this.blinkOn = !this.blinkOn;
|
|
165
|
+
this.caretBar.visible = this.blinkOn && this.canMeasureCaret;
|
|
166
|
+
}
|
|
167
|
+
destroy(options) {
|
|
168
|
+
onText.remove(this.textListener);
|
|
169
|
+
onComposition.remove(this.compositionListener);
|
|
170
|
+
themeChanged.remove(this.promptThemeListener);
|
|
171
|
+
this.measurer.destroy();
|
|
172
|
+
super.destroy(options);
|
|
173
|
+
}
|
|
174
|
+
/** runs an edit, dropping a stale validation error only when the text changed */
|
|
175
|
+
edit(run) {
|
|
176
|
+
const before = this.model.value;
|
|
177
|
+
run();
|
|
178
|
+
if (this.model.value !== before)
|
|
179
|
+
this.promptError = null;
|
|
180
|
+
this.render();
|
|
181
|
+
}
|
|
182
|
+
confirm() {
|
|
183
|
+
const problem = this.validate?.(this.model.value) ?? null;
|
|
184
|
+
if (problem) {
|
|
185
|
+
this.promptError = problem;
|
|
186
|
+
this.render();
|
|
187
|
+
if (this.announce)
|
|
188
|
+
this.announcer.announce(problem, { assertive: true });
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
this.onConfirm(this.model.value);
|
|
192
|
+
this.close();
|
|
193
|
+
}
|
|
194
|
+
restylePrompt() {
|
|
195
|
+
const t = theme();
|
|
196
|
+
this.previewLabel.setColor(t.color.textDim);
|
|
197
|
+
this.errorLabel.setColor(t.color.textHighlight);
|
|
198
|
+
this.render();
|
|
199
|
+
}
|
|
200
|
+
render() {
|
|
201
|
+
this.valueLabel.setText(this.model.value);
|
|
202
|
+
//the caret sits after the text before it, measured through a label that is never
|
|
203
|
+
//added to the scene: reading any width needs a canvas, which `node --test` has
|
|
204
|
+
//not got, so where there is no document the position is unknowable and the caret
|
|
205
|
+
//stays hidden rather than guessing
|
|
206
|
+
this.measurer.setText(this.model.value.slice(0, this.model.caret));
|
|
207
|
+
let caretX = 0;
|
|
208
|
+
if (this.canMeasureCaret) {
|
|
209
|
+
try {
|
|
210
|
+
caretX = this.measurer.width;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
this.canMeasureCaret = false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
this.caretBar
|
|
217
|
+
.clear()
|
|
218
|
+
.rect(this.valueLabel.x + caretX, this.valueY, 2, this.lineHeight)
|
|
219
|
+
.fill({ color: theme().color.text });
|
|
220
|
+
this.caretBar.visible = this.blinkOn && this.canMeasureCaret;
|
|
221
|
+
this.previewLabel.setText(this.preview);
|
|
222
|
+
this.previewLabel.visible = this.preview.length > 0;
|
|
223
|
+
this.errorLabel.setText(this.promptError ?? '');
|
|
224
|
+
this.errorLabel.visible = this.promptError !== null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=TextPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextPrompt.js","sourceRoot":"","sources":["../../../src/two-d/ui/TextPrompt.ts"],"names":[],"mappings":"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"}
|
package/dist/two-d/ui/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ export { theme, setTheme, defaultTheme, highContrastTheme, themeChanged } from '
|
|
|
2
2
|
export type { Theme } from './theme.ts';
|
|
3
3
|
export { Label } from './Label.ts';
|
|
4
4
|
export type { LabelOptions } from './Label.ts';
|
|
5
|
-
export { MessageLog, linesToDrop } from './MessageLog.ts';
|
|
6
|
-
export type { MessageLevel, MessageLogOptions } from './MessageLog.ts';
|
|
5
|
+
export { MessageLog, linesToDrop, takeLastEntries } from './MessageLog.ts';
|
|
6
|
+
export type { MessageLogEntry, MessageLevel, MessageLogOptions } from './MessageLog.ts';
|
|
7
7
|
export { fitWindowZoom, sharpenText } from './TextSharpness.ts';
|
|
8
8
|
export { RichLabel } from './RichLabel.ts';
|
|
9
9
|
export type { RichLabelOptions } from './RichLabel.ts';
|
|
@@ -30,6 +30,8 @@ export { TabbedList } from './TabbedList.ts';
|
|
|
30
30
|
export type { ListTab, TabbedListOptions } from './TabbedList.ts';
|
|
31
31
|
export { MessageBox } from './MessageBox.ts';
|
|
32
32
|
export type { MessageBoxOptions, MessagePage, Choice } from './MessageBox.ts';
|
|
33
|
+
export { TextPrompt } from './TextPrompt.ts';
|
|
34
|
+
export type { TextPromptOptions } from './TextPrompt.ts';
|
|
33
35
|
export { VerticalLabel, layoutVertical } from './VerticalLabel.ts';
|
|
34
36
|
export type { VerticalLabelOptions, VerticalLayoutOptions, GlyphLayout } from './VerticalLabel.ts';
|
|
35
37
|
export { Slider, sliderFraction, sliderValueAt } from './Slider.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5F,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/index.ts"],"names":[],"mappings":"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"}
|
package/dist/two-d/ui/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { theme, setTheme, defaultTheme, highContrastTheme, themeChanged } from './theme.js';
|
|
2
2
|
export { Label } from './Label.js';
|
|
3
|
-
export { MessageLog, linesToDrop } from './MessageLog.js';
|
|
3
|
+
export { MessageLog, linesToDrop, takeLastEntries } from './MessageLog.js';
|
|
4
4
|
export { fitWindowZoom, sharpenText } from './TextSharpness.js';
|
|
5
5
|
export { RichLabel } from './RichLabel.js';
|
|
6
6
|
export { MarkupText } from './MarkupText.js';
|
|
@@ -15,6 +15,7 @@ export { ListView } from './ListView.js';
|
|
|
15
15
|
export { IconGrid } from './IconGrid.js';
|
|
16
16
|
export { TabbedList } from './TabbedList.js';
|
|
17
17
|
export { MessageBox } from './MessageBox.js';
|
|
18
|
+
export { TextPrompt } from './TextPrompt.js';
|
|
18
19
|
export { VerticalLabel, layoutVertical } from './VerticalLabel.js';
|
|
19
20
|
export { Slider, sliderFraction, sliderValueAt } from './Slider.js';
|
|
20
21
|
export { Checkbox } from './Checkbox.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/ui/index.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
* this from `package.json` automatically, chosen because this project's own build already
|
|
10
10
|
* has no step before `tsc`/`vite` that this would need to run ahead of.
|
|
11
11
|
*/
|
|
12
|
-
export declare const version = "0.
|
|
12
|
+
export declare const version = "0.27.0";
|
|
13
13
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
* this from `package.json` automatically, chosen because this project's own build already
|
|
10
10
|
* has no step before `tsc`/`vite` that this would need to run ahead of.
|
|
11
11
|
*/
|
|
12
|
-
export const version = '0.
|
|
12
|
+
export const version = '0.27.0';
|
|
13
13
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datamoc/mw_games",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"description": "A local-file game framework: renderer-free game logic, drawn through PixiJS in 2D or Babylon.js in 3D, with mobile and desktop packaging.",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"repository": {
|
package/sbom.cdx.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CycloneDX",
|
|
3
3
|
"specVersion": "1.6",
|
|
4
|
-
"serialNumber": "urn:uuid:
|
|
4
|
+
"serialNumber": "urn:uuid:bfe27619-3cab-5d79-a4f8-8f79dbd73bfb",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
7
|
"tools": {
|
|
@@ -10,16 +10,16 @@
|
|
|
10
10
|
"type": "application",
|
|
11
11
|
"group": "datamoc",
|
|
12
12
|
"name": "tools/sbom.mjs",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.27.0"
|
|
14
14
|
}
|
|
15
15
|
]
|
|
16
16
|
},
|
|
17
17
|
"component": {
|
|
18
18
|
"type": "library",
|
|
19
|
-
"bom-ref": "pkg:npm/%40datamoc/mw_games@0.
|
|
19
|
+
"bom-ref": "pkg:npm/%40datamoc/mw_games@0.27.0",
|
|
20
20
|
"name": "@datamoc/mw_games",
|
|
21
|
-
"version": "0.
|
|
22
|
-
"purl": "pkg:npm/%40datamoc/mw_games@0.
|
|
21
|
+
"version": "0.27.0",
|
|
22
|
+
"purl": "pkg:npm/%40datamoc/mw_games@0.27.0",
|
|
23
23
|
"description": "A local-file game framework: renderer-free game logic, drawn through PixiJS in 2D or Babylon.js in 3D, with mobile and desktop packaging.",
|
|
24
24
|
"licenses": [
|
|
25
25
|
{
|
|
@@ -4601,7 +4601,7 @@
|
|
|
4601
4601
|
]
|
|
4602
4602
|
},
|
|
4603
4603
|
{
|
|
4604
|
-
"ref": "pkg:npm/%40datamoc/mw_games@0.
|
|
4604
|
+
"ref": "pkg:npm/%40datamoc/mw_games@0.27.0",
|
|
4605
4605
|
"dependsOn": [
|
|
4606
4606
|
"pkg:npm/%40babylonjs/core@9.29.0",
|
|
4607
4607
|
"pkg:npm/%40babylonjs/loaders@9.29.0",
|