@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,307 @@
|
|
|
1
|
+
# browser-entry/host
|
|
2
|
+
|
|
3
|
+
## browser-entry/host/host.types.ts
|
|
4
|
+
|
|
5
|
+
### CanvasHostResult
|
|
6
|
+
|
|
7
|
+
Result payload returned after constructing the browser host UI tree.
|
|
8
|
+
|
|
9
|
+
### HostStatsPartialValues
|
|
10
|
+
|
|
11
|
+
Partial stats update map keyed by stats-table keys.
|
|
12
|
+
|
|
13
|
+
## browser-entry/host/host.ts
|
|
14
|
+
|
|
15
|
+
### createCanvasHost
|
|
16
|
+
|
|
17
|
+
`(containerElement: HTMLElement) => import("test/examples/flappy_bird/browser-entry/host/host.types").CanvasHostResult`
|
|
18
|
+
|
|
19
|
+
Builds the browser demo host tree and returns rendering handles.
|
|
20
|
+
|
|
21
|
+
Parameters:
|
|
22
|
+
|
|
23
|
+
- `containerElement` - - Root host container.
|
|
24
|
+
|
|
25
|
+
Returns: Canvas handles, stats cells and network render callback.
|
|
26
|
+
|
|
27
|
+
### createCanvasHostInternal
|
|
28
|
+
|
|
29
|
+
`(containerElement: HTMLElement) => import("test/examples/flappy_bird/browser-entry/host/host.types").CanvasHostResult`
|
|
30
|
+
|
|
31
|
+
Builds the browser demo host tree and returns rendering handles.
|
|
32
|
+
|
|
33
|
+
Parameters:
|
|
34
|
+
|
|
35
|
+
- `containerElement` - - Root host container.
|
|
36
|
+
|
|
37
|
+
Returns: Canvas handles, stats cells and network render callback.
|
|
38
|
+
|
|
39
|
+
### createHeaderFrameRenderer
|
|
40
|
+
|
|
41
|
+
`(headerCanvas: HTMLCanvasElement, headerContext: CanvasRenderingContext2D) => () => void`
|
|
42
|
+
|
|
43
|
+
Creates the reusable title-frame renderer for the header canvas.
|
|
44
|
+
|
|
45
|
+
Parameters:
|
|
46
|
+
|
|
47
|
+
- `headerCanvas` - - Header canvas element.
|
|
48
|
+
- `headerContext` - - Header canvas 2D context.
|
|
49
|
+
|
|
50
|
+
Returns: Callback that redraws the framed title.
|
|
51
|
+
|
|
52
|
+
### createHostCanvasElements
|
|
53
|
+
|
|
54
|
+
`(hostVisualPrimitives: HostVisualPrimitives) => HostCanvasElements`
|
|
55
|
+
|
|
56
|
+
Creates the canvases and 2D contexts used by the host UI.
|
|
57
|
+
|
|
58
|
+
Parameters:
|
|
59
|
+
|
|
60
|
+
- `hostVisualPrimitives` - - Shared visual primitives for border and shadow styling.
|
|
61
|
+
|
|
62
|
+
Returns: Simulation, header, and network canvases with required contexts.
|
|
63
|
+
|
|
64
|
+
### createHostLayoutElements
|
|
65
|
+
|
|
66
|
+
`(hostVisualPrimitives: HostVisualPrimitives) => HostLayoutElements`
|
|
67
|
+
|
|
68
|
+
Creates the host layout elements used to assemble the browser UI tree.
|
|
69
|
+
|
|
70
|
+
Parameters:
|
|
71
|
+
|
|
72
|
+
- `hostVisualPrimitives` - - Shared visual primitives for border and shadow styling.
|
|
73
|
+
|
|
74
|
+
Returns: Layout elements grouped by host responsibility.
|
|
75
|
+
|
|
76
|
+
### createHostNetworkVisualizationController
|
|
77
|
+
|
|
78
|
+
`(networkCanvasHost: HTMLDivElement, networkCanvas: HTMLCanvasElement, networkContext: CanvasRenderingContext2D) => HostNetworkVisualizationController`
|
|
79
|
+
|
|
80
|
+
Creates the network visualization renderer and redraw controller.
|
|
81
|
+
|
|
82
|
+
Parameters:
|
|
83
|
+
|
|
84
|
+
- `networkCanvasHost` - - Host element wrapping the network canvas.
|
|
85
|
+
- `networkCanvas` - - Network visualization canvas.
|
|
86
|
+
- `networkContext` - - Network visualization 2D context.
|
|
87
|
+
|
|
88
|
+
Returns: Renderer and redraw callbacks for the network panel.
|
|
89
|
+
|
|
90
|
+
### installCanvasHostResizeHooks
|
|
91
|
+
|
|
92
|
+
`(canvas: HTMLCanvasElement, hostLayoutElements: HostLayoutElements, networkCanvas: HTMLCanvasElement, drawHeaderFrame: () => void, hostNetworkVisualizationController: HostNetworkVisualizationController) => void`
|
|
93
|
+
|
|
94
|
+
Installs responsive resize hooks for the simulation canvas and side panel.
|
|
95
|
+
|
|
96
|
+
Parameters:
|
|
97
|
+
|
|
98
|
+
- `canvas` - - Simulation canvas.
|
|
99
|
+
- `hostLayoutElements` - - Prepared layout containers.
|
|
100
|
+
- `networkCanvas` - - Network visualization canvas.
|
|
101
|
+
- `drawHeaderFrame` - - Callback that redraws the header title.
|
|
102
|
+
- `hostNetworkVisualizationController` - - Network panel resize/redraw controller.
|
|
103
|
+
|
|
104
|
+
Returns: Nothing.
|
|
105
|
+
|
|
106
|
+
### mountCanvasHostTree
|
|
107
|
+
|
|
108
|
+
`(containerElement: HTMLElement, hostLayoutElements: HostLayoutElements, headerCanvas: HTMLCanvasElement, canvas: HTMLCanvasElement, networkCanvas: HTMLCanvasElement) => void`
|
|
109
|
+
|
|
110
|
+
Mounts the completed host DOM tree into the container in final order.
|
|
111
|
+
|
|
112
|
+
Parameters:
|
|
113
|
+
|
|
114
|
+
- `containerElement` - - Root host container.
|
|
115
|
+
- `hostLayoutElements` - - Prepared layout containers.
|
|
116
|
+
- `headerCanvas` - - Header title canvas.
|
|
117
|
+
- `canvas` - - Main simulation canvas.
|
|
118
|
+
- `networkCanvas` - - Network visualization canvas.
|
|
119
|
+
|
|
120
|
+
Returns: Nothing.
|
|
121
|
+
|
|
122
|
+
### renderInitialCanvasHostState
|
|
123
|
+
|
|
124
|
+
`(drawHeaderFrame: () => void, renderNetworkArchitecture: (network: import("src/architecture/network").default | undefined, inputSize: number, outputSize: number) => void) => void`
|
|
125
|
+
|
|
126
|
+
Renders the initial header and placeholder network visualization state.
|
|
127
|
+
|
|
128
|
+
Parameters:
|
|
129
|
+
|
|
130
|
+
- `drawHeaderFrame` - - Callback that redraws the header title.
|
|
131
|
+
- `renderNetworkArchitecture` - - Network visualization renderer.
|
|
132
|
+
|
|
133
|
+
Returns: Nothing.
|
|
134
|
+
|
|
135
|
+
### resetHostContainer
|
|
136
|
+
|
|
137
|
+
`(containerElement: HTMLElement) => void`
|
|
138
|
+
|
|
139
|
+
Clears any previous runtime DOM before rebuilding the browser host tree.
|
|
140
|
+
|
|
141
|
+
Parameters:
|
|
142
|
+
|
|
143
|
+
- `containerElement` - - Root host container.
|
|
144
|
+
|
|
145
|
+
Returns: Nothing.
|
|
146
|
+
|
|
147
|
+
### resolveHostVisualPrimitives
|
|
148
|
+
|
|
149
|
+
`() => HostVisualPrimitives`
|
|
150
|
+
|
|
151
|
+
Resolves shared border, shadow, and padding values for host assembly.
|
|
152
|
+
|
|
153
|
+
Returns: Shared visual primitives reused across host sections.
|
|
154
|
+
|
|
155
|
+
### updateStatsTableValues
|
|
156
|
+
|
|
157
|
+
`(statsValueByKey: Partial<Record<import("test/examples/flappy_bird/browser-entry/browser-entry.stats.types").FlappyStatsKey, HTMLTableCellElement>>, partialValues: Partial<Record<import("test/examples/flappy_bird/browser-entry/browser-entry.stats.types").FlappyStatsKey, string>>) => void`
|
|
158
|
+
|
|
159
|
+
Applies partial stat updates to the rendered stats table.
|
|
160
|
+
|
|
161
|
+
Parameters:
|
|
162
|
+
|
|
163
|
+
- `statsValueByKey` - - Lookup of stat keys to value cells.
|
|
164
|
+
- `partialValues` - - Subset of values to write this tick.
|
|
165
|
+
|
|
166
|
+
Returns: Nothing.
|
|
167
|
+
|
|
168
|
+
## browser-entry/host/host.constants.ts
|
|
169
|
+
|
|
170
|
+
### host.constants
|
|
171
|
+
|
|
172
|
+
Shared panel padding used by the host stats container.
|
|
173
|
+
|
|
174
|
+
### FLAPPY_HOST_PANEL_PADDING
|
|
175
|
+
|
|
176
|
+
### FLAPPY_HOST_PANEL_TRANSITION
|
|
177
|
+
|
|
178
|
+
### FLAPPY_HOST_STATS_SPLIT_GAP
|
|
179
|
+
|
|
180
|
+
### FLAPPY_HOST_TABLE_FONT_SIZE
|
|
181
|
+
|
|
182
|
+
### FLAPPY_HOST_TABLE_HOST_PADDING
|
|
183
|
+
|
|
184
|
+
## browser-entry/host/host.dom.service.ts
|
|
185
|
+
|
|
186
|
+
### host.dom.service
|
|
187
|
+
|
|
188
|
+
Resolves a required 2D context from a canvas element.
|
|
189
|
+
|
|
190
|
+
@param canvas - Target canvas element.
|
|
191
|
+
@param errorMessage - Error message when 2D context is unavailable.
|
|
192
|
+
@returns Canvas 2D rendering context.
|
|
193
|
+
|
|
194
|
+
### resolveRequiredCanvas2dContext
|
|
195
|
+
|
|
196
|
+
`(canvas: HTMLCanvasElement, errorMessage: string) => CanvasRenderingContext2D`
|
|
197
|
+
|
|
198
|
+
Resolves a required 2D context from a canvas element.
|
|
199
|
+
|
|
200
|
+
Parameters:
|
|
201
|
+
|
|
202
|
+
- `canvas` - - Target canvas element.
|
|
203
|
+
- `errorMessage` - - Error message when 2D context is unavailable.
|
|
204
|
+
|
|
205
|
+
Returns: Canvas 2D rendering context.
|
|
206
|
+
|
|
207
|
+
## browser-entry/host/host.stats.service.ts
|
|
208
|
+
|
|
209
|
+
### createAndAttachHostStatsTable
|
|
210
|
+
|
|
211
|
+
`(statsTableHost: HTMLElement) => Partial<Record<import("test/examples/flappy_bird/browser-entry/browser-entry.stats.types").FlappyStatsKey, HTMLTableCellElement>>`
|
|
212
|
+
|
|
213
|
+
Creates the host stats table, appends it into the provided host element, and
|
|
214
|
+
initializes all HUD values to their baseline placeholders.
|
|
215
|
+
|
|
216
|
+
Parameters:
|
|
217
|
+
|
|
218
|
+
- `statsTableHost` - - DOM host that receives the table.
|
|
219
|
+
|
|
220
|
+
Returns: Lookup map for future incremental stat updates.
|
|
221
|
+
|
|
222
|
+
### updateStatsTableValues
|
|
223
|
+
|
|
224
|
+
`(statsValueByKey: Partial<Record<import("test/examples/flappy_bird/browser-entry/browser-entry.stats.types").FlappyStatsKey, HTMLTableCellElement>>, partialValues: Partial<Record<import("test/examples/flappy_bird/browser-entry/browser-entry.stats.types").FlappyStatsKey, string>>) => void`
|
|
225
|
+
|
|
226
|
+
Applies partial stat updates to the rendered stats table.
|
|
227
|
+
|
|
228
|
+
Parameters:
|
|
229
|
+
|
|
230
|
+
- `statsValueByKey` - - Lookup of stat keys to value cells.
|
|
231
|
+
- `partialValues` - - Subset of values to write this tick.
|
|
232
|
+
|
|
233
|
+
Returns: Nothing.
|
|
234
|
+
|
|
235
|
+
## browser-entry/host/host.canvas.service.ts
|
|
236
|
+
|
|
237
|
+
### host.canvas.service
|
|
238
|
+
|
|
239
|
+
Applies a canvas backing store size and CSS width/height.
|
|
240
|
+
|
|
241
|
+
@param canvas - Target canvas element.
|
|
242
|
+
@param widthPx - Desired backing-store width in pixels.
|
|
243
|
+
@param heightPx - Desired backing-store height in pixels.
|
|
244
|
+
@returns True when canvas dimensions changed.
|
|
245
|
+
|
|
246
|
+
### applyCanvasBackingSize
|
|
247
|
+
|
|
248
|
+
`(canvas: HTMLCanvasElement, widthPx: number, heightPx: number) => boolean`
|
|
249
|
+
|
|
250
|
+
Applies a canvas backing store size and CSS width/height.
|
|
251
|
+
|
|
252
|
+
Parameters:
|
|
253
|
+
|
|
254
|
+
- `canvas` - - Target canvas element.
|
|
255
|
+
- `widthPx` - - Desired backing-store width in pixels.
|
|
256
|
+
- `heightPx` - - Desired backing-store height in pixels.
|
|
257
|
+
|
|
258
|
+
Returns: True when canvas dimensions changed.
|
|
259
|
+
|
|
260
|
+
### applySimulationCanvasBounds
|
|
261
|
+
|
|
262
|
+
`(canvas: HTMLCanvasElement, widthPx: number, heightPx: number) => boolean`
|
|
263
|
+
|
|
264
|
+
Applies fixed simulation-canvas bounds so layout does not stretch unexpectedly.
|
|
265
|
+
|
|
266
|
+
Parameters:
|
|
267
|
+
|
|
268
|
+
- `canvas` - - Simulation canvas element.
|
|
269
|
+
- `widthPx` - - Desired width in pixels.
|
|
270
|
+
- `heightPx` - - Desired height in pixels.
|
|
271
|
+
|
|
272
|
+
Returns: True when backing-store dimensions changed.
|
|
273
|
+
|
|
274
|
+
### resolveNetworkCanvasSizePx
|
|
275
|
+
|
|
276
|
+
`(networkCanvasHost: HTMLElement, hostInsetPx: number) => { widthPx: number; heightPx: number; }`
|
|
277
|
+
|
|
278
|
+
Computes the drawable network canvas size from host element dimensions.
|
|
279
|
+
|
|
280
|
+
Parameters:
|
|
281
|
+
|
|
282
|
+
- `networkCanvasHost` - - Host element wrapping the network canvas.
|
|
283
|
+
- `hostInsetPx` - - Total inset to subtract from both dimensions.
|
|
284
|
+
|
|
285
|
+
Returns: Width/height pair in pixels.
|
|
286
|
+
|
|
287
|
+
## browser-entry/host/host.resize.service.ts
|
|
288
|
+
|
|
289
|
+
### installResponsiveViewportSizing
|
|
290
|
+
|
|
291
|
+
`(canvas: HTMLCanvasElement, containerElement: HTMLElement, mainSplitContainer: HTMLElement, statsContainer: HTMLElement, statsSplitContainer: HTMLElement, statsTableHost: HTMLElement, networkCanvas: HTMLCanvasElement, networkCanvasHost: HTMLElement, onNetworkResize: () => void) => void`
|
|
292
|
+
|
|
293
|
+
Installs responsive viewport sizing for simulation and network canvases.
|
|
294
|
+
|
|
295
|
+
Parameters:
|
|
296
|
+
|
|
297
|
+
- `canvas` - - Simulation canvas to resize.
|
|
298
|
+
- `containerElement` - - Width/height source.
|
|
299
|
+
- `mainSplitContainer` - - Main split panel host.
|
|
300
|
+
- `statsContainer` - - Stats host element.
|
|
301
|
+
- `statsSplitContainer` - - Stats split panel containing stats and network panes.
|
|
302
|
+
- `statsTableHost` - - Stats table host element.
|
|
303
|
+
- `networkCanvas` - - Network canvas.
|
|
304
|
+
- `networkCanvasHost` - - Network host element.
|
|
305
|
+
- `onNetworkResize` - - Callback after network resize.
|
|
306
|
+
|
|
307
|
+
Returns: Nothing.
|
|
@@ -1,295 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX,
|
|
4
|
-
FLAPPY_UI_NETWORK_HOST_INSET_PX,
|
|
5
|
-
FLAPPY_VIEWPORT_MOBILE_MINIMAL_UI_BREAKPOINT_PX,
|
|
6
|
-
FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_PX,
|
|
7
|
-
FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_RATIO,
|
|
8
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
9
|
-
FLAPPY_VIEWPORT_NETWORK_ONLY_BREAKPOINT_PX,
|
|
10
|
-
FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
|
|
11
|
-
FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
|
|
12
|
-
} from '../../constants/constants';
|
|
13
|
-
import { FLAPPY_HOST_STATS_SPLIT_GAP } from './host.constants';
|
|
14
|
-
import {
|
|
15
|
-
applyCanvasBackingSize,
|
|
16
|
-
applySimulationCanvasBounds,
|
|
17
|
-
resolveNetworkCanvasSizePx,
|
|
18
|
-
} from './host.canvas.service';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Installs responsive viewport sizing for simulation and network canvases.
|
|
22
|
-
*
|
|
23
|
-
* @param canvas - Simulation canvas to resize.
|
|
24
|
-
* @param containerElement - Width/height source.
|
|
25
|
-
* @param mainSplitContainer - Main split panel host.
|
|
26
|
-
* @param statsContainer - Stats host element.
|
|
27
|
-
* @param statsSplitContainer - Stats split panel containing stats + network panes.
|
|
28
|
-
* @param statsTableHost - Stats table host element.
|
|
29
|
-
* @param networkCanvas - Network canvas.
|
|
30
|
-
* @param networkCanvasHost - Network host element.
|
|
31
|
-
* @param onNetworkResize - Callback after network resize.
|
|
32
|
-
* @returns Nothing.
|
|
33
|
-
*/
|
|
34
|
-
export function installResponsiveViewportSizing(
|
|
35
|
-
canvas: HTMLCanvasElement,
|
|
36
|
-
containerElement: HTMLElement,
|
|
37
|
-
mainSplitContainer: HTMLElement,
|
|
38
|
-
statsContainer: HTMLElement,
|
|
39
|
-
statsSplitContainer: HTMLElement,
|
|
40
|
-
statsTableHost: HTMLElement,
|
|
41
|
-
networkCanvas: HTMLCanvasElement,
|
|
42
|
-
networkCanvasHost: HTMLElement,
|
|
43
|
-
onNetworkResize: () => void,
|
|
44
|
-
): void {
|
|
45
|
-
let pendingNetworkRedrawRequest = false;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Defers network redraw until after layout settles across two animation frames.
|
|
49
|
-
*
|
|
50
|
-
* @returns Nothing.
|
|
51
|
-
*/
|
|
52
|
-
const requestNetworkRedrawAfterLayout = (): void => {
|
|
53
|
-
if (pendingNetworkRedrawRequest) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
pendingNetworkRedrawRequest = true;
|
|
57
|
-
|
|
58
|
-
requestAnimationFrame(() => {
|
|
59
|
-
requestAnimationFrame(() => {
|
|
60
|
-
pendingNetworkRedrawRequest = false;
|
|
61
|
-
onNetworkResize();
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Recomputes simulation/network canvas backing sizes from current layout constraints.
|
|
68
|
-
*
|
|
69
|
-
* @returns Nothing.
|
|
70
|
-
*/
|
|
71
|
-
const applyCanvasSize = (): void => {
|
|
72
|
-
// Step 1: Measure header and baseline layout constraints.
|
|
73
|
-
const headerCanvasElement = containerElement.querySelector('canvas');
|
|
74
|
-
const headerHeightPx = Math.max(
|
|
75
|
-
0,
|
|
76
|
-
headerCanvasElement instanceof HTMLCanvasElement
|
|
77
|
-
? headerCanvasElement.offsetHeight
|
|
78
|
-
: 0,
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
// Step 2: Resolve stats/network panel sizing constraints.
|
|
82
|
-
const preferredNetworkHeightPx = Number.parseInt(
|
|
83
|
-
networkCanvasHost.dataset.preferredHeightPx ??
|
|
84
|
-
`${networkCanvasHost.offsetHeight}`,
|
|
85
|
-
10,
|
|
86
|
-
);
|
|
87
|
-
const nonNetworkStatsHeightPx = Math.max(
|
|
88
|
-
0,
|
|
89
|
-
statsContainer.scrollHeight - networkCanvasHost.offsetHeight,
|
|
90
|
-
);
|
|
91
|
-
|
|
92
|
-
const hardMinimumSimulationHeightPx = Math.max(
|
|
93
|
-
FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_PX,
|
|
94
|
-
Math.floor(
|
|
95
|
-
window.innerHeight * FLAPPY_VIEWPORT_MINIMUM_SIMULATION_HEIGHT_RATIO,
|
|
96
|
-
),
|
|
97
|
-
);
|
|
98
|
-
const totalCanvasBudgetPx = Math.max(
|
|
99
|
-
1,
|
|
100
|
-
containerElement.clientHeight - headerHeightPx,
|
|
101
|
-
);
|
|
102
|
-
const viewportWidthPx = Math.max(1, containerElement.clientWidth);
|
|
103
|
-
const viewportHeightPx = Math.max(1, containerElement.clientHeight);
|
|
104
|
-
const useMinimalMobileLayout =
|
|
105
|
-
viewportWidthPx < FLAPPY_VIEWPORT_MOBILE_MINIMAL_UI_BREAKPOINT_PX;
|
|
106
|
-
const useLandscapeSplitLayout = viewportWidthPx > viewportHeightPx;
|
|
107
|
-
const useNetworkOnlyPanel =
|
|
108
|
-
!useLandscapeSplitLayout &&
|
|
109
|
-
viewportWidthPx < FLAPPY_VIEWPORT_NETWORK_ONLY_BREAKPOINT_PX;
|
|
110
|
-
|
|
111
|
-
// Step 2.1: For mobile, hide stats/network panes and dedicate height to gameplay canvas.
|
|
112
|
-
if (useMinimalMobileLayout) {
|
|
113
|
-
mainSplitContainer.style.flexDirection = 'column';
|
|
114
|
-
mainSplitContainer.style.gap = `${FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX}px`;
|
|
115
|
-
statsSplitContainer.style.flexDirection = 'row';
|
|
116
|
-
statsSplitContainer.style.alignItems = 'flex-start';
|
|
117
|
-
statsSplitContainer.style.height = 'auto';
|
|
118
|
-
statsTableHost.style.order = '0';
|
|
119
|
-
networkCanvasHost.style.order = '1';
|
|
120
|
-
|
|
121
|
-
statsContainer.style.display = 'none';
|
|
122
|
-
statsContainer.style.height = '0px';
|
|
123
|
-
statsContainer.style.maxHeight = '0px';
|
|
124
|
-
statsContainer.style.overflowY = 'hidden';
|
|
125
|
-
|
|
126
|
-
const mobileWidthPx = Math.max(
|
|
127
|
-
1,
|
|
128
|
-
Math.floor(containerElement.clientWidth),
|
|
129
|
-
);
|
|
130
|
-
const mobileHeightPx = Math.max(
|
|
131
|
-
1,
|
|
132
|
-
Math.floor(
|
|
133
|
-
totalCanvasBudgetPx - FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
|
|
134
|
-
),
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
applyCanvasBackingSize(canvas, mobileWidthPx, mobileHeightPx);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Step 2.2: Restore stats/network panes for non-mobile widths.
|
|
142
|
-
statsContainer.style.display = 'block';
|
|
143
|
-
|
|
144
|
-
// Step 2.3: Toggle top-level split orientation and inner panel ordering.
|
|
145
|
-
mainSplitContainer.style.flexDirection = useLandscapeSplitLayout
|
|
146
|
-
? 'row'
|
|
147
|
-
: 'column';
|
|
148
|
-
mainSplitContainer.style.gap = `${FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX}px`;
|
|
149
|
-
|
|
150
|
-
statsSplitContainer.style.flexDirection = useLandscapeSplitLayout
|
|
151
|
-
? 'column'
|
|
152
|
-
: 'row';
|
|
153
|
-
statsSplitContainer.style.alignItems = useLandscapeSplitLayout
|
|
154
|
-
? 'stretch'
|
|
155
|
-
: 'flex-start';
|
|
156
|
-
statsSplitContainer.style.height = useLandscapeSplitLayout
|
|
157
|
-
? '100%'
|
|
158
|
-
: 'auto';
|
|
159
|
-
statsSplitContainer.style.gap = useNetworkOnlyPanel
|
|
160
|
-
? '0'
|
|
161
|
-
: FLAPPY_HOST_STATS_SPLIT_GAP;
|
|
162
|
-
|
|
163
|
-
if (useLandscapeSplitLayout) {
|
|
164
|
-
networkCanvasHost.style.order = '0';
|
|
165
|
-
statsTableHost.style.order = '1';
|
|
166
|
-
} else {
|
|
167
|
-
statsTableHost.style.order = '0';
|
|
168
|
-
networkCanvasHost.style.order = '1';
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
statsTableHost.style.display = useNetworkOnlyPanel ? 'none' : 'block';
|
|
172
|
-
statsTableHost.style.flex = useNetworkOnlyPanel ? '0 0 auto' : '1 1 0';
|
|
173
|
-
networkCanvasHost.style.flex = useNetworkOnlyPanel
|
|
174
|
-
? '1 1 100%'
|
|
175
|
-
: '0 0 auto';
|
|
176
|
-
networkCanvasHost.style.width = useNetworkOnlyPanel ? '100%' : 'auto';
|
|
177
|
-
networkCanvasHost.style.maxWidth = '100%';
|
|
178
|
-
|
|
179
|
-
const halfSplitTargetPx = Math.max(
|
|
180
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
181
|
-
Math.floor(
|
|
182
|
-
(totalCanvasBudgetPx - FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX) * 0.5,
|
|
183
|
-
),
|
|
184
|
-
);
|
|
185
|
-
const maximumStatsHeightPx = Math.max(
|
|
186
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
187
|
-
totalCanvasBudgetPx -
|
|
188
|
-
hardMinimumSimulationHeightPx -
|
|
189
|
-
FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
|
|
190
|
-
);
|
|
191
|
-
const resolvedStatsPanelHeightPx = useLandscapeSplitLayout
|
|
192
|
-
? totalCanvasBudgetPx
|
|
193
|
-
: Math.floor(
|
|
194
|
-
clamp(
|
|
195
|
-
halfSplitTargetPx,
|
|
196
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
197
|
-
maximumStatsHeightPx,
|
|
198
|
-
),
|
|
199
|
-
);
|
|
200
|
-
const minimumStatsPanelHeightPx =
|
|
201
|
-
nonNetworkStatsHeightPx + FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX;
|
|
202
|
-
const adjustedStatsPanelHeightPx = useLandscapeSplitLayout
|
|
203
|
-
? resolvedStatsPanelHeightPx
|
|
204
|
-
: Math.max(resolvedStatsPanelHeightPx, minimumStatsPanelHeightPx);
|
|
205
|
-
|
|
206
|
-
const halfSplitTargetWidthPx = Math.max(
|
|
207
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
208
|
-
Math.floor(
|
|
209
|
-
(viewportWidthPx - FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX) * 0.5,
|
|
210
|
-
),
|
|
211
|
-
);
|
|
212
|
-
const maximumStatsWidthPx = Math.max(
|
|
213
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
214
|
-
viewportWidthPx -
|
|
215
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX -
|
|
216
|
-
FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
|
|
217
|
-
);
|
|
218
|
-
const resolvedStatsPanelWidthPx = Math.floor(
|
|
219
|
-
clamp(
|
|
220
|
-
halfSplitTargetWidthPx,
|
|
221
|
-
FLAPPY_VIEWPORT_MIN_NETWORK_HEIGHT_BUDGET_PX,
|
|
222
|
-
maximumStatsWidthPx,
|
|
223
|
-
),
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
// Step 3: Clamp network pane height and trigger redraw when height changed.
|
|
227
|
-
const resolvedNetworkHeightPx = FLAPPY_UI_NETWORK_HOST_FIXED_HEIGHT_PX;
|
|
228
|
-
if (networkCanvasHost.offsetHeight !== resolvedNetworkHeightPx) {
|
|
229
|
-
networkCanvasHost.style.height = `${resolvedNetworkHeightPx}px`;
|
|
230
|
-
requestNetworkRedrawAfterLayout();
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
statsContainer.style.height = `${adjustedStatsPanelHeightPx}px`;
|
|
234
|
-
statsContainer.style.maxHeight = `${adjustedStatsPanelHeightPx}px`;
|
|
235
|
-
statsContainer.style.width = useLandscapeSplitLayout
|
|
236
|
-
? `${resolvedStatsPanelWidthPx}px`
|
|
237
|
-
: '100%';
|
|
238
|
-
statsContainer.style.maxWidth = useLandscapeSplitLayout
|
|
239
|
-
? `${resolvedStatsPanelWidthPx}px`
|
|
240
|
-
: '100%';
|
|
241
|
-
statsContainer.style.overflowY = useLandscapeSplitLayout
|
|
242
|
-
? 'auto'
|
|
243
|
-
: 'hidden';
|
|
244
|
-
|
|
245
|
-
// Step 4: Resolve simulation canvas size from remaining vertical budget.
|
|
246
|
-
const availableWidthPx = useLandscapeSplitLayout
|
|
247
|
-
? Math.max(
|
|
248
|
-
1,
|
|
249
|
-
containerElement.clientWidth -
|
|
250
|
-
resolvedStatsPanelWidthPx -
|
|
251
|
-
FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX,
|
|
252
|
-
)
|
|
253
|
-
: Math.max(1, containerElement.clientWidth);
|
|
254
|
-
const availableHeightPx = useLandscapeSplitLayout
|
|
255
|
-
? Math.max(
|
|
256
|
-
1,
|
|
257
|
-
totalCanvasBudgetPx - FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
|
|
258
|
-
)
|
|
259
|
-
: Math.max(
|
|
260
|
-
1,
|
|
261
|
-
totalCanvasBudgetPx -
|
|
262
|
-
adjustedStatsPanelHeightPx -
|
|
263
|
-
FLAPPY_VIEWPORT_VERTICAL_LAYOUT_GUTTER_PX -
|
|
264
|
-
FLAPPY_VIEWPORT_SIMULATION_BOTTOM_MARGIN_PX,
|
|
265
|
-
);
|
|
266
|
-
|
|
267
|
-
// Step 5: Apply simulation canvas backing size.
|
|
268
|
-
applySimulationCanvasBounds(canvas, availableWidthPx, availableHeightPx);
|
|
269
|
-
|
|
270
|
-
// Step 6: Apply network canvas backing size and redraw when changed.
|
|
271
|
-
const { widthPx, heightPx } = resolveNetworkCanvasSizePx(
|
|
272
|
-
networkCanvasHost,
|
|
273
|
-
FLAPPY_UI_NETWORK_HOST_INSET_PX,
|
|
274
|
-
);
|
|
275
|
-
if (applyCanvasBackingSize(networkCanvas, widthPx, heightPx)) {
|
|
276
|
-
onNetworkResize();
|
|
277
|
-
}
|
|
278
|
-
};
|
|
279
|
-
|
|
280
|
-
// Step 1: Initial sizing pass.
|
|
281
|
-
applyCanvasSize();
|
|
282
|
-
// Step 2: Queue first post-layout network redraw.
|
|
283
|
-
requestNetworkRedrawAfterLayout();
|
|
284
|
-
// Step 3: Listen to viewport resize.
|
|
285
|
-
window.addEventListener('resize', applyCanvasSize);
|
|
286
|
-
|
|
287
|
-
// Step 4: Attach container observer for responsive host resizing.
|
|
288
|
-
if (typeof ResizeObserver === 'function') {
|
|
289
|
-
const resizeObserver = new ResizeObserver(() => {
|
|
290
|
-
applyCanvasSize();
|
|
291
|
-
requestNetworkRedrawAfterLayout();
|
|
292
|
-
});
|
|
293
|
-
resizeObserver.observe(containerElement);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
1
|
+
export { installResponsiveViewportSizing } from './resize/host.resize.service';
|