fix: refine responsive sign placement

This commit is contained in:
2026-09-03 18:34:39 +03:00
parent b075041918
commit 5dba071950
15 changed files with 388 additions and 17 deletions

View File

@@ -151,7 +151,7 @@ The controller now consumes a navigator request exactly once through a monotonic
Passive candidacy requires enabled motion, forward document direction, positive input, and the canonical upcoming route. The trigger maxima are 0.55vh for wide layouts, 0.23vh for portrait, and 0.38vh for short landscape; an actual boundary crossing wins and reconciles directly to the route reached. A qualifying reverse retreat beyond the trigger plus 0.20vh starts a new traversal and re-arms that route and every later route. Visible/cooldown state carries the traversal generation, preventing stale completion or same-label cooldown races. The clock contract is 300ms anticipate, 650–900ms approach, at least 1,400ms dwell measured from the first actual readable sample, 700ms pass-by departure, and 350ms cooldown. Delayed frames cannot skip dwell, stopping input cannot freeze a live sign, reverse input cannot move it physically backward, and a visible label never mutates.
The final route corridors are Profile left, Experience left, Infrastructure outer-right with a route-owned 1.6-world-unit inward dwell bias, Selected builds right, Additional work outer-left, Toolkit outer-left, and Contact outer-right. Projection assertions cover all seven passive transitions and require the complete dwell face to stay at least 8px inside the viewport, 16px outside visible opaque content, and 8px outside fixed controls. The responsive renderer—not stale lifecycle metadata—owns the current wide/tall/short pose. Visible resize and passive-to-navigator changes share one bounded pose transition and do not revive, duplicate, or strand the object.
The final route corridors are Profile left, Experience right, Infrastructure outer-right with a route-owned 1.6-world-unit inward dwell bias, Selected builds right, Additional work outer-left, Toolkit outer-left, and Contact outer-right. Projection assertions cover all seven passive transitions and require the complete dwell face to stay at least 8px inside the viewport, 16px outside visible opaque content, and 8px outside fixed controls. The responsive renderer—not stale lifecycle metadata—owns the current wide/tall/short pose. Visible resize and passive-to-navigator changes share one bounded pose transition and do not revive, duplicate, or strand the object.
The refined sign remains stable Three.js-owned geometry: one clipped/beveled housing, inset face panel, backplate, rear rails, paired narrow posts and braces, fasteners, and planted footings. It uses 20 renderable parts, 13 geometries, 7 materials, and one texture. The 4:1 face is a 2048×512 sRGB canvas texture with premultiplied alpha, trilinear mipmaps, linear magnification, up to 8× supported anisotropy, awaited Geist Mono fonts, and a non-tone-mapped face material. It redraws/uploads only when a concealed label changes. Recorded source headroom ranged from 6.06 to 13.54 texels per rendered face pixel across 390×844/DPR 3 Low through 2560×1440 High, and every recorded draw reported `fontReadyWhenDrawn: true`.
@@ -163,6 +163,12 @@ Two pre-existing harness limitations remain explicit. Deployment verification pa
No additional Blender asset was justified. The finite authored car remains Blender-owned and unchanged. Dynamic sign text, candidacy, lifecycle, responsive placement, road, terrain, atmosphere, sun, camera, and motion remain Three.js-owned.
### Experience corridor and medium-width navigator follow-up
The 2026-09-03 screenshot follow-up corrected two projection defects found after the sign-passing merge. Experience had regressed to the left corridor and was rendered underneath its left-side card. It now owns the right corridor. The passive Profile-to-Experience transition uses stable lower/nearer wide and short-landscape poses because its outgoing right Profile panel and incoming left Experience panel can be visible simultaneously; the 1440×900 dwell face measured 1032.44–1276.55 × 556.44–619.16px, leaving 20.16px to the outgoing panel and 61.12px to the incoming panel. A complete browser run found a separate 3px graze at 844×390. The corrected production-camera frame measured 640.50–780.92 × 231.91–266.39px, leaving 37.50px below Profile and 100.36px right of Experience; a dedicated browser regression now exercises that exact transition without weakening the 16px content margin or lifecycle timing.
Tall navigator signs had also retained the 390px phone pose throughout the entire portrait family, leaving the 692×793 face only 88.68px wide. The phone pose is now preserved through 480px, then its scale and mounting height interpolate smoothly to a capped medium pose at 720px. At 692×793 the Profile face measured 147.82px wide at 151.56–299.37 × 538.49–579.23px, with 20.12px below Profile and 35.15px above Experience. Browser assertions cover both the projected size and 16px content separation. The correction adds no new render resources or visible-phase texture work. Durable before/after captures and exact measurements are indexed in [`sign-corridor-followup/README.md`](evidence/nightdrive-iteration/sign-corridor-followup/README.md).
## Direction review checklist
- [x] Information uses near-black opaque panels rather than neon glass.