Implement BOS Settings v2 controls and proposal gap fixes #46

Merged
Breadway merged 28 commits from feature/bos-settings-v2 into main 2026-10-13 19:05:05 +08:00
Owner

Implements the approved Settings v2 navigation and workflows, including the gaps identified by the binary audit. Reference: bos-ui-demos/proposed/bos-settings-v2/index.html.

Changes:

  • 25 responsive sidebar destinations, preserved CLI aliases, fuzzy setting search and control highlighting.
  • Independent draft protection for stacked forms, including failed-save handling and Save / Discard / Keep editing navigation.
  • Six real Home quick controls, account and device summaries, measured storage attention, update counts and Undo.
  • Supported power profiles, optional automatic switching, real battery history, idle timers, battery-only sleep, lid policy and a power-button menu.
  • Typed notification preferences consumed by companion breadbar PR #57: DND/scheduling, per-app delivery, sounds and lock-time policy.
  • Persisted mouse/accessibility/font controls through managed Lua includes; window/shell previews and Undo.
  • Unified ranked repository/Flathub/AUR discovery with source filters, real votes and installed markers; retain terminal PKGBUILD review.
  • Installed startup-app picker, visible Managed by BOS entries and guarded advanced service editing.
  • Locale/clock choices, display mirroring and login overrides for transform/VRR.
  • Snapshot timeline, manual snapshots, destination picker and headless daily/weekly file-backup schedules.
  • Unused-dependency review and selected-only removal, measured directory totals, typed health checks and conditional OS version.
  • Existing safety snapshot/update flow, Sharing, default printer, Bluetooth and Secure Boot refinements remain included.

Snapshot restore from main PR #24 is included. Battery and keyboard correctness fixes from PRs #41 and #43 remain included, with shortcut labels/grouping/filtering now added.

Capability changes for user review:

  • Hub tabs are now stacked sections; old tab destinations scroll to the section.
  • Core startup entries are visible and read-only until advanced editing is enabled and confirmed. Raw startup/shortcut commands remain under advanced disclosures.
  • Secure Boot database details remain collapsed on Firmware and included in firmware updates.
  • Home category shortcuts are replaced by dashboard controls; all categories remain in sidebar/search.
  • The duplicate natural-scroll control was consolidated into the persisted Mouse setting; focus options remain.
  • Recommended apps, installed packages, raw bar CSS, manual bar restarts, zoom number/Apply controls, snapshot deletion and GRUB boot actions remain.
  • Later bar-specific CSS edits retain precedence over the global font/text preference.

Verification:

  • Frontend check: 0 errors, 0 warnings; frontend tests and production build pass.
  • Rust fmt and clippy with warnings denied pass; 134 tests pass.
  • Release executable rebuilt after the production frontend.
  • All 23 JavaScript, CSS, JSON, font and license assets matched bytes embedded in the executable after Brotli decompression. Repeat with node scripts/verify-embedded-frontend.mjs.
  • Companion bar: 24 notification tests, clippy and build pass; Forgejo CI is green.

No app launch, screenshot comparison, desktop input, live configuration writes or service starts were used for verification. Rendered pixel accuracy remains for the user. Hardware/services determine available controls, sounds need the sound player, secure lock surfaces control locked popups, and Btrfs directory totals overlap. Mockup sample data, app ratings and trust badges are not emitted as real readings.

Test binaries and checksums: docs/v2-build-report.md. Coverage/limits: docs/v2-proposal-verification.md. Full capability notes and manual checklist: docs/v2-progress.md.

Closes BSET-26
Closes BSET-30
Closes BSET-33
Closes BSET-34
Closes BSET-35
Closes #45
Refs BSET-43
Refs BSET-32
Refs BSET-36
Companion: Breadway/breadbar#57

