@almadar/shell-web 1.0.0 → 1.1.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 (70) hide show
  1. package/dist/AvlGlyph-PIXU6QH5.js +5 -0
  2. package/dist/AvlStateMachine-CKGMECMG.js +8 -0
  3. package/dist/{AvlTransitionDetail-63SD6GZF.js → AvlTransitionDetail-QZX6G5KJ.js} +4 -5
  4. package/dist/AvlTransitionExplainer-26WLEIC6.js +11 -0
  5. package/dist/BehaviorView-JLZ4PKWY.js +10 -0
  6. package/dist/{FileTree-BCFnBEuQ.d.ts → FileTree-B3GDAjaQ.d.ts} +131 -4
  7. package/dist/{FlowCanvas-AUMTWMNG.js → FlowCanvas-RPII4V24.js} +10 -13
  8. package/dist/{FlowCanvas-3JRMNJLV.css → FlowCanvas-VWUPMBKB.css} +189 -191
  9. package/dist/{GameAudioProvider-ceM_n0ey.d.ts → GameAudioProvider-D7wo5ryN.d.ts} +1 -1
  10. package/dist/{KernelEngineContext-CcxGYtlr.d.ts → KernelEngineContext-CPeWQMAz.d.ts} +15 -2
  11. package/dist/ModuleCard-NJD6JQGD.js +6 -0
  12. package/dist/{OrbInspector-QCPEPUPH.js → OrbInspector-OWWKPOBF.js} +10 -13
  13. package/dist/{OrbInspector-MHLJ6OEE.css → OrbInspector-VMTMZHNQ.css} +189 -191
  14. package/dist/{Select-B-iDdnvE.d.ts → Select-C2Uq6t86.d.ts} +1 -1
  15. package/dist/{UISlotRenderer-KVFO6J7R.css → UISlotRenderer-BIS6KT7T.css} +189 -191
  16. package/dist/{UISlotRenderer-C7WWOK43.js → UISlotRenderer-PY7FIJXN.js} +10 -13
  17. package/dist/avl/index.css +189 -191
  18. package/dist/avl/index.d.ts +19 -7
  19. package/dist/avl/index.js +157 -26
  20. package/dist/{chunk-TUPZWTRE.js → chunk-2WGR4TDJ.js} +464 -35
  21. package/dist/{chunk-SP5CDJ6K.js → chunk-4YJ53G7S.js} +3 -3
  22. package/dist/{chunk-HH5KSMH5.js → chunk-7N6ZPHQ5.js} +1 -1
  23. package/dist/{chunk-CPLN6NBQ.js → chunk-AGVSO4WY.js} +2 -3
  24. package/dist/{chunk-UXLE3IPR.js → chunk-FAKU5F62.js} +205 -4
  25. package/dist/{chunk-TXAUOLWZ.js → chunk-M74BCDBQ.js} +1 -1
  26. package/dist/{chunk-LHP2TK7O.js → chunk-MS4K3K2R.js} +2908 -4574
  27. package/dist/{chunk-K4MOPSEL.js → chunk-OWNG4JZI.js} +3 -4
  28. package/dist/{chunk-AB3X7QTE.js → chunk-PRLHKBXG.js} +1 -2
  29. package/dist/{chunk-X3DMMX27.js → chunk-VHC2M26B.js} +1 -1
  30. package/dist/{chunk-E6KA4J6N.js → chunk-VUIACGDU.js} +3 -4
  31. package/dist/{chunk-ROICKAU7.js → chunk-YYIHRIDH.js} +1 -1
  32. package/dist/{chunk-3VZ36ZKO.js → chunk-ZDRDJKYB.js} +5 -2
  33. package/dist/components/index.css +189 -191
  34. package/dist/components/index.d.ts +417 -173
  35. package/dist/components/index.js +14 -17
  36. package/dist/core.d.ts +3 -3
  37. package/dist/{fx-CmQjnHmT.d.ts → fx-Br8zjvu9.d.ts} +6 -6
  38. package/dist/index.d.ts +4 -0
  39. package/dist/index.js +2 -2
  40. package/dist/{kernel-client-TZKGHJRY.js → kernel-client-JW6OH5FX.js} +24 -3
  41. package/dist/{kernel-wire-wNdAPfhJ.d.ts → kernel-wire-DGAySGhX.d.ts} +7 -0
  42. package/dist/lib/index.d.ts +2 -3
  43. package/dist/lib/index.js +2 -3
  44. package/dist/providers/index.css +189 -191
  45. package/dist/providers/index.d.ts +6 -8
  46. package/dist/providers/index.js +10 -14
  47. package/dist/runtime/index.css +189 -191
  48. package/dist/runtime/index.d.ts +6 -1
  49. package/dist/runtime/index.js +10 -13
  50. package/dist/test-support.js +2 -2
  51. package/dist/{paintDispatch-CuJLsr9Y.d.ts → verificationRegistry-oopV1J1n.d.ts} +127 -15
  52. package/package.json +8 -36
  53. package/dist/AvlGlyph-EPJKFEO3.js +0 -6
  54. package/dist/AvlStateMachine-RKZIKNGC.js +0 -9
  55. package/dist/AvlTransitionExplainer-ZBTLOM3T.js +0 -12
  56. package/dist/BehaviorView-YS5G4GNB.js +0 -11
  57. package/dist/Canvas3DHost-BkZQB5l2.d.ts +0 -552
  58. package/dist/ModuleCard-QHDGK5XK.js +0 -7
  59. package/dist/avl-3d-context-BycmO6tG.d.ts +0 -201
  60. package/dist/avl-schema-parser-CtJxJ9KU.d.ts +0 -132
  61. package/dist/avl-zoom-state-CKMVuBFg.d.ts +0 -17
  62. package/dist/chunk-4T3P43NS.js +0 -1133
  63. package/dist/chunk-DZBQA2OW.js +0 -176
  64. package/dist/chunk-EOWMARUB.js +0 -16
  65. package/dist/chunk-GFXCPUMX.js +0 -1334
  66. package/dist/chunk-ILZ7ORX7.js +0 -432
  67. package/dist/three/index.css +0 -503
  68. package/dist/three/index.d.ts +0 -1185
  69. package/dist/three/index.js +0 -3908
  70. package/dist/verificationRegistry-CVrcxG1s.d.ts +0 -122
