@almadar/shell-web 0.1.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 (131) hide show
  1. package/dist/{ArbitraryClassCompiler-Mzabq-UB.d.ts → ArbitraryClassCompiler-CO_iASBn.d.ts} +99 -4
  2. package/dist/AvlGlyph-PIXU6QH5.js +5 -0
  3. package/dist/AvlStateMachine-CKGMECMG.js +8 -0
  4. package/dist/AvlTransitionDetail-QZX6G5KJ.js +10 -0
  5. package/dist/AvlTransitionExplainer-26WLEIC6.js +11 -0
  6. package/dist/BehaviorView-JLZ4PKWY.js +10 -0
  7. package/dist/{EventBusProvider-CVwjkV_2.d.ts → EventBusProvider-BFFHfN4O.d.ts} +12 -0
  8. package/dist/{FileTree-BCFnBEuQ.d.ts → FileTree-B3GDAjaQ.d.ts} +131 -4
  9. package/dist/FlowCanvas-RPII4V24.js +23 -0
  10. package/dist/{BehaviorValueFrame-SSEMEBTG.css → FlowCanvas-VWUPMBKB.css} +189 -191
  11. package/dist/{GameAudioProvider-Cm9BnvmP.d.ts → GameAudioProvider-D7wo5ryN.d.ts} +5 -8
  12. package/dist/KernelEngineContext-CPeWQMAz.d.ts +46 -0
  13. package/dist/LayersPanel-M2LHWUFF.js +6 -0
  14. package/dist/ModuleCard-NJD6JQGD.js +6 -0
  15. package/dist/OrbInspector-OWWKPOBF.js +23 -0
  16. package/dist/{TraitValueFrame-4G3KOUBR.css → OrbInspector-VMTMZHNQ.css} +189 -191
  17. package/dist/{Select-mDZIwNqN.d.ts → Select-C2Uq6t86.d.ts} +17 -31
  18. package/dist/ServerBridge-Bqsj-lOU.d.ts +124 -0
  19. package/dist/{FlowCanvas-3JRMNJLV.css → UISlotRenderer-BIS6KT7T.css} +189 -191
  20. package/dist/UISlotRenderer-PY7FIJXN.js +23 -0
  21. package/dist/auth/browser/index.js +1 -0
  22. package/dist/auth/react/index.d.ts +8 -1
  23. package/dist/auth/react/index.js +40 -2
  24. package/dist/avl/index.css +189 -191
  25. package/dist/avl/index.d.ts +107 -85
  26. package/dist/avl/index.js +170 -39
  27. package/dist/{chunk-P4LNHAFI.js → chunk-2WGR4TDJ.js} +465 -36
  28. package/dist/{chunk-GKIFONTE.js → chunk-3S54FWRC.js} +2 -2
  29. package/dist/{chunk-KVQS4GXU.js → chunk-4YJ53G7S.js} +18 -8
  30. package/dist/{chunk-MBQAMMSE.js → chunk-4YXBKHHM.js} +269 -658
  31. package/dist/{chunk-YDNJLLG6.js → chunk-57DC34LY.js} +19 -10
  32. package/dist/{chunk-FP3WIKTC.js → chunk-7N6ZPHQ5.js} +9 -1
  33. package/dist/{chunk-AILY3XPS.js → chunk-AE7VCQB6.js} +5 -6
  34. package/dist/{chunk-L677XGY3.js → chunk-AGVSO4WY.js} +4 -5
  35. package/dist/{chunk-FAJDTHWC.js → chunk-AGXD77SL.js} +2 -2
  36. package/dist/chunk-AU7O65OX.js +66 -0
  37. package/dist/{chunk-DFNZUYX4.js → chunk-FAKU5F62.js} +273 -29
  38. package/dist/{chunk-U6QRZASX.js → chunk-ILQXJ2AR.js} +1 -1
  39. package/dist/chunk-M74BCDBQ.js +490 -0
  40. package/dist/{chunk-GYTPOFVC.js → chunk-MS4K3K2R.js} +12095 -13329
  41. package/dist/{chunk-SGM3FASH.js → chunk-OWNG4JZI.js} +13 -12
  42. package/dist/{chunk-VFF5OO47.js → chunk-PCR37T3U.js} +15 -38
  43. package/dist/{chunk-SJGJJKBY.js → chunk-PRLHKBXG.js} +5 -3
  44. package/dist/{chunk-R5O5AUPI.js → chunk-PRXQGGCO.js} +93 -86
  45. package/dist/{chunk-42FY4RYA.js → chunk-REXYVBUO.js} +2 -2
  46. package/dist/{chunk-EQAMU2ZC.js → chunk-UTDC2NEA.js} +1 -1
  47. package/dist/{chunk-73SRAB4P.js → chunk-UU57VNS2.js} +2 -2
  48. package/dist/{chunk-TESBIVUA.js → chunk-VHC2M26B.js} +2 -2
  49. package/dist/{chunk-L2DEKY4J.js → chunk-VO2TTLS5.js} +3 -6
  50. package/dist/{chunk-2PY54Z44.js → chunk-VUIACGDU.js} +4 -5
  51. package/dist/{chunk-DLZF4PVE.js → chunk-YYIHRIDH.js} +3 -3
  52. package/dist/{chunk-DYEKAA4L.js → chunk-ZDRDJKYB.js} +243 -252
  53. package/dist/components/index.css +189 -191
  54. package/dist/components/index.d.ts +739 -289
  55. package/dist/components/index.js +25 -28
  56. package/dist/context/index.d.ts +2 -3
  57. package/dist/context/index.js +4 -3
  58. package/dist/core.d.ts +95 -19
  59. package/dist/core.js +2 -1
  60. package/dist/design-classes/index.cjs +3 -1
  61. package/dist/design-classes/index.js +3 -1
  62. package/dist/{fx-CmQjnHmT.d.ts → fx-Br8zjvu9.d.ts} +6 -6
  63. package/dist/hooks/index.d.ts +40 -5
  64. package/dist/hooks/index.js +5 -4
  65. package/dist/index.d.ts +40 -114
  66. package/dist/index.js +174 -34
  67. package/dist/kernel-client-JW6OH5FX.js +537 -0
  68. package/dist/kernel-wire-DGAySGhX.d.ts +95 -0
  69. package/dist/lib/index.d.ts +3 -4
  70. package/dist/lib/index.js +4 -4
  71. package/dist/{prism-AIWGN2X5.js → prism-X5YWKXO5.js} +5 -3
  72. package/dist/providers/index.css +189 -191
  73. package/dist/providers/index.d.ts +41 -28
  74. package/dist/providers/index.js +19 -24
  75. package/dist/renderer/index.d.ts +0 -2
  76. package/dist/renderer/index.js +1 -0
  77. package/dist/runtime/index.css +189 -191
  78. package/dist/runtime/index.d.ts +57 -253
  79. package/dist/runtime/index.js +18 -24
  80. package/dist/ssr/index.cjs +2643 -535
  81. package/dist/ssr/index.d.cts +0 -23
  82. package/dist/ssr/index.d.ts +0 -23
  83. package/dist/ssr/index.js +2639 -535
  84. package/dist/storage/browser/index.js +1 -0
  85. package/dist/test-support.d.ts +15 -8
  86. package/dist/test-support.js +91 -24
  87. package/dist/{paintDispatch-ChW5mVuK.d.ts → verificationRegistry-oopV1J1n.d.ts} +132 -30
  88. package/package.json +14 -38
  89. package/src/core/lib/band-shapes.json +7 -0
  90. package/src/core/locales/ar.json +18 -5
  91. package/src/core/locales/en.json +18 -5
  92. package/src/core/locales/sl.json +18 -5
  93. package/tailwind-preset.cjs +30 -1
  94. package/dist/AvlGlyph-JKJOAH23.js +0 -6
  95. package/dist/AvlStateMachine-PI4YGREK.js +0 -8
  96. package/dist/AvlTransitionDetail-ZH7V24UG.js +0 -12
  97. package/dist/AvlTransitionExplainer-ZSRT7L6Y.js +0 -13
  98. package/dist/BehaviorValueFrame-6RUJXT4A.js +0 -29
  99. package/dist/BehaviorView-RFEE5J6E.js +0 -10
  100. package/dist/Canvas3DHost-_Y-5uLM_.d.ts +0 -552
  101. package/dist/FlowCanvas-STDC4OWK.js +0 -27
  102. package/dist/KernelEngineContext-BOCQoFwk.d.ts +0 -43
  103. package/dist/LayersPanel-BBQ54IVG.js +0 -7
  104. package/dist/ModuleCard-3TT2X7IW.js +0 -7
  105. package/dist/OrbInspector-K6T6O7GI.js +0 -27
  106. package/dist/OrbInspector-MHLJ6OEE.css +0 -1756
  107. package/dist/ServerBridge-Cm1On51b.d.ts +0 -233
  108. package/dist/TraitValueFrame-2PJGLLVI.js +0 -28
  109. package/dist/UISlotRenderer-JKFSX24W.js +0 -27
  110. package/dist/UISlotRenderer-KVFO6J7R.css +0 -1756
  111. package/dist/UserContext-DqWeZkUZ.d.ts +0 -100
  112. package/dist/avl-3d-context-BIRKWpaL.d.ts +0 -204
  113. package/dist/avl-schema-parser-CtJxJ9KU.d.ts +0 -132
  114. package/dist/avl-zoom-state-CKMVuBFg.d.ts +0 -17
  115. package/dist/chunk-2QOH2HWM.js +0 -95
  116. package/dist/chunk-6P3MWXYE.js +0 -440
  117. package/dist/chunk-B4BU77LT.js +0 -432
  118. package/dist/chunk-DJ433ET5.js +0 -1327
  119. package/dist/chunk-DZ42OJQC.js +0 -176
  120. package/dist/chunk-EOWMARUB.js +0 -16
  121. package/dist/chunk-FIW6WN23.js +0 -508
  122. package/dist/chunk-GAR5TQ5B.js +0 -199
  123. package/dist/chunk-PC7K4SK7.js +0 -1384
  124. package/dist/chunk-ZO6MXAS3.js +0 -69
  125. package/dist/kernel-client-ZH4PSMCN.js +0 -367
  126. package/dist/kernel-wire-B4S8pnP3.d.ts +0 -65
  127. package/dist/three/index.css +0 -503
  128. package/dist/three/index.d.ts +0 -1185
  129. package/dist/three/index.js +0 -3896
  130. package/dist/useKeyboardRouter-Dsq553Ur.d.ts +0 -42
  131. package/dist/verificationRegistry-CabxhfTv.d.ts +0 -122