Implements the approved Settings v2 navigation and workflows, including the gaps identified by the binary audit. Reference: bos-ui-demos/proposed/bos-settings-v2/index.html. Changes: - 25 responsive sidebar destinations, preserved CLI aliases, fuzzy setting search and control highlighting. - Independent draft protection for stacked forms, including failed-save handling and Save / Discard / Keep editing navigation. - Six real Home quick controls, account and device summaries, measured storage attention, update counts and Undo. - Supported power profiles, optional automatic switching, real battery history, idle timers, battery-only sleep, lid policy and a power-button menu. - Typed notification preferences consumed by companion breadbar PR #57: DND/scheduling, per-app delivery, sounds and lock-time policy. - Persisted mouse/accessibility/font controls through managed Lua includes; window/shell previews and Undo. - Unified ranked repository/Flathub/AUR discovery with source filters, real votes and installed markers; retain terminal PKGBUILD review. - Installed startup-app picker, visible Managed by BOS entries and guarded advanced service editing. - Locale/clock choices, display mirroring and login overrides for transform/VRR. - Snapshot timeline, manual snapshots, destination picker and headless daily/weekly file-backup schedules. - Unused-dependency review and selected-only removal, measured directory totals, typed health checks and conditional OS version. - Existing safety snapshot/update flow, Sharing, default printer, Bluetooth and Secure Boot refinements remain included. Snapshot restore from main PR #24 is included. Battery and keyboard correctness fixes from PRs #41 and #43 remain included, with shortcut labels/grouping/filtering now added. Capability changes for user review: - Hub tabs are now stacked sections; old tab destinations scroll to the section. - Core startup entries are visible and read-only until advanced editing is enabled and confirmed. Raw startup/shortcut commands remain under advanced disclosures. - Secure Boot database details remain collapsed on Firmware and included in firmware updates. - Home category shortcuts are replaced by dashboard controls; all categories remain in sidebar/search. - The duplicate natural-scroll control was consolidated into the persisted Mouse setting; focus options remain. - Recommended apps, installed packages, raw bar CSS, manual bar restarts, zoom number/Apply controls, snapshot deletion and GRUB boot actions remain. - Later bar-specific CSS edits retain precedence over the global font/text preference. Verification: - Frontend check: 0 errors, 0 warnings; frontend tests and production build pass. - Rust fmt and clippy with warnings denied pass; 134 tests pass. - Release executable rebuilt after the production frontend. - All 23 JavaScript, CSS, JSON, font and license assets matched bytes embedded in the executable after Brotli decompression. Repeat with node scripts/verify-embedded-frontend.mjs. - Companion bar: 24 notification tests, clippy and build pass; Forgejo CI is green. No app launch, screenshot comparison, desktop input, live configuration writes or service starts were used for verification. Rendered pixel accuracy remains for the user. Hardware/services determine available controls, sounds need the sound player, secure lock surfaces control locked popups, and Btrfs directory totals overlap. Mockup sample data, app ratings and trust badges are not emitted as real readings. Test binaries and checksums: docs/v2-build-report.md. Coverage/limits: docs/v2-proposal-verification.md. Full capability notes and manual checklist: docs/v2-progress.md. Closes BSET-26 Closes BSET-30 Closes BSET-33 Closes BSET-34 Closes BSET-35 Closes #45 Refs BSET-43 Refs BSET-32 Refs BSET-36 Companion: https://git.breadway.dev/Breadway/breadbar/pulls/57
fix(power): one Protect battery switch for thresholds, charge_types or conservation_mode
All checks were successful
check / check (push) Successful in 2m8s
85432a2c09
The charge limit control only appeared for charge_control_*_threshold, so
laptops that expose charge_types (Long_Life) or ideapad conservation_mode, like
the Yoga Slim 7, had no battery protection in the UI.

get_power_info now reports a protection descriptor and set_battery_protection
flips it, preferring thresholds (stop 80, resume 75, written in an order that
never leaves start above end), then charge_types Long_Life/Standard, then
conservation_mode 1/0. Writes use the existing pkexec tee pattern; the path is
discovered under /sys by the backend, never taken from the webview, and is
re-validated against a strict allowlist of file names and directories before
every write. The existing threshold sliders stay for hardware that has them.
fix(keybinds): capture the key that was typed, and warn on shortcut conflicts
All checks were successful
check / check (push) Successful in 2m10s
4b2f826a52
Shortcut capture derived letters and digits from KeyboardEvent.code, the
physical QWERTY position, but Hyprland binds by keysym, so on AZERTY, Dvorak or
Colemak the saved bind fired on a different key than the one pressed.

- keycapture.ts: read printable keys from event.key (letters upper-cased,
  shifted symbols mapped back to their base key since SHIFT is a modifier,
  punctuation as xkb names, other characters as Uxxxx); code is only a fallback
  for dead keys and generically named media keys.
- bindConflicts.ts: normalized combo identity (modifier aliases, default mods
  when a bind has none) and findConflict.
- Keybinds panel: a combo that another live bind already uses is held until
  the user picks Replace (the other bind is removed) or Cancel.
- Unit tests for layouts, shifted symbols, named keys, dead keys and conflicts.
Merge branch 'fix/shortcut-capture' into feature/settings-v2
All checks were successful
check / check (push) Successful in 2m8s
4f8d66bbe8
feat: implement the v2 settings shell and guarded workflows
Some checks failed
check / check (push) Failing after 1m6s
9b27861365
Breadway changed title from BOS Settings v2: responsive shell, guarded edits and real dashboard workflows to Implement BOS Settings v2 controls and proposal gap fixes 2026-10-03 16:19:13 +08:00
Simplify package query success checks for CI
Some checks failed
check / check (push) Failing after 2m20s
d16ae25e2b
Run generated Lua tests with a portable interpreter
All checks were successful
check / check (push) Successful in 2m18s
fc199b2aab
The shared drafts list was a deep $state array that forms push into on
mount and filter out of on unmount. Swapping pages could leave an
undefined hole in it, and DraftNotice's items.some(d => d.dirty) then
threw inside Svelte's flush. Every later update stopped: going from
Mouse & touchpad to Keyboard left Keyboard on Loading... with no
shortcuts or layout.

