diff --git a/dotfiles/.config/quickshell/modules/bar/BluetoothIndicator.qml b/dotfiles/.config/quickshell/modules/bar/BluetoothIndicator.qml index 7002f67..0b94c16 100644 --- a/dotfiles/.config/quickshell/modules/bar/BluetoothIndicator.qml +++ b/dotfiles/.config/quickshell/modules/bar/BluetoothIndicator.qml @@ -173,6 +173,18 @@ Item { color: toggleRoot.checked ? Colors.primary : Colors.muted opacity: toggleRoot.checked ? 1 : 0.35 } + // Hover-only outline, offset outside the switch itself rather than + // drawn on its edge — the switch lags behind a click until the + // backend confirms it (e.g. the adapter's enabled state), so this + // is just a "you can click this" cue, not click feedback. + Rectangle { + anchors.fill: parent + anchors.margins: -4 + radius: 0 + color: "transparent" + border.color: Colors.foreground + border.width: toggleMouse.containsMouse ? 1 : 0 + } Rectangle { width: parent.height - 4 height: parent.height - 4 @@ -183,7 +195,9 @@ Item { Behavior on x { NumberAnimation { duration: Appearance.animationDuration } } } MouseArea { + id: toggleMouse anchors.fill: parent + hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: toggleRoot.toggled() } diff --git a/dotfiles/.config/quickshell/modules/bar/NetworkIndicator.qml b/dotfiles/.config/quickshell/modules/bar/NetworkIndicator.qml index f2ef2cd..7347b3b 100644 --- a/dotfiles/.config/quickshell/modules/bar/NetworkIndicator.qml +++ b/dotfiles/.config/quickshell/modules/bar/NetworkIndicator.qml @@ -601,6 +601,18 @@ Item { color: toggleRoot.checked ? Colors.primary : Colors.muted opacity: toggleRoot.checked ? 1 : 0.35 } + // Hover-only outline, offset outside the switch itself rather than + // drawn on its edge — the switch lags behind a click until the + // backend confirms it (e.g. Networking.wifiEnabled), so this is just + // a "you can click this" cue, not click feedback. + Rectangle { + anchors.fill: parent + anchors.margins: -4 + radius: 0 + color: "transparent" + border.color: Colors.foreground + border.width: toggleMouse.containsMouse ? 1 : 0 + } Rectangle { width: parent.height - 4 height: parent.height - 4 @@ -611,7 +623,9 @@ Item { Behavior on x { NumberAnimation { duration: Appearance.animationDuration } } } MouseArea { + id: toggleMouse anchors.fill: parent + hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: toggleRoot.toggled() } @@ -631,6 +645,22 @@ Item { color: (netRow.net.connected || netRow.passwordOpen) ? Qt.rgba(Colors.primary.r, Colors.primary.g, Colors.primary.b, 0.18) : (rowMouse.containsMouse ? Colors.primary : "transparent") + border.color: (netRow.net.connected || netRow.passwordOpen) ? Colors.primary : Colors.muted + border.width: 1 + + // Hover-only outline, offset outside the row rather than drawn on + // its own edge — same treatment as ToggleSwitch's halo and the DNS + // pills. networkListColumn insets its rows by 3px on each side + // specifically to give this room without getting cropped by the + // Flickable's clip. + Rectangle { + anchors.fill: parent + anchors.margins: -3 + radius: 0 + color: "transparent" + border.color: Colors.foreground + border.width: rowMouse.containsMouse ? 1 : 0 + } Column { anchors.fill: parent @@ -872,6 +902,18 @@ Item { border.width: 1 opacity: root.dnsBusy ? 0.6 : 1 + // Hover-only outline, offset outside the pill + // itself rather than drawn on its own border — + // same treatment as ToggleSwitch's halo. + Rectangle { + anchors.fill: parent + anchors.margins: -3 + radius: 0 + color: "transparent" + border.color: Colors.foreground + border.width: dnsMouse.containsMouse ? 1 : 0 + } + Text { anchors.centerIn: parent text: dnsPill.modelData @@ -1164,7 +1206,12 @@ Item { Column { id: networkListColumn - width: networkListFlick.width + // Inset 3px on each side (rather than flush with + // the Flickable) so NetworkRow's hover halo below + // has room to sit outside the row without being + // cropped by the Flickable's own clip. + x: 3 + width: networkListFlick.width - 6 spacing: 6 Column { diff --git a/dotfiles/.config/quickshell/modules/bar/TailscaleIndicator.qml b/dotfiles/.config/quickshell/modules/bar/TailscaleIndicator.qml index e98f281..5b9f47d 100644 --- a/dotfiles/.config/quickshell/modules/bar/TailscaleIndicator.qml +++ b/dotfiles/.config/quickshell/modules/bar/TailscaleIndicator.qml @@ -505,6 +505,18 @@ Item { color: toggleRoot.checked ? Colors.primary : Colors.muted opacity: toggleRoot.checked ? 1 : 0.35 } + // Hover-only outline, offset outside the switch itself rather than + // drawn on its edge — the switch lags behind a click until the + // backend confirms it (e.g. root.active), so this is just a "you + // can click this" cue, not click feedback. + Rectangle { + anchors.fill: parent + anchors.margins: -4 + radius: 0 + color: "transparent" + border.color: Colors.foreground + border.width: toggleMouse.containsMouse ? 1 : 0 + } Rectangle { width: parent.height - 4 height: parent.height - 4 @@ -515,7 +527,9 @@ Item { Behavior on x { NumberAnimation { duration: Appearance.animationDuration } } } MouseArea { + id: toggleMouse anchors.fill: parent + hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: toggleRoot.toggled() } diff --git a/dotfiles/.config/quickshell/modules/bar/VpnIndicator.qml b/dotfiles/.config/quickshell/modules/bar/VpnIndicator.qml index 98e8b75..aa0d93f 100644 --- a/dotfiles/.config/quickshell/modules/bar/VpnIndicator.qml +++ b/dotfiles/.config/quickshell/modules/bar/VpnIndicator.qml @@ -373,6 +373,20 @@ Item { color: toggleRoot.checked ? Colors.primary : Colors.muted opacity: (toggleRoot.checked ? 1 : 0.35) * (toggleRoot.busy ? 0.6 : 1) } + // Hover-only outline, offset outside the switch itself rather than + // drawn on its edge — the switch lags behind a click until the + // connect/disconnect process actually finishes, so this is just a + // "you can click this" cue, not click feedback. toggleMouse.containsMouse + // is already false while busy, since a disabled MouseArea doesn't + // track hover. + Rectangle { + anchors.fill: parent + anchors.margins: -4 + radius: 0 + color: "transparent" + border.color: Colors.foreground + border.width: toggleMouse.containsMouse ? 1 : 0 + } Rectangle { width: parent.height - 4 height: parent.height - 4 @@ -383,8 +397,10 @@ Item { Behavior on x { NumberAnimation { duration: Appearance.animationDuration } } } MouseArea { + id: toggleMouse anchors.fill: parent enabled: !toggleRoot.busy + hoverEnabled: true cursorShape: toggleRoot.busy ? Qt.ArrowCursor : Qt.PointingHandCursor onClicked: toggleRoot.toggled() }