Commit Graph
2778 Commits
Author SHA1 Message Date
Sameh KhamisandManjunath Paparaju f940484498 Read the section index only when the groups change, and keep its label on screen
Live counts repaint the rows many times a second; the index now reads its
headings at most once a frame, and only when a heading changes. The label
goes before the tick when there is no room after it, as in a right-to-left
language, and the ticks sit at the panel's inline end.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 16:25:32 -08:00
Sameh KhamisandManjunath Paparaju 919ea8d4c0 Make the Data Layers finder keep Escape, its category and keyboard users
- Escape in the field closes the search alone, focus back on its button,
  without folding the panel or leaving the cockpit.
- The category is the group's key (LayerRows' data-group), so a language
  change keeps it; a group that goes away clears it.
- On and Off follow whether the layer is enabled, not its feed's state.
- The filter is a disclosure of two groups of toggle buttons: opening it
  focuses the chosen option, the arrows, Home and End move, Escape closes
  it, and it stays inside the panel.
- No layers match is translated, the search matches names only, and the
  rows are filtered once per frame at most.
- A voice request to show a layer the finder hides clears the finder.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 16:25:32 -08:00
Sameh KhamisandManjunath Paparaju dcabbb4141 Translate the Data Layers finder and section index
Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 16:16:24 -08:00
Sameh KhamisandManjunath Paparaju 8da6fb7931 Find layers by the name on screen, and share the finder's state in its module
The finder matched only the English name, so a search in another language
found nothing. Its header buttons and its bar share state through the
component's module rather than a global.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 16:16:24 -08:00
Manjunath PaparajuandSameh Khamis 0550f7c2d2 Place the Data Layers group label outside the panel and soften the finder's focus
The group label is drawn on the page just outside the panel's edge instead
of over the rows; the panel clips what leaves it, so the label is teleported
to the body and placed from the tick. The finder shows focus as a soft ring
on the field's frame in place of the hard outline round the bare input.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 16:12:59 -08:00
Manjunath PaparajuandSameh Khamis 584e77dc4f Add a finder and a section index to Data Layers
The Data Layers panel gains a search field, an All / On / Off and category
filter, and a tick index down its side for jumping between sections. Both
sit beside the Data Library browse control.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 16:12:59 -08:00
Sameh KhamisandManjunath Paparaju 394bfe71c4 Leave the map credits' place in the cockpit to the credits change
Restyling them here moved the credits where the attribution layout model
cannot follow.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:54:32 -08:00
Sameh KhamisandManjunath Paparaju 95a0be13b6 Open the cockpit panels from the rail in one step and give focus back to it
The rail's buttons are disclosures (aria-expanded, aria-controls) and go
through one toggleCockpitUtility action, which already keeps one panel open.
Collapsing returns focus to the rail when the launcher's toggle is hidden.
The edge switch is gone: edge mode does not apply in the cockpit.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:51:13 -08:00
Sameh KhamisandManjunath Paparaju 0c295ea770 Give only the desktop cockpit the rail look, placed by the layout pass
Cyber and the phone keep their own cockpit layouts. Display and Radio take
their top from the layout pass, whose floor now matches the left rail, so the
panel's height still stops short of the briefing. The rail keeps its physical
side in a right-to-left language, the Live Signals rows use logical sides,
and rules for the launchers' old strips, which the rail hides, are gone.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:51:13 -08:00
Sameh KhamisandManjunath Paparaju d157198ecb Load the cockpit panel styles with the shell, formatted
Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:51:13 -08:00
Sameh KhamisandManjunath Paparaju af7f659f0d Keep the cockpit briefing's Regional News page
The restyle had dropped the page and its tab while the news section, its
fetch and the briefing tests still use it.

Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:51:13 -08:00
Manjunath PaparajuandSameh Khamis 52b256ce94 Hide Visual from the rail in cockpit
In cockpit the left rail now shows Data Layers only: Visual's rail item
and panel are hidden there, as Authoring and Utilities are, and the
cockpit's own Display panel stands in for it. The rules that trimmed
Visual's groups in cockpit are removed as no longer reachable. If Visual
was open on entering cockpit, the rail's sliding highlight no longer
stays where its hidden icon was.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 15:51:13 -08:00
Manjunath PaparajuandSameh Khamis 50086f56b6 Hide Clean UI from the Visual panel in cockpit
Cockpit's Visual panel now also leaves out the Clean UI toggle, as it
does the celestial ring.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 15:51:13 -08:00
Manjunath PaparajuandSameh Khamis 5b3be915c8 Keep only what cockpit Display lacks in the Visual panel
In cockpit, the Visual panel hides the HUD, detection, parameters and
3D-model groups, which the cockpit's Display panel already offers, and
the celestial ring toggle. It keeps Look, Map source, Scope, Bloom and
Sharpen.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 15:51:13 -08:00
Manjunath PaparajuandSameh Khamis fd1f516192 Tighten the cockpit briefing's rows and weather tiles
Live Signals rows drop from 43.5 px to 36 px with less padding. The local
weather tiles lose the lit grid that showed between them, stand 5 px apart
as cards and shrink from 60 px to 53 px, so all four fit the shorter
window.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 15:51:13 -08:00
Manjunath PaparajuandSameh Khamis 839409a3fc Fit the side rails and panels to cockpit view
- The left rail shows Data Layers and Visual in cockpit view; Authoring and
  Utilities are hidden along with their slots and panels, so no empty
  pieces are left behind.