@@ -1 +1,2 @@
1
+ "use client";
1
2
  export * from '@almadar/shell-browser/storage';
@@ -1,10 +1,12 @@
1
1
  import { KernelServerClass, KernelModule } from '@almadar/shell-runtime/kernel/wire';
2
- import { OrbitalSchema, UserContext } from '@almadar/core';
2
+ import { OrbitalSchema } from '@almadar/core';
3
3
  import { KernelEngineValue } from './providers/index.js';
4
4
  import { KernelModule as KernelModule$1 } from './providers/index.js';
5
- import { EventTransport } from '@almadar/shell-runtime/client/EventTransport';
6
- import './verification-C5pTeMJv.js';
5
+ import { EventTransport } from '@almadar/shell-runtime';
7
6
  import 'react';
7
+ import '@almadar/shell-runtime/kernel/os-port';
8
+ import '@almadar/shell-browser/kv';
9
+ import './verification-C5pTeMJv.js';
8
10
 
9
11
  /**
10
12
  * A whole `KernelModule` around a scripted `Server`, for tests that drive the engine without the wasm. Every member a
@@ -13,15 +15,17 @@ import 'react';
13
15
  declare function stubKernelModule(Server: KernelServerClass, overrides?: Partial<Omit<KernelModule, 'Server'>>): KernelModule;
14
16
 
15
17
  declare const KERNEL_AVAILABLE: boolean;
18
+ /** The type-contract stamp every test program carries, typed from core's `OrbitalSchema` so a version bump there fails here. */
19
+ declare const TEST_TYPE_CONTRACT_VERSION: NonNullable<OrbitalSchema['typeContractVersion']>;
20
+ /** The stamp option a hook under test hands the kernel: the same version, as a program's stamp. */
21
+ declare const TEST_STAMP: Pick<OrbitalSchema, 'typeContractVersion'>;
16
22
  /** The installed language as the bundle a browser host hands a kernel it opens over a local store. */
17
23
  declare const TEST_LANGUAGE: string;
18
24
  /** The shared kernel module, loaded once, with the render evaluator installed from it. */
19
25
  declare function loadTestKernel(): Promise<KernelModule$1>;
20
- /** The std mock-seed program as `orb` resolves it from the installed packages, the way a Node host does. */
21
- declare function loadTestSeedProgram(): Promise<OrbitalSchema>;
22
26
  declare const KERNEL_ENGINE: KernelEngineValue;
