Skip to content

feat(ui): browser-style address bar header for site detail#365

Merged
geodro merged 1 commit into
mainfrom
feat/ui-address-bar-header
May 17, 2026
Merged

feat(ui): browser-style address bar header for site detail#365
geodro merged 1 commit into
mainfrom
feat/ui-address-bar-header

Conversation

@geodro
Copy link
Copy Markdown
Owner

@geodro geodro commented May 17, 2026

Summary

The site detail panel now reads like a browser chrome. The top of the panel is a pill-shaped address bar with the favicon, scheme, and domain, flanked on the left by a circular reload button and on the right by pause/resume, open-in-browser, a LAN-share wifi toggle, a terminal button (loopback only), and an unlink. The TLS lock at the leading edge of the pill flips HTTPS on click, inheriting the DNS-enabled gating that used to live on the SiteControls HTTPS toggle. Clicking the URL itself opens the Manage Domains modal so the explicit Open icon stays the way to launch the site in a browser. When LAN sharing is on, the shareable URL chip with its hover-QR slots in next to the framework badge instead of living below the controls row.

Worktrees are now tabs above the address bar rather than a dropdown. The main checkout gets a home glyph, every other tab carries the branch icon and an inline X that opens a new RemoveWorktreeModal scoped to that branch; the trailing + opens AddWorktreeModal. The old WorktreeModal that mixed list, add, and remove in one dialog is deleted because the tab strip already lists every worktree and removal is one click away. Each new modal does one thing and AddWorktreeModal closes itself on success unless a warning came back.

There is also a small backend-aligned fix riding along: openSiteInBrowser used to force http:// on worktree subdomains, which contradicted the cert manager and nginx generator (both of which secure worktree subdomains under the parent's wildcard cert). The address bar now reflects HTTPS on worktrees and clicking through opens HTTPS as well.

Notes

The HTTPS and LAN toggles in SiteControls were removed because both actions are now first-class buttons in the address bar; the rest of the controls row (PHP/Node versions, db-isolated, framework workers) is unchanged. SiteHeader keeps its same public props so SiteDetail doesn't need to change.

The site detail panel now renders its top region like a browser chrome. The dominant element is a pill-shaped address bar with the favicon, scheme, and domain, flanked by a circular reload, pause/resume, open-in-browser, a LAN-share toggle, terminal (loopback only), and unlink. The TLS lock at the leading edge of the pill clicks through to flip HTTPS, with the gating logic from the old SiteControls toggle ported over so it stays static when DNS is off. Clicking the URL itself opens the Manage Domains modal, leaving the explicit Open button as the way to launch the site in a browser. When LAN sharing is on, the existing teal URL chip with its hover-QR slots into the bar next to the framework badge instead of living below the controls row.

Worktrees are now tabs above the bar rather than a dropdown. The first tab is the main checkout with a home glyph, every other tab carries the branch icon and an inline X. The X opens a new RemoveWorktreeModal scoped to that branch, and the trailing + opens AddWorktreeModal. The old WorktreeModal that interleaved list, add, and remove views in a single dialog is gone, along with its tests, because the tab strip already shows every worktree and removal is one click away. The split keeps each modal focused on one job and the add modal closes itself on success unless a warning surfaced.

