Commit Graph
17 Commits
Author SHA1 Message Date
David Heinemeier HanssonandClaude Opus 4.8 1ad707b81e Give every hero toggle a keyboard focus ring
Each panel's hero on/off toggle (Tailscale, Dropbox Wi-Fi, Bluetooth,
network, audio mute) now has a reachable "header" cursor section, a focus
ring around the hero icon, Enter/Space activation, a letter shortcut, and
hover parity. The hero is inset by heroRingPad so the ring stays inside
the Flickable/ScrollView clip box instead of being cut off.

Bluetooth and audio get a virtual "header" section above their device
sections, so the adapter/mute can be toggled by keyboard even when no
device rows exist. Network repurposes its previously dead header section.

For the PanelHero-based panels (Tailscale, Dropbox), route panel state
through the wrapper's `header` id: inside a PanelHero iconComponent `root`
resolves to PanelHero, not the Panel, so `root.headerHasCursor` and
`root.setHeaderCursor()` silently referenced the wrong object.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 15:50:05 -07:00
David Heinemeier HanssonandClaude Fable 5 ffa12802f7 Let the Tailscale panel toggle on and off like Dropbox
The hero icon is now the optimistic on/off toggle with a tooltip,
replacing the connect block and the progress lines beneath the hero.
The disconnected cross is drawn grey rather than red, and action
errors expire after a couple of seconds instead of sticking forever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 14:26:19 -07:00
David Heinemeier Hansson d2c4c1c4bb Standardize bar icon geometry 2026-07-17 15:20:55 -07:00
David Heinemeier Hansson e6c0c0ce6f Repair Tailscale authorization flow 2026-07-17 10:20:08 -07:00
Kevin McConnell 47c5f12fb9 Fix panel array guards
The `Bar` uses a `Repeater` when building out the models. This has the
effect of marshalling the configuration, and causing JSON arrays to
become sequence wrappers.

A couple of the plugins had been checking for the existence of array
values with `Array.isArray`, which fails for the sequence wrappers,
causing the values to be ignored. This breaks associated functionality
(the "hide" and "pin" actions in the systray had stopped working, as had
exit node selection in Tailscale).

Switching the guards to use `instanceof Array` works correctly for
sequence values (as well as arrays).
2026-07-14 15:36:43 +01:00
David Heinemeier Hansson 51075ce0f8 Make sure we never get in-panel scrolling when we shouldn' 2026-06-20 22:19:53 +02:00
David Heinemeier Hansson 2dd03f9b3b Polish bar icon spacing 2026-06-06 16:43:00 +02:00
David Heinemeier Hansson e4500b96ac Improve Tailscale panel controls 2026-06-06 15:48:56 +02:00
Ryan Hughes c0e4c80f55 Bring on gradient borders 2026-06-02 11:17:13 -04:00
David Heinemeier Hansson 490e80717e Refine Mullvad exit node picker 2026-05-28 21:21:33 +02:00
David Heinemeier Hansson c583da16c9 Group Mullvad exit nodes by country 2026-05-28 21:21:33 +02:00
David Heinemeier Hansson efc1007d08 Separate transparent bar foreground from panel text 2026-05-27 14:23:13 +02:00
David Heinemeier Hansson e3939e6b76 Use Tab to switch bar panels 2026-05-27 10:40:32 +02:00
David Heinemeier Hansson 1ff1d081a2 Massage it 2026-05-27 10:29:01 +02:00
David Heinemeier Hansson c7c14207f7 Fix icon placement 2026-05-27 08:56:29 +02:00
David Heinemeier Hansson 4dca35f615 Add exit nodes to the panel 2026-05-27 08:44:32 +02:00
David Heinemeier Hansson f2d3456979 Add Tailscale panel connection controls 2026-05-26 22:07:20 +02:00