Convert British spellings to American across the repo

colour -> color, behaviour -> behavior, centre -> center, favourite ->
favorite, and about twenty other pairs, applied consistently across
comments, docs, error/UI copy, and a handful of QML identifiers that
used the British spelling as their actual name: SystemSettings'
serialiseValue/serialiseTable/normaliseGradient, Displays'
normaliseModes, Wallpaper's normalisePolicy, SettingsBackup's
serialiseHomeState, DateTime's ntpSynchronised property, Clipboard's
_normalise helper, and ShortcutCapture's cancelled signal (with its
onCancelled handler in ShortcutsPage.qml). Every call site and the two
tests that assert on the literal source text (settings-ownership and
settings-backup-live contracts) were updated in lockstep.

Left untouched: config/dot/espanso/match/packages/misspell-en/ is a
vendored third-party autocorrect dictionary -- its entries are typo
corrections, not our prose, and rewriting them would fight the
package's own purpose (and any future re-sync from upstream).

The already-American `favorites` property (Home page pinned
accessories) was never actually misspelled -- only nearby comments and
error strings said "favourites" -- so no data migration was needed
there.

Claude-Session: https://claude.ai/code/session_01E6TJUAh41HaP25MVHWkhRZ
This commit is contained in:
Gabriel Brown
2026-08-19 08:07:55 -04:00
parent 8156fc47ca
commit d96863b687
113 changed files with 322 additions and 322 deletions
@@ -90,7 +90,7 @@
- Produces: `ShellState.openOverview(workspaceId)`, filmstrip selection, large workspace preview, cross-workspace window search
- [x] Add requested-overview-workspace state without coupling `ShellState` to the focus service.
- [x] Replace the centred equal-card row with a top filmstrip and a large selected-workspace preview.
- [x] Replace the centered equal-card row with a top filmstrip and a large selected-workspace preview.
- [x] Keep the trailing dynamic-workspace card and one-shot thumbnail capture behavior.
- [x] Add wheel navigation over the strip and keep the overview mapped while switching workspaces.
- [x] Add a keyboard-focused search field and filtered cross-workspace window results.
@@ -328,7 +328,7 @@ FileView {
printErrors: false
atomicWrites: true
onSaved: root.saveError = ""
onSaveFailed: error => root.saveError = "Could not save Home favourites."
onSaveFailed: error => root.saveError = "Could not save Home favorites."
JsonAdapter {
id: values
property bool initialized: false
@@ -15,10 +15,10 @@ holds the shipped defaults; one JSON file is the truth both sides read.
- Verify every write by reading the value back (`hyprctl getoption`), never by
trusting an exit code.
- No UI-supplied string is interpolated into `eval`, a shell command, or a config
value. Numbers range-checked, choices allow-listed, colours hex-validated.
value. Numbers range-checked, choices allow-listed, colors hex-validated.
- A missing or malformed `settings.json` degrades to shipped defaults. The Lua
read is `pcall`-wrapped so it can never take down the compositor config.
- Tokyo Night Moon and Prism stay the only identity; customisation adjusts its
- Tokyo Night Moon and Prism stay the only identity; customization adjusts its
parameters, it does not replace it.
- Motion stays event-driven at every setting. No idle repaint.
- Do not restart the running Quickshell process during development; it hot-reloads.
@@ -30,7 +30,7 @@ holds the shipped defaults; one JSON file is the truth both sides read.
## Stage 0 — Stop the lying (ship first, standalone)
The display-policy toggles report success while doing nothing. This is a
correctness bug in shipped behaviour and does not depend on any of the
correctness bug in shipped behavior and does not depend on any of the
architecture below.
**Files:** Modify `config/dot/quickshell/services/SystemSettings.qml`;
@@ -40,7 +40,7 @@ Test `tests/quickshell/settings-hyprland-write-contract.sh`
asserts via `hyprctl getoption` that the compositor value actually changed —
and that a rejected write leaves `lastError` non-empty.
- [x] Run it; confirm it fails against the current `hyprctl keyword` implementation.
- [x] Add a single `applyOptions(values)` boundary that serialises validated values
- [x] Add a single `applyOptions(values)` boundary that serializes validated values
into `hl.config{}` and runs them through `hyprctl eval`.
- [x] Route `setAutoHdr`, `setVrrPolicy`, and `setDirectScanoutPolicy` through it.
- [x] Treat "wrote it back and read it back equal" as the only success condition;
@@ -134,9 +134,9 @@ Test `tests/hypr/prefs-fallback-contract.sh`
- [x] Implement a dependency-free JSON reader exposing `prefs.get(key, fallback)`,
`pcall`-wrapped, reading `$XDG_CONFIG_HOME/panama/settings.json`.
- [x] Require it first in `hyprland.lua`, before `looks`.
- [x] Convert the appearance and behaviour literals in `looks.lua` and `input.lua`
- [x] Convert the appearance and behavior literals in `looks.lua` and `input.lua`
to `prefs.get("<key>", <current literal>)`, keeping every current value as
the fallback so shipped behaviour is byte-identical.
the fallback so shipped behavior is byte-identical.
- [x] Extend `PreferenceSchema.qml` with the Hyprland-owned keys, each carrying
the `hl.config` path it maps to.
- [x] Have `SystemSettings` derive its `eval` payload from that mapping, so a new
@@ -208,7 +208,7 @@ Modify all eleven `*Page.qml`; Test `tests/quickshell/settings-rows-contract.sh`
- [ ] Move the remaining pages (Home, Displays, Connectivity, Sound,
Notifications, Screen Intelligence, Services, About) onto `SettingsPage`.
**Exit criteria:** no shipped behaviour value is reachable only by editing a file.
**Exit criteria:** no shipped behavior value is reachable only by editing a file.
**Landed (first pass).** `SettingsPage` plus `ToggleRow`, `SliderRow`,
`ChoiceRow`, `ActionRow`, and `TextRow`. A row names a schema key and needs
@@ -218,7 +218,7 @@ explanation, bounds, and unit from the schema, and writes through
apply-and-verify and local keys straight to the store. Rows never need to know
which kind they hold.
`DesktopPreview` is the direction-B centrepiece: two tiled windows drawn at the
`DesktopPreview` is the direction-B centerpiece: two tiled windows drawn at the
settings actually in effect, scaled by the ratio between the preview's width and
the real monitor's, so a 10px gap on a 4500px display looks as small as it is.
@@ -2,7 +2,7 @@
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Expand Panama Quick Settings into the approved Control Center with secure Home Assistant favourites and capability-aware iPhone continuity.
**Goal:** Expand Panama Quick Settings into the approved Control Center with secure Home Assistant favorites and capability-aware iPhone continuity.
**Architecture:** Two executable Python helpers own the external boundaries: KDE Connect CLI/D-Bus and the Home Assistant REST API/credential lookup. Quickshell singletons normalize those JSON contracts for focused Home and Phone components inside the existing Quick Settings window; Ongoing and Signal Glass consume transfer lifecycle without duplicating state.
@@ -17,7 +17,7 @@
- Only one of Wi-Fi, Bluetooth, sink, source, Home, and Phone may be expanded at once.
- Never print Home Assistant tokens, Authorization headers, clipboard text, certificate fingerprints, IP addresses, response bodies, or full local file paths.
- Home Assistant tokens remain in the gitignored environment file or Secret Service; never write one into tracked content.
- Home Assistant toggle commands accept only entity IDs from the configured favourites snapshot.
- Home Assistant toggle commands accept only entity IDs from the configured favorites snapshot.
- KDE Connect actions derive from advertised plugins; no fake battery or remote-input control is allowed.
- Every Home toggle, file chooser, file send, clipboard send, and Ring action requires a user click.
- Home toggle success, phone Ring, and clipboard success remain globally quiet.
@@ -49,8 +49,8 @@
- `config/dot/quickshell/modules/quicksettings/QuickSettings.qml` — tighter top attachment and service preparation.
- `config/dot/quickshell/modules/quicksettings/QuickSettingsPanel.qml` — expanded composition and exclusive section routing.
- `config/dot/quickshell/modules/quicksettings/ControlSectionHeader.qml` — quiet section label and optional trailing action.
- `config/dot/quickshell/modules/quicksettings/HomeControls.qml` — four favourites, expanded configured list, loading/stale/failure states.
- `config/dot/quickshell/modules/quicksettings/HomeTile.qml` — one domain-aware favourite tile.
- `config/dot/quickshell/modules/quicksettings/HomeControls.qml` — four favorites, expanded configured list, loading/stale/failure states.
- `config/dot/quickshell/modules/quicksettings/HomeTile.qml` — one domain-aware favorite tile.
- `config/dot/quickshell/modules/quicksettings/PhoneControls.qml` — approved compact Continuity Card.
- `config/dot/quickshell/modules/quicksettings/RecentExchange.qml` — one session-local completed transfer row.
- `config/dot/quickshell/modules/bar/StatusCluster.qml` — reachable-phone glyph inside the existing click target.
@@ -340,7 +340,7 @@ Expected: all tests PASS and the fake server records no unexpected route.
- [ ] **Step 5: Add and run the redacted live contract**
The contract runs `probe` and `snapshot`, validates the schema, and prints only
`PASS (configured=true, N favourites; contents redacted)`. It must pipe JSON to
`PASS (configured=true, N favorites; contents redacted)`. It must pipe JSON to
`jq` without printing friendly names, entity IDs, URL, or raw errors.
- [ ] **Step 6: Commit Task 2**
@@ -599,7 +599,7 @@ git commit -m "Build the Panama Control Center"
- [ ] **Step 1: Update desktop documentation**
Mark Home Assistant favourites and KDE Connect phone integration Live. Document
Mark Home Assistant favorites and KDE Connect phone integration Live. Document
the 430-pixel Control Center, two-pixel bar attachment, environment/keyring
configuration precedence, BlueBubbles messaging boundary, and current iOS
capabilities. Remove those two items from `System UI still worth adding` while
@@ -628,7 +628,7 @@ inspect only the new process's journal for QML errors or warnings.
- [ ] **Step 4: Perform read-only live checks**
Verify the Control Center reports one reachable phone with the confirmed action
names and seven configured Home favourites without printing identities. Open
names and seven configured Home favorites without printing identities. Open
and close the panel, expand Home and Phone, and confirm Wi-Fi, Bluetooth, audio,
Focus, Caffeine, Night Light, settings, power, Escape, and outside-click remain
usable. Do not trigger an external-device action.
@@ -503,7 +503,7 @@ Accounts destinations while this feature was in review. Merge commit `4ef2f01`
preserves those routes and the newer Settings navigation architecture, keeps
the stable `services` route rendered by `HealthPage`, and leaves
`ServicesPage.qml` retired. Its useful Fedora handoffs for Users, Sharing,
Colour profiles, and Digital wellbeing now live in the boundary-last System
Color profiles, and Digital wellbeing now live in the boundary-last System
Health card alongside the existing network handoff, with focused static and
isolated runtime coverage.
@@ -16,12 +16,12 @@ Panama gains a polished focus-session surface and a GNOME-like workspace overvie
## Signal Glass surface
- The main capsule is a top-centred blurred glass surface below the bar, carrying Panama's Prism edge, Tokyo Night Moon palette, and event-driven open/close motion.
- The main capsule is a top-centered blurred glass surface below the bar, carrying Panama's Prism edge, Tokyo Night Moon palette, and event-driven open/close motion.
- Its primary row shows the focus icon, workspace label, remaining time, and whether DND and Caffeine are being held.
- Clicking the primary row activates the bound workspace and dismisses the capsule without ending the session.
- The action row contains Pause or Resume, Workspace, and End.
- Workspace opens the Continuum overview with the session's bound workspace selected.
- A labelled close button hides the capsule while the session continues.
- A labeled close button hides the capsule while the session continues.
- While a session exists, a compact bar indicator remains visible. Clicking it reopens the capsule, so dismissal never makes the running session undiscoverable.
- No focus UI animates while idle. The only periodic update is the once-per-second remaining-time text while a session is running and not paused.
@@ -107,7 +107,7 @@ Devices and Desktop & Dock. Its page contains three cards.
1. **Home Assistant** shows connection health, discovered-light count, Refresh,
and Open Home Assistant.
2. **Control Center favourites** shows selected accessories as a two-column
2. **Control Center favorites** shows selected accessories as a two-column
card shelf. Each item exposes a drag handle, editable alias, source friendly
name, and Remove action. Dragging reorders the list; the first four are
explicitly marked as the resting Control Center shelf.
@@ -55,7 +55,7 @@ $ hyprctl getoption decoration:rounding -j → "int": 4
`eval` is also strictly more capable than `keyword` — it can set *any* config
value, including gradients, animation curves, and nested tables. It executes
arbitrary Lua, so the existing "never interpolate UI text into a command" rule
must extend to it: values are validated and serialised numerically, never
must extend to it: values are validated and serialized numerically, never
concatenated from user input.
### Finding 2: three disconnected sources of truth for the same three values
@@ -206,7 +206,7 @@ promote the ~40 hardcoded `Settings.qml` values into real controls, and give
Appearance genuine content: accent pair, window rounding, gaps, border size,
blur, animation speed, bar height, font scale, and wallpaper.
Appearance customisation stays inside the design language. The user picks how much
Appearance customization stays inside the design language. The user picks how much
of it there is — spacing, softness, motion — not a free-form palette editor that
would let the Prism identity be dismantled by accident.
@@ -223,13 +223,13 @@ defaults, and Settings applies them live with `hyprctl eval`.
- No UI-supplied string is ever interpolated into an `eval`, a shell command, or
a config value. Numbers are range-checked; choices are matched against an
allow-list; colours are validated as hex before serialisation.
allow-list; colors are validated as hex before serialization.
- A malformed or absent `settings.json` must degrade to shipped defaults, never
to a broken compositor.
- `hyprctl keyword` is banned in this codebase. It exits 0 without acting.
- Every write path must be observably verified — read the value back rather than
trusting an exit code. Finding 1 exists because an exit code was trusted.
- Tokyo Night Moon and Prism remain the only visual identity. Customisation
- Tokyo Night Moon and Prism remain the only visual identity. Customization
adjusts its parameters, it does not replace it.
- Motion stays event-driven. No idle repaint, at any setting.
- GNOME keeps ownership of hardware, accounts, printers, and users.
@@ -4,7 +4,7 @@
Panama will expand the existing top-right Quick Settings popover into a complete
Control Center. Wi-Fi, Bluetooth, Focus, Caffeine, Night Light, audio, account,
settings, and power remain in place. Home Assistant favourites and lightweight
settings, and power remain in place. Home Assistant favorites and lightweight
iPhone continuity join that same surface instead of creating separate windows
or permanent bar widgets.
@@ -18,7 +18,7 @@ the paired iPhone exposes only a useful subset of KDE Connect.
- Make the top-right popover feel like a complete desktop Control Center rather
than a small collection of connectivity toggles.
- Toggle the existing Home Assistant favourites without opening a browser.
- Toggle the existing Home Assistant favorites without opening a browser.
- Preserve the user's seven enabled Home Assistant lights and use Home
Assistant friendly names and live states.
- Show the paired iPhone's real reachability and expose Send File, Send
@@ -67,7 +67,7 @@ The resting panel is ordered by frequency and scope:
1. Wi-Fi, Bluetooth, Caffeine, and Night Light toggle grid.
2. Focus and audio controls.
3. Home favourites.
3. Home favorites.
4. Phone continuity.
5. User, Panama Settings, and power footer.
@@ -83,7 +83,7 @@ panel remains predictable.
## Home section
The resting Home card shows the first four enabled favourites in their saved
The resting Home card shows the first four enabled favorites in their saved
order. Each tile contains a domain-appropriate glyph, a friendly name, and a
plain state such as `On`, `Off`, or `Unavailable`. Enabled lights use a quiet
amber light treatment; Panama blue remains reserved for desktop selection and
@@ -96,7 +96,7 @@ without a toast or Signal Glass event. A failure restores the last known state
and displays a concise inline error inside the Home section.
The trailing `N accessories` action expands a full list of configured
favourites inside the Control Center. No unconfigured Home Assistant entity is
favorites inside the Control Center. No unconfigured Home Assistant entity is
shown. An `Open Home Assistant` action launches the configured base URL.
If Home Assistant is unreachable, Panama retains the last good states for the
@@ -165,7 +165,7 @@ reliable byte progress for this device.
Add `scripts/panama-home-assistant`, a small local bridge with four commands:
- `probe` reports configuration and API availability without entity details;
- `snapshot` returns only configured favourites and normalized state;
- `snapshot` returns only configured favorites and normalized state;
- `toggle ENTITY_ID` calls the Home Assistant service for an allow-listed
configured entity; and
- `open` launches the configured Home Assistant URL.
@@ -212,7 +212,7 @@ outside-click behavior remain intact.
- Helpers never echo tokens, Authorization headers, clipboard text, entity
response bodies, IP addresses, or full local file paths to logs.
- Home Assistant commands accept only entity IDs present in the configured
favourites snapshot.
favorites snapshot.
- KDE Connect device IDs and file paths are passed as separate process
arguments, never interpolated into a shell command.
- A user click is required for every Home toggle, phone ring, clipboard send,
@@ -231,7 +231,7 @@ outside-click behavior remain intact.
is offered.
- Invalid or expired token: Home shows `Authentication required` without
exposing the response body.
- One malformed entity is omitted without suppressing healthy favourites.
- One malformed entity is omitted without suppressing healthy favorites.
## Testing and verification
@@ -261,7 +261,7 @@ checks require an explicit user action from the finished Control Center.
## Documentation updates
- Update `config/dot/hypr/DESKTOP-PARITY.md` to mark Home Assistant favourites
- Update `config/dot/hypr/DESKTOP-PARITY.md` to mark Home Assistant favorites
and KDE Connect phone integration live.
- Document Control Center behavior, credential resolution, and iOS limitations
in `config/dot/hypr/README.md`.
@@ -52,7 +52,7 @@ The feature is deliberately local-first. Screen pixels are captured into Panama'
- Tokyo Night Moon tokens are the only colors.
- Processing uses a static status treatment; there is no spinner, pulse, shimmer, or idle animation.
- OCR text is readable interface typography in a selectable editor, not a terminal-like dump.
- The primary action is Copy. Network-leaving actions are visually secondary and clearly labelled.
- The primary action is Copy. Network-leaving actions are visually secondary and clearly labeled.
## Settings and discoverability