@reicek/neataptic-ts 0.1.21 → 0.1.22

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 (223) hide show
  1. package/.github/agents/boundary-mapper.agent.md +29 -0
  2. package/.github/agents/docs-scout.agent.md +29 -0
  3. package/.github/agents/plan-scout.agent.md +29 -0
  4. package/.github/agents/solid-split.agent.md +138 -0
  5. package/.github/copilot-instructions.md +103 -0
  6. package/package.json +6 -3
  7. package/plans/ES2023 migration +13 -8
  8. package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
  9. package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
  10. package/plans/Memory_Optimization.md +3 -3
  11. package/plans/README.md +63 -0
  12. package/plans/Roadmap.md +15 -3
  13. package/plans/asciiMaze_SOLID_split.done.md +130 -0
  14. package/plans/flappy_bird_SOLID_split.done.md +67 -0
  15. package/scripts/assets/theme.css +221 -34
  16. package/scripts/copy-examples.mjs +9 -5
  17. package/scripts/export-onnx.mjs +3 -3
  18. package/scripts/generate-bench-tables.mjs +10 -10
  19. package/scripts/generate-bench-tables.ts +10 -10
  20. package/scripts/generate-docs.ts +1415 -449
  21. package/scripts/render-docs-html.ts +15 -8
  22. package/src/README.md +101 -223
  23. package/src/architecture/README.md +57 -185
  24. package/src/architecture/layer/README.md +38 -38
  25. package/src/architecture/network/README.md +33 -31
  26. package/src/architecture/network/activate/README.md +77 -77
  27. package/src/architecture/network/connect/README.md +15 -13
  28. package/src/architecture/network/deterministic/README.md +7 -7
  29. package/src/architecture/network/evolve/README.md +44 -44
  30. package/src/architecture/network/gating/README.md +20 -20
  31. package/src/architecture/network/genetic/README.md +51 -51
  32. package/src/architecture/network/mutate/README.md +97 -97
  33. package/src/architecture/network/onnx/README.md +264 -264
  34. package/src/architecture/network/prune/README.md +39 -39
  35. package/src/architecture/network/remove/README.md +26 -26
  36. package/src/architecture/network/serialize/README.md +56 -56
  37. package/src/architecture/network/slab/README.md +61 -61
  38. package/src/architecture/network/standalone/README.md +24 -24
  39. package/src/architecture/network/stats/README.md +9 -9
  40. package/src/architecture/network/topology/README.md +46 -46
  41. package/src/architecture/network/training/README.md +21 -21
  42. package/src/methods/README.md +9 -87
  43. package/src/multithreading/README.md +8 -77
  44. package/src/multithreading/workers/README.md +2 -2
  45. package/src/multithreading/workers/browser/README.md +0 -6
  46. package/src/multithreading/workers/node/README.md +0 -3
  47. package/src/neat/README.md +562 -568
  48. package/src/utils/README.md +18 -18
  49. package/test/examples/asciiMaze/README.md +59 -59
  50. package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
  51. package/test/examples/asciiMaze/browser-entry/README.md +196 -0
  52. package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
  53. package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
  54. package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
  55. package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
  56. package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
  57. package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
  58. package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
  59. package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
  60. package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
  61. package/test/examples/asciiMaze/browser-entry.ts +10 -576
  62. package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
  63. package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
  64. package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
  65. package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
  66. package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
  67. package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
  68. package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
  69. package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
  70. package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
  71. package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
  72. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
  73. package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
  74. package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
  75. package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
  76. package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
  77. package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
  78. package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
  79. package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
  80. package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
  81. package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
  82. package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
  83. package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
  84. package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
  85. package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
  86. package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
  87. package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
  88. package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
  89. package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
  90. package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
  91. package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
  92. package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
  93. package/test/examples/asciiMaze/fitness.ts +2 -2
  94. package/test/examples/asciiMaze/fitness.types.ts +65 -0
  95. package/test/examples/asciiMaze/interfaces.ts +64 -1352
  96. package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
  97. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
  98. package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
  99. package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
  100. package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
  101. package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
  102. package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
  103. package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
  104. package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
  105. package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
  106. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
  107. package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
  108. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
  109. package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
  110. package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
  111. package/test/examples/flappy_bird/Trace-20260309T191949.json +24124 -0
  112. package/test/examples/flappy_bird/browser-entry/README.md +1129 -0
  113. package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
  114. package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +6 -399
  115. package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +1 -717
  116. package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
  117. package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +15 -893
  118. package/test/examples/flappy_bird/browser-entry/host/README.md +307 -0
  119. package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
  120. package/test/examples/flappy_bird/browser-entry/host/host.ts +562 -6
  121. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +274 -0
  122. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +31 -0
  123. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +360 -0
  124. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +117 -0
  125. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +63 -0
  126. package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +250 -0
  127. package/test/examples/flappy_bird/browser-entry/network-view/README.md +399 -0
  128. package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +255 -0
  129. package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +802 -7
  130. package/test/examples/flappy_bird/browser-entry/playback/README.md +684 -0
  131. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +277 -0
  132. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +770 -0
  133. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +178 -0
  134. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +107 -0
  135. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +518 -0
  136. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +117 -0
  137. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +233 -0
  138. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +211 -0
  139. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
  140. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +212 -0
  141. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +81 -0
  142. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
  143. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +62 -0
  144. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +244 -0
  145. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
  146. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +68 -0
  147. package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
  148. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +310 -0
  149. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +92 -0
  150. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +272 -0
  151. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +39 -0
  152. package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +493 -0
  153. package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
  154. package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +4 -0
  155. package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +44 -0
  156. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +39 -122
  157. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +272 -0
  158. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +62 -0
  159. package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
  160. package/test/examples/flappy_bird/browser-entry/playback/playback.ts +409 -8
  161. package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +4 -12
  162. package/test/examples/flappy_bird/browser-entry/runtime/README.md +235 -0
  163. package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +45 -0
  164. package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +81 -0
  165. package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +74 -0
  166. package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
  167. package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +36 -0
  168. package/test/examples/flappy_bird/browser-entry/visualization/README.md +557 -0
  169. package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
  170. package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +957 -19
  171. package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +138 -3
  172. package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +3 -27
  173. package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +1 -23
  174. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +156 -0
  175. package/test/examples/flappy_bird/constants/README.md +1179 -0
  176. package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
  177. package/test/examples/flappy_bird/constants/constants.palette.ts +7 -0
  178. package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
  179. package/test/examples/flappy_bird/environment/README.md +143 -0
  180. package/test/examples/flappy_bird/environment/environment.observation.utils.ts +1 -19
  181. package/test/examples/flappy_bird/environment/environment.step.service.ts +3 -66
  182. package/test/examples/flappy_bird/evaluation/README.md +130 -0
  183. package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +1 -1
  184. package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +5 -375
  185. package/test/examples/flappy_bird/evaluation/rollout/README.md +291 -0
  186. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +30 -0
  187. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +58 -0
  188. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +310 -0
  189. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +56 -0
  190. package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +368 -0
  191. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +618 -0
  192. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +7 -7
  193. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +364 -0
  194. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +14 -0
  195. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +4 -201
  196. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +184 -345
  197. package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +291 -0
  198. package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +5 -0
  199. package/test/examples/flappy_bird/simulation-shared/README.md +417 -0
  200. package/test/examples/flappy_bird/simulation-shared/observation/README.md +183 -0
  201. package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +301 -0
  202. package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +9 -0
  203. package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +59 -0
  204. package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +5 -403
  205. package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +20 -6
  206. package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +23 -8
  207. package/test/examples/flappy_bird/trainer/README.md +563 -0
  208. package/test/examples/flappy_bird/trainer/evaluation/README.md +199 -0
  209. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +9 -0
  210. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +73 -0
  211. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +165 -0
  212. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +25 -0
  213. package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +161 -0
  214. package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
  215. package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
  216. package/test/examples/flappy_bird/trainer/trainer.report.service.ts +126 -0
  217. package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
  218. package/test/examples/flappy_bird/trainer/trainer.ts +11 -553
  219. package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
  220. package/test/examples/flappy_bird/environment/environment.ts +0 -7
  221. package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
  222. package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
  223. package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
