The card skin stands aside under the Cyber HUD; the pills are decoration
for screen readers, the buttons carry aria-pressed, and Clean UI, an action,
has no pill. A collapsed Visual hides its new parts too.
Co-authored-by: Manjunath Paparaju <[email protected]>
A fainter mask reads as Scope off while labels still fade outside the
keyhole and the HUD gets no backplates.
Co-authored-by: Manjunath Paparaju <[email protected]>
Contacts lends detection for the session and puts back the earlier state
on leaving; a share link carries that earlier state. A reset in Visual is
the user's choice, so it becomes both.
Co-authored-by: Manjunath Paparaju <[email protected]>
The More sheet already shows the dock's Visual Presets tray right above
Visual, so the panel's own copy is hidden on the phone shell.
Co-authored-by: Manjunath Paparaju <[email protected]>
The panel is headed VISUAL, and Clean UI now sits with the overlay
controls, above the Effects group.
Co-authored-by: Manjunath Paparaju <[email protected]>
CURRENT-STATE covers the panel's groups, the opacity slider and what the
reset restores; the share link format lists field 30.
Co-authored-by: Manjunath Paparaju <[email protected]>
The share codec carries field 30 and still encodes a link made before it
to the same code; the long form writes sco only below full opacity; the
mask fades without repainting; the panel shows and sets the opacity, and
the reset and the presets call their actions.
Co-authored-by: Manjunath Paparaju <[email protected]>
The share state took the opacity the slider last showed, which a
show-only update can leave apart from the mask; it now reads the mask
itself, as the feather does. The test reset also restores full opacity.
Co-authored-by: Manjunath Paparaju <[email protected]>
The panel's new headings, the scope opacity slider and the reset are
translated in every language, and the presets' names and descriptions use
the dock's translations. The cards' on/off pills take their words from the
locale instead of fixed English. VISUAL, the panel's name on the rail and in
its header, gets its own translation context: several languages had it as
"visible", from the satellite class of the same English word.
Co-authored-by: Manjunath Paparaju <[email protected]>
The application shell passes the scope opacity setter and the global post
defaults through to the Display bindings, the stylesheet imports the Visual
panel and Scope-off styles, and the icon subset gains the reset icon.
Co-authored-by: Sameh Khamis <[email protected]>
The Display panel is regrouped as Visual (Look, Overlay, Effects) with style
presets, a scope opacity slider and a reset to the default look. Scope
opacity is carried in share links as field 30 and as the legacy sco
parameter; 100 is the default and is left out of a link.
Co-authored-by: Sameh Khamis <[email protected]>
createApplicationCatalog takes an optional placement provider. Its
layer(kind) hands Flights, Military Flights, AIS Vessels, Transit and Rail
a place(id, wallMs), and optionally observe(id, fix) and forget(id). While
live, each layer tells it every fix it accepts and draws a contact where it
places it: position, height (the layer's own when none is given), course
and speed. A null answer, a provider that throws, a kind it leaves out, or
no provider at all keeps the layer's own motion unchanged, and following
the world clock the layers never ask it. A transit vehicle or train it
holds still lets the render loop idle and is asked again each second;
vessels ask for frames only while it places one, and stop when the layer
turns off.
Tests show the layers draw and reconcile exactly as before without a
provider and with one that places nothing, draw where a provider places
them, and idle while it holds them still.
- World timeline: a scrub counts as at now within a share of the track
(0.5%), now held to at most two minutes. A layer whose source covers
years made the window weeks wide, so most of the last month snapped to
live. Short tracks keep their window.
- Fires: card and detail ages count back from the end of the 24 hours the
layer shows when its snapshot ends at a set time, and from now only when
it runs to now. A window that ended months ago read "new 105d" on fires
three hours old at the time shown.
- Weather: a product's max gap and the delay after which its latest frame
reads late are at least one and a half of its feed's median frame
spacing (over its latest frames). A regional cloud feed with frames an
hour apart drew nothing for the second half of every hour while
scrubbing and read late after twenty minutes; feeds with frames minutes
apart keep their gaps.
CCTV and Context take the full right column when open, so the hysteresis
tests use a content-sized panel, and a test covers the full-height rule.
Co-authored-by: Manjunath Paparaju <[email protected]>
Phones and Cockpit keep their own layouts and do not show the switch. The
rails' name panels and edge mode run toward the middle in a right-to-left
language, and the switch reads its side again after the layout moves it.
Co-authored-by: Manjunath Paparaju <[email protected]>
Hidden rails (clean view, recording), sideways or empty moves, dialogs and
the world timeline keep their wheel; coasting after a step is swallowed for
at most 800 ms; line-based wheels step a panel per notch; the strip follows
where each rail is in a right-to-left language; a held step is dropped when
the pointer leaves the strip; nothing runs after removal.
Co-authored-by: Manjunath Paparaju <[email protected]>
Nothing replaces them on this branch yet, so the dock keeps them. The credit
pill and the HUD spacing built on it are left for a change of their own.
Co-authored-by: Manjunath Paparaju <[email protected]>
- The right rail now starts level with the left one whether or not a panel
is open on it. It used to rise to 4% of the screen when one was open,
which in Tactical and Cyber a top-right readout pushed back down, but in
Minimal (which has none) left it about 35 px above the left rail.
- Minimal no longer shows its full-width coordinate strip above the corner
coordinates block, which showed the same position twice; it keeps the
corner block, where the other layouts have it. This changes upstream's
Minimal layout.
Co-authored-by: Sameh Khamis <[email protected]>
The highlight was placed only when an item was pressed or released, the
window resized, or the pointer moved through an edge strip. A rail hidden
and shown again (Context docked and undocked) was left with its open item
unmarked, and a rail turned from a column to a row (panels moved to the
screen edge) kept its highlight where the icon had been. Each rail is now
watched for size changes, and its highlight placed again when it changes.
Co-authored-by: Sameh Khamis <[email protected]>
When a panel opened or closed, the rails' labels eased their width, which
stretched and shrank every button in the rail. On the side rails the
labels now fold away and come back at once; only their fade eases.
Co-authored-by: Sameh Khamis <[email protected]>
Opening a panel from the labelled rail folds its pills to icons over a few
frames, and the highlight faded in at a pill's width and then shrank, as
did the open button's own fill. The highlight now appears only once the
open button is an icon again (square), its size changes at once rather
than easing, and the open button carries no fill of its own.
Co-authored-by: Sameh Khamis <[email protected]>
A scroll that reached a step within 500 ms of the last one was used up
without stepping, so mouse wheel notches 300 ms apart stepped only every
other notch and a second swipe inside the gap did nothing. Such a step now
waits and fires once the gap has passed (one held at most, skipped if the
pointer has left the strip), and the held timer is cleared on teardown.
A comment naming the items cockpit hides is corrected.
Co-authored-by: Sameh Khamis <[email protected]>
With a panel open, a rail's glass is drawn in pieces: one around the open
icon and one for each run of icons above and below it, with a small break
between them. The icons keep their places; the rail's icon spacing grows
from 2 px to 12 px to leave room for the break. The shadow rule for the
old lifted icon is removed.
Co-authored-by: Sameh Khamis <[email protected]>
A scroll that would step a rail again within 500 ms of the last step is
used up without stepping, so panels never switch back to back.
Co-authored-by: Sameh Khamis <[email protected]>
The left rail no longer lifts its open icon out beside the panel title or
reorders the rest behind it. Every icon keeps its place, open or not, and
the rail's shared highlight slides to the open one, on both rails.
The rail also holds one height whichever panel is open: its offset now
allows for the stack rising by a different amount for a tall panel than at
rest.
Co-authored-by: Sameh Khamis <[email protected]>
A swipe is still speeding up when it first steps, and that rise in speed was
read as a fresh flick, so one swipe could step two panels. A flick now
counts only after the gesture has clearly slowed and a short moment after a
step; a mouse wheel notch still steps each time.
The rest of a gesture that has stepped is used up even when the pointer is
no longer in the strip, so its coasting does not zoom the globe or scroll
what opened under it. The strip is never wider than a rail's own column, a
panel in either stack keeps its own scrolling, and the slide classes come
off without an animation to end them (reduced motion).
Co-authored-by: Sameh Khamis <[email protected]>
The left rail holds Data Layers, Utilities, Authoring and Visual; the right
rail holds Context, CCTV and Street Level. A button in each panel header
moves that side's panels to the screen edge, with the rail as a row above
them, and scrolling at a screen edge steps through a rail's panels. An open
right panel starts just under the HUD readouts, and Context and CCTV take
the column's full height. The right rail stays level with the left column's
top whichever left panel is open, in both layouts.
Co-authored-by: Sameh Khamis <[email protected]>
PID's routes.txt types lines 51, 52, 53, 58, 59, 232 and 275 as
trolleybuses (route type 11); the rest of 50 to 59 stay buses, as before.
Voice now also knows trolleybuses, gondolas, cable cars, funiculars and
monorails.
The transit layer knew five modes, so a trolleybus drew as a bus, a
funicular as a train and a coach as a city bus. The GTFS basic route types
are now modes of their own (trolleybus, cable_tram, monorail, funicular,
aerial_lift), each with an icon, colour, detection tier, card word, voice
name, speed ceiling and fleet model.
A vehicle record may carry its route's GTFS route_type as routeType. It
settles the mode after the feed's fleet hint and before its route hint, and
picks the finer model (a coach for 200, a high-speed set for 101) when the
type is a kind of the vehicle's mode. Retained history classifies epochs
through transitModeFor too, so trails join the live vehicle.
Route hints from each operator's routes.txt: Prague's trolleybus lines
(51-59, 232, 275) and Petrin funicular, and the trams, trolleybuses and
metro lines of Bucharest, Cluj-Napoca and Turin. A feed may also name
route corrections that outrank the route type: Le Havre's routes.txt types
its funicular (8-FUNI) as a bus, so it is corrected to a funicular.
A virtual aid (AIS message 21's VirtualAtoN flag) is a mark broadcast
where nothing physical stands, so drawing it as a buoy showed a mark
that is not there. The vessel source record now carries `virtual`
(false unless a source says true; any source may set it), AISStream
sets it from VirtualAtoN, and the vessel layer keeps such an aid's
disc: vesselModelSpec returns null for it and the layer gathers no
model item for it. Its card, selected card and readout add VIRTUAL
after its kind.
A buoy's card, selected card and HUD readout showed "0.0KT · 135°" from
whatever its source reported. A fixed mark has neither, so they now show
its kind alone, whole ("CARDINAL MARK N", which the 14-character type cut
read as "CARDINAL MARK "), in the bone white of its disc.
isAidToNavigation now knows every kind an aid report names ("Light, with
sectors", "Fixed structure off shore" had no aid word), leaves out a
"Buoy Layer" as it does a tender, and matches each type text once: the
vessel layer asks per vessel on its rotation pass, which now skips the
aid discs it never turns.
Aid rows no longer cost ships their place: aisStreamRows lists every
vessel ahead of every aid, so the layer's 12,000-row request never drops
a ship for a buoy, and vessels_in_area (and the brief built on it)
counts ships only. An aid's name runs on into its NameExtension.