- With a panel open there, each icon left is its own island; a hidden
  panel still open underneath leaves the rail in one piece.
- The cockpit's Display and Radio rail uses the main rails' 12 px spacing
  and draws each icon as its own island while a panel is open.
- Contact and Live Signals stand shorter (min(27vh, 260px)); Contact's
  buttons share the kicker's row and its subject runs full width on at
  most two lines.
- Edge scrolling skips rail items that are not shown.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 15:51:13 -08:00
Manjunath PaparajuandSameh Khamis 733b227c01 Restyle the cockpit side panels
The cockpit's Display and Radio panels get the compact dark styling of the
rest of the shell, a header with the edge switch and collapse, and a rail.

Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 15:51:13 -08:00
Sameh KhamisandManjunath Paparaju 1500ffeb17 Keep Cyber's skin on the Visual panel and give its pills to aria-pressed
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 2fd8d32a5d Keep Scope opacity at half or more, and ignore a value that is not a number
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju a1e7b2a394 Make a reset inside Contacts the detection that leaving puts back
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 63dc5756d5 Leave the presets out of Visual in the phone's More sheet
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 81a18d327a Expect the Visual panel's name and its new order in the markup tests
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 6c1744e55b Test scope opacity, the Visual reset and the panel's presets
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 471151910d Read scope opacity for share links from the mask, as feather is
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 5383b470ee Translate the Visual panel and keep its name apart from the satellite class
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]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 493e76401e Own the Visual panel's new files in the package boundaries and format scope
Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:31:33 -08:00
Sameh KhamisandManjunath Paparaju 1dcc025832 Format the scope opacity changes
Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 15:31:25 -08:00
Manjunath PaparajuandSameh Khamis 8379a0ffd3 Wire scope opacity and the Visual reset into the shell
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]>
2026-11-14 15:31:25 -08:00
Manjunath PaparajuandSameh Khamis d145c30967 Add scope opacity and a reset to the Visual panel
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]>
2026-11-14 15:31:25 -08:00
Sameh Khamis 6f830a2e70 Let a host application place live contacts
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.
2026-11-14 15:07:25 -08:00
Sameh Khamis 5d733eb07b Fix scrubs to live on long tracks, fire ages in a past window, and gaps between hourly cloud frames
- 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.
2026-11-14 14:52:48 -08:00
Sameh KhamisandManjunath Paparaju 7578fcc9a1 Own the rail modules in their package boundaries and format scope
Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 14:01:04 -08:00
Sameh KhamisandManjunath Paparaju c54ead9432 Test the rails' new layout and translate the edge switch
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]>
2026-11-14 13:42:06 -08:00
Sameh KhamisandManjunath Paparaju d0b614d88e Keep edge mode to the desktop shell and mirror it in right-to-left
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]>
2026-11-14 13:41:07 -08:00
Sameh KhamisandManjunath Paparaju 9374e0228b Leave the wheel alone where edge scrolling should not take it
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]>
2026-11-14 13:41:07 -08:00
Sameh KhamisandManjunath Paparaju 235fe94a89 Open Visual from the left stack in the phone's More sheet
Co-authored-by: Manjunath Paparaju <[email protected]>
2026-11-14 13:41:07 -08:00
Sameh KhamisandManjunath Paparaju 605bf5b564 Keep the dock's Location and Visual Presets trays on desktop
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 85415bda97 Install edge scrolling and the rail styles in the shell
Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 8da632cc2d Line the side rails up and show coordinates once in Minimal HUD
- 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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 4debb49fe0 Place a rail's highlight again whenever the rail changes size
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 4568b9ff12 Fold the side rails' labels at once
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 129b35e470 Show the rail highlight at icon size when a first panel opens
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 9261279639 Drop a held edge-scroll step when the motion turns or the pointer moves to the other rail
Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 81f3602134 Hold an edge-scroll step that comes too soon instead of dropping it
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 422a11d9a4 Give a rail's open icon its own island
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 9cc2a1811b Leave at least half a second between edge-scroll steps
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis b090937e5f Keep rail icons in place and move only the highlight
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 59ffa87535 Keep the left rail's order when its open item is lifted out
Co-authored-by: Sameh Khamis <[email protected]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis b080857c35 Make one scroll at a rail's edge step one panel
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]>
2026-11-14 13:41:07 -08:00
Manjunath PaparajuandSameh Khamis 7ee047961b Move Visual to the left rail and let panels sit at the screen edge
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]>
2026-11-14 13:41:07 -08:00