* feat(app): follow system vertical bars and fold divisions
Keep custom navigation controls outside system content areas and use active division regions for temporary panel allocation. Normal sidebar preferences resume when the division disappears.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* fix(app): show window actions in the active portal scope
The bottom-sheet provider creates its own portal context. Register the window action host within that context so symbols reach the root host.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* fix(app): hide workspace bar actions behind compact panels
Compact panels keep the workspace route focused while covering its content. Hide its portal actions until the workspace panel is active again.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* fix(app): continue the sidebar surface across divisions
Keep the fold free of controls while painting it as part of the sidebar, with the shared divider at the workspace edge.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* fix(app): omit tab count beside the full tab rail
The full tab rail already exposes navigation. Use the same compact/full header selection for the vertical action list.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* fix(app): preserve folded navigation and bar action lifetime
Use resolved sidebar visibility for desktop activity, and keep bar controls mounted while compact panels cover them so pending menu work survives. Carry circular button chrome inside the portal and exercise the rendered boundary in Chromium.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* fix(app): own script actions across header placement changes
Keep one script action instance on the workspace screen so pending restarts survive removal of either menu. Pass activity through the bar portal so covered menus close their overlays without taking workflow state with them.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
* test(app): exercise script ownership through the workspace
Replace synthetic ownership fixtures with a real workspace, script menu and isolated terminal worker. Hold terminal exit until the compact header is removed so moving pending state back into the menu fails the regression. Exercise portal activity with production menu and header controls.
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
---------
Co-authored-by: Elsa Granger <zeyugao@outlook.com>
Header islands lose their filled background and shadow; the round tap
highlight stays. The floating header's fade now carries the icon contrast
the island fill used to give, so it stays solid through the header and
runs a longer tail into the content. The fade lives inside the overlay
because Android clips children that overhang their parent, and keeps
three gradient stops because Android rendered a four-stop version far
more transparent than specified.
Single-line header titles read one step larger. The compact composer
gets a soft drop shadow. The compact settings root groups App and Host
into islands of tiles, driven by breakpoint style values so desktop
keeps its plain list.
* feat(app): run and watch workspace scripts from the compact header menu
The compact header redesign dropped the mobile scripts button, so phones had
no way to run, stop, or restart workspace scripts. Scripts are now a page of
the ⋯ sheet: the root row shows what is running, tinted by health, and the ⋯
carries a dot while a running service is unhealthy. Desktop keeps its popover;
both surfaces share one set of script actions and one status model.
Script status also froze on native whenever the sidebar was closed and no
agent tab was viewed. DirectorySynchronizer releases its subscriptions,
including script_status_update, when nothing demands the directory, and the
workspace screen never demanded the workspace it shows. Web hid this because
the favicon sync holds demand for the whole session. The focused workspace now
holds directory demand, which also lets Restart's second half (start once the
daemon reports the script stopped) complete.
* perf(app): keep workspace script status live without syncing the directory
The focused workspace held full directory demand so the scripts menu saw
script_status_update on phones with the sidebar closed and no agent tab.
That fetched the host's agent and workspace lists on every focus and
streamed every agent and workspace update for the whole host.
Script status now has its own event subscription, which a workspace
screen can hold alone. It fetches the workspace's scripts once when the
subscription lands, because the subscription only carries changes.
Directory demand also holds it, so the sidebar and agent tabs see the
same updates as before.
* feat(app): modernize compact headers and sidebar affordances
Use a shared island header with quick tab creation and keep sheet footers inside their visible layout. Opt sidebar rows into touch sizing without changing global appearance settings.
* test(app): match darker light-theme workspace selection
* test(app): align plugin journeys with compact header