From b83d3df0840504299d3099ebf391eb8110527edd Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 8 Oct 2026 10:27:08 +0200 Subject: [PATCH] Qualify shell palette references for Qt 6.12 (#14553) --- agents/skills/shell-dev.md | 4 ++ docs/omarchy-shell.md | 28 +++++++++--- docs/theming.md | 9 ++-- shell/Commons/Border.qml | 13 +++--- shell/Commons/Style.qml | 43 ++++++++++--------- shell/Ui/Button.qml | 13 +++--- shell/Ui/ButtonGroup.qml | 7 +-- shell/Ui/ConfirmDialog.qml | 17 ++++---- shell/Ui/CursorSurface.qml | 5 ++- shell/Ui/Dropdown.qml | 15 ++++--- shell/Ui/KeyboardPanel.qml | 5 ++- shell/Ui/MultiSelect.qml | 11 ++--- shell/Ui/NumberField.qml | 5 ++- shell/Ui/OpticalGlyph.qml | 3 +- shell/Ui/Panel.qml | 3 +- shell/Ui/PanelActionButton.qml | 5 ++- shell/Ui/PanelHero.qml | 5 ++- shell/Ui/PanelSectionHeader.qml | 3 +- shell/Ui/PanelSeparator.qml | 3 +- shell/Ui/PanelSlider.qml | 9 ++-- shell/Ui/PanelToolTip.qml | 11 ++--- shell/Ui/PopupCard.qml | 7 +-- shell/Ui/SearchableDropdown.qml | 11 ++--- shell/Ui/SpeedTestOverlay.qml | 9 ++-- shell/Ui/TextField.qml | 5 ++- shell/Ui/Toggle.qml | 5 ++- shell/Ui/ToggleSwitch.qml | 5 ++- shell/Ui/WidgetButton.qml | 5 ++- shell/plugins/agents/Panel.qml | 33 +++++++------- shell/plugins/background/Background.qml | 7 +-- shell/plugins/bar/Bar.qml | 21 ++++----- .../bar/indicators/PasswordlessSudo.qml | 3 +- shell/plugins/bar/widgets/ActiveWindow.qml | 3 +- shell/plugins/bar/widgets/Tray.qml | 7 +-- shell/plugins/clipboard/Clipboard.qml | 13 +++--- shell/plugins/dev-gallery/GalleryPanel.qml | 9 ++-- shell/plugins/emojis/Emojis.qml | 13 +++--- shell/plugins/image-picker/ImagePicker.qml | 13 +++--- shell/plugins/lock/LockView.qml | 23 +++++----- shell/plugins/lock/Service.qml | 3 +- shell/plugins/menu/Menu.qml | 17 ++++---- .../components/NotificationCard.qml | 19 ++++---- shell/plugins/osd/Osd.qml | 13 +++--- shell/plugins/panels/audio/Panel.qml | 5 ++- shell/plugins/panels/bluetooth/Panel.qml | 5 ++- shell/plugins/panels/clock/Panel.qml | 17 ++++---- shell/plugins/panels/dropbox/DropboxIcon.qml | 3 +- shell/plugins/panels/dropbox/Panel.qml | 5 ++- shell/plugins/panels/elsewhen/ArcText.qml | 3 +- shell/plugins/panels/elsewhen/CityRow.qml | 7 +-- shell/plugins/panels/elsewhen/CitySearch.qml | 3 +- .../plugins/panels/elsewhen/DaylightStrip.qml | 3 +- shell/plugins/panels/elsewhen/Globe.qml | 17 ++++---- shell/plugins/panels/elsewhen/GlobeFooter.qml | 5 ++- shell/plugins/panels/elsewhen/HeroTitle.qml | 3 +- shell/plugins/panels/elsewhen/MiniGlobe.qml | 9 ++-- shell/plugins/panels/elsewhen/MoonDot.qml | 3 +- shell/plugins/panels/elsewhen/Panel.qml | 5 ++- shell/plugins/panels/monitor/Panel.qml | 5 ++- shell/plugins/panels/network/Panel.qml | 7 +-- shell/plugins/panels/power/Panel.qml | 3 +- shell/plugins/panels/tailscale/Panel.qml | 11 ++--- .../panels/tailscale/TailscaleIcon.qml | 9 ++-- shell/plugins/panels/weather/Panel.qml | 7 +-- shell/plugins/polkit/PolkitAgent.qml | 25 +++++------ shell/plugins/reminders/ReminderFlow.qml | 9 ++-- shell/plugins/services/media/BarWidget.qml | 9 ++-- shell/services/BackgroundIntro.qml | 7 +-- shell/shell.qml | 5 ++- test/shell.d/bar-test.sh | 2 +- .../background-pending-theme/shell.qml | 5 ++- .../fixtures/network-captive-portal/shell.qml | 7 +-- .../fixtures/network-owe-transition/shell.qml | 7 +-- .../passwordless-sudo-indicator-test.sh | 2 +- 74 files changed, 381 insertions(+), 293 deletions(-) diff --git a/agents/skills/shell-dev.md b/agents/skills/shell-dev.md index 9765af89..a1ee0da3 100644 --- a/agents/skills/shell-dev.md +++ b/agents/skills/shell-dev.md @@ -45,3 +45,7 @@ unicode characters. Agent file-editing tools can strip multi-byte codepoints in some positions — do **not** rewrite widget files wholesale through those tools. For glyph fixes, make a targeted edit with the surrounding context, or use a Python script that inserts codepoints via `chr(0xXXXXX)`. + +## Palette references + +Import `qs.Commons as Commons` and use `Commons.Color` for the palette singleton, including `Connections.target`. Qt 6.12 introduces a `Color` type in `QtQuick` that shadows unqualified palette references. This applies to first-party components and third-party plugin QML alike. Keep the unqualified `qs.Commons` import when the file also uses `Style`, `Util`, or `Border`. diff --git a/docs/omarchy-shell.md b/docs/omarchy-shell.md index 32d7af9f..c834d879 100644 --- a/docs/omarchy-shell.md +++ b/docs/omarchy-shell.md @@ -189,6 +189,20 @@ overrides like `omarchy display text size` survive theme switches. ## Theme tokens +Shell and plugin QML must qualify the palette singleton because Qt 6.12 introduces its own `Color` type. Import `qs.Commons` with an alias and use `Commons.Color` for palette properties and signal connections: + +```qml +import QtQuick +import qs.Commons +import qs.Commons as Commons + +Rectangle { + color: Commons.Color.background +} +``` + +The unqualified import can remain for `Style`, `Util`, and `Border`. Existing third-party plugins that use bare `Color` must make the same change; fixing the host shell does not change a plugin's import scope. + See [`theming.md`](theming.md) for the full theme/template workflow, including generated `*.tpl` files, gradient helpers, and shell border syntax. @@ -200,17 +214,17 @@ or override a single section with `shell.
.toml`, merged in by `omarchy-theme-set-templates` (see [`theming.md`](theming.md)). `colors.toml` uses `foreground` and `background` for the foundational -text/background palette, exposed to QML as `Color.foreground` and -`Color.background`. +text/background palette, exposed to QML as `Commons.Color.foreground` and +`Commons.Color.background`. The shell exposes these tokens to QML via three singletons in `qs.Commons`: - `Color` — palette (`foreground`, `background`, `accent`, `urgent`) - and per-surface roles (`Color.bar.*`, `Color.popups.*`, - `Color.tooltip.*`, `Color.notifications.*`, `Color.menu.*`, - `Color.polkit.*`, `Color.lock.*`, `Color.imagePicker.*`). Clipboard - and emojis share `Color.menu.*`; the `[launcher]` section is consumed + and per-surface roles (`Commons.Color.bar.*`, `Commons.Color.popups.*`, + `Commons.Color.tooltip.*`, `Commons.Color.notifications.*`, `Commons.Color.menu.*`, + `Commons.Color.polkit.*`, `Commons.Color.lock.*`, `Commons.Color.imagePicker.*`). Clipboard + and emojis share `Commons.Color.menu.*`; the `[launcher]` section is consumed by the launcher outside shell QML. - `Style` — structural tokens (`cornerRadius`), shared interactive state tokens/helpers, spacing (`Style.spacing.*` / `Style.space(px)`), @@ -218,7 +232,7 @@ The shell exposes these tokens to QML via three singletons in (`Style.bar.sizeHorizontal` / `Style.bar.sizeVertical`). - `Border` — border-spec helpers for QML surfaces. Use with `BorderSurface` from `qs.Ui` when a border should honor shell theme - gradients or per-side widths. `Color.
.border` is only the + gradients or per-side widths. `Commons.Color.
.border` is only the flat-color fallback for code that cannot render a real border. ### Interactive states diff --git a/docs/theming.md b/docs/theming.md index 4d3517ec..6f6fdc38 100644 --- a/docs/theming.md +++ b/docs/theming.md @@ -197,7 +197,7 @@ The filename decides the target section, so the `[lock]` header is optional. The running shell reads `shell.toml` into two QML singletons: -- `Color` for palette and surface roles like `Color.menu.border`. +- `Color` for palette and surface roles like `Commons.Color.menu.border`. - `Style` for controls, spacing, font scale, corner radius, and bar sizing. ### Borders @@ -326,11 +326,12 @@ Plugin and shell QML should use `BorderSurface` for theme-aware borders: ```qml import qs.Commons +import qs.Commons as Commons import qs.Ui BorderSurface { - color: Color.popups.background - borderSpec: Border.surfaceSpec("popups", "border", Color.popups.border, 2) + color: Commons.Color.popups.background + borderSpec: Border.surfaceSpec("popups", "border", Commons.Color.popups.border, 2) padding: Style.spacing.popupPadding Item { @@ -347,7 +348,7 @@ Use `Border.surfaceSpec(section, token, fallbackColor, fallbackWidth, alphaKey)` for shell theme tokens (the optional `alphaKey` names the alpha token, e.g. `"border-alpha"`), `Border.controlSpec(state, foreground, accent, urgent)` for shared controls, and `Border.flat(color, width)` for a deliberate local border -that should not be overridden by the active theme. `Color.
.border` is the +that should not be overridden by the active theme. `Commons.Color.
.border` is the flat first-stop color for consumers that cannot render full border specs. ## Hyprland templates diff --git a/shell/Commons/Border.qml b/shell/Commons/Border.qml index 948aa782..b4e803c8 100644 --- a/shell/Commons/Border.qml +++ b/shell/Commons/Border.qml @@ -1,5 +1,6 @@ pragma Singleton import QtQuick +import qs.Commons as Commons import "BorderGeometry.js" as Geometry // Central border-spec factory for shell surfaces and controls. A spec carries @@ -22,7 +23,7 @@ QtObject { } function value(section, key) { - var v = Color.shellValues[section + "." + key] + var v = Commons.Color.shellValues[section + "." + key] return (v === undefined || v === null) ? "" : v } @@ -39,7 +40,7 @@ QtObject { var seen = {} while (s.match(/^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/) && !seen[s]) { seen[s] = true - var next = Color.shellValues[s] + var next = Commons.Color.shellValues[s] if (next === undefined || next === null || String(next).length === 0) break s = String(next).replace(/^\s+|\s+$/g, "") } @@ -68,10 +69,10 @@ QtObject { var s = String(color || "").replace(/^\s+|\s+$/g, "") var role = s.toLowerCase() - if (role === "foreground" || role === "text") return cssColor(Color.foreground, a) - if (role === "accent") return cssColor(Color.accent, a) - if (role === "urgent") return cssColor(Color.urgent, a) - if (role === "background") return cssColor(Color.background, a) + if (role === "foreground" || role === "text") return cssColor(Commons.Color.foreground, a) + if (role === "accent") return cssColor(Commons.Color.accent, a) + if (role === "urgent") return cssColor(Commons.Color.urgent, a) + if (role === "background") return cssColor(Commons.Color.background, a) if (role === "transparent") return "transparent" return Geometry.canonicalColor(s, a) } diff --git a/shell/Commons/Style.qml b/shell/Commons/Style.qml index 0582356c..87849c18 100644 --- a/shell/Commons/Style.qml +++ b/shell/Commons/Style.qml @@ -1,5 +1,6 @@ pragma Singleton import QtQuick +import qs.Commons as Commons import Quickshell import Quickshell.Hyprland import Quickshell.Io @@ -114,27 +115,27 @@ QtObject { } function resolveStateColor(token, foreground, accent, urgent, fallback) { - var fb = fallback || foreground || Color.foreground + var fb = fallback || foreground || Commons.Color.foreground var s = String(token || "").replace(/^\s+|\s+$/g, "") var role = s.toLowerCase() - if (role === "foreground" || role === "text") return foreground || Color.foreground - if (role === "accent") return accent || Color.accent - if (role === "urgent") return urgent || Color.urgent - if (role === "background") return Color.background + if (role === "foreground" || role === "text") return foreground || Commons.Color.foreground + if (role === "accent") return accent || Commons.Color.accent + if (role === "urgent") return urgent || Commons.Color.urgent + if (role === "background") return Commons.Color.background if (role === "transparent") return Qt.rgba(0, 0, 0, 0) return colorFromHex(s, fb) } function normalStateColor(foreground, accent, urgent) { - return resolveStateColor(normalColorToken, foreground, accent, urgent, foreground || Color.foreground) + return resolveStateColor(normalColorToken, foreground, accent, urgent, foreground || Commons.Color.foreground) } function hoverStateColor(foreground, accent, urgent) { - return resolveStateColor(hoverColorToken, foreground, accent, urgent, foreground || Color.foreground) + return resolveStateColor(hoverColorToken, foreground, accent, urgent, foreground || Commons.Color.foreground) } function selectedStateColor(foreground, accent, urgent) { - return resolveStateColor(selectedColorToken, foreground, accent, urgent, foreground || Color.foreground) + return resolveStateColor(selectedColorToken, foreground, accent, urgent, foreground || Commons.Color.foreground) } function pressedStateColor(foreground, accent, urgent) { @@ -149,7 +150,7 @@ QtObject { } function selectionStateColor(foreground, accent, urgent) { - return resolveStateColor(selectionColorToken, foreground, accent, urgent, foreground || Color.foreground) + return resolveStateColor(selectionColorToken, foreground, accent, urgent, foreground || Commons.Color.foreground) } function normalFillFor(foreground, accent, urgent) { return Util.alpha(normalStateColor(foreground, accent, urgent), normalFillAlpha) } @@ -187,17 +188,17 @@ QtObject { } // Convenience colors resolved against the foundational palette. - readonly property color normalFill: normalFillFor(Color.foreground, Color.accent, Color.urgent) - readonly property color hoverFill: hoverFillFor(Color.foreground, Color.accent, Color.urgent) - readonly property color selectedFill: selectedFillFor(Color.foreground, Color.accent, Color.urgent) - readonly property color pressedFill: pressedFillFor(Color.foreground, Color.accent, Color.urgent) - readonly property color focusFillColor: focusFillFor(Color.foreground, Color.accent, Color.urgent) - readonly property color normalBorderColor: normalBorderFor(Color.foreground, Color.accent, Color.urgent) - readonly property color hoverBorderColor: hoverBorderFor(Color.foreground, Color.accent, Color.urgent) - readonly property color selectedBorderColor: selectedBorderFor(Color.foreground, Color.accent, Color.urgent) - readonly property color focusBorderColor: focusBorderFor(Color.foreground, Color.accent, Color.urgent) - readonly property color selectedAccentFill: Util.alpha(Color.accent, selectedFillAlpha) - readonly property color selectionFill: selectionFillFor(Color.foreground, Color.accent, Color.urgent) + readonly property color normalFill: normalFillFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color hoverFill: hoverFillFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color selectedFill: selectedFillFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color pressedFill: pressedFillFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color focusFillColor: focusFillFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color normalBorderColor: normalBorderFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color hoverBorderColor: hoverBorderFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color selectedBorderColor: selectedBorderFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color focusBorderColor: focusBorderFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) + readonly property color selectedAccentFill: Util.alpha(Commons.Color.accent, selectedFillAlpha) + readonly property color selectionFill: selectionFillFor(Commons.Color.foreground, Commons.Color.accent, Commons.Color.urgent) // ---------------------------------------------------------- spacing // @@ -390,7 +391,7 @@ QtObject { } // Pull typography, bar dimensions, state tokens, and spacing out of the - // shell.toml dict that Color already parsed. Called by Color.loadShell so + // shell.toml dict that Color already parsed. Called by Commons.Color.loadShell so // a single parse pass feeds both singletons. function applyShellValues(values) { var fontOut = {} diff --git a/shell/Ui/Button.qml b/shell/Ui/Button.qml index 09c5806c..1f53dbec 100644 --- a/shell/Ui/Button.qml +++ b/shell/Ui/Button.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import qs.Commons +import qs.Commons as Commons // The button. One component for every clickable thing in the kit. // States compose independently and are applied in priority order: @@ -32,9 +33,9 @@ BorderSurface { property bool bordered: false // Colors. Defaults track the theme; per-instance overrides are honored. - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color background: "transparent" - property color accent: Color.accent + property color accent: Commons.Color.accent // Sizing. property string fontFamily: Style.font.family @@ -54,9 +55,9 @@ BorderSurface { // Tooltip palette. Auto-rendered if tooltipText is set. Defaults pull // from [tooltip] in shell.toml; override per-instance only when a button // intentionally wants a tooltip that diverges from the theme. - property color tooltipBackground: Color.tooltip.background - property color tooltipForeground: Color.tooltip.text - property color tooltipBorder: Color.tooltip.border + property color tooltipBackground: Commons.Color.tooltip.background + property color tooltipForeground: Commons.Color.tooltip.text + property color tooltipBorder: Commons.Color.tooltip.border signal clicked() signal rightClicked() @@ -77,7 +78,7 @@ BorderSurface { readonly property bool hot: mouseArea.containsMouse || hasCursor readonly property bool _showFocusRing: focusable && activeFocus readonly property color _selectedColor: Style.selectedStateColor(root.foreground, root.accent) - readonly property var _tooltipBorderSpec: Border.localOrSurfaceSpec("tooltip", "border", root.tooltipBorder, Color.tooltip.border, Math.max(1, Style.normalBorderWidth)) + readonly property var _tooltipBorderSpec: Border.localOrSurfaceSpec("tooltip", "border", root.tooltipBorder, Commons.Color.tooltip.border, Math.max(1, Style.normalBorderWidth)) readonly property var _focusBorderSpec: Border.controlSpec("focus", root.foreground, root.accent) readonly property var _hoverBorderSpec: Border.controlSpec("hover-cursor", root.foreground, root.accent) readonly property var _selectedBorderSpec: Border.controlSpec("selected", root.foreground, root.accent) diff --git a/shell/Ui/ButtonGroup.qml b/shell/Ui/ButtonGroup.qml index f4870dea..8657fe6a 100644 --- a/shell/Ui/ButtonGroup.qml +++ b/shell/Ui/ButtonGroup.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // Mutually-exclusive row of Buttons — the form-style "pick one of N" // pattern (bar position top/right/bottom/left, theme preset chips, etc.). @@ -25,9 +26,9 @@ Row { property var options: [] property string value: "" - property color foreground: Color.foreground - property color background: Color.background - property color accent: Color.accent + property color foreground: Commons.Color.foreground + property color background: Commons.Color.background + property color accent: Commons.Color.accent property string fontFamily: Style.font.family property real fontSize: Style.font.body property bool focusable: true diff --git a/shell/Ui/ConfirmDialog.qml b/shell/Ui/ConfirmDialog.qml index bc108d97..9bbb1304 100644 --- a/shell/Ui/ConfirmDialog.qml +++ b/shell/Ui/ConfirmDialog.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons Item { id: root @@ -9,11 +10,11 @@ Item { property string cancelText: "Cancel" property string confirmText: "Confirm" property int selectedIndex: 1 - property color background: Color.background - property color foreground: Color.foreground - property color scrim: Util.alpha(Color.background, 0.7) - property color selectedBackground: Util.alpha(Color.foreground, 0.08) - property color selectedText: Color.accent + property color background: Commons.Color.background + property color foreground: Commons.Color.foreground + property color scrim: Util.alpha(Commons.Color.background, 0.7) + property color selectedBackground: Util.alpha(Commons.Color.foreground, 0.08) + property color selectedText: Commons.Color.accent property string fontFamily: Style.font.family property int cornerRadius: Style.cornerRadius @@ -98,10 +99,10 @@ Item { width: Style.space(88) height: Style.space(34) color: selected - ? (destructive ? Util.alpha(Color.urgent, 0.22) : root.selectedBackground) + ? (destructive ? Util.alpha(Commons.Color.urgent, 0.22) : root.selectedBackground) : "transparent" borderSpec: Border.flat(destructive - ? (selected ? Color.urgent : Util.alpha(Color.urgent, 0.56)) + ? (selected ? Commons.Color.urgent : Util.alpha(Commons.Color.urgent, 0.56)) : (selected ? root.selectedText : Util.alpha(root.foreground, 0.38)), Style.normalBorderWidth) radius: 0 @@ -109,7 +110,7 @@ Item { textFormat: Text.PlainText anchors.centerIn: parent text: modelData - color: destructive ? (selected ? Color.urgent : root.foreground) : (selected ? root.selectedText : root.foreground) + color: destructive ? (selected ? Commons.Color.urgent : root.foreground) : (selected ? root.selectedText : root.foreground) font.family: root.fontFamily font.pixelSize: Style.font.caption } diff --git a/shell/Ui/CursorSurface.qml b/shell/Ui/CursorSurface.qml index cb715df9..1563f982 100644 --- a/shell/Ui/CursorSurface.qml +++ b/shell/Ui/CursorSurface.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // Shared visual chrome for keyboard-and-mouse-navigable items inside a panel. // Contract: items must NOT read `containsMouse` for color/border. Mouse @@ -19,8 +20,8 @@ BorderSurface { property bool outline: false property bool bordered: false - property color foreground: Color.foreground - property color accent: Color.accent + property color foreground: Commons.Color.foreground + property color accent: Commons.Color.accent property color fill: Style.hoverFillFor(foreground, accent) property color currentFill: Style.selectedFillFor(foreground, accent) diff --git a/shell/Ui/Dropdown.qml b/shell/Ui/Dropdown.qml index 58386c9b..6d240928 100644 --- a/shell/Ui/Dropdown.qml +++ b/shell/Ui/Dropdown.qml @@ -1,10 +1,11 @@ import QtQuick import QtQuick.Controls import qs.Commons +import qs.Commons as Commons // Themed single-select dropdown. Trigger row paints with the kit's focus -// chrome; the popup anchors below and uses Color.popups.background + -// Color.popups.border so it reads as a panel surface rather than the +// chrome; the popup anchors below and uses Commons.Color.popups.background + +// Commons.Color.popups.border so it reads as a panel surface rather than the // platform-native ComboBox look. // // `options` accepts either a plain string[] or an array of @@ -22,11 +23,11 @@ Item { property string value: "" property var options: [] - property color foreground: Color.popups.text - property color background: Color.popups.background - property color popupBorder: Color.popups.border - property color accent: Color.accent - readonly property var popupBorderSpec: Border.localOrSurfaceSpec("popups", "border", popupBorder, Color.popups.border, Style.normalBorderWidth) + property color foreground: Commons.Color.popups.text + property color background: Commons.Color.popups.background + property color popupBorder: Commons.Color.popups.border + property color accent: Commons.Color.accent + readonly property var popupBorderSpec: Border.localOrSurfaceSpec("popups", "border", popupBorder, Commons.Color.popups.border, Style.normalBorderWidth) property string fontFamily: Style.font.family property int rowHeight: Style.spacing.controlHeight property int popupRowHeight: Style.spacing.popupRowHeight diff --git a/shell/Ui/KeyboardPanel.qml b/shell/Ui/KeyboardPanel.qml index 38a2979c..6f917e5b 100644 --- a/shell/Ui/KeyboardPanel.qml +++ b/shell/Ui/KeyboardPanel.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Wayland import qs.Commons +import qs.Commons as Commons // Layer-shell popup attached to a bar widget icon, designed for // click-driven AND keyboard-driven panels (e.g. SUPER+CTRL+W summon). @@ -44,7 +45,7 @@ PanelWindow { property int padding: Style.spacing.popupPadding property int contentWidth: Style.space(280) property int contentHeight: Style.space(200) - property var borderSpec: Border.surfaceSpec("popups", "border", Color.popups.border, Math.max(1, Style.space(2))) + property var borderSpec: Border.surfaceSpec("popups", "border", Commons.Color.popups.border, Math.max(1, Style.space(2))) property bool centerOnBar: false property bool open: false property int gap: Style.gapsOut // distance between bar edge and panel @@ -382,7 +383,7 @@ PanelWindow { y: root.cardOrigin.y width: root.contentWidth height: root.contentHeight - color: Color.popups.background + color: Commons.Color.popups.background borderSpec: root.borderSpec padding: root.padding radius: Style.cornerRadius diff --git a/shell/Ui/MultiSelect.qml b/shell/Ui/MultiSelect.qml index ad2e2955..656047dd 100644 --- a/shell/Ui/MultiSelect.qml +++ b/shell/Ui/MultiSelect.qml @@ -3,6 +3,7 @@ import QtQuick.Controls as QQC import QtQuick.Window import Quickshell.Io import qs.Commons +import qs.Commons as Commons // Searchable multi-select dropdown. Trigger shape matches Dropdown / // SearchableDropdown; the popup shows a search field, an optional refresh @@ -33,11 +34,11 @@ Item { property string triggerLabel: "" property bool showLabel: true - property color foreground: Color.popups.text - property color background: Color.popups.background - property color popupBorder: Color.popups.border - property color accent: Color.accent - readonly property var popupBorderSpec: Border.localOrSurfaceSpec("popups", "border", popupBorder, Color.popups.border, Style.normalBorderWidth) + property color foreground: Commons.Color.popups.text + property color background: Commons.Color.popups.background + property color popupBorder: Commons.Color.popups.border + property color accent: Commons.Color.accent + readonly property var popupBorderSpec: Border.localOrSurfaceSpec("popups", "border", popupBorder, Commons.Color.popups.border, Style.normalBorderWidth) property string fontFamily: Style.font.family property int rowHeight: Style.spacing.controlHeight property int popupRowHeight: Style.spacing.popupRowHeight diff --git a/shell/Ui/NumberField.qml b/shell/Ui/NumberField.qml index 985c9f7e..57a19c2c 100644 --- a/shell/Ui/NumberField.qml +++ b/shell/Ui/NumberField.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls as QQC import qs.Commons +import qs.Commons as Commons Column { id: root @@ -10,8 +11,8 @@ Column { property int from: 0 property int to: 100 property int stepSize: 1 - property color foreground: Color.foreground - property color accent: Color.accent + property color foreground: Commons.Color.foreground + property color accent: Commons.Color.accent property string fontFamily: Style.font.family property real fontSize: Style.font.body property real fieldWidth: Style.spacing.numberFieldWidth diff --git a/shell/Ui/OpticalGlyph.qml b/shell/Ui/OpticalGlyph.qml index 201c2d01..d3751c51 100644 --- a/shell/Ui/OpticalGlyph.qml +++ b/shell/Ui/OpticalGlyph.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons Item { id: root @@ -7,7 +8,7 @@ Item { property string text: "" property string fontFamily: Style.font.family property real fontSize: Style.font.body - property color color: Color.foreground + property color color: Commons.Color.foreground property bool debugBounds: false readonly property int renderedFontSize: Math.max(1, Math.round(fontSize)) diff --git a/shell/Ui/Panel.qml b/shell/Ui/Panel.qml index 371d2c6e..2f8c31ab 100644 --- a/shell/Ui/Panel.qml +++ b/shell/Ui/Panel.qml @@ -1,6 +1,7 @@ import QtQuick import Quickshell.Io import qs.Commons +import qs.Commons as Commons // Base item for plugin popup widgets. Many first-party plugins expose a bar // button plus a popup from one QML entry point; this base owns the shared @@ -19,7 +20,7 @@ Item { property bool popoutSwitchClosing: false readonly property bool opened: panelController.open - readonly property color barForeground: bar ? bar.barForeground : Color.foreground + readonly property color barForeground: bar ? bar.barForeground : Commons.Color.foreground function open() { panelController.show() } function close() { panelController.hide() } diff --git a/shell/Ui/PanelActionButton.qml b/shell/Ui/PanelActionButton.qml index d4115e2b..d93d1be5 100644 --- a/shell/Ui/PanelActionButton.qml +++ b/shell/Ui/PanelActionButton.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // Small (22×22 by default) icon button used at the right edge of panel rows // for inline actions — forget network, confirm passphrase, unpair device, @@ -29,7 +30,7 @@ BorderSurface { property string iconText: "" property string tooltipText: "" - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color hoverColor: foreground property string fontFamily: Style.font.family property real fontSize: Style.font.icon @@ -57,7 +58,7 @@ BorderSurface { ? Border.controlSpec("focus", hoverColor, hoverColor) : (_hot && bordered ? Border.controlSpec("hover-cursor", hoverColor, hoverColor) - : (bordered ? Border.controlSpec("normal", foreground, Color.accent) : Border.none())) + : (bordered ? Border.controlSpec("normal", foreground, Commons.Color.accent) : Border.none())) color: _showFocusRing ? Style.focusFillFor(hoverColor, hoverColor) diff --git a/shell/Ui/PanelHero.qml b/shell/Ui/PanelHero.qml index 4d13cf14..1458ed78 100644 --- a/shell/Ui/PanelHero.qml +++ b/shell/Ui/PanelHero.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons Item { id: root @@ -8,7 +9,7 @@ Item { property string title: "" property string meta: "" property string detail: "" - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property string fontFamily: Style.font.family property real iconSize: Style.font.display property real iconOpacity: 1.0 @@ -71,7 +72,7 @@ Item { implicitHeight: detailText.implicitHeight + Style.space(4) anchors.verticalCenter: parent.verticalCenter color: "transparent" - borderSpec: Border.controlSpec("normal", root.foreground, Color.accent) + borderSpec: Border.controlSpec("normal", root.foreground, Commons.Color.accent) radius: Style.cornerRadius Text { diff --git a/shell/Ui/PanelSectionHeader.qml b/shell/Ui/PanelSectionHeader.qml index f0d54fb9..7c2096ee 100644 --- a/shell/Ui/PanelSectionHeader.qml +++ b/shell/Ui/PanelSectionHeader.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // Small-caps-style label that introduces a panel section ("DNS provider", // "Wi-Fi networks", "Output device", "Paired devices"). Sits between a @@ -7,7 +8,7 @@ import qs.Commons Text { id: root - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property string fontFamily: Style.font.family property real fontSize: Style.font.caption diff --git a/shell/Ui/PanelSeparator.qml b/shell/Ui/PanelSeparator.qml index 27a81ec3..887aa571 100644 --- a/shell/Ui/PanelSeparator.qml +++ b/shell/Ui/PanelSeparator.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // 1px horizontal divider for panel sections. The alpha-on-foreground tint // keeps the rule legible against the panel background without competing @@ -7,7 +8,7 @@ import qs.Commons Rectangle { id: root - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property real strength: 0.12 width: parent ? parent.width : implicitWidth diff --git a/shell/Ui/PanelSlider.qml b/shell/Ui/PanelSlider.qml index 64396713..2dd85a33 100644 --- a/shell/Ui/PanelSlider.qml +++ b/shell/Ui/PanelSlider.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons Item { id: root @@ -10,9 +11,9 @@ Item { property real maximum: 1 property real step: 0.05 property bool integer: false - property color trackColor: bar ? Style.selectedFillFor(bar.foreground, Color.accent) : "#333" - property color fillColor: bar ? bar.foreground : Color.foreground - property color knobColor: bar ? bar.foreground : Color.foreground + property color trackColor: bar ? Style.selectedFillFor(bar.foreground, Commons.Color.accent) : "#333" + property color fillColor: bar ? bar.foreground : Commons.Color.foreground + property color knobColor: bar ? bar.foreground : Commons.Color.foreground property bool dragging: false property real trackHeight: Math.max(4, Math.round(Style.spacing.controlHeight * 0.11)) property real knobSize: Math.max(14, Math.round(Style.spacing.controlHeight * 0.38)) @@ -23,7 +24,7 @@ Item { // crossing the track shows). Purely visual — snapping is the caller's job via // `integer`/`step` or an index-based value. Default 0 leaves the track plain. property int tickCount: 0 - property color tickColor: bar ? bar.background : Color.background + property color tickColor: bar ? bar.background : Commons.Color.background onValueChanged: if (!dragging) liveValue = value diff --git a/shell/Ui/PanelToolTip.qml b/shell/Ui/PanelToolTip.qml index 90d3133a..06e2ac53 100644 --- a/shell/Ui/PanelToolTip.qml +++ b/shell/Ui/PanelToolTip.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import qs.Commons +import qs.Commons as Commons // Styled wrapper around Qt Quick Controls ToolTip. Drop-in: declare inside // the hovered item and bind `visible` to the hover state, e.g. @@ -9,7 +10,7 @@ import qs.Commons // text: "Forget network" // } // -// Defaults pull from [tooltip] in shell.toml via Color.tooltip.*. Override +// Defaults pull from [tooltip] in shell.toml via Commons.Color.tooltip.*. Override // the panel* properties per-instance only when you need a tooltip that // intentionally diverges from the theme. // @@ -18,13 +19,13 @@ import qs.Commons ToolTip { id: root - property color panelForeground: Color.tooltip.text - property color panelBackground: Color.tooltip.background - property color panelBorder: Color.tooltip.border + property color panelForeground: Commons.Color.tooltip.text + property color panelBackground: Commons.Color.tooltip.background + property color panelBorder: Commons.Color.tooltip.border property string fontFamily: Style.font.family property real fontSize: Style.font.bodySmall - readonly property var panelBorderSpec: Border.localOrSurfaceSpec("tooltip", "border", panelBorder, Color.tooltip.border, Style.normalBorderWidth) + readonly property var panelBorderSpec: Border.localOrSurfaceSpec("tooltip", "border", panelBorder, Commons.Color.tooltip.border, Style.normalBorderWidth) delay: 400 padding: 0 diff --git a/shell/Ui/PopupCard.qml b/shell/Ui/PopupCard.qml index 3bc8193a..6551237d 100644 --- a/shell/Ui/PopupCard.qml +++ b/shell/Ui/PopupCard.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Hyprland import qs.Commons +import qs.Commons as Commons PopupWindow { id: root @@ -13,8 +14,8 @@ PopupWindow { property int padding: Style.spacing.popupPadding property int contentWidth: Style.space(280) property int contentHeight: Style.space(200) - property color borderColor: Color.popups.border - property var borderSpec: Border.localOrSurfaceSpec("popups", "border", borderColor, Color.popups.border, Math.max(1, Style.space(2))) + property color borderColor: Commons.Color.popups.border + property var borderSpec: Border.localOrSurfaceSpec("popups", "border", borderColor, Commons.Color.popups.border, Math.max(1, Style.space(2))) property bool open: false property bool centerOnBar: false // "click" — uses HyprlandFocusGrab so clicking outside dismisses the popup. @@ -150,7 +151,7 @@ PopupWindow { BorderSurface { id: card anchors.fill: parent - color: Color.popups.background + color: Commons.Color.popups.background borderSpec: root.borderSpec padding: root.padding radius: Style.cornerRadius diff --git a/shell/Ui/SearchableDropdown.qml b/shell/Ui/SearchableDropdown.qml index 7728d86b..256e4293 100644 --- a/shell/Ui/SearchableDropdown.qml +++ b/shell/Ui/SearchableDropdown.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls as QQC import qs.Commons +import qs.Commons as Commons // Searchable single-select dropdown. Same trigger shape as Dropdown, but // the popup leads with an embedded TextField that filters the option @@ -25,11 +26,11 @@ Item { property string emptyText: "No matches" property string triggerLabel: "" - property color foreground: Color.popups.text - property color background: Color.popups.background - property color popupBorder: Color.popups.border - property color accent: Color.accent - readonly property var popupBorderSpec: Border.localOrSurfaceSpec("popups", "border", popupBorder, Color.popups.border, Style.normalBorderWidth) + property color foreground: Commons.Color.popups.text + property color background: Commons.Color.popups.background + property color popupBorder: Commons.Color.popups.border + property color accent: Commons.Color.accent + readonly property var popupBorderSpec: Border.localOrSurfaceSpec("popups", "border", popupBorder, Commons.Color.popups.border, Style.normalBorderWidth) property string fontFamily: Style.font.family property int rowHeight: Style.spacing.controlHeight property int popupRowHeight: Style.spacing.popupRowHeight diff --git a/shell/Ui/SpeedTestOverlay.qml b/shell/Ui/SpeedTestOverlay.qml index f1beef92..b0ad24ed 100644 --- a/shell/Ui/SpeedTestOverlay.qml +++ b/shell/Ui/SpeedTestOverlay.qml @@ -4,6 +4,7 @@ import QtQuick.Shapes import Quickshell import Quickshell.Wayland import qs.Commons +import qs.Commons as Commons import qs.Ui // Centered speed test overlay shared by the network and disk speed tests. No @@ -288,7 +289,7 @@ PanelWindow { // round caps would leave a stray dot at the foot of the scale. ShapePath { strokeWidth: dial.arcWidth * 3 - strokeColor: dial.arcVisible ? Qt.rgba(Color.accent.r, Color.accent.g, Color.accent.b, 0.18) : "transparent" + strokeColor: dial.arcVisible ? Qt.rgba(Commons.Color.accent.r, Commons.Color.accent.g, Commons.Color.accent.b, 0.18) : "transparent" fillColor: "transparent" capStyle: ShapePath.RoundCap @@ -305,7 +306,7 @@ PanelWindow { // Value: fills behind the needle. ShapePath { strokeWidth: dial.arcWidth - strokeColor: dial.arcVisible ? Color.accent : "transparent" + strokeColor: dial.arcVisible ? Commons.Color.accent : "transparent" fillColor: "transparent" capStyle: ShapePath.RoundCap @@ -356,8 +357,8 @@ PanelWindow { radius: width / 2 gradient: Gradient { - GradientStop { position: 0.0; color: Color.accent } - GradientStop { position: 0.55; color: Color.accent } + GradientStop { position: 0.0; color: Commons.Color.accent } + GradientStop { position: 0.55; color: Commons.Color.accent } GradientStop { position: 1.0; color: "transparent" } } } diff --git a/shell/Ui/TextField.qml b/shell/Ui/TextField.qml index 8d4183f6..96cac226 100644 --- a/shell/Ui/TextField.qml +++ b/shell/Ui/TextField.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import qs.Commons +import qs.Commons as Commons // Single-line text input with the kit's focus + selection styling. Inherits // from Qt Quick Controls TextField so the underlying type's API (text, @@ -18,8 +19,8 @@ import qs.Commons TextField { id: root - property color foreground: Color.foreground - property color accent: Color.accent + property color foreground: Commons.Color.foreground + property color accent: Commons.Color.accent property color selectionTint: Style.selectionFillFor(foreground, accent) property bool password: false property real horizontalPadding: Style.spacing.controlPaddingX diff --git a/shell/Ui/Toggle.qml b/shell/Ui/Toggle.qml index 0f2c9b7c..f96d33eb 100644 --- a/shell/Ui/Toggle.qml +++ b/shell/Ui/Toggle.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // Labeled toggle row: title + optional description on the left, a // `ToggleSwitch` on the right. Clicking anywhere on the row emits `clicked()`; @@ -28,8 +29,8 @@ BorderSurface { // Override per-instance if a caller wants the opposite. property bool rounded: Style.cornerRadius > 0 - property color foreground: Color.foreground - property color accent: Color.accent + property color foreground: Commons.Color.foreground + property color accent: Commons.Color.accent property string fontFamily: Style.font.family property real titleSize: Style.font.subtitle property real descriptionSize: Style.font.caption diff --git a/shell/Ui/ToggleSwitch.qml b/shell/Ui/ToggleSwitch.qml index f1aa80fa..48b7afba 100644 --- a/shell/Ui/ToggleSwitch.qml +++ b/shell/Ui/ToggleSwitch.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // Bare on/off switch: a track with a sliding knob and no label. This is the // switch `Toggle` parks at the end of its labeled row, factored out so panel @@ -40,8 +41,8 @@ Item { property bool cursorRing: interactive property int cursorPad: Style.space(6) property bool rounded: Style.cornerRadius > 0 - property color foreground: Color.foreground - property color accent: Color.accent + property color foreground: Commons.Color.foreground + property color accent: Commons.Color.accent signal toggled() signal hovered(bool isHovered) diff --git a/shell/Ui/WidgetButton.qml b/shell/Ui/WidgetButton.qml index 107fcac6..9267f1d5 100644 --- a/shell/Ui/WidgetButton.qml +++ b/shell/Ui/WidgetButton.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons Item { id: root @@ -8,8 +9,8 @@ Item { property string text: "" property string fontFamily: bar ? bar.fontFamily : Style.font.family property real fontSize: Style.font.body - property color foreground: bar ? bar.barForeground : Color.foreground - property color activeColor: bar ? bar.urgent : Color.urgent + property color foreground: bar ? bar.barForeground : Commons.Color.foreground + property color activeColor: bar ? bar.urgent : Commons.Color.urgent property bool active: false property real horizontalMargin: 8.5 property real verticalPadding: 6 diff --git a/shell/plugins/agents/Panel.qml b/shell/plugins/agents/Panel.qml index 60677e91..4e40a2ea 100644 --- a/shell/plugins/agents/Panel.qml +++ b/shell/plugins/agents/Panel.qml @@ -3,6 +3,7 @@ import QtQuick.Controls import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui Panel { @@ -11,11 +12,11 @@ Panel { ipcTarget: "omarchy.agents" manageIpc: false - readonly property color foreground: bar ? bar.foreground : Color.foreground - readonly property color urgent: bar ? bar.urgent : Color.urgent + readonly property color foreground: bar ? bar.foreground : Commons.Color.foreground + readonly property color urgent: bar ? bar.urgent : Commons.Color.urgent readonly property color dim: Qt.darker(foreground, 1.55) - readonly property color surface: Color.popups.background - readonly property color track: Style.selectedFillFor(foreground, Color.accent) + readonly property color surface: Commons.Color.popups.background + readonly property color track: Style.selectedFillFor(foreground, Commons.Color.accent) readonly property string fontFamily: bar ? bar.fontFamily : Style.font.family // Every subscription on one page, limits first: the question this panel @@ -719,7 +720,7 @@ Panel { function iconCandidatesForProvider(p, surfaceColor) { if (!p) return [] var candidates = [] - if (colorLuminance(surfaceColor || Color.background) >= 0.5) + if (colorLuminance(surfaceColor || Commons.Color.background) >= 0.5) candidates.push(Qt.resolvedUrl("assets/" + p.providerId + "-light.svg")) candidates.push(Qt.resolvedUrl("assets/" + p.providerId + ".svg")) return candidates @@ -1109,7 +1110,7 @@ Panel { anchors.horizontalCenter: parent.horizontalCenter textFormat: Text.PlainText text: choice.modelData.providerName - color: choice.hasCursor ? Color.accent : root.foreground + color: choice.hasCursor ? Commons.Color.accent : root.foreground font.family: root.fontFamily font.pixelSize: Style.font.body font.bold: true @@ -1187,7 +1188,7 @@ Panel { Text { textFormat: Text.PlainText text: root.addCode - color: Color.accent + color: Commons.Color.accent font.family: root.fontFamily font.pixelSize: Style.font.display font.bold: true @@ -1528,7 +1529,7 @@ Panel { property bool hasCursor: false implicitHeight: tileBody.implicitHeight + Style.space(20) radius: Style.cornerRadius - color: hasCursor ? root.alpha(Color.accent, 0.14) : root.alpha(root.foreground, 0.05) + color: hasCursor ? root.alpha(Commons.Color.accent, 0.14) : root.alpha(root.foreground, 0.05) onHasCursorChanged: if (hasCursor) root.revealItem(tile) Row { @@ -1540,7 +1541,7 @@ Panel { anchors.verticalCenter: parent.verticalCenter textFormat: Text.PlainText text: tile.glyph - color: Color.accent + color: Commons.Color.accent font.family: root.fontFamily font.pixelSize: Style.font.heading } @@ -1549,7 +1550,7 @@ Panel { anchors.verticalCenter: parent.verticalCenter textFormat: Text.PlainText text: tile.title - color: tile.hasCursor ? Color.accent : root.foreground + color: tile.hasCursor ? Commons.Color.accent : root.foreground font.family: root.fontFamily font.pixelSize: Style.font.body font.bold: true @@ -1583,16 +1584,16 @@ Panel { implicitHeight: implicitWidth radius: Style.cornerRadius // The cursor needs more than a shade deeper to read on a tinted square. - color: root.alpha(Color.accent, hasCursor ? 0.3 : 0.12) + color: root.alpha(Commons.Color.accent, hasCursor ? 0.3 : 0.12) border.width: hasCursor ? Math.max(1, Style.hoverBorderWidth) : 0 - border.color: Color.accent + border.color: Commons.Color.accent onHasCursorChanged: if (hasCursor) root.revealItem(heroButton) Text { anchors.centerIn: parent textFormat: Text.PlainText text: heroButton.glyph - color: Color.accent + color: Commons.Color.accent font.family: root.fontFamily font.pixelSize: Style.font.heading } @@ -1624,7 +1625,7 @@ Panel { readonly property bool hot: linkMouse.containsMouse || picked onPickedChanged: if (picked) root.revealItem(link) textFormat: Text.PlainText - color: current ? Color.accent : (hot ? root.foreground : idleColor) + color: current ? Commons.Color.accent : (hot ? root.foreground : idleColor) font.family: root.fontFamily font.pixelSize: Style.font.caption font.bold: current @@ -1705,7 +1706,7 @@ Panel { anchors.verticalCenter: parent.verticalCenter width: Math.min(implicitWidth, parent.width * 0.6) text: head.label - color: head.picked ? Color.accent : root.foreground + color: head.picked ? Commons.Color.accent : root.foreground font.family: root.fontFamily font.pixelSize: Style.font.body font.bold: head.isActive @@ -1810,7 +1811,7 @@ Panel { visible: head.isActive anchors.right: parent.right text: "ACTIVE" - color: Color.accent + color: Commons.Color.accent font.family: root.fontFamily font.pixelSize: Style.font.caption font.bold: true diff --git a/shell/plugins/background/Background.qml b/shell/plugins/background/Background.qml index e2d885c7..6f692677 100644 --- a/shell/plugins/background/Background.qml +++ b/shell/plugins/background/Background.qml @@ -5,6 +5,7 @@ import QtQuick import QtQuick.Effects import QtQuick.Shapes import qs.Commons +import qs.Commons as Commons import qs.Ui Item { @@ -117,10 +118,10 @@ Item { // pending; the latest theme payload should still apply. if (pendingThemeVersion < 0) return pendingThemeFallbackTimer.stop() - Color.loadColors(pendingColorsRaw) - // Color.loadShell also refreshes Style so the type scale flips with the + Commons.Color.loadColors(pendingColorsRaw) + // Commons.Color.loadShell also refreshes Style so the type scale flips with the // background reveal instead of waiting for a separate reload path. - Color.loadShell(pendingShellRaw) + Commons.Color.loadShell(pendingShellRaw) Style.scheduleRefresh() pendingThemeVersion = -1 pendingColorsRaw = "" diff --git a/shell/plugins/bar/Bar.qml b/shell/plugins/bar/Bar.qml index 9cb1ac0a..84680cb5 100644 --- a/shell/plugins/bar/Bar.qml +++ b/shell/plugins/bar/Bar.qml @@ -5,6 +5,7 @@ import Quickshell.Wayland import QtQuick import QtQuick.Layouts import qs.Commons +import qs.Commons as Commons import qs.Ui import "BarModel.js" as BarModel @@ -71,14 +72,14 @@ Item { property string fontFamily: Style.font.family // Bound to the central Color singleton so the bar tracks shell.toml's // [bar] section. Property names kept for the rest of this file's bindings. - property color themeForeground: Color.bar.text - property color themeContrastForeground: Color.background - property color transparentForeground: Color.bar.text + property color themeForeground: Commons.Color.bar.text + property color themeContrastForeground: Commons.Color.background + property color transparentForeground: Commons.Color.bar.text property color foreground: themeForeground property color barForeground: useTransparentForeground ? transparentForeground : themeForeground property bool foregroundAnimationEnabled: true - property color background: Color.bar.background - property color urgent: Color.bar.active + property color background: Commons.Color.bar.background + property color urgent: Commons.Color.bar.active Behavior on barForeground { enabled: root.foregroundAnimationEnabled; ColorAnimation { duration: Style.duration(420); easing.type: Easing.OutCubic } } Behavior on background { ColorAnimation { duration: Style.duration(420); easing.type: Easing.OutCubic } } @@ -1342,8 +1343,8 @@ Item { id: tooltipBubble implicitWidth: tooltipLabel.implicitWidth + 20 implicitHeight: tooltipLabel.implicitHeight + 14 - color: Color.tooltip.background - borderSpec: Border.surfaceSpec("tooltip", "border", Color.tooltip.border, 1) + color: Commons.Color.tooltip.background + borderSpec: Border.surfaceSpec("tooltip", "border", Commons.Color.tooltip.border, 1) radius: Style.cornerRadius Text { @@ -1351,7 +1352,7 @@ Item { textFormat: Text.PlainText anchors.centerIn: parent text: root.tooltipText - color: Color.tooltip.text + color: Commons.Color.tooltip.text font.family: root.fontFamily font.pixelSize: Style.font.body horizontalAlignment: Text.AlignHCenter @@ -1470,7 +1471,7 @@ Item { y: targetRect ? Math.round(targetRect.y) : 0 width: targetRect ? targetRect.width : 0 height: targetRect ? targetRect.height : 0 - color: Color.accent + color: Commons.Color.accent radius: Math.min(width, height) / 2 } } @@ -1905,7 +1906,7 @@ Item { visible: opacity > 0 opacity: slot.panelOpen && !slot.dragSource ? 0.9 : 0 - color: Color.accent + color: Commons.Color.accent radius: Math.min(width, height) / 2 width: root.vertical ? Style.space(2) : slot.panelIndicatorExtent height: root.vertical ? slot.panelIndicatorExtent : Style.space(2) diff --git a/shell/plugins/bar/indicators/PasswordlessSudo.qml b/shell/plugins/bar/indicators/PasswordlessSudo.qml index e91b1b53..bdc75434 100644 --- a/shell/plugins/bar/indicators/PasswordlessSudo.qml +++ b/shell/plugins/bar/indicators/PasswordlessSudo.qml @@ -1,6 +1,7 @@ import QtQuick import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui BarIndicator { @@ -15,7 +16,7 @@ BarIndicator { activeTooltipText: "Disable Passwordless Sudo" inactiveTooltipText: "Passwordless Sudo" useActiveColor: true - activeColor: Color.urgent + activeColor: Commons.Color.urgent function refresh() { if (!root.bar) return diff --git a/shell/plugins/bar/widgets/ActiveWindow.qml b/shell/plugins/bar/widgets/ActiveWindow.qml index 251d48ab..b803e7f4 100644 --- a/shell/plugins/bar/widgets/ActiveWindow.qml +++ b/shell/plugins/bar/widgets/ActiveWindow.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Wayland import qs.Commons +import qs.Commons as Commons import qs.Ui BarWidget { @@ -34,7 +35,7 @@ BarWidget { anchors.left: parent.left width: parent.width text: root.title - color: root.bar ? root.bar.barForeground : Color.foreground + color: root.bar ? root.bar.barForeground : Commons.Color.foreground font.family: root.bar ? root.bar.fontFamily : Style.font.family font.pixelSize: Style.font.body elide: Text.ElideRight diff --git a/shell/plugins/bar/widgets/Tray.qml b/shell/plugins/bar/widgets/Tray.qml index dfe11ad7..628b3c2f 100644 --- a/shell/plugins/bar/widgets/Tray.qml +++ b/shell/plugins/bar/widgets/Tray.qml @@ -4,6 +4,7 @@ import QtQuick.Controls import QtQuick.Effects import Quickshell.Services.SystemTray import qs.Commons +import qs.Commons as Commons import qs.Ui import "TrayModel.js" as TrayModel @@ -16,7 +17,7 @@ BarWidget { property bool trayMenuOpen: false property var activeTrayItem: null property var activeTrayAnchor: null - readonly property color foreground: bar ? bar.foreground : Color.foreground + readonly property color foreground: bar ? bar.foreground : Commons.Color.foreground readonly property string fontFamily: bar ? bar.fontFamily : Style.font.family readonly property var pinnedIds: settings.pinned instanceof Array ? settings.pinned : [] readonly property var hiddenIds: settings.hidden instanceof Array ? settings.hidden : [] @@ -617,7 +618,7 @@ BarWidget { anchors.rightMargin: Style.space(10) anchors.verticalCenter: parent.verticalCenter height: 1 - color: Color.popups.border + color: Commons.Color.popups.border opacity: 0.45 } } @@ -671,7 +672,7 @@ BarWidget { anchors.rightMargin: Style.space(10) anchors.verticalCenter: parent.verticalCenter height: 1 - color: Color.popups.border + color: Commons.Color.popups.border opacity: 0.45 } diff --git a/shell/plugins/clipboard/Clipboard.qml b/shell/plugins/clipboard/Clipboard.qml index a8feb23a..b6fb9f94 100644 --- a/shell/plugins/clipboard/Clipboard.qml +++ b/shell/plugins/clipboard/Clipboard.qml @@ -3,6 +3,7 @@ import Quickshell.Io import Quickshell.Wayland import QtQuick import qs.Commons +import qs.Commons as Commons import qs.Ui import "ClipboardHistory.js" as ClipboardHistory @@ -22,13 +23,13 @@ Item { // Shares the [menu] surface tokens — themes that style the menu also // style the clipboard. Selected-row colors composed in the // singleton so consumers drop them straight into Rectangle bindings. - property color background: Color.menu.background - property color foreground: Color.menu.text - property color border: Color.menu.border + property color background: Commons.Color.menu.background + property color foreground: Commons.Color.menu.text + property color border: Commons.Color.menu.border property var borderSpec: Border.surfaceSpec("menu", "border", border, Math.max(1, Style.space(2))) - property color scrim: Color.menu.scrim - property color selectedBackground: Color.menu.selectedBackground - property color selectedText: Color.menu.selectedText + property color scrim: Commons.Color.menu.scrim + property color selectedBackground: Commons.Color.menu.selectedBackground + property color selectedText: Commons.Color.menu.selectedText readonly property int cornerRadius: Style.cornerRadius property string fontFamily: Style.font.menuFamily property int contentMargin: Style.spacing.panelPadding diff --git a/shell/plugins/dev-gallery/GalleryPanel.qml b/shell/plugins/dev-gallery/GalleryPanel.qml index 680bdbef..af4a660f 100644 --- a/shell/plugins/dev-gallery/GalleryPanel.qml +++ b/shell/plugins/dev-gallery/GalleryPanel.qml @@ -3,6 +3,7 @@ import QtQuick.Controls import Quickshell import qs.Ui import qs.Commons +import qs.Commons as Commons // Visual reference + live playground for omarchy-shell's common UI // components. Summon with `omarchy dev ui-preview`, or directly via: @@ -66,10 +67,10 @@ Item { property var shell: null // ---- theme -------------------------------------------------------------- - readonly property color foreground: Color.foreground - readonly property color background: Color.background - readonly property color accent: Color.accent - readonly property color urgent: Color.urgent + readonly property color foreground: Commons.Color.foreground + readonly property color background: Commons.Color.background + readonly property color accent: Commons.Color.accent + readonly property color urgent: Commons.Color.urgent readonly property string fontFamily: "monospace" // Fake `bar` for components that take a whole bar object (e.g. Slider). diff --git a/shell/plugins/emojis/Emojis.qml b/shell/plugins/emojis/Emojis.qml index b1bcdec0..74c9dbae 100644 --- a/shell/plugins/emojis/Emojis.qml +++ b/shell/plugins/emojis/Emojis.qml @@ -3,6 +3,7 @@ import Quickshell.Io import Quickshell.Wayland import QtQuick import qs.Commons +import qs.Commons as Commons import qs.Ui import "EmojiSearch.js" as EmojiSearch @@ -23,13 +24,13 @@ Item { // Shares the [menu] surface tokens — themes that style the menu also // style emojis. Selected-cell colors composed in the // singleton so consumers drop them straight into Rectangle bindings. - property color background: Color.menu.background - property color foreground: Color.menu.text - property color border: Color.menu.border + property color background: Commons.Color.menu.background + property color foreground: Commons.Color.menu.text + property color border: Commons.Color.menu.border property var borderSpec: Border.surfaceSpec("menu", "border", border, Math.max(1, Style.space(2))) - property color scrim: Color.menu.scrim - property color selectedBackground: Color.menu.selectedBackground - property color selectedText: Color.menu.selectedText + property color scrim: Commons.Color.menu.scrim + property color selectedBackground: Commons.Color.menu.selectedBackground + property color selectedText: Commons.Color.menu.selectedText readonly property int cornerRadius: Style.cornerRadius property string fontFamily: Style.font.menuFamily property int contentMargin: Style.spacing.panelPadding diff --git a/shell/plugins/image-picker/ImagePicker.qml b/shell/plugins/image-picker/ImagePicker.qml index 02b37c7b..d4ec95ec 100644 --- a/shell/plugins/image-picker/ImagePicker.qml +++ b/shell/plugins/image-picker/ImagePicker.qml @@ -5,6 +5,7 @@ import QtQuick import QtQuick.Effects import QtQuick.Shapes import qs.Commons +import qs.Commons as Commons import qs.Ui import "ImagePickerModel.js" as ImagePickerModel @@ -37,14 +38,14 @@ Item { property string themeRows: "" property bool themeMode: false property bool themeOpenPending: false - // Bound to the central [image-picker] section in shell.toml via Color.qml. + // Bound to the central [image-picker] section in shell.toml via Commons.Color.qml. // `dimColor` tints unselected slices and text outlines on top of the scrim; // it intentionally tracks the foundational background, not a surface role. - property color dimColor: Color.background - property color foreground: Color.imagePicker.text - property color scrim: Color.imagePicker.scrim - property color selectedBorder: Color.imagePicker.selectedBorder - property color unselectedBorder: Color.imagePicker.unselectedBorder + property color dimColor: Commons.Color.background + property color foreground: Commons.Color.imagePicker.text + property color scrim: Commons.Color.imagePicker.scrim + property color selectedBorder: Commons.Color.imagePicker.selectedBorder + property color unselectedBorder: Commons.Color.imagePicker.unselectedBorder property int expandedWidth: 768 property int expandedHeight: 475 property int sliceWidth: 108 diff --git a/shell/plugins/lock/LockView.qml b/shell/plugins/lock/LockView.qml index e00ef6e9..ecec660c 100644 --- a/shell/plugins/lock/LockView.qml +++ b/shell/plugins/lock/LockView.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Effects import qs.Commons +import qs.Commons as Commons import qs.Ui Item { @@ -42,8 +43,8 @@ Item { readonly property bool showPasswordCursor: inputEnabled && !authenticatingPassword && failureMessage.length === 0 readonly property bool errorState: failureMessage.length > 0 readonly property var inputBorderSpec: errorState - ? Border.surfaceSpec("lock", "border-error", Color.lock.borderError, root.outlineThickness, "border-alpha") - : Border.surfaceSpec("lock", "border-active", Color.lock.borderActive, root.outlineThickness, "border-alpha") + ? Border.surfaceSpec("lock", "border-error", Commons.Color.lock.borderError, root.outlineThickness, "border-alpha") + : Border.surfaceSpec("lock", "border-active", Commons.Color.lock.borderActive, root.outlineThickness, "border-alpha") readonly property bool video: Util.isVideoPath(root.backgroundPath) readonly property bool feedActive: root.video && root.loadBackground && !root.displaysBlank && !root.powerSaverActive @@ -97,7 +98,7 @@ Item { Rectangle { anchors.fill: parent - color: Color.background + color: Commons.Color.background BackgroundMedia { id: wallpaper @@ -156,7 +157,7 @@ Item { width: root.fieldWidth height: root.fieldHeight anchors.centerIn: parent - color: Color.lock.background + color: Commons.Color.lock.background borderSpec: root.inputBorderSpec radius: Style.cornerRadius clip: true @@ -179,16 +180,16 @@ Item { echoMode: TextInput.Password passwordCharacter: "\u25CF" passwordMaskDelay: 0 - color: Color.lock.text - selectionColor: Color.lock.selection - selectedTextColor: Color.lock.text + color: Commons.Color.lock.text + selectionColor: Commons.Color.lock.selection + selectedTextColor: Commons.Color.lock.text font.family: Style.font.family font.pixelSize: text.length > 0 ? Math.max(1, Math.floor(root.passwordDotFontSize * root.passwordDotScale)) : root.fieldFontSize font.letterSpacing: text.length > 0 ? root.passwordDotLetterSpacing * root.passwordDotScale : 0 cursorVisible: activeFocus && root.showPasswordCursor && text.length > 0 cursorDelegate: Rectangle { width: 2 - color: Color.lock.text + color: Commons.Color.lock.text visible: passwordInput.cursorVisible } @@ -224,7 +225,7 @@ Item { anchors.fill: passwordInput text: root.authenticatingPassword ? "Checking…" : (root.failureMessage.length > 0 ? root.failureMessage : root.placeholderText) visible: passwordInput.text.length === 0 - color: root.authenticatingPassword ? Color.lock.text : (root.failureMessage.length > 0 ? Color.lock.textError : Color.lock.placeholder) + color: root.authenticatingPassword ? Commons.Color.lock.text : (root.failureMessage.length > 0 ? Commons.Color.lock.textError : Commons.Color.lock.placeholder) font.family: Style.font.family font.pixelSize: root.fieldFontSize font.italic: !root.authenticatingPassword && root.failureMessage.length > 0 @@ -247,7 +248,7 @@ Item { anchors.verticalCenter: parent.verticalCenter visible: root.fingerprintConfigured text: root.fingerprintUnavailable ? "󰺱" : "󰈷" - color: root.fingerprintUnavailable ? Color.lock.textError : Color.lock.placeholder + color: root.fingerprintUnavailable ? Commons.Color.lock.textError : Commons.Color.lock.placeholder font.family: Style.font.family font.pixelSize: Math.round(root.fieldFontSize * 1.1) horizontalAlignment: Text.AlignHCenter @@ -266,7 +267,7 @@ Item { anchors.horizontalCenter: inputField.horizontalCenter visible: root.fingerprintConfigured && root.fingerprintUnavailable text: "Fingerprint reader unavailable" - color: Color.lock.textError + color: Commons.Color.lock.textError font.family: Style.font.family font.pixelSize: Style.font.heading font.italic: true diff --git a/shell/plugins/lock/Service.qml b/shell/plugins/lock/Service.qml index 41336479..e6bc4ea5 100644 --- a/shell/plugins/lock/Service.qml +++ b/shell/plugins/lock/Service.qml @@ -4,6 +4,7 @@ import Quickshell.Io import Quickshell.Services.Pam import Quickshell.Wayland import qs.Commons +import qs.Commons as Commons import "FingerprintModel.js" as FingerprintModel Item { @@ -467,7 +468,7 @@ Item { WlSessionLockSurface { id: lockSurface - color: Color.background + color: Commons.Color.background LockView { id: lockView diff --git a/shell/plugins/menu/Menu.qml b/shell/plugins/menu/Menu.qml index 59ad1167..5ecef463 100644 --- a/shell/plugins/menu/Menu.qml +++ b/shell/plugins/menu/Menu.qml @@ -3,6 +3,7 @@ import Quickshell.Io import Quickshell.Wayland import QtQuick import qs.Commons +import qs.Commons as Commons import qs.Ui import "MenuModel.js" as MenuModel @@ -81,17 +82,17 @@ Item { property bool deleteConfirmOpen: false property var deleteTarget: null onOpenedChanged: if (!opened) { deleteConfirmOpen = false; deleteTarget = null } - // Bound to the central [menu] section in shell.toml via Color.qml. + // Bound to the central [menu] section in shell.toml via Commons.Color.qml. // Each color already includes its alpha companion (composed in the // singleton), so consumers can drop them straight into a Rectangle. - property color background: Color.menu.background - property color foreground: Color.menu.text - property color border: Color.menu.border + property color background: Commons.Color.menu.background + property color foreground: Commons.Color.menu.text + property color border: Commons.Color.menu.border property var borderSpec: Border.surfaceSpec("menu", "border", border, Math.max(1, Style.space(2))) - property color scrim: Color.menu.scrim - property color selectedBackground: Color.menu.selectedBackground - property color selectedText: Color.menu.selectedText - property color selectedBorder: Color.menu.selectedBorder + property color scrim: Commons.Color.menu.scrim + property color selectedBackground: Commons.Color.menu.selectedBackground + property color selectedText: Commons.Color.menu.selectedText + property color selectedBorder: Commons.Color.menu.selectedBorder property var selectedBorderSpec: Border.surfaceSpec("menu", "selected-border", selectedBorder, 0) readonly property real rowReservedBorderLeft: Border.left(selectedBorderSpec) readonly property real rowReservedBorderRight: Border.right(selectedBorderSpec) diff --git a/shell/plugins/notifications/components/NotificationCard.qml b/shell/plugins/notifications/components/NotificationCard.qml index d7df8d83..5634e2ee 100644 --- a/shell/plugins/notifications/components/NotificationCard.qml +++ b/shell/plugins/notifications/components/NotificationCard.qml @@ -6,6 +6,7 @@ import QtQuick import QtQuick.Layouts import Quickshell import qs.Commons +import qs.Commons as Commons import qs.Ui import "../NotificationLogic.js" as NotificationLogic @@ -46,10 +47,10 @@ BorderSurface { readonly property string sanitizedBody: sanitizeBody(body) readonly property string styledBody: NotificationLogic.styledBody(body, app, appIcon) - readonly property color dimColor: Qt.darker(Color.notifications.text, 1.4) - readonly property color bodyColor: Qt.darker(Color.notifications.text, 1.15) - readonly property color accentColor: urgency === 2 ? Color.urgent : (urgency === 0 ? dimColor : Color.notifications.countdown) - readonly property var cardBorderSpec: Border.surfaceSpec("notifications", "border", Color.notifications.border, Math.max(1, Style.space(2))) + readonly property color dimColor: Qt.darker(Commons.Color.notifications.text, 1.4) + readonly property color bodyColor: Qt.darker(Commons.Color.notifications.text, 1.15) + readonly property color accentColor: urgency === 2 ? Commons.Color.urgent : (urgency === 0 ? dimColor : Commons.Color.notifications.countdown) + readonly property var cardBorderSpec: Border.surfaceSpec("notifications", "border", Commons.Color.notifications.border, Math.max(1, Style.space(2))) function sanitizeBody(s) { return NotificationLogic.sanitizeBody(s, app, appIcon) @@ -68,7 +69,7 @@ BorderSurface { // doesn't push content under the bottom edge. implicitHeight: mainColumn.implicitHeight + borderTop + borderBottom radius: cornerRadius - color: Color.notifications.background + color: Commons.Color.notifications.background borderSpec: cardBorderSpec clip: true @@ -137,7 +138,7 @@ BorderSurface { anchors.centerIn: parent visible: root.hasGlyph && smallIconImage.status !== Image.Ready text: root.glyph - color: Color.notifications.text + color: Commons.Color.notifications.text font.family: root.fontFamily font.pixelSize: Style.font.displayLarge } @@ -148,7 +149,7 @@ BorderSurface { Layout.alignment: Qt.AlignVCenter visible: root.compactGlyph text: root.glyph - color: Color.notifications.text + color: Commons.Color.notifications.text font.family: root.fontFamily font.pixelSize: Style.font.icon } @@ -170,7 +171,7 @@ BorderSurface { visible: root.summary.length > 0 text: root.summary font.family: "Liberation Sans" - color: Color.notifications.text + color: Commons.Color.notifications.text font.pixelSize: Style.font.title font.bold: true wrapMode: Text.WordWrap @@ -212,7 +213,7 @@ BorderSurface { Text { anchors.centerIn: parent text: "✕" - color: closeArea.containsMouse ? Color.notifications.text : root.dimColor + color: closeArea.containsMouse ? Commons.Color.notifications.text : root.dimColor font.pixelSize: Math.round(Style.font.caption * 1.44) } diff --git a/shell/plugins/osd/Osd.qml b/shell/plugins/osd/Osd.qml index 69ddc25b..44592581 100644 --- a/shell/plugins/osd/Osd.qml +++ b/shell/plugins/osd/Osd.qml @@ -3,6 +3,7 @@ import Quickshell import Quickshell.Io import Quickshell.Wayland import qs.Commons +import qs.Commons as Commons import qs.Ui import "OsdModel.js" as OsdModel @@ -139,8 +140,8 @@ Item { anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom anchors.bottomMargin: Style.space(67) - color: Util.alpha(Color.background, 0.97) - borderSpec: Border.surfaceSpec("popups", "border", Color.popups.border, Math.max(1, Style.space(2))) + color: Util.alpha(Commons.Color.background, 0.97) + borderSpec: Border.surfaceSpec("popups", "border", Commons.Color.popups.border, Math.max(1, Style.space(2))) radius: Style.cornerRadius opacity: root.opened ? 1 : 0 @@ -162,7 +163,7 @@ Item { anchors.verticalCenter: parent.verticalCenter text: root.icon font: iconMetrics.font - color: Color.popups.text + color: Commons.Color.popups.text } } Rectangle { @@ -170,11 +171,11 @@ Item { width: root.barWidth height: Math.max(Style.space(6), Style.spacing.sm) anchors.verticalCenter: parent.verticalCenter - color: Util.alpha(Color.popups.text, 0.45) + color: Util.alpha(Commons.Color.popups.text, 0.45) Rectangle { height: parent.height width: parent.width * (root.hasProgress ? root.value / root.maxValue : 0) - color: Color.accent + color: Commons.Color.accent Behavior on width { enabled: root.opened @@ -192,7 +193,7 @@ Item { anchors.verticalCenter: parent.verticalCenter text: root.message font: messageMetrics.font - color: Color.popups.text + color: Commons.Color.popups.text elide: Text.ElideRight maximumLineCount: 1 } diff --git a/shell/plugins/panels/audio/Panel.qml b/shell/plugins/panels/audio/Panel.qml index 548c409b..7f336a31 100644 --- a/shell/plugins/panels/audio/Panel.qml +++ b/shell/plugins/panels/audio/Panel.qml @@ -6,6 +6,7 @@ import Quickshell.Services.Mpris import Quickshell.Services.Pipewire import qs.Ui import qs.Commons +import qs.Commons as Commons import "Model.js" as Model Panel { @@ -179,10 +180,10 @@ Panel { readonly property string toggleHint: anyAudible ? "Mute" : "Unmute" readonly property color hoverFill: bar - ? Style.hoverFillFor(bar.foreground, Color.accent) + ? Style.hoverFillFor(bar.foreground, Commons.Color.accent) : "transparent" readonly property color selectedFill: bar - ? Style.selectedFillFor(bar.foreground, Color.accent) + ? Style.selectedFillFor(bar.foreground, Commons.Color.accent) : "transparent" function sectionCount(section) { diff --git a/shell/plugins/panels/bluetooth/Panel.qml b/shell/plugins/panels/bluetooth/Panel.qml index 11b0ce0c..6603209d 100644 --- a/shell/plugins/panels/bluetooth/Panel.qml +++ b/shell/plugins/panels/bluetooth/Panel.qml @@ -6,6 +6,7 @@ import Quickshell.Bluetooth import Quickshell.Services.Pipewire import qs.Ui import qs.Commons +import qs.Commons as Commons import "Model.js" as Model Panel { @@ -104,10 +105,10 @@ Panel { readonly property string toggleHint: root.adapter && root.adapter.enabled ? "Turn Bluetooth off" : "Turn Bluetooth on" readonly property color hoverFill: bar - ? Style.hoverFillFor(bar.foreground, Color.accent) + ? Style.hoverFillFor(bar.foreground, Commons.Color.accent) : "transparent" readonly property color selectedFill: bar - ? Style.selectedFillFor(bar.foreground, Color.accent) + ? Style.selectedFillFor(bar.foreground, Commons.Color.accent) : "transparent" function sectionCount(section) { diff --git a/shell/plugins/panels/clock/Panel.qml b/shell/plugins/panels/clock/Panel.qml index ec55afd3..4f4414bb 100644 --- a/shell/plugins/panels/clock/Panel.qml +++ b/shell/plugins/panels/clock/Panel.qml @@ -1,6 +1,7 @@ import QtQuick import Quickshell import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model @@ -75,7 +76,7 @@ Panel { // Guarded so the widget renders before the bar is injected (the bar-widget // contract instantiates it bare). - readonly property color contentForeground: bar ? bar.foreground : Color.foreground + readonly property color contentForeground: bar ? bar.foreground : Commons.Color.foreground readonly property string contentFontFamily: bar ? bar.fontFamily : Style.font.family readonly property int cellWidth: Style.space(52) @@ -302,7 +303,7 @@ Panel { anchors.baseline: heroDate.baseline text: "󰃭" color: heroMouse.containsMouse - ? Style.hoverStateColor(root.contentForeground, Color.accent) + ? Style.hoverStateColor(root.contentForeground, Commons.Color.accent) : root.contentForeground font.family: root.contentFontFamily // Decorative, and deliberately outside the Style.font.* @@ -317,7 +318,7 @@ Panel { anchors.verticalCenter: parent.verticalCenter text: Qt.formatDate(root.today, "MMMM d") color: heroMouse.containsMouse - ? Style.hoverStateColor(root.contentForeground, Color.accent) + ? Style.hoverStateColor(root.contentForeground, Commons.Color.accent) : root.contentForeground font.family: root.contentFontFamily font.pixelSize: 52 @@ -455,7 +456,7 @@ Panel { width: Math.round(parent.width * root.yearDone) height: parent.height radius: parent.radius - color: Style.selectedStateColor(root.contentForeground, Color.accent) + color: Style.selectedStateColor(root.contentForeground, Commons.Color.accent) Behavior on width { NumberAnimation { duration: Style.duration(160); easing.type: Easing.OutCubic } } } @@ -513,7 +514,7 @@ Panel { width: Math.round(parent.width * root.lifeDone) height: parent.height radius: parent.radius - color: Style.selectedStateColor(root.contentForeground, Color.accent) + color: Style.selectedStateColor(root.contentForeground, Commons.Color.accent) Behavior on width { NumberAnimation { duration: Style.duration(160); easing.type: Easing.OutCubic } } } @@ -575,14 +576,14 @@ Panel { height: Style.space(16) radius: Style.cornerRadius color: weekStartMouse.containsMouse - ? Style.hoverFillFor(root.contentForeground, Color.accent) + ? Style.hoverFillFor(root.contentForeground, Commons.Color.accent) : "transparent" Text { anchors.centerIn: parent text: "W" color: weekStartMouse.containsMouse - ? Style.hoverStateColor(root.contentForeground, Color.accent) + ? Style.hoverStateColor(root.contentForeground, Commons.Color.accent) : Qt.darker(root.contentForeground, 1.9) font.family: root.contentFontFamily font.pixelSize: Style.font.caption @@ -667,7 +668,7 @@ Panel { // over a grid this quiet. color: "transparent" border.width: modelData.today ? Style.spacing.hairline : 0 - border.color: Style.normalBorderFor(root.contentForeground, Color.accent) + border.color: Style.normalBorderFor(root.contentForeground, Commons.Color.accent) Text { textFormat: Text.PlainText diff --git a/shell/plugins/panels/dropbox/DropboxIcon.qml b/shell/plugins/panels/dropbox/DropboxIcon.qml index 6302b87c..488346bc 100644 --- a/shell/plugins/panels/dropbox/DropboxIcon.qml +++ b/shell/plugins/panels/dropbox/DropboxIcon.qml @@ -1,12 +1,13 @@ import QtQuick import QtQuick.Shapes import qs.Commons +import qs.Commons as Commons Item { id: root property real iconSize: Style.font.icon - property color color: Color.foreground + property color color: Commons.Color.foreground width: iconSize * 1.18 height: iconSize diff --git a/shell/plugins/panels/dropbox/Panel.qml b/shell/plugins/panels/dropbox/Panel.qml index 1a415846..583bfa83 100644 --- a/shell/plugins/panels/dropbox/Panel.qml +++ b/shell/plugins/panels/dropbox/Panel.qml @@ -4,6 +4,7 @@ import QtQuick.Layouts import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model @@ -32,8 +33,8 @@ Panel { "Cataloging chaos" ] readonly property string heroPhraseText: activePhrases[phraseIndex % activePhrases.length] - readonly property color foreground: bar ? bar.foreground : Color.foreground - readonly property color urgent: bar ? bar.urgent : Color.urgent + readonly property color foreground: bar ? bar.foreground : Commons.Color.foreground + readonly property color urgent: bar ? bar.urgent : Commons.Color.urgent readonly property color dim: Qt.darker(foreground, 1.55) readonly property string fontFamily: bar ? bar.fontFamily : Style.font.family readonly property color iconColor: dropbox.authenticated && dropbox.active ? foreground : dim diff --git a/shell/plugins/panels/elsewhen/ArcText.qml b/shell/plugins/panels/elsewhen/ArcText.qml index b4ae6ea1..ae18e807 100644 --- a/shell/plugins/panels/elsewhen/ArcText.qml +++ b/shell/plugins/panels/elsewhen/ArcText.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons import "Arc.js" as Arc // One line of text arched over what sits below it, each character turned to @@ -13,7 +14,7 @@ Item { property real rise: 6 property string fontFamily: Style.font.family property int pixelSize: Style.font.caption - property color color: Color.foreground + property color color: Commons.Color.foreground FontMetrics { id: metrics diff --git a/shell/plugins/panels/elsewhen/CityRow.qml b/shell/plugins/panels/elsewhen/CityRow.qml index 6222c014..03bba250 100644 --- a/shell/plugins/panels/elsewhen/CityRow.qml +++ b/shell/plugins/panels/elsewhen/CityRow.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Layouts import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model import "Greetings.js" as Greet @@ -52,7 +53,7 @@ Rectangle { // arrow keys never reads darker than the daytime rows around it. readonly property bool picked: panel.focusIndex === index && !panel.addSelected readonly property bool lit: rowHover.hovered || picked - color: Model.mix(Color.popups.background, foreground, + color: Model.mix(Commons.Color.popups.background, foreground, picked ? dayFill + hoverLift : rowHover.hovered ? phaseFill + hoverLift : phaseFill) // Transforms leave the Column's layout alone: the knock that clears the @@ -297,8 +298,8 @@ Rectangle { anchors.verticalCenter: parent.top size: fontSize + (Style.space(22) - fontSize) * 0.85 radius: size / 2 - color: Model.mix(Color.popups.background, row.foreground, _hot ? 0.24 : 0.14) - borderSpec: Border.flat(Model.mix(Color.popups.background, row.foreground, _hot ? 0.65 : 0.35), Style.space(1)) + color: Model.mix(Commons.Color.popups.background, row.foreground, _hot ? 0.24 : 0.14) + borderSpec: Border.flat(Model.mix(Commons.Color.popups.background, row.foreground, _hot ? 0.65 : 0.35), Style.space(1)) iconText: "\u00d7" tooltipText: "Remove" foreground: row.dim diff --git a/shell/plugins/panels/elsewhen/CitySearch.qml b/shell/plugins/panels/elsewhen/CitySearch.qml index e91cae2c..f1ffb4b6 100644 --- a/shell/plugins/panels/elsewhen/CitySearch.qml +++ b/shell/plugins/panels/elsewhen/CitySearch.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model @@ -20,7 +21,7 @@ Column { property string placeholderText: "Search cities\u2026" property string loadingText: "Loading zones\u2026" property real fontSize: Style.font.bodySmall - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color dim: Qt.darker(foreground, 1.55) property color fainter: Qt.darker(foreground, 2.1) property string fontFamily: Style.font.family diff --git a/shell/plugins/panels/elsewhen/DaylightStrip.qml b/shell/plugins/panels/elsewhen/DaylightStrip.qml index 4c171c98..b55a55e9 100644 --- a/shell/plugins/panels/elsewhen/DaylightStrip.qml +++ b/shell/plugins/panels/elsewhen/DaylightStrip.qml @@ -1,6 +1,7 @@ import QtQuick import QtQuick.Controls import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model import "Sun.js" as Sun @@ -22,7 +23,7 @@ Item { property bool hovered: false property bool hour24: false property real moonPhase: 0 - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color fainter: Qt.darker(foreground, 2.1) property color daylightMarker: "#E5C736" property string fontFamily: Style.font.family diff --git a/shell/plugins/panels/elsewhen/Globe.qml b/shell/plugins/panels/elsewhen/Globe.qml index 335312ec..83cbbc37 100644 --- a/shell/plugins/panels/elsewhen/Globe.qml +++ b/shell/plugins/panels/elsewhen/Globe.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui import "GlobeModel.js" as Solar import "Model.js" as Model @@ -11,14 +12,14 @@ import "Model.js" as Model Item { id: root - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color dim: Qt.darker(foreground, 1.55) property color fainter: Qt.darker(foreground, 2.1) property color daylightMarker // Passed in so the footer's moon agrees with the rows' strips. property real moonPhase: 0.5 // Night dots are dark so they read against the bright continents. - readonly property color nightMarker: Util.alpha(Color.background, 0.92) + readonly property color nightMarker: Util.alpha(Commons.Color.background, 0.92) property string fontFamily: Style.font.family property bool hour24: false // The panel's offset setting, and the offset "home" is measured from. @@ -30,7 +31,7 @@ Item { property real chromeOpacity: 1 // Opaque tones mixed against the background, so the rows behind never show through. - readonly property color surfaceBase: Color.popups.background + readonly property color surfaceBase: Commons.Color.popups.background // Light names over sea, dark over land, split at the coastline. readonly property color seaInk: foreground readonly property color landInk: surfaceBase @@ -470,26 +471,26 @@ Item { ctx.fillStyle = day ? root.daylightMarker : root.nightMarker ctx.fill() ctx.lineWidth = root.scaled(1.2) - ctx.strokeStyle = day ? Util.alpha(Color.background, 0.7) : Util.alpha(fg, 0.85) + ctx.strokeStyle = day ? Util.alpha(Commons.Color.background, 0.7) : Util.alpha(fg, 0.85) ctx.stroke() if (root.isHome(i)) { ctx.beginPath() ctx.arc(p.x, p.y, root.scaled(3.4), 0, Math.PI * 2) - ctx.fillStyle = Color.accent + ctx.fillStyle = Commons.Color.accent ctx.fill() ctx.lineWidth = root.scaled(1.2) - ctx.strokeStyle = Util.alpha(Color.background, 0.5) + ctx.strokeStyle = Util.alpha(Commons.Color.background, 0.5) ctx.stroke() ctx.beginPath() ctx.arc(p.x, p.y, root.scaled(6.4), 0, Math.PI * 2) ctx.lineWidth = root.scaled(1.4) - ctx.strokeStyle = Util.alpha(Color.accent, 0.65) + ctx.strokeStyle = Util.alpha(Commons.Color.accent, 0.65) ctx.stroke() } else if (root.isTracked(i)) { ctx.beginPath() ctx.arc(p.x, p.y, root.scaled(4.6), 0, Math.PI * 2) ctx.lineWidth = root.scaled(1.3) - ctx.strokeStyle = Color.accent + ctx.strokeStyle = Commons.Color.accent ctx.stroke() } if (isSel) { diff --git a/shell/plugins/panels/elsewhen/GlobeFooter.qml b/shell/plugins/panels/elsewhen/GlobeFooter.qml index 5dd1ad2d..16f43592 100644 --- a/shell/plugins/panels/elsewhen/GlobeFooter.qml +++ b/shell/plugins/panels/elsewhen/GlobeFooter.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons // The selected city under the globe: name, local time and badge, then its // zone and offset. Blank without a selection; the parent reserves the height. @@ -12,7 +13,7 @@ Item { property string offsetLabel: "" property string badge: "" // "home", "tracked" or "" property real moonPhase: 0.5 - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color dim: Qt.darker(foreground, 1.55) property color fainter: Qt.darker(foreground, 2.1) property color daylightMarker @@ -90,7 +91,7 @@ Item { textFormat: Text.PlainText text: root.badge visible: root.has && text !== "" - color: Color.accent + color: Commons.Color.accent font.family: root.fontFamily font.pixelSize: Style.font.caption } diff --git a/shell/plugins/panels/elsewhen/HeroTitle.qml b/shell/plugins/panels/elsewhen/HeroTitle.qml index 9629408f..fc47f0ad 100644 --- a/shell/plugins/panels/elsewhen/HeroTitle.qml +++ b/shell/plugins/panels/elsewhen/HeroTitle.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons import "GlobeModel.js" as Solar // "World [globe] Clock" under an arched caption. The little globe is the door @@ -10,7 +11,7 @@ Column { property string caption: "" property color captionColor: dim property bool captionClickable: false - property color foreground: Color.foreground + property color foreground: Commons.Color.foreground property color dim: Qt.darker(foreground, 1.55) property string fontFamily: Style.font.family diff --git a/shell/plugins/panels/elsewhen/MiniGlobe.qml b/shell/plugins/panels/elsewhen/MiniGlobe.qml index 7214c6c8..932f8aac 100644 --- a/shell/plugins/panels/elsewhen/MiniGlobe.qml +++ b/shell/plugins/panels/elsewhen/MiniGlobe.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import "GlobeModel.js" as Solar import "Model.js" as Model @@ -11,7 +12,7 @@ Item { id: root property real spin: 0 - property color color: Color.foreground + property color color: Commons.Color.foreground // Below this size land turns to noise; draw the graticule alone. readonly property bool showLand: width >= 22 @@ -24,7 +25,7 @@ Item { property bool showMarker: false property real markerLat: 0 property real markerLon: 0 - property color markerColor: Color.accent + property color markerColor: Commons.Color.accent readonly property real radius: Math.min(width, height) / 2 - 1 readonly property string pluginDir: Quickshell.env("OMARCHY_PATH") + "/shell/plugins/panels/elsewhen" @@ -68,7 +69,7 @@ Item { // The ocean, opaque like the large globe. ctx.beginPath() ctx.arc(0, 0, r, 0, Math.PI * 2) - ctx.fillStyle = Model.mix(Color.popups.background, c, root.bold ? 0.16 : 0.13) + ctx.fillStyle = Model.mix(Commons.Color.popups.background, c, root.bold ? 0.16 : 0.13) ctx.fill() ctx.save() @@ -117,7 +118,7 @@ Item { ctx.fill() // Edged so it does not dissolve into a continent of similar lightness. ctx.lineWidth = Math.max(1, r * 0.04) - ctx.strokeStyle = Util.alpha(Color.background, 0.5) + ctx.strokeStyle = Util.alpha(Commons.Color.background, 0.5) ctx.stroke() ctx.beginPath() diff --git a/shell/plugins/panels/elsewhen/MoonDot.qml b/shell/plugins/panels/elsewhen/MoonDot.qml index 9645d167..8f654e61 100644 --- a/shell/plugins/panels/elsewhen/MoonDot.qml +++ b/shell/plugins/panels/elsewhen/MoonDot.qml @@ -1,5 +1,6 @@ import QtQuick import qs.Commons +import qs.Commons as Commons import "GlobeModel.js" as Solar // The night marker drawn as the moon's current phase. The faint full disc @@ -8,7 +9,7 @@ Item { id: root property real phase: 0 // 0 new, 0.25 first quarter, 0.5 full - property color color: Color.foreground + property color color: Commons.Color.foreground onPhaseChanged: canvas.requestPaint() onColorChanged: canvas.requestPaint() diff --git a/shell/plugins/panels/elsewhen/Panel.qml b/shell/plugins/panels/elsewhen/Panel.qml index cfd6722f..087ba0ba 100644 --- a/shell/plugins/panels/elsewhen/Panel.qml +++ b/shell/plugins/panels/elsewhen/Panel.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model import "GlobeModel.js" as Solar @@ -80,7 +81,7 @@ Panel { implicitWidth: button.implicitWidth implicitHeight: button.implicitHeight - readonly property color foreground: bar ? bar.foreground : Color.foreground + readonly property color foreground: bar ? bar.foreground : Commons.Color.foreground readonly property color dim: Qt.darker(foreground, 1.55) readonly property color fainter: Qt.darker(foreground, 2.1) // A literal gold: several themes' "yellow" is not yellow. @@ -830,7 +831,7 @@ Panel { width: parent.width caption: root.hereLine // Accent while scrubbed, so a shifted time is never taken for now. - captionColor: root.scrubMinutes !== 0 ? Color.accent : root.dim + captionColor: root.scrubMinutes !== 0 ? Commons.Color.accent : root.dim captionClickable: root.focusIndex >= 0 foreground: root.foreground dim: root.dim diff --git a/shell/plugins/panels/monitor/Panel.qml b/shell/plugins/panels/monitor/Panel.qml index 11708d3c..357b129b 100644 --- a/shell/plugins/panels/monitor/Panel.qml +++ b/shell/plugins/panels/monitor/Panel.qml @@ -4,6 +4,7 @@ import Quickshell import Quickshell.Io import qs.Ui import qs.Commons +import qs.Commons as Commons import "Model.js" as Model Panel { @@ -873,8 +874,8 @@ Panel { onHasCursorChanged: if (hasCursor) root.ensureCursorVisible(monitorRow) current: isFocused foreground: root.bar.foreground - fill: Style.hoverFillFor(root.bar.foreground, Color.accent) - currentFill: Style.selectedFillFor(root.bar.foreground, Color.accent) + fill: Style.hoverFillFor(root.bar.foreground, Commons.Color.accent) + currentFill: Style.selectedFillFor(root.bar.foreground, Commons.Color.accent) implicitHeight: monitorInner.implicitHeight + Style.spacing.xl opacity: canToggle ? 1.0 : 0.45 diff --git a/shell/plugins/panels/network/Panel.qml b/shell/plugins/panels/network/Panel.qml index a5ea65ee..3cdec3e5 100644 --- a/shell/plugins/panels/network/Panel.qml +++ b/shell/plugins/panels/network/Panel.qml @@ -6,6 +6,7 @@ import Quickshell.Io import Quickshell.Networking import qs.Ui import qs.Commons +import qs.Commons as Commons import "Model.js" as Model Panel { @@ -291,8 +292,8 @@ Panel { // `selectedIndex`). Mouse hover and keyboard nav both mutate this state // at the root; items never read containsMouse for visuals. See // CursorSurface for the shared chrome shared by rows and pills. - readonly property color hoverFill: bar ? Style.hoverFillFor(bar.foreground, Color.accent) : "transparent" - readonly property color selectedFill: bar ? Style.selectedFillFor(bar.foreground, Color.accent) : "transparent" + readonly property color hoverFill: bar ? Style.hoverFillFor(bar.foreground, Commons.Color.accent) : "transparent" + readonly property color selectedFill: bar ? Style.selectedFillFor(bar.foreground, Commons.Color.accent) : "transparent" // scannerEnabled lives on the shared WifiDevice, which has no reference // counting, and a bar widget is instantiated once per monitor. Tracking the @@ -2078,7 +2079,7 @@ Panel { anchors.verticalCenter: parent.verticalCenter height: Style.spacing.controlHeight color: Style.normalFillFor(root.bar.foreground) - borderSpec: Border.controlSpec("normal", root.bar.foreground, Color.accent) + borderSpec: Border.controlSpec("normal", root.bar.foreground, Commons.Color.accent) radius: Style.cornerRadius Text { diff --git a/shell/plugins/panels/power/Panel.qml b/shell/plugins/panels/power/Panel.qml index 80b8ff67..6a69fb26 100644 --- a/shell/plugins/panels/power/Panel.qml +++ b/shell/plugins/panels/power/Panel.qml @@ -3,6 +3,7 @@ import Quickshell import Quickshell.Io import Quickshell.Services.UPower import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model @@ -88,7 +89,7 @@ Panel { } readonly property color batteryFillColor: { - return root.bar ? root.bar.foreground : Color.foreground + return root.bar ? root.bar.foreground : Commons.Color.foreground } // Cute agent-flavored phrases shown in the hero status line, rotated on a diff --git a/shell/plugins/panels/tailscale/Panel.qml b/shell/plugins/panels/tailscale/Panel.qml index 8d0a84cb..ae8a323b 100644 --- a/shell/plugins/panels/tailscale/Panel.qml +++ b/shell/plugins/panels/tailscale/Panel.qml @@ -4,6 +4,7 @@ import QtQuick.Layouts import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui Panel { @@ -37,8 +38,8 @@ Panel { ] readonly property string heroPhraseText: activePhrases[phraseIndex % activePhrases.length] - readonly property color foreground: bar ? bar.foreground : Color.foreground - readonly property color urgent: bar ? bar.urgent : Color.urgent + readonly property color foreground: bar ? bar.foreground : Commons.Color.foreground + readonly property color urgent: bar ? bar.urgent : Commons.Color.urgent readonly property color dim: Qt.darker(foreground, 1.55) readonly property string fontFamily: bar ? bar.fontFamily : Style.font.family readonly property bool showConnections: tailscale.accounts.length > 1 || tailscale.accountsAccessDenied @@ -54,8 +55,8 @@ Panel { readonly property color iconColor: tailscale.active ? foreground : dim readonly property string toggleHint: tailscale.active ? "Turn Tailscale off" : (tailscale.needsLogin ? "Authorize this device" : "Turn Tailscale on") readonly property color barIconColor: tailscale.active ? barForeground : Qt.darker(barForeground, 1.55) - readonly property color hoverFill: bar ? Style.hoverFillFor(bar.foreground, Color.accent) : "transparent" - readonly property color selectedFill: bar ? Style.selectedFillFor(bar.foreground, Color.accent) : "transparent" + readonly property color hoverFill: bar ? Style.hoverFillFor(bar.foreground, Commons.Color.accent) : "transparent" + readonly property color selectedFill: bar ? Style.selectedFillFor(bar.foreground, Commons.Color.accent) : "transparent" function selectedPeer() { if (tailscale.peers.length === 0) return null @@ -1035,7 +1036,7 @@ Panel { } } background: BorderSurface { - color: Color.background + color: Commons.Color.background borderSpec: Border.flat(root.dim, 1) radius: Style.cornerRadius } diff --git a/shell/plugins/panels/tailscale/TailscaleIcon.qml b/shell/plugins/panels/tailscale/TailscaleIcon.qml index 8de7933c..0dd06a07 100644 --- a/shell/plugins/panels/tailscale/TailscaleIcon.qml +++ b/shell/plugins/panels/tailscale/TailscaleIcon.qml @@ -1,13 +1,14 @@ import QtQuick import qs.Commons +import qs.Commons as Commons import qs.Ui Item { id: root property real iconSize: Style.font.icon - property color color: Color.foreground - property color badgeColor: Color.urgent + property color color: Commons.Color.foreground + property color badgeColor: Commons.Color.urgent property bool crossed: false property bool warning: false @@ -51,12 +52,12 @@ Item { color: root.badgeColor anchors.right: parent.right anchors.bottom: parent.bottom - borderSpec: Border.flat(Color.popups.background, 1) + borderSpec: Border.flat(Commons.Color.popups.background, 1) Text { anchors.centerIn: parent text: "!" - color: Color.background + color: Commons.Color.background font.family: Style.font.family font.pixelSize: Math.max(6, parent.height * 0.72) font.bold: true diff --git a/shell/plugins/panels/weather/Panel.qml b/shell/plugins/panels/weather/Panel.qml index e9fa5c31..ba02fc19 100644 --- a/shell/plugins/panels/weather/Panel.qml +++ b/shell/plugins/panels/weather/Panel.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Io import qs.Commons +import qs.Commons as Commons import qs.Ui import "Model.js" as Model @@ -646,7 +647,7 @@ Panel { height: Style.space(18) anchors.verticalCenter: parent.verticalCenter radius: Math.min(4, Style.cornerRadius) - color: !root.savingLocation && clearLocationArea.containsMouse ? Style.hoverFillFor(root.bar.foreground, Color.accent) : "transparent" + color: !root.savingLocation && clearLocationArea.containsMouse ? Style.hoverFillFor(root.bar.foreground, Commons.Color.accent) : "transparent" Text { textFormat: Text.PlainText @@ -752,7 +753,7 @@ Panel { width: parent.width height: suggestionRow.implicitHeight + Style.space(12) radius: Style.cornerRadius - color: index === root.suggestionIndex ? Style.hoverFillFor(root.bar.foreground, Color.accent) : "transparent" + color: index === root.suggestionIndex ? Style.hoverFillFor(root.bar.foreground, Commons.Color.accent) : "transparent" Row { id: suggestionRow @@ -764,7 +765,7 @@ Panel { Text { textFormat: Text.PlainText text: modelData.name - color: index === root.suggestionIndex ? Style.hoverStateColor(root.bar.foreground, Color.accent) : root.bar.foreground + color: index === root.suggestionIndex ? Style.hoverStateColor(root.bar.foreground, Commons.Color.accent) : root.bar.foreground font.family: root.bar.fontFamily font.pixelSize: Style.font.body } diff --git a/shell/plugins/polkit/PolkitAgent.qml b/shell/plugins/polkit/PolkitAgent.qml index 98d6a0ac..acd6514c 100644 --- a/shell/plugins/polkit/PolkitAgent.qml +++ b/shell/plugins/polkit/PolkitAgent.qml @@ -4,6 +4,7 @@ import Quickshell.Io import Quickshell.Services.Polkit import Quickshell.Wayland import qs.Commons +import qs.Commons as Commons import qs.Ui import "PolkitModel.js" as PolkitModel @@ -11,14 +12,14 @@ Item { id: root property string fontFamily: Style.font.menuFamily - // Bound to the central [polkit] section in shell.toml via Color.qml. - property color accent: Color.polkit.accent - property color background: Color.polkit.background - property color foreground: Color.polkit.text - property color border: Color.polkit.border - property color borderError: Color.polkit.borderError + // Bound to the central [polkit] section in shell.toml via Commons.Color.qml. + property color accent: Commons.Color.polkit.accent + property color background: Commons.Color.polkit.background + property color foreground: Commons.Color.polkit.text + property color border: Commons.Color.polkit.border + property color borderError: Commons.Color.polkit.borderError property var borderSpec: Border.surfaceSpec("polkit", errorFlash ? "border-error" : "border", errorFlash ? borderError : border, Math.max(1, Style.space(2)), "border-alpha") - property color scrim: Color.polkit.scrim + property color scrim: Commons.Color.polkit.scrim readonly property int cornerRadius: Style.cornerRadius property int contentMargin: Style.spacing.panelPadding property int fieldHeight: Math.max(Style.space(42), Style.spacing.controlHeight) @@ -278,7 +279,7 @@ Item { text: "\udb80\ude37" fontFamily: root.fontFamily fontSize: Math.round(root.fieldHeight * 0.7) - color: root.errorFlash ? Color.polkit.textError : root.accent + color: root.errorFlash ? Commons.Color.polkit.textError : root.accent } Row { @@ -293,7 +294,7 @@ Item { Text { text: "\uf023" - color: root.errorFlash ? Color.polkit.textError : root.accent + color: root.errorFlash ? Commons.Color.polkit.textError : root.accent font.family: root.fontFamily font.pixelSize: Style.font.iconLarge width: Style.space(26) @@ -318,7 +319,7 @@ Item { font.pixelSize: Style.font.iconLarge echoMode: root.responseVisible ? TextInput.Normal : TextInput.Password passwordCharacter: "\u2022" - color: root.errorFlash ? Color.polkit.textError : root.foreground + color: root.errorFlash ? Commons.Color.polkit.textError : root.foreground cursorVisible: activeFocus && !root.submitted && !root.errorFlash readOnly: root.submitted || root.errorFlash enabled: root.dialogVisible @@ -337,7 +338,7 @@ Item { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: root.errorFlash ? "Wrong" : (root.submitted ? "Checking..." : "Enter password") - color: root.errorFlash ? Color.polkit.textError : root.foreground + color: root.errorFlash ? Commons.Color.polkit.textError : root.foreground opacity: root.errorFlash ? 1 : 0.36 font.family: root.fontFamily font.pixelSize: Style.font.iconLarge @@ -350,7 +351,7 @@ Item { height: Style.space(24) anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter - color: root.errorFlash ? Color.polkit.textError : root.foreground + color: root.errorFlash ? Commons.Color.polkit.textError : root.foreground visible: passwordInput.visible && passwordInput.activeFocus && passwordInput.text.length === 0 && !root.submitted && !root.errorFlash } diff --git a/shell/plugins/reminders/ReminderFlow.qml b/shell/plugins/reminders/ReminderFlow.qml index efdff65c..48361c61 100644 --- a/shell/plugins/reminders/ReminderFlow.qml +++ b/shell/plugins/reminders/ReminderFlow.qml @@ -2,6 +2,7 @@ import Quickshell import Quickshell.Wayland import QtQuick import qs.Commons +import qs.Commons as Commons import qs.Ui import "ReminderFlowModel.js" as ReminderFlowModel @@ -18,11 +19,11 @@ Item { property string filterText: "" property string fontFamily: Style.font.menuFamily - property color background: Color.menu.background - property color foreground: Color.menu.text - property color border: Color.menu.border + property color background: Commons.Color.menu.background + property color foreground: Commons.Color.menu.text + property color border: Commons.Color.menu.border property var borderSpec: Border.surfaceSpec("menu", "border", border, Math.max(1, Style.space(2))) - property color scrim: Color.menu.scrim + property color scrim: Commons.Color.menu.scrim readonly property int cornerRadius: Style.cornerRadius property int contentMargin: Style.spacing.panelPadding property int headerHeight: Math.max(Style.space(34), Style.font.title + Style.spacing.controlPaddingY * 2) diff --git a/shell/plugins/services/media/BarWidget.qml b/shell/plugins/services/media/BarWidget.qml index d8052be3..776256db 100644 --- a/shell/plugins/services/media/BarWidget.qml +++ b/shell/plugins/services/media/BarWidget.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import qs.Ui import qs.Commons +import qs.Commons as Commons BarWidget { id: root @@ -125,8 +126,8 @@ BarWidget { width: Style.space(64) height: Style.space(64) radius: Style.spacing.labelGap - color: Style.normalFillFor(root.bar.foreground, Color.accent) - borderSpec: Border.controlSpec("normal", root.bar.foreground, Color.accent) + color: Style.normalFillFor(root.bar.foreground, Commons.Color.accent) + borderSpec: Border.controlSpec("normal", root.bar.foreground, Commons.Color.accent) Image { anchors.fill: parent @@ -249,8 +250,8 @@ BarWidget { width: sourceList.width height: sourceInner.implicitHeight + Style.space(10) radius: Style.spacing.labelGap - color: selected ? Style.selectedFillFor(root.bar.foreground, Color.accent) : "transparent" - borderSpec: selected ? Border.controlSpec("normal", root.bar.foreground, Color.accent) : Border.none() + color: selected ? Style.selectedFillFor(root.bar.foreground, Commons.Color.accent) : "transparent" + borderSpec: selected ? Border.controlSpec("normal", root.bar.foreground, Commons.Color.accent) : Border.none() Row { id: sourceInner diff --git a/shell/services/BackgroundIntro.qml b/shell/services/BackgroundIntro.qml index b6ac97be..a2530b8e 100644 --- a/shell/services/BackgroundIntro.qml +++ b/shell/services/BackgroundIntro.qml @@ -3,6 +3,7 @@ import Quickshell import Quickshell.Wayland import Quickshell.Io import qs.Commons +import qs.Commons as Commons // Keep startup and theme covers alive across background service handoffs. Item { @@ -80,8 +81,8 @@ Item { framePoll.stop() themeFallback.stop() if (themeToken) { - Color.loadColors(Util.decodeBase64(themeColors)) - Color.loadShell(Util.decodeBase64(themeShell)) + Commons.Color.loadColors(Util.decodeBase64(themeColors)) + Commons.Color.loadShell(Util.decodeBase64(themeShell)) Style.scheduleRefresh() } cover = false @@ -289,7 +290,7 @@ Item { Rectangle { anchors.fill: parent visible: root.cover - color: Color.background + color: Commons.Color.background } Image { diff --git a/shell/shell.qml b/shell/shell.qml index b831c2e3..ea6e6de8 100644 --- a/shell/shell.qml +++ b/shell/shell.qml @@ -5,6 +5,7 @@ import Quickshell.Hyprland import Quickshell.Io import qs.Commons +import qs.Commons as Commons import "plugins/bar" import "services" @@ -1745,8 +1746,8 @@ ShellRoot { var shellRaw = "" try { colorsRaw = Qt.atob(String(colorsB64 || "")) } catch (e) { colorsRaw = "" } try { shellRaw = Qt.atob(String(shellB64 || "")) } catch (e2) { shellRaw = "" } - Color.loadColors(colorsRaw) - Color.loadShell(shellRaw) + Commons.Color.loadColors(colorsRaw) + Commons.Color.loadShell(shellRaw) Style.scheduleRefresh() return "ok" } diff --git a/test/shell.d/bar-test.sh b/test/shell.d/bar-test.sh index 7820fcca..bc2b945f 100644 --- a/test/shell.d/bar-test.sh +++ b/test/shell.d/bar-test.sh @@ -282,7 +282,7 @@ assert( 'bar uses nearest insertion targeting for widget and free-space drops' ) assert( - /component DragGhostPanel:[\s\S]*?readonly property var targetRect: root\.barDragTargetGeometry[\s\S]*?color: Color\.accent/.test(barSource), + /component DragGhostPanel:[\s\S]*?readonly property var targetRect: root\.barDragTargetGeometry[\s\S]*?color: Commons\.Color\.accent/.test(barSource), 'bar draws the insertion marker above the bar in the drag overlay' ) diff --git a/test/shell.d/fixtures/background-pending-theme/shell.qml b/test/shell.d/fixtures/background-pending-theme/shell.qml index 19e96223..55b83f3f 100644 --- a/test/shell.d/fixtures/background-pending-theme/shell.qml +++ b/test/shell.d/fixtures/background-pending-theme/shell.qml @@ -1,6 +1,7 @@ import QtQuick import Quickshell import qs.Commons +import qs.Commons as Commons import "background" as BackgroundPlugin ShellRoot { @@ -24,10 +25,10 @@ ShellRoot { interval: 1300 running: true onTriggered: { - if (Qt.colorEqual(Color.accent, "#123456")) { + if (Qt.colorEqual(Commons.Color.accent, "#123456")) { console.log("RESULT pass") } else { - console.log("RESULT fail previous colors returned: " + Color.accent) + console.log("RESULT fail previous colors returned: " + Commons.Color.accent) } Qt.quit() } diff --git a/test/shell.d/fixtures/network-captive-portal/shell.qml b/test/shell.d/fixtures/network-captive-portal/shell.qml index b72a4407..a0126898 100644 --- a/test/shell.d/fixtures/network-captive-portal/shell.qml +++ b/test/shell.d/fixtures/network-captive-portal/shell.qml @@ -2,6 +2,7 @@ import QtQuick import Quickshell import Quickshell.Networking import qs.Commons +import qs.Commons as Commons import "mocks" import "network" as Network @@ -21,9 +22,9 @@ ShellRoot { Network.Panel { id: panel bar: QtObject { - property color foreground: Color.foreground - property color barForeground: Color.foreground - property color urgent: Color.urgent + property color foreground: Commons.Color.foreground + property color barForeground: Commons.Color.foreground + property color urgent: Commons.Color.urgent property string fontFamily: Style.font.family property string position: "top" property int barSize: 24 diff --git a/test/shell.d/fixtures/network-owe-transition/shell.qml b/test/shell.d/fixtures/network-owe-transition/shell.qml index 5cbfcdcd..0a6f6796 100644 --- a/test/shell.d/fixtures/network-owe-transition/shell.qml +++ b/test/shell.d/fixtures/network-owe-transition/shell.qml @@ -1,6 +1,7 @@ import QtQuick import Quickshell import qs.Commons +import qs.Commons as Commons import "mocks" import "network" as Network import "network/Model.js" as Model @@ -25,9 +26,9 @@ ShellRoot { Network.Panel { id: panel bar: QtObject { - property color foreground: Color.foreground - property color barForeground: Color.foreground - property color urgent: Color.urgent + property color foreground: Commons.Color.foreground + property color barForeground: Commons.Color.foreground + property color urgent: Commons.Color.urgent property string fontFamily: Style.font.family property string position: "top" property int barSize: 24 diff --git a/test/shell.d/passwordless-sudo-indicator-test.sh b/test/shell.d/passwordless-sudo-indicator-test.sh index 129b3b82..a52cb915 100644 --- a/test/shell.d/passwordless-sudo-indicator-test.sh +++ b/test/shell.d/passwordless-sudo-indicator-test.sh @@ -11,7 +11,7 @@ const widget = read('shell/plugins/bar/widgets/Indicators.qml') const manifest = JSON.parse(read('shell/plugins/bar/widgets/Indicators.manifest.json')) assert(widget.match(/defaultIndicatorEntries: \[ "PasswordlessSudo", "Dictation"/), 'passwordless sudo is included in the default indicator tray') assert(manifest.barWidget.schema.find(field => field.key === 'items').options.some(option => option.value === 'PasswordlessSudo'), 'passwordless sudo is configurable alongside Night Light') -assert(indicator.includes('useActiveColor: true') && indicator.includes('activeColor: Color.urgent'), 'active passwordless sudo uses the theme danger color') +assert(indicator.includes('useActiveColor: true') && indicator.includes('activeColor: Commons.Color.urgent'), 'active passwordless sudo uses the theme danger color') assertEqual(indicator.match(/activeText: "([^"]+)"/)[1], indicator.match(/inactiveText: "([^"]+)"/)[1], 'sudo keeps the same icon in both states') assert(!widget.includes('sudoHorizontal') && !widget.includes('sudoVertical'), 'sudo participates in the normal indicator blocks') assert(!indicator.includes('visible:'), 'sudo uses the shared indicator visibility and hover behavior')