The list is now a $state.raw array replaced immutably, while each draft
stays its own reactive $state. Hub sections and pages also render
inside error boundaries, so one failing section shows its error and a
Try again button instead of blanking the rest of the page.
Found by driving the v2 build in a nested session:

- Updates: the firmware list was keyed by device name, so two "Hub"
  devices threw each_key_duplicate and the whole Updates section
  (including Update everything) failed to render.
- Battery: upower's time-to-empty was shown while plugged in and fully
  charged ("about 48.8 hours left"). Time remaining now only appears
  while discharging, "Time until full" while charging, and the status
  reads as words ("Fully charged") instead of upower's identifiers.
- Power modes: TLP users saw "No profile service". With TLP installed
  and no tlpctl, Power offers Set up power modes, which installs the
  allow-listed tlp-pd and enables tlp-pd.service through pkexec. The
  Home tile links there instead of sitting disabled.
- Idle timers saved outside the presets (240, 330 seconds) showed as raw
  numbers; any value now reads as minutes and seconds.
- Sidebar: native title tooltips only appear in the icon rail. At full
  width they repeated the label and their popup covered the next item,
  swallowing clicks. The footer shows the hostname instead of repeating
  the username.
- Home: status read failures collapse into one "Some status couldn't be
  read" disclosure with readable names instead of raw D-Bus errors on
  the page; Do not disturb says Not available with a tooltip.
- Pages open at the top: the content pane kept the previous page's scroll
  offset, so Desktop & bar opened halfway down after Appearance.
- Default apps: hidden xdg-mime entries (userapp-Zen-W24BP3.desktop) show
  their real Name instead of the raw desktop id.
- Date & language: locales read as "English (United States)" instead of
  en_US.utf8.
- Backup & restore: snap-pac descriptions read as sentences ("Before
  installing codex-update-manager") instead of pacman command lines;
  the raw text stays in the tooltip.
- Lock screen: clock format, wait after a wrong password and background
  are plain choices; a custom strftime format stays available under a
  disclosure, and the missing-example schema dump is gone.
- Notifications: when the running bar lacks the settings API, say so in
  words and keep the D-Bus error behind Details.
- Storage: one bar per filesystem (/ and /home on one Btrfs volume were
  shown twice).
- Short lists (firmware, firewall rules, users, nearby networks, backup
  snapshots) flow with the page instead of sitting in small inner scroll
  boxes; long package lists get a taller cap.
- Updates no longer lists Secure Boot certificate stores as firmware.
- Managed by BOS startup entries are styled rows; About's Help actions are
  rows with buttons instead of two full-width bars; Privacy & security no
  longer repeats the Users page; Printers page title matches the sidebar.
- Sound: per-app volume is inline (pactl sink-inputs, live via the
  existing subscribe watcher) with mute per app; the full mixer is still
  one click away. Monitor sources and loopback devices sit under a
  disclosure unless one is in use. The first device no longer hugs the
  section heading.
- Bluetooth: paired devices show a type icon from BlueZ's Icon property
  (headphones, controllers, mice, keyboards, phones, speakers).
- Shortcuts: bash -c wrappers are unwrapped before naming, screenshot
  bindings say what they capture, unknown apps read as "Open <App>",
  and directional actions include the direction (Move window left).
- Displays: modes read as "1920 x 1200 · 60 Hz" with the native mode
  marked recommended.
- Destructive buttons (Remove, Forget, Delete) are outlined in red
  instead of solid red fills across Saved networks, Launcher, Users,
  Firewall, Startup, Snapshots and Shortcuts.
feat(network): connection summary, inline join, places in words
All checks were successful
check / check (push) Successful in 2m39s
cff89550c3
- Wi-Fi & network opens with how you are online: the Wi-Fi network with
  signal, a wired connection, or not connected, with the Wi-Fi switch
  alongside. On Ethernet the page used to show only a small Connected
  label next to the radio switch.
- The password field opens under the network being joined, focused,
  with Enter to join, instead of at the bottom of the list.
- Location profiles are now Places, each with a one-sentence summary
  (joins, signs in through, picked automatically when, sends traffic
  through) and its form tucked under Edit.
- Empty places that only repeat another place's name in lowercase (the
  old breadcrumbs backfill) are flagged as removable.
- Fixes BSET-51: the field labelled "Run on connect / Optional command"
  is breadcrumbs' bootstrap SSID. It is now "Connect through first", a
  picker of saved networks.
Every settings form now writes itself: toggles, pickers and sliders shortly
after a change, text fields when you leave them. The mid-page Save buttons
are gone and a failed save shows the error with Try again.

Saving Wi-Fi settings rewrote networks.toml with only ssid, password and
hidden, deleting per-network DNS and all 802.1x login settings, and dropped
learn from places. Unmanaged keys are now carried over by SSID and place
name. Adds get_current_place and set_current_place over breadcrumbs profile.
Wi-Fi opens with how you are connected, then Places as chips plus one
sentence each with an Edit sheet, nearby networks, and saved networks in a
searchable list with Edit and Forget. VPN becomes Other connections and the
breadcrumbs tunables move into Advanced network settings in plain words.
A place that has a sign-in network or exit node while Tailscale is off now
says those settings are skipped. Leftover empty home/work/away places get
a Tidy up with Undo.

Bluetooth uses the hero card and device cards with type icons; identical
names show the last address digits. Add device scans in a sheet and folds
devices that only broadcast an address (shown as 7D-70-3F-...) away.

Shortcuts that rely on the default modifier now show it (Super + B, not B),
and the modifier is a picker. Toasts dismiss themselves.
feat: Power, Mouse, Startup, Updates and Backup in the proposal's style
All checks were successful
check / check (push) Successful in 2m28s
21bb9595d8
Power gets the battery hero (time left, draw to one decimal, health), mode
and lid choices as segmented picks, and drops the duplicate battery table
and raw TLP profile. Mouse shows Normal and percentages instead of raw
libinput numbers, with focus inline. Startup lists apps with switches and
edits them in a sheet; desktop services are folded away.

Updates leads with the update count and Update everything with live steps,
folds package lists away, shows one firmware section, and explains how to
go back. Snapshots restore through a sheet that says what happens; file
backups pick a folder or another computer, set up the store on first use,
and restore through a sheet.
Accessibility zoom used hyprctl keyword, which the Lua config refuses while
still exiting 0, so the zoom silently never applied. It now goes through
hyprctl eval. Power wrote 'hyprctl dispatch dpms off' into hypridle.conf,
a Lua syntax error under BOS, so the screen never turned off when idle;
it now writes hl.dsp.dpms through eval and migrates the old spelling
(BOS's skel ships it) whenever Power settings are saved. The listener
parser now skips braces inside quoted commands.

Desktop & bar, Lock screen and Accessibility follow the proposal: plain
labels and units, segmented choices, sheets for editing, and technical
settings behind Advanced or More. Dead sticky/slow keys and blur controls
are gone.
Sound picks devices from cards with friendly names (Speakers, Built-in)
and mutes from an icon next to the slider. Printers drops the CUPS/IPP
wording and adds by address. Renaming the computer lives in Sharing, with
KDE Connect installable there; About links to it and keeps hardware and
health checks plain. Storage leads with free space and warns when the disk
is nearly full. Users add people and change passwords in sheets. The
firewall allows apps by name (SSH, LocalSend, KDE Connect, Tailscale) with
raw rules under Advanced; it accepts port ranges and removes a rule by what
it allows. Date & language follows the proposal's Time / Language cards.
Displays use segmented choices; the Appearance window preview stays visible
at zero gaps; recommended apps lose the packaging jargon.
fix: storage measuring, stale search entries, and clicks found in the button pass
All checks were successful
check / check (push) Successful in 2m24s
416c9bc283
Measure folders failed whenever du met an unreadable folder (exit 1 with a
usable total), showing Unavailable and a wall of permission errors; app
cache review had the same check. Totals are now used, measuring no longer
locks the cleanup buttons, the snapshot figure that exceeded the disk says
it is shared, and empty caches are hidden.

43 search entries pointed at labels that no longer exist; they now target
the new names and keep the old words as keywords. The Wi-Fi hero says
Checking while the first scan runs instead of Not connected. Night light's
schedule uses the segmented style.
fix(nightlight): probe hyprsunset with gamma 100 and reap the daemon
All checks were successful
check / check (push) Successful in 2m24s
013588df0a
hyprctl hyprsunset gamma takes a percentage, so the liveness probe's 1.0
set 1% brightness and blacked out the display. The spawned hyprsunset is
now waited on, so turning night light off no longer leaves a defunct
process behind.
docs: say stock Hyprland configured with hyprland.lua, not a Lua Hyprland
All checks were successful
check / check (push) Successful in 2m22s
e08582db5a
Comments and two error messages read as if BOS ran a modified Hyprland.
It runs stock Hyprland; the keyword and dispatch limits come from its
hyprland.lua config mode.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Breadway/bos-settings!46
No description provided.