diff --git a/.config/anyrun/config.ron b/.config/anyrun/config.ron deleted file mode 100644 index c3eafd7a8..000000000 --- a/.config/anyrun/config.ron +++ /dev/null @@ -1,13 +0,0 @@ -Config( - x: Fraction(0.500000), - y: Absolute(15), - width: Fraction(0.300000), - height: Absolute(0), - hide_icons: false, - ignore_exclusive_zones: false, - layer: Overlay, - hide_plugin_info: true, - close_on_click: true, - show_results_immediately: false, - max_entries: None, -) diff --git a/.config/anyrun/style.css b/.config/anyrun/style.css deleted file mode 100644 index ca45f260d..000000000 --- a/.config/anyrun/style.css +++ /dev/null @@ -1,66 +0,0 @@ -* { - all: unset; - font-size: 1.3rem; -} - -#window, -#match, -#entry, -#plugin, -#main { - background: transparent; -} - -#match.activatable { - border-radius: 16px; - padding: 0.3rem 0.9rem; - margin-top: 0.01rem; -} -#match.activatable:first-child { - margin-top: 0.7rem; -} -#match.activatable:last-child { - margin-bottom: 0.6rem; -} - -#plugin:hover #match.activatable { - border-radius: 10px; - padding: 0.3rem; - margin-top: 0.01rem; - margin-bottom: 0; -} - -#match:selected, -#match:hover, -#plugin:hover { - background: #2e3131; -} - -#entry { - background: #0b0f10; - border: 1px solid #0b0f10; - border-radius: 16px; - margin: 0.5rem; - padding: 0.3rem 1rem; -} - -list > #plugin { - border-radius: 16px; - margin: 0 0.3rem; -} -list > #plugin:first-child { - margin-top: 0.3rem; -} -list > #plugin:last-child { - margin-bottom: 0.3rem; -} -list > #plugin:hover { - padding: 0.6rem; -} - -box#main { - background: #0b0f10; - box-shadow: inset 0 0 0 1px #0b0f10, 0 0 0 1px #0b0f10; - border-radius: 24px; - padding: 0.3rem; -} diff --git a/.config/hypr/hyprland/execs.conf b/.config/hypr/hyprland/execs.conf index 33fc3ffb7..0d04c512e 100644 --- a/.config/hypr/hyprland/execs.conf +++ b/.config/hypr/hyprland/execs.conf @@ -1,7 +1,5 @@ # Bar, wallpaper exec-once = ~/.config/hypr/hyprland/scripts/start_geoclue_agent.sh & gammastep -exec-once = sleep 0.7; [ "$(hyprctl monitors -j | jq 'length')" -eq 1 ] && swww-daemon --format xrgb --no-cache || swww-daemon --format xrgb -exec-once = sleep 0.7; swww img "$(cat ~/.local/state/quickshell/user/generated/wallpaper/path.txt)" --transition-step 100 --transition-fps 120 --transition-type grow --transition-angle 30 --transition-duration 1 exec-once = qs -c $qsConfig & # Input method diff --git a/.config/hypr/hyprland/rules.conf b/.config/hypr/hyprland/rules.conf index 6b6922a5b..aa9eb7e38 100644 --- a/.config/hypr/hyprland/rules.conf +++ b/.config/hypr/hyprland/rules.conf @@ -58,6 +58,8 @@ windowrulev2 = center, title:^(Open Folder)(.*)$ windowrulev2 = center, title:^(Save As)(.*)$ windowrulev2 = center, title:^(Library)(.*)$ windowrulev2 = center, title:^(File Upload)(.*)$ +windowrulev2 = center, title:^(.*)(wants to save)$ +windowrulev2 = center, title:^(.*)(wants to open)$ windowrulev2 = float, title:^(Open File)(.*)$ windowrulev2 = float, title:^(Select a File)(.*)$ windowrulev2 = float, title:^(Choose wallpaper)(.*)$ @@ -65,6 +67,8 @@ windowrulev2 = float, title:^(Open Folder)(.*)$ windowrulev2 = float, title:^(Save As)(.*)$ windowrulev2 = float, title:^(Library)(.*)$ windowrulev2 = float, title:^(File Upload)(.*)$ +windowrulev2 = float, title:^(.*)(wants to save)$ +windowrulev2 = float, title:^(.*)(wants to open)$ # --- Tearing --- diff --git a/.config/hypr/hyprlock.conf b/.config/hypr/hyprlock.conf index 1e936ce58..ea1d8f0f9 100644 --- a/.config/hypr/hyprlock.conf +++ b/.config/hypr/hyprlock.conf @@ -58,7 +58,7 @@ label { # Date text = cmd[update:5000] date +"%A, %B %d" color = $text_color font_size = 17 - font_family = $font_family + font_family = $font_family_clock position = 0, 240 halign = center diff --git a/.config/matugen/templates/hyprland/hyprlock.conf b/.config/matugen/templates/hyprland/hyprlock.conf index eab167199..d557f7069 100644 --- a/.config/matugen/templates/hyprland/hyprlock.conf +++ b/.config/matugen/templates/hyprland/hyprlock.conf @@ -2,8 +2,8 @@ $text_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF) $entry_background_color = rgba({{colors.on_primary_fixed.default.hex_stripped}}11) $entry_border_color = rgba({{colors.outline.default.hex_stripped}}55) $entry_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF) -$font_family = Rubik Light -$font_family_clock = Rubik Light +$font_family = Rubik +$font_family_clock = Space Grotesk $font_material_symbols = Material Symbols Rounded background { @@ -58,7 +58,7 @@ label { # Date text = cmd[update:5000] date +"%A, %B %d" color = $text_color font_size = 17 - font_family = $font_family + font_family = $font_family_clock position = 0, 240 halign = center diff --git a/.config/quickshell/ii/modules/background/Background.qml b/.config/quickshell/ii/modules/background/Background.qml new file mode 100644 index 000000000..8c41e926d --- /dev/null +++ b/.config/quickshell/ii/modules/background/Background.qml @@ -0,0 +1,223 @@ +pragma ComponentBehavior: Bound + +import "root:/" +import "root:/modules/common" +import "root:/modules/common/widgets" +import "root:/services" +import "root:/modules/common/functions/color_utils.js" as ColorUtils +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import Quickshell +import Quickshell.Io +import Quickshell.Wayland +import Quickshell.Hyprland + +Scope { + id: root + readonly property bool fixedClockPosition: Config.options.background.fixedClockPosition + readonly property real fixedClockX: Config.options.background.clockX + readonly property real fixedClockY: Config.options.background.clockY + + Variants { + // For each monitor + model: Quickshell.screens + + PanelWindow { + id: bgRoot + + required property var modelData + // Workspaces + property HyprlandMonitor monitor: Hyprland.monitorFor(modelData) + property list relevantWindows: HyprlandData.windowList.filter(win => win.monitor == monitor.id && win.workspace.id >= 0).sort((a, b) => a.workspace.id - b.workspace.id) + property int firstWorkspaceId: relevantWindows[0]?.workspace.id || 1 + property int lastWorkspaceId: relevantWindows[relevantWindows.length - 1]?.workspace.id || 10 + // Wallpaper + property string wallpaperPath: Config.options.background.wallpaperPath + property real preferredWallpaperScale: Config.options.background.parallax.workspaceZoom + property real effectiveWallpaperScale: 1 // Some reasonable init value, to be updated + property int wallpaperWidth: modelData.width // Some reasonable init value, to be updated + property int wallpaperHeight: modelData.height // Some reasonable init value, to be updated + property real movableXSpace: (effectiveWallpaperScale - 1) / 2 * screen.width + property real movableYSpace: (effectiveWallpaperScale - 1) / 2 * screen.height + // Position + property real clockX: (modelData.width / 2) + ((Math.random() < 0.5 ? -1 : 1) * modelData.width) + property real clockY: (modelData.height / 2) + ((Math.random() < 0.5 ? -1 : 1) * modelData.height) + property var textHorizontalAlignment: clockX < screen.width / 3 ? Text.AlignLeft : + (clockX > screen.width * 2 / 3 ? Text.AlignRight : Text.AlignHCenter) + // Colors + property color dominantColor: Appearance.colors.colPrimary + property bool dominantColorIsDark: dominantColor.hslLightness < 0.5 + property color colText: ColorUtils.colorWithLightness(Appearance.colors.colPrimary, (dominantColorIsDark ? 0.8 : 0.12)) + + // Layer props + screen: modelData + exclusionMode: ExclusionMode.Ignore + WlrLayershell.layer: WlrLayer.Bottom + WlrLayershell.namespace: "quickshell:background" + anchors { + top: true + bottom: true + left: true + right: true + } + color: "transparent" + + onWallpaperPathChanged: { + bgRoot.updateZoomScale() + // Clock position gets updated after zoom scale is updated + } + + // Wallpaper zoom scale + function updateZoomScale() { + getWallpaperSizeProc.path = bgRoot.wallpaperPath + getWallpaperSizeProc.running = true; + } + Process { + id: getWallpaperSizeProc + property string path: bgRoot.wallpaperPath + command: [ "magick", "identify", "-format", "%w %h", path ] + stdout: StdioCollector { + id: wallpaperSizeOutputCollector + onStreamFinished: { + const output = wallpaperSizeOutputCollector.text + const [width, height] = output.split(" ").map(Number); + bgRoot.wallpaperWidth = width + bgRoot.wallpaperHeight = height + bgRoot.effectiveWallpaperScale = Math.max(1, Math.min( + bgRoot.preferredWallpaperScale, + width / bgRoot.screen.width, + height / bgRoot.screen.height + )); + + bgRoot.updateClockPosition() + } + } + } + + // Clock positioning + function updateClockPosition() { + // Somehow all this manual setting is needed to make the proc correctly use the new values + leastBusyRegionProc.path = bgRoot.wallpaperPath + leastBusyRegionProc.contentWidth = clock.implicitWidth + leastBusyRegionProc.contentHeight = clock.implicitHeight + leastBusyRegionProc.horizontalPadding = (effectiveWallpaperScale - 1) / 2 * screen.width + 100 + leastBusyRegionProc.verticalPadding = (effectiveWallpaperScale - 1) / 2 * screen.height + 100 + leastBusyRegionProc.running = false; + leastBusyRegionProc.running = true; + } + Process { + id: leastBusyRegionProc + property string path: bgRoot.wallpaperPath + property int contentWidth: 300 + property int contentHeight: 300 + property int horizontalPadding: bgRoot.movableXSpace + property int verticalPadding: bgRoot.movableYSpace + command: [Quickshell.configPath("scripts/images/least_busy_region.py"), + "--screen-width", bgRoot.screen.width, + "--screen-height", bgRoot.screen.height, + "--width", contentWidth, + "--height", contentHeight, + "--horizontal-padding", horizontalPadding, + "--vertical-padding", verticalPadding, + path + ] + stdout: StdioCollector { + id: leastBusyRegionOutputCollector + onStreamFinished: { + const output = leastBusyRegionOutputCollector.text + // console.log("[Background] Least busy region output:", output) + if (output.length === 0) return; + const parsedContent = JSON.parse(output) + bgRoot.clockX = parsedContent.center_x + bgRoot.clockY = parsedContent.center_y + bgRoot.dominantColor = parsedContent.dominant_color || Appearance.colors.colPrimary + } + } + } + + // Wallpaper + Image { + property real value // 0 to 1, for offset + value: { + // Range = half-groups that workspaces span on + const chunkSize = 5; + const lower = Math.floor(bgRoot.firstWorkspaceId / chunkSize) * chunkSize; + const upper = Math.ceil(bgRoot.lastWorkspaceId / chunkSize) * chunkSize; + const range = upper - lower; + return (bgRoot.monitor.activeWorkspace.id - lower) / range + + (0.15 * GlobalStates.sidebarRightOpen * Config.options.background.parallax.enableSidebar) + - (0.15 * GlobalStates.sidebarLeftOpen * Config.options.background.parallax.enableSidebar) + } + property real effectiveValue: Math.max(0, Math.min(1, value)) + x: -(bgRoot.movableXSpace) - (effectiveValue - 0.5) * 2 * bgRoot.movableXSpace + y: -(bgRoot.movableYSpace) + source: bgRoot.wallpaperPath + fillMode: Image.PreserveAspectCrop + Behavior on x { + NumberAnimation { + duration: 600 + easing.type: Easing.OutCubic + } + } + sourceSize { + width: bgRoot.screen.width * bgRoot.effectiveWallpaperScale + height: bgRoot.screen.height * bgRoot.effectiveWallpaperScale + } + + // The clock + Item { + id: clock + anchors { + left: parent.left + top: parent.top + leftMargin: ((root.fixedClockPosition ? root.fixedClockX : bgRoot.clockX * bgRoot.effectiveWallpaperScale) - implicitWidth / 2) + topMargin: ((root.fixedClockPosition ? root.fixedClockY : bgRoot.clockY * bgRoot.effectiveWallpaperScale) - implicitHeight / 2) + Behavior on leftMargin { + animation: Appearance.animation.elementMove.numberAnimation.createObject(this) + } + Behavior on topMargin { + animation: Appearance.animation.elementMove.numberAnimation.createObject(this) + } + } + + implicitWidth: clockColumn.implicitWidth + implicitHeight: clockColumn.implicitHeight + + ColumnLayout { + id: clockColumn + anchors.centerIn: parent + spacing: -5 + + StyledText { + Layout.fillWidth: true + horizontalAlignment: bgRoot.textHorizontalAlignment + font { + family: Appearance.font.family.expressive + pixelSize: 85 + weight: Font.Medium + } + color: bgRoot.colText + style: Text.Raised + styleColor: Appearance.colors.colShadow + text: DateTime.time + } + StyledText { + Layout.fillWidth: true + horizontalAlignment: bgRoot.textHorizontalAlignment + font { + family: Appearance.font.family.expressive + pixelSize: 20 + weight: Font.Medium + } + color: bgRoot.colText + style: Text.Raised + styleColor: Appearance.colors.colShadow + text: DateTime.date + } + } + } + } + } + } +} diff --git a/.config/quickshell/ii/modules/backgroundWidgets/BackgroundWidgets.qml b/.config/quickshell/ii/modules/backgroundWidgets/BackgroundWidgets.qml deleted file mode 100644 index 35f30534e..000000000 --- a/.config/quickshell/ii/modules/backgroundWidgets/BackgroundWidgets.qml +++ /dev/null @@ -1,139 +0,0 @@ -import "root:/" -import "root:/modules/common" -import "root:/modules/common/widgets" -import "root:/services" -import "root:/modules/common/functions/color_utils.js" as ColorUtils -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts -import Quickshell -import Quickshell.Io -import Quickshell.Wayland -import Quickshell.Hyprland -import Quickshell.Services.UPower - -Scope { - id: root - property string filePath: `${Directories.state}/user/generated/wallpaper/least_busy_region.json` - property real defaultX: (Config.options?.background.clockX ?? -500) - property real defaultY: (Config.options?.background.clockY ?? -500) - property real centerX: defaultX - property real centerY: defaultY - property real effectiveCenterX: Config.options?.background.fixedClockPosition ? defaultX : centerX - property real effectiveCenterY: Config.options?.background.fixedClockPosition ? defaultY : centerY - property color dominantColor: Appearance.colors.colPrimary - property bool dominantColorIsDark: dominantColor.hslLightness < 0.5 - property color colBackground: ColorUtils.transparentize(ColorUtils.mix(Appearance.colors.colPrimary, Appearance.colors.colSecondaryContainer), 1) - property color colText: ColorUtils.colorWithLightness(Appearance.colors.colPrimary, (root.dominantColorIsDark ? 0.8 : 0.12)) - - function updateWidgetPosition(fileContent) { - // console.log("[BackgroundWidgets] Updating widget position with content:", fileContent) - const parsedContent = JSON.parse(fileContent) - root.centerX = parsedContent.center_x - root.centerY = parsedContent.center_y - root.dominantColor = parsedContent.dominant_color || Appearance.colors.colPrimary - } - - Timer { - id: delayedFileRead - interval: Config.options.hacks.arbitraryRaceConditionDelay - running: false - onTriggered: { - root.updateWidgetPosition(leastBusyRegionFileView.text()) - } - } - - FileView { - id: leastBusyRegionFileView - path: Qt.resolvedUrl(root.filePath) - watchChanges: !Config.options?.background.fixedClockPosition - onFileChanged: { - this.reload() - delayedFileRead.start() - } - onLoadedChanged: { - const fileContent = leastBusyRegionFileView.text() - root.updateWidgetPosition(fileContent) - } - } - - Variants { // For each monitor - model: Quickshell.screens - - LazyLoader { - required property var modelData - readonly property HyprlandMonitor monitor: Hyprland.monitorFor(modelData) - activeAsync: !ToplevelManager.activeToplevel?.activated - component: PanelWindow { // Window - id: windowRoot - screen: modelData - property var textHorizontalAlignment: root.effectiveCenterX / monitor.scale < windowRoot.width / 3 ? Text.AlignLeft : - (root.effectiveCenterX / monitor.scale > windowRoot.width * 2 / 3 ? Text.AlignRight : Text.AlignHCenter) - - WlrLayershell.layer: WlrLayer.Bottom - WlrLayershell.namespace: "quickshell:backgroundWidgets" - - anchors { - top: true - bottom:true - left: true - right: true - } - color: "transparent" - // HyprlandWindow.visibleMask: Region { // Buggy with scaled monitors - // item: widgetBackground - // } - - Rectangle { - id: widgetBackground - property real verticalPadding: 20 - property real horizontalPadding: 30 - radius: 40 - color: root.colBackground - implicitHeight: columnLayout.implicitHeight + verticalPadding * 2 - implicitWidth: columnLayout.implicitWidth + horizontalPadding * 2 - anchors { - left: parent.left - top: parent.top - leftMargin: (root.effectiveCenterX / monitor.scale - implicitWidth / 2) - topMargin: (root.effectiveCenterY / monitor.scale - implicitHeight / 2) - Behavior on leftMargin { - animation: Appearance.animation.elementMove.numberAnimation.createObject(this) - } - Behavior on topMargin { - animation: Appearance.animation.elementMove.numberAnimation.createObject(this) - } - } - - ColumnLayout { - id: columnLayout - anchors.centerIn: parent - spacing: -5 - - StyledText { - Layout.fillWidth: true - horizontalAlignment: windowRoot.textHorizontalAlignment - font.pixelSize: 95 - color: root.colText - style: Text.Raised - styleColor: Appearance.colors.colShadow - text: DateTime.time - } - StyledText { - Layout.fillWidth: true - horizontalAlignment: windowRoot.textHorizontalAlignment - font.pixelSize: 25 - color: root.colText - style: Text.Raised - styleColor: Appearance.colors.colShadow - text: DateTime.date - } - } - } - - } - } - - } - -} diff --git a/.config/quickshell/ii/modules/bar/Bar.qml b/.config/quickshell/ii/modules/bar/Bar.qml index 27d5a6de9..08383c10e 100644 --- a/.config/quickshell/ii/modules/bar/Bar.qml +++ b/.config/quickshell/ii/modules/bar/Bar.qml @@ -3,7 +3,7 @@ import "root:/services" import "root:/modules/common/" import "root:/modules/common/widgets" import "root:/modules/common/functions/color_utils.js" as ColorUtils -import "root:/modules/bar/weather" +import "./weather" import QtQuick import QtQuick.Controls import QtQuick.Layouts diff --git a/.config/quickshell/ii/modules/cheatsheet/Cheatsheet.qml b/.config/quickshell/ii/modules/cheatsheet/Cheatsheet.qml index ca9198f9d..a0b22779c 100644 --- a/.config/quickshell/ii/modules/cheatsheet/Cheatsheet.qml +++ b/.config/quickshell/ii/modules/cheatsheet/Cheatsheet.qml @@ -158,14 +158,20 @@ Scope { // Scope spacing: 10 Behavior on implicitWidth { + id: contentWidthBehavior + enabled: false animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) } Behavior on implicitHeight { + id: contentHeightBehavior + enabled: false animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) } currentIndex: tabBar.externalTrackedTab onCurrentIndexChanged: { + contentWidthBehavior.enabled = true; + contentHeightBehavior.enabled = true; tabBar.enableIndicatorAnimation = true; root.selectedTab = currentIndex; } diff --git a/.config/quickshell/ii/modules/common/Appearance.qml b/.config/quickshell/ii/modules/common/Appearance.qml index 88e04bd30..7cc555ec8 100644 --- a/.config/quickshell/ii/modules/common/Appearance.qml +++ b/.config/quickshell/ii/modules/common/Appearance.qml @@ -168,6 +168,7 @@ Singleton { property string iconNerd: "SpaceMono NF" property string monospace: "JetBrains Mono NF" property string reading: "Readex Pro" + property string expressive: "Space Grotesk" } property QtObject pixelSize: QtObject { property int smallest: 10 diff --git a/.config/quickshell/ii/modules/common/Config.qml b/.config/quickshell/ii/modules/common/Config.qml index 1b9b1dd81..33ebc94c6 100644 --- a/.config/quickshell/ii/modules/common/Config.qml +++ b/.config/quickshell/ii/modules/common/Config.qml @@ -98,6 +98,12 @@ Singleton { property bool fixedClockPosition: false property real clockX: -500 property real clockY: -500 + property string wallpaperPath: Quickshell.configPath("assets/images/default_wallpaper.png") + property JsonObject parallax: JsonObject { + property bool enableWorkspace: true + property real workspaceZoom: 1.07 // Relative to your screen, not wallpaper size + property bool enableSidebar: true + } } property JsonObject bar: JsonObject { diff --git a/.config/quickshell/ii/modules/dock/Dock.qml b/.config/quickshell/ii/modules/dock/Dock.qml index 04af9810a..5b8e1b198 100644 --- a/.config/quickshell/ii/modules/dock/Dock.qml +++ b/.config/quickshell/ii/modules/dock/Dock.qml @@ -19,131 +19,128 @@ Scope { // Scope Variants { // For each monitor model: Quickshell.screens - LazyLoader { - id: dockLoader + PanelWindow { // Window required property var modelData - activeAsync: Config.options?.dock.hoverToReveal || (!ToplevelManager.activeToplevel?.activated) + id: dockRoot + screen: modelData + + property bool reveal: root.pinned + || (Config.options?.dock.hoverToReveal && dockMouseArea.containsMouse) + || dockApps.requestDockShow + || (!ToplevelManager.activeToplevel?.activated) - component: PanelWindow { // Window - id: dockRoot - screen: dockLoader.modelData - - property bool reveal: root.pinned - || (Config.options?.dock.hoverToReveal && dockMouseArea.containsMouse) - || dockApps.requestDockShow - || (!ToplevelManager.activeToplevel?.activated) + anchors { + bottom: true + left: true + right: true + } + exclusiveZone: root.pinned ? implicitHeight + - (Appearance.sizes.hyprlandGapsOut) + - (Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut) : 0 + + implicitWidth: dockBackground.implicitWidth + WlrLayershell.namespace: "quickshell:dock" + color: "transparent" + + implicitHeight: (Config.options?.dock.height ?? 70) + Appearance.sizes.elevationMargin + Appearance.sizes.hyprlandGapsOut + + mask: Region { + item: dockMouseArea + } + + MouseArea { + id: dockMouseArea + height: parent.height anchors { - bottom: true - left: true - right: true - } - - exclusiveZone: root.pinned ? implicitHeight - - (Appearance.sizes.hyprlandGapsOut) - - (Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut) : 0 - - implicitWidth: dockBackground.implicitWidth - WlrLayershell.namespace: "quickshell:dock" - color: "transparent" - - implicitHeight: (Config.options?.dock.height ?? 70) + Appearance.sizes.elevationMargin + Appearance.sizes.hyprlandGapsOut - - mask: Region { - item: dockMouseArea - } - - MouseArea { - id: dockMouseArea - anchors.top: parent.top - height: parent.height - anchors.topMargin: dockRoot.reveal ? 0 : + top: parent.top + topMargin: dockRoot.reveal ? 0 : Config.options?.dock.hoverToReveal ? (dockRoot.implicitHeight - Config.options.dock.hoverRegionHeight) : (dockRoot.implicitHeight + 1) - - anchors.left: parent.left - anchors.right: parent.right - hoverEnabled: true - - Behavior on anchors.topMargin { - animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) - } - - Item { - id: dockHoverRegion - anchors.fill: parent - - Item { // Wrapper for the dock background - id: dockBackground - anchors { - top: parent.top - bottom: parent.bottom - horizontalCenter: parent.horizontalCenter - } - - implicitWidth: dockRow.implicitWidth + 5 * 2 - height: parent.height - Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut - - StyledRectangularShadow { - target: dockVisualBackground - } - Rectangle { // The real rectangle that is visible - id: dockVisualBackground - property real margin: Appearance.sizes.elevationMargin - anchors.fill: parent - anchors.topMargin: Appearance.sizes.elevationMargin - anchors.bottomMargin: Appearance.sizes.hyprlandGapsOut - color: Appearance.colors.colLayer0 - border.width: 1 - border.color: Appearance.m3colors.m3outlineVariant - radius: Appearance.rounding.large - } - - RowLayout { - id: dockRow - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - spacing: 3 - property real padding: 5 - - VerticalButtonGroup { - Layout.topMargin: Appearance.sizes.hyprlandGapsOut // why does this work - GroupButton { // Pin button - baseWidth: 35 - baseHeight: 35 - clickedWidth: baseWidth - clickedHeight: baseHeight + 20 - buttonRadius: Appearance.rounding.normal - toggled: root.pinned - onClicked: root.pinned = !root.pinned - contentItem: MaterialSymbol { - text: "keep" - horizontalAlignment: Text.AlignHCenter - iconSize: Appearance.font.pixelSize.larger - color: root.pinned ? Appearance.m3colors.m3onPrimary : Appearance.colors.colOnLayer0 - } - } - } - DockSeparator {} - DockApps { id: dockApps; } - DockSeparator {} - DockButton { - Layout.fillHeight: true - onClicked: Hyprland.dispatch("global quickshell:overviewToggle") - contentItem: MaterialSymbol { - anchors.fill: parent - horizontalAlignment: Text.AlignHCenter - font.pixelSize: parent.width / 2 - text: "apps" - color: Appearance.colors.colOnLayer0 - } - } - } - } - } - + horizontalCenter: parent.horizontalCenter } + implicitWidth: dockHoverRegion.implicitWidth + Appearance.sizes.elevationMargin * 2 + hoverEnabled: true + + Behavior on anchors.topMargin { + animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) + } + + Item { + id: dockHoverRegion + anchors.fill: parent + implicitWidth: dockBackground.implicitWidth + + Item { // Wrapper for the dock background + id: dockBackground + anchors { + top: parent.top + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + + implicitWidth: dockRow.implicitWidth + 5 * 2 + height: parent.height - Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut + + StyledRectangularShadow { + target: dockVisualBackground + } + Rectangle { // The real rectangle that is visible + id: dockVisualBackground + property real margin: Appearance.sizes.elevationMargin + anchors.fill: parent + anchors.topMargin: Appearance.sizes.elevationMargin + anchors.bottomMargin: Appearance.sizes.hyprlandGapsOut + color: Appearance.colors.colLayer0 + border.width: 1 + border.color: Appearance.m3colors.m3outlineVariant + radius: Appearance.rounding.large + } + + RowLayout { + id: dockRow + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + spacing: 3 + property real padding: 5 + + VerticalButtonGroup { + Layout.topMargin: Appearance.sizes.hyprlandGapsOut // why does this work + GroupButton { // Pin button + baseWidth: 35 + baseHeight: 35 + clickedWidth: baseWidth + clickedHeight: baseHeight + 20 + buttonRadius: Appearance.rounding.normal + toggled: root.pinned + onClicked: root.pinned = !root.pinned + contentItem: MaterialSymbol { + text: "keep" + horizontalAlignment: Text.AlignHCenter + iconSize: Appearance.font.pixelSize.larger + color: root.pinned ? Appearance.m3colors.m3onPrimary : Appearance.colors.colOnLayer0 + } + } + } + DockSeparator {} + DockApps { id: dockApps; } + DockSeparator {} + DockButton { + Layout.fillHeight: true + onClicked: Hyprland.dispatch("global quickshell:overviewToggle") + contentItem: MaterialSymbol { + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + font.pixelSize: parent.width / 2 + text: "apps" + color: Appearance.colors.colOnLayer0 + } + } + } + } + } + } } } diff --git a/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml b/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml index b58bd7421..0da91a99a 100644 --- a/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml +++ b/.config/quickshell/ii/modules/mediaControls/PlayerControl.qml @@ -149,7 +149,7 @@ Item { // Player instance Rectangle { anchors.fill: parent - color: ColorUtils.transparentize(blendedColors.colLayer0, 0.25) + color: ColorUtils.transparentize(blendedColors.colLayer0, 0.3) radius: root.popupRounding } } diff --git a/.config/quickshell/ii/modules/overview/Overview.qml b/.config/quickshell/ii/modules/overview/Overview.qml index 1e90674db..b11d35646 100644 --- a/.config/quickshell/ii/modules/overview/Overview.qml +++ b/.config/quickshell/ii/modules/overview/Overview.qml @@ -37,11 +37,8 @@ Scope { // item: GlobalStates.overviewOpen ? columnLayout : null // } - anchors { top: true - left: true - right: true bottom: true } @@ -85,6 +82,7 @@ Scope { function setSearchingText(text) { searchWidget.setSearchingText(text); + searchWidget.focusFirstItemIfNeeded(); } ColumnLayout { diff --git a/.config/quickshell/ii/modules/overview/SearchWidget.qml b/.config/quickshell/ii/modules/overview/SearchWidget.qml index b05dd663e..fa29291d0 100644 --- a/.config/quickshell/ii/modules/overview/SearchWidget.qml +++ b/.config/quickshell/ii/modules/overview/SearchWidget.qml @@ -396,6 +396,8 @@ Item { // Wrapper } } + onModelChanged: root.focusFirstItemIfNeeded() + delegate: SearchItem { // The selectable item for each search result required property var modelData diff --git a/.config/quickshell/ii/modules/screenCorners/ScreenCorners.qml b/.config/quickshell/ii/modules/screenCorners/ScreenCorners.qml index 0946c03d1..b7d9ee679 100644 --- a/.config/quickshell/ii/modules/screenCorners/ScreenCorners.qml +++ b/.config/quickshell/ii/modules/screenCorners/ScreenCorners.qml @@ -11,77 +11,56 @@ Scope { id: screenCorners readonly property Toplevel activeWindow: ToplevelManager.activeToplevel + component CornerPanelWindow: PanelWindow { + id: cornerPanelWindow + visible: (Config.options.appearance.fakeScreenRounding === 1 || (Config.options.appearance.fakeScreenRounding === 2 && !activeWindow?.fullscreen)) + property var corner + + exclusionMode: ExclusionMode.Ignore + mask: Region { + item: null + } + WlrLayershell.namespace: "quickshell:screenCorners" + WlrLayershell.layer: WlrLayer.Overlay + color: "transparent" + + anchors { + top: cornerPanelWindow.corner === RoundCorner.CornerEnum.TopLeft || cornerPanelWindow.corner === RoundCorner.CornerEnum.TopRight + left: cornerPanelWindow.corner === RoundCorner.CornerEnum.TopLeft || cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomLeft + bottom: cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomLeft || cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomRight + right: cornerPanelWindow.corner === RoundCorner.CornerEnum.TopRight || cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomRight + } + + implicitWidth: cornerWidget.implicitWidth + implicitHeight: cornerWidget.implicitHeight + RoundCorner { + id: cornerWidget + size: Appearance.rounding.screenRounding + corner: cornerPanelWindow.corner + } + } + Variants { model: Quickshell.screens - PanelWindow { - visible: (Config.options.appearance.fakeScreenRounding === 1 - || (Config.options.appearance.fakeScreenRounding === 2 - && !activeWindow?.fullscreen)) - - property var modelData - - screen: modelData - exclusionMode: ExclusionMode.Ignore - mask: Region { - item: null - } - // HyprlandWindow.visibleMask: Region { - // Region { - // item: topLeftCorner - // } - // Region { - // item: topRightCorner - // } - // Region { - // item: bottomLeftCorner - // } - // Region { - // item: bottomRightCorner - // } - // } - WlrLayershell.namespace: "quickshell:screenCorners" - WlrLayershell.layer: WlrLayer.Overlay - color: "transparent" - - anchors { - top: true - left: true - right: true - bottom: true - } - - RoundCorner { - id: topLeftCorner - anchors.top: parent.top - anchors.left: parent.left - size: Appearance.rounding.screenRounding + Scope { + required property var modelData + CornerPanelWindow { + screen: modelData corner: RoundCorner.CornerEnum.TopLeft } - RoundCorner { - id: topRightCorner - anchors.top: parent.top - anchors.right: parent.right - size: Appearance.rounding.screenRounding + CornerPanelWindow { + screen: modelData corner: RoundCorner.CornerEnum.TopRight } - RoundCorner { - id: bottomLeftCorner - anchors.bottom: parent.bottom - anchors.left: parent.left - size: Appearance.rounding.screenRounding + CornerPanelWindow { + screen: modelData corner: RoundCorner.CornerEnum.BottomLeft } - RoundCorner { - id: bottomRightCorner - anchors.bottom: parent.bottom - anchors.right: parent.right - size: Appearance.rounding.screenRounding + CornerPanelWindow { + screen: modelData corner: RoundCorner.CornerEnum.BottomRight } - } - } - } diff --git a/.config/quickshell/ii/modules/session/Session.qml b/.config/quickshell/ii/modules/session/Session.qml index 6d98d98e7..b1ce1e426 100644 --- a/.config/quickshell/ii/modules/session/Session.qml +++ b/.config/quickshell/ii/modules/session/Session.qml @@ -78,7 +78,6 @@ Scope { StyledText { // Small instruction Layout.alignment: Qt.AlignHCenter horizontalAlignment: Text.AlignHCenter - font.family: Appearance.font.family.title font.pixelSize: Appearance.font.pixelSize.normal text: Translation.tr("Arrow keys to navigate, Enter to select\nEsc or click anywhere to cancel") } diff --git a/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml b/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml index 26f8e5837..06ceb07bb 100644 --- a/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml +++ b/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml @@ -438,7 +438,7 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\) return { name: `${messageInputField.text.trim().split(" ").length == 1 ? (root.commandPrefix + "save ") : ""}${chatName}`, displayName: `${chatName}`, - description: Translation.tr("Save chat from %1").arg(chatName), + description: Translation.tr("Save chat to %1").arg(chatName), } }) } else if (messageInputField.text.startsWith(`${root.commandPrefix}load`)) { diff --git a/.config/quickshell/ii/scripts/colors/switchwall.sh b/.config/quickshell/ii/scripts/colors/switchwall.sh index 0d9ffadbf..e0be2dacd 100755 --- a/.config/quickshell/ii/scripts/colors/switchwall.sh +++ b/.config/quickshell/ii/scripts/colors/switchwall.sh @@ -8,6 +8,7 @@ CONFIG_DIR="$XDG_CONFIG_HOME/quickshell/$QUICKSHELL_CONFIG_NAME" CACHE_DIR="$XDG_CACHE_HOME/quickshell" STATE_DIR="$XDG_STATE_HOME/quickshell" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SHELL_CONFIG_FILE="$XDG_CONFIG_HOME/illogical-impulse/config.json" MATUGEN_DIR="$XDG_CONFIG_HOME/matugen" terminalscheme="$SCRIPT_DIR/terminal/scheme-base.json" @@ -59,14 +60,14 @@ post_process() { handle_kde_material_you_colors & # Determine the largest region on the wallpaper that's sufficiently un-busy to put widgets in - if [ ! -f "$MATUGEN_DIR/scripts/least_busy_region.py" ]; then - echo "Error: least_busy_region.py script not found in $MATUGEN_DIR/scripts/" - else - "$MATUGEN_DIR/scripts/least_busy_region.py" \ - --screen-width "$screen_width" --screen-height "$screen_height" \ - --width 300 --height 200 \ - "$wallpaper_path" > "$STATE_DIR"/user/generated/wallpaper/least_busy_region.json - fi + # if [ ! -f "$MATUGEN_DIR/scripts/least_busy_region.py" ]; then + # echo "Error: least_busy_region.py script not found in $MATUGEN_DIR/scripts/" + # else + # "$MATUGEN_DIR/scripts/least_busy_region.py" \ + # --screen-width "$screen_width" --screen-height "$screen_height" \ + # --width 300 --height 200 \ + # "$wallpaper_path" > "$STATE_DIR"/user/generated/wallpaper/least_busy_region.json + # fi } check_and_prompt_upscale() { @@ -227,10 +228,10 @@ switch() { else matugen_args=(image "$imgpath") generate_colors_material_args=(--path "$imgpath") - # Set wallpaper with swww - swww img "$imgpath" --transition-step 100 --transition-fps 120 \ - --transition-type grow --transition-angle 30 --transition-duration 1 \ - --transition-pos "$cursorposx, $cursorposy_inverted" & + # Update wallpaper path in config + if [ -f "$SHELL_CONFIG_FILE" ]; then + jq --arg path "$imgpath" '.background.wallpaperPath = $path' "$SHELL_CONFIG_FILE" > "$SHELL_CONFIG_FILE.tmp" && mv "$SHELL_CONFIG_FILE.tmp" "$SHELL_CONFIG_FILE" + fi remove_restore fi fi @@ -318,7 +319,7 @@ main() { ;; --noswitch) noswitch_flag="1" - imgpath=$(swww query | head -1 | awk -F 'image: ' '{print $2}') + imgpath=$(jq -r '.background.wallpaperPath' "$SHELL_CONFIG_FILE" 2>/dev/null || echo "") shift ;; *) diff --git a/.config/matugen/scripts/least_busy_region.py b/.config/quickshell/ii/scripts/images/least_busy_region.py similarity index 92% rename from .config/matugen/scripts/least_busy_region.py rename to .config/quickshell/ii/scripts/images/least_busy_region.py index a1f2f47b4..2b1d104eb 100755 --- a/.config/matugen/scripts/least_busy_region.py +++ b/.config/quickshell/ii/scripts/images/least_busy_region.py @@ -18,7 +18,7 @@ def center_crop(img, target_w, target_h): y2 = y1 + target_h return img[y1:y2, x1:x2] -def find_least_busy_region(image_path, region_width=300, region_height=200, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", padding=50): +def find_least_busy_region(image_path, region_width=300, region_height=200, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", horizontal_padding=50, vertical_padding=50): img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) if img is None: raise FileNotFoundError(f"Image not found: {image_path}") @@ -59,10 +59,10 @@ def find_least_busy_region(image_path, region_width=300, region_height=200, scre min_var = None min_coords = (0, 0) area = region_width * region_height - x_start = padding - y_start = padding - x_end = w - region_width - padding + 1 - y_end = h - region_height - padding + 1 + x_start = horizontal_padding + y_start = vertical_padding + x_end = w - region_width - horizontal_padding + 1 + y_end = h - region_height - vertical_padding + 1 for y in range(y_start, max(y_end, y_start+1), stride): for x in range(x_start, max(x_end, x_start+1), stride): x1, y1 = x, y @@ -76,7 +76,7 @@ def find_least_busy_region(image_path, region_width=300, region_height=200, scre min_coords = (x, y) return min_coords, min_var -def find_largest_region(image_path, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", threshold=100.0, aspect_ratio=1.0, padding=50): +def find_largest_region(image_path, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", threshold=100.0, aspect_ratio=1.0, horizontal_padding=50, vertical_padding=50): img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) if img is None: raise FileNotFoundError(f"Image not found: {image_path}") @@ -130,10 +130,10 @@ def find_largest_region(image_path, screen_width=None, screen_height=None, verbo max_size = mid - 1 continue found = False - x_start = padding - y_start = padding - x_end = w - region_w - padding + 1 - y_end = h - region_h - padding + 1 + x_start = horizontal_padding + y_start = vertical_padding + x_end = w - region_w - horizontal_padding + 1 + y_end = h - region_h - vertical_padding + 1 for y in range(y_start, max(y_end, y_start+1), stride): for x in range(x_start, max(x_end, x_start+1), stride): x1, y1 = x, y @@ -257,13 +257,14 @@ def main(): parser.add_argument("-v", "--visual-output", action="store_true", help="Output image with rectangle") parser.add_argument("--screen-width", type=int, default=1920, help="Screen width for wallpaper scaling") parser.add_argument("--screen-height", type=int, default=1080, help="Screen height for wallpaper scaling") - parser.add_argument("--stride", type=int, default=4, help="Step size for sliding window (higher is faster, less precise)") + parser.add_argument("--stride", type=int, default=10, help="Step size for sliding window (higher is faster, less precise)") parser.add_argument("--screen-mode", choices=["fill", "fit"], default="fill", help="Wallpaper scaling mode: 'fill' (default) or 'fit'") parser.add_argument("--verbose", action="store_true", help="Print verbose output") parser.add_argument("-l", "--largest-region", action="store_true", help="Find the largest region under the variance threshold and output its center") parser.add_argument("-t", "--variance-threshold", type=float, default=1000.0, help="Variance threshold for largest region mode") parser.add_argument("--aspect-ratio", type=float, default=1.78, help="Aspect ratio (width/height) for largest region mode") - parser.add_argument("--padding", type=int, default=50, help="Minimum distance from region to image edge (default: 50)") + parser.add_argument("--horizontal-padding", "-hp", type=int, default=50, help="Minimum horizontal distance from region to image edge") + parser.add_argument("--vertical-padding", "-vp", type=int, default=50, help="Minimum vertical distance from region to image edge") args = parser.parse_args() if args.largest_region: @@ -276,7 +277,8 @@ def main(): screen_mode=args.screen_mode, threshold=args.variance_threshold, aspect_ratio=args.aspect_ratio, - padding=args.padding + horizontal_padding=args.horizontal_padding, + vertical_padding=args.vertical_padding ) if center: if args.visual_output: @@ -312,7 +314,8 @@ def main(): verbose=args.verbose, stride=args.stride, screen_mode=args.screen_mode, - padding=args.padding + horizontal_padding=args.horizontal_padding, + vertical_padding=args.vertical_padding ) if args.visual_output: draw_region(args.image_path, coords, region_width=args.width, region_height=args.height, screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode) diff --git a/.config/quickshell/ii/services/FirstRunExperience.qml b/.config/quickshell/ii/services/FirstRunExperience.qml index 5bdae4551..350c31593 100644 --- a/.config/quickshell/ii/services/FirstRunExperience.qml +++ b/.config/quickshell/ii/services/FirstRunExperience.qml @@ -27,7 +27,7 @@ Singleton { } function handleFirstRun() { - Quickshell.execDetached(["bash", "-c", `swww query | grep 'image' || '${Directories.wallpaperSwitchScriptPath}' '${root.defaultWallpaperPath}'`]) + Quickshell.execDetached([Directories.wallpaperSwitchScriptPath, root.defaultWallpaperPath]) Quickshell.execDetached(["bash", "-c", `qs -p '${root.welcomeQmlPath}'`]) } diff --git a/.config/quickshell/ii/services/HyprlandKeybinds.qml b/.config/quickshell/ii/services/HyprlandKeybinds.qml index a313ffc47..45dc65483 100644 --- a/.config/quickshell/ii/services/HyprlandKeybinds.qml +++ b/.config/quickshell/ii/services/HyprlandKeybinds.qml @@ -41,7 +41,7 @@ Singleton { Process { id: getDefaultKeybinds running: true - command: [root.keybindParserPath, "--path", root.defaultKeybindConfigPath,] + command: [root.keybindParserPath, "--path", root.defaultKeybindConfigPath] stdout: SplitParser { onRead: data => { diff --git a/.config/quickshell/ii/services/SystemInfo.qml b/.config/quickshell/ii/services/SystemInfo.qml index cd3d9f383..cb96b54bd 100644 --- a/.config/quickshell/ii/services/SystemInfo.qml +++ b/.config/quickshell/ii/services/SystemInfo.qml @@ -36,9 +36,9 @@ Singleton { const nameMatch = textOsRelease.match(/^NAME="(.+?)"/m) distroName = prettyNameMatch ? prettyNameMatch[1] : (nameMatch ? nameMatch[1].replace(/Linux/i, "").trim() : "Unknown") - // Extract the ID (LOGO field, fallback to "unknown") - const logoMatch = textOsRelease.match(/^LOGO=(.+)$/m) - distroId = logoMatch ? logoMatch[1].replace(/"/g, "") : "unknown" + // Extract the ID + const idMatch = textOsRelease.match(/^ID="?(.+?)"?$/m) + distroId = idMatch ? idMatch[1] : "unknown" // Extract additional URLs and logo const homeUrlMatch = textOsRelease.match(/^HOME_URL="(.+?)"/m) diff --git a/.config/quickshell/ii/shell.qml b/.config/quickshell/ii/shell.qml index 68d1502ff..a026342dd 100644 --- a/.config/quickshell/ii/shell.qml +++ b/.config/quickshell/ii/shell.qml @@ -6,7 +6,7 @@ //@ pragma Env QT_SCALE_FACTOR=1 import "./modules/common/" -import "./modules/backgroundWidgets/" +import "./modules/background/" import "./modules/bar/" import "./modules/cheatsheet/" import "./modules/dock/" @@ -30,7 +30,7 @@ ShellRoot { // Enable/disable modules here. False = not loaded at all, so rest assured // no unnecessary stuff will take up memory if you decide to only use, say, the overview. property bool enableBar: true - property bool enableBackgroundWidgets: true + property bool enableBackground: true property bool enableCheatsheet: true property bool enableDock: true property bool enableMediaControls: true @@ -53,7 +53,7 @@ ShellRoot { } LazyLoader { active: enableBar; component: Bar {} } - LazyLoader { active: enableBackgroundWidgets; component: BackgroundWidgets {} } + LazyLoader { active: enableBackground; component: Background {} } LazyLoader { active: enableCheatsheet; component: Cheatsheet {} } LazyLoader { active: enableDock && Config.options.dock.enable; component: Dock {} } LazyLoader { active: enableMediaControls; component: MediaControls {} } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aaaa3de86..026726a8e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ # Contributing -- Please understand that dotfiles are personal -- If you make new stuff, I'll probably nitpick as I want quality -- FFS pls make multiple PRs if you have many features 😭🙏 +- Please understand that dotfiles are after all personal. I can accept features I do not personally want, but in that case I will ask you to make it configurable/optionally loaded +- If you add new stuff, it's a good idea to ask me first to not waste your work +- Please make multiple PRs if you have many features diff --git a/README.md b/README.md index 28fdb28e7..da76e53ef 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,17 @@

