@almadar/shell-web 1.0.0 → 1.2.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 (109) hide show
  1. package/LICENSE +72 -0
  2. package/dist/AvlGlyph-KZMJDBEB.js +5 -0
  3. package/dist/AvlStateMachine-KVZMFHFU.js +8 -0
  4. package/dist/AvlTransitionDetail-7DVGV27I.js +10 -0
  5. package/dist/AvlTransitionExplainer-RMJ5LQLK.js +11 -0
  6. package/dist/BehaviorView-EYRPME67.js +10 -0
  7. package/dist/{FileTree-BCFnBEuQ.d.ts → FileTree-B3GDAjaQ.d.ts} +131 -4
  8. package/dist/FlowCanvas-J54627TC.js +23 -0
  9. package/dist/{FlowCanvas-3JRMNJLV.css → FlowCanvas-R4LL3KRI.css} +190 -192
  10. package/dist/{GameAudioProvider-ceM_n0ey.d.ts → GameAudioProvider-BgWOOYT3.d.ts} +15 -20
  11. package/dist/{KernelEngineContext-CcxGYtlr.d.ts → KernelEngineContext-BPx-q0iw.d.ts} +15 -2
  12. package/dist/{LayersPanel-M2LHWUFF.js → LayersPanel-PSXI4EHG.js} +4 -4
  13. package/dist/ModuleCard-TNRLL45H.js +6 -0
  14. package/dist/{OrbInspector-MHLJ6OEE.css → OrbInspector-2EGVZLOJ.css} +190 -192
  15. package/dist/OrbInspector-UBEQWWZ2.js +23 -0
  16. package/dist/{parseLessonSegments-GpCeMrb2.d.ts → SegmentRenderer-BAQ6Jwf6.d.ts} +4 -20
  17. package/dist/{Select-B-iDdnvE.d.ts → Select-BJ8Fgc8A.d.ts} +1 -1
  18. package/dist/{UISlotContext-Dl_ewwCI.d.ts → UISlotContext-7r0SQdTL.d.ts} +1 -1
  19. package/dist/UISlotRenderer-5OURMAP2.js +23 -0
  20. package/dist/{UISlotRenderer-KVFO6J7R.css → UISlotRenderer-SJBSQGBQ.css} +190 -192
  21. package/dist/auth/react/index.js +7 -6
  22. package/dist/avl/index.css +190 -192
  23. package/dist/avl/index.d.ts +19 -7
  24. package/dist/avl/index.js +170 -39
  25. package/dist/{chunk-AE7VCQB6.js → chunk-2LNXLMK3.js} +2 -2
  26. package/dist/{chunk-REXYVBUO.js → chunk-3DA36FOA.js} +1 -1
  27. package/dist/{chunk-UXLE3IPR.js → chunk-3UQNFRYV.js} +207 -9
  28. package/dist/{chunk-AGXD77SL.js → chunk-3YUMGEEW.js} +1 -1
  29. package/dist/{chunk-K4MOPSEL.js → chunk-6RXP5ZXE.js} +7 -8
  30. package/dist/{chunk-E6KA4J6N.js → chunk-7UCL26QB.js} +4 -5
  31. package/dist/{chunk-57DC34LY.js → chunk-AL2XXMYR.js} +2 -2
  32. package/dist/{chunk-YHMRX6YA.js → chunk-ANTJUQRD.js} +53 -13
  33. package/dist/{chunk-P4ZFUQFF.js → chunk-AZ74UPG6.js} +4 -1
  34. package/dist/{chunk-ROICKAU7.js → chunk-B23EZH2P.js} +3 -3
  35. package/dist/{chunk-CPLN6NBQ.js → chunk-CCO2ZH7F.js} +3 -4
  36. package/dist/{chunk-4YXBKHHM.js → chunk-D5FJU4XC.js} +87 -16
  37. package/dist/{chunk-HH5KSMH5.js → chunk-DPDKBY6Z.js} +1 -1
  38. package/dist/{chunk-A2LR6VQQ.js → chunk-ECC3WQIB.js} +9 -93
  39. package/dist/{chunk-VO2TTLS5.js → chunk-GHAF7QUD.js} +1 -1
  40. package/dist/{chunk-TXAUOLWZ.js → chunk-HA2BYO5E.js} +1 -1
  41. package/dist/{chunk-ILQXJ2AR.js → chunk-JEN4EIUF.js} +1 -1
  42. package/dist/{chunk-UTDC2NEA.js → chunk-KTYOYEVA.js} +1 -1
  43. package/dist/{chunk-X3DMMX27.js → chunk-LINJRTNB.js} +2 -2
  44. package/dist/{chunk-TUPZWTRE.js → chunk-LKL5RULQ.js} +467 -141
  45. package/dist/{chunk-UU57VNS2.js → chunk-PWXZN5G5.js} +2 -2
  46. package/dist/{chunk-SP5CDJ6K.js → chunk-RDPELAFQ.js} +4 -4
  47. package/dist/{chunk-PRXQGGCO.js → chunk-S3LS3B7N.js} +1 -1
  48. package/dist/{chunk-LHP2TK7O.js → chunk-TAEOMNDK.js} +3611 -4737
  49. package/dist/{chunk-3S54FWRC.js → chunk-UFQLHCFJ.js} +1 -1
  50. package/dist/{chunk-AB3X7QTE.js → chunk-V5SVGUYN.js} +2 -3
  51. package/dist/{chunk-3VZ36ZKO.js → chunk-ZDRDJKYB.js} +5 -2
  52. package/dist/components/index.css +190 -192
  53. package/dist/components/index.d.ts +568 -190
  54. package/dist/components/index.js +27 -30
  55. package/dist/context/index.d.ts +2 -2
  56. package/dist/context/index.js +5 -5
  57. package/dist/core.d.ts +21 -4
  58. package/dist/core.js +1 -1
  59. package/dist/{fx-CmQjnHmT.d.ts → fx-Bx5RqplG.d.ts} +10 -7
  60. package/dist/hooks/index.d.ts +8 -8
  61. package/dist/hooks/index.js +6 -6
  62. package/dist/index.d.ts +4 -0
  63. package/dist/index.js +2 -2
  64. package/dist/{katexPlugin-FA7NX4PE.css → katexPlugin-BUHVNRBJ.css} +1 -1
  65. package/dist/{kernel-client-TZKGHJRY.js → kernel-client-NMZ56JVU.js} +60 -6
  66. package/dist/{kernel-wire-wNdAPfhJ.d.ts → kernel-wire-CRsHtLsf.d.ts} +8 -1
  67. package/dist/lib/index.d.ts +3 -4
  68. package/dist/lib/index.js +435 -4
  69. package/dist/providers/index.css +190 -192
  70. package/dist/providers/index.d.ts +6 -8
  71. package/dist/providers/index.js +21 -25
  72. package/dist/renderer/index.d.ts +3 -79
  73. package/dist/renderer/index.js +2 -2
  74. package/dist/runtime/index.css +190 -192
  75. package/dist/runtime/index.d.ts +9 -2
  76. package/dist/runtime/index.js +20 -23
  77. package/dist/ssr/index.cjs +105 -28
  78. package/dist/ssr/index.js +106 -29
  79. package/dist/test-support.js +2 -2
  80. package/dist/{useUISlots-CiobNFGb.d.ts → useUISlots-BLcGd__D.d.ts} +2 -0
  81. package/dist/{paintDispatch-CuJLsr9Y.d.ts → verificationRegistry-BLuQU1JV.d.ts} +127 -15
  82. package/package.json +10 -38
  83. package/src/core/locales/ar.json +10 -1
  84. package/src/core/locales/en.json +10 -1
  85. package/src/core/locales/sl.json +10 -1
  86. package/tailwind-preset.cjs +8 -4
  87. package/dist/AvlGlyph-EPJKFEO3.js +0 -6
  88. package/dist/AvlStateMachine-RKZIKNGC.js +0 -9
  89. package/dist/AvlTransitionDetail-63SD6GZF.js +0 -11
  90. package/dist/AvlTransitionExplainer-ZBTLOM3T.js +0 -12
  91. package/dist/BehaviorView-YS5G4GNB.js +0 -11
  92. package/dist/Canvas3DHost-BkZQB5l2.d.ts +0 -552
  93. package/dist/FlowCanvas-AUMTWMNG.js +0 -26
  94. package/dist/ModuleCard-QHDGK5XK.js +0 -7
  95. package/dist/OrbInspector-QCPEPUPH.js +0 -26
  96. package/dist/UISlotRenderer-C7WWOK43.js +0 -26
  97. package/dist/avl-3d-context-BycmO6tG.d.ts +0 -201
  98. package/dist/avl-schema-parser-CtJxJ9KU.d.ts +0 -132
  99. package/dist/avl-zoom-state-CKMVuBFg.d.ts +0 -17
  100. package/dist/chunk-4T3P43NS.js +0 -1133
  101. package/dist/chunk-DZBQA2OW.js +0 -176
  102. package/dist/chunk-EOWMARUB.js +0 -16
  103. package/dist/chunk-GFXCPUMX.js +0 -1334
  104. package/dist/chunk-ILZ7ORX7.js +0 -432
  105. package/dist/three/index.css +0 -503
  106. package/dist/three/index.d.ts +0 -1185
  107. package/dist/three/index.js +0 -3908
  108. package/dist/verificationRegistry-CVrcxG1s.d.ts +0 -122
  109. /package/dist/{katexPlugin-NCDKOOQY.js → katexPlugin-WGJ4JFZU.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
- import { AudioManifest } from '@almadar/core';
3
- import { U as UiError } from './fx-CmQjnHmT.js';
2
+ import { AudioPlay } from '@almadar/core';
3
+ import { U as UiError } from './fx-Bx5RqplG.js';
4
4
  import './EventBusProvider-BFFHfN4O.js';
5
5
 
6
6
  /** Core owns the sound-manifest shape (`@almadar/core` `types/asset.ts`) so the
@@ -8,32 +8,30 @@ import './EventBusProvider-BFFHfN4O.js';
8
8
  * declaration; re-exported here for the hook's existing consumers. */
9
9
 
10
10
  interface GameAudioControls {
11
- /** Play a sound effect (instant, pooled) */
12
- play: (key: string) => void;
11
+ /** Play a sound std-audio-cue already resolved */
12
+ playPlan: (plan: AudioPlay) => void;
13
+ /** Crossfade to a resolved track; an empty key fades out over `fadeMs` */
14
+ playMusicPlan: (plan: AudioPlay) => void;
13
15
  /** Stop all instances of a sound effect */
14
16
  stop: (key: string) => void;
15
17
  /** Stop all sounds including music */
16
18
  stopAll: () => void;
17
- /** Crossfade to a new music track */
18
- playMusic: (key: string) => void;
19
- /** Fade out and stop the current music */
20
- stopMusic: (fadeDurationMs?: number) => void;
19
+ /** Fade out over `fadeDurationMs` and stop the current music */
20
+ stopMusic: (fadeDurationMs: number) => void;
21
21
  muted: boolean;
22
22
  setMuted: (muted: boolean) => void;
23
23
  masterVolume: number;
24
24
  setMasterVolume: (volume: number) => void;
25
25
  }
26
26
  interface UseGameAudioOptions {
27
- /** Sound definitions keyed by logical name */
28
- manifest: AudioManifest;
29
- /** Prefix prepended to all `path` values (default '') */
30
- baseUrl?: string;
31
27
  /** Start muted (default false) */
32
28
  initialMuted?: boolean;
33
29
  /** Master volume 0–1 (default 1) */
34
30
  initialVolume?: number;
31
+ /** Resolved sounds to start on the first user gesture */
32
+ autostart?: AudioPlay[];
35
33
  }
36
- declare function useGameAudio({ manifest, baseUrl, initialMuted, initialVolume, }: UseGameAudioOptions): GameAudioControls;
34
+ declare function useGameAudio({ initialMuted, initialVolume, autostart, }: UseGameAudioOptions): GameAudioControls;
37
35
  declare namespace useGameAudio {
38
36
  var displayName: string;
39
37
  }
@@ -43,7 +41,8 @@ declare namespace useGameAudio {
43
41
  *
44
42
  * Context provider that owns the game audio. While it is mounted, the kernel's
45
43
  * `audio/play-sound`, `audio/stop-sound`, `audio/change-music` and `audio/stop-music`
46
- * asks drive it.
44
+ * asks drive it: each carries what std-audio-cue resolved (the sound or track to play, or the
45
+ * music fade-out length), so the provider plays it as given.
47
46
  *
48
47
  * The provider also exposes `muted`/`setMuted` and `masterVolume`/
49
48
  * `setMasterVolume` via the `GameAudioContext` for toggle buttons.
@@ -54,7 +53,7 @@ declare namespace useGameAudio {
54
53
  * @packageDocumentation
55
54
  */
56
55
 
57
- type GameAudioContextValue = Pick<GameAudioControls, 'muted' | 'setMuted' | 'masterVolume' | 'setMasterVolume' | 'play' | 'playMusic' | 'stopMusic'>;
56
+ type GameAudioContextValue = Pick<GameAudioControls, 'muted' | 'setMuted' | 'masterVolume' | 'setMasterVolume' | 'playPlan' | 'playMusicPlan' | 'stopMusic'>;
58
57
  declare const GameAudioContext: React__default.Context<GameAudioContextValue | null>;
59
58
  /**
60
59
  * Access the game audio context.
@@ -68,10 +67,6 @@ declare function useGameAudioContext(): GameAudioContextValue;
68
67
  */
69
68
  declare function useGameAudioContextOptional(): GameAudioContextValue | null;
70
69
  interface GameAudioProviderProps {
71
- /** Sound manifest — keys mapped to SoundEntry definitions */
72
- manifest: AudioManifest;
73
- /** Base URL prepended to all sound paths (default '') */
74
- baseUrl?: string;
75
70
  /** Children to render */
76
71
  children: React__default.ReactNode;
77
72
  /** Initial muted state */
@@ -81,7 +76,7 @@ interface GameAudioProviderProps {
81
76
  isLoading?: boolean;
82
77
  error?: UiError | null;
83
78
  }
84
- declare function GameAudioProvider({ manifest, baseUrl, children, initialMuted, }: GameAudioProviderProps): React__default.JSX.Element;
79
+ declare function GameAudioProvider({ children, initialMuted, }: GameAudioProviderProps): React__default.JSX.Element;
85
80
  declare namespace GameAudioProvider {
86
81
  var displayName: string;
87
82
  }
@@ -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-CRsHtLsf.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 };
@@ -1,6 +1,6 @@
1
- export { LayersPanel, parseLayerId, schemaToLayerItems } from './chunk-3S54FWRC.js';
2
- import './chunk-57DC34LY.js';
1
+ export { LayersPanel, parseLayerId, schemaToLayerItems } from './chunk-UFQLHCFJ.js';
2
+ import './chunk-AL2XXMYR.js';
3
3
  import './chunk-PCR37T3U.js';
4
- import './chunk-VO2TTLS5.js';
5
- import './chunk-4YXBKHHM.js';
4
+ import './chunk-GHAF7QUD.js';
5
+ import './chunk-D5FJU4XC.js';
6
6
  import './chunk-G7DCAZ22.js';
@@ -0,0 +1,6 @@
1
+ export { ModuleCard } from './chunk-7UCL26QB.js';
2
+ import './chunk-DPDKBY6Z.js';
3
+ import './chunk-V5SVGUYN.js';
4
+ import './chunk-3UQNFRYV.js';
5
+ import './chunk-D5FJU4XC.js';
6
+ import './chunk-G7DCAZ22.js';
@@ -1,4 +1,4 @@
1
- /* node_modules/.pnpm/katex@0.16.47/node_modules/katex/dist/katex.min.css */
1
+ /* ../../../../../node_modules/.pnpm/katex@0.16.47/node_modules/katex/dist/katex.min.css */
2
2
  @font-face {
3
3
  font-display: block;
4
4
  font-family: KaTeX_AMS;
@@ -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:
@@ -0,0 +1,23 @@
1
+ export { OrbInspector } from './chunk-TAEOMNDK.js';
2
+ import './chunk-AL2XXMYR.js';
3
+ import './chunk-RDPELAFQ.js';
4
+ import './chunk-CCO2ZH7F.js';
5
+ import './chunk-DPDKBY6Z.js';
6
+ import './chunk-3DA36FOA.js';
7
+ import './chunk-3YUMGEEW.js';
8
+ import './chunk-HA2BYO5E.js';
9
+ import './chunk-PCR37T3U.js';
10
+ import './chunk-V5SVGUYN.js';
11
+ import './chunk-3UQNFRYV.js';
12
+ import './chunk-LKL5RULQ.js';
13
+ import './chunk-TZZBINQY.js';
14
+ import './chunk-ZDRDJKYB.js';
15
+ import './chunk-S3LS3B7N.js';
16
+ import './chunk-GHAF7QUD.js';
17
+ import './chunk-2LNXLMK3.js';
18
+ import './chunk-3BBUBJFF.js';
19
+ import './chunk-ANTJUQRD.js';
20
+ import './chunk-D5FJU4XC.js';
21
+ import './chunk-ECC3WQIB.js';
22
+ import './chunk-AZ74UPG6.js';
23
+ import './chunk-G7DCAZ22.js';
@@ -234,7 +234,7 @@ type LessonSegment = {
234
234
  };
235
235
  /**
236
236
  * User progress state passed into SegmentRenderer. Declared here (rather than
237
- * alongside `LessonSegment` in `lib/parseLessonSegments.ts`) so the
237
+ * in a `lib/` module) so the
238
238
  * pattern-sync scanner — which only indexes types under `components/**` —
239
239
  * can resolve it to a concrete `.lolo` object shape instead of `json`.
240
240
  */
@@ -244,10 +244,8 @@ interface LessonUserProgress {
244
244
  bloomAnswered?: Record<number, boolean>;
245
245
  }
246
246
  interface SegmentRendererProps extends Omit<React__default.AriaAttributes, keyof A11yProps>, A11yProps {
247
- /** Parsed lesson segments (see `parseLessonSegments`). Ignored when `lesson` is given. */
247
+ /** The lesson as segments (std-lesson-segments parses lesson text into them). */
248
248
  segments?: LessonSegment[];
249
- /** Raw lesson markdown with learning tags; parsed with `parseLessonSegments` and rendered */
250
- lesson?: string;
251
249
  /** Event emitted when the activation prompt is saved or skipped (as `UI:<activationSaveEvent>`) */
252
250
  activationSaveEvent?: EventEmit<{
253
251
  response: string;
@@ -316,19 +314,5 @@ interface SegmentRendererProps extends Omit<React__default.AriaAttributes, keyof
316
314
  }
317
315
  declare const SegmentRenderer: React__default.FC<SegmentRendererProps>;
318
316
 
319
- /**
320
- * parseLessonSegments — parses lesson markdown with embedded learning-science
321
- * XML-style tags into a typed Segment array.
322
- *
323
- * Supported tags: <activate>, <connect>, <reflect>, <bloom level="...">,
324
- * <question>/<answer>, <visualize type="..." description="..." />.
325
- *
326
- * Tags may be open (unclosed) — the parser falls back to consuming content
327
- * until the next recognised tag, a section heading (`\n\n#`), or end-of-input.
328
- */
329
-
330
- /** Parse a lesson string into typed segments. Returns `[]` when input is empty. */
331
- declare function parseLessonSegments(lesson: string | undefined): LessonSegment[];
332
-
333
- export { EDITOR_MOTIONS as E, INDENT_UNIT as I, SegmentRenderer as S, EDITOR_OPERATORS as b, applyMotion as e, applyOperator as f, isEditorOperator as g, parseLessonSegments as h, isEditorMotion as i, parseMarkdownWithCodeBlocks as j, BloomQuizBlock as l, motionRange as m, CodeRunnerPanel as o, parseContentSegments as p };
334
- export type { ApplyOperatorInput as A, BloomLevel as B, ContentSegment as C, LessonSegment as L, ApplyOperatorResult as a, EditorMotion as c, EditorOperator as d, ContentAnnotation as k, BloomQuizBlockProps as n, CodeRunnerPanelProps as q, CodeSimulationOutput as r, LessonUserProgress as s, SegmentRendererProps as t };
317
+ export { EDITOR_MOTIONS as E, INDENT_UNIT as I, SegmentRenderer as S, EDITOR_OPERATORS as b, applyMotion as e, applyOperator as f, isEditorOperator as g, parseMarkdownWithCodeBlocks as h, isEditorMotion as i, BloomQuizBlock as k, motionRange as m, CodeRunnerPanel as n, parseContentSegments as p };
318
+ export type { ApplyOperatorInput as A, BloomLevel as B, ContentSegment as C, LessonSegment as L, ApplyOperatorResult as a, EditorMotion as c, EditorOperator as d, ContentAnnotation as j, BloomQuizBlockProps as l, CodeRunnerPanelProps as o, CodeSimulationOutput as q, LessonUserProgress as r, SegmentRendererProps as s };
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import { A11yProps, Asset, EventKey, EventPayload, EventEmit } from '@almadar/core';
3
- import { I as IconInput } from './fx-CmQjnHmT.js';
3
+ import { I as IconInput } from './fx-Bx5RqplG.js';
4
4
 
5
5
  type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "success" | "warning" | "default" | "link";
6
6
  type ButtonSize = "sm" | "md" | "lg";
@@ -1,5 +1,5 @@
1
1
  import React__default from 'react';
2
- import { U as UISlotManager, a as SlotContent } from './useUISlots-CiobNFGb.js';
2
+ import { U as UISlotManager, a as SlotContent } from './useUISlots-BLcGd__D.js';
3
3
  import { UISlot } from '@almadar/core';
4
4
 
5
5
  /**
@@ -0,0 +1,23 @@
1
+ export { SlotContainedContext, SlotContentRenderer, SuspenseConfigProvider, UISlotComponent, UISlotRenderer, renderPatternProps, renderPatternValue } from './chunk-TAEOMNDK.js';
2
+ import './chunk-AL2XXMYR.js';
3
+ import './chunk-RDPELAFQ.js';
4
+ import './chunk-CCO2ZH7F.js';
5
+ import './chunk-DPDKBY6Z.js';
6
+ import './chunk-3DA36FOA.js';
7
+ import './chunk-3YUMGEEW.js';
8
+ import './chunk-HA2BYO5E.js';
9
+ import './chunk-PCR37T3U.js';
10
+ import './chunk-V5SVGUYN.js';
11
+ import './chunk-3UQNFRYV.js';
12
+ import './chunk-LKL5RULQ.js';
13
+ import './chunk-TZZBINQY.js';
14
+ import './chunk-ZDRDJKYB.js';
15
+ import './chunk-S3LS3B7N.js';
16
+ import './chunk-GHAF7QUD.js';
17
+ import './chunk-2LNXLMK3.js';
18
+ import './chunk-3BBUBJFF.js';
19
+ import './chunk-ANTJUQRD.js';
20
+ import './chunk-D5FJU4XC.js';
21
+ import './chunk-ECC3WQIB.js';
22
+ import './chunk-AZ74UPG6.js';
23
+ import './chunk-G7DCAZ22.js';