@wasm-gaming/engine-specs 0.3.2 → 0.4.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/README.md CHANGED
@@ -135,6 +135,25 @@ Adoption is optional: the contract is structural, so an engine with its own emit
135
135
  its own state satisfies `EngineSDK` without extending anything. `EventEmitter` and
136
136
  `hydratePlay` are exported for engines that want the pieces rather than the whole.
137
137
 
138
+ ## Menus: one usability scheme
139
+
140
+ Engines also ship their own screens (start / load game, pause, options) as an **engine app**, and
141
+ all of them — and the launcher — follow one scheme, described in [UX.md](UX.md). The package carries
142
+ its runtime, so no engine needs another dependency:
143
+
144
+ ```js
145
+ import { createInput, nextFocus, uiTokensCss } from '@wasm-gaming/engine-specs';
146
+
147
+ const input = createInput(); // keyboard + gamepads → actions, with repeat
148
+ input.on((action) => { // 'up' | 'down' | … | 'accept' | 'back' | 'menu' | 'more'
149
+ if (action === 'down') focus(nextFocus(current, buttons, 'down'));
150
+ });
151
+ input.suspend(); // the game has the controls now
152
+ ```
153
+
154
+ An app implements `EngineApp` — `mount(target, host)` — and receives `game`, `storage`, `assets`,
155
+ the shared `input` and `exit()` from the host.
156
+
138
157
  ## Closing the types
139
158
 
140
159
  One type parameter carries all four payloads, so there is no order to get wrong:
package/demo/app.html CHANGED
@@ -4,7 +4,9 @@
4
4
  It drives the engine only through the contract, and every panel is painted from
5
5
  something the contract handed back:
6
6
 
7
- - the header is the class's static identity, read before any engine exists;
7
+ - the toolbar is the reference's own, so the two pages are one site;
8
+ - the footer under it all is the class's static identity, read before any engine
9
+ exists — and the document title is the same reading;
8
10
  - the pickers get their file filter from each asset descriptor's `allowedTypes`;
9
11
  - the tables are `config()`, `options()`, `assets()` and `storage()` rendered as
10
12
  they arrive — one component, and not one key name written on this side.
@@ -13,22 +15,16 @@
13
15
  there is no mount bookkeeping here.
14
16
  -->
15
17
 
16
- <EngineHeader :name="name" :id="id" :version="version" :description="description" />
18
+ <SiteToolbar :version="packageVersion" />
17
19
 
18
20
  <div class="layout">
19
21
  <aside>
20
- <section>
22
+ <section class="panel">
21
23
  <h2>assets</h2>
22
24
  <AssetPicker :assets="assets" @select="onSelect" @remove="onRemove" />
23
25
  </section>
24
26
 
25
- <section>
26
- <h2>lifecycle</h2>
27
- <LifecycleBar :running="running" @start="onStart" @restart="onRestart"
28
- @pause="onPause" @resume="onResume" @destroy="onDestroy" />
29
- </section>
30
-
31
- <section>
27
+ <section class="panel">
32
28
  <h2>calls</h2>
33
29
  <CallLog :entries="calls" />
34
30
  </section>
@@ -37,11 +33,22 @@
37
33
  <div>
38
34
  <!-- The engine is handed this element and appends its own canvas to it. -->
39
35
  <div id="stage"></div>
36
+
37
+ <!-- Under the picture and as wide as it: the verbs act on what is above them. -->
38
+ <section class="panel">
39
+ <h2>lifecycle</h2>
40
+ <LifecycleBar :running="running" @start="onStart" @restart="onRestart"
41
+ @pause="onPause" @resume="onResume" @destroy="onDestroy" />
42
+ </section>
43
+
40
44
  <PropertyTable :tables="tables" />
41
45
  </div>
42
46
  </div>
43
47
 
48
+ <EngineHeader :version="version" :description="description" />
49
+
44
50
  <script :setup="{}">
51
+ const SiteToolbar = await import('./components/site-toolbar.html');
45
52
  const EngineHeader = await import('./components/engine-header.html');
46
53
  const AssetPicker = await import('./components/asset-picker.html');
47
54
  const PropertyTable = await import('./components/property-table.html');
@@ -50,9 +57,19 @@
50
57
 
51
58
  const { DemoEngineSDK } = await import('./demo.sdk.js');
52
59
 
60
+ // The *package* version, for the toolbar — not the engine's. `make site` writes this
61
+ // file next to the demo from package.json, which is the same source TypeDoc reads, so
62
+ // the two bars cannot disagree. A bare `demo/` checkout has no such file, and the bar
63
+ // then shows the package name alone.
64
+ let packageVersion = '';
65
+ try {
66
+ ({ version: packageVersion } = await import('./package-version.js'));
67
+ } catch {
68
+ packageVersion = '';
69
+ }
70
+
53
71
  // Identity, off the class — no engine constructed to read it.
54
72
  const name = DemoEngineSDK.name;
55
- const id = DemoEngineSDK.id;
56
73
  const version = DemoEngineSDK.version;
57
74
  const description = DemoEngineSDK.description;
58
75
  document.title = `${name} — engine-specs demo`;
@@ -215,7 +232,8 @@
215
232
  }
216
233
  }
217
234
 
