@almadar/shell-web 0.1.0 → 1.0.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 (118) hide show
  1. package/dist/{ArbitraryClassCompiler-Mzabq-UB.d.ts → ArbitraryClassCompiler-CO_iASBn.d.ts} +99 -4
  2. package/dist/AvlGlyph-EPJKFEO3.js +6 -0
  3. package/dist/AvlStateMachine-RKZIKNGC.js +9 -0
  4. package/dist/AvlTransitionDetail-63SD6GZF.js +11 -0
  5. package/dist/AvlTransitionExplainer-ZBTLOM3T.js +12 -0
  6. package/dist/BehaviorView-YS5G4GNB.js +11 -0
  7. package/dist/{Canvas3DHost-_Y-5uLM_.d.ts → Canvas3DHost-BkZQB5l2.d.ts} +1 -1
  8. package/dist/{EventBusProvider-CVwjkV_2.d.ts → EventBusProvider-BFFHfN4O.d.ts} +12 -0
  9. package/dist/FlowCanvas-AUMTWMNG.js +26 -0
  10. package/dist/{GameAudioProvider-Cm9BnvmP.d.ts → GameAudioProvider-ceM_n0ey.d.ts} +4 -7
  11. package/dist/KernelEngineContext-CcxGYtlr.d.ts +33 -0
  12. package/dist/LayersPanel-M2LHWUFF.js +6 -0
  13. package/dist/ModuleCard-QHDGK5XK.js +7 -0
  14. package/dist/OrbInspector-QCPEPUPH.js +26 -0
  15. package/dist/{Select-mDZIwNqN.d.ts → Select-B-iDdnvE.d.ts} +16 -30
  16. package/dist/ServerBridge-Bqsj-lOU.d.ts +124 -0
  17. package/dist/UISlotRenderer-C7WWOK43.js +26 -0
  18. package/dist/auth/browser/index.js +1 -0
  19. package/dist/auth/react/index.d.ts +8 -1
  20. package/dist/auth/react/index.js +40 -2
  21. package/dist/avl/index.d.ts +89 -79
  22. package/dist/avl/index.js +38 -38
  23. package/dist/{avl-3d-context-BIRKWpaL.d.ts → avl-3d-context-BycmO6tG.d.ts} +9 -12
  24. package/dist/{chunk-GKIFONTE.js → chunk-3S54FWRC.js} +2 -2
  25. package/dist/{chunk-DYEKAA4L.js → chunk-3VZ36ZKO.js} +240 -252
  26. package/dist/{chunk-PC7K4SK7.js → chunk-4T3P43NS.js} +18 -269
  27. package/dist/{chunk-MBQAMMSE.js → chunk-4YXBKHHM.js} +269 -658
  28. package/dist/{chunk-YDNJLLG6.js → chunk-57DC34LY.js} +19 -10
  29. package/dist/{chunk-SJGJJKBY.js → chunk-AB3X7QTE.js} +6 -3
  30. package/dist/{chunk-AILY3XPS.js → chunk-AE7VCQB6.js} +5 -6
  31. package/dist/{chunk-FAJDTHWC.js → chunk-AGXD77SL.js} +2 -2
  32. package/dist/chunk-AU7O65OX.js +66 -0
  33. package/dist/{chunk-L677XGY3.js → chunk-CPLN6NBQ.js} +5 -5
  34. package/dist/{chunk-DZ42OJQC.js → chunk-DZBQA2OW.js} +1 -1
  35. package/dist/{chunk-2PY54Z44.js → chunk-E6KA4J6N.js} +5 -5
  36. package/dist/{chunk-DJ433ET5.js → chunk-GFXCPUMX.js} +11 -4
  37. package/dist/{chunk-FP3WIKTC.js → chunk-HH5KSMH5.js} +9 -1
  38. package/dist/{chunk-U6QRZASX.js → chunk-ILQXJ2AR.js} +1 -1
  39. package/dist/{chunk-B4BU77LT.js → chunk-ILZ7ORX7.js} +1 -1
  40. package/dist/{chunk-SGM3FASH.js → chunk-K4MOPSEL.js} +14 -12
  41. package/dist/{chunk-GYTPOFVC.js → chunk-LHP2TK7O.js} +7402 -6970
  42. package/dist/{chunk-VFF5OO47.js → chunk-PCR37T3U.js} +15 -38
  43. package/dist/{chunk-R5O5AUPI.js → chunk-PRXQGGCO.js} +93 -86
  44. package/dist/{chunk-42FY4RYA.js → chunk-REXYVBUO.js} +2 -2
  45. package/dist/{chunk-DLZF4PVE.js → chunk-ROICKAU7.js} +3 -3
  46. package/dist/{chunk-KVQS4GXU.js → chunk-SP5CDJ6K.js} +18 -8
  47. package/dist/{chunk-P4LNHAFI.js → chunk-TUPZWTRE.js} +2 -2
  48. package/dist/chunk-TXAUOLWZ.js +490 -0
  49. package/dist/{chunk-EQAMU2ZC.js → chunk-UTDC2NEA.js} +1 -1
  50. package/dist/{chunk-73SRAB4P.js → chunk-UU57VNS2.js} +2 -2
  51. package/dist/{chunk-DFNZUYX4.js → chunk-UXLE3IPR.js} +70 -27
  52. package/dist/{chunk-L2DEKY4J.js → chunk-VO2TTLS5.js} +3 -6
  53. package/dist/{chunk-TESBIVUA.js → chunk-X3DMMX27.js} +2 -2
  54. package/dist/components/index.d.ts +331 -125
  55. package/dist/components/index.js +28 -28
  56. package/dist/context/index.d.ts +2 -3
  57. package/dist/context/index.js +4 -3
  58. package/dist/core.d.ts +93 -17
  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/hooks/index.d.ts +40 -5
  63. package/dist/hooks/index.js +5 -4
  64. package/dist/index.d.ts +36 -114
  65. package/dist/index.js +174 -34
  66. package/dist/kernel-client-TZKGHJRY.js +516 -0
  67. package/dist/kernel-wire-wNdAPfhJ.d.ts +88 -0
  68. package/dist/lib/index.d.ts +3 -3
  69. package/dist/lib/index.js +5 -4
  70. package/dist/{paintDispatch-ChW5mVuK.d.ts → paintDispatch-CuJLsr9Y.d.ts} +5 -15
  71. package/dist/{prism-AIWGN2X5.js → prism-X5YWKXO5.js} +5 -3
  72. package/dist/providers/index.d.ts +42 -27
  73. package/dist/providers/index.js +22 -23
  74. package/dist/renderer/index.d.ts +0 -2
  75. package/dist/renderer/index.js +1 -0
  76. package/dist/runtime/index.d.ts +52 -253
  77. package/dist/runtime/index.js +21 -24
  78. package/dist/ssr/index.cjs +2643 -535
  79. package/dist/ssr/index.d.cts +0 -23
  80. package/dist/ssr/index.d.ts +0 -23
  81. package/dist/ssr/index.js +2639 -535
  82. package/dist/storage/browser/index.js +1 -0
  83. package/dist/test-support.d.ts +15 -8
  84. package/dist/test-support.js +91 -24
  85. package/dist/three/index.d.ts +6 -6
  86. package/dist/three/index.js +49 -37
  87. package/dist/{verificationRegistry-CabxhfTv.d.ts → verificationRegistry-CVrcxG1s.d.ts} +3 -3
  88. package/package.json +13 -9
  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/BehaviorValueFrame-SSEMEBTG.css +0 -1756
  100. package/dist/BehaviorView-RFEE5J6E.js +0 -10
  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/ServerBridge-Cm1On51b.d.ts +0 -233
  107. package/dist/TraitValueFrame-2PJGLLVI.js +0 -28
  108. package/dist/TraitValueFrame-4G3KOUBR.css +0 -1756
  109. package/dist/UISlotRenderer-JKFSX24W.js +0 -27
  110. package/dist/UserContext-DqWeZkUZ.d.ts +0 -100
  111. package/dist/chunk-2QOH2HWM.js +0 -95
  112. package/dist/chunk-6P3MWXYE.js +0 -440
  113. package/dist/chunk-FIW6WN23.js +0 -508
  114. package/dist/chunk-GAR5TQ5B.js +0 -199
  115. package/dist/chunk-ZO6MXAS3.js +0 -69
  116. package/dist/kernel-client-ZH4PSMCN.js +0 -367
  117. package/dist/kernel-wire-B4S8pnP3.d.ts +0 -65
  118. package/dist/useKeyboardRouter-Dsq553Ur.d.ts +0 -42
