@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 +19 -0
- package/demo/app.html +31 -13
- package/demo/components/asset-picker.html +33 -14
- package/demo/components/engine-header.html +17 -28
- package/demo/components/site-toolbar.html +31 -0
- package/demo/demo.css +22 -12
- package/demo/index.html +17 -0
- package/dist/engine-specs.d.ts +134 -0
- package/dist/engine-specs.d.ts.map +1 -1
- package/dist/engine-specs.js +264 -0
- package/dist/engine-specs.js.map +1 -1
- package/package.json +1 -1
- package/src/engine-specs.ts +379 -0
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
|
|
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
|
-
<
|
|
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
|
-
|
|
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
|
-
<
|
|
17
|
-
|
|
18
|
-
|
|
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:
|
|
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.
|
|
103
|
+
margin: 0.15rem 0 0;
|
|
89
104
|
color: var(--muted, #64748b);
|
|
90
|
-
font-size: 0.
|
|
91
|
-
|
|
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.
|
|
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:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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.
|
|
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
|
-
</
|
|
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
|
-
|
|
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-
|
|
42
|
+
border-top: 1px solid var(--border, #e2e8f0);
|
|
37
43
|
background: var(--panel, #fff);
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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>
|
package/dist/engine-specs.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/engine-specs.js
CHANGED
|
@@ -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
|
package/dist/engine-specs.js.map
CHANGED
|
@@ -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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wasm-gaming/engine-specs",
|
|
3
|
-
"version": "0.
|
|
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",
|
package/src/engine-specs.ts
CHANGED
|
@@ -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
|
+
}
|