diff --git a/.github/workflows/run-ppa.yml b/.github/workflows/run-ppa.yml index 8e3951e9..3db2e1d7 100644 --- a/.github/workflows/run-ppa.yml +++ b/.github/workflows/run-ppa.yml @@ -243,7 +243,7 @@ jobs: fi echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # ppa-upload.sh uploads to questing + resolute when series is omitted - if ! bash distro/scripts/ppa-upload.sh "$PKG" "$PPA_NAME" ${REBUILD_RELEASE:+"$REBUILD_RELEASE"}; then + if ! bash distro/scripts/ppa-upload.sh "$PKG" "$PPA_NAME" "" ${REBUILD_RELEASE:+"$REBUILD_RELEASE"}; then echo "::error::Upload failed for $PKG" exit 1 fi diff --git a/flake.lock b/flake.lock index 78a2a1ef..7615dd8d 100644 --- a/flake.lock +++ b/flake.lock @@ -39,16 +39,16 @@ ] }, "locked": { - "lastModified": 1766725085, - "narHash": "sha256-O2aMFdDUYJazFrlwL7aSIHbUSEm3ADVZjmf41uBJfHs=", + "lastModified": 1776854048, + "narHash": "sha256-lLbV66V3RMNp1l8/UelmR4YzoJ5ONtgvEtiUMJATH/o=", "ref": "refs/heads/master", - "rev": "41828c4180fb921df7992a5405f5ff05d2ac2fff", - "revCount": 715, + "rev": "783c953987dc56ff0601abe6845ed96f1d00495a", + "revCount": 806, "type": "git", "url": "https://git.outfoxxed.me/quickshell/quickshell" }, "original": { - "rev": "41828c4180fb921df7992a5405f5ff05d2ac2fff", + "rev": "783c953987dc56ff0601abe6845ed96f1d00495a", "type": "git", "url": "https://git.outfoxxed.me/quickshell/quickshell" } diff --git a/flake.nix b/flake.nix index 981f3068..fed35232 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,7 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; quickshell = { - url = "git+https://git.outfoxxed.me/quickshell/quickshell?rev=41828c4180fb921df7992a5405f5ff05d2ac2fff"; + url = "git+https://git.outfoxxed.me/quickshell/quickshell?rev=783c953987dc56ff0601abe6845ed96f1d00495a"; inputs.nixpkgs.follows = "nixpkgs"; }; flake-compat = { diff --git a/quickshell/Common/KeybindActions.js b/quickshell/Common/KeybindActions.js index e5f1662a..f996c8e1 100644 --- a/quickshell/Common/KeybindActions.js +++ b/quickshell/Common/KeybindActions.js @@ -161,10 +161,16 @@ const NIRI_ACTIONS = { { id: "focus-monitor-right", label: "Focus Monitor Right" }, { id: "focus-monitor-down", label: "Focus Monitor Down" }, { id: "focus-monitor-up", label: "Focus Monitor Up" }, - { id: "move-column-to-monitor-left", label: "Move to Monitor Left" }, - { id: "move-column-to-monitor-right", label: "Move to Monitor Right" }, - { id: "move-column-to-monitor-down", label: "Move to Monitor Down" }, - { id: "move-column-to-monitor-up", label: "Move to Monitor Up" } + { id: "move-column-to-monitor-left", label: "Move Column to Monitor Left" }, + { id: "move-column-to-monitor-right", label: "Move Column to Monitor Right" }, + { id: "move-column-to-monitor-down", label: "Move Column to Monitor Down" }, + { id: "move-column-to-monitor-up", label: "Move Column to Monitor Up" }, + { id: "move-workspace-to-monitor-left", label: "Move Workspace to Monitor Left" }, + { id: "move-workspace-to-monitor-right", label: "Move Workspace to Monitor Right" }, + { id: "move-workspace-to-monitor-down", label: "Move Workspace to Monitor Down" }, + { id: "move-workspace-to-monitor-up", label: "Move Workspace to Monitor Up" }, + { id: "move-workspace-to-monitor-next", label: "Move Workspace to Next Monitor" }, + { id: "move-workspace-to-monitor-previous", label: "Move Workspace to Previous Monitor" } ], "Screenshot": [ { id: "screenshot", label: "Screenshot (Interactive)" }, diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index 7614ba99..3d085a3c 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -207,11 +207,15 @@ Singleton { property bool blurEnabled: false onBlurEnabledChanged: saveSettings() + property bool blurForegroundLayers: true + onBlurForegroundLayersChanged: saveSettings() + property real blurLayerOutlineOpacity: 0.12 + onBlurLayerOutlineOpacityChanged: saveSettings() property string blurBorderColor: "outline" onBlurBorderColorChanged: saveSettings() property string blurBorderCustomColor: "#ffffff" onBlurBorderCustomColorChanged: saveSettings() - property real blurBorderOpacity: 1.0 + property real blurBorderOpacity: 0.35 onBlurBorderOpacityChanged: saveSettings() property string wallpaperFillMode: "Fill" property bool blurredWallpaperLayer: false @@ -275,7 +279,9 @@ Singleton { property int selectedGpuIndex: 0 property var enabledGpuPciIds: [] property bool showSystemTray: true - property bool systemTrayMonochromeIcons: false + property string systemTrayIconTintMode: "none" + property int systemTrayIconTintSaturation: 50 + property int systemTrayIconTintStrength: 135 property bool showClock: true property bool showNotificationButton: true property bool showBattery: true diff --git a/quickshell/Common/Theme.qml b/quickshell/Common/Theme.qml index 91501b61..0ce378d0 100644 --- a/quickshell/Common/Theme.qml +++ b/quickshell/Common/Theme.qml @@ -549,8 +549,8 @@ Singleton { property color success: currentThemeData.success || "#4CAF50" property color primaryHover: Qt.rgba(primary.r, primary.g, primary.b, 0.12) - property color primaryHoverLight: Qt.rgba(primary.r, primary.g, primary.b, 0.08) - property color primaryPressed: Qt.rgba(primary.r, primary.g, primary.b, 0.16) + property color primaryHoverLight: Qt.rgba(primary.r, primary.g, primary.b, transparentBlurLayers ? 0.12 : 0.08) + property color primaryPressed: Qt.rgba(primary.r, primary.g, primary.b, transparentBlurLayers ? 0.24 : 0.16) property color primarySelected: Qt.rgba(primary.r, primary.g, primary.b, 0.3) property color primaryBackground: Qt.rgba(primary.r, primary.g, primary.b, 0.04) @@ -559,17 +559,28 @@ Singleton { property color surfaceHover: Qt.rgba(surfaceVariant.r, surfaceVariant.g, surfaceVariant.b, 0.08) property color surfacePressed: Qt.rgba(surfaceVariant.r, surfaceVariant.g, surfaceVariant.b, 0.12) property color surfaceSelected: Qt.rgba(surfaceVariant.r, surfaceVariant.g, surfaceVariant.b, 0.15) - property color surfaceLight: Qt.rgba(surfaceVariant.r, surfaceVariant.g, surfaceVariant.b, 0.1) + property color surfaceLight: Qt.rgba(surfaceVariant.r, surfaceVariant.g, surfaceVariant.b, transparentBlurLayers ? 0.3 : 0.1) property color surfaceVariantAlpha: Qt.rgba(surfaceVariant.r, surfaceVariant.g, surfaceVariant.b, 0.2) + + readonly property bool blurForegroundLayers: BlurService.enabled && (typeof SettingsData === "undefined" || (SettingsData.blurForegroundLayers ?? true)) + readonly property bool transparentBlurLayers: BlurService.enabled && !blurForegroundLayers + readonly property color readableSurface: withAlpha(surfaceContainer, popupTransparency) + readonly property color readableSurfaceHigh: withAlpha(surfaceContainerHigh, popupTransparency) + readonly property color floatingSurface: transparentBlurLayers ? "transparent" : readableSurface + readonly property color floatingSurfaceHigh: transparentBlurLayers ? "transparent" : readableSurfaceHigh + readonly property color nestedSurface: floatingSurfaceHigh + readonly property real blurLayerOutlineOpacity: Math.max(0, Math.min(1, typeof SettingsData === "undefined" ? 0.12 : (SettingsData.blurLayerOutlineOpacity ?? 0.12))) + readonly property real layerOutlineOpacity: BlurService.enabled ? blurLayerOutlineOpacity : 0.08 + readonly property int layerOutlineWidth: BlurService.enabled && layerOutlineOpacity > 0 ? 1 : 0 property color surfaceTextHover: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.08) property color surfaceTextAlpha: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.3) property color surfaceTextLight: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.06) property color surfaceTextMedium: Qt.rgba(surfaceText.r, surfaceText.g, surfaceText.b, 0.7) property color outlineButton: Qt.rgba(outline.r, outline.g, outline.b, 0.5) - property color outlineLight: Qt.rgba(outline.r, outline.g, outline.b, 0.05) - property color outlineMedium: Qt.rgba(outline.r, outline.g, outline.b, 0.08) - property color outlineStrong: Qt.rgba(outline.r, outline.g, outline.b, 0.12) + property color outlineLight: Qt.rgba(outline.r, outline.g, outline.b, BlurService.enabled ? Math.min(1, layerOutlineOpacity * 0.625) : 0.05) + property color outlineMedium: Qt.rgba(outline.r, outline.g, outline.b, layerOutlineOpacity) + property color outlineStrong: Qt.rgba(outline.r, outline.g, outline.b, BlurService.enabled ? Math.min(1, layerOutlineOpacity * 1.5) : 0.12) property color errorHover: Qt.rgba(error.r, error.g, error.b, 0.12) property color errorPressed: Qt.rgba(error.r, error.g, error.b, 0.16) @@ -587,6 +598,12 @@ Singleton { } } + readonly property color ccTileInactiveBg: transparentBlurLayers ? withAlpha(surfaceContainerHigh, 0.16) : (blurForegroundLayers ? withAlpha(surfaceContainerHigh, Math.min(popupTransparency, 0.24)) : withAlpha(surfaceContainer, popupTransparency)) + readonly property color ccPillInactiveBg: transparentBlurLayers ? withAlpha(surfaceContainerHigh, 0.08) : nestedSurface + readonly property color ccPillInactiveHoverBg: transparentBlurLayers ? withAlpha(primary, 0.10) : primaryPressed + readonly property color ccSliderTrackColor: transparentBlurLayers ? surfaceText : surfaceContainerHigh + readonly property real ccSliderTrackOpacity: transparentBlurLayers ? 0.18 : popupTransparency + readonly property color ccTileActiveText: { switch (SettingsData.controlCenterTileColorMode) { case "primaryContainer": diff --git a/quickshell/Common/settings/SettingsSpec.js b/quickshell/Common/settings/SettingsSpec.js index 5c0c67b4..93a53f50 100644 --- a/quickshell/Common/settings/SettingsSpec.js +++ b/quickshell/Common/settings/SettingsSpec.js @@ -63,9 +63,11 @@ var SPEC = { popoutElevationEnabled: { def: true }, barElevationEnabled: { def: true }, blurEnabled: { def: false }, + blurForegroundLayers: { def: true }, + blurLayerOutlineOpacity: { def: 0.12, coerce: percentToUnit }, blurBorderColor: { def: "outline" }, blurBorderCustomColor: { def: "#ffffff" }, - blurBorderOpacity: { def: 1.0, coerce: percentToUnit }, + blurBorderOpacity: { def: 0.35, coerce: percentToUnit }, wallpaperFillMode: { def: "Fill" }, blurredWallpaperLayer: { def: false }, blurWallpaperOnOverview: { def: false }, @@ -83,7 +85,9 @@ var SPEC = { selectedGpuIndex: { def: 0 }, enabledGpuPciIds: { def: [] }, showSystemTray: { def: true }, - systemTrayMonochromeIcons: { def: false }, + systemTrayIconTintMode: { def: "none" }, + systemTrayIconTintSaturation: { def: 50 }, + systemTrayIconTintStrength: { def: 135 }, showClock: { def: true }, showNotificationButton: { def: true }, showBattery: { def: true }, diff --git a/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml b/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml index f2a457ee..699f0dec 100644 --- a/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml +++ b/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml @@ -53,6 +53,19 @@ QtObject { } } + function togglePinSelected() { + const entries = modal.activeTab === "saved" ? ClipboardService.pinnedEntries : ClipboardService.unpinnedEntries; + if (!entries || entries.length === 0 || ClipboardService.selectedIndex < 0 || ClipboardService.selectedIndex >= entries.length) { + return; + } + const selectedEntry = entries[ClipboardService.selectedIndex]; + if (modal.activeTab === "saved") { + modal.unpinEntry(selectedEntry); + } else { + modal.pinEntry(selectedEntry); + } + } + function handleKey(event) { switch (event.key) { case Qt.Key_Escape: @@ -65,6 +78,12 @@ QtObject { return; case Qt.Key_Down: case Qt.Key_Tab: + if (event.key === Qt.Key_Tab && (event.modifiers & Qt.ControlModifier)) { + modal.activeTab = modal.activeTab === "saved" ? "recents" : "saved"; + ClipboardService.selectedIndex = 0; + event.accepted = true; + return; + } if (!ClipboardService.keyboardNavigationActive) { ClipboardService.keyboardNavigationActive = true; ClipboardService.selectedIndex = 0; @@ -75,6 +94,12 @@ QtObject { return; case Qt.Key_Up: case Qt.Key_Backtab: + if (event.key === Qt.Key_Backtab && (event.modifiers & Qt.ControlModifier)) { + modal.activeTab = modal.activeTab === "saved" ? "recents" : "saved"; + ClipboardService.selectedIndex = 0; + event.accepted = true; + return; + } if (!ClipboardService.keyboardNavigationActive) { ClipboardService.keyboardNavigationActive = true; ClipboardService.selectedIndex = 0; @@ -121,6 +146,12 @@ QtObject { event.accepted = true; } return; + case Qt.Key_S: + if (ClipboardService.keyboardNavigationActive) { + togglePinSelected(); + event.accepted = true; + } + return; } } diff --git a/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml b/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml index 0285952c..1b6725c3 100644 --- a/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml +++ b/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml @@ -9,8 +9,8 @@ Rectangle { property bool enterToPaste: false readonly property string hintsText: { if (!wtypeAvailable) - return I18n.tr("Shift+Del: Clear All • Esc: Close"); - return enterToPaste ? I18n.tr("Shift+Enter: Copy • Shift+Del: Clear All • Esc: Close", "Keyboard hints when enter-to-paste is enabled") : I18n.tr("Shift+Enter: Paste • Shift+Del: Clear All • Esc: Close"); + return I18n.tr("Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close"); + return enterToPaste ? I18n.tr("Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Enter: Copy • Shift+Del: Clear All • Esc: Close", "Keyboard hints when enter-to-paste is enabled") : I18n.tr("Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Enter: Paste • Shift+Del: Clear All • Esc: Close"); } height: ClipboardConstants.keyboardHintsHeight diff --git a/quickshell/Modals/DankLauncherV2/LauncherContextMenu.qml b/quickshell/Modals/DankLauncherV2/LauncherContextMenu.qml index 2d7eef91..5791b0df 100644 --- a/quickshell/Modals/DankLauncherV2/LauncherContextMenu.qml +++ b/quickshell/Modals/DankLauncherV2/LauncherContextMenu.qml @@ -372,7 +372,7 @@ Popup { anchors.fill: parent implicitWidth: Math.max(180, menuColumn.implicitWidth + Theme.spacingS * 2) implicitHeight: menuColumn.implicitHeight + Theme.spacingS * 2 - color: BlurService.enabled ? Theme.surfaceContainer : Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + color: Theme.floatingSurface radius: Theme.cornerRadius border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) border.width: BlurService.enabled ? BlurService.borderWidth : 1 diff --git a/quickshell/Modals/DankLauncherV2/ResultsList.qml b/quickshell/Modals/DankLauncherV2/ResultsList.qml index 53a2d45f..aa360f13 100644 --- a/quickshell/Modals/DankLauncherV2/ResultsList.qml +++ b/quickshell/Modals/DankLauncherV2/ResultsList.qml @@ -58,9 +58,9 @@ Item { item: items[i], flatIndex: flatIdx, sectionId: sectionId, - height: 52 + height: 56 }); - cumY += 52; + cumY += 56; } } else { var cols = root.controller?.getGridColumns(sectionId) ?? root.gridColumns; @@ -190,124 +190,135 @@ Item { } } - DankListView { - id: mainListView + Item { + id: listClip anchors.fill: parent + anchors.topMargin: BlurService.enabled && stickyHeader.visible ? 32 : 0 clip: true - scrollBarTopMargin: (root.controller?.sections?.length > 0) ? 32 : 0 - model: ScriptModel { - values: root._visualRows - objectProp: "_rowId" - } + DankListView { + id: mainListView + y: -listClip.anchors.topMargin + width: parent.width + height: parent.height + listClip.anchors.topMargin + clip: true + scrollBarTopMargin: (root.controller?.sections?.length > 0) ? 32 : 0 - add: null - remove: null - displaced: null - move: null - - delegate: Item { - id: delegateRoot - required property var modelData - required property int index - - width: mainListView.width - height: modelData?.height ?? 52 - - SectionHeader { - anchors.fill: parent - visible: delegateRoot.modelData?.type === "header" - section: delegateRoot.modelData?.section ?? null - controller: root.controller - viewMode: { - var vt = root.controller?.viewModeVersion ?? 0; - void (vt); - return root.controller?.getSectionViewMode(delegateRoot.modelData?.sectionId ?? "") ?? "list"; - } - canChangeViewMode: { - var vt = root.controller?.viewModeVersion ?? 0; - void (vt); - return root.controller?.canChangeSectionViewMode(delegateRoot.modelData?.sectionId ?? "") ?? false; - } - canCollapse: root.controller?.canCollapseSection(delegateRoot.modelData?.sectionId ?? "") ?? false + model: ScriptModel { + values: root._visualRows + objectProp: "_rowId" } - ResultItem { - anchors.fill: parent - visible: delegateRoot.modelData?.type === "list_item" - item: delegateRoot.modelData?.type === "list_item" ? (delegateRoot.modelData?.item ?? null) : null - isSelected: delegateRoot.modelData?.type === "list_item" && (delegateRoot.modelData?.flatIndex ?? -1) === root.controller?.selectedFlatIndex - controller: root.controller - flatIndex: delegateRoot.modelData?.type === "list_item" ? (delegateRoot.modelData?.flatIndex ?? -1) : -1 + add: null + remove: null + displaced: null + move: null - onClicked: { - if (root.controller && delegateRoot.modelData?.item) { - root.controller.executeItem(delegateRoot.modelData.item); + delegate: Item { + id: delegateRoot + required property var modelData + required property int index + + width: mainListView.width + height: modelData?.height ?? 52 + + SectionHeader { + anchors.fill: parent + visible: delegateRoot.modelData?.type === "header" + section: delegateRoot.modelData?.section ?? null + controller: root.controller + viewMode: { + var vt = root.controller?.viewModeVersion ?? 0; + void (vt); + return root.controller?.getSectionViewMode(delegateRoot.modelData?.sectionId ?? "") ?? "list"; + } + canChangeViewMode: { + var vt = root.controller?.viewModeVersion ?? 0; + void (vt); + return root.controller?.canChangeSectionViewMode(delegateRoot.modelData?.sectionId ?? "") ?? false; + } + canCollapse: root.controller?.canCollapseSection(delegateRoot.modelData?.sectionId ?? "") ?? false + } + + ResultItem { + anchors.fill: parent + anchors.topMargin: 2 + anchors.bottomMargin: 2 + visible: delegateRoot.modelData?.type === "list_item" + item: delegateRoot.modelData?.type === "list_item" ? (delegateRoot.modelData?.item ?? null) : null + isSelected: delegateRoot.modelData?.type === "list_item" && (delegateRoot.modelData?.flatIndex ?? -1) === root.controller?.selectedFlatIndex + controller: root.controller + flatIndex: delegateRoot.modelData?.type === "list_item" ? (delegateRoot.modelData?.flatIndex ?? -1) : -1 + + onClicked: { + if (root.controller && delegateRoot.modelData?.item) { + root.controller.executeItem(delegateRoot.modelData.item); + } + } + + onRightClicked: (mouseX, mouseY) => { + root.itemRightClicked(delegateRoot.modelData?.flatIndex ?? -1, delegateRoot.modelData?.item ?? null, mouseX, mouseY); } } - onRightClicked: (mouseX, mouseY) => { - root.itemRightClicked(delegateRoot.modelData?.flatIndex ?? -1, delegateRoot.modelData?.item ?? null, mouseX, mouseY); - } - } + Row { + id: gridRowContent + anchors.fill: parent + visible: delegateRoot.modelData?.type === "grid_row" - Row { - id: gridRowContent - anchors.fill: parent - visible: delegateRoot.modelData?.type === "grid_row" + Repeater { + model: delegateRoot.modelData?.type === "grid_row" ? (delegateRoot.modelData?.items ?? []) : [] - Repeater { - model: delegateRoot.modelData?.type === "grid_row" ? (delegateRoot.modelData?.items ?? []) : [] + Item { + id: gridCellDelegate + required property var modelData + required property int index - Item { - id: gridCellDelegate - required property var modelData - required property int index + readonly property real cellWidth: delegateRoot.modelData?.viewMode === "tile" ? Math.floor(delegateRoot.width / 3) : Math.floor(delegateRoot.width / (delegateRoot.modelData?.cols ?? root.gridColumns)) - readonly property real cellWidth: delegateRoot.modelData?.viewMode === "tile" ? Math.floor(delegateRoot.width / 3) : Math.floor(delegateRoot.width / (delegateRoot.modelData?.cols ?? root.gridColumns)) + width: cellWidth + height: delegateRoot.height - width: cellWidth - height: delegateRoot.height + GridItem { + width: parent.width - 4 + height: parent.height - 4 + anchors.centerIn: parent + visible: delegateRoot.modelData?.viewMode === "grid" + item: gridCellDelegate.modelData?.item ?? null + isSelected: (gridCellDelegate.modelData?.flatIndex ?? -1) === root.controller?.selectedFlatIndex + controller: root.controller + flatIndex: gridCellDelegate.modelData?.flatIndex ?? -1 - GridItem { - width: parent.width - 4 - height: parent.height - 4 - anchors.centerIn: parent - visible: delegateRoot.modelData?.viewMode === "grid" - item: gridCellDelegate.modelData?.item ?? null - isSelected: (gridCellDelegate.modelData?.flatIndex ?? -1) === root.controller?.selectedFlatIndex - controller: root.controller - flatIndex: gridCellDelegate.modelData?.flatIndex ?? -1 + onClicked: { + if (root.controller && gridCellDelegate.modelData?.item) { + root.controller.executeItem(gridCellDelegate.modelData.item); + } + } - onClicked: { - if (root.controller && gridCellDelegate.modelData?.item) { - root.controller.executeItem(gridCellDelegate.modelData.item); + onRightClicked: (mouseX, mouseY) => { + root.itemRightClicked(gridCellDelegate.modelData?.flatIndex ?? -1, gridCellDelegate.modelData?.item ?? null, mouseX, mouseY); } } - onRightClicked: (mouseX, mouseY) => { - root.itemRightClicked(gridCellDelegate.modelData?.flatIndex ?? -1, gridCellDelegate.modelData?.item ?? null, mouseX, mouseY); - } - } + TileItem { + width: parent.width - 4 + height: parent.height - 4 + anchors.centerIn: parent + visible: delegateRoot.modelData?.viewMode === "tile" + item: gridCellDelegate.modelData?.item ?? null + isSelected: (gridCellDelegate.modelData?.flatIndex ?? -1) === root.controller?.selectedFlatIndex + controller: root.controller + flatIndex: gridCellDelegate.modelData?.flatIndex ?? -1 - TileItem { - width: parent.width - 4 - height: parent.height - 4 - anchors.centerIn: parent - visible: delegateRoot.modelData?.viewMode === "tile" - item: gridCellDelegate.modelData?.item ?? null - isSelected: (gridCellDelegate.modelData?.flatIndex ?? -1) === root.controller?.selectedFlatIndex - controller: root.controller - flatIndex: gridCellDelegate.modelData?.flatIndex ?? -1 - - onClicked: { - if (root.controller && gridCellDelegate.modelData?.item) { - root.controller.executeItem(gridCellDelegate.modelData.item); + onClicked: { + if (root.controller && gridCellDelegate.modelData?.item) { + root.controller.executeItem(gridCellDelegate.modelData.item); + } } - } - onRightClicked: (mouseX, mouseY) => { - root.itemRightClicked(gridCellDelegate.modelData?.flatIndex ?? -1, gridCellDelegate.modelData?.item ?? null, mouseX, mouseY); + onRightClicked: (mouseX, mouseY) => { + root.itemRightClicked(gridCellDelegate.modelData?.flatIndex ?? -1, gridCellDelegate.modelData?.item ?? null, mouseX, mouseY); + } } } } @@ -365,7 +376,7 @@ Item { anchors.top: parent.top height: 32 z: 101 - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + color: Theme.floatingSurface visible: stickyHeaderSection !== null readonly property int versionTrigger: root.controller?.viewModeVersion ?? 0 diff --git a/quickshell/Modals/DankLauncherV2/Section.qml b/quickshell/Modals/DankLauncherV2/Section.qml index aba4c2ff..5daea0b1 100644 --- a/quickshell/Modals/DankLauncherV2/Section.qml +++ b/quickshell/Modals/DankLauncherV2/Section.qml @@ -50,7 +50,7 @@ Item { id: listComponent Column { - spacing: 2 + spacing: 4 width: contentLoader.width Repeater { diff --git a/quickshell/Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml b/quickshell/Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml index a2753977..655f8781 100644 --- a/quickshell/Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml +++ b/quickshell/Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml @@ -34,7 +34,9 @@ PluginComponent { id: detailRoot implicitHeight: detailColumn.implicitHeight + Theme.spacingM * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth DankActionButton { anchors.top: parent.top diff --git a/quickshell/Modules/ControlCenter/Components/ActionTile.qml b/quickshell/Modules/ControlCenter/Components/ActionTile.qml index fc422e35..1b1adb0f 100644 --- a/quickshell/Modules/ControlCenter/Components/ActionTile.qml +++ b/quickshell/Modules/ControlCenter/Components/ActionTile.qml @@ -27,12 +27,12 @@ Rectangle { } readonly property color _tileBgActive: Theme.ccTileActiveBg - readonly property color _tileBgInactive: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _tileBgInactive: Theme.ccPillInactiveBg readonly property color _tileRingActive: Theme.ccTileRing color: isActive ? _tileBgActive : _tileBgInactive - border.color: isActive ? _tileRingActive : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: isActive ? 1 : 1 + border.color: isActive ? _tileRingActive : Theme.outlineMedium + border.width: isActive ? 1 : Theme.layerOutlineWidth opacity: enabled ? 1.0 : 0.6 function hoverTint(base) { diff --git a/quickshell/Modules/ControlCenter/Components/DragDropGrid.qml b/quickshell/Modules/ControlCenter/Components/DragDropGrid.qml index 030924bf..72011a0b 100644 --- a/quickshell/Modules/ControlCenter/Components/DragDropGrid.qml +++ b/quickshell/Modules/ControlCenter/Components/DragDropGrid.qml @@ -575,7 +575,8 @@ Column { anchors.centerIn: parent width: parent.width height: 14 - property color sliderTrackColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + sliderTrackColor: Theme.ccSliderTrackColor + sliderTrackOpacity: Theme.ccSliderTrackOpacity } } } @@ -597,7 +598,8 @@ Column { instanceId: widgetData.instanceId || "" screenName: root.screenName parentScreen: root.parentScreen - property color sliderTrackColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + sliderTrackColor: Theme.ccSliderTrackColor + sliderTrackOpacity: Theme.ccSliderTrackOpacity onIconClicked: { if (!root.editMode && DisplayService.devices && DisplayService.devices.length > 1) { @@ -620,7 +622,8 @@ Column { anchors.centerIn: parent width: parent.width height: 14 - property color sliderTrackColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + sliderTrackColor: Theme.ccSliderTrackColor + sliderTrackOpacity: Theme.ccSliderTrackOpacity } } } diff --git a/quickshell/Modules/ControlCenter/Components/EditControls.qml b/quickshell/Modules/ControlCenter/Components/EditControls.qml index 50531aa6..e8534c62 100644 --- a/quickshell/Modules/ControlCenter/Components/EditControls.qml +++ b/quickshell/Modules/ControlCenter/Components/EditControls.qml @@ -1,5 +1,6 @@ import QtQuick -import QtQuick.Controls +import Quickshell +import Quickshell.Wayland import qs.Common import qs.Widgets @@ -10,7 +11,11 @@ Row { LayoutMirroring.childrenInherit: true property var availableWidgets: [] - property Item popoutContent: null + property var popupScreen: null + property real popoutX: 0 + property real popoutY: 0 + property real popoutWidth: 0 + property real popoutHeight: 0 signal addWidget(string widgetId) signal resetToDefault @@ -19,121 +24,190 @@ Row { height: 48 spacing: Theme.spacingS - onAddWidget: addWidgetPopup.close() + function openWidgetLibrary() { + if (popupScreen) + addWidgetWindow.screen = popupScreen; + addWidgetWindow.visible = true; + } - Popup { - id: addWidgetPopup - parent: popoutContent - x: parent ? Math.round((parent.width - width) / 2) : 0 - y: parent ? Math.round((parent.height - height) / 2) : 0 - width: 400 - height: 300 - modal: false - focus: true - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + function closeWidgetLibrary() { + addWidgetWindow.visible = false; + } - background: Rectangle { - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) - border.color: Theme.primarySelected - border.width: 0 - radius: Theme.cornerRadius + onAddWidget: closeWidgetLibrary() + onVisibleChanged: { + if (!visible) + closeWidgetLibrary(); + } + + PanelWindow { + id: addWidgetWindow + + screen: root.popupScreen + visible: false + color: "transparent" + + WlrLayershell.namespace: "dms:control-center-widget-library" + WlrLayershell.layer: WlrLayershell.Overlay + WlrLayershell.exclusiveZone: -1 + WlrLayershell.keyboardFocus: visible ? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None + + anchors { + top: true + left: true + right: true + bottom: true } - contentItem: Item { + readonly property bool blurActive: Theme.blurForegroundLayers || Theme.transparentBlurLayers + readonly property real surfaceAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.24 : 0.72) : Theme.popupTransparency + readonly property real rowAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.10 : 0.52) : Theme.popupTransparency + readonly property int panelWidth: 400 + readonly property int panelHeight: 300 + + WindowBlur { + targetWindow: addWidgetWindow + blurX: widgetLibraryPanel.x + blurY: widgetLibraryPanel.y + blurWidth: addWidgetWindow.visible ? widgetLibraryPanel.width : 0 + blurHeight: addWidgetWindow.visible ? widgetLibraryPanel.height : 0 + blurRadius: Theme.cornerRadius + } + + MouseArea { anchors.fill: parent - anchors.margins: Theme.spacingL + acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton + onClicked: root.closeWidgetLibrary() + } - Row { - id: headerRow - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - spacing: Theme.spacingM + FocusScope { + anchors.fill: parent + focus: addWidgetWindow.visible - DankIcon { - name: "add_circle" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } + Keys.onEscapePressed: event => { + root.closeWidgetLibrary(); + event.accepted = true; + } + } - Typography { - text: I18n.tr("Add Widget") - style: Typography.Style.Subtitle - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } + Rectangle { + id: widgetLibraryPanel + + width: addWidgetWindow.panelWidth + height: addWidgetWindow.panelHeight + x: Math.round((root.popoutWidth > 0 ? root.popoutX + (root.popoutWidth - width) / 2 : (addWidgetWindow.width - width) / 2)) + y: Math.round((root.popoutHeight > 0 ? root.popoutY + (root.popoutHeight - height) / 2 : (addWidgetWindow.height - height) / 2)) + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainer, addWidgetWindow.surfaceAlpha) + border.color: addWidgetWindow.blurActive ? Theme.outlineMedium : Theme.primarySelected + border.width: addWidgetWindow.blurActive ? Theme.layerOutlineWidth : 0 + antialiasing: true + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton + onClicked: mouse => mouse.accepted = true } - DankListView { - anchors.top: headerRow.bottom - anchors.topMargin: Theme.spacingM - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - spacing: Theme.spacingS - clip: true - model: root.availableWidgets + Item { + anchors.fill: parent + anchors.margins: Theme.spacingL - delegate: Rectangle { - width: 400 - Theme.spacingL * 2 - height: 50 - radius: Theme.cornerRadius - color: widgetMouseArea.containsMouse ? Theme.primaryHover : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + Row { + id: headerRow + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + spacing: Theme.spacingM - Row { - anchors.fill: parent - anchors.margins: Theme.spacingM - spacing: Theme.spacingM - - DankIcon { - name: modelData.icon - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - anchors.verticalCenter: parent.verticalCenter - spacing: 2 - width: 400 - Theme.spacingL * 2 - Theme.iconSize - Theme.spacingM * 3 - Theme.iconSize - - Typography { - text: modelData.text - style: Typography.Style.Body - color: Theme.surfaceText - elide: Text.ElideRight - width: parent.width - horizontalAlignment: Text.AlignLeft - } - - Typography { - text: modelData.description - style: Typography.Style.Caption - color: Theme.outline - elide: Text.ElideRight - width: parent.width - horizontalAlignment: Text.AlignLeft - } - } - - DankIcon { - name: "add" - size: Theme.iconSize - 4 - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } + DankIcon { + name: "add_circle" + size: Theme.iconSize + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter } - MouseArea { - id: widgetMouseArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - root.addWidget(modelData.id); + Typography { + text: I18n.tr("Add Widget") + style: Typography.Style.Subtitle + color: Theme.surfaceText + anchors.verticalCenter: parent.verticalCenter + } + } + + DankListView { + id: widgetList + + anchors.top: headerRow.bottom + anchors.topMargin: Theme.spacingM + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + spacing: Theme.spacingS + clip: true + model: root.availableWidgets + + delegate: Rectangle { + width: widgetList.width + height: 50 + radius: Theme.cornerRadius + color: widgetMouseArea.containsMouse ? Theme.withAlpha(Theme.primary, addWidgetWindow.blurActive ? 0.12 : 0.08) : Theme.withAlpha(Theme.surfaceContainerHigh, addWidgetWindow.rowAlpha) + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth + antialiasing: true + + Row { + anchors.fill: parent + anchors.margins: Theme.spacingM + spacing: Theme.spacingM + + DankIcon { + name: modelData.icon + size: Theme.iconSize + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + + Column { + anchors.verticalCenter: parent.verticalCenter + spacing: 2 + width: parent.width - Theme.iconSize * 2 - Theme.spacingM * 3 + + Typography { + text: modelData.text + style: Typography.Style.Body + color: Theme.surfaceText + elide: Text.ElideRight + width: parent.width + horizontalAlignment: Text.AlignLeft + } + + Typography { + text: modelData.description + style: Typography.Style.Caption + color: Theme.outline + elide: Text.ElideRight + width: parent.width + horizontalAlignment: Text.AlignLeft + } + } + + DankIcon { + name: "add" + size: Theme.iconSize - 4 + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + } + + MouseArea { + id: widgetMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: { + root.addWidget(modelData.id); + } } } } @@ -171,7 +245,7 @@ Row { MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: addWidgetPopup.open() + onClicked: root.openWidgetLibrary() } } diff --git a/quickshell/Modules/ControlCenter/Components/HeaderPane.qml b/quickshell/Modules/ControlCenter/Components/HeaderPane.qml index d36c5b6a..68e5c949 100644 --- a/quickshell/Modules/ControlCenter/Components/HeaderPane.qml +++ b/quickshell/Modules/ControlCenter/Components/HeaderPane.qml @@ -21,9 +21,9 @@ Rectangle { implicitHeight: 70 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth Row { anchors.left: parent.left diff --git a/quickshell/Modules/ControlCenter/ControlCenterPopout.qml b/quickshell/Modules/ControlCenter/ControlCenterPopout.qml index 6e13bb12..62836183 100644 --- a/quickshell/Modules/ControlCenter/ControlCenterPopout.qml +++ b/quickshell/Modules/ControlCenter/ControlCenterPopout.qml @@ -75,7 +75,7 @@ DankPopout { } } - readonly property color _containerBg: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _containerBg: Theme.nestedSurface function openWithSection(section) { StateUtils.openWithSection(root, section); @@ -286,7 +286,11 @@ DankPopout { id: editControls width: parent.width visible: editMode - popoutContent: controlContent + popupScreen: root.screen + popoutX: root.alignedX + popoutY: root.alignedY + popoutWidth: root.alignedWidth + popoutHeight: root.alignedHeight availableWidgets: { if (!editMode) return []; @@ -294,9 +298,6 @@ DankPopout { const allWidgets = widgetModel.baseWidgetDefinitions.concat(widgetModel.getPluginWidgets()); return allWidgets.filter(w => w.allowMultiple || !existingIds.includes(w.id)); } - onAddWidget: widgetId => widgetModel.addWidget(widgetId) - onResetToDefault: () => widgetModel.resetToDefault() - onClearAll: () => widgetModel.clearAll() } } } diff --git a/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml b/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml index 25f3a9e3..698d82a0 100644 --- a/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/AudioInputDetail.qml @@ -18,9 +18,9 @@ Rectangle { implicitHeight: headerRow.height + (hasInputVolumeSliderInCC ? 0 : volumeSlider.height) + audioContent.height + Theme.spacingM radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth Row { id: headerRow @@ -123,6 +123,8 @@ Rectangle { unit: "%" valueOverride: actualVolumePercent thumbOutlineColor: Theme.surfaceVariant + trackColor: Theme.ccSliderTrackColor + trackOpacity: Theme.ccSliderTrackOpacity onSliderValueChanged: function (newValue) { if (AudioService.source && AudioService.source.audio) { diff --git a/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml b/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml index 95d862d8..334bad94 100644 --- a/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/AudioOutputDetail.qml @@ -18,9 +18,9 @@ Rectangle { implicitHeight: headerRow.height + (!hasVolumeSliderInCC ? volumeSlider.height : 0) + audioContent.height + Theme.spacingM radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth Row { id: headerRow @@ -132,6 +132,8 @@ Rectangle { unit: "%" valueOverride: actualVolumePercent thumbOutlineColor: Theme.surfaceVariant + trackColor: Theme.ccSliderTrackColor + trackOpacity: Theme.ccSliderTrackOpacity onSliderValueChanged: function (newValue) { if (AudioService.sink && AudioService.sink.audio) { @@ -448,6 +450,7 @@ Rectangle { Item { id: appVolumeRow property color sliderTrackColor: "transparent" + property real sliderTrackOpacity: Theme.ccSliderTrackOpacity anchors.centerIn: parent height: 40 @@ -519,7 +522,8 @@ Rectangle { unit: "%" valueOverride: actualVolumePercent thumbOutlineColor: Theme.surfaceContainer - trackColor: appVolumeRow.sliderTrackColor.a > 0 ? appVolumeRow.sliderTrackColor : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + trackColor: appVolumeRow.sliderTrackColor.a > 0 ? appVolumeRow.sliderTrackColor : Theme.ccSliderTrackColor + trackOpacity: appVolumeRow.sliderTrackOpacity onSliderValueChanged: function (newValue) { if (modelData) { diff --git a/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml b/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml index 1f0206a9..a6cfe521 100644 --- a/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/BatteryDetail.qml @@ -12,9 +12,9 @@ Rectangle { implicitHeight: contentColumn.implicitHeight + Theme.spacingL * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth function isActiveProfile(profile) { if (typeof PowerProfiles === "undefined") { diff --git a/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml b/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml index 0cad08c0..5d9e4313 100644 --- a/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml +++ b/quickshell/Modules/ControlCenter/Details/BluetoothCodecSelector.qml @@ -153,9 +153,9 @@ Item { width: 320 height: contentColumn.implicitHeight + Theme.spacingL * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.floatingSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth opacity: modalVisible ? 1 : 0 scale: modalVisible ? 1 : 0.9 diff --git a/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml b/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml index 580ea9f1..3cd2da2d 100644 --- a/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/BluetoothDetail.qml @@ -20,9 +20,9 @@ Rectangle { return headerRow.height + bluetoothContent.height + Theme.spacingM; } radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth property var bluetoothCodecModalRef: null property var devicesBeingPaired: new Set() @@ -115,7 +115,7 @@ Rectangle { height: 36 radius: 18 color: scanMouseArea.containsMouse && adapterEnabled ? Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) : "transparent" - border.color: adapterEnabled ? Theme.primary : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) + border.color: adapterEnabled ? Theme.primary : Theme.outlineStrong border.width: 0 visible: adapterEnabled @@ -434,7 +434,7 @@ Rectangle { Rectangle { width: parent.width height: 1 - color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) + color: Theme.outlineStrong visible: pairedRepeater.count > 0 && availableRepeater.count > 0 } @@ -609,7 +609,7 @@ Rectangle { color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) radius: Theme.cornerRadius border.width: 0 - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) + border.color: Theme.outlineStrong } MenuItem { diff --git a/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml b/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml index 0d42e627..ad346c4f 100644 --- a/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/BrightnessDetail.qml @@ -106,9 +106,9 @@ Rectangle { return brightnessContent.height + Theme.spacingM; } radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth DankFlickable { id: brightnessContent diff --git a/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml b/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml index 90fbf9d1..b8009ae9 100644 --- a/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/DiskUsageDetail.qml @@ -16,9 +16,9 @@ Rectangle { implicitHeight: diskContent.height + Theme.spacingM radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth Component.onCompleted: { DgopService.addRef(["diskmounts"]); diff --git a/quickshell/Modules/ControlCenter/Details/DoNotDisturbDetail.qml b/quickshell/Modules/ControlCenter/Details/DoNotDisturbDetail.qml index c3c17417..12c51c9b 100644 --- a/quickshell/Modules/ControlCenter/Details/DoNotDisturbDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/DoNotDisturbDetail.qml @@ -10,9 +10,9 @@ Rectangle { implicitHeight: contentColumn.implicitHeight + Theme.spacingL * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth property real nowMs: Date.now() @@ -149,8 +149,8 @@ Rectangle { width: (contentColumn.width - Theme.spacingS * 2) / 3 height: 36 radius: Theme.cornerRadius - color: presetArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.16) : Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) + color: presetArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.16) : Theme.floatingSurface + border.color: Theme.outlineStrong border.width: 1 StyledText { @@ -183,8 +183,8 @@ Rectangle { width: (contentColumn.width - Theme.spacingS) / 2 height: 36 radius: Theme.cornerRadius - color: foreverArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.16) : Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) + color: foreverArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.16) : Theme.floatingSurface + border.color: Theme.outlineStrong border.width: 1 Row { @@ -221,8 +221,8 @@ Rectangle { height: 36 radius: Theme.cornerRadius visible: SessionData.doNotDisturb - color: offArea.containsMouse ? Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.18) : Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) + color: offArea.containsMouse ? Qt.rgba(Theme.error.r, Theme.error.g, Theme.error.b, 0.18) : Theme.floatingSurface + border.color: Theme.outlineStrong border.width: 1 Row { diff --git a/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml b/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml index 5f1738ae..3814343c 100644 --- a/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml +++ b/quickshell/Modules/ControlCenter/Details/NetworkDetail.qml @@ -22,9 +22,9 @@ Rectangle { return headerRow.height + wifiOffContent.height + Theme.spacingM; } radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth Component.onCompleted: { NetworkService.addRef(); diff --git a/quickshell/Modules/ControlCenter/Widgets/AudioSliderRow.qml b/quickshell/Modules/ControlCenter/Widgets/AudioSliderRow.qml index c53c06b6..9632a681 100644 --- a/quickshell/Modules/ControlCenter/Widgets/AudioSliderRow.qml +++ b/quickshell/Modules/ControlCenter/Widgets/AudioSliderRow.qml @@ -11,6 +11,7 @@ Row { property var defaultSink: AudioService.sink property color sliderTrackColor: "transparent" + property real sliderTrackOpacity: Theme.ccSliderTrackOpacity height: 40 spacing: 0 @@ -80,7 +81,8 @@ Row { unit: "%" valueOverride: actualVolumePercent thumbOutlineColor: Theme.surfaceContainer - trackColor: root.sliderTrackColor.a > 0 ? root.sliderTrackColor : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + trackColor: root.sliderTrackColor.a > 0 ? root.sliderTrackColor : Theme.ccSliderTrackColor + trackOpacity: root.sliderTrackOpacity onSliderValueChanged: function (newValue) { if (defaultSink?.audio) { diff --git a/quickshell/Modules/ControlCenter/Widgets/BrightnessSliderRow.qml b/quickshell/Modules/ControlCenter/Widgets/BrightnessSliderRow.qml index 037c08f9..f2921234 100644 --- a/quickshell/Modules/ControlCenter/Widgets/BrightnessSliderRow.qml +++ b/quickshell/Modules/ControlCenter/Widgets/BrightnessSliderRow.qml @@ -13,6 +13,8 @@ Row { property string instanceId: "" property string screenName: "" property var parentScreen: null + property color sliderTrackColor: "transparent" + property real sliderTrackOpacity: Theme.ccSliderTrackOpacity signal iconClicked @@ -184,7 +186,8 @@ Row { } } thumbOutlineColor: Theme.surfaceContainer - trackColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + trackColor: root.sliderTrackColor.a > 0 ? root.sliderTrackColor : Theme.ccSliderTrackColor + trackOpacity: root.sliderTrackOpacity Binding on value { value: root.targetBrightness diff --git a/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml b/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml index f11982b5..405e5392 100644 --- a/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml +++ b/quickshell/Modules/ControlCenter/Widgets/CompactSlider.qml @@ -20,9 +20,9 @@ Rectangle { width: parent ? parent.width : 200 height: 60 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth opacity: enabled ? 1.0 : 0.6 Row { @@ -64,6 +64,8 @@ Rectangle { minimum: Math.round(root.minimumValue * 100) maximum: Math.round(root.maximumValue * 100) value: Math.round(root.value * 100) + trackColor: Theme.ccSliderTrackColor + trackOpacity: Theme.ccSliderTrackOpacity onSliderValueChanged: root.sliderValueChanged(newValue / 100.0) } } diff --git a/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml b/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml index 9165ec42..74679cc8 100644 --- a/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml +++ b/quickshell/Modules/ControlCenter/Widgets/CompoundPill.qml @@ -29,23 +29,21 @@ Rectangle { return Theme.isLightMode ? Qt.darker(base, factor) : Qt.lighter(base, factor); } - readonly property color _containerBg: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _containerBg: Theme.ccPillInactiveBg color: { - const baseColor = bodyMouse.containsMouse ? Theme.primaryPressed : _containerBg; + const baseColor = bodyMouse.containsMouse ? Theme.ccPillInactiveHoverBg : _containerBg; return baseColor; } - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.10) - border.width: 0 + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth antialiasing: true readonly property color _labelPrimary: Theme.surfaceText readonly property color _labelSecondary: Theme.surfaceVariantText readonly property color _tileBgActive: Theme.ccTileActiveBg readonly property color _tileBgInactive: { - const transparency = Theme.popupTransparency; - const surface = Theme.surfaceContainer || Qt.rgba(0.1, 0.1, 0.1, 1); - return Qt.rgba(surface.r, surface.g, surface.b, transparency); + return Theme.ccTileInactiveBg; } readonly property color _tileRingActive: Theme.ccTileRing readonly property color _tileRingInactive: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.18) @@ -92,8 +90,8 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter radius: _tileRadius color: isActive ? _tileBgActive : _tileBgInactive - border.color: isActive ? _tileRingActive : "transparent" - border.width: isActive ? 1 : 0 + border.color: isActive ? _tileRingActive : Theme.outlineMedium + border.width: isActive ? 1 : Theme.layerOutlineWidth antialiasing: true Rectangle { diff --git a/quickshell/Modules/ControlCenter/Widgets/InputAudioSliderRow.qml b/quickshell/Modules/ControlCenter/Widgets/InputAudioSliderRow.qml index 5c631bcd..fdc9fbbb 100644 --- a/quickshell/Modules/ControlCenter/Widgets/InputAudioSliderRow.qml +++ b/quickshell/Modules/ControlCenter/Widgets/InputAudioSliderRow.qml @@ -11,6 +11,7 @@ Row { property var defaultSource: AudioService.source property color sliderTrackColor: "transparent" + property real sliderTrackOpacity: Theme.ccSliderTrackOpacity height: 40 spacing: 0 @@ -73,7 +74,8 @@ Row { unit: "%" valueOverride: actualVolumePercent thumbOutlineColor: Theme.surfaceContainer - trackColor: root.sliderTrackColor.a > 0 ? root.sliderTrackColor : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + trackColor: root.sliderTrackColor.a > 0 ? root.sliderTrackColor : Theme.ccSliderTrackColor + trackOpacity: root.sliderTrackOpacity onSliderValueChanged: function (newValue) { if (defaultSource?.audio) { SessionData.suppressOSDTemporarily(); diff --git a/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml b/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml index 6daf7fe7..4ad45fb6 100644 --- a/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml +++ b/quickshell/Modules/ControlCenter/Widgets/SmallBatteryButton.qml @@ -28,7 +28,7 @@ Rectangle { } readonly property color _tileBgActive: Theme.ccTileActiveBg - readonly property color _tileBgInactive: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _tileBgInactive: Theme.ccPillInactiveBg readonly property color _tileRingActive: Theme.ccTileRing readonly property color _tileIconActive: Theme.ccTileActiveText readonly property color _tileIconInactive: Theme.ccTileInactiveIcon @@ -36,11 +36,11 @@ Rectangle { color: { if (isActive) return _tileBgActive; - const baseColor = mouseArea.containsMouse ? Theme.primaryPressed : _tileBgInactive; + const baseColor = mouseArea.containsMouse ? Theme.ccPillInactiveHoverBg : _tileBgInactive; return baseColor; } - border.color: isActive ? _tileRingActive : "transparent" - border.width: isActive ? 1 : 0 + border.color: isActive ? _tileRingActive : Theme.outlineMedium + border.width: isActive ? 1 : Theme.layerOutlineWidth antialiasing: true opacity: enabled ? 1.0 : 0.6 diff --git a/quickshell/Modules/ControlCenter/Widgets/SmallDiskUsageButton.qml b/quickshell/Modules/ControlCenter/Widgets/SmallDiskUsageButton.qml index 77d975eb..06e52755 100644 --- a/quickshell/Modules/ControlCenter/Widgets/SmallDiskUsageButton.qml +++ b/quickshell/Modules/ControlCenter/Widgets/SmallDiskUsageButton.qml @@ -38,11 +38,11 @@ Rectangle { return Theme.isLightMode ? Qt.darker(base, factor) : Qt.lighter(base, factor); } - readonly property color _tileBg: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _tileBg: Theme.ccPillInactiveBg - color: mouseArea.containsMouse ? Theme.primaryPressed : _tileBg - border.color: "transparent" - border.width: 0 + color: mouseArea.containsMouse ? Theme.ccPillInactiveHoverBg : _tileBg + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth antialiasing: true opacity: enabled ? 1.0 : 0.6 diff --git a/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml b/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml index 7d8c089b..7ea5a3bb 100644 --- a/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml +++ b/quickshell/Modules/ControlCenter/Widgets/SmallToggleButton.qml @@ -26,7 +26,7 @@ Rectangle { } readonly property color _tileBgActive: Theme.ccTileActiveBg - readonly property color _tileBgInactive: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _tileBgInactive: Theme.ccPillInactiveBg readonly property color _tileRingActive: Theme.ccTileRing readonly property color _tileIconActive: Theme.ccTileActiveText readonly property color _tileIconInactive: Theme.ccTileInactiveIcon @@ -34,11 +34,11 @@ Rectangle { color: { if (isActive) return _tileBgActive; - const baseColor = mouseArea.containsMouse ? Theme.primaryPressed : _tileBgInactive; + const baseColor = mouseArea.containsMouse ? Theme.ccPillInactiveHoverBg : _tileBgInactive; return baseColor; } - border.color: isActive ? _tileRingActive : "transparent" - border.width: isActive ? 1 : 0 + border.color: isActive ? _tileRingActive : Theme.outlineMedium + border.width: isActive ? 1 : Theme.layerOutlineWidth antialiasing: true opacity: enabled ? 1.0 : 0.6 diff --git a/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml b/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml index afac6319..fbd8709a 100644 --- a/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml +++ b/quickshell/Modules/ControlCenter/Widgets/ToggleButton.qml @@ -26,17 +26,17 @@ Rectangle { } readonly property color _tileBgActive: Theme.ccTileActiveBg - readonly property color _tileBgInactive: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _tileBgInactive: Theme.ccPillInactiveBg readonly property color _tileRingActive: Theme.ccTileRing color: { if (isActive) return _tileBgActive; - const baseColor = mouseArea.containsMouse ? Theme.primaryPressed : _tileBgInactive; + const baseColor = mouseArea.containsMouse ? Theme.ccPillInactiveHoverBg : _tileBgInactive; return baseColor; } - border.color: isActive ? _tileRingActive : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) - border.width: 0 + border.color: isActive ? _tileRingActive : Theme.outlineMedium + border.width: isActive ? 1 : Theme.layerOutlineWidth opacity: enabled ? 1.0 : 0.6 function hoverTint(base) { @@ -44,7 +44,7 @@ Rectangle { return Theme.isLightMode ? Qt.darker(base, factor) : Qt.lighter(base, factor); } - readonly property color _containerBg: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + readonly property color _containerBg: Theme.ccPillInactiveBg Rectangle { anchors.fill: parent diff --git a/quickshell/Modules/DankBar/BarCanvas.qml b/quickshell/Modules/DankBar/BarCanvas.qml index 19539c4d..04d6feb7 100644 --- a/quickshell/Modules/DankBar/BarCanvas.qml +++ b/quickshell/Modules/DankBar/BarCanvas.qml @@ -59,7 +59,7 @@ Item { // M3 elevation shadow — Level 2 baseline (navigation bar), with per-bar override support readonly property bool hasPerBarOverride: (barConfig?.shadowIntensity ?? 0) > 0 readonly property var elevLevel: Theme.elevationLevel2 - readonly property bool shadowEnabled: (Theme.elevationEnabled && (typeof SettingsData !== "undefined" ? (SettingsData.barElevationEnabled ?? true) : false)) || hasPerBarOverride + readonly property bool shadowEnabled: !BlurService.enabled && ((Theme.elevationEnabled && (typeof SettingsData !== "undefined" ? (SettingsData.barElevationEnabled ?? true) : false)) || hasPerBarOverride) readonly property string autoBarShadowDirection: isTop ? "top" : (isBottom ? "bottom" : (isLeft ? "left" : (isRight ? "right" : "top"))) readonly property string globalShadowDirection: Theme.elevationLightDirection === "autoBar" ? autoBarShadowDirection : Theme.elevationLightDirection readonly property string perBarShadowDirectionMode: barConfig?.shadowDirectionMode ?? "inherit" diff --git a/quickshell/Modules/DankBar/Popouts/BatteryPopout.qml b/quickshell/Modules/DankBar/Popouts/BatteryPopout.qml index f0cb9d84..dd1d593b 100644 --- a/quickshell/Modules/DankBar/Popouts/BatteryPopout.qml +++ b/quickshell/Modules/DankBar/Popouts/BatteryPopout.qml @@ -287,7 +287,7 @@ DankPopout { width: (parent.width - Theme.spacingM) / 2 height: 64 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface border.width: 0 Column { @@ -322,7 +322,7 @@ DankPopout { width: (parent.width - Theme.spacingM) / 2 height: 64 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface border.width: 0 Column { @@ -373,7 +373,7 @@ DankPopout { width: parent.width height: batteryColumn.implicitHeight + Theme.spacingM * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + color: Theme.nestedSurface border.width: 0 Column { @@ -443,7 +443,7 @@ DankPopout { width: (parent.width - Theme.spacingS * 2) / 3 height: 48 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface border.width: 0 Column { @@ -480,7 +480,7 @@ DankPopout { width: (parent.width - Theme.spacingS * 2) / 3 height: 48 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface border.width: 0 Column { @@ -509,7 +509,7 @@ DankPopout { width: (parent.width - Theme.spacingS * 2) / 3 height: 48 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface border.width: 0 Column { diff --git a/quickshell/Modules/DankBar/Widgets/AppsDockContextMenu.qml b/quickshell/Modules/DankBar/Widgets/AppsDockContextMenu.qml index eb73da3b..bc905841 100644 --- a/quickshell/Modules/DankBar/Widgets/AppsDockContextMenu.qml +++ b/quickshell/Modules/DankBar/Widgets/AppsDockContextMenu.qml @@ -119,7 +119,7 @@ PanelWindow { width: Math.min(400, Math.max(180, menuColumn.implicitWidth + Theme.spacingS * 2)) height: Math.max(60, menuColumn.implicitHeight + Theme.spacingS * 2) - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + color: Theme.floatingSurface radius: Theme.cornerRadius border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) border.width: BlurService.enabled ? BlurService.borderWidth : 1 diff --git a/quickshell/Modules/DankBar/Widgets/FocusedApp.qml b/quickshell/Modules/DankBar/Widgets/FocusedApp.qml index a4ad4d2e..575cb66a 100644 --- a/quickshell/Modules/DankBar/Widgets/FocusedApp.qml +++ b/quickshell/Modules/DankBar/Widgets/FocusedApp.qml @@ -42,19 +42,26 @@ BasePill { const active = ToplevelManager.activeToplevel; if (!active) { - // Only clear if our tracked window is no longer alive if (activeWindow) { - const alive = ToplevelManager.toplevels?.values; - if (alive && !Array.from(alive).some(t => t === activeWindow)) - activeWindow = null; + if (CompositorService.isNiri) { + if (NiriService.currentOutput === (parentScreen?.name ?? "")) + activeWindow = null; + } else { + const alive = ToplevelManager.toplevels?.values; + if (alive && !Array.from(alive).some(t => t === activeWindow)) + activeWindow = null; + } } return; } if (!parentScreen || CompositorService.filterCurrentDisplay([active], parentScreen?.name)?.length > 0) { activeWindow = active; + } else if (activeWindow) { + const alive = ToplevelManager.toplevels?.values; + if (alive && !Array.from(alive).some(t => t === activeWindow)) + activeWindow = null; } - // else: active window is on a different screen so keep the previous value } Component.onCompleted: { @@ -65,7 +72,8 @@ BasePill { Connections { target: ToplevelManager function onActiveToplevelChanged() { - root.updateActiveWindow(); + if (!CompositorService.isNiri) + root.updateActiveWindow(); } } @@ -76,6 +84,16 @@ BasePill { } } + Connections { + target: CompositorService.isNiri ? NiriService : null + function onWindowsChanged() { + root.updateActiveWindow(); + } + function onCurrentOutputChanged() { + root.updateActiveWindow(); + } + } + Connections { target: DesktopEntries function onApplicationsChanged() { @@ -107,21 +125,17 @@ BasePill { } readonly property bool hasWindowsOnCurrentWorkspace: { if (CompositorService.isNiri) { - let currentWorkspaceId = null; - for (var i = 0; i < NiriService.allWorkspaces.length; i++) { - const ws = NiriService.allWorkspaces[i]; - if (ws.is_focused) { - currentWorkspaceId = ws.id; - break; - } - } - - if (!currentWorkspaceId) { + if (!activeWindow || !(activeWindow.title || activeWindow.appId)) return false; - } - - const workspaceWindows = NiriService.windows.filter(w => w.workspace_id === currentWorkspaceId); - return workspaceWindows.length > 0 && activeWindow && (activeWindow.title || activeWindow.appId); + if (NiriService.currentOutput !== (parentScreen?.name ?? "")) + return true; + const focusedWin = NiriService.windows.find(w => w.is_focused); + if (!focusedWin) + return false; + const screenWsIds = new Set( + NiriService.allWorkspaces.filter(ws => ws.output === parentScreen.name).map(ws => ws.id) + ); + return screenWsIds.has(focusedWin.workspace_id); } if (CompositorService.isHyprland) { diff --git a/quickshell/Modules/DankBar/Widgets/SystemTrayBar.qml b/quickshell/Modules/DankBar/Widgets/SystemTrayBar.qml index 12b9b5fd..63ea0fee 100644 --- a/quickshell/Modules/DankBar/Widgets/SystemTrayBar.qml +++ b/quickshell/Modules/DankBar/Widgets/SystemTrayBar.qml @@ -152,6 +152,59 @@ BasePill { item: item })) readonly property var hiddenBarItems: allSortedTrayItems.filter(item => SessionData.isHiddenTrayId(root.getTrayItemKey(item))) + readonly property string trayIconTintMode: { + const configuredMode = SettingsData.systemTrayIconTintMode || "none"; + switch (configuredMode) { + case "monochrome": + case "primary": + case "secondary": + return configuredMode; + default: + return "none"; + } + } + readonly property bool trayIconTintEnabled: trayIconTintMode !== "none" + readonly property real trayIconTintSaturationAmount: { + const raw = SettingsData.systemTrayIconTintSaturation; + const value = (raw === undefined || raw === null) ? 50 : raw; + return Math.max(0, Math.min(100, value)) / 100; + } + readonly property real trayIconTintStrengthAmount: { + const raw = SettingsData.systemTrayIconTintStrength; + const value = (raw === undefined || raw === null) ? 135 : raw; + return Math.max(0, Math.min(200, value)) / 100; + } + readonly property real trayIconSaturation: { + switch (trayIconTintMode) { + case "monochrome": + return -1; + case "primary": + case "secondary": + return -root.trayIconTintSaturationAmount; + default: + return 0; + } + } + readonly property real trayIconColorization: { + switch (trayIconTintMode) { + case "primary": + case "secondary": + return root.trayIconTintStrengthAmount; + default: + return 0; + } + } + readonly property color trayIconTintColor: { + switch (trayIconTintMode) { + case "primary": + return Theme.primary; + case "secondary": + return Theme.secondary; + default: + return Theme.surfaceText; + } + } + readonly property bool reverseInlineHorizontal: !useOverflowPopup && !isVerticalOrientation && section === "right" readonly property bool reverseInlineVertical: !useOverflowPopup && isVerticalOrientation && section === "right" readonly property var displayedMainBarItems: reverseInlineHorizontal ? [...mainBarItems].reverse() : mainBarItems @@ -367,9 +420,11 @@ BasePill { smooth: true mipmap: true visible: status === Image.Ready - layer.enabled: SettingsData.systemTrayMonochromeIcons + layer.enabled: root.trayIconTintEnabled layer.effect: MultiEffect { - saturation: -1 + saturation: root.trayIconSaturation + colorization: root.trayIconColorization + colorizationColor: root.trayIconTintColor } } @@ -586,9 +641,11 @@ BasePill { smooth: true mipmap: true visible: status === Image.Ready - layer.enabled: SettingsData.systemTrayMonochromeIcons + layer.enabled: root.trayIconTintEnabled layer.effect: MultiEffect { - saturation: -1 + saturation: root.trayIconSaturation + colorization: root.trayIconColorization + colorizationColor: root.trayIconTintColor } } @@ -718,9 +775,11 @@ BasePill { smooth: true mipmap: true visible: status === Image.Ready - layer.enabled: SettingsData.systemTrayMonochromeIcons + layer.enabled: root.trayIconTintEnabled layer.effect: MultiEffect { - saturation: -1 + saturation: root.trayIconSaturation + colorization: root.trayIconColorization + colorizationColor: root.trayIconTintColor } } @@ -1178,7 +1237,7 @@ BasePill { targetRadius: Theme.cornerRadius sourceRect.antialiasing: true sourceRect.smooth: true - shadowEnabled: Theme.elevationEnabled && SettingsData.popoutElevationEnabled + shadowEnabled: Theme.elevationEnabled && SettingsData.popoutElevationEnabled && !BlurService.enabled layer.smooth: true layer.textureSize: Qt.size(Math.round(width * overflowMenu.dpr * 2), Math.round(height * overflowMenu.dpr * 2)) layer.textureMirroring: ShaderEffectSource.MirrorVertically @@ -1223,9 +1282,11 @@ BasePill { smooth: true mipmap: true visible: status === Image.Ready - layer.enabled: SettingsData.systemTrayMonochromeIcons + layer.enabled: root.trayIconTintEnabled layer.effect: MultiEffect { - saturation: -1 + saturation: root.trayIconSaturation + colorization: root.trayIconColorization + colorizationColor: root.trayIconTintColor } } @@ -1627,7 +1688,7 @@ BasePill { targetColor: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) targetRadius: Theme.cornerRadius sourceRect.antialiasing: true - shadowEnabled: Theme.elevationEnabled && SettingsData.popoutElevationEnabled + shadowEnabled: Theme.elevationEnabled && SettingsData.popoutElevationEnabled && !BlurService.enabled layer.smooth: true layer.textureSize: Qt.size(Math.round(width * menuWindow.dpr), Math.round(height * menuWindow.dpr)) layer.textureMirroring: ShaderEffectSource.MirrorVertically diff --git a/quickshell/Modules/DankDash/DankDashPopout.qml b/quickshell/Modules/DankDash/DankDashPopout.qml index 3c571bc0..17124090 100644 --- a/quickshell/Modules/DankDash/DankDashPopout.qml +++ b/quickshell/Modules/DankDash/DankDashPopout.qml @@ -81,6 +81,7 @@ DankPopout { isRightEdge: root.__dropdownRightEdge activePlayer: root.__dropdownPlayer allPlayers: root.__dropdownPlayers + targetWindow: root.backgroundWindow onCloseRequested: root.__hideDropdowns() onPanelEntered: root.__stopCloseTimer() onPanelExited: root.__startCloseTimer() diff --git a/quickshell/Modules/DankDash/MediaDropdownOverlay.qml b/quickshell/Modules/DankDash/MediaDropdownOverlay.qml index c6feb647..609f8661 100644 --- a/quickshell/Modules/DankDash/MediaDropdownOverlay.qml +++ b/quickshell/Modules/DankDash/MediaDropdownOverlay.qml @@ -15,6 +15,7 @@ Item { property var allPlayers: [] property point anchorPos: Qt.point(0, 0) property bool isRightEdge: false + property var targetWindow: null property bool __isChromeBrowser: { if (!activePlayer?.identity) @@ -56,6 +57,30 @@ Item { }); } + readonly property Item __activePanel: { + switch (dropdownType) { + case 1: + return volumePanel; + case 2: + return audioDevicesPanel; + case 3: + return playersPanel; + default: + return null; + } + } + + WindowBlur { + targetWindow: root.targetWindow + readonly property bool active: root.__activePanel !== null && root.__activePanel.visible && root.__activePanel.opacity > 0 + readonly property real s: root.__activePanel ? Math.min(1, root.__activePanel.scale) : 1 + blurX: root.__activePanel ? root.__activePanel.x + root.__activePanel.width * (1 - s) * 0.5 : 0 + blurY: root.__activePanel ? root.__activePanel.y + root.__activePanel.height * (1 - s) * 0.5 : 0 + blurWidth: active ? root.__activePanel.width * s : 0 + blurHeight: active ? root.__activePanel.height * s : 0 + blurRadius: Theme.cornerRadius * 2 + } + Rectangle { id: volumePanel visible: dropdownType === 1 && volumeAvailable @@ -64,8 +89,8 @@ Item { x: isRightEdge ? anchorPos.x : anchorPos.x - width y: anchorPos.y - height / 2 radius: Theme.cornerRadius * 2 - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.95) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.3) + color: Theme.floatingSurface + border.color: Theme.outlineStrong border.width: 1 opacity: Theme.isDirectionalEffect ? 1 : (dropdownType === 1 ? 1 : 0) @@ -100,7 +125,7 @@ Item { borderColor: volumePanel.border.color borderWidth: volumePanel.border.width shadowOpacity: Theme.elevationLevel2 && Theme.elevationLevel2.alpha !== undefined ? Theme.elevationLevel2.alpha : 0.25 - shadowEnabled: Theme.elevationEnabled + shadowEnabled: Theme.elevationEnabled && !BlurService.enabled } MouseArea { @@ -127,23 +152,26 @@ Item { width: parent.width height: parent.height anchors.centerIn: parent - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.withAlpha(Theme.outline, Theme.popupTransparency) radius: Theme.cornerRadius } Rectangle { + readonly property real ratio: volumeAvailable ? Math.min(1.0, currentVolume) : 0 + readonly property real thumbHeight: 4 width: parent.width - height: volumeAvailable ? (Math.min(1.0, currentVolume) * parent.height) : 0 + height: Math.max(0, ratio * (parent.height - thumbHeight) - 3) anchors.bottom: parent.bottom anchors.horizontalCenter: parent.horizontalCenter color: Theme.primary - bottomLeftRadius: Theme.cornerRadius - bottomRightRadius: Theme.cornerRadius + radius: Theme.cornerRadius + topLeftRadius: 0 + topRightRadius: 0 } Rectangle { width: parent.width + 8 - height: 8 + height: 4 radius: Theme.cornerRadius y: { const ratio = volumeAvailable ? Math.min(1.0, currentVolume) : 0; @@ -152,8 +180,7 @@ Item { } anchors.horizontalCenter: parent.horizontalCenter color: Theme.primary - border.width: 3 - border.color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 1.0) + border.width: 0 } MouseArea { @@ -203,8 +230,8 @@ Item { x: isRightEdge ? anchorPos.x : anchorPos.x - width y: anchorPos.y - height / 2 radius: Theme.cornerRadius * 2 - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.98) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.6) + color: Theme.floatingSurface + border.color: Theme.outlineStrong border.width: 2 opacity: Theme.isDirectionalEffect ? 1 : (dropdownType === 2 ? 1 : 0) @@ -239,7 +266,7 @@ Item { borderColor: audioDevicesPanel.border.color borderWidth: audioDevicesPanel.border.width shadowOpacity: Theme.elevationLevel2 && Theme.elevationLevel2.alpha !== undefined ? Theme.elevationLevel2.alpha : 0.25 - shadowEnabled: Theme.elevationEnabled + shadowEnabled: Theme.elevationEnabled && !BlurService.enabled } Column { @@ -276,7 +303,7 @@ Item { width: parent.width height: 48 radius: Theme.cornerRadius - color: deviceMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: deviceMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.nestedSurface border.color: modelData === AudioService.sink ? Theme.primary : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) border.width: modelData === AudioService.sink ? 2 : 1 @@ -358,8 +385,8 @@ Item { x: isRightEdge ? anchorPos.x : anchorPos.x - width y: anchorPos.y - height / 2 radius: Theme.cornerRadius * 2 - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.98) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.6) + color: Theme.floatingSurface + border.color: Theme.outlineStrong border.width: 2 opacity: Theme.isDirectionalEffect ? 1 : (dropdownType === 3 ? 1 : 0) @@ -394,7 +421,7 @@ Item { borderColor: playersPanel.border.color borderWidth: playersPanel.border.width shadowOpacity: Theme.elevationLevel2 && Theme.elevationLevel2.alpha !== undefined ? Theme.elevationLevel2.alpha : 0.25 - shadowEnabled: Theme.elevationEnabled + shadowEnabled: Theme.elevationEnabled && !BlurService.enabled } Column { @@ -431,7 +458,7 @@ Item { width: parent.width height: 48 radius: Theme.cornerRadius - color: playerMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: playerMouseArea.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) : Theme.nestedSurface border.color: modelData === activePlayer ? Theme.primary : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) border.width: modelData === activePlayer ? 2 : 1 diff --git a/quickshell/Modules/DankDash/MediaPlayerTab.qml b/quickshell/Modules/DankDash/MediaPlayerTab.qml index 9015052a..00ed06e3 100644 --- a/quickshell/Modules/DankDash/MediaPlayerTab.qml +++ b/quickshell/Modules/DankDash/MediaPlayerTab.qml @@ -2,7 +2,6 @@ import QtQuick import QtQuick.Effects import QtQuick.Layouts import Quickshell.Services.Mpris -import Quickshell.Io import qs.Common import qs.Services import qs.Widgets @@ -629,7 +628,7 @@ Item { x: isRightEdge ? Theme.spacingM : parent.width - 40 - Theme.spacingM y: 185 color: playerSelectorArea.containsMouse || playersExpanded ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.2) : "transparent" - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.3) + border.color: Theme.outlineStrong border.width: 1 z: 100 visible: (allPlayers?.length || 0) >= 1 @@ -672,7 +671,7 @@ Item { x: isRightEdge ? Theme.spacingM : parent.width - 40 - Theme.spacingM y: 130 color: volumeButtonArea.containsMouse && volumeAvailable || volumeExpanded ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.2) : "transparent" - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, volumeAvailable ? 0.3 : 0.15) + border.color: volumeAvailable ? Theme.outlineStrong : Theme.outlineMedium border.width: 1 z: 101 enabled: volumeAvailable @@ -749,7 +748,7 @@ Item { x: isRightEdge ? Theme.spacingM : parent.width - 40 - Theme.spacingM y: 240 color: audioDevicesArea.containsMouse || devicesExpanded ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.2) : "transparent" - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.3) + border.color: Theme.outlineStrong border.width: 1 z: 100 diff --git a/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml b/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml index 1972f065..d7fc1fa8 100644 --- a/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml +++ b/quickshell/Modules/DankDash/Overview/CalendarOverviewCard.qml @@ -126,8 +126,8 @@ Rectangle { } radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.05) + color: Theme.nestedSurface + border.color: Theme.outlineMedium border.width: 1 Column { @@ -446,7 +446,7 @@ Rectangle { } else if (eventMouseArea.containsMouse) { return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.06); } - return Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency); + return Theme.nestedSurface; } border.color: { if (modelData.url && eventMouseArea.containsMouse) { @@ -454,9 +454,9 @@ Rectangle { } else if (eventMouseArea.containsMouse) { return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.15); } - return "transparent"; + return Theme.outlineMedium; } - border.width: 1 + border.width: eventMouseArea.containsMouse ? 1 : Theme.layerOutlineWidth Rectangle { width: 3 diff --git a/quickshell/Modules/DankDash/Overview/Card.qml b/quickshell/Modules/DankDash/Overview/Card.qml index 8996c817..f2942cc7 100644 --- a/quickshell/Modules/DankDash/Overview/Card.qml +++ b/quickshell/Modules/DankDash/Overview/Card.qml @@ -10,8 +10,8 @@ Rectangle { property int pad: Theme.spacingM radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) + color: Theme.nestedSurface + border.color: Theme.outlineMedium border.width: 1 default property alias content: contentItem.data diff --git a/quickshell/Modules/DankDash/WeatherForecastCard.qml b/quickshell/Modules/DankDash/WeatherForecastCard.qml index 5c57b655..b163e88e 100644 --- a/quickshell/Modules/DankDash/WeatherForecastCard.qml +++ b/quickshell/Modules/DankDash/WeatherForecastCard.qml @@ -103,7 +103,7 @@ Rectangle { } ] - color: isCurrent ? Theme.withAlpha(Theme.primary, 0.1) : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: isCurrent ? Theme.withAlpha(Theme.primary, 0.1) : Theme.nestedSurface border.color: isCurrent ? Theme.withAlpha(Theme.primary, 0.3) : "transparent" border.width: isCurrent ? 1 : 0 diff --git a/quickshell/Modules/DankDash/WeatherTab.qml b/quickshell/Modules/DankDash/WeatherTab.qml index 21ea656a..69408b6f 100644 --- a/quickshell/Modules/DankDash/WeatherTab.qml +++ b/quickshell/Modules/DankDash/WeatherTab.qml @@ -213,8 +213,8 @@ Item { width: parent.width height: heroContent.height + Theme.spacingL * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Theme.withAlpha(Theme.outline, 0.08) + color: Theme.nestedSurface + border.color: Theme.outlineMedium border.width: 1 Column { diff --git a/quickshell/Modules/Notifications/Center/DndDurationMenu.qml b/quickshell/Modules/Notifications/Center/DndDurationMenu.qml index f3e96ec9..c8735a8f 100644 --- a/quickshell/Modules/Notifications/Center/DndDurationMenu.qml +++ b/quickshell/Modules/Notifications/Center/DndDurationMenu.qml @@ -107,7 +107,7 @@ Rectangle { implicitWidth: Math.max(220, menuColumn.implicitWidth + Theme.spacingM * 2) implicitHeight: menuColumn.implicitHeight + Theme.spacingM * 2 - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + color: Theme.floatingSurface radius: Theme.cornerRadius border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) border.width: BlurService.enabled ? BlurService.borderWidth : 1 diff --git a/quickshell/Modules/Notifications/Center/HistoryNotificationCard.qml b/quickshell/Modules/Notifications/Center/HistoryNotificationCard.qml index 5e033e52..978620be 100644 --- a/quickshell/Modules/Notifications/Center/HistoryNotificationCard.qml +++ b/quickshell/Modules/Notifications/Center/HistoryNotificationCard.qml @@ -1,5 +1,4 @@ import QtQuick -import QtQuick.Effects import Quickshell import qs.Common import qs.Services @@ -32,7 +31,7 @@ Rectangle { height: baseCardHeight + contentItem.extraHeight radius: Theme.cornerRadius clip: false - readonly property bool shadowsAllowed: Theme.elevationEnabled && Quickshell.env("DMS_DISABLE_LAYER") !== "true" && Quickshell.env("DMS_DISABLE_LAYER") !== "1" + readonly property bool shadowsAllowed: Theme.elevationEnabled && Quickshell.env("DMS_DISABLE_LAYER") !== "true" && Quickshell.env("DMS_DISABLE_LAYER") !== "1" && !BlurService.enabled ElevationShadow { id: shadowLayer @@ -50,21 +49,21 @@ Rectangle { color: { if (isSelected && keyboardNavigationActive) return Theme.primaryPressed; - return Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency); + return Theme.floatingSurfaceHigh; } border.color: { if (isSelected && keyboardNavigationActive) return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.5); if (historyItem.urgency === 2) return Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.3); - return Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.05); + return Theme.outlineMedium; } border.width: { if (isSelected && keyboardNavigationActive) return 1.5; if (historyItem.urgency === 2) return 2; - return 0; + return Theme.layerOutlineWidth; } Behavior on border.color { @@ -137,12 +136,10 @@ Rectangle { return ""; const appIcon = historyItem.appIcon; if (!appIcon) - return iconFromImage ? Paths.resolveIconUrl(iconFromImage) : ""; + return ""; if (appIcon.startsWith("file://") || appIcon.startsWith("http://") || appIcon.startsWith("https://") || appIcon.includes("/")) return appIcon; - if (appIcon.startsWith("material:") || appIcon.startsWith("svg:") || appIcon.startsWith("unicode:") || appIcon.startsWith("image:")) - return ""; - return Paths.resolveIconPath(appIcon); + return ""; } hasImage: hasNotificationImage diff --git a/quickshell/Modules/Notifications/Center/NotificationHeader.qml b/quickshell/Modules/Notifications/Center/NotificationHeader.qml index c81bb27e..321b64ba 100644 --- a/quickshell/Modules/Notifications/Center/NotificationHeader.qml +++ b/quickshell/Modules/Notifications/Center/NotificationHeader.qml @@ -128,7 +128,9 @@ Item { height: Theme.iconSize + Theme.spacingS radius: Theme.cornerRadius visible: root.currentTab === 0 ? NotificationService.notifications.length > 0 : NotificationService.historyList.length > 0 - color: clearArea.containsMouse ? Theme.primaryHoverLight : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: clearArea.containsMouse ? Theme.primaryHoverLight : Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth Row { id: clearButtonContent diff --git a/quickshell/Modules/Notifications/Center/NotificationSettings.qml b/quickshell/Modules/Notifications/Center/NotificationSettings.qml index 97364c7c..ea377527 100644 --- a/quickshell/Modules/Notifications/Center/NotificationSettings.qml +++ b/quickshell/Modules/Notifications/Center/NotificationSettings.qml @@ -14,8 +14,8 @@ Rectangle { visible: expanded clip: true radius: Theme.cornerRadius - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.3) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.1) + color: Theme.nestedSurface + border.color: Theme.outlineMedium border.width: 1 Behavior on height { diff --git a/quickshell/Modules/ProcessList/DisksView.qml b/quickshell/Modules/ProcessList/DisksView.qml index 5a8e6889..03009cd0 100644 --- a/quickshell/Modules/ProcessList/DisksView.qml +++ b/quickshell/Modules/ProcessList/DisksView.qml @@ -33,7 +33,7 @@ Item { Layout.fillWidth: true Layout.preferredHeight: 80 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface RowLayout { anchors.fill: parent @@ -110,7 +110,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface ColumnLayout { anchors.fill: parent diff --git a/quickshell/Modules/ProcessList/PerformanceView.qml b/quickshell/Modules/ProcessList/PerformanceView.qml index c793d92f..2c0291ea 100644 --- a/quickshell/Modules/ProcessList/PerformanceView.qml +++ b/quickshell/Modules/ProcessList/PerformanceView.qml @@ -163,7 +163,7 @@ Item { property color extraInfoColor: Theme.surfaceVariantText radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface border.color: Theme.outlineLight border.width: 1 diff --git a/quickshell/Modules/ProcessList/ProcessContextMenu.qml b/quickshell/Modules/ProcessList/ProcessContextMenu.qml index 0acee70f..7b975be9 100644 --- a/quickshell/Modules/ProcessList/ProcessContextMenu.qml +++ b/quickshell/Modules/ProcessList/ProcessContextMenu.qml @@ -185,7 +185,7 @@ Popup { } contentItem: Rectangle { - color: BlurService.enabled ? Theme.surfaceContainer : Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + color: Theme.floatingSurface radius: Theme.cornerRadius border.color: BlurService.enabled ? BlurService.borderColor : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) border.width: BlurService.enabled ? BlurService.borderWidth : 1 diff --git a/quickshell/Modules/ProcessList/ProcessListPopout.qml b/quickshell/Modules/ProcessList/ProcessListPopout.qml index 3adbe07d..31a92b62 100644 --- a/quickshell/Modules/ProcessList/ProcessListPopout.qml +++ b/quickshell/Modules/ProcessList/ProcessListPopout.qml @@ -357,7 +357,7 @@ DankPopout { Layout.fillWidth: true Layout.fillHeight: true radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface clip: true ProcessesView { diff --git a/quickshell/Modules/ProcessList/SystemView.qml b/quickshell/Modules/ProcessList/SystemView.qml index 244129d8..262c8205 100644 --- a/quickshell/Modules/ProcessList/SystemView.qml +++ b/quickshell/Modules/ProcessList/SystemView.qml @@ -23,7 +23,7 @@ Item { Layout.fillWidth: true Layout.preferredHeight: systemInfoColumn.implicitHeight + Theme.spacingM * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface ColumnLayout { id: systemInfoColumn @@ -96,7 +96,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface ColumnLayout { anchors.fill: parent diff --git a/quickshell/Modules/Settings/DankBarTab.qml b/quickshell/Modules/Settings/DankBarTab.qml index 08461175..57311391 100644 --- a/quickshell/Modules/Settings/DankBarTab.qml +++ b/quickshell/Modules/Settings/DankBarTab.qml @@ -312,9 +312,7 @@ Item { const prefs = cfg?.screenPreferences || ["all"]; if (prefs.includes("all") || (typeof prefs[0] === "string" && prefs[0] === "all")) return I18n.tr("All displays"); - return prefs.length === 1 - ? I18n.tr("%1 display").arg(prefs.length) - : I18n.tr("%1 displays").arg(prefs.length); + return prefs.length === 1 ? I18n.tr("%1 display").arg(prefs.length) : I18n.tr("%1 displays").arg(prefs.length); } font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceVariantText @@ -422,10 +420,70 @@ Item { } } + SettingsCard { + iconName: "vertical_align_center" + title: I18n.tr("Position") + settingKey: "barPosition" + visible: selectedBarConfig?.enabled + + Item { + width: parent.width + height: positionButtonGroup.height + + DankButtonGroup { + id: positionButtonGroup + anchors.horizontalCenter: parent.horizontalCenter + model: [I18n.tr("Top"), I18n.tr("Bottom"), I18n.tr("Left"), I18n.tr("Right")] + currentIndex: { + selectedBarId; + const config = SettingsData.getBarConfig(selectedBarId); + const pos = config?.position ?? 0; + switch (pos) { + case SettingsData.Position.Top: + return 0; + case SettingsData.Position.Bottom: + return 1; + case SettingsData.Position.Left: + return 2; + case SettingsData.Position.Right: + return 3; + default: + return 0; + } + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + let newPos = 0; + switch (index) { + case 0: + newPos = SettingsData.Position.Top; + break; + case 1: + newPos = SettingsData.Position.Bottom; + break; + case 2: + newPos = SettingsData.Position.Left; + break; + case 3: + newPos = SettingsData.Position.Right; + break; + } + SettingsData.updateBarConfig(selectedBarId, { + position: newPos + }); + notifyHorizontalBarChange(); + } + } + } + } + SettingsCard { iconName: "display_settings" title: I18n.tr("Display Assignment") settingKey: "barDisplay" + collapsible: true + expanded: false visible: selectedBarConfig?.enabled StyledText { @@ -527,68 +585,12 @@ Item { } } - SettingsCard { - iconName: "vertical_align_center" - title: I18n.tr("Position") - settingKey: "barPosition" - visible: selectedBarConfig?.enabled - - Item { - width: parent.width - height: positionButtonGroup.height - - DankButtonGroup { - id: positionButtonGroup - anchors.horizontalCenter: parent.horizontalCenter - model: [I18n.tr("Top"), I18n.tr("Bottom"), I18n.tr("Left"), I18n.tr("Right")] - currentIndex: { - selectedBarId; - const config = SettingsData.getBarConfig(selectedBarId); - const pos = config?.position ?? 0; - switch (pos) { - case SettingsData.Position.Top: - return 0; - case SettingsData.Position.Bottom: - return 1; - case SettingsData.Position.Left: - return 2; - case SettingsData.Position.Right: - return 3; - default: - return 0; - } - } - onSelectionChanged: (index, selected) => { - if (!selected) - return; - let newPos = 0; - switch (index) { - case 0: - newPos = SettingsData.Position.Top; - break; - case 1: - newPos = SettingsData.Position.Bottom; - break; - case 2: - newPos = SettingsData.Position.Left; - break; - case 3: - newPos = SettingsData.Position.Right; - break; - } - SettingsData.updateBarConfig(selectedBarId, { - position: newPos - }); - notifyHorizontalBarChange(); - } - } - } - } - SettingsCard { iconName: "visibility_off" title: I18n.tr("Visibility") settingKey: "barVisibility" + collapsible: true + expanded: false visible: selectedBarConfig?.enabled SettingsToggleRow { @@ -706,110 +708,6 @@ Item { } } - SettingsToggleCard { - iconName: "fit_screen" - title: I18n.tr("Maximize Detection") - description: I18n.tr("Remove gaps and border when windows are maximized") - visible: selectedBarConfig?.enabled && (CompositorService.isNiri || CompositorService.isHyprland) - checked: selectedBarConfig?.maximizeDetection ?? true - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - maximizeDetection: checked - }) - } - - SettingsToggleCard { - iconName: "filter_b_and_w" - title: I18n.tr("Monochrome System Tray Icons") - description: I18n.tr("Desaturate all system tray icons for a uniform monochrome look") - visible: selectedBarConfig?.enabled - checked: SettingsData.systemTrayMonochromeIcons - onToggled: checked => SettingsData.set("systemTrayMonochromeIcons", checked) - } - - SettingsToggleCard { - iconName: "mouse" - title: I18n.tr("Scroll Wheel") - description: I18n.tr("Control workspaces and columns by scrolling on the bar") - visible: selectedBarConfig?.enabled - checked: selectedBarConfig?.scrollEnabled ?? true - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - scrollEnabled: checked - }) - - SettingsButtonGroupRow { - text: I18n.tr("Y Axis") - model: CompositorService.isNiri ? [I18n.tr("None"), I18n.tr("Workspace"), I18n.tr("Column")] : [I18n.tr("None"), I18n.tr("Workspace")] - currentIndex: { - switch (selectedBarConfig?.scrollYBehavior || "workspace") { - case "none": - return 0; - case "workspace": - return 1; - case "column": - return 2; - default: - return 1; - } - } - onSelectionChanged: (index, selected) => { - if (!selected) - return; - let behavior = "workspace"; - switch (index) { - case 0: - behavior = "none"; - break; - case 1: - behavior = "workspace"; - break; - case 2: - behavior = "column"; - break; - } - SettingsData.updateBarConfig(selectedBarId, { - scrollYBehavior: behavior - }); - } - } - - SettingsButtonGroupRow { - text: I18n.tr("X Axis") - visible: CompositorService.isNiri - model: [I18n.tr("None"), I18n.tr("Workspace"), I18n.tr("Column")] - currentIndex: { - switch (selectedBarConfig?.scrollXBehavior || "column") { - case "none": - return 0; - case "workspace": - return 1; - case "column": - return 2; - default: - return 2; - } - } - onSelectionChanged: (index, selected) => { - if (!selected) - return; - let behavior = "column"; - switch (index) { - case 0: - behavior = "none"; - break; - case 1: - behavior = "workspace"; - break; - case 2: - behavior = "column"; - break; - } - SettingsData.updateBarConfig(selectedBarId, { - scrollXBehavior: behavior - }); - } - } - } - Item { visible: SettingsData.frameEnabled width: parent.width @@ -988,56 +886,6 @@ Item { } } - SettingsSliderCard { - id: fontScaleSliderCard - iconName: "text_fields" - title: I18n.tr("Font Scale") - description: I18n.tr("Scale DankBar font sizes independently") - visible: selectedBarConfig?.enabled - minimum: 50 - maximum: 200 - value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100) - unit: "%" - defaultValue: 100 - onSliderValueChanged: newValue => { - SettingsData.updateBarConfig(selectedBarId, { - fontScale: newValue / 100 - }); - } - - Binding { - target: fontScaleSliderCard - property: "value" - value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100) - restoreMode: Binding.RestoreBinding - } - } - - SettingsSliderCard { - id: iconScaleSliderCard - iconName: "interests" - title: I18n.tr("Icon Scale") - description: I18n.tr("Scale DankBar icon sizes independently") - visible: selectedBarConfig?.enabled - minimum: 50 - maximum: 200 - value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100) - unit: "%" - defaultValue: 100 - onSliderValueChanged: newValue => { - SettingsData.updateBarConfig(selectedBarId, { - iconScale: newValue / 100 - }); - } - - Binding { - target: iconScaleSliderCard - property: "value" - value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100) - restoreMode: Binding.RestoreBinding - } - } - SettingsCard { iconName: "opacity" title: I18n.tr("Transparency") @@ -1149,13 +997,455 @@ Item { } } + SettingsSliderCard { + id: fontScaleSliderCard + iconName: "text_fields" + title: I18n.tr("Font Scale") + description: I18n.tr("Scale DankBar font sizes independently") + visible: selectedBarConfig?.enabled + minimum: 50 + maximum: 200 + value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100) + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => { + SettingsData.updateBarConfig(selectedBarId, { + fontScale: newValue / 100 + }); + } + + Binding { + target: fontScaleSliderCard + property: "value" + value: Math.round((selectedBarConfig?.fontScale ?? 1.0) * 100) + restoreMode: Binding.RestoreBinding + } + } + + SettingsSliderCard { + id: iconScaleSliderCard + iconName: "interests" + title: I18n.tr("Icon Scale") + description: I18n.tr("Scale DankBar icon sizes independently") + visible: selectedBarConfig?.enabled + minimum: 50 + maximum: 200 + value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100) + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => { + SettingsData.updateBarConfig(selectedBarId, { + iconScale: newValue / 100 + }); + } + + Binding { + target: iconScaleSliderCard + property: "value" + value: Math.round((selectedBarConfig?.iconScale ?? 1.0) * 100) + restoreMode: Binding.RestoreBinding + } + } + + SettingsCard { + iconName: "rounded_corner" + title: I18n.tr("Corners & Background") + settingKey: "barCorners" + collapsible: true + expanded: false + visible: selectedBarConfig?.enabled + + SettingsToggleRow { + text: I18n.tr("Square Corners") + checked: selectedBarConfig?.squareCorners ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + squareCorners: checked + }) + } + + SettingsToggleRow { + text: I18n.tr("No Background") + checked: selectedBarConfig?.noBackground ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + noBackground: checked + }) + } + + SettingsToggleRow { + text: I18n.tr("Maximize Widget Icons") + checked: selectedBarConfig?.maximizeWidgetIcons ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + maximizeWidgetIcons: checked + }) + } + + SettingsToggleRow { + text: I18n.tr("Maximize Widget Text") + checked: selectedBarConfig?.maximizeWidgetText ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + maximizeWidgetText: checked + }) + } + + SettingsToggleRow { + text: I18n.tr("Remove Widget Padding") + checked: selectedBarConfig?.removeWidgetPadding ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + removeWidgetPadding: checked + }) + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + SettingsToggleRow { + text: I18n.tr("Goth Corners") + checked: selectedBarConfig?.gothCornersEnabled ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + gothCornersEnabled: checked + }) + } + + SettingsToggleRow { + text: I18n.tr("Corner Radius Override") + checked: selectedBarConfig?.gothCornerRadiusOverride ?? false + visible: selectedBarConfig?.gothCornersEnabled ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + gothCornerRadiusOverride: checked + }) + } + + Column { + width: parent.width + spacing: Theme.spacingS + visible: (selectedBarConfig?.gothCornersEnabled ?? false) && (selectedBarConfig?.gothCornerRadiusOverride ?? false) + leftPadding: Theme.spacingM + + SettingsSliderRow { + id: gothCornerRadiusSlider + width: parent.width - parent.leftPadding + text: I18n.tr("Goth Corner Radius") + value: selectedBarConfig?.gothCornerRadiusValue ?? 12 + minimum: 0 + maximum: 64 + defaultValue: 12 + onSliderDragFinished: finalValue => { + SettingsData.updateBarConfig(selectedBarId, { + gothCornerRadiusValue: finalValue + }); + } + + Binding { + target: gothCornerRadiusSlider + property: "value" + value: selectedBarConfig?.gothCornerRadiusValue ?? 12 + restoreMode: Binding.RestoreBinding + } + } + } + } + + SettingsToggleCard { + iconName: "fit_screen" + title: I18n.tr("Maximize Detection") + description: I18n.tr("Remove gaps and border when windows are maximized") + visible: selectedBarConfig?.enabled && (CompositorService.isNiri || CompositorService.isHyprland) + checked: selectedBarConfig?.maximizeDetection ?? true + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + maximizeDetection: checked + }) + } + + SettingsCard { + iconName: "filter_b_and_w" + title: I18n.tr("System Tray Icon Tint") + settingKey: "trayIconTint" + visible: selectedBarConfig?.enabled + + StyledText { + text: I18n.tr("Choose monochrome or a theme color tint for system tray icons") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + horizontalAlignment: Text.AlignLeft + } + + SettingsButtonGroupRow { + text: I18n.tr("Mode") + model: [I18n.tr("None"), I18n.tr("Monochrome"), I18n.tr("Primary"), I18n.tr("Secondary")] + currentIndex: { + let mode = SettingsData.systemTrayIconTintMode || "none"; + switch (mode) { + case "monochrome": + return 1; + case "primary": + return 2; + case "secondary": + return 3; + default: + return 0; + } + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + + let mode = "none"; + switch (index) { + case 1: + mode = "monochrome"; + break; + case 2: + mode = "primary"; + break; + case 3: + mode = "secondary"; + break; + } + + SettingsData.set("systemTrayIconTintMode", mode); + } + } + + SettingsSliderRow { + id: trayTintSaturationSlider + text: I18n.tr("Tint Saturation") + description: I18n.tr("Controls how much original icon color is removed before applying tint") + visible: { + const mode = SettingsData.systemTrayIconTintMode || "none"; + return mode === "primary" || mode === "secondary"; + } + value: SettingsData.systemTrayIconTintSaturation ?? 50 + minimum: 0 + maximum: 100 + unit: "%" + defaultValue: 50 + onSliderDragFinished: finalValue => SettingsData.set("systemTrayIconTintSaturation", finalValue) + + Binding { + target: trayTintSaturationSlider + property: "value" + value: SettingsData.systemTrayIconTintSaturation ?? 50 + restoreMode: Binding.RestoreBinding + } + } + + SettingsSliderRow { + id: trayTintStrengthSlider + text: I18n.tr("Tint Strength") + description: I18n.tr("Controls how strongly the selected tint color is applied") + visible: { + const mode = SettingsData.systemTrayIconTintMode || "none"; + return mode === "primary" || mode === "secondary"; + } + value: SettingsData.systemTrayIconTintStrength ?? 135 + minimum: 0 + maximum: 200 + unit: "%" + defaultValue: 135 + onSliderDragFinished: finalValue => SettingsData.set("systemTrayIconTintStrength", finalValue) + + Binding { + target: trayTintStrengthSlider + property: "value" + value: SettingsData.systemTrayIconTintStrength ?? 135 + restoreMode: Binding.RestoreBinding + } + } + } + + SettingsToggleCard { + iconName: "border_style" + title: I18n.tr("Border") + visible: selectedBarConfig?.enabled + checked: selectedBarConfig?.borderEnabled ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + borderEnabled: checked + }) + + SettingsButtonGroupRow { + text: I18n.tr("Color") + model: ["Surface", "Secondary", "Primary"] + currentIndex: { + switch (selectedBarConfig?.borderColor || "surfaceText") { + case "surfaceText": + return 0; + case "secondary": + return 1; + case "primary": + return 2; + default: + return 0; + } + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + let newColor = "surfaceText"; + switch (index) { + case 0: + newColor = "surfaceText"; + break; + case 1: + newColor = "secondary"; + break; + case 2: + newColor = "primary"; + break; + } + SettingsData.updateBarConfig(selectedBarId, { + borderColor: newColor + }); + } + } + + SettingsSliderRow { + id: borderOpacitySlider + text: I18n.tr("Opacity") + value: (selectedBarConfig?.borderOpacity ?? 1.0) * 100 + minimum: 0 + maximum: 100 + unit: "%" + defaultValue: 100 + onSliderDragFinished: finalValue => { + SettingsData.updateBarConfig(selectedBarId, { + borderOpacity: finalValue / 100 + }); + } + + Binding { + target: borderOpacitySlider + property: "value" + value: (selectedBarConfig?.borderOpacity ?? 1.0) * 100 + restoreMode: Binding.RestoreBinding + } + } + + SettingsSliderRow { + id: borderThicknessSlider + text: I18n.tr("Thickness") + value: selectedBarConfig?.borderThickness ?? 1 + minimum: 1 + maximum: 10 + unit: "px" + defaultValue: 1 + onSliderDragFinished: finalValue => { + SettingsData.updateBarConfig(selectedBarId, { + borderThickness: finalValue + }); + } + + Binding { + target: borderThicknessSlider + property: "value" + value: selectedBarConfig?.borderThickness ?? 1 + restoreMode: Binding.RestoreBinding + } + } + } + + SettingsToggleCard { + iconName: "highlight" + title: I18n.tr("Widget Outline") + visible: selectedBarConfig?.enabled + checked: selectedBarConfig?.widgetOutlineEnabled ?? false + onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { + widgetOutlineEnabled: checked + }) + + SettingsButtonGroupRow { + text: I18n.tr("Color") + model: ["Surface", "Secondary", "Primary"] + currentIndex: { + switch (selectedBarConfig?.widgetOutlineColor || "primary") { + case "surfaceText": + return 0; + case "secondary": + return 1; + case "primary": + return 2; + default: + return 2; + } + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + let newColor = "primary"; + switch (index) { + case 0: + newColor = "surfaceText"; + break; + case 1: + newColor = "secondary"; + break; + case 2: + newColor = "primary"; + break; + } + SettingsData.updateBarConfig(selectedBarId, { + widgetOutlineColor: newColor + }); + } + } + + SettingsSliderRow { + id: widgetOutlineOpacitySlider + text: I18n.tr("Opacity") + value: (selectedBarConfig?.widgetOutlineOpacity ?? 1.0) * 100 + minimum: 0 + maximum: 100 + unit: "%" + defaultValue: 100 + onSliderDragFinished: finalValue => { + SettingsData.updateBarConfig(selectedBarId, { + widgetOutlineOpacity: finalValue / 100 + }); + } + + Binding { + target: widgetOutlineOpacitySlider + property: "value" + value: (selectedBarConfig?.widgetOutlineOpacity ?? 1.0) * 100 + restoreMode: Binding.RestoreBinding + } + } + + SettingsSliderRow { + id: widgetOutlineThicknessSlider + text: I18n.tr("Thickness") + value: selectedBarConfig?.widgetOutlineThickness ?? 1 + minimum: 1 + maximum: 10 + unit: "px" + defaultValue: 1 + onSliderDragFinished: finalValue => { + SettingsData.updateBarConfig(selectedBarId, { + widgetOutlineThickness: finalValue + }); + } + + Binding { + target: widgetOutlineThicknessSlider + property: "value" + value: selectedBarConfig?.widgetOutlineThickness ?? 1 + restoreMode: Binding.RestoreBinding + } + } + } + SettingsCard { id: shadowCard iconName: "layers" title: I18n.tr("Shadow Override", "bar shadow settings card") settingKey: "barShadow" collapsible: true - expanded: true + expanded: false visible: selectedBarConfig?.enabled enabled: !dankBarTab.connectedFrameModeActive opacity: dankBarTab.connectedFrameModeActive ? 0.5 : 1.0 @@ -1382,223 +1672,65 @@ Item { } } - SettingsCard { - iconName: "rounded_corner" - title: I18n.tr("Corners & Background") - settingKey: "barCorners" - collapsible: true - expanded: false - visible: selectedBarConfig?.enabled - - SettingsToggleRow { - text: I18n.tr("Square Corners") - enabled: !SettingsData.frameEnabled - opacity: SettingsData.frameEnabled ? 0.5 : 1.0 - checked: selectedBarConfig?.squareCorners ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - squareCorners: checked - }) - } - - SettingsToggleRow { - text: I18n.tr("No Background") - checked: selectedBarConfig?.noBackground ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - noBackground: checked - }) - } - - SettingsToggleRow { - text: I18n.tr("Maximize Widget Icons") - checked: selectedBarConfig?.maximizeWidgetIcons ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - maximizeWidgetIcons: checked - }) - } - - SettingsToggleRow { - text: I18n.tr("Maximize Widget Text") - checked: selectedBarConfig?.maximizeWidgetText ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - maximizeWidgetText: checked - }) - } - - SettingsToggleRow { - text: I18n.tr("Remove Widget Padding") - checked: selectedBarConfig?.removeWidgetPadding ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - removeWidgetPadding: checked - }) - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.15 - } - - SettingsToggleRow { - text: I18n.tr("Goth Corners") - enabled: !SettingsData.frameEnabled - opacity: SettingsData.frameEnabled ? 0.5 : 1.0 - checked: selectedBarConfig?.gothCornersEnabled ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - gothCornersEnabled: checked - }) - } - - SettingsToggleRow { - text: I18n.tr("Corner Radius Override") - checked: selectedBarConfig?.gothCornerRadiusOverride ?? false - visible: selectedBarConfig?.gothCornersEnabled ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - gothCornerRadiusOverride: checked - }) - } - - Column { - width: parent.width - spacing: Theme.spacingS - visible: (selectedBarConfig?.gothCornersEnabled ?? false) && (selectedBarConfig?.gothCornerRadiusOverride ?? false) - leftPadding: Theme.spacingM - - SettingsSliderRow { - id: gothCornerRadiusSlider - width: parent.width - parent.leftPadding - text: I18n.tr("Goth Corner Radius") - value: selectedBarConfig?.gothCornerRadiusValue ?? 12 - minimum: 0 - maximum: 64 - defaultValue: 12 - onSliderDragFinished: finalValue => { - SettingsData.updateBarConfig(selectedBarId, { - gothCornerRadiusValue: finalValue - }); - } - - Binding { - target: gothCornerRadiusSlider - property: "value" - value: selectedBarConfig?.gothCornerRadiusValue ?? 12 - restoreMode: Binding.RestoreBinding - } - } - } - } - SettingsToggleCard { - iconName: "border_style" - title: I18n.tr("Border") + iconName: "mouse" + title: I18n.tr("Scroll Wheel") + description: I18n.tr("Control workspaces and columns by scrolling on the bar") visible: selectedBarConfig?.enabled enabled: !dankBarTab.connectedFrameModeActive opacity: dankBarTab.connectedFrameModeActive ? 0.5 : 1.0 - checked: selectedBarConfig?.borderEnabled ?? false + checked: selectedBarConfig?.scrollEnabled ?? true onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - borderEnabled: checked + scrollEnabled: checked }) SettingsButtonGroupRow { - text: I18n.tr("Color") - model: ["Surface", "Secondary", "Primary"] + text: I18n.tr("Y Axis") + model: CompositorService.isNiri ? [I18n.tr("None"), I18n.tr("Workspace"), I18n.tr("Column")] : [I18n.tr("None"), I18n.tr("Workspace")] currentIndex: { - switch (selectedBarConfig?.borderColor || "surfaceText") { - case "surfaceText": + switch (selectedBarConfig?.scrollYBehavior || "workspace") { + case "none": return 0; - case "secondary": + case "workspace": return 1; - case "primary": + case "column": return 2; default: - return 0; + return 1; } } onSelectionChanged: (index, selected) => { if (!selected) return; - let newColor = "surfaceText"; + let behavior = "workspace"; switch (index) { case 0: - newColor = "surfaceText"; + behavior = "none"; break; case 1: - newColor = "secondary"; + behavior = "workspace"; break; case 2: - newColor = "primary"; + behavior = "column"; break; } SettingsData.updateBarConfig(selectedBarId, { - borderColor: newColor + scrollYBehavior: behavior }); } } - SettingsSliderRow { - id: borderOpacitySlider - text: I18n.tr("Opacity") - value: (selectedBarConfig?.borderOpacity ?? 1.0) * 100 - minimum: 0 - maximum: 100 - unit: "%" - defaultValue: 100 - onSliderDragFinished: finalValue => { - SettingsData.updateBarConfig(selectedBarId, { - borderOpacity: finalValue / 100 - }); - } - - Binding { - target: borderOpacitySlider - property: "value" - value: (selectedBarConfig?.borderOpacity ?? 1.0) * 100 - restoreMode: Binding.RestoreBinding - } - } - - SettingsSliderRow { - id: borderThicknessSlider - text: I18n.tr("Thickness") - value: selectedBarConfig?.borderThickness ?? 1 - minimum: 1 - maximum: 10 - unit: "px" - defaultValue: 1 - onSliderDragFinished: finalValue => { - SettingsData.updateBarConfig(selectedBarId, { - borderThickness: finalValue - }); - } - - Binding { - target: borderThicknessSlider - property: "value" - value: selectedBarConfig?.borderThickness ?? 1 - restoreMode: Binding.RestoreBinding - } - } - } - - SettingsToggleCard { - iconName: "highlight" - title: I18n.tr("Widget Outline") - visible: selectedBarConfig?.enabled - checked: selectedBarConfig?.widgetOutlineEnabled ?? false - onToggled: checked => SettingsData.updateBarConfig(selectedBarId, { - widgetOutlineEnabled: checked - }) - SettingsButtonGroupRow { - text: I18n.tr("Color") - model: ["Surface", "Secondary", "Primary"] + text: I18n.tr("X Axis") + visible: CompositorService.isNiri + model: [I18n.tr("None"), I18n.tr("Workspace"), I18n.tr("Column")] currentIndex: { - switch (selectedBarConfig?.widgetOutlineColor || "primary") { - case "surfaceText": + switch (selectedBarConfig?.scrollXBehavior || "column") { + case "none": return 0; - case "secondary": + case "workspace": return 1; - case "primary": + case "column": return 2; default: return 2; @@ -1607,67 +1739,23 @@ Item { onSelectionChanged: (index, selected) => { if (!selected) return; - let newColor = "primary"; + let behavior = "column"; switch (index) { case 0: - newColor = "surfaceText"; + behavior = "none"; break; case 1: - newColor = "secondary"; + behavior = "workspace"; break; case 2: - newColor = "primary"; + behavior = "column"; break; } SettingsData.updateBarConfig(selectedBarId, { - widgetOutlineColor: newColor + scrollXBehavior: behavior }); } } - - SettingsSliderRow { - id: widgetOutlineOpacitySlider - text: I18n.tr("Opacity") - value: (selectedBarConfig?.widgetOutlineOpacity ?? 1.0) * 100 - minimum: 0 - maximum: 100 - unit: "%" - defaultValue: 100 - onSliderDragFinished: finalValue => { - SettingsData.updateBarConfig(selectedBarId, { - widgetOutlineOpacity: finalValue / 100 - }); - } - - Binding { - target: widgetOutlineOpacitySlider - property: "value" - value: (selectedBarConfig?.widgetOutlineOpacity ?? 1.0) * 100 - restoreMode: Binding.RestoreBinding - } - } - - SettingsSliderRow { - id: widgetOutlineThicknessSlider - text: I18n.tr("Thickness") - value: selectedBarConfig?.widgetOutlineThickness ?? 1 - minimum: 1 - maximum: 10 - unit: "px" - defaultValue: 1 - onSliderDragFinished: finalValue => { - SettingsData.updateBarConfig(selectedBarId, { - widgetOutlineThickness: finalValue - }); - } - - Binding { - target: widgetOutlineThicknessSlider - property: "value" - value: selectedBarConfig?.widgetOutlineThickness ?? 1 - restoreMode: Binding.RestoreBinding - } - } } } } diff --git a/quickshell/Modules/Settings/ThemeColorsTab.qml b/quickshell/Modules/Settings/ThemeColorsTab.qml index dee51e0d..20e1e56b 100644 --- a/quickshell/Modules/Settings/ThemeColorsTab.qml +++ b/quickshell/Modules/Settings/ThemeColorsTab.qml @@ -1854,6 +1854,33 @@ Item { onToggled: checked => SettingsData.set("blurEnabled", checked) } + SettingsToggleRow { + tab: "theme" + tags: ["blur", "foreground", "layers", "contrast", "glass", "frosted"] + settingKey: "blurForegroundLayers" + text: I18n.tr("Foreground Layers") + description: I18n.tr("Show foreground surfaces on blurred panels for stronger contrast") + checked: SettingsData.blurForegroundLayers ?? true + visible: BlurService.available && (SettingsData.blurEnabled ?? false) + enabled: BlurService.available + onToggled: checked => SettingsData.set("blurForegroundLayers", checked) + } + + SettingsSliderRow { + tab: "theme" + tags: ["blur", "foreground", "layers", "outline", "border", "cards", "widgets", "notifications", "control center"] + settingKey: "blurLayerOutlineOpacity" + text: I18n.tr("Layer Outline Opacity") + description: I18n.tr("Controls outlines around blurred foreground cards, pills, and notification cards") + visible: BlurService.available && (SettingsData.blurEnabled ?? false) + value: Math.round((SettingsData.blurLayerOutlineOpacity ?? 0.12) * 100) + minimum: 0 + maximum: 40 + unit: "%" + defaultValue: 12 + onSliderValueChanged: newValue => SettingsData.set("blurLayerOutlineOpacity", newValue / 100) + } + SettingsDropdownRow { tab: "theme" tags: ["blur", "border", "outline", "edge"] @@ -1897,12 +1924,13 @@ Item { tags: ["blur", "border", "opacity"] settingKey: "blurBorderOpacity" text: I18n.tr("Blur Border Opacity") + description: I18n.tr("Controls the outer edge of protocol-blurred windows") visible: SettingsData.blurEnabled - value: Math.round((SettingsData.blurBorderOpacity ?? 1.0) * 100) + value: Math.round((SettingsData.blurBorderOpacity ?? 0.35) * 100) minimum: 0 maximum: 100 unit: "%" - defaultValue: 100 + defaultValue: 35 onSliderValueChanged: newValue => SettingsData.set("blurBorderOpacity", newValue / 100) } } diff --git a/quickshell/Modules/Settings/WidgetSelectionPopup.qml b/quickshell/Modules/Settings/WidgetSelectionPopup.qml index 817e9800..c441426a 100644 --- a/quickshell/Modules/Settings/WidgetSelectionPopup.qml +++ b/quickshell/Modules/Settings/WidgetSelectionPopup.qml @@ -14,6 +14,10 @@ FloatingWindow { property int selectedIndex: -1 property bool keyboardNavigationActive: false property var parentModal: null + readonly property bool blurActive: Theme.blurForegroundLayers || Theme.transparentBlurLayers + readonly property real surfaceAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.36 : 0.78) : 1.0 + readonly property real fieldAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.18 : 0.62) : 1.0 + readonly property real rowAlpha: blurActive ? Math.min(Theme.popupTransparency, Theme.transparentBlurLayers ? 0.12 : 0.52) : 0.30 signal widgetSelected(string widgetId, string targetSection) @@ -94,7 +98,7 @@ FloatingWindow { minimumSize: Qt.size(400, 350) implicitWidth: 500 implicitHeight: 550 - color: Theme.surfaceContainer + color: blurActive ? "transparent" : Theme.surfaceContainer visible: false onVisibleChanged: { @@ -119,6 +123,24 @@ FloatingWindow { }); } + WindowBlur { + targetWindow: root + blurX: 0 + blurY: 0 + blurWidth: root.visible ? root.width : 0 + blurHeight: root.visible ? root.height : 0 + blurRadius: Theme.cornerRadius + } + + Rectangle { + anchors.fill: parent + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainer, root.surfaceAlpha) + border.color: root.blurActive ? Theme.outlineMedium : "transparent" + border.width: root.blurActive ? Theme.layerOutlineWidth : 0 + antialiasing: true + } + FocusScope { id: widgetKeyHandler @@ -184,8 +206,7 @@ FloatingWindow { Rectangle { anchors.fill: parent - color: Theme.surfaceContainer - opacity: 0.5 + color: Theme.withAlpha(Theme.surfaceContainerHigh, root.blurActive ? 0.20 : 0.50) } Row { @@ -258,7 +279,7 @@ FloatingWindow { width: parent.width height: 48 cornerRadius: Theme.cornerRadius - backgroundColor: Theme.surfaceContainerHigh + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, root.fieldAlpha) normalBorderColor: Theme.outlineMedium focusedBorderColor: Theme.primary leftIconName: "search" @@ -302,9 +323,10 @@ FloatingWindow { height: 60 radius: Theme.cornerRadius property bool isSelected: root.keyboardNavigationActive && index === root.selectedIndex - color: isSelected ? Theme.primarySelected : widgetArea.containsMouse ? Theme.primaryHover : Qt.rgba(Theme.surfaceVariant.r, Theme.surfaceVariant.g, Theme.surfaceVariant.b, 0.3) - border.color: isSelected ? Theme.primary : Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: isSelected ? 2 : 1 + color: isSelected ? Theme.withAlpha(Theme.primary, root.blurActive ? 0.22 : 0.16) : widgetArea.containsMouse ? Theme.withAlpha(Theme.primary, root.blurActive ? 0.14 : 0.08) : Theme.withAlpha(Theme.surfaceVariant, root.rowAlpha) + border.color: isSelected ? Theme.primary : Theme.outlineMedium + border.width: isSelected ? 2 : Theme.layerOutlineWidth + antialiasing: true Row { anchors.fill: parent diff --git a/quickshell/Modules/Toast.qml b/quickshell/Modules/Toast.qml index 2d1356e3..55c57e3b 100644 --- a/quickshell/Modules/Toast.qml +++ b/quickshell/Modules/Toast.qml @@ -89,9 +89,9 @@ PanelWindow { case ToastService.levelWarn: return Theme.warning; case ToastService.levelInfo: - return Theme.surfaceContainer; + return Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency); default: - return Theme.surfaceContainer; + return Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency); } } radius: Theme.cornerRadius diff --git a/quickshell/Services/BlurService.qml b/quickshell/Services/BlurService.qml index 40a3aeb8..0ccb5df6 100644 --- a/quickshell/Services/BlurService.qml +++ b/quickshell/Services/BlurService.qml @@ -18,7 +18,7 @@ Singleton { readonly property color borderColor: { if (!enabled) return "transparent"; - const opacity = SettingsData.blurBorderOpacity ?? 0.5; + const opacity = SettingsData.blurBorderOpacity ?? 0.35; switch (SettingsData.blurBorderColor ?? "outline") { case "primary": return Theme.withAlpha(Theme.primary, opacity); diff --git a/quickshell/Services/CompositorService.qml b/quickshell/Services/CompositorService.qml index d327ea2b..adcc4985 100644 --- a/quickshell/Services/CompositorService.qml +++ b/quickshell/Services/CompositorService.qml @@ -371,8 +371,21 @@ Singleton { function filterCurrentDisplay(toplevels, screenName) { if (!toplevels || toplevels.length === 0 || !screenName) return toplevels; - if (useNiriSorting) + if (useNiriSorting) { + const active = ToplevelManager.activeToplevel; + if (active && toplevels.length === 1 && toplevels[0] === active) { + if (NiriService.currentOutput !== screenName) + return []; + const focusedWin = NiriService.windows.find(nw => nw.is_focused); + if (!focusedWin) + return []; + const screenWsIds = new Set( + NiriService.allWorkspaces.filter(ws => ws.output === screenName).map(ws => ws.id) + ); + return screenWsIds.has(focusedWin.workspace_id) ? toplevels : []; + } return NiriService.filterCurrentDisplay(toplevels, screenName); + } if (isHyprland) return filterHyprlandCurrentDisplaySafe(toplevels, screenName); return toplevels; diff --git a/quickshell/Widgets/CachingImage.qml b/quickshell/Widgets/CachingImage.qml index 5ffec09b..a8a3b281 100644 --- a/quickshell/Widgets/CachingImage.qml +++ b/quickshell/Widgets/CachingImage.qml @@ -1,4 +1,5 @@ import QtQuick +import Quickshell.Io import qs.Common Item { @@ -68,11 +69,11 @@ Item { smooth: true onStatusChanged: { - if (source == root.cachePath && status === Image.Error) { + if (source === root.cachePath && status === Image.Error) { source = root.encodedImagePath; return; } - if (root.isRemoteUrl || source != root.encodedImagePath || status !== Image.Ready || !root.cachePath) + if (root.isRemoteUrl || source !== root.encodedImagePath || status !== Image.Ready || !root.cachePath) return; Paths.mkdir(Paths.imagecache); const grabPath = root.cachePath; @@ -82,6 +83,22 @@ Item { } } + Process { + id: cacheProbe + + property string cachePath: "" + property string fallbackSource: "" + + running: false + command: ["test", "-f", cachePath] + + onExited: exitCode => { + if (cacheProbe.cachePath !== root.cachePath) + return; + staticImg.source = exitCode === 0 ? cacheProbe.cachePath : cacheProbe.fallbackSource; + } + } + onImagePathChanged: { if (!imagePath) { staticImg.source = ""; @@ -97,6 +114,13 @@ Item { const hash = djb2Hash(normalizedPath); const cPath = hash ? `${Paths.stringify(Paths.imagecache)}/${hash}@${maxCacheSize}x${maxCacheSize}.png` : ""; const encoded = "file://" + normalizedPath.split('/').map(s => encodeURIComponent(s)).join('/'); - staticImg.source = cPath || encoded; + if (!cPath) { + staticImg.source = encoded; + return; + } + cacheProbe.running = false; + cacheProbe.cachePath = cPath; + cacheProbe.fallbackSource = encoded; + cacheProbe.running = true; } } diff --git a/quickshell/Widgets/DankOSD.qml b/quickshell/Widgets/DankOSD.qml index 0eb0e5ad..f2a454b5 100644 --- a/quickshell/Widgets/DankOSD.qml +++ b/quickshell/Widgets/DankOSD.qml @@ -272,7 +272,7 @@ PanelWindow { id: background anchors.fill: parent radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainer, osdContainer.popupSurfaceAlpha) + color: Theme.transparentBlurLayers ? "transparent" : Theme.withAlpha(Theme.surfaceContainer, osdContainer.popupSurfaceAlpha) border.color: BlurService.enabled ? BlurService.borderColor : Theme.outlineMedium border.width: BlurService.enabled ? BlurService.borderWidth : 1 z: -1 @@ -286,7 +286,7 @@ PanelWindow { level: Theme.elevationLevel3 fallbackOffset: 6 targetRadius: Theme.cornerRadius - targetColor: Theme.withAlpha(Theme.surfaceContainer, osdContainer.popupSurfaceAlpha) + targetColor: Theme.transparentBlurLayers ? "transparent" : Theme.withAlpha(Theme.surfaceContainer, osdContainer.popupSurfaceAlpha) borderColor: Theme.outlineMedium borderWidth: 1 shadowEnabled: Theme.elevationEnabled && SettingsData.popoutElevationEnabled && Quickshell.env("DMS_DISABLE_LAYER") !== "true" && Quickshell.env("DMS_DISABLE_LAYER") !== "1" diff --git a/quickshell/Widgets/DankSlideout.qml b/quickshell/Widgets/DankSlideout.qml index 6966e290..77fd31d1 100644 --- a/quickshell/Widgets/DankSlideout.qml +++ b/quickshell/Widgets/DankSlideout.qml @@ -134,7 +134,7 @@ PanelWindow { Rectangle { anchors.fill: parent - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, contentRect.effectiveTransparency) + color: Theme.transparentBlurLayers ? "transparent" : Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, contentRect.effectiveTransparency) radius: Theme.cornerRadius border.color: BlurService.enabled ? BlurService.borderColor : Theme.outlineMedium border.width: BlurService.borderWidth diff --git a/quickshell/Widgets/DankSlider.qml b/quickshell/Widgets/DankSlider.qml index fa11ae63..70926448 100644 --- a/quickshell/Widgets/DankSlider.qml +++ b/quickshell/Widgets/DankSlider.qml @@ -22,6 +22,7 @@ Item { property color thumbOutlineColor: Theme.surfaceContainer property color trackColor: enabled ? Theme.outline : Theme.outline + property real trackOpacity: Theme.popupTransparency signal sliderValueChanged(int newValue) signal sliderDragFinished(int finalValue) @@ -63,7 +64,7 @@ Item { width: parent.width - (leftIconWidth + rightIconWidth + (slider.leftIcon.length > 0 ? Theme.spacingM : 0) + (slider.rightIcon.length > 0 ? Theme.spacingM : 0)) height: 12 radius: Theme.cornerRadius - color: slider.trackColor + color: Theme.withAlpha(slider.trackColor, slider.trackOpacity) anchors.verticalCenter: parent.verticalCenter clip: false @@ -71,13 +72,16 @@ Item { id: sliderFill height: parent.height radius: Theme.cornerRadius + topRightRadius: 0 + bottomRightRadius: 0 width: { const range = slider.maximum - slider.minimum; const rawRatio = range === 0 ? 0 : (slider.value - slider.minimum) / range; const ratio = slider.centerMinimum ? (0.5 + rawRatio * 0.5) : rawRatio; const travel = sliderTrack.width - sliderHandle.width; - const center = (travel * ratio) + sliderHandle.width / 2; - return Math.max(0, Math.min(sliderTrack.width, center)); + const handleLeft = travel * ratio; + const endPoint = handleLeft - 3; + return Math.max(0, Math.min(sliderTrack.width, endPoint)); } color: slider.enabled ? Theme.primary : Theme.withAlpha(Theme.onSurface, 0.12) } @@ -87,8 +91,8 @@ Item { property bool active: sliderMouseArea.containsMouse || sliderMouseArea.pressed || slider.isDragging - width: 8 - height: 24 + width: 4 + height: 20 radius: Theme.cornerRadius x: { const range = slider.maximum - slider.minimum; @@ -99,7 +103,7 @@ Item { } anchors.verticalCenter: parent.verticalCenter color: slider.enabled ? Theme.primary : Theme.withAlpha(Theme.onSurface, 0.12) - border.width: 3 + border.width: 0 border.color: slider.thumbOutlineColor StyledRect { diff --git a/quickshell/Widgets/DankTooltip.qml b/quickshell/Widgets/DankTooltip.qml index ed5f04e5..f9585727 100644 --- a/quickshell/Widgets/DankTooltip.qml +++ b/quickshell/Widgets/DankTooltip.qml @@ -2,7 +2,6 @@ import QtQuick import Quickshell import Quickshell.Wayland import qs.Common -import qs.Services PanelWindow { id: root @@ -72,10 +71,10 @@ PanelWindow { Rectangle { anchors.fill: parent - color: BlurService.enabled ? Theme.surfaceContainerHigh : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) radius: Theme.cornerRadius - border.width: BlurService.enabled ? BlurService.borderWidth : 1 - border.color: BlurService.enabled ? BlurService.borderColor : Theme.outlineMedium + border.width: 1 + border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) Text { id: textContent diff --git a/quickshell/Widgets/DankTooltipV2.qml b/quickshell/Widgets/DankTooltipV2.qml index ab6a0c06..b37e7c81 100644 --- a/quickshell/Widgets/DankTooltipV2.qml +++ b/quickshell/Widgets/DankTooltipV2.qml @@ -1,7 +1,6 @@ import QtQuick import QtQuick.Controls import qs.Common -import qs.Services Item { id: root @@ -112,10 +111,10 @@ Item { dim: false background: Rectangle { - color: BlurService.enabled ? Theme.surfaceContainerHigh : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) radius: Theme.cornerRadius - border.width: BlurService.enabled ? BlurService.borderWidth : 1 - border.color: BlurService.enabled ? BlurService.borderColor : Theme.outlineMedium + border.width: 1 + border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.08) } contentItem: Text { diff --git a/quickshell/Widgets/VpnDetailContent.qml b/quickshell/Widgets/VpnDetailContent.qml index 0ca0e56b..077235c3 100644 --- a/quickshell/Widgets/VpnDetailContent.qml +++ b/quickshell/Widgets/VpnDetailContent.qml @@ -19,7 +19,9 @@ Rectangle { implicitHeight: 32 + 1 + listHeight + Theme.spacingS * 4 + Theme.spacingM * 2 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + color: Theme.nestedSurface + border.color: Theme.outlineMedium + border.width: Theme.layerOutlineWidth FileBrowserSurfaceModal { id: fileBrowser diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index 96ddc3f5..a92b4bed 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -914,6 +914,31 @@ ], "icon": "visibility_off" }, + { + "section": "trayIconTint", + "label": "System Tray Icon Tint", + "tabIndex": 3, + "category": "Dank Bar", + "keywords": [ + "bar", + "dank", + "icon", + "icons", + "monochrome", + "panel", + "primary", + "secondary", + "saturation", + "status", + "statusbar", + "strength", + "taskbar", + "tint", + "tray" + ], + "icon": "filter_b_and_w", + "description": "Choose monochrome or a theme color tint for system tray icons" + }, { "section": "workspaceDragReorder", "label": "Drag to Reorder", @@ -2870,6 +2895,60 @@ "tint" ] }, + { + "section": "blurForegroundLayers", + "label": "Foreground Layers", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "blur", + "blurred", + "colors", + "contrast", + "foreground", + "frosted", + "glass", + "layers", + "look", + "panels", + "scheme", + "show", + "stronger", + "style", + "surfaces", + "theme" + ], + "description": "Show foreground surfaces on blurred panels for stronger contrast" + }, + { + "section": "blurLayerOutlineOpacity", + "label": "Layer Outline Opacity", + "tabIndex": 10, + "category": "Theme & Colors", + "keywords": [ + "appearance", + "blur", + "border", + "cards", + "colors", + "contrast", + "control", + "foreground", + "frosted", + "glass", + "intensity", + "layers", + "notifications", + "opacity", + "outline", + "pills", + "surfaces", + "theme", + "widgets" + ], + "description": "Controls outlines around blurred foreground cards, pills, and notification cards" + }, { "section": "matugenTemplateGtk", "label": "GTK", @@ -4534,6 +4613,27 @@ ], "description": "Automatically lock the screen when DMS starts" }, + { + "section": "lockBeforeSuspend", + "label": "Lock before suspend", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "automatic", + "automatically", + "before", + "lock", + "login", + "password", + "prepares", + "screen", + "security", + "sleep", + "suspend", + "system" + ], + "description": "Automatically lock the screen when the system prepares to suspend" + }, { "section": "lockScreenNotificationMode", "label": "Notification Display", @@ -6556,27 +6656,6 @@ "icon": "schedule", "description": "Gradually fade the screen before locking with a configurable grace period" }, - { - "section": "lockBeforeSuspend", - "label": "Lock before suspend", - "tabIndex": 21, - "category": "Power & Sleep", - "keywords": [ - "automatically", - "before", - "energy", - "lock", - "power", - "prepares", - "screen", - "security", - "shutdown", - "sleep", - "suspend", - "system" - ], - "description": "Automatically lock the screen when the system prepares to suspend" - }, { "section": "fadeToLockGracePeriod", "label": "Lock fade grace period", @@ -6747,6 +6826,29 @@ "turn" ] }, + { + "section": "postLockMonitorTimeout", + "label": "Turn off monitors after lock", + "tabIndex": 21, + "category": "Power & Sleep", + "keywords": [ + "after", + "display", + "energy", + "lock", + "monitor", + "monitors", + "off", + "post", + "power", + "screen", + "shutdown", + "sleep", + "suspend", + "timeout", + "turn" + ] + }, { "section": "powerMenuGridLayout", "label": "Use Grid Layout",