# The compiled-in builtin theme (bread-theme/src/shell/builtin.rs). The bar # side (workspaces/clock/chips/satellites) describes breadbar AS IT EXISTS # TODAY, not the 01-liquid-motion.html demo — where the two disagree (bar # side margin, the two easing curves), this file follows the current Rust # source, since Phase 2's acceptance test is pixel-identical rendering # against today's bar. The `[launcher]` table is the one exception: it now # follows bos-ui-demos/proposed/liquid-motion.html's `.bx` block (the # launcher-core redesign's spec) rather than breadbox's old, pre-redesign # hardcoded CSS — see that section's own note. # # Sources: breadbar/src/main.rs:16-22 (BAR_* / CHIP_HEIGHT / ICON_PX consts), # breadbar/src/theme.rs (load_css's radius/pad/spring locals and the actual # CSS selectors), breadbar/src/{panel,osd}.rs and # breadbar/src/notifications/{popup,history}.rs (satellite window anchors, # margins, namespaces), bos-ui-demos/proposed/liquid-motion.html (launcher), # ~/.config/hypr/scripts/ui/rules.lua (compositor rules). name = "Liquid Motion" id = "liquid-motion" [tokens] # font_family/font_fallback are now consumed, but only by breadbox's launcher # panel (breadbox::main::build_css's entry.search/row font-family) — see # Tokens::font_family's doc comment for the exact scope. breadbar's bar/chip/ # clock text still comes from bread_theme::stylesheet()'s own hardcoded # FONT_FAMILY constant, unaffected by this key. font_size_base is likewise # now consumed for the launcher's row font-size only. font_family = "Outfit, sans-serif" font_fallback = "sans-serif" font_size_base = 14 radius_bar = 16 radius_card = 12 radius_sm = 9 # Not in the plan's §4 schema list, but a named local in theme.rs::load_css # alongside radius_bar/radius_card/radius_sm (`radius_pill = "999px"`) — the # OSD pill's corner radius. radius_pill = 999 pad = 12 bg_alpha = 0.72 # Two curves theme.rs actually uses, not one: `spring` is the overshoot/bounce # curve (clock flips, pop-ins, the workspace caret draw); `spring_settle` is # the flatter curve used for hovers and workspace/stat-pair transitions. The # plan's §4 example names only `spring`. spring = "cubic-bezier(0.22, 1.35, 0.36, 1)" spring_settle = "cubic-bezier(0.22, 1.2, 0.36, 1)" # "accent" flows through as @accent (the workspace-trail gradient's start); # these are palette token NAMES, not hex - pywal still drives colour. # Declared-but-not-yet-consumed (accent_to only): breadbar's Trail-style CSS # hardcodes the literal gradient `linear-gradient(90deg, @accent, @teal)` # instead of substituting these two tokens (it never calls # ShellTheme::css(), the only thing that does the substitution) — this # theme's "teal" is what the demo intends, not what actually renders if a # future theme changed it. See Tokens::accent_to's doc comment. accent_from = "accent" accent_to = "teal" # Not in the plan's §4 schema list, but breadbar::CHIP_HEIGHT / ::ICON_PX # today. chip_height = 26 icon_px = 24 [bar.window] anchors = ["top", "left", "right"] width = "fill" height = 44 # No `bottom` set here (or by either sibling builtin) — it's accepted by the # schema but breadbar never applies it (no set_margin(Edge::Bottom, ...) # call exists). See Margin::bottom's doc comment before relying on it. margin = { top = 12, left = 16, right = 16 } exclusive = "auto" # breadbar never calls gtk4-layer-shell's set_keyboard_mode today, which # defaults to KeyboardMode::None — spelled out explicitly here rather than # left to omit-means-default, since "the shell must never fail to start # because a theme file is malformed" cuts both ways: an explicit builtin # value can't silently drift if the crate's own Default ever changes. keyboard = "none" layer = "top" [bar.slots] # The `widget:*` entries reproduce breadbar's pre-Phase-3b fixed Lua-widget # interleave exactly (main.rs's now-removed widget_right_of_workspaces / # widget_left_of_clock / widget_right_of_clock / widget_left_of_stats), so # this manifest still renders pixel-identically to today's bar. `tray` # deliberately has NO slot entry anywhere — it lives in the control-panel # popover, not the bar, and is keyed directly by breadbar regardless of # `[bar.slots]`. left = ["workspaces", "widget:right_of_workspaces"] centre = ["media", "widget:left_of_clock", "clock", "widget:right_of_clock"] right = ["widget:left_of_stats", "volume", "wifi", "battery", "control"] drawer = [] [modules.workspaces] style = "trail" show_empty = true [modules.clock] style = "flip" # Declared-but-not-yet-consumed under style = "flip": bar::clock::time() # hardcodes a 24h HH:MM layout regardless of `format`; only style = "plain" # ever calls formatted(&format). Set here to state the layout this clock # actually draws, not because anything reads it. Same for show_date — only # ever attached to the Plain style's box. format = "%H:%M" show_date = false [launcher] # Liquid Motion / Glass Workbench redesign (bos-ui-demos/proposed/ # liquid-motion.html's `.bx` block is the spec): soft and roomy — a big # panel radius, generous row insets/padding, 28px icons, section headers, # and a translucent (not solid) accent selection fill. breadbox reads every # key below now; see main.rs's build_css for the consuming CSS. mode = "overlay" width = 600 top = "120px" radius = 20 icon_px = 28 row_anim = "flip" rule = "gradient" footer = "count_apps" sections = true modes = ["apps"] # `.bx .r { border-radius: 12px; margin: 0 8px; padding: 10px 12px }` row_radius = 12 row_inset = 8 row_padding_v = 10 row_padding_h = 12 # `.bx .ico { border-radius: 9px }` (paired with icon_px = 28 above) icon_radius = 9 # `.bx .q { padding: 16px 18px; font-size: 16px }` search_font_size = 16 search_padding_v = 16 search_padding_h = 18 # `.bx .r.sel { background: rgba(accent, .22) }` # Panel opacity, separate from tokens.bg_alpha (the bar). Matches the # approved reference: demo `.bx.lm{background:rgba(21,14,23,.93)}`. breadbox hardcoded 0.60, which washed the # panel out over a bright wallpaper. panel_alpha = 0.93 selection_alpha = 0.22 # Keyed by layer-shell namespace, matching [compositor.*] below, so the two # tables share one keyspace and can be validated against each other. # breadbar-notif's popup toast uses set_default_width(320) (its history # sibling on the same namespace uses 360 — 320 is the live-toast surface, the # one this positions). breadbar-panel sets no window width at all: its # popovers size from their own CSS (.control-panel-inner / .wifi-popover-inner # min-width), which is why its width is "auto" rather than a number. [surfaces."breadbar-notif"] anchor = "top_right" offset = [16, 64] width = 320 layer = "overlay" [surfaces."breadbar-osd"] anchor = "bottom_centre" offset = 80 width = 180 layer = "overlay" [surfaces."breadbar-panel"] anchor = "top_right" offset = [16, 64] width = "auto" layer = "overlay" [surfaces."breadbar-dismiss"] # Anchored to all four edges (a fullscreen click-away scrim) with only a top # margin, so it starts below the bar rather than covering it. anchor = "fill" offset = 56 width = "fill" layer = "overlay" # Faithful to scripts/ui/rules.lua's five breadbar namespaces + breadbox. [compositor."breadbar"] blur = true ignore_alpha = 0.2 blur_popups = true animation = "slide top" [compositor."breadbar-osd"] blur = true ignore_alpha = 0.2 animation = "slide bottom" [compositor."breadbar-notif"] blur = true ignore_alpha = 0.2 animation = "slide right" [compositor."breadbar-panel"] blur = true ignore_alpha = 0.2 animation = "slide right" [compositor."breadbar-dismiss"] no_anim = true [compositor."breadbox"] blur = true ignore_alpha = 0.2 # No `css = "..."` overlay: the builtin is compiled in via `include_str!` # and has no on-disk directory to resolve a relative overlay path against. # `extra.css` is for user/system themes, which do have one — see # `resolve_theme` in mod.rs.