Side effect: openSiteInBrowser no longer ignores TLS on worktrees, so worktree subdomains correctly open as HTTPS when the parent site has TLS enabled, matching what nginx and the cert manager have always done.
@geodro geodro merged commit 7e8b054 into main May 17, 2026
3 checks passed
@geodro geodro mentioned this pull request May 18, 2026
geodro added a commit that referenced this pull request May 18, 2026
First beta of the 1.21.0 line. The headline is desktop notifications via Web Push (#353), with a per-category settings page polished alongside a dashboard health row (#354). The PHP-FPM image grows a real shell environment, zsh plus starship plus eza, bat, fzf, zoxide, isolated from the host (#358), then loses around 800 MB of build toolchain in a multi-stage split that drops the image from 1.36 GB to 535 MB without losing any of its 68 PHP modules (#364). A new on-demand commands feature surfaces one-shot framework actions across the dashboard, the lerd run CLI, the command palette, and four new MCP tools, all backed by a generalised Dropdown component that replaces every native select in the UI (#363). The site detail header gets a browser-style address bar with the favicon, TLS lock, LAN-share chip, and worktrees promoted from a dropdown to tabs (#365), an Env tab joins Overview, Tinker, and Dumps to show the project .env verbatim (#366), and the tray menu picks up Dump bridge and Notifications toggles that update live via a new KindDumpsStatus event (#373). Postgres grows 17 and 18 alternates alongside a new MySQL 9.7 LTS line, all gated by a canonical-version pin so flipping the yaml canonical no longer silently major-jumps existing installs (#361). Türkçe joins the dashboard languages (#355), a public_dir override lands in .lerd.yaml for projects with a non-standard document root (#370), every git invocation in the tree now flows through internal/git (#356), and worker-failure pushes are batched so a systemd cascade no longer fires six near-identical notifications back to back (#372). Plus the post-1.20.2 fix queue covers the worktree-manager button rendering on non-git sites (#357), TLS certs not refreshing when a secured site's domain set changed (#367), streamed worktree install and a wave of audit follow-ups (#368), and tinker swallowing bare-expression results when the dump bridge was on (#371).
geodro added a commit that referenced this pull request May 18, 2026
#365's address-bar header for site detail landed with English literals
on the TLS toggle, LAN toggle, mobile overflow LAN entry, and the
overflow menu's aria-label. The Paraglide message keys all existed
already (sites_controls_httpsToggle_on/off, sites_controls_lanToggle_on/off,
common_moreActions) and tr.json was complete — the new component just
skipped them. Non-English users (tr just shipped in #355) saw English
on the most heavily-touched UI of v1.21.0.
geodro added a commit that referenced this pull request May 18, 2026
…376)

* fix(workers): stop host workers from resurrecting after stop (#375)

A host worker that the user stopped via the UI or `lerd worker stop` was getting silently revived. Two paths were doing it. On Linux and macOS, every HEAD write inside a worktree (commit, checkout, rebase, branch rename) fires the fsnotify "changed" handler, which was unconditionally calling AutoStartOptedInWorktreeWorkers and re-bootstrapping every opted-in host worker. The fix gates that call to action=="added" via a tiny shouldAutoStartWorkersOnSync helper, so HEAD movement leaves existing units alone. On macOS the launchd heal loop additionally treated a missing plist as drift and recreated it, even though WorkerStopForSite removes the plist precisely to represent user intent. shouldHealOnReason now skips "plist missing" and only heals genuine drift like "not loaded in launchd" or "loaded but no live process".

The same report also flagged a separate symptom: when Vite did run, Inertia's wayfinder plugin shelled out to `php artisan wayfinder:generate --with-form` and failed with "/bin/sh: php: command not found". The launchd guard script and the systemd unit for host workers were never putting lerd's bin directory on PATH, so the php/composer/laravel shims couldn't be reached from npm-spawned subprocesses. Both paths now prepend config.BinDir(), and the Linux unit additionally re-adds ~/.local/bin so we don't quietly narrow what systemd-user previously inherited.

* fix(ui): localize hardcoded English in site detail address bar

#365's address-bar header for site detail landed with English literals
on the TLS toggle, LAN toggle, mobile overflow LAN entry, and the
overflow menu's aria-label. The Paraglide message keys all existed
already (sites_controls_httpsToggle_on/off, sites_controls_lanToggle_on/off,
common_moreActions) and tr.json was complete — the new component just
skipped them. Non-English users (tr just shipped in #355) saw English
on the most heavily-touched UI of v1.21.0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant