- A frame with no speedMps gets an exact anchor: an inertial one ran on at
zero speed and closed at 0.75 m/s, so the camera fell kilometres behind a
moving train. The docs example now passes speedMps and anchor: 'exact',
a name for its HUD, and isEntryAllowed for a train bound to its line.
- Transit's snapshot height is the floor where playback draws the vehicle,
not the newest report's floor uphill, and null while that floor is cold,
so a view waits for the surface instead of standing on the ellipsoid.
- Rail's direction follows playback once it has placed the train: a report
that runs back (a reversal, or GPS jitter) no longer turns the view
while the drawn train still runs forward.
- A frame's id is trimmed as the candidate's is.
- A double-click on the selected vessel no longer enters an application's
subject that took entry after it.
- The docs import from gods-eye-view/..., the package's name.
An application subject's camera step is now capped at its own update
interval plus 0.1 s rather than at 0.1 s, so at 500 ms its heading slew,
ground lift and anchor correction run at their configured rates; a long
stall still moves it no further than one late update. The built-in
views keep their 0.1 s cap.
When groundClamp turns false the lift the floor gave goes at the rate
it came, not at once. A HUD view with no speed has no speed readout,
and a progress line with no summary is hidden from assistive
technology instead of being an unnamed image.
Provider methods and worded members are called on the provider itself,
so a class-based provider works. A hold that answers false refuses entry
and is released; any answer but true or false refuses it too, released,
with one warning. An answer whose `then` getter throws is handled as a
throw, and a text cut at its cap never leaves half an emoji.
- A subject with no height at all waits at most
COCKPIT_GROUND_WAIT_TIMEOUT_MS for the floor, its HUD updating and
reading ACQUIRING SURFACE; then the view ends and the provider gets its
subject back (there is no height of its own to fall back to).
- A hold that returns a promise is refused as before and released again
once it settles, unless that subject is being ridden by then; release
must tolerate a second call.
- Rail and Transit stamp selectedAtMs only for a user's selection (a click,
focusTrain or focusVehicle); a deselection clears it, and a train or
vehicle selected only by a hold reads null.
- Labels, entry face and look may be functions, read again on every use
and on a locale change; a failing read keeps the last good value.
- A frame with no height keeps the eye's last height, or waits
(surfaceAcquiring) until the floor is known; heights outside
-1,000..50,000 m read as null.
- Provider methods are synchronous: a returned promise is refused like a
throw, and a hold that fails is released.
- A candidate may carry selectedAt; Rail and Transit stamp selectedAtMs
on every selection, so re-selecting moves a subject to the front.
- A released Transit vehicle leaves the visible set at once.
- docs/CURRENT-STATE.md states the new entry order; docs/APPLICATION.md
documents cockpit subjects, ./i18n/locale and ./layers/rail/paths.
GEV itself registers no new subject: with no provider, the Cockpit offers
aircraft, satellites and vessels as before, except that the most recently
selected of them now wins entry.
- services.cockpitSubjects: providers ({kind, layerId, entryFace, priority,
isEntryAllowed, read, hold, release, hud}) are checked once by the
coordinator; frames and HUD views on every update; a throwing provider
ends its view or keeps the last HUD.
- Entry: the most recently selected subject wins, across all kinds.
- Camera: a frame may turn the ground clamp off, anchor exactly on the
subject and update every frame.
- A generic HUD: kicker, title, cards, always-visible source rows, banner,
a veil with light streaks (off under reduced motion) and a bottom
progress line whose close ticks merge.
- Text comes from the provider, already in the page's language
(./i18n/locale: getLocale, onLocaleChange).
- Rail and Transit read and hold APIs (getSelectedTrain/Vehicle,
getCockpitSubject, setCockpitSubject, focusTrain/Vehicle); a held
train's marker, card and route line are hidden, and its feed keeps
polling while held.
- ./layers/rail/paths is exported.