@@ -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-3VZ36ZKO.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-TZKGHJRY.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,18 +1,18 @@
1
- import { C as CanvasPointLightConfig } from '../Canvas3DHost-_Y-5uLM_.js';
1
+ import { C as CanvasPointLightConfig } from '../Canvas3DHost-BkZQB5l2.js';
2
2
  import { IsometricTile, IsometricUnit, IsometricFeature } from '../components/index.js';
3
- export { c as Canvas3DHost, d as Canvas3DHostHandle, e as Canvas3DHostProps, c as GameCanvas3D, U as UnitAnimationState } from '../Canvas3DHost-_Y-5uLM_.js';
3
+ export { c as Canvas3DHost, d as Canvas3DHostHandle, e as Canvas3DHostProps, c as GameCanvas3D, U as UnitAnimationState } from '../Canvas3DHost-BkZQB5l2.js';
4
4
  import React__default, { Component, ReactNode, ErrorInfo } from 'react';
5
5
  import * as THREE from 'three';
6
6
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
7
7
  import { JsonObject, EventEmit, OrbitalSchema } from '@almadar/core';
8
8
  import { ZoomLevel } from '../avl/index.js';
9
- import { b as Avl3DModelOverrides } from '../avl-3d-context-BIRKWpaL.js';
10
- export { d as AVL_3D_COLORS, A as Avl3DConfig, a as Avl3DContext, C as CAMERA_POSITIONS, P as Position3D, e as arcCurve3D, f as fibonacciSpherePositions, g as goldenSpiralPositions, o as orbitRingPositions, s as selfLoopCurve3D, t as treeLayout3D, u as useAvl3DConfig } from '../avl-3d-context-BIRKWpaL.js';
9
+ import { b as Avl3DModelOverrides } from '../avl-3d-context-BycmO6tG.js';
10
+ export { d as AVL_3D_COLORS, A as Avl3DConfig, a as Avl3DContext, C as CAMERA_POSITIONS, P as Position3D, e as arcCurve3D, f as fibonacciSpherePositions, g as goldenSpiralPositions, o as orbitRingPositions, s as selfLoopCurve3D, t as treeLayout3D, u as useAvl3DConfig } from '../avl-3d-context-BycmO6tG.js';
11
11
  import { ApplicationLevelData, OrbitalLevelData, TraitLevelData, TransitionLevelData } from '../avl/index.js';
12
- import '../paintDispatch-ChW5mVuK.js';
12
+ import '../paintDispatch-CuJLsr9Y.js';
13
13
  import '../fx-CmQjnHmT.js';
14
14
  import 'lucide-react';
15
- import '../EventBusProvider-CVwjkV_2.js';
15
+ import '../EventBusProvider-BFFHfN4O.js';
16
16
 
17
17
  /**
18
18
  * Scene3D
@@ -1,13 +1,13 @@
1
- import { goldenSpiralPositions, forceDirectedPositions, Avl3DOrbitalNode, Avl3DCrossWire, Avl3DEntityCore, fibonacciSpherePositions, Avl3DLabel, Avl3DStateNode, Avl3DTransitionArc, Avl3DExprTree, AVL_3D_COLORS, zoomReducer, initialZoomState, CAMERA_POSITIONS, getBreadcrumbs, Avl3DTooltip } from '../chunk-DJ433ET5.js';
2
- export { AVL_3D_COLORS, CAMERA_POSITIONS, arcCurve3D, fibonacciSpherePositions, goldenSpiralPositions, orbitRingPositions, selfLoopCurve3D, treeLayout3D } from '../chunk-DJ433ET5.js';
1
+ "use client";
2
+ import { goldenSpiralPositions, forceDirectedPositions, Avl3DOrbitalNode, Avl3DCrossWire, Avl3DEntityCore, fibonacciSpherePositions, Avl3DLabel, Avl3DStateNode, Avl3DTransitionArc, Avl3DExprTree, AVL_3D_COLORS, zoomReducer, initialZoomState, CAMERA_POSITIONS, getBreadcrumbs, Avl3DTooltip } from '../chunk-GFXCPUMX.js';
3
+ export { AVL_3D_COLORS, CAMERA_POSITIONS, arcCurve3D, fibonacciSpherePositions, goldenSpiralPositions, orbitRingPositions, selfLoopCurve3D, treeLayout3D } from '../chunk-GFXCPUMX.js';
3
4
  import { useAvl3DPalette, Avl3DContext } from '../chunk-EOWMARUB.js';
4
5
  export { Avl3DContext, useAvl3DConfig } from '../chunk-EOWMARUB.js';
5
- import { useOnScreen, useCanvasTheme, withSeries, resolveDrawableColors, markColor, applySceneMaterials, collectDrawnItems, buildHitIndex, withPreviewPosition, isValidScenePos, isAnimatedShape, applyShapeAnimation, expandFxLayer, isAnimatedGroup, applyMeshAnimation, spriteAssetState, SPRITE_FALLBACK_FILL, isAnimatedMesh, clampSegments, polyhedronBounds } from '../chunk-PC7K4SK7.js';
6
- import { parseTransitionLevel, parseTraitLevel, parseOrbitalLevel, parseApplicationLevel } from '../chunk-VFF5OO47.js';
7
- import { AVL_INK, resolveThemeColor } from '../chunk-DFNZUYX4.js';
8
- import { keyMapCode, resolveKeyMapEvent } from '../chunk-B4BU77LT.js';
9
- import '../chunk-DYEKAA4L.js';
10
- import { useEventBus, useTranslate, cn, useEmitEvent, isAtlasAsset, getAtlas, subRectFor, Box, HStack, Typography, pressableProps, useTheme, useThemeScope } from '../chunk-MBQAMMSE.js';
6
+ import { useOnScreen, useCanvasTheme, withSeries, resolveDrawableColors, markColor, applySceneMaterials, collectDrawnItems, buildHitIndex, withPreviewPosition, isValidScenePos, isAnimatedShape, applyShapeAnimation, expandFxLayer, isAnimatedGroup, applyMeshAnimation, spriteAssetState, SPRITE_FALLBACK_FILL, isAnimatedMesh, clampSegments, polyhedronBounds } from '../chunk-4T3P43NS.js';
7
+ import { parseTransitionLevel, parseTraitLevel, parseOrbitalLevel, parseApplicationLevel } from '../chunk-PCR37T3U.js';
8
+ import { AVL_INK, resolveThemeColor } from '../chunk-UXLE3IPR.js';
9
+ import { keyMapCode, resolveKeyMapEvent } from '../chunk-ILZ7ORX7.js';
10
+ import { usePrefersReducedMotion, useEventBus, useTranslate, cn, useEmitEvent, isAtlasAsset, getAtlas, subRectFor, Box, HStack, Typography, pressableProps, useTheme, useThemeScope } from '../chunk-4YXBKHHM.js';
11
11
  import '../chunk-G7DCAZ22.js';
12
12
  import React3, { createContext, forwardRef, useRef, useState, useMemo, useEffect, useCallback, useImperativeHandle, Component, useContext, useReducer, useLayoutEffect } from 'react';
13
13
  import { Canvas, useThree, useFrame } from '@react-three/fiber';
@@ -46,12 +46,12 @@ function useGameCanvas3DEvents(options) {
46
46
  (tile, event) => {
47
47
  if (tileClickEvent) {
48
48
  emit(tileClickEvent, {
49
- tileId: tile.id,
49
+ ...tile.id !== void 0 ? { tileId: tile.id } : {},
50
50
  x: tile.x,
51
51
  z: tile.z ?? tile.y ?? 0,
52
- type: tile.type,
53
- terrain: tile.terrain,
54
- elevation: tile.elevation
52
+ ...tile.type !== void 0 ? { type: tile.type } : {},
53
+ ...tile.terrain !== void 0 ? { terrain: tile.terrain } : {},
54
+ ...tile.elevation !== void 0 ? { elevation: tile.elevation } : {}
55
55
  });
56
56
  }
57
57
  optionsRef.current.onTileClick?.(tile, event);
@@ -63,14 +63,14 @@ function useGameCanvas3DEvents(options) {
63
63
  if (unitClickEvent) {
64
64
  emit(unitClickEvent, {
65
65
  unitId: unit.id,
66
- x: unit.x,
66
+ ...unit.x !== void 0 ? { x: unit.x } : {},
67
67
  z: unit.z ?? unit.y ?? 0,
68
- unitType: unit.unitType,
69
- name: unit.name,
70
- team: unit.team,
71
- faction: unit.faction,
72
- health: unit.health,
73
- maxHealth: unit.maxHealth
68
+ ...unit.unitType !== void 0 ? { unitType: unit.unitType } : {},
69
+ ...unit.name !== void 0 ? { name: unit.name } : {},
70
+ ...unit.team !== void 0 ? { team: unit.team } : {},
71
+ ...unit.faction !== void 0 ? { faction: unit.faction } : {},
72
+ ...unit.health !== void 0 ? { health: unit.health } : {},
73
+ ...unit.maxHealth !== void 0 ? { maxHealth: unit.maxHealth } : {}
74
74
  });
75
75
  }
76
76
  optionsRef.current.onUnitClick?.(unit, event);
@@ -81,11 +81,11 @@ function useGameCanvas3DEvents(options) {
81
81
  (feature, event) => {
82
82
  if (featureClickEvent) {
83
83
  emit(featureClickEvent, {
84
- featureId: feature.id,
84
+ ...feature.id !== void 0 ? { featureId: feature.id } : {},
85
85
  x: feature.x,
86
86
  z: feature.z ?? feature.y ?? 0,
87
87
  type: feature.type,
88
- elevation: feature.elevation
88
+ ...feature.elevation !== void 0 ? { elevation: feature.elevation } : {}
89
89
  });
90
90
  }
91
91
  optionsRef.current.onFeatureClick?.(feature, event);
@@ -110,10 +110,10 @@ function useGameCanvas3DEvents(options) {
110
110
  if (tile) {
111
111
  if (tileHoverEvent) {
112
112
  emit(tileHoverEvent, {
113
- tileId: tile.id,
113
+ ...tile.id !== void 0 ? { tileId: tile.id } : {},
114
114
  x: tile.x,
115
115
  z: tile.z ?? tile.y ?? 0,
116
- type: tile.type
116
+ ...tile.type !== void 0 ? { type: tile.type } : {}
117
117
  });
118
118
  }
119
119
  } else {
@@ -406,10 +406,11 @@ function FollowCamera3D({
406
406
  offset
407
407
  }) {
408
408
  const { camera } = useThree();
409
+ const reducedMotion = usePrefersReducedMotion();
409
410
  const look = useRef(new THREE5.Vector3(target[0], target[1], target[2]));
410
411
  const goal = useRef(new THREE5.Vector3());
411
412
  useFrame((_, delta) => {
412
- const t = Math.min(1, delta * 5);
413
+ const t = reducedMotion ? 1 : Math.min(1, delta * 5);
413
414
  goal.current.set(target[0] + offset[0], target[1] + offset[1], target[2] + offset[2]);
414
415
  camera.position.lerp(goal.current, t);
415
416
  look.current.lerp(goal.current.set(target[0], target[1], target[2]), t);
@@ -565,8 +566,9 @@ function ModelLoader({
565
566
  action.fadeOut(0.15);
566
567
  };
567
568
  }, [mixer, clips, animation]);
569
+ const reducedMotion = usePrefersReducedMotion();
568
570
  useFrame((_, delta) => {
569
- mixer?.update(delta);
571
+ if (!reducedMotion) mixer?.update(delta);
570
572
  });
571
573
  const normFactor = useMemo(() => {
572
574
  if (!model) return 1;
@@ -818,8 +820,9 @@ function Shape3D({ node, projector, groupOpacity = 1 }) {
818
820
  const animated = isAnimatedShape(node);
819
821
  const validPos = isValidScenePos(node.position);
820
822
  const world = validPos ? projector.toWorld(node.position) : [0, 0, 0];
823
+ const reducedMotion = usePrefersReducedMotion();
821
824
  useFrame(({ clock }) => {
822
- if (!animated || !groupRef.current) return;
825
+ if (!animated || reducedMotion || !groupRef.current) return;
823
826
  const view = applyShapeAnimation(node, clock.elapsedTime * 1e3);
824
827
  groupRef.current.position.set(
825
828
  world[0] + (view.offsetX ?? 0) * projector.cellSize,
@@ -1098,8 +1101,9 @@ function Mesh3D({
1098
1101
  const g = geo?.geometry;
1099
1102
  return () => g?.dispose();
1100
1103
  }, [geo]);
1104
+ const reducedMotion = usePrefersReducedMotion();
1101
1105
  useFrame(({ clock }) => {
1102
- if (!animated || !groupRef.current) return;
1106
+ if (!animated || reducedMotion || !groupRef.current) return;
1103
1107
  const state = applyMeshAnimation(node, clock.elapsedTime * 1e3);
1104
1108
  if (!state) return;
1105
1109
  const [wx, wy, wz] = baseWorld;
@@ -1230,8 +1234,9 @@ function Group3D({
1230
1234
  if (!node.bone || !boneStore || !boneObject) return;
1231
1235
  return boneStore.register(node.bone, boneObject);
1232
1236
  }, [node.bone, boneStore, boneObject]);
1237
+ const reducedMotion = usePrefersReducedMotion();
1233
1238
  useFrame(({ clock }) => {
1234
- if (!animated || !ref.current) return;
1239
+ if (!animated || reducedMotion || !ref.current) return;
1235
1240
  const state = applyMeshAnimation(node, clock.elapsedTime * 1e3);
1236
1241
  if (!state) return;
1237
1242
  const cell = projector.cellSize;
@@ -1260,12 +1265,13 @@ function FxLayer3D({
1260
1265
  }) {
1261
1266
  const [, setFrame] = useState(0);
1262
1267
  const live = Array.isArray(node.items) && node.items.length > 0;
1268
+ const reducedMotion = usePrefersReducedMotion();
1263
1269
  useFrame(() => {
1264
- if (live) setFrame((f) => (f + 1) % 1e6);
1270
+ if (live && !reducedMotion) setFrame((f) => (f + 1) % 1e6);
1265
1271
  });
1266
1272
  if (!live) return null;
1267
1273
  const epochNow = typeof performance !== "undefined" ? performance.timeOrigin + performance.now() : 0;
1268
- const children = expandFxLayer(node, epochNow, "3d", void 0, void 0);
1274
+ const children = expandFxLayer(node, epochNow, "3d", projector.cellSize, void 0);
1269
1275
  return /* @__PURE__ */ jsx(Fragment, { children: children.map((c, i) => /* @__PURE__ */ jsx(Drawable3D, { node: c, projector, groupOpacity }, i)) });