@@ -0,0 +1,5 @@
1
+ export { AVL_GLYPH_KINDS, AvlGlyph } from './chunk-AGVSO4WY.js';
2
+ import './chunk-7N6ZPHQ5.js';
3
+ import './chunk-FAKU5F62.js';
4
+ import './chunk-4YXBKHHM.js';
5
+ import './chunk-G7DCAZ22.js';
@@ -0,0 +1,8 @@
1
+ export { AvlStateMachine, BODY_CHAR, MARGIN, MAX_SCALE, MIN_SCALE, MONO_CHAR, PILL_H, metricsFor, pillWidth } from './chunk-4YJ53G7S.js';
2
+ import './chunk-M74BCDBQ.js';
3
+ import './chunk-PCR37T3U.js';
4
+ import './chunk-PRLHKBXG.js';
5
+ import './chunk-FAKU5F62.js';
6
+ import './chunk-TZZBINQY.js';
7
+ import './chunk-4YXBKHHM.js';
8
+ import './chunk-G7DCAZ22.js';
@@ -1,11 +1,10 @@
1
- export { AvlTransitionDetail } from './chunk-K4MOPSEL.js';
1
+ export { AvlTransitionDetail } from './chunk-OWNG4JZI.js';
2
2
  import './chunk-ILQXJ2AR.js';
3
3
  import './chunk-REXYVBUO.js';
4
4
  import './chunk-AGXD77SL.js';
5
- import './chunk-TXAUOLWZ.js';
6
- import './chunk-AB3X7QTE.js';
7
- import './chunk-DZBQA2OW.js';
5
+ import './chunk-M74BCDBQ.js';
8
6
  import './chunk-PCR37T3U.js';
9
- import './chunk-UXLE3IPR.js';
7
+ import './chunk-PRLHKBXG.js';
8
+ import './chunk-FAKU5F62.js';
10
9
  import './chunk-4YXBKHHM.js';
11
10
  import './chunk-G7DCAZ22.js';
@@ -0,0 +1,11 @@
1
+ export { AvlTransitionExplainer } from './chunk-VHC2M26B.js';
2
+ import './chunk-OWNG4JZI.js';
3
+ import './chunk-ILQXJ2AR.js';
4
+ import './chunk-REXYVBUO.js';
5
+ import './chunk-AGXD77SL.js';
6
+ import './chunk-M74BCDBQ.js';
7
+ import './chunk-PCR37T3U.js';
8
+ import './chunk-PRLHKBXG.js';
9
+ import './chunk-FAKU5F62.js';
10
+ import './chunk-4YXBKHHM.js';
11
+ import './chunk-G7DCAZ22.js';
@@ -0,0 +1,10 @@
1
+ export { BehaviorView } from './chunk-YYIHRIDH.js';
2
+ import './chunk-4YJ53G7S.js';
3
+ import './chunk-AGXD77SL.js';
4
+ import './chunk-M74BCDBQ.js';
5
+ import './chunk-PCR37T3U.js';
6
+ import './chunk-PRLHKBXG.js';
7
+ import './chunk-FAKU5F62.js';
8
+ import './chunk-TZZBINQY.js';
9
+ import './chunk-4YXBKHHM.js';
10
+ import './chunk-G7DCAZ22.js';
@@ -1,8 +1,135 @@
1
1
  import React__default from 'react';
