@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.
- package/.github/agents/boundary-mapper.agent.md +29 -0
- package/.github/agents/docs-scout.agent.md +29 -0
- package/.github/agents/plan-scout.agent.md +29 -0
- package/.github/agents/solid-split.agent.md +138 -0
- package/.github/copilot-instructions.md +103 -0
- package/package.json +6 -3
- package/plans/ES2023 migration +13 -8
- package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
- package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
- package/plans/Memory_Optimization.md +3 -3
- package/plans/README.md +63 -0
- package/plans/Roadmap.md +15 -3
- package/plans/asciiMaze_SOLID_split.done.md +130 -0
- package/plans/flappy_bird_SOLID_split.done.md +67 -0
- package/scripts/assets/theme.css +221 -34
- package/scripts/copy-examples.mjs +9 -5
- package/scripts/export-onnx.mjs +3 -3
- package/scripts/generate-bench-tables.mjs +10 -10
- package/scripts/generate-bench-tables.ts +10 -10
- package/scripts/generate-docs.ts +1415 -449
- package/scripts/render-docs-html.ts +15 -8
- package/src/README.md +101 -223
- package/src/architecture/README.md +57 -185
- package/src/architecture/layer/README.md +38 -38
- package/src/architecture/network/README.md +33 -31
- package/src/architecture/network/activate/README.md +77 -77
- package/src/architecture/network/connect/README.md +15 -13
- package/src/architecture/network/deterministic/README.md +7 -7
- package/src/architecture/network/evolve/README.md +44 -44
- package/src/architecture/network/gating/README.md +20 -20
- package/src/architecture/network/genetic/README.md +51 -51
- package/src/architecture/network/mutate/README.md +97 -97
- package/src/architecture/network/onnx/README.md +264 -264
- package/src/architecture/network/prune/README.md +39 -39
- package/src/architecture/network/remove/README.md +26 -26
- package/src/architecture/network/serialize/README.md +56 -56
- package/src/architecture/network/slab/README.md +61 -61
- package/src/architecture/network/standalone/README.md +24 -24
- package/src/architecture/network/stats/README.md +9 -9
- package/src/architecture/network/topology/README.md +46 -46
- package/src/architecture/network/training/README.md +21 -21
- package/src/methods/README.md +9 -87
- package/src/multithreading/README.md +8 -77
- package/src/multithreading/workers/README.md +2 -2
- package/src/multithreading/workers/browser/README.md +0 -6
- package/src/multithreading/workers/node/README.md +0 -3
- package/src/neat/README.md +562 -568
- package/src/utils/README.md +18 -18
- package/test/examples/asciiMaze/README.md +59 -59
- package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
- package/test/examples/asciiMaze/browser-entry/README.md +196 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
- package/test/examples/asciiMaze/browser-entry.ts +10 -576
- package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
- package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
- package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
- package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
- package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
- package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
- package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
- package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
- package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
- package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
- package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
- package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
- package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
- package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
- package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
- package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
- package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
- package/test/examples/asciiMaze/fitness.ts +2 -2
- package/test/examples/asciiMaze/fitness.types.ts +65 -0
- package/test/examples/asciiMaze/interfaces.ts +64 -1352
- package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
- package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
- package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
- package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
- package/test/examples/flappy_bird/Trace-20260309T191949.json +24124 -0
- package/test/examples/flappy_bird/browser-entry/README.md +1129 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
- package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +6 -399
- package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +1 -717
- package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +15 -893
- package/test/examples/flappy_bird/browser-entry/host/README.md +307 -0
- package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
- package/test/examples/flappy_bird/browser-entry/host/host.ts +562 -6
- package/test/examples/flappy_bird/browser-entry/host/resize/README.md +274 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +31 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +360 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +117 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +63 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +250 -0
- package/test/examples/flappy_bird/browser-entry/network-view/README.md +399 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +255 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +802 -7
- package/test/examples/flappy_bird/browser-entry/playback/README.md +684 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/README.md +277 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +770 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +178 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +107 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +518 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +117 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +233 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +211 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +212 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +81 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +62 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +244 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +68 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +310 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +39 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +493 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
- package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +4 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +44 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +39 -122
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +62 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
- package/test/examples/flappy_bird/browser-entry/playback/playback.ts +409 -8
- package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +4 -12
- package/test/examples/flappy_bird/browser-entry/runtime/README.md +235 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +81 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +36 -0
- package/test/examples/flappy_bird/browser-entry/visualization/README.md +557 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +957 -19
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +138 -3
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +3 -27
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +1 -23
- package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +156 -0
- package/test/examples/flappy_bird/constants/README.md +1179 -0
- package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
- package/test/examples/flappy_bird/constants/constants.palette.ts +7 -0
- package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
- package/test/examples/flappy_bird/environment/README.md +143 -0
- package/test/examples/flappy_bird/environment/environment.observation.utils.ts +1 -19
- package/test/examples/flappy_bird/environment/environment.step.service.ts +3 -66
- package/test/examples/flappy_bird/evaluation/README.md +130 -0
- package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +1 -1
- package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +5 -375
- package/test/examples/flappy_bird/evaluation/rollout/README.md +291 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +30 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +58 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +310 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +56 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +368 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/README.md +618 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +7 -7
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +364 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +14 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +4 -201
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +184 -345
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +291 -0
- package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +5 -0
- package/test/examples/flappy_bird/simulation-shared/README.md +417 -0
- package/test/examples/flappy_bird/simulation-shared/observation/README.md +183 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +301 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +9 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +59 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +5 -403
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +20 -6
- package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +23 -8
- package/test/examples/flappy_bird/trainer/README.md +563 -0
- package/test/examples/flappy_bird/trainer/evaluation/README.md +199 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +9 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +73 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +165 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +25 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +161 -0
- package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.ts +126 -0
- package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
- package/test/examples/flappy_bird/trainer/trainer.ts +11 -553
- package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
- package/test/examples/flappy_bird/environment/environment.ts +0 -7
- package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
- 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
|
+
}
|