@@ -0,0 +1,117 @@
1
+ import {
2
+ applyMinimalMobileViewportLayout,
3
+ applyResponsiveCanvasBounds,
4
+ applyStandardViewportLayout,
5
+ createDeferredNetworkRedrawController,
6
+ installResponsiveViewportSizingListeners,
7
+ } from './host.resize.service.services';
8
+ import { resolveResponsiveViewportLayoutContext } from './host.resize.service.utils';
9
+ import type {
10
+ DeferredNetworkRedrawController,
11
+ ResponsiveViewportSizingElements,
12
+ } from './host.resize.service.types';
13
+
14
+ /**
15
+ * Installs responsive viewport sizing for simulation and network canvases.
16
+ *
17
+ * @param canvas - Simulation canvas to resize.
18
+ * @param containerElement - Width/height source.
19
+ * @param mainSplitContainer - Main split panel host.
20
+ * @param statsContainer - Stats host element.
21
+ * @param statsSplitContainer - Stats split panel containing stats and network panes.
22
+ * @param statsTableHost - Stats table host element.
23
+ * @param networkCanvas - Network canvas.
24
+ * @param networkCanvasHost - Network host element.
25
+ * @param onNetworkResize - Callback after network resize.
26
+ * @returns Nothing.
27
+ */
28
+ export function installResponsiveViewportSizing(
29
+ canvas: HTMLCanvasElement,
30
+ containerElement: HTMLElement,
31
+ mainSplitContainer: HTMLElement,
32
+ statsContainer: HTMLElement,
33
+ statsSplitContainer: HTMLElement,
34
+ statsTableHost: HTMLElement,
35
+ networkCanvas: HTMLCanvasElement,
36
+ networkCanvasHost: HTMLElement,
37
+ onNetworkResize: () => void,
38
+ ): void {
39
+ // Step 1: Capture the DOM elements involved in responsive host sizing.
40
+ const responsiveViewportSizingElements: ResponsiveViewportSizingElements = {
41
+ canvas,
42
+ containerElement,
43
+ mainSplitContainer,
44
+ statsContainer,
45
+ statsSplitContainer,
46
+ statsTableHost,
47
+ networkCanvas,
48
+ networkCanvasHost,
49
+ };
50
+
51
+ // Step 2: Create the deferred redraw controller used after layout-affecting changes.
52
+ const deferredNetworkRedrawController =
53
+ createDeferredNetworkRedrawController(onNetworkResize);
54
+
55
+ // Step 3: Build the shared sizing callback used by initial load and resize events.
56
+ const applyCanvasSize = (): void => {
57
+ applyResponsiveViewportSizing(
58
+ responsiveViewportSizingElements,
59
+ deferredNetworkRedrawController,
60
+ onNetworkResize,
61
+ );
62
+ };
63
+
64
+ // Step 4: Run the initial sizing pass and install resize observers.
65
+ applyCanvasSize();
66
+ installResponsiveViewportSizingListeners(
67
+ containerElement,
68
+ applyCanvasSize,
69
+ deferredNetworkRedrawController,
70
+ );
71
+ }
72
+
73
+ /**
74
+ * Applies responsive sizing to the simulation and network canvases.
75
+ *
76
+ * @param responsiveViewportSizingElements - Host elements participating in layout.
77
+ * @param deferredNetworkRedrawController - Deferred redraw controller.
78
+ * @param onNetworkResize - Immediate network resize callback.
79
+ * @returns Nothing.
80
+ */
81
+ function applyResponsiveViewportSizing(
82
+ responsiveViewportSizingElements: ResponsiveViewportSizingElements,
83
+ deferredNetworkRedrawController: DeferredNetworkRedrawController,
84
+ onNetworkResize: () => void,
85
+ ): void {
86
+ // Step 1: Measure the current viewport constraints and layout mode flags.
87
+ const responsiveViewportLayoutContext =
88
+ resolveResponsiveViewportLayoutContext(
89
+ responsiveViewportSizingElements.containerElement,
90
+ responsiveViewportSizingElements.statsContainer,
91
+ responsiveViewportSizingElements.networkCanvasHost,
92
+ );
93
+
94
+ // Step 2: Route the simplest mobile layout through the dedicated minimal-flow helper.
95
+ if (responsiveViewportLayoutContext.useMinimalMobileLayout) {
96
+ applyMinimalMobileViewportLayout(
97
+ responsiveViewportSizingElements,
98
+ responsiveViewportLayoutContext,
99
+ );
100
+ return;
101
+ }
102
+
103
+ // Step 3: Apply the desktop and tablet host layout and resolve stats panel dimensions.
104
+ const statsPanelDimensions = applyStandardViewportLayout(
105
+ responsiveViewportSizingElements,
106
+ responsiveViewportLayoutContext,
107
+ deferredNetworkRedrawController,
108
+ );
109
+
110
+ // Step 4: Resize the simulation and network canvases for the resolved layout.
111
+ applyResponsiveCanvasBounds(
112
+ responsiveViewportSizingElements,
113
+ responsiveViewportLayoutContext,
114
+ statsPanelDimensions,
115
+ onNetworkResize,
116
+ );
117
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * DOM elements that participate in responsive host sizing.
3
+ */
4
+ export type ResponsiveViewportSizingElements = {
5
+ canvas: HTMLCanvasElement;
6
+ containerElement: HTMLElement;
7
+ mainSplitContainer: HTMLElement;
8
+ statsContainer: HTMLElement;
9
+ statsSplitContainer: HTMLElement;
10
+ statsTableHost: HTMLElement;
11
+ networkCanvas: HTMLCanvasElement;
12
+ networkCanvasHost: HTMLElement;
13
+ };
14
+
15
+ /**
16
+ * Deferred redraw controller used after layout-affecting changes.
17
+ */
18
+ export type DeferredNetworkRedrawController = {
19
+ requestNetworkRedrawAfterLayout: () => void;
20
+ };
21
+
22
+ /**
23
+ * Measured viewport and panel budgets for responsive layout.
24
+ */
25
+ export type ResponsiveViewportMeasurements = {
26
+ headerHeightPx: number;
27
+ nonNetworkStatsHeightPx: number;
28
+ hardMinimumSimulationHeightPx: number;
29
+ totalCanvasBudgetPx: number;
30
+ viewportWidthPx: number;
31
+ viewportHeightPx: number;
32
+ };
33
+
34
+ /**
35
+ * Layout-mode flags resolved from the current viewport.
36
+ */
37
+ export type ResponsiveViewportLayoutFlags = {
38
+ useMinimalMobileLayout: boolean;
39
+ useLandscapeSplitLayout: boolean;
40
+ useNetworkOnlyPanel: boolean;
41
+ };
42
+
43
+ /**
44
+ * Full responsive layout context shared across sizing helpers.
45
+ */
46
+ export type ResponsiveViewportLayoutContext = ResponsiveViewportMeasurements &
47
+ ResponsiveViewportLayoutFlags;
48
+
49
+ /**
50
+ * Resolved height and width budgets for the stats panel.
51
+ */
52
+ export type StatsPanelDimensions = {
53
+ adjustedStatsPanelHeightPx: number;
54
+ resolvedStatsPanelWidthPx: number;
55
+ };
56
+
57
+ /**
58
+ * Width and height bounds for the simulation canvas.
59
+ */
60
+ export type SimulationCanvasBounds = {
61
+ availableWidthPx: number;
62
+ availableHeightPx: number;
63
+ };
@@ -0,0 +1,250 @@
1
+ import { clamp } from '../../browser-entry.math.utils';
2
+ import {
3
+ FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX,
4
+ FLAPPY_VIEWPORT_MOBILE_MINIMAL_UI_BREAKPOINT_PX,
5
+ FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_PX,
6
+ FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_RATIO,
7
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
8
+ FLAPPY_VIEWPORT_NETWORK_ONLY_BREAKPOINT_PX,
9
+ FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
10
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
11
+ } from '../../../constants/constants';
12
+ import {
13
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
14
+ FLAPPY_HOST_RESIZE_SPLIT_RATIO,
15
+ } from './host.resize.service.constants';
16
+ import type {
17
+ ResponsiveViewportLayoutContext,
18
+ SimulationCanvasBounds,
19
+ StatsPanelDimensions,
20
+ } from './host.resize.service.types';
21
+
22
+ /**
23
+ * Resolves responsive layout measurements and mode flags from the host DOM.
24
+ *
25
+ * @param containerElement - Width and height source.
26
+ * @param statsContainer - Stats host element.
27
+ * @param networkCanvasHost - Network host element.
28
+ * @returns Responsive layout context.
29
+ */
30
+ export function resolveResponsiveViewportLayoutContext(
31
+ containerElement: HTMLElement,
32
+ statsContainer: HTMLElement,
33
+ networkCanvasHost: HTMLElement,
34
+ ): ResponsiveViewportLayoutContext {
35
+ // Step 1: Measure header height and viewport budgets.
36
+ const headerHeightPx = resolveHeaderHeightPx(containerElement);
37
+ const totalCanvasBudgetPx = Math.max(
38
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
39
+ containerElement.clientHeight - headerHeightPx,
40
+ );
41
+ const viewportWidthPx = Math.max(
42
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
43
+ containerElement.clientWidth,
44
+ );
45
+ const viewportHeightPx = Math.max(
46
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
47
+ containerElement.clientHeight,
48
+ );
49
+
50
+ // Step 2: Measure panel-specific height constraints.
51
+ const nonNetworkStatsHeightPx = Math.max(
52
+ 0,
53
+ statsContainer.scrollHeight - networkCanvasHost.offsetHeight,
54
+ );
55
+ const hardMinimumSimulationHeightPx = Math.max(
56
+ FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_PX,
57
+ Math.floor(
58
+ window.innerHeight * FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_RATIO,
59
+ ),
60
+ );
61
+
62
+ // Step 3: Resolve the layout-mode flags used by responsive branching.
63
+ const useMinimalMobileLayout =
64
+ viewportWidthPx < FLAPPY_VIEWPORT_MOBILE_MINIMAL_UI_BREAKPOINT_PX;
65
+ const useLandscapeSplitLayout = viewportWidthPx > viewportHeightPx;
66
+ const useNetworkOnlyPanel =
67
+ !useLandscapeSplitLayout &&
68
+ viewportWidthPx < FLAPPY_VIEWPORT_NETWORK_ONLY_BREAKPOINT_PX;
69
+
70
+ return {
71
+ headerHeightPx,
72
+ nonNetworkStatsHeightPx,
73
+ hardMinimumSimulationHeightPx,
74
+ totalCanvasBudgetPx,
75
+ viewportWidthPx,
76
+ viewportHeightPx,
77
+ useMinimalMobileLayout,
78
+ useLandscapeSplitLayout,
79
+ useNetworkOnlyPanel,
80
+ };
81
+ }
82
+
83
+ /**
84
+ * Resolves the simulation canvas bounds for the minimal mobile layout.
85
+ *
86
+ * @param containerElement - Width and height source.
87
+ * @param responsiveViewportLayoutContext - Responsive layout context.
88
+ * @returns Simulation canvas bounds.
89
+ */
90
+ export function resolveMinimalMobileCanvasBounds(
91
+ containerElement: HTMLElement,
92
+ responsiveViewportLayoutContext: ResponsiveViewportLayoutContext,
93
+ ): SimulationCanvasBounds {
94
+ // Step 1: Use the full container width for the simulation canvas.
95
+ const availableWidthPx = Math.max(
96
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
97
+ Math.floor(containerElement.clientWidth),
98
+ );
99
+
100
+ // Step 2: Subtract the bottom breathing room while keeping a positive height.
101
+ const availableHeightPx = Math.max(
102
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
103
+ Math.floor(
104
+ responsiveViewportLayoutContext.totalCanvasBudgetPx -
105
+ FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
106
+ ),
107
+ );
108
+
109
+ return {
110
+ availableWidthPx,
111
+ availableHeightPx,
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Resolves the stats panel height and width budgets.
117
+ *
118
+ * @param responsiveViewportLayoutContext - Responsive layout context.
119
+ * @returns Stats panel dimensions.
120
+ */
121
+ export function resolveStatsPanelDimensions(
122
+ responsiveViewportLayoutContext: ResponsiveViewportLayoutContext,
123
+ ): StatsPanelDimensions {
124
+ // Step 1: Resolve the preferred stats panel height from the vertical split budget.
125
+ const halfSplitTargetHeightPx = Math.max(
126
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
127
+ Math.floor(
128
+ (responsiveViewportLayoutContext.totalCanvasBudgetPx -
129
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX) *
130
+ FLAPPY_HOST_RESIZE_SPLIT_RATIO,
131
+ ),
132
+ );
133
+ const maximumStatsHeightPx = Math.max(
134
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
135
+ responsiveViewportLayoutContext.totalCanvasBudgetPx -
136
+ responsiveViewportLayoutContext.hardMinimumSimulationHeightPx -
137
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
138
+ );
139
+ const resolvedStatsPanelHeightPx =
140
+ responsiveViewportLayoutContext.useLandscapeSplitLayout
141
+ ? responsiveViewportLayoutContext.totalCanvasBudgetPx
142
+ : Math.floor(
143
+ clamp(
144
+ halfSplitTargetHeightPx,
145
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
146
+ maximumStatsHeightPx,
147
+ ),
148
+ );
149
+ const minimumStatsPanelHeightPx =
150
+ responsiveViewportLayoutContext.nonNetworkStatsHeightPx +
151
+ FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX;
152
+
153
+ // Step 2: Resolve the stats panel width budget for landscape layouts.
154
+ const halfSplitTargetWidthPx = Math.max(
155
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
156
+ Math.floor(
157
+ (responsiveViewportLayoutContext.viewportWidthPx -
158
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX) *
159
+ FLAPPY_HOST_RESIZE_SPLIT_RATIO,
160
+ ),
161
+ );
162
+ const maximumStatsWidthPx = Math.max(
163
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
164
+ responsiveViewportLayoutContext.viewportWidthPx -
165
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX -
166
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
167
+ );
168
+
169
+ return {
170
+ adjustedStatsPanelHeightPx:
171
+ responsiveViewportLayoutContext.useLandscapeSplitLayout
172
+ ? resolvedStatsPanelHeightPx
173
+ : Math.max(resolvedStatsPanelHeightPx, minimumStatsPanelHeightPx),
174
+ resolvedStatsPanelWidthPx: Math.floor(
175
+ clamp(
176
+ halfSplitTargetWidthPx,
177
+ FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
178
+ maximumStatsWidthPx,
179
+ ),
180
+ ),
181
+ };
182
+ }
183
+
184
+ /**
185
+ * Resolves simulation canvas bounds from the current viewport layout.
186
+ *
187
+ * @param containerElement - Width and height source.
188
+ * @param responsiveViewportLayoutContext - Responsive layout context.
189
+ * @param statsPanelDimensions - Resolved stats panel dimensions.
190
+ * @returns Simulation canvas bounds.
191
+ */
192
+ export function resolveSimulationCanvasBounds(
193
+ containerElement: HTMLElement,
194
+ responsiveViewportLayoutContext: ResponsiveViewportLayoutContext,
195
+ statsPanelDimensions: StatsPanelDimensions,
196
+ ): SimulationCanvasBounds {
197
+ // Step 1: Resolve the simulation width from the active split orientation.
198
+ const availableWidthPx =
199
+ responsiveViewportLayoutContext.useLandscapeSplitLayout
200
+ ? Math.max(
201
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
202
+ containerElement.clientWidth -
203
+ statsPanelDimensions.resolvedStatsPanelWidthPx -
204
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
205
+ )
206
+ : Math.max(
207
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
208
+ containerElement.clientWidth,
209
+ );
210
+
211
+ // Step 2: Resolve the simulation height from the remaining vertical budget.
212
+ const availableHeightPx =
213
+ responsiveViewportLayoutContext.useLandscapeSplitLayout
214
+ ? Math.max(
215
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
216
+ responsiveViewportLayoutContext.totalCanvasBudgetPx -
217
+ FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
218
+ )
219
+ : Math.max(
220
+ FLAPPY_HOST_RESIZE_MIN_DIMENSION_PX,
221
+ responsiveViewportLayoutContext.totalCanvasBudgetPx -
222
+ statsPanelDimensions.adjustedStatsPanelHeightPx -
223
+ FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX -
224
+ FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
225
+ );
226
+
227
+ return {
228
+ availableWidthPx,
229
+ availableHeightPx,
230
+ };
231
+ }
232
+
233
+ /**
234
+ * Resolves the header canvas height, if present.
235
+ *
236
+ * @param containerElement - Width and height source.
237
+ * @returns Header height in pixels.
238
+ */
239
+ function resolveHeaderHeightPx(containerElement: HTMLElement): number {
240
+ // Step 1: Locate the header canvas hosted above the simulation viewport.
241
+ const headerCanvasElement = containerElement.querySelector('canvas');
242
+
243
+ // Step 2: Return the canvas height when found, otherwise fall back to zero.
244
+ return Math.max(
245
+ 0,
246
+ headerCanvasElement instanceof HTMLCanvasElement
247
+ ? headerCanvasElement.offsetHeight
248
+ : 0,
249
+ );
250
+ }