Target .workspaces .active .outer-pad with an inset box-shadow to highlight the currently focused workspace pill. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
439 lines
10 KiB
CSS
439 lines
10 KiB
CSS
/* Widget/layout styling for taffybar.
|
|
*
|
|
* Colors live in `theme.css` (loaded via `palette.css`).
|
|
*/
|
|
@import url("theme.css");
|
|
|
|
.taffy-window * {
|
|
/* Most text should come from Iosevka Aile; icon glyphs (Font Awesome / Nerd
|
|
Font PUA) should come from a Nerd Font family to avoid tiny fallback glyphs. */
|
|
font-family: "Iosevka Aile", "Iosevka Nerd Font", "Iosevka NF", "Noto Sans", sans-serif;
|
|
font-size: 9pt;
|
|
font-weight: 600;
|
|
color: @font-color;
|
|
/* Bar background is painted on `.taffy-box`; most widget nodes stay
|
|
transparent so pills (outer-pad) read as "solid". */
|
|
background-color: transparent;
|
|
text-shadow: none;
|
|
}
|
|
|
|
|
|
.taffy-box {
|
|
border-width: 0px;
|
|
padding: 0px;
|
|
margin: 0px;
|
|
border-radius: 6px;
|
|
box-shadow: none;
|
|
background-color: @bar-background;
|
|
background-image: none;
|
|
}
|
|
|
|
.outer-pad {
|
|
background-color: @pill-background;
|
|
border: 0px;
|
|
border-radius: 6px;
|
|
margin: 4px 6px;
|
|
/* No white outline; define shape with subtle inner highlight + dark stroke. */
|
|
box-shadow:
|
|
inset 0 1px 0 @pill-highlight,
|
|
inset 0 0 0 1px @pill-border,
|
|
0 10px 24px @pill-shadow;
|
|
}
|
|
|
|
.inner-pad {
|
|
padding: 2px 10px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.contents {
|
|
padding: 0px;
|
|
transition: background-color .2s;
|
|
opacity: 1;
|
|
}
|
|
|
|
/* Make each widget's squircle background feel "solid": avoid GTK nodes and
|
|
labels painting their own backgrounds on top of `.outer-pad`. */
|
|
.outer-pad *,
|
|
.inner-pad,
|
|
.inner-pad *,
|
|
.contents,
|
|
.contents * {
|
|
background-color: transparent;
|
|
}
|
|
|
|
/* Right side widget palette overrides */
|
|
.outer-pad.audio {
|
|
background-color: @widget-audio-bg;
|
|
border-color: @widget-audio-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.audio * {
|
|
color: @widget-audio-fg;
|
|
}
|
|
|
|
.outer-pad.network {
|
|
background-color: @widget-network-bg;
|
|
border-color: @widget-network-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.network * {
|
|
color: @widget-network-fg;
|
|
}
|
|
|
|
.outer-pad.mpris {
|
|
background-color: @widget-mpris-bg;
|
|
border-color: @widget-mpris-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.mpris * {
|
|
color: @widget-mpris-fg;
|
|
}
|
|
|
|
.outer-pad.clock {
|
|
background-color: @widget-clock-bg;
|
|
border-color: @widget-clock-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.clock * {
|
|
color: @widget-clock-fg;
|
|
}
|
|
|
|
.outer-pad.disk-usage {
|
|
background-color: @widget-disk-bg;
|
|
border-color: @widget-disk-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.disk-usage * {
|
|
color: @widget-disk-fg;
|
|
}
|
|
|
|
.outer-pad.sni-tray {
|
|
background-color: @widget-tray-bg;
|
|
border-color: @widget-tray-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.sni-tray * {
|
|
color: @widget-tray-fg;
|
|
}
|
|
|
|
.outer-pad.battery-icon,
|
|
.outer-pad.battery-text {
|
|
background-color: @widget-battery-bg;
|
|
border-color: @widget-battery-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.battery-icon *,
|
|
.outer-pad.battery-text * {
|
|
color: @widget-battery-fg;
|
|
}
|
|
|
|
.outer-pad.backlight {
|
|
background-color: @widget-backlight-bg;
|
|
border-color: @widget-backlight-border;
|
|
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30);
|
|
}
|
|
.outer-pad.backlight * {
|
|
color: @widget-backlight-fg;
|
|
}
|
|
|
|
/* Workspaces styling */
|
|
|
|
.workspaces .inner-pad {
|
|
box-shadow: none;
|
|
border-width: 0;
|
|
padding: 2px 3px 2px 10px;
|
|
}
|
|
|
|
.workspaces .contents {
|
|
box-shadow: none;
|
|
border-radius: 5px;
|
|
border-width: 0px;
|
|
border-style: solid;
|
|
border-color: @transparent;
|
|
padding: 0px 4px;
|
|
}
|
|
|
|
.workspace-label {
|
|
/* Overlay label (workspace number) that sits inside the icon "squircle". */
|
|
padding: 1px 3px;
|
|
margin: 0px;
|
|
font-size: 10pt;
|
|
opacity: 0.92;
|
|
font-weight: 700;
|
|
transition: color .2s;
|
|
background-color: @transparent;
|
|
}
|
|
|
|
/* The workspace label is overlaid bottom-left over the workspace icon strip.
|
|
Positioning: halign=start (left), valign=end (bottom) set in Haskell code.
|
|
Margins offset from that anchor point. */
|
|
.workspaces .overlay-box {
|
|
transition: background-color .2s, border-color .2s;
|
|
|
|
background-color: transparent;
|
|
border: none;
|
|
margin: 0px;
|
|
padding: 0px;
|
|
}
|
|
|
|
.workspaces .overlay-box .workspace-label {
|
|
background-color: transparent;
|
|
border: none;
|
|
padding: 2px 5px 5px 12px;
|
|
color: rgba(255, 255, 255, 0.92);
|
|
}
|
|
|
|
.workspaces .active .outer-pad {
|
|
box-shadow:
|
|
inset 0 0 0 2px rgba(255, 255, 255, 0.75),
|
|
inset 0 1px 0 @pill-highlight,
|
|
0 10px 24px @pill-shadow;
|
|
}
|
|
|
|
.workspaces .active .overlay-box {
|
|
background-color: transparent;
|
|
border-color: transparent;
|
|
}
|
|
|
|
.contents .window-icon {
|
|
border-width: 3px;
|
|
}
|
|
|
|
.active .contents .window-icon {
|
|
opacity: 1;
|
|
}
|
|
|
|
.active .contents {
|
|
background-color: rgba(255, 255, 255, 0.10);
|
|
opacity: 1;
|
|
}
|
|
|
|
/* (Handled above for workspaces.) */
|
|
|
|
.visible .contents {
|
|
background-color: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
.workspaces .window-icon-container,
|
|
.workspaces .window-icon-container.active {
|
|
/* Don't give each window icon its own background/border; the workspace
|
|
squircle is the background. */
|
|
background-color: transparent;
|
|
border: 0px;
|
|
box-shadow: none;
|
|
padding: 0px 2px;
|
|
}
|
|
|
|
.workspaces .active .contents,
|
|
.workspaces .visible .contents {
|
|
background-color: transparent;
|
|
}
|
|
|
|
.workspaces .window-icon {
|
|
border-width: 0px;
|
|
}
|
|
|
|
.window-icon-container {
|
|
transition: opacity .2s, box-shadow .2s;
|
|
opacity: 1;
|
|
border-radius: 5px;
|
|
transition: background-color .2s;
|
|
background-color: rgba(255, 255, 255, 0.04);
|
|
padding: 1px 4px;
|
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
}
|
|
|
|
/* This gives space for the box-shadow (they look like underlines) that follow.
|
|
This will actually affect all widgets, (not just the workspace icons), but
|
|
that is what we want since we want the icons to look the same. */
|
|
.auto-size-image, .sni-tray {
|
|
padding: 1px 4px;
|
|
}
|
|
|
|
/* If the SNI tray is wrapped in our standard widget box, avoid double-padding. */
|
|
.sni-tray .sni-tray {
|
|
padding: 0px;
|
|
}
|
|
|
|
.window-icon-container.active {
|
|
background-color: rgba(255, 255, 255, 0.13);
|
|
border-color: rgba(255, 255, 255, 0.16);
|
|
}
|
|
|
|
.window-icon-container.urgent {
|
|
}
|
|
|
|
.window-icon-container.minimized .window-icon {
|
|
opacity: .3;
|
|
}
|
|
|
|
.window-icon {
|
|
opacity: 1;
|
|
transition: opacity .5s;
|
|
}
|
|
|
|
/* Button styling */
|
|
|
|
.taffy-window button {
|
|
all: initial;
|
|
background-color: @transparent;
|
|
border-width: 0px;
|
|
border-radius: 0px;
|
|
}
|
|
|
|
|
|
.taffy-window button:checked, .taffy-window button:hover .Contents:hover {
|
|
box-shadow: inset 0 -2px @accent;
|
|
background-color: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Menu styling */
|
|
|
|
/* The ".taffy-window" prefixed selectors are needed because if they aren't present,
|
|
the top level .Taffybar selector takes precedence */
|
|
.taffy-window menuitem *, menuitem * {
|
|
color: @menu-font-color;
|
|
text-shadow: none;
|
|
}
|
|
|
|
/* Force an opaque background for menus, regardless of the system GTK theme. */
|
|
.taffy-window menu, menu,
|
|
.taffy-window menu.background, menu.background,
|
|
.taffy-window .menu, .menu,
|
|
.taffy-window .menu.background, .menu.background,
|
|
GtkMenu, GtkMenu.background {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
border: 1px solid rgba(0, 0, 0, 0.20);
|
|
padding: 4px 0px;
|
|
}
|
|
|
|
/* GTK menus often have a dedicated background node under the menu. */
|
|
menu > background,
|
|
menu > .background,
|
|
GtkMenu > background,
|
|
GtkMenu > .background,
|
|
.menu > background,
|
|
.menu > .background {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
.taffy-window menu, menu {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
/* Some themes apply transparency to the menu's toplevel popup window. */
|
|
window.popup, window.popup.background,
|
|
window.menu, window.menu.background,
|
|
.menu, .menu.background {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
window.popup > background,
|
|
window.popup > .background,
|
|
window.menu > background,
|
|
window.menu > .background {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
window.popup *, window.menu * {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
window.popup decoration, window.menu decoration {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
.taffy-window menuitem, menuitem {
|
|
background-color: @menu-background-color;
|
|
}
|
|
|
|
/* Higher-specificity rules to beat theme defaults like `menu menuitem { background: transparent; }`. */
|
|
menu menuitem, GtkMenu menuitem, .menu menuitem {
|
|
background-color: @menu-background-color;
|
|
}
|
|
|
|
.taffy-window menuitem:hover, menuitem:hover {
|
|
background-color: @menu-highlight;
|
|
}
|
|
|
|
menu menuitem:hover, GtkMenu menuitem:hover, .menu menuitem:hover {
|
|
background-color: @menu-highlight;
|
|
}
|
|
|
|
window.popup menuitem:hover *, window.menu menuitem:hover * {
|
|
background-color: @menu-highlight;
|
|
}
|
|
|
|
/* Last-resort: some menu implementations keep child nodes transparent, so paint
|
|
the whole subtree. This is scoped to menu/popover widgets to avoid affecting
|
|
the bar itself. */
|
|
menu *, GtkMenu *, .menu * {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
menu menuitem:hover *, GtkMenu menuitem:hover *, .menu menuitem:hover * {
|
|
background-color: @menu-highlight;
|
|
}
|
|
|
|
.taffy-window menuitem:hover > label, menuitem:hover > label {
|
|
color: @menu-font-color;
|
|
}
|
|
|
|
/* Some menus (notably a few StatusNotifierItem menus) are rendered as popovers
|
|
containing modelbuttons instead of menuitems. */
|
|
popover, popover.background, popover > contents {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
border: 1px solid rgba(0, 0, 0, 0.20);
|
|
}
|
|
|
|
popover > background,
|
|
popover > .background,
|
|
popover > box,
|
|
popover > contents > box,
|
|
popover > contents > * {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
popover modelbutton, popover modelbutton * {
|
|
background-color: @menu-background-color;
|
|
color: @menu-font-color;
|
|
text-shadow: none;
|
|
}
|
|
|
|
popover modelbutton:hover {
|
|
background-color: @menu-highlight;
|
|
}
|
|
|
|
popover modelbutton:hover > label {
|
|
color: @menu-font-color;
|
|
}
|
|
|
|
popover * {
|
|
background-color: @menu-background-color;
|
|
background-image: none;
|
|
}
|
|
|
|
popover modelbutton:hover * {
|
|
background-color: @menu-highlight;
|
|
}
|
|
|
|
.clock label,
|
|
.mpris label,
|
|
.battery-text label {
|
|
letter-spacing: 0.2px;
|
|
}
|
|
|
|
r.mpris label {
|
|
color: @font-muted;
|
|
}
|