The bar hover fly-outs (wifi/audio/bluetooth/tray/active-window) slid out
sideways from the old left edge; now they drop DOWN from the top bar:
- ClipWrapper.qml: the collapsing/slide axis is now height (was width); the
popout is positioned along the bar by x (from the hovered widget's x-centre,
via currentCenter) and docks at the top edge; the dock<->detach animation
guard moves to the x (along-bar) axis. The content slides in via a negative
top margin instead of left margin.
- Wrapper.qml: mirror the size-transition animation guards (height is now the
always-animated extent axis, width the gated along-bar axis).
Verified live in the dev VM: all popouts open downward under their widget.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert the bar from a vertical left-edge strip to a horizontal top bar. The
shell had no orientation abstraction, so this flips the geometry across the bar
and the drawer/region/interaction layer:
- Bar.qml: ColumnLayout -> RowLayout; hit-testing (checkPopout/handleWheel),
scroll halves and popout-center anchoring all keyed off x instead of y;
first/last padding -> left/right margins.
- BarWrapper.qml: the bar's "thickness" is now its height (clampedHeight/
contentHeight/implicitHeight); content anchors left/right/top.
- drawers: Exclusions (exclusive zone moved left->top), Panels (content inset
topMargin = bar height), Regions + ContentWindow (panel->window coordinate
mapping and the thick border flip left->top), Interactions (bar-region check
y<barHeight, panel Y-origin uses bar height, scroll passes x, bar drag-reveal
is vertical).
- widgets: Clock (Row, HH:MM with a colon), StatusIcons (Row), Workspaces +
Workspace (Row), Tray (Row, expand chevron at the right) — each sizes to the
bar height instead of width.
Verified live in the dev VM: top bar renders with centered-clock entries, the
exclusion zone keeps windows below the bar, and the dashboard drops down
correctly. Popout fly-outs still anchor sideways (Phase B).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
We now own the pinned shell, so the runtime patches that the pacman-hook +
patch-script machinery re-applied after every caelestia-shell upgrade are
baked directly into source. Folds in all five caelestia-shell-targeting
patches from the builder's `os updates/`:
- Lock PAM (F1, blocker): ship faillock-free assets/pam.d/caelestia and point
modules/lock/Pam.qml's passwd PamContext at it (config "passwd" -> "caelestia").
A desktop screen-lock must never lock the user out of their own session.
- Updates page: add modules/nexus/pages/UpdatesPage.qml + register it in the
first System slot of PageCompRegistry.qml.
- Additions page: add modules/nexus/pages/AdditionsPage.qml + register it in the
Plugins slot; relabel Plugins -> Additions in PageRegistry.qml.
- Sudo toggle: add modules/nexus/common/SudoToggleRow.qml + insert it into
ServicesPage.qml after the Smart colour scheme toggle.
- Wi-Fi wrong-password recovery: NetworkConnection.qml saved-profile branch now
passes a real callback that forgets the bad profile and reopens the dialog.
The builder will drop the corresponding patch-*.sh calls + pacman hooks and
bump NOSIGNAL_SHELL_COMMIT to this commit.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>