-
- illogical-impulse logo -
+ + + + + +
+ illogical-impulse logo + + latest and only style that I actively use. Other past styles are still there for your viewing pleasure and not actual use, but code is still available, see below. +
-_latest and only style that I actively use. Other past styles are still there for your viewing pleasure and not actual use, but code is still available, see below._ ### illogical-impulseQuickshell @@ -152,6 +158,8 @@ Widget system: AGS | Support: Limited, no new features - EWW: [fufexan's config](https://github.com/fufexan/dotfiles) (he thanks more people there btw) - AI bots for providing useful examples + [@tokyobot](https://github.com/tokyob0t) for saying hi +

• stonks •

diff --git a/arch-packages/illogical-impulse-fonts-themes/PKGBUILD b/arch-packages/illogical-impulse-fonts-themes/PKGBUILD index 8c5f567c9..fd2ee207c 100644 --- a/arch-packages/illogical-impulse-fonts-themes/PKGBUILD +++ b/arch-packages/illogical-impulse-fonts-themes/PKGBUILD @@ -15,6 +15,7 @@ depends=( kde-material-you-colors kitty matugen-bin + otf-space-grotesk starship ttf-gabarito-git ttf-jetbrains-mono-nerd diff --git a/arch-packages/illogical-impulse-widgets/PKGBUILD b/arch-packages/illogical-impulse-widgets/PKGBUILD index ae26fc90e..9aa690dc2 100644 --- a/arch-packages/illogical-impulse-widgets/PKGBUILD +++ b/arch-packages/illogical-impulse-widgets/PKGBUILD @@ -13,7 +13,6 @@ depends=( hyprpicker nm-connection-editor quickshell-git - swww translate-shell wlogout )