@wasm-gaming/engine-specs 0.2.6 → 0.3.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.
Files changed (48) hide show
  1. package/README.md +63 -55
  2. package/demo/app.html +227 -0
  3. package/demo/canvas-renderer.js +153 -0
  4. package/demo/components/asset-picker.html +137 -0
  5. package/demo/components/call-log.html +33 -0
  6. package/demo/components/engine-header.html +78 -0
  7. package/demo/components/lifecycle-bar.html +69 -0
  8. package/demo/components/property-table.html +119 -0
  9. package/demo/demo.css +26 -130
  10. package/demo/demo.sdk.js +405 -203
  11. package/demo/index.html +7 -56
  12. package/demo/tsconfig.json +17 -0
  13. package/dist/engine-specs.d.ts +99 -0
  14. package/dist/engine-specs.d.ts.map +1 -0
  15. package/dist/engine-specs.js +3 -0
  16. package/dist/engine-specs.js.map +1 -0
  17. package/package.json +8 -12
  18. package/src/engine-specs.ts +110 -0
  19. package/demo/README.md +0 -155
  20. package/demo/checksums.js +0 -101
  21. package/demo/components/drop-area.html +0 -171
  22. package/demo/components/esc-menu.html +0 -540
  23. package/demo/components/launcher.html +0 -220
  24. package/demo/components/sdk-info.html +0 -54
  25. package/demo/demo.js +0 -622
  26. package/demo/sdk.js +0 -19
  27. package/demo/storage.js +0 -88
  28. package/dist/engine.d.ts +0 -78
  29. package/dist/engine.d.ts.map +0 -1
  30. package/dist/engine.js +0 -8
  31. package/dist/engine.js.map +0 -1
  32. package/dist/index.d.ts +0 -7
  33. package/dist/index.d.ts.map +0 -1
  34. package/dist/index.js +0 -9
  35. package/dist/index.js.map +0 -1
  36. package/dist/manifest.d.ts +0 -69
  37. package/dist/manifest.d.ts.map +0 -1
  38. package/dist/manifest.js +0 -8
  39. package/dist/manifest.js.map +0 -1
  40. package/dist/validate.d.ts +0 -10
  41. package/dist/validate.d.ts.map +0 -1
  42. package/dist/validate.js +0 -79
  43. package/dist/validate.js.map +0 -1
  44. package/schema/engine-manifest.schema.json +0 -74
  45. package/src/engine.ts +0 -88
  46. package/src/index.ts +0 -32
  47. package/src/manifest.ts +0 -82
  48. package/src/validate.ts +0 -92