2
- import { A11yProps, EventEmit, JsonObject, EntityPersistence, OrbitalSchema } from '@almadar/core';
3
- import { T as TraitLevelData, F as FieldInfo, O as OrbitalTraitInfo, a as OrbitalPageInfo, E as ExternalLink } from './avl-schema-parser-CtJxJ9KU.js';
2
+ import { EntityPersistence, JsonObject, SExpr, OrbitalSchema, Trait, A11yProps, EventEmit } from '@almadar/core';
4
3
  import { Node, Edge } from '@xyflow/react';
5
4
 
5
+ /**
6
+ * AVL Schema Parser
7
+ *
8
+ * Pure functions that transform an OrbitalSchema into structured data
9
+ * for each zoom level of the Cosmic Zoom visualization.
10
+ *
11
+ * Imports all types from @almadar/core.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+
16
+ interface SerializedEffect extends JsonObject {
17
+ type: string;
18
+ args: SExpr[];
19
+ }
20
+ interface ApplicationOrbitalData {
21
+ name: string;
22
+ entityName: string;
23
+ fieldCount: number;
24
+ persistence: EntityPersistence;
25
+ traitNames: string[];
26
+ pageNames: string[];
27
+ position: {
28
+ x: number;
29
+ y: number;
30
+ };
31
+ }
32
+ interface CrossLink {
33
+ emitterOrbital: string;
34
+ listenerOrbital: string;
35
+ eventName: string;
36
+ emitterTrait: string;
37
+ listenerTrait: string;
38
+ }
39
+ interface ApplicationLevelData {
40
+ orbitals: ApplicationOrbitalData[];
41
+ crossLinks: CrossLink[];
42
+ }
43
+ interface FieldInfo extends JsonObject {
44
+ name: string;
45
+ type: string;
46
+ required: boolean;
47
+ hasDefault: boolean;
48
+ }
49
+ interface OrbitalTraitInfo extends JsonObject {
50
+ name: string;
51
+ stateCount: number;
52
+ eventCount: number;
53
+ transitionCount: number;
54
+ emits: string[];
55
+ listens: string[];
56
+ }
57
+ interface OrbitalPageInfo extends JsonObject {
58
+ name: string;
59
+ route: string;
60
+ }
61
+ interface ExternalLink extends JsonObject {
62
+ targetOrbital: string;
63
+ eventName: string;
64
+ direction: string;
65
+ traitName: string;
66
+ }
67
+ interface OrbitalLevelData {
68
+ name: string;
69
+ entity: {
70
+ name: string;
71
+ fields: FieldInfo[];
72
+ persistence: EntityPersistence;
73
+ };
74
+ traits: OrbitalTraitInfo[];
75
+ pages: OrbitalPageInfo[];
76
+ externalLinks: ExternalLink[];
77
+ }
78
+ interface TraitStateInfo extends JsonObject {
79
+ name: string;
80
+ isInitial: boolean | null;
81
+ isTerminal: boolean | null;
82
+ }
83
+ interface TraitTransitionInfo extends JsonObject {
84
+ from: string;
85
+ to: string;
86
+ event: string;
87
+ /** `.orb` config data omits the key instead of carrying null. */
88
+ guard: SExpr | null;
89
+ effects: SerializedEffect[];
90
+ index: number;
91
+ }
92
+ interface TraitLevelData extends JsonObject {
93
+ name: string;
94
+ linkedEntity: string;
95
+ states: TraitStateInfo[];
96
+ transitions: TraitTransitionInfo[];
97
+ emittedEvents: string[];
98
+ listenedEvents: string[];
99
+ }
100
+ interface ExprTreeNode {
101
+ label: string;
102
+ type: 'operator' | 'literal' | 'binding';
103
+ children?: ExprTreeNode[];
104
+ }
105
+ interface SlotTarget {
106
+ name: string;
107
+ pattern: string;
108
+ }
109
+ interface TransitionLevelData {
110
+ from: string;
111
+ to: string;
112
+ event: string;
113
+ guard: ExprTreeNode | null;
114
+ effects: ExprTreeNode[];
115
+ slotTargets: SlotTarget[];
116
+ }
117
+ /**
118
+ * Parse the application-level view: all orbitals with cross-orbital links.
119
+ */
120
+ declare function parseApplicationLevel(schema: OrbitalSchema): ApplicationLevelData;
121
+ /**
122
+ * Parse a single orbital's detail view.
123
+ */
124
+ declare function parseOrbitalLevel(schema: OrbitalSchema, orbitalName: string): OrbitalLevelData | null;
125
+ declare function parseTraitLevel(schema: OrbitalSchema, orbitalName: string, traitName: string): TraitLevelData | null;
126
+ /** One trait's state machine as AVL trait data; null when the trait has no state machine. */
127
+ declare function traitLevelFromTrait(trait: Trait, linkedEntity: string): TraitLevelData | null;
128
+ /**
129
+ * Parse a single transition for the detail view.
130
+ */
131
+ declare function parseTransitionLevel(schema: OrbitalSchema, orbitalName: string, traitName: string, transitionIndex: number): TransitionLevelData | null;
132
+
6
133
  /**
7
134
  * Author-supplied explanations for AVL diagrams: a note per state, per
8
135
  * transition event and per effect type, shown in a popover on hover/focus.
@@ -250,5 +377,5 @@ interface FileTreeProps extends Omit<React__default.AriaAttributes, keyof A11yPr
250
377
  }
251
378
  declare const FileTree: React__default.FC<FileTreeProps>;
252
379
 
253
- export { BehaviorView as B, ModuleCard as M, AvlStateMachine as d, FileTree as g, schemaToFlowGraph as s };
254
- export type { AvlAnnotations as A, FileTreeItem as F, AvlNodeData as a, AvlNote as b, AvlEdgeData as c, AvlStateMachineProps as e, BehaviorViewProps as f, FileTreeNode as h, FileTreeProps as i, ModuleCardProps as j };
380
+ export { BehaviorView as B, ModuleCard as M, AvlStateMachine as g, parseOrbitalLevel as i, parseTraitLevel as j, parseTransitionLevel as k, FileTree as m, parseApplicationLevel as p, schemaToFlowGraph as s, traitLevelFromTrait as t };
381
+ export type { AvlAnnotations as A, CrossLink as C, FileTreeItem as F, OrbitalLevelData as O, SerializedEffect as S, TraitLevelData as T, AvlNodeData as a, TraitTransitionInfo as b, TransitionLevelData as c, AvlNote as d, ApplicationLevelData as e, AvlEdgeData as f, AvlStateMachineProps as h, BehaviorViewProps as l, FileTreeNode as n, FileTreeProps as o, ModuleCardProps as q };
@@ -1,20 +1,17 @@
1
- export { FlowCanvas } from './chunk-LHP2TK7O.js';
1
+ export { FlowCanvas } from './chunk-MS4K3K2R.js';
2
2
  import './chunk-57DC34LY.js';
3
- import './chunk-SP5CDJ6K.js';
4
- import './chunk-CPLN6NBQ.js';
5
- import './chunk-HH5KSMH5.js';
3
+ import './chunk-4YJ53G7S.js';
4
+ import './chunk-AGVSO4WY.js';
5
+ import './chunk-7N6ZPHQ5.js';
6
6
  import './chunk-REXYVBUO.js';
7
7
  import './chunk-AGXD77SL.js';
8
- import './chunk-TXAUOLWZ.js';
9
- import './chunk-AB3X7QTE.js';
10
- import './chunk-DZBQA2OW.js';
11
- import './chunk-TUPZWTRE.js';
12
- import './chunk-TZZBINQY.js';
13
- import './chunk-4T3P43NS.js';
8
+ import './chunk-M74BCDBQ.js';
14
9
  import './chunk-PCR37T3U.js';
15
- import './chunk-UXLE3IPR.js';
16
- import './chunk-ILZ7ORX7.js';
17
- import './chunk-3VZ36ZKO.js';
10
+ import './chunk-PRLHKBXG.js';
11
+ import './chunk-FAKU5F62.js';
12
+ import './chunk-2WGR4TDJ.js';
13
+ import './chunk-TZZBINQY.js';
14
+ import './chunk-ZDRDJKYB.js';
18
15
  import './chunk-PRXQGGCO.js';
19
16
  import './chunk-VO2TTLS5.js';
20
17
  import './chunk-AE7VCQB6.js';
@@ -1160,7 +1160,195 @@ body {
1160
1160
  counter-reset: katexEqnNo mmlEqnNo;
1161
1161
  }
1162
1162
 
1163
- /* src/lib/drawable/three/Canvas3DLoadingState.css */
1163
+ /* src/lib/drawable/orbital/OrbitalCanvas3D.css */
1164
+ .game-canvas-3d {
1165
+ background: #1a1a2e;
1166
+ border-radius: 8px;
1167
+ }
1168
+ .game-canvas-3d canvas {
1169
+ display: block;
1170
+ width: 100%;
1171
+ height: 100%;
1172
+ }
1173
+ .game-canvas-3d--loading {
1174
+ display: flex;
1175
+ align-items: center;
1176
+ justify-content: center;
1177
+ background:
1178
+ linear-gradient(
1179
+ 135deg,
1180
+ #1a1a2e 0%,
1181
+ #16213e 100%);
1182
+ }
1183
+ .game-canvas-3d__loading {
1184
+ padding: 20px 40px;
1185
+ background: rgba(255, 255, 255, 0.1);
1186
+ border-radius: 8px;
1187
+ color: #ffffff;
1188
+ font-size: 16px;
1189
+ animation: pulse 1.5s ease-in-out infinite;
1190
+ }
1191
+ .game-canvas-3d--error {
1192
+ display: flex;
1193
+ align-items: center;
1194
+ justify-content: center;
1195
+ background:
1196
+ linear-gradient(
1197
+ 135deg,
1198
+ #2e1a1a 0%,
1199
+ #3e1616 100%);
1200
+ }
1201
+ .game-canvas-3d__error {
1202
+ position: relative;
1203
+ z-index: 1;
1204
+ padding: 20px 40px;
1205
+ background: rgba(255, 0, 0, 0.2);
1206
+ border: 1px solid rgba(255, 0, 0, 0.3);
1207
+ border-radius: 8px;
1208
+ color: #ff6b6b;
1209
+ font-size: 14px;
1210
+ }
1211
+ .game-canvas-3d__coordinates {
1212
+ position: absolute;
1213
+ bottom: 20px;
1214
+ left: 20px;
1215
+ padding: 8px 16px;
1216
+ background: rgba(0, 0, 0, 0.7);
1217
+ border-radius: 4px;
1218
+ color: #ffffff;
1219
+ font-family: monospace;
1220
+ font-size: 12px;
1221
+ pointer-events: none;
1222
+ z-index: 10;
1223
+ }
1224
+ .game-canvas-3d__tile-info {
1225
+ position: absolute;
1226
+ top: 20px;
1227
+ left: 20px;
1228
+ padding: 12px 16px;
1229
+ background: rgba(0, 0, 0, 0.8);
1230
+ border-radius: 6px;
1231
+ color: #ffffff;
1232
+ pointer-events: none;
1233
+ z-index: 10;
1234
+ min-width: 120px;
1235
+ }
1236
+ .tile-info__type {
1237
+ font-weight: 600;
1238
+ font-size: 14px;
1239
+ text-transform: capitalize;
1240
+ margin-bottom: 4px;
1241
+ }
1242
+ .tile-info__terrain {
1243
+ font-size: 12px;
1244
+ color: #aaaaaa;
1245
+ }
1246
+ @keyframes pulse {
1247
+ 0%, 100% {
1248
+ opacity: 1;
1249
+ }
1250
+ 50% {
1251
+ opacity: 0.5;
1252
+ }
1253
+ }
1254
+ .game-canvas-3d[data-camera-mode=isometric]::before {
1255
+ content: "Isometric";
1256
+ position: absolute;
1257
+ top: 20px;
1258
+ right: 20px;
1259
+ padding: 6px 12px;
1260
+ background: rgba(0, 0, 0, 0.6);
1261
+ border-radius: 4px;
1262
+ color: #ffffff;
1263
+ font-size: 11px;
1264
+ text-transform: uppercase;
1265
+ letter-spacing: 1px;
1266
+ pointer-events: none;
1267
+ }
1268
+ .game-canvas-3d[data-camera-mode=perspective]::before {
1269
+ content: "Perspective";
1270
+ position: absolute;
1271
+ top: 20px;
1272
+ right: 20px;
1273
+ padding: 6px 12px;
1274
+ background: rgba(0, 0, 0, 0.6);
1275
+ border-radius: 4px;
1276
+ color: #ffffff;
1277
+ font-size: 11px;
1278
+ text-transform: uppercase;
1279
+ letter-spacing: 1px;
1280
+ pointer-events: none;
1281
+ }
1282
+ .game-canvas-3d[data-camera-mode=top-down]::before {
1283
+ content: "Top Down";
1284
+ position: absolute;
1285
+ top: 20px;
1286
+ right: 20px;
1287
+ padding: 6px 12px;
1288
+ background: rgba(0, 0, 0, 0.6);
1289
+ border-radius: 4px;
1290
+ color: #ffffff;
1291
+ font-size: 11px;
1292
+ text-transform: uppercase;
1293
+ letter-spacing: 1px;
1294
+ pointer-events: none;
1295
+ }
1296
+ .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__coordinates,
1297
+ .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__tile-info,
1298
+ .game-canvas-3d[data-overlay=hidden]::before {
1299
+ display: none;
1300
+ }
1301
+ .game-canvas-3d[data-orientation=rotated] {
1302
+ }
1303
+ .game-canvas-3d canvas {
1304
+ cursor: crosshair;
1305
+ }
1306
+ .game-canvas-3d canvas:active {
1307
+ cursor: grabbing;
1308
+ }
1309
+ @media (max-width: 768px) {
1310
+ .game-canvas-3d__coordinates,
1311
+ .game-canvas-3d__tile-info {
1312
+ font-size: 10px;
1313
+ padding: 6px 10px;
1314
+ }
1315
+ .game-canvas-3d::before {
1316
+ font-size: 9px;
1317
+ padding: 4px 8px;
1318
+ }
1319
+ }
1320
+ .game-canvas-3d:focus {
1321
+ outline: 2px solid #4488ff;
1322
+ outline-offset: 2px;
1323
+ }
1324
+ .game-canvas-3d canvas {
1325
+ transition: opacity 0.3s ease;
1326
+ }
1327
+ .game-canvas-3d__context-menu {
1328
+ position: absolute;
1329
+ background: rgba(0, 0, 0, 0.9);
1330
+ border: 1px solid rgba(255, 255, 255, 0.1);
1331
+ border-radius: 6px;
1332
+ padding: 8px 0;
1333
+ min-width: 150px;
1334
+ z-index: 100;
1335
+ }
1336
+ .game-canvas-3d__context-menu-item {
1337
+ padding: 8px 16px;
1338
+ color: #ffffff;
1339
+ cursor: pointer;
1340
+ font-size: 13px;
1341
+ transition: background 0.15s ease;
1342
+ }
1343
+ .game-canvas-3d__context-menu-item:hover {
1344
+ background: rgba(255, 255, 255, 0.1);
1345
+ }
1346
+ .game-canvas-3d__context-menu-item--danger {
1347
+ color: #ff6b6b;
1348
+ }
1349
+ .game-canvas-3d__context-menu-item--danger:hover {
1350
+ background: rgba(255, 0, 0, 0.2);
1351
+ }
1164
1352
  .canvas-3d-loading {
1165
1353
  position: absolute;
1166
1354
  inset: 0;
@@ -1312,8 +1500,6 @@ body {
1312
1500
  font-size: 12px;
1313
1501
  }
1314
1502
  }
1315
-
1316
- /* src/lib/drawable/three/Canvas3DErrorBoundary.css */
1317
1503
  .canvas-3d-error {
1318
1504
  position: absolute;
1319
1505
  inset: 0;
@@ -1476,194 +1662,6 @@ body {
1476
1662
  }
1477
1663
  }
1478
1664
 
1479
- /* src/lib/drawable/three/Canvas3DHost.css */
1480
- .game-canvas-3d {
1481
- background: #1a1a2e;
1482
- border-radius: 8px;
1483
- }
1484
- .game-canvas-3d canvas {
1485
- display: block;
1486
- width: 100%;
1487
- height: 100%;
1488
- }
1489
- .game-canvas-3d--loading {
1490
- display: flex;
1491
- align-items: center;
1492
- justify-content: center;
1493
- background:
1494
- linear-gradient(
1495
- 135deg,
1496
- #1a1a2e 0%,
1497
- #16213e 100%);
1498
- }
1499
- .game-canvas-3d__loading {
1500
- padding: 20px 40px;
1501
- background: rgba(255, 255, 255, 0.1);
1502
- border-radius: 8px;
1503
- color: #ffffff;
1504
- font-size: 16px;
1505
- animation: pulse 1.5s ease-in-out infinite;
1506
- }
1507
- .game-canvas-3d--error {
1508
- display: flex;
1509
- align-items: center;
1510
- justify-content: center;
1511
- background:
1512
- linear-gradient(
1513
- 135deg,
1514
- #2e1a1a 0%,
1515
- #3e1616 100%);
1516
- }
1517
- .game-canvas-3d__error {
1518
- padding: 20px 40px;
1519
- background: rgba(255, 0, 0, 0.2);
1520
- border: 1px solid rgba(255, 0, 0, 0.3);
1521
- border-radius: 8px;
1522
- color: #ff6b6b;
1523
- font-size: 14px;
1524
- }
1525
- .game-canvas-3d__coordinates {
1526
- position: absolute;
1527
- bottom: 20px;
1528
- left: 20px;
1529
- padding: 8px 16px;
1530
- background: rgba(0, 0, 0, 0.7);
1531
- border-radius: 4px;
1532
- color: #ffffff;
1533
- font-family: monospace;
1534
- font-size: 12px;
1535
- pointer-events: none;
1536
- z-index: 10;
1537
- }
1538
- .game-canvas-3d__tile-info {
1539
- position: absolute;
1540
- top: 20px;
1541
- left: 20px;
1542
- padding: 12px 16px;
1543
- background: rgba(0, 0, 0, 0.8);
1544
- border-radius: 6px;
1545
- color: #ffffff;
1546
- pointer-events: none;
1547
- z-index: 10;
1548
- min-width: 120px;
1549
- }
1550
- .tile-info__type {
1551
- font-weight: 600;
1552
- font-size: 14px;
1553
- text-transform: capitalize;
1554
- margin-bottom: 4px;
1555
- }
1556
- .tile-info__terrain {
1557
- font-size: 12px;
1558
- color: #aaaaaa;
1559
- }
1560
- @keyframes pulse {
1561
- 0%, 100% {
1562
- opacity: 1;
1563
- }
1564
- 50% {
1565
- opacity: 0.5;
1566
- }
1567
- }
1568
- .game-canvas-3d[data-camera-mode=isometric]::before {
1569
- content: "Isometric";
1570
- position: absolute;
1571
- top: 20px;
1572
- right: 20px;
1573
- padding: 6px 12px;
1574
- background: rgba(0, 0, 0, 0.6);
1575
- border-radius: 4px;
1576
- color: #ffffff;
1577
- font-size: 11px;
1578
- text-transform: uppercase;
1579
- letter-spacing: 1px;
1580
- pointer-events: none;
1581
- }
1582
- .game-canvas-3d[data-camera-mode=perspective]::before {
1583
- content: "Perspective";
1584
- position: absolute;
1585
- top: 20px;
1586
- right: 20px;
1587
- padding: 6px 12px;
1588
- background: rgba(0, 0, 0, 0.6);
1589
- border-radius: 4px;
1590
- color: #ffffff;
1591
- font-size: 11px;
1592
- text-transform: uppercase;
1593
- letter-spacing: 1px;
1594
- pointer-events: none;
1595
- }
1596
- .game-canvas-3d[data-camera-mode=top-down]::before {
1597
- content: "Top Down";
1598
- position: absolute;
1599
- top: 20px;
1600
- right: 20px;
1601
- padding: 6px 12px;
1602
- background: rgba(0, 0, 0, 0.6);
1603
- border-radius: 4px;
1604
- color: #ffffff;
1605
- font-size: 11px;
1606
- text-transform: uppercase;
1607
- letter-spacing: 1px;
1608
- pointer-events: none;
1609
- }
1610
- .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__coordinates,
1611
- .game-canvas-3d[data-overlay=hidden] .game-canvas-3d__tile-info,
1612
- .game-canvas-3d[data-overlay=hidden]::before {
1613
- display: none;
1614
- }
1615
- .game-canvas-3d[data-orientation=rotated] {
1616
- }
1617
- .game-canvas-3d canvas {
1618
- cursor: crosshair;
1619
- }
1620
- .game-canvas-3d canvas:active {
1621
- cursor: grabbing;
1622
- }
1623
- @media (max-width: 768px) {
1624
- .game-canvas-3d__coordinates,
1625
- .game-canvas-3d__tile-info {
1626
- font-size: 10px;
1627
- padding: 6px 10px;
1628
- }
1629
- .game-canvas-3d::before {
1630
- font-size: 9px;
1631
- padding: 4px 8px;
1632
- }
1633
- }
1634
- .game-canvas-3d:focus {
1635
- outline: 2px solid #4488ff;
1636
- outline-offset: 2px;
1637
- }
1638
- .game-canvas-3d canvas {
1639
- transition: opacity 0.3s ease;
1640
- }
1641
- .game-canvas-3d__context-menu {
1642
- position: absolute;
1643
- background: rgba(0, 0, 0, 0.9);
1644
- border: 1px solid rgba(255, 255, 255, 0.1);
1645
- border-radius: 6px;
1646
- padding: 8px 0;
1647
- min-width: 150px;
1648
- z-index: 100;
1649
- }
1650
- .game-canvas-3d__context-menu-item {
1651
- padding: 8px 16px;
1652
- color: #ffffff;
1653
- cursor: pointer;
1654
- font-size: 13px;
1655
- transition: background 0.15s ease;
1656
- }
1657
- .game-canvas-3d__context-menu-item:hover {
1658
- background: rgba(255, 255, 255, 0.1);
1659
- }
1660
- .game-canvas-3d__context-menu-item--danger {
1661
- color: #ff6b6b;
1662
- }
1663
- .game-canvas-3d__context-menu-item--danger:hover {
1664
- background: rgba(255, 0, 0, 0.2);
1665
- }
1666
-
1667
1665
  /* src/components/core/organisms/debug/RuntimeDebugger.css */
1668
1666
  .runtime-debugger {
1669
1667
  font-family:
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import { AudioManifest } from '@almadar/core';
3
- import { U as UiError } from './fx-CmQjnHmT.js';
3
+ import { U as UiError } from './fx-Br8zjvu9.js';
4
4
  import './EventBusProvider-BFFHfN4O.js';
5
5
 
6
6
  /** Core owns the sound-manifest shape (`@almadar/core` `types/asset.ts`) so the
@@ -1,7 +1,8 @@
1
1
  import * as React$1 from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { K as KernelModule, a as KernelLoader } from './kernel-wire-wNdAPfhJ.js';
3
+ import { K as KernelModule, a as KernelLoader } from './kernel-wire-DGAySGhX.js';
4
4
  import { OsHostPort } from '@almadar/shell-runtime/kernel/os-port';
5
+ import { KernelGpuHost, KernelCanvas3DFactory, KernelSceneCanvasFactory } from '@almadar/shell-runtime/kernel/wire';
5
6
 
6
7
  /** Request the next frame; returns its cancel. `requestAnimationFrame` where the host has one. */
7
8
  type FrameScheduler = (callback: (nowMs: number) => void) => () => void;
@@ -13,6 +14,12 @@ interface KernelEngineValue {
13
14
  scheduleFrame?: FrameScheduler;
14
15
  /** The host's `os` port (`createFetchOsHost(fetch)`) every local-store kernel under the provider is opened with; absent, a program's `os` asks are denied. */
15
16
  os?: OsHostPort;
17
+ /** The host's GPU answerer (the kernel module's `GpuHost`), made once after the module loads and installed into every circuit kernel under the provider; absent, a `gpu/` ask answers `unsupported`. */
18
+ gpu?: () => KernelGpuHost;
19
+ /** Makes an orbital-canvas 3D view on a page canvas once the module has loaded; absent, a 3D canvas has no renderer. */
20
+ canvas3d?: KernelCanvas3DFactory;
21
+ /** Makes an orbital-canvas scene canvas (2D instruments, diagrams) on a page canvas once the module has loaded. */
22
+ sceneCanvas?: KernelSceneCanvasFactory;
16
23
  }
17
24
  declare const KernelEngineContext: React$1.Context<KernelEngineValue | null>;
18
25
  /** The kernel the nearest `KernelEngineProvider` supplies; `null` with none above. */
@@ -25,9 +32,15 @@ interface KernelEngineProviderProps {
25
32
  loader: KernelLoader;
26
33
  scheduleFrame?: FrameScheduler;
27
34
  os?: OsHostPort;
35
+ /** Makes the host's GPU answerer once the module has loaded (`() => new GpuHost()`). */
36
+ gpu?: () => KernelGpuHost;
37
+ /** Makes a 3D view on a page canvas (`(canvas) => Canvas3D.create(canvas)`). */
38
+ canvas3d?: KernelCanvas3DFactory;
39
+ /** Makes a scene canvas on a page canvas (`(canvas) => SceneCanvas.create(canvas)`). */
40
+ sceneCanvas?: KernelSceneCanvasFactory;
28
41
  children?: ReactNode;
29
42
  }
30
- declare function KernelEngineProvider({ loader, scheduleFrame, os, children }: KernelEngineProviderProps): React.ReactElement;
43
+ declare function KernelEngineProvider({ loader, scheduleFrame, os, gpu, canvas3d, sceneCanvas, children }: KernelEngineProviderProps): React.ReactElement;
31
44
 
32
45
  export { KernelEngineContext as a, KernelEngineProvider as b, KernelLoaderMissingError as d, useKernelEngine as u };
33
46
  export type { KernelEngineValue as K, KernelEngineProviderProps as c };
@@ -0,0 +1,6 @@
1
+ export { ModuleCard } from './chunk-VUIACGDU.js';
2
+ import './chunk-7N6ZPHQ5.js';
3
+ import './chunk-PRLHKBXG.js';
4
+ import './chunk-FAKU5F62.js';
5
+ import './chunk-4YXBKHHM.js';
6
+ import './chunk-G7DCAZ22.js';