23
27
  declare const ENGINES: ReadonlyArray<readonly [string, KernelEngineValue]>;
24
- /** A client-build kernel instance of its own, as a browser loads it: nothing has installed language data into it. */
28
+ /** A client-build kernel instance of its own, as a browser loads it: initialised, with the language installed once, as the browser kernel loader does. */
25
29
  declare function loadFreshClientKernel(): Promise<KernelModule$1>;
26
30
  /** Load the WebAssembly and the adapter chunk before a timing-sensitive test: the first dispatch otherwise waits on both. */
27
31
  declare function warmKernel(): Promise<void>;
@@ -30,6 +34,9 @@ declare function warmKernel(): Promise<void>;
30
34
  * The hosted playground's stateless topology: the program is registered once, and every request runs on a fresh
31
35
  * session of it (`KernelEngine.fork`) over the kernel's own memory store, the client carrying the circuit state on the leg.
32
36
  */
33
- declare function statelessKernelTransport(schema: OrbitalSchema, user?: () => Promise<UserContext | undefined>): EventTransport;
37
+ declare function statelessKernelTransport(schema: OrbitalSchema): EventTransport;
38
+
39
+ /** A `.lolo` program (with any files beside it, such as `locales/en/<app>.json`) as the installed `orb` compiles it for a browser kernel: the stamp, `_metadata.protocols` and dispatch facts included. */
40
+ declare function clientProgram(source: string, files?: Readonly<Record<string, string>>): OrbitalSchema;
34
41
 
35
- export { ENGINES, KERNEL_AVAILABLE, KERNEL_ENGINE, TEST_LANGUAGE, loadFreshClientKernel, loadTestKernel, loadTestSeedProgram, statelessKernelTransport, stubKernelModule, warmKernel };
42
+ export { ENGINES, KERNEL_AVAILABLE, KERNEL_ENGINE, TEST_LANGUAGE, TEST_STAMP, TEST_TYPE_CONTRACT_VERSION, clientProgram, loadFreshClientKernel, loadTestKernel, statelessKernelTransport, stubKernelModule, warmKernel };
@@ -1,13 +1,16 @@
1
- import { createInProcessTransport, src_exports } from './chunk-6P3MWXYE.js';
2
- import { openLocalKernel, nativeMemoryPersistence } from './chunk-DYEKAA4L.js';
1
+ "use client";
2
+ import { openLocalKernel, nativeMemoryPersistence } from './chunk-ZDRDJKYB.js';
3
3
  import './chunk-G7DCAZ22.js';
4
- import { execFileSync } from 'child_process';
5
- import { existsSync, readFileSync } from 'fs';
4
+ import { existsSync, readFileSync, mkdtempSync, writeFileSync, mkdirSync, rmSync } from 'fs';
6
5
  import { createRequire } from 'module';
7
- import { join } from 'path';
6
+ import { join, dirname } from 'path';
8
7
  import { pathToFileURL } from 'url';
9
- import { OrbitalSchemaSchema, installKernelEvaluator } from '@almadar/core';
8
+ import { installKernelEvaluator, parseOrbitalSchema } from '@almadar/core';
9
+ import { installNativeLanguages } from '@almadar/syntax';
10
10
  import { readLanguageBundle } from '@almadar/core/language-data';
11
+ import { createInProcessTransport, evaluateOnKernel } from '@almadar/shell-runtime';
12
+ import { execFileSync } from 'child_process';
13
+ import { tmpdir } from 'os';
11
14
 
12
15
  // src/test-support/stub-kernel-module.ts