@@ -1,220 +0,0 @@
1
- <form class="launcher" @submit.prevent="onLaunch">
2
- <section class="sdk">
3
- <CSdkInfo ...sdkInfo :messages="messages" />
4
- </section>
5
-
6
- <div class="drop-grid" :class.single="!showBIOS">
7
- <CDropArea
8
- :if="showBIOS"
9
- :prompt="requiresBIOS ? (messages.dropBiosPromptRequired || 'Drop BIOS File (Required)') : (messages.dropBiosPromptOptional || 'Drop BIOS File (Optional)')"
10
- :asset-hint="biosAssetHint || (requiresBIOS ? (messages.biosAssetHintRequired || 'required BIOS firmware file') : (messages.biosAssetHintOptional || 'optional BIOS firmware file'))"
11
- :accept="biosAccept"
12
- :button-text="messages.pickBiosButton || 'Pick BIOS'"
13
- :file-name="biosFile?.name"
14
- :messages="messages"
15
- @select="onBiosSelect"
16
- @remove="onBiosRemove"
17
- />
18
- <CDropArea
19
- :prompt="messages.dropRomPrompt || 'Drop ROM File'"
20
- :asset-hint="romAssetHint || messages.romAssetHint || 'or choose ROM file from computer'"
21
- :accept="romAccept"
22
- :button-text="messages.pickRomButton || 'Pick ROM'"
23
- :file-name="romFile?.name"
24
- :messages="messages"
25
- @select="onRomSelect"
26
- @remove="onRomRemove"
27
- />
28
- </div>
29
-
30
- <button type="submit" class="launch-btn" :disabled="!canLaunch">
31
- {{ messages.launchButton || 'Launch Engine' }}
32
- </button>
33
-
34
- <div class="status">{{ status }}</div>
35
- </form>
36
-
37
- <script :setup="{
38
- CSdkInfo,
39
- CDropArea,
40
- sdkInfo,
41
- initialRomFile = null,
42
- initialBiosFile = null,
43
- romAccept,
44
- romAssetHint,
45
- biosAccept,
46
- biosAssetHint,
47
- requiresBIOS = false,
48
- showBIOS = false,
49
- messages = {},
50
- }">
51
- let romFile = initialRomFile;
52
- let biosFile = initialBiosFile;
53
-
54
- let canLaunch = Boolean(romFile && (!requiresBIOS || biosFile));
55
- let status = "";
56
-
57
- const updateStatus = () => {
58
- canLaunch = Boolean(romFile && (!requiresBIOS || biosFile));
59
- if (requiresBIOS && !biosFile && !romFile) {
60
- status = messages.statusSelectBoth || "Ready - Please select ROM and BIOS files to launch.";
61
- } else if (requiresBIOS && !biosFile) {
62
- status = messages.statusBiosRequired || "BIOS file is required to launch.";
63
- } else if (!romFile) {
64
- status = messages.statusSelectRom || "Ready - Please select a ROM file to launch.";
65
- } else {
66
- const readyMsg = messages.statusReady || "Ready to launch!";
67
- status = `${readyMsg} (${romFile.name}${biosFile ? ' + BIOS' : ''})`;
68
- }
69
- };
70
-
71
- updateStatus();
72
-
73
- const extractFile = (arg) => {
74
- if (!arg) return null;
75
- if (arg instanceof File) return arg;
76
- if (arg.detail instanceof File) return arg.detail;
77
- if (arg.detail) return extractFile(arg.detail);
78
- return null;
79
- };
80
-
81
- const onRomSelect = (arg) => {
82
- const file = extractFile(arg);
83
- if (!file) {
84
- onRomRemove();
85
- return;
86
- }
87
- romFile = file;
88
- updateStatus();
89
- $emit("save:rom", file);
90
- };
91
-
92
- const onBiosSelect = (arg) => {
93
- const file = extractFile(arg);
94
- if (!file) {
95
- onBiosRemove();
96
- return;
97
- }
98
- biosFile = file;
99
- updateStatus();
100
- $emit("save:bios", file);
101
- };
102
-
103
- const onRomRemove = () => {
104
- romFile = null;
105
- updateStatus();
106
- $emit("remove:rom");
107
- };
108
-
109
- const onBiosRemove = () => {
110
- biosFile = null;
111
- updateStatus();
112
- $emit("remove:bios");
113
- };
114
-
115
- const onLaunch = async () => {
116
- if (!canLaunch) {
117
- updateStatus();
118
- return;
119
- }
120
- try {
121
- const launchingMsg = messages.launchingStatus || "Launching with";
122
- status = `${launchingMsg} ${romFile.name}...`;
123
- $emit("launch", { rom: romFile, bios: biosFile });
124
- } catch (error) {
125
- const message = error instanceof Error ? error.message : String(error);
126
- status = `Failed to load engine: ${message}`;
127
- }
128
- };
129
- </script>
130
-
131
- <style>
132
- form.launcher {
133
- width: min(740px, 100%);
134
- border: 1px solid var(--demo-panel-border, rgba(255, 255, 255, 0.4));
135
- border-radius: var(--demo-panel-radius, 12px);
136
- background: var(--demo-panel-bg, rgba(255, 255, 255, 0.25));
137
- box-shadow: var(--demo-panel-shadow, inset 0 0 0 1px rgba(255, 255, 255, 0.5));
138
- backdrop-filter: blur(var(--demo-panel-blur, 24px));
139
- -webkit-backdrop-filter: blur(var(--demo-panel-blur, 24px));
140
- padding: 1.5rem;
141
- display: grid;
142
- gap: 1.25rem;
143
- position: relative;
144
- overflow: hidden;
145
- }
146
-
147
- form.launcher::before {
148
- content: "";
149
- position: absolute;
150
- top: 0;
151
- right: 0;
152
- width: 60px;
153
- height: 60px;
154
- background: linear-gradient(135deg, transparent 50%, var(--demo-accent, #ff007f) 50%);
155
- opacity: 0.8;
156
- }
157
-
158
- .sdk {
159
- border: 1px solid var(--demo-subpanel-border, rgba(255, 255, 255, 0.3));
160
- border-radius: var(--demo-subpanel-radius, 8px);
161
- padding: 1.25rem;
162
- background: var(--demo-subpanel-bg, rgba(255, 255, 255, 0.35));
163
- backdrop-filter: blur(var(--demo-subpanel-blur, 12px));
164
- -webkit-backdrop-filter: blur(var(--demo-subpanel-blur, 12px));
165
- box-shadow: var(--demo-subpanel-shadow, inset 0 0 0 1px rgba(255, 255, 255, 0.6));
166
- }
167
-
168
- .drop-grid {
169
- display: grid;
170
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
171
- gap: 1rem;
172
- }
173
-
174
- .drop-grid.single {
175
- grid-template-columns: 1fr;
176
- }
177
-
178
- .launch-btn {
179
- width: 100%;
180
- padding: 0.9rem 1.5rem;
181
- font-size: 1.1rem;
182
- font-weight: 700;
183
- font-family: var(--demo-font-sans, sans-serif);
184
- text-transform: uppercase;
185
- letter-spacing: 0.08em;
186
- color: var(--demo-launch-text, #ffffff);
187
- background: var(--demo-launch-bg, var(--demo-accent, #ff007f));
188
- border: none;
189
- border-radius: var(--demo-subpanel-radius, 8px);
190
- cursor: pointer;
191
- transition: all 0.2s ease;
192
- box-shadow: var(--demo-accent-glow, 0 0 15px rgba(255, 0, 127, 0.3));
193
- }
194
-
195
- .launch-btn:hover:not(:disabled) {
196
- filter: brightness(1.1);
197
- transform: translateY(-1px);
198
- }
199
-
200
- .launch-btn:active:not(:disabled) {
201
- transform: translateY(0);
202
- }
203
-
204
- .launch-btn:disabled {
205
- opacity: 0.5;
206
- cursor: not-allowed;
207
- box-shadow: none;
208
- background: var(--demo-muted, #475569);
209
- }
210
-
211
- .status {
212
- min-height: 1.2rem;
213
- color: var(--demo-text, #0f172a);
214
- font-family: var(--demo-font-mono, monospace);
215
- font-size: 0.85rem;
216
- text-transform: uppercase;
217
- letter-spacing: 0.05em;
218
- opacity: 0.8;
219
- }
220
- </style>
@@ -1,54 +0,0 @@
1
- <h1>{{ name }} ({{ id }})</h1>
2
- <p>{{ description }}</p>
3
- <div class="row">
4
- <span class="pill">{{ (messages.versionPrefix || 'Version ') + version }}</span>
5
- <span class="pill">{{ baseWidth }}x{{ baseHeight }}</span>
6
- <span class="pill">{{ (messages.assetKeyPrefix || 'Asset key: ') + assetKey }}</span>
7
- </div>
8
-
9
- <script :setup="{
10
- name,
11
- id,
12
- description,
13
- version,
14
- baseWidth,
15
- baseHeight,
16
- assetKey,
17
- messages = {},
18
- }">
19
- </script>
20
-
21
- <style>
22
- h1 {
23
- margin: 0 0 0.4rem;
24
- font-size: 1.4rem;
25
- font-weight: 800;
26
- color: var(--demo-text, var(--text, #0f172a));
27
- letter-spacing: 0.05em;
28
- }
29
-
30
- p {
31
- margin: 0;
32
- color: var(--demo-muted, var(--muted, #475569));
33
- font-size: 0.95rem;
34
- }
35
-
36
- .row {
37
- margin-top: 0.9rem;
38
- display: flex;
39
- flex-wrap: wrap;
40
- gap: 0.6rem;
41
- }
42
-
43
- .pill {
44
- border: 1px solid var(--demo-pill-border, var(--demo-accent, var(--accent, #ff007f)));
45
- border-radius: 2px;
46
- padding: 0.3rem 0.75rem;
47
- font-family: var(--demo-font-mono, var(--font-mono, monospace));
48
- font-size: 0.8rem;
49
- color: var(--demo-pill-text, var(--demo-accent, var(--accent, #ff007f)));
50
- background: var(--demo-pill-bg, rgba(255, 0, 127, 0.1));
51
- box-shadow: var(--demo-pill-shadow, inset 0 0 5px rgba(255, 0, 127, 0.3));
52
- text-transform: uppercase;
53
- }
54
- </style>