From ac6d3adeb98aa45d55b428d480b23170b88ca1a1 Mon Sep 17 00:00:00 2001 From: Celes Renata Date: Fri, 8 Aug 2025 22:26:47 -0700 Subject: [PATCH] Make flake self-contained - consolidate installer-replication BREAKING CHANGE: Remove external dots-hyprland dependency - Imported all essential configs from dots-hyprland/installer-replication - Added complete configs/ directory with: - hypr/ - Hyprland configuration - quickshell/ - Quickshell widgets and config - applications/ - Application configurations - scripts/ - Utility scripts - matugen/ - Material You theming - Updated flake.nix to use local ./configs instead of external repo - Simplified update-flake script (removed external repo management) - Updated README to reflect self-contained architecture - All builds pass with local configurations Benefits: - No external repository dependencies - Faster builds (no network dependencies) - Version controlled configs in single repo - Easier maintenance and development - Complete installer replication in one place --- README.md | 65 +- configs/applications/foot.ini.template | 137 +++ configs/hypr/colors.conf.template | 40 + configs/hypr/env.conf.template | 27 + configs/hypr/execs.conf.template | 29 + configs/hypr/general.conf.template | 163 ++++ configs/hypr/hypridle.conf.template | 37 + configs/hypr/hyprland.conf.template | 18 + configs/hypr/keybinds.conf.template | 219 +++++ configs/hypr/keybinds.conf.template.backup | 219 +++++ configs/hypr/rules.conf.template | 161 ++++ .../hypr/scripts/launch_first_available.sh | 8 + configs/hypr/scripts/workspace_action.sh | 3 + configs/hyprland-keybinds.conf | 214 +++++ configs/matugen/templates/colors.json | 50 + configs/matugen/templates/foot/foot.ini | 63 ++ .../matugen/templates/fuzzel/fuzzel_theme.ini | 9 + configs/matugen/templates/gtk/gtk-colors.css | 42 + .../matugen/templates/hyprland/colors.conf | 37 + .../matugen/templates/hyprland/hyprlock.conf | 71 ++ configs/matugen/templates/kde/color.txt | 1 + configs/matugen/templates/kitty/kitty.conf | 249 +++++ .../matugen/templates/quickshell/colors.qml | 61 ++ configs/matugen/templates/wallpaper.txt | 1 + configs/matugen/templates/wlogout/layout | 36 + configs/matugen/templates/wlogout/style.css | 55 ++ .../quickshell-patches/AppLauncherPatch.qml | 67 ++ configs/quickshell/GlobalStates.qml | 73 ++ configs/quickshell/ReloadPopup.qml | 157 +++ configs/quickshell/Translation.qml | 175 ++++ .../assets/icons/ai-openai-symbolic.svg | 38 + .../quickshell/assets/icons/arch-symbolic.svg | 113 +++ .../assets/icons/cachyos-symbolic.svg | 318 +++++++ .../assets/icons/cloudflare-dns-symbolic.svg | 10 + .../assets/icons/crosshair-symbolic.svg | 65 ++ .../assets/icons/debian-symbolic.svg | 91 ++ .../assets/icons/deepseek-symbolic.svg | 47 + .../assets/icons/desktop-symbolic.svg | 4 + .../assets/icons/endeavouros-symbolic.svg | 96 ++ .../assets/icons/fedora-symbolic.svg | 38 + .../assets/icons/flatpak-symbolic.svg | 52 + .../assets/icons/github-symbolic.svg | 40 + .../assets/icons/google-gemini-symbolic.svg | 56 ++ .../assets/icons/linux-symbolic.svg | 113 +++ .../assets/icons/microsoft-symbolic.svg | 54 ++ .../assets/icons/mistral-symbolic.svg | 95 ++ .../assets/icons/nixos-symbolic.svg | 77 ++ .../assets/icons/nyarch-symbolic.svg | 137 +++ .../assets/icons/ollama-symbolic.svg | 60 ++ .../assets/icons/openai-symbolic.svg | 38 + .../assets/icons/openrouter-symbolic.svg | 39 + .../assets/icons/spark-symbolic.svg | 56 ++ .../assets/icons/ubuntu-symbolic.svg | 85 ++ .../assets/images/default_wallpaper.png | Bin 0 -> 67685 bytes configs/quickshell/defaults/ai/README.md | 5 + .../defaults/ai/prompts/NoPrompt.md | 0 .../defaults/ai/prompts/ii-Default.md | 17 + .../defaults/ai/prompts/ii-Imouto.md | 27 + .../defaults/ai/prompts/nyarch-Acchan.md | 28 + .../ai/prompts/w-FourPointedSparkle.md | 16 + .../ai/prompts/w-OpenMechanicalFlower.md | 2 + configs/quickshell/ii/.qmlformat.ini | 8 + configs/quickshell/ii/GlobalStates.qml | 72 ++ configs/quickshell/ii/ReloadPopup.qml | 157 +++ configs/quickshell/ii/Translation.qml | 175 ++++ .../ii/assets/icons/ai-openai-symbolic.svg | 1 + .../ii/assets/icons/arch-symbolic.svg | 113 +++ .../ii/assets/icons/cachyos-symbolic.svg | 318 +++++++ .../assets/icons/cloudflare-dns-symbolic.svg | 10 + .../ii/assets/icons/crosshair-symbolic.svg | 65 ++ .../ii/assets/icons/debian-symbolic.svg | 91 ++ .../ii/assets/icons/deepseek-symbolic.svg | 47 + .../ii/assets/icons/desktop-symbolic.svg | 4 + .../ii/assets/icons/endeavouros-symbolic.svg | 96 ++ .../ii/assets/icons/fedora-symbolic.svg | 38 + .../ii/assets/icons/flatpak-symbolic.svg | 52 + .../ii/assets/icons/github-symbolic.svg | 40 + .../assets/icons/google-gemini-symbolic.svg | 1 + .../ii/assets/icons/linux-symbolic.svg | 113 +++ .../ii/assets/icons/microsoft-symbolic.svg | 54 ++ .../ii/assets/icons/mistral-symbolic.svg | 95 ++ .../ii/assets/icons/nixos-symbolic.svg | 77 ++ .../ii/assets/icons/nyarch-symbolic.svg | 137 +++ .../ii/assets/icons/ollama-symbolic.svg | 60 ++ .../ii/assets/icons/openai-symbolic.svg | 38 + .../ii/assets/icons/openrouter-symbolic.svg | 39 + .../ii/assets/icons/spark-symbolic.svg | 56 ++ .../ii/assets/icons/ubuntu-symbolic.svg | 85 ++ .../ii/assets/images/default_wallpaper.png | Bin 0 -> 67685 bytes configs/quickshell/ii/defaults/ai/README.md | 5 + .../ii/defaults/ai/prompts/NoPrompt.md | 0 .../ii/defaults/ai/prompts/ii-Default.md | 17 + .../ii/defaults/ai/prompts/ii-Imouto.md | 27 + .../ii/defaults/ai/prompts/nyarch-Acchan.md | 28 + .../ai/prompts/w-FourPointedSparkle.md | 16 + .../ai/prompts/w-OpenMechanicalFlower.md | 2 + .../ii/modules/background/Background.qml | 290 ++++++ .../ii/modules/bar/ActiveWindow.qml | 53 ++ configs/quickshell/ii/modules/bar/Bar.qml | 621 ++++++++++++ .../quickshell/ii/modules/bar/BarGroup.qml | 36 + .../ii/modules/bar/BatteryIndicator.qml | 95 ++ .../ii/modules/bar/CircleUtilButton.qml | 15 + .../quickshell/ii/modules/bar/ClockWidget.qml | 41 + configs/quickshell/ii/modules/bar/Media.qml | 85 ++ .../quickshell/ii/modules/bar/Resource.qml | 58 ++ .../quickshell/ii/modules/bar/Resources.qml | 47 + .../quickshell/ii/modules/bar/ScrollHint.qml | 56 ++ configs/quickshell/ii/modules/bar/SysTray.qml | 47 + .../quickshell/ii/modules/bar/SysTrayItem.qml | 72 ++ .../quickshell/ii/modules/bar/UtilButtons.qml | 142 +++ .../quickshell/ii/modules/bar/Workspaces.qml | 282 ++++++ configs/quickshell/ii/modules/bar/qmldir | 14 + .../ii/modules/bar/weather/WeatherBar.qml | 60 ++ .../ii/modules/bar/weather/WeatherCard.qml | 43 + .../ii/modules/bar/weather/WeatherIcons.qml | 59 ++ .../ii/modules/bar/weather/WeatherPopup.qml | 97 ++ .../quickshell/ii/modules/bar/weather/qmldir | 5 + .../ii/modules/cheatsheet/Cheatsheet.qml | 236 +++++ .../modules/cheatsheet/CheatsheetKeybinds.qml | 144 +++ .../cheatsheet/CheatsheetPeriodicTable.qml | 68 ++ .../ii/modules/cheatsheet/ElementTile.qml | 55 ++ .../ii/modules/cheatsheet/periodic_table.js | 196 ++++ .../ii/modules/common/Appearance.qml | 316 +++++++ .../quickshell/ii/modules/common/Config.qml | 272 ++++++ .../ii/modules/common/Config.qml.backup | 273 ++++++ .../ii/modules/common/Directories.qml | 49 + .../ii/modules/common/Persistent.qml | 49 + .../modules/common/functions/ColorUtils.qml | 114 +++ .../ii/modules/common/functions/FileUtils.qml | 41 + .../ii/modules/common/functions/Fuzzy.qml | 18 + .../ii/modules/common/functions/Levendist.qml | 18 + .../modules/common/functions/ObjectUtils.qml | 98 ++ .../modules/common/functions/StringUtils.qml | 221 +++++ .../ii/modules/common/functions/fuzzysort.js | 682 +++++++++++++ .../ii/modules/common/functions/levendist.js | 141 +++ .../ii/modules/common/functions/qmldir | 8 + configs/quickshell/ii/modules/common/qmldir | 7 + .../ii/modules/common/widgets/ButtonGroup.qml | 46 + .../common/widgets/CircularProgress.qml | 97 ++ .../modules/common/widgets/CliphistImage.qml | 96 ++ .../ii/modules/common/widgets/ConfigRow.qml | 8 + .../common/widgets/ConfigSelectionArray.qml | 43 + .../modules/common/widgets/ConfigSpinBox.qml | 30 + .../modules/common/widgets/ConfigSwitch.qml | 32 + .../ii/modules/common/widgets/ContentPage.qml | 29 + .../modules/common/widgets/ContentSection.qml | 23 + .../common/widgets/ContentSubsection.qml | 46 + .../common/widgets/ContentSubsectionLabel.qml | 10 + .../ii/modules/common/widgets/CustomIcon.qml | 37 + .../modules/common/widgets/DialogButton.qml | 33 + .../ii/modules/common/widgets/DragManager.qml | 72 ++ .../ii/modules/common/widgets/Favicon.qml | 48 + .../common/widgets/FloatingActionButton.qml | 59 ++ .../common/widgets/FlowButtonGroup.qml | 8 + .../ii/modules/common/widgets/GroupButton.qml | 130 +++ .../ii/modules/common/widgets/KeyboardKey.qml | 42 + .../widgets/LightDarkPreferenceButton.qml | 122 +++ .../modules/common/widgets/MaterialSymbol.qml | 32 + .../common/widgets/MaterialTextField.qml | 52 + .../ii/modules/common/widgets/MenuButton.qml | 26 + .../modules/common/widgets/NavigationRail.qml | 11 + .../common/widgets/NavigationRailButton.qml | 148 +++ .../widgets/NavigationRailExpandButton.qml | 30 + .../common/widgets/NavigationRailTabArray.qml | 41 + .../widgets/NotificationActionButton.qml | 24 + .../common/widgets/NotificationAppIcon.qml | 103 ++ .../common/widgets/NotificationGroup.qml | 236 +++++ .../widgets/NotificationGroupExpandButton.qml | 48 + .../common/widgets/NotificationItem.qml | 313 ++++++ .../common/widgets/NotificationListView.qml | 27 + .../widgets/PointingHandInteraction.qml | 7 + .../common/widgets/PointingHandLinkHover.qml | 8 + .../modules/common/widgets/PrimaryTabBar.qml | 97 ++ .../common/widgets/PrimaryTabButton.qml | 171 ++++ .../ii/modules/common/widgets/Revealer.qml | 25 + .../modules/common/widgets/RippleButton.qml | 183 ++++ .../common/widgets/RippleButtonWithIcon.qml | 55 ++ .../ii/modules/common/widgets/RoundCorner.qml | 61 ++ .../common/widgets/SecondaryTabButton.qml | 161 ++++ .../common/widgets/SelectionDialog.qml | 132 +++ .../common/widgets/SelectionGroupButton.qml | 24 + .../common/widgets/StyledFlickable.qml | 6 + .../ii/modules/common/widgets/StyledLabel.qml | 15 + .../modules/common/widgets/StyledListView.qml | 108 +++ .../common/widgets/StyledProgressBar.qml | 103 ++ .../common/widgets/StyledRadioButton.qml | 87 ++ .../widgets/StyledRectangularShadow.qml | 14 + .../modules/common/widgets/StyledSlider.qml | 155 +++ .../modules/common/widgets/StyledSpinBox.qml | 92 ++ .../modules/common/widgets/StyledSwitch.qml | 60 ++ .../ii/modules/common/widgets/StyledText.qml | 15 + .../modules/common/widgets/StyledTextArea.qml | 18 + .../common/widgets/StyledTextInput.qml | 17 + .../modules/common/widgets/StyledToolTip.qml | 60 ++ .../common/widgets/VerticalButtonGroup.qml | 45 + .../modules/common/widgets/WaveVisualizer.qml | 73 ++ .../common/widgets/notification_utils.js | 77 ++ .../ii/modules/common/widgets/qmldir | 61 ++ configs/quickshell/ii/modules/dock/Dock.qml | 148 +++ .../ii/modules/dock/DockAppButton.qml | 139 +++ .../quickshell/ii/modules/dock/DockApps.qml | 263 ++++++ .../quickshell/ii/modules/dock/DockButton.qml | 16 + .../ii/modules/dock/DockSeparator.qml | 13 + configs/quickshell/ii/modules/lock/Lock.qml | 99 ++ .../ii/modules/lock/LockContext.qml | 67 ++ .../ii/modules/lock/LockSurface.qml | 147 +++ .../ii/modules/lock/pam/password.conf | 1 + .../modules/mediaControls/MediaControls.qml | 196 ++++ .../modules/mediaControls/PlayerControl.qml | 297 ++++++ .../notificationPopup/NotificationPopup.qml | 50 + .../OnScreenDisplayBrightness.qml | 152 +++ .../onScreenDisplay/OnScreenDisplayVolume.qml | 203 ++++ .../onScreenDisplay/OsdValueIndicator.qml | 104 ++ .../onScreenKeyboard/OnScreenKeyboard.qml | 166 ++++ .../modules/onScreenKeyboard/OskContent.qml | 49 + .../ii/modules/onScreenKeyboard/OskKey.qml | 121 +++ .../ii/modules/onScreenKeyboard/layouts.js | 312 ++++++ .../ii/modules/overview/Overview.qml | 246 +++++ .../ii/modules/overview/Overview.qml.template | 160 ++++ .../ii/modules/overview/OverviewWidget.qml | 268 ++++++ .../ii/modules/overview/OverviewWindow.qml | 114 +++ .../ii/modules/overview/SearchItem.qml | 267 ++++++ .../ii/modules/overview/SearchWidget.qml | 423 +++++++++ configs/quickshell/ii/modules/overview/qmldir | 5 + configs/quickshell/ii/modules/qmldir | 1 + .../modules/screenCorners/ScreenCorners.qml | 66 ++ .../screenCorners/ScreenCorners.qml.template | 162 ++++ .../quickshell/ii/modules/session/Session.qml | 317 +++++++ .../modules/session/SessionActionButton.qml | 58 ++ .../session/SessionManager.qml.template | 264 ++++++ .../quickshell/ii/modules/settings/About.qml | 149 +++ .../ii/modules/settings/AdvancedConfig.qml | 45 + .../ii/modules/settings/InterfaceConfig.qml | 424 +++++++++ .../ii/modules/settings/ServicesConfig.qml | 233 +++++ .../ii/modules/settings/Settings.qml | 215 +++++ .../ii/modules/settings/StyleConfig.qml | 245 +++++ .../modules/settings/TransparencySettings.qml | 209 ++++ .../ii/modules/settings/TransparencyUI.qml | 469 +++++++++ .../modules/settings/transparency-config.json | 1 + .../ii/modules/sidebarLeft/AiChat.qml | 701 ++++++++++++++ .../ii/modules/sidebarLeft/Anime.qml | 580 ++++++++++++ .../modules/sidebarLeft/ApiCommandButton.qml | 26 + .../sidebarLeft/ApiInputBoxIndicator.qml | 47 + .../ii/modules/sidebarLeft/DescriptionBox.qml | 62 ++ .../ii/modules/sidebarLeft/SidebarLeft.qml | 202 ++++ .../sidebarLeft/SidebarLeft.qml.template | 241 +++++ .../sidebarLeft/SidebarLeftContent.qml | 106 +++ .../ii/modules/sidebarLeft/Translator.qml | 246 +++++ .../modules/sidebarLeft/aiChat/AiMessage.qml | 302 ++++++ .../aiChat/AiMessageControlButton.qml | 26 + .../aiChat/AnnotationSourceButton.qml | 52 + .../sidebarLeft/aiChat/MessageCodeBlock.qml | 297 ++++++ .../sidebarLeft/aiChat/MessageTextBlock.qml | 142 +++ .../sidebarLeft/aiChat/MessageThinkBlock.qml | 173 ++++ .../sidebarLeft/aiChat/SearchQueryButton.qml | 53 ++ .../modules/sidebarLeft/anime/BooruImage.qml | 190 ++++ .../sidebarLeft/anime/BooruResponse.qml | 294 ++++++ .../quickshell/ii/modules/sidebarLeft/qmldir | 10 + .../translator/LanguageSelectorButton.qml | 41 + .../sidebarLeft/translator/TextCanvas.qml | 89 ++ .../sidebarRight/BottomWidgetGroup.qml | 241 +++++ .../sidebarRight/CenterWidgetGroup.qml | 80 ++ .../ii/modules/sidebarRight/SidebarRight.qml | 238 +++++ .../calendar/CalendarDayButton.qml | 34 + .../calendar/CalendarHeaderButton.qml | 36 + .../sidebarRight/calendar/CalendarWidget.qml | 123 +++ .../sidebarRight/calendar/calendar_layout.js | 115 +++ .../notifications/NotificationList.qml | 118 +++ .../NotificationStatusButton.qml | 43 + .../quickshell/ii/modules/sidebarRight/qmldir | 6 + .../quickToggles/BluetoothToggle.qml | 36 + .../quickToggles/CloudflareWarp.qml | 92 ++ .../quickToggles/EasyEffectsToggle.qml | 49 + .../sidebarRight/quickToggles/GameMode.qml | 31 + .../quickToggles/IdleInhibitor.qml | 31 + .../quickToggles/NetworkToggle.qml | 34 + .../sidebarRight/quickToggles/NightLight.qml | 28 + .../quickToggles/QuickToggleButton.qml | 29 + .../ii/modules/sidebarRight/todo/TaskList.qml | 180 ++++ .../todo/TodoItemActionButton.qml | 32 + .../modules/sidebarRight/todo/TodoWidget.qml | 294 ++++++ .../volumeMixer/AudioDeviceSelectorButton.qml | 53 ++ .../sidebarRight/volumeMixer/VolumeMixer.qml | 282 ++++++ .../volumeMixer/VolumeMixerEntry.qml | 63 ++ configs/quickshell/ii/qmldir | 1 + .../ii/qs/modules/common/Appearance.qml | 316 +++++++ .../ii/qs/modules/common/Config.qml | 272 ++++++ .../ii/qs/modules/common/Directories.qml | 49 + .../ii/qs/modules/common/Persistent.qml | 49 + .../modules/common/functions/ColorUtils.qml | 114 +++ .../qs/modules/common/functions/FileUtils.qml | 41 + .../ii/qs/modules/common/functions/Fuzzy.qml | 18 + .../qs/modules/common/functions/Levendist.qml | 18 + .../modules/common/functions/ObjectUtils.qml | 98 ++ .../modules/common/functions/StringUtils.qml | 221 +++++ .../qs/modules/common/functions/fuzzysort.js | 682 +++++++++++++ .../qs/modules/common/functions/levendist.js | 141 +++ .../ii/qs/modules/common/functions/qmldir | 8 + .../quickshell/ii/qs/modules/common/qmldir | 6 + .../qs/modules/common/widgets/ButtonGroup.qml | 46 + .../common/widgets/CircularProgress.qml | 97 ++ .../modules/common/widgets/CliphistImage.qml | 96 ++ .../qs/modules/common/widgets/ConfigRow.qml | 8 + .../common/widgets/ConfigSelectionArray.qml | 43 + .../modules/common/widgets/ConfigSpinBox.qml | 30 + .../modules/common/widgets/ConfigSwitch.qml | 32 + .../qs/modules/common/widgets/ContentPage.qml | 29 + .../modules/common/widgets/ContentSection.qml | 23 + .../common/widgets/ContentSubsection.qml | 46 + .../common/widgets/ContentSubsectionLabel.qml | 10 + .../qs/modules/common/widgets/CustomIcon.qml | 37 + .../modules/common/widgets/DialogButton.qml | 33 + .../qs/modules/common/widgets/DragManager.qml | 72 ++ .../ii/qs/modules/common/widgets/Favicon.qml | 48 + .../common/widgets/FloatingActionButton.qml | 59 ++ .../common/widgets/FlowButtonGroup.qml | 8 + .../qs/modules/common/widgets/GroupButton.qml | 130 +++ .../qs/modules/common/widgets/KeyboardKey.qml | 42 + .../widgets/LightDarkPreferenceButton.qml | 122 +++ .../modules/common/widgets/MaterialSymbol.qml | 32 + .../common/widgets/MaterialTextField.qml | 52 + .../qs/modules/common/widgets/MenuButton.qml | 26 + .../modules/common/widgets/NavigationRail.qml | 11 + .../common/widgets/NavigationRailButton.qml | 148 +++ .../widgets/NavigationRailExpandButton.qml | 30 + .../common/widgets/NavigationRailTabArray.qml | 41 + .../widgets/NotificationActionButton.qml | 24 + .../common/widgets/NotificationAppIcon.qml | 103 ++ .../common/widgets/NotificationGroup.qml | 236 +++++ .../widgets/NotificationGroupExpandButton.qml | 48 + .../common/widgets/NotificationItem.qml | 313 ++++++ .../common/widgets/NotificationListView.qml | 27 + .../widgets/PointingHandInteraction.qml | 7 + .../common/widgets/PointingHandLinkHover.qml | 8 + .../modules/common/widgets/PrimaryTabBar.qml | 97 ++ .../common/widgets/PrimaryTabButton.qml | 171 ++++ .../ii/qs/modules/common/widgets/Revealer.qml | 25 + .../modules/common/widgets/RippleButton.qml | 183 ++++ .../common/widgets/RippleButtonWithIcon.qml | 55 ++ .../qs/modules/common/widgets/RoundCorner.qml | 61 ++ .../common/widgets/SecondaryTabButton.qml | 161 ++++ .../common/widgets/SelectionDialog.qml | 132 +++ .../common/widgets/SelectionGroupButton.qml | 24 + .../common/widgets/StyledFlickable.qml | 6 + .../qs/modules/common/widgets/StyledLabel.qml | 15 + .../modules/common/widgets/StyledListView.qml | 108 +++ .../common/widgets/StyledProgressBar.qml | 103 ++ .../common/widgets/StyledRadioButton.qml | 87 ++ .../widgets/StyledRectangularShadow.qml | 14 + .../modules/common/widgets/StyledSlider.qml | 155 +++ .../modules/common/widgets/StyledSpinBox.qml | 92 ++ .../modules/common/widgets/StyledSwitch.qml | 60 ++ .../qs/modules/common/widgets/StyledText.qml | 15 + .../modules/common/widgets/StyledTextArea.qml | 18 + .../common/widgets/StyledTextInput.qml | 17 + .../modules/common/widgets/StyledToolTip.qml | 60 ++ .../common/widgets/VerticalButtonGroup.qml | 45 + .../modules/common/widgets/WaveVisualizer.qml | 73 ++ .../common/widgets/notification_utils.js | 77 ++ .../ii/qs/modules/common/widgets/qmldir | 61 ++ configs/quickshell/ii/qs/qmldir | 30 + configs/quickshell/ii/qs/services/Ai.qml | 891 +++++++++++++++++ .../quickshell/ii/qs/services/AppSearch.qml | 148 +++ configs/quickshell/ii/qs/services/Audio.qml | 54 ++ configs/quickshell/ii/qs/services/Battery.qml | 50 + .../quickshell/ii/qs/services/Bluetooth.qml | 73 ++ configs/quickshell/ii/qs/services/Booru.qml | 467 +++++++++ .../ii/qs/services/BooruResponseData.qml | 13 + .../quickshell/ii/qs/services/Brightness.qml | 152 +++ .../quickshell/ii/qs/services/Cliphist.qml | 101 ++ .../quickshell/ii/qs/services/DateTime.qml | 51 + configs/quickshell/ii/qs/services/Emojis.qml | 64 ++ .../ii/qs/services/FirstRunExperience.qml | 43 + .../ii/qs/services/HyprlandData.qml | 138 +++ .../ii/qs/services/HyprlandKeybinds.qml | 72 ++ .../quickshell/ii/qs/services/HyprlandXkb.qml | 108 +++ .../quickshell/ii/qs/services/Hyprsunset.qml | 117 +++ .../ii/qs/services/KeyringStorage.qml | 118 +++ .../ii/qs/services/LatexRenderer.qml | 83 ++ .../ii/qs/services/MaterialThemeLoader.qml | 58 ++ .../ii/qs/services/MprisController.qml | 165 ++++ configs/quickshell/ii/qs/services/Network.qml | 93 ++ .../ii/qs/services/Notifications.qml | 289 ++++++ .../ii/qs/services/ResourceUsage.qml | 62 ++ .../quickshell/ii/qs/services/SystemInfo.qml | 114 +++ configs/quickshell/ii/qs/services/Todo.qml | 87 ++ configs/quickshell/ii/qs/services/Weather.qml | 154 +++ configs/quickshell/ii/qs/services/Ydotool.qml | 47 + .../ii/qs/services/ai/AiMessageData.qml | 21 + .../quickshell/ii/qs/services/ai/AiModel.qml | 32 + .../ii/qs/services/ai/ApiStrategy.qml | 10 + .../ii/qs/services/ai/GeminiApiStrategy.qml | 155 +++ .../ii/qs/services/ai/MistralApiStrategy.qml | 124 +++ .../ii/qs/services/ai/OpenAiApiStrategy.qml | 97 ++ configs/quickshell/ii/qs/services/ai/qmldir | 8 + configs/quickshell/ii/qs/services/qmldir | 43 + configs/quickshell/ii/screenshot.qml | 553 +++++++++++ .../ai/show-installed-ollama-models.sh | 16 + .../ii/scripts/cava/raw_output_config.txt | 17 + .../ii/scripts/colors/applycolor.sh | 72 ++ .../colors/generate_colors_material.py | 181 ++++ .../ii/scripts/colors/random_konachan_wall.sh | 42 + .../ii/scripts/colors/scheme_for_image.py | 65 ++ .../ii/scripts/colors/switchwall.sh | 403 ++++++++ .../scripts/colors/terminal/scheme-base.json | 38 + .../ii/scripts/colors/terminal/sequences.txt | 1 + .../ii/scripts/hyprland/get_keybinds.py | 222 +++++ .../ii/scripts/images/find_regions.py | 120 +++ .../ii/scripts/images/least_busy_region.py | 341 +++++++ .../quickshell/ii/scripts/kvantum/adwsvg.py | 79 ++ .../ii/scripts/kvantum/adwsvgDark.py | 87 ++ .../ii/scripts/kvantum/changeAdwColors.py | 71 ++ .../ii/scripts/kvantum/materialQT.sh | 44 + .../ii/scripts/wayland-idle-inhibitor.py | 86 ++ configs/quickshell/ii/services/Ai.qml | 892 ++++++++++++++++++ configs/quickshell/ii/services/AppSearch.qml | 148 +++ configs/quickshell/ii/services/Audio.qml | 54 ++ configs/quickshell/ii/services/Battery.qml | 50 + configs/quickshell/ii/services/Bluetooth.qml | 73 ++ configs/quickshell/ii/services/Booru.qml | 467 +++++++++ .../ii/services/BooruResponseData.qml | 13 + configs/quickshell/ii/services/Brightness.qml | 152 +++ configs/quickshell/ii/services/Cliphist.qml | 101 ++ configs/quickshell/ii/services/DateTime.qml | 51 + configs/quickshell/ii/services/Emojis.qml | 64 ++ .../ii/services/FirstRunExperience.qml | 43 + .../quickshell/ii/services/HyprlandData.qml | 138 +++ .../ii/services/HyprlandKeybinds.qml | 72 ++ .../quickshell/ii/services/HyprlandXkb.qml | 108 +++ configs/quickshell/ii/services/Hyprsunset.qml | 117 +++ .../quickshell/ii/services/KeyringStorage.qml | 118 +++ .../quickshell/ii/services/LatexRenderer.qml | 83 ++ .../ii/services/MaterialThemeLoader.qml | 58 ++ .../ii/services/MprisController.qml | 165 ++++ configs/quickshell/ii/services/Network.qml | 93 ++ .../quickshell/ii/services/Notifications.qml | 289 ++++++ .../quickshell/ii/services/ResourceUsage.qml | 62 ++ configs/quickshell/ii/services/SystemInfo.qml | 114 +++ configs/quickshell/ii/services/Todo.qml | 87 ++ configs/quickshell/ii/services/Weather.qml | 154 +++ configs/quickshell/ii/services/Ydotool.qml | 47 + .../ii/services/ai/AiMessageData.qml | 21 + configs/quickshell/ii/services/ai/AiModel.qml | 32 + .../quickshell/ii/services/ai/ApiStrategy.qml | 10 + .../ii/services/ai/GeminiApiStrategy.qml | 155 +++ .../ii/services/ai/MistralApiStrategy.qml | 124 +++ .../ii/services/ai/OpenAiApiStrategy.qml | 97 ++ configs/quickshell/ii/services/qmldir | 29 + configs/quickshell/ii/settings.qml | 248 +++++ configs/quickshell/ii/shell.qml | 77 ++ configs/quickshell/ii/welcome.qml | 343 +++++++ .../modules/background/Background.qml | 290 ++++++ .../quickshell/modules/bar/ActiveWindow.qml | 53 ++ configs/quickshell/modules/bar/Bar.qml | 622 ++++++++++++ configs/quickshell/modules/bar/BarGroup.qml | 36 + .../modules/bar/BatteryIndicator.qml | 95 ++ .../modules/bar/CircleUtilButton.qml | 15 + .../quickshell/modules/bar/ClockWidget.qml | 41 + configs/quickshell/modules/bar/Media.qml | 85 ++ configs/quickshell/modules/bar/Resource.qml | 58 ++ configs/quickshell/modules/bar/Resources.qml | 47 + configs/quickshell/modules/bar/ScrollHint.qml | 57 ++ configs/quickshell/modules/bar/SysTray.qml | 47 + .../quickshell/modules/bar/SysTrayItem.qml | 72 ++ .../quickshell/modules/bar/UtilButtons.qml | 142 +++ configs/quickshell/modules/bar/Workspaces.qml | 282 ++++++ .../modules/bar/weather/WeatherBar.qml | 60 ++ .../modules/bar/weather/WeatherCard.qml | 43 + .../modules/bar/weather/WeatherIcons.qml | 59 ++ .../modules/bar/weather/WeatherPopup.qml | 97 ++ .../modules/cheatsheet/Cheatsheet.qml | 236 +++++ .../modules/cheatsheet/CheatsheetKeybinds.qml | 144 +++ .../cheatsheet/CheatsheetPeriodicTable.qml | 68 ++ .../modules/cheatsheet/ElementTile.qml | 55 ++ .../modules/cheatsheet/periodic_table.js | 196 ++++ .../quickshell/modules/common/Appearance.qml | 316 +++++++ configs/quickshell/modules/common/Config.qml | 272 ++++++ .../quickshell/modules/common/Directories.qml | 49 + .../quickshell/modules/common/Persistent.qml | 49 + .../modules/common/functions/ColorUtils.qml | 114 +++ .../modules/common/functions/FileUtils.qml | 41 + .../modules/common/functions/Fuzzy.qml | 18 + .../modules/common/functions/Levendist.qml | 18 + .../modules/common/functions/ObjectUtils.qml | 98 ++ .../modules/common/functions/StringUtils.qml | 221 +++++ .../modules/common/functions/fuzzysort.js | 682 +++++++++++++ .../modules/common/functions/levendist.js | 141 +++ .../modules/common/functions/qmldir | 7 + configs/quickshell/modules/common/qmldir | 5 + .../modules/common/widgets/ButtonGroup.qml | 46 + .../common/widgets/CircularProgress.qml | 97 ++ .../modules/common/widgets/CliphistImage.qml | 96 ++ .../modules/common/widgets/ConfigRow.qml | 8 + .../common/widgets/ConfigSelectionArray.qml | 43 + .../modules/common/widgets/ConfigSpinBox.qml | 30 + .../modules/common/widgets/ConfigSwitch.qml | 32 + .../modules/common/widgets/ContentPage.qml | 29 + .../modules/common/widgets/ContentSection.qml | 23 + .../common/widgets/ContentSubsection.qml | 46 + .../common/widgets/ContentSubsectionLabel.qml | 10 + .../modules/common/widgets/CustomIcon.qml | 37 + .../modules/common/widgets/DialogButton.qml | 33 + .../modules/common/widgets/DragManager.qml | 72 ++ .../modules/common/widgets/Favicon.qml | 48 + .../common/widgets/FloatingActionButton.qml | 59 ++ .../common/widgets/FlowButtonGroup.qml | 8 + .../modules/common/widgets/GroupButton.qml | 130 +++ .../modules/common/widgets/KeyboardKey.qml | 42 + .../widgets/LightDarkPreferenceButton.qml | 122 +++ .../modules/common/widgets/MaterialSymbol.qml | 32 + .../common/widgets/MaterialTextField.qml | 52 + .../modules/common/widgets/MenuButton.qml | 26 + .../modules/common/widgets/NavigationRail.qml | 11 + .../common/widgets/NavigationRailButton.qml | 148 +++ .../widgets/NavigationRailExpandButton.qml | 30 + .../common/widgets/NavigationRailTabArray.qml | 41 + .../widgets/NotificationActionButton.qml | 24 + .../common/widgets/NotificationAppIcon.qml | 103 ++ .../common/widgets/NotificationGroup.qml | 236 +++++ .../widgets/NotificationGroupExpandButton.qml | 48 + .../common/widgets/NotificationItem.qml | 313 ++++++ .../common/widgets/NotificationListView.qml | 27 + .../widgets/PointingHandInteraction.qml | 7 + .../common/widgets/PointingHandLinkHover.qml | 8 + .../modules/common/widgets/PrimaryTabBar.qml | 97 ++ .../common/widgets/PrimaryTabButton.qml | 171 ++++ .../modules/common/widgets/Revealer.qml | 25 + .../modules/common/widgets/RippleButton.qml | 183 ++++ .../common/widgets/RippleButtonWithIcon.qml | 55 ++ .../modules/common/widgets/RoundCorner.qml | 61 ++ .../common/widgets/SecondaryTabButton.qml | 161 ++++ .../common/widgets/SelectionDialog.qml | 132 +++ .../common/widgets/SelectionGroupButton.qml | 24 + .../common/widgets/StyledFlickable.qml | 6 + .../modules/common/widgets/StyledLabel.qml | 15 + .../modules/common/widgets/StyledListView.qml | 108 +++ .../common/widgets/StyledProgressBar.qml | 103 ++ .../common/widgets/StyledRadioButton.qml | 87 ++ .../widgets/StyledRectangularShadow.qml | 14 + .../modules/common/widgets/StyledSlider.qml | 155 +++ .../modules/common/widgets/StyledSpinBox.qml | 92 ++ .../modules/common/widgets/StyledSwitch.qml | 60 ++ .../modules/common/widgets/StyledText.qml | 15 + .../modules/common/widgets/StyledTextArea.qml | 18 + .../common/widgets/StyledTextInput.qml | 17 + .../modules/common/widgets/StyledToolTip.qml | 60 ++ .../common/widgets/VerticalButtonGroup.qml | 45 + .../modules/common/widgets/WaveVisualizer.qml | 73 ++ .../common/widgets/notification_utils.js | 77 ++ .../quickshell/modules/common/widgets/qmldir | 15 + configs/quickshell/modules/dock/Dock.qml | 148 +++ .../quickshell/modules/dock/DockAppButton.qml | 139 +++ configs/quickshell/modules/dock/DockApps.qml | 263 ++++++ .../quickshell/modules/dock/DockButton.qml | 16 + .../quickshell/modules/dock/DockSeparator.qml | 13 + configs/quickshell/modules/lock/Lock.qml | 99 ++ .../quickshell/modules/lock/LockContext.qml | 67 ++ .../quickshell/modules/lock/LockSurface.qml | 147 +++ .../quickshell/modules/lock/pam/password.conf | 1 + .../modules/mediaControls/MediaControls.qml | 196 ++++ .../modules/mediaControls/PlayerControl.qml | 297 ++++++ .../notificationPopup/NotificationPopup.qml | 50 + .../OnScreenDisplayBrightness.qml | 152 +++ .../onScreenDisplay/OnScreenDisplayVolume.qml | 203 ++++ .../onScreenDisplay/OsdValueIndicator.qml | 104 ++ .../onScreenKeyboard/OnScreenKeyboard.qml | 166 ++++ .../modules/onScreenKeyboard/OskContent.qml | 49 + .../modules/onScreenKeyboard/OskKey.qml | 121 +++ .../modules/onScreenKeyboard/layouts.js | 312 ++++++ .../quickshell/modules/overview/Overview.qml | 246 +++++ .../modules/overview/Overview.qml.template | 160 ++++ .../modules/overview/OverviewWidget.qml | 268 ++++++ .../modules/overview/OverviewWindow.qml | 114 +++ .../modules/overview/SearchItem.qml | 267 ++++++ .../modules/overview/SearchWidget.qml | 423 +++++++++ .../modules/screenCorners/ScreenCorners.qml | 66 ++ .../screenCorners/ScreenCorners.qml.template | 162 ++++ .../quickshell/modules/session/Session.qml | 317 +++++++ .../modules/session/SessionActionButton.qml | 58 ++ .../session/SessionManager.qml.template | 264 ++++++ configs/quickshell/modules/settings/About.qml | 149 +++ .../modules/settings/AdvancedConfig.qml | 45 + .../modules/settings/InterfaceConfig.qml | 424 +++++++++ .../modules/settings/ServicesConfig.qml | 233 +++++ .../quickshell/modules/settings/Settings.qml | 215 +++++ .../modules/settings/StyleConfig.qml | 245 +++++ .../modules/settings/TransparencySettings.qml | 209 ++++ .../modules/settings/TransparencyUI.qml | 469 +++++++++ .../quickshell/modules/sidebarLeft/AiChat.qml | 701 ++++++++++++++ .../quickshell/modules/sidebarLeft/Anime.qml | 580 ++++++++++++ .../modules/sidebarLeft/ApiCommandButton.qml | 26 + .../sidebarLeft/ApiInputBoxIndicator.qml | 47 + .../modules/sidebarLeft/DescriptionBox.qml | 62 ++ .../modules/sidebarLeft/SidebarLeft.qml | 202 ++++ .../sidebarLeft/SidebarLeft.qml.template | 241 +++++ .../sidebarLeft/SidebarLeftContent.qml | 106 +++ .../modules/sidebarLeft/Translator.qml | 246 +++++ .../modules/sidebarLeft/aiChat/AiMessage.qml | 302 ++++++ .../aiChat/AiMessageControlButton.qml | 26 + .../aiChat/AnnotationSourceButton.qml | 52 + .../sidebarLeft/aiChat/MessageCodeBlock.qml | 297 ++++++ .../sidebarLeft/aiChat/MessageTextBlock.qml | 142 +++ .../sidebarLeft/aiChat/MessageThinkBlock.qml | 173 ++++ .../sidebarLeft/aiChat/SearchQueryButton.qml | 53 ++ .../modules/sidebarLeft/anime/BooruImage.qml | 190 ++++ .../sidebarLeft/anime/BooruResponse.qml | 294 ++++++ .../translator/LanguageSelectorButton.qml | 41 + .../sidebarLeft/translator/TextCanvas.qml | 89 ++ .../sidebarRight/BottomWidgetGroup.qml | 241 +++++ .../sidebarRight/CenterWidgetGroup.qml | 80 ++ .../modules/sidebarRight/SidebarRight.qml | 238 +++++ .../calendar/CalendarDayButton.qml | 34 + .../calendar/CalendarHeaderButton.qml | 36 + .../sidebarRight/calendar/CalendarWidget.qml | 123 +++ .../sidebarRight/calendar/calendar_layout.js | 115 +++ .../notifications/NotificationList.qml | 118 +++ .../NotificationStatusButton.qml | 43 + .../quickToggles/BluetoothToggle.qml | 36 + .../quickToggles/CloudflareWarp.qml | 92 ++ .../quickToggles/EasyEffectsToggle.qml | 49 + .../sidebarRight/quickToggles/GameMode.qml | 31 + .../quickToggles/IdleInhibitor.qml | 31 + .../quickToggles/NetworkToggle.qml | 34 + .../sidebarRight/quickToggles/NightLight.qml | 28 + .../quickToggles/QuickToggleButton.qml | 29 + .../modules/sidebarRight/todo/TaskList.qml | 180 ++++ .../todo/TodoItemActionButton.qml | 32 + .../modules/sidebarRight/todo/TodoWidget.qml | 294 ++++++ .../volumeMixer/AudioDeviceSelectorButton.qml | 53 ++ .../sidebarRight/volumeMixer/VolumeMixer.qml | 282 ++++++ .../volumeMixer/VolumeMixerEntry.qml | 63 ++ configs/quickshell/screenshot.qml | 553 +++++++++++ .../ai/show-installed-ollama-models.sh | 16 + .../scripts/cava/raw_output_config.txt | 17 + .../quickshell/scripts/colors/applycolor.sh | 72 ++ .../colors/generate_colors_material.py | 181 ++++ .../scripts/colors/random_konachan_wall.sh | 42 + .../scripts/colors/scheme_for_image.py | 65 ++ .../quickshell/scripts/colors/switchwall.sh | 403 ++++++++ .../scripts/colors/terminal/scheme-base.json | 38 + .../scripts/colors/terminal/sequences.txt | 1 + .../scripts/hyprland/get_keybinds.py | 222 +++++ .../quickshell/scripts/images/find_regions.py | 120 +++ .../scripts/images/least_busy_region.py | 341 +++++++ configs/quickshell/scripts/kvantum/adwsvg.py | 79 ++ .../quickshell/scripts/kvantum/adwsvgDark.py | 87 ++ .../scripts/kvantum/changeAdwColors.py | 71 ++ .../quickshell/scripts/kvantum/materialQT.sh | 44 + .../scripts/wayland-idle-inhibitor.py | 86 ++ configs/quickshell/services/Ai.qml | 892 ++++++++++++++++++ configs/quickshell/services/AppSearch.qml | 156 +++ configs/quickshell/services/Audio.qml | 54 ++ configs/quickshell/services/Battery.qml | 50 + configs/quickshell/services/Bluetooth.qml | 73 ++ configs/quickshell/services/Booru.qml | 467 +++++++++ .../quickshell/services/BooruResponseData.qml | 13 + configs/quickshell/services/Brightness.qml | 152 +++ configs/quickshell/services/Cliphist.qml | 101 ++ configs/quickshell/services/DateTime.qml | 51 + configs/quickshell/services/Emojis.qml | 64 ++ .../services/FirstRunExperience.qml | 43 + configs/quickshell/services/HyprlandData.qml | 138 +++ .../quickshell/services/HyprlandKeybinds.qml | 72 ++ configs/quickshell/services/HyprlandXkb.qml | 108 +++ configs/quickshell/services/Hyprsunset.qml | 117 +++ .../quickshell/services/KeyringStorage.qml | 118 +++ configs/quickshell/services/LatexRenderer.qml | 83 ++ .../services/MaterialThemeLoader.qml | 58 ++ .../quickshell/services/MprisController.qml | 165 ++++ configs/quickshell/services/Network.qml | 93 ++ configs/quickshell/services/Notifications.qml | 289 ++++++ configs/quickshell/services/ResourceUsage.qml | 62 ++ configs/quickshell/services/SystemInfo.qml | 114 +++ configs/quickshell/services/Todo.qml | 87 ++ configs/quickshell/services/Weather.qml | 154 +++ configs/quickshell/services/Ydotool.qml | 47 + .../quickshell/services/ai/AiMessageData.qml | 21 + configs/quickshell/services/ai/AiModel.qml | 32 + .../quickshell/services/ai/ApiStrategy.qml | 10 + .../services/ai/GeminiApiStrategy.qml | 155 +++ .../services/ai/MistralApiStrategy.qml | 124 +++ .../services/ai/OpenAiApiStrategy.qml | 97 ++ configs/quickshell/services/qmldir | 27 + configs/quickshell/settings.qml | 248 +++++ configs/quickshell/shell.qml | 78 ++ configs/quickshell/translations/en_US.json | 314 ++++++ configs/quickshell/translations/it_IT.json | 306 ++++++ configs/quickshell/translations/ru_RU.json | 346 +++++++ .../quickshell/translations/tools/README.md | 285 ++++++ .../guide/translation-tools-guide-zh_CN.md | 286 ++++++ .../tools/guide/translation-tools-guide.md | 285 ++++++ .../translations/tools/manage-translations.sh | 149 +++ .../translations/tools/translation-cleaner.py | 200 ++++ .../translations/tools/translation-manager.py | 324 +++++++ configs/quickshell/translations/uk_UA.json | 342 +++++++ configs/quickshell/translations/vi_VN.json | 373 ++++++++ configs/quickshell/translations/zh_CN.json | 314 ++++++ configs/quickshell/welcome.qml | 343 +++++++ configs/scripts/demo-material-you.sh | 103 ++ configs/scripts/fuzzel-emoji.sh | 398 ++++++++ configs/scripts/generate-colors.sh | 127 +++ configs/scripts/record.sh | 243 +++++ configs/scripts/test-phase4.sh | 226 +++++ configs/scripts/test-phase5.sh | 404 ++++++++ configs/scripts/zoom.sh | 312 ++++++ configs/touchegg-quickshell.conf | 152 +++ flake.lock | 18 - flake.nix | 12 +- packages/scripts/dev-shell-hook.sh | 15 +- packages/scripts/update-flake.sh | 66 +- 710 files changed, 81319 insertions(+), 115 deletions(-) create mode 100644 configs/applications/foot.ini.template create mode 100644 configs/hypr/colors.conf.template create mode 100644 configs/hypr/env.conf.template create mode 100644 configs/hypr/execs.conf.template create mode 100644 configs/hypr/general.conf.template create mode 100644 configs/hypr/hypridle.conf.template create mode 100644 configs/hypr/hyprland.conf.template create mode 100644 configs/hypr/keybinds.conf.template create mode 100644 configs/hypr/keybinds.conf.template.backup create mode 100644 configs/hypr/rules.conf.template create mode 100644 configs/hypr/scripts/launch_first_available.sh create mode 100644 configs/hypr/scripts/workspace_action.sh create mode 100644 configs/hyprland-keybinds.conf create mode 100644 configs/matugen/templates/colors.json create mode 100644 configs/matugen/templates/foot/foot.ini create mode 100644 configs/matugen/templates/fuzzel/fuzzel_theme.ini create mode 100644 configs/matugen/templates/gtk/gtk-colors.css create mode 100644 configs/matugen/templates/hyprland/colors.conf create mode 100644 configs/matugen/templates/hyprland/hyprlock.conf create mode 100644 configs/matugen/templates/kde/color.txt create mode 100644 configs/matugen/templates/kitty/kitty.conf create mode 100644 configs/matugen/templates/quickshell/colors.qml create mode 100644 configs/matugen/templates/wallpaper.txt create mode 100644 configs/matugen/templates/wlogout/layout create mode 100644 configs/matugen/templates/wlogout/style.css create mode 100644 configs/quickshell-patches/AppLauncherPatch.qml create mode 100644 configs/quickshell/GlobalStates.qml create mode 100644 configs/quickshell/ReloadPopup.qml create mode 100644 configs/quickshell/Translation.qml create mode 100644 configs/quickshell/assets/icons/ai-openai-symbolic.svg create mode 100644 configs/quickshell/assets/icons/arch-symbolic.svg create mode 100644 configs/quickshell/assets/icons/cachyos-symbolic.svg create mode 100644 configs/quickshell/assets/icons/cloudflare-dns-symbolic.svg create mode 100644 configs/quickshell/assets/icons/crosshair-symbolic.svg create mode 100644 configs/quickshell/assets/icons/debian-symbolic.svg create mode 100644 configs/quickshell/assets/icons/deepseek-symbolic.svg create mode 100644 configs/quickshell/assets/icons/desktop-symbolic.svg create mode 100644 configs/quickshell/assets/icons/endeavouros-symbolic.svg create mode 100644 configs/quickshell/assets/icons/fedora-symbolic.svg create mode 100644 configs/quickshell/assets/icons/flatpak-symbolic.svg create mode 100644 configs/quickshell/assets/icons/github-symbolic.svg create mode 100644 configs/quickshell/assets/icons/google-gemini-symbolic.svg create mode 100644 configs/quickshell/assets/icons/linux-symbolic.svg create mode 100644 configs/quickshell/assets/icons/microsoft-symbolic.svg create mode 100644 configs/quickshell/assets/icons/mistral-symbolic.svg create mode 100644 configs/quickshell/assets/icons/nixos-symbolic.svg create mode 100644 configs/quickshell/assets/icons/nyarch-symbolic.svg create mode 100644 configs/quickshell/assets/icons/ollama-symbolic.svg create mode 100644 configs/quickshell/assets/icons/openai-symbolic.svg create mode 100644 configs/quickshell/assets/icons/openrouter-symbolic.svg create mode 100644 configs/quickshell/assets/icons/spark-symbolic.svg create mode 100644 configs/quickshell/assets/icons/ubuntu-symbolic.svg create mode 100644 configs/quickshell/assets/images/default_wallpaper.png create mode 100644 configs/quickshell/defaults/ai/README.md create mode 100644 configs/quickshell/defaults/ai/prompts/NoPrompt.md create mode 100644 configs/quickshell/defaults/ai/prompts/ii-Default.md create mode 100644 configs/quickshell/defaults/ai/prompts/ii-Imouto.md create mode 100644 configs/quickshell/defaults/ai/prompts/nyarch-Acchan.md create mode 100644 configs/quickshell/defaults/ai/prompts/w-FourPointedSparkle.md create mode 100644 configs/quickshell/defaults/ai/prompts/w-OpenMechanicalFlower.md create mode 100644 configs/quickshell/ii/.qmlformat.ini create mode 100644 configs/quickshell/ii/GlobalStates.qml create mode 100644 configs/quickshell/ii/ReloadPopup.qml create mode 100644 configs/quickshell/ii/Translation.qml create mode 120000 configs/quickshell/ii/assets/icons/ai-openai-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/arch-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/cachyos-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/cloudflare-dns-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/crosshair-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/debian-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/deepseek-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/desktop-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/endeavouros-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/fedora-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/flatpak-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/github-symbolic.svg create mode 120000 configs/quickshell/ii/assets/icons/google-gemini-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/linux-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/microsoft-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/mistral-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/nixos-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/nyarch-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/ollama-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/openai-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/openrouter-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/spark-symbolic.svg create mode 100644 configs/quickshell/ii/assets/icons/ubuntu-symbolic.svg create mode 100644 configs/quickshell/ii/assets/images/default_wallpaper.png create mode 100644 configs/quickshell/ii/defaults/ai/README.md create mode 100644 configs/quickshell/ii/defaults/ai/prompts/NoPrompt.md create mode 100644 configs/quickshell/ii/defaults/ai/prompts/ii-Default.md create mode 100644 configs/quickshell/ii/defaults/ai/prompts/ii-Imouto.md create mode 100644 configs/quickshell/ii/defaults/ai/prompts/nyarch-Acchan.md create mode 100644 configs/quickshell/ii/defaults/ai/prompts/w-FourPointedSparkle.md create mode 100644 configs/quickshell/ii/defaults/ai/prompts/w-OpenMechanicalFlower.md create mode 100644 configs/quickshell/ii/modules/background/Background.qml create mode 100644 configs/quickshell/ii/modules/bar/ActiveWindow.qml create mode 100644 configs/quickshell/ii/modules/bar/Bar.qml create mode 100644 configs/quickshell/ii/modules/bar/BarGroup.qml create mode 100644 configs/quickshell/ii/modules/bar/BatteryIndicator.qml create mode 100644 configs/quickshell/ii/modules/bar/CircleUtilButton.qml create mode 100644 configs/quickshell/ii/modules/bar/ClockWidget.qml create mode 100644 configs/quickshell/ii/modules/bar/Media.qml create mode 100644 configs/quickshell/ii/modules/bar/Resource.qml create mode 100644 configs/quickshell/ii/modules/bar/Resources.qml create mode 100644 configs/quickshell/ii/modules/bar/ScrollHint.qml create mode 100644 configs/quickshell/ii/modules/bar/SysTray.qml create mode 100644 configs/quickshell/ii/modules/bar/SysTrayItem.qml create mode 100644 configs/quickshell/ii/modules/bar/UtilButtons.qml create mode 100644 configs/quickshell/ii/modules/bar/Workspaces.qml create mode 100644 configs/quickshell/ii/modules/bar/qmldir create mode 100644 configs/quickshell/ii/modules/bar/weather/WeatherBar.qml create mode 100644 configs/quickshell/ii/modules/bar/weather/WeatherCard.qml create mode 100644 configs/quickshell/ii/modules/bar/weather/WeatherIcons.qml create mode 100644 configs/quickshell/ii/modules/bar/weather/WeatherPopup.qml create mode 100644 configs/quickshell/ii/modules/bar/weather/qmldir create mode 100644 configs/quickshell/ii/modules/cheatsheet/Cheatsheet.qml create mode 100644 configs/quickshell/ii/modules/cheatsheet/CheatsheetKeybinds.qml create mode 100644 configs/quickshell/ii/modules/cheatsheet/CheatsheetPeriodicTable.qml create mode 100644 configs/quickshell/ii/modules/cheatsheet/ElementTile.qml create mode 100644 configs/quickshell/ii/modules/cheatsheet/periodic_table.js create mode 100644 configs/quickshell/ii/modules/common/Appearance.qml create mode 100644 configs/quickshell/ii/modules/common/Config.qml create mode 100644 configs/quickshell/ii/modules/common/Config.qml.backup create mode 100644 configs/quickshell/ii/modules/common/Directories.qml create mode 100644 configs/quickshell/ii/modules/common/Persistent.qml create mode 100644 configs/quickshell/ii/modules/common/functions/ColorUtils.qml create mode 100644 configs/quickshell/ii/modules/common/functions/FileUtils.qml create mode 100644 configs/quickshell/ii/modules/common/functions/Fuzzy.qml create mode 100644 configs/quickshell/ii/modules/common/functions/Levendist.qml create mode 100644 configs/quickshell/ii/modules/common/functions/ObjectUtils.qml create mode 100644 configs/quickshell/ii/modules/common/functions/StringUtils.qml create mode 100644 configs/quickshell/ii/modules/common/functions/fuzzysort.js create mode 100644 configs/quickshell/ii/modules/common/functions/levendist.js create mode 100644 configs/quickshell/ii/modules/common/functions/qmldir create mode 100644 configs/quickshell/ii/modules/common/qmldir create mode 100644 configs/quickshell/ii/modules/common/widgets/ButtonGroup.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/CircularProgress.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/CliphistImage.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ConfigRow.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ConfigSelectionArray.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ConfigSpinBox.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ConfigSwitch.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ContentPage.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ContentSection.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ContentSubsection.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/ContentSubsectionLabel.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/CustomIcon.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/DialogButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/DragManager.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/Favicon.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/FloatingActionButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/FlowButtonGroup.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/GroupButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/KeyboardKey.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/LightDarkPreferenceButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/MaterialSymbol.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/MaterialTextField.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/MenuButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NavigationRail.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NavigationRailButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NavigationRailExpandButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NavigationRailTabArray.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NotificationActionButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NotificationAppIcon.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NotificationGroup.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NotificationGroupExpandButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NotificationItem.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/NotificationListView.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/PointingHandInteraction.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/PointingHandLinkHover.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/PrimaryTabBar.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/PrimaryTabButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/Revealer.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/RippleButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/RippleButtonWithIcon.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/RoundCorner.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/SecondaryTabButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/SelectionDialog.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/SelectionGroupButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledFlickable.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledLabel.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledListView.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledProgressBar.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledRadioButton.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledRectangularShadow.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledSlider.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledSpinBox.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledSwitch.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledText.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledTextArea.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledTextInput.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/StyledToolTip.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/VerticalButtonGroup.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/WaveVisualizer.qml create mode 100644 configs/quickshell/ii/modules/common/widgets/notification_utils.js create mode 100644 configs/quickshell/ii/modules/common/widgets/qmldir create mode 100644 configs/quickshell/ii/modules/dock/Dock.qml create mode 100644 configs/quickshell/ii/modules/dock/DockAppButton.qml create mode 100644 configs/quickshell/ii/modules/dock/DockApps.qml create mode 100644 configs/quickshell/ii/modules/dock/DockButton.qml create mode 100644 configs/quickshell/ii/modules/dock/DockSeparator.qml create mode 100644 configs/quickshell/ii/modules/lock/Lock.qml create mode 100644 configs/quickshell/ii/modules/lock/LockContext.qml create mode 100644 configs/quickshell/ii/modules/lock/LockSurface.qml create mode 100644 configs/quickshell/ii/modules/lock/pam/password.conf create mode 100644 configs/quickshell/ii/modules/mediaControls/MediaControls.qml create mode 100644 configs/quickshell/ii/modules/mediaControls/PlayerControl.qml create mode 100644 configs/quickshell/ii/modules/notificationPopup/NotificationPopup.qml create mode 100644 configs/quickshell/ii/modules/onScreenDisplay/OnScreenDisplayBrightness.qml create mode 100644 configs/quickshell/ii/modules/onScreenDisplay/OnScreenDisplayVolume.qml create mode 100644 configs/quickshell/ii/modules/onScreenDisplay/OsdValueIndicator.qml create mode 100644 configs/quickshell/ii/modules/onScreenKeyboard/OnScreenKeyboard.qml create mode 100644 configs/quickshell/ii/modules/onScreenKeyboard/OskContent.qml create mode 100644 configs/quickshell/ii/modules/onScreenKeyboard/OskKey.qml create mode 100644 configs/quickshell/ii/modules/onScreenKeyboard/layouts.js create mode 100644 configs/quickshell/ii/modules/overview/Overview.qml create mode 100644 configs/quickshell/ii/modules/overview/Overview.qml.template create mode 100644 configs/quickshell/ii/modules/overview/OverviewWidget.qml create mode 100644 configs/quickshell/ii/modules/overview/OverviewWindow.qml create mode 100644 configs/quickshell/ii/modules/overview/SearchItem.qml create mode 100644 configs/quickshell/ii/modules/overview/SearchWidget.qml create mode 100644 configs/quickshell/ii/modules/overview/qmldir create mode 100644 configs/quickshell/ii/modules/qmldir create mode 100644 configs/quickshell/ii/modules/screenCorners/ScreenCorners.qml create mode 100644 configs/quickshell/ii/modules/screenCorners/ScreenCorners.qml.template create mode 100644 configs/quickshell/ii/modules/session/Session.qml create mode 100644 configs/quickshell/ii/modules/session/SessionActionButton.qml create mode 100644 configs/quickshell/ii/modules/session/SessionManager.qml.template create mode 100644 configs/quickshell/ii/modules/settings/About.qml create mode 100644 configs/quickshell/ii/modules/settings/AdvancedConfig.qml create mode 100644 configs/quickshell/ii/modules/settings/InterfaceConfig.qml create mode 100644 configs/quickshell/ii/modules/settings/ServicesConfig.qml create mode 100644 configs/quickshell/ii/modules/settings/Settings.qml create mode 100644 configs/quickshell/ii/modules/settings/StyleConfig.qml create mode 100644 configs/quickshell/ii/modules/settings/TransparencySettings.qml create mode 100644 configs/quickshell/ii/modules/settings/TransparencyUI.qml create mode 120000 configs/quickshell/ii/modules/settings/transparency-config.json create mode 100644 configs/quickshell/ii/modules/sidebarLeft/AiChat.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/Anime.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/ApiCommandButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/ApiInputBoxIndicator.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/DescriptionBox.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/SidebarLeft.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/SidebarLeft.qml.template create mode 100644 configs/quickshell/ii/modules/sidebarLeft/SidebarLeftContent.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/Translator.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/AiMessage.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/AiMessageControlButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/AnnotationSourceButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/MessageCodeBlock.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/MessageTextBlock.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/MessageThinkBlock.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/aiChat/SearchQueryButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/qmldir create mode 100644 configs/quickshell/ii/modules/sidebarLeft/translator/LanguageSelectorButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarLeft/translator/TextCanvas.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/BottomWidgetGroup.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/CenterWidgetGroup.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/SidebarRight.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/calendar/CalendarDayButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/calendar/CalendarHeaderButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/calendar/CalendarWidget.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/calendar/calendar_layout.js create mode 100644 configs/quickshell/ii/modules/sidebarRight/notifications/NotificationList.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/notifications/NotificationStatusButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/qmldir create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/CloudflareWarp.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/EasyEffectsToggle.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/GameMode.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/IdleInhibitor.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/NetworkToggle.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/NightLight.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/quickToggles/QuickToggleButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/todo/TaskList.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/todo/TodoItemActionButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/todo/TodoWidget.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/volumeMixer/AudioDeviceSelectorButton.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeMixer.qml create mode 100644 configs/quickshell/ii/modules/sidebarRight/volumeMixer/VolumeMixerEntry.qml create mode 100644 configs/quickshell/ii/qmldir create mode 100644 configs/quickshell/ii/qs/modules/common/Appearance.qml create mode 100644 configs/quickshell/ii/qs/modules/common/Config.qml create mode 100644 configs/quickshell/ii/qs/modules/common/Directories.qml create mode 100644 configs/quickshell/ii/qs/modules/common/Persistent.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/ColorUtils.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/FileUtils.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/Fuzzy.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/Levendist.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/ObjectUtils.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/StringUtils.qml create mode 100644 configs/quickshell/ii/qs/modules/common/functions/fuzzysort.js create mode 100644 configs/quickshell/ii/qs/modules/common/functions/levendist.js create mode 100644 configs/quickshell/ii/qs/modules/common/functions/qmldir create mode 100644 configs/quickshell/ii/qs/modules/common/qmldir create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ButtonGroup.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/CircularProgress.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/CliphistImage.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ConfigRow.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ConfigSelectionArray.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ConfigSpinBox.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ConfigSwitch.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ContentPage.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ContentSection.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ContentSubsection.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/ContentSubsectionLabel.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/CustomIcon.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/DialogButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/DragManager.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/Favicon.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/FloatingActionButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/FlowButtonGroup.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/GroupButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/KeyboardKey.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/LightDarkPreferenceButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/MaterialSymbol.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/MaterialTextField.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/MenuButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NavigationRail.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NavigationRailButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NavigationRailExpandButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NavigationRailTabArray.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NotificationActionButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NotificationAppIcon.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NotificationGroup.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NotificationGroupExpandButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NotificationItem.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/NotificationListView.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/PointingHandInteraction.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/PointingHandLinkHover.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/PrimaryTabBar.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/PrimaryTabButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/Revealer.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/RippleButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/RippleButtonWithIcon.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/RoundCorner.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/SecondaryTabButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/SelectionDialog.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/SelectionGroupButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledFlickable.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledLabel.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledListView.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledProgressBar.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledRadioButton.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledRectangularShadow.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledSlider.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledSpinBox.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledSwitch.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledText.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledTextArea.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledTextInput.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/StyledToolTip.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/VerticalButtonGroup.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/WaveVisualizer.qml create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/notification_utils.js create mode 100644 configs/quickshell/ii/qs/modules/common/widgets/qmldir create mode 100644 configs/quickshell/ii/qs/qmldir create mode 100644 configs/quickshell/ii/qs/services/Ai.qml create mode 100644 configs/quickshell/ii/qs/services/AppSearch.qml create mode 100644 configs/quickshell/ii/qs/services/Audio.qml create mode 100644 configs/quickshell/ii/qs/services/Battery.qml create mode 100644 configs/quickshell/ii/qs/services/Bluetooth.qml create mode 100644 configs/quickshell/ii/qs/services/Booru.qml create mode 100644 configs/quickshell/ii/qs/services/BooruResponseData.qml create mode 100644 configs/quickshell/ii/qs/services/Brightness.qml create mode 100644 configs/quickshell/ii/qs/services/Cliphist.qml create mode 100644 configs/quickshell/ii/qs/services/DateTime.qml create mode 100644 configs/quickshell/ii/qs/services/Emojis.qml create mode 100644 configs/quickshell/ii/qs/services/FirstRunExperience.qml create mode 100644 configs/quickshell/ii/qs/services/HyprlandData.qml create mode 100644 configs/quickshell/ii/qs/services/HyprlandKeybinds.qml create mode 100644 configs/quickshell/ii/qs/services/HyprlandXkb.qml create mode 100644 configs/quickshell/ii/qs/services/Hyprsunset.qml create mode 100644 configs/quickshell/ii/qs/services/KeyringStorage.qml create mode 100644 configs/quickshell/ii/qs/services/LatexRenderer.qml create mode 100644 configs/quickshell/ii/qs/services/MaterialThemeLoader.qml create mode 100644 configs/quickshell/ii/qs/services/MprisController.qml create mode 100644 configs/quickshell/ii/qs/services/Network.qml create mode 100644 configs/quickshell/ii/qs/services/Notifications.qml create mode 100644 configs/quickshell/ii/qs/services/ResourceUsage.qml create mode 100644 configs/quickshell/ii/qs/services/SystemInfo.qml create mode 100644 configs/quickshell/ii/qs/services/Todo.qml create mode 100644 configs/quickshell/ii/qs/services/Weather.qml create mode 100644 configs/quickshell/ii/qs/services/Ydotool.qml create mode 100644 configs/quickshell/ii/qs/services/ai/AiMessageData.qml create mode 100644 configs/quickshell/ii/qs/services/ai/AiModel.qml create mode 100644 configs/quickshell/ii/qs/services/ai/ApiStrategy.qml create mode 100644 configs/quickshell/ii/qs/services/ai/GeminiApiStrategy.qml create mode 100644 configs/quickshell/ii/qs/services/ai/MistralApiStrategy.qml create mode 100644 configs/quickshell/ii/qs/services/ai/OpenAiApiStrategy.qml create mode 100644 configs/quickshell/ii/qs/services/ai/qmldir create mode 100644 configs/quickshell/ii/qs/services/qmldir create mode 100644 configs/quickshell/ii/screenshot.qml create mode 100755 configs/quickshell/ii/scripts/ai/show-installed-ollama-models.sh create mode 100644 configs/quickshell/ii/scripts/cava/raw_output_config.txt create mode 100755 configs/quickshell/ii/scripts/colors/applycolor.sh create mode 100755 configs/quickshell/ii/scripts/colors/generate_colors_material.py create mode 100755 configs/quickshell/ii/scripts/colors/random_konachan_wall.sh create mode 100755 configs/quickshell/ii/scripts/colors/scheme_for_image.py create mode 100755 configs/quickshell/ii/scripts/colors/switchwall.sh create mode 100644 configs/quickshell/ii/scripts/colors/terminal/scheme-base.json create mode 100644 configs/quickshell/ii/scripts/colors/terminal/sequences.txt create mode 100755 configs/quickshell/ii/scripts/hyprland/get_keybinds.py create mode 100755 configs/quickshell/ii/scripts/images/find_regions.py create mode 100755 configs/quickshell/ii/scripts/images/least_busy_region.py create mode 100644 configs/quickshell/ii/scripts/kvantum/adwsvg.py create mode 100644 configs/quickshell/ii/scripts/kvantum/adwsvgDark.py create mode 100644 configs/quickshell/ii/scripts/kvantum/changeAdwColors.py create mode 100755 configs/quickshell/ii/scripts/kvantum/materialQT.sh create mode 100755 configs/quickshell/ii/scripts/wayland-idle-inhibitor.py create mode 100644 configs/quickshell/ii/services/Ai.qml create mode 100644 configs/quickshell/ii/services/AppSearch.qml create mode 100644 configs/quickshell/ii/services/Audio.qml create mode 100644 configs/quickshell/ii/services/Battery.qml create mode 100644 configs/quickshell/ii/services/Bluetooth.qml create mode 100644 configs/quickshell/ii/services/Booru.qml create mode 100644 configs/quickshell/ii/services/BooruResponseData.qml create mode 100644 configs/quickshell/ii/services/Brightness.qml create mode 100644 configs/quickshell/ii/services/Cliphist.qml create mode 100644 configs/quickshell/ii/services/DateTime.qml create mode 100644 configs/quickshell/ii/services/Emojis.qml create mode 100644 configs/quickshell/ii/services/FirstRunExperience.qml create mode 100644 configs/quickshell/ii/services/HyprlandData.qml create mode 100644 configs/quickshell/ii/services/HyprlandKeybinds.qml create mode 100644 configs/quickshell/ii/services/HyprlandXkb.qml create mode 100644 configs/quickshell/ii/services/Hyprsunset.qml create mode 100644 configs/quickshell/ii/services/KeyringStorage.qml create mode 100644 configs/quickshell/ii/services/LatexRenderer.qml create mode 100644 configs/quickshell/ii/services/MaterialThemeLoader.qml create mode 100644 configs/quickshell/ii/services/MprisController.qml create mode 100644 configs/quickshell/ii/services/Network.qml create mode 100644 configs/quickshell/ii/services/Notifications.qml create mode 100644 configs/quickshell/ii/services/ResourceUsage.qml create mode 100644 configs/quickshell/ii/services/SystemInfo.qml create mode 100644 configs/quickshell/ii/services/Todo.qml create mode 100644 configs/quickshell/ii/services/Weather.qml create mode 100644 configs/quickshell/ii/services/Ydotool.qml create mode 100644 configs/quickshell/ii/services/ai/AiMessageData.qml create mode 100644 configs/quickshell/ii/services/ai/AiModel.qml create mode 100644 configs/quickshell/ii/services/ai/ApiStrategy.qml create mode 100644 configs/quickshell/ii/services/ai/GeminiApiStrategy.qml create mode 100644 configs/quickshell/ii/services/ai/MistralApiStrategy.qml create mode 100644 configs/quickshell/ii/services/ai/OpenAiApiStrategy.qml create mode 100644 configs/quickshell/ii/services/qmldir create mode 100644 configs/quickshell/ii/settings.qml create mode 100644 configs/quickshell/ii/shell.qml create mode 100644 configs/quickshell/ii/welcome.qml create mode 100644 configs/quickshell/modules/background/Background.qml create mode 100644 configs/quickshell/modules/bar/ActiveWindow.qml create mode 100644 configs/quickshell/modules/bar/Bar.qml create mode 100644 configs/quickshell/modules/bar/BarGroup.qml create mode 100644 configs/quickshell/modules/bar/BatteryIndicator.qml create mode 100644 configs/quickshell/modules/bar/CircleUtilButton.qml create mode 100644 configs/quickshell/modules/bar/ClockWidget.qml create mode 100644 configs/quickshell/modules/bar/Media.qml create mode 100644 configs/quickshell/modules/bar/Resource.qml create mode 100644 configs/quickshell/modules/bar/Resources.qml create mode 100644 configs/quickshell/modules/bar/ScrollHint.qml create mode 100644 configs/quickshell/modules/bar/SysTray.qml create mode 100644 configs/quickshell/modules/bar/SysTrayItem.qml create mode 100644 configs/quickshell/modules/bar/UtilButtons.qml create mode 100644 configs/quickshell/modules/bar/Workspaces.qml create mode 100644 configs/quickshell/modules/bar/weather/WeatherBar.qml create mode 100644 configs/quickshell/modules/bar/weather/WeatherCard.qml create mode 100644 configs/quickshell/modules/bar/weather/WeatherIcons.qml create mode 100644 configs/quickshell/modules/bar/weather/WeatherPopup.qml create mode 100644 configs/quickshell/modules/cheatsheet/Cheatsheet.qml create mode 100644 configs/quickshell/modules/cheatsheet/CheatsheetKeybinds.qml create mode 100644 configs/quickshell/modules/cheatsheet/CheatsheetPeriodicTable.qml create mode 100644 configs/quickshell/modules/cheatsheet/ElementTile.qml create mode 100644 configs/quickshell/modules/cheatsheet/periodic_table.js create mode 100644 configs/quickshell/modules/common/Appearance.qml create mode 100644 configs/quickshell/modules/common/Config.qml create mode 100644 configs/quickshell/modules/common/Directories.qml create mode 100644 configs/quickshell/modules/common/Persistent.qml create mode 100644 configs/quickshell/modules/common/functions/ColorUtils.qml create mode 100644 configs/quickshell/modules/common/functions/FileUtils.qml create mode 100644 configs/quickshell/modules/common/functions/Fuzzy.qml create mode 100644 configs/quickshell/modules/common/functions/Levendist.qml create mode 100644 configs/quickshell/modules/common/functions/ObjectUtils.qml create mode 100644 configs/quickshell/modules/common/functions/StringUtils.qml create mode 100644 configs/quickshell/modules/common/functions/fuzzysort.js create mode 100644 configs/quickshell/modules/common/functions/levendist.js create mode 100644 configs/quickshell/modules/common/functions/qmldir create mode 100644 configs/quickshell/modules/common/qmldir create mode 100644 configs/quickshell/modules/common/widgets/ButtonGroup.qml create mode 100644 configs/quickshell/modules/common/widgets/CircularProgress.qml create mode 100644 configs/quickshell/modules/common/widgets/CliphistImage.qml create mode 100644 configs/quickshell/modules/common/widgets/ConfigRow.qml create mode 100644 configs/quickshell/modules/common/widgets/ConfigSelectionArray.qml create mode 100644 configs/quickshell/modules/common/widgets/ConfigSpinBox.qml create mode 100644 configs/quickshell/modules/common/widgets/ConfigSwitch.qml create mode 100644 configs/quickshell/modules/common/widgets/ContentPage.qml create mode 100644 configs/quickshell/modules/common/widgets/ContentSection.qml create mode 100644 configs/quickshell/modules/common/widgets/ContentSubsection.qml create mode 100644 configs/quickshell/modules/common/widgets/ContentSubsectionLabel.qml create mode 100644 configs/quickshell/modules/common/widgets/CustomIcon.qml create mode 100644 configs/quickshell/modules/common/widgets/DialogButton.qml create mode 100644 configs/quickshell/modules/common/widgets/DragManager.qml create mode 100644 configs/quickshell/modules/common/widgets/Favicon.qml create mode 100644 configs/quickshell/modules/common/widgets/FloatingActionButton.qml create mode 100644 configs/quickshell/modules/common/widgets/FlowButtonGroup.qml create mode 100644 configs/quickshell/modules/common/widgets/GroupButton.qml create mode 100644 configs/quickshell/modules/common/widgets/KeyboardKey.qml create mode 100644 configs/quickshell/modules/common/widgets/LightDarkPreferenceButton.qml create mode 100644 configs/quickshell/modules/common/widgets/MaterialSymbol.qml create mode 100644 configs/quickshell/modules/common/widgets/MaterialTextField.qml create mode 100644 configs/quickshell/modules/common/widgets/MenuButton.qml create mode 100644 configs/quickshell/modules/common/widgets/NavigationRail.qml create mode 100644 configs/quickshell/modules/common/widgets/NavigationRailButton.qml create mode 100644 configs/quickshell/modules/common/widgets/NavigationRailExpandButton.qml create mode 100644 configs/quickshell/modules/common/widgets/NavigationRailTabArray.qml create mode 100644 configs/quickshell/modules/common/widgets/NotificationActionButton.qml create mode 100644 configs/quickshell/modules/common/widgets/NotificationAppIcon.qml create mode 100644 configs/quickshell/modules/common/widgets/NotificationGroup.qml create mode 100644 configs/quickshell/modules/common/widgets/NotificationGroupExpandButton.qml create mode 100644 configs/quickshell/modules/common/widgets/NotificationItem.qml create mode 100644 configs/quickshell/modules/common/widgets/NotificationListView.qml create mode 100644 configs/quickshell/modules/common/widgets/PointingHandInteraction.qml create mode 100644 configs/quickshell/modules/common/widgets/PointingHandLinkHover.qml create mode 100644 configs/quickshell/modules/common/widgets/PrimaryTabBar.qml create mode 100644 configs/quickshell/modules/common/widgets/PrimaryTabButton.qml create mode 100644 configs/quickshell/modules/common/widgets/Revealer.qml create mode 100644 configs/quickshell/modules/common/widgets/RippleButton.qml create mode 100644 configs/quickshell/modules/common/widgets/RippleButtonWithIcon.qml create mode 100644 configs/quickshell/modules/common/widgets/RoundCorner.qml create mode 100644 configs/quickshell/modules/common/widgets/SecondaryTabButton.qml create mode 100644 configs/quickshell/modules/common/widgets/SelectionDialog.qml create mode 100644 configs/quickshell/modules/common/widgets/SelectionGroupButton.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledFlickable.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledLabel.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledListView.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledProgressBar.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledRadioButton.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledRectangularShadow.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledSlider.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledSpinBox.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledSwitch.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledText.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledTextArea.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledTextInput.qml create mode 100644 configs/quickshell/modules/common/widgets/StyledToolTip.qml create mode 100644 configs/quickshell/modules/common/widgets/VerticalButtonGroup.qml create mode 100644 configs/quickshell/modules/common/widgets/WaveVisualizer.qml create mode 100644 configs/quickshell/modules/common/widgets/notification_utils.js create mode 100644 configs/quickshell/modules/common/widgets/qmldir create mode 100644 configs/quickshell/modules/dock/Dock.qml create mode 100644 configs/quickshell/modules/dock/DockAppButton.qml create mode 100644 configs/quickshell/modules/dock/DockApps.qml create mode 100644 configs/quickshell/modules/dock/DockButton.qml create mode 100644 configs/quickshell/modules/dock/DockSeparator.qml create mode 100644 configs/quickshell/modules/lock/Lock.qml create mode 100644 configs/quickshell/modules/lock/LockContext.qml create mode 100644 configs/quickshell/modules/lock/LockSurface.qml create mode 100644 configs/quickshell/modules/lock/pam/password.conf create mode 100644 configs/quickshell/modules/mediaControls/MediaControls.qml create mode 100644 configs/quickshell/modules/mediaControls/PlayerControl.qml create mode 100644 configs/quickshell/modules/notificationPopup/NotificationPopup.qml create mode 100644 configs/quickshell/modules/onScreenDisplay/OnScreenDisplayBrightness.qml create mode 100644 configs/quickshell/modules/onScreenDisplay/OnScreenDisplayVolume.qml create mode 100644 configs/quickshell/modules/onScreenDisplay/OsdValueIndicator.qml create mode 100644 configs/quickshell/modules/onScreenKeyboard/OnScreenKeyboard.qml create mode 100644 configs/quickshell/modules/onScreenKeyboard/OskContent.qml create mode 100644 configs/quickshell/modules/onScreenKeyboard/OskKey.qml create mode 100644 configs/quickshell/modules/onScreenKeyboard/layouts.js create mode 100644 configs/quickshell/modules/overview/Overview.qml create mode 100644 configs/quickshell/modules/overview/Overview.qml.template create mode 100644 configs/quickshell/modules/overview/OverviewWidget.qml create mode 100644 configs/quickshell/modules/overview/OverviewWindow.qml create mode 100644 configs/quickshell/modules/overview/SearchItem.qml create mode 100644 configs/quickshell/modules/overview/SearchWidget.qml create mode 100644 configs/quickshell/modules/screenCorners/ScreenCorners.qml create mode 100644 configs/quickshell/modules/screenCorners/ScreenCorners.qml.template create mode 100644 configs/quickshell/modules/session/Session.qml create mode 100644 configs/quickshell/modules/session/SessionActionButton.qml create mode 100644 configs/quickshell/modules/session/SessionManager.qml.template create mode 100644 configs/quickshell/modules/settings/About.qml create mode 100644 configs/quickshell/modules/settings/AdvancedConfig.qml create mode 100644 configs/quickshell/modules/settings/InterfaceConfig.qml create mode 100644 configs/quickshell/modules/settings/ServicesConfig.qml create mode 100644 configs/quickshell/modules/settings/Settings.qml create mode 100644 configs/quickshell/modules/settings/StyleConfig.qml create mode 100644 configs/quickshell/modules/settings/TransparencySettings.qml create mode 100644 configs/quickshell/modules/settings/TransparencyUI.qml create mode 100644 configs/quickshell/modules/sidebarLeft/AiChat.qml create mode 100644 configs/quickshell/modules/sidebarLeft/Anime.qml create mode 100644 configs/quickshell/modules/sidebarLeft/ApiCommandButton.qml create mode 100644 configs/quickshell/modules/sidebarLeft/ApiInputBoxIndicator.qml create mode 100644 configs/quickshell/modules/sidebarLeft/DescriptionBox.qml create mode 100644 configs/quickshell/modules/sidebarLeft/SidebarLeft.qml create mode 100644 configs/quickshell/modules/sidebarLeft/SidebarLeft.qml.template create mode 100644 configs/quickshell/modules/sidebarLeft/SidebarLeftContent.qml create mode 100644 configs/quickshell/modules/sidebarLeft/Translator.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/AiMessage.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/AiMessageControlButton.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/AnnotationSourceButton.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/MessageCodeBlock.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/MessageTextBlock.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/MessageThinkBlock.qml create mode 100644 configs/quickshell/modules/sidebarLeft/aiChat/SearchQueryButton.qml create mode 100644 configs/quickshell/modules/sidebarLeft/anime/BooruImage.qml create mode 100644 configs/quickshell/modules/sidebarLeft/anime/BooruResponse.qml create mode 100644 configs/quickshell/modules/sidebarLeft/translator/LanguageSelectorButton.qml create mode 100644 configs/quickshell/modules/sidebarLeft/translator/TextCanvas.qml create mode 100644 configs/quickshell/modules/sidebarRight/BottomWidgetGroup.qml create mode 100644 configs/quickshell/modules/sidebarRight/CenterWidgetGroup.qml create mode 100644 configs/quickshell/modules/sidebarRight/SidebarRight.qml create mode 100644 configs/quickshell/modules/sidebarRight/calendar/CalendarDayButton.qml create mode 100644 configs/quickshell/modules/sidebarRight/calendar/CalendarHeaderButton.qml create mode 100644 configs/quickshell/modules/sidebarRight/calendar/CalendarWidget.qml create mode 100644 configs/quickshell/modules/sidebarRight/calendar/calendar_layout.js create mode 100644 configs/quickshell/modules/sidebarRight/notifications/NotificationList.qml create mode 100644 configs/quickshell/modules/sidebarRight/notifications/NotificationStatusButton.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/BluetoothToggle.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/CloudflareWarp.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/EasyEffectsToggle.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/GameMode.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/IdleInhibitor.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/NetworkToggle.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/NightLight.qml create mode 100644 configs/quickshell/modules/sidebarRight/quickToggles/QuickToggleButton.qml create mode 100644 configs/quickshell/modules/sidebarRight/todo/TaskList.qml create mode 100644 configs/quickshell/modules/sidebarRight/todo/TodoItemActionButton.qml create mode 100644 configs/quickshell/modules/sidebarRight/todo/TodoWidget.qml create mode 100644 configs/quickshell/modules/sidebarRight/volumeMixer/AudioDeviceSelectorButton.qml create mode 100644 configs/quickshell/modules/sidebarRight/volumeMixer/VolumeMixer.qml create mode 100644 configs/quickshell/modules/sidebarRight/volumeMixer/VolumeMixerEntry.qml create mode 100644 configs/quickshell/screenshot.qml create mode 100755 configs/quickshell/scripts/ai/show-installed-ollama-models.sh create mode 100644 configs/quickshell/scripts/cava/raw_output_config.txt create mode 100755 configs/quickshell/scripts/colors/applycolor.sh create mode 100755 configs/quickshell/scripts/colors/generate_colors_material.py create mode 100755 configs/quickshell/scripts/colors/random_konachan_wall.sh create mode 100755 configs/quickshell/scripts/colors/scheme_for_image.py create mode 100755 configs/quickshell/scripts/colors/switchwall.sh create mode 100644 configs/quickshell/scripts/colors/terminal/scheme-base.json create mode 100644 configs/quickshell/scripts/colors/terminal/sequences.txt create mode 100755 configs/quickshell/scripts/hyprland/get_keybinds.py create mode 100755 configs/quickshell/scripts/images/find_regions.py create mode 100755 configs/quickshell/scripts/images/least_busy_region.py create mode 100644 configs/quickshell/scripts/kvantum/adwsvg.py create mode 100644 configs/quickshell/scripts/kvantum/adwsvgDark.py create mode 100644 configs/quickshell/scripts/kvantum/changeAdwColors.py create mode 100755 configs/quickshell/scripts/kvantum/materialQT.sh create mode 100755 configs/quickshell/scripts/wayland-idle-inhibitor.py create mode 100644 configs/quickshell/services/Ai.qml create mode 100644 configs/quickshell/services/AppSearch.qml create mode 100644 configs/quickshell/services/Audio.qml create mode 100644 configs/quickshell/services/Battery.qml create mode 100644 configs/quickshell/services/Bluetooth.qml create mode 100644 configs/quickshell/services/Booru.qml create mode 100644 configs/quickshell/services/BooruResponseData.qml create mode 100644 configs/quickshell/services/Brightness.qml create mode 100644 configs/quickshell/services/Cliphist.qml create mode 100644 configs/quickshell/services/DateTime.qml create mode 100644 configs/quickshell/services/Emojis.qml create mode 100644 configs/quickshell/services/FirstRunExperience.qml create mode 100644 configs/quickshell/services/HyprlandData.qml create mode 100644 configs/quickshell/services/HyprlandKeybinds.qml create mode 100644 configs/quickshell/services/HyprlandXkb.qml create mode 100644 configs/quickshell/services/Hyprsunset.qml create mode 100644 configs/quickshell/services/KeyringStorage.qml create mode 100644 configs/quickshell/services/LatexRenderer.qml create mode 100644 configs/quickshell/services/MaterialThemeLoader.qml create mode 100644 configs/quickshell/services/MprisController.qml create mode 100644 configs/quickshell/services/Network.qml create mode 100644 configs/quickshell/services/Notifications.qml create mode 100644 configs/quickshell/services/ResourceUsage.qml create mode 100644 configs/quickshell/services/SystemInfo.qml create mode 100644 configs/quickshell/services/Todo.qml create mode 100644 configs/quickshell/services/Weather.qml create mode 100644 configs/quickshell/services/Ydotool.qml create mode 100644 configs/quickshell/services/ai/AiMessageData.qml create mode 100644 configs/quickshell/services/ai/AiModel.qml create mode 100644 configs/quickshell/services/ai/ApiStrategy.qml create mode 100644 configs/quickshell/services/ai/GeminiApiStrategy.qml create mode 100644 configs/quickshell/services/ai/MistralApiStrategy.qml create mode 100644 configs/quickshell/services/ai/OpenAiApiStrategy.qml create mode 100644 configs/quickshell/services/qmldir create mode 100644 configs/quickshell/settings.qml create mode 100644 configs/quickshell/shell.qml create mode 100644 configs/quickshell/translations/en_US.json create mode 100644 configs/quickshell/translations/it_IT.json create mode 100644 configs/quickshell/translations/ru_RU.json create mode 100644 configs/quickshell/translations/tools/README.md create mode 100644 configs/quickshell/translations/tools/guide/translation-tools-guide-zh_CN.md create mode 100644 configs/quickshell/translations/tools/guide/translation-tools-guide.md create mode 100755 configs/quickshell/translations/tools/manage-translations.sh create mode 100755 configs/quickshell/translations/tools/translation-cleaner.py create mode 100755 configs/quickshell/translations/tools/translation-manager.py create mode 100644 configs/quickshell/translations/uk_UA.json create mode 100644 configs/quickshell/translations/vi_VN.json create mode 100644 configs/quickshell/translations/zh_CN.json create mode 100644 configs/quickshell/welcome.qml create mode 100755 configs/scripts/demo-material-you.sh create mode 100755 configs/scripts/fuzzel-emoji.sh create mode 100755 configs/scripts/generate-colors.sh create mode 100755 configs/scripts/record.sh create mode 100755 configs/scripts/test-phase4.sh create mode 100755 configs/scripts/test-phase5.sh create mode 100755 configs/scripts/zoom.sh create mode 100644 configs/touchegg-quickshell.conf diff --git a/README.md b/README.md index 55f41fd..d5e1389 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,18 @@ -# dots-hyprland for NixOS +# dots-hyprland for NixOS (Self-Contained) -A NixOS adaptation of [end-4's dots-hyprland](https://github.com/end-4/dots-hyprland) desktop environment, bringing the beautiful "illogical-impulse" style to NixOS with full declarative configuration. +A complete, self-contained NixOS adaptation of [end-4's dots-hyprland](https://github.com/end-4/dots-hyprland) desktop environment, bringing the beautiful "illogical-impulse" style to NixOS with full declarative configuration. -## ๐ŸŽฏ Project Status: Phase 3 Complete โœ… +## ๐ŸŽฏ Project Status: Self-Contained & Complete โœ… -**Current Achievement: Core Desktop Environment Functional** +**Current Achievement: Fully Self-Contained Desktop Environment** -- โœ… **Quickshell Integration** - Official flake support resolved +- โœ… **Self-Contained**: All configurations included locally (no external dependencies) +- โœ… **Quickshell Integration** - Official flake support with local configs - โœ… **Hyprland Configuration** - Complete window manager setup with Material You theming - โœ… **Essential Applications** - foot terminal, fuzzel launcher, nautilus file manager - โœ… **Home Manager Integration** - Fully declarative configuration - โœ… **Package Management** - All dependencies properly integrated -- โœ… **Development Environment** - Ready for Phase 4 advanced features +- โœ… **Development Environment** - Ready for advanced features ## ๐Ÿš€ Quick Start @@ -23,16 +24,16 @@ A NixOS adaptation of [end-4's dots-hyprland](https://github.com/end-4/dots-hypr ```bash # Clone the repository -git clone -cd dots-hyprland-nixos +git clone git@github.com:celesrenata/end-4-flakes.git +cd end-4-flakes # Build and activate Home Manager configuration -nix build .#homeConfigurations.example.activationPackage +nix build .#homeConfigurations.declarative.activationPackage ./result/activate # Or use with your existing Home Manager setup # Add to your flake inputs: -# dots-hyprland.url = "github:your-org/dots-hyprland-nixos"; +# dots-hyprland.url = "github:celesrenata/end-4-flakes"; ``` ### Development @@ -42,7 +43,7 @@ nix build .#homeConfigurations.example.activationPackage nix develop # Available development tools: -# - update-flake: Manage flake inputs and GitHub synchronization +# - update-flake: Manage flake inputs # - compare-modes: Compare declarative vs writable configuration modes # - test-python-env: Test Python virtual environment setup # - test-quickshell: Test quickshell configuration @@ -50,7 +51,6 @@ nix develop # Flake management examples: update-flake status # Show current flake status update-flake update # Update all flake inputs -update-flake update-source # Update only dots-hyprland source update-flake verify # Test that configurations build update-flake help # Show all available options ``` @@ -162,25 +162,34 @@ The utility automatically detects synchronization status and provides clear feed ## ๐Ÿ—๏ธ Architecture -### Module Structure +### Self-Contained Structure ``` -modules/ -โ”œโ”€โ”€ home-manager.nix # Main Home Manager integration -โ”œโ”€โ”€ nixos.nix # NixOS system integration -โ””โ”€โ”€ components/ - โ”œโ”€โ”€ packages.nix # Package management - โ”œโ”€โ”€ hyprland.nix # Hyprland configuration - โ””โ”€โ”€ applications.nix # Application configurations +โ”œโ”€โ”€ flake.nix # Main flake definition (clean & minimal) +โ”œโ”€โ”€ flake.lock # Locked dependencies +โ”œโ”€โ”€ configs/ # All dots-hyprland configurations +โ”‚ โ”œโ”€โ”€ hypr/ # Hyprland configuration +โ”‚ โ”œโ”€โ”€ quickshell/ # Quickshell widgets and config +โ”‚ โ”œโ”€โ”€ applications/ # Application configurations +โ”‚ โ”œโ”€โ”€ scripts/ # Utility scripts +โ”‚ โ””โ”€โ”€ matugen/ # Material You theming +โ”œโ”€โ”€ modules/ # NixOS/Home Manager modules +โ”‚ โ”œโ”€โ”€ home-manager.nix # Main Home Manager integration +โ”‚ โ”œโ”€โ”€ python-environment.nix # Python venv setup +โ”‚ โ”œโ”€โ”€ configuration.nix # Declarative config management +โ”‚ โ”œโ”€โ”€ writable-mode.nix # Writable mode setup +โ”‚ โ””โ”€โ”€ components/ # Component modules +โ””โ”€โ”€ packages/ # Utility packages and scripts + โ”œโ”€โ”€ default.nix # Package definitions + โ”œโ”€โ”€ dots-hyprland-packages.nix # Package mappings + โ””โ”€โ”€ scripts/ # Development utilities ``` -### Flake Structure -``` -โ”œโ”€โ”€ flake.nix # Main flake with inputs/outputs -โ”œโ”€โ”€ modules/ # NixOS/Home Manager modules -โ”œโ”€โ”€ packages/ # Custom package derivations -โ”œโ”€โ”€ configs/ # Configuration templates -โ””โ”€โ”€ assets/ # Static assets (icons, themes) -``` +### Key Benefits +- **๐Ÿ”’ Self-Contained**: No external repository dependencies +- **๐Ÿ“ฆ Version Controlled**: All configs tracked in single repository +- **๐Ÿ”ง Maintainable**: Clean separation of concerns +- **๐Ÿš€ Fast**: No network dependencies during build +- **๐ŸŽฏ Focused**: Only essential files included ## ๐ŸŽฏ Gameplan Progress diff --git a/configs/applications/foot.ini.template b/configs/applications/foot.ini.template new file mode 100644 index 0000000..5b9dc1d --- /dev/null +++ b/configs/applications/foot.ini.template @@ -0,0 +1,137 @@ +[main] +term=xterm-256color +login-shell=yes +app-id=foot +title=foot +locked-title=no + +[bell] +urgent=no +notify=no +visual=no +command= +command-focused=no + +[scrollback] +lines=1000 +multiplier=3.0 +indicator-position=relative +indicator-format="" + +[url] +launch=xdg-open ${url} +label-letters=sadfjklewcmpgh +osc8-underline=url-mode +protocols=http, https, ftp, ftps, file, gemini, gopher +uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[] + +[cursor] +style=beam +color=@CURSOR_COLOR@ +blink=no +beam-thickness=1.5 +underline-thickness= + +[mouse] +hide-when-typing=no +alternate-scroll-mode=yes + +[colors] +alpha=0.95 +background=@BACKGROUND_COLOR@ +foreground=@FOREGROUND_COLOR@ + +# Material You color palette - will be injected by theming system +regular0=@COLOR0@ +regular1=@COLOR1@ +regular2=@COLOR2@ +regular3=@COLOR3@ +regular4=@COLOR4@ +regular5=@COLOR5@ +regular6=@COLOR6@ +regular7=@COLOR7@ + +bright0=@COLOR8@ +bright1=@COLOR9@ +bright2=@COLOR10@ +bright3=@COLOR11@ +bright4=@COLOR12@ +bright5=@COLOR13@ +bright6=@COLOR14@ +bright7=@COLOR15@ + +[csd] +preferred=server +size=26 +font=@FONT_FAMILY@ +color=@FOREGROUND_COLOR@ +hide-when-maximized=no +double-click-to-maximize=yes +border-width=0 +border-color=@BORDER_COLOR@ +button-width=26 +button-color=@BUTTON_COLOR@ +button-minimize-color=@BUTTON_MINIMIZE_COLOR@ +button-maximize-color=@BUTTON_MAXIMIZE_COLOR@ +button-close-color=@BUTTON_CLOSE_COLOR@ + +[key-bindings] +scrollback-up-page=Shift+Page_Up +scrollback-up-half-page=none +scrollback-up-line=none +scrollback-down-page=Shift+Page_Down +scrollback-down-half-page=none +scrollback-down-line=none +clipboard-copy=Control+Shift+c XF86Copy +clipboard-paste=Control+Shift+v XF86Paste +primary-paste=Shift+Insert +search-start=Control+Shift+r +font-increase=Control+plus Control+equal Control+KP_Add +font-decrease=Control+minus Control+KP_Subtract +font-reset=Control+0 Control+KP_0 +spawn-terminal=Control+Shift+n +minimize=none +maximize=none +fullscreen=F11 +pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none +pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none +pipe-selected=[xargs -r firefox] none +show-urls-launch=Control+Shift+u +show-urls-copy=none +show-urls-persistent=none +prompt-prev=Control+Shift+z +prompt-next=Control+Shift+x +unicode-input=Control+Shift+u +noop=none + +[search-bindings] +cancel=Control+g Control+c Escape +commit=Return +find-prev=Control+r +find-next=Control+s +cursor-left=Left Control+b +cursor-left-word=Control+Left Mod1+b +cursor-right=Right Control+f +cursor-right-word=Control+Right Mod1+f +cursor-home=Home Control+a +cursor-end=End Control+e +delete-prev=BackSpace +delete-prev-word=Mod1+BackSpace Control+BackSpace +delete-next=Delete +delete-next-word=Mod1+d Control+Delete +extend-to-word-boundary=Control+w +extend-to-next-whitespace=Control+Shift+w +clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste +primary-paste=Shift+Insert +unicode-input=none + +[mouse-bindings] +selection-override-modifiers=Shift +primary-paste=BTN_MIDDLE +select-begin=BTN_LEFT +select-begin-block=Control+BTN_LEFT +select-extend=BTN_RIGHT +select-extend-character-wise=Control+BTN_RIGHT +select-word=BTN_LEFT-2 +select-word-whitespace=Control+BTN_LEFT-2 +select-row=BTN_LEFT-3 diff --git a/configs/hypr/colors.conf.template b/configs/hypr/colors.conf.template new file mode 100644 index 0000000..382deb9 --- /dev/null +++ b/configs/hypr/colors.conf.template @@ -0,0 +1,40 @@ +# Material You colors for Hyprland +# Generated dynamically from wallpaper + +# Slurp (selection tool) colors +exec = export SLURP_ARGS='-d -c @SLURP_BORDER_COLOR@ -b @SLURP_BACKGROUND_COLOR@ -s 00000000' + +general { + col.active_border = @ACTIVE_BORDER_COLOR@ + col.inactive_border = @INACTIVE_BORDER_COLOR@ +} + +misc { + background_color = @BACKGROUND_COLOR@ +} + +plugin { + hyprbars { + # Font configuration + bar_text_font = @BAR_FONT@ + bar_height = @BAR_HEIGHT@ + bar_padding = 10 + bar_button_padding = 5 + bar_precedence_over_border = true + bar_part_of_window = true + + bar_color = @BAR_BACKGROUND_COLOR@ + col.text = @BAR_TEXT_COLOR@ + + # Window control buttons (R -> L) + hyprbars-button = @BUTTON_COLOR@, 13, ๓ฐ–ญ, hyprctl dispatch killactive + hyprbars-button = @BUTTON_COLOR@, 13, ๓ฐ–ฏ, hyprctl dispatch fullscreen 1 + hyprbars-button = @BUTTON_COLOR@, 13, ๓ฐ–ฐ, hyprctl dispatch movetoworkspacesilent special + } +} + +# Special window border colors +windowrulev2 = bordercolor @PINNED_BORDER_COLOR@ @PINNED_BORDER_COLOR_INACTIVE@,pinned:1 + +# Additional color variables for scripts +@ADDITIONAL_COLORS@ diff --git a/configs/hypr/env.conf.template b/configs/hypr/env.conf.template new file mode 100644 index 0000000..0ee4ac9 --- /dev/null +++ b/configs/hypr/env.conf.template @@ -0,0 +1,27 @@ +# Environment variables for dots-hyprland + +# ######### Input method ########## +# See https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland +env = QT_IM_MODULE, fcitx +env = XMODIFIERS, @im=fcitx +env = SDL_IM_MODULE, fcitx +env = GLFW_IM_MODULE, ibus +env = INPUT_METHOD, fcitx + +# ############ Wayland ############# +env = ELECTRON_OZONE_PLATFORM_HINT, auto + +# ############ Themes ############# +env = QT_QPA_PLATFORM, wayland +env = QT_QPA_PLATFORMTHEME, @QT_THEME@ +env = XDG_MENU_PREFIX, plasma- + +# ######## Hardware specific ######### +@NVIDIA_ENV@ +@AMD_ENV@ + +# ######## Virtual environment ######### +env = ILLOGICAL_IMPULSE_VIRTUAL_ENV, @DATA_DIR@/.venv + +# ######## NixOS specific ######### +env = NIXOS_OZONE_WL, 1 diff --git a/configs/hypr/execs.conf.template b/configs/hypr/execs.conf.template new file mode 100644 index 0000000..57c73ed --- /dev/null +++ b/configs/hypr/execs.conf.template @@ -0,0 +1,29 @@ +# Startup executables for dots-hyprland + +# Core desktop components +exec-once = @QUICKSHELL_BIN@ -c $qsConfig & +exec-once = @HYPRIDLE_BIN@ + +# Authentication and security +exec-once = @GNOME_KEYRING_BIN@ --start --components=secrets +exec-once = @POLKIT_AGENT_BIN@ + +# System services +exec-once = dbus-update-activation-environment --all +exec-once = sleep 1 && dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP + +# Input method +@INPUT_METHOD_EXEC@ + +# Audio system +@AUDIO_EXEC@ + +# Clipboard management +exec-once = @WL_PASTE_BIN@ --type text --watch @CLIPHIST_BIN@ store +exec-once = @WL_PASTE_BIN@ --type image --watch @CLIPHIST_BIN@ store + +# Cursor theme +exec-once = hyprctl setcursor @CURSOR_THEME@ @CURSOR_SIZE@ + +# User custom execs +@CUSTOM_EXECS@ diff --git a/configs/hypr/general.conf.template b/configs/hypr/general.conf.template new file mode 100644 index 0000000..bc2fcb1 --- /dev/null +++ b/configs/hypr/general.conf.template @@ -0,0 +1,163 @@ +# General Hyprland configuration for dots-hyprland + +# MONITOR CONFIG +@MONITOR_CONFIG@ + +# Gestures +gestures { + workspace_swipe = @WORKSPACE_SWIPE@ + workspace_swipe_distance = 700 + workspace_swipe_fingers = 3 + workspace_swipe_min_fingers = true + workspace_swipe_cancel_ratio = 0.2 + workspace_swipe_min_speed_to_force = 5 + workspace_swipe_direction_lock = true + workspace_swipe_direction_lock_threshold = 10 + workspace_swipe_create_new = true +} + +general { + # Gaps and border + gaps_in = @GAPS_IN@ + gaps_out = @GAPS_OUT@ + gaps_workspaces = 50 + + border_size = @BORDER_SIZE@ + col.active_border = @ACTIVE_BORDER_COLOR@ + col.inactive_border = @INACTIVE_BORDER_COLOR@ + resize_on_border = true + + no_focus_fallback = true + + allow_tearing = @ALLOW_TEARING@ + + snap { + enabled = true + } +} + +dwindle { + preserve_split = true + smart_split = false + smart_resizing = false +} + +decoration { + rounding = @ROUNDING@ + + blur { + enabled = @BLUR_ENABLED@ + xray = true + special = false + new_optimizations = true + size = @BLUR_SIZE@ + passes = @BLUR_PASSES@ + brightness = 1 + noise = 0.01 + contrast = 1 + popups = true + popups_ignorealpha = 0.6 + input_methods = true + input_methods_ignorealpha = 0.8 + } + + shadow { + enabled = @SHADOW_ENABLED@ + ignore_window = true + range = 30 + offset = 0 2 + render_power = 4 + color = @SHADOW_COLOR@ + } + + # Dim + dim_inactive = @DIM_INACTIVE@ + dim_strength = 0.025 + dim_special = 0.07 +} + +animations { + enabled = @ANIMATIONS_ENABLED@ + # Material Design curves + bezier = emphasizedDecel, 0.05, 0.7, 0.1, 1 + bezier = emphasizedAccel, 0.3, 0, 0.8, 0.15 + bezier = standardDecel, 0, 0, 0, 1 + bezier = menu_decel, 0.1, 1, 0, 1 + bezier = menu_accel, 0.52, 0.03, 0.72, 0.08 + + # Window animations + animation = windowsIn, 1, 3, emphasizedDecel, popin 80% + animation = windowsOut, 1, 2, emphasizedDecel, popin 90% + animation = windowsMove, 1, 3, emphasizedDecel, slide + animation = border, 1, 10, emphasizedDecel + + # Layer animations + animation = layersIn, 1, 2.7, emphasizedDecel, popin 93% + animation = layersOut, 1, 2.4, menu_accel, popin 94% + animation = fadeLayersIn, 1, 0.5, menu_decel + animation = fadeLayersOut, 1, 2.7, menu_accel + + # Workspace animations + animation = workspaces, 1, 7, menu_decel, slide + animation = specialWorkspaceIn, 1, 2.8, emphasizedDecel, slidevert + animation = specialWorkspaceOut, 1, 1.2, emphasizedAccel, slidevert +} + +input { + kb_layout = @KEYBOARD_LAYOUT@ + numlock_by_default = true + repeat_delay = 250 + repeat_rate = 35 + + follow_mouse = 1 + off_window_axis_events = 2 + + touchpad { + natural_scroll = @NATURAL_SCROLL@ + disable_while_typing = true + clickfinger_behavior = true + scroll_factor = 0.5 + } +} + +misc { + disable_hyprland_logo = true + disable_splash_rendering = true + vfr = 1 + vrr = @VRR_ENABLED@ + mouse_move_enables_dpms = true + key_press_enables_dpms = true + animate_manual_resizes = false + animate_mouse_windowdragging = false + enable_swallow = @WINDOW_SWALLOW@ + swallow_regex = (foot|kitty|alacritty|Alacritty) + new_window_takes_over_fullscreen = 2 + allow_session_lock_restore = true + session_lock_xray = true + initial_workspace_tracking = false + focus_on_activate = true +} + +binds { + scroll_event_delay = 0 + hide_special_on_workspace_change = true +} + +cursor { + zoom_factor = 1 + zoom_rigid = false +} + +# Overview plugin +plugin { + hyprexpo { + columns = 3 + gap_size = 5 + bg_col = @OVERVIEW_BG_COLOR@ + workspace_method = first 1 + + enable_gesture = @OVERVIEW_GESTURE@ + gesture_distance = 300 + gesture_positive = false + } +} diff --git a/configs/hypr/hypridle.conf.template b/configs/hypr/hypridle.conf.template new file mode 100644 index 0000000..74342d8 --- /dev/null +++ b/configs/hypr/hypridle.conf.template @@ -0,0 +1,37 @@ +# hypridle configuration for dots-hyprland +# Automatic screen locking and power management + +general { + lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. + before_sleep_cmd = loginctl lock-session # lock before suspend. + after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. +} + +listener { + timeout = 150 # 2.5min + on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor. + on-resume = brightnessctl -r # monitor backlight restore. +} + +# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight. +listener { + timeout = 150 # 2.5min + on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight. + on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight. +} + +listener { + timeout = 300 # 5min + on-timeout = loginctl lock-session # lock screen when timeout has passed +} + +listener { + timeout = 330 # 5.5min + on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed + on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired. +} + +listener { + timeout = 1800 # 30min + on-timeout = systemctl suspend # suspend pc +} diff --git a/configs/hypr/hyprland.conf.template b/configs/hypr/hyprland.conf.template new file mode 100644 index 0000000..a13a448 --- /dev/null +++ b/configs/hypr/hyprland.conf.template @@ -0,0 +1,18 @@ +# dots-hyprland NixOS Configuration +# Generated from template - do not edit directly + +# Quickshell configuration +$qsConfig = ii +exec = hyprctl dispatch submap global # DO NOT REMOVE THIS OR YOU WON'T BE ABLE TO USE ANY KEYBIND +submap = global # This is required for catchall to work + +# Source configuration files +source=~/.config/hypr/env.conf +source=~/.config/hypr/execs.conf +source=~/.config/hypr/general.conf +source=~/.config/hypr/rules.conf +source=~/.config/hypr/colors.conf +source=~/.config/hypr/keybinds.conf + +# Custom user overrides (if they exist) +source=~/.config/hypr/custom.conf diff --git a/configs/hypr/keybinds.conf.template b/configs/hypr/keybinds.conf.template new file mode 100644 index 0000000..b581a06 --- /dev/null +++ b/configs/hypr/keybinds.conf.template @@ -0,0 +1,219 @@ +# Lines ending with `# [hidden]` won't be shown on cheatsheet +# Lines starting with #! are section headings + +#! +##! Shell +# These absolutely need to be on top, or they won't work consistently +bindid = $Secondary, Space, Toggle overview, global, quickshell:overviewToggleRelease # Toggle overview/launcher +bind = $Secondary, Space, exec, hyprctl dispatch global quickshell:overviewToggle -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || @FUZZEL_BIN@ # [hidden] Launcher (fallback) +binditn = Super, catchall, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Ctrl, Super_L, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:272, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:273, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:274, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:275, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:276, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:277, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse_up, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse_down,global, quickshell:overviewToggleReleaseInterrupt # [hidden] + +bindit = ,Super_L, global, quickshell:workspaceNumber # [hidden] +bindd = Super, V, Clipboard history >> clipboard, global, quickshell:overviewClipboardToggle # Clipboard history >> clipboard +bindd = Super, Period, Emoji >> clipboard, global, quickshell:overviewEmojiToggle # Emoji >> clipboard +bindd = Super, Tab, Toggle overview, global, quickshell:overviewToggle # [hidden] Toggle overview/launcher (alt) +bindd = Super, A, Toggle left sidebar, global, quickshell:sidebarLeftToggle # Toggle left sidebar +bind = Super+Alt, A, global, quickshell:sidebarLeftToggleDetach # [hidden] +bind = Super, B, global, quickshell:sidebarLeftToggle # [hidden] +bind = Super, O, global, quickshell:sidebarLeftToggle # [hidden] +bindd = Super, N, Toggle right sidebar, global, quickshell:sidebarRightToggle # Toggle right sidebar +bindd = Super, Slash, Toggle cheatsheet, global, quickshell:cheatsheetToggle # Toggle cheatsheet +bindd = Super, K, Toggle on-screen keyboard, global, quickshell:oskToggle # Toggle on-screen keyboard +bindd = Super, M, Toggle media controls, global, quickshell:mediaControlsToggle # Toggle media controls +bindd = Ctrl+Alt, Delete, Toggle session menu, global, quickshell:sessionToggle # Toggle session menu +bindd = Super, J, Toggle bar, global, quickshell:barToggle # Toggle bar +bind = Ctrl+Alt, Delete, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill wlogout || @WLOGOUT_BIN@ -p layer-shell # [hidden] Session menu (fallback) +bind = Shift+Super+Alt, Slash, exec, @QUICKSHELL_BIN@ -p ~/.config/quickshell/$qsConfig/welcome.qml # [hidden] Launch welcome app + +bindle=, XF86MonBrightnessUp, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call brightness increment || @BRIGHTNESSCTL_BIN@ s 5%+ # [hidden] +bindle=, XF86MonBrightnessDown, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call brightness decrement || @BRIGHTNESSCTL_BIN@ s 5%- # [hidden] +bindle=, XF86AudioRaiseVolume, exec, @WPCTL_BIN@ set-volume -l 1 @DEFAULT_AUDIO_SINK@ 2%+ # [hidden] +bindle=, XF86AudioLowerVolume, exec, @WPCTL_BIN@ set-volume @DEFAULT_AUDIO_SINK@ 2%- # [hidden] + +bindl = ,XF86AudioMute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SINK@ toggle # [hidden] +bindld = Super+Shift,M, Toggle mute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SINK@ toggle # [hidden] +bindl = Alt ,XF86AudioMute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SOURCE@ toggle # [hidden] +bindl = ,XF86AudioMicMute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SOURCE@ toggle # [hidden] +bindld = Super+Alt,M, Toggle mic, exec, @WPCTL_BIN@ set-mute @DEFAULT_SOURCE@ toggle # [hidden] +bindd = Ctrl+Super, T, Change wallpaper, exec, ~/.config/quickshell/$qsConfig/scripts/colors/switchwall.sh # Change wallpaper +bind = Ctrl+Super, R, exec, killall ags agsv1 gjs ydotool qs quickshell; @QUICKSHELL_BIN@ -c $qsConfig & # Restart widgets + +##! Utilities +# Screenshot, Record, OCR, Color picker, Clipboard history +bindd = Super, V, Copy clipboard history entry, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || @CLIPHIST_BIN@ list | @FUZZEL_BIN@ --match-mode fzf --dmenu | @CLIPHIST_BIN@ decode | @WL_COPY_BIN@ # [hidden] Clipboard history >> clipboard (fallback) +bindd = Super, Period, Copy an emoji, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || ~/.config/hypr/scripts/fuzzel-emoji.sh copy # [hidden] Emoji >> clipboard (fallback) +bindd = Super+Shift, S, Screen snip, exec, @QUICKSHELL_BIN@ -p ~/.config/quickshell/$qsConfig/screenshot.qml || pidof slurp || @HYPRSHOT_BIN@ --freeze --clipboard-only --mode region --silent # Screen snip +# OCR +bindd = Super+Shift, T, Character recognition,exec,@GRIM_BIN@ -g "$(@SLURP_BIN@ $SLURP_ARGS)" "tmp.png" && @TESSERACT_BIN@ "tmp.png" - | @WL_COPY_BIN@ && rm "tmp.png" # [hidden] +# Color picker +bindd = Super+Shift, C, Color picker, exec, @HYPRPICKER_BIN@ -a # Pick color (Hex) >> clipboard +# Fullscreen screenshot +bindld = ,Print, Screenshot >> clipboard ,exec,@GRIM_BIN@ - | @WL_COPY_BIN@ # Screenshot >> clipboard +bindld = Ctrl,Print, Screenshot >> clipboard & save, exec, mkdir -p $(xdg-user-dir PICTURES)/Screenshots && @GRIM_BIN@ $(xdg-user-dir PICTURES)/Screenshots/Screenshot_"$(date '+%Y-%m-%d_%H.%M.%S')".png # Screenshot >> clipboard & file +# Recording stuff +bindd = Super+Alt, R, Record region (no sound), exec, ~/.config/hypr/scripts/record.sh # Record region (no sound) +bindd = Ctrl+Alt, R, Record screen (no sound), exec, ~/.config/hypr/scripts/record.sh --fullscreen # [hidden] Record screen (no sound) +bindd = Super+Shift+Alt, R, Record screen (with sound), exec, ~/.config/hypr/scripts/record.sh --fullscreen-sound # Record screen (with sound) +# AI +bindd = Super+Shift+Alt, mouse:273, Generate AI summary for selected text, exec, ~/.config/hypr/scripts/ai/primary-buffer-query.sh # AI summary for selected text + +#! +##! Window +# Focusing +bindm = Super, mouse:272, movewindow # Move +bindm = Super, mouse:274, movewindow # [hidden] +bindm = Super, mouse:273, resizewindow # Resize +#/# bind = Super, โ†/โ†‘/โ†’/โ†“,, # Focus in direction +bind = Super, Left, movefocus, l # [hidden] +bind = Super, Right, movefocus, r # [hidden] +bind = Super, Up, movefocus, u # [hidden] +bind = Super, Down, movefocus, d # [hidden] +bind = Super, BracketLeft, movefocus, l # [hidden] +bind = Super, BracketRight, movefocus, r # [hidden] +#/# bind = Super+Shift, โ†/โ†‘/โ†’/โ†“,, # Move in direction +bind = Super+Shift, Left, movewindow, l # [hidden] +bind = Super+Shift, Right, movewindow, r # [hidden] +bind = Super+Shift, Up, movewindow, u # [hidden] +bind = Super+Shift, Down, movewindow, d # [hidden] +bind = Alt, F4, killactive, # [hidden] Close (Windows) +bind = Super, Q, killactive, # Close +bind = Super+Shift+Alt, Q, exec, hyprctl kill # Forcefully zap a window + +# Window split ratio +#/# binde = Super, ;/',, # Adjust split ratio +binde = Super, Semicolon, splitratio, -0.1 # [hidden] +binde = Super, Apostrophe, splitratio, +0.1 # [hidden] +# Positioning mode +bind = Super+Alt, Space, togglefloating, # Float/Tile +bind = Super, D, fullscreen, 1 # Maximize +bind = Super, F, fullscreen, 0 # Fullscreen +bind = Super+Alt, F, fullscreenstate, 0 3 # Fullscreen spoof +bind = Super, P, pin # Pin + +#/# bind = Super+Alt, Hash,, # Send to workspace # (1, 2, 3,...) +bind = Super+Alt, 1, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 1 # [hidden] +bind = Super+Alt, 2, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 2 # [hidden] +bind = Super+Alt, 3, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 3 # [hidden] +bind = Super+Alt, 4, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 4 # [hidden] +bind = Super+Alt, 5, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 5 # [hidden] +bind = Super+Alt, 6, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 6 # [hidden] +bind = Super+Alt, 7, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 7 # [hidden] +bind = Super+Alt, 8, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 8 # [hidden] +bind = Super+Alt, 9, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 9 # [hidden] +bind = Super+Alt, 0, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 10 # [hidden] + +# #/# bind = Super+Shift, Scroll โ†‘/โ†“,, # Send to workspace left/right +bind = Super+Shift, mouse_down, movetoworkspace, r-1 # [hidden] +bind = Super+Shift, mouse_up, movetoworkspace, r+1 # [hidden] +bind = Super+Alt, mouse_down, movetoworkspace, -1 # [hidden] +bind = Super+Alt, mouse_up, movetoworkspace, +1 # [hidden] + +#/# bind = Super+Shift, Page_โ†‘/โ†“,, # Send to workspace left/right +bind = Super+Alt, Page_Down, movetoworkspace, +1 # [hidden] +bind = Super+Alt, Page_Up, movetoworkspace, -1 # [hidden] +bind = Super+Shift, Page_Down, movetoworkspace, r+1 # [hidden] +bind = Super+Shift, Page_Up, movetoworkspace, r-1 # [hidden] +bind = Ctrl+Super+Shift, Right, movetoworkspace, r+1 # [hidden] +bind = Ctrl+Super+Shift, Left, movetoworkspace, r-1 # [hidden] + +bind = Super+Alt, S, movetoworkspacesilent, special # Send to scratchpad + +bind = Ctrl+Super, S, togglespecialworkspace, # [hidden] +bind = Alt, Tab, cyclenext # [hidden] sus keybind +bind = Alt, Tab, bringactivetotop, # [hidden] bring it to the top + +##! Workspace +# Switching +#/# bind = Super, Hash,, # Focus workspace # (1, 2, 3,...) +bind = Super, 1, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 1 # [hidden] +bind = Super, 2, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 2 # [hidden] +bind = Super, 3, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 3 # [hidden] +bind = Super, 4, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 4 # [hidden] +bind = Super, 5, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 5 # [hidden] +bind = Super, 6, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 6 # [hidden] +bind = Super, 7, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 7 # [hidden] +bind = Super, 8, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 8 # [hidden] +bind = Super, 9, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 9 # [hidden] +bind = Super, 0, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 10 # [hidden] + +#/# bind = Ctrl+Super, โ†/โ†’,, # Focus left/right +bind = Ctrl+Super, Right, workspace, r+1 # [hidden] +bind = Ctrl+Super, Left, workspace, r-1 # [hidden] +#/# bind = Ctrl+Super+Alt, โ†/โ†’,, # [hidden] Focus busy left/right +bind = Ctrl+Super+Alt, Right, workspace, m+1 # [hidden] +bind = Ctrl+Super+Alt, Left, workspace, m-1 # [hidden] +#/# bind = Super, Page_โ†‘/โ†“,, # Focus left/right +bind = Super, Page_Down, workspace, +1 # [hidden] +bind = Super, Page_Up, workspace, -1 # [hidden] +bind = Ctrl+Super, Page_Down, workspace, r+1 # [hidden] +bind = Ctrl+Super, Page_Up, workspace, r-1 # [hidden] +#/# bind = Super, Scroll โ†‘/โ†“,, # Focus left/right +bind = Super, mouse_up, workspace, +1 # [hidden] +bind = Super, mouse_down, workspace, -1 # [hidden] +bind = Ctrl+Super, mouse_up, workspace, r+1 # [hidden] +bind = Ctrl+Super, mouse_down, workspace, r-1 # [hidden] +## Special +bind = Super, S, togglespecialworkspace, # Toggle scratchpad +bind = Super, mouse:275, togglespecialworkspace, # [hidden] +bind = Ctrl+Super, BracketLeft, workspace, -1 # [hidden] +bind = Ctrl+Super, BracketRight, workspace, +1 # [hidden] +bind = Ctrl+Super, Up, workspace, r-5 # [hidden] +bind = Ctrl+Super, Down, workspace, r+5 # [hidden] + +#! +# Testing +bind = Super+Alt, f11, exec, bash -c 'RANDOM_IMAGE=$(find ~/Pictures -type f | grep -v -i "nipple" | grep -v -i "pussy" | shuf -n 1); ACTION=$(notify-send "Test notification with body image" "This notification should contain your user account image and Discord icon. Oh and here is a random image in your Pictures folder: \"Testing" -a "Hyprland keybind" -p -h "string:image-path:/var/lib/AccountsService/icons/$USER" -t 6000 -i "discord" -A "openImage=Open profile image" -A "action2=Open the random image" -A "action3=Useless button"); [[ $ACTION == *openImage ]] && xdg-open "/var/lib/AccountsService/icons/$USER"; [[ $ACTION == *action2 ]] && xdg-open \"$RANDOM_IMAGE\"' # [hidden] +bind = Super+Alt, f12, exec, bash -c 'RANDOM_IMAGE=$(find ~/Pictures -type f | grep -v -i "nipple" | grep -v -i "pussy" | shuf -n 1); ACTION=$(notify-send "Test notification" "This notification should contain a random image in your Pictures folder and Discord icon.\nFlick right to dismiss!" -a "Discord (fake)" -p -h "string:image-path:$RANDOM_IMAGE" -t 6000 -i "discord" -A "openImage=Open profile image" -A "action2=Useless button" -A "action3=Cry more"); [[ $ACTION == *openImage ]] && xdg-open "/var/lib/AccountsService/icons/$USER"' # [hidden] +bind = Super+Alt, Equal, exec, notify-send "Urgent notification" "Ah hell no" -u critical -a 'Hyprland keybind' # [hidden] + +##! Session +bindd = Super, L, Lock, exec, loginctl lock-session # Lock +bind = Super+Shift, L, exec, loginctl lock-session # [hidden] +bindld = Super+Shift, L, Suspend system, exec, sleep 0.1 && systemctl suspend || loginctl suspend # Sleep +bindd = Ctrl+Shift+Alt+Super, Delete, Shutdown, exec, systemctl poweroff || loginctl poweroff # [hidden] Power off + +##! Screen +# Zoom +binde = Super, Minus, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call zoom zoomOut # Zoom out +binde = Super, Equal, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call zoom zoomIn # Zoom in +binde = Super, Minus, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || ~/.config/hypr/scripts/zoom.sh decrease 0.1 # [hidden] Zoom out +binde = Super, Equal, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || ~/.config/hypr/scripts/zoom.sh increase 0.1 # [hidden] Zoom in + +##! Media +bindl= Super+Shift, N, exec, @PLAYERCTL_BIN@ next || @PLAYERCTL_BIN@ position `bc <<< "100 * $(@PLAYERCTL_BIN@ metadata mpris:length) / 1000000 / 100"` # Next track +bindl= ,XF86AudioNext, exec, @PLAYERCTL_BIN@ next || @PLAYERCTL_BIN@ position `bc <<< "100 * $(@PLAYERCTL_BIN@ metadata mpris:length) / 1000000 / 100"` # [hidden] +bindl= ,XF86AudioPrev, exec, @PLAYERCTL_BIN@ previous # [hidden] +bind = Super+Shift+Alt, mouse:275, exec, @PLAYERCTL_BIN@ previous # [hidden] +bind = Super+Shift+Alt, mouse:276, exec, @PLAYERCTL_BIN@ next || @PLAYERCTL_BIN@ position `bc <<< "100 * $(@PLAYERCTL_BIN@ metadata mpris:length) / 1000000 / 100"` # [hidden] +bindl= Super+Shift, B, exec, @PLAYERCTL_BIN@ previous # Previous track +bindl= Super+Shift, P, exec, @PLAYERCTL_BIN@ play-pause # Play/pause media +bindl= ,XF86AudioPlay, exec, @PLAYERCTL_BIN@ play-pause # [hidden] +bindl= ,XF86AudioPause, exec, @PLAYERCTL_BIN@ play-pause # [hidden] + +##! Apps +bind = Super, Return, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TERMINAL_APPS@" # Terminal +bind = Super, T, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TERMINAL_APPS@" # [hidden] Terminal (alt) +bind = Ctrl+Alt, T, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TERMINAL_APPS@" # [hidden] Terminal (Ubuntu style) +bind = Super, E, exec, ~/.config/hypr/scripts/launch_first_available.sh "@FILE_MANAGER_APPS@" # File manager +bind = Super, W, exec, ~/.config/hypr/scripts/launch_first_available.sh "@BROWSER_APPS@" # Browser +bind = Super, C, exec, ~/.config/hypr/scripts/launch_first_available.sh "@CODE_EDITOR_APPS@" # Code editor +bind = Super+Shift, W, exec, ~/.config/hypr/scripts/launch_first_available.sh "@OFFICE_APPS@" # Office software +bind = Super, X, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TEXT_EDITOR_APPS@" # Text editor +bind = Ctrl+Super, V, exec, ~/.config/hypr/scripts/launch_first_available.sh "@VOLUME_MIXER_APPS@" # Volume mixer +bind = Super, I, exec, XDG_CURRENT_DESKTOP=gnome ~/.config/hypr/scripts/launch_first_available.sh "@SETTINGS_APPS@" # Settings app +bind = Ctrl+Shift, Escape, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TASK_MANAGER_APPS@" # Task manager + +# Cursed stuff +## Make window not amogus large +bind = Ctrl+Super, Backslash, resizeactive, exact 640 480 # [hidden] + +@CUSTOM_KEYBINDS@ diff --git a/configs/hypr/keybinds.conf.template.backup b/configs/hypr/keybinds.conf.template.backup new file mode 100644 index 0000000..d00d920 --- /dev/null +++ b/configs/hypr/keybinds.conf.template.backup @@ -0,0 +1,219 @@ +# Lines ending with `# [hidden]` won't be shown on cheatsheet +# Lines starting with #! are section headings + +#! +##! Shell +# These absolutely need to be on top, or they won't work consistently +bindid = Super, Super_L, Toggle overview, global, quickshell:overviewToggleRelease # Toggle overview/launcher +bind = Super, Super_L, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || @FUZZEL_BIN@ # [hidden] Launcher (fallback) +binditn = Super, catchall, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Ctrl, Super_L, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:272, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:273, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:274, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:275, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:276, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse:277, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse_up, global, quickshell:overviewToggleReleaseInterrupt # [hidden] +bind = Super, mouse_down,global, quickshell:overviewToggleReleaseInterrupt # [hidden] + +bindit = ,Super_L, global, quickshell:workspaceNumber # [hidden] +bindd = Super, V, Clipboard history >> clipboard, global, quickshell:overviewClipboardToggle # Clipboard history >> clipboard +bindd = Super, Period, Emoji >> clipboard, global, quickshell:overviewEmojiToggle # Emoji >> clipboard +bindd = Super, Tab, Toggle overview, global, quickshell:overviewToggle # [hidden] Toggle overview/launcher (alt) +bindd = Super, A, Toggle left sidebar, global, quickshell:sidebarLeftToggle # Toggle left sidebar +bind = Super+Alt, A, global, quickshell:sidebarLeftToggleDetach # [hidden] +bind = Super, B, global, quickshell:sidebarLeftToggle # [hidden] +bind = Super, O, global, quickshell:sidebarLeftToggle # [hidden] +bindd = Super, N, Toggle right sidebar, global, quickshell:sidebarRightToggle # Toggle right sidebar +bindd = Super, Slash, Toggle cheatsheet, global, quickshell:cheatsheetToggle # Toggle cheatsheet +bindd = Super, K, Toggle on-screen keyboard, global, quickshell:oskToggle # Toggle on-screen keyboard +bindd = Super, M, Toggle media controls, global, quickshell:mediaControlsToggle # Toggle media controls +bindd = Ctrl+Alt, Delete, Toggle session menu, global, quickshell:sessionToggle # Toggle session menu +bindd = Super, J, Toggle bar, global, quickshell:barToggle # Toggle bar +bind = Ctrl+Alt, Delete, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill wlogout || @WLOGOUT_BIN@ -p layer-shell # [hidden] Session menu (fallback) +bind = Shift+Super+Alt, Slash, exec, @QUICKSHELL_BIN@ -p ~/.config/quickshell/$qsConfig/welcome.qml # [hidden] Launch welcome app + +bindle=, XF86MonBrightnessUp, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call brightness increment || @BRIGHTNESSCTL_BIN@ s 5%+ # [hidden] +bindle=, XF86MonBrightnessDown, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call brightness decrement || @BRIGHTNESSCTL_BIN@ s 5%- # [hidden] +bindle=, XF86AudioRaiseVolume, exec, @WPCTL_BIN@ set-volume -l 1 @DEFAULT_AUDIO_SINK@ 2%+ # [hidden] +bindle=, XF86AudioLowerVolume, exec, @WPCTL_BIN@ set-volume @DEFAULT_AUDIO_SINK@ 2%- # [hidden] + +bindl = ,XF86AudioMute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SINK@ toggle # [hidden] +bindld = Super+Shift,M, Toggle mute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SINK@ toggle # [hidden] +bindl = Alt ,XF86AudioMute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SOURCE@ toggle # [hidden] +bindl = ,XF86AudioMicMute, exec, @WPCTL_BIN@ set-mute @DEFAULT_SOURCE@ toggle # [hidden] +bindld = Super+Alt,M, Toggle mic, exec, @WPCTL_BIN@ set-mute @DEFAULT_SOURCE@ toggle # [hidden] +bindd = Ctrl+Super, T, Change wallpaper, exec, ~/.config/quickshell/$qsConfig/scripts/colors/switchwall.sh # Change wallpaper +bind = Ctrl+Super, R, exec, killall ags agsv1 gjs ydotool qs quickshell; @QUICKSHELL_BIN@ -c $qsConfig & # Restart widgets + +##! Utilities +# Screenshot, Record, OCR, Color picker, Clipboard history +bindd = Super, V, Copy clipboard history entry, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || @CLIPHIST_BIN@ list | @FUZZEL_BIN@ --match-mode fzf --dmenu | @CLIPHIST_BIN@ decode | @WL_COPY_BIN@ # [hidden] Clipboard history >> clipboard (fallback) +bindd = Super, Period, Copy an emoji, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || ~/.config/hypr/scripts/fuzzel-emoji.sh copy # [hidden] Emoji >> clipboard (fallback) +bindd = Super+Shift, S, Screen snip, exec, @QUICKSHELL_BIN@ -p ~/.config/quickshell/$qsConfig/screenshot.qml || pidof slurp || @HYPRSHOT_BIN@ --freeze --clipboard-only --mode region --silent # Screen snip +# OCR +bindd = Super+Shift, T, Character recognition,exec,@GRIM_BIN@ -g "$(@SLURP_BIN@ $SLURP_ARGS)" "tmp.png" && @TESSERACT_BIN@ "tmp.png" - | @WL_COPY_BIN@ && rm "tmp.png" # [hidden] +# Color picker +bindd = Super+Shift, C, Color picker, exec, @HYPRPICKER_BIN@ -a # Pick color (Hex) >> clipboard +# Fullscreen screenshot +bindld = ,Print, Screenshot >> clipboard ,exec,@GRIM_BIN@ - | @WL_COPY_BIN@ # Screenshot >> clipboard +bindld = Ctrl,Print, Screenshot >> clipboard & save, exec, mkdir -p $(xdg-user-dir PICTURES)/Screenshots && @GRIM_BIN@ $(xdg-user-dir PICTURES)/Screenshots/Screenshot_"$(date '+%Y-%m-%d_%H.%M.%S')".png # Screenshot >> clipboard & file +# Recording stuff +bindd = Super+Alt, R, Record region (no sound), exec, ~/.config/hypr/scripts/record.sh # Record region (no sound) +bindd = Ctrl+Alt, R, Record screen (no sound), exec, ~/.config/hypr/scripts/record.sh --fullscreen # [hidden] Record screen (no sound) +bindd = Super+Shift+Alt, R, Record screen (with sound), exec, ~/.config/hypr/scripts/record.sh --fullscreen-sound # Record screen (with sound) +# AI +bindd = Super+Shift+Alt, mouse:273, Generate AI summary for selected text, exec, ~/.config/hypr/scripts/ai/primary-buffer-query.sh # AI summary for selected text + +#! +##! Window +# Focusing +bindm = Super, mouse:272, movewindow # Move +bindm = Super, mouse:274, movewindow # [hidden] +bindm = Super, mouse:273, resizewindow # Resize +#/# bind = Super, โ†/โ†‘/โ†’/โ†“,, # Focus in direction +bind = Super, Left, movefocus, l # [hidden] +bind = Super, Right, movefocus, r # [hidden] +bind = Super, Up, movefocus, u # [hidden] +bind = Super, Down, movefocus, d # [hidden] +bind = Super, BracketLeft, movefocus, l # [hidden] +bind = Super, BracketRight, movefocus, r # [hidden] +#/# bind = Super+Shift, โ†/โ†‘/โ†’/โ†“,, # Move in direction +bind = Super+Shift, Left, movewindow, l # [hidden] +bind = Super+Shift, Right, movewindow, r # [hidden] +bind = Super+Shift, Up, movewindow, u # [hidden] +bind = Super+Shift, Down, movewindow, d # [hidden] +bind = Alt, F4, killactive, # [hidden] Close (Windows) +bind = Super, Q, killactive, # Close +bind = Super+Shift+Alt, Q, exec, hyprctl kill # Forcefully zap a window + +# Window split ratio +#/# binde = Super, ;/',, # Adjust split ratio +binde = Super, Semicolon, splitratio, -0.1 # [hidden] +binde = Super, Apostrophe, splitratio, +0.1 # [hidden] +# Positioning mode +bind = Super+Alt, Space, togglefloating, # Float/Tile +bind = Super, D, fullscreen, 1 # Maximize +bind = Super, F, fullscreen, 0 # Fullscreen +bind = Super+Alt, F, fullscreenstate, 0 3 # Fullscreen spoof +bind = Super, P, pin # Pin + +#/# bind = Super+Alt, Hash,, # Send to workspace # (1, 2, 3,...) +bind = Super+Alt, 1, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 1 # [hidden] +bind = Super+Alt, 2, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 2 # [hidden] +bind = Super+Alt, 3, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 3 # [hidden] +bind = Super+Alt, 4, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 4 # [hidden] +bind = Super+Alt, 5, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 5 # [hidden] +bind = Super+Alt, 6, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 6 # [hidden] +bind = Super+Alt, 7, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 7 # [hidden] +bind = Super+Alt, 8, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 8 # [hidden] +bind = Super+Alt, 9, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 9 # [hidden] +bind = Super+Alt, 0, exec, ~/.config/hypr/scripts/workspace_action.sh movetoworkspacesilent 10 # [hidden] + +# #/# bind = Super+Shift, Scroll โ†‘/โ†“,, # Send to workspace left/right +bind = Super+Shift, mouse_down, movetoworkspace, r-1 # [hidden] +bind = Super+Shift, mouse_up, movetoworkspace, r+1 # [hidden] +bind = Super+Alt, mouse_down, movetoworkspace, -1 # [hidden] +bind = Super+Alt, mouse_up, movetoworkspace, +1 # [hidden] + +#/# bind = Super+Shift, Page_โ†‘/โ†“,, # Send to workspace left/right +bind = Super+Alt, Page_Down, movetoworkspace, +1 # [hidden] +bind = Super+Alt, Page_Up, movetoworkspace, -1 # [hidden] +bind = Super+Shift, Page_Down, movetoworkspace, r+1 # [hidden] +bind = Super+Shift, Page_Up, movetoworkspace, r-1 # [hidden] +bind = Ctrl+Super+Shift, Right, movetoworkspace, r+1 # [hidden] +bind = Ctrl+Super+Shift, Left, movetoworkspace, r-1 # [hidden] + +bind = Super+Alt, S, movetoworkspacesilent, special # Send to scratchpad + +bind = Ctrl+Super, S, togglespecialworkspace, # [hidden] +bind = Alt, Tab, cyclenext # [hidden] sus keybind +bind = Alt, Tab, bringactivetotop, # [hidden] bring it to the top + +##! Workspace +# Switching +#/# bind = Super, Hash,, # Focus workspace # (1, 2, 3,...) +bind = Super, 1, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 1 # [hidden] +bind = Super, 2, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 2 # [hidden] +bind = Super, 3, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 3 # [hidden] +bind = Super, 4, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 4 # [hidden] +bind = Super, 5, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 5 # [hidden] +bind = Super, 6, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 6 # [hidden] +bind = Super, 7, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 7 # [hidden] +bind = Super, 8, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 8 # [hidden] +bind = Super, 9, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 9 # [hidden] +bind = Super, 0, exec, ~/.config/hypr/scripts/workspace_action.sh workspace 10 # [hidden] + +#/# bind = Ctrl+Super, โ†/โ†’,, # Focus left/right +bind = Ctrl+Super, Right, workspace, r+1 # [hidden] +bind = Ctrl+Super, Left, workspace, r-1 # [hidden] +#/# bind = Ctrl+Super+Alt, โ†/โ†’,, # [hidden] Focus busy left/right +bind = Ctrl+Super+Alt, Right, workspace, m+1 # [hidden] +bind = Ctrl+Super+Alt, Left, workspace, m-1 # [hidden] +#/# bind = Super, Page_โ†‘/โ†“,, # Focus left/right +bind = Super, Page_Down, workspace, +1 # [hidden] +bind = Super, Page_Up, workspace, -1 # [hidden] +bind = Ctrl+Super, Page_Down, workspace, r+1 # [hidden] +bind = Ctrl+Super, Page_Up, workspace, r-1 # [hidden] +#/# bind = Super, Scroll โ†‘/โ†“,, # Focus left/right +bind = Super, mouse_up, workspace, +1 # [hidden] +bind = Super, mouse_down, workspace, -1 # [hidden] +bind = Ctrl+Super, mouse_up, workspace, r+1 # [hidden] +bind = Ctrl+Super, mouse_down, workspace, r-1 # [hidden] +## Special +bind = Super, S, togglespecialworkspace, # Toggle scratchpad +bind = Super, mouse:275, togglespecialworkspace, # [hidden] +bind = Ctrl+Super, BracketLeft, workspace, -1 # [hidden] +bind = Ctrl+Super, BracketRight, workspace, +1 # [hidden] +bind = Ctrl+Super, Up, workspace, r-5 # [hidden] +bind = Ctrl+Super, Down, workspace, r+5 # [hidden] + +#! +# Testing +bind = Super+Alt, f11, exec, bash -c 'RANDOM_IMAGE=$(find ~/Pictures -type f | grep -v -i "nipple" | grep -v -i "pussy" | shuf -n 1); ACTION=$(notify-send "Test notification with body image" "This notification should contain your user account image and Discord icon. Oh and here is a random image in your Pictures folder: \"Testing" -a "Hyprland keybind" -p -h "string:image-path:/var/lib/AccountsService/icons/$USER" -t 6000 -i "discord" -A "openImage=Open profile image" -A "action2=Open the random image" -A "action3=Useless button"); [[ $ACTION == *openImage ]] && xdg-open "/var/lib/AccountsService/icons/$USER"; [[ $ACTION == *action2 ]] && xdg-open \"$RANDOM_IMAGE\"' # [hidden] +bind = Super+Alt, f12, exec, bash -c 'RANDOM_IMAGE=$(find ~/Pictures -type f | grep -v -i "nipple" | grep -v -i "pussy" | shuf -n 1); ACTION=$(notify-send "Test notification" "This notification should contain a random image in your Pictures folder and Discord icon.\nFlick right to dismiss!" -a "Discord (fake)" -p -h "string:image-path:$RANDOM_IMAGE" -t 6000 -i "discord" -A "openImage=Open profile image" -A "action2=Useless button" -A "action3=Cry more"); [[ $ACTION == *openImage ]] && xdg-open "/var/lib/AccountsService/icons/$USER"' # [hidden] +bind = Super+Alt, Equal, exec, notify-send "Urgent notification" "Ah hell no" -u critical -a 'Hyprland keybind' # [hidden] + +##! Session +bindd = Super, L, Lock, exec, loginctl lock-session # Lock +bind = Super+Shift, L, exec, loginctl lock-session # [hidden] +bindld = Super+Shift, L, Suspend system, exec, sleep 0.1 && systemctl suspend || loginctl suspend # Sleep +bindd = Ctrl+Shift+Alt+Super, Delete, Shutdown, exec, systemctl poweroff || loginctl poweroff # [hidden] Power off + +##! Screen +# Zoom +binde = Super, Minus, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call zoom zoomOut # Zoom out +binde = Super, Equal, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call zoom zoomIn # Zoom in +binde = Super, Minus, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || ~/.config/hypr/scripts/zoom.sh decrease 0.1 # [hidden] Zoom out +binde = Super, Equal, exec, @QUICKSHELL_BIN@ -c $qsConfig ipc call TEST_ALIVE || ~/.config/hypr/scripts/zoom.sh increase 0.1 # [hidden] Zoom in + +##! Media +bindl= Super+Shift, N, exec, @PLAYERCTL_BIN@ next || @PLAYERCTL_BIN@ position `bc <<< "100 * $(@PLAYERCTL_BIN@ metadata mpris:length) / 1000000 / 100"` # Next track +bindl= ,XF86AudioNext, exec, @PLAYERCTL_BIN@ next || @PLAYERCTL_BIN@ position `bc <<< "100 * $(@PLAYERCTL_BIN@ metadata mpris:length) / 1000000 / 100"` # [hidden] +bindl= ,XF86AudioPrev, exec, @PLAYERCTL_BIN@ previous # [hidden] +bind = Super+Shift+Alt, mouse:275, exec, @PLAYERCTL_BIN@ previous # [hidden] +bind = Super+Shift+Alt, mouse:276, exec, @PLAYERCTL_BIN@ next || @PLAYERCTL_BIN@ position `bc <<< "100 * $(@PLAYERCTL_BIN@ metadata mpris:length) / 1000000 / 100"` # [hidden] +bindl= Super+Shift, B, exec, @PLAYERCTL_BIN@ previous # Previous track +bindl= Super+Shift, P, exec, @PLAYERCTL_BIN@ play-pause # Play/pause media +bindl= ,XF86AudioPlay, exec, @PLAYERCTL_BIN@ play-pause # [hidden] +bindl= ,XF86AudioPause, exec, @PLAYERCTL_BIN@ play-pause # [hidden] + +##! Apps +bind = Super, Return, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TERMINAL_APPS@" # Terminal +bind = Super, T, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TERMINAL_APPS@" # [hidden] Terminal (alt) +bind = Ctrl+Alt, T, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TERMINAL_APPS@" # [hidden] Terminal (Ubuntu style) +bind = Super, E, exec, ~/.config/hypr/scripts/launch_first_available.sh "@FILE_MANAGER_APPS@" # File manager +bind = Super, W, exec, ~/.config/hypr/scripts/launch_first_available.sh "@BROWSER_APPS@" # Browser +bind = Super, C, exec, ~/.config/hypr/scripts/launch_first_available.sh "@CODE_EDITOR_APPS@" # Code editor +bind = Super+Shift, W, exec, ~/.config/hypr/scripts/launch_first_available.sh "@OFFICE_APPS@" # Office software +bind = Super, X, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TEXT_EDITOR_APPS@" # Text editor +bind = Ctrl+Super, V, exec, ~/.config/hypr/scripts/launch_first_available.sh "@VOLUME_MIXER_APPS@" # Volume mixer +bind = Super, I, exec, XDG_CURRENT_DESKTOP=gnome ~/.config/hypr/scripts/launch_first_available.sh "@SETTINGS_APPS@" # Settings app +bind = Ctrl+Shift, Escape, exec, ~/.config/hypr/scripts/launch_first_available.sh "@TASK_MANAGER_APPS@" # Task manager + +# Cursed stuff +## Make window not amogus large +bind = Ctrl+Super, Backslash, resizeactive, exact 640 480 # [hidden] + +@CUSTOM_KEYBINDS@ diff --git a/configs/hypr/rules.conf.template b/configs/hypr/rules.conf.template new file mode 100644 index 0000000..1dc1522 --- /dev/null +++ b/configs/hypr/rules.conf.template @@ -0,0 +1,161 @@ +# ######## Window rules ######## + +# Global transparency (uncomment to apply to all windows) +@GLOBAL_TRANSPARENCY@ + +# Disable blur for xwayland context menus +windowrulev2 = noblur,class:^()$,title:^()$ + +# Floating windows +windowrulev2 = float, class:^(blueberry\.py)$ +windowrulev2 = float, class:^(guifetch)$ # FlafyDev/guifetch +windowrulev2 = float, class:^(pavucontrol)$ +windowrulev2 = size 45%, class:^(pavucontrol)$ +windowrulev2 = center, class:^(pavucontrol)$ +windowrulev2 = float, class:^(org.pulseaudio.pavucontrol)$ +windowrulev2 = size 45%, class:^(org.pulseaudio.pavucontrol)$ +windowrulev2 = center, class:^(org.pulseaudio.pavucontrol)$ +windowrulev2 = float, class:^(nm-connection-editor)$ +windowrulev2 = size 45%, class:^(nm-connection-editor)$ +windowrulev2 = center, class:^(nm-connection-editor)$ +windowrulev2 = float, class:.*plasmawindowed.* +windowrulev2 = float, class:kcm_.* +windowrulev2 = float, class:.*bluedevilwizard +windowrulev2 = float, title:.*Welcome +windowrulev2 = float, title:^(illogical-impulse Settings)$ +windowrulev2 = float, class:org.freedesktop.impl.portal.desktop.kde +windowrulev2 = float, class:^(Zotero)$ +windowrulev2 = size 45%, class:^(Zotero)$ + +# Special positioning +# kde-material-you-colors spawns a window when changing dark/light theme +windowrulev2 = float, class:^(plasma-changeicons)$ +windowrulev2 = noinitialfocus, class:^(plasma-changeicons)$ +windowrulev2 = move 999999 999999, class:^(plasma-changeicons)$ +# Dolphin copy dialog +windowrulev2 = move 40 80, title:^(Copying โ€” Dolphin)$ + +# Force tiling for specific apps +windowrulev2 = tile, class:^dev\.warp\.Warp$ + +# Picture-in-Picture +windowrulev2 = float, title:^([Pp]icture[-\s]?[Ii]n[-\s]?[Pp]icture)(.*)$ +windowrulev2 = keepaspectratio, title:^([Pp]icture[-\s]?[Ii]n[-\s]?[Pp]icture)(.*)$ +windowrulev2 = move 73% 72%, title:^([Pp]icture[-\s]?[Ii]n[-\s]?[Pp]icture)(.*)$ +windowrulev2 = size 25%, title:^([Pp]icture[-\s]?[Ii]n[-\s]?[Pp]icture)(.*)$ +windowrulev2 = pin, title:^([Pp]icture[-\s]?[Ii]n[-\s]?[Pp]icture)(.*)$ + +# Dialog windows โ€“ float+center these windows +windowrulev2 = center, title:^(Open File)(.*)$ +windowrulev2 = center, title:^(Select a File)(.*)$ +windowrulev2 = center, title:^(Choose wallpaper)(.*)$ +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)(.*)$ +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 for gaming --- +windowrulev2 = immediate, title:.*\.exe +windowrulev2 = immediate, title:.*minecraft.* +windowrulev2 = immediate, class:^(steam_app).* + +# No shadow for tiled windows +windowrulev2 = noshadow, floating:0 + +# ######## Workspace rules ######## +workspace = special:special, gapsout:30 + +# ######## Layer rules ######## +layerrule = xray 1, .* + +# No animations for specific layers +layerrule = noanim, walker +layerrule = noanim, selection +layerrule = noanim, overview +layerrule = noanim, anyrun +layerrule = noanim, indicator.* +layerrule = noanim, osk +layerrule = noanim, hyprpicker +layerrule = noanim, noanim + +# GTK layer shell +layerrule = blur, gtk-layer-shell +layerrule = ignorezero, gtk-layer-shell + +# Launcher +layerrule = blur, launcher +layerrule = ignorealpha 0.5, launcher + +# Notifications +layerrule = blur, notifications +layerrule = ignorealpha 0.69, notifications + +# Logout dialog +layerrule = blur, logout_dialog # wlogout + +# AGS layers +layerrule = animation slide left, sideleft.* +layerrule = animation slide right, sideright.* +layerrule = blur, session[0-9]* +layerrule = blur, bar[0-9]* +layerrule = ignorealpha 0.6, bar[0-9]* +layerrule = blur, barcorner.* +layerrule = ignorealpha 0.6, barcorner.* +layerrule = blur, dock[0-9]* +layerrule = ignorealpha 0.6, dock[0-9]* +layerrule = blur, indicator.* +layerrule = ignorealpha 0.6, indicator.* +layerrule = blur, overview[0-9]* +layerrule = ignorealpha 0.6, overview[0-9]* +layerrule = blur, cheatsheet[0-9]* +layerrule = ignorealpha 0.6, cheatsheet[0-9]* +layerrule = blur, sideright[0-9]* +layerrule = ignorealpha 0.6, sideright[0-9]* +layerrule = blur, sideleft[0-9]* +layerrule = ignorealpha 0.6, sideleft[0-9]* +layerrule = blur, osk[0-9]* +layerrule = ignorealpha 0.6, osk[0-9]* + +# Quickshell layers +layerrule = blurpopups, quickshell:.* +layerrule = blur, quickshell:.* +layerrule = ignorealpha 0.79, quickshell:.* +layerrule = animation slide top, quickshell:bar +layerrule = animation fade, quickshell:screenCorners +layerrule = animation slide right, quickshell:sidebarRight +layerrule = animation slide left, quickshell:sidebarLeft +layerrule = animation slide bottom, quickshell:osk +layerrule = animation slide bottom, quickshell:dock +layerrule = blur, quickshell:session +layerrule = noanim, quickshell:session +layerrule = ignorealpha 0, quickshell:session +layerrule = animation fade, quickshell:notificationPopup +layerrule = blur, quickshell:backgroundWidgets +layerrule = ignorealpha 0.05, quickshell:backgroundWidgets +layerrule = noanim, quickshell:screenshot +layerrule = animation popin 120%, quickshell:screenCorners +layerrule = noanim, quickshell:lockWindowPusher + +# Launchers need to be FAST +layerrule = noanim, quickshell:overview +layerrule = noanim, gtk4-layer-shell + +# Outfoxxed's shell layers +layerrule = blur, shell:bar +layerrule = ignorezero, shell:bar +layerrule = blur, shell:notifications +layerrule = ignorealpha 0.1, shell:notifications + +# Custom window rules +@CUSTOM_WINDOW_RULES@ diff --git a/configs/hypr/scripts/launch_first_available.sh b/configs/hypr/scripts/launch_first_available.sh new file mode 100644 index 0000000..24d7885 --- /dev/null +++ b/configs/hypr/scripts/launch_first_available.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Launch the first available application from a list +for cmd in "$@"; do + eval "command -v ${cmd%% *}" >/dev/null 2>&1 || continue + eval "$cmd" & + exit +done +exit 1 diff --git a/configs/hypr/scripts/workspace_action.sh b/configs/hypr/scripts/workspace_action.sh new file mode 100644 index 0000000..abedaa5 --- /dev/null +++ b/configs/hypr/scripts/workspace_action.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Workspace action script for dots-hyprland +hyprctl dispatch "$1" $(((($(hyprctl activeworkspace -j | jq -r .id) - 1) / 10) * 10 + $2)) diff --git a/configs/hyprland-keybinds.conf b/configs/hyprland-keybinds.conf new file mode 100644 index 0000000..acb6807 --- /dev/null +++ b/configs/hyprland-keybinds.conf @@ -0,0 +1,214 @@ +# dots-hyprland keybindings adapted for quickshell +# Based on /home/celes/.config/hypr/custom/keybinds.conf + +# Key definitions +$Primary = Super +$Secondary = Control +$Tertiary = Shift +$Alternate = Alt +$MenuButton = Menu + +# ################### It just worksโ„ข keybinds ################### +# Volume +bindl = ,XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle +bindle = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ +bindle = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- + +# Brightness (adapted for quickshell) +bindle = , XF86MonBrightnessUp, exec, brightnessctl set '12.75+' +bindle = , XF86MonBrightnessDown, exec, brightnessctl set '12.75-' + +# ####################################### Applications ######################################## +# Core applications +bind = $Primary, Return, exec, foot +bind = $Primary, E, exec, nautilus +bind = $Primary, W, exec, firefox +bind = $Primary, C, exec, code + +# Music applications +bind = $Primary$Secondary, M, exec, tidal-hifi +bind = $Primary$Secondary$Tertiary, M, exec, env -u NIXOS_OZONE_WL cider --use-gl=desktop +bind = $Primary$Secondary$Alternate, M, exec, spotify + +# Communication +bind = $Primary$Secondary, O, exec, vesktop + +# Terminals +bind = $Primary$Secondary, H, exec, foot +bind = $Primary$Secondary$Tertiary, T, exec, foot sleep 0.01 && nmtui + +# File managers +bind = $Primary$Secondary, J, exec, thunar +bind = $Primary$Secondary$Tertiary, J, exec, nautilus + +# Browsers +bind = $Primary$Secondary, B, exec, firefox +bind = $Primary$Secondary$Tertiary, B, exec, chromium + +# Editors +bind = $Primary$Secondary, X, exec, subl +bind = $Primary$Secondary, C, exec, code +bind = $Primary$Secondary$Tertiary, C, exec, jetbrains-toolbox + +# Calculator +bind = $Primary$Secondary, 3, exec, ~/.local/bin/wofi-calc +bind = ,XF86Calculator, exec, ~/.local/bin/wofi-calc + +# System settings +bind = $Primary$Secondary, I, exec, XDG_CURRENT_DESKTOP="gnome" gnome-control-center +bind = $Primary$Secondary, V, exec, pavucontrol +bind = $Primary$Tertiary, Home, exec, gnome-system-monitor +bind = $Primary$Alternate, Insert, exec, foot -F btop + +# Actions +bind = $Primary$Secondary, Period, exec, pkill fuzzel || ~/.local/bin/fuzzel-emoji +bind = $Alternate, F4, killactive, +bind = $Secondary$Alternate, Space, togglefloating, +bind = $Secondary$Alternate, Q, exec, hyprctl kill +bind = $Primary$Tertiary$Alternate, Delete, exec, pkill wlogout || wlogout -p layer-shell +bind = $Primary$Tertiary$Alternate$Secondary, Delete, exec, systemctl poweroff + +# Screenshot, Record, OCR, Color picker, Clipboard history +bind = $Secondary$Tertiary, D, exec, ~/.local/bin/rubyshot | wl-copy +bindl = ,Print, exec, grim - | wl-copy +bind = $Secondary$Tertiary, 4, exec, grim -g "$(slurp -d -c D1E5F4BB -b 1B232866 -s 00000000)" - | wl-copy +bind = $Secondary$Tertiary, 5, exec, ~/.config/ags/scripts/record-script.sh +bind = $Secondary$Alternate, 5, exec, ~/.config/ags/scripts/record-script.sh --sound +bind = $Secondary$Tertiary$Alternate, 5, exec, ~/.config/ags/scripts/record-script.sh --fullscreen-sound + +bind = $Secondary$Alternate, C, exec, hyprpicker -a +bind = $Primary$Alternate, Space, exec, cliphist list | wofi -Iim --dmenu | cliphist decode | wl-copy && wtype -M ctrl v -M ctrl +bind = $Secondary$Alternate, V, exec, cliphist list | wofi -Iim --dmenu | cliphist decode | wl-copy && wtype -M ctrl v -M ctrl + +# Text-to-image OCR +bind = $Primary$Secondary$Tertiary, S, exec, grim -g "$(slurp -d -c D1E5F4BB -b 1B232866 -s 00000000)" "tmp.png" && tesseract "tmp.png" - | wl-copy && rm "tmp.png" +bind = $Secondary$Tertiary, T, exec, grim -g "$(slurp -d -c D1E5F4BB -b 1B232866 -s 00000000)" "tmp.png" && tesseract -l eng "tmp.png" - | wl-copy && rm "tmp.png" +bind = $Secondary$Tertiary, J, exec, grim -g "$(slurp -d -c D1E5F4BB -b 1B232866 -s 00000000)" "tmp.png" && tesseract -l jpn "tmp.png" - | wl-copy && rm "tmp.png" + +# Media controls +bind = $Secondary$Tertiary, N, exec, playerctl next || playerctl position `bc <<< "100 * $(playerctl metadata mpris:length) / 1000000 / 100"` +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPrev, exec, playerctl previous +bindl = , XF86AudioPlay, exec, playerctl play-pause +bind = $Secondary$Tertiary, B, exec, playerctl previous +bind = $Secondary$Tertiary, P, exec, playerctl play-pause + +# Lock screen +bind = $Primary$Secondary, L, exec, hyprlock + +# App launcher +bind = $Primary$Secondary, Slash, exec, pkill anyrun || anyrun + +# ##################################### Quickshell keybinds ##################################### +# Quickshell reload and reset +bindr = $Primary$Secondary, R, exec, hyprctl reload; pkill quickshell; pkill activewin.sh; pkill activews.sh; pkill gohypr; pkill bash; pkill ydotool; ~/.local/bin/quickshell-reset.sh; /home/celes/sources/celesrenata/end-4-dev/quickshell-wrapper.sh & + +# Color generation and theming +bind = $Primary$Secondary, T, exec, /home/celes/sources/celesrenata/end-4-dev/generate-colors.sh + +# Quickshell widgets (adapted from AGS) +bind = $Alternate, Tab, exec, quickshell -c overview +bind = $Secondary, Space, exec, quickshell -c overview +bind = $Secondary$Alternate, Slash, exec, quickshell -c cheatsheet +bind = $Secondary, B, exec, quickshell -c sideleft +bind = $Secondary, N, exec, quickshell -c sideright +bind = $Secondary, K, exec, quickshell -c osk +bind = $Primary$Alternate, Delete, exec, quickshell -c session + +# Quickshell indicators and popups +bindle = , XF86AudioRaiseVolume, exec, quickshell -c indicator-volume +bindle = , XF86AudioLowerVolume, exec, quickshell -c indicator-volume +bindle = , XF86MonBrightnessUp, exec, quickshell -c indicator-brightness +bindle = , XF86MonBrightnessDown, exec, quickshell -c indicator-brightness + +# Close quickshell windows on Super release +bindr = $Primary, $Primary_R, exec, quickshell -c close-all + +# ########################### Keybinds for Hyprland ############################ +# Swap windows +bind = $Secondary$Tertiary, left, movewindow, l +bind = $Secondary$Tertiary, right, movewindow, r +bind = $Secondary$Tertiary, up, movewindow, u +bind = $Secondary$Tertiary, down, movewindow, d + +# Move focus +bind = $Secondary, left, movefocus, l +bind = $Secondary, right, movefocus, r +bind = $Alternate, up, movefocus, u +bind = $Alternate, down, movefocus, d +bind = $Secondary, BracketLeft, movefocus, l +bind = $Secondary, BracketRight, movefocus, r + +# Workspace navigation +bind = $Primary$Secondary, right, workspace, +1 +bind = $Primary$Secondary, left, workspace, -1 +bind = $Primary$Secondary, BracketLeft, workspace, -1 +bind = $Primary$Secondary, BracketRight, workspace, +1 +bind = $Primary$Secondary, up, workspace, -5 +bind = $Primary$Secondary, down, workspace, +5 +bind = $Secondary, Page_Down, workspace, +1 +bind = $Secondary, Page_Up, workspace, -1 + +# Move windows to workspaces +bind = $Secondary$Alternate, Page_Down, movetoworkspace, +1 +bind = $Secondary$Alternate, Page_Up, movetoworkspace, -1 +bind = $Primary$Secondary$Tertiary, Right, movetoworkspace, +1 +bind = $Primary$Secondary$Tertiary, Left, movetoworkspace, -1 + +# Window split ratio +binde = $Primary$Secondary, Minus, splitratio, -0.1 +binde = $Primary$Secondary, Equal, splitratio, 0.1 +binde = $Secondary, Semicolon, splitratio, -0.1 +binde = $Secondary, Apostrophe, splitratio, 0.1 + +# Fullscreen +bind = $Primary$Secondary, F, fullscreen, 0 +bind = $Primary$Secondary, D, fullscreen, 1 +bind = $Secondary$Alternate, F, fullscreenstate, 0 + +# Workspace switching (1-10) +bind = $Secondary, 1, workspace, 1 +bind = $Secondary, 2, workspace, 2 +bind = $Secondary, 3, workspace, 3 +bind = $Secondary, 4, workspace, 4 +bind = $Secondary, 5, workspace, 5 +bind = $Secondary, 6, workspace, 6 +bind = $Secondary, 7, workspace, 7 +bind = $Secondary, 8, workspace, 8 +bind = $Secondary, 9, workspace, 9 +bind = $Secondary, 0, workspace, 10 +bind = $Primary$Secondary, S, togglespecialworkspace, + +# Move window to workspace silently +bind = $Secondary $Alternate, 1, movetoworkspacesilent, 1 +bind = $Secondary $Alternate, 2, movetoworkspacesilent, 2 +bind = $Secondary $Alternate, 3, movetoworkspacesilent, 3 +bind = $Secondary $Alternate, 4, movetoworkspacesilent, 4 +bind = $Secondary $Alternate, 5, movetoworkspacesilent, 5 +bind = $Secondary $Alternate, 6, movetoworkspacesilent, 6 +bind = $Secondary $Alternate, 7, movetoworkspacesilent, 7 +bind = $Secondary $Alternate, 8, movetoworkspacesilent, 8 +bind = $Secondary $Alternate, 9, movetoworkspacesilent, 9 +bind = $Secondary $Alternate, 0, movetoworkspacesilent, 10 +bind = $Secondary$Alternate, S, movetoworkspacesilent, special + +# Mouse workspace switching +bind = $Secondary, mouse_up, workspace, +1 +bind = $Secondary, mouse_down, workspace, -1 +bind = $Primary$Secondary, mouse_up, workspace, +1 +bind = $Primary$Secondary, mouse_down, workspace, -1 + +# Mouse window controls +bindm = $Primary, mouse:273, resizewindow +bindm = $Primary$Secondary, mouse:273, resizewindow +bindm = ,mouse:274, movewindow +bindm = $Secondary, mouse:273, movewindow +bind = $Primary$Secondary, Backslash, resizeactive, exact 640 480 + +# Alt+Tab window switching +bind = $Alternate, Tab, cyclenext +bind = $Alternate, Tab, bringactivetotop + +# Testing and debugging +bind = $Secondary$Alternate, f12, exec, notify-send "Millis since epoch" "$(date +%s%N | cut -b1-13)" -a 'Hyprland keybind' +bind = $Secondary$Alternate, Equal, exec, notify-send "Urgent notification" "Ah hell no" -u critical -a 'Hyprland keybind' diff --git a/configs/matugen/templates/colors.json b/configs/matugen/templates/colors.json new file mode 100644 index 0000000..d06ab6b --- /dev/null +++ b/configs/matugen/templates/colors.json @@ -0,0 +1,50 @@ +{ + "background": "{{colors.background.default.hex}}", + "error": "{{colors.error.default.hex}}", + "error_container": "{{colors.error_container.default.hex}}", + "inverse_on_surface": "{{colors.inverse_on_surface.default.hex}}", + "inverse_primary": "{{colors.inverse_primary.default.hex}}", + "inverse_surface": "{{colors.inverse_surface.default.hex}}", + "on_background": "{{colors.on_background.default.hex}}", + "on_error": "{{colors.on_error.default.hex}}", + "on_error_container": "{{colors.on_error_container.default.hex}}", + "on_primary": "{{colors.on_primary.default.hex}}", + "on_primary_container": "{{colors.on_primary_container.default.hex}}", + "on_primary_fixed": "{{colors.on_primary_fixed.default.hex}}", + "on_primary_fixed_variant": "{{colors.on_primary_fixed_variant.default.hex}}", + "on_secondary": "{{colors.on_secondary.default.hex}}", + "on_secondary_container": "{{colors.on_secondary_container.default.hex}}", + "on_secondary_fixed": "{{colors.on_secondary_fixed.default.hex}}", + "on_secondary_fixed_variant": "{{colors.on_secondary_fixed_variant.default.hex}}", + "on_surface": "{{colors.on_surface.default.hex}}", + "on_surface_variant": "{{colors.on_surface_variant.default.hex}}", + "on_tertiary": "{{colors.on_tertiary.default.hex}}", + "on_tertiary_container": "{{colors.on_tertiary_container.default.hex}}", + "on_tertiary_fixed": "{{colors.on_tertiary_fixed.default.hex}}", + "on_tertiary_fixed_variant": "{{colors.on_tertiary_fixed_variant.default.hex}}", + "outline": "{{colors.outline.default.hex}}", + "outline_variant": "{{colors.outline_variant.default.hex}}", + "primary": "{{colors.primary.default.hex}}", + "primary_container": "{{colors.primary_container.default.hex}}", + "primary_fixed": "{{colors.primary_fixed.default.hex}}", + "primary_fixed_dim": "{{colors.primary_fixed_dim.default.hex}}", + "scrim": "{{colors.scrim.default.hex}}", + "secondary": "{{colors.secondary.default.hex}}", + "secondary_container": "{{colors.secondary_container.default.hex}}", + "secondary_fixed": "{{colors.secondary_fixed.default.hex}}", + "secondary_fixed_dim": "{{colors.secondary_fixed_dim.default.hex}}", + "shadow": "{{colors.shadow.default.hex}}", + "surface": "{{colors.surface.default.hex}}", + "surface_bright": "{{colors.surface_bright.default.hex}}", + "surface_container": "{{colors.surface_container.default.hex}}", + "surface_container_high": "{{colors.surface_container_high.default.hex}}", + "surface_container_highest": "{{colors.surface_container_highest.default.hex}}", + "surface_container_low": "{{colors.surface_container_low.default.hex}}", + "surface_container_lowest": "{{colors.surface_container_lowest.default.hex}}", + "surface_dim": "{{colors.surface_dim.default.hex}}", + "surface_variant": "{{colors.surface_variant.default.hex}}", + "tertiary": "{{colors.tertiary.default.hex}}", + "tertiary_container": "{{colors.tertiary_container.default.hex}}", + "tertiary_fixed": "{{colors.tertiary_fixed.default.hex}}", + "tertiary_fixed_dim": "{{colors.tertiary_fixed_dim.default.hex}}" +} diff --git a/configs/matugen/templates/foot/foot.ini b/configs/matugen/templates/foot/foot.ini new file mode 100644 index 0000000..d4b8655 --- /dev/null +++ b/configs/matugen/templates/foot/foot.ini @@ -0,0 +1,63 @@ +# Material You themed foot terminal configuration + +[main] +shell=fish +term=xterm-256color +title=foot +font=JetBrainsMono Nerd Font:size=11 +letter-spacing=0 +dpi-aware=no +pad=25x25 +bold-text-in-bright=no + +[scrollback] +lines=10000 + +[cursor] +style=beam +blink=no +beam-thickness=1.5 +color={{colors.primary.default.hex}} {{colors.on_primary.default.hex}} + +[key-bindings] +scrollback-up-page=Page_Up +scrollback-down-page=Page_Down +clipboard-copy=Control+c +clipboard-paste=Control+v +search-start=Control+f +font-increase=Control+plus Control+equal Control+KP_Add +font-decrease=Control+minus Control+KP_Subtract +font-reset=Control+0 Control+KP_0 + +[search-bindings] +cancel=Escape +find-prev=Shift+F3 +find-next=F3 Control+G +delete-prev-word=Control+BackSpace + +[text-bindings] +\x03=Control+Shift+c + +[colors] +alpha=0.95 +background={{colors.background.default.hex}} +foreground={{colors.on_background.default.hex}} + +# Material You color palette +regular0={{colors.surface_dim.default.hex}} +regular1={{colors.error.default.hex}} +regular2={{colors.secondary.default.hex}} +regular3={{colors.tertiary.default.hex}} +regular4={{colors.primary.default.hex}} +regular5={{colors.error_container.default.hex}} +regular6={{colors.primary_container.default.hex}} +regular7={{colors.on_surface.default.hex}} + +bright0={{colors.surface_variant.default.hex}} +bright1={{colors.error.default.hex}} +bright2={{colors.secondary.default.hex}} +bright3={{colors.tertiary.default.hex}} +bright4={{colors.primary.default.hex}} +bright5={{colors.error_container.default.hex}} +bright6={{colors.primary_container.default.hex}} +bright7={{colors.on_background.default.hex}} diff --git a/configs/matugen/templates/fuzzel/fuzzel_theme.ini b/configs/matugen/templates/fuzzel/fuzzel_theme.ini new file mode 100644 index 0000000..d508977 --- /dev/null +++ b/configs/matugen/templates/fuzzel/fuzzel_theme.ini @@ -0,0 +1,9 @@ +# Material You theme for Fuzzel launcher +[colors] +background={{colors.background.default.hex_stripped}}ff +text={{colors.on_background.default.hex_stripped}}ff +selection={{colors.surface_variant.default.hex_stripped}}ff +selection-text={{colors.on_surface_variant.default.hex_stripped}}ff +border={{colors.surface_variant.default.hex_stripped}}dd +match={{colors.primary.default.hex_stripped}}ff +selection-match={{colors.primary.default.hex_stripped}}ff diff --git a/configs/matugen/templates/gtk/gtk-colors.css b/configs/matugen/templates/gtk/gtk-colors.css new file mode 100644 index 0000000..fb9bc4d --- /dev/null +++ b/configs/matugen/templates/gtk/gtk-colors.css @@ -0,0 +1,42 @@ +/* +* GTK Colors - Material You Theme +* Generated with Matugen +*/ + +@define-color accent_color {{colors.primary.default.hex}}; +@define-color accent_fg_color {{colors.on_primary.default.hex}}; +@define-color accent_bg_color {{colors.primary.default.hex}}; +@define-color destructive_color {{colors.error.default.hex}}; +@define-color destructive_bg_color {{colors.error.default.hex}}; +@define-color destructive_fg_color {{colors.on_error.default.hex}}; +@define-color success_color {{colors.secondary.default.hex}}; +@define-color success_bg_color {{colors.secondary.default.hex}}; +@define-color success_fg_color {{colors.on_secondary.default.hex}}; +@define-color warning_color {{colors.tertiary.default.hex}}; +@define-color warning_bg_color {{colors.tertiary.default.hex}}; +@define-color warning_fg_color {{colors.on_tertiary.default.hex}}; +@define-color error_color {{colors.error.default.hex}}; +@define-color error_bg_color {{colors.error.default.hex}}; +@define-color error_fg_color {{colors.on_error.default.hex}}; +@define-color window_bg_color {{colors.background.default.hex}}; +@define-color window_fg_color {{colors.on_background.default.hex}}; +@define-color view_bg_color {{colors.surface.default.hex}}; +@define-color view_fg_color {{colors.on_surface.default.hex}}; +@define-color headerbar_bg_color {{colors.surface_dim.default.hex}}; +@define-color headerbar_fg_color {{colors.on_surface.default.hex}}; +@define-color headerbar_border_color {{colors.outline_variant.default.hex}}; +@define-color headerbar_backdrop_color {{colors.surface_dim.default.hex}}; +@define-color headerbar_shade_color {{colors.shadow.default.hex}}; +@define-color card_bg_color {{colors.surface.default.hex}}; +@define-color card_fg_color {{colors.on_surface.default.hex}}; +@define-color card_shade_color {{colors.shadow.default.hex}}; +@define-color dialog_bg_color {{colors.surface.default.hex}}; +@define-color dialog_fg_color {{colors.on_surface.default.hex}}; +@define-color popover_bg_color {{colors.surface_dim.default.hex}}; +@define-color popover_fg_color {{colors.on_surface.default.hex}}; +@define-color shade_color {{colors.shadow.default.hex}}; +@define-color scrollbar_outline_color {{colors.outline_variant.default.hex}}; +@define-color sidebar_bg_color @window_bg_color; +@define-color sidebar_fg_color @window_fg_color; +@define-color sidebar_border_color @window_bg_color; +@define-color sidebar_backdrop_color @window_bg_color; diff --git a/configs/matugen/templates/hyprland/colors.conf b/configs/matugen/templates/hyprland/colors.conf new file mode 100644 index 0000000..105ab22 --- /dev/null +++ b/configs/matugen/templates/hyprland/colors.conf @@ -0,0 +1,37 @@ +# Material You colors for Hyprland +# Generated dynamically from wallpaper + +# Slurp (selection tool) colors +exec = export SLURP_ARGS='-d -c {{colors.primary.default.hex_stripped}}BB -b {{colors.surface_variant.default.hex_stripped}}44 -s 00000000' + +general { + col.active_border = rgba({{colors.outline.default.hex_stripped}}AA) + col.inactive_border = rgba({{colors.outline_variant.default.hex_stripped}}AA) +} + +misc { + background_color = rgba({{colors.surface.dark.hex_stripped}}FF) +} + +plugin { + hyprbars { + # Font configuration + bar_text_font = Rubik, Geist, AR One Sans, Reddit Sans, Inter, Roboto, Ubuntu, Noto Sans, sans-serif + bar_height = 30 + bar_padding = 10 + bar_button_padding = 5 + bar_precedence_over_border = true + bar_part_of_window = true + + bar_color = rgba({{colors.background.default.hex_stripped}}FF) + col.text = rgba({{colors.on_background.default.hex_stripped}}FF) + + # Window control buttons (R -> L) + hyprbars-button = rgb({{colors.on_background.default.hex_stripped}}), 13, ๓ฐ–ญ, hyprctl dispatch killactive + hyprbars-button = rgb({{colors.on_background.default.hex_stripped}}), 13, ๓ฐ–ฏ, hyprctl dispatch fullscreen 1 + hyprbars-button = rgb({{colors.on_background.default.hex_stripped}}), 13, ๓ฐ–ฐ, hyprctl dispatch movetoworkspacesilent special + } +} + +# Special window border colors +windowrulev2 = bordercolor rgba({{colors.primary.default.hex_stripped}}AA) rgba({{colors.primary.default.hex_stripped}}77),pinned:1 diff --git a/configs/matugen/templates/hyprland/hyprlock.conf b/configs/matugen/templates/hyprland/hyprlock.conf new file mode 100644 index 0000000..0d4d304 --- /dev/null +++ b/configs/matugen/templates/hyprland/hyprlock.conf @@ -0,0 +1,71 @@ +# Material You themed Hyprlock configuration + +$text_color = rgba({{colors.on_background.default.hex_stripped}}FF) +$entry_background_color = rgba({{colors.surface_variant.default.hex_stripped}}11) +$entry_border_color = rgba({{colors.outline.default.hex_stripped}}55) +$entry_color = rgba({{colors.on_surface_variant.default.hex_stripped}}FF) +$font_family = Rubik Light +$font_family_clock = Rubik Light + +background { + color = rgba({{colors.background.default.hex_stripped}}FF) + path = screenshot + blur_passes = 3 + blur_size = 8 +} + +input-field { + monitor = + size = 250, 50 + outline_thickness = 2 + dots_size = 0.1 + dots_spacing = 0.3 + outer_color = $entry_border_color + inner_color = $entry_background_color + font_color = $entry_color + fade_on_empty = true + placeholder_text = Password... + check_color = rgba({{colors.primary.default.hex_stripped}}FF) + fail_color = rgba({{colors.error.default.hex_stripped}}FF) + fail_text = $FAIL ($ATTEMPTS) + + position = 0, 20 + halign = center + valign = center +} + +# Time +label { + monitor = + text = cmd[update:30000] echo "$(date +"%R")" + color = $text_color + font_size = 90 + font_family = $font_family_clock + position = -30, 0 + halign = right + valign = top +} + +# Date +label { + monitor = + text = cmd[update:43200000] echo "$(date +"%A, %d %B %Y")" + color = $text_color + font_size = 25 + font_family = $font_family + position = -30, -150 + halign = right + valign = top +} + +# User +label { + monitor = + text = Hi there, $USER + color = $text_color + font_size = 20 + font_family = $font_family + position = 0, 100 + halign = center + valign = center +} diff --git a/configs/matugen/templates/kde/color.txt b/configs/matugen/templates/kde/color.txt new file mode 100644 index 0000000..84e2e23 --- /dev/null +++ b/configs/matugen/templates/kde/color.txt @@ -0,0 +1 @@ +{{colors.primary.default.hex}} diff --git a/configs/matugen/templates/kitty/kitty.conf b/configs/matugen/templates/kitty/kitty.conf new file mode 100644 index 0000000..c7f46fa --- /dev/null +++ b/configs/matugen/templates/kitty/kitty.conf @@ -0,0 +1,249 @@ +# kitty terminal configuration with Material You theming +# Generated by matugen from wallpaper colors + +# Font configuration +font_family JetBrainsMono Nerd Font +bold_font JetBrainsMono Nerd Font Bold +italic_font JetBrainsMono Nerd Font Italic +bold_italic_font JetBrainsMono Nerd Font Bold Italic +font_size 12.0 + +# Cursor +cursor_shape block +cursor_blink_interval 0.5 +cursor_stop_blinking_after 15.0 + +# Scrollback +scrollback_lines 10000 +scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER + +# Mouse +mouse_hide_wait 3.0 +url_color {{colors.primary.default.hex}} +url_style curly +open_url_with default +copy_on_select yes +strip_trailing_spaces never + +# Performance +repaint_delay 10 +input_delay 3 +sync_to_monitor yes + +# Window layout +remember_window_size yes +initial_window_width 100c +initial_window_height 30c +enabled_layouts * +window_resize_step_cells 2 +window_resize_step_lines 2 +window_border_width 1pt +draw_minimal_borders yes +window_margin_width 0 +single_window_margin_width -1 +window_padding_width 8 +placement_strategy center +active_border_color {{colors.primary.default.hex}} +inactive_border_color {{colors.outline.default.hex}} +bell_border_color {{colors.error.default.hex}} + +# Tab bar +tab_bar_edge bottom +tab_bar_margin_width 0.0 +tab_bar_margin_height 0.0 0.0 +tab_bar_style powerline +tab_bar_align left +tab_bar_min_tabs 2 +tab_switch_strategy previous +tab_fade 0.25 0.5 0.75 1 +tab_separator " โ”‡" +tab_powerline_style angled +tab_activity_symbol none +tab_title_template "{title}{' :{}:'.format(num_windows) if num_windows > 1 else ''}" +active_tab_title_template none + +# Tab bar colors +active_tab_foreground {{colors.primary.default.hex}} +active_tab_background {{colors.surface.default.hex}} +active_tab_font_style bold-italic +inactive_tab_foreground {{colors.on_surface_variant.default.hex}} +inactive_tab_background {{colors.surface_variant.default.hex}} +inactive_tab_font_style normal +tab_bar_background {{colors.surface_container.default.hex}} + +# Material You Color Scheme +foreground {{colors.on_surface.default.hex}} +background {{colors.surface.default.hex}} +selection_foreground {{colors.on_primary.default.hex}} +selection_background {{colors.primary.default.hex}} + +# Cursor colors +cursor {{colors.primary.default.hex}} +cursor_text_color {{colors.on_primary.default.hex}} + +# URL underline color when hovering with mouse +url_color {{colors.primary.default.hex}} + +# kitty window border colors +active_border_color {{colors.primary.default.hex}} +inactive_border_color {{colors.outline.default.hex}} +bell_border_color {{colors.error.default.hex}} + +# OS Window titlebar colors +wayland_titlebar_color {{colors.surface_container.default.hex}} +macos_titlebar_color {{colors.surface_container.default.hex}} + +# Tab bar colors +active_tab_foreground {{colors.on_primary_container.default.hex}} +active_tab_background {{colors.primary_container.default.hex}} +inactive_tab_foreground {{colors.on_surface_variant.default.hex}} +inactive_tab_background {{colors.surface_variant.default.hex}} +tab_bar_background {{colors.surface.default.hex}} + +# Colors for marks (marked text in the terminal) +mark1_foreground {{colors.surface.default.hex}} +mark1_background {{colors.primary.default.hex}} +mark2_foreground {{colors.surface.default.hex}} +mark2_background {{colors.secondary.default.hex}} +mark3_foreground {{colors.surface.default.hex}} +mark3_background {{colors.tertiary.default.hex}} + +# The 16 terminal colors + +# normal colors +color0 {{colors.surface.default.hex}} +color1 {{colors.error.default.hex}} +color2 {{colors.primary.default.hex}} +color3 {{colors.tertiary.default.hex}} +color4 {{colors.secondary.default.hex}} +color5 {{colors.primary.default.hex}} +color6 {{colors.secondary.default.hex}} +color7 {{colors.on_surface.default.hex}} + +# bright colors +color8 {{colors.outline.default.hex}} +color9 {{colors.error.default.hex}} +color10 {{colors.primary.default.hex}} +color11 {{colors.tertiary.default.hex}} +color12 {{colors.secondary.default.hex}} +color13 {{colors.primary.default.hex}} +color14 {{colors.secondary.default.hex}} +color15 {{colors.on_surface.default.hex}} + +# Extended colors for better Material You integration +color16 {{colors.primary_container.default.hex}} +color17 {{colors.secondary_container.default.hex}} +color18 {{colors.tertiary_container.default.hex}} +color19 {{colors.error_container.default.hex}} +color20 {{colors.surface_variant.default.hex}} +color21 {{colors.outline_variant.default.hex}} + +# Advanced features +allow_remote_control yes +listen_on unix:/tmp/kitty +shell_integration enabled +term xterm-kitty + +# Keyboard shortcuts +kitty_mod ctrl+shift + +# Clipboard +map kitty_mod+c copy_to_clipboard +map kitty_mod+v paste_from_clipboard +map kitty_mod+s paste_from_selection +map shift+insert paste_from_selection +map kitty_mod+o pass_selection_to_program + +# Scrolling +map kitty_mod+up scroll_line_up +map kitty_mod+k scroll_line_up +map kitty_mod+down scroll_line_down +map kitty_mod+j scroll_line_down +map kitty_mod+page_up scroll_page_up +map kitty_mod+page_down scroll_page_down +map kitty_mod+home scroll_home +map kitty_mod+end scroll_end +map kitty_mod+h show_scrollback + +# Window management +map kitty_mod+enter new_window +map kitty_mod+n new_os_window +map kitty_mod+w close_window +map kitty_mod+] next_window +map kitty_mod+[ previous_window +map kitty_mod+f move_window_forward +map kitty_mod+b move_window_backward +map kitty_mod+` move_window_to_top +map kitty_mod+r start_resizing_window +map kitty_mod+1 first_window +map kitty_mod+2 second_window +map kitty_mod+3 third_window +map kitty_mod+4 fourth_window +map kitty_mod+5 fifth_window +map kitty_mod+6 sixth_window +map kitty_mod+7 seventh_window +map kitty_mod+8 eighth_window +map kitty_mod+9 ninth_window +map kitty_mod+0 tenth_window + +# Tab management +map kitty_mod+right next_tab +map kitty_mod+left previous_tab +map kitty_mod+t new_tab +map kitty_mod+q close_tab +map kitty_mod+. move_tab_forward +map kitty_mod+, move_tab_backward +map kitty_mod+alt+t set_tab_title + +# Layout management +map kitty_mod+l next_layout + +# Font sizes +map kitty_mod+equal change_font_size all +2.0 +map kitty_mod+plus change_font_size all +2.0 +map kitty_mod+kp_add change_font_size all +2.0 +map kitty_mod+minus change_font_size all -2.0 +map kitty_mod+kp_subtract change_font_size all -2.0 +map kitty_mod+backspace change_font_size all 0 + +# Select and act on visible text +map kitty_mod+e kitten hints +map kitty_mod+p>f kitten hints --type path --program - +map kitty_mod+p>shift+f kitten hints --type path +map kitty_mod+p>l kitten hints --type line --program - +map kitty_mod+p>w kitten hints --type word --program - +map kitty_mod+p>h kitten hints --type hash --program - +map kitty_mod+p>n kitten hints --type linenum + +# Miscellaneous +map kitty_mod+f11 toggle_fullscreen +map kitty_mod+f10 toggle_maximized +map kitty_mod+u kitten unicode_input +map kitty_mod+f2 edit_config_file +map kitty_mod+escape kitty_shell window + +# Sending arbitrary text on key presses +map kitty_mod+alt+1 send_text all \x01 +map kitty_mod+alt+2 send_text all \x02 +map kitty_mod+alt+3 send_text all \x03 + +# Symbol mapping for better rendering +symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols +symbol_map U+E000-U+F8FF,U+F0000-U+FFFFD,U+100000-U+10FFFD Symbols Nerd Font Mono + +# Performance tuning +sync_to_monitor yes +enable_audio_bell no +visual_bell_duration 0.0 +window_alert_on_bell no +bell_on_tab no +command_on_bell none + +# Advanced +allow_hyperlinks yes +shell_integration enabled +update_check_interval 0 +startup_session none +clipboard_control write-clipboard write-primary +allow_cloning ask +clone_source_strategies venv,conda,env_var,path diff --git a/configs/matugen/templates/quickshell/colors.qml b/configs/matugen/templates/quickshell/colors.qml new file mode 100644 index 0000000..2df1338 --- /dev/null +++ b/configs/matugen/templates/quickshell/colors.qml @@ -0,0 +1,61 @@ +// Material You colors for Quickshell +// Generated dynamically from wallpaper + +pragma Singleton +import QtQuick + +QtObject { + // Primary colors + readonly property color primary: "{{colors.primary.default.hex}}" + readonly property color onPrimary: "{{colors.on_primary.default.hex}}" + readonly property color primaryContainer: "{{colors.primary_container.default.hex}}" + readonly property color onPrimaryContainer: "{{colors.on_primary_container.default.hex}}" + + // Secondary colors + readonly property color secondary: "{{colors.secondary.default.hex}}" + readonly property color onSecondary: "{{colors.on_secondary.default.hex}}" + readonly property color secondaryContainer: "{{colors.secondary_container.default.hex}}" + readonly property color onSecondaryContainer: "{{colors.on_secondary_container.default.hex}}" + + // Tertiary colors + readonly property color tertiary: "{{colors.tertiary.default.hex}}" + readonly property color onTertiary: "{{colors.on_tertiary.default.hex}}" + readonly property color tertiaryContainer: "{{colors.tertiary_container.default.hex}}" + readonly property color onTertiaryContainer: "{{colors.on_tertiary_container.default.hex}}" + + // Error colors + readonly property color error: "{{colors.error.default.hex}}" + readonly property color onError: "{{colors.on_error.default.hex}}" + readonly property color errorContainer: "{{colors.error_container.default.hex}}" + readonly property color onErrorContainer: "{{colors.on_error_container.default.hex}}" + + // Surface colors + readonly property color surface: "{{colors.surface.default.hex}}" + readonly property color onSurface: "{{colors.on_surface.default.hex}}" + readonly property color surfaceVariant: "{{colors.surface_variant.default.hex}}" + readonly property color onSurfaceVariant: "{{colors.on_surface_variant.default.hex}}" + readonly property color surfaceDim: "{{colors.surface_dim.default.hex}}" + readonly property color surfaceBright: "{{colors.surface_bright.default.hex}}" + readonly property color surfaceContainer: "{{colors.surface_container.default.hex}}" + readonly property color surfaceContainerHigh: "{{colors.surface_container_high.default.hex}}" + readonly property color surfaceContainerHighest: "{{colors.surface_container_highest.default.hex}}" + readonly property color surfaceContainerLow: "{{colors.surface_container_low.default.hex}}" + readonly property color surfaceContainerLowest: "{{colors.surface_container_lowest.default.hex}}" + + // Background colors + readonly property color background: "{{colors.background.default.hex}}" + readonly property color onBackground: "{{colors.on_background.default.hex}}" + + // Outline colors + readonly property color outline: "{{colors.outline.default.hex}}" + readonly property color outlineVariant: "{{colors.outline_variant.default.hex}}" + + // Inverse colors + readonly property color inverseSurface: "{{colors.inverse_surface.default.hex}}" + readonly property color inverseOnSurface: "{{colors.inverse_on_surface.default.hex}}" + readonly property color inversePrimary: "{{colors.inverse_primary.default.hex}}" + + // Other colors + readonly property color shadow: "{{colors.shadow.default.hex}}" + readonly property color scrim: "{{colors.scrim.default.hex}}" +} diff --git a/configs/matugen/templates/wallpaper.txt b/configs/matugen/templates/wallpaper.txt new file mode 100644 index 0000000..33b0c5b --- /dev/null +++ b/configs/matugen/templates/wallpaper.txt @@ -0,0 +1 @@ +{{image}} diff --git a/configs/matugen/templates/wlogout/layout b/configs/matugen/templates/wlogout/layout new file mode 100644 index 0000000..de9a5d2 --- /dev/null +++ b/configs/matugen/templates/wlogout/layout @@ -0,0 +1,36 @@ +{ + "label" : "lock", + "action" : "hyprlock", + "text" : "Lock", + "keybind" : "l" +} +{ + "label" : "hibernate", + "action" : "systemctl hibernate", + "text" : "Hibernate", + "keybind" : "h" +} +{ + "label" : "logout", + "action" : "hyprctl dispatch exit", + "text" : "Logout", + "keybind" : "e" +} +{ + "label" : "shutdown", + "action" : "systemctl poweroff", + "text" : "Shutdown", + "keybind" : "s" +} +{ + "label" : "suspend", + "action" : "systemctl suspend", + "text" : "Suspend", + "keybind" : "u" +} +{ + "label" : "reboot", + "action" : "systemctl reboot", + "text" : "Reboot", + "keybind" : "r" +} diff --git a/configs/matugen/templates/wlogout/style.css b/configs/matugen/templates/wlogout/style.css new file mode 100644 index 0000000..8e97c28 --- /dev/null +++ b/configs/matugen/templates/wlogout/style.css @@ -0,0 +1,55 @@ +/* wlogout style with Material You theming */ + +* { + background-image: none; + box-shadow: none; +} + +window { + background-color: rgba(12, 12, 12, 0.9); +} + +button { + color: {{colors.on_surface.default.hex}}; + background-color: {{colors.surface_container.default.hex}}; + border-style: solid; + border-width: 2px; + background-repeat: no-repeat; + background-position: center; + background-size: 25%; + border-radius: 18px; + margin: 5px; + transition: all 0.3s ease-in-out; +} + +button:focus, button:active, button:hover { + background-color: {{colors.primary_container.default.hex}}; + color: {{colors.on_primary_container.default.hex}}; + border-color: {{colors.primary.default.hex}}; + outline-style: none; + transform: scale(1.05); +} + +#lock { + background-image: image(url("icons/lock.png"), url("/usr/share/wlogout/icons/lock.png")); +} + +#logout { + background-image: image(url("icons/logout.png"), url("/usr/share/wlogout/icons/logout.png")); +} + +#suspend { + background-image: image(url("icons/suspend.png"), url("/usr/share/wlogout/icons/suspend.png")); +} + +#hibernate { + background-image: image(url("icons/hibernate.png"), url("/usr/share/wlogout/icons/hibernate.png")); +} + +#shutdown { + background-image: image(url("icons/shutdown.png"), url("/usr/share/wlogout/icons/shutdown.png")); +} + +#reboot { + background-image: image(url("icons/reboot.png"), url("/usr/share/wlogout/icons/reboot.png")); +} diff --git a/configs/quickshell-patches/AppLauncherPatch.qml b/configs/quickshell-patches/AppLauncherPatch.qml new file mode 100644 index 0000000..59bc4cf --- /dev/null +++ b/configs/quickshell-patches/AppLauncherPatch.qml @@ -0,0 +1,67 @@ +pragma Singleton + +import Quickshell + +/** + * Application launcher patch for NixOS integration + * Ensures applications are launched with proper PATH environment + */ +Singleton { + id: root + + // Get the launcher wrapper path from environment + readonly property string launcherWrapper: Quickshell.env("DOTS_HYPRLAND_APP_LAUNCHER") || "" + + /** + * Launch an application using the NixOS-compatible launcher wrapper + * @param command - The command to execute (can be string or array) + */ + function launchApp(command) { + if (launcherWrapper === "") { + console.warn("AppLauncherPatch: No launcher wrapper found, falling back to direct execution"); + if (Array.isArray(command)) { + Quickshell.execDetached(command); + } else { + Quickshell.execDetached(["bash", "-c", command]); + } + return; + } + + console.log("AppLauncherPatch: Launching app with wrapper:", command); + + if (Array.isArray(command)) { + // If command is an array, prepend the launcher wrapper + Quickshell.execDetached([launcherWrapper].concat(command)); + } else { + // If command is a string, use bash to execute it through the wrapper + Quickshell.execDetached([launcherWrapper, "bash", "-c", command]); + } + } + + /** + * Launch a desktop entry using the launcher wrapper + * @param desktopEntry - The DesktopEntry object + */ + function launchDesktopEntry(desktopEntry) { + if (!desktopEntry) { + console.warn("AppLauncherPatch: No desktop entry provided"); + return; + } + + console.log("AppLauncherPatch: Launching desktop entry:", desktopEntry.name); + + // Try to use the desktop entry's execute method first + try { + desktopEntry.execute(); + } catch (error) { + console.warn("AppLauncherPatch: Desktop entry execute failed, trying wrapper approach:", error); + + // Fallback: extract the Exec command and use our wrapper + if (desktopEntry.exec) { + launchApp(desktopEntry.exec); + } else { + console.error("AppLauncherPatch: No exec command found in desktop entry"); + } + } + } +} diff --git a/configs/quickshell/GlobalStates.qml b/configs/quickshell/GlobalStates.qml new file mode 100644 index 0000000..b3a124e --- /dev/null +++ b/configs/quickshell/GlobalStates.qml @@ -0,0 +1,73 @@ +import qs.modules.common +import qs +import QtQuick +import Quickshell +import Quickshell.Hyprland +import Quickshell.Io +pragma Singleton +pragma ComponentBehavior: Bound + +Singleton { + id: root + property bool barOpen: true + property bool sidebarLeftOpen: false + property bool sidebarRightOpen: false + property bool mediaControlsOpen: false + property bool osdBrightnessOpen: false + property bool osdVolumeOpen: false + property bool oskOpen: false + property bool overviewOpen: false + property bool sessionOpen: false + property bool workspaceShowNumbers: false + property bool superReleaseMightTrigger: true + property bool screenLocked: false + property bool screenLockContainsCharacters: false + + property real screenZoom: 1 + onScreenZoomChanged: { + Quickshell.execDetached(["hyprctl", "keyword", "cursor:zoom_factor", root.screenZoom.toString()]); + } + Behavior on screenZoom { + animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) + } + + // When user is not reluctant while pressing super, they probably don't need to see workspace numbers + onSuperReleaseMightTriggerChanged: { + workspaceShowNumbersTimer.stop() + } + + Timer { + id: workspaceShowNumbersTimer + interval: Config.options.bar.workspaces.showNumberDelay + // interval: 0 + repeat: false + onTriggered: { + workspaceShowNumbers = true + } + } + + GlobalShortcut { + name: "workspaceNumber" + description: "Hold to show workspace numbers, release to show icons" + + onPressed: { + workspaceShowNumbersTimer.start() + } + onReleased: { + workspaceShowNumbersTimer.stop() + workspaceShowNumbers = false + } + } + + IpcHandler { + target: "zoom" + + function zoomIn() { + screenZoom = Math.min(screenZoom + 0.4, 3.0) + } + + function zoomOut() { + screenZoom = Math.max(screenZoom - 0.4, 1) + } + } +} \ No newline at end of file diff --git a/configs/quickshell/ReloadPopup.qml b/configs/quickshell/ReloadPopup.qml new file mode 100644 index 0000000..4b0ecd8 --- /dev/null +++ b/configs/quickshell/ReloadPopup.qml @@ -0,0 +1,157 @@ +import QtQuick +import QtQuick.Layouts +import Quickshell +import Qt5Compat.GraphicalEffects + +Scope { + id: root + property bool failed; + property string errorString; + + // Connect to the Quickshell global to listen for the reload signals. + Connections { + target: Quickshell + + function onReloadCompleted() { + root.failed = false; + popupLoader.loading = true; + } + + function onReloadFailed(error: string) { + // Close any existing popup before making a new one. + popupLoader.active = false; + + root.failed = true; + root.errorString = error; + popupLoader.loading = true; + } + } + + // Keep the popup in a loader because it isn't needed most of the time + LazyLoader { + id: popupLoader + + PanelWindow { + id: popup + + exclusiveZone: 0 + anchors.top: true + margins.top: 0 + + implicitWidth: rect.width + shadow.radius * 2 + implicitHeight: rect.height + shadow.radius * 2 + + // color blending is a bit odd as detailed in the type reference. + color: "transparent" + + Rectangle { + id: rect + anchors.centerIn: parent + color: failed ? "#ffe99195" : "#ffD1E8D5" + + implicitHeight: layout.implicitHeight + 30 + implicitWidth: layout.implicitWidth + 30 + radius: 12 + + // Fills the whole area of the rectangle, making any clicks go to it, + // which dismiss the popup. + MouseArea { + id: mouseArea + anchors.fill: parent + onClicked: { + popupLoader.active = false + } + + // makes the mouse area track mouse hovering, so the hide animation + // can be paused when hovering. + hoverEnabled: true + } + + ColumnLayout { + id: layout + spacing: 10 + anchors { + top: parent.top + topMargin: 10 + horizontalCenter: parent.horizontalCenter + } + + Text { + renderType: Text.NativeRendering + font.family: "Rubik" + font.pointSize: 14 + text: root.failed ? "Quickshell: Reload failed" : "Quickshell reloaded" + color: failed ? "#ff93000A" : "#ff0C1F13" + } + + Text { + renderType: Text.NativeRendering + font.family: "JetBrains Mono NF" + font.pointSize: 11 + text: root.errorString + color: failed ? "#ff93000A" : "#ff0C1F13" + // When visible is false, it also takes up no space. + visible: root.errorString != "" + } + } + + // A progress bar on the bottom of the screen, showing how long until the + // popup is removed. + Rectangle { + z: 2 + id: bar + color: failed ? "#ff93000A" : "#ff0C1F13" + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.margins: 10 + height: 5 + radius: 9999 + + PropertyAnimation { + id: anim + target: bar + property: "width" + from: rect.width - bar.anchors.margins * 2 + to: 0 + duration: failed ? 10000 : 1000 + onFinished: popupLoader.active = false + + // Pause the animation when the mouse is hovering over the popup, + // so it stays onscreen while reading. This updates reactively + // when the mouse moves on and off the popup. + paused: mouseArea.containsMouse + } + } + // Its bg + Rectangle { + z: 1 + id: bar_bg + color: failed ? "#30af1b25" : "#4027643e" + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.margins: 10 + height: 5 + radius: 9999 + width: rect.width - bar.anchors.margins * 2 + } + + // We could set `running: true` inside the animation, but the width of the + // rectangle might not be calculated yet, due to the layout. + // In the `Component.onCompleted` event handler, all of the component's + // properties and children have been initialized. + Component.onCompleted: anim.start() + } + + DropShadow { + id: shadow + anchors.fill: rect + horizontalOffset: 0 + verticalOffset: 2 + radius: 6 + samples: radius * 2 + 1 // Ideally should be 2 * radius + 1, see qt docs + color: "#44000000" + source: rect + } + } + } +} diff --git a/configs/quickshell/Translation.qml b/configs/quickshell/Translation.qml new file mode 100644 index 0000000..3cfdce1 --- /dev/null +++ b/configs/quickshell/Translation.qml @@ -0,0 +1,175 @@ +pragma Singleton + +import QtQuick +import Quickshell +import Quickshell.Io +import qs.modules.common + +Singleton { + id: root + + property var translations: ({}) + property string currentLanguage: "en_US" + property var availableLanguages: ["en_US"] + property bool isScanning: false + property bool isLoading: false + + Process { + id: scanLanguagesProcess + command: ["find", Qt.resolvedUrl(Directories.config + "/quickshell/translations/").toString().replace("file://", ""), "-name", "*.json", "-exec", "basename", "{}", ".json", ";"] + running: false + + stdout: SplitParser { + onRead: data => { + if (data.trim().length === 0) return + + var files = data.trim().split('\n') + + for (var i = 0; i < files.length; i++) { + var lang = files[i].trim() + if (lang.length > 0 && root.availableLanguages.indexOf(lang) === -1) { + root.availableLanguages.push(lang) + } + } + } + } + + onExited: (exitCode, exitStatus) => { + root.isScanning = false + if (exitCode !== 0) { + root.availableLanguages = ["en_US"] + } + root.loadTranslations() + } + } + + FileView { + id: translationFileView + onLoaded: { + var textContent = "" + try { + textContent = text() + } catch (e) { + root.translations = {} + root.isLoading = false + return + } + + if (textContent.length === 0) { + root.translations = {} + root.isLoading = false + return + } + + try { + var jsonData = JSON.parse(textContent) + root.translations = jsonData + root.isLoading = false + } catch (e) { + root.translations = {} + root.isLoading = false + } + } + onLoadFailed: (error) => { + root.translations = {} + root.isLoading = false + } + } + + function detectSystemLanguage() { + var locale = Qt.locale().name + return locale + } + + function getLanguageCode() { + var configLang = "auto" + try { + configLang = ConfigOptions.language.ui + } catch (e) { + configLang = "auto" + } + + if (configLang === "auto") { + return detectSystemLanguage() + } else { + if (root.availableLanguages.indexOf(configLang) !== -1) { + return configLang + } else { + return detectSystemLanguage() + } + } + } + + function loadTranslations() { + if (root.isScanning) { + return + } + + var targetLang = getLanguageCode() + root.currentLanguage = targetLang + + // Use empty translations for English (default language) + if (targetLang === "en_US" || targetLang === "en") { + root.translations = {} + return + } + + // Check if target language is available + if (root.availableLanguages.indexOf(targetLang) === -1) { + root.currentLanguage = "en_US" + root.translations = {} + return + } + + // Load translation file + root.isLoading = true + var translationsPath = Qt.resolvedUrl(Directories.config + "/quickshell/translations/" + targetLang + ".json") + translationFileView.path = translationsPath + } + + function tr(text) { + if (!text) { + return "" + } + + var key = text.toString() + + if (root.isLoading) { + return key + } + + if (root.currentLanguage === "en_US" || root.currentLanguage === "en" || !root.translations) { + return key + } + + if (root.translations.hasOwnProperty(key)) { + var translation = root.translations[key] + if (translation && translation.toString().trim().length > 0) { + var str = translation.toString().trim() + if (str.endsWith("/*keep*/")) { + return str.substring(0, str.length - 8).trim() + } else { + return str + } + } else { + return translation.toString() + } + } + + return key // Fallback to key name + } + + function reloadTranslations() { + root.scanLanguages() + } + + function scanLanguages() { + var translationsDir = Qt.resolvedUrl(Directories.config + "/quickshell/translations/").toString().replace("file://", "") + root.isScanning = true + scanLanguagesProcess.running = true + } + + Component.onCompleted: { + root.scanLanguages() + } +} diff --git a/configs/quickshell/assets/icons/ai-openai-symbolic.svg b/configs/quickshell/assets/icons/ai-openai-symbolic.svg new file mode 100644 index 0000000..8ffc912 --- /dev/null +++ b/configs/quickshell/assets/icons/ai-openai-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/configs/quickshell/assets/icons/arch-symbolic.svg b/configs/quickshell/assets/icons/arch-symbolic.svg new file mode 100644 index 0000000..7de9094 --- /dev/null +++ b/configs/quickshell/assets/icons/arch-symbolic.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/cachyos-symbolic.svg b/configs/quickshell/assets/icons/cachyos-symbolic.svg new file mode 100644 index 0000000..4a9db19 --- /dev/null +++ b/configs/quickshell/assets/icons/cachyos-symbolic.svg @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/cloudflare-dns-symbolic.svg b/configs/quickshell/assets/icons/cloudflare-dns-symbolic.svg new file mode 100644 index 0000000..bd48d3c --- /dev/null +++ b/configs/quickshell/assets/icons/cloudflare-dns-symbolic.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/crosshair-symbolic.svg b/configs/quickshell/assets/icons/crosshair-symbolic.svg new file mode 100644 index 0000000..2296749 --- /dev/null +++ b/configs/quickshell/assets/icons/crosshair-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + ionicons-v5_logos + + + + ionicons-v5_logos + + + + + + diff --git a/configs/quickshell/assets/icons/debian-symbolic.svg b/configs/quickshell/assets/icons/debian-symbolic.svg new file mode 100644 index 0000000..252f853 --- /dev/null +++ b/configs/quickshell/assets/icons/debian-symbolic.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/deepseek-symbolic.svg b/configs/quickshell/assets/icons/deepseek-symbolic.svg new file mode 100644 index 0000000..029e126 --- /dev/null +++ b/configs/quickshell/assets/icons/deepseek-symbolic.svg @@ -0,0 +1,47 @@ + + + + + + + + + diff --git a/configs/quickshell/assets/icons/desktop-symbolic.svg b/configs/quickshell/assets/icons/desktop-symbolic.svg new file mode 100644 index 0000000..04f7a3b --- /dev/null +++ b/configs/quickshell/assets/icons/desktop-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/configs/quickshell/assets/icons/endeavouros-symbolic.svg b/configs/quickshell/assets/icons/endeavouros-symbolic.svg new file mode 100644 index 0000000..3be4cc4 --- /dev/null +++ b/configs/quickshell/assets/icons/endeavouros-symbolic.svg @@ -0,0 +1,96 @@ + + + + + EndeavourOS Logo + + + + image/svg+xml + + EndeavourOS Logo + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/fedora-symbolic.svg b/configs/quickshell/assets/icons/fedora-symbolic.svg new file mode 100644 index 0000000..1a4e8c8 --- /dev/null +++ b/configs/quickshell/assets/icons/fedora-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + + diff --git a/configs/quickshell/assets/icons/flatpak-symbolic.svg b/configs/quickshell/assets/icons/flatpak-symbolic.svg new file mode 100644 index 0000000..0c2bf62 --- /dev/null +++ b/configs/quickshell/assets/icons/flatpak-symbolic.svg @@ -0,0 +1,52 @@ + + + + + Flatpak + + + + + Flatpak + + + + diff --git a/configs/quickshell/assets/icons/github-symbolic.svg b/configs/quickshell/assets/icons/github-symbolic.svg new file mode 100644 index 0000000..c1c9f19 --- /dev/null +++ b/configs/quickshell/assets/icons/github-symbolic.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/configs/quickshell/assets/icons/google-gemini-symbolic.svg b/configs/quickshell/assets/icons/google-gemini-symbolic.svg new file mode 100644 index 0000000..9de741b --- /dev/null +++ b/configs/quickshell/assets/icons/google-gemini-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + ionicons-v5_logos + + + + + ionicons-v5_logos + + + + diff --git a/configs/quickshell/assets/icons/linux-symbolic.svg b/configs/quickshell/assets/icons/linux-symbolic.svg new file mode 100644 index 0000000..63f9c7e --- /dev/null +++ b/configs/quickshell/assets/icons/linux-symbolic.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/microsoft-symbolic.svg b/configs/quickshell/assets/icons/microsoft-symbolic.svg new file mode 100644 index 0000000..b90cfc6 --- /dev/null +++ b/configs/quickshell/assets/icons/microsoft-symbolic.svg @@ -0,0 +1,54 @@ + + + + + + + + + diff --git a/configs/quickshell/assets/icons/mistral-symbolic.svg b/configs/quickshell/assets/icons/mistral-symbolic.svg new file mode 100644 index 0000000..635b91d --- /dev/null +++ b/configs/quickshell/assets/icons/mistral-symbolic.svg @@ -0,0 +1,95 @@ + + diff --git a/configs/quickshell/assets/icons/nixos-symbolic.svg b/configs/quickshell/assets/icons/nixos-symbolic.svg new file mode 100644 index 0000000..b697b0d --- /dev/null +++ b/configs/quickshell/assets/icons/nixos-symbolic.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/nyarch-symbolic.svg b/configs/quickshell/assets/icons/nyarch-symbolic.svg new file mode 100644 index 0000000..56a3aaa --- /dev/null +++ b/configs/quickshell/assets/icons/nyarch-symbolic.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/ollama-symbolic.svg b/configs/quickshell/assets/icons/ollama-symbolic.svg new file mode 100644 index 0000000..0145481 --- /dev/null +++ b/configs/quickshell/assets/icons/ollama-symbolic.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/configs/quickshell/assets/icons/openai-symbolic.svg b/configs/quickshell/assets/icons/openai-symbolic.svg new file mode 100644 index 0000000..8ffc912 --- /dev/null +++ b/configs/quickshell/assets/icons/openai-symbolic.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/configs/quickshell/assets/icons/openrouter-symbolic.svg b/configs/quickshell/assets/icons/openrouter-symbolic.svg new file mode 100644 index 0000000..32aaaf5 --- /dev/null +++ b/configs/quickshell/assets/icons/openrouter-symbolic.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/configs/quickshell/assets/icons/spark-symbolic.svg b/configs/quickshell/assets/icons/spark-symbolic.svg new file mode 100644 index 0000000..9de741b --- /dev/null +++ b/configs/quickshell/assets/icons/spark-symbolic.svg @@ -0,0 +1,56 @@ + + + + + + + ionicons-v5_logos + + + + + ionicons-v5_logos + + + + diff --git a/configs/quickshell/assets/icons/ubuntu-symbolic.svg b/configs/quickshell/assets/icons/ubuntu-symbolic.svg new file mode 100644 index 0000000..07746c9 --- /dev/null +++ b/configs/quickshell/assets/icons/ubuntu-symbolic.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/quickshell/assets/images/default_wallpaper.png b/configs/quickshell/assets/images/default_wallpaper.png new file mode 100644 index 0000000000000000000000000000000000000000..77d890c21b201652214d41195a15bb586beac1be GIT binary patch literal 67685 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