1270
1276
  }
1271
1277
  var DEFAULT_GRID_CONFIG = {
@@ -1344,6 +1350,7 @@ var Canvas3DHost = forwardRef(
1344
1350
  moveEvent
1345
1351
  }, ref) => {
1346
1352
  const containerRef = useRef(null);
1353
+ const reducedMotion = usePrefersReducedMotion();
1347
1354
  const onScreen = useOnScreen(containerRef);
1348
1355
  const controlsRef = useRef(null);
1349
1356
  const [internalError, setInternalError] = useState(null);
@@ -1767,7 +1774,7 @@ var Canvas3DHost = forwardRef(
1767
1774
  ref: controlsRef,
1768
1775
  enabled: controlsEnabled && !editable && cameraMode !== "follow" && cameraMode !== "chase",
1769
1776
  target: cameraTarget,
1770
- enableDamping: true,
1777
+ enableDamping: !reducedMotion,
1771
1778
  dampingFactor: 0.05,
1772
1779
  enableZoom: true,
1773
1780
  enablePan: true,
@@ -1853,6 +1860,7 @@ var Camera3D = forwardRef(
1853
1860
  return () => {
1854
1861
  };
1855
1862
  }, [mode, fov, zoom, viewport.aspect, set]);
1863
+ const reducedMotion = usePrefersReducedMotion();
1856
1864
  useFrame(() => {
1857
1865
  if (onChange) {
1858
1866
  onChange(camera);
@@ -1898,7 +1906,7 @@ var Camera3D = forwardRef(
1898
1906
  minDistance,
1899
1907
  maxDistance,
1900
1908
  maxPolarAngle,
1901
- enableDamping: true,
1909
+ enableDamping: !reducedMotion,
1902
1910
  dampingFactor: 0.05
1903
1911
  }
1904
1912
  );
@@ -3010,8 +3018,9 @@ var Avl3DApplicationScene = ({
3010
3018
  });
3011
3019
  return map;
3012
3020
  }, [data.orbitals, orbitalPositions]);
3021
+ const reducedMotion = usePrefersReducedMotion();
3013
3022
  useFrame((_, delta) => {
3014
- if (!groupRef.current) return;
3023
+ if (!groupRef.current || reducedMotion) return;
3015
3024
  groupRef.current.rotation.y += delta * 0.03;
3016
3025
  });
3017
3026
  return /* @__PURE__ */ jsxs("group", { ref: groupRef, children: [
@@ -3068,8 +3077,9 @@ function TraitOrbit({
3068
3077
  const angleRef = useRef(Math.random() * Math.PI * 2);
3069
3078
  const palette = useAvl3DPalette();
3070
3079
  const { t } = useTranslate();
3080
+ const reducedMotion = usePrefersReducedMotion();
3071
3081
  useFrame((_, delta) => {
3072
- angleRef.current += delta * speed;
3082
+ if (!reducedMotion) angleRef.current += delta * speed;
3073
3083
  if (!groupRef.current) return;
3074
3084
  const x = radius * Math.cos(angleRef.current);
3075
3085
  const flatZ = radius * Math.sin(angleRef.current);
@@ -3589,20 +3599,21 @@ function CameraController({ targetPosition, targetLookAt, animated }) {
3589
3599
  const targetPosVec = useRef(new THREE5.Vector3(...targetPosition));
3590
3600
  const targetLookVec = useRef(new THREE5.Vector3(...targetLookAt));
3591
3601
  const isAnimating = useRef(false);
3602
+ const reducedMotion = usePrefersReducedMotion();
3592
3603
  useEffect(() => {
3593
3604
  const newTarget = new THREE5.Vector3(...targetPosition);
3594
3605
  const newLookAt = new THREE5.Vector3(...targetLookAt);
3595
3606
  if (!newTarget.equals(targetPosVec.current) || !newLookAt.equals(targetLookVec.current)) {
3596
3607
  targetPosVec.current.copy(newTarget);
3597
3608
  targetLookVec.current.copy(newLookAt);
3598
- if (animated) {
3609
+ if (animated && !reducedMotion) {
3599
3610
  isAnimating.current = true;
3600
3611
  } else {
3601
3612
  camera.position.copy(targetPosVec.current);
3602
3613
  camera.lookAt(targetLookVec.current.x, targetLookVec.current.y, targetLookVec.current.z);
3603
3614
  }
3604
3615
  }
3605
- }, [targetPosition, targetLookAt, animated, camera]);
3616
+ }, [targetPosition, targetLookAt, animated, reducedMotion, camera]);
3606
3617
  useFrame((_, delta) => {
3607
3618
  if (!isAnimating.current) return;
3608
3619
  const speed = 3;
@@ -3620,10 +3631,11 @@ function CameraController({ targetPosition, targetLookAt, animated }) {
3620
3631
  function SceneFade({ animating, children }) {
3621
3632
  const groupRef = useRef(null);
3622
3633
  const opacityRef = useRef(1);
3634
+ const reducedMotion = usePrefersReducedMotion();
3623
3635
  useFrame((_, delta) => {
3624
3636
  if (!groupRef.current) return;
3625
3637
  const target = animating ? 0 : 1;
3626
- opacityRef.current = THREE5.MathUtils.damp(opacityRef.current, target, 5, delta);
3638
+ opacityRef.current = reducedMotion ? target : THREE5.MathUtils.damp(opacityRef.current, target, 5, delta);
3627
3639
  groupRef.current.visible = opacityRef.current > 0.05;
3628
3640
  const s = 0.9 + opacityRef.current * 0.1;
3629
3641
  groupRef.current.scale.setScalar(s);
@@ -1,5 +1,5 @@
1
- import { D as DrawableNode } from './paintDispatch-ChW5mVuK.js';
2
- import { OrbitalVerificationAPI, TraitStateSnapshot, EventPayload, BusEvent, VerificationCheck, BridgeHealth, VerificationSnapshot, VerificationSummary, TransitionTrace, OrbitalEventRequest, OrbitalEventResponse, ServerResponseTrace, EffectTrace, CheckStatus, ServerEffectResult, AssetLoadStatus } from '@almadar/core';
1
+ import { D as DrawableNode } from './paintDispatch-CuJLsr9Y.js';
2
+ import { OrbitalVerificationAPI, TraitStateSnapshot, EventPayload, BusEvent, VerificationCheck, BridgeHealth, VerificationSnapshot, VerificationSummary, TransitionTrace, EventRequest, EventResponse, ServerResponseTrace, EffectTrace, CheckStatus, ServerEffectResult, AssetLoadStatus } from '@almadar/core';
3
3
  import { EventTransport } from '@almadar/shell-runtime/client/EventTransport';
4
4
  import './verification-C5pTeMJv.js';
5
5
 
@@ -46,7 +46,7 @@ declare function recordServerResponse(orbitalName: string, event: string, respon
46
46
  /** A server response's `effectResults` as timeline traces, carrying each persist's real outcome (entity, action, resulting id, denied). */
47
47
  declare function serverEffectTraces(results: readonly ServerEffectResult[] | undefined): EffectTrace[];
48
48
  /** Record one answered server leg on the timeline as a `server:<orbital>` trace. */
49
- declare function recordOrbitalResponse(orbitalName: string, request: OrbitalEventRequest, response: OrbitalEventResponse): void;
49
+ declare function recordOrbitalResponse(orbitalName: string, request: EventRequest, response: EventResponse): void;
50
50
  /** `transport` with every answered post recorded on the verification timeline; the one place the circuit client's server responses are captured. */
51
51
  declare function recordingTransport(transport: EventTransport): EventTransport;
52
52
  declare function updateBridgeHealth(health: BridgeHealth): void;
package/package.json CHANGED
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "name": "@almadar/shell-web",
3
- "version": "0.1.0",
3
+ "version": "1.0.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",
@@ -115,6 +118,7 @@
115
118
  "dist",
116
119
  "src/core/locales",
117
120
  "src/core/tokens/native-tokens.json",
121
+ "src/core/lib/band-shapes.json",
118
122
  "themes",
119
123
  "index.css",
120
124
  "tailwind-preset.cjs",
@@ -130,11 +134,11 @@
130
134
  "access": "public"
131
135
  },
132
136
  "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",
137
+ "@almadar/core": "^11.1.0",
138
+ "@almadar/kernel": "^19.0.1",
139
+ "@almadar/logger": "^2.1.0",
140
+ "@almadar/std": "^17.0.0",
141
+ "@almadar/syntax": "^2.0.0",
138
142
  "@dnd-kit/core": "^6.3.1",
139
143
  "@dnd-kit/sortable": "^10.0.0",
140
144
  "@dnd-kit/utilities": "^3.2.2",
@@ -162,11 +166,11 @@
162
166
  "remark-math": "^6.0.0",
163
167
  "tailwind-merge": "^2.2.0",
164
168
  "zod": "^4.6.7",
165
- "@almadar/shell-browser": "^0.1.0",
166
- "@almadar/shell-runtime": "^0.1.0"
169
+ "@almadar/shell-browser": "^1.0.0",
170
+ "@almadar/shell-runtime": "^1.0.0"
167
171
  },
168
172
  "devDependencies": {
169
- "@almadar/eslint-plugin": "^2.22.0",
173
+ "@almadar/eslint-plugin": "^3.0.0",
170
174
  "@react-three/drei": "^10.7.7",
171
175
  "@react-three/fiber": "^9.6.0",
172
176
  "@react-three/postprocessing": "3.0.4",
@@ -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
  }