13
16
  function stubKernelModule(Server, overrides = {}) {
@@ -19,10 +22,12 @@ function stubKernelModule(Server, overrides = {}) {
19
22
  osGlobMatches: () => false,
20
23
  isPublicAddress: () => false,
21
24
  osDeferringOps: () => "[]",
25
+ contractQueryWithoutProgram: () => "null",
22
26
  osStreamOps: () => "[]",
23
27
  osCompletionEvent: () => "null",
24
28
  substrateCompletionEvent: () => "null",
25
29
  tabUrlMatches: () => false,
30
+ parseEventRequest: unexpected("parseEventRequest"),
26
31
  installLanguage: unexpected("installLanguage"),
27
32
  evaluateMany: unexpected("evaluateMany"),
28
33
  resolveValues: unexpected("resolveValues"),
@@ -33,6 +38,19 @@ function stubKernelModule(Server, overrides = {}) {
33
38
  scopeRows: unexpected("scopeRows"),
34
39
  checkMutationAccess: unexpected("checkMutationAccess"),
35
40
  resolveRowBinding: unexpected("resolveRowBinding"),
41
+ eventWires: unexpected("eventWires"),
42
+ validatePacks: unexpected("validatePacks"),
43
+ expandFxLayer: unexpected("expandFxLayer"),
44
+ resolveFxView: unexpected("resolveFxView"),
45
+ fxLifecycle: unexpected("fxLifecycle"),
46
+ fxHash01: unexpected("fxHash01"),
47
+ skinWorldMatrices: unexpected("skinWorldMatrices"),
48
+ skinVertices: unexpected("skinVertices"),
49
+ skinComposeAffine: unexpected("skinComposeAffine"),
50
+ skinInvertAffine: unexpected("skinInvertAffine"),
51
+ skinApplyAffine: unexpected("skinApplyAffine"),
52
+ skinTriangleAffine: unexpected("skinTriangleAffine"),
53
+ skinVertexBounds: unexpected("skinVertexBounds"),
36
54
  ...overrides
37
55
  };
38
56
  }
@@ -61,22 +79,17 @@ async function load() {
61
79
  glue.initSync({ module: readFileSync(files.wasm) });
62
80
  glue.installLanguage(TEST_LANGUAGE);
63
81
  installKernelEvaluator(glue);
82
+ installNativeLanguages();
64
83
  return glue;
65
84
  }
85
+ var TEST_TYPE_CONTRACT_VERSION = 1;
86
+ var TEST_STAMP = { typeContractVersion: TEST_TYPE_CONTRACT_VERSION };
66
87
  var TEST_LANGUAGE = JSON.stringify(readLanguageBundle(process.cwd()));
67
88
  var shared;
68
89
  function loadTestKernel() {
69
90
  return shared ??= load();
70
91
  }
71
- var WHICH_LINE = /^(\/\S+\.(?:orb|lolo)) \((.+)\)$/;
72
- function loadTestSeedProgram() {
73
- const run = (args) => execFileSync("orb", [...args], { cwd: process.cwd(), encoding: "utf8", maxBuffer: 512 * 1024 * 1024 });
74
- const which = run(["behaviors", "which", "std/behaviors/std-mock-seed"]).trim().split("\n").pop() ?? "";
75
- const match = WHICH_LINE.exec(which);
76
- if (match === null) return Promise.reject(new Error(`std/behaviors/std-mock-seed is not installed: ${which}`));
77
- return Promise.resolve(OrbitalSchemaSchema.parse(JSON.parse(run(["resolve", match[1]]))));
78
- }
79
- var KERNEL_ENGINE = { loadModule: () => loadTestKernel(), loadLanguage: () => Promise.resolve(TEST_LANGUAGE), loadSeedProgram: loadTestSeedProgram };
92
+ var KERNEL_ENGINE = { loadModule: () => loadTestKernel() };
80
93
  var ENGINES = KERNEL_AVAILABLE ? [["kernel", KERNEL_ENGINE]] : [];
81
94
  async function loadFreshClientKernel() {
82
95
  const dir = process.env.ALMADAR_KERNEL_DIR;
@@ -86,29 +99,83 @@ async function loadFreshClientKernel() {
86
99
  `${pathToFileURL(files.glue).href}?fresh=${Math.random()}`
87
100
  );
88
101
  glue.initSync({ module: readFileSync(files.wasm) });
102
+ glue.installLanguage(TEST_LANGUAGE);
89
103
  installKernelEvaluator(glue);
104
+ installNativeLanguages();
90
105
  return glue;
91
106
  }
92
107
  async function warmKernel() {
93
108
  if (!KERNEL_AVAILABLE) return;
94
109
  await KERNEL_ENGINE.loadModule();
95
- await import('./kernel-client-ZH4PSMCN.js');
110
+ await import('./kernel-client-JW6OH5FX.js');
96
111
  }
97
-
98
- // src/test-support/stateless-kernel.ts
99
- function statelessKernelTransport(schema, user = async () => void 0) {
112
+ function statelessKernelTransport(schema) {
100
113
  let template;
101
114
  return createInProcessTransport(async (orbital, request) => {
102
- const viewer = await user();
103
- template ??= loadTestKernel().then((kernel) => openLocalKernel({ kernel, language: TEST_LANGUAGE, schema, persistence: nativeMemoryPersistence(kernel) }));
115
+ template ??= loadTestKernel().then((kernel) => openLocalKernel({ kernel, schema, persistence: nativeMemoryPersistence(kernel) }));
104
116
  const engine = (await template).fork();
105
117
  try {
106
- engine.seedRuntimeMock(viewer?.id);
107
- return await (0, src_exports.evaluateOnKernel)({ engine, orbital }, request, viewer, request.locale);
118
+ return await evaluateOnKernel({ engine, orbital }, request, request.locale);
108
119
  } finally {
109
120
  engine.dispose();
110
121
  }
111
122
  }, { carriesCircuitState: true });
112
123
  }
124
+ var lowered = /* @__PURE__ */ new Map();
125
+ var lockDir = join(tmpdir(), "almadar-client-program.lock");
126
+ function holderAlive() {
127
+ try {
128
+ process.kill(Number(readFileSync(join(lockDir, "pid"), "utf8")), 0);
129
+ return true;
130
+ } catch {
131
+ return false;
132
+ }
133
+ }
134
+ function compileExclusively(compile) {
135
+ const wait = new Int32Array(new SharedArrayBuffer(4));
136
+ for (; ; ) {
137
+ try {
138
+ mkdirSync(lockDir);
139
+ writeFileSync(join(lockDir, "pid"), String(process.pid));
140
+ break;
141
+ } catch (error) {
142
+ if (!(error instanceof Error) || !("code" in error) || error.code !== "EEXIST") throw error;
143
+ if (!holderAlive()) rmSync(lockDir, { recursive: true, force: true });
144
+ Atomics.wait(wait, 0, 0, 25);
145
+ }
146
+ }
147
+ try {
148
+ return compile();
149
+ } finally {
150
+ rmSync(lockDir, { recursive: true, force: true });
151
+ }
152
+ }
153
+ function clientProgram(source, files = {}) {
154
+ const bin = process.env.ORB_BIN;
155
+ if (bin === void 0 || bin === "") throw new Error("clientProgram: set ORB_BIN to the installed orb binary that lowers the test programs");
156
+ const key = JSON.stringify([source, files]);
157
+ const known = lowered.get(key);
158
+ if (known !== void 0) return structuredClone(known);
159
+ const dir = mkdtempSync(join(tmpdir(), "client-program-"));
160
+ try {
161
+ const file = join(dir, "program.lolo");
162
+ writeFileSync(file, source);
163
+ const served = join(dir, "out/packages/client/public");
164
+ for (const [path, text] of Object.entries(files)) {
165
+ for (const target of [join(dir, path), join(served, path)]) {
166
+ mkdirSync(dirname(target), { recursive: true });
167
+ writeFileSync(target, text);
168
+ }
169
+ }
170
+ const schema = compileExclusively(() => {
171
+ execFileSync(bin, ["compile", file, "-o", join(dir, "out"), "--mode", "client"], { cwd: dir, stdio: "pipe" });
172
+ return parseOrbitalSchema(JSON.parse(readFileSync(join(served, "program.client.orb"), "utf8")));
173
+ });
174
+ lowered.set(key, schema);
175
+ return structuredClone(schema);
176
+ } finally {
177
+ rmSync(dir, { recursive: true, force: true });
178
+ }
179
+ }
113
180
 
114
- export { ENGINES, KERNEL_AVAILABLE, KERNEL_ENGINE, TEST_LANGUAGE, loadFreshClientKernel, loadTestKernel, loadTestSeedProgram, statelessKernelTransport, stubKernelModule, warmKernel };
181
+ export { ENGINES, KERNEL_AVAILABLE, KERNEL_ENGINE, TEST_LANGUAGE, TEST_STAMP, TEST_TYPE_CONTRACT_VERSION, clientProgram, loadFreshClientKernel, loadTestKernel, statelessKernelTransport, stubKernelModule, warmKernel };
@@ -1,7 +1,9 @@
1
1
  import React__default from 'react';
2
- import { ScenePos, Asset } from '@almadar/core';
3
- import { P as Point, R as Rect, F as FxItem, a as FxPreset } from './fx-CmQjnHmT.js';
4
- import './EventBusProvider-CVwjkV_2.js';
2
+ import { ScenePos, Asset, OrbitalVerificationAPI, TraitStateSnapshot, EventPayload, BusEvent, VerificationCheck, BridgeHealth, VerificationSnapshot, VerificationSummary, TransitionTrace, EventRequest, EventResponse, ServerResponseTrace, EffectTrace, CheckStatus, ServerEffectResult, AssetLoadStatus } from '@almadar/core';
3
+ import { P as Point, R as Rect, F as FxItem, a as FxPreset } from './fx-Br8zjvu9.js';
4
+ import './EventBusProvider-BFFHfN4O.js';
5
+ import { EventTransport } from '@almadar/shell-runtime/client/EventTransport';
6
+ import './verification-C5pTeMJv.js';
5
7
 
6
8
  /** A polyline/polygon vertex in pixel space. */
7
9
  interface PainterPoint {
@@ -77,8 +79,7 @@ interface DrawableBase {
77
79
  * `draw-shape` — the neutral vector-fill/stroke drawable atom (dimension-agnostic).
78
80
  *
79
81
  * ONE descriptor (`DrawShapeProps`, grounded in core `ScenePos`) with TWO
80
- * backends: `paintShape` (2D, here) and an R3F ground-plane mesh (`Shape3D` in
81
- * `lib/drawable/mesh3d`, kept OUT of this file so the 2D path never pulls R3F).
82
+ * backends: `paintShape` (2D, here) and a ground-plane mesh in orbital-canvas's 3D scene.
82
83
  * Paints a cell footprint, an axis-aligned rect, an ellipse, a poly, or an SVG
83
84
  * path at a scene position, fill and/or stroke. Genre uses (tile fallback, iso/hex
84
85
  * diamond fallback, cell highlight, feature disc, unit selection ring, unit
@@ -229,9 +230,7 @@ declare function DrawShape(props: DrawShapeProps): React__default.JSX.Element |
229
230
  *
230
231
  * ONE descriptor (`DrawSpriteProps`, grounded in core `ScenePos` + `Asset`) with
231
232
  * TWO backends: `paintSprite` (2D, here — via the portable `Painter2D` seam) and
232
- * an R3F mesh (`Sprite3D` in `lib/drawable/mesh3d`, kept OUT of this file so the
233
- * 2D paint path never pulls `three`/`drei` into an app bundle — the codebase
234
- * code-splits R3F). The canvas host picks the backend by `mode`; that is what
233
+ * orbital-canvas's 3D scene (the `canvas` mode:"3d" mapper). The canvas host picks the backend by `mode`; that is what
235
234
  * makes canvas-2d and canvas-3d the same `children` interface. Genre uses (tile,
236
235
  * unit body, feature, effect, movement ghost, background cover) are all this atom
237
236
  * with different `anchor`/`size`/`frame`/`flip`/`shadow` — composed in `.lolo`,
@@ -276,8 +275,7 @@ declare function DrawSprite(_props: DrawSpriteProps): React__default.JSX.Element
276
275
  * `draw-text` — the neutral text drawable atom (dimension-agnostic).
277
276
  *
278
277
  * ONE descriptor (`DrawTextProps`, grounded in core `ScenePos`) with TWO backends:
279
- * `paintText` (2D, here) and an R3F billboarded `<Text>` (`Text3D` in
280
- * `lib/drawable/mesh3d`, kept OUT of this file so the 2D path never pulls R3F).
278
+ * `paintText` (2D, here) and billboarded text in orbital-canvas's 3D scene.
281
279
  * Paints a string at a scene position with font/color/alignment. The React
282
280
  * component renders `null` (a drawable is painted by the host, not the DOM).
283
281
  */
@@ -312,9 +310,8 @@ declare function DrawText(_props: DrawTextProps): React__default.JSX.Element | n
312
310
  /**
313
311
  * `draw-mesh` — the volumetric 3D drawable atom (3D-canvas backend).
314
312
  *
315
- * ONE descriptor (`DrawMeshProps`, grounded in core `ScenePos`) with the R3F
316
- * backend `Mesh3D` in `lib/drawable/three/DrawMesh3D` (kept OUT of this file so
317
- * the 2D path never pulls three). A parametric primitive (box, sphere, capsule,
313
+ * ONE descriptor (`DrawMeshProps`, grounded in core `ScenePos`) drawn by
314
+ * orbital-canvas's 3D scene. A parametric primitive (box, sphere, capsule,
318
315
  * cylinder, cone, torus, plane, circle — `plane`/`circle` lie flat in the
319
316
  * scene ground plane facing up, matching the 2D painter) or a raw-geometry `polyhedron`
320
317
  * (`vertices` + `faces` as plain data) at a scene position — `position.z` is
@@ -646,27 +643,17 @@ declare function DrawTextLayer(_props: DrawTextLayerProps): React__default.JSX.E
646
643
  /**
647
644
  * `draw-fx-layer` — the batched transient-effects pass in one descriptor.
648
645
  *
649
- * Collapses the fx triple every board used to hand-roll (message text layer +
650
- * sprite fallback layer + vector-art group per fx entry) into ONE node:
651
- * `{ type: draw-fx-layer, items: @entity.fx, presets: @config.fxPresets, … }`.
652
- * NAME-BLIND: each item's look comes from its resolved typed fields via the
653
- * consumer-declared `FxPreset[]` table — never a kind→look table in here.
654
- * Render priority per item: vector `art[type].idle` (draw-group) → sprite
655
- * `sprites[type]` (draw-sprite) → a procedural seeded recipe
656
- * (spark/ring/puff/streak draw-shapes); a `message` always adds a rising,
657
- * fading draw-text. Expansion is PURE (descriptors → descriptors, routed
658
- * through the normal paint dispatch); per-frame smoothness comes from the host
659
- * paint clock against each item's `bornAt`, while the fx mechanic's ttl decay
660
- * stays the authoritative removal clock. `space: "screen"` entries are skipped
661
- * — the `fx-overlay` core molecule owns those. The React component renders
662
- * `null` (a drawable is painted by the host, not the DOM).
646
+ * The descriptor and its paint clock go to the shared Rust projector through
647
+ * the installed kernel WASM module. `std-fx-particles` owns ttl and removal;
648
+ * the projector derives world-space art, sprites, shapes, and messages. The
649
+ * React component renders `null` because its canvas host paints the result.
663
650
  */
664
651
 
665
652
  interface DrawFxLayerProps extends DrawableBase {
666
653
  type: 'draw-fx-layer';
667
654
  /** The live fx entries — the mechanic's `@entity.fx` list passed whole; `space: "screen"` entries are skipped (the overlay owns those). */
668
655
  items: FxItem[];
669
- /** Consumer-declared effect vocabulary — one row per fx `type` (look + recipe). Unknown types fall back to a neutral spark burst. */
656
+ /** Consumer-declared effect vocabulary — one row per fx `type` (look, recipe and motion). An item whose `type` has no row draws only from its own fields, and a missing required field is a typed error. */
670
657
  presets?: FxPreset[];
671
658
  /** Vector art per fx type (an asset-art map: type → anim-state → drawables); a type's `idle` state wins over sprites/procedural. */
672
659
  art?: Record<string, Record<string, DrawableNode[]>>;
@@ -694,5 +681,120 @@ declare function DrawFxLayer(_props: DrawFxLayerProps): React__default.JSX.Eleme
694
681
  /** Every drawable descriptor. The host's `children` are a `DrawableNode[]`. */
695
682
  type DrawableNode = DrawSpriteProps | DrawShapeProps | DrawTextProps | DrawGroupProps | DrawMeshProps | DrawSkinnedMeshProps | DrawSpriteLayerProps | DrawShapeLayerProps | DrawTextLayerProps | DrawFxLayerProps;
696
683
 
697
- export { DrawFxLayer as e, DrawGroup as f, DrawMesh as g, DrawShape as h, DrawShapeLayer as i, DrawSkinnedMesh as j, DrawSprite as k, DrawSpriteLayer as l, DrawText as m, DrawTextLayer as n };
698
- export type { DrawableNode as D, MeshShapeKind as M, Projector as P, MeshMaterial as a, DrawGroupProps as b, DrawTextProps as c, DrawMeshProps as d };
684
+ /**
685
+ * Verification Registry - Tracks runtime verification checks and transition traces
686
+ *
687
+ * Provides:
688
+ * 1. A checklist of pass/fail checks (INIT has fetch, bridge connected, etc.)
689
+ * 2. A full transition timeline with effect execution results
690
+ * 3. ServerBridge health snapshot
691
+ * 4. window.__orbitalVerification for Playwright/automation
692
+ *
693
+ * @packageDocumentation
694
+ */
695
+
696
+ type ChangeListener = () => void;
697
+ /**
698
+ * Per-trait snapshot getter. Each generated trait logic hook (or
699
+ * `useTraitStateMachine` trait binding) registers one on mount so the
700
+ * verifier can read the live reducer state for that trait.
701
+ */
702
+ type TraitSnapshotGetter = () => TraitStateSnapshot;
703
+ declare function registerCheck(id: string, label: string, status?: CheckStatus, details?: string): void;
704
+ declare function updateCheck(id: string, status: CheckStatus, details?: string): void;
705
+ declare function getAllChecks(): VerificationCheck[];
706
+ declare function recordTransition(trace: Omit<TransitionTrace, "id">): void;
707
+ declare function getTransitions(): TransitionTrace[];
708
+ declare function getTransitionsForTrait(traitName: string): TransitionTrace[];
709
+ /**
710
+ * Record a server response as a timeline entry.
711
+ * Creates a synthetic transition entry with type "server-response" to show
712
+ * what the server returned (clientEffects, data counts, emitted events).
713
+ *
714
+ * `effectResults` — the server's persist/set/call-service outcomes, already
715
+ * mapped to `EffectTrace` by the caller — populate `entry.effects` so a
716
+ * denied or failed persist is visible on this synthetic entry too. Before
717
+ * this it was always `[]`: the ONLY entry the driver's per-event
718
+ * `server:<orbital>` lookup (`default-snapshot.ts`'s `lastEffectResultsFor`)
719
+ * can find carried nothing.
720
+ */
721
+ declare function recordServerResponse(orbitalName: string, event: string, response: Omit<ServerResponseTrace, "orbitalName" | "timestamp"> & {
722
+ effectResults?: EffectTrace[];
723
+ }): void;
724
+ /** A server response's `effectResults` as timeline traces, carrying each persist's real outcome (entity, action, resulting id, denied). */
725
+ declare function serverEffectTraces(results: readonly ServerEffectResult[] | undefined): EffectTrace[];
726
+ /** Record one answered server leg on the timeline as a `server:<orbital>` trace. */
727
+ declare function recordOrbitalResponse(orbitalName: string, request: EventRequest, response: EventResponse): void;
728
+ /** `transport` with every answered post recorded on the verification timeline; the one place the circuit client's server responses are captured. */
729
+ declare function recordingTransport(transport: EventTransport): EventTransport;
730
+ declare function updateBridgeHealth(health: BridgeHealth): void;
731
+ declare function getBridgeHealth(): BridgeHealth | null;
732
+ declare function getSummary(): VerificationSummary;
733
+ declare function getSnapshot(): VerificationSnapshot;
734
+ /**
735
+ * Per-trait snapshot for the verifier.
736
+ *
737
+ * Iterates every registered trait getter and collects the live reducer
738
+ * state. Empty until at least one trait hook calls `registerTraitSnapshot`.
739
+ * A getter that throws is logged and skipped — one broken trait must not
740
+ * poison the rest of the snapshot.
741
+ */
742
+ declare function getTraitSnapshots(): TraitStateSnapshot[];
743
+ declare function subscribeToVerification(listener: ChangeListener): () => void;
744
+ declare global {
745
+ interface Window {
746
+ __orbitalVerification?: OrbitalVerificationAPI;
747
+ }
748
+ }
749
+ /** Whether a verifier is driving this page: the `__ALMADAR_VERIFY__` window flag it sets before the bundle runs. */
750
+ declare function verifierAttached(): boolean;
751
+ /**
752
+ * Wait for a transition matching the given event to appear.
753
+ * Returns the trace or null on timeout.
754
+ */
755
+ declare function waitForTransition(event: string, timeoutMs?: number): Promise<TransitionTrace | null>;
756
+ /**
757
+ * Bind the EventBus so automation can send events and log emissions.
758
+ * Call this during app initialization.
759
+ */
760
+ declare function bindEventBus(eventBus: {
761
+ emit: (type: string, payload?: EventPayload) => void;
762
+ onAny?: (listener: (event: BusEvent) => void) => () => void;
763
+ }): void;
764
+ declare function bindConfigApplier(applyConfig: NonNullable<OrbitalVerificationAPI['applyConfig']>): () => void;
765
+ /**
766
+ * Bind a trait state getter so automation can query current states.
767
+ */
768
+ declare function bindTraitStateGetter(getter: (traitName: string) => string | undefined): void;
769
+ /**
770
+ * Register a per-trait snapshot provider. The generated trait logic hook
771
+ * (or `useTraitStateMachine`) calls this once on mount, passing a getter
772
+ * that reads the current reducer state via a ref. Returns an unregister
773
+ * function for cleanup on unmount.
774
+ *
775
+ * Calling this twice for the same `traitName` replaces the previous
776
+ * getter (e.g. page navigation remounts the trait; the new registration
777
+ * wins).
778
+ */
779
+ declare function registerTraitSnapshot(traitName: string, getter: TraitSnapshotGetter): () => void;
780
+ /**
781
+ * Register a canvas frame capture function.
782
+ * Called by game organisms (IsometricCanvas, PlatformerCanvas)
783
+ * so the verifier can snapshot canvas content at checkpoints.
784
+ */
785
+ declare function bindCanvasCapture(captureFn: () => string | null): void;
786
+ /**
787
+ * Bind a reader for the last drawables list received by a canvas host.
788
+ * Lets verification scripts inspect exactly which neutral descriptors reached
789
+ * the painter without re-deriving them from state.
790
+ */
791
+ declare function bindLastDrawables(getDrawables: () => DrawableNode[] | null): void;
792
+ /**
793
+ * Update asset load status for canvas verification.
794
+ * Game organisms call this when images load or fail.
795
+ */
796
+ declare function updateAssetStatus(url: string, status: AssetLoadStatus): void;
797
+ declare function clearVerification(): void;
798
+
799
+ export { DrawFxLayer as A, DrawGroup as B, DrawMesh as C, DrawShape as E, DrawShapeLayer as F, DrawSkinnedMesh as G, DrawSprite as H, DrawSpriteLayer as I, DrawText as J, DrawTextLayer as K, bindConfigApplier as a, bindCanvasCapture as b, bindEventBus as c, bindLastDrawables as d, bindTraitStateGetter as e, clearVerification as f, getAllChecks as g, getBridgeHealth as h, getSnapshot as i, getSummary as j, getTraitSnapshots as k, getTransitions as l, getTransitionsForTrait as m, recordServerResponse as n, recordTransition as o, recordingTransport as p, registerCheck as q, recordOrbitalResponse as r, registerTraitSnapshot as s, serverEffectTraces as t, subscribeToVerification as u, updateAssetStatus as v, updateBridgeHealth as w, updateCheck as x, verifierAttached as y, waitForTransition as z };
800
+ export type { DrawableNode as D, MeshShapeKind as M, Projector as P, TraitSnapshotGetter as T };
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@almadar/shell-web",
3
- "version": "0.1.0",
3
+ "version": "1.1.0",
4
+ "orbRelease": {
5
+ "severity": "normal"
6
+ },
4
7
  "description": "Almadar TS shell web renderer pack: the browser host ports of the kernel (transports, stores, client kernel, http/oauth/os ports) and the React render substrate (components, hooks, providers, preview runtime, themes, Tailwind preset) the generated web app and the TS host program import.",
5
8
  "license": "BUSL-1.1",
6
9
  "type": "module",
@@ -61,11 +64,6 @@
61
64
  "import": "./dist/lib/index.js",
62
65
  "default": "./dist/lib/index.js"
63
66
  },
64
- "./three": {
65
- "types": "./dist/three/index.d.ts",
66
- "import": "./dist/three/index.js",
67
- "default": "./dist/three/index.js"
68
- },
69
67
  "./avl": {
70
68
  "types": "./dist/avl/index.d.ts",
71
69
  "import": "./dist/avl/index.js",
@@ -115,6 +113,7 @@
115
113
  "dist",
116
114
  "src/core/locales",
117
115
  "src/core/tokens/native-tokens.json",
116
+ "src/core/lib/band-shapes.json",
118
117
  "themes",
119
118
  "index.css",
120
119
  "tailwind-preset.cjs",
@@ -130,11 +129,11 @@
130
129
  "access": "public"
131
130
  },
132
131
  "dependencies": {
133
- "@almadar/core": "^10.129.0",
134
- "@almadar/kernel": "^18.0.0",
135
- "@almadar/logger": "^1.18.0",
136
- "@almadar/std": "^16.255.0",
137
- "@almadar/syntax": "^1.21.0",
132
+ "@almadar/core": "^11.3.0",
133
+ "@almadar/kernel": "^19.0.1",
134
+ "@almadar/logger": "^2.3.0",
135
+ "@almadar/std": "^17.1.0",
136
+ "@almadar/syntax": "^2.1.0",
138
137
  "@dnd-kit/core": "^6.3.1",
139
138
  "@dnd-kit/sortable": "^10.0.0",
140
139
  "@dnd-kit/utilities": "^3.2.2",
@@ -162,14 +161,11 @@
162
161
  "remark-math": "^6.0.0",
163
162
  "tailwind-merge": "^2.2.0",
164
163
  "zod": "^4.6.7",
165
- "@almadar/shell-browser": "^0.1.0",
166
- "@almadar/shell-runtime": "^0.1.0"
164
+ "@almadar/shell-browser": "^1.1.0",
165
+ "@almadar/shell-runtime": "^1.1.0"
167
166
  },
168
167
  "devDependencies": {
169
- "@almadar/eslint-plugin": "^2.22.0",
170
- "@react-three/drei": "^10.7.7",
171
- "@react-three/fiber": "^9.6.0",
172
- "@react-three/postprocessing": "3.0.4",
168
+ "@almadar/eslint-plugin": "^3.0.0",
173
169
  "@tanstack/react-query": "^5.0.0",
174
170
  "@testing-library/jest-dom": "^6.4.0",
175
171
  "@testing-library/react": "^14.2.0",
@@ -180,7 +176,6 @@
180
176
  "@types/react": "^19.0.0",
181
177
  "@types/react-dom": "^19.0.0",
182
178
  "@types/react-syntax-highlighter": "^15.5.0",
183
- "@types/three": "^0.160.0",
184
179
  "@typescript-eslint/parser": "8.65.0",
185
180
  "@typescript/native": "npm:typescript@^7.0.2",
186
181
  "@vitejs/plugin-react": "^4.2.0",
@@ -194,14 +189,11 @@
194
189
  "jsdom": "^24.0.0",
195
190
  "katex": "^0.16.0",
196
191
  "postcss": "^8.4.35",
197
- "postprocessing": "6.39.0",
198
192
  "react": "^19.0.0",
199
193
  "react-compiler-runtime": "19.0.0-beta-af1b7da-20250417",
200
194
  "react-dom": "^19.0.0",
201
195
  "react-router-dom": "^7.18.2",
202
196
  "tailwindcss": "^3.4.0",
203
- "three": "^0.160.1",
204
- "three-stdlib": "^2.35.6",
205
197
  "tsup": "^9.0.0",
206
198
  "tsx": "^4.7.0",
207
199
  "turbo": "^2.8.17",
@@ -219,30 +211,14 @@
219
211
  "node": ">=22.19.0"
220
212
  },
221
213
  "peerDependencies": {
222
- "@react-three/drei": "^10.7.7",
223
- "@react-three/fiber": "^9.0.0",
224
- "@react-three/postprocessing": "^3.0.0",
225
214
  "@tanstack/react-query": "^5.0.0",
226
215
  "postcss": "^8.4.35",
227
216
  "react": ">=18.0.0",
228
217
  "react-dom": ">=18.0.0",
229
218
  "react-router-dom": "^7.0.0",
230
- "tailwindcss": "^3.4.0",
231
- "three": "^0.160.0"
219
+ "tailwindcss": "^3.4.0"
232
220
  },
233
221
  "peerDependenciesMeta": {
234
- "@react-three/drei": {
235
- "optional": true
236
- },
237
- "@react-three/fiber": {
238
- "optional": true
239
- },
240
- "@react-three/postprocessing": {
241
- "optional": true
242
- },
243
- "three": {
244
- "optional": true
245
- },
246
222
  "postcss": {
247
223
  "optional": true
248
224
  },
@@ -0,0 +1,7 @@
1
+ {
2
+ "wave": "M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z",
3
+ "arc": "M0 100 Q720 0 1440 100 Z",
4
+ "tilt": "M0 100 L1440 0 V100 Z",
5
+ "step": "M0 100 V75 H360 V50 H720 V25 H1080 V0 H1440 V100 Z",
6
+ "scallop": "M0 100 V40 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 a60 40 0 0 1 120 0 V100 Z"
7
+ }
@@ -109,6 +109,9 @@
109
109
  "aria.closeToast": "إغلاق التنبيه",
110
110
  "aria.closeAlert": "إغلاق التنبيه",
111
111
  "aria.removeFilter": "إزالة الفلتر",
112
+ "aria.chart": "مخطط",
113
+ "aria.graph": "مخطط شبكي",
114
+ "aria.pageNavigation": "التنقل بين الصفحات",
112
115
  "aria.closeDrawer": "إغلاق اللوحة",
113
116
  "aria.closePanel": "إغلاق اللوحة",
114
117
  "aria.dockPanel": "اللوحة الجانبية",
@@ -323,6 +326,15 @@
323
326
  "docSearch.placeholder": "البحث في الوثائق...",
324
327
  "stateMachine.loading": "جارٍ تحميل آلة الحالة…",
325
328
  "stateMachine.noStateMachine": "لا توجد آلة حالة لعرضها",
329
+ "stateMachine.background": "يعمل في الخلفية",
330
+ "stateMachine.linked": "مدارات أخرى تتحدث معها هذه الصفحة",
331
+ "stateMachine.guarded": "محروس: يعمل فقط عندما يتحقق شرطه",
332
+ "stateMachine.selfEvents": "{{state}}: {{count}} أحداث تبقى في هذه الحالة",
333
+ "stateMachine.boxLabel": "{{trait}}: {{state}} ({{count}} حالات)",
334
+ "stateMachine.boxLabelIdle": "{{trait}} ({{count}} حالات)",
335
+ "stateMachine.wireLabel": "{{from}} يرسل {{event}} إلى {{to}}",
336
+ "stateMachine.expand": "افتح {{trait}} في مكانه",
337
+ "stateMachine.collapse": "أغلق {{trait}}",
326
338
  "avl.trigger": "المُشغِّل",
327
339
  "avl.guard": "الحارس",
328
340
  "avl.effects": "التأثيرات",
@@ -340,6 +352,8 @@
340
352
  "avl.noTraitData": "لا توجد بيانات سمة",
341
353
  "avl.computingLayout": "جارٍ حساب التخطيط...",
342
354
  "avl.noStateMachine": "لا توجد آلة حالات",
355
+ "avl.layoutFailed": "تعذّر تحميل تخطيط آلة الحالات.",
356
+ "avl.pendingSourceState": "تم تحديد مصدر الانتقال",
343
357
  "avl.listensFor": "يستمع إلى {{event}}",
344
358
  "avl.emits": "يُصدر {{event}}",
345
359
  "avl.pageLayout": "تخطيط الصفحة",
@@ -906,6 +920,7 @@
906
920
  "gridPicker.all": "الكل",
907
921
  "gridPicker.moreRefine": "+{{count}} أخرى — دقّق بحثك",
908
922
  "graphCanvas.noNodes": "لا توجد عقد لعرضها.",
923
+ "graphCanvas.selectedNode": "المحدد: {{label}}",
909
924
  "codeBlock.noCode": "لا يوجد كود لعرضه.",
910
925
  "codeBlock.region": "الشيفرة البرمجية",
911
926
  "fab.action": "إجراء",
@@ -948,10 +963,6 @@
948
963
  "videoEmbed.notFound": "لم يتم العثور على الفيديو أو أنه خاص",
949
964
  "videoEmbed.notEmbeddable": "مالك الفيديو لا يسمح بتضمينه",
950
965
  "videoEmbed.noVideo": "لم يتم اختيار فيديو",
951
- "themeToggle.switchToLight": "التبديل إلى الوضع الفاتح",
952
- "themeToggle.switchToDark": "التبديل إلى الوضع الداكن",
953
- "themeToggle.light": "فاتح",
954
- "themeToggle.dark": "داكن",
955
966
  "avatar.alt": "الصورة الرمزية",
956
967
  "avatar.status": "الحالة: {{status}}",
957
968
  "avatar.status.online": "متصل",
@@ -1259,5 +1270,7 @@
1259
1270
  "debug.replayForward": "الخطوة التالية",
1260
1271
  "debug.replayPlay": "تشغيل",
1261
1272
  "debug.replayPause": "إيقاف مؤقت",
1262
- "debug.replayStep": "{{step}} / {{total}}"
1273
+ "debug.replayStep": "{{step}} / {{total}}",
1274
+ "stateMachine.inspect": "فحص: اختر سمة من الصفحة",
1275
+ "stateMachine.inspectHint": "انقر جزءًا من الصفحة · Esc للإيقاف"
1263
1276
  }