diff --git a/client/tests/golden/visual/atlas_GJ144e_Global.png b/client/tests/golden/visual/atlas_GJ144e_Global.png index c6b4acc89..b0849d6f0 100644 Binary files a/client/tests/golden/visual/atlas_GJ144e_Global.png and b/client/tests/golden/visual/atlas_GJ144e_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ144e_Quarter.png b/client/tests/golden/visual/atlas_GJ144e_Quarter.png index 7f423925b..a5ab76165 100644 Binary files a/client/tests/golden/visual/atlas_GJ144e_Quarter.png and b/client/tests/golden/visual/atlas_GJ144e_Quarter.png differ diff --git a/client/tests/golden/visual/atlas_GJ244Ad_Global.png b/client/tests/golden/visual/atlas_GJ244Ad_Global.png index 091555a74..08942c4a4 100644 Binary files a/client/tests/golden/visual/atlas_GJ244Ad_Global.png and b/client/tests/golden/visual/atlas_GJ244Ad_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ251c_Global.png b/client/tests/golden/visual/atlas_GJ251c_Global.png index 79e0b473d..70e4a3e12 100644 Binary files a/client/tests/golden/visual/atlas_GJ251c_Global.png and b/client/tests/golden/visual/atlas_GJ251c_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ251c_Region.png b/client/tests/golden/visual/atlas_GJ251c_Region.png index 2a7b8206a..7ceffc3dc 100644 Binary files a/client/tests/golden/visual/atlas_GJ251c_Region.png and b/client/tests/golden/visual/atlas_GJ251c_Region.png differ diff --git a/client/tests/golden/visual/atlas_GJ338Bd_Block.png b/client/tests/golden/visual/atlas_GJ338Bd_Block.png index 0304ad77e..caf2379f1 100644 Binary files a/client/tests/golden/visual/atlas_GJ338Bd_Block.png and b/client/tests/golden/visual/atlas_GJ338Bd_Block.png differ diff --git a/client/tests/golden/visual/atlas_GJ338Bd_Global.png b/client/tests/golden/visual/atlas_GJ338Bd_Global.png index a90ec90d8..a50ac4f00 100644 Binary files a/client/tests/golden/visual/atlas_GJ338Bd_Global.png and b/client/tests/golden/visual/atlas_GJ338Bd_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ380c_District.png b/client/tests/golden/visual/atlas_GJ380c_District.png index 8adee583f..6a3e5ab12 100644 Binary files a/client/tests/golden/visual/atlas_GJ380c_District.png and b/client/tests/golden/visual/atlas_GJ380c_District.png differ diff --git a/client/tests/golden/visual/atlas_GJ380c_Global.png b/client/tests/golden/visual/atlas_GJ380c_Global.png index 422a6e699..0211e466b 100644 Binary files a/client/tests/golden/visual/atlas_GJ380c_Global.png and b/client/tests/golden/visual/atlas_GJ380c_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ380c_Region.png b/client/tests/golden/visual/atlas_GJ380c_Region.png index 93ffa363d..a3df29ebd 100644 Binary files a/client/tests/golden/visual/atlas_GJ380c_Region.png and b/client/tests/golden/visual/atlas_GJ380c_Region.png differ diff --git a/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png b/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png index eb9f13c88..4c85e473f 100644 Binary files a/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png and b/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png differ diff --git a/client/tests/golden/visual/atlas_GJ820Bc_District.png b/client/tests/golden/visual/atlas_GJ820Bc_District.png index bf9fd0dd4..446a1788f 100644 Binary files a/client/tests/golden/visual/atlas_GJ820Bc_District.png and b/client/tests/golden/visual/atlas_GJ820Bc_District.png differ diff --git a/client/tests/golden/visual/atlas_GJ820Bc_Global.png b/client/tests/golden/visual/atlas_GJ820Bc_Global.png index 076897efb..9e5727983 100644 Binary files a/client/tests/golden/visual/atlas_GJ820Bc_Global.png and b/client/tests/golden/visual/atlas_GJ820Bc_Global.png differ diff --git a/client/ui/implant/apps/atlas/step_canvas/step_canvas_viewer.gd b/client/ui/implant/apps/atlas/step_canvas/step_canvas_viewer.gd index e5801611e..f00ae5de3 100644 --- a/client/ui/implant/apps/atlas/step_canvas/step_canvas_viewer.gd +++ b/client/ui/implant/apps/atlas/step_canvas/step_canvas_viewer.gd @@ -145,6 +145,7 @@ var _canvas: Node2D = null var _terrain_layer: StepCanvasTerrainLayer = null var _annotation_layer: StepCanvasAnnotationLayer = null var _screen_header: ImplantHeader = null +var _screen_header_panel = null # ImplantPanel — T-1197 backing scrim (untyped: no class_name cycle needed) var _overlay_bar = null var _legend_panel = null var _request = null # StepCanvasRequest @@ -691,14 +692,42 @@ func _apply_transform() -> void: # ============================================================================= +## T-1197: the header used to be a bare ImplantHeader added straight to this +## Control, drawn directly over the terrain canvas with no backing — every +## OTHER implant chrome element (the legend below it) gets its scrim from +## ImplantPanel's `panel_bg` StyleBoxFlat, but a lone ImplantHeader has no +## panel of its own (see implant_header.gd — just two Labels). Its fixed +## opaque text color reads fine against the near-black viewer background or +## dark ocean terrain (the common case at rung 0's letterboxed corner and most +## fixed-rung captures), but against pale/light terrain — Quarter's white +## upland scatter, District's olive/tan dry terrain — the contrast collapses +## to the point of unreadability (Araminta's T-1196 observation, +## scratchpad t1196/gj1002b_quarter.png; reproduced baked into the committed +## golden atlas_GJ820Bc_District.png). This is a static contrast defect, not a +## timing race — there is no fade/tween anywhere in this cluster (confirmed by +## reading every script under client/ui/implant), so no harness settle change +## could fix it. Wrapping in an ImplantPanel (same component every other +## header-bearing screen in the implant UI already uses — index_screen.gd, +## planet_screen.gd, system_screen.gd, reach_screen.gd, kind_menu_screen.gd, +## detail_screen.gd, overview_screen.gd, character_creation.gd, and the +## legend right below THIS header — step_canvas_viewer.gd's bare add_child() +## was the only outlier) gives the header the same opaque scrim as every +## sibling chrome element, guaranteeing contrast regardless of what terrain +## renders underneath. func _build_screen_header() -> void: + var PanelScript := load("res://ui/implant/implant_panel.gd") + _screen_header_panel = PanelScript.new() + _screen_header_panel.name = "ScreenHeaderPanel" + _screen_header_panel.position = Vector2(PANEL_MARGIN, 16.0) + _screen_header_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + _screen_header_panel.custom_minimum_size.x = 320.0 + _screen_header_panel.theme_resource = _implant_theme # set BEFORE add_child(), matching _build_legend_panel()'s own ordering + add_child(_screen_header_panel) + _screen_header = ImplantHeader.new() - _screen_header.position = Vector2(PANEL_MARGIN, 16.0) _screen_header.custom_minimum_size.x = 320.0 _screen_header.mouse_filter = Control.MOUSE_FILTER_IGNORE - add_child(_screen_header) - if _implant_theme: - _screen_header.apply_implant_theme(_implant_theme) + _screen_header_panel.add_component(_screen_header) func _refresh_screen_header() -> void: