bread-theme: add spotlight pill and stage theme support #45

Merged
Breadway merged 14 commits from feature/spotlight-pill into main 2026-09-30 01:57:19 +08:00
Owner

Implements the spotlight theme schema and styling used by the pill and stage, plus isolated bread-capture support for the spotlight screenshot views.

Verification: workspace tests passed with the gtk and extract feature sets, clippy passed for the workspace and each feature set, and the extract workspace build passed. Headless Sway smoke captures passed for the pill and stage views.

Dependency order: merge this PR before the Breadway/breadbar PR for BAR-27, BAR-30, and BAR-31. The breadbar PR uses this theme API and CSS.

Implements the spotlight theme schema and styling used by the pill and stage, plus isolated bread-capture support for the spotlight screenshot views. Verification: workspace tests passed with the gtk and extract feature sets, clippy passed for the workspace and each feature set, and the extract workspace build passed. Headless Sway smoke captures passed for the pill and stage views. Dependency order: merge this PR before the Breadway/breadbar PR for BAR-27, BAR-30, and BAR-31. The breadbar PR uses this theme API and CSS.
Redesign the spotlight theme's bar manifest for the new floating pill
(bos-ui-demos/proposed/spotlight-stage.html) instead of the old capsule
launcher. Adds modules.workspaces.display (none/current/all, defaulting
to all so every other theme is unaffected), a bar.autohide table
(disabled by default, on for spotlight with the mockup's own timings),
and sep/flag/unread as new builtin bar modules. Reworks spotlight's
theme.toml to a 30px fully rounded top-anchored content-hugging pill
with no exclusive zone, and appends pill CSS primitives (workspace
current-mode label, low-battery flag, unread dot, tucked lip) to the
shared base.css template; these are inert dead CSS for every other
builtin, confirmed via the re-blessed golden snapshots (only spotlight's
own snapshot changes in substance).

Rewrites the old spotlight-specific tests that encoded the previous
capsule-launcher design and adds coverage for the new display/autohide
resolution and validation.
Small follow-up to the pill schema commit: breadbar's display=current
indicator needs a bare colored value (no chip fill), separate from the
existing .workspace-btn.active chip styling.
Matches the pill-* views breadbar's own screenshot.rs now knows about
(BAR-27 phase 1), so bread-capture --app breadbar --view pill-shown
(etc.) works the same way the existing capsule-* views do.
Its whole footprint is a hover target, most of which must stay
invisible; without this it painted as an opaque rectangle across the
top of the screen whenever [bar.autohide] is enabled.
The bar row is a GtkCenterBox, whose natural width is centre + 2 * max(left,
right) so the centre child stays centred. With the whole pill row in the left
slot the pill measured twice its content's width and drew the content in its
left half with dead space on the right (visible in every pill-* capture).
Moving the row to the centre slot, with left/right empty, makes the pill hug
its content exactly.

Also corrects the chip_gap comment, which described a .pill-item margin rule
that does not exist.
Phase-1 review must-fix: spotlight's accent_from/accent_to now point at
`fg` (the fixed warm-white foreground) instead of `accent` (a wallpaper-
tracking pywal hue), matching the mockup's own flat `--light`. This fixes
the active workspace chip fill, the "WS current" mode's big number, and
(currently inert, the dormant capsule) the launcher caret/selection colour.
The unread dot now maps `--brass` to `@accent` instead of `@yellow`, one
consistent accent-ish token, matching the new surtitle/stage brass usage.

New schema (both default to today's behaviour for every theme that omits
them, so this is additive-only):
- [osd].style = "window" (default) | "pill"
- [notifications].style = "toast" (default) | "surtitle"
Spotlight's own theme.toml sets both to their spotlight-native value.

New CSS (assets/shell/base.css): the stage's own layout (search, recent
tiles, three-zone floor, results, power row), the surtitle caption window,
and the in-pill level display, all scoped under classes only breadbar's
new Rust code (BAR-30 phases 2-4) ever attaches, so every rule is inert
dead weight for every other builtin, kept in the shared template per this
file's existing convention for the pill itself. Uses the real Big Shoulders
Display / Hanken Grotesk / Martian Mono faces directly (all three are now
installed) rather than a fallback-only compromise.

bread-capture: registers the new breadbar screenshot views (stage-idle,
stage-results, stage-commands, stage-calc, stage-power-armed, stage-narrow,
surtitle, pill-level, pill-tucked-input).

Golden snapshots re-blessed: liquid-motion/glass-workbench/daylight/loaf's
diffs are pure inert additions (the new stage/surtitle/pill-level CSS,
which nothing in those themes ever applies) plus the two pre-existing pill
token fixes already reviewed in BAR-27; confirmed via `git diff` before
blessing. spotlight's own diff is the intended visual changes above.
- Stage buttons (tiles, chips, rows, power) reset background-color too, so
  unselected rows and tiles no longer paint the stock dark button fill.
- The search entry has no frame or focus ring of its own, and its text and
  placeholder are 22px (the shared sheet's * rule targets the inner text
  node directly, so the size on the entry never reached it).
- Running text on the stage and the surtitle uses the theme's UI face via a
  new font_ui_css variable (the theme's font_fallback list), named per node
  for the same * rule reason. Spotlight: Hanken Grotesk, the mockup's --ui.
- Sliders and the in-pill level bar drop the stock borders that drew a blue
  outline; the level bar is the mockup's 120px now that breadbar measures
  the level overlay, and the level box is transparent (breadbar fades the
  pill content instead of masking it).
- The act badge's opacity trick is gone; breadbar toggles its visibility.

Golden snapshots re-blessed: every non-spotlight diff is confined to the
inert .stage-*/.pill-level*/.surtitle-* rules.
breadbar-stage, breadbar-surtitle and breadbar-pill-hotzone had no
[compositor] entry, so Hyprland applied its default layer popin. On the
full-screen translucent stage that showed as a dark box growing into
view. They now get no_anim (the surtitle keeps its blur), and breadbox
is marked no_anim too.
Lets a capture be laid over a render of a design mockup's own desktop, so the
isolated screenshot can be compared against the mockup pixel for pixel. The
generated rainbow stays the default, and a supplied file is never deleted.
stage-empty, stage-note-hover and surtitle-critical, so the empty-results
hint, a notification row's hover state and a critical caption can be
captured and compared against the mockup.
Rewrites the spotlight block of the shared template against
spotlight-stage.html rule by rule: exact sizes, radii, spacing, fonts, line
boxes, shadows and transitions, with the mockup's colours mapped to one
consistent set of palette roles (light fg, brass accent, ash, line, red,
velvet via mix()). The pill now draws on the window's inner box inside a
transparent shadow margin, so its drop shadow renders; it gains the hover
shade, tuck fade and flag glow. Adds the lip fade, the stage fade and cone
fade, the surtitle fade, the art tile, widget cards, notification time and
hover-only dismiss, the stacked count, and the key-hint footer.

A new "level" bar module places the in-pill level readout before the flag,
where the mockup puts it, and a bg_alpha template variable exposes the bar's
fill alpha to rules that paint it on an inner box.

Every changed rule is scoped to spotlight-only classes. The golden
snapshots were re-blessed; for the other four builtins every rule outside
those classes is identical before and after.
Lua widgets registered at right_of_workspaces or left_of_stats (the
flight, Claude usage and git-branch bar widgets) had no slot under
spotlight and were dropped. Both placements now sit in the pill row
where the other themes' bars would put them. Adds CSS for tray widgets
rendered whole as stage cards and for the stage settings menu, and a
stage-settings bread-capture view.
The stage's notification rows gain a second, dimmer line for the
notification body; adds its CSS and re-blesses the golden snapshots
(inert additions for every other theme).
Merge remote-tracking branch 'origin/main' into feature/spotlight-pill
All checks were successful
check / check (push) Successful in 1m58s
35d8ca649f
# Conflicts:
#	bread-theme/src/shell/mod.rs
Author
Owner

PR #45 is open and linked; check / check (push) passed. Moving this card to REVIEW for independent review. It must merge before dependent breadbar PR #37.

PR #45 is open and linked; check / check (push) passed. Moving this card to REVIEW for independent review. It must merge before dependent breadbar PR #37.
Author
Owner

Acceptance criteria as I read them: (1) add schema and validated defaults for workspace display, pill auto-hide, OSD style, and notification style, mapped to bread-theme/src/shell/manifest.rs:655-714, 945-1027 and bread-theme/src/shell/types.rs:178-207, 349-444; the spotlight manifest selects the requested modes at bread-theme/assets/shell/spotlight/theme.toml:72-140. (2) Provide the spotlight pill, stage, and surtitle styling with palette roles, mapped to bread-theme/assets/shell/base.css:1295-2230. (3) Keep other themes unchanged by default, covered by resolver defaults and the other-theme golden snapshots. (4) Support isolated spotlight captures, mapped to bread-capture/src/isolation.rs and bread-capture/src/main.rs; the reported headless Sway smoke captures exercise the pill and stage views.

The new manifest checks and rendered CSS goldens are meaningful coverage, and the reported captures cover the visual states. CI check / check (push) is green, and PR #45 is mergeable. Reviewed, looks ready to merge. No blocking findings or nits. I am leaving the merge to the user because bread-ecosystem is release-sensitive.

Acceptance criteria as I read them: (1) add schema and validated defaults for workspace display, pill auto-hide, OSD style, and notification style, mapped to `bread-theme/src/shell/manifest.rs:655-714, 945-1027` and `bread-theme/src/shell/types.rs:178-207, 349-444`; the spotlight manifest selects the requested modes at `bread-theme/assets/shell/spotlight/theme.toml:72-140`. (2) Provide the spotlight pill, stage, and surtitle styling with palette roles, mapped to `bread-theme/assets/shell/base.css:1295-2230`. (3) Keep other themes unchanged by default, covered by resolver defaults and the other-theme golden snapshots. (4) Support isolated spotlight captures, mapped to `bread-capture/src/isolation.rs` and `bread-capture/src/main.rs`; the reported headless Sway smoke captures exercise the pill and stage views. The new manifest checks and rendered CSS goldens are meaningful coverage, and the reported captures cover the visual states. CI `check / check (push)` is green, and PR #45 is mergeable. Reviewed, looks ready to merge. No blocking findings or nits. I am leaving the merge to the user because bread-ecosystem is release-sensitive.
Breadway deleted branch feature/spotlight-pill 2026-09-30 01:57:19 +08:00
Author
Owner

Independent review passed with no blocking findings or nits. CI was green and PR #45 was mergeable. Merged #45 by squash at d9ab179d; it unlocks dependent breadbar PR #37.

Independent review passed with no blocking findings or nits. CI was green and PR #45 was mergeable. Merged #45 by squash at d9ab179d; it unlocks dependent breadbar PR #37.
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/bread-ecosystem!45
No description provided.