218
- aside section {
235
+ /* A class, not `aside section`: the lifecycle panel lives in the other column now. */
236
+ .panel {
219
237
  background: var(--panel, #fff);
220
238
  border: 1px solid var(--border, #e2e8f0);
221
239
  border-radius: 4px;
@@ -223,7 +241,7 @@
223
241
  margin-bottom: 1rem;
224
242
  }
225
243
 
226
- aside h2 {
244
+ .panel h2 {
227
245
  margin: 0 0 0.75rem;
228
246
  font-size: 0.78rem;
229
247
  font-family: var(--mono, monospace);
@@ -13,9 +13,11 @@
13
13
  @dragleave="dragging = null"
14
14
  @drop.prevent="onDrop($event, asset)"
15
15
  :class.active="dragging === asset.key">
16
- <strong>{{ asset.key }}</strong>
17
- <p class="hint">{{ asset.description }}</p>
18
- <p :class.file-selected="asset.fileName">{{ asset.fileName || asset.accepts }}</p>
16
+ <div class="meta">
17
+ <strong>{{ asset.key }}</strong>
18
+ <p class="hint">{{ asset.description }}</p>
19
+ <p :class.file-selected="asset.fileName">{{ asset.fileName || asset.accepts }}</p>
20
+ </div>
19
21
  <div class="picker-actions">
20
22
  <label class="picker">
21
23
  {{ asset.fileName ? 'Change' : 'Pick file' }}
@@ -24,6 +26,7 @@
24
26
  <button type="button" :if="asset.fileName" class="remove-btn" @click.stop="$emit('remove', asset)">Remove</button>
25
27
  </div>
26
28
  </section>
29
+
27
30
  </div>
28
31
 
29
32
  <script :setup="{
@@ -58,14 +61,26 @@
58
61
  gap: 0.6rem;
59
62
  }
60
63
 
64
+ /*
65
+ A row, not a card: the key and its hints on the left, the actions on the right. The
66
+ whole box is still the drop target — it is only shorter, so two assets and the call
67
+ log fit the column without scrolling.
68
+ */
61
69
  .drop {
70
+ display: grid;
71
+ grid-template-columns: minmax(0, 1fr) auto;
72
+ align-items: center;
73
+ gap: 0.6rem;
62
74
  border: 1px dashed var(--border, #e2e8f0);
63
75
  border-radius: 4px;
64
- padding: 1rem;
65
- text-align: center;
76
+ padding: 0.6rem 0.75rem;
66
77
  transition: border-color 200ms ease, background 200ms ease;
67
78
  }
68
79
 
80
+ .meta {
81
+ min-width: 0;
82
+ }
83
+
69
84
  .drop.active {
70
85
  border-color: var(--accent, #ff007f);
71
86
  background: rgb(255 0 127 / 0.06);
@@ -85,14 +100,16 @@
85
100
  }
86
101
 
87
102
  .drop p {
88
- margin: 0.35rem 0 0;
103
+ margin: 0.15rem 0 0;
89
104
  color: var(--muted, #64748b);
90
- font-size: 0.78rem;
91
- word-break: break-all;
105
+ font-size: 0.75rem;
106
+ line-height: 1.35;
107
+ /* `anywhere`, not `break-all`: a long file name still breaks, prose does not. */
108
+ overflow-wrap: anywhere;
92
109
  }
93
110
 
94
111
  .drop p.hint {
95
- font-size: 0.8rem;
112
+ font-size: 0.78rem;
96
113
  }
97
114
 
98
115
  .drop p.file-selected {
@@ -102,18 +119,20 @@
102
119
  }
103
120
 
104
121
  .picker-actions {
105
- display: inline-flex;
106
- align-items: center;
107
- gap: 0.4rem;
108
- margin-top: 0.75rem;
122
+ display: flex;
123
+ flex-direction: column;
124
+ align-items: stretch;
125
+ gap: 0.3rem;
109
126
  }
110
127
 
111
128
  .picker,
112
129
  .remove-btn {
113
130
  display: inline-flex;
131
+ justify-content: center;
132
+ white-space: nowrap;
114
133
  font-family: var(--mono, monospace);
115
134
  font-size: 0.75rem;
116
- padding: 0.35rem 0.7rem;
135
+ padding: 0.3rem 0.6rem;
117
136
  border: 1px solid var(--border, #e2e8f0);
118
137
  border-radius: 3px;
119
138
  background: transparent;
@@ -4,58 +4,51 @@
4
4
  This is what replaced the manifest: `id`, `version`, `name` and `description` are
5
5
  static members of the SDK constructor, so a launcher can list engines without
6
6
  booting one.
7
+
8
+ It sits at the foot of the page and says nothing about the site: the toolbar above
9
+ carries that, which is why neither the link back to the reference nor a page-titling
10
+ `h1` is here any more. The name still reaches the reader — as the document title,
11
+ written from the same static member.
7
12
  -->
8
- <header>
13
+ <footer class="engine-header">
9
14
  <div>
10
- <h1>{{ name }} <code>{{ id }}</code></h1>
11
15
  <p>{{ description }}</p>
12
16
  </div>
13
17
  <div class="right">
14
18
  <span class="pill">v{{ version }}</span>
15
- <a class="pill link" :href="referenceHref">API reference</a>
16
19
  </div>
17
- </header>
20
+ </footer>
18
21
 
19
22
  <script :setup="{
20
- name,
21
- id,
22
23
  version,
23
24
  description = '',
24
- referenceHref = '../',
25
25
  }">
26
26
  </script>
27
27
 
28
28
  <style>
29
- header {
29
+ /*
30
+ Scoped to a class, not to the element. A component's styles land in the page's own
31
+ <style>, unscoped — so a bare `header {}` here reached the site toolbar above and
32
+ made a flex container of it, which centred the whole bar. Class selectors keep a
33
+ component's look to the component.
34
+ */
35
+ .engine-header {
30
36
  display: flex;
31
37
  flex-wrap: wrap;
32
38
  gap: 1rem;
33
39
  align-items: center;
34
40
  justify-content: space-between;
35
41
  padding: 1.25rem 1.5rem;
36
- border-bottom: 1px solid var(--border, #e2e8f0);
42
+ border-top: 1px solid var(--border, #e2e8f0);
37
43
  background: var(--panel, #fff);
38
44
  }
39
45
 
40
- h1 {
46
+ .engine-header p {
41
47
  margin: 0;
42
- font-size: 1.25rem;
43
- letter-spacing: 0.02em;
44
- color: var(--text, #0f172a);
45
- }
46
-
47
- code {
48
- font-family: var(--mono, monospace);
49
- font-size: 0.75em;
50
48
  color: var(--muted, #64748b);
51
49
  }
52
50
 
53
- p {
54
- margin: 0.25rem 0 0;
55
- color: var(--muted, #64748b);
56
- }
57
-
58
- .right {
51
+ .engine-header .right {
59
52
  display: flex;
60
53
  gap: 0.5rem;
61
54
  }
@@ -71,8 +64,4 @@
71
64
  text-transform: uppercase;
72
65
  white-space: nowrap;
73
66
  }
74
-
75
- .link {
76
- text-decoration: none;
77
- }
78
67
  </style>
@@ -0,0 +1,31 @@
1
+ <!--
2
+ The reference's own toolbar, reused rather than imitated: the class names are
3
+ TypeDoc's and so is the stylesheet that paints them, which index.html loads from
4
+ `../assets/style.css`. Two pages, one bar, and nothing here to keep in sync by hand.
5
+
6
+ What is missing is `button#tsd-search-trigger`. This page carries no search index and
7
+ does not load TypeDoc's `main.js`, so the button would open nothing — and a control
8
+ that does nothing is worse than a control that isn't there.
9
+
10
+ The version is *given* to this component, never written into it: TypeDoc reads it from
11
+ package.json, and a copy hard-coded here would drift the first time it changed. With
12
+ nothing to show — a bare `demo/` checkout — the bar shows the name alone rather than a
13
+ wrong number.
14
+ -->
15
+ <header class="tsd-page-toolbar">
16
+ <div class="tsd-toolbar-contents container">
17
+ <a class="title" :href="referenceHref">{{ title }}<span :if="version"> - v{{ version }}</span></a>
18
+ <div id="tsd-toolbar-links">
19
+ <a :href="referenceHref">Reference</a>
20
+ <a :href="repositoryHref">GitHub</a>
21
+ </div>
22
+ </div>
23
+ </header>
24
+
25
+ <script :setup="{
26
+ title = '@wasm-gaming/engine-specs',
27
+ version = '',
28
+ referenceHref = '../',
29
+ repositoryHref = 'https://github.com/wasm-gaming/engine-specs',
30
+ }">
31
+ </script>
package/demo/demo.css CHANGED
@@ -7,22 +7,32 @@
7
7
  */
8
8
 
9
9
  :root {
10
- --bg: #f8fafc;
11
- --panel: #ffffff;
12
- --border: #e2e8f0;
13
- --text: #0f172a;
14
- --muted: #64748b;
10
+ /*
11
+ The reference's palette, read off the variables TypeDoc defines, so the theme
12
+ switch in the docs sidebar drives this page too — there is no second switch here
13
+ to disagree with it, and no `prefers-color-scheme` block either: TypeDoc's `os`
14
+ theme already means "follow the system".
15
+
16
+ `--accent` stays the demo's own. It marks what the page does, not what the site
17
+ is, and the reference has no equivalent to borrow.
18
+ */
19
+ --bg: var(--color-background);
20
+ --panel: var(--color-background-secondary);
21
+ --border: var(--color-accent);
22
+ --text: var(--color-text);
23
+ --muted: var(--color-text-aside);
15
24
  --accent: #ff007f;
16
25
  --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
17
26
  }
18
27
 
19
- @media (prefers-color-scheme: dark) {
20
- :root {
21
- --bg: #060910;
22
- --panel: #0f172a;
23
- --border: #1e293b;
24
- --text: #e2e8f0;
25
- --muted: #94a3b8;
28
+ /*
29
+ TypeDoc hides the toolbar links below 769px because its menu trigger takes over
30
+ there. This page has no menu, so hiding them would leave no way back to the
31
+ reference. Unlayered, so it wins.
32
+ */
33
+ @media (max-width: 769px) {
34
+ #tsd-toolbar-links {
35
+ display: flex;
26
36
  }
27
37
  }
28
38
 
package/demo/index.html CHANGED
@@ -4,7 +4,24 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>engine-specs demo</title>
7
+ <!--
8
+ TypeDoc's stylesheet paints the toolbar and carries the palette the demo maps
9
+ itself onto. The demo only ever runs from `site/demo/` — `demo.sdk.js` imports
10
+ `../src/engine-specs.js` as a value, which is why `make site` puts the built JS
11
+ there — so this path always resolves.
12
+
13
+ Order matters, but only downwards: everything TypeDoc ships is inside
14
+ `@layer typedoc`, so demo.css and every component's styles win over it without
15
+ trying.
16
+ -->
17
+ <link rel="stylesheet" href="../assets/style.css" />
7
18
  <link rel="stylesheet" href="./demo.css" />
19
+ <script>
20
+ // The theme the reference was left on. TypeDoc writes this key; both pages read
21
+ // it, so one switch in the docs sidebar drives both. `os` is TypeDoc's own
22
+ // default and means "follow the system".
23
+ document.documentElement.dataset.theme = localStorage.getItem('tsd-theme') || 'os'
24
+ </script>
8
25
  </head>
9
26
  <body>
10
27
  <main></main>
@@ -357,4 +357,138 @@ export declare abstract class EngineSDKBase<P extends EnginePayloads = DefaultPa
357
357
  */
358
358
  start(options?: Partial<P['options']>): PromisePlay<P>;
359
359
  }
360
+ /** What a menu reacts to. Never raw keys or buttons. */
361
+ export type UiAction = 'up' | 'down' | 'left' | 'right' | 'accept' | 'back' | 'menu' | 'more' | 'prev' | 'next';
362
+ export type UiDirection = 'up' | 'down' | 'left' | 'right';
363
+ /** Keyboard → action (`KeyboardEvent.key`). */
364
+ export declare const UI_KEYMAP: Readonly<Record<string, UiAction>>;
365
+ /**
366
+ * Gamepad button index (W3C "standard" mapping) → action. A = 0, B = 1, X = 2, Y = 3,
367
+ * LB = 4, RB = 5, Select = 8, Start = 9, d-pad = 12–15. Select + Start together is
368
+ * `menu` as well (see {@link createInput}).
369
+ */
370
+ export declare const UI_PADMAP: Readonly<Record<number, UiAction>>;
371
+ /** Hold-to-repeat for directions: first repeat after `delay` ms, then every `interval` ms. */
372
+ export declare const UI_REPEAT: Readonly<{
373
+ delay: 380;
374
+ interval: 110;
375
+ axis: 0.6;
376
+ }>;
377
+ /** How an action reached the listener. */
378
+ export interface UiActionDetail {
379
+ source: 'keyboard' | 'gamepad';
380
+ /** True for a held key or button repeating. */
381
+ repeat: boolean;
382
+ }
383
+ export type UiActionListener = (action: UiAction, detail: UiActionDetail) => void;
384
+ /** The minimum of the Gamepad API {@link createInput} reads, so tests can fake it. */
385
+ export interface UiGamepadLike {
386
+ readonly buttons: ReadonlyArray<{
387
+ readonly pressed: boolean;
388
+ }>;
389
+ readonly axes: ReadonlyArray<number>;
390
+ }
391
+ export interface UiInputOptions {
392
+ /** Where key events are heard. Default: `globalThis` (the window). */
393
+ target?: EventTarget;
394
+ /** Listen in the capture phase, ahead of the engine's own keyboard handlers. Default true. */
395
+ capture?: boolean;
396
+ /**
397
+ * `preventDefault()` + `stopPropagation()` on keys that map to an action, so a
398
+ * menu's keys never reach the game underneath. Default true.
399
+ */
400
+ swallow?: boolean;
401
+ keymap?: Readonly<Record<string, UiAction>>;
402
+ padmap?: Readonly<Record<number, UiAction>>;
403
+ /** Gamepad source. Default: `navigator.getGamepads()`. */
404
+ gamepads?: () => ReadonlyArray<UiGamepadLike | null>;
405
+ /** Clock in ms. Default: `performance.now()`. */
406
+ now?: () => number;
407
+ /** Frame scheduler for gamepad polling. Default: `requestAnimationFrame`; `null` = poll manually. */
408
+ schedule?: ((poll: () => void) => unknown) | null;
409
+ /** Keys that still open the menu while suspended (in game). Default `['Escape', 'F1']`. */
410
+ menuKeys?: readonly string[];
411
+ }
412
+ export interface UiInput {
413
+ /** Subscribe; returns the unsubscribe function. */
414
+ on(listener: UiActionListener): () => void;
415
+ /**
416
+ * The game has the controls: nothing is delivered or swallowed, except the in-game
417
+ * menu combo — Select + Start, and the `menuKeys` (Escape) — which arrives as `menu`.
418
+ */
419
+ suspend(): void;
420
+ resume(): void;
421
+ readonly suspended: boolean;
422
+ /** Read the gamepads once. Called every frame by the default scheduler. */
423
+ poll(): void;
424
+ /** Remove every listener and stop polling. */
425
+ destroy(): void;
426
+ }
427
+ /**
428
+ * The scheme's runtime: keyboard and gamepads become {@link UiAction}s.
429
+ *
430
+ * Keyboard: `keydown` mapped through {@link UI_KEYMAP} (keys typed into form fields
431
+ * are left alone). Gamepads: polled each frame through {@link UI_PADMAP} and the left
432
+ * stick; directions repeat with {@link UI_REPEAT}; Select + Start together is `menu`
433
+ * (and then neither fires on its own). While {@link UiInput.suspend | suspended} (in
434
+ * game) the game gets every input except the menu combo: Select + Start and the
435
+ * `menuKeys` (Escape, F1) still arrive, as `menu`, so the pause menu can always open.
436
+ */
437
+ export declare function createInput(options?: UiInputOptions): UiInput;
438
+ /** Anything with a layout box (an `Element`, or a test double). */
439
+ export interface UiFocusable {
440
+ getBoundingClientRect(): {
441
+ left: number;
442
+ top: number;
443
+ width: number;
444
+ height: number;
445
+ };
446
+ }
447
+ /**
448
+ * Spatial navigation: the candidate a direction leads to from `from`, or null.
449
+ *
450
+ * Only candidates whose centre lies ahead in that direction count; among them the
451
+ * nearest wins, with sideways distance weighted double so "down" prefers the item
452
+ * straight below over a closer one off to the side.
453
+ */
454
+ export declare function nextFocus<T extends UiFocusable>(from: UiFocusable, candidates: Iterable<T>, direction: UiDirection): T | null;
455
+ /**
456
+ * The look every menu shares, as CSS custom properties: the focus ring, radii, type
457
+ * faces, colours and spacing. Apps read them with `var(--wg-…)`; {@link uiTokensCss}
458
+ * writes them into a stylesheet.
459
+ */
460
+ export declare const UI_TOKENS: Readonly<Record<string, string>>;
461
+ /** `UI_TOKENS` as a CSS rule, e.g. for a `<style>` an app injects. */
462
+ export declare function uiTokensCss(selector?: string): string;
463
+ /** What the host (the launcher's route page) hands an engine app. */
464
+ export interface EngineAppHost {
465
+ /** The game being played, as the host's catalog describes it. */
466
+ game: {
467
+ slug: string;
468
+ title: string;
469
+ accent?: string;
470
+ art?: string;
471
+ };
472
+ /** Pass to the SDK's `storage({ namespace })`; the engine prefixes its own id. */
473
+ storage: {
474
+ namespace: string;
475
+ };
476
+ /** The game's files, each read only when the engine asks (keyed by the SDK's asset names). */
477
+ assets: Record<string, () => Promise<Uint8Array>>;
478
+ /** The shared input; the app suspends it while the game itself has the controls. */
479
+ input: UiInput;
480
+ /** Leave: the host navigates back (to its library or home). Call after `unmount()` work is done. */
481
+ exit(): void;
482
+ }
483
+ /** What `mount()` returns: the way to take the app down. */
484
+ export interface EngineAppHandle {
485
+ unmount(): Promise<void>;
486
+ }
487
+ /**
488
+ * An engine app module (`<id>/app/app.js`): mounts the engine's own screens — start
489
+ * / load game, pause, options — into `target` and runs the game, following UX.md.
490
+ */
491
+ export interface EngineApp {
492
+ mount(target: HTMLElement, host: EngineAppHost): Promise<EngineAppHandle>;
493
+ }
360
494
  //# sourceMappingURL=engine-specs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine-specs.d.ts","sourceRoot":"","sources":["../src/engine-specs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine-specs.d.ts","sourceRoot":"","sources":["../src/engine-specs.ts"],"names":[],"mappings":"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"}
@@ -379,4 +379,268 @@ export class EngineSDKBase {
379
379
  return this;
380
380
  }
381
381
  }
382
+ /** Keyboard → action (`KeyboardEvent.key`). */
383
+ export const UI_KEYMAP = Object.freeze({
384
+ ArrowUp: 'up',
385
+ ArrowDown: 'down',
386
+ ArrowLeft: 'left',
387
+ ArrowRight: 'right',
388
+ Enter: 'accept',
389
+ ' ': 'accept',
390
+ Escape: 'back',
391
+ Backspace: 'back',
392
+ Tab: 'more',
393
+ v: 'more',
394
+ V: 'more',
395
+ ContextMenu: 'more',
396
+ q: 'prev',
397
+ Q: 'prev',
398
+ e: 'next',
399
+ E: 'next',
400
+ F1: 'menu',
401
+ });
402
+ /**
403
+ * Gamepad button index (W3C "standard" mapping) → action. A = 0, B = 1, X = 2, Y = 3,
404
+ * LB = 4, RB = 5, Select = 8, Start = 9, d-pad = 12–15. Select + Start together is
405
+ * `menu` as well (see {@link createInput}).
406
+ */
407
+ export const UI_PADMAP = Object.freeze({
408
+ 0: 'accept',
409
+ 1: 'back',
410
+ 2: 'more',
411
+ 3: 'more',
412
+ 4: 'prev',
413
+ 5: 'next',
414
+ 9: 'menu',
415
+ 12: 'up',
416
+ 13: 'down',
417
+ 14: 'left',
418
+ 15: 'right',
419
+ });
420
+ /** Hold-to-repeat for directions: first repeat after `delay` ms, then every `interval` ms. */
421
+ export const UI_REPEAT = Object.freeze({ delay: 380, interval: 110, axis: 0.6 });
422
+ const DIRECTIONS = new Set(['up', 'down', 'left', 'right']);
423
+ const isEditable = (target) => {
424
+ const element = target;
425
+ if (!element)
426
+ return false;
427
+ if (element.isContentEditable)
428
+ return true;
429
+ return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT';
430
+ };
431
+ /**
432
+ * The scheme's runtime: keyboard and gamepads become {@link UiAction}s.
433
+ *
434
+ * Keyboard: `keydown` mapped through {@link UI_KEYMAP} (keys typed into form fields
435
+ * are left alone). Gamepads: polled each frame through {@link UI_PADMAP} and the left
436
+ * stick; directions repeat with {@link UI_REPEAT}; Select + Start together is `menu`
437
+ * (and then neither fires on its own). While {@link UiInput.suspend | suspended} (in
438
+ * game) the game gets every input except the menu combo: Select + Start and the
439
+ * `menuKeys` (Escape, F1) still arrive, as `menu`, so the pause menu can always open.
440
+ */
441
+ export function createInput(options = {}) {
442
+ const target = options.target ?? globalThis;
443
+ const capture = options.capture ?? true;
444
+ const swallow = options.swallow ?? true;
445
+ const keymap = options.keymap ?? UI_KEYMAP;
446
+ const menuKeys = new Set(options.menuKeys ?? ['Escape', 'F1']);
447
+ const padmap = options.padmap ?? UI_PADMAP;
448
+ const now = options.now ?? (() => globalThis.performance?.now() ?? Date.now());
449
+ const gamepads = options.gamepads ??
450
+ (() => (globalThis.navigator?.getGamepads?.() ?? []));
451
+ const schedule = options.schedule === undefined
452
+ ? (globalThis.requestAnimationFrame?.bind(globalThis) ?? null)
453
+ : options.schedule;
454
+ const listeners = new Set();
455
+ let suspended = false;
456
+ let destroyed = false;
457
+ let polling = false;
458
+ const held = new Map();
459
+ const fire = (action, detail) => {
460
+ for (const listener of listeners)
461
+ listener(action, detail);
462
+ };
463
+ const onKey = (event) => {
464
+ if (destroyed)
465
+ return;
466
+ const key = event;
467
+ if (suspended) {
468
+ if (!menuKeys.has(key.key) || key.repeat)
469
+ return;
470
+ key.preventDefault();
471
+ key.stopPropagation();
472
+ fire('menu', { source: 'keyboard', repeat: false });
473
+ return;
474
+ }
475
+ if (isEditable(key.target) && key.key !== 'Escape')
476
+ return;
477
+ const action = keymap[key.key];
478
+ if (!action)
479
+ return;
480
+ if (swallow) {
481
+ key.preventDefault();
482
+ key.stopPropagation();
483
+ }
484
+ fire(action, { source: 'keyboard', repeat: key.repeat === true });
485
+ };
486
+ const pressed = (pad) => {
487
+ const actions = new Set();
488
+ const select = pad.buttons[8]?.pressed === true;
489
+ const start = pad.buttons[9]?.pressed === true;
490
+ if (select && start)
491
+ actions.add('menu');
492
+ pad.buttons.forEach((button, index) => {
493
+ if (!button.pressed)
494
+ return;
495
+ if ((index === 8 || index === 9) && select && start)
496
+ return;
497
+ const action = padmap[index];
498
+ if (action)
499
+ actions.add(action);
500
+ });
501
+ const [x = 0, y = 0] = pad.axes;
502
+ if (x < -UI_REPEAT.axis)
503
+ actions.add('left');
504
+ if (x > UI_REPEAT.axis)
505
+ actions.add('right');
506
+ if (y < -UI_REPEAT.axis)
507
+ actions.add('up');
508
+ if (y > UI_REPEAT.axis)
509
+ actions.add('down');
510
+ return actions;
511
+ };
512
+ const poll = () => {
513
+ if (destroyed)
514
+ return;
515
+ const t = now();
516
+ const active = new Set();
517
+ for (const pad of gamepads())
518
+ if (pad)
519
+ for (const action of pressed(pad))
520
+ active.add(action);
521
+ for (const action of active) {
522
+ const state = held.get(action);
523
+ if (!state) {
524
+ held.set(action, { since: t, last: t });
525
+ // In game only the Select + Start combo gets through (plain Start is the game's).
526
+ const combo = action === 'menu' && gamepads().some((p) => p?.buttons[8]?.pressed && p.buttons[9]?.pressed);
527
+ if (!suspended || combo)
528
+ fire(action, { source: 'gamepad', repeat: false });
529
+ }
530
+ else if (DIRECTIONS.has(action) &&
531
+ t - state.since >= UI_REPEAT.delay &&
532
+ t - state.last >= UI_REPEAT.interval) {
533
+ state.last = t;
534
+ if (!suspended)
535
+ fire(action, { source: 'gamepad', repeat: true });
536
+ }
537
+ }
538
+ for (const action of [...held.keys()])
539
+ if (!active.has(action))
540
+ held.delete(action);
541
+ };
542
+ const loop = () => {
543
+ if (destroyed || !schedule)
544
+ return;
545
+ poll();
546
+ schedule(loop);
547
+ };
548
+ const startPolling = () => {
549
+ if (polling || !schedule)
550
+ return;
551
+ polling = true;
552
+ schedule(loop);
553
+ };
554
+ target.addEventListener('keydown', onKey, { capture });
555
+ target.addEventListener('gamepadconnected', startPolling);
556
+ if (gamepads().some(Boolean))
557
+ startPolling();
558
+ return {
559
+ on(listener) {
560
+ listeners.add(listener);
561
+ return () => listeners.delete(listener);
562
+ },
563
+ suspend() {
564
+ suspended = true;
565
+ },
566
+ resume() {
567
+ suspended = false;
568
+ },
569
+ get suspended() {
570
+ return suspended;
571
+ },
572
+ poll,
573
+ destroy() {
574
+ destroyed = true;
575
+ listeners.clear();
576
+ held.clear();
577
+ target.removeEventListener('keydown', onKey, { capture });
578
+ target.removeEventListener('gamepadconnected', startPolling);
579
+ },
580
+ };
581
+ }
582
+ /**
583
+ * Spatial navigation: the candidate a direction leads to from `from`, or null.
584
+ *
585
+ * Only candidates whose centre lies ahead in that direction count; among them the
586
+ * nearest wins, with sideways distance weighted double so "down" prefers the item
587
+ * straight below over a closer one off to the side.
588
+ */
589
+ export function nextFocus(from, candidates, direction) {
590
+ const centre = (el) => {
591
+ const r = el.getBoundingClientRect();
592
+ return { x: r.left + r.width / 2, y: r.top + r.height / 2 };
593
+ };
594
+ const origin = centre(from);
595
+ let best = null;
596
+ let bestScore = Infinity;
597
+ for (const candidate of candidates) {
598
+ if (candidate === from)
599
+ continue;
600
+ const c = centre(candidate);
601
+ const dx = c.x - origin.x;
602
+ const dy = c.y - origin.y;
603
+ const ahead = direction === 'up' ? -dy : direction === 'down' ? dy : direction === 'left' ? -dx : dx;
604
+ if (ahead <= 0.5)
605
+ continue;
606
+ const side = direction === 'up' || direction === 'down' ? Math.abs(dx) : Math.abs(dy);
607
+ const score = ahead + side * 2;
608
+ if (score < bestScore) {
609
+ bestScore = score;
610
+ best = candidate;
611
+ }
612
+ }
613
+ return best;
614
+ }
615
+ /**
616
+ * The look every menu shares, as CSS custom properties: the focus ring, radii, type
617
+ * faces, colours and spacing. Apps read them with `var(--wg-…)`; {@link uiTokensCss}
618
+ * writes them into a stylesheet.
619
+ */
620
+ export const UI_TOKENS = Object.freeze({
621
+ '--wg-bg': '#07080c',
622
+ '--wg-surface': 'rgb(18 20 28 / 0.78)',
623
+ '--wg-line': 'rgb(255 255 255 / 0.12)',
624
+ '--wg-text': '#f4f6fb',
625
+ '--wg-muted': '#8e97a9',
626
+ '--wg-ok': '#4ade80',
627
+ '--wg-danger': '#f87171',
628
+ '--wg-focus': '#ffffff',
629
+ '--wg-focus-ring': '0 0 0 3px #ffffff',
630
+ '--wg-radius': '22px',
631
+ '--wg-radius-small': '12px',
632
+ '--wg-gap': '16px',
633
+ '--wg-font-display': "'Unbounded Variable', 'Unbounded', system-ui, sans-serif",
634
+ '--wg-font-ui': "'Inter Variable', 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif",
635
+ '--wg-ease': 'cubic-bezier(0.2, 0.8, 0.2, 1)',
636
+ '--wg-safe-top': 'env(safe-area-inset-top, 0px)',
637
+ '--wg-safe-bottom': 'env(safe-area-inset-bottom, 0px)',
638
+ });
639
+ /** `UI_TOKENS` as a CSS rule, e.g. for a `<style>` an app injects. */
640
+ export function uiTokensCss(selector = ':root') {
641
+ const body = Object.entries(UI_TOKENS)
642
+ .map(([name, value]) => ` ${name}: ${value};`)
643
+ .join('\n');
644
+ return `${selector} {\n${body}\n}\n`;
645
+ }
382
646
  //# sourceMappingURL=engine-specs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine-specs.js","sourceRoot":"","sources":["../src/engine-specs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine-specs.js","sourceRoot":"","sources":["../src/engine-specs.ts"],"names":[],"mappings":"AAAA,gDAAgD;AA+GhD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,YAAY;IACd,UAAU,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEtE,8EAA8E;IAC9E,YAAY,SAA6B;QACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAgB,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,QAAQ;gBAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,EAAE,CAAoB,IAAO,EAAE,QAA8B;QAC3D,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,QAAkC,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAoB,IAAO,EAAE,QAA8B;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,GAAG,EAAE,MAAM,CAAC,QAAkC,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,IAAI,CACF,IAAO,EACP,GAAG,CAAC,MAAM,CAA0C;QAEpD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,gFAAgF;QAChF,kDAAkD;QAClD,MAAM,KAAK,GAAyB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAc,EAAE,CAAC,CAAC;QACpF,gFAAgF;QAChF,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACF,QAAiC,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,6EAA6E;gBAC7E,yEAAyE;gBACzE,cAAc,CAAC,GAAG,EAAE;oBAClB,MAAM,MAAM,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAqID;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,KAA6B,EAC7B,MAAiC;IAEjC,MAAM,KAAK,GAAG,CAAC,IAA6C,EAAkB,EAAE,CAC9E,WAAW,CACT,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,EACF,MAAM,CACP,CAAC;IAEJ,MAAM,QAAQ,GAAmB;QAC/B,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;QACtE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;QAC9C,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAChD,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,aAAa;QAEnC,MAAM,EAAE,CAAC,CAAC,KAA4B,EAAE,EAAE,CACxC,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAA6B;QACtE,OAAO,EAAE,CAAC,CAAC,KAA6B,EAAE,EAAE,CAC1C,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAA8B;QACxE,MAAM,EAAE,CAAC,CAAC,KAA4B,EAAE,EAAE,CACxC,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACrC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAA6B;QACtE,OAAO,EAAE,CAAC,CAAC,KAA6B,EAAE,EAAE,CAC1C,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAA8B;QAExE,KAAK,EAAE,CAAC,MAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnE,EAAE,EAAE,CAA8B,IAAO,EAAE,QAAwC,EAAE,EAAE;YACrF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,GAAG,EAAE,CAA8B,IAAO,EAAE,QAAwC,EAAE,EAAE;YACtF,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,EAAE,CAAC,OAA+B,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpF,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;KACpD,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAgB,cAAc;IAGzB,KAAK,CAAgB;IACrB,MAAM,CAA+C;IACrD,OAAO,CAA4B;IAC5C,OAAO,CAA0B;IACjC,6EAA6E;IAC7E,SAAS,CAA0B;IAEnC;;;;OAIG;IACH,YAAY,IAAmB,EAAE,IAAoB,EAAE,MAAkC;QACvF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI,YAAY,CAAc,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;YAC1C,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;SAC3C,CAAC;QACF,iFAAiF;QACjF,mFAAmF;QACnF,+DAA+D;QAC/D,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,CAAC;IAC7B,CAAC;IAcD,sDAAsD;IAC5C,OAAO,CAAC,MAAmB;QACnC,KAAK,MAAM,CAAC;IACd,CAAC;IAED,qFAAqF;IAC3E,OAAO,CAAC,IAAiB,EAAE,KAAa;QAChD,KAAK,IAAI,CAAC;QACV,KAAK,KAAK,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACO,IAAI,CACZ,IAAO,EACP,GAAG,MAAmE;QAEtE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,qFAAqF;IACrF,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAMD,MAAM,CAAC,KAA4B;QACjC,mFAAmF;QACnF,uBAAuB;QACvB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAID,OAAO,CACL,KAA6B;QAE7B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAID,MAAM,CAAC,KAA4B;QACjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAID,OAAO,CACL,KAA6B;QAE7B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAmB;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAA8B,IAAO,EAAE,QAAwC;QAC/E,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,WAAW,CAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,GAAG,CACD,IAAO,EACP,QAAwC;QAExC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,WAAW,CAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,OAA+B;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,OAAO;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,uEAAuE;YACvE,8EAA8E;YAC9E,qEAAqE;YACrE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAkB,CAAC;YAC1D,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO;QAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,6BAA6B;IAE7B,qFAAqF;IACrF,SAAS,CAAwB,IAAO;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0C,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,GAAG,GAAgD,EAAE,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,GAAiC,CAAC;IAC3C,CAAC;IAED,sFAAsF;IACtF,MAAM,CAAC,IAAiB,EAAE,KAAyB;QACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,IAAyB;QAC5B,OAAO,WAAW,CAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,IAAyB;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAgC,IAAO,EAAE,MAAwB;QACxE,kFAAkF;QAClF,qDAAqD;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAuE,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;CACF;AAED,yFAAyF;AACzF,SAAS,IAAI,CAAC,IAAY,EAAE,KAAyB;IACnD,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA6C,CAAC,EAAE,CAAC;QAC5F,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAgB,aAAa;IAGxB,KAAK,CAAgB;IAC9B,KAAK,CAAgC;IAErC;;;OAGG;IACgB,MAAM,CAA4B;IAErD,YAAY,IAAoB;QAC9B,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAc,IAAI,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IAUD,MAAM,CAAC,KAA4B;QACjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAID,OAAO,CAAC,KAA6B;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAID,MAAM,CAAC,KAA4B;QACjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAID,OAAO,CAAC,KAA6B;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,MAAmB;QACvB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,EAAE,CAA8B,IAAO,EAAE,QAAwC;QAC/E,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAA8B,IAAO,EAAE,QAAwC;QAChF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAA+B;QACnC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,oFAAoF;IACpF,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,IAAiB,EAAE,KAAyB;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QACrD,+EAA+E;QAC/E,wBAAwB;QACxB,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAc,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA0BD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAuC,MAAM,CAAC,MAAM,CAAC;IACzE,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,OAAO;IACnB,KAAK,EAAE,QAAQ;IACf,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,MAAM;IACjB,GAAG,EAAE,MAAM;IACX,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,WAAW,EAAE,MAAM;IACnB,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,EAAE,EAAE,MAAM;CACX,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAuC,MAAM,CAAC,MAAM,CAAC;IACzE,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,MAAM;IACT,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,OAAO;CACZ,CAAC,CAAC;AAEH,8FAA8F;AAC9F,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AAuDjF,MAAM,UAAU,GAA0B,IAAI,GAAG,CAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7F,MAAM,UAAU,GAAG,CAAC,MAA0B,EAAW,EAAE;IACzD,MAAM,OAAO,GAAG,MAAkE,CAAC;IACnF,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,OAAO,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC;AACvG,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,UAA0B,EAAE;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAK,UAAqC,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ;QAChB,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAwC,CAAC,CAAC;IAC/F,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC5B,CAAC,CAAC,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;QAC9D,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEvB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,GAAG,EAA6C,CAAC;IAElE,MAAM,IAAI,GAAG,CAAC,MAAgB,EAAE,MAAsB,EAAQ,EAAE;QAC9D,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,KAAY,EAAQ,EAAE;QACnC,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,GAAG,GAAG,KAAsB,CAAC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM;gBAAE,OAAO;YACjD,GAAG,CAAC,cAAc,EAAE,CAAC;YACrB,GAAG,CAAC,eAAe,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO;QAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,cAAc,EAAE,CAAC;YACrB,GAAG,CAAC,eAAe,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,GAAkB,EAAiB,EAAE;QACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;QAC/C,IAAI,MAAM,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACpC,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC5B,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,IAAI,KAAK;gBAAE,OAAO;YAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAY,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAAE,IAAI,GAAG;gBAAE,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE7F,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxC,kFAAkF;gBAClF,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM,IAAI,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC3G,IAAI,CAAC,SAAS,IAAI,KAAK;oBAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9E,CAAC;iBAAM,IACL,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;gBACtB,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK;gBAClC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,EACpC,CAAC;gBACD,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;gBACf,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtF,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,SAAS,IAAI,CAAC,QAAQ;YAAE,OAAO;QACnC,IAAI,EAAE,CAAC;QACP,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,IAAI,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QACjC,OAAO,GAAG,IAAI,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAI,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,YAAY,EAAE,CAAC;IAE7C,OAAO;QACL,EAAE,CAAC,QAAQ;YACT,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO;YACL,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,MAAM;YACJ,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;QACD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI;QACJ,OAAO;YACL,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;KACF,CAAC;AACJ,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,IAAiB,EACjB,UAAuB,EACvB,SAAsB;IAEtB,MAAM,MAAM,GAAG,CAAC,EAAe,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC9D,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAa,IAAI,CAAC;IAC1B,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAK,SAAyB,KAAK,IAAI;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,IAAI,KAAK,IAAI,GAAG;YAAE,SAAS;QAC3B,MAAM,IAAI,GAAG,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAqC,MAAM,CAAC,MAAM,CAAC;IACvE,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,sBAAsB;IACtC,WAAW,EAAE,yBAAyB;IACtC,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,SAAS,EAAE,SAAS;IACpB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IACvB,iBAAiB,EAAE,mBAAmB;IACtC,aAAa,EAAE,MAAM;IACrB,mBAAmB,EAAE,MAAM;IAC3B,UAAU,EAAE,MAAM;IAClB,mBAAmB,EAAE,0DAA0D;IAC/E,cAAc,EAAE,6EAA6E;IAC7F,WAAW,EAAE,gCAAgC;IAC7C,eAAe,EAAE,+BAA+B;IAChD,kBAAkB,EAAE,kCAAkC;CACvD,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,QAAQ,GAAG,OAAO;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC;SAC9C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,GAAG,QAAQ,OAAO,IAAI,OAAO,CAAC;AACvC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wasm-gaming/engine-specs",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "The wasm-gaming engine contract: the single shared JS API every WASM game/emulator engine and the host app conform to. TypeScript types, no runtime dependencies.",
5
5
  "type": "module",
6
6
  "types": "./dist/engine-specs.d.ts",
@@ -713,3 +713,382 @@ export abstract class EngineSDKBase<P extends EnginePayloads = DefaultPayloads>
713
713
  return this;
714
714
  }
715
715
  }
716
+
717
+ // ============================================================================
718
+ // ---- The usability scheme: one input model for every menu (UX.md) ----
719
+ // ============================================================================
720
+ //
721
+ // Every engine ships its own app — start screen, load-game, pause menu, options —
722
+ // and the launcher has its own menus. They must feel identical under a gamepad, so
723
+ // the mapping, the repeat timing and the focus rules live here, beside the contract
724
+ // every engine already depends on. Normative description: UX.md.
725
+
726
+ /** What a menu reacts to. Never raw keys or buttons. */
727
+ export type UiAction =
728
+ | 'up'
729
+ | 'down'
730
+ | 'left'
731
+ | 'right'
732
+ | 'accept'
733
+ | 'back'
734
+ | 'menu'
735
+ | 'more'
736
+ | 'prev'
737
+ | 'next';
738
+
739
+ export type UiDirection = 'up' | 'down' | 'left' | 'right';
740
+
741
+ /** Keyboard → action (`KeyboardEvent.key`). */
742
+ export const UI_KEYMAP: Readonly<Record<string, UiAction>> = Object.freeze({
743
+ ArrowUp: 'up',
744
+ ArrowDown: 'down',
745
+ ArrowLeft: 'left',
746
+ ArrowRight: 'right',
747
+ Enter: 'accept',
748
+ ' ': 'accept',
749
+ Escape: 'back',
750
+ Backspace: 'back',
751
+ Tab: 'more',
752
+ v: 'more',
753
+ V: 'more',
754
+ ContextMenu: 'more',
755
+ q: 'prev',
756
+ Q: 'prev',
757
+ e: 'next',
758
+ E: 'next',
759
+ F1: 'menu',
760
+ });
761
+
762
+ /**
763
+ * Gamepad button index (W3C "standard" mapping) → action. A = 0, B = 1, X = 2, Y = 3,
764
+ * LB = 4, RB = 5, Select = 8, Start = 9, d-pad = 12–15. Select + Start together is
765
+ * `menu` as well (see {@link createInput}).
766
+ */
767
+ export const UI_PADMAP: Readonly<Record<number, UiAction>> = Object.freeze({
768
+ 0: 'accept',
769
+ 1: 'back',
770
+ 2: 'more',
771
+ 3: 'more',
772
+ 4: 'prev',
773
+ 5: 'next',
774
+ 9: 'menu',
775
+ 12: 'up',
776
+ 13: 'down',
777
+ 14: 'left',
778
+ 15: 'right',
779
+ });
780
+
781
+ /** Hold-to-repeat for directions: first repeat after `delay` ms, then every `interval` ms. */
782
+ export const UI_REPEAT = Object.freeze({ delay: 380, interval: 110, axis: 0.6 });
783
+
784
+ /** How an action reached the listener. */
785
+ export interface UiActionDetail {
786
+ source: 'keyboard' | 'gamepad';
787
+ /** True for a held key or button repeating. */
788
+ repeat: boolean;
789
+ }
790
+
791
+ export type UiActionListener = (action: UiAction, detail: UiActionDetail) => void;
792
+
793
+ /** The minimum of the Gamepad API {@link createInput} reads, so tests can fake it. */
794
+ export interface UiGamepadLike {
795
+ readonly buttons: ReadonlyArray<{ readonly pressed: boolean }>;
796
+ readonly axes: ReadonlyArray<number>;
797
+ }
798
+
799
+ export interface UiInputOptions {
800
+ /** Where key events are heard. Default: `globalThis` (the window). */
801
+ target?: EventTarget;
802
+ /** Listen in the capture phase, ahead of the engine's own keyboard handlers. Default true. */
803
+ capture?: boolean;
804
+ /**
805
+ * `preventDefault()` + `stopPropagation()` on keys that map to an action, so a
806
+ * menu's keys never reach the game underneath. Default true.
807
+ */
808
+ swallow?: boolean;
809
+ keymap?: Readonly<Record<string, UiAction>>;
810
+ padmap?: Readonly<Record<number, UiAction>>;
811
+ /** Gamepad source. Default: `navigator.getGamepads()`. */
812
+ gamepads?: () => ReadonlyArray<UiGamepadLike | null>;
813
+ /** Clock in ms. Default: `performance.now()`. */
814
+ now?: () => number;
815
+ /** Frame scheduler for gamepad polling. Default: `requestAnimationFrame`; `null` = poll manually. */
816
+ schedule?: ((poll: () => void) => unknown) | null;
817
+ /** Keys that still open the menu while suspended (in game). Default `['Escape', 'F1']`. */
818
+ menuKeys?: readonly string[];
819
+ }
820
+
821
+ export interface UiInput {
822
+ /** Subscribe; returns the unsubscribe function. */
823
+ on(listener: UiActionListener): () => void;
824
+ /**
825
+ * The game has the controls: nothing is delivered or swallowed, except the in-game
826
+ * menu combo — Select + Start, and the `menuKeys` (Escape) — which arrives as `menu`.
827
+ */
828
+ suspend(): void;
829
+ resume(): void;
830
+ readonly suspended: boolean;
831
+ /** Read the gamepads once. Called every frame by the default scheduler. */
832
+ poll(): void;
833
+ /** Remove every listener and stop polling. */
834
+ destroy(): void;
835
+ }
836
+
837
+ const DIRECTIONS: ReadonlySet<UiAction> = new Set<UiAction>(['up', 'down', 'left', 'right']);
838
+
839
+ const isEditable = (target: EventTarget | null): boolean => {
840
+ const element = target as { tagName?: string; isContentEditable?: boolean } | null;
841
+ if (!element) return false;
842
+ if (element.isContentEditable) return true;
843
+ return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT';
844
+ };
845
+
846
+ /**
847
+ * The scheme's runtime: keyboard and gamepads become {@link UiAction}s.
848
+ *
849
+ * Keyboard: `keydown` mapped through {@link UI_KEYMAP} (keys typed into form fields
850
+ * are left alone). Gamepads: polled each frame through {@link UI_PADMAP} and the left
851
+ * stick; directions repeat with {@link UI_REPEAT}; Select + Start together is `menu`
852
+ * (and then neither fires on its own). While {@link UiInput.suspend | suspended} (in
853
+ * game) the game gets every input except the menu combo: Select + Start and the
854
+ * `menuKeys` (Escape, F1) still arrive, as `menu`, so the pause menu can always open.
855
+ */
856
+ export function createInput(options: UiInputOptions = {}): UiInput {
857
+ const target = options.target ?? (globalThis as unknown as EventTarget);
858
+ const capture = options.capture ?? true;
859
+ const swallow = options.swallow ?? true;
860
+ const keymap = options.keymap ?? UI_KEYMAP;
861
+ const menuKeys = new Set(options.menuKeys ?? ['Escape', 'F1']);
862
+ const padmap = options.padmap ?? UI_PADMAP;
863
+ const now = options.now ?? (() => globalThis.performance?.now() ?? Date.now());
864
+ const gamepads =
865
+ options.gamepads ??
866
+ (() => (globalThis.navigator?.getGamepads?.() ?? []) as ReadonlyArray<UiGamepadLike | null>);
867
+ const schedule =
868
+ options.schedule === undefined
869
+ ? (globalThis.requestAnimationFrame?.bind(globalThis) ?? null)
870
+ : options.schedule;
871
+
872
+ const listeners = new Set<UiActionListener>();
873
+ let suspended = false;
874
+ let destroyed = false;
875
+ let polling = false;
876
+ const held = new Map<UiAction, { since: number; last: number }>();
877
+
878
+ const fire = (action: UiAction, detail: UiActionDetail): void => {
879
+ for (const listener of listeners) listener(action, detail);
880
+ };
881
+
882
+ const onKey = (event: Event): void => {
883
+ if (destroyed) return;
884
+ const key = event as KeyboardEvent;
885
+ if (suspended) {
886
+ if (!menuKeys.has(key.key) || key.repeat) return;
887
+ key.preventDefault();
888
+ key.stopPropagation();
889
+ fire('menu', { source: 'keyboard', repeat: false });
890
+ return;
891
+ }
892
+ if (isEditable(key.target) && key.key !== 'Escape') return;
893
+ const action = keymap[key.key];
894
+ if (!action) return;
895
+ if (swallow) {
896
+ key.preventDefault();
897
+ key.stopPropagation();
898
+ }
899
+ fire(action, { source: 'keyboard', repeat: key.repeat === true });
900
+ };
901
+
902
+ const pressed = (pad: UiGamepadLike): Set<UiAction> => {
903
+ const actions = new Set<UiAction>();
904
+ const select = pad.buttons[8]?.pressed === true;
905
+ const start = pad.buttons[9]?.pressed === true;
906
+ if (select && start) actions.add('menu');
907
+ pad.buttons.forEach((button, index) => {
908
+ if (!button.pressed) return;
909
+ if ((index === 8 || index === 9) && select && start) return;
910
+ const action = padmap[index];
911
+ if (action) actions.add(action);
912
+ });
913
+ const [x = 0, y = 0] = pad.axes;
914
+ if (x < -UI_REPEAT.axis) actions.add('left');
915
+ if (x > UI_REPEAT.axis) actions.add('right');
916
+ if (y < -UI_REPEAT.axis) actions.add('up');
917
+ if (y > UI_REPEAT.axis) actions.add('down');
918
+ return actions;
919
+ };
920
+
921
+ const poll = (): void => {
922
+ if (destroyed) return;
923
+ const t = now();
924
+ const active = new Set<UiAction>();
925
+ for (const pad of gamepads()) if (pad) for (const action of pressed(pad)) active.add(action);
926
+
927
+ for (const action of active) {
928
+ const state = held.get(action);
929
+ if (!state) {
930
+ held.set(action, { since: t, last: t });
931
+ // In game only the Select + Start combo gets through (plain Start is the game's).
932
+ const combo = action === 'menu' && gamepads().some((p) => p?.buttons[8]?.pressed && p.buttons[9]?.pressed);
933
+ if (!suspended || combo) fire(action, { source: 'gamepad', repeat: false });
934
+ } else if (
935
+ DIRECTIONS.has(action) &&
936
+ t - state.since >= UI_REPEAT.delay &&
937
+ t - state.last >= UI_REPEAT.interval
938
+ ) {
939
+ state.last = t;
940
+ if (!suspended) fire(action, { source: 'gamepad', repeat: true });
941
+ }
942
+ }
943
+ for (const action of [...held.keys()]) if (!active.has(action)) held.delete(action);
944
+ };
945
+
946
+ const loop = (): void => {
947
+ if (destroyed || !schedule) return;
948
+ poll();
949
+ schedule(loop);
950
+ };
951
+ const startPolling = (): void => {
952
+ if (polling || !schedule) return;
953
+ polling = true;
954
+ schedule(loop);
955
+ };
956
+
957
+ target.addEventListener('keydown', onKey, { capture });
958
+ target.addEventListener('gamepadconnected', startPolling);
959
+ if (gamepads().some(Boolean)) startPolling();
960
+
961
+ return {
962
+ on(listener) {
963
+ listeners.add(listener);
964
+ return () => listeners.delete(listener);
965
+ },
966
+ suspend() {
967
+ suspended = true;
968
+ },
969
+ resume() {
970
+ suspended = false;
971
+ },
972
+ get suspended() {
973
+ return suspended;
974
+ },
975
+ poll,
976
+ destroy() {
977
+ destroyed = true;
978
+ listeners.clear();
979
+ held.clear();
980
+ target.removeEventListener('keydown', onKey, { capture });
981
+ target.removeEventListener('gamepadconnected', startPolling);
982
+ },
983
+ };
984
+ }
985
+
986
+ /** Anything with a layout box (an `Element`, or a test double). */
987
+ export interface UiFocusable {
988
+ getBoundingClientRect(): { left: number; top: number; width: number; height: number };
989
+ }
990
+
991
+ /**
992
+ * Spatial navigation: the candidate a direction leads to from `from`, or null.
993
+ *
994
+ * Only candidates whose centre lies ahead in that direction count; among them the
995
+ * nearest wins, with sideways distance weighted double so "down" prefers the item
996
+ * straight below over a closer one off to the side.
997
+ */
998
+ export function nextFocus<T extends UiFocusable>(
999
+ from: UiFocusable,
1000
+ candidates: Iterable<T>,
1001
+ direction: UiDirection,
1002
+ ): T | null {
1003
+ const centre = (el: UiFocusable) => {
1004
+ const r = el.getBoundingClientRect();
1005
+ return { x: r.left + r.width / 2, y: r.top + r.height / 2 };
1006
+ };
1007
+ const origin = centre(from);
1008
+ let best: T | null = null;
1009
+ let bestScore = Infinity;
1010
+ for (const candidate of candidates) {
1011
+ if ((candidate as UiFocusable) === from) continue;
1012
+ const c = centre(candidate);
1013
+ const dx = c.x - origin.x;
1014
+ const dy = c.y - origin.y;
1015
+ const ahead = direction === 'up' ? -dy : direction === 'down' ? dy : direction === 'left' ? -dx : dx;
1016
+ if (ahead <= 0.5) continue;
1017
+ const side = direction === 'up' || direction === 'down' ? Math.abs(dx) : Math.abs(dy);
1018
+ const score = ahead + side * 2;
1019
+ if (score < bestScore) {
1020
+ bestScore = score;
1021
+ best = candidate;
1022
+ }
1023
+ }
1024
+ return best;
1025
+ }
1026
+
1027
+ /**
1028
+ * The look every menu shares, as CSS custom properties: the focus ring, radii, type
1029
+ * faces, colours and spacing. Apps read them with `var(--wg-…)`; {@link uiTokensCss}
1030
+ * writes them into a stylesheet.
1031
+ */
1032
+ export const UI_TOKENS: Readonly<Record<string, string>> = Object.freeze({
1033
+ '--wg-bg': '#07080c',
1034
+ '--wg-surface': 'rgb(18 20 28 / 0.78)',
1035
+ '--wg-line': 'rgb(255 255 255 / 0.12)',
1036
+ '--wg-text': '#f4f6fb',
1037
+ '--wg-muted': '#8e97a9',
1038
+ '--wg-ok': '#4ade80',
1039
+ '--wg-danger': '#f87171',
1040
+ '--wg-focus': '#ffffff',
1041
+ '--wg-focus-ring': '0 0 0 3px #ffffff',
1042
+ '--wg-radius': '22px',
1043
+ '--wg-radius-small': '12px',
1044
+ '--wg-gap': '16px',
1045
+ '--wg-font-display': "'Unbounded Variable', 'Unbounded', system-ui, sans-serif",
1046
+ '--wg-font-ui': "'Inter Variable', 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif",
1047
+ '--wg-ease': 'cubic-bezier(0.2, 0.8, 0.2, 1)',
1048
+ '--wg-safe-top': 'env(safe-area-inset-top, 0px)',
1049
+ '--wg-safe-bottom': 'env(safe-area-inset-bottom, 0px)',
1050
+ });
1051
+
1052
+ /** `UI_TOKENS` as a CSS rule, e.g. for a `<style>` an app injects. */
1053
+ export function uiTokensCss(selector = ':root'): string {
1054
+ const body = Object.entries(UI_TOKENS)
1055
+ .map(([name, value]) => ` ${name}: ${value};`)
1056
+ .join('\n');
1057
+ return `${selector} {\n${body}\n}\n`;
1058
+ }
1059
+
1060
+ // ============================================================================
1061
+ // ---- The engine app: the screen an engine ships next to its SDK ----
1062
+ // ============================================================================
1063
+
1064
+ /** What the host (the launcher's route page) hands an engine app. */
1065
+ export interface EngineAppHost {
1066
+ /** The game being played, as the host's catalog describes it. */
1067
+ game: {
1068
+ slug: string;
1069
+ title: string;
1070
+ accent?: string;
1071
+ art?: string;
1072
+ };
1073
+ /** Pass to the SDK's `storage({ namespace })`; the engine prefixes its own id. */
1074
+ storage: { namespace: string };
1075
+ /** The game's files, each read only when the engine asks (keyed by the SDK's asset names). */
1076
+ assets: Record<string, () => Promise<Uint8Array>>;
1077
+ /** The shared input; the app suspends it while the game itself has the controls. */
1078
+ input: UiInput;
1079
+ /** Leave: the host navigates back (to its library or home). Call after `unmount()` work is done. */
1080
+ exit(): void;
1081
+ }
1082
+
1083
+ /** What `mount()` returns: the way to take the app down. */
1084
+ export interface EngineAppHandle {
1085
+ unmount(): Promise<void>;
1086
+ }
1087
+
1088
+ /**
1089
+ * An engine app module (`<id>/app/app.js`): mounts the engine's own screens — start
1090
+ * / load game, pause, options — into `target` and runs the game, following UX.md.
1091
+ */
1092
+ export interface EngineApp {
1093
+ mount(target: HTMLElement, host: EngineAppHost): Promise<EngineAppHandle>;
1094
+ }