diff --git a/ags/HyprPanel/.eslintignore b/ags/HyprPanel/.eslintignore new file mode 100644 index 0000000..980d7f4 --- /dev/null +++ b/ags/HyprPanel/.eslintignore @@ -0,0 +1,2 @@ +types +node_modules diff --git a/ags/HyprPanel/.eslintrc.js b/ags/HyprPanel/.eslintrc.js new file mode 100644 index 0000000..b650cfe --- /dev/null +++ b/ags/HyprPanel/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + tsconfigRootDir: __dirname, + sourceType: 'module', + }, + plugins: ['@typescript-eslint', 'import'], + extends: ['plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'], + root: true, + ignorePatterns: ['.eslintrc.js', 'types/**/*.ts', 'scripts/**/*.js'], + env: { + es6: true, + browser: true, + }, + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/explicit-module-boundary-types': 'error', + '@typescript-eslint/no-explicit-any': 'error', + 'import/extensions': ['off'], + 'import/no-unresolved': 'off', + quotes: ['error', 'single', { avoidEscape: true, allowTemplateLiterals: true }], + }, +}; diff --git a/ags/HyprPanel/.github/ISSUE_TEMPLATE/bug_report.md b/ags/HyprPanel/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..e41ef8d --- /dev/null +++ b/ags/HyprPanel/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help HyprPanel improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - Distribution: [e.g. Arch Linux] + - Window Manager/Desktop Environment: [e.g. Hyprland] + +**Additional context** +Add any other context about the problem here. diff --git a/ags/HyprPanel/.github/ISSUE_TEMPLATE/feature_request.md b/ags/HyprPanel/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/ags/HyprPanel/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/ags/HyprPanel/.github/workflows/ci.yml b/ags/HyprPanel/.github/workflows/ci.yml new file mode 100644 index 0000000..27ec51a --- /dev/null +++ b/ags/HyprPanel/.github/workflows/ci.yml @@ -0,0 +1,41 @@ +name: CI + +on: + pull_request: + branches: + - master + +jobs: + code_quality: + runs-on: ubuntu-latest + + steps: + - name: Checkout main repository + uses: actions/checkout@v3 + + - name: Clone ags-types to temp dir + uses: actions/checkout@v3 + with: + repository: Jas-SinghFSU/ags-types + path: temp-ags-types + + - name: Copy types to types/ + run: | + rm -rf types + mkdir -p types + cp -R temp-ags-types/types/* types/ + rm -rf temp-ags-types + + - name: Node Setup + uses: actions/setup-node@v3 + with: + node-version: '21' + + - name: Install Dependencies + run: npm install + + - name: ESLint + run: npm run lint + + - name: Type Check + run: npx tsc --noEmit --pretty --extendedDiagnostics diff --git a/ags/HyprPanel/.gitignore b/ags/HyprPanel/.gitignore new file mode 100644 index 0000000..9144fba --- /dev/null +++ b/ags/HyprPanel/.gitignore @@ -0,0 +1,2 @@ +.weather.json +node_modules diff --git a/ags/HyprPanel/.gitmodules b/ags/HyprPanel/.gitmodules new file mode 100644 index 0000000..b165aa5 --- /dev/null +++ b/ags/HyprPanel/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/ags-types"] + path = external/ags-types + url = https://github.com/Jas-SinghFSU/ags-types.git diff --git a/ags/HyprPanel/.prettierignore b/ags/HyprPanel/.prettierignore new file mode 100644 index 0000000..97843e6 --- /dev/null +++ b/ags/HyprPanel/.prettierignore @@ -0,0 +1,2 @@ +.eslintrc.js +types/**/*.ts diff --git a/ags/HyprPanel/.prettierrc b/ags/HyprPanel/.prettierrc new file mode 100644 index 0000000..6e88f12 --- /dev/null +++ b/ags/HyprPanel/.prettierrc @@ -0,0 +1,8 @@ +{ + "singleQuote": true, + "semi": true, + "trailingComma": "all", + "printWidth": 120, + "tabWidth": 4, + "useTabs": false +} diff --git a/ags/HyprPanel/LICENSE b/ags/HyprPanel/LICENSE new file mode 100644 index 0000000..75c0349 --- /dev/null +++ b/ags/HyprPanel/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Jas Singh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ags/HyprPanel/README.md b/ags/HyprPanel/README.md new file mode 100644 index 0000000..bca09ea --- /dev/null +++ b/ags/HyprPanel/README.md @@ -0,0 +1,317 @@ +

+ + Hyprpanel logo + +

+
+

+ wiki + discord chat +

+
+ +# HyprPanel 🚀 + +A panel built for Hyprland with [AGS](https://github.com/Aylur/ags) + +![HyprPanel1](./assets/hp1.png) +![HyprPanel2](./assets/hp2.png) + +## Installation + +The [HyprPanel Wiki](https://hyprpanel.com/getting_started/installation.html) contains in depth instructions for installing the panel and all of its dependencies. The instructions below are general instructions for installing the panel. + +## Requirements + +Bun + +```sh +curl -fsSL https://bun.sh/install | bash && \ + sudo ln -s $HOME/.bun/bin/bun /usr/local/bin/bun +``` + +Additional dependencies: + +```sh +pipewire +libgtop +bluez +bluez-utils +grimblast +gpu-screen-recorder +hyprpicker +btop +networkmanager +matugen +wl-clipboard +swww +dart-sass +brightnessctl +gnome-bluetooth-3.0 +``` + +Optional Dependencies: + +```sh +## Used for Tracking GPU Usage in your Dashboard (NVidia only) +python +python-gpustat + +## Only if a pywal hook from wallpaper changes applied through settings is desired +pywal + +## To check for pacman updates in the default script used in the updates module +pacman-contrib + +## To switch between power profiles in battery module +power-profiles-daemon +``` + +### Arch + +pacman: + +```bash +sudo pacman -S pipewire libgtop bluez bluez-utils btop networkmanager dart-sass wl-clipboard brightnessctl swww python gnome-bluetooth-3.0 pacman-contrib power-profiles-daemon +``` + +AUR: + +```bash +yay -S grimblast-git gpu-screen-recorder hyprpicker matugen-bin python-gpustat aylurs-gtk-shell-git +``` + +### Fedora + +COPR - Add [solopasha/hyprland](https://copr.fedorainfracloud.org/coprs/solopasha/hyprland/) for most hyprland-related dependencies, and [hues-sueh/packages](https://copr.fedorainfracloud.org/coprs/heus-sueh/packages/) for matugen. Both provide the `swww` package, so prioritise the former repo: + +```bash +sudo dnf copr enable solopasha/hyprland +sudo dnf copr enable heus-sueh/packages +sudo dnf config-manager --save --setopt=copr:copr.fedorainfracloud.org:heus-sueh:packages.priority=200 +``` + +DNF: + +```bash +sudo dnf install pipewire libgtop2 bluez bluez-tools grimblast hyprpicker btop NetworkManager wl-clipboard swww brightnessctl gnome-bluetooth aylurs-gtk-shell power-profiles-daemon gvfs +``` + +bun: + +```bash +bun install -g sass +``` + +flatpak: + +```bash +flatpak install flathub --system com.dec05eba.gpu_screen_recorder +``` + +#### Optional Dependencies + +pip: + +```bash +sudo dnf install python python3-pip; pip install gpustat pywal +``` + +### NixOS + +For NixOS/Home-Manager, see [NixOS & Home-Manager instructions](#nixos--home-manager). + +## Instructions + +### AGS + +Once everything is installed you need to put the contents of this repo in `~/.config/ags`. +If you already have something in `~/.config/ags`, it's recommended that you back it up with: + +```bash +mv $HOME/.config/ags $HOME/.config/ags.bkup +``` + +Otherwise you can use this command to install the panel: + +```bash +git clone https://github.com/Jas-SinghFSU/HyprPanel.git && \ + ln -s $(pwd)/HyprPanel $HOME/.config/ags +``` + +### Nerd Fonts + +Additionally, you need to ensure that you have a [Nerd Font](https://www.nerdfonts.com/font-downloads) installed for your icons to render properly. + +### Launch the panel + +Afterwards you can run the panel with the following command in your terminal: + +```bash +ags +``` + +Or you can add it to your Hyprland config (hyprland.conf) to auto-start with: + +```bash +exec-once = ags +``` + +### NixOS & Home-Manager + +Alternatively, if you're using NixOS and/or Home-Manager, you can setup AGS using the provided Nix Flake. First, add the repository to your Flake's inputs, and enable the overlay. + +```nix +# flake.nix + +{ + inputs.hyprpanel.url = "github:Jas-SinghFSU/HyprPanel"; + # ... + + outputs = { self, nixpkgs, ... }@inputs: + let + # ... + system = "x86_64-linux"; # change to whatever your system should be. + pkgs = import nixpkgs { + inherit system; + # ... + overlays = [ + inputs.hyprpanel.overlay + ]; + }; + in { + # ... + } +} +``` + +Once you've set up the overlay, you can reference HyprPanel with `pkgs.hyprpanel` as if it were any other Nix package. This means you can reference it as a NixOS system/user package, a Home-Manager user package, or as a direct reference in your Hyprland configuration (if your configuration is managed by Home-Manager). The first three methods will add it to your `$PATH` (first globally, second two user-only), however the final will not. + +```nix +# configuration.nix + +# install it as a system package +environment.systemPackages = with pkgs; [ + # ... + hyprpanel + # ... +]; + +# or install it as a user package +users.users..packages = with pkgs; [ + # ... + hyprpanel + # ... +]; + + +# home.nix + +# install it as a user package with home-manager +home.packages = with pkgs; [ + # ... + hyprpanel + # ... +]; + +# or reference it directly in your Hyprland configuration +wayland.windowManager.hyprland.settings.exec-once = [ + "${pkgs.hyprpanel}/bin/hyprpanel" +]; + +``` + +### Notifications + +HyprPanel handles notifications through the AGS built-in notification service. If you're already using a notification daemon such as Dunst or Mako, you may have to stop them to prevent conflicts with HyprPanel. + +> NOTE: If your system is in a language other than English, the resource monitor in the dashboard may not work properly. + +## Configuration + +The HyprPanel comes with a configuration menu which is available by opening the Dashboard menu (click the button in the bar with the default - Arch - icon) and then clicking the Gear icon. + +### Size + +The panel is automatically scaled based on your font size in `Configuration > General`. + +### Specifying bar layouts per monitor + +To specify layouts for each monitor you can create a JSON object such as: + +```JSON +{ + "0": { + "left": [ + "dashboard", + "workspaces", + "windowtitle" + ], + "middle": [ + "media" + ], + "right": [ + "volume", + "clock", + "notifications" + ] + }, + "1": { + "left": [ + "dashboard", + "workspaces", + "windowtitle" + ], + "middle": [ + "media" + ], + "right": [ + "volume", + "clock", + "notifications" + ] + }, + "2": { + "left": [ + "dashboard", + "workspaces", + "windowtitle" + ], + "middle": [ + "media" + ], + "right": [ + "volume", + "network", + "bluetooth", + "systray", + "clock", + "notifications" + ] + } +} +``` + +Where each monitor is defined by its index (0, 1, 2 in this case) and each section (left, middle, right) contains one or more of the following modules: + +```js +'battery'; +'dashboard'; +'workspaces'; +'windowtitle'; +'media'; +'notifications'; +'volume'; +'network'; +'bluetooth'; +'clock'; +'systray'; +``` + +Since the text-box in the options dialog isn't sufficient, it is recommended that you create this JSON configuration in a text editor elsewhere and paste it into the layout text-box under Configuration > Bar > "Bar Layouts for Monitors". + +### Additional Configuration + +#### GPU Tracking + +If you have an NVidia GPU, you can track your GPU usage in your Dashboard by going to your `Settings > Configuration > Dashboard Menu > Track GPU` and turning it on. diff --git a/ags/HyprPanel/assets/21210205.png b/ags/HyprPanel/assets/21210205.png new file mode 100644 index 0000000..c1f3edc Binary files /dev/null and b/ags/HyprPanel/assets/21210205.png differ diff --git a/ags/HyprPanel/assets/HyprPanel.png b/ags/HyprPanel/assets/HyprPanel.png new file mode 100644 index 0000000..3ea158a Binary files /dev/null and b/ags/HyprPanel/assets/HyprPanel.png differ diff --git a/ags/HyprPanel/assets/Mocha_Wolf.png b/ags/HyprPanel/assets/Mocha_Wolf.png new file mode 100644 index 0000000..219857c Binary files /dev/null and b/ags/HyprPanel/assets/Mocha_Wolf.png differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf new file mode 100644 index 0000000..3bed27f Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Bold.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf new file mode 100644 index 0000000..99cfe5b Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraBold.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraLight.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraLight.ttf new file mode 100644 index 0000000..1e8103b Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-ExtraLight.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Light.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Light.ttf new file mode 100644 index 0000000..82dcd0b Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Light.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Medium.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Medium.ttf new file mode 100644 index 0000000..d134c56 Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Medium.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Regular.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Regular.ttf new file mode 100644 index 0000000..de31c48 Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Regular.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-SemiBold.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-SemiBold.ttf new file mode 100644 index 0000000..059f6b3 Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-SemiBold.ttf differ diff --git a/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Thin.ttf b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Thin.ttf new file mode 100644 index 0000000..8aad716 Binary files /dev/null and b/ags/HyprPanel/assets/fonts/JetBrainsMonoNerdFontPropo-Thin.ttf differ diff --git a/ags/HyprPanel/assets/hp1.png b/ags/HyprPanel/assets/hp1.png new file mode 100644 index 0000000..e42b363 Binary files /dev/null and b/ags/HyprPanel/assets/hp1.png differ diff --git a/ags/HyprPanel/assets/hp2.png b/ags/HyprPanel/assets/hp2.png new file mode 100644 index 0000000..a912e32 Binary files /dev/null and b/ags/HyprPanel/assets/hp2.png differ diff --git a/ags/HyprPanel/assets/hyprpanel.png b/ags/HyprPanel/assets/hyprpanel.png new file mode 100644 index 0000000..b4707c0 Binary files /dev/null and b/ags/HyprPanel/assets/hyprpanel.png differ diff --git a/ags/HyprPanel/assets/solar_system_mocha.png b/ags/HyprPanel/assets/solar_system_mocha.png new file mode 100644 index 0000000..14ca154 Binary files /dev/null and b/ags/HyprPanel/assets/solar_system_mocha.png differ diff --git a/ags/HyprPanel/config.js b/ags/HyprPanel/config.js new file mode 100644 index 0000000..01d6ae8 --- /dev/null +++ b/ags/HyprPanel/config.js @@ -0,0 +1,58 @@ +import GLib from 'gi://GLib'; + +const main = '/tmp/ags/hyprpanel/main.js'; +const entry = `${App.configDir}/main.ts`; +const bundler = GLib.getenv('AGS_BUNDLER') || 'bun'; + +const v = { + ags: pkg.version?.split('.').map(Number) || [], + expect: [1, 8, 1], +}; + +try { + switch (bundler) { + case 'bun': + await Utils.execAsync([ + 'bun', + 'build', + entry, + '--outfile', + main, + '--external', + 'resource://*', + '--external', + 'gi://*', + '--external', + 'file://*', + ]); + break; + + case 'esbuild': + await Utils.execAsync([ + 'esbuild', + '--bundle', + entry, + '--format=esm', + `--outfile=${main}`, + '--external:resource://*', + '--external:gi://*', + '--external:file://*', + ]); + break; + + default: + throw `"${bundler}" is not a valid bundler`; + } + + if (v.ags[1] < v.expect[1] || v.ags[2] < v.expect[2]) { + print(`HyprPanel needs atleast v${v.expect.join('.')} of AGS, yours is v${v.ags.join('.')}`); + App.quit(); + } + + await import(`file://${main}`); +} catch (error) { + console.error(error); + App.quit(); +} + +export {}; diff --git a/ags/HyprPanel/customModules/PollVar.ts b/ags/HyprPanel/customModules/PollVar.ts new file mode 100644 index 0000000..2381e89 --- /dev/null +++ b/ags/HyprPanel/customModules/PollVar.ts @@ -0,0 +1,77 @@ +import GLib from 'gi://GLib?version=2.0'; +import { GenericFunction } from 'lib/types/customModules/generic'; +import { Bind } from 'lib/types/variable'; +import { Variable as VariableType } from 'types/variable'; + +/** + * @param {VariableType} targetVariable - The Variable to update with the function's result. + * @param {Array} trackers - Array of trackers to watch. + * @param {Bind} pollingInterval - The polling interval in milliseconds. + * @param {GenericFunction} someFunc - The function to execute at each interval, which updates the Variable. + * @param {...P} params - Parameters to pass to someFunc. + */ +export const pollVariable = >( + targetVariable: VariableType, + trackers: Array, + pollingInterval: Bind, + someFunc: F, + ...params: P +): void => { + let intervalInstance: number | null = null; + + const intervalFn = (pollIntrvl: number): void => { + if (intervalInstance !== null) { + GLib.source_remove(intervalInstance); + } + + intervalInstance = Utils.interval(pollIntrvl, () => { + targetVariable.value = someFunc(...params); + }); + }; + + Utils.merge([pollingInterval, ...trackers], (pollIntrvl: number) => { + intervalFn(pollIntrvl); + }); +}; + +/** + * @param {VariableType} targetVariable - The Variable to update with the result of the command. + * @param {Array} trackers - Array of trackers to watch. + * @param {Bind} pollingInterval - The polling interval in milliseconds. + * @param {string} someCommand - The bash command to execute. + * @param {GenericFunction} someFunc - The function to execute after processing the command result; + * with the first argument being the result of the command execution. + * @param {...P} params - Additional parameters to pass to someFunc. + */ +export const pollVariableBash = >( + targetVariable: VariableType, + trackers: Array, + pollingInterval: Bind, + someCommand: string, + someFunc: F, + ...params: P +): void => { + let intervalInstance: number | null = null; + + const intervalFn = (pollIntrvl: number): void => { + if (intervalInstance !== null) { + GLib.source_remove(intervalInstance); + } + + intervalInstance = Utils.interval(pollIntrvl, () => { + Utils.execAsync(`bash -c "${someCommand}"`) + .then((res: string) => { + try { + targetVariable.value = someFunc(res, ...params); + } catch (error) { + console.warn(`An error occurred when running interval bash function: ${error}`); + } + }) + .catch((err) => console.error(`Error running command "${someCommand}": ${err}`)); + }); + }; + + Utils.merge([pollingInterval, ...trackers], (pollIntrvl: number) => { + intervalFn(pollIntrvl); + }); +}; diff --git a/ags/HyprPanel/customModules/config.ts b/ags/HyprPanel/customModules/config.ts new file mode 100644 index 0000000..36e2c4c --- /dev/null +++ b/ags/HyprPanel/customModules/config.ts @@ -0,0 +1,595 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, GtkWidget } from 'lib/types/widget'; + +export const CustomModuleSettings = (): Scrollable => + Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page customModules paged-container', + child: Widget.Box({ + class_name: 'menu-theme-page paged-container', + vertical: true, + children: [ + /* + ************************************ + * GENERAL * + ************************************ + */ + Header('General'), + Option({ + opt: options.bar.customModules.scrollSpeed, + title: 'Scrolling Speed', + type: 'number', + }), + + /* + ************************************ + * RAM * + ************************************ + */ + Header('RAM'), + Option({ + opt: options.theme.bar.buttons.modules.ram.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.ram.icon, + title: 'Ram Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.ram.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.modules.ram.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.ram.labelType, + title: 'Label Type', + type: 'enum', + enums: ['used/total', 'used', 'free', 'percentage'], + }), + Option({ + opt: options.bar.customModules.ram.round, + title: 'Round', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.ram.pollingInterval, + title: 'Polling Interval', + type: 'number', + min: 100, + max: 60 * 24 * 1000, + increment: 1000, + }), + Option({ + opt: options.bar.customModules.ram.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.ram.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.ram.middleClick, + title: 'Middle Click', + type: 'string', + }), + + /* + ************************************ + * CPU * + ************************************ + */ + Header('CPU'), + Option({ + opt: options.theme.bar.buttons.modules.cpu.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.cpu.icon, + title: 'Cpu Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.cpu.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.modules.cpu.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.cpu.round, + title: 'Round', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.cpu.pollingInterval, + title: 'Polling Interval', + type: 'number', + min: 100, + max: 60 * 24 * 1000, + increment: 1000, + }), + Option({ + opt: options.bar.customModules.cpu.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.cpu.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.cpu.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.cpu.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.customModules.cpu.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ************************************ + * STORAGE * + ************************************ + */ + Header('Storage'), + Option({ + opt: options.theme.bar.buttons.modules.storage.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.storage.icon, + title: 'Storage Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.storage.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.modules.storage.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.storage.labelType, + title: 'Label Type', + type: 'enum', + enums: ['used/total', 'used', 'free', 'percentage'], + }), + Option({ + opt: options.bar.customModules.storage.round, + title: 'Round', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.storage.pollingInterval, + title: 'Polling Interval', + type: 'number', + min: 100, + max: 60 * 24 * 1000, + increment: 1000, + }), + Option({ + opt: options.bar.customModules.storage.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.storage.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.storage.middleClick, + title: 'Middle Click', + type: 'string', + }), + + /* + ************************************ + * NETSTAT * + ************************************ + */ + Header('Netstat'), + Option({ + opt: options.theme.bar.buttons.modules.netstat.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.netstat.networkInterface, + title: 'Network Interface', + subtitle: + "Name of the network interface to poll.\nHINT: Get list of interfaces with 'cat /proc/net/dev'", + type: 'string', + }), + Option({ + opt: options.bar.customModules.netstat.icon, + title: 'Netstat Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.netstat.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.netstat.rateUnit, + title: 'Rate Unit', + type: 'enum', + enums: ['GiB', 'MiB', 'KiB', 'auto'], + }), + Option({ + opt: options.theme.bar.buttons.modules.netstat.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.netstat.labelType, + title: 'Label Type', + type: 'enum', + enums: ['full', 'in', 'out'], + }), + Option({ + opt: options.bar.customModules.netstat.round, + title: 'Round', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.netstat.pollingInterval, + title: 'Polling Interval', + type: 'number', + min: 100, + max: 60 * 24 * 1000, + increment: 1000, + }), + Option({ + opt: options.bar.customModules.netstat.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.netstat.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.netstat.middleClick, + title: 'Middle Click', + type: 'string', + }), + + /* + ************************************ + * KEYBOARD LAYOUT * + ************************************ + */ + Header('Keyboard Layout'), + Option({ + opt: options.theme.bar.buttons.modules.kbLayout.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.kbLayout.icon, + title: 'Keyboard Layout Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.kbLayout.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.kbLayout.labelType, + title: 'Label Type', + type: 'enum', + enums: ['layout', 'code'], + }), + Option({ + opt: options.theme.bar.buttons.modules.kbLayout.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.kbLayout.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.kbLayout.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.kbLayout.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.kbLayout.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.customModules.kbLayout.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ************************************ + * UPDATES * + ************************************ + */ + Header('Updates'), + Option({ + opt: options.theme.bar.buttons.modules.updates.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.updates.updateCommand, + title: 'Check Updates Command', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.icon, + title: 'Updates Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.updates.padZero, + title: 'Pad with 0', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.modules.updates.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.pollingInterval, + title: 'Polling Interval', + type: 'number', + subtitle: "WARNING: Be careful of your package manager's rate limit.", + min: 100, + max: 60 * 24 * 1000, + increment: 1000, + }), + Option({ + opt: options.bar.customModules.updates.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.customModules.updates.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ************************************ + * SUBMAP * + ************************************ + */ + Header('Submap'), + Option({ + opt: options.theme.bar.buttons.modules.submap.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.submap.showSubmapName, + title: 'Show Submap Name', + subtitle: + 'When enabled, the name of the current submap will be displayed' + + ' instead of the Submap Enabled or Disabled text.', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.submap.enabledIcon, + title: 'Enabled Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.disabledIcon, + title: 'Disabled Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.enabledText, + title: 'Enabled Text', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.disabledText, + title: 'Disabled Text', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.modules.submap.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.customModules.submap.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ************************************ + * WEATHER * + ************************************ + */ + Header('Weather'), + Option({ + opt: options.theme.bar.buttons.modules.weather.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.weather.label, + title: 'Show Label', + type: 'boolean', + }), + Option({ + opt: options.bar.customModules.weather.unit, + title: 'Units', + type: 'enum', + enums: ['imperial', 'metric'], + }), + Option({ + opt: options.theme.bar.buttons.modules.weather.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.weather.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.weather.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.weather.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.weather.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.customModules.weather.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ************************************ + * POWER * + ************************************ + */ + Header('Power'), + Option({ + opt: options.theme.bar.buttons.modules.power.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.modules.power.spacing, + title: 'Spacing', + type: 'string', + }), + Option({ + opt: options.bar.customModules.power.icon, + title: 'Power Button Icon', + type: 'string', + }), + Option({ + opt: options.bar.customModules.power.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.power.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.power.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.customModules.power.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.customModules.power.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + ], + }), + }); diff --git a/ags/HyprPanel/customModules/cpu/computeCPU.ts b/ags/HyprPanel/customModules/cpu/computeCPU.ts new file mode 100644 index 0000000..460b1db --- /dev/null +++ b/ags/HyprPanel/customModules/cpu/computeCPU.ts @@ -0,0 +1,20 @@ +// @ts-expect-error: This import is a special directive that tells the compiler to use the GTop library +import GTop from 'gi://GTop'; + +let previousCpuData = new GTop.glibtop_cpu(); +GTop.glibtop_get_cpu(previousCpuData); + +export const computeCPU = (): number => { + const currentCpuData = new GTop.glibtop_cpu(); + GTop.glibtop_get_cpu(currentCpuData); + + // Calculate the differences from the previous to current data + const totalDiff = currentCpuData.total - previousCpuData.total; + const idleDiff = currentCpuData.idle - previousCpuData.idle; + + const cpuUsagePercentage = totalDiff > 0 ? ((totalDiff - idleDiff) / totalDiff) * 100 : 0; + + previousCpuData = currentCpuData; + + return cpuUsagePercentage; +}; diff --git a/ags/HyprPanel/customModules/cpu/index.ts b/ags/HyprPanel/customModules/cpu/index.ts new file mode 100644 index 0000000..a3848e4 --- /dev/null +++ b/ags/HyprPanel/customModules/cpu/index.ts @@ -0,0 +1,69 @@ +import options from 'options'; + +// Module initializer +import { module } from '../module'; + +import Button from 'types/widgets/button'; + +// Utility Methods +import { inputHandler } from 'customModules/utils'; +import { computeCPU } from './computeCPU'; +import { pollVariable } from 'customModules/PollVar'; +import { BarBoxChild } from 'lib/types/bar'; +import { Attribute, Child } from 'lib/types/widget'; + +// All the user configurable options for the cpu module that are needed +const { label, round, leftClick, rightClick, middleClick, scrollUp, scrollDown, pollingInterval, icon } = + options.bar.customModules.cpu; + +export const cpuUsage = Variable(0); + +pollVariable( + // Variable to poll and update with the result of the function passed in + cpuUsage, + // Variables that should trigger the polling function to update when they change + [round.bind('value')], + // Interval at which to poll + pollingInterval.bind('value'), + // Function to execute to get the network data + computeCPU, +); + +export const Cpu = (): BarBoxChild => { + const renderLabel = (cpuUsg: number, rnd: boolean): string => { + return rnd ? `${Math.round(cpuUsg)}%` : `${cpuUsg.toFixed(2)}%`; + }; + + const cpuModule = module({ + textIcon: icon.bind('value'), + label: Utils.merge([cpuUsage.bind('value'), round.bind('value')], (cpuUsg, rnd) => { + return renderLabel(cpuUsg, rnd); + }), + tooltipText: 'CPU', + boxClass: 'cpu', + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + cmd: scrollUp, + }, + onScrollDown: { + cmd: scrollDown, + }, + }); + }, + }, + }); + + return cpuModule; +}; diff --git a/ags/HyprPanel/customModules/kblayout/getLayout.ts b/ags/HyprPanel/customModules/kblayout/getLayout.ts new file mode 100644 index 0000000..9c42071 --- /dev/null +++ b/ags/HyprPanel/customModules/kblayout/getLayout.ts @@ -0,0 +1,28 @@ +import { + HyprctlDeviceLayout, + HyprctlKeyboard, + KbLabelType, + LayoutKeys, + LayoutValues, +} from 'lib/types/customModules/kbLayout'; +import { layoutMap } from './layouts'; + +export const getKeyboardLayout = (obj: string, format: KbLabelType): LayoutKeys | LayoutValues => { + const hyprctlDevices: HyprctlDeviceLayout = JSON.parse(obj); + const keyboards = hyprctlDevices['keyboards']; + + if (keyboards.length === 0) { + return format === 'code' ? 'Unknown' : 'Unknown Layout'; + } + + let mainKb = keyboards.find((kb: HyprctlKeyboard) => kb.main); + + if (!mainKb) { + mainKb = keyboards[keyboards.length - 1]; + } + + const layout: LayoutKeys = mainKb['active_keymap'] as LayoutKeys; + const foundLayout: LayoutValues = layoutMap[layout]; + + return format === 'code' ? foundLayout || layout : layout; +}; diff --git a/ags/HyprPanel/customModules/kblayout/index.ts b/ags/HyprPanel/customModules/kblayout/index.ts new file mode 100644 index 0000000..8c566e5 --- /dev/null +++ b/ags/HyprPanel/customModules/kblayout/index.ts @@ -0,0 +1,73 @@ +const hyprland = await Service.import('hyprland'); + +import options from 'options'; +import { module } from '../module'; + +import { inputHandler } from 'customModules/utils'; +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0'; +import Button from 'types/widgets/button'; +import Label from 'types/widgets/label'; +import { getKeyboardLayout } from './getLayout'; +import { BarBoxChild } from 'lib/types/bar'; +import { Attribute, Child } from 'lib/types/widget'; + +const { label, labelType, icon, leftClick, rightClick, middleClick, scrollUp, scrollDown } = + options.bar.customModules.kbLayout; + +export const KbInput = (): BarBoxChild => { + const keyboardModule = module({ + textIcon: icon.bind('value'), + tooltipText: '', + labelHook: (self: Label): void => { + self.hook( + hyprland, + () => { + Utils.execAsync('hyprctl devices -j') + .then((obj) => { + self.label = getKeyboardLayout(obj, labelType.value); + }) + .catch((err) => { + console.error(err); + }); + }, + 'keyboard-layout', + ); + + self.hook(labelType, () => { + Utils.execAsync('hyprctl devices -j') + .then((obj) => { + self.label = getKeyboardLayout(obj, labelType.value); + }) + .catch((err) => { + console.error(err); + }); + }); + }, + + boxClass: 'kblayout', + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + cmd: scrollUp, + }, + onScrollDown: { + cmd: scrollDown, + }, + }); + }, + }, + }); + + return keyboardModule; +}; diff --git a/ags/HyprPanel/customModules/kblayout/layouts.ts b/ags/HyprPanel/customModules/kblayout/layouts.ts new file mode 100644 index 0000000..ccd37c6 --- /dev/null +++ b/ags/HyprPanel/customModules/kblayout/layouts.ts @@ -0,0 +1,585 @@ +export const layoutMap = { + 'Abkhazian (Russia)': 'RU (Ab)', + Akan: 'GH (Akan)', + Albanian: 'AL', + 'Albanian (Plisi)': 'AL (Plisi)', + 'Albanian (Veqilharxhi)': 'AL (Veqilharxhi)', + Amharic: 'ET', + Arabic: 'ARA', + 'Arabic (Algeria)': 'DZ (Ar)', + 'Arabic (AZERTY, Eastern Arabic numerals)': 'ARA (Azerty Digits)', + 'Arabic (AZERTY)': 'ARA (Azerty)', + 'Arabic (Buckwalter)': 'ARA (Buckwalter)', + 'Arabic (Eastern Arabic numerals)': 'ARA (Digits)', + 'Arabic (Macintosh)': 'ARA (Mac)', + 'Arabic (Morocco)': 'MA', + 'Arabic (OLPC)': 'ARA (Olpc)', + 'Arabic (Pakistan)': 'PK (Ara)', + 'Arabic (QWERTY, Eastern Arabic numerals)': 'ARA (Qwerty Digits)', + 'Arabic (QWERTY)': 'ARA (Qwerty)', + 'Arabic (Syria)': 'SY', + Armenian: 'AM', + 'Armenian (alt. eastern)': 'AM (Eastern-Alt)', + 'Armenian (alt. phonetic)': 'AM (Phonetic-Alt)', + 'Armenian (eastern)': 'AM (Eastern)', + 'Armenian (phonetic)': 'AM (Phonetic)', + 'Armenian (western)': 'AM (Western)', + 'Asturian (Spain, with bottom-dot H and L)': 'ES (Ast)', + Avatime: 'GH (Avn)', + Azerbaijani: 'AZ', + 'Azerbaijani (Cyrillic)': 'AZ (Cyrillic)', + 'Azerbaijani (Iran)': 'IR (Azb)', + Bambara: 'ML', + Bangla: 'BD', + 'Bangla (India, Baishakhi InScript)': 'IN (Ben Inscript)', + 'Bangla (India, Baishakhi)': 'IN (Ben Baishakhi)', + 'Bangla (India, Bornona)': 'IN (Ben Bornona)', + 'Bangla (India, Gitanjali)': 'IN (Ben Gitanjali)', + 'Bangla (India, Probhat)': 'IN (Ben Probhat)', + 'Bangla (India)': 'IN (Ben)', + 'Bangla (Probhat)': 'BD (Probhat)', + Bashkirian: 'RU (Bak)', + Belarusian: 'BY', + 'Belarusian (intl.)': 'BY (Intl)', + 'Belarusian (Latin)': 'BY (Latin)', + 'Belarusian (legacy)': 'BY (Legacy)', + 'Belarusian (phonetic)': 'BY (Phonetic)', + Belgian: 'BE', + 'Belgian (alt.)': 'BE (Oss)', + 'Belgian (ISO, alt.)': 'BE (Iso-Alternate)', + 'Belgian (Latin-9 only, alt.)': 'BE (Oss Latin9)', + 'Belgian (no dead keys)': 'BE (Nodeadkeys)', + 'Belgian (Wang 724 AZERTY)': 'BE (Wang)', + 'Berber (Algeria, Latin)': 'DZ', + 'Berber (Algeria, Tifinagh)': 'DZ (Ber)', + 'Berber (Morocco, Tifinagh alt.)': 'MA (Tifinagh-Alt)', + 'Berber (Morocco, Tifinagh extended phonetic)': 'MA (Tifinagh-Extended-Phonetic)', + 'Berber (Morocco, Tifinagh extended)': 'MA (Tifinagh-Extended)', + 'Berber (Morocco, Tifinagh phonetic, alt.)': 'MA (Tifinagh-Alt-Phonetic)', + 'Berber (Morocco, Tifinagh phonetic)': 'MA (Tifinagh-Phonetic)', + 'Berber (Morocco, Tifinagh)': 'MA (Tifinagh)', + Bosnian: 'BA', + 'Bosnian (US, with Bosnian digraphs)': 'BA (Unicodeus)', + 'Bosnian (US)': 'BA (Us)', + 'Bosnian (with Bosnian digraphs)': 'BA (Unicode)', + 'Bosnian (with guillemets)': 'BA (Alternatequotes)', + Braille: 'BRAI', + 'Braille (left-handed inverted thumb)': 'BRAI (Left Hand Invert)', + 'Braille (left-handed)': 'BRAI (Left Hand)', + 'Braille (right-handed inverted thumb)': 'BRAI (Right Hand Invert)', + 'Braille (right-handed)': 'BRAI (Right Hand)', + 'Breton (France)': 'FR (Bre)', + Bulgarian: 'BG', + 'Bulgarian (enhanced)': 'BG (Bekl)', + 'Bulgarian (new phonetic)': 'BG (Bas Phonetic)', + 'Bulgarian (traditional phonetic)': 'BG (Phonetic)', + Burmese: 'MM', + 'Burmese Zawgyi': 'MM (Zawgyi)', + 'Cameroon (AZERTY, intl.)': 'CM (Azerty)', + 'Cameroon (Dvorak, intl.)': 'CM (Dvorak)', + 'Cameroon Multilingual (QWERTY, intl.)': 'CM (Qwerty)', + 'Canadian (CSA)': 'CA (Multix)', + 'Catalan (Spain, with middle-dot L)': 'ES (Cat)', + Cherokee: 'US (Chr)', + Chinese: 'CN', + Chuvash: 'RU (Cv)', + 'Chuvash (Latin)': 'RU (Cv Latin)', + CloGaelach: 'IE (CloGaelach)', + 'Crimean Tatar (Turkish Alt-Q)': 'UA (Crh Alt)', + 'Crimean Tatar (Turkish F)': 'UA (Crh F)', + 'Crimean Tatar (Turkish Q)': 'UA (Crh)', + Croatian: 'HR', + 'Croatian (US, with Croatian digraphs)': 'HR (Unicodeus)', + 'Croatian (US)': 'HR (Us)', + 'Croatian (with Croatian digraphs)': 'HR (Unicode)', + 'Croatian (with guillemets)': 'HR (Alternatequotes)', + Czech: 'CZ', + 'Czech (QWERTY, extended backslash)': 'CZ (Qwerty Bksl)', + 'Czech (QWERTY, Macintosh)': 'CZ (Qwerty-Mac)', + 'Czech (QWERTY)': 'CZ (Qwerty)', + 'Czech (UCW, only accented letters)': 'CZ (Ucw)', + 'Czech (US, Dvorak, UCW support)': 'CZ (Dvorak-Ucw)', + 'Czech (with <\\|> key)': 'CZ (Bksl)', + Danish: 'DK', + 'Danish (Dvorak)': 'DK (Dvorak)', + 'Danish (Macintosh, no dead keys)': 'DK (Mac Nodeadkeys)', + 'Danish (Macintosh)': 'DK (Mac)', + 'Danish (no dead keys)': 'DK (Nodeadkeys)', + 'Danish (Windows)': 'DK (Winkeys)', + Dari: 'AF', + 'Dari (Afghanistan, OLPC)': 'AF (Fa-Olpc)', + Dhivehi: 'MV', + Dutch: 'NL', + 'Dutch (Macintosh)': 'NL (Mac)', + 'Dutch (standard)': 'NL (Std)', + 'Dutch (US)': 'NL (Us)', + Dzongkha: 'BT', + 'English (Australian)': 'AU', + 'English (Cameroon)': 'CM', + 'English (Canada)': 'CA (Eng)', + 'English (classic Dvorak)': 'US (Dvorak-Classic)', + 'English (Colemak-DH ISO)': 'US (Colemak Dh Iso)', + 'English (Colemak-DH)': 'US (Colemak Dh)', + 'English (Colemak)': 'US (Colemak)', + 'English (Dvorak, alt. intl.)': 'US (Dvorak-Alt-Intl)', + 'English (Dvorak, intl., with dead keys)': 'US (Dvorak-Intl)', + 'English (Dvorak, left-handed)': 'US (Dvorak-L)', + 'English (Dvorak, Macintosh)': 'US (Dvorak-Mac)', + 'English (Dvorak, right-handed)': 'US (Dvorak-R)', + 'English (Dvorak)': 'US (Dvorak)', + 'English (Ghana, GILLBT)': 'GH (Gillbt)', + 'English (Ghana, multilingual)': 'GH (Generic)', + 'English (Ghana)': 'GH', + 'English (India, with rupee)': 'IN (Eng)', + 'English (intl., with AltGr dead keys)': 'US (Altgr-Intl)', + 'English (Macintosh)': 'US (Mac)', + 'English (Mali, US, intl.)': 'ML (Us-Intl)', + 'English (Mali, US, Macintosh)': 'ML (Us-Mac)', + 'English (Nigeria)': 'NG', + 'English (Norman)': 'US (Norman)', + 'English (programmer Dvorak)': 'US (Dvp)', + 'English (South Africa)': 'ZA', + 'English (the divide/multiply toggle the layout)': 'US (Olpc2)', + 'English (UK, Colemak-DH)': 'GB (Colemak Dh)', + 'English (UK, Colemak)': 'GB (Colemak)', + 'English (UK, Dvorak, with UK punctuation)': 'GB (Dvorakukp)', + 'English (UK, Dvorak)': 'GB (Dvorak)', + 'English (UK, extended, Windows)': 'GB (Extd)', + 'English (UK, intl., with dead keys)': 'GB (Intl)', + 'English (UK, Macintosh, intl.)': 'GB (Mac Intl)', + 'English (UK, Macintosh)': 'GB (Mac)', + 'English (UK)': 'GB', + 'English (US, alt. intl.)': 'US (Alt-Intl)', + 'English (US, euro on 5)': 'US (Euro)', + 'English (US, intl., with dead keys)': 'US (Intl)', + 'English (US, Symbolic)': 'US (Symbolic)', + 'English (US)': 'US', + 'English (Workman, intl., with dead keys)': 'US (Workman-Intl)', + 'English (Workman)': 'US (Workman)', + Esperanto: 'EPO', + 'Esperanto (Brazil, Nativo)': 'BR (Nativo-Epo)', + 'Esperanto (legacy)': 'EPO (Legacy)', + 'Esperanto (Portugal, Nativo)': 'PT (Nativo-Epo)', + Estonian: 'EE', + 'Estonian (Dvorak)': 'EE (Dvorak)', + 'Estonian (no dead keys)': 'EE (Nodeadkeys)', + 'Estonian (US)': 'EE (Us)', + Ewe: 'GH (Ewe)', + Faroese: 'FO', + 'Faroese (no dead keys)': 'FO (Nodeadkeys)', + Filipino: 'PH', + 'Filipino (Capewell-Dvorak, Baybayin)': 'PH (Capewell-Dvorak-Bay)', + 'Filipino (Capewell-Dvorak, Latin)': 'PH (Capewell-Dvorak)', + 'Filipino (Capewell-QWERF 2006, Baybayin)': 'PH (Capewell-Qwerf2k6-Bay)', + 'Filipino (Capewell-QWERF 2006, Latin)': 'PH (Capewell-Qwerf2k6)', + 'Filipino (Colemak, Baybayin)': 'PH (Colemak-Bay)', + 'Filipino (Colemak, Latin)': 'PH (Colemak)', + 'Filipino (Dvorak, Baybayin)': 'PH (Dvorak-Bay)', + 'Filipino (Dvorak, Latin)': 'PH (Dvorak)', + 'Filipino (QWERTY, Baybayin)': 'PH (Qwerty-Bay)', + Finnish: 'FI', + 'Finnish (classic, no dead keys)': 'FI (Nodeadkeys)', + 'Finnish (classic)': 'FI (Classic)', + 'Finnish (Macintosh)': 'FI (Mac)', + 'Finnish (Windows)': 'FI (Winkeys)', + French: 'FR', + 'French (alt., Latin-9 only)': 'FR (Oss Latin9)', + 'French (alt., no dead keys)': 'FR (Oss Nodeadkeys)', + 'French (alt.)': 'FR (Oss)', + 'French (AZERTY, AFNOR)': 'FR (Afnor)', + 'French (AZERTY)': 'FR (Azerty)', + 'French (BEPO, AFNOR)': 'FR (Bepo Afnor)', + 'French (BEPO, Latin-9 only)': 'FR (Bepo Latin9)', + 'French (BEPO)': 'FR (Bepo)', + 'French (Cameroon)': 'CM (French)', + 'French (Canada, Dvorak)': 'CA (Fr-Dvorak)', + 'French (Canada, legacy)': 'CA (Fr-Legacy)', + 'French (Canada)': 'CA', + 'French (Democratic Republic of the Congo)': 'CD', + 'French (Dvorak)': 'FR (Dvorak)', + 'French (legacy, alt., no dead keys)': 'FR (Latin9 Nodeadkeys)', + 'French (legacy, alt.)': 'FR (Latin9)', + 'French (Macintosh)': 'FR (Mac)', + 'French (Mali, alt.)': 'ML (Fr-Oss)', + 'French (Morocco)': 'MA (French)', + 'French (no dead keys)': 'FR (Nodeadkeys)', + 'French (Switzerland, Macintosh)': 'CH (Fr Mac)', + 'French (Switzerland, no dead keys)': 'CH (Fr Nodeadkeys)', + 'French (Switzerland)': 'CH (Fr)', + 'French (Togo)': 'TG', + 'French (US)': 'FR (Us)', + 'Friulian (Italy)': 'IT (Fur)', + Fula: 'GH (Fula)', + Ga: 'GH (Ga)', + Georgian: 'GE', + 'Georgian (ergonomic)': 'GE (Ergonomic)', + 'Georgian (France, AZERTY Tskapo)': 'FR (Geo)', + 'Georgian (Italy)': 'IT (Geo)', + 'Georgian (MESS)': 'GE (Mess)', + German: 'DE', + 'German (Austria, Macintosh)': 'AT (Mac)', + 'German (Austria, no dead keys)': 'AT (Nodeadkeys)', + 'German (Austria)': 'AT', + 'German (dead acute)': 'DE (Deadacute)', + 'German (dead grave acute)': 'DE (Deadgraveacute)', + 'German (dead tilde)': 'DE (Deadtilde)', + 'German (Dvorak)': 'DE (Dvorak)', + 'German (E1)': 'DE (E1)', + 'German (E2)': 'DE (E2)', + 'German (Macintosh, no dead keys)': 'DE (Mac Nodeadkeys)', + 'German (Macintosh)': 'DE (Mac)', + 'German (Neo 2)': 'DE (Neo)', + 'German (no dead keys)': 'DE (Nodeadkeys)', + 'German (QWERTY)': 'DE (Qwerty)', + 'German (Switzerland, legacy)': 'CH (Legacy)', + 'German (Switzerland, Macintosh)': 'CH (De Mac)', + 'German (Switzerland, no dead keys)': 'CH (De Nodeadkeys)', + 'German (Switzerland)': 'CH', + 'German (T3)': 'DE (T3)', + 'German (US)': 'DE (Us)', + Greek: 'GR', + 'Greek (extended)': 'GR (Extended)', + 'Greek (no dead keys)': 'GR (Nodeadkeys)', + 'Greek (polytonic)': 'GR (Polytonic)', + 'Greek (simple)': 'GR (Simple)', + Gujarati: 'IN (Guj)', + 'Hanyu Pinyin Letters (with AltGr dead keys)': 'CN (Altgr-Pinyin)', + 'Hausa (Ghana)': 'GH (Hausa)', + 'Hausa (Nigeria)': 'NG (Hausa)', + Hawaiian: 'US (Haw)', + Hebrew: 'IL', + 'Hebrew (Biblical, Tiro)': 'IL (Biblical)', + 'Hebrew (lyx)': 'IL (Lyx)', + 'Hebrew (phonetic)': 'IL (Phonetic)', + 'Hindi (Bolnagri)': 'IN (Bolnagri)', + 'Hindi (KaGaPa, phonetic)': 'IN (Hin-Kagapa)', + 'Hindi (Wx)': 'IN (Hin-Wx)', + Hungarian: 'HU', + 'Hungarian (no dead keys)': 'HU (Nodeadkeys)', + 'Hungarian (QWERTY, 101-key, comma, dead keys)': 'HU (101 Qwerty Comma Dead)', + 'Hungarian (QWERTY, 101-key, comma, no dead keys)': 'HU (101 Qwerty Comma Nodead)', + 'Hungarian (QWERTY, 101-key, dot, dead keys)': 'HU (101 Qwerty Dot Dead)', + 'Hungarian (QWERTY, 101-key, dot, no dead keys)': 'HU (101 Qwerty Dot Nodead)', + 'Hungarian (QWERTY, 102-key, comma, dead keys)': 'HU (102 Qwerty Comma Dead)', + 'Hungarian (QWERTY, 102-key, comma, no dead keys)': 'HU (102 Qwerty Comma Nodead)', + 'Hungarian (QWERTY, 102-key, dot, dead keys)': 'HU (102 Qwerty Dot Dead)', + 'Hungarian (QWERTY, 102-key, dot, no dead keys)': 'HU (102 Qwerty Dot Nodead)', + 'Hungarian (QWERTY)': 'HU (Qwerty)', + 'Hungarian (QWERTZ, 101-key, comma, dead keys)': 'HU (101 Qwertz Comma Dead)', + 'Hungarian (QWERTZ, 101-key, comma, no dead keys)': 'HU (101 Qwertz Comma Nodead)', + 'Hungarian (QWERTZ, 101-key, dot, dead keys)': 'HU (101 Qwertz Dot Dead)', + 'Hungarian (QWERTZ, 101-key, dot, no dead keys)': 'HU (101 Qwertz Dot Nodead)', + 'Hungarian (QWERTZ, 102-key, comma, dead keys)': 'HU (102 Qwertz Comma Dead)', + 'Hungarian (QWERTZ, 102-key, comma, no dead keys)': 'HU (102 Qwertz Comma Nodead)', + 'Hungarian (QWERTZ, 102-key, dot, dead keys)': 'HU (102 Qwertz Dot Dead)', + 'Hungarian (QWERTZ, 102-key, dot, no dead keys)': 'HU (102 Qwertz Dot Nodead)', + 'Hungarian (standard)': 'HU (Standard)', + Icelandic: 'IS', + 'Icelandic (Dvorak)': 'IS (Dvorak)', + 'Icelandic (Macintosh, legacy)': 'IS (Mac Legacy)', + 'Icelandic (Macintosh)': 'IS (Mac)', + Igbo: 'NG (Igbo)', + Indian: 'IN', + 'Indic IPA': 'IN (Iipa)', + 'Indonesian (Arab Melayu, extended phonetic)': 'ID (Melayu-Phoneticx)', + 'Indonesian (Arab Melayu, phonetic)': 'ID (Melayu-Phonetic)', + 'Indonesian (Arab Pegon, phonetic)': 'ID (Pegon-Phonetic)', + 'Indonesian (Latin)': 'ID', + Inuktitut: 'CA (Ike)', + Iraqi: 'IQ', + Irish: 'IE', + 'Irish (UnicodeExpert)': 'IE (UnicodeExpert)', + Italian: 'IT', + 'Italian (IBM 142)': 'IT (Ibm)', + 'Italian (intl., with dead keys)': 'IT (Intl)', + 'Italian (Macintosh)': 'IT (Mac)', + 'Italian (no dead keys)': 'IT (Nodeadkeys)', + 'Italian (US)': 'IT (Us)', + 'Italian (Windows)': 'IT (Winkeys)', + Japanese: 'JP', + 'Japanese (Dvorak)': 'JP (Dvorak)', + 'Japanese (Kana 86)': 'JP (Kana86)', + 'Japanese (Kana)': 'JP (Kana)', + 'Japanese (Macintosh)': 'JP (Mac)', + 'Japanese (OADG 109A)': 'JP (OADG109A)', + Javanese: 'ID (Javanese)', + 'Kabyle (AZERTY, with dead keys)': 'DZ (Azerty-Deadkeys)', + 'Kabyle (QWERTY, UK, with dead keys)': 'DZ (Qwerty-Gb-Deadkeys)', + 'Kabyle (QWERTY, US, with dead keys)': 'DZ (Qwerty-Us-Deadkeys)', + Kalmyk: 'RU (Xal)', + Kannada: 'IN (Kan)', + 'Kannada (KaGaPa, phonetic)': 'IN (Kan-Kagapa)', + Kashubian: 'PL (Csb)', + Kazakh: 'KZ', + 'Kazakh (extended)': 'KZ (Ext)', + 'Kazakh (Latin)': 'KZ (Latin)', + 'Kazakh (with Russian)': 'KZ (Kazrus)', + 'Khmer (Cambodia)': 'KH', + Kikuyu: 'KE (Kik)', + Komi: 'RU (Kom)', + Korean: 'KR', + 'Korean (101/104-key compatible)': 'KR (Kr104)', + 'Kurdish (Iran, Arabic-Latin)': 'IR (Ku Ara)', + 'Kurdish (Iran, F)': 'IR (Ku F)', + 'Kurdish (Iran, Latin Alt-Q)': 'IR (Ku Alt)', + 'Kurdish (Iran, Latin Q)': 'IR (Ku)', + 'Kurdish (Iraq, Arabic-Latin)': 'IQ (Ku Ara)', + 'Kurdish (Iraq, F)': 'IQ (Ku F)', + 'Kurdish (Iraq, Latin Alt-Q)': 'IQ (Ku Alt)', + 'Kurdish (Iraq, Latin Q)': 'IQ (Ku)', + 'Kurdish (Syria, F)': 'SY (Ku F)', + 'Kurdish (Syria, Latin Alt-Q)': 'SY (Ku Alt)', + 'Kurdish (Syria, Latin Q)': 'SY (Ku)', + 'Kurdish (Turkey, F)': 'TR (Ku F)', + 'Kurdish (Turkey, Latin Alt-Q)': 'TR (Ku Alt)', + 'Kurdish (Turkey, Latin Q)': 'TR (Ku)', + Kyrgyz: 'KG', + 'Kyrgyz (phonetic)': 'KG (Phonetic)', + Lao: 'LA', + 'Lao (STEA)': 'LA (Stea)', + Latvian: 'LV', + 'Latvian (adapted)': 'LV (Adapted)', + 'Latvian (apostrophe)': 'LV (Apostrophe)', + 'Latvian (ergonomic, ŪGJRMV)': 'LV (Ergonomic)', + 'Latvian (F)': 'LV (Fkey)', + 'Latvian (modern)': 'LV (Modern)', + 'Latvian (tilde)': 'LV (Tilde)', + Lithuanian: 'LT', + 'Lithuanian (IBM LST 1205-92)': 'LT (Ibm)', + 'Lithuanian (LEKP)': 'LT (Lekp)', + 'Lithuanian (LEKPa)': 'LT (Lekpa)', + 'Lithuanian (Ratise)': 'LT (Ratise)', + 'Lithuanian (standard)': 'LT (Std)', + 'Lithuanian (US)': 'LT (Us)', + 'Lower Sorbian': 'DE (Dsb)', + 'Lower Sorbian (QWERTZ)': 'DE (Dsb Qwertz)', + Macedonian: 'MK', + 'Macedonian (no dead keys)': 'MK (Nodeadkeys)', + 'Malay (Jawi, Arabic Keyboard)': 'MY', + 'Malay (Jawi, phonetic)': 'MY (Phonetic)', + Malayalam: 'IN (Mal)', + 'Malayalam (enhanced InScript, with rupee)': 'IN (Mal Enhanced)', + 'Malayalam (Lalitha)': 'IN (Mal Lalitha)', + Maltese: 'MT', + 'Maltese (UK, with AltGr overrides)': 'MT (Alt-Gb)', + 'Maltese (US, with AltGr overrides)': 'MT (Alt-Us)', + 'Maltese (US)': 'MT (Us)', + 'Manipuri (Eeyek)': 'IN (Eeyek)', + Maori: 'MAO', + 'Marathi (enhanced InScript)': 'IN (Marathi)', + 'Marathi (KaGaPa, phonetic)': 'IN (Mar-Kagapa)', + Mari: 'RU (Chm)', + Mmuock: 'CM (Mmuock)', + Moldavian: 'MD', + 'Moldavian (Gagauz)': 'MD (Gag)', + Mon: 'MM (Mnw)', + 'Mon (A1)': 'MM (Mnw-A1)', + Mongolian: 'MN', + 'Mongolian (Bichig)': 'CN (Mon Trad)', + 'Mongolian (Galik)': 'CN (Mon Trad Galik)', + 'Mongolian (Manchu Galik)': 'CN (Mon Manchu Galik)', + 'Mongolian (Manchu)': 'CN (Mon Trad Manchu)', + 'Mongolian (Todo Galik)': 'CN (Mon Todo Galik)', + 'Mongolian (Todo)': 'CN (Mon Trad Todo)', + 'Mongolian (Xibe)': 'CN (Mon Trad Xibe)', + Montenegrin: 'ME', + 'Montenegrin (Cyrillic, with guillemets)': 'ME (Cyrillicalternatequotes)', + 'Montenegrin (Cyrillic, ZE and ZHE swapped)': 'ME (Cyrillicyz)', + 'Montenegrin (Cyrillic)': 'ME (Cyrillic)', + 'Montenegrin (Latin, QWERTY)': 'ME (Latinyz)', + 'Montenegrin (Latin, Unicode, QWERTY)': 'ME (Latinunicodeyz)', + 'Montenegrin (Latin, Unicode)': 'ME (Latinunicode)', + 'Montenegrin (Latin, with guillemets)': 'ME (Latinalternatequotes)', + "N'Ko (AZERTY)": 'GN', + Nepali: 'NP', + 'Northern Saami (Finland)': 'FI (Smi)', + 'Northern Saami (Norway, no dead keys)': 'NO (Smi Nodeadkeys)', + 'Northern Saami (Norway)': 'NO (Smi)', + 'Northern Saami (Sweden)': 'SE (Smi)', + Norwegian: 'NO', + 'Norwegian (Colemak)': 'NO (Colemak)', + 'Norwegian (Dvorak)': 'NO (Dvorak)', + 'Norwegian (Macintosh, no dead keys)': 'NO (Mac Nodeadkeys)', + 'Norwegian (Macintosh)': 'NO (Mac)', + 'Norwegian (no dead keys)': 'NO (Nodeadkeys)', + 'Norwegian (Windows)': 'NO (Winkeys)', + Occitan: 'FR (Oci)', + Ogham: 'IE (Ogam)', + 'Ogham (IS434)': 'IE (Ogam Is434)', + 'Ol Chiki': 'IN (Olck)', + 'Old Turkic': 'TR (Otk)', + 'Old Turkic (F)': 'TR (Otkf)', + Oriya: 'IN (Ori)', + 'Oriya (Bolnagri)': 'IN (Ori-Bolnagri)', + 'Oriya (Wx)': 'IN (Ori-Wx)', + 'Ossetian (Georgia)': 'GE (Os)', + 'Ossetian (legacy)': 'RU (Os Legacy)', + 'Ossetian (Windows)': 'RU (Os Winkeys)', + 'Ottoman (F)': 'TR (Otf)', + 'Ottoman (Q)': 'TR (Ot)', + 'Pannonian Rusyn': 'RS (Rue)', + Pashto: 'AF (Ps)', + 'Pashto (Afghanistan, OLPC)': 'AF (Ps-Olpc)', + Persian: 'IR', + 'Persian (with Persian keypad)': 'IR (Pes Keypad)', + Polish: 'PL', + 'Polish (British keyboard)': 'GB (Pl)', + 'Polish (Dvorak, with Polish quotes on key 1)': 'PL (Dvorak Altquotes)', + 'Polish (Dvorak, with Polish quotes on quotemark key)': 'PL (Dvorak Quotes)', + 'Polish (Dvorak)': 'PL (Dvorak)', + 'Polish (legacy)': 'PL (Legacy)', + 'Polish (programmer Dvorak)': 'PL (Dvp)', + 'Polish (QWERTZ)': 'PL (Qwertz)', + Portuguese: 'PT', + 'Portuguese (Brazil, Dvorak)': 'BR (Dvorak)', + 'Portuguese (Brazil, IBM/Lenovo ThinkPad)': 'BR (Thinkpad)', + 'Portuguese (Brazil, Nativo for US keyboards)': 'BR (Nativo-Us)', + 'Portuguese (Brazil, Nativo)': 'BR (Nativo)', + 'Portuguese (Brazil, no dead keys)': 'BR (Nodeadkeys)', + 'Portuguese (Brazil)': 'BR', + 'Portuguese (Macintosh, no dead keys)': 'PT (Mac Nodeadkeys)', + 'Portuguese (Macintosh)': 'PT (Mac)', + 'Portuguese (Nativo for US keyboards)': 'PT (Nativo-Us)', + 'Portuguese (Nativo)': 'PT (Nativo)', + 'Portuguese (no dead keys)': 'PT (Nodeadkeys)', + 'Punjabi (Gurmukhi Jhelum)': 'IN (Jhelum)', + 'Punjabi (Gurmukhi)': 'IN (Guru)', + Romanian: 'RO', + 'Romanian (Germany, no dead keys)': 'DE (Ro Nodeadkeys)', + 'Romanian (Germany)': 'DE (Ro)', + 'Romanian (standard)': 'RO (Std)', + 'Romanian (Windows)': 'RO (Winkeys)', + Russian: 'RU', + 'Russian (Belarus)': 'BY (Ru)', + 'Russian (Czech, phonetic)': 'CZ (Rus)', + 'Russian (DOS)': 'RU (Dos)', + 'Russian (engineering, EN)': 'RU (Ruchey En)', + 'Russian (engineering, RU)': 'RU (Ruchey Ru)', + 'Russian (Georgia)': 'GE (Ru)', + 'Russian (Germany, phonetic)': 'DE (Ru)', + 'Russian (Kazakhstan, with Kazakh)': 'KZ (Ruskaz)', + 'Russian (legacy)': 'RU (Legacy)', + 'Russian (Macintosh)': 'RU (Mac)', + 'Russian (phonetic, AZERTY)': 'RU (Phonetic Azerty)', + 'Russian (phonetic, Dvorak)': 'RU (Phonetic Dvorak)', + 'Russian (phonetic, French)': 'RU (Phonetic Fr)', + 'Russian (phonetic, Windows)': 'RU (Phonetic Winkeys)', + 'Russian (phonetic, YAZHERTY)': 'RU (Phonetic YAZHERTY)', + 'Russian (phonetic)': 'RU (Phonetic)', + 'Russian (Poland, phonetic Dvorak)': 'PL (Ru Phonetic Dvorak)', + 'Russian (Sweden, phonetic, no dead keys)': 'SE (Rus Nodeadkeys)', + 'Russian (Sweden, phonetic)': 'SE (Rus)', + 'Russian (typewriter, legacy)': 'RU (Typewriter-Legacy)', + 'Russian (typewriter)': 'RU (Typewriter)', + 'Russian (Ukraine, standard RSTU)': 'UA (Rstu Ru)', + 'Russian (US, phonetic)': 'US (Rus)', + 'Saisiyat (Taiwan)': 'TW (Saisiyat)', + Samogitian: 'LT (Sgs)', + 'Sanskrit (KaGaPa, phonetic)': 'IN (San-Kagapa)', + 'Scottish Gaelic': 'GB (Gla)', + Serbian: 'RS', + 'Serbian (Cyrillic, with guillemets)': 'RS (Alternatequotes)', + 'Serbian (Cyrillic, ZE and ZHE swapped)': 'RS (Yz)', + 'Serbian (Latin, QWERTY)': 'RS (Latinyz)', + 'Serbian (Latin, Unicode, QWERTY)': 'RS (Latinunicodeyz)', + 'Serbian (Latin, Unicode)': 'RS (Latinunicode)', + 'Serbian (Latin, with guillemets)': 'RS (Latinalternatequotes)', + 'Serbian (Latin)': 'RS (Latin)', + 'Serbian (Russia)': 'RU (Srp)', + 'Serbo-Croatian (US)': 'US (Hbs)', + Shan: 'MM (Shn)', + 'Shan (Zawgyi Tai)': 'MM (Zgt)', + Sicilian: 'IT (Scn)', + Silesian: 'PL (Szl)', + Sindhi: 'PK (Snd)', + 'Sinhala (phonetic)': 'LK', + 'Sinhala (US)': 'LK (Us)', + Slovak: 'SK', + 'Slovak (extended backslash)': 'SK (Bksl)', + 'Slovak (QWERTY, extended backslash)': 'SK (Qwerty Bksl)', + 'Slovak (QWERTY)': 'SK (Qwerty)', + Slovenian: 'SI', + 'Slovenian (US)': 'SI (Us)', + 'Slovenian (with guillemets)': 'SI (Alternatequotes)', + Spanish: 'ES', + 'Spanish (dead tilde)': 'ES (Deadtilde)', + 'Spanish (Dvorak)': 'ES (Dvorak)', + 'Spanish (Latin American, Colemak)': 'LATAM (Colemak)', + 'Spanish (Latin American, dead tilde)': 'LATAM (Deadtilde)', + 'Spanish (Latin American, Dvorak)': 'LATAM (Dvorak)', + 'Spanish (Latin American, no dead keys)': 'LATAM (Nodeadkeys)', + 'Spanish (Latin American)': 'LATAM', + 'Spanish (Macintosh)': 'ES (Mac)', + 'Spanish (no dead keys)': 'ES (Nodeadkeys)', + 'Spanish (Windows)': 'ES (Winkeys)', + 'Swahili (Kenya)': 'KE', + 'Swahili (Tanzania)': 'TZ', + Swedish: 'SE', + 'Swedish (Dvorak, intl.)': 'SE (Us Dvorak)', + 'Swedish (Dvorak)': 'SE (Dvorak)', + 'Swedish (Macintosh)': 'SE (Mac)', + 'Swedish (no dead keys)': 'SE (Nodeadkeys)', + 'Swedish (Svdvorak)': 'SE (Svdvorak)', + 'Swedish (US)': 'SE (Us)', + 'Swedish Sign Language': 'SE (Swl)', + Syriac: 'SY (Syc)', + 'Syriac (phonetic)': 'SY (Syc Phonetic)', + Taiwanese: 'TW', + 'Taiwanese (indigenous)': 'TW (Indigenous)', + Tajik: 'TJ', + 'Tajik (legacy)': 'TJ (Legacy)', + 'Tamil (InScript, with Arabic numerals)': 'IN (Tam)', + 'Tamil (InScript, with Tamil numerals)': 'IN (Tam Tamilnumbers)', + "Tamil (Sri Lanka, TamilNet '99, TAB encoding)": 'LK (Tam TAB)', + "Tamil (Sri Lanka, TamilNet '99)": 'LK (Tam Unicode)', + "Tamil (TamilNet '99 with Tamil numerals)": 'IN (Tamilnet Tamilnumbers)', + "Tamil (TamilNet '99, TAB encoding)": 'IN (Tamilnet TAB)', + "Tamil (TamilNet '99, TSCII encoding)": 'IN (Tamilnet TSCII)', + "Tamil (TamilNet '99)": 'IN (Tamilnet)', + Tarifit: 'MA (Rif)', + Tatar: 'RU (Tt)', + Telugu: 'IN (Tel)', + 'Telugu (KaGaPa, phonetic)': 'IN (Tel-Kagapa)', + 'Telugu (Sarala)': 'IN (Tel-Sarala)', + Thai: 'TH', + 'Thai (Pattachote)': 'TH (Pat)', + 'Thai (TIS-820.2538)': 'TH (Tis)', + Tibetan: 'CN (Tib)', + 'Tibetan (with ASCII numerals)': 'CN (Tib Asciinum)', + Tswana: 'BW', + Turkish: 'TR', + 'Turkish (Alt-Q)': 'TR (Alt)', + 'Turkish (E)': 'TR (E)', + 'Turkish (F)': 'TR (F)', + 'Turkish (Germany)': 'DE (Tr)', + 'Turkish (intl., with dead keys)': 'TR (Intl)', + Turkmen: 'TM', + 'Turkmen (Alt-Q)': 'TM (Alt)', + Udmurt: 'RU (Udm)', + Ukrainian: 'UA', + 'Ukrainian (homophonic)': 'UA (Homophonic)', + 'Ukrainian (legacy)': 'UA (Legacy)', + 'Ukrainian (macOS)': 'UA (MacOS)', + 'Ukrainian (phonetic)': 'UA (Phonetic)', + 'Ukrainian (standard RSTU)': 'UA (Rstu)', + 'Ukrainian (typewriter)': 'UA (Typewriter)', + 'Ukrainian (Windows)': 'UA (Winkeys)', + 'Urdu (alt. phonetic)': 'IN (Urd-Phonetic3)', + 'Urdu (Pakistan, CRULP)': 'PK (Urd-Crulp)', + 'Urdu (Pakistan, NLA)': 'PK (Urd-Nla)', + 'Urdu (Pakistan)': 'PK', + 'Urdu (phonetic)': 'IN (Urd-Phonetic)', + 'Urdu (Windows)': 'IN (Urd-Winkeys)', + Uyghur: 'CN (Ug)', + Uzbek: 'UZ', + 'Uzbek (Afghanistan, OLPC)': 'AF (Uz-Olpc)', + 'Uzbek (Afghanistan)': 'AF (Uz)', + 'Uzbek (Latin)': 'UZ (Latin)', + Vietnamese: 'VN', + 'Vietnamese (France)': 'VN (Fr)', + 'Vietnamese (US)': 'VN (Us)', + Wolof: 'SN', + Yakut: 'RU (Sah)', + Yoruba: 'NG (Yoruba)', + 'Unknown Layout': 'Unknown', +} as const; diff --git a/ags/HyprPanel/customModules/module.ts b/ags/HyprPanel/customModules/module.ts new file mode 100644 index 0000000..5438ade --- /dev/null +++ b/ags/HyprPanel/customModules/module.ts @@ -0,0 +1,84 @@ +import { BarBoxChild, Module } from 'lib/types/bar'; +import { BarButtonStyles } from 'lib/types/options'; +import { Bind } from 'lib/types/variable'; +import { GtkWidget } from 'lib/types/widget'; +import options from 'options'; +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0'; + +const { style } = options.theme.bar.buttons; + +const undefinedVar = Variable(undefined); + +export const module = ({ + icon, + textIcon, + label, + tooltipText, + boxClass, + props = {}, + showLabelBinding = undefinedVar.bind('value'), + showLabel, + labelHook, + hook, +}: Module): BarBoxChild => { + const getIconWidget = (): GtkWidget | undefined => { + let iconWidget: Gtk.Widget | undefined; + + if (icon !== undefined) { + iconWidget = Widget.Icon({ + class_name: `txt-icon bar-button-icon module-icon ${boxClass}`, + icon: icon, + }) as unknown as Gtk.Widget; + } else if (textIcon !== undefined) { + iconWidget = Widget.Label({ + class_name: `txt-icon bar-button-icon module-icon ${boxClass}`, + label: textIcon, + }) as unknown as Gtk.Widget; + } + + return iconWidget; + }; + + return { + component: Widget.Box({ + className: Utils.merge( + [style.bind('value'), showLabelBinding], + (style: BarButtonStyles, shwLabel: boolean) => { + const shouldShowLabel = shwLabel || showLabel; + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `${boxClass} ${styleMap[style]} ${!shouldShowLabel ? 'no-label' : ''}`; + }, + ), + tooltip_text: tooltipText, + children: Utils.merge([showLabelBinding], (showLabelBinding): Gtk.Widget[] => { + const childrenArray: Gtk.Widget[] = []; + const iconWidget = getIconWidget(); + + if (iconWidget !== undefined) { + childrenArray.push(iconWidget); + } + + if (showLabelBinding) { + childrenArray.push( + Widget.Label({ + class_name: `bar-button-label module-label ${boxClass}`, + label: label, + setup: labelHook, + }) as unknown as Gtk.Widget, + ); + } + return childrenArray; + }) as Bind, + setup: hook, + }), + tooltip_text: tooltipText, + isVisible: true, + boxClass, + props, + }; +}; diff --git a/ags/HyprPanel/customModules/netstat/computeNetwork.ts b/ags/HyprPanel/customModules/netstat/computeNetwork.ts new file mode 100644 index 0000000..e1b2dcd --- /dev/null +++ b/ags/HyprPanel/customModules/netstat/computeNetwork.ts @@ -0,0 +1,110 @@ +import GLib from 'gi://GLib'; +import { Variable as VariableType } from 'types/variable'; +import { NetworkResourceData } from 'lib/types/customModules/network'; +import { GET_DEFAULT_NETSTAT_DATA } from 'lib/types/defaults/netstat'; +import { RateUnit } from 'lib/types/bar'; + +let previousNetUsage = { rx: 0, tx: 0, time: 0 }; + +const formatRate = (rate: number, type: string, round: boolean): string => { + const fixed = round ? 0 : 2; + + switch (true) { + case type === 'KiB': + return `${(rate / 1e3).toFixed(fixed)} KiB/s`; + case type === 'MiB': + return `${(rate / 1e6).toFixed(fixed)} MiB/s`; + case type === 'GiB': + return `${(rate / 1e9).toFixed(fixed)} GiB/s`; + case rate >= 1e9: + return `${(rate / 1e9).toFixed(fixed)} GiB/s`; + case rate >= 1e6: + return `${(rate / 1e6).toFixed(fixed)} MiB/s`; + case rate >= 1e3: + return `${(rate / 1e3).toFixed(fixed)} KiB/s`; + default: + return `${rate.toFixed(fixed)} bytes/s`; + } +}; + +interface NetworkUsage { + name: string; + rx: number; + tx: number; +} + +const parseInterfaceData = (line: string): NetworkUsage | null => { + const trimmedLine = line.trim(); + if (!trimmedLine || trimmedLine.startsWith('Inter-') || trimmedLine.startsWith('face')) { + return null; + } + + const [iface, rx, , , , , , , , tx] = trimmedLine.split(/\s+/); + const rxValue = parseInt(rx, 10); + const txValue = parseInt(tx, 10); + const cleanedIface = iface.replace(':', ''); + + return { name: cleanedIface, rx: rxValue, tx: txValue }; +}; + +const isValidInterface = (iface: NetworkUsage | null, interfaceName: string): boolean => { + if (!iface) return false; + if (interfaceName) return iface.name === interfaceName; + return iface.name !== 'lo' && iface.rx > 0 && iface.tx > 0; +}; + +const getNetworkUsage = (interfaceName: string = ''): NetworkUsage => { + const [success, data] = GLib.file_get_contents('/proc/net/dev'); + if (!success) { + console.error('Failed to read /proc/net/dev'); + return { name: '', rx: 0, tx: 0 }; + } + + const lines = new TextDecoder('utf-8').decode(data).split('\n'); + for (const line of lines) { + const iface = parseInterfaceData(line); + if (isValidInterface(iface, interfaceName)) { + return iface!; + } + } + + return { name: '', rx: 0, tx: 0 }; +}; + +export const computeNetwork = ( + round: VariableType, + interfaceNameVar: VariableType, + dataType: VariableType, +): NetworkResourceData => { + const rateUnit = dataType.value; + const interfaceName = interfaceNameVar ? interfaceNameVar.value : ''; + + const DEFAULT_NETSTAT_DATA = GET_DEFAULT_NETSTAT_DATA(rateUnit); + try { + const { rx, tx, name } = getNetworkUsage(interfaceName); + const currentTime = Date.now(); + + if (!name) { + return DEFAULT_NETSTAT_DATA; + } + + if (previousNetUsage.time === 0) { + previousNetUsage = { rx, tx, time: currentTime }; + return DEFAULT_NETSTAT_DATA; + } + + const timeDiff = Math.max((currentTime - previousNetUsage.time) / 1000, 1); + const rxRate = (rx - previousNetUsage.rx) / timeDiff; + const txRate = (tx - previousNetUsage.tx) / timeDiff; + + previousNetUsage = { rx, tx, time: currentTime }; + + return { + in: formatRate(rxRate, rateUnit, round.value), + out: formatRate(txRate, rateUnit, round.value), + }; + } catch (error) { + console.error('Error calculating network usage:', error); + return DEFAULT_NETSTAT_DATA; + } +}; diff --git a/ags/HyprPanel/customModules/netstat/index.ts b/ags/HyprPanel/customModules/netstat/index.ts new file mode 100644 index 0000000..abfe2ca --- /dev/null +++ b/ags/HyprPanel/customModules/netstat/index.ts @@ -0,0 +1,105 @@ +import options from 'options'; +import { module } from '../module'; +import { inputHandler } from 'customModules/utils'; +import { computeNetwork } from './computeNetwork'; +import { BarBoxChild, NetstatLabelType } from 'lib/types/bar'; +import Button from 'types/widgets/button'; +import { NetworkResourceData } from 'lib/types/customModules/network'; +import { NETWORK_LABEL_TYPES } from 'lib/types/defaults/bar'; +import { GET_DEFAULT_NETSTAT_DATA } from 'lib/types/defaults/netstat'; +import { pollVariable } from 'customModules/PollVar'; +import { Attribute, Child } from 'lib/types/widget'; + +const { + label, + labelType, + networkInterface, + rateUnit, + icon, + round, + leftClick, + rightClick, + middleClick, + pollingInterval, +} = options.bar.customModules.netstat; + +export const networkUsage = Variable(GET_DEFAULT_NETSTAT_DATA(rateUnit.value)); + +pollVariable( + // Variable to poll and update with the result of the function passed in + networkUsage, + // Variables that should trigger the polling function to update when they change + [rateUnit.bind('value'), networkInterface.bind('value'), round.bind('value')], + // Interval at which to poll + pollingInterval.bind('value'), + // Function to execute to get the network data + computeNetwork, + // Optional parameters to pass to the function + // round is a boolean that determines whether to round the values + round, + // Optional parameters to pass to the function + // networkInterface is the interface name to filter the data + networkInterface, + // Optional parameters to pass to the function + // rateUnit is the unit to display the data in + // e.g. KiB, MiB, GiB, etc. + rateUnit, +); + +export const Netstat = (): BarBoxChild => { + const renderNetworkLabel = (lblType: NetstatLabelType, network: NetworkResourceData): string => { + switch (lblType) { + case 'in': + return `↓ ${network.in}`; + case 'out': + return `↑ ${network.out}`; + default: + return `↓ ${network.in} ↑ ${network.out}`; + } + }; + + const netstatModule = module({ + textIcon: icon.bind('value'), + label: Utils.merge( + [networkUsage.bind('value'), labelType.bind('value')], + (network: NetworkResourceData, lblTyp: NetstatLabelType) => renderNetworkLabel(lblTyp, network), + ), + tooltipText: labelType.bind('value').as((lblTyp) => { + return lblTyp === 'full' ? 'Ingress / Egress' : lblTyp === 'in' ? 'Ingress' : 'Egress'; + }), + boxClass: 'netstat', + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + fn: () => { + labelType.value = NETWORK_LABEL_TYPES[ + (NETWORK_LABEL_TYPES.indexOf(labelType.value) + 1) % NETWORK_LABEL_TYPES.length + ] as NetstatLabelType; + }, + }, + onScrollDown: { + fn: () => { + labelType.value = NETWORK_LABEL_TYPES[ + (NETWORK_LABEL_TYPES.indexOf(labelType.value) - 1 + NETWORK_LABEL_TYPES.length) % + NETWORK_LABEL_TYPES.length + ] as NetstatLabelType; + }, + }, + }); + }, + }, + }); + + return netstatModule; +}; diff --git a/ags/HyprPanel/customModules/power/index.ts b/ags/HyprPanel/customModules/power/index.ts new file mode 100644 index 0000000..da678ad --- /dev/null +++ b/ags/HyprPanel/customModules/power/index.ts @@ -0,0 +1,40 @@ +import options from 'options'; +import { module } from '../module'; + +import { inputHandler } from 'customModules/utils'; +import Button from 'types/widgets/button'; +import { Attribute, Child } from 'lib/types/widget'; +import { BarBoxChild } from 'lib/types/bar'; + +const { icon, leftClick, rightClick, middleClick, scrollUp, scrollDown } = options.bar.customModules.power; + +export const Power = (): BarBoxChild => { + const powerModule = module({ + tooltipText: 'Power Menu', + textIcon: icon.bind('value'), + boxClass: 'powermodule', + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + cmd: scrollUp, + }, + onScrollDown: { + cmd: scrollDown, + }, + }); + }, + }, + }); + + return powerModule; +}; diff --git a/ags/HyprPanel/customModules/ram/computeRam.ts b/ags/HyprPanel/customModules/ram/computeRam.ts new file mode 100644 index 0000000..b8026c2 --- /dev/null +++ b/ags/HyprPanel/customModules/ram/computeRam.ts @@ -0,0 +1,40 @@ +const GLib = imports.gi.GLib; + +import { divide } from 'customModules/utils'; +import { GenericResourceData } from 'lib/types/customModules/generic'; +import { Variable as VariableType } from 'types/variable'; + +export const calculateRamUsage = (round: VariableType): GenericResourceData => { + try { + const [success, meminfoBytes] = GLib.file_get_contents('/proc/meminfo'); + + if (!success || !meminfoBytes) { + throw new Error('Failed to read /proc/meminfo or file content is null.'); + } + + const meminfo = new TextDecoder('utf-8').decode(meminfoBytes); + + const totalMatch = meminfo.match(/MemTotal:\s+(\d+)/); + const availableMatch = meminfo.match(/MemAvailable:\s+(\d+)/); + + if (!totalMatch || !availableMatch) { + throw new Error('Failed to parse /proc/meminfo for memory values.'); + } + + const totalRamInBytes = parseInt(totalMatch[1], 10) * 1024; + const availableRamInBytes = parseInt(availableMatch[1], 10) * 1024; + + let usedRam = totalRamInBytes - availableRamInBytes; + usedRam = isNaN(usedRam) || usedRam < 0 ? 0 : usedRam; + + return { + percentage: divide([totalRamInBytes, usedRam], round.value), + total: totalRamInBytes, + used: usedRam, + free: availableRamInBytes, + }; + } catch (error) { + console.error('Error calculating RAM usage:', error); + return { total: 0, used: 0, percentage: 0, free: 0 }; + } +}; diff --git a/ags/HyprPanel/customModules/ram/index.ts b/ags/HyprPanel/customModules/ram/index.ts new file mode 100644 index 0000000..b651aaa --- /dev/null +++ b/ags/HyprPanel/customModules/ram/index.ts @@ -0,0 +1,79 @@ +import options from 'options'; + +// Module initializer +import { module } from '../module'; + +// Types +import { GenericResourceData } from 'lib/types/customModules/generic'; +import Button from 'types/widgets/button'; + +// Helper Methods +import { calculateRamUsage } from './computeRam'; + +// Utility Methods +import { formatTooltip, inputHandler, renderResourceLabel } from 'customModules/utils'; +import { BarBoxChild, ResourceLabelType } from 'lib/types/bar'; + +// Global Constants +import { LABEL_TYPES } from 'lib/types/defaults/bar'; +import { pollVariable } from 'customModules/PollVar'; +import { Attribute, Child } from 'lib/types/widget'; + +// All the user configurable options for the ram module that are needed +const { label, labelType, round, leftClick, rightClick, middleClick, pollingInterval, icon } = + options.bar.customModules.ram; + +const defaultRamData: GenericResourceData = { total: 0, used: 0, percentage: 0, free: 0 }; +const ramUsage = Variable(defaultRamData); + +pollVariable(ramUsage, [round.bind('value')], pollingInterval.bind('value'), calculateRamUsage, round); + +export const Ram = (): BarBoxChild => { + const ramModule = module({ + textIcon: icon.bind('value'), + label: Utils.merge( + [ramUsage.bind('value'), labelType.bind('value'), round.bind('value')], + (rmUsg: GenericResourceData, lblTyp: ResourceLabelType, round: boolean) => { + const returnValue = renderResourceLabel(lblTyp, rmUsg, round); + + return returnValue; + }, + ), + tooltipText: labelType.bind('value').as((lblTyp) => { + return formatTooltip('RAM', lblTyp); + }), + boxClass: 'ram', + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + fn: () => { + labelType.value = LABEL_TYPES[ + (LABEL_TYPES.indexOf(labelType.value) + 1) % LABEL_TYPES.length + ] as ResourceLabelType; + }, + }, + onScrollDown: { + fn: () => { + labelType.value = LABEL_TYPES[ + (LABEL_TYPES.indexOf(labelType.value) - 1 + LABEL_TYPES.length) % LABEL_TYPES.length + ] as ResourceLabelType; + }, + }, + }); + }, + }, + }); + + return ramModule; +}; diff --git a/ags/HyprPanel/customModules/storage/computeStorage.ts b/ags/HyprPanel/customModules/storage/computeStorage.ts new file mode 100644 index 0000000..49cbc14 --- /dev/null +++ b/ags/HyprPanel/customModules/storage/computeStorage.ts @@ -0,0 +1,28 @@ +// @ts-expect-error is a special directive that tells the compiler to use the GTop library +import GTop from 'gi://GTop'; + +import { divide } from 'customModules/utils'; +import { Variable as VariableType } from 'types/variable'; +import { GenericResourceData } from 'lib/types/customModules/generic'; + +export const computeStorage = (round: VariableType): GenericResourceData => { + try { + const currentFsUsage = new GTop.glibtop_fsusage(); + + GTop.glibtop_get_fsusage(currentFsUsage, '/'); + + const total = currentFsUsage.blocks * currentFsUsage.block_size; + const available = currentFsUsage.bavail * currentFsUsage.block_size; + const used = total - available; + + return { + total, + used, + free: available, + percentage: divide([total, used], round.value), + }; + } catch (error) { + console.error('Error calculating RAM usage:', error); + return { total: 0, used: 0, percentage: 0, free: 0 }; + } +}; diff --git a/ags/HyprPanel/customModules/storage/index.ts b/ags/HyprPanel/customModules/storage/index.ts new file mode 100644 index 0000000..9cfeb85 --- /dev/null +++ b/ags/HyprPanel/customModules/storage/index.ts @@ -0,0 +1,68 @@ +import options from 'options'; +import { module } from '../module'; + +import { formatTooltip, inputHandler, renderResourceLabel } from 'customModules/utils'; +import { computeStorage } from './computeStorage'; +import { BarBoxChild, ResourceLabelType } from 'lib/types/bar'; +import { GenericResourceData } from 'lib/types/customModules/generic'; +import Button from 'types/widgets/button'; +import { LABEL_TYPES } from 'lib/types/defaults/bar'; +import { pollVariable } from 'customModules/PollVar'; +import { Attribute, Child } from 'lib/types/widget'; + +const { label, labelType, icon, round, leftClick, rightClick, middleClick, pollingInterval } = + options.bar.customModules.storage; + +const defaultStorageData = { total: 0, used: 0, percentage: 0, free: 0 }; + +const storageUsage = Variable(defaultStorageData); + +pollVariable(storageUsage, [round.bind('value')], pollingInterval.bind('value'), computeStorage, round); + +export const Storage = (): BarBoxChild => { + const storageModule = module({ + textIcon: icon.bind('value'), + label: Utils.merge( + [storageUsage.bind('value'), labelType.bind('value'), round.bind('value')], + (storage: GenericResourceData, lblTyp: ResourceLabelType, round: boolean) => { + return renderResourceLabel(lblTyp, storage, round); + }, + ), + tooltipText: labelType.bind('value').as((lblTyp) => { + return formatTooltip('Storage', lblTyp); + }), + boxClass: 'storage', + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + fn: () => { + labelType.value = LABEL_TYPES[ + (LABEL_TYPES.indexOf(labelType.value) + 1) % LABEL_TYPES.length + ] as ResourceLabelType; + }, + }, + onScrollDown: { + fn: () => { + labelType.value = LABEL_TYPES[ + (LABEL_TYPES.indexOf(labelType.value) - 1 + LABEL_TYPES.length) % LABEL_TYPES.length + ] as ResourceLabelType; + }, + }, + }); + }, + }, + }); + + return storageModule; +}; diff --git a/ags/HyprPanel/customModules/submap/helpers.ts b/ags/HyprPanel/customModules/submap/helpers.ts new file mode 100644 index 0000000..0c38718 --- /dev/null +++ b/ags/HyprPanel/customModules/submap/helpers.ts @@ -0,0 +1,20 @@ +import { Variable } from 'types/variable'; + +const hyprland = await Service.import('hyprland'); + +export const isSubmapEnabled = (submap: string, enabled: string, disabled: string): string => { + return submap !== 'default' ? enabled : disabled; +}; + +export const getInitialSubmap = (submapStatus: Variable): void => { + let submap = hyprland.message('submap'); + + const newLineCarriage = /\n/g; + submap = submap.replace(newLineCarriage, ''); + + if (submap === 'unknown request') { + submap = 'default'; + } + + submapStatus.value = submap; +}; diff --git a/ags/HyprPanel/customModules/submap/index.ts b/ags/HyprPanel/customModules/submap/index.ts new file mode 100644 index 0000000..c83316e --- /dev/null +++ b/ags/HyprPanel/customModules/submap/index.ts @@ -0,0 +1,101 @@ +const hyprland = await Service.import('hyprland'); +import options from 'options'; +import { module } from '../module'; + +import { inputHandler } from 'customModules/utils'; +import Button from 'types/widgets/button'; +import { Variable as VariableType } from 'types/variable'; +import { Attribute, Child } from 'lib/types/widget'; +import { BarBoxChild } from 'lib/types/bar'; +import { capitalizeFirstLetter } from 'lib/utils'; +import { getInitialSubmap, isSubmapEnabled } from './helpers'; + +const { + label, + showSubmapName, + enabledIcon, + disabledIcon, + enabledText, + disabledText, + leftClick, + rightClick, + middleClick, + scrollUp, + scrollDown, +} = options.bar.customModules.submap; + +const submapStatus: VariableType = Variable('default'); + +hyprland.connect('submap', (_, currentSubmap) => { + if (currentSubmap.length === 0) { + submapStatus.value = 'default'; + } else { + submapStatus.value = currentSubmap; + } +}); + +getInitialSubmap(submapStatus); + +export const Submap = (): BarBoxChild => { + const submapModule = module({ + textIcon: Utils.merge( + [submapStatus.bind('value'), enabledIcon.bind('value'), disabledIcon.bind('value')], + (status, enabled, disabled) => { + return isSubmapEnabled(status, enabled, disabled); + }, + ), + tooltipText: Utils.merge( + [ + submapStatus.bind('value'), + enabledText.bind('value'), + disabledText.bind('value'), + showSubmapName.bind('value'), + ], + (status, enabled, disabled, showSmName) => { + if (showSmName) { + return capitalizeFirstLetter(status); + } + return isSubmapEnabled(status, enabled, disabled); + }, + ), + boxClass: 'submap', + label: Utils.merge( + [ + submapStatus.bind('value'), + enabledText.bind('value'), + disabledText.bind('value'), + showSubmapName.bind('value'), + ], + (status, enabled, disabled, showSmName) => { + if (showSmName) { + return capitalizeFirstLetter(status); + } + return isSubmapEnabled(status, enabled, disabled); + }, + ), + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + cmd: scrollUp, + }, + onScrollDown: { + cmd: scrollDown, + }, + }); + }, + }, + }); + + return submapModule; +}; diff --git a/ags/HyprPanel/customModules/theme.ts b/ags/HyprPanel/customModules/theme.ts new file mode 100644 index 0000000..2ac92ff --- /dev/null +++ b/ags/HyprPanel/customModules/theme.ts @@ -0,0 +1,171 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, GtkWidget } from 'lib/types/widget'; + +export const CustomModuleTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page customModules paged-container', + child: Widget.Box({ + class_name: 'bar-theme-page paged-container', + vertical: true, + children: [ + Header('RAM'), + Option({ opt: options.theme.bar.buttons.modules.ram.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.ram.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.ram.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.ram.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.ram.border, title: 'Border', type: 'color' }), + + Header('CPU'), + Option({ opt: options.theme.bar.buttons.modules.cpu.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.cpu.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.cpu.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.cpu.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.cpu.border, title: 'Border', type: 'color' }), + + Header('Storage'), + Option({ opt: options.theme.bar.buttons.modules.storage.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.storage.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.storage.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.storage.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.storage.border, title: 'Border', type: 'color' }), + + Header('Netstat'), + Option({ opt: options.theme.bar.buttons.modules.netstat.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.netstat.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.netstat.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.netstat.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.netstat.border, title: 'Border', type: 'color' }), + + Header('Keyboard Layout'), + Option({ opt: options.theme.bar.buttons.modules.kbLayout.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.kbLayout.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.kbLayout.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.kbLayout.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.kbLayout.border, title: 'Border', type: 'color' }), + + Header('Updates'), + Option({ opt: options.theme.bar.buttons.modules.updates.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.updates.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.updates.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.updates.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.updates.border, title: 'Border', type: 'color' }), + + Header('Submap'), + Option({ opt: options.theme.bar.buttons.modules.submap.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.submap.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.submap.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.submap.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.submap.border, title: 'Border', type: 'color' }), + + Header('Weather'), + Option({ opt: options.theme.bar.buttons.modules.weather.icon, title: 'Icon', type: 'color' }), + Option({ opt: options.theme.bar.buttons.modules.weather.text, title: 'Text', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.weather.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.weather.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.weather.border, title: 'Border', type: 'color' }), + + Header('Power'), + Option({ opt: options.theme.bar.buttons.modules.power.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.modules.power.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.modules.power.icon_background, + title: 'Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.modules.power.border, title: 'Border', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/customModules/updates/index.ts b/ags/HyprPanel/customModules/updates/index.ts new file mode 100644 index 0000000..4be5ee8 --- /dev/null +++ b/ags/HyprPanel/customModules/updates/index.ts @@ -0,0 +1,70 @@ +import options from 'options'; +import { module } from '../module'; + +import { inputHandler } from 'customModules/utils'; +import Button from 'types/widgets/button'; +import { Variable as VariableType } from 'types/variable'; +import { pollVariableBash } from 'customModules/PollVar'; +import { Attribute, Child } from 'lib/types/widget'; +import { BarBoxChild } from 'lib/types/bar'; + +const { + updateCommand, + label, + padZero, + pollingInterval, + icon, + leftClick, + rightClick, + middleClick, + scrollUp, + scrollDown, +} = options.bar.customModules.updates; + +const pendingUpdates: VariableType = Variable(' 0'); + +const processUpdateCount = (updateCount: string): string => { + if (!padZero.value) return updateCount; + return `${updateCount.padStart(2, '0')}`; +}; + +pollVariableBash( + pendingUpdates, + [padZero.bind('value')], + pollingInterval.bind('value'), + updateCommand.value, + processUpdateCount, +); + +export const Updates = (): BarBoxChild => { + const updatesModule = module({ + textIcon: icon.bind('value'), + tooltipText: pendingUpdates.bind('value').as((v) => `${v} updates available`), + boxClass: 'updates', + label: pendingUpdates.bind('value'), + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + cmd: scrollUp, + }, + onScrollDown: { + cmd: scrollDown, + }, + }); + }, + }, + }); + + return updatesModule; +}; diff --git a/ags/HyprPanel/customModules/utils.ts b/ags/HyprPanel/customModules/utils.ts new file mode 100644 index 0000000..b68258e --- /dev/null +++ b/ags/HyprPanel/customModules/utils.ts @@ -0,0 +1,197 @@ +import { ResourceLabelType } from 'lib/types/bar'; +import { GenericResourceData, Postfix } from 'lib/types/customModules/generic'; +import { InputHandlerEvents, RunAsyncCommand } from 'lib/types/customModules/utils'; +import { ThrottleFn, ThrottleFnCallback } from 'lib/types/utils'; +import { Attribute, Child, EventArgs } from 'lib/types/widget'; +import { Binding } from 'lib/utils'; +import { openMenu } from 'modules/bar/utils'; +import options from 'options'; +import Gdk from 'types/@girs/gdk-3.0/gdk-3.0'; +import { Variable as VariableType } from 'types/variable'; +import Button from 'types/widgets/button'; + +const { scrollSpeed } = options.bar.customModules; + +export const runAsyncCommand: RunAsyncCommand = (cmd, events, fn): void => { + if (cmd.startsWith('menu:')) { + const menuName = cmd.split(':')[1].trim().toLowerCase(); + openMenu(events.clicked, events.event, `${menuName}menu`); + + return; + } + + Utils.execAsync(`bash -c "${cmd}"`) + .then((output) => { + if (fn !== undefined) { + fn(output); + } + }) + .catch((err) => console.error(`Error running command "${cmd}": ${err})`)); +}; + +export function throttle(func: T, limit: number): T { + let inThrottle: boolean; + return function (this: ThisParameterType, ...args: Parameters) { + if (!inThrottle) { + func.apply(this, args); + inThrottle = true; + setTimeout(() => { + inThrottle = false; + }, limit); + } + } as T; +} + +export const throttledScrollHandler = (interval: number): ThrottleFn => + throttle((cmd: string, events: EventArgs, fn: ThrottleFnCallback) => { + runAsyncCommand(cmd, events, fn); + }, 200 / interval); + +const dummyVar = Variable(''); + +export const inputHandler = ( + self: Button, + { onPrimaryClick, onSecondaryClick, onMiddleClick, onScrollUp, onScrollDown }: InputHandlerEvents, +): void => { + const sanitizeInput = (input: VariableType): string => { + if (input === undefined) { + return ''; + } + return input.value; + }; + + const updateHandlers = (): void => { + const interval = scrollSpeed.value; + const throttledHandler = throttledScrollHandler(interval); + + self.on_primary_click = (clicked: Button, event: Gdk.Event): void => + runAsyncCommand(sanitizeInput(onPrimaryClick?.cmd || dummyVar), { clicked, event }, onPrimaryClick.fn); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => + runAsyncCommand(sanitizeInput(onSecondaryClick?.cmd || dummyVar), { clicked, event }, onSecondaryClick.fn); + + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => + runAsyncCommand(sanitizeInput(onMiddleClick?.cmd || dummyVar), { clicked, event }, onMiddleClick.fn); + + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => + throttledHandler(sanitizeInput(onScrollUp?.cmd || dummyVar), { clicked, event }, onScrollUp.fn); + + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => + throttledHandler(sanitizeInput(onScrollDown?.cmd || dummyVar), { clicked, event }, onScrollDown.fn); + }; + + // Initial setup of event handlers + updateHandlers(); + + const sanitizeVariable = (someVar: VariableType | undefined): Binding => { + if (someVar === undefined || typeof someVar.bind !== 'function') { + return dummyVar.bind('value'); + } + return someVar.bind('value'); + }; + + // Re-run the update whenever scrollSpeed changes + Utils.merge( + [ + scrollSpeed.bind('value'), + sanitizeVariable(onPrimaryClick), + sanitizeVariable(onSecondaryClick), + sanitizeVariable(onMiddleClick), + sanitizeVariable(onScrollUp), + sanitizeVariable(onScrollDown), + ], + updateHandlers, + ); +}; + +export const divide = ([total, used]: number[], round: boolean): number => { + const percentageTotal = (used / total) * 100; + if (round) { + return total > 0 ? Math.round(percentageTotal) : 0; + } + return total > 0 ? parseFloat(percentageTotal.toFixed(2)) : 0; +}; + +export const formatSizeInKiB = (sizeInBytes: number, round: boolean): number => { + const sizeInGiB = sizeInBytes / 1024 ** 1; + return round ? Math.round(sizeInGiB) : parseFloat(sizeInGiB.toFixed(2)); +}; +export const formatSizeInMiB = (sizeInBytes: number, round: boolean): number => { + const sizeInGiB = sizeInBytes / 1024 ** 2; + return round ? Math.round(sizeInGiB) : parseFloat(sizeInGiB.toFixed(2)); +}; +export const formatSizeInGiB = (sizeInBytes: number, round: boolean): number => { + const sizeInGiB = sizeInBytes / 1024 ** 3; + return round ? Math.round(sizeInGiB) : parseFloat(sizeInGiB.toFixed(2)); +}; +export const formatSizeInTiB = (sizeInBytes: number, round: boolean): number => { + const sizeInGiB = sizeInBytes / 1024 ** 4; + return round ? Math.round(sizeInGiB) : parseFloat(sizeInGiB.toFixed(2)); +}; + +export const autoFormatSize = (sizeInBytes: number, round: boolean): number => { + // auto convert to GiB, MiB, KiB, TiB, or bytes + if (sizeInBytes >= 1024 ** 4) return formatSizeInTiB(sizeInBytes, round); + if (sizeInBytes >= 1024 ** 3) return formatSizeInGiB(sizeInBytes, round); + if (sizeInBytes >= 1024 ** 2) return formatSizeInMiB(sizeInBytes, round); + if (sizeInBytes >= 1024 ** 1) return formatSizeInKiB(sizeInBytes, round); + + return sizeInBytes; +}; + +export const getPostfix = (sizeInBytes: number): Postfix => { + if (sizeInBytes >= 1024 ** 4) return 'TiB'; + if (sizeInBytes >= 1024 ** 3) return 'GiB'; + if (sizeInBytes >= 1024 ** 2) return 'MiB'; + if (sizeInBytes >= 1024 ** 1) return 'KiB'; + + return 'B'; +}; + +export const renderResourceLabel = (lblType: ResourceLabelType, rmUsg: GenericResourceData, round: boolean): string => { + const { used, total, percentage, free } = rmUsg; + + const formatFunctions = { + TiB: formatSizeInTiB, + GiB: formatSizeInGiB, + MiB: formatSizeInMiB, + KiB: formatSizeInKiB, + B: (size: number): number => size, + }; + + // Get them datas in proper GiB, MiB, KiB, TiB, or bytes + const totalSizeFormatted = autoFormatSize(total, round); + // get the postfix: one of [TiB, GiB, MiB, KiB, B] + const postfix = getPostfix(total); + + // Determine which format function to use + const formatUsed = formatFunctions[postfix] || formatFunctions['B']; + const usedSizeFormatted = formatUsed(used, round); + + if (lblType === 'used/total') { + return `${usedSizeFormatted}/${totalSizeFormatted} ${postfix}`; + } + if (lblType === 'used') { + return `${autoFormatSize(used, round)} ${getPostfix(used)}`; + } + if (lblType === 'free') { + return `${autoFormatSize(free, round)} ${getPostfix(free)}`; + } + + return `${percentage}%`; +}; + +export const formatTooltip = (dataType: string, lblTyp: ResourceLabelType): string => { + switch (lblTyp) { + case 'used': + return `Used ${dataType}`; + case 'free': + return `Free ${dataType}`; + case 'used/total': + return `Used/Total ${dataType}`; + case 'percentage': + return `Percentage ${dataType} Usage`; + default: + return ''; + } +}; diff --git a/ags/HyprPanel/customModules/weather/index.ts b/ags/HyprPanel/customModules/weather/index.ts new file mode 100644 index 0000000..b40995c --- /dev/null +++ b/ags/HyprPanel/customModules/weather/index.ts @@ -0,0 +1,52 @@ +import options from 'options'; +import { module } from '../module'; + +import { inputHandler } from 'customModules/utils'; +import Button from 'types/widgets/button'; +import { getWeatherStatusTextIcon, globalWeatherVar } from 'globals/weather'; +import { Attribute, Child } from 'lib/types/widget'; +import { BarBoxChild } from 'lib/types/bar'; + +const { label, unit, leftClick, rightClick, middleClick, scrollUp, scrollDown } = options.bar.customModules.weather; + +export const Weather = (): BarBoxChild => { + const weatherModule = module({ + textIcon: Utils.merge([globalWeatherVar.bind('value')], (wthr) => { + const weatherStatusIcon = getWeatherStatusTextIcon(wthr); + return weatherStatusIcon; + }), + tooltipText: globalWeatherVar.bind('value').as((v) => `Weather Status: ${v.current.condition.text}`), + boxClass: 'weather-custom', + label: Utils.merge([globalWeatherVar.bind('value'), unit.bind('value')], (wthr, unt) => { + if (unt === 'imperial') { + return `${Math.ceil(wthr.current.temp_f)}° F`; + } else { + return `${Math.ceil(wthr.current.temp_c)}° C`; + } + }), + showLabelBinding: label.bind('value'), + props: { + setup: (self: Button) => { + inputHandler(self, { + onPrimaryClick: { + cmd: leftClick, + }, + onSecondaryClick: { + cmd: rightClick, + }, + onMiddleClick: { + cmd: middleClick, + }, + onScrollUp: { + cmd: scrollUp, + }, + onScrollDown: { + cmd: scrollDown, + }, + }); + }, + }, + }); + + return weatherModule; +}; diff --git a/ags/HyprPanel/directoryMonitorService.ts b/ags/HyprPanel/directoryMonitorService.ts new file mode 100644 index 0000000..2e1a74a --- /dev/null +++ b/ags/HyprPanel/directoryMonitorService.ts @@ -0,0 +1,38 @@ +import Service from 'resource:///com/github/Aylur/ags/service.js'; +import App from 'resource:///com/github/Aylur/ags/app.js'; +import { monitorFile } from 'resource:///com/github/Aylur/ags/utils.js'; +import Gio from 'gi://Gio'; +import { FileInfo } from 'types/@girs/gio-2.0/gio-2.0.cjs'; + +class DirectoryMonitorService extends Service { + static { + Service.register(this, {}, {}); + } + + constructor() { + super(); + this.recursiveDirectoryMonitor(`${App.configDir}/scss`); + } + + recursiveDirectoryMonitor(directoryPath: string): void { + monitorFile(directoryPath, (_, eventType) => { + if (eventType === Gio.FileMonitorEvent.CHANGES_DONE_HINT) { + this.emit('changed'); + } + }); + + const directory = Gio.File.new_for_path(directoryPath); + const enumerator = directory.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null); + + let fileInfo: FileInfo; + while ((fileInfo = enumerator.next_file(null) as FileInfo) !== null) { + const childPath = directoryPath + '/' + fileInfo.get_name(); + if (fileInfo.get_file_type() === Gio.FileType.DIRECTORY) { + this.recursiveDirectoryMonitor(childPath); + } + } + } +} + +const service = new DirectoryMonitorService(); +export default service; diff --git a/ags/HyprPanel/flake.lock b/ags/HyprPanel/flake.lock new file mode 100644 index 0000000..2417d92 --- /dev/null +++ b/ags/HyprPanel/flake.lock @@ -0,0 +1,78 @@ +{ + "nodes": { + "ags": { + "inputs": { + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1727303518, + "narHash": "sha256-lO5JMynTxNZxg/+E4/Y9reeLGIz/M8cEue+Re4cP6qo=", + "owner": "Aylur", + "repo": "ags", + "rev": "cd543afec4d9ed708990e5ba52184716809bf248", + "type": "github" + }, + "original": { + "owner": "Aylur", + "repo": "ags", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1725634671, + "narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1727634051, + "narHash": "sha256-S5kVU7U82LfpEukbn/ihcyNt2+EvG7Z5unsKW9H/yFA=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "06cf0e1da4208d3766d898b7fdab6513366d45b9", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "ags": "ags", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/ags/HyprPanel/flake.nix b/ags/HyprPanel/flake.nix new file mode 100644 index 0000000..685fed7 --- /dev/null +++ b/ags/HyprPanel/flake.nix @@ -0,0 +1,78 @@ +{ + description = "A Bar/Panel for Hyprland with extensive customizability."; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + ags.url = "github:Aylur/ags"; + }; + + outputs = inputs: let + systems = [ + "x86_64-linux" + "x86_64-darwin" + "aarch64-darwin" + "aarch64-linux" + ]; + forEachSystem = inputs.nixpkgs.lib.genAttrs systems; + pkgsFor = forEachSystem ( + system: + import inputs.nixpkgs { + inherit system; + config.allowUnfree = true; + } + ); + + devShellFor = system: + inputs.nixpkgs.lib.genAttrs ["default"] ( + _: + inputs.nixpkgs.legacyPackages.${system}.mkShell { + buildInputs = [ + pkgsFor.${system}.esbuild + pkgsFor.${system}.fish + pkgsFor.${system}.typescript + pkgsFor.${system}.bun + pkgsFor.${system}.libnotify + pkgsFor.${system}.dart-sass + pkgsFor.${system}.fd + pkgsFor.${system}.btop + pkgsFor.${system}.bluez + pkgsFor.${system}.libgtop + pkgsFor.${system}.gobject-introspection + pkgsFor.${system}.glib + pkgsFor.${system}.bluez-tools + pkgsFor.${system}.grimblast + pkgsFor.${system}.gpu-screen-recorder + pkgsFor.${system}.brightnessctl + pkgsFor.${system}.gnome-bluetooth + pkgsFor.${system}.python3 + pkgsFor.${system}.matugen + inputs.ags.packages.${system}.agsWithTypes + ]; + nativeBuildInputs = with pkgsFor.${system}; [ + nixfmt-rfc-style + nil + ]; + shellHook = '' + export GDK_BACKEND=wayland + export GI_TYPELIB_PATH=${pkgsFor.${system}.libgtop}/lib/girepository-1.0:${pkgsFor.${system}.glib}/lib/girepository-1.0:$GI_TYPELIB_PATH + ''; + } + ); + in { + devShells = forEachSystem devShellFor; + + overlay = final: prev: { + hyprpanel = + if final ? callPackage + then (final.callPackage ./nix {inherit inputs;}).desktop.script + else inputs.self.packages.${prev.stdenv.system}.default; + }; + packages = forEachSystem ( + system: let + pkgs = pkgsFor.${system}; + in { + default = (pkgs.callPackage ./nix {inherit inputs;}).desktop.script; + } + ); + }; +} diff --git a/ags/HyprPanel/globals.d.ts b/ags/HyprPanel/globals.d.ts new file mode 100644 index 0000000..8e44a87 --- /dev/null +++ b/ags/HyprPanel/globals.d.ts @@ -0,0 +1,14 @@ +// globals.d.ts +/* eslint-disable no-var */ + +import { Options, Variable as VariableType } from 'types/variable'; + +declare global { + var useTheme: (filePath: string) => void; + var isWindowVisible: (windowName: string) => boolean; + var globalWeatherVar: VariableType; + var options: Options; + var removingNotifications: VariableType; +} + +export {}; diff --git a/ags/HyprPanel/globals/dropdown.ts b/ags/HyprPanel/globals/dropdown.ts new file mode 100644 index 0000000..b1178bf --- /dev/null +++ b/ags/HyprPanel/globals/dropdown.ts @@ -0,0 +1,6 @@ +import { Variable as VariableType } from 'types/variable'; + +type GlobalEventBoxes = { + [key: string]: unknown; +}; +export const globalEventBoxes: VariableType = Variable({}); diff --git a/ags/HyprPanel/globals/network.ts b/ags/HyprPanel/globals/network.ts new file mode 100644 index 0000000..44fbf77 --- /dev/null +++ b/ags/HyprPanel/globals/network.ts @@ -0,0 +1,15 @@ +export const WIFI_STATUS_MAP = { + unknown: 'Status Unknown', + unmanaged: 'Unmanaged', + unavailable: 'Unavailable', + disconnected: 'Disconnected', + prepare: 'Preparing Connecting', + config: 'Connecting', + need_auth: 'Needs Authentication', + ip_config: 'Requesting IP', + ip_check: 'Checking Access', + secondaries: 'Waiting on Secondaries', + activated: 'Connected', + deactivating: 'Disconnecting', + failed: 'Connection Failed', +} as const; diff --git a/ags/HyprPanel/globals/notification.ts b/ags/HyprPanel/globals/notification.ts new file mode 100644 index 0000000..f382bc4 --- /dev/null +++ b/ags/HyprPanel/globals/notification.ts @@ -0,0 +1,37 @@ +import icons from 'modules/icons/index'; +import { Notification } from 'types/service/notifications'; + +export const removingNotifications = Variable(false); + +export const getNotificationIcon = (app_name: string, app_icon: string, app_entry: string): string => { + let icon: string = icons.fallback.notification; + + if (Utils.lookUpIcon(app_name) || Utils.lookUpIcon(app_name.toLowerCase() || '')) { + icon = Utils.lookUpIcon(app_name) + ? app_name + : Utils.lookUpIcon(app_name.toLowerCase()) + ? app_name.toLowerCase() + : ''; + } + + if (Utils.lookUpIcon(app_icon) && icon === '') { + icon = app_icon; + } + + if (Utils.lookUpIcon(app_entry || '') && icon === '') { + icon = app_entry || ''; + } + + return icon; +}; + +export const closeNotifications = async (notifications: Notification[], delay: number): Promise => { + removingNotifications.value = true; + for (const notif of notifications) { + notif.close(); + await new Promise((resolve) => setTimeout(resolve, delay)); + } + removingNotifications.value = false; +}; + +globalThis['removingNotifications'] = removingNotifications; diff --git a/ags/HyprPanel/globals/useTheme.ts b/ags/HyprPanel/globals/useTheme.ts new file mode 100644 index 0000000..15c2322 --- /dev/null +++ b/ags/HyprPanel/globals/useTheme.ts @@ -0,0 +1,43 @@ +import Gio from 'gi://Gio'; +import { bash, Notify } from 'lib/utils'; +import icons from 'lib/icons'; +import { filterConfigForThemeOnly, loadJsonFile, saveConfigToFile } from 'widget/settings/shared/FileChooser'; + +export const hexColorPattern = /^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/; + +globalThis.useTheme = (filePath: string): void => { + const importedConfig = loadJsonFile(filePath); + + if (!importedConfig) { + return; + } + + Notify({ + summary: `Importing Theme`, + body: `Importing: ${filePath}`, + iconName: icons.ui.info, + timeout: 7000, + }); + + const tmpConfigFile = Gio.File.new_for_path(`${TMP}/config.json`); + const optionsConfigFile = Gio.File.new_for_path(OPTIONS); + + const [tmpSuccess, tmpContent] = tmpConfigFile.load_contents(null); + const [optionsSuccess, optionsContent] = optionsConfigFile.load_contents(null); + + if (!tmpSuccess || !optionsSuccess) { + console.error('Failed to read existing configuration files.'); + return; + } + + let tmpConfig = JSON.parse(new TextDecoder('utf-8').decode(tmpContent)); + let optionsConfig = JSON.parse(new TextDecoder('utf-8').decode(optionsContent)); + + const filteredConfig = filterConfigForThemeOnly(importedConfig); + tmpConfig = { ...tmpConfig, ...filteredConfig }; + optionsConfig = { ...optionsConfig, ...filteredConfig }; + + saveConfigToFile(tmpConfig, `${TMP}/config.json`); + saveConfigToFile(optionsConfig, OPTIONS); + bash('pkill ags && ags'); +}; diff --git a/ags/HyprPanel/globals/utilities.ts b/ags/HyprPanel/globals/utilities.ts new file mode 100644 index 0000000..438c666 --- /dev/null +++ b/ags/HyprPanel/globals/utilities.ts @@ -0,0 +1,8 @@ +globalThis.isWindowVisible = (windowName: string): boolean => { + const appWindow = App.getWindow(windowName); + + if (appWindow === undefined) { + return false; + } + return appWindow.visible; +}; diff --git a/ags/HyprPanel/globals/variables.ts b/ags/HyprPanel/globals/variables.ts new file mode 100644 index 0000000..ea2eb5d --- /dev/null +++ b/ags/HyprPanel/globals/variables.ts @@ -0,0 +1,29 @@ +import { Opt } from 'lib/option'; +import { HexColor, MatugenTheme, RecursiveOptionsObject } from 'lib/types/options'; + +export const isOpt = (value: unknown): value is Opt => + typeof value === 'object' && value !== null && 'value' in value && value instanceof Opt; + +export const isOptString = (value: unknown): value is Opt => { + return value instanceof Opt && typeof value.value === 'string'; +}; + +export const isOptNumber = (value: unknown): value is Opt => { + return value instanceof Opt && typeof value.value === 'number'; +}; + +export const isOptBoolean = (value: unknown): value is Opt => { + return value instanceof Opt && typeof value.value === 'boolean'; +}; + +export const isOptMatugenTheme = (value: unknown): value is Opt => { + return value instanceof Opt && typeof value.value === 'object' && 'specificProperty' in value.value; // Replace 'specificProperty' with an actual property of MatugenTheme +}; + +export const isRecursiveOptionsObject = (value: unknown): value is RecursiveOptionsObject => { + return typeof value === 'object' && value !== null && !(value instanceof Opt); +}; + +export const isHexColor = (val: unknown): val is HexColor => { + return typeof val === 'string' && /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(val); +}; diff --git a/ags/HyprPanel/globals/weather.ts b/ags/HyprPanel/globals/weather.ts new file mode 100644 index 0000000..3da7ba1 --- /dev/null +++ b/ags/HyprPanel/globals/weather.ts @@ -0,0 +1,122 @@ +import options from 'options'; +import { UnitType, Weather, WeatherIconTitle, WeatherIcon } from 'lib/types/weather.js'; +import { DEFAULT_WEATHER } from 'lib/types/defaults/weather.js'; +import GLib from 'gi://GLib?version=2.0'; +import { weatherIcons } from 'modules/icons/weather.js'; + +const { key, interval, location } = options.menus.clock.weather; + +export const globalWeatherVar = Variable(DEFAULT_WEATHER); + +let weatherIntervalInstance: null | number = null; + +const weatherIntervalFn = (weatherInterval: number, loc: string, weatherKey: string): void => { + if (weatherIntervalInstance !== null) { + GLib.source_remove(weatherIntervalInstance); + } + + const formattedLocation = loc.replace(' ', '%20'); + + weatherIntervalInstance = Utils.interval(weatherInterval, () => { + Utils.execAsync( + `curl "https://api.weatherapi.com/v1/forecast.json?key=${weatherKey}&q=${formattedLocation}&days=1&aqi=no&alerts=no"`, + ) + .then((res) => { + try { + if (typeof res !== 'string') { + return (globalWeatherVar.value = DEFAULT_WEATHER); + } + + const parsedWeather = JSON.parse(res); + + if (Object.keys(parsedWeather).includes('error')) { + return (globalWeatherVar.value = DEFAULT_WEATHER); + } + + return (globalWeatherVar.value = parsedWeather); + } catch (error) { + globalWeatherVar.value = DEFAULT_WEATHER; + console.warn(`Failed to parse weather data: ${error}`); + } + }) + .catch((err) => { + console.error(`Failed to fetch weather: ${err}`); + globalWeatherVar.value = DEFAULT_WEATHER; + }); + }); +}; + +Utils.merge([key.bind('value'), interval.bind('value'), location.bind('value')], (weatherKey, weatherInterval, loc) => { + if (!weatherKey) { + return (globalWeatherVar.value = DEFAULT_WEATHER); + } + weatherIntervalFn(weatherInterval, loc, weatherKey); +}); + +export const getTemperature = (wthr: Weather, unt: UnitType): string => { + if (unt === 'imperial') { + return `${Math.ceil(wthr.current.temp_f)}° F`; + } else { + return `${Math.ceil(wthr.current.temp_c)}° C`; + } +}; + +export const getWeatherIcon = (fahren: number): Record => { + const icons = { + 100: '', + 75: '', + 50: '', + 25: '', + 0: '', + } as const; + const colors = { + 100: 'weather-color red', + 75: 'weather-color orange', + 50: 'weather-color lavender', + 25: 'weather-color blue', + 0: 'weather-color sky', + } as const; + + type IconKeys = keyof typeof icons; + + const threshold: IconKeys = + fahren < 0 ? 0 : ([100, 75, 50, 25, 0] as IconKeys[]).find((threshold) => threshold <= fahren) || 0; + + const icon = icons[threshold || 50]; + const color = colors[threshold || 50]; + + return { + icon, + color, + }; +}; + +export const getWindConditions = (wthr: Weather, unt: UnitType): string => { + if (unt === 'imperial') { + return `${Math.floor(wthr.current.wind_mph)} mph`; + } + return `${Math.floor(wthr.current.wind_kph)} kph`; +}; + +export const getRainChance = (wthr: Weather): string => `${wthr.forecast.forecastday[0].day.daily_chance_of_rain}%`; + +export const isValidWeatherIconTitle = (title: string): title is WeatherIconTitle => { + return title in weatherIcons; +}; + +export const getWeatherStatusTextIcon = (wthr: Weather): WeatherIcon => { + let iconQuery = wthr.current.condition.text.trim().toLowerCase().replaceAll(' ', '_'); + + if (!wthr.current.is_day && iconQuery === 'partly_cloudy') { + iconQuery = 'partly_cloudy_night'; + } + + if (isValidWeatherIconTitle(iconQuery)) { + return weatherIcons[iconQuery]; + } else { + console.warn(`Unknown weather icon title: ${iconQuery}`); + return weatherIcons['warning']; + } +}; + +globalThis['globalWeatherVar'] = globalWeatherVar; diff --git a/ags/HyprPanel/globals/window.ts b/ags/HyprPanel/globals/window.ts new file mode 100644 index 0000000..ae823bb --- /dev/null +++ b/ags/HyprPanel/globals/window.ts @@ -0,0 +1,10 @@ +export const WINDOW_LAYOUTS: string[] = [ + 'center', + 'top', + 'top-right', + 'top-center', + 'top-left', + 'bottom-left', + 'bottom-center', + 'bottom-right', +]; diff --git a/ags/HyprPanel/install_fonts.sh b/ags/HyprPanel/install_fonts.sh new file mode 100755 index 0000000..c40b022 --- /dev/null +++ b/ags/HyprPanel/install_fonts.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +SOURCE_DIR="./assets/fonts" +DEST_DIR="$HOME/.local/share/fonts" +DEST_PATH="$DEST_DIR/NFP" + +if [ ! -d "$SOURCE_DIR" ]; then + echo "Source directory '$SOURCE_DIR' does not exist." + exit 1 +fi + +if [ ! -d "$DEST_PATH" ]; then + echo "Destination directory '$DEST_PATH' does not exist. Creating it..." + mkdir -p "$DEST_PATH" +fi + +if [ -z "$(ls -A "$SOURCE_DIR")" ]; then + echo "Source directory '$SOURCE_DIR' is empty. No files to copy." + exit 1 +fi + +echo "Copying fonts from '$SOURCE_DIR' to '$DEST_PATH'..." +cp -r "$SOURCE_DIR"/* "$DEST_PATH" + +echo "Updating font cache..." +fc-cache -fv + +echo "Fonts installed successfully." diff --git a/ags/HyprPanel/lib/constants/colors.ts b/ags/HyprPanel/lib/constants/colors.ts new file mode 100644 index 0000000..95ac5cf --- /dev/null +++ b/ags/HyprPanel/lib/constants/colors.ts @@ -0,0 +1,142 @@ +export const namedColors = new Set([ + 'alice blue', + 'antique white', + 'aqua', + 'aquamarine', + 'azure', + 'beige', + 'bisque', + 'black', + 'blanched almond', + 'blue', + 'blue violet', + 'brown', + 'burlywood', + 'cadet blue', + 'chartreuse', + 'chocolate', + 'coral', + 'cornflower blue', + 'cornsilk', + 'crimson', + 'cyan', + 'dark blue', + 'dark cyan', + 'dark goldenrod', + 'dark gray', + 'dark green', + 'dark khaki', + 'dark magenta', + 'dark olive green', + 'dark orange', + 'dark orchid', + 'dark red', + 'dark salmon', + 'dark sea green', + 'dark slate blue', + 'dark slate gray', + 'dark turquoise', + 'dark violet', + 'deep pink', + 'deep sky blue', + 'dim gray', + 'dodger blue', + 'firebrick', + 'floral white', + 'forest green', + 'fuchsia', + 'gainsboro', + 'ghost white', + 'gold', + 'goldenrod', + 'gray', + 'green', + 'green yellow', + 'honeydew', + 'hot pink', + 'indian red', + 'indigo', + 'ivory', + 'khaki', + 'lavender', + 'lavender blush', + 'lawn green', + 'lemon chiffon', + 'light blue', + 'light coral', + 'light cyan', + 'light goldenrod yellow', + 'light green', + 'light grey', + 'light pink', + 'light salmon', + 'light sea green', + 'light sky blue', + 'light slate gray', + 'light steel blue', + 'light yellow', + 'lime', + 'lime green', + 'linen', + 'magenta', + 'maroon', + 'medium aquamarine', + 'medium blue', + 'medium orchid', + 'medium purple', + 'medium sea green', + 'medium slate blue', + 'medium spring green', + 'medium turquoise', + 'medium violet red', + 'midnight blue', + 'mint cream', + 'misty rose', + 'moccasin', + 'navajo white', + 'navy', + 'old lace', + 'olive', + 'olive drab', + 'orange', + 'orange red', + 'orchid', + 'pale goldenrod', + 'pale green', + 'pale turquoise', + 'pale violet red', + 'papaya whip', + 'peach puff', + 'peru', + 'pink', + 'plum', + 'powder blue', + 'purple', + 'red', + 'rosy brown', + 'royal blue', + 'saddle brown', + 'salmon', + 'sandy brown', + 'sea green', + 'seashell', + 'sienna', + 'silver', + 'sky blue', + 'slate blue', + 'slate gray', + 'snow', + 'spring green', + 'steel blue', + 'tan', + 'teal', + 'thistle', + 'tomato', + 'turquoise', + 'violet', + 'wheat', + 'white', + 'white smoke', + 'yellow', + 'yellow green', +]); diff --git a/ags/HyprPanel/lib/icons.ts b/ags/HyprPanel/lib/icons.ts new file mode 100644 index 0000000..8813940 --- /dev/null +++ b/ags/HyprPanel/lib/icons.ts @@ -0,0 +1,145 @@ +export const substitutes = { + 'transmission-gtk': 'transmission', + 'blueberry.py': 'blueberry', + Caprine: 'facebook-messenger', + 'com.raggesilver.BlackBox-symbolic': 'terminal-symbolic', + 'org.wezfurlong.wezterm-symbolic': 'terminal-symbolic', + 'audio-headset-bluetooth': 'audio-headphones-symbolic', + 'audio-card-analog-usb': 'audio-speakers-symbolic', + 'audio-card-analog-pci': 'audio-card-symbolic', + 'preferences-system': 'emblem-system-symbolic', + 'com.github.Aylur.ags-symbolic': 'controls-symbolic', + 'com.github.Aylur.ags': 'controls-symbolic', +} as const; + +export default { + missing: 'image-missing-symbolic', + nix: { + nix: 'nix-snowflake-symbolic', + }, + app: { + terminal: 'terminal-symbolic', + }, + fallback: { + executable: 'application-x-executable', + notification: 'dialog-information-symbolic', + video: 'video-x-generic-symbolic', + audio: 'audio-x-generic-symbolic', + }, + ui: { + close: 'window-close-symbolic', + colorpicker: 'color-select-symbolic', + info: 'info-symbolic', + link: 'external-link-symbolic', + lock: 'system-lock-screen-symbolic', + menu: 'open-menu-symbolic', + refresh: 'view-refresh-symbolic', + search: 'system-search-symbolic', + settings: 'emblem-system-symbolic', + themes: 'preferences-desktop-theme-symbolic', + tick: 'object-select-symbolic', + time: 'hourglass-symbolic', + toolbars: 'toolbars-symbolic', + warning: 'dialog-warning-symbolic', + avatar: 'avatar-default-symbolic', + arrow: { + right: 'pan-end-symbolic', + left: 'pan-start-symbolic', + down: 'pan-down-symbolic', + up: 'pan-up-symbolic', + }, + }, + audio: { + mic: { + muted: 'microphone-disabled-symbolic', + low: 'microphone-sensitivity-low-symbolic', + medium: 'microphone-sensitivity-medium-symbolic', + high: 'microphone-sensitivity-high-symbolic', + }, + volume: { + muted: 'audio-volume-muted-symbolic', + low: 'audio-volume-low-symbolic', + medium: 'audio-volume-medium-symbolic', + high: 'audio-volume-high-symbolic', + overamplified: 'audio-volume-overamplified-symbolic', + }, + type: { + headset: 'audio-headphones-symbolic', + speaker: 'audio-speakers-symbolic', + card: 'audio-card-symbolic', + }, + mixer: 'mixer-symbolic', + }, + powerprofile: { + balanced: 'power-profile-balanced-symbolic', + 'power-saver': 'power-profile-power-saver-symbolic', + performance: 'power-profile-performance-symbolic', + }, + asusctl: { + profile: { + Balanced: 'power-profile-balanced-symbolic', + Quiet: 'power-profile-power-saver-symbolic', + Performance: 'power-profile-performance-symbolic', + }, + mode: { + Integrated: 'processor-symbolic', + Hybrid: 'controller-symbolic', + }, + }, + battery: { + charging: 'battery-flash-symbolic', + warning: 'battery-empty-symbolic', + }, + bluetooth: { + enabled: 'bluetooth-active-symbolic', + disabled: 'bluetooth-disabled-symbolic', + }, + brightness: { + indicator: 'display-brightness-symbolic', + keyboard: 'keyboard-brightness-symbolic', + screen: 'display-brightness-symbolic', + }, + powermenu: { + sleep: 'weather-clear-night-symbolic', + reboot: 'system-reboot-symbolic', + logout: 'system-log-out-symbolic', + shutdown: 'system-shutdown-symbolic', + }, + recorder: { + recording: 'media-record-symbolic', + }, + notifications: { + noisy: 'org.gnome.Settings-notifications-symbolic', + silent: 'notifications-disabled-symbolic', + message: 'chat-bubbles-symbolic', + }, + trash: { + full: 'user-trash-full-symbolic', + empty: 'user-trash-symbolic', + }, + mpris: { + shuffle: { + enabled: 'media-playlist-shuffle-symbolic', + disabled: 'media-playlist-consecutive-symbolic', + }, + loop: { + none: 'media-playlist-repeat-symbolic', + track: 'media-playlist-repeat-song-symbolic', + playlist: 'media-playlist-repeat-symbolic', + }, + playing: 'media-playback-pause-symbolic', + paused: 'media-playback-start-symbolic', + stopped: 'media-playback-start-symbolic', + prev: 'media-skip-backward-symbolic', + next: 'media-skip-forward-symbolic', + }, + system: { + cpu: 'org.gnome.SystemMonitor-symbolic', + ram: 'drive-harddisk-solidstate-symbolic', + temp: 'temperature-symbolic', + }, + color: { + dark: 'dark-mode-symbolic', + light: 'light-mode-symbolic', + }, +}; diff --git a/ags/HyprPanel/lib/option.ts b/ags/HyprPanel/lib/option.ts new file mode 100644 index 0000000..c261657 --- /dev/null +++ b/ags/HyprPanel/lib/option.ts @@ -0,0 +1,147 @@ +import { isHexColor } from 'globals/variables'; +import { Variable } from 'resource:///com/github/Aylur/ags/variable.js'; +import { MkOptionsResult } from './types/options'; + +type OptProps = { + persistent?: boolean; +}; + +export class Opt extends Variable { + static { + Service.register(this); + } + + constructor(initial: T, { persistent = false }: OptProps = {}) { + super(initial); + this.initial = initial; + this.persistent = persistent; + } + + initial: T; + id = ''; + persistent: boolean; + toString(): string { + return `${this.value}`; + } + toJSON(): string { + return `opt:${this.value}`; + } + + getValue = (): T => { + return super.getValue(); + }; + init(cacheFile: string): void { + const cacheV = JSON.parse(Utils.readFile(cacheFile) || '{}')[this.id]; + if (cacheV !== undefined) this.value = cacheV; + + this.connect('changed', () => { + const cache = JSON.parse(Utils.readFile(cacheFile) || '{}'); + cache[this.id] = this.value; + Utils.writeFileSync(JSON.stringify(cache, null, 2), cacheFile); + }); + } + + reset(): string | undefined { + if (this.persistent) return; + + if (JSON.stringify(this.value) !== JSON.stringify(this.initial)) { + this.value = this.initial; + return this.id; + } + } + + doResetColor(): string | undefined { + if (this.persistent) return; + + const isColor = isHexColor(this.value as string); + if (JSON.stringify(this.value) !== JSON.stringify(this.initial) && isColor) { + this.value = this.initial; + return this.id; + } + return; + } +} + +export const opt = (initial: T, opts?: OptProps): Opt => new Opt(initial, opts); + +const getOptions = (object: Record, path = ''): Opt[] => { + return Object.keys(object).flatMap((key) => { + const obj = object[key]; + const id = path ? path + '.' + key : key; + + if (obj instanceof Variable) { + const optValue = obj as Opt; + optValue.id = id; + return optValue; + } + + if (typeof obj === 'object' && obj !== null) { + return getOptions(obj as Record, id); // Recursively process nested objects + } + + return []; + }); +}; + +export function mkOptions( + cacheFile: string, + object: T, + confFile: string = 'config.json', +): T & MkOptionsResult { + for (const opt of getOptions(object as Record)) opt.init(cacheFile); + + Utils.ensureDirectory(cacheFile.split('/').slice(0, -1).join('/')); + + const configFile = `${TMP}/${confFile}`; + const values = getOptions(object as Record).reduce( + (obj, { id, value }) => ({ [id]: value, ...obj }), + {}, + ); + Utils.writeFileSync(JSON.stringify(values, null, 2), configFile); + Utils.monitorFile(configFile, () => { + const cache = JSON.parse(Utils.readFile(configFile) || '{}'); + for (const opt of getOptions(object as Record)) { + if (JSON.stringify(cache[opt.id]) !== JSON.stringify(opt.value)) opt.value = cache[opt.id]; + } + }); + + function sleep(ms = 0): Promise { + return new Promise((r) => setTimeout(r, ms)); + } + + const reset = async ( + [opt, ...list] = getOptions(object as Record), + id = opt?.reset(), + ): Promise> => { + if (!opt) return sleep().then(() => []); + + return id ? [id, ...(await sleep(50).then(() => reset(list)))] : await sleep().then(() => reset(list)); + }; + + const resetTheme = async ( + [opt, ...list] = getOptions(object as Record), + id = opt?.doResetColor(), + ): Promise> => { + if (!opt) return sleep().then(() => []); + + return id + ? [id, ...(await sleep(50).then(() => resetTheme(list)))] + : await sleep().then(() => resetTheme(list)); + }; + + return Object.assign(object, { + configFile, + array: () => getOptions(object as Record), + async reset() { + return (await reset()).join('\n'); + }, + async resetTheme() { + return (await resetTheme()).join('\n'); + }, + handler(deps: string[], callback: () => void) { + for (const opt of getOptions(object as Record)) { + if (deps.some((i) => opt.id.startsWith(i))) opt.connect('changed', callback); + } + }, + }); +} diff --git a/ags/HyprPanel/lib/session.ts b/ags/HyprPanel/lib/session.ts new file mode 100644 index 0000000..595b366 --- /dev/null +++ b/ags/HyprPanel/lib/session.ts @@ -0,0 +1,16 @@ +import GLib from 'gi://GLib?version=2.0'; + +declare global { + const OPTIONS: string; + const TMP: string; + const USER: string; +} + +Object.assign(globalThis, { + OPTIONS: `${GLib.get_user_cache_dir()}/ags/hyprpanel/options.json`, + TMP: `${GLib.get_tmp_dir()}/ags/hyprpanel`, + USER: GLib.get_user_name(), +}); + +Utils.ensureDirectory(TMP); +App.addIcons(`${App.configDir}/assets`); diff --git a/ags/HyprPanel/lib/shared/media.ts b/ags/HyprPanel/lib/shared/media.ts new file mode 100644 index 0000000..23e0c6f --- /dev/null +++ b/ags/HyprPanel/lib/shared/media.ts @@ -0,0 +1,28 @@ +import { MprisPlayer } from 'types/service/mpris'; +const mpris = await Service.import('mpris'); + +export const getCurrentPlayer = (activePlayer: MprisPlayer = mpris.players[0]): MprisPlayer => { + const statusOrder = { + Playing: 1, + Paused: 2, + Stopped: 3, + }; + + if (mpris.players.length === 0) { + return mpris.players[0]; + } + + const isPlaying = mpris.players.some((p: MprisPlayer) => p.play_back_status === 'Playing'); + + const playerStillExists = mpris.players.some((p) => activePlayer.bus_name === p.bus_name); + + const nextPlayerUp = mpris.players.sort( + (a: MprisPlayer, b: MprisPlayer) => statusOrder[a.play_back_status] - statusOrder[b.play_back_status], + )[0]; + + if (isPlaying || !playerStillExists) { + return nextPlayerUp; + } + + return activePlayer; +}; diff --git a/ags/HyprPanel/lib/shared/notifications.ts b/ags/HyprPanel/lib/shared/notifications.ts new file mode 100644 index 0000000..f772c69 --- /dev/null +++ b/ags/HyprPanel/lib/shared/notifications.ts @@ -0,0 +1,12 @@ +import { Notification } from 'types/service/notifications'; + +export const filterNotifications = (notifications: Notification[], filter: string[]): Notification[] => { + const notifFilter = new Set(filter.map((name: string) => name.toLowerCase().replace(/\s+/g, '_'))); + + const filteredNotifications = notifications.filter((notif: Notification) => { + const normalizedAppName = notif.app_name.toLowerCase().replace(/\s+/g, '_'); + return !notifFilter.has(normalizedAppName); + }); + + return filteredNotifications; +}; diff --git a/ags/HyprPanel/lib/types/audio.d.ts b/ags/HyprPanel/lib/types/audio.d.ts new file mode 100644 index 0000000..9332431 --- /dev/null +++ b/ags/HyprPanel/lib/types/audio.d.ts @@ -0,0 +1,5 @@ +export type InputDevices = Button, Attribute>, Attribute>, Attribute>[]; + +type DummyDevices = Button, Attribute>, Attribute>, Attribute>[]; +type RealPlaybackDevices = Button, Attribute>, Attribute>, Attribute>[]; +export type PlaybackDevices = DummyDevices | RealPlaybackDevices; diff --git a/ags/HyprPanel/lib/types/bar.d.ts b/ags/HyprPanel/lib/types/bar.d.ts new file mode 100644 index 0000000..99066d8 --- /dev/null +++ b/ags/HyprPanel/lib/types/bar.d.ts @@ -0,0 +1,42 @@ +import { Binding, Connectable } from 'types/service'; +import { Variable } from 'types/variable'; +import Box from 'types/widgets/box'; +import Button, { ButtonProps } from 'types/widgets/button'; +import Label from 'types/widgets/label'; +import { Attribute, Child } from './widget'; + +export type BarBoxChild = { + component: Box; + isVisible?: boolean; + isVis?: Variable; + boxClass: string; + tooltip_text?: string | Binding; + props: ButtonProps; +}; + +export type SelfButton = Button; + +export type BoxHook = (self: Box) => void; +export type LabelHook = (self: Label) => void; + +export type Module = { + icon?: string | Binding; + textIcon?: string | Binding; + label?: string | Binding; + labelHook?: LabelHook; + boundLabel?: string; + tooltipText?: string | Binding; + boxClass: string; + props?: ButtonProps; + showLabel?: boolean; + showLabelBinding?: Binding; + hook?: BoxHook; + connection?: Binding; +}; + +export type ResourceLabelType = 'used/total' | 'used' | 'percentage' | 'free'; + +export type NetstatLabelType = 'full' | 'in' | 'out'; +export type RateUnit = 'GiB' | 'MiB' | 'KiB' | 'auto'; + + diff --git a/ags/HyprPanel/lib/types/customModules/generic.d.ts b/ags/HyprPanel/lib/types/customModules/generic.d.ts new file mode 100644 index 0000000..839e04a --- /dev/null +++ b/ags/HyprPanel/lib/types/customModules/generic.d.ts @@ -0,0 +1,13 @@ +export type GenericFunction = (...args: P) => T; + +export type GenericResourceMetrics = { + total: number; + used: number; + percentage: number; +}; + +type GenericResourceData = ResourceUsage & { + free: number; +}; + +export type Postfix = 'TiB' | 'GiB' | 'MiB' | 'KiB' | 'B'; diff --git a/ags/HyprPanel/lib/types/customModules/kbLayout.d.ts b/ags/HyprPanel/lib/types/customModules/kbLayout.d.ts new file mode 100644 index 0000000..b287e06 --- /dev/null +++ b/ags/HyprPanel/lib/types/customModules/kbLayout.d.ts @@ -0,0 +1,32 @@ +import { layoutMap } from 'customModules/kblayout/layouts'; + +export type KbLabelType = 'layout' | 'code'; + +export type HyprctlKeyboard = { + address: string; + name: string; + rules: string; + model: string; + layout: string; + variant: string; + options: string; + active_keymap: string; + main: boolean; +}; + +export type HyprctlMouse = { + address: string; + name: string; + defaultSpeed: number; +}; + +export type HyprctlDeviceLayout = { + mice: HyprctlMouse[]; + keyboards: HyprctlKeyboard[]; + tablets: unknown[]; + touch: unknown[]; + switches: unknown[]; +}; + +export type LayoutKeys = keyof typeof layoutMap; +export type LayoutValues = (typeof layoutMap)[LayoutKeys]; diff --git a/ags/HyprPanel/lib/types/customModules/network.d.ts b/ags/HyprPanel/lib/types/customModules/network.d.ts new file mode 100644 index 0000000..dbef13f --- /dev/null +++ b/ags/HyprPanel/lib/types/customModules/network.d.ts @@ -0,0 +1,4 @@ +export type NetworkResourceData = { + in: string; + out: string; +}; diff --git a/ags/HyprPanel/lib/types/customModules/utils.d.ts b/ags/HyprPanel/lib/types/customModules/utils.d.ts new file mode 100644 index 0000000..14ccf90 --- /dev/null +++ b/ags/HyprPanel/lib/types/customModules/utils.d.ts @@ -0,0 +1,11 @@ +import { Binding } from 'lib/utils'; + +export type InputHandlerEvents = { + onPrimaryClick?: Binding; + onSecondaryClick?: Binding; + onMiddleClick?: Binding; + onScrollUp?: Binding; + onScrollDown?: Binding; +}; + +export type RunAsyncCommand = (cmd: string, args: EventArgs, fn?: (output: string) => void) => void; diff --git a/ags/HyprPanel/lib/types/defaults/bar.ts b/ags/HyprPanel/lib/types/defaults/bar.ts new file mode 100644 index 0000000..78966c4 --- /dev/null +++ b/ags/HyprPanel/lib/types/defaults/bar.ts @@ -0,0 +1,5 @@ +import { NetstatLabelType, ResourceLabelType } from '../bar'; + +export const LABEL_TYPES: ResourceLabelType[] = ['used/total', 'used', 'free', 'percentage']; + +export const NETWORK_LABEL_TYPES: NetstatLabelType[] = ['full', 'in', 'out']; diff --git a/ags/HyprPanel/lib/types/defaults/netstat.ts b/ags/HyprPanel/lib/types/defaults/netstat.ts new file mode 100644 index 0000000..083344b --- /dev/null +++ b/ags/HyprPanel/lib/types/defaults/netstat.ts @@ -0,0 +1,10 @@ +import { RateUnit } from '../bar'; +import { NetworkResourceData } from '../customModules/network'; + +export const GET_DEFAULT_NETSTAT_DATA = (dataType: RateUnit): NetworkResourceData => { + if (dataType === 'auto') { + return { in: `0 Kib/s`, out: `0 Kib/s` }; + } + + return { in: `0 ${dataType}/s`, out: `0 ${dataType}/s` }; +}; diff --git a/ags/HyprPanel/lib/types/defaults/options.ts b/ags/HyprPanel/lib/types/defaults/options.ts new file mode 100644 index 0000000..11b7347 --- /dev/null +++ b/ags/HyprPanel/lib/types/defaults/options.ts @@ -0,0 +1,60 @@ +export const defaultColorMap = { + rosewater: '#f5e0dc', + flamingo: '#f2cdcd', + pink: '#f5c2e7', + mauve: '#cba6f7', + red: '#f38ba8', + maroon: '#eba0ac', + peach: '#fab387', + yellow: '#f9e2af', + green: '#a6e3a1', + teal: '#94e2d5', + sky: '#89dceb', + sapphire: '#74c7ec', + blue: '#89b4fa', + lavender: '#b4befe', + text: '#cdd6f4', + subtext1: '#bac2de', + subtext2: '#a6adc8', + overlay2: '#9399b2', + overlay1: '#7f849c', + overlay0: '#6c7086', + surface2: '#585b70', + surface1: '#45475a', + surface0: '#313244', + base2: '#242438', + base: '#1e1e2e', + mantle: '#181825', + crust: '#11111b', + surface1_2: '#454759', + text2: '#cdd6f3', + pink2: '#f5c2e6', + red2: '#f38ba7', + peach2: '#fab386', + mantle2: '#181824', + surface0_2: '#313243', + surface2_2: '#585b69', + overlay1_2: '#7f849b', + lavender2: '#b4befd', + mauve2: '#cba6f6', + green2: '#a6e3a0', + sky2: '#89dcea', + teal2: '#94e2d4', + yellow2: '#f9e2ad', + maroon2: '#eba0ab', + crust2: '#11111a', + pink3: '#f5c2e8', + red3: '#f38ba9', + mantle3: '#181826', + surface0_3: '#313245', + surface2_3: '#585b71', + overlay1_3: '#7f849d', + lavender3: '#b4beff', + mauve3: '#cba6f8', + green3: '#a6e3a2', + sky3: '#89dcec', + teal3: '#94e2d6', + yellow3: '#f9e2ae', + maroon3: '#eba0ad', + crust3: '#11111c', +} as const; diff --git a/ags/HyprPanel/lib/types/defaults/weather.ts b/ags/HyprPanel/lib/types/defaults/weather.ts new file mode 100644 index 0000000..cde95e3 --- /dev/null +++ b/ags/HyprPanel/lib/types/defaults/weather.ts @@ -0,0 +1,1053 @@ +export const DEFAULT_WEATHER = { + location: { + name: 'Tahiti', + region: 'Somewhere', + country: 'United States of America', + lat: 0, + lon: 0, + tz_id: 'Tahiti', + localtime_epoch: 1721981457, + localtime: '2024-07-26 1:10', + }, + current: { + last_updated_epoch: 1721980800, + last_updated: '2024-07-26 01:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'NW', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0.0, + precip_in: 0.0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + vis_km: 0, + vis_miles: 0, + uv: 0, + gust_mph: 0, + gust_kph: 0, + }, + forecast: { + forecastday: [ + { + date: '2024-07-26', + date_epoch: 1721952000, + day: { + maxtemp_c: 0, + maxtemp_f: 0, + mintemp_c: 0, + mintemp_f: 0, + avgtemp_c: 0, + avgtemp_f: 0, + maxwind_mph: 0, + maxwind_kph: 0, + totalprecip_mm: 0, + totalprecip_in: 0, + totalsnow_cm: 0, + avgvis_km: 0, + avgvis_miles: 0, + avghumidity: 0, + daily_will_it_rain: 0, + daily_chance_of_rain: 0, + daily_will_it_snow: 0, + daily_chance_of_snow: 0, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + uv: 0, + }, + astro: { + sunrise: '06:01 AM', + sunset: '08:10 PM', + moonrise: '11:32 PM', + moonset: '12:01 PM', + moon_phase: 'Waning Gibbous', + moon_illumination: 0, + is_moon_up: 0, + is_sun_up: 0, + }, + hour: [ + { + time_epoch: 1721977200, + time: '2024-07-26 00:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1721980800, + time: '2024-07-26 01:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1721984400, + time: '2024-07-26 02:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1721988000, + time: '2024-07-26 03:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1721991600, + time: '2024-07-26 04:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1721995200, + time: '2024-07-26 05:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1721998800, + time: '2024-07-26 06:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1722002400, + time: '2024-07-26 07:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 7.0, + }, + { + time_epoch: 1722006000, + time: '2024-07-26 08:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 7.0, + }, + { + time_epoch: 1722009600, + time: '2024-07-26 09:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 8.0, + }, + { + time_epoch: 1722013200, + time: '2024-07-26 10:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 8.0, + }, + { + time_epoch: 1722016800, + time: '2024-07-26 11:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 9.0, + }, + { + time_epoch: 1722020400, + time: '2024-07-26 12:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 9.0, + }, + { + time_epoch: 1722024000, + time: '2024-07-26 13:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 9.0, + }, + { + time_epoch: 1722027600, + time: '2024-07-26 14:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 10.0, + }, + { + time_epoch: 1722031200, + time: '2024-07-26 15:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 10.0, + }, + { + time_epoch: 1722034800, + time: '2024-07-26 16:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 10.0, + }, + { + time_epoch: 1722038400, + time: '2024-07-26 17:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 10.0, + }, + { + time_epoch: 1722042000, + time: '2024-07-26 18:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 9.0, + }, + { + time_epoch: 1722045600, + time: '2024-07-26 19:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 9.0, + }, + { + time_epoch: 1722049200, + time: '2024-07-26 20:00', + temp_c: 0, + temp_f: 0, + is_day: 1, + condition: { + text: 'Sunny', + icon: '//cdn.weatherapi.com/weather/64x64/day/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 8.0, + }, + { + time_epoch: 1722052800, + time: '2024-07-26 21:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1722056400, + time: '2024-07-26 22:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + { + time_epoch: 1722060000, + time: '2024-07-26 23:00', + temp_c: 0, + temp_f: 0, + is_day: 0, + condition: { + text: 'Clear ', + icon: '//cdn.weatherapi.com/weather/64x64/night/113.png', + code: 1000, + }, + wind_mph: 0, + wind_kph: 0, + wind_degree: 0, + wind_dir: 'N', + pressure_mb: 0, + pressure_in: 0, + precip_mm: 0, + precip_in: 0, + snow_cm: 0, + humidity: 0, + cloud: 0, + feelslike_c: 0, + feelslike_f: 0, + windchill_c: 0, + windchill_f: 0, + heatindex_c: 0, + heatindex_f: 0, + dewpoint_c: 0, + dewpoint_f: 0, + will_it_rain: 0, + chance_of_rain: 0, + will_it_snow: 0, + chance_of_snow: 0, + vis_km: 0, + vis_miles: 0, + gust_mph: 0, + gust_kph: 0, + uv: 0, + }, + ], + }, + ], + }, +}; diff --git a/ags/HyprPanel/lib/types/dropdownmenu.d.ts b/ags/HyprPanel/lib/types/dropdownmenu.d.ts new file mode 100644 index 0000000..8d76e5c --- /dev/null +++ b/ags/HyprPanel/lib/types/dropdownmenu.d.ts @@ -0,0 +1,12 @@ +import { WindowProps } from 'types/widgets/window'; +import { GtkWidget, Transition } from './widget'; +import { Binding } from 'types/service'; + +export type DropdownMenuProps = { + name: string; + child: GtkWidget; + layout?: string; + transition?: Transition | Binding; + exclusivity?: Exclusivity; + fixed?: boolean; +} & WindowProps; diff --git a/ags/HyprPanel/lib/types/filechooser.d.ts b/ags/HyprPanel/lib/types/filechooser.d.ts new file mode 100644 index 0000000..8bb9d8f --- /dev/null +++ b/ags/HyprPanel/lib/types/filechooser.d.ts @@ -0,0 +1,3 @@ +export type Config = { + [key: string]: string | number | boolean | object; +}; diff --git a/ags/HyprPanel/lib/types/globals.d.ts b/ags/HyprPanel/lib/types/globals.d.ts new file mode 100644 index 0000000..ecdb39f --- /dev/null +++ b/ags/HyprPanel/lib/types/globals.d.ts @@ -0,0 +1,4 @@ +export type MousePos = { + source: string; + pos: number[]; +}; diff --git a/ags/HyprPanel/lib/types/gpustat.d.ts b/ags/HyprPanel/lib/types/gpustat.d.ts new file mode 100644 index 0000000..49dc75d --- /dev/null +++ b/ags/HyprPanel/lib/types/gpustat.d.ts @@ -0,0 +1,25 @@ +export type GPU_Stat_Process = { + username: string; + command: string; + full_command: string[]; + gpu_memory_usage: number; + cpu_percent: number; + cpu_memory_usage: number; + pid: number; +}; + +export type GPU_Stat = { + index: number; + uuid: string; + name: string; + 'temperature.gpu': number; + 'fan.speed': number; + 'utilization.gpu': number; + 'utilization.enc': number; + 'utilization.dec': number; + 'power.draw': number; + 'enforced.power.limit': number; + 'memory.used': number; + 'memory.total': number; + processes: Process[]; +}; diff --git a/ags/HyprPanel/lib/types/mpris.d.ts b/ags/HyprPanel/lib/types/mpris.d.ts new file mode 100644 index 0000000..5450e80 --- /dev/null +++ b/ags/HyprPanel/lib/types/mpris.d.ts @@ -0,0 +1,2 @@ +export type LoopStatus = 'none' | 'track' | 'playlist'; +export type PlaybackStatus = 'playing' | 'paused' | 'stopped'; diff --git a/ags/HyprPanel/lib/types/network.d.ts b/ags/HyprPanel/lib/types/network.d.ts new file mode 100644 index 0000000..58dcdec --- /dev/null +++ b/ags/HyprPanel/lib/types/network.d.ts @@ -0,0 +1,16 @@ +import { WIFI_STATUS_MAP } from 'globals/network'; + +export type AccessPoint = { + bssid: string | null; + address: string | null; + lastSeen: number; + ssid: string | null; + active: boolean; + strength: number; + frequency: number; + iconName: string | undefined; +}; + +export type WifiStatus = keyof typeof WIFI_STATUS_MAP; + +export type WifiIcon = '󰤩' | '󰤨' | '󰤪' | '󰤨' | '󰤩' | '󰤮' | '󰤨' | '󰤥' | '󰤢' | '󰤟' | '󰤯'; diff --git a/ags/HyprPanel/lib/types/notification.d.ts b/ags/HyprPanel/lib/types/notification.d.ts new file mode 100644 index 0000000..027f195 --- /dev/null +++ b/ags/HyprPanel/lib/types/notification.d.ts @@ -0,0 +1,15 @@ +import icons from 'modules/icons/index'; + +export interface NotificationArgs { + appName?: string; + body?: string; + iconName?: string; + id?: number; + summary?: string; + urgency?: Urgency; + category?: string; + timeout?: number; + transient?: boolean; +} + +export type NotificationIcon = keyof typeof icons.notifications; diff --git a/ags/HyprPanel/lib/types/options.d.ts b/ags/HyprPanel/lib/types/options.d.ts new file mode 100644 index 0000000..51e7f76 --- /dev/null +++ b/ags/HyprPanel/lib/types/options.d.ts @@ -0,0 +1,217 @@ +import { Opt } from 'lib/option'; +import { Variable } from 'types/variable'; +import { defaultColorMap } from './defaults/options'; + +export type MkOptionsResult = { + configFile: string; + array: () => Opt[]; + reset: () => Promise; + resetTheme: () => Promise; + handler: (deps: string[], callback: () => void) => void; +}; + +export type RecursiveOptionsObject = { + [key: string]: RecursiveOptionsObject | Opt | Opt | Opt; +}; + +export type BarLocation = 'top' | 'bottom'; + +export type Unit = 'imperial' | 'metric'; +export type PowerOptions = 'sleep' | 'reboot' | 'logout' | 'shutdown'; +export type NotificationAnchor = + | 'top' + | 'top right' + | 'top left' + | 'bottom' + | 'bottom right' + | 'bottom left' + | 'left' + | 'right'; +export type OSDAnchor = 'top left' | 'top' | 'top right' | 'right' | 'bottom right' | 'bottom' | 'bottom left' | 'left'; +export type BarButtonStyles = 'default' | 'split' | 'wave' | 'wave2'; + +export type ThemeExportData = { + filePath: string; + themeOnly: boolean; +}; +export type RowProps = { + opt: Opt; + title: string; + note?: string; + type?: + | 'number' + | 'color' + | 'float' + | 'object' + | 'string' + | 'enum' + | 'boolean' + | 'img' + | 'wallpaper' + | 'export' + | 'import' + | 'config_import' + | 'font'; + enums?: T[]; + max?: number; + min?: number; + disabledBinding?: Variable; + exportData?: ThemeExportData; + subtitle?: string | VarType | Opt; + subtitleLink?: string; + dependencies?: string[]; + increment?: number; +}; + +export type OSDOrientation = 'horizontal' | 'vertical'; + +export type HexColor = `#${string}`; + +export type WindowLayer = 'top' | 'bottom' | 'overlay' | 'background'; + +export type ActiveWsIndicator = 'underline' | 'highlight' | 'color'; + +export type MatugenColors = { + background: HexColor; + error: HexColor; + error_container: HexColor; + inverse_on_surface: HexColor; + inverse_primary: HexColor; + inverse_surface: HexColor; + on_background: HexColor; + on_error: HexColor; + on_error_container: HexColor; + on_primary: HexColor; + on_primary_container: HexColor; + on_primary_fixed: HexColor; + on_primary_fixed_variant: HexColor; + on_secondary: HexColor; + on_secondary_container: HexColor; + on_secondary_fixed: HexColor; + on_secondary_fixed_variant: HexColor; + on_surface: HexColor; + on_surface_variant: HexColor; + on_tertiary: HexColor; + on_tertiary_container: HexColor; + on_tertiary_fixed: HexColor; + on_tertiary_fixed_variant: HexColor; + outline: HexColor; + outline_variant: HexColor; + primary: HexColor; + primary_container: HexColor; + primary_fixed: HexColor; + primary_fixed_dim: HexColor; + scrim: HexColor; + secondary: HexColor; + secondary_container: HexColor; + secondary_fixed: HexColor; + secondary_fixed_dim: HexColor; + shadow: HexColor; + surface: HexColor; + surface_bright: HexColor; + surface_container: HexColor; + surface_container_high: HexColor; + surface_container_highest: HexColor; + surface_container_low: HexColor; + surface_container_lowest: HexColor; + surface_dim: HexColor; + surface_variant: HexColor; + tertiary: HexColor; + tertiary_container: HexColor; + tertiary_fixed: HexColor; + tertiary_fixed_dim: HexColor; +}; + +export type MatugenVariation = { + rosewater: HexColor; + flamingo: HexColor; + pink: HexColor; + mauve: HexColor; + red: HexColor; + maroon: HexColor; + peach: HexColor; + yellow: HexColor; + green: HexColor; + teal: HexColor; + sky: HexColor; + sapphire: HexColor; + blue: HexColor; + lavender: HexColor; + text: HexColor; + subtext1: HexColor; + subtext2: HexColor; + overlay2: HexColor; + overlay1: HexColor; + overlay0: HexColor; + surface2: HexColor; + surface1: HexColor; + surface0: HexColor; + base2: HexColor; + base: HexColor; + mantle: HexColor; + crust: HexColor; + notifications_closer: HexColor; + notifications_background: HexColor; + dashboard_btn_text: HexColor; + red2: HexColor; + peach2: HexColor; + pink2: HexColor; + mantle2: HexColor; + surface1_2: HexColor; + surface0_2: HexColor; + overlay1_2: HexColor; + text2: HexColor; + lavender2: HexColor; + crust2: HexColor; + maroon2: HexColor; + mauve2: HexColor; + green2: HexColor; + surface2_2: HexColor; + sky2: HexColor; + teal2: HexColor; + yellow2: HexColor; + pink3: HexColor; + red3: HexColor; + mantle3: HexColor; + surface0_3: HexColor; + surface2_3: HexColor; + overlay1_3: HexColor; + lavender3: HexColor; + mauve3: HexColor; + green3: HexColor; + sky3: HexColor; + teal3: HexColor; + yellow3: HexColor; + maroon3: HexColor; + crust3: HexColor; + notifications_closer?: HexColor; + notifications_background?: HexColor; + dashboard_btn_text?: HexColor; +}; +export type MatugenScheme = + | 'content' + | 'expressive' + | 'fidelity' + | 'fruit-salad' + | 'monochrome' + | 'neutral' + | 'rainbow' + | 'tonal-spot'; + +export type MatugenVariations = + | 'standard_1' + | 'standard_2' + | 'standard_3' + | 'monochrome_1' + | 'monochrome_2' + | 'monochrome_3' + | 'vivid_1' + | 'vivid_2' + | 'vivid_3'; + +type MatugenTheme = 'light' | 'dark'; + +export type ColorMapKey = keyof typeof defaultColorMap; +export type ColorMapValue = (typeof defaultColorMap)[ColorMapKey]; + +export type ScalingPriority = 'gdk' | 'hyprland' | 'both'; diff --git a/ags/HyprPanel/lib/types/popupwindow.d.ts b/ags/HyprPanel/lib/types/popupwindow.d.ts new file mode 100644 index 0000000..300baab --- /dev/null +++ b/ags/HyprPanel/lib/types/popupwindow.d.ts @@ -0,0 +1,35 @@ +import { Widget } from 'types/widgets/widget'; +import { WindowProps } from 'types/widgets/window'; +import { Transition } from './widget'; + +export type PopupWindowProps = { + name: string; + child: Widget; + layout?: Layouts; + transition?: Transition | Binding; + exclusivity?: Exclusivity; +} & WindowProps; + +export type LayoutFunction = ( + name: string, + child: Widget, + transition: Transition, +) => { + center: () => Widget; + top: () => Widget; + 'top-right': () => Widget; + 'top-center': () => Widget; + 'top-left': () => Widget; + 'bottom-left': () => Widget; + 'bottom-center': () => Widget; + 'bottom-right': () => Widget; +}; +export type Layouts = + | 'center' + | 'top' + | 'top-right' + | 'top-center' + | 'top-left' + | 'bottom-left' + | 'bottom-center' + | 'bottom-right'; diff --git a/ags/HyprPanel/lib/types/power.d.ts b/ags/HyprPanel/lib/types/power.d.ts new file mode 100644 index 0000000..ef3c536 --- /dev/null +++ b/ags/HyprPanel/lib/types/power.d.ts @@ -0,0 +1 @@ +export type Action = 'sleep' | 'reboot' | 'logout' | 'shutdown'; diff --git a/ags/HyprPanel/lib/types/powerprofiles.d.ts b/ags/HyprPanel/lib/types/powerprofiles.d.ts new file mode 100644 index 0000000..980ac3b --- /dev/null +++ b/ags/HyprPanel/lib/types/powerprofiles.d.ts @@ -0,0 +1,7 @@ +import PowerProfiles from 'types/service/powerprofiles.js'; + +export type PowerProfiles = InstanceType; +export type PowerProfile = 'power-saver' | 'balanced' | 'performance'; +export type PowerProfileObject = { + [key: string]: string; +}; diff --git a/ags/HyprPanel/lib/types/systray.d.ts b/ags/HyprPanel/lib/types/systray.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/ags/HyprPanel/lib/types/utils.d.ts b/ags/HyprPanel/lib/types/utils.d.ts new file mode 100644 index 0000000..b35af46 --- /dev/null +++ b/ags/HyprPanel/lib/types/utils.d.ts @@ -0,0 +1,7 @@ +import { substitutes } from 'lib/icons'; +import { EventArgs } from './widget'; + +type SubstituteKeys = keyof typeof substitutes; + +export type ThrottleFn = (cmd: string, args: EventArgs, fn?: (output: string) => void) => void; +export type ThrottleFnCallback = ((output: string) => void) | undefined; diff --git a/ags/HyprPanel/lib/types/variable.d.ts b/ags/HyprPanel/lib/types/variable.d.ts new file mode 100644 index 0000000..af540dd --- /dev/null +++ b/ags/HyprPanel/lib/types/variable.d.ts @@ -0,0 +1 @@ +export type Bind = OriginalBinding, unknown>; diff --git a/ags/HyprPanel/lib/types/volume.d.ts b/ags/HyprPanel/lib/types/volume.d.ts new file mode 100644 index 0000000..5e2cf32 --- /dev/null +++ b/ags/HyprPanel/lib/types/volume.d.ts @@ -0,0 +1,3 @@ +export type VolumeIcons = { + [index: number]: string; +}; diff --git a/ags/HyprPanel/lib/types/weather.d.ts b/ags/HyprPanel/lib/types/weather.d.ts new file mode 100644 index 0000000..daf0e1a --- /dev/null +++ b/ags/HyprPanel/lib/types/weather.d.ts @@ -0,0 +1,118 @@ +import { weatherIcons } from 'modules/icons/weather'; + +export type UnitType = 'imperial' | 'metric'; + +export type Weather = { + location: Location; + current: Current; + forecast: Forecast; +}; + +export type Current = { + last_updated_epoch?: number; + last_updated?: string; + temp_c: number; + temp_f: number; + is_day: number; + condition: Condition; + wind_mph: number; + wind_kph: number; + wind_degree: number; + wind_dir: string; + pressure_mb: number; + pressure_in: number; + precip_mm: number; + precip_in: number; + humidity: number; + cloud: number; + feelslike_c: number; + feelslike_f: number; + windchill_c: number; + windchill_f: number; + heatindex_c: number; + heatindex_f: number; + dewpoint_c: number; + dewpoint_f: number; + vis_km: number; + vis_miles: number; + uv: number; + gust_mph: number; + gust_kph: number; + time_epoch?: number; + time?: string; + snow_cm?: number; + will_it_rain?: number; + chance_of_rain?: number; + will_it_snow?: number; + chance_of_snow?: number; +}; + +export type Condition = { + text: string; + icon: string; + code: number; +}; + +export type Forecast = { + forecastday: Forecastday[]; +}; + +export type Forecastday = { + date: string; + date_epoch: number; + day: Day; + astro: Astro; + hour: Current[]; +}; + +export type Astro = { + sunrise: string; + sunset: string; + moonrise: string; + moonset: string; + moon_phase: string; + moon_illumination: number; + is_moon_up: number; + is_sun_up: number; +}; + +export type Day = { + maxtemp_c: number; + maxtemp_f: number; + mintemp_c: number; + mintemp_f: number; + avgtemp_c: number; + avgtemp_f: number; + maxwind_mph: number; + maxwind_kph: number; + totalprecip_mm: number; + totalprecip_in: number; + totalsnow_cm: number; + avgvis_km: number; + avgvis_miles: number; + avghumidity: number; + daily_will_it_rain: number; + daily_chance_of_rain: number; + daily_will_it_snow: number; + daily_chance_of_snow: number; + condition: Condition; + uv: number; +}; + +export type Location = { + name: string; + region: string; + country: string; + lat: number; + lon: number; + tz_id: string; + localtime_epoch: number; + localtime: string; +}; + +export type TemperatureIconColorMap = { + [key: number]: string; +}; + +export type WeatherIconTitle = keyof typeof weatherIcons; +export type WeatherIcon = (typeof weatherIcons)[WeatherIconTitle]; diff --git a/ags/HyprPanel/lib/types/widget.d.ts b/ags/HyprPanel/lib/types/widget.d.ts new file mode 100644 index 0000000..ebb09a4 --- /dev/null +++ b/ags/HyprPanel/lib/types/widget.d.ts @@ -0,0 +1,29 @@ +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0'; +import Box from 'types/widgets/box'; + +export type Exclusivity = 'normal' | 'ignore' | 'exclusive'; +export type Anchor = 'left' | 'right' | 'top' | 'down'; +export type Transition = 'none' | 'crossfade' | 'slide_right' | 'slide_left' | 'slide_up' | 'slide_down'; + +export type Layouts = + | 'center' + | 'top' + | 'top-right' + | 'top-center' + | 'top-left' + | 'bottom-left' + | 'bottom-center' + | 'bottom-right'; + +export type Attribute = unknown; +export type Child = Gtk.Widget; +export type GtkWidget = Gtk.Widget; +export type BoxWidget = Box; + +export type GButton = Gtk.Button; +export type GBox = Gtk.Box; +export type GLabel = Gtk.Label; +export type GCenterBox = Gtk.Box; + +export type EventHandler = (self: Self, event: Gdk.Event) => boolean | unknown; +export type EventArgs = { clicked: Button; event: Gdk.Event }; diff --git a/ags/HyprPanel/lib/types/workspace.d.ts b/ags/HyprPanel/lib/types/workspace.d.ts new file mode 100644 index 0000000..9c46c15 --- /dev/null +++ b/ags/HyprPanel/lib/types/workspace.d.ts @@ -0,0 +1,25 @@ +export type WorkspaceRule = { + workspaceString: string; + monitor: string; +}; + +export type WorkspaceMap = { + [key: string]: number[]; +}; + +export type MonitorMap = { + [key: number]: string; +}; + +export type WorkspaceIcons = { + [key: string]: string; +}; + +export type WorkspaceIconsColored = { + [key: string]: { + color: string; + icon: string; + }; +}; + +export type WorkspaceIconMap = WorkspaceIcons | WorkspaceIconsColored; diff --git a/ags/HyprPanel/lib/utils.ts b/ags/HyprPanel/lib/utils.ts new file mode 100644 index 0000000..8b8fd04 --- /dev/null +++ b/ags/HyprPanel/lib/utils.ts @@ -0,0 +1,195 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { type Application } from 'types/service/applications'; +import { NotificationAnchor } from './types/options'; +import { OSDAnchor } from 'lib/types/options'; +import icons, { substitutes } from './icons'; +import Gtk from 'gi://Gtk?version=3.0'; +import Gdk from 'gi://Gdk'; +import GLib from 'gi://GLib?version=2.0'; +import GdkPixbuf from 'gi://GdkPixbuf'; +import { NotificationArgs } from 'types/utils/notify'; +import { SubstituteKeys } from './types/utils'; +import { Window } from 'types/@girs/gtk-3.0/gtk-3.0.cjs'; +import { namedColors } from './constants/colors'; + +export type Binding = import('types/service').Binding; + +/** + * @returns substitute icon || name || fallback icon + */ +export function icon(name: string | null, fallback = icons.missing): string { + const validateSubstitute = (name: string): name is SubstituteKeys => name in substitutes; + + if (!name) return fallback || ''; + + if (GLib.file_test(name, GLib.FileTest.EXISTS)) return name; + + let icon: string = name; + + if (validateSubstitute(name)) { + icon = substitutes[name]; + } + + if (Utils.lookUpIcon(icon)) return icon; + + print(`no icon substitute "${icon}" for "${name}", fallback: "${fallback}"`); + return fallback; +} + +/** + * @returns execAsync(["bash", "-c", cmd]) + */ +export async function bash(strings: TemplateStringsArray | string, ...values: unknown[]): Promise { + const cmd = + typeof strings === 'string' ? strings : strings.flatMap((str, i) => str + `${values[i] ?? ''}`).join(''); + + return Utils.execAsync(['bash', '-c', cmd]).catch((err) => { + console.error(cmd, err); + return ''; + }); +} + +/** + * @returns execAsync(cmd) + */ +export async function sh(cmd: string | string[]): Promise { + return Utils.execAsync(cmd).catch((err) => { + console.error(typeof cmd === 'string' ? cmd : cmd.join(' '), err); + return ''; + }); +} + +export function forMonitors(widget: (monitor: number) => Gtk.Window): Window[] { + const n = Gdk.Display.get_default()?.get_n_monitors() || 1; + return range(n, 0).flatMap(widget); +} + +/** + * @returns [start...length] + */ +export function range(length: number, start = 1): number[] { + return Array.from({ length }, (_, i) => i + start); +} + +/** + * @returns true if all of the `bins` are found + */ +export function dependencies(...bins: string[]): boolean { + const missing = bins.filter((bin) => + Utils.exec({ + cmd: `which ${bin}`, + out: () => false, + err: () => true, + }), + ); + + if (missing.length > 0) { + console.warn(Error(`missing dependencies: ${missing.join(', ')}`)); + Notify({ + summary: 'Dependencies not found!', + body: `The following dependencies are missing: ${missing.join(', ')}`, + iconName: icons.ui.warning, + timeout: 7000, + }); + } + + return missing.length === 0; +} + +/** + * run app detached + */ +export function launchApp(app: Application): void { + const exe = app.executable + .split(/\s+/) + .filter((str) => !str.startsWith('%') && !str.startsWith('@')) + .join(' '); + + bash(`${exe} &`); + app.frequency += 1; +} + +/** + * to use with drag and drop + */ +export function createSurfaceFromWidget(widget: Gtk.Widget): GdkPixbuf.Pixbuf { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const cairo = imports.gi.cairo as any; + const alloc = widget.get_allocation(); + const surface = new cairo.ImageSurface(cairo.Format.ARGB32, alloc.width, alloc.height); + const cr = new cairo.Context(surface); + cr.setSourceRGBA(255, 255, 255, 0); + cr.rectangle(0, 0, alloc.width, alloc.height); + cr.fill(); + widget.draw(cr); + return surface; +} + +/** + * Ensure that the provided filepath is a valid image + */ +export const isAnImage = (imgFilePath: string): boolean => { + try { + GdkPixbuf.Pixbuf.new_from_file(imgFilePath); + return true; + } catch (error) { + console.error(error); + return false; + } +}; + +export const Notify = (notifPayload: NotificationArgs): void => { + let command = 'notify-send'; + command += ` "${notifPayload.summary} "`; + if (notifPayload.body) command += ` "${notifPayload.body}" `; + if (notifPayload.appName) command += ` -a "${notifPayload.appName}"`; + if (notifPayload.iconName) command += ` -i "${notifPayload.iconName}"`; + if (notifPayload.urgency) command += ` -u "${notifPayload.urgency}"`; + if (notifPayload.timeout !== undefined) command += ` -t ${notifPayload.timeout}`; + if (notifPayload.category) command += ` -c "${notifPayload.category}"`; + if (notifPayload.transient) command += ` -e`; + if (notifPayload.id !== undefined) command += ` -r ${notifPayload.id}`; + + Utils.execAsync(command); +}; + +export const getPosition = (pos: NotificationAnchor | OSDAnchor): ('top' | 'bottom' | 'left' | 'right')[] => { + const positionMap: { [key: string]: ('top' | 'bottom' | 'left' | 'right')[] } = { + top: ['top'], + 'top right': ['top', 'right'], + 'top left': ['top', 'left'], + bottom: ['bottom'], + 'bottom right': ['bottom', 'right'], + 'bottom left': ['bottom', 'left'], + right: ['right'], + left: ['left'], + }; + + return positionMap[pos] || ['top']; +}; +export const isValidGjsColor = (color: string): boolean => { + const colorLower = color.toLowerCase().trim(); + + if (namedColors.has(colorLower)) { + return true; + } + + const hexColorRegex = /^#(?:[a-fA-F0-9]{3,4}|[a-fA-F0-9]{6,8})$/; + + const rgbRegex = /^rgb\(\s*(\d{1,3}%?\s*,\s*){2}\d{1,3}%?\s*\)$/; + const rgbaRegex = /^rgba\(\s*(\d{1,3}%?\s*,\s*){3}(0|1|0?\.\d+)\s*\)$/; + + if (hexColorRegex.test(color)) { + return true; + } + + if (rgbRegex.test(colorLower) || rgbaRegex.test(colorLower)) { + return true; + } + + return false; +}; + +export const capitalizeFirstLetter = (str: string): string => { + return str.charAt(0).toUpperCase() + str.slice(1); +}; diff --git a/ags/HyprPanel/lib/variables.ts b/ags/HyprPanel/lib/variables.ts new file mode 100644 index 0000000..303c121 --- /dev/null +++ b/ags/HyprPanel/lib/variables.ts @@ -0,0 +1,15 @@ +import GLib from 'gi://GLib'; +import { DateTime } from 'types/@girs/glib-2.0/glib-2.0.cjs'; + +export const clock = Variable(GLib.DateTime.new_now_local(), { + poll: [1000, (): DateTime => GLib.DateTime.new_now_local()], +}); + +export const uptime = Variable(0, { + poll: [60_000, 'cat /proc/uptime', (line): number => Number.parseInt(line.split('.')[0]) / 60], +}); + +export const distro = { + id: GLib.get_os_info('ID'), + logo: GLib.get_os_info('LOGO'), +}; diff --git a/ags/HyprPanel/main.ts b/ags/HyprPanel/main.ts new file mode 100644 index 0000000..399c1f9 --- /dev/null +++ b/ags/HyprPanel/main.ts @@ -0,0 +1,22 @@ +import 'lib/session'; +import 'scss/style'; +import 'globals/useTheme'; +import 'globals/dropdown.js'; +import 'globals/utilities'; + +import { Bar } from 'modules/bar/Bar'; +import MenuWindows from './modules/menus/main.js'; +import SettingsDialog from 'widget/settings/SettingsDialog'; +import Notifications from './modules/notifications/index.js'; +import { forMonitors } from 'lib/utils'; +import OSD from 'modules/osd/index'; + +App.config({ + onConfigParsed: () => Utils.execAsync(`python3 ${App.configDir}/services/bluetooth.py`), + windows: [...MenuWindows, Notifications(), SettingsDialog(), ...forMonitors(Bar), OSD()], + closeWindowDelay: { + sideright: 350, + launcher: 350, + bar0: 350, + }, +}); diff --git a/ags/HyprPanel/modules/bar/Bar.ts b/ags/HyprPanel/modules/bar/Bar.ts new file mode 100644 index 0000000..b5eff25 --- /dev/null +++ b/ags/HyprPanel/modules/bar/Bar.ts @@ -0,0 +1,315 @@ +const hyprland = await Service.import('hyprland'); + +import { + Menu, + Workspaces, + ClientTitle, + Media, + Notifications, + Volume, + Network, + Bluetooth, + BatteryLabel, + Clock, + SysTray, + + // Custom Modules + Ram, + Cpu, + Storage, + Netstat, + KbInput, + Updates, + Submap, + Weather, + Power, +} from './Exports'; + +import { BarItemBox as WidgetContainer } from '../shared/barItemBox.js'; +import options from 'options'; +import Gdk from 'gi://Gdk?version=3.0'; +import Button from 'types/widgets/button.js'; +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0.js'; + +import './SideEffects'; +import { WindowLayer } from 'lib/types/options.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import Window from 'types/widgets/window.js'; + +const { layouts } = options.bar; +const { location } = options.theme.bar; + +export type BarWidget = keyof typeof widget; + +type Section = + | 'battery' + | 'dashboard' + | 'workspaces' + | 'windowtitle' + | 'media' + | 'notifications' + | 'volume' + | 'network' + | 'bluetooth' + | 'clock' + | 'ram' + | 'cpu' + | 'storage' + | 'netstat' + | 'kbinput' + | 'updates' + | 'submap' + | 'weather' + | 'power' + | 'systray'; + +type Layout = { + left: Section[]; + middle: Section[]; + right: Section[]; +}; + +type BarLayout = { + [key: string]: Layout; +}; + +const getLayoutForMonitor = (monitor: number, layouts: BarLayout): Layout => { + const matchingKey = Object.keys(layouts).find((key) => key === monitor.toString()); + const wildcard = Object.keys(layouts).find((key) => key === '*'); + + if (matchingKey) { + return layouts[matchingKey]; + } + + if (wildcard) { + return layouts[wildcard]; + } + + return { + left: ['dashboard', 'workspaces', 'windowtitle'], + middle: ['media'], + right: ['volume', 'network', 'bluetooth', 'battery', 'systray', 'clock', 'notifications'], + }; +}; + +const widget = { + battery: (): Button => WidgetContainer(BatteryLabel()), + dashboard: (): Button => WidgetContainer(Menu()), + workspaces: (monitor: number): Button => WidgetContainer(Workspaces(monitor)), + windowtitle: (): Button => WidgetContainer(ClientTitle()), + media: (): Button => WidgetContainer(Media()), + notifications: (): Button => WidgetContainer(Notifications()), + volume: (): Button => WidgetContainer(Volume()), + network: (): Button => WidgetContainer(Network()), + bluetooth: (): Button => WidgetContainer(Bluetooth()), + clock: (): Button => WidgetContainer(Clock()), + systray: (): Button => WidgetContainer(SysTray()), + ram: (): Button => WidgetContainer(Ram()), + cpu: (): Button => WidgetContainer(Cpu()), + storage: (): Button => WidgetContainer(Storage()), + netstat: (): Button => WidgetContainer(Netstat()), + kbinput: (): Button => WidgetContainer(KbInput()), + updates: (): Button => WidgetContainer(Updates()), + submap: (): Button => WidgetContainer(Submap()), + weather: (): Button => WidgetContainer(Weather()), + power: (): Button => WidgetContainer(Power()), +}; + +type GdkMonitors = { + [key: string]: { + key: string; + model: string; + used: boolean; + }; +}; + +function getGdkMonitors(): GdkMonitors { + const display = Gdk.Display.get_default(); + + if (display === null) { + console.error('Failed to get Gdk display.'); + return {}; + } + + const numGdkMonitors = display.get_n_monitors(); + const gdkMonitors: GdkMonitors = {}; + + for (let i = 0; i < numGdkMonitors; i++) { + const curMonitor = display.get_monitor(i); + + if (curMonitor === null) { + console.warn(`Monitor at index ${i} is null.`); + continue; + } + + const model = curMonitor.get_model() || ''; + const geometry = curMonitor.get_geometry(); + const scaleFactor = curMonitor.get_scale_factor(); + + const key = `${model}_${geometry.width}x${geometry.height}_${scaleFactor}`; + gdkMonitors[i] = { key, model, used: false }; + } + + return gdkMonitors; +} + +/** + * NOTE: Some more funky stuff being done by GDK. + * We render windows/bar based on the monitor ID. So if you have 3 monitors, then your + * monitor IDs will be [0, 1, 2]. Hyprland will NEVER change what ID belongs to what monitor. + * + * So if hyprland determines id 0 = DP-1, even after you unplug, shut off or restart your monitor, + * the id 0 will ALWAYS be DP-1. + * + * However, GDK (the righteous genius that it is) will change the order of ID anytime your monitor + * setup is changed. So if you unplug your monitor and plug it back it, it now becomes the last id. + * So if DP-1 was id 0 and you unplugged it, it will reconfigure to id 2. This sucks because now + * there's a mismtach between what GDK determines the monitor is at id 2 and what Hyprland determines + * is at id 2. + * + * So for that reason, we need to redirect the input `monitor` that the Bar module takes in, to the + * proper Hyprland monitor. So when monitor id 0 comes in, we need to find what the id of that monitor + * is being determined as by Hyprland so the bars show up on the right monitors. + * + * Since GTK3 doesn't contain connection names and only monitor models, we have to make the best guess + * in the case that there are multiple models in the same resolution with the same scale. We find the + * 'right' monitor by checking if the model matches along with the resolution and scale. If monitor at + * ID 0 for GDK is being reported as 'MSI MAG271CQR' we find the same model in the Hyprland monitor list + * and check if the resolution and scaling is the same... if it is then we determine it's a match. + * + * The edge-case that we just can't handle is if you have the same monitors in the same resolution at the same + * scale. So if you've got 2 'MSI MAG271CQR' monitors at 2560x1440 at scale 1, then we just match the first + * monitor in the list as the first match and then the second 'MSI MAG271CQR' as a match in the 2nd iteration. + * You may have the bar showing up on the wrong one in this case because we don't know what the connector id + * is of either of these monitors (DP-1, DP-2) which are unique values - as these are only in GTK4. + * + * Keep in mind though, this is ONLY an issue if you change your monitor setup by plugging in a new one, restarting + * an existing one or shutting it off. + * + * If your monitors aren't changed in the current session you're in then none of this safeguarding is relevant. + * + * Fun stuff really... :facepalm: + */ + +const gdkMonitorIdToHyprlandId = (monitor: number, usedHyprlandMonitors: Set): number => { + const gdkMonitors = getGdkMonitors(); + + if (Object.keys(gdkMonitors).length === 0) { + console.error('No GDK monitors were found.'); + return monitor; + } + + // Get the GDK monitor for the given monitor index + const gdkMonitor = gdkMonitors[monitor]; + + // First pass: Strict matching including the monitor index (i.e., hypMon.id === monitor + resolution+scale criteria) + const directMatch = hyprland.monitors.find((hypMon) => { + const hyprlandKey = `${hypMon.model}_${hypMon.width}x${hypMon.height}_${hypMon.scale}`; + return gdkMonitor.key.startsWith(hyprlandKey) && !usedHyprlandMonitors.has(hypMon.id) && hypMon.id === monitor; + }); + + if (directMatch) { + usedHyprlandMonitors.add(directMatch.id); + return directMatch.id; + } + + // Second pass: Relaxed matching without considering the monitor index + const hyprlandMonitor = hyprland.monitors.find((hypMon) => { + const hyprlandKey = `${hypMon.model}_${hypMon.width}x${hypMon.height}_${hypMon.scale}`; + return gdkMonitor.key.startsWith(hyprlandKey) && !usedHyprlandMonitors.has(hypMon.id); + }); + + if (hyprlandMonitor) { + usedHyprlandMonitors.add(hyprlandMonitor.id); + return hyprlandMonitor.id; + } + + // Fallback: Find the first available monitor ID that hasn't been used + const fallbackMonitor = hyprland.monitors.find((hypMon) => !usedHyprlandMonitors.has(hypMon.id)); + + if (fallbackMonitor) { + usedHyprlandMonitors.add(fallbackMonitor.id); + return fallbackMonitor.id; + } + + // Ensure we return a valid monitor ID that actually exists + for (let i = 0; i < hyprland.monitors.length; i++) { + if (!usedHyprlandMonitors.has(i)) { + usedHyprlandMonitors.add(i); + return i; + } + } + + // As a last resort, return the original monitor index if no unique monitor can be found + console.warn(`Returning original monitor index as a last resort: ${monitor}`); + return monitor; +}; + +export const Bar = (() => { + const usedHyprlandMonitors = new Set(); + + return (monitor: number): Window => { + const hyprlandMonitor = gdkMonitorIdToHyprlandId(monitor, usedHyprlandMonitors); + + return Widget.Window({ + name: `bar-${hyprlandMonitor}`, + class_name: 'bar', + monitor, + visible: true, + anchor: location.bind('value').as((ln) => [ln, 'left', 'right']), + exclusivity: 'exclusive', + layer: Utils.merge( + [options.theme.bar.layer.bind('value'), options.tear.bind('value')], + (barLayer: WindowLayer, tear: boolean) => { + if (tear && barLayer === 'overlay') { + return 'top'; + } + return barLayer; + }, + ), + child: Widget.Box({ + class_name: 'bar-panel-container', + child: Widget.CenterBox({ + class_name: 'bar-panel', + css: 'padding: 1px', + startWidget: Widget.Box({ + class_name: 'box-left', + hexpand: true, + setup: (self) => { + self.hook(layouts, (self) => { + const foundLayout = getLayoutForMonitor(hyprlandMonitor, layouts.value as BarLayout); + self.children = foundLayout.left + .filter((mod) => Object.keys(widget).includes(mod)) + .map((w) => widget[w](hyprlandMonitor) as Button); + }); + }, + }), + centerWidget: Widget.Box({ + class_name: 'box-center', + hpack: 'center', + setup: (self) => { + self.hook(layouts, (self) => { + const foundLayout = getLayoutForMonitor(hyprlandMonitor, layouts.value as BarLayout); + self.children = foundLayout.middle + .filter((mod) => Object.keys(widget).includes(mod)) + .map((w) => widget[w](hyprlandMonitor) as Button); + }); + }, + }), + endWidget: Widget.Box({ + class_name: 'box-right', + hpack: 'end', + setup: (self) => { + self.hook(layouts, (self) => { + const foundLayout = getLayoutForMonitor(hyprlandMonitor, layouts.value as BarLayout); + self.children = foundLayout.right + .filter((mod) => Object.keys(widget).includes(mod)) + .map((w) => widget[w](hyprlandMonitor) as Button); + }); + }, + }), + }), + }), + }); + }; +})(); diff --git a/ags/HyprPanel/modules/bar/Exports.ts b/ags/HyprPanel/modules/bar/Exports.ts new file mode 100644 index 0000000..6a17b2f --- /dev/null +++ b/ags/HyprPanel/modules/bar/Exports.ts @@ -0,0 +1,47 @@ +import { Menu } from './menu/index'; +import { Workspaces } from './workspaces/index'; +import { ClientTitle } from './window_title/index'; +import { Media } from './media/index'; +import { Notifications } from './notifications/index'; +import { Volume } from './volume/index'; +import { Network } from './network/index'; +import { Bluetooth } from './bluetooth/index'; +import { BatteryLabel } from './battery/index'; +import { Clock } from './clock/index'; +import { SysTray } from './systray/index'; + +// Custom Modules +import { Ram } from '../../customModules/ram/index'; +import { Cpu } from '../../customModules/cpu/index'; +import { Storage } from 'customModules/storage/index'; +import { Netstat } from 'customModules/netstat/index'; +import { KbInput } from 'customModules/kblayout/index'; +import { Updates } from 'customModules/updates/index'; +import { Submap } from 'customModules/submap/index'; +import { Weather } from 'customModules/weather/index'; +import { Power } from 'customModules/power/index'; + +export { + Menu, + Workspaces, + ClientTitle, + Media, + Notifications, + Volume, + Network, + Bluetooth, + BatteryLabel, + Clock, + SysTray, + + // Custom Modules + Ram, + Cpu, + Storage, + Netstat, + KbInput, + Updates, + Submap, + Weather, + Power, +}; diff --git a/ags/HyprPanel/modules/bar/SideEffects.ts b/ags/HyprPanel/modules/bar/SideEffects.ts new file mode 100644 index 0000000..e4aabec --- /dev/null +++ b/ags/HyprPanel/modules/bar/SideEffects.ts @@ -0,0 +1,29 @@ +import options from 'options'; + +const { showIcon, showTime } = options.bar.clock; + +showIcon.connect('changed', () => { + if (!showTime.value && !showIcon.value) { + showTime.value = true; + } +}); + +showTime.connect('changed', () => { + if (!showTime.value && !showIcon.value) { + showIcon.value = true; + } +}); + +const { label, icon } = options.bar.windowtitle; + +label.connect('changed', () => { + if (!label.value && !icon.value) { + icon.value = true; + } +}); + +icon.connect('changed', () => { + if (!label.value && !icon.value) { + label.value = true; + } +}); diff --git a/ags/HyprPanel/modules/bar/battery/index.ts b/ags/HyprPanel/modules/bar/battery/index.ts new file mode 100644 index 0000000..8d22ef7 --- /dev/null +++ b/ags/HyprPanel/modules/bar/battery/index.ts @@ -0,0 +1,133 @@ +const battery = await Service.import('battery'); +import Gdk from 'gi://Gdk?version=3.0'; +import { openMenu } from '../utils.js'; +import options from 'options'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { label: show_label, rightClick, middleClick, scrollUp, scrollDown, hideLabelWhenFull } = options.bar.battery; + +const BatteryLabel = (): BarBoxChild => { + const isVis = Variable(battery.available); + + const batIcon = Utils.merge( + [battery.bind('percent'), battery.bind('charging'), battery.bind('charged')], + (batPercent: number, batCharging, batCharged) => { + if (batCharged) return `battery-level-100-charged-symbolic`; + else return `battery-level-${Math.floor(batPercent / 10) * 10}${batCharging ? '-charging' : ''}-symbolic`; + }, + ); + + battery.connect('changed', ({ available }) => { + isVis.value = available; + }); + + const formatTime = (seconds: number): Record => { + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + return { hours, minutes }; + }; + + const generateTooltip = (timeSeconds: number, isCharging: boolean, isCharged: boolean): string => { + if (isCharged) { + return 'Fully Charged!!!'; + } + + const { hours, minutes } = formatTime(timeSeconds); + if (isCharging) { + return `${hours} hours ${minutes} minutes until full`; + } else { + return `${hours} hours ${minutes} minutes left`; + } + }; + + return { + component: Widget.Box({ + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), show_label.bind('value')], + (style, showLabel) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `battery-container ${styleMap[style]} ${!showLabel ? 'no-label' : ''}`; + }, + ), + visible: battery.bind('available'), + tooltip_text: battery.bind('time_remaining').as((t) => t.toString()), + children: Utils.merge( + [ + battery.bind('available'), + show_label.bind('value'), + battery.bind('charged'), + hideLabelWhenFull.bind('value'), + ], + (batAvail, showLabel, isCharged, hideWhenFull) => { + if (batAvail && showLabel) { + return [ + Widget.Icon({ + class_name: 'bar-button-icon battery', + icon: batIcon, + }), + ...(hideWhenFull && isCharged + ? [] + : [ + Widget.Label({ + class_name: 'bar-button-label battery', + label: battery.bind('percent').as((p) => `${Math.floor(p)}%`), + }), + ]), + ]; + } else if (batAvail && !showLabel) { + return [ + Widget.Icon({ + class_name: 'bar-button-icon battery', + icon: batIcon, + }), + ]; + } else { + return []; + } + }, + ), + setup: (self) => { + self.hook(battery, () => { + if (battery.available) { + self.tooltip_text = generateTooltip(battery.time_remaining, battery.charging, battery.charged); + } + }); + }, + }), + isVis, + boxClass: 'battery', + props: { + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + onPrimaryClick: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'energymenu'); + }, + }, + }; +}; + +export { BatteryLabel }; diff --git a/ags/HyprPanel/modules/bar/bluetooth/index.ts b/ags/HyprPanel/modules/bar/bluetooth/index.ts new file mode 100644 index 0000000..55381a3 --- /dev/null +++ b/ags/HyprPanel/modules/bar/bluetooth/index.ts @@ -0,0 +1,74 @@ +const bluetooth = await Service.import('bluetooth'); +import Gdk from 'gi://Gdk?version=3.0'; +import options from 'options'; +import { openMenu } from '../utils.js'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { label, rightClick, middleClick, scrollDown, scrollUp } = options.bar.bluetooth; + +const Bluetooth = (): BarBoxChild => { + const btIcon = Widget.Label({ + label: bluetooth.bind('enabled').as((v) => (v ? '󰂯' : '󰂲')), + class_name: 'bar-button-icon bluetooth txt-icon bar', + }); + + const btText = Widget.Label({ + label: Utils.merge([bluetooth.bind('enabled'), bluetooth.bind('connected_devices')], (btEnabled, btDevices) => { + return btEnabled && btDevices.length ? ` Connected (${btDevices.length})` : btEnabled ? 'On' : 'Off'; + }), + class_name: 'bar-button-label bluetooth', + }); + + return { + component: Widget.Box({ + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), label.bind('value')], + (style, showLabel) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `bluetooth-container ${styleMap[style]} ${!showLabel ? 'no-label' : ''}`; + }, + ), + children: options.bar.bluetooth.label.bind('value').as((showLabel) => { + if (showLabel) { + return [btIcon, btText]; + } + return [btIcon]; + }), + }), + isVisible: true, + boxClass: 'bluetooth', + props: { + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + on_primary_click: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'bluetoothmenu'); + }, + }, + }; +}; + +export { Bluetooth }; diff --git a/ags/HyprPanel/modules/bar/clock/index.ts b/ags/HyprPanel/modules/bar/clock/index.ts new file mode 100644 index 0000000..0b2fe21 --- /dev/null +++ b/ags/HyprPanel/modules/bar/clock/index.ts @@ -0,0 +1,83 @@ +import Gdk from 'gi://Gdk?version=3.0'; +import GLib from 'gi://GLib'; +import { openMenu } from '../utils.js'; +import options from 'options'; +import { DateTime } from 'types/@girs/glib-2.0/glib-2.0.cjs'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { format, icon, showIcon, showTime, rightClick, middleClick, scrollUp, scrollDown } = options.bar.clock; +const { style } = options.theme.bar.buttons; + +const date = Variable(GLib.DateTime.new_now_local(), { + poll: [1000, (): DateTime => GLib.DateTime.new_now_local()], +}); +const time = Utils.derive([date, format], (c, f) => c.format(f) || ''); + +const Clock = (): BarBoxChild => { + const clockTime = Widget.Label({ + class_name: 'bar-button-label clock bar', + label: time.bind(), + }); + + const clockIcon = Widget.Label({ + label: icon.bind('value'), + class_name: 'bar-button-icon clock txt-icon bar', + }); + + return { + component: Widget.Box({ + className: Utils.merge( + [style.bind('value'), showIcon.bind('value'), showTime.bind('value')], + (btnStyle, shwIcn, shwLbl) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + + return `clock-container ${styleMap[btnStyle]} ${!shwLbl ? 'no-label' : ''} ${!shwIcn ? 'no-icon' : ''}`; + }, + ), + children: Utils.merge([showIcon.bind('value'), showTime.bind('value')], (shIcn, shTm) => { + if (shIcn && !shTm) { + return [clockIcon]; + } else if (shTm && !shIcn) { + return [clockTime]; + } + + return [clockIcon, clockTime]; + }), + }), + isVisible: true, + boxClass: 'clock', + props: { + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + on_primary_click: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'calendarmenu'); + }, + }, + }; +}; + +export { Clock }; diff --git a/ags/HyprPanel/modules/bar/media/index.ts b/ags/HyprPanel/modules/bar/media/index.ts new file mode 100644 index 0000000..5892d7b --- /dev/null +++ b/ags/HyprPanel/modules/bar/media/index.ts @@ -0,0 +1,113 @@ +import Gdk from 'gi://Gdk?version=3.0'; +const mpris = await Service.import('mpris'); +import { openMenu } from '../utils.js'; +import options from 'options'; +import { getCurrentPlayer } from 'lib/shared/media.js'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand } from 'customModules/utils.js'; + +const { show_artist, truncation, truncation_size, show_label, show_active_only, rightClick, middleClick } = + options.bar.media; + +const Media = (): BarBoxChild => { + const activePlayer = Variable(mpris.players[0]); + const isVis = Variable(!show_active_only.value); + + show_active_only.connect('changed', () => { + isVis.value = !show_active_only.value || mpris.players.length > 0; + }); + + mpris.connect('changed', () => { + const curPlayer = getCurrentPlayer(activePlayer.value); + activePlayer.value = curPlayer; + isVis.value = !show_active_only.value || mpris.players.length > 0; + }); + + const getIconForPlayer = (playerName: string): string => { + const windowTitleMap = [ + ['Firefox', '󰈹'], + ['Microsoft Edge', '󰇩'], + ['Discord', ''], + ['Plex', '󰚺'], + ['Spotify', '󰓇'], + ['(.*)', '󰝚'], + ]; + + const foundMatch = windowTitleMap.find((wt) => RegExp(wt[0], 'i').test(playerName)); + + return foundMatch ? foundMatch[1] : '󰝚'; + }; + + const songIcon = Variable(''); + + const mediaLabel = Utils.watch('Media', [mpris, show_artist, truncation, truncation_size, show_label], () => { + if (activePlayer.value && show_label.value) { + const { track_title, identity, track_artists } = activePlayer.value; + songIcon.value = getIconForPlayer(identity); + const trackArtist = show_artist.value ? ` - ${track_artists.join(', ')}` : ``; + const truncatedLabel = truncation.value + ? `${track_title + trackArtist}`.substring(0, truncation_size.value) + : `${track_title + trackArtist}`; + + return track_title.length === 0 + ? `No media playing...` + : truncatedLabel.length < truncation_size.value || !truncation.value + ? `${truncatedLabel}` + : `${truncatedLabel.substring(0, truncatedLabel.length - 3)}...`; + } else { + songIcon.value = getIconForPlayer(activePlayer.value?.identity || ''); + return `Media`; + } + }); + + return { + component: Widget.Box({ + visible: false, + child: Widget.Box({ + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), show_label.bind('value')], + (style) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `media-container ${styleMap[style]}`; + }, + ), + child: Widget.Box({ + children: [ + Widget.Label({ + class_name: 'bar-button-icon media txt-icon bar', + label: songIcon.bind('value').as((v) => v || '󰝚'), + }), + Widget.Label({ + class_name: 'bar-button-label media', + label: mediaLabel, + }), + ], + }), + }), + }), + isVis, + boxClass: 'media', + props: { + on_scroll_up: () => activePlayer.value?.next(), + on_scroll_down: () => activePlayer.value?.previous(), + on_primary_click: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'mediamenu'); + }, + onSecondaryClick: (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }, + onMiddleClick: (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }, + }, + }; +}; + +export { Media }; diff --git a/ags/HyprPanel/modules/bar/menu/index.ts b/ags/HyprPanel/modules/bar/menu/index.ts new file mode 100644 index 0000000..5c55bfb --- /dev/null +++ b/ags/HyprPanel/modules/bar/menu/index.ts @@ -0,0 +1,56 @@ +import Gdk from 'gi://Gdk?version=3.0'; +import { openMenu } from '../utils.js'; +import options from 'options'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { rightClick, middleClick, scrollUp, scrollDown } = options.bar.launcher; + +const Menu = (): BarBoxChild => { + return { + component: Widget.Box({ + className: Utils.merge([options.theme.bar.buttons.style.bind('value')], (style) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `dashboard ${styleMap[style]}`; + }), + child: Widget.Label({ + class_name: 'bar-menu_label bar-button_icon txt-icon bar', + label: options.bar.launcher.icon.bind('value'), + }), + }), + isVisible: true, + boxClass: 'dashboard', + props: { + on_primary_click: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'dashboardmenu'); + }, + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + }, + }; +}; + +export { Menu }; diff --git a/ags/HyprPanel/modules/bar/network/index.ts b/ags/HyprPanel/modules/bar/network/index.ts new file mode 100644 index 0000000..056f455 --- /dev/null +++ b/ags/HyprPanel/modules/bar/network/index.ts @@ -0,0 +1,106 @@ +import Gdk from 'gi://Gdk?version=3.0'; +const network = await Service.import('network'); +import options from 'options'; +import { openMenu } from '../utils.js'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { + label: networkLabel, + truncation, + truncation_size, + rightClick, + middleClick, + scrollDown, + scrollUp, +} = options.bar.network; + +const Network = (): BarBoxChild => { + return { + component: Widget.Box({ + vpack: 'fill', + vexpand: true, + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), networkLabel.bind('value')], + (style, showLabel) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `network-container ${styleMap[style]}${!showLabel ? ' no-label' : ''}`; + }, + ), + children: [ + Widget.Icon({ + class_name: 'bar-button-icon network-icon', + icon: Utils.merge( + [network.bind('primary'), network.bind('wifi'), network.bind('wired')], + (pmry, wfi, wrd) => { + if (pmry === 'wired') { + return wrd.icon_name; + } + return wfi.icon_name; + }, + ), + }), + Widget.Box({ + child: Utils.merge( + [ + network.bind('primary'), + network.bind('wifi'), + networkLabel.bind('value'), + truncation.bind('value'), + truncation_size.bind('value'), + ], + (pmry, wfi, showLbl, trunc, tSize) => { + if (!showLbl) { + return Widget.Box(); + } + if (pmry === 'wired') { + return Widget.Label({ + class_name: 'bar-button-label network-label', + label: 'Wired'.substring(0, tSize), + }); + } + return Widget.Label({ + class_name: 'bar-button-label network-label', + label: wfi.ssid ? `${trunc ? wfi.ssid.substring(0, tSize) : wfi.ssid}` : '--', + }); + }, + ), + }), + ], + }), + isVisible: true, + boxClass: 'network', + props: { + on_primary_click: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'networkmenu'); + }, + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + }, + }; +}; + +export { Network }; diff --git a/ags/HyprPanel/modules/bar/notifications/index.ts b/ags/HyprPanel/modules/bar/notifications/index.ts new file mode 100644 index 0000000..f0e721d --- /dev/null +++ b/ags/HyprPanel/modules/bar/notifications/index.ts @@ -0,0 +1,94 @@ +import Gdk from 'gi://Gdk?version=3.0'; +import { openMenu } from '../utils.js'; +import options from 'options'; +import { filterNotifications } from 'lib/shared/notifications.js'; +import { BarBoxChild } from 'lib/types/bar.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { show_total, rightClick, middleClick, scrollUp, scrollDown, hideCountWhenZero } = options.bar.notifications; +const { ignore } = options.notifications; + +const notifs = await Service.import('notifications'); + +export const Notifications = (): BarBoxChild => { + return { + component: Widget.Box({ + hpack: 'start', + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), show_total.bind('value')], + (style, showTotal) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `notifications-container ${styleMap[style]} ${!showTotal ? 'no-label' : ''}`; + }, + ), + child: Widget.Box({ + hpack: 'start', + class_name: 'bar-notifications', + children: Utils.merge( + [ + notifs.bind('notifications'), + notifs.bind('dnd'), + show_total.bind('value'), + ignore.bind('value'), + hideCountWhenZero.bind('value'), + ], + (notif, dnd, showTotal, ignoredNotifs, hideCountForZero) => { + const filteredNotifications = filterNotifications(notif, ignoredNotifs); + + const notifIcon = Widget.Label({ + hpack: 'center', + class_name: 'bar-button-icon notifications txt-icon bar', + label: dnd ? '󰂛' : filteredNotifications.length > 0 ? '󱅫' : '󰂚', + }); + + const notifLabel = Widget.Label({ + hpack: 'center', + class_name: 'bar-button-label notifications', + label: filteredNotifications.length.toString(), + }); + + if (showTotal) { + if (hideCountForZero && filteredNotifications.length === 0) { + return [notifIcon]; + } + return [notifIcon, notifLabel]; + } + return [notifIcon]; + }, + ), + }), + }), + isVisible: true, + boxClass: 'notifications', + props: { + on_primary_click: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'notificationsmenu'); + }, + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + }, + }; +}; diff --git a/ags/HyprPanel/modules/bar/systray/index.ts b/ags/HyprPanel/modules/bar/systray/index.ts new file mode 100644 index 0000000..b6fece3 --- /dev/null +++ b/ags/HyprPanel/modules/bar/systray/index.ts @@ -0,0 +1,44 @@ +import Gdk from 'gi://Gdk?version=3.0'; +import { BarBoxChild, SelfButton } from 'lib/types/bar'; +import { Notify } from 'lib/utils'; +const systemtray = await Service.import('systemtray'); +import options from 'options'; + +const { ignore } = options.bar.systray; + +const SysTray = (): BarBoxChild => { + const isVis = Variable(false); + + const items = Utils.merge([systemtray.bind('items'), ignore.bind('value')], (items, ignored) => { + const filteredTray = items.filter(({ id }) => !ignored.includes(id)); + + isVis.value = filteredTray.length > 0; + + return filteredTray.map((item) => { + return Widget.Button({ + cursor: 'pointer', + child: Widget.Icon({ + class_name: 'systray-icon', + icon: item.bind('icon'), + }), + on_primary_click: (_: SelfButton, event: Gdk.Event) => item.activate(event), + on_secondary_click: (_, event) => item.openMenu(event), + onMiddleClick: () => Notify({ summary: 'App Name', body: item.id }), + tooltip_markup: item.bind('tooltip_markup'), + }); + }); + }); + + return { + component: Widget.Box({ + class_name: 'systray-container', + children: items, + }), + isVisible: true, + boxClass: 'systray', + isVis, + props: {}, + }; +}; + +export { SysTray }; diff --git a/ags/HyprPanel/modules/bar/utils.ts b/ags/HyprPanel/modules/bar/utils.ts new file mode 100644 index 0000000..f2f545a --- /dev/null +++ b/ags/HyprPanel/modules/bar/utils.ts @@ -0,0 +1,56 @@ +import Gdk from 'gi://Gdk?version=3.0'; +import { Attribute, Child } from 'lib/types/widget'; +import { calculateMenuPosition } from 'modules/menus/shared/dropdown/locationHandler/index'; +import Button from 'types/widgets/button'; + +export const closeAllMenus = (): void => { + const menuWindows = App.windows + .filter((w) => { + if (w.name) { + return /.*menu/.test(w.name); + } + + return false; + }) + .map((w) => w.name); + + menuWindows.forEach((w) => { + if (w) { + App.closeWindow(w); + } + }); +}; + +export const openMenu = async (clicked: Button, event: Gdk.Event, window: string): Promise => { + /* + * NOTE: We have to make some adjustments so the menu pops up relatively + * to the center of the button clicked. We don't want the menu to spawn + * offcenter dependending on which edge of the button you click on. + * ------------- + * To fix this, we take the x coordinate of the click within the button's bounds. + * If you click the left edge of a 100 width button, then the x axis will be 0 + * and if you click the right edge then the x axis will be 100. + * ------------- + * Then we divide the width of the button by 2 to get the center of the button and then get + * the offset by subtracting the clicked x coordinate. Then we can apply that offset + * to the x coordinate of the click relative to the screen to get the center of the + * icon click. + */ + + const middleOfButton = Math.floor(clicked.get_allocated_width() / 2); + const xAxisOfButtonClick = clicked.get_pointer()[0]; + const middleOffset = middleOfButton - xAxisOfButtonClick; + + const clickPos = event.get_root_coords(); + const adjustedXCoord = clickPos[1] + middleOffset; + const coords = [adjustedXCoord, clickPos[2]]; + + try { + await calculateMenuPosition(coords, window); + } catch (error) { + console.error(`Error calculating menu position: ${error}`); + } + + closeAllMenus(); + App.toggleWindow(window); +}; diff --git a/ags/HyprPanel/modules/bar/volume/index.ts b/ags/HyprPanel/modules/bar/volume/index.ts new file mode 100644 index 0000000..e85dc52 --- /dev/null +++ b/ags/HyprPanel/modules/bar/volume/index.ts @@ -0,0 +1,106 @@ +import Gdk from 'gi://Gdk?version=3.0'; +const audio = await Service.import('audio'); +import { openMenu } from '../utils.js'; +import options from 'options'; +import { Binding } from 'lib/utils.js'; +import { VolumeIcons } from 'lib/types/volume.js'; +import { BarBoxChild } from 'lib/types/bar.js'; +import { Bind } from 'lib/types/variable.js'; +import Button from 'types/widgets/button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils.js'; + +const { rightClick, middleClick, scrollUp, scrollDown } = options.bar.volume; + +const Volume = (): BarBoxChild => { + const icons: VolumeIcons = { + 101: '󰕾', + 66: '󰕾', + 34: '󰖀', + 1: '󰕿', + 0: '󰝟', + }; + + const getIcon = (): Bind => { + const icon: Binding = Utils.merge( + [audio.speaker.bind('is_muted'), audio.speaker.bind('volume')], + (isMuted, vol) => { + if (isMuted) return 0; + + const foundVol = [101, 66, 34, 1, 0].find((threshold) => threshold <= vol * 100); + + if (foundVol !== undefined) { + return foundVol; + } + + return 101; + }, + ); + + return icon.as((i: number) => (i !== undefined ? icons[i] : icons[101])); + }; + + const volIcn = Widget.Label({ + hexpand: true, + label: getIcon(), + class_name: 'bar-button-icon volume txt-icon bar', + }); + + const volPct = Widget.Label({ + hexpand: true, + label: audio.speaker.bind('volume').as((v) => `${Math.round(v * 100)}%`), + class_name: 'bar-button-label volume', + }); + + return { + component: Widget.Box({ + hexpand: true, + vexpand: true, + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), options.bar.volume.label.bind('value')], + (style, showLabel) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `volume-container ${styleMap[style]} ${!showLabel ? 'no-label' : ''}`; + }, + ), + children: options.bar.volume.label.bind('value').as((showLabel) => { + if (showLabel) { + return [volIcn, volPct]; + } + return [volIcn]; + }), + }), + isVisible: true, + boxClass: 'volume', + props: { + onPrimaryClick: (clicked: Button, event: Gdk.Event): void => { + openMenu(clicked, event, 'audiomenu'); + }, + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + }, + }; +}; + +export { Volume }; diff --git a/ags/HyprPanel/modules/bar/window_title/index.ts b/ags/HyprPanel/modules/bar/window_title/index.ts new file mode 100644 index 0000000..ddfd44b --- /dev/null +++ b/ags/HyprPanel/modules/bar/window_title/index.ts @@ -0,0 +1,241 @@ +const hyprland = await Service.import('hyprland'); +import { BarBoxChild } from 'lib/types/bar'; +import options from 'options'; +import { Attribute, Child } from 'lib/types/widget'; +import { ActiveClient } from 'types/service/hyprland'; +import Label from 'types/widgets/label'; +import { runAsyncCommand, throttledScrollHandler } from 'customModules/utils'; +import Button from 'types/widgets/button'; +import Gdk from 'types/@girs/gdk-3.0/gdk-3.0'; + +const { leftClick, rightClick, middleClick, scrollDown, scrollUp } = options.bar.windowtitle; + +const filterTitle = (windowtitle: ActiveClient): Record => { + const windowTitleMap = [ + // user provided values + ...options.bar.windowtitle.title_map.value, + // Original Entries + ['kitty', '󰄛', 'Kitty Terminal'], + ['firefox', '󰈹', 'Firefox'], + ['microsoft-edge', '󰇩', 'Edge'], + ['discord', '', 'Discord'], + ['vesktop', '', 'Vesktop'], + ['org.kde.dolphin', '', 'Dolphin'], + ['plex', '󰚺', 'Plex'], + ['steam', '', 'Steam'], + ['spotify', '󰓇', 'Spotify'], + ['ristretto', '󰋩', 'Ristretto'], + ['obsidian', '󱓧', 'Obsidian'], + + // Browsers + ['google-chrome', '', 'Google Chrome'], + ['brave-browser', '󰖟', 'Brave Browser'], + ['chromium', '', 'Chromium'], + ['opera', '', 'Opera'], + ['vivaldi', '󰖟', 'Vivaldi'], + ['waterfox', '󰖟', 'Waterfox'], + ['thorium', '󰖟', 'Waterfox'], + ['tor-browser', '', 'Tor Browser'], + ['floorp', '󰈹', 'Floorp'], + + // Terminals + ['gnome-terminal', '', 'GNOME Terminal'], + ['konsole', '', 'Konsole'], + ['alacritty', '', 'Alacritty'], + ['wezterm', '', 'Wezterm'], + ['foot', '󰽒', 'Foot Terminal'], + ['tilix', '', 'Tilix'], + ['xterm', '', 'XTerm'], + ['urxvt', '', 'URxvt'], + ['st', '', 'st Terminal'], + + // Development Tools + ['code', '󰨞', 'Visual Studio Code'], + ['vscode', '󰨞', 'VS Code'], + ['sublime-text', '', 'Sublime Text'], + ['atom', '', 'Atom'], + ['android-studio', '󰀴', 'Android Studio'], + ['intellij-idea', '', 'IntelliJ IDEA'], + ['pycharm', '󱃖', 'PyCharm'], + ['webstorm', '󱃖', 'WebStorm'], + ['phpstorm', '󱃖', 'PhpStorm'], + ['eclipse', '', 'Eclipse'], + ['netbeans', '', 'NetBeans'], + ['docker', '', 'Docker'], + ['vim', '', 'Vim'], + ['neovim', '', 'Neovim'], + ['neovide', '', 'Neovide'], + ['emacs', '', 'Emacs'], + + // Communication Tools + ['slack', '󰒱', 'Slack'], + ['telegram-desktop', '', 'Telegram'], + ['org.telegram.desktop', '', 'Telegram'], + ['whatsapp', '󰖣', 'WhatsApp'], + ['teams', '󰊻', 'Microsoft Teams'], + ['skype', '󰒯', 'Skype'], + ['thunderbird', '', 'Thunderbird'], + + // File Managers + ['nautilus', '󰝰', 'Files (Nautilus)'], + ['thunar', '󰝰', 'Thunar'], + ['pcmanfm', '󰝰', 'PCManFM'], + ['nemo', '󰝰', 'Nemo'], + ['ranger', '󰝰', 'Ranger'], + ['doublecmd', '󰝰', 'Double Commander'], + ['krusader', '󰝰', 'Krusader'], + + // Media Players + ['vlc', '󰕼', 'VLC Media Player'], + ['mpv', '', 'MPV'], + ['rhythmbox', '󰓃', 'Rhythmbox'], + + // Graphics Tools + ['gimp', '', 'GIMP'], + ['inkscape', '', 'Inkscape'], + ['krita', '', 'Krita'], + ['blender', '󰂫', 'Blender'], + + // Video Editing + ['kdenlive', '', 'Kdenlive'], + + // Games and Gaming Platforms + ['lutris', '󰺵', 'Lutris'], + ['heroic', '󰺵', 'Heroic Games Launcher'], + ['minecraft', '󰍳', 'Minecraft'], + ['csgo', '󰺵', 'CS:GO'], + ['dota2', '󰺵', 'Dota 2'], + + // Office and Productivity + ['evernote', '', 'Evernote'], + ['sioyek', '', 'Sioyek'], + + // Cloud Services and Sync + ['dropbox', '󰇣', 'Dropbox'], + + // Desktop + ['^$', '󰇄', 'Desktop'], + + // Fallback icon + ['(.+)', '󰣆', `${windowtitle.class.charAt(0).toUpperCase() + windowtitle.class.slice(1)}`], + ]; + + const foundMatch = windowTitleMap.find((wt) => RegExp(wt[0]).test(windowtitle.class.toLowerCase())); + + // return the default icon if no match is found or + // if the array element matched is not of size 3 + if (!foundMatch || foundMatch.length !== 3) { + return { + icon: windowTitleMap[windowTitleMap.length - 1][1], + label: windowTitleMap[windowTitleMap.length - 1][2], + }; + } + + return { + icon: foundMatch[1], + label: foundMatch[2], + }; +}; + +const getTitle = (client: ActiveClient, useCustomTitle: boolean, useClassName: boolean): string => { + if (useCustomTitle) return filterTitle(client).label; + if (useClassName) return client.class; + + const title = client.title; + // If the title is empty or only filled with spaces, fallback to the class name + if (title.length === 0 || title.match(/^ *$/)) { + return client.class; + } + return title; +}; + +const truncateTitle = (title: string, max_size: number): string => { + if (max_size > 0 && title.length > max_size) { + return title.substring(0, max_size).trim() + '...'; + } + return title; +}; + +const ClientTitle = (): BarBoxChild => { + const { custom_title, class_name, label, icon, truncation, truncation_size } = options.bar.windowtitle; + + return { + component: Widget.Box({ + className: Utils.merge( + [options.theme.bar.buttons.style.bind('value'), label.bind('value')], + (style, showLabel) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style3', + }; + return `windowtitle-container ${styleMap[style]} ${!showLabel ? 'no-label' : ''}`; + }, + ), + children: Utils.merge( + [ + hyprland.active.bind('client'), + custom_title.bind('value'), + class_name.bind('value'), + label.bind('value'), + icon.bind('value'), + truncation.bind('value'), + truncation_size.bind('value'), + ], + (client, useCustomTitle, useClassName, showLabel, showIcon, truncate, truncationSize) => { + const children: Label[] = []; + if (showIcon) { + children.push( + Widget.Label({ + class_name: 'bar-button-icon windowtitle txt-icon bar', + label: filterTitle(client).icon, + }), + ); + } + + if (showLabel) { + children.push( + Widget.Label({ + class_name: `bar-button-label windowtitle ${showIcon ? '' : 'no-icon'}`, + label: truncateTitle( + getTitle(client, useCustomTitle, useClassName), + truncate ? truncationSize : -1, + ), + }), + ); + } + + return children; + }, + ), + }), + isVisible: true, + boxClass: 'windowtitle', + props: { + setup: (self: Button): void => { + self.hook(options.bar.scrollSpeed, () => { + const throttledHandler = throttledScrollHandler(options.bar.scrollSpeed.value); + + self.on_primary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(leftClick.value, { clicked, event }); + }; + self.on_secondary_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(rightClick.value, { clicked, event }); + }; + self.on_middle_click = (clicked: Button, event: Gdk.Event): void => { + runAsyncCommand(middleClick.value, { clicked, event }); + }; + self.on_scroll_up = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollUp.value, { clicked, event }); + }; + self.on_scroll_down = (clicked: Button, event: Gdk.Event): void => { + throttledHandler(scrollDown.value, { clicked, event }); + }; + }); + }, + }, + }; +}; + +export { ClientTitle }; diff --git a/ags/HyprPanel/modules/bar/workspaces/helpers.ts b/ags/HyprPanel/modules/bar/workspaces/helpers.ts new file mode 100644 index 0000000..daf3cb3 --- /dev/null +++ b/ags/HyprPanel/modules/bar/workspaces/helpers.ts @@ -0,0 +1,162 @@ +const hyprland = await Service.import('hyprland'); + +import { MonitorMap, WorkspaceMap, WorkspaceRule } from 'lib/types/workspace'; +import options from 'options'; +import { Variable } from 'types/variable'; + +const { workspaces, reverse_scroll, ignored } = options.bar.workspaces; + +export const getWorkspacesForMonitor = (curWs: number, wsRules: WorkspaceMap, monitor: number): boolean => { + if (!wsRules || !Object.keys(wsRules).length) { + return true; + } + + const monitorMap: MonitorMap = {}; + const workspaceMonitorList = hyprland?.workspaces?.map((m) => ({ id: m.monitorID, name: m.monitor })); + const monitors = [ + ...new Map([...workspaceMonitorList, ...hyprland.monitors].map((item) => [item.id, item])).values(), + ]; + + monitors.forEach((m) => (monitorMap[m.id] = m.name)); + + const currentMonitorName = monitorMap[monitor]; + const monitorWSRules = wsRules[currentMonitorName]; + + if (monitorWSRules === undefined) { + return true; + } + return monitorWSRules.includes(curWs); +}; + +export const getWorkspaceRules = (): WorkspaceMap => { + try { + const rules = Utils.exec('hyprctl workspacerules -j'); + + const workspaceRules: WorkspaceMap = {}; + + JSON.parse(rules).forEach((rule: WorkspaceRule) => { + const workspaceNum = parseInt(rule.workspaceString, 10); + if (isNaN(workspaceNum)) { + return; + } + if (Object.hasOwnProperty.call(workspaceRules, rule.monitor)) { + workspaceRules[rule.monitor].push(workspaceNum); + } else { + workspaceRules[rule.monitor] = [workspaceNum]; + } + }); + + return workspaceRules; + } catch (err) { + console.error(err); + return {}; + } +}; + +export const getCurrentMonitorWorkspaces = (monitor: number): number[] => { + if (hyprland.monitors.length === 1) { + return Array.from({ length: workspaces.value }, (_, i) => i + 1); + } + + const monitorWorkspaces = getWorkspaceRules(); + const monitorMap: MonitorMap = {}; + hyprland.monitors.forEach((m) => (monitorMap[m.id] = m.name)); + + const currentMonitorName = monitorMap[monitor]; + + return monitorWorkspaces[currentMonitorName]; +}; + +type ThrottledScrollHandlers = { + throttledScrollUp: () => void; + throttledScrollDown: () => void; +}; + +export const isWorkspaceIgnored = (ignoredWorkspaces: Variable, workspaceNumber: number): boolean => { + if (ignoredWorkspaces.value === '') return false; + + const ignoredWsRegex = new RegExp(ignoredWorkspaces.value); + + return ignoredWsRegex.test(workspaceNumber.toString()); +}; + +const navigateWorkspace = ( + direction: 'next' | 'prev', + currentMonitorWorkspaces: Variable, + activeWorkspaces: boolean, + ignoredWorkspaces: Variable, +): void => { + const workspacesList = activeWorkspaces + ? hyprland.workspaces.filter((ws) => hyprland.active.monitor.id === ws.monitorID).map((ws) => ws.id) + : currentMonitorWorkspaces.value || Array.from({ length: workspaces.value }, (_, i) => i + 1); + + if (workspacesList.length === 0) return; + + const currentIndex = workspacesList.indexOf(hyprland.active.workspace.id); + const step = direction === 'next' ? 1 : -1; + let newIndex = (currentIndex + step + workspacesList.length) % workspacesList.length; + let attempts = 0; + + while (attempts < workspacesList.length) { + const targetWS = workspacesList[newIndex]; + if (!isWorkspaceIgnored(ignoredWorkspaces, targetWS)) { + hyprland.messageAsync(`dispatch workspace ${targetWS}`); + return; + } + newIndex = (newIndex + step + workspacesList.length) % workspacesList.length; + attempts++; + } +}; + +export const goToNextWS = ( + currentMonitorWorkspaces: Variable, + activeWorkspaces: boolean, + ignoredWorkspaces: Variable, +): void => { + navigateWorkspace('next', currentMonitorWorkspaces, activeWorkspaces, ignoredWorkspaces); +}; + +export const goToPrevWS = ( + currentMonitorWorkspaces: Variable, + activeWorkspaces: boolean, + ignoredWorkspaces: Variable, +): void => { + navigateWorkspace('prev', currentMonitorWorkspaces, activeWorkspaces, ignoredWorkspaces); +}; + +export function throttle void>(func: T, limit: number): T { + let inThrottle: boolean; + return function (this: ThisParameterType, ...args: Parameters) { + if (!inThrottle) { + func.apply(this, args); + inThrottle = true; + setTimeout(() => { + inThrottle = false; + }, limit); + } + } as T; +} + +export const createThrottledScrollHandlers = ( + scrollSpeed: number, + currentMonitorWorkspaces: Variable, + activeWorkspaces: boolean = false, +): ThrottledScrollHandlers => { + const throttledScrollUp = throttle(() => { + if (reverse_scroll.value) { + goToPrevWS(currentMonitorWorkspaces, activeWorkspaces, ignored); + } else { + goToNextWS(currentMonitorWorkspaces, activeWorkspaces, ignored); + } + }, 200 / scrollSpeed); + + const throttledScrollDown = throttle(() => { + if (reverse_scroll.value) { + goToNextWS(currentMonitorWorkspaces, activeWorkspaces, ignored); + } else { + goToPrevWS(currentMonitorWorkspaces, activeWorkspaces, ignored); + } + }, 200 / scrollSpeed); + + return { throttledScrollUp, throttledScrollDown }; +}; diff --git a/ags/HyprPanel/modules/bar/workspaces/index.ts b/ags/HyprPanel/modules/bar/workspaces/index.ts new file mode 100644 index 0000000..c95e212 --- /dev/null +++ b/ags/HyprPanel/modules/bar/workspaces/index.ts @@ -0,0 +1,44 @@ +import options from 'options'; +import { createThrottledScrollHandlers, getCurrentMonitorWorkspaces } from './helpers'; +import { BarBoxChild, SelfButton } from 'lib/types/bar'; +import { occupiedWses } from './variants/occupied'; +import { defaultWses } from './variants/default'; + +const { workspaces, scroll_speed } = options.bar.workspaces; + +const Workspaces = (monitor = -1): BarBoxChild => { + const currentMonitorWorkspaces = Variable(getCurrentMonitorWorkspaces(monitor)); + + workspaces.connect('changed', () => { + currentMonitorWorkspaces.value = getCurrentMonitorWorkspaces(monitor); + }); + + return { + component: Widget.Box({ + class_name: 'workspaces-box-container', + child: options.bar.workspaces.hideUnoccupied.bind('value').as((hideUnoccupied) => { + return hideUnoccupied ? occupiedWses(monitor) : defaultWses(monitor); + }), + }), + isVisible: true, + boxClass: 'workspaces', + props: { + setup: (self: SelfButton): void => { + Utils.merge( + [scroll_speed.bind('value'), options.bar.workspaces.hideUnoccupied.bind('value')], + (scroll_speed, hideUnoccupied) => { + const { throttledScrollUp, throttledScrollDown } = createThrottledScrollHandlers( + scroll_speed, + currentMonitorWorkspaces, + hideUnoccupied, + ); + self.on_scroll_up = throttledScrollUp; + self.on_scroll_down = throttledScrollDown; + }, + ); + }, + }, + }; +}; + +export { Workspaces }; diff --git a/ags/HyprPanel/modules/bar/workspaces/utils.ts b/ags/HyprPanel/modules/bar/workspaces/utils.ts new file mode 100644 index 0000000..c9f2bc2 --- /dev/null +++ b/ags/HyprPanel/modules/bar/workspaces/utils.ts @@ -0,0 +1,130 @@ +import { WorkspaceIconMap } from 'lib/types/workspace'; +import { isValidGjsColor } from 'lib/utils'; +import options from 'options'; +import { Monitor } from 'types/service/hyprland'; + +const hyprland = await Service.import('hyprland'); + +const { monochrome, background } = options.theme.bar.buttons; +const { background: wsBackground, active } = options.theme.bar.buttons.workspaces; + +const { showWsIcons, showAllActive, numbered_active_indicator: activeIndicator } = options.bar.workspaces; + +const isWorkspaceActiveOnMonitor = (monitor: number, monitors: Monitor[], i: number): boolean => { + return showAllActive.value && monitors[monitor]?.activeWorkspace?.id === i; +}; + +const getWsIcon = (wsIconMap: WorkspaceIconMap, i: number): string => { + const iconEntry = wsIconMap[i]; + + if (!iconEntry) { + return `${i}`; + } + + const hasIcon = typeof iconEntry === 'object' && 'icon' in iconEntry && iconEntry.icon !== ''; + + if (typeof iconEntry === 'string' && iconEntry !== '') { + return iconEntry; + } + + if (hasIcon) { + return iconEntry.icon; + } + + return `${i}`; +}; + +export const getWsColor = ( + wsIconMap: WorkspaceIconMap, + i: number, + smartHighlight: boolean, + monitor: number, + monitors: Monitor[], +): string => { + const iconEntry = wsIconMap[i]; + const hasColor = typeof iconEntry === 'object' && 'color' in iconEntry && isValidGjsColor(iconEntry.color); + if (!iconEntry) { + return ''; + } + + if ( + showWsIcons.value && + smartHighlight && + activeIndicator.value === 'highlight' && + (hyprland.active.workspace.id === i || isWorkspaceActiveOnMonitor(monitor, monitors, i)) + ) { + const iconColor = monochrome.value ? background : wsBackground; + const iconBackground = hasColor && isValidGjsColor(iconEntry.color) ? iconEntry.color : active.value; + const colorCss = `color: ${iconColor};`; + const backgroundCss = `background: ${iconBackground};`; + + return colorCss + backgroundCss; + } + + if (hasColor && isValidGjsColor(iconEntry.color)) { + return `color: ${iconEntry.color}; border-bottom-color: ${iconEntry.color};`; + } + + return ''; +}; + +export const renderClassnames = ( + showIcons: boolean, + showNumbered: boolean, + numberedActiveIndicator: string, + showWsIcons: boolean, + smartHighlight: boolean, + monitor: number, + monitors: Monitor[], + i: number, +): string => { + if (showIcons) { + return 'workspace-icon txt-icon bar'; + } + + if (showNumbered || showWsIcons) { + const numActiveInd = + hyprland.active.workspace.id === i || isWorkspaceActiveOnMonitor(monitor, monitors, i) + ? numberedActiveIndicator + : ''; + + const wsIconClass = showWsIcons ? 'txt-icon' : ''; + const smartHighlightClass = smartHighlight ? 'smart-highlight' : ''; + + const className = `workspace-number can_${numberedActiveIndicator} ${numActiveInd} ${wsIconClass} ${smartHighlightClass}`; + + return className.trim(); + } + + return 'default'; +}; + +export const renderLabel = ( + showIcons: boolean, + available: string, + active: string, + occupied: string, + workspaceMask: boolean, + showWsIcons: boolean, + wsIconMap: WorkspaceIconMap, + i: number, + index: number, + monitor: number, + monitors: Monitor[], +): string => { + if (showIcons) { + if (hyprland.active.workspace.id === i || isWorkspaceActiveOnMonitor(monitor, monitors, i)) { + return active; + } + if ((hyprland.getWorkspace(i)?.windows || 0) > 0) { + return occupied; + } + if (monitor !== -1) { + return available; + } + } + if (showWsIcons) { + return getWsIcon(wsIconMap, i); + } + return workspaceMask ? `${index + 1}` : `${i}`; +}; diff --git a/ags/HyprPanel/modules/bar/workspaces/variants/default.ts b/ags/HyprPanel/modules/bar/workspaces/variants/default.ts new file mode 100644 index 0000000..dddabc9 --- /dev/null +++ b/ags/HyprPanel/modules/bar/workspaces/variants/default.ts @@ -0,0 +1,141 @@ +const hyprland = await Service.import('hyprland'); +import options from 'options'; +import { getWorkspaceRules, getWorkspacesForMonitor, isWorkspaceIgnored } from '../helpers'; +import { range } from 'lib/utils'; +import { BoxWidget } from 'lib/types/widget'; +import { getWsColor, renderClassnames, renderLabel } from '../utils'; +import { WorkspaceIconMap } from 'lib/types/workspace'; +import { Monitor } from 'types/service/hyprland'; + +const { workspaces, monitorSpecific, workspaceMask, spacing, ignored } = options.bar.workspaces; +export const defaultWses = (monitor: number): BoxWidget => { + return Widget.Box({ + children: Utils.merge( + [workspaces.bind('value'), monitorSpecific.bind('value'), ignored.bind('value')], + (workspaces: number, monitorSpecific: boolean) => { + return range(workspaces || 8) + .filter((workspaceNumber) => { + if (!monitorSpecific) { + return true; + } + const workspaceRules = getWorkspaceRules(); + return ( + getWorkspacesForMonitor(workspaceNumber, workspaceRules, monitor) && + !isWorkspaceIgnored(ignored, workspaceNumber) + ); + }) + .sort((a, b) => { + return a - b; + }) + .map((i, index) => { + return Widget.Button({ + class_name: 'workspace-button', + on_primary_click: () => { + hyprland.messageAsync(`dispatch workspace ${i}`); + }, + child: Widget.Label({ + attribute: i, + vpack: 'center', + css: Utils.merge( + [ + spacing.bind('value'), + options.bar.workspaces.showWsIcons.bind('value'), + options.bar.workspaces.workspaceIconMap.bind('value'), + options.theme.matugen.bind('value'), + options.theme.bar.buttons.workspaces.smartHighlight.bind('value'), + hyprland.bind('monitors'), + ], + ( + sp: number, + showWsIcons: boolean, + workspaceIconMap: WorkspaceIconMap, + matugen: boolean, + smartHighlight: boolean, + monitors: Monitor[], + ) => { + return ( + `margin: 0rem ${0.375 * sp}rem;` + + `${showWsIcons && !matugen ? getWsColor(workspaceIconMap, i, smartHighlight, monitor, monitors) : ''}` + ); + }, + ), + class_name: Utils.merge( + [ + options.bar.workspaces.show_icons.bind('value'), + options.bar.workspaces.show_numbered.bind('value'), + options.bar.workspaces.numbered_active_indicator.bind('value'), + options.bar.workspaces.showWsIcons.bind('value'), + options.theme.bar.buttons.workspaces.smartHighlight.bind('value'), + hyprland.bind('monitors'), + options.bar.workspaces.icons.available.bind('value'), + options.bar.workspaces.icons.active.bind('value'), + ], + ( + showIcons: boolean, + showNumbered: boolean, + numberedActiveIndicator: string, + showWsIcons: boolean, + smartHighlight: boolean, + monitors: Monitor[], + ) => { + return renderClassnames( + showIcons, + showNumbered, + numberedActiveIndicator, + showWsIcons, + smartHighlight, + monitor, + monitors, + i, + ); + }, + ), + label: Utils.merge( + [ + options.bar.workspaces.show_icons.bind('value'), + options.bar.workspaces.icons.available.bind('value'), + options.bar.workspaces.icons.active.bind('value'), + options.bar.workspaces.icons.occupied.bind('value'), + options.bar.workspaces.workspaceIconMap.bind('value'), + options.bar.workspaces.showWsIcons.bind('value'), + workspaceMask.bind('value'), + hyprland.bind('monitors'), + ], + ( + showIcons: boolean, + available: string, + active: string, + occupied: string, + wsIconMap: WorkspaceIconMap, + showWsIcons: boolean, + workspaceMask: boolean, + monitors: Monitor[], + ) => { + return renderLabel( + showIcons, + available, + active, + occupied, + workspaceMask, + showWsIcons, + wsIconMap, + i, + index, + monitor, + monitors, + ); + }, + ), + setup: (self) => { + self.hook(hyprland, () => { + self.toggleClassName('active', hyprland.active.workspace.id === i); + self.toggleClassName('occupied', (hyprland.getWorkspace(i)?.windows || 0) > 0); + }); + }, + }), + }); + }); + }, + ), + }); +}; diff --git a/ags/HyprPanel/modules/bar/workspaces/variants/occupied.ts b/ags/HyprPanel/modules/bar/workspaces/variants/occupied.ts new file mode 100644 index 0000000..31f3f14 --- /dev/null +++ b/ags/HyprPanel/modules/bar/workspaces/variants/occupied.ts @@ -0,0 +1,145 @@ +const hyprland = await Service.import('hyprland'); +import options from 'options'; +import { getWorkspaceRules, getWorkspacesForMonitor, isWorkspaceIgnored } from '../helpers'; +import { Monitor, Workspace } from 'types/service/hyprland'; +import { getWsColor, renderClassnames, renderLabel } from '../utils'; +import { range } from 'lib/utils'; +import { BoxWidget } from 'lib/types/widget'; +import { WorkspaceIconMap } from 'lib/types/workspace'; + +const { workspaces, monitorSpecific, workspaceMask, spacing, ignored, showAllActive } = options.bar.workspaces; + +export const occupiedWses = (monitor: number): BoxWidget => { + return Widget.Box({ + children: Utils.merge( + [ + monitorSpecific.bind('value'), + hyprland.bind('workspaces'), + workspaceMask.bind('value'), + workspaces.bind('value'), + options.bar.workspaces.show_icons.bind('value'), + options.bar.workspaces.icons.available.bind('value'), + options.bar.workspaces.icons.active.bind('value'), + options.bar.workspaces.icons.occupied.bind('value'), + options.bar.workspaces.show_numbered.bind('value'), + options.bar.workspaces.numbered_active_indicator.bind('value'), + spacing.bind('value'), + options.bar.workspaces.workspaceIconMap.bind('value'), + options.bar.workspaces.showWsIcons.bind('value'), + options.theme.matugen.bind('value'), + options.theme.bar.buttons.workspaces.smartHighlight.bind('value'), + hyprland.bind('monitors'), + ignored.bind('value'), + showAllActive.bind('value'), + ], + ( + monitorSpecific: boolean, + wkSpaces: Workspace[], + workspaceMask: boolean, + totalWkspcs: number, + showIcons: boolean, + available: string, + active: string, + occupied: string, + showNumbered: boolean, + numberedActiveIndicator: string, + spacing: number, + wsIconMap: WorkspaceIconMap, + showWsIcons: boolean, + matugen: boolean, + smartHighlight: boolean, + monitors: Monitor[], + ) => { + const activeId = hyprland.active.workspace.id; + let allWkspcs = range(totalWkspcs || 8); + + const activeWorkspaces = wkSpaces.map((w) => w.id); + const workspaceRules = getWorkspaceRules(); + + // Sometimes hyprland doesn't have all the monitors in the list + // so we complement it with monitors from the workspace list + const workspaceMonitorList = hyprland?.workspaces?.map((m) => ({ + id: m.monitorID, + name: m.monitor, + })); + const curMonitor = + hyprland.monitors.find((m) => m.id === monitor) || + workspaceMonitorList.find((m) => m.id === monitor); + + const workspacesWithRules = Object.keys(workspaceRules).reduce((acc: number[], k: string) => { + return [...acc, ...workspaceRules[k]]; + }, [] as number[]); + + const activesForMonitor = activeWorkspaces.filter((w) => { + if ( + curMonitor && + Object.hasOwnProperty.call(workspaceRules, curMonitor.name) && + workspacesWithRules.includes(w) + ) { + return workspaceRules[curMonitor.name].includes(w); + } + return true; + }); + + if (monitorSpecific) { + const wrkspcsInRange = range(totalWkspcs).filter((w) => { + return getWorkspacesForMonitor(w, workspaceRules, monitor); + }); + allWkspcs = [...new Set([...activesForMonitor, ...wrkspcsInRange])]; + } else { + allWkspcs = [...new Set([...allWkspcs, ...activeWorkspaces])]; + } + + return allWkspcs + .sort((a, b) => { + return a - b; + }) + .map((i, index) => { + if (isWorkspaceIgnored(ignored, i)) { + return Widget.Box(); + } + return Widget.Button({ + class_name: 'workspace-button', + on_primary_click: () => { + hyprland.messageAsync(`dispatch workspace ${i}`); + }, + child: Widget.Label({ + attribute: i, + vpack: 'center', + css: + `margin: 0rem ${0.375 * spacing}rem;` + + `${showWsIcons && !matugen ? getWsColor(wsIconMap, i, smartHighlight, monitor, monitors) : ''}`, + class_name: renderClassnames( + showIcons, + showNumbered, + numberedActiveIndicator, + showWsIcons, + smartHighlight, + monitor, + monitors, + i, + ), + label: renderLabel( + showIcons, + available, + active, + occupied, + workspaceMask, + showWsIcons, + wsIconMap, + i, + index, + monitor, + monitors, + ), + setup: (self) => { + self.toggleClassName('active', activeId === i); + self.toggleClassName('occupied', (hyprland.getWorkspace(i)?.windows || 0) > 0); + }, + }), + }); + }); + }, + ), + }); +}; diff --git a/ags/HyprPanel/modules/icons/index.ts b/ags/HyprPanel/modules/icons/index.ts new file mode 100644 index 0000000..14d0a06 --- /dev/null +++ b/ags/HyprPanel/modules/icons/index.ts @@ -0,0 +1,199 @@ +export const substitutes = { + 'transmission-gtk': 'transmission', + 'blueberry.py': 'blueberry', + Caprine: 'facebook-messenger', + 'com.raggesilver.BlackBox-symbolic': 'terminal-symbolic', + 'org.wezfurlong.wezterm-symbolic': 'terminal-symbolic', + 'audio-headset-bluetooth': 'audio-headphones-symbolic', + 'audio-card-analog-usb': 'audio-speakers-symbolic', + 'audio-card-analog-pci': 'audio-card-symbolic', + 'preferences-system': 'emblem-system-symbolic', + 'com.github.Aylur.ags-symbolic': 'controls-symbolic', + 'com.github.Aylur.ags': 'controls-symbolic', +}; + +export default { + missing: 'image-missing-symbolic', + nix: { + nix: 'nix-snowflake-symbolic', + }, + app: { + terminal: 'terminal-symbolic', + }, + fallback: { + executable: 'application-x-executable', + notification: 'dialog-information-symbolic', + video: 'video-x-generic-symbolic', + audio: 'audio-x-generic-symbolic', + }, + ui: { + close: 'window-close-symbolic', + colorpicker: 'color-select-symbolic', + info: 'info-symbolic', + link: 'external-link-symbolic', + lock: 'system-lock-screen-symbolic', + menu: 'open-menu-symbolic', + refresh: 'view-refresh-symbolic', + search: 'system-search-symbolic', + settings: 'emblem-system-symbolic', + themes: 'preferences-desktop-theme-symbolic', + tick: 'object-select-symbolic', + time: 'hourglass-symbolic', + toolbars: 'toolbars-symbolic', + warning: 'dialog-warning-symbolic', + avatar: 'avatar-default-symbolic', + arrow: { + right: 'pan-end-symbolic', + left: 'pan-start-symbolic', + down: 'pan-down-symbolic', + up: 'pan-up-symbolic', + }, + }, + audio: { + mic: { + muted: 'microphone-disabled-symbolic', + low: 'microphone-sensitivity-low-symbolic', + medium: 'microphone-sensitivity-medium-symbolic', + high: 'microphone-sensitivity-high-symbolic', + }, + volume: { + muted: 'audio-volume-muted-symbolic', + low: 'audio-volume-low-symbolic', + medium: 'audio-volume-medium-symbolic', + high: 'audio-volume-high-symbolic', + overamplified: 'audio-volume-overamplified-symbolic', + }, + type: { + headset: 'audio-headphones-symbolic', + speaker: 'audio-speakers-symbolic', + card: 'audio-card-symbolic', + }, + mixer: 'mixer-symbolic', + }, + powerprofile: { + balanced: 'power-profile-balanced-symbolic', + 'power-saver': 'power-profile-power-saver-symbolic', + performance: 'power-profile-performance-symbolic', + }, + asusctl: { + profile: { + Balanced: 'power-profile-balanced-symbolic', + Quiet: 'power-profile-power-saver-symbolic', + Performance: 'power-profile-performance-symbolic', + }, + mode: { + Integrated: 'processor-symbolic', + Hybrid: 'controller-symbolic', + }, + }, + battery: { + charging: 'battery-flash-symbolic', + warning: 'battery-empty-symbolic', + }, + bluetooth: { + enabled: 'bluetooth-active-symbolic', + disabled: 'bluetooth-disabled-symbolic', + }, + brightness: { + indicator: 'display-brightness-symbolic', + keyboard: 'keyboard-brightness-symbolic', + screen: 'display-brightness-symbolic', + }, + powermenu: { + sleep: 'weather-clear-night-symbolic', + reboot: 'system-reboot-symbolic', + logout: 'system-log-out-symbolic', + shutdown: 'system-shutdown-symbolic', + }, + recorder: { + recording: 'media-record-symbolic', + }, + notifications: { + noisy: 'org.gnome.Settings-notifications-symbolic', + silent: 'notifications-disabled-symbolic', + message: 'chat-bubbles-symbolic', + }, + trash: { + full: 'user-trash-full-symbolic', + empty: 'user-trash-symbolic', + }, + mpris: { + shuffle: { + enabled: 'media-playlist-shuffle-symbolic', + disabled: 'media-playlist-consecutive-symbolic', + }, + loop: { + none: 'media-playlist-repeat-symbolic', + track: 'media-playlist-repeat-song-symbolic', + playlist: 'media-playlist-repeat-symbolic', + }, + playing: 'media-playback-pause-symbolic', + paused: 'media-playback-start-symbolic', + stopped: 'media-playback-start-symbolic', + prev: 'media-skip-backward-symbolic', + next: 'media-skip-forward-symbolic', + }, + system: { + cpu: 'org.gnome.SystemMonitor-symbolic', + ram: 'drive-harddisk-solidstate-symbolic', + temp: 'temperature-symbolic', + }, + color: { + dark: 'dark-mode-symbolic', + light: 'light-mode-symbolic', + }, + weather: { + warning: 'dialog-warning-symbolic', + sunny: 'weather-clear-symbolic', + clear: 'weather-clear-night-symbolic', + partly_cloudy: 'weather-few-clouds-symbolic', + partly_cloudy_night: 'weather-few-clouds-night-symbolic', + cloudy: 'weather-overcast-symbolic', + overcast: 'weather-overcast-symbolic', + mist: 'weather-overcast-symbolic', + patchy_rain_nearby: 'weather-showers-scattered-symbolic', + patchy_rain_possible: 'weather-showers-scattered-symbolic', + patchy_snow_possible: 'weather-snow-symbolic', + patchy_sleet_possible: 'weather-snow-symbolic', + patchy_freezing_drizzle_possible: 'weather-showers-scattered-symbolic', + thundery_outbreaks_possible: 'weather-overcast-symbolic', + blowing_snow: 'weather-snow-symbolic', + blizzard: 'weather-snow-symbolic', + fog: 'weather-fog-symbolic', + freezing_fog: 'weather-fog-symbolic', + patchy_light_drizzle: 'weather-showers-scattered-symbolic', + light_drizzle: 'weather-showers-symbolic', + freezing_drizzle: 'weather-showers-symbolic', + heavy_freezing_drizzle: 'weather-showers-symbolic', + patchy_light_rain: 'weather-showers-scattered-symbolic', + light_rain: 'weather-showers-symbolic', + moderate_rain_at_times: 'weather-showers-symbolic', + moderate_rain: 'weather-showers-symbolic', + heavy_rain_at_times: 'weather-showers-symbolic', + heavy_rain: 'weather-showers-symbolic', + light_freezing_rain: 'weather-showers-symbolic', + moderate_or_heavy_freezing_rain: 'weather-showers-symbolic', + light_sleet: 'weather-snow-symbolic', + moderate_or_heavy_sleet: 'weather-snow-symbolic', + patchy_light_snow: 'weather-snow-symbolic', + light_snow: 'weather-snow-symbolic', + patchy_moderate_snow: 'weather-snow-symbolic', + moderate_snow: 'weather-snow-symbolic', + patchy_heavy_snow: 'weather-snow-symbolic', + heavy_snow: 'weather-snow-symbolic', + ice_pellets: 'weather-showers-symbolic', + light_rain_shower: 'weather-showers-symbolic', + moderate_or_heavy_rain_shower: 'weather-showers-symbolic', + torrential_rain_shower: 'weather-showers-symbolic', + light_sleet_showers: 'weather-showers-symbolic', + moderate_or_heavy_sleet_showers: 'weather-showers-symbolic', + light_snow_showers: 'weather-snow-symbolic', + moderate_or_heavy_snow_showers: 'weather-snow-symbolic', + light_showers_of_ice_pellets: 'weather-showers-symbolic', + moderate_or_heavy_showers_of_ice_pellets: 'weather-showers-symbolic', + patchy_light_rain_with_thunder: 'weather-showers-scattered-symbolic', + moderate_or_heavy_rain_with_thunder: 'weather-showers-symbolic', + patchy_light_snow_with_thunder: 'weather-snow-symbolic', + moderate_or_heavy_snow_with_thunder: 'weather-snow-symbolic', + }, +} as const; diff --git a/ags/HyprPanel/modules/icons/weather.ts b/ags/HyprPanel/modules/icons/weather.ts new file mode 100644 index 0000000..90980a0 --- /dev/null +++ b/ags/HyprPanel/modules/icons/weather.ts @@ -0,0 +1,54 @@ +export const weatherIcons = { + warning: '󰼯', + sunny: '󰖙', + clear: '󰖔', + partly_cloudy: '󰖕', + partly_cloudy_night: '󰼱', + cloudy: '󰖐', + overcast: '󰖕', + mist: '󰖑', + patchy_rain_nearby: '󰼳', + patchy_rain_possible: '󰼳', + patchy_snow_possible: '󰼴', + patchy_sleet_possible: '󰙿', + patchy_freezing_drizzle_possible: '󰙿', + thundery_outbreaks_possible: '󰙾', + blowing_snow: '󰼶', + blizzard: '󰼶', + fog: '󰖑', + freezing_fog: '󰖑', + patchy_light_drizzle: '󰼳', + light_drizzle: '󰼳', + freezing_drizzle: '󰙿', + heavy_freezing_drizzle: '󰙿', + patchy_light_rain: '󰼳', + light_rain: '󰼳', + moderate_rain_at_times: '󰖗', + moderate_rain: '󰼳', + heavy_rain_at_times: '󰖖', + heavy_rain: '󰖖', + light_freezing_rain: '󰙿', + moderate_or_heavy_freezing_rain: '󰙿', + light_sleet: '󰙿', + moderate_or_heavy_sleet: '󰙿', + patchy_light_snow: '󰼴', + light_snow: '󰼴', + patchy_moderate_snow: '󰼴', + moderate_snow: '󰼶', + patchy_heavy_snow: '󰼶', + heavy_snow: '󰼶', + ice_pellets: '󰖒', + light_rain_shower: '󰖖', + moderate_or_heavy_rain_shower: '󰖖', + torrential_rain_shower: '󰖖', + light_sleet_showers: '󰼵', + moderate_or_heavy_sleet_showers: '󰼵', + light_snow_showers: '󰼵', + moderate_or_heavy_snow_showers: '󰼵', + light_showers_of_ice_pellets: '󰖒', + moderate_or_heavy_showers_of_ice_pellets: '󰖒', + patchy_light_rain_with_thunder: '󰙾', + moderate_or_heavy_rain_with_thunder: '󰙾', + patchy_light_snow_with_thunder: '󰼶', + moderate_or_heavy_snow_with_thunder: '󰼶', +} as const; diff --git a/ags/HyprPanel/modules/menus/audio/active/SelectedInput.ts b/ags/HyprPanel/modules/menus/audio/active/SelectedInput.ts new file mode 100644 index 0000000..4e3cff3 --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/active/SelectedInput.ts @@ -0,0 +1,75 @@ +const audio = await Service.import('audio'); +import { getIcon } from '../utils.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const renderActiveInput = (): Box[] => { + return [ + Widget.Box({ + class_name: 'menu-slider-container input', + children: [ + Widget.Button({ + vexpand: false, + vpack: 'end', + setup: (self) => { + const updateClass = (): void => { + const mic = audio.microphone; + const className = `menu-active-button input ${mic.is_muted ? 'muted' : ''}`; + self.class_name = className; + }; + + self.hook(audio.microphone, updateClass, 'notify::is-muted'); + }, + on_primary_click: () => (audio.microphone.is_muted = !audio.microphone.is_muted), + child: Widget.Icon({ + class_name: 'menu-active-icon input', + setup: (self) => { + const updateIcon = (): void => { + const isMicMuted = + audio.microphone.is_muted !== null ? audio.microphone.is_muted : true; + + if (audio.microphone.volume > 0) { + self.icon = getIcon(audio.microphone.volume, isMicMuted)['mic']; + } else { + self.icon = getIcon(100, true)['mic']; + } + }; + self.hook(audio.microphone, updateIcon, 'notify::volume'); + self.hook(audio.microphone, updateIcon, 'notify::is-muted'); + }, + }), + }), + Widget.Box({ + vertical: true, + children: [ + Widget.Label({ + class_name: 'menu-active input', + hpack: 'start', + truncate: 'end', + wrap: true, + label: audio.bind('microphone').as((v) => { + return v.description === null ? 'No input device found...' : v.description; + }), + }), + Widget.Slider({ + value: audio.microphone.bind('volume').as((v) => v), + class_name: 'menu-active-slider menu-slider inputs', + draw_value: false, + hexpand: true, + min: 0, + max: 1, + onChange: ({ value }) => (audio.microphone.volume = value), + }), + ], + }), + Widget.Label({ + class_name: 'menu-active-percentage input', + vpack: 'end', + label: audio.microphone.bind('volume').as((v) => `${Math.round(v * 100)}%`), + }), + ], + }), + ]; +}; + +export { renderActiveInput }; diff --git a/ags/HyprPanel/modules/menus/audio/active/SelectedPlayback.ts b/ags/HyprPanel/modules/menus/audio/active/SelectedPlayback.ts new file mode 100644 index 0000000..29e5afd --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/active/SelectedPlayback.ts @@ -0,0 +1,68 @@ +const audio = await Service.import('audio'); +import { getIcon } from '../utils.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const renderActivePlayback = (): Box[] => { + return [ + Widget.Box({ + class_name: 'menu-slider-container playback', + children: [ + Widget.Button({ + vexpand: false, + vpack: 'end', + setup: (self) => { + const updateClass = (): void => { + const spkr = audio.speaker; + const className = `menu-active-button playback ${spkr.is_muted ? 'muted' : ''}`; + self.class_name = className; + }; + + self.hook(audio.speaker, updateClass, 'notify::is-muted'); + }, + on_primary_click: () => (audio.speaker.is_muted = !audio.speaker.is_muted), + child: Widget.Icon({ + class_name: 'menu-active-icon playback', + setup: (self) => { + const updateIcon = (): void => { + const isSpeakerMuted = audio.speaker.is_muted !== null ? audio.speaker.is_muted : true; + self.icon = getIcon(audio.speaker.volume, isSpeakerMuted)['spkr']; + }; + self.hook(audio.speaker, updateIcon, 'notify::volume'); + self.hook(audio.speaker, updateIcon, 'notify::is-muted'); + }, + }), + }), + Widget.Box({ + vertical: true, + children: [ + Widget.Label({ + class_name: 'menu-active playback', + hpack: 'start', + truncate: 'end', + expand: true, + wrap: true, + label: audio.bind('speaker').as((v) => v.description || ''), + }), + Widget.Slider({ + value: audio['speaker'].bind('volume'), + class_name: 'menu-active-slider menu-slider playback', + draw_value: false, + hexpand: true, + min: 0, + max: 1, + onChange: ({ value }) => (audio.speaker.volume = value), + }), + ], + }), + Widget.Label({ + vpack: 'end', + class_name: 'menu-active-percentage playback', + label: audio.speaker.bind('volume').as((v) => `${Math.round(v * 100)}%`), + }), + ], + }), + ]; +}; + +export { renderActivePlayback }; diff --git a/ags/HyprPanel/modules/menus/audio/active/index.ts b/ags/HyprPanel/modules/menus/audio/active/index.ts new file mode 100644 index 0000000..9768ddb --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/active/index.ts @@ -0,0 +1,41 @@ +import { renderActiveInput } from './SelectedInput.js'; +import { renderActivePlayback } from './SelectedPlayback.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const activeDevices = (): Box => { + return Widget.Box({ + class_name: 'menu-section-container volume', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-label-container volume selected', + hpack: 'fill', + child: Widget.Label({ + class_name: 'menu-label audio volume', + hexpand: true, + hpack: 'start', + label: 'Volume', + }), + }), + Widget.Box({ + class_name: 'menu-items-section selected', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-active-container playback', + vertical: true, + children: renderActivePlayback(), + }), + Widget.Box({ + class_name: 'menu-active-container input', + vertical: true, + children: renderActiveInput(), + }), + ], + }), + ], + }); +}; + +export { activeDevices }; diff --git a/ags/HyprPanel/modules/menus/audio/available/InputDevices.ts b/ags/HyprPanel/modules/menus/audio/available/InputDevices.ts new file mode 100644 index 0000000..8c75a5a --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/available/InputDevices.ts @@ -0,0 +1,66 @@ +const audio = await Service.import('audio'); +import { InputDevices } from 'lib/types/audio'; +import { Stream } from 'types/service/audio'; + +const renderInputDevices = (inputDevices: Stream[]): InputDevices => { + if (inputDevices.length === 0) { + return [ + Widget.Button({ + class_name: `menu-unfound-button input`, + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: 'start', + children: [ + Widget.Label({ + class_name: 'menu-button-name input', + label: 'No input devices found...', + }), + ], + }), + ], + }), + }), + ]; + } + return inputDevices.map((device) => { + return Widget.Button({ + on_primary_click: () => (audio.microphone = device), + class_name: `menu-button audio input ${device}`, + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: 'start', + children: [ + Widget.Label({ + wrap: true, + class_name: audio.microphone + .bind('description') + .as((v) => + device.description === v + ? 'menu-button-icon active input txt-icon' + : 'menu-button-icon input txt-icon', + ), + label: '', + }), + Widget.Label({ + truncate: 'end', + wrap: true, + class_name: audio.microphone + .bind('description') + .as((v) => + device.description === v + ? 'menu-button-name active input' + : 'menu-button-name input', + ), + label: device.description, + }), + ], + }), + ], + }), + }); + }); +}; + +export { renderInputDevices }; diff --git a/ags/HyprPanel/modules/menus/audio/available/PlaybackDevices.ts b/ags/HyprPanel/modules/menus/audio/available/PlaybackDevices.ts new file mode 100644 index 0000000..02bc618 --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/available/PlaybackDevices.ts @@ -0,0 +1,60 @@ +const audio = await Service.import('audio'); +import { PlaybackDevices } from 'lib/types/audio'; +import { Stream } from 'types/service/audio'; + +const renderPlaybacks = (playbackDevices: Stream[]): PlaybackDevices => { + return playbackDevices.map((device) => { + if (device.description === 'Dummy Output') { + return Widget.Box({ + class_name: 'menu-unfound-button playback', + child: Widget.Box({ + children: [ + Widget.Label({ + class_name: 'menu-button-name playback', + label: 'No playback devices found...', + }), + ], + }), + }); + } + return Widget.Button({ + class_name: `menu-button audio playback ${device}`, + on_primary_click: () => (audio.speaker = device), + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: 'start', + children: [ + Widget.Label({ + truncate: 'end', + wrap: true, + class_name: audio.speaker + .bind('description') + .as((v) => + device.description === v + ? 'menu-button-icon active playback txt-icon' + : 'menu-button-icon playback txt-icon', + ), + label: '', + }), + Widget.Label({ + truncate: 'end', + wrap: true, + class_name: audio.speaker + .bind('description') + .as((v) => + device.description === v + ? 'menu-button-name active playback' + : 'menu-button-name playback', + ), + label: device.description, + }), + ], + }), + ], + }), + }); + }); +}; + +export { renderPlaybacks }; diff --git a/ags/HyprPanel/modules/menus/audio/available/index.ts b/ags/HyprPanel/modules/menus/audio/available/index.ts new file mode 100644 index 0000000..e9b0d48 --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/available/index.ts @@ -0,0 +1,72 @@ +const audio = await Service.import('audio'); +import { BoxWidget } from 'lib/types/widget.js'; +import { renderInputDevices } from './InputDevices.js'; +import { renderPlaybacks } from './PlaybackDevices.js'; + +const availableDevices = (): BoxWidget => { + return Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-section-container playback', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-label-container playback', + hpack: 'fill', + child: Widget.Label({ + class_name: 'menu-label audio playback', + hexpand: true, + hpack: 'start', + label: 'Playback Devices', + }), + }), + Widget.Box({ + class_name: 'menu-items-section playback', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-container playback', + vertical: true, + children: [ + Widget.Box({ + vertical: true, + children: audio.bind('speakers').as((v) => renderPlaybacks(v)), + }), + ], + }), + ], + }), + Widget.Box({ + class_name: 'menu-label-container input', + hpack: 'fill', + child: Widget.Label({ + class_name: 'menu-label audio input', + hexpand: true, + hpack: 'start', + label: 'Input Devices', + }), + }), + Widget.Box({ + class_name: 'menu-items-section input', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-container input', + vertical: true, + children: [ + Widget.Box({ + vertical: true, + children: audio.bind('microphones').as((v) => renderInputDevices(v)), + }), + ], + }), + ], + }), + ], + }), + ], + }); +}; + +export { availableDevices }; diff --git a/ags/HyprPanel/modules/menus/audio/index.ts b/ags/HyprPanel/modules/menus/audio/index.ts new file mode 100644 index 0000000..6801151 --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/index.ts @@ -0,0 +1,25 @@ +import Window from 'types/widgets/window.js'; +import DropdownMenu from '../shared/dropdown/index.js'; +import { activeDevices } from './active/index.js'; +import { availableDevices } from './available/index.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import options from 'options.js'; + +export default (): Window => { + return DropdownMenu({ + name: 'audiomenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'menu-items audio', + hpack: 'fill', + hexpand: true, + child: Widget.Box({ + vertical: true, + hpack: 'fill', + hexpand: true, + class_name: 'menu-items-container audio', + children: [activeDevices(), availableDevices()], + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/audio/utils.ts b/ags/HyprPanel/modules/menus/audio/utils.ts new file mode 100644 index 0000000..aa1de5c --- /dev/null +++ b/ags/HyprPanel/modules/menus/audio/utils.ts @@ -0,0 +1,29 @@ +const speakerIcons = { + 101: 'audio-volume-overamplified-symbolic', + 66: 'audio-volume-high-symbolic', + 34: 'audio-volume-medium-symbolic', + 1: 'audio-volume-low-symbolic', + 0: 'audio-volume-muted-symbolic', +} as const; + +const inputIcons = { + 101: 'microphone-sensitivity-high-symbolic', + 66: 'microphone-sensitivity-high-symbolic', + 34: 'microphone-sensitivity-medium-symbolic', + 1: 'microphone-sensitivity-low-symbolic', + 0: 'microphone-disabled-symbolic', +}; + +type IconVolumes = keyof typeof speakerIcons; + +const getIcon = (audioVol: number, isMuted: boolean): Record => { + const thresholds: IconVolumes[] = [101, 66, 34, 1, 0]; + const icon = isMuted ? 0 : thresholds.find((threshold) => threshold <= audioVol * 100) || 0; + + return { + spkr: speakerIcons[icon], + mic: inputIcons[icon], + }; +}; + +export { getIcon }; diff --git a/ags/HyprPanel/modules/menus/bluetooth/devices/connectedControls.ts b/ags/HyprPanel/modules/menus/bluetooth/devices/connectedControls.ts new file mode 100644 index 0000000..62e8345 --- /dev/null +++ b/ags/HyprPanel/modules/menus/bluetooth/devices/connectedControls.ts @@ -0,0 +1,71 @@ +import { BoxWidget } from 'lib/types/widget'; +import { BluetoothDevice } from 'types/service/bluetooth'; + +const connectedControls = (dev: BluetoothDevice, connectedDevices: BluetoothDevice[]): BoxWidget => { + if (!connectedDevices.includes(dev.address)) { + return Widget.Box({}); + } + + return Widget.Box({ + vpack: 'start', + class_name: 'bluetooth-controls', + children: [ + Widget.Button({ + class_name: 'menu-icon-button unpair bluetooth', + child: Widget.Label({ + tooltip_text: dev.paired ? 'Unpair' : 'Pair', + class_name: 'menu-icon-button-label unpair bluetooth txt-icon', + label: dev.paired ? '' : '', + }), + on_primary_click: () => + Utils.execAsync([ + 'bash', + '-c', + `bluetoothctl ${dev.paired ? 'unpair' : 'pair'} ${dev.address}`, + ]).catch((err) => + console.error(`bluetoothctl ${dev.paired ? 'unpair' : 'pair'} ${dev.address}`, err), + ), + }), + Widget.Button({ + class_name: 'menu-icon-button disconnect bluetooth', + child: Widget.Label({ + tooltip_text: dev.connected ? 'Disconnect' : 'Connect', + class_name: 'menu-icon-button-label disconnect bluetooth txt-icon', + label: dev.connected ? '󱘖' : '', + }), + on_primary_click: () => dev.setConnection(!dev.connected), + }), + Widget.Button({ + class_name: 'menu-icon-button untrust bluetooth', + child: Widget.Label({ + tooltip_text: dev.trusted ? 'Untrust' : 'Trust', + class_name: 'menu-icon-button-label untrust bluetooth txt-icon', + label: dev.trusted ? '' : '󱖡', + }), + on_primary_click: () => + Utils.execAsync([ + 'bash', + '-c', + `bluetoothctl ${dev.trusted ? 'untrust' : 'trust'} ${dev.address}`, + ]).catch((err) => + console.error(`bluetoothctl ${dev.trusted ? 'untrust' : 'trust'} ${dev.address}`, err), + ), + }), + Widget.Button({ + class_name: 'menu-icon-button delete bluetooth', + child: Widget.Label({ + tooltip_text: 'Forget', + class_name: 'menu-icon-button-label delete bluetooth txt-icon', + label: '󰆴', + }), + on_primary_click: () => { + Utils.execAsync(['bash', '-c', `bluetoothctl remove ${dev.address}`]).catch((err) => + console.error('Bluetooth Remove', err), + ); + }, + }), + ], + }); +}; + +export { connectedControls }; diff --git a/ags/HyprPanel/modules/menus/bluetooth/devices/devicelist.ts b/ags/HyprPanel/modules/menus/bluetooth/devices/devicelist.ts new file mode 100644 index 0000000..e1fdcc9 --- /dev/null +++ b/ags/HyprPanel/modules/menus/bluetooth/devices/devicelist.ts @@ -0,0 +1,136 @@ +import { Bluetooth } from 'types/service/bluetooth.js'; +import Box from 'types/widgets/box.js'; +import { connectedControls } from './connectedControls.js'; +import { getBluetoothIcon } from '../utils.js'; +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const devices = (bluetooth: Bluetooth, self: Box): Box => { + return self.hook(bluetooth, () => { + if (!bluetooth.enabled) { + return (self.child = Widget.Box({ + class_name: 'bluetooth-items', + vertical: true, + expand: true, + vpack: 'center', + hpack: 'center', + children: [ + Widget.Label({ + class_name: 'bluetooth-disabled dim', + hexpand: true, + label: 'Bluetooth is disabled', + }), + ], + })); + } + + const availableDevices = bluetooth.devices + .filter((btDev) => btDev.name !== null) + .sort((a, b) => { + if (a.connected || a.paired) { + return -1; + } + + if (b.connected || b.paired) { + return 1; + } + + return b.name - a.name; + }); + + const conDevNames = availableDevices.filter((d) => d.connected || d.paired).map((d) => d.address); + + if (!availableDevices.length) { + return (self.child = Widget.Box({ + class_name: 'bluetooth-items', + vertical: true, + expand: true, + vpack: 'center', + hpack: 'center', + children: [ + Widget.Label({ + class_name: 'no-bluetooth-devices dim', + hexpand: true, + label: 'No devices currently found', + }), + Widget.Label({ + class_name: 'search-bluetooth-label dim', + hexpand: true, + label: "Press '󰑐' to search", + }), + ], + })); + } + + return (self.child = Widget.Box({ + vertical: true, + children: availableDevices.map((device) => { + return Widget.Box({ + children: [ + Widget.Button({ + hexpand: true, + class_name: `bluetooth-element-item ${device}`, + on_primary_click: () => { + if (!conDevNames.includes(device.address)) device.setConnection(true); + }, + child: Widget.Box({ + hexpand: true, + children: [ + Widget.Box({ + hexpand: true, + hpack: 'start', + class_name: 'menu-button-container', + children: [ + Widget.Label({ + vpack: 'start', + class_name: `menu-button-icon bluetooth ${conDevNames.includes(device.address) ? 'active' : ''} txt-icon`, + label: getBluetoothIcon(`${device['icon_name']}-symbolic`), + }), + Widget.Box({ + vertical: true, + vpack: 'center', + children: [ + Widget.Label({ + vpack: 'center', + hpack: 'start', + class_name: 'menu-button-name bluetooth', + truncate: 'end', + wrap: true, + label: device.alias, + }), + Widget.Revealer({ + hpack: 'start', + reveal_child: device.connected || device.paired, + child: Widget.Label({ + hpack: 'start', + class_name: 'connection-status dim', + label: device.connected ? 'Connected' : 'Paired', + }), + }), + ], + }), + ], + }), + Widget.Box({ + hpack: 'end', + children: device.connecting + ? [ + Widget.Spinner({ + vpack: 'start', + class_name: 'spinner bluetooth', + }), + ] + : [], + }), + ], + }), + }), + connectedControls(device, conDevNames), + ], + }); + }), + })); + }); +}; + +export { devices }; diff --git a/ags/HyprPanel/modules/menus/bluetooth/devices/index.ts b/ags/HyprPanel/modules/menus/bluetooth/devices/index.ts new file mode 100644 index 0000000..31315d5 --- /dev/null +++ b/ags/HyprPanel/modules/menus/bluetooth/devices/index.ts @@ -0,0 +1,26 @@ +const bluetooth = await Service.import('bluetooth'); +import { label } from './label.js'; +import { devices } from './devicelist.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +const Devices = (): BoxWidget => { + return Widget.Box({ + class_name: 'menu-section-container', + vertical: true, + children: [ + label(bluetooth), + Widget.Box({ + class_name: 'menu-items-section', + child: Widget.Box({ + class_name: 'menu-content', + vertical: true, + setup: (self) => { + devices(bluetooth, self); + }, + }), + }), + ], + }); +}; + +export { Devices }; diff --git a/ags/HyprPanel/modules/menus/bluetooth/devices/label.ts b/ags/HyprPanel/modules/menus/bluetooth/devices/label.ts new file mode 100644 index 0000000..45fabf6 --- /dev/null +++ b/ags/HyprPanel/modules/menus/bluetooth/devices/label.ts @@ -0,0 +1,65 @@ +import { BoxWidget } from 'lib/types/widget'; +import { Bluetooth } from 'types/service/bluetooth'; + +const label = (bluetooth: Bluetooth): BoxWidget => { + const searchInProgress = Variable(false); + + const startRotation = (): void => { + searchInProgress.value = true; + setTimeout(() => { + searchInProgress.value = false; + }, 10 * 1000); + }; + + return Widget.Box({ + class_name: 'menu-label-container', + hpack: 'fill', + vpack: 'start', + children: [ + Widget.Label({ + class_name: 'menu-label', + vpack: 'center', + hpack: 'start', + label: 'Bluetooth', + }), + Widget.Box({ + class_name: 'controls-container', + vpack: 'start', + children: [ + Widget.Switch({ + class_name: 'menu-switch bluetooth', + hexpand: true, + hpack: 'end', + active: bluetooth.bind('enabled'), + on_activate: ({ active }) => { + searchInProgress.value = false; + Utils.execAsync(['bash', '-c', `bluetoothctl power ${active ? 'on' : 'off'}`]).catch( + (err) => console.error(`bluetoothctl power ${active ? 'on' : 'off'}`, err), + ); + }, + }), + Widget.Separator({ + class_name: 'menu-separator bluetooth', + }), + Widget.Button({ + vpack: 'center', + class_name: 'menu-icon-button search', + on_primary_click: () => { + startRotation(); + Utils.execAsync(['bash', '-c', 'bluetoothctl --timeout 120 scan on']).catch((err) => { + searchInProgress.value = false; + console.error('bluetoothctl --timeout 120 scan on', err); + }); + }, + child: Widget.Icon({ + class_name: searchInProgress.bind('value').as((v) => (v ? 'spinning' : '')), + icon: 'view-refresh-symbolic', + }), + }), + ], + }), + ], + }); +}; + +export { label }; diff --git a/ags/HyprPanel/modules/menus/bluetooth/index.ts b/ags/HyprPanel/modules/menus/bluetooth/index.ts new file mode 100644 index 0000000..54dfcad --- /dev/null +++ b/ags/HyprPanel/modules/menus/bluetooth/index.ts @@ -0,0 +1,24 @@ +import Window from 'types/widgets/window.js'; +import DropdownMenu from '../shared/dropdown/index.js'; +import { Devices } from './devices/index.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import options from 'options.js'; + +export default (): Window => { + return DropdownMenu({ + name: 'bluetoothmenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'menu-items bluetooth', + hpack: 'fill', + hexpand: true, + child: Widget.Box({ + vertical: true, + hpack: 'fill', + hexpand: true, + class_name: 'menu-items-container bluetooth', + child: Devices(), + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/bluetooth/utils.ts b/ags/HyprPanel/modules/menus/bluetooth/utils.ts new file mode 100644 index 0000000..c305538 --- /dev/null +++ b/ags/HyprPanel/modules/menus/bluetooth/utils.ts @@ -0,0 +1,29 @@ +const getBluetoothIcon = (iconName: string): string => { + const deviceIconMap = [ + ['^audio-card*', '󰎄'], + ['^audio-headphones*', '󰋋'], + ['^audio-headset*', '󰋎'], + ['^audio-input*', '󰍬'], + ['^audio-speakers*', '󰓃'], + ['^bluetooth*', '󰂯'], + ['^camera*', '󰄀'], + ['^computer*', '󰟀'], + ['^input-gaming*', '󰍬'], + ['^input-keyboard*', '󰌌'], + ['^input-mouse*', '󰍽'], + ['^input-tablet*', '󰓶'], + ['^media*', '󱛟'], + ['^modem*', '󱂇'], + ['^network*', '󱂇'], + ['^phone*', '󰄞'], + ['^printer*', '󰐪'], + ['^scanner*', '󰚫'], + ['^video-camera*', '󰕧'], + ]; + + const foundMatch = deviceIconMap.find((icon) => RegExp(icon[0]).test(iconName.toLowerCase())); + + return foundMatch ? foundMatch[1] : '󰂯'; +}; + +export { getBluetoothIcon }; diff --git a/ags/HyprPanel/modules/menus/calendar/calendar.ts b/ags/HyprPanel/modules/menus/calendar/calendar.ts new file mode 100644 index 0000000..d2af59e --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/calendar.ts @@ -0,0 +1,24 @@ +import { BoxWidget } from 'lib/types/widget'; + +const CalendarWidget = (): BoxWidget => { + return Widget.Box({ + class_name: 'calendar-menu-item-container calendar', + hpack: 'fill', + vpack: 'fill', + expand: true, + child: Widget.Box({ + class_name: 'calendar-container-box', + child: Widget.Calendar({ + expand: true, + hpack: 'fill', + vpack: 'fill', + class_name: 'calendar-menu-widget', + showDayNames: true, + showDetails: false, + showHeading: true, + }), + }), + }); +}; + +export { CalendarWidget }; diff --git a/ags/HyprPanel/modules/menus/calendar/index.ts b/ags/HyprPanel/modules/menus/calendar/index.ts new file mode 100644 index 0000000..d3fecb8 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/index.ts @@ -0,0 +1,36 @@ +import DropdownMenu from 'modules/menus/shared/dropdown/index'; +import { TimeWidget } from './time/index'; +import { CalendarWidget } from './calendar'; +import { WeatherWidget } from './weather/index'; +import options from 'options'; +import Window from 'types/widgets/window'; +import { Attribute, Child } from 'lib/types/widget'; + +const { enabled: weatherEnabled } = options.menus.clock.weather; + +export default (): Window => { + return DropdownMenu({ + name: 'calendarmenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'calendar-menu-content', + css: 'padding: 1px; margin: -1px;', + vexpand: false, + children: [ + Widget.Box({ + class_name: 'calendar-content-container', + vertical: true, + children: [ + Widget.Box({ + class_name: 'calendar-content-items', + vertical: true, + children: weatherEnabled.bind('value').as((isWeatherEnabled) => { + return [TimeWidget(), CalendarWidget(), ...(isWeatherEnabled ? [WeatherWidget()] : [])]; + }), + }), + ], + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/time/index.ts b/ags/HyprPanel/modules/menus/calendar/time/index.ts new file mode 100644 index 0000000..2cbb279 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/time/index.ts @@ -0,0 +1,75 @@ +import { BoxWidget } from 'lib/types/widget'; +import options from 'options'; + +const { military, hideSeconds } = options.menus.clock.time; + +const time = Variable('', { + poll: [1000, 'date "+%I:%M:%S"'], +}); + +const period = Variable('', { + poll: [1000, 'date "+%p"'], +}); + +const militaryTime = Variable('', { + poll: [1000, 'date "+%H:%M:%S"'], +}); + +const TimeWidget = (): BoxWidget => { + return Widget.Box({ + class_name: 'calendar-menu-item-container clock', + hexpand: true, + vpack: 'center', + hpack: 'fill', + child: Widget.Box({ + hexpand: true, + vpack: 'center', + hpack: 'center', + class_name: 'clock-content-items', + children: Utils.merge( + [military.bind('value'), hideSeconds.bind('value')], + (is24hr: boolean, hideSeconds: boolean) => { + if (!is24hr) { + return [ + Widget.Box({ + hpack: 'center', + children: [ + Widget.Label({ + class_name: 'clock-content-time', + label: hideSeconds ? time.bind().as((str) => str.slice(0, -3)) : time.bind(), + }), + ], + }), + Widget.Box({ + hpack: 'center', + children: [ + Widget.Label({ + vpack: 'end', + class_name: 'clock-content-period', + label: period.bind(), + }), + ], + }), + ]; + } + + return [ + Widget.Box({ + hpack: 'center', + children: [ + Widget.Label({ + class_name: 'clock-content-time', + label: hideSeconds + ? militaryTime.bind().as((str) => str.slice(0, -3)) + : militaryTime.bind(), + }), + ], + }), + ]; + }, + ), + }), + }); +}; + +export { TimeWidget }; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/hourly/icon/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/hourly/icon/index.ts new file mode 100644 index 0000000..2c636c1 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/hourly/icon/index.ts @@ -0,0 +1,43 @@ +import { Weather, WeatherIconTitle } from 'lib/types/weather.js'; +import { Variable } from 'types/variable.js'; +import { weatherIcons } from 'modules/icons/weather.js'; +import { isValidWeatherIconTitle } from 'globals/weather'; +import { BoxWidget } from 'lib/types/widget'; +import { getNextEpoch } from '../utils'; + +export const HourlyIcon = (theWeather: Variable, hoursFromNow: number): BoxWidget => { + const getIconQuery = (wthr: Weather): WeatherIconTitle => { + const nextEpoch = getNextEpoch(wthr, hoursFromNow); + const weatherAtEpoch = wthr.forecast.forecastday[0].hour.find((h) => h.time_epoch === nextEpoch); + + if (weatherAtEpoch === undefined) { + return 'warning'; + } + + let iconQuery = weatherAtEpoch.condition.text.trim().toLowerCase().replaceAll(' ', '_'); + + if (!weatherAtEpoch?.is_day && iconQuery === 'partly_cloudy') { + iconQuery = 'partly_cloudy_night'; + } + + if (isValidWeatherIconTitle(iconQuery)) { + return iconQuery; + } else { + return 'warning'; + } + }; + + return Widget.Box({ + hpack: 'center', + child: theWeather.bind('value').as((w) => { + const iconQuery = getIconQuery(w); + const weatherIcn = weatherIcons[iconQuery] || weatherIcons['warning']; + + return Widget.Label({ + hpack: 'center', + class_name: 'hourly-weather-icon txt-icon', + label: weatherIcn, + }); + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/hourly/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/hourly/index.ts new file mode 100644 index 0000000..0eb1982 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/hourly/index.ts @@ -0,0 +1,27 @@ +import { Weather } from 'lib/types/weather'; +import { Variable } from 'types/variable'; +import { HourlyIcon } from './icon/index.js'; +import { HourlyTemp } from './temperature/index.js'; +import { HourlyTime } from './time/index.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +export const Hourly = (theWeather: Variable): BoxWidget => { + return Widget.Box({ + vertical: false, + hexpand: true, + hpack: 'fill', + class_name: 'hourly-weather-container', + children: [1, 2, 3, 4].map((hoursFromNow) => { + return Widget.Box({ + class_name: 'hourly-weather-item', + hexpand: true, + vertical: true, + children: [ + HourlyTime(theWeather, hoursFromNow), + HourlyIcon(theWeather, hoursFromNow), + HourlyTemp(theWeather, hoursFromNow), + ], + }); + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/hourly/temperature/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/hourly/temperature/index.ts new file mode 100644 index 0000000..440c994 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/hourly/temperature/index.ts @@ -0,0 +1,27 @@ +import { Weather } from 'lib/types/weather'; +import { Variable } from 'types/variable'; +import options from 'options'; +import Label from 'types/widgets/label'; +import { Child } from 'lib/types/widget'; +import { getNextEpoch } from '../utils'; + +const { unit } = options.menus.clock.weather; + +export const HourlyTemp = (theWeather: Variable, hoursFromNow: number): Label => { + return Widget.Label({ + class_name: 'hourly-weather-temp', + label: Utils.merge([theWeather.bind('value'), unit.bind('value')], (wthr, unt) => { + if (!Object.keys(wthr).length) { + return '-'; + } + + const nextEpoch = getNextEpoch(wthr, hoursFromNow); + const weatherAtEpoch = wthr.forecast.forecastday[0].hour.find((h) => h.time_epoch === nextEpoch); + + if (unt === 'imperial') { + return `${weatherAtEpoch ? Math.ceil(weatherAtEpoch.temp_f) : '-'}° F`; + } + return `${weatherAtEpoch ? Math.ceil(weatherAtEpoch.temp_c) : '-'}° C`; + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/hourly/time/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/hourly/time/index.ts new file mode 100644 index 0000000..717eac4 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/hourly/time/index.ts @@ -0,0 +1,24 @@ +import { Weather } from 'lib/types/weather'; +import { Child } from 'lib/types/widget'; +import { Variable } from 'types/variable'; +import Label from 'types/widgets/label'; +import { getNextEpoch } from '../utils'; + +export const HourlyTime = (theWeather: Variable, hoursFromNow: number): Label => { + return Widget.Label({ + class_name: 'hourly-weather-time', + label: theWeather.bind('value').as((w) => { + if (!Object.keys(w).length) { + return '-'; + } + + const nextEpoch = getNextEpoch(w, hoursFromNow); + const dateAtEpoch = new Date(nextEpoch * 1000); + let hours = dateAtEpoch.getHours(); + const ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12 || 12; + + return `${hours}${ampm}`; + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/hourly/utils.ts b/ags/HyprPanel/modules/menus/calendar/weather/hourly/utils.ts new file mode 100644 index 0000000..13f1d53 --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/hourly/utils.ts @@ -0,0 +1,20 @@ +import { Weather } from 'lib/types/weather'; + +export const getNextEpoch = (wthr: Weather, hoursFromNow: number): number => { + const currentEpoch = wthr.location.localtime_epoch; + const epochAtHourStart = currentEpoch - (currentEpoch % 3600); + let nextEpoch = 3600 * hoursFromNow + epochAtHourStart; + + const curHour = new Date(currentEpoch * 1000).getHours(); + + /* + * NOTE: Since the API is only capable of showing the current day; if + * the hours left in the day are less than 4 (aka spilling into the next day), + * then rewind to contain the prediction within the current day. + */ + if (curHour > 19) { + const hoursToRewind = curHour - 19; + nextEpoch = 3600 * hoursFromNow + epochAtHourStart - hoursToRewind * 3600; + } + return nextEpoch; +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/icon/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/icon/index.ts new file mode 100644 index 0000000..dff981a --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/icon/index.ts @@ -0,0 +1,18 @@ +import { Weather } from 'lib/types/weather'; +import { Variable } from 'types/variable'; +import { getWeatherStatusTextIcon } from 'globals/weather.js'; +import { BoxWidget } from 'lib/types/widget'; + +export const TodayIcon = (theWeather: Variable): BoxWidget => { + return Widget.Box({ + vpack: 'center', + hpack: 'start', + class_name: 'calendar-menu-weather today icon container', + child: Widget.Label({ + class_name: 'calendar-menu-weather today icon txt-icon', + label: theWeather.bind('value').as((w) => { + return getWeatherStatusTextIcon(w); + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/index.ts new file mode 100644 index 0000000..bf4a6bf --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/index.ts @@ -0,0 +1,38 @@ +import { TodayIcon } from './icon/index.js'; +import { TodayStats } from './stats/index.js'; +import { TodayTemperature } from './temperature/index.js'; +import { Hourly } from './hourly/index.js'; +import { globalWeatherVar } from 'globals/weather.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +const WeatherWidget = (): BoxWidget => { + return Widget.Box({ + class_name: 'calendar-menu-item-container weather', + child: Widget.Box({ + class_name: 'weather-container-box', + setup: (self) => { + return (self.child = Widget.Box({ + vertical: true, + hexpand: true, + children: [ + Widget.Box({ + class_name: 'calendar-menu-weather today', + hexpand: true, + children: [ + TodayIcon(globalWeatherVar), + TodayTemperature(globalWeatherVar), + TodayStats(globalWeatherVar), + ], + }), + Widget.Separator({ + class_name: 'menu-separator weather', + }), + Hourly(globalWeatherVar), + ], + })); + }, + }), + }); +}; + +export { WeatherWidget }; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/stats/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/stats/index.ts new file mode 100644 index 0000000..197032f --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/stats/index.ts @@ -0,0 +1,50 @@ +import { Weather } from 'lib/types/weather'; +import { Variable } from 'types/variable'; +import options from 'options'; +import { Unit } from 'lib/types/options'; +import { getRainChance, getWindConditions } from 'globals/weather'; +import { BoxWidget } from 'lib/types/widget'; + +const { unit } = options.menus.clock.weather; + +export const TodayStats = (theWeather: Variable): BoxWidget => { + return Widget.Box({ + class_name: 'calendar-menu-weather today stats container', + hpack: 'end', + vpack: 'center', + vertical: true, + children: [ + Widget.Box({ + class_name: 'weather wind', + children: [ + Widget.Label({ + class_name: 'weather wind icon txt-icon', + label: '', + }), + Widget.Label({ + class_name: 'weather wind label', + label: Utils.merge( + [theWeather.bind('value'), unit.bind('value')], + (wthr: Weather, unt: Unit) => { + return getWindConditions(wthr, unt); + }, + ), + }), + ], + }), + Widget.Box({ + class_name: 'weather precip', + children: [ + Widget.Label({ + class_name: 'weather precip icon txt-icon', + label: '', + }), + Widget.Label({ + class_name: 'weather precip label', + label: theWeather.bind('value').as((v) => getRainChance(v)), + }), + ], + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/menus/calendar/weather/temperature/index.ts b/ags/HyprPanel/modules/menus/calendar/weather/temperature/index.ts new file mode 100644 index 0000000..597a75c --- /dev/null +++ b/ags/HyprPanel/modules/menus/calendar/weather/temperature/index.ts @@ -0,0 +1,62 @@ +import { Weather } from 'lib/types/weather'; +import { Variable } from 'types/variable'; +import options from 'options'; +import { getTemperature, getWeatherIcon } from 'globals/weather'; +import { BoxWidget } from 'lib/types/widget'; +const { unit } = options.menus.clock.weather; + +export const TodayTemperature = (theWeather: Variable): BoxWidget => { + return Widget.Box({ + hpack: 'center', + vpack: 'center', + vertical: true, + children: [ + Widget.Box({ + hexpand: true, + vpack: 'center', + class_name: 'calendar-menu-weather today temp container', + vertical: false, + children: [ + Widget.Box({ + hexpand: true, + hpack: 'center', + children: [ + Widget.Label({ + class_name: 'calendar-menu-weather today temp label', + label: Utils.merge([theWeather.bind('value'), unit.bind('value')], (wthr, unt) => { + return getTemperature(wthr, unt); + }), + }), + Widget.Label({ + class_name: theWeather + .bind('value') + .as( + (v) => + `calendar-menu-weather today temp label icon txt-icon ${getWeatherIcon(Math.ceil(v.current.temp_f)).color}`, + ), + label: theWeather + .bind('value') + .as((v) => getWeatherIcon(Math.ceil(v.current.temp_f)).icon), + }), + ], + }), + ], + }), + Widget.Box({ + hpack: 'center', + child: Widget.Label({ + max_width_chars: 17, + truncate: 'end', + lines: 2, + class_name: theWeather + .bind('value') + .as( + (v) => + `calendar-menu-weather today condition label ${getWeatherIcon(Math.ceil(v.current.temp_f)).color}`, + ), + label: theWeather.bind('value').as((v) => v.current.condition.text), + }), + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/menus/dashboard/controls/index.ts b/ags/HyprPanel/modules/menus/dashboard/controls/index.ts new file mode 100644 index 0000000..e158f96 --- /dev/null +++ b/ags/HyprPanel/modules/menus/dashboard/controls/index.ts @@ -0,0 +1,113 @@ +import { BoxWidget } from 'lib/types/widget'; + +const network = await Service.import('network'); +const bluetooth = await Service.import('bluetooth'); +const notifications = await Service.import('notifications'); +const audio = await Service.import('audio'); + +const Controls = (): BoxWidget => { + return Widget.Box({ + class_name: 'dashboard-card controls-container', + hpack: 'fill', + vpack: 'fill', + expand: true, + children: [ + Widget.Button({ + tooltip_text: 'Toggle Wifi', + expand: true, + setup: (self) => { + self.hook(network, () => { + return (self.class_name = `dashboard-button wifi ${!network.wifi.enabled ? 'disabled' : ''}`); + }); + }, + on_primary_click: () => network.toggleWifi(), + child: Widget.Label({ + class_name: 'txt-icon', + setup: (self) => { + self.hook(network, () => { + return (self.label = network.wifi.enabled ? '󰤨' : '󰤭'); + }); + }, + }), + }), + Widget.Button({ + tooltip_text: 'Toggle Bluetooth', + expand: true, + class_name: bluetooth + .bind('enabled') + .as((btOn) => `dashboard-button bluetooth ${!btOn ? 'disabled' : ''}`), + on_primary_click: () => bluetooth.toggle(), + child: Widget.Label({ + class_name: 'txt-icon', + label: bluetooth.bind('enabled').as((btOn) => (btOn ? '󰂯' : '󰂲')), + }), + }), + Widget.Button({ + tooltip_text: 'Toggle Notifications', + expand: true, + class_name: notifications + .bind('dnd') + .as((dnd) => `dashboard-button notifications ${dnd ? 'disabled' : ''}`), + on_primary_click: () => (notifications.dnd = !notifications.dnd), + child: Widget.Label({ + class_name: 'txt-icon', + label: notifications.bind('dnd').as((dnd) => (dnd ? '󰂛' : '󰂚')), + }), + }), + Widget.Button({ + tooltip_text: 'Toggle Mute (Playback)', + expand: true, + on_primary_click: () => (audio.speaker.is_muted = !audio.speaker.is_muted), + setup: (self) => { + self.hook( + audio.speaker, + () => { + return (self.class_name = `dashboard-button playback ${audio.speaker.is_muted ? 'disabled' : ''}`); + }, + 'notify::is-muted', + ); + }, + child: Widget.Label({ + class_name: 'txt-icon', + setup: (self) => { + self.hook( + audio.speaker, + () => { + return (self.label = audio.speaker.is_muted ? '󰖁' : '󰕾'); + }, + 'notify::is-muted', + ); + }, + }), + }), + Widget.Button({ + tooltip_text: 'Toggle Mute (Microphone)', + expand: true, + on_primary_click: () => (audio.microphone.is_muted = !audio.microphone.is_muted), + setup: (self) => { + self.hook( + audio.microphone, + () => { + return (self.class_name = `dashboard-button input ${audio.microphone.is_muted ? 'disabled' : ''}`); + }, + 'notify::is-muted', + ); + }, + child: Widget.Label({ + class_name: 'txt-icon', + setup: (self) => { + self.hook( + audio.microphone, + () => { + return (self.label = audio.microphone.is_muted ? '󰍭' : '󰍬'); + }, + 'notify::is-muted', + ); + }, + }), + }), + ], + }); +}; + +export { Controls }; diff --git a/ags/HyprPanel/modules/menus/dashboard/directories/index.ts b/ags/HyprPanel/modules/menus/dashboard/directories/index.ts new file mode 100644 index 0000000..5b6aa11 --- /dev/null +++ b/ags/HyprPanel/modules/menus/dashboard/directories/index.ts @@ -0,0 +1,121 @@ +import { BoxWidget } from 'lib/types/widget'; +import options from 'options'; + +const { left, right } = options.menus.dashboard.directories; + +const Directories = (): BoxWidget => { + return Widget.Box({ + class_name: 'dashboard-card directories-container', + vpack: 'fill', + hpack: 'fill', + expand: true, + children: [ + Widget.Box({ + vertical: true, + expand: true, + class_name: 'section right', + children: [ + Widget.Button({ + hpack: 'start', + expand: true, + class_name: 'directory-link left top', + on_primary_click: left.directory1.command.bind('value').as((cmd) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(cmd); + }; + }), + child: Widget.Label({ + hpack: 'start', + label: left.directory1.label.bind('value'), + }), + }), + Widget.Button({ + expand: true, + hpack: 'start', + class_name: 'directory-link left middle', + on_primary_click: left.directory2.command.bind('value').as((cmd) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(cmd); + }; + }), + child: Widget.Label({ + hpack: 'start', + label: left.directory2.label.bind('value'), + }), + }), + Widget.Button({ + expand: true, + hpack: 'start', + class_name: 'directory-link left bottom', + on_primary_click: left.directory3.command.bind('value').as((cmd) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(cmd); + }; + }), + child: Widget.Label({ + hpack: 'start', + label: left.directory3.label.bind('value'), + }), + }), + ], + }), + Widget.Box({ + vertical: true, + expand: true, + class_name: 'section left', + children: [ + Widget.Button({ + hpack: 'start', + expand: true, + class_name: 'directory-link right top', + on_primary_click: right.directory1.command.bind('value').as((cmd) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(cmd); + }; + }), + child: Widget.Label({ + hpack: 'start', + label: right.directory1.label.bind('value'), + }), + }), + Widget.Button({ + expand: true, + hpack: 'start', + class_name: 'directory-link right middle', + on_primary_click: right.directory2.command.bind('value').as((cmd) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(cmd); + }; + }), + child: Widget.Label({ + hpack: 'start', + label: right.directory2.label.bind('value'), + }), + }), + Widget.Button({ + expand: true, + hpack: 'start', + class_name: 'directory-link right bottom', + on_primary_click: right.directory3.command.bind('value').as((cmd) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(cmd); + }; + }), + child: Widget.Label({ + hpack: 'start', + label: right.directory3.label.bind('value'), + }), + }), + ], + }), + ], + }); +}; + +export { Directories }; diff --git a/ags/HyprPanel/modules/menus/dashboard/index.ts b/ags/HyprPanel/modules/menus/dashboard/index.ts new file mode 100644 index 0000000..9bac607 --- /dev/null +++ b/ags/HyprPanel/modules/menus/dashboard/index.ts @@ -0,0 +1,52 @@ +import DropdownMenu from '../shared/dropdown/index.js'; +import { Profile } from './profile/index.js'; +import { Shortcuts } from './shortcuts/index.js'; +import { Controls } from './controls/index.js'; +import { Stats } from './stats/index.js'; +import { Directories } from './directories/index.js'; +import Window from 'types/widgets/window.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import options from 'options.js'; + +const { controls, shortcuts, stats, directories } = options.menus.dashboard; + +export default (): Window => { + return DropdownMenu({ + name: 'dashboardmenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'dashboard-menu-content', + css: 'padding: 1px; margin: -1px;', + vexpand: false, + children: [ + Widget.Box({ + class_name: 'dashboard-content-container', + vertical: true, + children: Utils.merge( + [ + controls.enabled.bind('value'), + shortcuts.enabled.bind('value'), + stats.enabled.bind('value'), + directories.enabled.bind('value'), + ], + (isControlsEnabled, isShortcutsEnabled, isStatsEnabled, isDirectoriesEnabled) => { + return [ + Widget.Box({ + class_name: 'dashboard-content-items', + vertical: true, + children: [ + Profile(), + ...(isShortcutsEnabled ? [Shortcuts()] : []), + ...(isControlsEnabled ? [Controls()] : []), + ...(isDirectoriesEnabled ? [Directories()] : []), + ...(isStatsEnabled ? [Stats()] : []), + ], + }), + ]; + }, + ), + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/dashboard/profile/index.ts b/ags/HyprPanel/modules/menus/dashboard/profile/index.ts new file mode 100644 index 0000000..9d2531a --- /dev/null +++ b/ags/HyprPanel/modules/menus/dashboard/profile/index.ts @@ -0,0 +1,110 @@ +import powermenu from '../../power/helpers/actions.js'; +import { PowerOptions } from 'lib/types/options.js'; +import GdkPixbuf from 'gi://GdkPixbuf'; + +import options from 'options'; +import { BoxWidget, Child } from 'lib/types/widget.js'; +import Label from 'types/widgets/label.js'; +const { image, name } = options.menus.dashboard.powermenu.avatar; +const { confirmation, shutdown, logout, sleep, reboot } = options.menus.dashboard.powermenu; + +const Profile = (): BoxWidget => { + const handleClick = (action: PowerOptions): void => { + const actions = { + shutdown: shutdown.value, + reboot: reboot.value, + logout: logout.value, + sleep: sleep.value, + }; + App.closeWindow('dashboardmenu'); + + if (!confirmation.value) { + Utils.execAsync(actions[action]).catch((err) => + console.error(`Failed to execute ${action} command. Error: ${err}`), + ); + } else { + powermenu.action(action); + } + }; + + const getIconForButton = (txtIcon: string): Label => { + return Widget.Label({ + className: 'txt-icon', + label: txtIcon, + }); + }; + + return Widget.Box({ + class_name: 'profiles-container', + hpack: 'fill', + hexpand: true, + children: [ + Widget.Box({ + class_name: 'profile-picture-container dashboard-card', + hexpand: true, + vertical: true, + children: [ + Widget.Box({ + hpack: 'center', + class_name: 'profile-picture', + css: image.bind('value').as((i) => { + try { + GdkPixbuf.Pixbuf.new_from_file(i); + return `background-image: url("${i}")`; + } catch { + return `background-image: url("${App.configDir}/assets/hyprpanel.png")`; + } + }), + }), + Widget.Label({ + hpack: 'center', + class_name: 'profile-name', + label: name.bind('value').as((v) => { + if (v === 'system') { + return Utils.exec('bash -c whoami'); + } + return v; + }), + }), + ], + }), + Widget.Box({ + class_name: 'power-menu-container dashboard-card', + vertical: true, + vexpand: true, + children: [ + Widget.Button({ + class_name: 'dashboard-button shutdown', + on_clicked: () => handleClick('shutdown'), + tooltip_text: 'Shut Down', + vexpand: true, + child: getIconForButton('󰐥'), + }), + Widget.Button({ + class_name: 'dashboard-button restart', + on_clicked: () => handleClick('reboot'), + tooltip_text: 'Restart', + vexpand: true, + child: getIconForButton('󰜉'), + }), + Widget.Button({ + class_name: 'dashboard-button lock', + on_clicked: () => handleClick('logout'), + tooltip_text: 'Log Out', + vexpand: true, + child: getIconForButton('󰿅'), + }), + Widget.Button({ + class_name: 'dashboard-button sleep', + on_clicked: () => handleClick('sleep'), + tooltip_text: 'Sleep', + vexpand: true, + child: getIconForButton('󰤄'), + }), + ], + }), + ], + }); +}; + +export { Profile }; diff --git a/ags/HyprPanel/modules/menus/dashboard/shortcuts/index.ts b/ags/HyprPanel/modules/menus/dashboard/shortcuts/index.ts new file mode 100644 index 0000000..5b4f49c --- /dev/null +++ b/ags/HyprPanel/modules/menus/dashboard/shortcuts/index.ts @@ -0,0 +1,317 @@ +const hyprland = await Service.import('hyprland'); +import { Attribute, BoxWidget, Child } from 'lib/types/widget'; +import options from 'options'; +import { Variable as VarType } from 'types/variable'; +import Box from 'types/widgets/box'; +import Button from 'types/widgets/button'; +import Label from 'types/widgets/label'; + +const { left, right } = options.menus.dashboard.shortcuts; + +const Shortcuts = (): BoxWidget => { + const isRecording = Variable(false, { + poll: [ + 1000, + `${App.configDir}/services/screen_record.sh status`, + (out): boolean => { + if (out === 'recording') { + return true; + } + return false; + }, + ], + }); + const handleClick = (action: string, tOut: number = 250): void => { + App.closeWindow('dashboardmenu'); + + setTimeout(() => { + Utils.execAsync(action) + .then((res) => { + return res; + }) + .catch((err) => err); + }, tOut); + }; + + const recordingDropdown = Widget.Menu({ + class_name: 'dropdown recording', + hpack: 'fill', + hexpand: true, + setup: (self) => { + const renderMonitorList = (): void => { + const displays = hyprland.monitors.map((mon) => { + return Widget.MenuItem({ + label: `Display ${mon.name}`, + on_activate: () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`${App.configDir}/services/screen_record.sh start ${mon.name}`).catch( + (err) => console.error(err), + ); + }, + }); + }); + + // NOTE: This is disabled since window recording isn't available on wayland + // const apps = hyprland.clients.map((clt) => { + // return Widget.MenuItem({ + // label: `${clt.class.charAt(0).toUpperCase() + clt.class.slice(1)} (Workspace ${clt.workspace.name})`, + // on_activate: () => { + // App.closeWindow('dashboardmenu'); + // Utils.execAsync( + // `${App.configDir}/services/screen_record.sh start ${clt.focusHistoryID}`, + // ).catch((err) => console.error(err)); + // }, + // }); + // }); + + self.children = [ + ...displays, + // Disabled since window recording isn't available on wayland + // ...apps + ]; + }; + self.hook(hyprland, renderMonitorList, 'monitor-added'); + self.hook(hyprland, renderMonitorList, 'monitor-removed'); + }, + }); + + type ShortcutFixed = { + tooltip: string; + command: string; + icon: string; + configurable: false; + }; + + type ShortcutVariable = { + tooltip: VarType; + command: VarType; + icon: VarType; + configurable?: true; + }; + + type Shortcut = ShortcutFixed | ShortcutVariable; + + const cmdLn = (sCut: ShortcutVariable): boolean => { + return sCut.command.value.length > 0; + }; + + const leftCardHidden = Variable( + !(cmdLn(left.shortcut1) || cmdLn(left.shortcut2) || cmdLn(left.shortcut3) || cmdLn(left.shortcut4)), + ); + + const createButton = (shortcut: Shortcut, className: string): Button, Attribute> => { + if (shortcut.configurable !== false) { + return Widget.Button({ + vexpand: true, + tooltip_text: shortcut.tooltip.value, + class_name: className, + on_primary_click: () => handleClick(shortcut.command.value), + child: Widget.Label({ + class_name: 'button-label txt-icon', + label: shortcut.icon.value, + }), + }); + } else { + // handle non-configurable shortcut + return Widget.Button({ + vexpand: true, + tooltip_text: shortcut.tooltip, + class_name: className, + on_primary_click: (_, event) => { + if (shortcut.command === 'settings-dialog') { + App.closeWindow('dashboardmenu'); + App.toggleWindow('settings-dialog'); + } else if (shortcut.command === 'record') { + if (isRecording.value === true) { + App.closeWindow('dashboardmenu'); + return Utils.execAsync(`${App.configDir}/services/screen_record.sh stop`).catch((err) => + console.error(err), + ); + } else { + recordingDropdown.popup_at_pointer(event); + } + } + }, + child: Widget.Label({ + class_name: 'button-label txt-icon', + label: shortcut.icon, + }), + }); + } + }; + + const createButtonIfCommandExists = ( + shortcut: Shortcut, + className: string, + command: string, + ): Button, Attribute> | Box => { + if (command.length > 0) { + return createButton(shortcut, className); + } + return Widget.Box(); + }; + + return Widget.Box({ + class_name: 'shortcuts-container', + hpack: 'fill', + hexpand: true, + children: [ + Widget.Box({ + child: Utils.merge( + [ + left.shortcut1.command.bind('value'), + left.shortcut2.command.bind('value'), + left.shortcut1.tooltip.bind('value'), + left.shortcut2.tooltip.bind('value'), + left.shortcut1.icon.bind('value'), + left.shortcut2.icon.bind('value'), + left.shortcut3.command.bind('value'), + left.shortcut4.command.bind('value'), + left.shortcut3.tooltip.bind('value'), + left.shortcut4.tooltip.bind('value'), + left.shortcut3.icon.bind('value'), + left.shortcut4.icon.bind('value'), + ], + () => { + const isVisibleLeft = cmdLn(left.shortcut1) || cmdLn(left.shortcut2); + const isVisibleRight = cmdLn(left.shortcut3) || cmdLn(left.shortcut4); + + if (!isVisibleLeft && !isVisibleRight) { + leftCardHidden.value = true; + return Widget.Box(); + } + + leftCardHidden.value = false; + + return Widget.Box({ + class_name: 'container most-used dashboard-card', + children: [ + Widget.Box({ + className: `card-button-section-container ${isVisibleRight && isVisibleLeft ? 'visible' : ''}`, + child: isVisibleLeft + ? Widget.Box({ + vertical: true, + hexpand: true, + vexpand: true, + children: [ + createButtonIfCommandExists( + left.shortcut1, + `dashboard-button top-button ${cmdLn(left.shortcut2) ? 'paired' : ''}`, + left.shortcut1.command.value, + ), + createButtonIfCommandExists( + left.shortcut2, + 'dashboard-button', + left.shortcut2.command.value, + ), + ], + }) + : Widget.Box({ + children: [], + }), + }), + Widget.Box({ + className: 'card-button-section-container', + child: isVisibleRight + ? Widget.Box({ + vertical: true, + hexpand: true, + vexpand: true, + children: [ + createButtonIfCommandExists( + left.shortcut3, + `dashboard-button top-button ${cmdLn(left.shortcut4) ? 'paired' : ''}`, + left.shortcut3.command.value, + ), + createButtonIfCommandExists( + left.shortcut4, + 'dashboard-button', + left.shortcut4.command.value, + ), + ], + }) + : Widget.Box({ + children: [], + }), + }), + ], + }); + }, + ), + }), + Widget.Box({ + child: Utils.merge( + [ + right.shortcut1.command.bind('value'), + right.shortcut1.tooltip.bind('value'), + right.shortcut1.icon.bind('value'), + right.shortcut3.command.bind('value'), + right.shortcut3.tooltip.bind('value'), + right.shortcut3.icon.bind('value'), + leftCardHidden.bind('value'), + isRecording.bind('value'), + ], + () => { + return Widget.Box({ + class_name: `container utilities dashboard-card ${!leftCardHidden.value ? 'paired' : ''}`, + children: [ + Widget.Box({ + className: `card-button-section-container visible`, + child: Widget.Box({ + vertical: true, + hexpand: true, + vexpand: true, + children: [ + createButtonIfCommandExists( + right.shortcut1, + 'dashboard-button top-button paired', + right.shortcut1.command.value, + ), + createButtonIfCommandExists( + { + tooltip: 'HyprPanel Configuration', + command: 'settings-dialog', + icon: '󰒓', + configurable: false, + }, + 'dashboard-button', + 'settings-dialog', + ), + ], + }), + }), + Widget.Box({ + className: 'card-button-section-container', + child: Widget.Box({ + vertical: true, + hexpand: true, + vexpand: true, + children: [ + createButtonIfCommandExists( + right.shortcut3, + 'dashboard-button top-button paired', + right.shortcut3.command.value, + ), + createButtonIfCommandExists( + { + tooltip: 'Record Screen', + command: 'record', + icon: '󰑊', + configurable: false, + }, + `dashboard-button record ${isRecording.value ? 'active' : ''}`, + 'record', + ), + ], + }), + }), + ], + }); + }, + ), + }), + ], + }); +}; + +export { Shortcuts }; diff --git a/ags/HyprPanel/modules/menus/dashboard/stats/index.ts b/ags/HyprPanel/modules/menus/dashboard/stats/index.ts new file mode 100644 index 0000000..43e8457 --- /dev/null +++ b/ags/HyprPanel/modules/menus/dashboard/stats/index.ts @@ -0,0 +1,362 @@ +import options from 'options'; +import { GPU_Stat } from 'lib/types/gpustat'; +import { dependencies } from 'lib/utils'; +import { BoxWidget } from 'lib/types/widget'; +import { GenericResourceMetrics } from 'lib/types/customModules/generic'; + +const { terminal } = options; +const { enable_gpu } = options.menus.dashboard.stats; + +const Stats = (): BoxWidget => { + const divide = ([total, free]: number[]): number => free / total; + + const formatSizeInGB = (sizeInKB: number): number => Number((sizeInKB / 1024 ** 2).toFixed(2)); + + const cpu = Variable(0, { + poll: [ + 2000, + 'top -b -n 1', + (out): number => { + if (typeof out !== 'string') { + return 0; + } + + const cpuOut = out.split('\n').find((line) => line.includes('Cpu(s)')); + + if (cpuOut === undefined) { + return 0; + } + + const freeCpu = parseFloat(cpuOut.split(/\s+/)[1].replace(',', '.')); + return divide([100, freeCpu]); + }, + ], + }); + + const ram = Variable( + { total: 0, used: 0, percentage: 0 }, + { + poll: [ + 2000, + 'free', + (out): GenericResourceMetrics => { + if (typeof out !== 'string') { + return { total: 0, used: 0, percentage: 0 }; + } + + const ramOut = out.split('\n').find((line) => line.includes('Mem:')); + + if (ramOut === undefined) { + return { total: 0, used: 0, percentage: 0 }; + } + + const [totalRam, usedRam] = ramOut.split(/\s+/).splice(1, 2).map(Number); + + return { + percentage: divide([totalRam, usedRam]), + total: formatSizeInGB(totalRam), + used: formatSizeInGB(usedRam), + }; + }, + ], + }, + ); + + const gpu = Variable(0); + + const GPUStat = Widget.Box({ + child: enable_gpu.bind('value').as((gpStat) => { + if (!gpStat || !dependencies('gpustat')) { + return Widget.Box(); + } + + return Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: 'stat gpu', + hexpand: true, + vpack: 'center', + setup: (self) => { + const getGpuUsage = (): void => { + if (!enable_gpu.value) { + gpu.value = 0; + return; + } + + Utils.execAsync('gpustat --json') + .then((out) => { + if (typeof out !== 'string') { + return 0; + } + try { + const data = JSON.parse(out); + + const totalGpu = 100; + const usedGpu = + data.gpus.reduce((acc: number, gpu: GPU_Stat) => { + return acc + gpu['utilization.gpu']; + }, 0) / data.gpus.length; + + gpu.value = divide([totalGpu, usedGpu]); + } catch (e) { + console.error('Error getting GPU stats:', e); + gpu.value = 0; + } + }) + .catch((err) => { + console.error(`An error occurred while fetching GPU stats: ${err}`); + }); + }; + + self.poll(2000, getGpuUsage); + + Utils.merge([gpu.bind('value'), enable_gpu.bind('value')], (gpu, enableGpu) => { + if (!enableGpu) { + return (self.children = []); + } + + return (self.children = [ + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return (): void => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.Label({ + class_name: 'txt-icon', + label: '󰢮', + }), + }), + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return (): void => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.LevelBar({ + class_name: 'stats-bar', + hexpand: true, + vpack: 'center', + value: gpu, + }), + }), + ]); + }); + }, + }), + Widget.Box({ + hpack: 'end', + children: Utils.merge([gpu.bind('value'), enable_gpu.bind('value')], (gpuUsed, enableGpu) => { + if (!enableGpu) { + return []; + } + return [ + Widget.Label({ + class_name: 'stat-value gpu', + label: `${Math.floor(gpuUsed * 100)}%`, + }), + ]; + }), + }), + ], + }); + }), + }); + + const storage = Variable( + { total: 0, used: 0, percentage: 0 }, + { + poll: [ + 2000, + 'df -B1 /', + (out): GenericResourceMetrics => { + if (typeof out !== 'string') { + return { total: 0, used: 0, percentage: 0 }; + } + + const dfOut = out.split('\n').find((line) => line.startsWith('/')); + + if (dfOut === undefined) { + return { total: 0, used: 0, percentage: 0 }; + } + + const parts = dfOut.split(/\s+/); + const size = parseInt(parts[1], 10); + const used = parseInt(parts[2], 10); + + const sizeInGB = formatSizeInGB(size); + const usedInGB = formatSizeInGB(used); + + return { + total: Math.floor(sizeInGB / 1000), + used: Math.floor(usedInGB / 1000), + percentage: divide([size, used]), + }; + }, + ], + }, + ); + + return Widget.Box({ + class_name: 'dashboard-card stats-container', + vertical: true, + vpack: 'fill', + hpack: 'fill', + expand: true, + children: [ + Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: 'stat cpu', + hexpand: true, + vpack: 'center', + children: [ + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.Label({ + class_name: 'txt-icon', + label: '', + }), + }), + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.LevelBar({ + class_name: 'stats-bar', + hexpand: true, + vpack: 'center', + bar_mode: 'continuous', + max_value: 1, + value: cpu.bind('value'), + }), + }), + ], + }), + Widget.Label({ + hpack: 'end', + class_name: 'stat-value cpu', + label: cpu.bind('value').as((v) => `${Math.floor(v * 100)}%`), + }), + ], + }), + Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: 'stat ram', + vpack: 'center', + hexpand: true, + children: [ + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.Label({ + class_name: 'txt-icon', + label: '', + }), + }), + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.LevelBar({ + class_name: 'stats-bar', + hexpand: true, + vpack: 'center', + value: ram.bind('value').as((v) => v.percentage), + }), + }), + ], + }), + Widget.Label({ + hpack: 'end', + class_name: 'stat-value ram', + label: ram.bind('value').as((v) => `${v.used}/${v.total} GB`), + }), + ], + }), + GPUStat, + Widget.Box({ + vertical: true, + children: [ + Widget.Box({ + class_name: 'stat storage', + hexpand: true, + vpack: 'center', + children: [ + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.Label({ + class_name: 'txt-icon', + label: '󰋊', + }), + }), + Widget.Button({ + on_primary_click: terminal.bind('value').as((term) => { + return () => { + App.closeWindow('dashboardmenu'); + Utils.execAsync(`bash -c "${term} -e btop"`).catch( + (err) => `Failed to open btop: ${err}`, + ); + }; + }), + child: Widget.LevelBar({ + class_name: 'stats-bar', + hexpand: true, + vpack: 'center', + value: storage.bind('value').as((v) => v.percentage), + }), + }), + ], + }), + Widget.Label({ + hpack: 'end', + class_name: 'stat-value storage', + label: storage.bind('value').as((v) => `${v.used}/${v.total} GB`), + }), + ], + }), + ], + }); +}; + +export { Stats }; diff --git a/ags/HyprPanel/modules/menus/energy/brightness/index.ts b/ags/HyprPanel/modules/menus/energy/brightness/index.ts new file mode 100644 index 0000000..cdefd1a --- /dev/null +++ b/ags/HyprPanel/modules/menus/energy/brightness/index.ts @@ -0,0 +1,58 @@ +import { BoxWidget } from 'lib/types/widget.js'; +import brightness from '../../../../services/Brightness.js'; +import icons from '../../../icons/index.js'; + +const Brightness = (): BoxWidget => { + return Widget.Box({ + class_name: 'menu-section-container brightness', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-label-container', + hpack: 'fill', + child: Widget.Label({ + class_name: 'menu-label', + hexpand: true, + hpack: 'start', + label: 'Brightness', + }), + }), + Widget.Box({ + class_name: 'menu-items-section', + vpack: 'fill', + vexpand: true, + vertical: true, + child: Widget.Box({ + class_name: 'brightness-container', + children: [ + Widget.Icon({ + vexpand: true, + vpack: 'center', + class_name: 'brightness-slider-icon', + icon: icons.brightness.screen, + }), + Widget.Slider({ + vpack: 'center', + vexpand: true, + value: brightness.bind('screen'), + class_name: 'menu-active-slider menu-slider brightness', + draw_value: false, + hexpand: true, + min: 0, + max: 1, + onChange: ({ value }) => (brightness.screen = value), + }), + Widget.Label({ + vpack: 'center', + vexpand: true, + class_name: 'brightness-slider-label', + label: brightness.bind('screen').as((b) => `${Math.round(b * 100)}%`), + }), + ], + }), + }), + ], + }); +}; + +export { Brightness }; diff --git a/ags/HyprPanel/modules/menus/energy/index.ts b/ags/HyprPanel/modules/menus/energy/index.ts new file mode 100644 index 0000000..134d2cc --- /dev/null +++ b/ags/HyprPanel/modules/menus/energy/index.ts @@ -0,0 +1,25 @@ +import DropdownMenu from '../shared/dropdown/index.js'; +import { EnergyProfiles } from './profiles/index.js'; +import { Brightness } from './brightness/index.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import Window from 'types/widgets/window.js'; +import options from 'options.js'; + +export default (): Window => { + return DropdownMenu({ + name: 'energymenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'menu-items energy', + hpack: 'fill', + hexpand: true, + child: Widget.Box({ + vertical: true, + hpack: 'fill', + hexpand: true, + class_name: 'menu-items-container energy', + children: [Brightness(), EnergyProfiles()], + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/energy/profiles/index.ts b/ags/HyprPanel/modules/menus/energy/profiles/index.ts new file mode 100644 index 0000000..72b2824 --- /dev/null +++ b/ags/HyprPanel/modules/menus/energy/profiles/index.ts @@ -0,0 +1,85 @@ +const powerProfiles = await Service.import('powerprofiles'); +import { PowerProfile, PowerProfileObject, PowerProfiles } from 'lib/types/powerprofiles.js'; +import { BoxWidget } from 'lib/types/widget.js'; +import icons from '../../../icons/index.js'; +import { uptime } from 'lib/variables.js'; + +const EnergyProfiles = (): BoxWidget => { + const isValidProfile = (profile: string): profile is PowerProfile => + profile === 'power-saver' || profile === 'balanced' || profile === 'performance'; + + function renderUptime(curUptime: number): string { + const days = Math.floor(curUptime / (60 * 24)); + const hours = Math.floor((curUptime % (60 * 24)) / 60); + const minutes = Math.floor(curUptime % 60); + return ` : ${days}d ${hours}h ${minutes}m`; + } + + return Widget.Box({ + class_name: 'menu-section-container energy', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-label-container', + hpack: 'fill', + children: [ + Widget.Label({ + class_name: 'menu-label', + hexpand: true, + hpack: 'start', + label: 'Power Profile', + }), + Widget.Label({ + class_name: 'menu-label uptime', + label: uptime.bind().as(renderUptime), + tooltipText: 'Uptime', + }), + ], + }), + Widget.Box({ + class_name: 'menu-items-section', + vpack: 'fill', + vexpand: true, + vertical: true, + children: powerProfiles.bind('profiles').as((profiles: PowerProfiles) => { + return profiles.map((prof: PowerProfileObject) => { + const profileLabels = { + 'power-saver': 'Power Saver', + balanced: 'Balanced', + performance: 'Performance', + }; + + const profileType = prof.Profile; + + if (!isValidProfile(profileType)) { + return profileLabels.balanced; + } + + return Widget.Button({ + on_primary_click: () => { + powerProfiles.active_profile = prof.Profile; + }, + class_name: powerProfiles.bind('active_profile').as((active) => { + return `power-profile-item ${active === prof.Profile ? 'active' : ''}`; + }), + child: Widget.Box({ + children: [ + Widget.Icon({ + class_name: 'power-profile-icon', + icon: icons.powerprofile[profileType], + }), + Widget.Label({ + class_name: 'power-profile-label', + label: profileLabels[profileType], + }), + ], + }), + }); + }); + }), + }), + ], + }); +}; + +export { EnergyProfiles }; diff --git a/ags/HyprPanel/modules/menus/main.ts b/ags/HyprPanel/modules/menus/main.ts new file mode 100644 index 0000000..274579f --- /dev/null +++ b/ags/HyprPanel/modules/menus/main.ts @@ -0,0 +1,25 @@ +import PowerMenu from './power/index.js'; +import Verification from './power/verification.js'; +import AudioMenu from './audio/index.js'; +import NetworkMenu from './network/index.js'; +import BluetoothMenu from './bluetooth/index.js'; +import MediaMenu from './media/index.js'; +import NotificationsMenu from './notifications/index.js'; +import CalendarMenu from './calendar/index.js'; +import EnergyMenu from './energy/index.js'; +import DashboardMenu from './dashboard/index.js'; +import PowerDropdown from './powerDropdown/index.js'; + +export default [ + PowerMenu(), + Verification(), + AudioMenu(), + NetworkMenu(), + BluetoothMenu(), + MediaMenu(), + NotificationsMenu(), + CalendarMenu(), + EnergyMenu(), + DashboardMenu(), + PowerDropdown(), +]; diff --git a/ags/HyprPanel/modules/menus/media/components/bar.ts b/ags/HyprPanel/modules/menus/media/components/bar.ts new file mode 100644 index 0000000..81448db --- /dev/null +++ b/ags/HyprPanel/modules/menus/media/components/bar.ts @@ -0,0 +1,71 @@ +import { BoxWidget } from 'lib/types/widget'; +import { Mpris, MprisPlayer } from 'types/service/mpris'; + +const media = await Service.import('mpris'); + +const Bar = (getPlayerInfo: (media: Mpris) => MprisPlayer): BoxWidget => { + return Widget.Box({ + class_name: 'media-indicator-current-progress-bar', + hexpand: true, + children: [ + Widget.Box({ + hexpand: true, + child: Widget.Slider({ + hexpand: true, + tooltip_text: '--', + class_name: 'menu-slider media progress', + draw_value: false, + on_change: ({ value }) => { + const foundPlayer = getPlayerInfo(media); + if (foundPlayer === undefined) { + return; + } + return (foundPlayer.position = value * foundPlayer.length); + }, + setup: (self) => { + const update = (): void => { + const foundPlayer = getPlayerInfo(media); + if (foundPlayer !== undefined) { + const value = foundPlayer.length ? foundPlayer.position / foundPlayer.length : 0; + self.value = value > 0 ? value : 0; + } else { + self.value = 0; + } + }; + self.hook(media, update); + self.poll(1000, update); + + const updateTooltip = (): void => { + const foundPlayer = getPlayerInfo(media); + if (foundPlayer === undefined) { + self.tooltip_text = '00:00'; + return; + } + const curHour = Math.floor(foundPlayer.position / 3600); + const curMin = Math.floor((foundPlayer.position % 3600) / 60); + const curSec = Math.floor(foundPlayer.position % 60); + + if (typeof foundPlayer.position === 'number' && foundPlayer.position >= 0) { + const formatTime = (time: number): string => { + return time.toString().padStart(2, '0'); + }; + + const formatHour = (hour: number): string => { + return hour > 0 ? formatTime(hour) + ':' : ''; + }; + + self.tooltip_text = `${formatHour(curHour)}${formatTime(curMin)}:${formatTime(curSec)}`; + } else { + self.tooltip_text = `00:00`; + } + }; + self.poll(1000, updateTooltip); + self.hook(media, updateTooltip); + }, + }), + }), + ], + }); +}; + +export { Bar }; diff --git a/ags/HyprPanel/modules/menus/media/components/controls.ts b/ags/HyprPanel/modules/menus/media/components/controls.ts new file mode 100644 index 0000000..5cbce21 --- /dev/null +++ b/ags/HyprPanel/modules/menus/media/components/controls.ts @@ -0,0 +1,198 @@ +import { MprisPlayer } from 'types/service/mpris.js'; +import icons from '../../../icons/index.js'; +import { LoopStatus, PlaybackStatus } from 'lib/types/mpris.js'; +import { BoxWidget } from 'lib/types/widget.js'; +const media = await Service.import('mpris'); + +const Controls = (getPlayerInfo: () => MprisPlayer): BoxWidget => { + const isValidLoopStatus = (status: string): status is LoopStatus => ['none', 'track', 'playlist'].includes(status); + + const isValidPlaybackStatus = (status: string): status is PlaybackStatus => + ['playing', 'paused', 'stopped'].includes(status); + + const isLoopActive = (player: MprisPlayer): string => { + return player['loop_status'] !== null && ['track', 'playlist'].includes(player['loop_status'].toLowerCase()) + ? 'active' + : ''; + }; + + const isShuffleActive = (player: MprisPlayer): string => { + return player['shuffle_status'] !== null && player['shuffle_status'] ? 'active' : ''; + }; + + return Widget.Box({ + class_name: 'media-indicator-current-player-controls', + vertical: true, + children: [ + Widget.Box({ + class_name: 'media-indicator-current-controls', + hpack: 'center', + children: [ + Widget.Box({ + class_name: 'media-indicator-control shuffle', + children: [ + Widget.Button({ + hpack: 'center', + hasTooltip: true, + setup: (self) => { + self.hook(media, () => { + const foundPlayer = getPlayerInfo(); + if (foundPlayer === undefined) { + self.tooltip_text = 'Unavailable'; + self.class_name = 'media-indicator-control-button shuffle disabled'; + return; + } + + self.tooltip_text = + foundPlayer.shuffle_status !== null + ? foundPlayer.shuffle_status + ? 'Shuffling' + : 'Not Shuffling' + : null; + self.on_primary_click = (): void => { + foundPlayer.shuffle(); + }; + self.class_name = `media-indicator-control-button shuffle ${isShuffleActive(foundPlayer)} ${foundPlayer.shuffle_status !== null ? 'enabled' : 'disabled'}`; + }); + }, + child: Widget.Icon(icons.mpris.shuffle['enabled']), + }), + ], + }), + Widget.Box({ + children: [ + Widget.Button({ + hpack: 'center', + child: Widget.Icon(icons.mpris.prev), + setup: (self) => { + self.hook(media, () => { + const foundPlayer = getPlayerInfo(); + if (foundPlayer === undefined) { + self.class_name = 'media-indicator-control-button prev disabled'; + return; + } + + self.on_primary_click = (): void => { + foundPlayer.previous(); + }; + self.class_name = `media-indicator-control-button prev ${foundPlayer.can_go_prev !== null && foundPlayer.can_go_prev ? 'enabled' : 'disabled'}`; + }); + }, + }), + ], + }), + Widget.Box({ + children: [ + Widget.Button({ + hpack: 'center', + setup: (self) => { + self.hook(media, () => { + const foundPlayer = getPlayerInfo(); + if (foundPlayer === undefined) { + self.class_name = 'media-indicator-control-button play disabled'; + return; + } + + self.on_primary_click = (): void => { + foundPlayer.playPause(); + }; + self.class_name = `media-indicator-control-button play ${foundPlayer.can_play !== null ? 'enabled' : 'disabled'}`; + }); + }, + child: Widget.Icon({ + icon: Utils.watch(icons.mpris.paused, media, 'changed', () => { + const foundPlayer: MprisPlayer = getPlayerInfo(); + if (foundPlayer === undefined) { + return icons.mpris['paused']; + } + const playbackStatus = foundPlayer.play_back_status?.toLowerCase(); + + if (playbackStatus && isValidPlaybackStatus(playbackStatus)) { + return icons.mpris[playbackStatus]; + } else { + return icons.mpris['paused']; + } + }), + }), + }), + ], + }), + Widget.Box({ + class_name: `media-indicator-control next`, + children: [ + Widget.Button({ + hpack: 'center', + child: Widget.Icon(icons.mpris.next), + setup: (self) => { + self.hook(media, () => { + const foundPlayer = getPlayerInfo(); + if (foundPlayer === undefined) { + self.class_name = 'media-indicator-control-button next disabled'; + return; + } + + self.on_primary_click = (): void => { + foundPlayer.next(); + }; + self.class_name = `media-indicator-control-button next ${foundPlayer.can_go_next !== null && foundPlayer.can_go_next ? 'enabled' : 'disabled'}`; + }); + }, + }), + ], + }), + Widget.Box({ + class_name: 'media-indicator-control loop', + children: [ + Widget.Button({ + hpack: 'center', + setup: (self) => { + self.hook(media, () => { + const foundPlayer = getPlayerInfo(); + if (foundPlayer === undefined) { + self.tooltip_text = 'Unavailable'; + self.class_name = 'media-indicator-control-button shuffle disabled'; + return; + } + + self.tooltip_text = + foundPlayer.loop_status !== null + ? foundPlayer.loop_status + ? 'Shuffling' + : 'Not Shuffling' + : null; + self.on_primary_click = (): void => { + foundPlayer.loop(); + }; + self.class_name = `media-indicator-control-button loop ${isLoopActive(foundPlayer)} ${foundPlayer.loop_status !== null ? 'enabled' : 'disabled'}`; + }); + }, + child: Widget.Icon({ + setup: (self) => { + self.hook(media, () => { + const foundPlayer: MprisPlayer = getPlayerInfo(); + + if (foundPlayer === undefined) { + self.icon = icons.mpris.loop['none']; + return; + } + + const loopStatus = foundPlayer.loop_status?.toLowerCase(); + + if (loopStatus && isValidLoopStatus(loopStatus)) { + self.icon = icons.mpris.loop[loopStatus]; + } else { + self.icon = icons.mpris.loop['none']; + } + }); + }, + }), + }), + ], + }), + ], + }), + ], + }); +}; + +export { Controls }; diff --git a/ags/HyprPanel/modules/menus/media/components/mediainfo.ts b/ags/HyprPanel/modules/menus/media/components/mediainfo.ts new file mode 100644 index 0000000..ea6cb76 --- /dev/null +++ b/ags/HyprPanel/modules/menus/media/components/mediainfo.ts @@ -0,0 +1,89 @@ +import { BoxWidget } from 'lib/types/widget'; +import { MprisPlayer } from 'types/service/mpris'; + +const media = await Service.import('mpris'); + +const MediaInfo = (getPlayerInfo: () => MprisPlayer): BoxWidget => { + return Widget.Box({ + class_name: 'media-indicator-current-media-info', + hpack: 'center', + hexpand: true, + vertical: true, + children: [ + Widget.Box({ + class_name: 'media-indicator-current-song-name', + hpack: 'center', + children: [ + Widget.Label({ + truncate: 'end', + max_width_chars: 31, + wrap: true, + class_name: 'media-indicator-current-song-name-label', + setup: (self) => { + self.hook(media, () => { + const curPlayer = getPlayerInfo(); + return (self.label = + curPlayer !== undefined && curPlayer['track_title'].length + ? curPlayer['track_title'] + : 'No Media Currently Playing'); + }); + }, + }), + ], + }), + Widget.Box({ + class_name: 'media-indicator-current-song-author', + hpack: 'center', + children: [ + Widget.Label({ + truncate: 'end', + wrap: true, + max_width_chars: 35, + class_name: 'media-indicator-current-song-author-label', + setup: (self) => { + self.hook(media, () => { + const curPlayer = getPlayerInfo(); + + const makeArtistList = (trackArtists: string[]): string => { + if (trackArtists.length === 1 && !trackArtists[0].length) { + return '-----'; + } + + return trackArtists.join(', '); + }; + + return (self.label = + curPlayer !== undefined && curPlayer['track_artists'].length + ? makeArtistList(curPlayer['track_artists']) + : '-----'); + }); + }, + }), + ], + }), + Widget.Box({ + class_name: 'media-indicator-current-song-album', + hpack: 'center', + children: [ + Widget.Label({ + truncate: 'end', + wrap: true, + max_width_chars: 40, + class_name: 'media-indicator-current-song-album-label', + setup: (self) => { + self.hook(media, () => { + const curPlayer = getPlayerInfo(); + return (self.label = + curPlayer !== undefined && curPlayer['track_album'].length + ? curPlayer['track_album'] + : '---'); + }); + }, + }), + ], + }), + ], + }); +}; + +export { MediaInfo }; diff --git a/ags/HyprPanel/modules/menus/media/index.ts b/ags/HyprPanel/modules/menus/media/index.ts new file mode 100644 index 0000000..489034d --- /dev/null +++ b/ags/HyprPanel/modules/menus/media/index.ts @@ -0,0 +1,23 @@ +import Window from 'types/widgets/window.js'; +import DropdownMenu from '../shared/dropdown/index.js'; +import { Media } from './media.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import options from 'options.js'; + +export default (): Window => { + return DropdownMenu({ + name: 'mediamenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'menu-items media', + hpack: 'fill', + hexpand: true, + child: Widget.Box({ + class_name: 'menu-items-container media', + hpack: 'fill', + hexpand: true, + child: Media(), + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/media/media.ts b/ags/HyprPanel/modules/menus/media/media.ts new file mode 100644 index 0000000..2035516 --- /dev/null +++ b/ags/HyprPanel/modules/menus/media/media.ts @@ -0,0 +1,97 @@ +const media = await Service.import('mpris'); +import { MediaInfo } from './components/mediainfo.js'; +import { Controls } from './components/controls.js'; +import { Bar } from './components/bar.js'; +import { MprisPlayer } from 'types/service/mpris.js'; +import options from 'options.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +const { tint, color } = options.theme.bar.menus.menu.media.card; + +const generateAlbumArt = (imageUrl: string): string => { + const userTint = tint.value; + const userHexColor = color.value; + + const r = parseInt(userHexColor.slice(1, 3), 16); + const g = parseInt(userHexColor.slice(3, 5), 16); + const b = parseInt(userHexColor.slice(5, 7), 16); + + const alpha = userTint / 100; + + const css = `background-image: linear-gradient( + rgba(${r}, ${g}, ${b}, ${alpha}), + rgba(${r}, ${g}, ${b}, ${alpha}), + ${userHexColor} 65em + ), url("${imageUrl}");`; + + return css; +}; +const Media = (): BoxWidget => { + const curPlayer = Variable(''); + + media.connect('changed', () => { + const statusOrder = { + Playing: 1, + Paused: 2, + Stopped: 3, + }; + + const isPlaying = media.players.find((p) => p['play_back_status'] === 'Playing'); + + const playerStillExists = media.players.some((p) => curPlayer.value === p['bus_name']); + + const nextPlayerUp = media.players.sort( + (a, b) => statusOrder[a['play_back_status']] - statusOrder[b['play_back_status']], + )[0].bus_name; + + if (isPlaying || !playerStillExists) { + curPlayer.value = nextPlayerUp; + } + }); + + const getPlayerInfo = (): MprisPlayer => { + return media.players.find((p) => p.bus_name === curPlayer.value) || media.players[0]; + }; + + return Widget.Box({ + class_name: 'menu-section-container', + children: [ + Widget.Box({ + class_name: 'menu-items-section', + vertical: false, + child: Widget.Box({ + class_name: 'menu-content', + children: [ + Widget.Box({ + class_name: 'media-content', + child: Widget.Box({ + class_name: 'media-indicator-right-section', + hpack: 'fill', + hexpand: true, + vertical: true, + children: [MediaInfo(getPlayerInfo), Controls(getPlayerInfo), Bar(getPlayerInfo)], + }), + }), + ], + setup: (self) => { + self.hook(media, () => { + const curPlayer = getPlayerInfo(); + if (curPlayer !== undefined) { + self.css = generateAlbumArt(curPlayer.track_cover_url); + } + }); + + Utils.merge([color.bind('value'), tint.bind('value')], () => { + const curPlayer = getPlayerInfo(); + if (curPlayer !== undefined) { + self.css = generateAlbumArt(curPlayer.track_cover_url); + } + }); + }, + }), + }), + ], + }); +}; + +export { Media }; diff --git a/ags/HyprPanel/modules/menus/network/ethernet/index.ts b/ags/HyprPanel/modules/menus/network/ethernet/index.ts new file mode 100644 index 0000000..e1bf0d0 --- /dev/null +++ b/ags/HyprPanel/modules/menus/network/ethernet/index.ts @@ -0,0 +1,69 @@ +import { BoxWidget } from 'lib/types/widget'; + +const network = await Service.import('network'); + +const Ethernet = (): BoxWidget => { + return Widget.Box({ + class_name: 'menu-section-container ethernet', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-label-container', + hpack: 'fill', + child: Widget.Label({ + class_name: 'menu-label', + hexpand: true, + hpack: 'start', + label: 'Ethernet', + }), + }), + Widget.Box({ + class_name: 'menu-items-section', + vertical: true, + child: Widget.Box({ + class_name: 'menu-content', + vertical: true, + setup: (self) => { + self.hook(network, () => { + return (self.child = Widget.Box({ + class_name: 'network-element-item', + child: Widget.Box({ + hpack: 'start', + children: [ + Widget.Icon({ + class_name: `network-icon ethernet ${network.wired.state === 'activated' ? 'active' : ''}`, + tooltip_text: network.wired.internet, + icon: `${network.wired['icon_name']}`, + }), + Widget.Box({ + class_name: 'connection-container', + vertical: true, + children: [ + Widget.Label({ + class_name: 'active-connection', + hpack: 'start', + truncate: 'end', + wrap: true, + label: `Ethernet Connection ${network.wired.state !== 'unknown' && typeof network.wired?.speed === 'number' ? `(${network.wired?.speed / 1000} Gbps)` : ''}`, + }), + Widget.Label({ + hpack: 'start', + class_name: 'connection-status dim', + label: + network.wired.internet.charAt(0).toUpperCase() + + network.wired.internet.slice(1), + }), + ], + }), + ], + }), + })); + }); + }, + }), + }), + ], + }); +}; + +export { Ethernet }; diff --git a/ags/HyprPanel/modules/menus/network/index.ts b/ags/HyprPanel/modules/menus/network/index.ts new file mode 100644 index 0000000..f3e88dc --- /dev/null +++ b/ags/HyprPanel/modules/menus/network/index.ts @@ -0,0 +1,22 @@ +import Window from 'types/widgets/window.js'; +import DropdownMenu from '../shared/dropdown/index.js'; +import { Ethernet } from './ethernet/index.js'; +import { Wifi } from './wifi/index.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import options from 'options.js'; + +export default (): Window => { + return DropdownMenu({ + name: 'networkmenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'menu-items network', + child: Widget.Box({ + vertical: true, + hexpand: true, + class_name: 'menu-items-container network', + children: [Ethernet(), Wifi()], + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/network/utils.ts b/ags/HyprPanel/modules/menus/network/utils.ts new file mode 100644 index 0000000..229189a --- /dev/null +++ b/ags/HyprPanel/modules/menus/network/utils.ts @@ -0,0 +1,23 @@ +import { WifiIcon } from 'lib/types/network'; + +const getWifiIcon = (iconName: string): WifiIcon => { + const deviceIconMap: [string, WifiIcon][] = [ + ['network-wireless-acquiring', '󰤩'], + ['network-wireless-connected', '󰤨'], + ['network-wireless-encrypted', '󰤪'], + ['network-wireless-hotspot', '󰤨'], + ['network-wireless-no-route', '󰤩'], + ['network-wireless-offline', '󰤮'], + ['network-wireless-signal-excellent', '󰤨'], + ['network-wireless-signal-good', '󰤥'], + ['network-wireless-signal-ok', '󰤢'], + ['network-wireless-signal-weak', '󰤟'], + ['network-wireless-signal-none', '󰤯'], + ]; + + const foundMatch = deviceIconMap.find((icon) => RegExp(icon[0]).test(iconName.toLowerCase())); + + return foundMatch ? foundMatch[1] : '󰤨'; +}; + +export { getWifiIcon }; diff --git a/ags/HyprPanel/modules/menus/network/wifi/APStaging.ts b/ags/HyprPanel/modules/menus/network/wifi/APStaging.ts new file mode 100644 index 0000000..29b2798 --- /dev/null +++ b/ags/HyprPanel/modules/menus/network/wifi/APStaging.ts @@ -0,0 +1,104 @@ +import { Network } from 'types/service/network'; +import { Variable } from 'types/variable'; +import { AccessPoint } from 'lib/types/network'; +import Box from 'types/widgets/box'; +import { Attribute, Child } from 'lib/types/widget'; + +const renderWapStaging = ( + self: Box, + network: Network, + staging: Variable, + connecting: Variable, +): void => { + Utils.merge([network.bind('wifi'), staging.bind('value')], () => { + if (!Object.keys(staging.value).length) { + return (self.child = Widget.Box()); + } + + return (self.child = Widget.Box({ + class_name: 'network-element-item staging', + vertical: true, + children: [ + Widget.Box({ + hpack: 'fill', + hexpand: true, + children: [ + Widget.Icon({ + class_name: `network-icon wifi`, + icon: `${staging.value.iconName}`, + }), + Widget.Box({ + class_name: 'connection-container', + hexpand: true, + vertical: true, + children: [ + Widget.Label({ + class_name: 'active-connection', + hpack: 'start', + truncate: 'end', + wrap: true, + label: staging.value.ssid, + }), + ], + }), + Widget.Revealer({ + hpack: 'end', + reveal_child: connecting.bind('value').as((c) => staging.value.bssid === c), + child: Widget.Spinner({ + class_name: 'spinner wap', + }), + }), + ], + }), + Widget.Box({ + class_name: 'network-password-input-container', + hpack: 'fill', + hexpand: true, + children: [ + Widget.Entry({ + hpack: 'start', + hexpand: true, + visibility: false, + class_name: 'network-password-input', + placeholder_text: 'enter password', + onAccept: (selfInp) => { + connecting.value = staging.value.bssid || ''; + Utils.execAsync( + `nmcli dev wifi connect ${staging.value.bssid} password ${selfInp.text}`, + ) + .catch((err) => { + connecting.value = ''; + console.error(`Failed to connect to wifi: ${staging.value.ssid}... ${err}`); + Utils.notify({ + summary: 'Network', + body: err, + timeout: 5000, + }); + }) + .then(() => { + connecting.value = ''; + staging.value = {} as AccessPoint; + }); + selfInp.text = ''; + }, + }), + Widget.Button({ + hpack: 'end', + class_name: 'close-network-password-input-button', + on_primary_click: () => { + connecting.value = ''; + staging.value = {} as AccessPoint; + }, + child: Widget.Icon({ + class_name: 'close-network-password-input-icon', + icon: 'window-close-symbolic', + }), + }), + ], + }), + ], + })); + }); +}; + +export { renderWapStaging }; diff --git a/ags/HyprPanel/modules/menus/network/wifi/WirelessAPs.ts b/ags/HyprPanel/modules/menus/network/wifi/WirelessAPs.ts new file mode 100644 index 0000000..fac891d --- /dev/null +++ b/ags/HyprPanel/modules/menus/network/wifi/WirelessAPs.ts @@ -0,0 +1,219 @@ +import { Network } from 'types/service/network.js'; +import { AccessPoint, WifiStatus } from 'lib/types/network.js'; +import { Variable } from 'types/variable.js'; +import { getWifiIcon } from '../utils.js'; +import { WIFI_STATUS_MAP } from 'globals/network.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import Box from 'types/widgets/box.js'; +const renderWAPs = ( + self: Box, + network: Network, + staging: Variable, + connecting: Variable, +): void => { + const getIdBySsid = (ssid: string, nmcliOutput: string): string | undefined => { + const lines = nmcliOutput.trim().split('\n'); + for (const line of lines) { + const columns = line.trim().split(/\s{2,}/); + if (columns[0].includes(ssid)) { + return columns[1]; + } + } + }; + + const isValidWifiStatus = (status: string): status is WifiStatus => { + return status in WIFI_STATUS_MAP; + }; + + const getWifiStatus = (): string => { + const wifiState = network.wifi.state?.toLowerCase(); + + if (wifiState && isValidWifiStatus(wifiState)) { + return WIFI_STATUS_MAP[wifiState]; + } + return WIFI_STATUS_MAP['unknown']; + }; + + self.hook(network, () => { + Utils.merge([staging.bind('value'), connecting.bind('value')], () => { + // NOTE: Sometimes the network service will yield a "this._device is undefined" when + // trying to access the "access_points" property. So we must validate that + // it's not 'undefined' + // -- + // Also this is an AGS bug that needs to be fixed + + // TODO: Remove @ts-ignore once AGS bug is fixed + // @ts-expect-error to fix AGS bug + let WAPs = network.wifi._device !== undefined ? network.wifi['access_points'] : []; + + const dedupeWAPs = (): AccessPoint[] => { + const dedupMap: Record = {}; + WAPs.forEach((item: AccessPoint) => { + if (item.ssid !== null && !Object.hasOwnProperty.call(dedupMap, item.ssid)) { + dedupMap[item.ssid] = item; + } + }); + + return Object.keys(dedupMap).map((itm) => dedupMap[itm]); + }; + + WAPs = dedupeWAPs(); + + const isInStaging = (wap: AccessPoint): boolean => { + if (Object.keys(staging.value).length === 0) { + return false; + } + + return wap.bssid === staging.value.bssid; + }; + + const isDisconnecting = (wap: AccessPoint): boolean => { + if (wap.ssid === network.wifi.ssid) { + return network.wifi.state.toLowerCase() === 'deactivating'; + } + return false; + }; + + const filteredWAPs = WAPs.filter((ap: AccessPoint) => { + return ap.ssid !== 'Unknown' && !isInStaging(ap); + }).sort((a: AccessPoint, b: AccessPoint) => { + if (network.wifi.ssid === a.ssid) { + return -1; + } + + if (network.wifi.ssid === b.ssid) { + return 1; + } + + return b.strength - a.strength; + }); + + if (filteredWAPs.length <= 0 && Object.keys(staging.value).length === 0) { + return (self.child = Widget.Label({ + class_name: 'waps-not-found dim', + expand: true, + hpack: 'center', + vpack: 'center', + label: 'No Wi-Fi Networks Found', + })); + } + return (self.children = filteredWAPs.map((ap: AccessPoint) => { + return Widget.Box({ + children: [ + Widget.Button({ + on_primary_click: () => { + if (ap.bssid === connecting.value || ap.active) { + return; + } + + connecting.value = ap.bssid || ''; + Utils.execAsync(`nmcli device wifi connect ${ap.bssid}`) + .then(() => { + connecting.value = ''; + staging.value = {} as AccessPoint; + }) + .catch((err) => { + if (err.toLowerCase().includes('secrets were required, but not provided')) { + staging.value = ap; + } else { + Utils.notify({ + summary: 'Network', + body: err, + timeout: 5000, + }); + } + connecting.value = ''; + }); + }, + class_name: 'network-element-item', + child: Widget.Box({ + hexpand: true, + children: [ + Widget.Box({ + hpack: 'start', + hexpand: true, + children: [ + Widget.Label({ + vpack: 'start', + class_name: `network-icon wifi ${ap.ssid === network.wifi.ssid ? 'active' : ''} txt-icon`, + label: getWifiIcon(`${ap['iconName']}`), + }), + Widget.Box({ + class_name: 'connection-container', + vpack: 'center', + vertical: true, + children: [ + Widget.Label({ + vpack: 'center', + class_name: 'active-connection', + hpack: 'start', + truncate: 'end', + wrap: true, + label: ap.ssid, + }), + Widget.Revealer({ + revealChild: ap.ssid === network.wifi.ssid, + child: Widget.Label({ + hpack: 'start', + class_name: 'connection-status dim', + label: getWifiStatus(), + }), + }), + ], + }), + ], + }), + Widget.Revealer({ + hpack: 'end', + vpack: 'start', + reveal_child: ap.bssid === connecting.value || isDisconnecting(ap), + child: Widget.Spinner({ + vpack: 'start', + class_name: 'spinner wap', + }), + }), + ], + }), + }), + Widget.Revealer({ + vpack: 'start', + reveal_child: ap.bssid !== connecting.value && ap.active, + child: Widget.Button({ + tooltip_text: 'Delete/Forget Network', + class_name: 'menu-icon-button network disconnect', + on_primary_click: () => { + connecting.value = ap.bssid || ''; + Utils.execAsync('nmcli connection show --active').then(() => { + Utils.execAsync('nmcli connection show --active').then((res) => { + const connectionId = getIdBySsid(ap.ssid || '', res); + + if (connectionId === undefined) { + console.error( + `Error while forgetting "${ap.ssid}": Connection ID not found`, + ); + return; + } + + Utils.execAsync(`nmcli connection delete ${connectionId} "${ap.ssid}"`) + .then(() => (connecting.value = '')) + .catch((err) => { + connecting.value = ''; + console.error(`Error while forgetting "${ap.ssid}": ${err}`); + }); + }); + }); + }, + child: Widget.Label({ + class_name: 'txt-icon delete-network', + label: '󰚃', + }), + }), + }), + ], + }); + })); + }); + }); +}; + +export { renderWAPs }; diff --git a/ags/HyprPanel/modules/menus/network/wifi/index.ts b/ags/HyprPanel/modules/menus/network/wifi/index.ts new file mode 100644 index 0000000..57948f6 --- /dev/null +++ b/ags/HyprPanel/modules/menus/network/wifi/index.ts @@ -0,0 +1,81 @@ +const network = await Service.import('network'); +import { renderWAPs } from './WirelessAPs.js'; +import { renderWapStaging } from './APStaging.js'; +import { AccessPoint } from 'lib/types/network.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +const Staging = Variable({} as AccessPoint); +const Connecting = Variable(''); + +const searchInProgress = Variable(false); + +const startRotation = (): void => { + searchInProgress.value = true; + setTimeout(() => { + searchInProgress.value = false; + }, 5 * 1000); +}; + +const Wifi = (): BoxWidget => { + return Widget.Box({ + class_name: 'menu-section-container wifi', + vertical: true, + children: [ + Widget.Box({ + class_name: 'menu-label-container', + hpack: 'fill', + children: [ + Widget.Label({ + class_name: 'menu-label', + hexpand: true, + hpack: 'start', + label: 'Wi-Fi', + }), + Widget.Switch({ + class_name: 'menu-switch network', + vpack: 'center', + tooltip_text: 'Toggle Wifi', + active: network.wifi.enabled, + on_activate: () => { + network.toggleWifi(); + }, + }), + Widget.Button({ + vpack: 'center', + hpack: 'end', + class_name: 'menu-icon-button search network', + on_primary_click: () => { + startRotation(); + network.wifi.scan(); + }, + child: Widget.Icon({ + class_name: searchInProgress.bind('value').as((v) => (v ? 'spinning' : '')), + icon: 'view-refresh-symbolic', + }), + }), + ], + }), + Widget.Box({ + class_name: 'menu-items-section', + vertical: true, + children: [ + Widget.Box({ + class_name: 'wap-staging', + setup: (self) => { + renderWapStaging(self, network, Staging, Connecting); + }, + }), + Widget.Box({ + class_name: 'available-waps', + vertical: true, + setup: (self) => { + renderWAPs(self, network, Staging, Connecting); + }, + }), + ], + }), + ], + }); +}; + +export { Wifi }; diff --git a/ags/HyprPanel/modules/menus/notifications/controls/index.ts b/ags/HyprPanel/modules/menus/notifications/controls/index.ts new file mode 100644 index 0000000..a2964fd --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/controls/index.ts @@ -0,0 +1,76 @@ +import { closeNotifications } from 'globals/notification'; +import { BoxWidget } from 'lib/types/widget'; +import { Notifications } from 'types/service/notifications'; +import options from 'options'; + +const { clearDelay } = options.notifications; + +const Controls = (notifs: Notifications): BoxWidget => { + return Widget.Box({ + class_name: 'notification-menu-controls', + expand: false, + vertical: false, + children: [ + Widget.Box({ + class_name: 'menu-label-container notifications', + hpack: 'start', + vpack: 'center', + expand: true, + children: [ + Widget.Label({ + class_name: 'menu-label notifications', + label: 'Notifications', + }), + ], + }), + Widget.Box({ + hpack: 'end', + vpack: 'center', + expand: false, + children: [ + Widget.Switch({ + class_name: 'menu-switch notifications', + vpack: 'center', + active: notifs.bind('dnd').as((dnd: boolean) => !dnd), + on_activate: ({ active }) => { + notifs.dnd = !active; + }, + }), + Widget.Box({ + children: [ + Widget.Separator({ + hpack: 'center', + vexpand: true, + vertical: true, + class_name: 'menu-separator notification-controls', + }), + Widget.Button({ + className: 'clear-notifications-button', + tooltip_text: 'Clear Notifications', + on_primary_click: clearDelay.bind('value').as((delay) => { + return () => { + if (removingNotifications.value) { + return; + } + + return closeNotifications(notifs.notifications, delay); + }; + }), + child: Widget.Label({ + class_name: removingNotifications.bind('value').as((removing: boolean) => { + return removing + ? 'clear-notifications-label txt-icon removing' + : 'clear-notifications-label txt-icon'; + }), + label: '', + }), + }), + ], + }), + ], + }), + ], + }); +}; + +export { Controls }; diff --git a/ags/HyprPanel/modules/menus/notifications/index.ts b/ags/HyprPanel/modules/menus/notifications/index.ts new file mode 100644 index 0000000..bbdbce2 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/index.ts @@ -0,0 +1,47 @@ +import { Notification } from 'types/service/notifications.js'; +import DropdownMenu from '../shared/dropdown/index.js'; +const notifs = await Service.import('notifications'); +import { Controls } from './controls/index.js'; +import { NotificationCard } from './notification/index.js'; +import { NotificationPager } from './pager/index.js'; + +import options from 'options'; +import Window from 'types/widgets/window.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const { displayedTotal } = options.notifications; + +export default (): Window => { + const curPage = Variable(1); + + Utils.merge( + [curPage.bind('value'), displayedTotal.bind('value'), notifs.bind('notifications')], + (currentPage: number, dispTotal: number, notifications: Notification[]) => { + // If the page doesn't have enough notifications to display, go back + // to the previous page. + if (notifications.length <= (currentPage - 1) * dispTotal) { + curPage.value = currentPage <= 1 ? 1 : currentPage - 1; + } + }, + ); + + return DropdownMenu({ + name: 'notificationsmenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'notification-menu-content', + css: 'padding: 1px; margin: -1px;', + hexpand: true, + vexpand: false, + children: [ + Widget.Box({ + class_name: 'notification-card-container menu', + vertical: true, + hexpand: false, + vexpand: false, + children: [Controls(notifs), NotificationCard(notifs, curPage), NotificationPager(curPage)], + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/actions/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/actions/index.ts new file mode 100644 index 0000000..bf68dad --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/actions/index.ts @@ -0,0 +1,49 @@ +import { BoxWidget } from 'lib/types/widget'; +import { Notification, Notifications } from 'types/service/notifications'; +const Actions = (notif: Notification, notifs: Notifications): BoxWidget => { + if (notif.actions !== undefined && notif.actions.length > 0) { + return Widget.Box({ + class_name: 'notification-card-actions menu', + hexpand: true, + vpack: 'end', + children: notif.actions.map((action) => { + return Widget.Button({ + hexpand: true, + class_name: 'notification-action-buttons menu', + on_primary_click: () => { + if (action.id.includes('scriptAction:-')) { + App.closeWindow('notificationsmenu'); + Utils.execAsync(`${action.id.replace('scriptAction:-', '')}`).catch((err) => + console.error(err), + ); + notifs.CloseNotification(notif.id); + } else { + App.closeWindow('notificationsmenu'); + notif.invoke(action.id); + } + }, + child: Widget.Box({ + hpack: 'center', + hexpand: true, + children: [ + Widget.Label({ + class_name: 'notification-action-buttons-label menu', + hexpand: true, + max_width_chars: 15, + truncate: 'end', + wrap: true, + label: action.label, + }), + ], + }), + }); + }), + }); + } + + return Widget.Box({ + class_name: 'spacer', + }); +}; + +export { Actions }; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/body/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/body/index.ts new file mode 100644 index 0000000..62aac7a --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/body/index.ts @@ -0,0 +1,25 @@ +import { BoxWidget } from 'lib/types/widget.js'; +import { notifHasImg } from '../../utils.js'; +import { Notification } from 'types/service/notifications'; + +export const Body = (notif: Notification): BoxWidget => { + return Widget.Box({ + vpack: 'start', + hexpand: true, + class_name: 'notification-card-body menu', + children: [ + Widget.Label({ + hexpand: true, + use_markup: true, + xalign: 0, + justification: 'left', + truncate: 'end', + lines: 2, + max_width_chars: !notifHasImg(notif) ? 35 : 28, + wrap: true, + class_name: 'notification-card-body-label menu', + label: notif['body'], + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/close/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/close/index.ts new file mode 100644 index 0000000..261f949 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/close/index.ts @@ -0,0 +1,17 @@ +import { Attribute } from 'lib/types/widget'; +import { Notification, Notifications } from 'types/service/notifications'; +import Button from 'types/widgets/button'; +import Label from 'types/widgets/label'; +export const CloseButton = (notif: Notification, notifs: Notifications): Button, Attribute> => { + return Widget.Button({ + class_name: 'close-notification-button menu', + on_primary_click: () => { + notifs.CloseNotification(notif.id); + }, + child: Widget.Label({ + class_name: 'txt-icon notif-close', + label: '󰅜', + hpack: 'center', + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/header/icon.ts b/ags/HyprPanel/modules/menus/notifications/notification/header/icon.ts new file mode 100644 index 0000000..c51bc01 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/header/icon.ts @@ -0,0 +1,19 @@ +import { Notification } from 'types/service/notifications.js'; +import { NotificationIcon } from 'lib/types/notification.js'; +import { getNotificationIcon } from 'globals/notification'; +import { BoxWidget } from 'lib/types/widget'; + +const NotificationIcon = ({ app_entry = '', app_icon = '', app_name = '' }: Partial): BoxWidget => { + return Widget.Box({ + css: ` + min-width: 2rem; + min-height: 2rem; + `, + child: Widget.Icon({ + class_name: 'notification-icon menu', + icon: getNotificationIcon(app_name, app_icon, app_entry), + }), + }); +}; + +export { NotificationIcon }; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/header/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/header/index.ts new file mode 100644 index 0000000..1373ae3 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/header/index.ts @@ -0,0 +1,54 @@ +import GLib from 'gi://GLib'; +import { Notification } from 'types/service/notifications'; +import { NotificationIcon } from './icon.js'; +import { notifHasImg } from '../../utils.js'; +import options from 'options.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +const { military } = options.menus.clock.time; + +export const Header = (notif: Notification): BoxWidget => { + const time = (time: number, format = '%I:%M %p'): string => { + return GLib.DateTime.new_from_unix_local(time).format(military.value ? '%H:%M' : format) || '--:--'; + }; + + return Widget.Box({ + vertical: false, + hexpand: true, + children: [ + Widget.Box({ + class_name: 'notification-card-header menu', + hpack: 'start', + children: [NotificationIcon(notif)], + }), + Widget.Box({ + class_name: 'notification-card-header menu', + hexpand: true, + vpack: 'start', + children: [ + Widget.Label({ + class_name: 'notification-card-header-label menu', + hpack: 'start', + hexpand: true, + vexpand: true, + max_width_chars: !notifHasImg(notif) ? 34 : 22, + truncate: 'end', + wrap: true, + label: notif['summary'], + }), + ], + }), + Widget.Box({ + class_name: 'notification-card-header menu', + hpack: 'end', + vpack: 'start', + hexpand: true, + child: Widget.Label({ + vexpand: true, + class_name: 'notification-time', + label: time(notif.time), + }), + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/image/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/image/index.ts new file mode 100644 index 0000000..6b01768 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/image/index.ts @@ -0,0 +1,24 @@ +import { Notification } from 'types/service/notifications'; +import { notifHasImg } from '../../utils.js'; +import { BoxWidget } from 'lib/types/widget.js'; + +const Image = (notif: Notification): BoxWidget => { + if (notifHasImg(notif)) { + return Widget.Box({ + class_name: 'notification-card-image-container menu', + hpack: 'center', + vpack: 'center', + vexpand: false, + child: Widget.Box({ + hpack: 'center', + vexpand: false, + class_name: 'notification-card-image menu', + css: `background-image: url("${notif.image}")`, + }), + }); + } + + return Widget.Box(); +}; + +export { Image }; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/index.ts new file mode 100644 index 0000000..9254327 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/index.ts @@ -0,0 +1,78 @@ +import { Notifications, Notification } from 'types/service/notifications'; +import { notifHasImg } from '../utils.js'; +import { Header } from './header/index.js'; +import { Actions } from './actions/index.js'; +import { Image } from './image/index.js'; +import { Placeholder } from './placeholder/index.js'; +import { Body } from './body/index.js'; +import { CloseButton } from './close/index.js'; +import options from 'options.js'; +import { Variable } from 'types/variable.js'; +import { filterNotifications } from 'lib/shared/notifications.js'; +import Scrollable from 'types/widgets/scrollable.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const { displayedTotal, ignore } = options.notifications; + +const NotificationCard = (notifs: Notifications, curPage: Variable): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + child: Widget.Box({ + class_name: 'menu-content-container notifications', + hpack: 'center', + vexpand: true, + spacing: 0, + vertical: true, + setup: (self) => { + Utils.merge( + [ + notifs.bind('notifications'), + curPage.bind('value'), + displayedTotal.bind('value'), + ignore.bind('value'), + ], + (notifications, currentPage, dispTotal, ignoredNotifs) => { + const filteredNotifications = filterNotifications(notifications, ignoredNotifs); + + const sortedNotifications = filteredNotifications.sort((a, b) => b.time - a.time); + + if (filteredNotifications.length <= 0) { + return (self.children = [Placeholder(notifs)]); + } + + const pageStart = (currentPage - 1) * dispTotal; + const pageEnd = currentPage * dispTotal; + return (self.children = sortedNotifications + .slice(pageStart, pageEnd) + .map((notif: Notification) => { + return Widget.Box({ + class_name: 'notification-card-content-container', + children: [ + Widget.Box({ + class_name: 'notification-card menu', + vpack: 'start', + hexpand: true, + vexpand: false, + children: [ + Image(notif), + Widget.Box({ + vpack: 'center', + vertical: true, + hexpand: true, + class_name: `notification-card-content ${!notifHasImg(notif) ? 'noimg' : ' menu'}`, + children: [Header(notif), Body(notif), Actions(notif, notifs)], + }), + ], + }), + CloseButton(notif, notifs), + ], + }); + })); + }, + ); + }, + }), + }); +}; + +export { NotificationCard }; diff --git a/ags/HyprPanel/modules/menus/notifications/notification/placeholder/index.ts b/ags/HyprPanel/modules/menus/notifications/notification/placeholder/index.ts new file mode 100644 index 0000000..e22df55 --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/notification/placeholder/index.ts @@ -0,0 +1,30 @@ +import { BoxWidget } from 'lib/types/widget'; +import { Notifications } from 'types/service/notifications'; + +const Placeholder = (notifs: Notifications): BoxWidget => { + return Widget.Box({ + class_name: 'notification-label-container', + vpack: 'fill', + hpack: 'center', + expand: true, + child: Widget.Box({ + vpack: 'center', + vertical: true, + expand: true, + children: [ + Widget.Label({ + vpack: 'center', + class_name: 'placeholder-label dim bell txt-icon', + label: notifs.bind('dnd').as((dnd) => (dnd ? '󰂛' : '󰂚')), + }), + Widget.Label({ + vpack: 'start', + class_name: 'placehold-label dim message', + label: "You're all caught up :)", + }), + ], + }), + }); +}; + +export { Placeholder }; diff --git a/ags/HyprPanel/modules/menus/notifications/pager/index.ts b/ags/HyprPanel/modules/menus/notifications/pager/index.ts new file mode 100644 index 0000000..1a4571b --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/pager/index.ts @@ -0,0 +1,88 @@ +const notifs = await Service.import('notifications'); + +import { BoxWidget } from 'lib/types/widget'; +import options from 'options'; +import { Notification } from 'types/service/notifications'; +import { Variable } from 'types/variable'; + +const { displayedTotal } = options.notifications; +const { show: showPager } = options.theme.bar.menus.menu.notifications.pager; + +export const NotificationPager = (curPage: Variable): BoxWidget => { + return Widget.Box({ + class_name: 'notification-menu-pager', + hexpand: true, + vexpand: false, + children: Utils.merge( + [ + curPage.bind('value'), + displayedTotal.bind('value'), + notifs.bind('notifications'), + showPager.bind('value'), + ], + (currentPage: number, dispTotal: number, _: Notification[], showPgr: boolean) => { + if (showPgr === false || (currentPage === 1 && notifs.notifications.length <= dispTotal)) { + return []; + } + return [ + Widget.Button({ + hexpand: true, + hpack: 'start', + class_name: `pager-button left ${currentPage <= 1 ? 'disabled' : ''}`, + onPrimaryClick: () => { + curPage.value = 1; + }, + child: Widget.Label({ + className: 'pager-button-label', + label: '', + }), + }), + Widget.Button({ + hexpand: true, + hpack: 'start', + class_name: `pager-button left ${currentPage <= 1 ? 'disabled' : ''}`, + onPrimaryClick: () => { + curPage.value = currentPage <= 1 ? 1 : currentPage - 1; + }, + child: Widget.Label({ + className: 'pager-button-label', + label: '', + }), + }), + Widget.Label({ + hexpand: true, + hpack: 'center', + class_name: 'pager-label', + label: `${currentPage} / ${Math.ceil(notifs.notifications.length / dispTotal) || 1}`, + }), + Widget.Button({ + hexpand: true, + hpack: 'end', + class_name: `pager-button right ${currentPage >= Math.ceil(notifs.notifications.length / dispTotal) ? 'disabled' : ''}`, + onPrimaryClick: () => { + const maxPage = Math.ceil(notifs.notifications.length / displayedTotal.value); + curPage.value = currentPage >= maxPage ? currentPage : currentPage + 1; + }, + child: Widget.Label({ + className: 'pager-button-label', + label: '', + }), + }), + Widget.Button({ + hexpand: true, + hpack: 'end', + class_name: `pager-button right ${currentPage >= Math.ceil(notifs.notifications.length / dispTotal) ? 'disabled' : ''}`, + onPrimaryClick: () => { + const maxPage = Math.ceil(notifs.notifications.length / displayedTotal.value); + curPage.value = maxPage; + }, + child: Widget.Label({ + className: 'pager-button-label', + label: '󰄾', + }), + }), + ]; + }, + ), + }); +}; diff --git a/ags/HyprPanel/modules/menus/notifications/utils.ts b/ags/HyprPanel/modules/menus/notifications/utils.ts new file mode 100644 index 0000000..dcf2c7d --- /dev/null +++ b/ags/HyprPanel/modules/menus/notifications/utils.ts @@ -0,0 +1,7 @@ +import { Notification } from 'types/service/notifications'; + +const notifHasImg = (notif: Notification): boolean => { + return notif.image !== undefined && notif.image.length ? true : false; +}; + +export { notifHasImg }; diff --git a/ags/HyprPanel/modules/menus/power/helpers/actions.ts b/ags/HyprPanel/modules/menus/power/helpers/actions.ts new file mode 100644 index 0000000..fee7dfa --- /dev/null +++ b/ags/HyprPanel/modules/menus/power/helpers/actions.ts @@ -0,0 +1,61 @@ +import { Action } from 'lib/types/power'; +import options from 'options'; +const { sleep, reboot, logout, shutdown } = options.menus.dashboard.powermenu; + +class PowerMenu extends Service { + static { + Service.register( + this, + {}, + { + title: ['string'], + cmd: ['string'], + }, + ); + } + + #title = ''; + #cmd = ''; + + get title(): string { + return this.#title; + } + + action(action: Action): void { + [this.#cmd, this.#title] = { + sleep: [sleep.value, 'Sleep'], + reboot: [reboot.value, 'Reboot'], + logout: [logout.value, 'Log Out'], + shutdown: [shutdown.value, 'Shutdown'], + }[action]; + + this.notify('cmd'); + this.notify('title'); + this.emit('changed'); + App.closeWindow('powermenu'); + App.openWindow('verification'); + } + + customAction(action: Action, cmnd: string): void { + [this.#cmd, this.#title] = [cmnd, action]; + + this.notify('cmd'); + this.notify('title'); + this.emit('changed'); + App.closeWindow('powermenu'); + App.openWindow('verification'); + } + + shutdown = (): void => { + this.action('shutdown'); + }; + + exec = (): void => { + App.closeWindow('verification'); + Utils.execAsync(this.#cmd); + }; +} + +const powermenu = new PowerMenu(); +Object.assign(globalThis, { powermenu }); +export default powermenu; diff --git a/ags/HyprPanel/modules/menus/power/index.ts b/ags/HyprPanel/modules/menus/power/index.ts new file mode 100644 index 0000000..bb8505d --- /dev/null +++ b/ags/HyprPanel/modules/menus/power/index.ts @@ -0,0 +1,41 @@ +import { Action } from 'lib/types/power.js'; +import PopupWindow from '../shared/popup/index.js'; +import powermenu from './helpers/actions.js'; +import icons from '../../icons/index.js'; +import Window from 'types/widgets/window.js'; +import { Attribute, Child, GButton } from 'lib/types/widget.js'; +import options from 'options.js'; + +const SysButton = (action: Action, label: string): GButton => + Widget.Button({ + class_name: `widget-button powermenu-button-${action}`, + on_clicked: () => powermenu.action(action), + child: Widget.Box({ + vertical: true, + class_name: 'system-button widget-box', + children: [ + Widget.Icon({ + class_name: `system-button_icon ${action}`, + icon: icons.powermenu[action], + }), + Widget.Label({ + class_name: `system-button_label ${action}`, + label, + }), + ], + }), + }); +export default (): Window => + PopupWindow({ + name: 'powermenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'powermenu horizontal', + children: [ + SysButton('shutdown', 'SHUTDOWN'), + SysButton('logout', 'LOG OUT'), + SysButton('reboot', 'REBOOT'), + SysButton('sleep', 'SLEEP'), + ], + }), + }); diff --git a/ags/HyprPanel/modules/menus/power/verification.ts b/ags/HyprPanel/modules/menus/power/verification.ts new file mode 100644 index 0000000..a71f46b --- /dev/null +++ b/ags/HyprPanel/modules/menus/power/verification.ts @@ -0,0 +1,54 @@ +import Window from 'types/widgets/window.js'; +import PopupWindow from '../shared/popup/index.js'; +import powermenu from './helpers/actions.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +export default (): Window => + PopupWindow({ + name: 'verification', + transition: 'crossfade', + child: Widget.Box({ + class_name: 'verification', + child: Widget.Box({ + class_name: 'verification-content', + expand: true, + vertical: true, + children: [ + Widget.Box({ + class_name: 'text-box', + vertical: true, + children: [ + Widget.Label({ + class_name: 'title', + label: powermenu.bind('title').as((t) => t.toUpperCase()), + }), + Widget.Label({ + class_name: 'desc', + label: powermenu + .bind('title') + .as((p) => `Are you sure you want to ${p.toLowerCase()}?`), + }), + ], + }), + Widget.Box({ + class_name: 'buttons horizontal', + vexpand: true, + vpack: 'end', + homogeneous: true, + children: [ + Widget.Button({ + class_name: 'verification-button bar-verification_yes', + child: Widget.Label('Yes'), + on_clicked: powermenu.exec, + }), + Widget.Button({ + class_name: 'verification-button bar-verification_no', + child: Widget.Label('No'), + on_clicked: () => App.toggleWindow('verification'), + }), + ], + }), + ], + }), + }), + }); diff --git a/ags/HyprPanel/modules/menus/powerDropdown/button.ts b/ags/HyprPanel/modules/menus/powerDropdown/button.ts new file mode 100644 index 0000000..f2ae20f --- /dev/null +++ b/ags/HyprPanel/modules/menus/powerDropdown/button.ts @@ -0,0 +1,65 @@ +import { PowerOptions } from 'lib/types/options'; +import options from 'options'; +import powermenu from '../power/helpers/actions'; +import { GButton } from 'lib/types/widget'; + +const { confirmation, shutdown, logout, sleep, reboot, showLabel } = options.menus.power; + +export const PowerButton = (action: PowerOptions): GButton => { + const handleClick = (action: PowerOptions): void => { + const actions = { + shutdown: shutdown.value, + reboot: reboot.value, + logout: logout.value, + sleep: sleep.value, + }; + App.closeWindow('powerdropdownmenu'); + + if (!confirmation.value) { + Utils.execAsync(actions[action]).catch((err) => + console.error(`Failed to execute ${action} command. Error: ${err}`), + ); + } else { + powermenu.customAction(action, actions[action]); + } + }; + + const powerIconMap = { + shutdown: '󰐥', + reboot: '󰜉', + logout: '󰿅', + sleep: '󰤄', + }; + + return Widget.Button({ + className: showLabel.bind('value').as((shwLbl) => { + return `power-menu-button ${action} ${!shwLbl ? 'no-label' : ''}`; + }), + on_clicked: () => handleClick(action), + child: Widget.Box({ + vertical: false, + children: showLabel.bind('value').as((shwLbl) => { + if (shwLbl) { + return [ + Widget.Label({ + label: powerIconMap[action], + className: `power-button-icon ${action}-icon txt-icon`, + }), + Widget.Label({ + hpack: 'center', + hexpand: true, + label: action.charAt(0).toUpperCase() + action.slice(1), + className: `power-button-label ${action}-label show-label`, + }), + ]; + } + return [ + Widget.Label({ + label: powerIconMap[action], + className: `power-button-icon ${action}-icon no-label txt-icon`, + }), + ]; + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/powerDropdown/index.ts b/ags/HyprPanel/modules/menus/powerDropdown/index.ts new file mode 100644 index 0000000..1562d8b --- /dev/null +++ b/ags/HyprPanel/modules/menus/powerDropdown/index.ts @@ -0,0 +1,21 @@ +import Window from 'types/widgets/window.js'; +import DropdownMenu from '../shared/dropdown/index.js'; +import { PowerButton } from './button.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +import options from 'options.js'; + +export default (): Window => { + return DropdownMenu({ + name: 'powerdropdownmenu', + transition: options.menus.transition.bind('value'), + child: Widget.Box({ + class_name: 'menu-items power-dropdown', + child: Widget.Box({ + vertical: true, + hexpand: true, + class_name: 'menu-items-container power-dropdown', + children: [PowerButton('shutdown'), PowerButton('reboot'), PowerButton('logout'), PowerButton('sleep')], + }), + }), + }); +}; diff --git a/ags/HyprPanel/modules/menus/shared/dropdown/eventBoxes/index.ts b/ags/HyprPanel/modules/menus/shared/dropdown/eventBoxes/index.ts new file mode 100644 index 0000000..727610d --- /dev/null +++ b/ags/HyprPanel/modules/menus/shared/dropdown/eventBoxes/index.ts @@ -0,0 +1,33 @@ +import { Attribute, BoxWidget } from 'lib/types/widget'; +import EventBox from 'types/widgets/eventbox'; +import { BarLocation } from 'lib/types/options'; + +const createEventBox = (className: string, windowName: string): EventBox => { + return Widget.EventBox({ + class_name: className, + hexpand: true, + vexpand: false, + can_focus: false, + child: Widget.Box(), + setup: (w) => { + w.on('button-press-event', () => App.toggleWindow(windowName)); + }, + }); +}; + +export const barEventMargins = ( + windowName: string, + location: BarLocation = 'top', +): [EventBox, EventBox] => { + if (location === 'top') { + return [ + createEventBox('mid-eb event-top-padding-static', windowName), + createEventBox('mid-eb event-top-padding', windowName), + ]; + } else { + return [ + createEventBox('mid-eb event-bottom-padding', windowName), + createEventBox('mid-eb event-bottom-padding-static', windowName), + ]; + } +}; diff --git a/ags/HyprPanel/modules/menus/shared/dropdown/index.ts b/ags/HyprPanel/modules/menus/shared/dropdown/index.ts new file mode 100644 index 0000000..d9496e7 --- /dev/null +++ b/ags/HyprPanel/modules/menus/shared/dropdown/index.ts @@ -0,0 +1,98 @@ +import options from 'options'; +import { DropdownMenuProps } from 'lib/types/dropdownmenu'; +import { Attribute, Child, Exclusivity } from 'lib/types/widget'; +import Window from 'types/widgets/window'; +import { barEventMargins } from './eventBoxes/index'; +import { globalEventBoxes } from 'globals/dropdown'; + +const { location } = options.theme.bar; + +// NOTE: We make the window visible for 2 seconds (on startup) so the child +// elements can allocat their proper dimensions. +// Otherwise the width that we rely on for menu positioning is set improperly +// for the first time we open a menu of each type. +const initRender = Variable(true); + +setTimeout(() => { + initRender.value = false; +}, 2000); + +export default ({ + name, + child, + transition, + exclusivity = 'ignore' as Exclusivity, + ...props +}: DropdownMenuProps): Window => + Widget.Window({ + name, + class_names: [name, 'dropdown-menu'], + setup: (w) => w.keybind('Escape', () => App.closeWindow(name)), + visible: initRender.bind('value'), + keymode: 'on-demand', + exclusivity, + layer: 'top', + anchor: location.bind('value').as((ln) => [ln, 'left']), + child: Widget.EventBox({ + class_name: 'parent-event', + on_primary_click: () => App.closeWindow(name), + on_secondary_click: () => App.closeWindow(name), + child: Widget.Box({ + class_name: 'top-eb', + vertical: true, + children: [ + Widget.Box({ + className: 'event-box-container', + children: location.bind('value').as((lcn) => { + if (lcn === 'top') { + return barEventMargins(name); + } else { + return []; + } + }), + }), + Widget.EventBox({ + class_name: 'in-eb menu-event-box', + on_primary_click: () => { + return true; + }, + on_secondary_click: () => { + return true; + }, + setup: (self) => { + globalEventBoxes.value[name] = self; + }, + child: Widget.Box({ + class_name: 'dropdown-menu-container', + css: 'padding: 1px; margin: -1px;', + child: Widget.Revealer({ + revealChild: false, + setup: (self) => + self.hook(App, (_, wname, visible) => { + if (wname === name) self.reveal_child = visible; + }), + transition, + transitionDuration: options.menus.transitionTime.bind('value'), + child: Widget.Box({ + class_name: 'dropdown-menu-container', + can_focus: true, + children: [child], + }), + }), + }), + }), + Widget.Box({ + className: 'event-box-container', + children: location.bind('value').as((lcn) => { + if (lcn === 'bottom') { + return barEventMargins(name); + } else { + return []; + } + }), + }), + ], + }), + }), + ...props, + }); diff --git a/ags/HyprPanel/modules/menus/shared/dropdown/locationHandler/index.ts b/ags/HyprPanel/modules/menus/shared/dropdown/locationHandler/index.ts new file mode 100644 index 0000000..28ce7c7 --- /dev/null +++ b/ags/HyprPanel/modules/menus/shared/dropdown/locationHandler/index.ts @@ -0,0 +1,98 @@ +const hyprland = await Service.import('hyprland'); + +import options from 'options'; +import { bash } from 'lib/utils'; +import { Widget as TWidget } from 'types/@girs/gtk-3.0/gtk-3.0.cjs'; +import { Monitor } from 'types/service/hyprland'; +import Box from 'types/widgets/box'; +import EventBox from 'types/widgets/eventbox'; +import Revealer from 'types/widgets/revealer'; +import { globalEventBoxes } from 'globals/dropdown'; + +type NestedRevealer = Revealer, unknown>; +type NestedBox = Box; +type NestedEventBox = EventBox; + +const { location } = options.theme.bar; +const { scalingPriority } = options; + +export const calculateMenuPosition = async (pos: number[], windowName: string): Promise => { + const self = globalEventBoxes.value[windowName] as NestedEventBox; + const curHyprlandMonitor = hyprland.monitors.find((m) => m.id === hyprland.active.monitor.id); + const dropdownWidth = self.child.get_allocation().width; + const dropdownHeight = self.child.get_allocation().height; + + let hyprScaling = 1; + try { + const monitorInfo = await bash('hyprctl monitors -j'); + const parsedMonitorInfo = JSON.parse(monitorInfo); + + const foundMonitor = parsedMonitorInfo.find((monitor: Monitor) => monitor.id === hyprland.active.monitor.id); + hyprScaling = foundMonitor?.scale || 1; + } catch (error) { + console.error(`Error parsing hyprland monitors: ${error}`); + } + + let monWidth = curHyprlandMonitor?.width; + let monHeight = curHyprlandMonitor?.height; + + if (monWidth === undefined || monHeight === undefined || hyprScaling === undefined) { + return; + } + + // If GDK Scaling is applied, then get divide width by scaling + // to get the proper coordinates. + // Ex: On a 2860px wide monitor... if scaling is set to 2, then the right + // end of the monitor is the 1430th pixel. + const gdkScale = Utils.exec('bash -c "echo $GDK_SCALE"'); + + if (scalingPriority.value === 'both') { + const scale = parseFloat(gdkScale); + monWidth = monWidth / scale; + monHeight = monHeight / scale; + + monWidth = monWidth / hyprScaling; + monHeight = monHeight / hyprScaling; + } else if (/^\d+(.\d+)?$/.test(gdkScale) && scalingPriority.value === 'gdk') { + const scale = parseFloat(gdkScale); + monWidth = monWidth / scale; + monHeight = monHeight / scale; + } else { + monWidth = monWidth / hyprScaling; + monHeight = monHeight / hyprScaling; + } + + // If monitor is vertical (transform = 1 || 3) swap height and width + const isVertical = curHyprlandMonitor?.transform !== undefined ? curHyprlandMonitor.transform % 2 !== 0 : false; + + if (isVertical) { + [monWidth, monHeight] = [monHeight, monWidth]; + } + + let marginRight = monWidth - dropdownWidth / 2; + marginRight = marginRight - pos[0]; + let marginLeft = monWidth - dropdownWidth - marginRight; + + const minimumMargin = 0; + + if (marginRight < minimumMargin) { + marginRight = minimumMargin; + marginLeft = monWidth - dropdownWidth - minimumMargin; + } + + if (marginLeft < minimumMargin) { + marginLeft = minimumMargin; + marginRight = monWidth - dropdownWidth - minimumMargin; + } + + self.set_margin_left(marginLeft); + self.set_margin_right(marginRight); + + if (location.value === 'top') { + self.set_margin_top(0); + self.set_margin_bottom(monHeight); + } else { + self.set_margin_bottom(0); + self.set_margin_top(monHeight - dropdownHeight); + } +}; diff --git a/ags/HyprPanel/modules/menus/shared/popup/index.ts b/ags/HyprPanel/modules/menus/shared/popup/index.ts new file mode 100644 index 0000000..3738030 --- /dev/null +++ b/ags/HyprPanel/modules/menus/shared/popup/index.ts @@ -0,0 +1,186 @@ +import { WINDOW_LAYOUTS } from 'globals/window'; +import { LayoutFunction, Layouts, PopupWindowProps } from 'lib/types/popupwindow'; +import { Attribute, Child, Exclusivity, GtkWidget, Transition } from 'lib/types/widget'; +import Box from 'types/widgets/box'; +import EventBox from 'types/widgets/eventbox'; +import Window from 'types/widgets/window'; + +type Opts = { + className: string; + vexpand: boolean; +}; + +export const Padding = (name: string, opts: Opts): EventBox, unknown> => + Widget.EventBox({ + class_name: opts?.className || '', + hexpand: true, + vexpand: typeof opts?.vexpand === 'boolean' ? opts.vexpand : true, + can_focus: false, + child: Widget.Box(), + setup: (w) => w.on('button-press-event', () => App.toggleWindow(name)), + }); + +const PopupRevealer = ( + name: string, + child: GtkWidget, + transition = 'slide_down' as Transition, +): Box => + Widget.Box( + { css: 'padding: 1px;' }, + Widget.Revealer({ + transition, + child: Widget.Box({ + class_name: `window-content ${name}-window`, + child, + }), + transitionDuration: 200, + setup: (self) => + self.hook(App, (_, wname, visible) => { + if (wname === name) self.reveal_child = visible; + }), + }), + ); + +const Layout: LayoutFunction = (name: string, child: GtkWidget, transition: Transition) => ({ + center: () => + Widget.CenterBox( + {}, + Padding(name, {} as Opts), + Widget.CenterBox( + { vertical: true }, + Padding(name, {} as Opts), + PopupRevealer(name, child, transition), + Padding(name, {} as Opts), + ), + Padding(name, {} as Opts), + ), + top: () => + Widget.CenterBox( + {}, + Padding(name, {} as Opts), + Widget.Box({ vertical: true }, PopupRevealer(name, child, transition), Padding(name, {} as Opts)), + Padding(name, {} as Opts), + ), + 'top-right': () => + Widget.Box( + {}, + Padding(name, {} as Opts), + Widget.Box( + { + hexpand: false, + vertical: true, + }, + Padding(name, { + vexpand: false, + className: 'event-top-padding', + }), + PopupRevealer(name, child, transition), + Padding(name, {} as Opts), + ), + ), + 'top-center': () => + Widget.Box( + {}, + Padding(name, {} as Opts), + Widget.Box( + { + hexpand: false, + vertical: true, + }, + Padding(name, { + vexpand: false, + className: 'event-top-padding', + }), + PopupRevealer(name, child, transition), + Padding(name, {} as Opts), + ), + Padding(name, {} as Opts), + ), + 'top-left': () => + Widget.Box( + {}, + Widget.Box( + { + hexpand: false, + vertical: true, + }, + Padding(name, { + vexpand: false, + className: 'event-top-padding', + }), + PopupRevealer(name, child, transition), + Padding(name, {} as Opts), + ), + Padding(name, {} as Opts), + ), + 'bottom-left': () => + Widget.Box( + {}, + Widget.Box( + { + hexpand: false, + vertical: true, + }, + Padding(name, {} as Opts), + PopupRevealer(name, child, transition), + ), + Padding(name, {} as Opts), + ), + 'bottom-center': () => + Widget.Box( + {}, + Padding(name, {} as Opts), + Widget.Box( + { + hexpand: false, + vertical: true, + }, + Padding(name, {} as Opts), + PopupRevealer(name, child, transition), + ), + Padding(name, {} as Opts), + ), + 'bottom-right': () => + Widget.Box( + {}, + Padding(name, {} as Opts), + Widget.Box( + { + hexpand: false, + vertical: true, + }, + Padding(name, {} as Opts), + PopupRevealer(name, child, transition), + ), + ), +}); + +const isValidLayout = (layout: string): layout is Layouts => { + return WINDOW_LAYOUTS.includes(layout); +}; + +export default ({ + name, + child, + layout = 'center', + transition = 'none', + exclusivity = 'ignore' as Exclusivity, + ...props +}: PopupWindowProps): Window => { + const layoutFn = isValidLayout(layout) ? layout : 'center'; + + const layoutWidget = Layout(name, child, transition)[layoutFn](); + + return Widget.Window({ + name, + class_names: [name, 'popup-window'], + setup: (w) => w.keybind('Escape', () => App.closeWindow(name)), + visible: false, + keymode: 'on-demand', + exclusivity, + layer: 'top', + anchor: ['top', 'bottom', 'right', 'left'], + child: layoutWidget, + ...props, + }); +}; diff --git a/ags/HyprPanel/modules/notifications/actions/index.ts b/ags/HyprPanel/modules/notifications/actions/index.ts new file mode 100644 index 0000000..402f1d9 --- /dev/null +++ b/ags/HyprPanel/modules/notifications/actions/index.ts @@ -0,0 +1,47 @@ +import { Attribute, Child } from 'lib/types/widget'; +import { Notification, Notifications } from 'types/service/notifications'; +import Box from 'types/widgets/box'; + +const Action = (notif: Notification, notifs: Notifications): Box => { + if (notif.actions !== undefined && notif.actions.length > 0) { + return Widget.Box({ + class_name: 'notification-card-actions', + hexpand: true, + vpack: 'end', + children: notif.actions.map((action) => { + return Widget.Button({ + hexpand: true, + class_name: 'notification-action-buttons', + on_primary_click: () => { + if (action.id.includes('scriptAction:-')) { + Utils.execAsync(`${action.id.replace('scriptAction:-', '')}`).catch((err) => + console.error(err), + ); + notifs.CloseNotification(notif.id); + } else { + notif.invoke(action.id); + } + }, + child: Widget.Box({ + hpack: 'center', + hexpand: true, + children: [ + Widget.Label({ + class_name: 'notification-action-buttons-label', + hexpand: true, + label: action.label, + max_width_chars: 15, + truncate: 'end', + wrap: true, + }), + ], + }), + }); + }), + }); + } + + return Widget.Box(); +}; + +export { Action }; diff --git a/ags/HyprPanel/modules/notifications/body/index.ts b/ags/HyprPanel/modules/notifications/body/index.ts new file mode 100644 index 0000000..92fa7a7 --- /dev/null +++ b/ags/HyprPanel/modules/notifications/body/index.ts @@ -0,0 +1,26 @@ +import { Notification } from 'types/service/notifications'; +import { notifHasImg } from '../../menus/notifications/utils.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +export const Body = (notif: Notification): Box => { + return Widget.Box({ + vpack: 'start', + hexpand: true, + class_name: 'notification-card-body', + children: [ + Widget.Label({ + hexpand: true, + use_markup: true, + xalign: 0, + justification: 'left', + truncate: 'end', + lines: 2, + max_width_chars: !notifHasImg(notif) ? 35 : 28, + wrap: true, + class_name: 'notification-card-body-label', + label: notif['body'], + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/notifications/close/index.ts b/ags/HyprPanel/modules/notifications/close/index.ts new file mode 100644 index 0000000..d7a0d6e --- /dev/null +++ b/ags/HyprPanel/modules/notifications/close/index.ts @@ -0,0 +1,18 @@ +import { Attribute, Child } from 'lib/types/widget'; +import { Notification, Notifications } from 'types/service/notifications'; +import Button from 'types/widgets/button'; +import Label from 'types/widgets/label'; + +export const CloseButton = (notif: Notification, notifs: Notifications): Button, Attribute> => { + return Widget.Button({ + class_name: 'close-notification-button', + on_primary_click: () => { + notifs.CloseNotification(notif.id); + }, + child: Widget.Label({ + class_name: 'txt-icon notif-close', + label: '󰅜', + hpack: 'center', + }), + }); +}; diff --git a/ags/HyprPanel/modules/notifications/header/icon.ts b/ags/HyprPanel/modules/notifications/header/icon.ts new file mode 100644 index 0000000..5a02ca2 --- /dev/null +++ b/ags/HyprPanel/modules/notifications/header/icon.ts @@ -0,0 +1,23 @@ +import { Notification } from 'types/service/notifications.js'; +import { getNotificationIcon } from 'globals/notification.js'; +import Box from 'types/widgets/box'; +import { Attribute, Child } from 'lib/types/widget'; + +const NotificationIcon = ({ + app_entry = '', + app_icon = '', + app_name = '', +}: Partial): Box => { + return Widget.Box({ + css: ` + min-width: 2rem; + min-height: 2rem; + `, + child: Widget.Icon({ + class_name: 'notification-icon', + icon: getNotificationIcon(app_name, app_icon, app_entry), + }), + }); +}; + +export { NotificationIcon }; diff --git a/ags/HyprPanel/modules/notifications/header/index.ts b/ags/HyprPanel/modules/notifications/header/index.ts new file mode 100644 index 0000000..71d038d --- /dev/null +++ b/ags/HyprPanel/modules/notifications/header/index.ts @@ -0,0 +1,56 @@ +import GLib from 'gi://GLib'; +import { notifHasImg } from '../../menus/notifications/utils.js'; +import { NotificationIcon } from './icon.js'; +import { Notification } from 'types/service/notifications'; +import options from 'options.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const { military } = options.menus.clock.time; + +export const Header = (notif: Notification): Box => { + const time = (time: number, format = '%I:%M %p'): string => { + return GLib.DateTime.new_from_unix_local(time).format(military.value ? '%H:%M' : format) || '--'; + }; + + return Widget.Box({ + vertical: false, + hexpand: true, + children: [ + Widget.Box({ + class_name: 'notification-card-header', + hpack: 'start', + children: [NotificationIcon(notif)], + }), + Widget.Box({ + class_name: 'notification-card-header', + hexpand: true, + hpack: 'start', + vpack: 'start', + children: [ + Widget.Label({ + class_name: 'notification-card-header-label', + hpack: 'start', + hexpand: true, + vexpand: true, + max_width_chars: !notifHasImg(notif) ? 30 : 19, + truncate: 'end', + wrap: true, + label: notif['summary'], + }), + ], + }), + Widget.Box({ + class_name: 'notification-card-header menu', + hpack: 'end', + vpack: 'start', + hexpand: true, + child: Widget.Label({ + vexpand: true, + class_name: 'notification-time', + label: time(notif.time), + }), + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/notifications/image/index.ts b/ags/HyprPanel/modules/notifications/image/index.ts new file mode 100644 index 0000000..df1fded --- /dev/null +++ b/ags/HyprPanel/modules/notifications/image/index.ts @@ -0,0 +1,25 @@ +import { Notification } from 'types/service/notifications'; +import { notifHasImg } from '../../menus/notifications/utils.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; + +const Image = (notif: Notification): Box => { + if (notifHasImg(notif)) { + return Widget.Box({ + class_name: 'notification-card-image-container', + hpack: 'center', + vpack: 'center', + vexpand: false, + child: Widget.Box({ + hpack: 'center', + vexpand: false, + class_name: 'notification-card-image', + css: `background-image: url("${notif.image}")`, + }), + }); + } + + return Widget.Box(); +}; + +export { Image }; diff --git a/ags/HyprPanel/modules/notifications/index.ts b/ags/HyprPanel/modules/notifications/index.ts new file mode 100644 index 0000000..7e86589 --- /dev/null +++ b/ags/HyprPanel/modules/notifications/index.ts @@ -0,0 +1,80 @@ +const notifs = await Service.import('notifications'); +import options from 'options'; +import { notifHasImg } from '../menus/notifications/utils.js'; +import { Image } from './image/index.js'; +import { Action } from './actions/index.js'; +import { Header } from './header/index.js'; +import { Body } from './body/index.js'; +import { CloseButton } from './close/index.js'; +import { getPosition } from 'lib/utils.js'; +import { filterNotifications } from 'lib/shared/notifications.js'; +import { Notification } from 'types/service/notifications.js'; +import Window from 'types/widgets/window.js'; +import Box from 'types/widgets/box.js'; +import { Attribute, Child } from 'lib/types/widget.js'; +const hyprland = await Service.import('hyprland'); + +const { position, timeout, cache_actions, monitor, active_monitor, displayedTotal, ignore } = options.notifications; + +const curMonitor = Variable(monitor.value); + +hyprland.active.connect('changed', () => { + curMonitor.value = hyprland.active.monitor.id; +}); + +export default (): Window, unknown> => { + Utils.merge([timeout.bind('value'), cache_actions.bind('value')], (timeout, doCaching) => { + notifs.popupTimeout = timeout; + notifs.cacheActions = doCaching; + }); + + return Widget.Window({ + name: 'notifications-window', + class_name: 'notifications-window', + monitor: Utils.merge( + [curMonitor.bind('value'), monitor.bind('value'), active_monitor.bind('value')], + (curMon, mon, activeMonitor) => { + if (activeMonitor === true) { + return curMon; + } + + return mon; + }, + ), + layer: options.tear.bind('value').as((tear) => (tear ? 'top' : 'overlay')), + anchor: position.bind('value').as((v) => getPosition(v)), + exclusivity: 'normal', + child: Widget.Box({ + class_name: 'notification-card-container', + vertical: true, + hexpand: true, + setup: (self) => { + Utils.merge( + [notifs.bind('popups'), ignore.bind('value')], + (notifications: Notification[], ignoredNotifs: string[]) => { + const filteredNotifications = filterNotifications(notifications, ignoredNotifs); + + return (self.children = filteredNotifications.slice(0, displayedTotal.value).map((notif) => { + return Widget.Box({ + class_name: 'notification-card', + vpack: 'start', + hexpand: true, + children: [ + Image(notif), + Widget.Box({ + vpack: 'start', + vertical: true, + hexpand: true, + class_name: `notification-card-content ${!notifHasImg(notif) ? 'noimg' : ''}`, + children: [Header(notif), Body(notif), Action(notif, notifs)], + }), + CloseButton(notif, notifs), + ], + }); + })); + }, + ); + }, + }), + }); +}; diff --git a/ags/HyprPanel/modules/osd/bar/index.ts b/ags/HyprPanel/modules/osd/bar/index.ts new file mode 100644 index 0000000..b73cda1 --- /dev/null +++ b/ags/HyprPanel/modules/osd/bar/index.ts @@ -0,0 +1,89 @@ +import { OSDOrientation } from 'lib/types/options'; +import brightness from 'services/Brightness'; +import options from 'options'; +import Box from 'types/widgets/box'; +import { Attribute, Child } from 'lib/types/widget'; +const audio = await Service.import('audio'); + +export const OSDBar = (ort: OSDOrientation): Box => { + return Widget.Box({ + class_name: 'osd-bar-container', + children: [ + Widget.LevelBar({ + class_name: 'osd-bar', + vertical: ort === 'vertical', + inverted: ort === 'vertical', + bar_mode: 'continuous', + setup: (self) => { + self.hook( + brightness, + () => { + self.class_names = self.class_names.filter((c) => c !== 'overflow'); + self.value = brightness.screen; + }, + 'notify::screen', + ); + self.hook( + brightness, + () => { + self.class_names = self.class_names.filter((c) => c !== 'overflow'); + self.value = brightness.kbd; + }, + 'notify::kbd', + ); + self.hook( + audio.microphone, + () => { + self.toggleClassName('overflow', audio.microphone.volume > 1); + self.value = + audio.microphone.volume <= 1 ? audio.microphone.volume : audio.microphone.volume - 1; + }, + 'notify::volume', + ); + self.hook( + audio.microphone, + () => { + self.toggleClassName( + 'overflow', + audio.microphone.volume > 1 && + (!options.theme.osd.muted_zero.value || audio.microphone.is_muted === false), + ); + self.value = + options.theme.osd.muted_zero.value && audio.microphone.is_muted !== false + ? 0 + : audio.microphone.volume <= 1 + ? audio.microphone.volume + : audio.microphone.volume - 1; + }, + 'notify::is-muted', + ); + self.hook( + audio.speaker, + () => { + self.toggleClassName('overflow', audio.speaker.volume > 1); + self.value = audio.speaker.volume <= 1 ? audio.speaker.volume : audio.speaker.volume - 1; + }, + 'notify::volume', + ); + self.hook( + audio.speaker, + () => { + self.toggleClassName( + 'overflow', + audio.speaker.volume > 1 && + (!options.theme.osd.muted_zero.value || audio.speaker.is_muted === false), + ); + self.value = + options.theme.osd.muted_zero.value && audio.speaker.is_muted !== false + ? 0 + : audio.speaker.volume <= 1 + ? audio.speaker.volume + : audio.speaker.volume - 1; + }, + 'notify::is-muted', + ); + }, + }), + ], + }); +}; diff --git a/ags/HyprPanel/modules/osd/icon/index.ts b/ags/HyprPanel/modules/osd/icon/index.ts new file mode 100644 index 0000000..1682c91 --- /dev/null +++ b/ags/HyprPanel/modules/osd/icon/index.ts @@ -0,0 +1,62 @@ +import { Attribute, Child } from 'lib/types/widget'; +import brightness from 'services/Brightness'; +import Box from 'types/widgets/box'; +const audio = await Service.import('audio'); + +export const OSDIcon = (): Box => { + return Widget.Box({ + class_name: 'osd-icon-container', + hexpand: true, + child: Widget.Label({ + class_name: 'osd-icon txt-icon', + hexpand: true, + vexpand: true, + hpack: 'center', + vpack: 'center', + setup: (self) => { + self.hook( + brightness, + () => { + self.label = '󱍖'; + }, + 'notify::screen', + ); + self.hook( + brightness, + () => { + self.label = '󰥻'; + }, + 'notify::kbd', + ); + self.hook( + audio.microphone, + () => { + self.label = audio.microphone.is_muted ? '󰍭' : '󰍬'; + }, + 'notify::volume', + ); + self.hook( + audio.microphone, + () => { + self.label = audio.microphone.is_muted ? '󰍭' : '󰍬'; + }, + 'notify::is-muted', + ); + self.hook( + audio.speaker, + () => { + self.label = audio.speaker.is_muted ? '󰝟' : '󰕾'; + }, + 'notify::volume', + ); + self.hook( + audio.speaker, + () => { + self.label = audio.speaker.is_muted ? '󰝟' : '󰕾'; + }, + 'notify::is-muted', + ); + }, + }), + }); +}; diff --git a/ags/HyprPanel/modules/osd/index.ts b/ags/HyprPanel/modules/osd/index.ts new file mode 100644 index 0000000..8e3dbd6 --- /dev/null +++ b/ags/HyprPanel/modules/osd/index.ts @@ -0,0 +1,199 @@ +import options from 'options'; +import brightness from 'services/Brightness'; +import { OSDLabel } from './label/index'; +import { OSDBar } from './bar/index'; +import { OSDIcon } from './icon/index'; +import { getPosition } from 'lib/utils'; +import { Attribute, Child } from 'lib/types/widget'; +import { Revealer } from 'resource:///com/github/Aylur/ags/widgets/revealer.js'; +import { Window } from 'resource:///com/github/Aylur/ags/widgets/window.js'; +const hyprland = await Service.import('hyprland'); +const audio = await Service.import('audio'); + +const { enable, duration, orientation, location, active_monitor, monitor } = options.theme.osd; + +const curMonitor = Variable(monitor.value); + +hyprland.active.connect('changed', () => { + curMonitor.value = hyprland.active.monitor.id; +}); + +let count = 0; + +const handleRevealRevealer = (self: Revealer, property: 'reveal_child' | 'visible'): void => { + if (!enable.value || property !== 'reveal_child') { + return; + } + + self.reveal_child = true; + + count++; + Utils.timeout(duration.value, () => { + count--; + + if (count === 0) { + self.reveal_child = false; + } + }); +}; + +const handleRevealWindow = (self: Window, property: 'reveal_child' | 'visible'): void => { + if (!enable.value || property !== 'visible') { + return; + } + + self.visible = true; + + count++; + Utils.timeout(duration.value, () => { + count--; + + if (count === 0) { + self.visible = false; + } + }); +}; + +const handleReveal = ( + self: Revealer | Window, + property: 'reveal_child' | 'visible', +): void => { + if (self instanceof Revealer) { + handleRevealRevealer(self, property); + } else if (self instanceof Window) { + handleRevealWindow(self, property); + } +}; + +const renderOSD = (): Revealer => { + return Widget.Revealer({ + transition: 'crossfade', + reveal_child: false, + setup: (self) => { + self.hook( + brightness, + () => { + handleReveal(self, 'reveal_child'); + }, + 'notify::screen', + ); + self.hook( + brightness, + () => { + handleReveal(self, 'reveal_child'); + }, + 'notify::kbd', + ); + self.hook( + audio.microphone, + () => { + handleReveal(self, 'reveal_child'); + }, + 'notify::volume', + ); + self.hook( + audio.microphone, + () => { + handleReveal(self, 'reveal_child'); + }, + 'notify::is-muted', + ); + self.hook( + audio.speaker, + () => { + handleReveal(self, 'reveal_child'); + }, + 'notify::volume', + ); + self.hook( + audio.speaker, + () => { + handleReveal(self, 'reveal_child'); + }, + 'notify::is-muted', + ); + }, + child: Widget.Box({ + class_name: 'osd-container', + vertical: orientation.bind('value').as((ort) => ort === 'vertical'), + children: orientation.bind('value').as((ort) => { + if (ort === 'vertical') { + return [OSDLabel(), OSDBar(ort), OSDIcon()]; + } + + return [OSDIcon(), OSDBar(ort), OSDLabel()]; + }), + }), + }); +}; + +export default (): Window => + Widget.Window({ + monitor: Utils.merge( + [curMonitor.bind('value'), monitor.bind('value'), active_monitor.bind('value')], + (curMon, mon, activeMonitor) => { + if (activeMonitor === true) { + return curMon; + } + + return mon; + }, + ), + name: `indicator`, + class_name: 'indicator', + layer: options.tear.bind('value').as((tear) => (tear ? 'top' : 'overlay')), + anchor: location.bind('value').as((v) => getPosition(v)), + click_through: true, + child: Widget.Box({ + css: 'padding: 1px;', + expand: true, + child: renderOSD(), + }), + setup: (self) => { + self.hook(enable, () => { + handleReveal(self, 'visible'); + }); + self.hook( + brightness, + () => { + handleReveal(self, 'visible'); + }, + 'notify::screen', + ); + self.hook( + brightness, + () => { + handleReveal(self, 'visible'); + }, + 'notify::kbd', + ); + self.hook( + audio.microphone, + () => { + handleReveal(self, 'visible'); + }, + 'notify::volume', + ); + self.hook( + audio.microphone, + () => { + handleReveal(self, 'visible'); + }, + 'notify::is-muted', + ); + self.hook( + audio.speaker, + () => { + handleReveal(self, 'visible'); + }, + 'notify::volume', + ); + self.hook( + audio.speaker, + () => { + handleReveal(self, 'visible'); + }, + 'notify::is-muted', + ); + }, + }); diff --git a/ags/HyprPanel/modules/osd/label/index.ts b/ags/HyprPanel/modules/osd/label/index.ts new file mode 100644 index 0000000..9e61636 --- /dev/null +++ b/ags/HyprPanel/modules/osd/label/index.ts @@ -0,0 +1,86 @@ +import brightness from 'services/Brightness'; +import options from 'options'; +import Box from 'types/widgets/box'; +import { Attribute, Child } from 'lib/types/widget'; +const audio = await Service.import('audio'); + +export const OSDLabel = (): Box => { + return Widget.Box({ + class_name: 'osd-label-container', + hexpand: true, + vexpand: true, + child: Widget.Label({ + class_name: 'osd-label', + hexpand: true, + vexpand: true, + hpack: 'center', + vpack: 'center', + setup: (self) => { + self.hook( + brightness, + () => { + self.class_names = self.class_names.filter((c) => c !== 'overflow'); + self.label = `${Math.round(brightness.screen * 100)}`; + }, + 'notify::screen', + ); + self.hook( + brightness, + () => { + self.class_names = self.class_names.filter((c) => c !== 'overflow'); + self.label = `${Math.round(brightness.kbd * 100)}`; + }, + 'notify::kbd', + ); + self.hook( + audio.microphone, + () => { + self.toggleClassName('overflow', audio.microphone.volume > 1); + self.label = `${Math.round(audio.microphone.volume * 100)}`; + }, + 'notify::volume', + ); + self.hook( + audio.microphone, + () => { + self.toggleClassName( + 'overflow', + audio.microphone.volume > 1 && + (!options.theme.osd.muted_zero.value || audio.microphone.is_muted === false), + ); + const inputVolume = + options.theme.osd.muted_zero.value && audio.microphone.is_muted !== false + ? 0 + : Math.round(audio.microphone.volume * 100); + self.label = `${inputVolume}`; + }, + 'notify::is-muted', + ); + self.hook( + audio.speaker, + () => { + self.toggleClassName('overflow', audio.speaker.volume > 1); + self.label = `${Math.round(audio.speaker.volume * 100)}`; + }, + 'notify::volume', + ); + self.hook( + audio.speaker, + () => { + self.toggleClassName( + 'overflow', + audio.speaker.volume > 1 && + (!options.theme.osd.muted_zero.value || audio.speaker.is_muted === false), + ); + const speakerVolume = + options.theme.osd.muted_zero.value && audio.speaker.is_muted !== false + ? 0 + : Math.round(audio.speaker.volume * 100); + self.label = `${speakerVolume}`; + }, + 'notify::is-muted', + ); + }, + }), + }); +}; diff --git a/ags/HyprPanel/modules/shared/barItemBox.ts b/ags/HyprPanel/modules/shared/barItemBox.ts new file mode 100644 index 0000000..0f84c41 --- /dev/null +++ b/ags/HyprPanel/modules/shared/barItemBox.ts @@ -0,0 +1,32 @@ +import { BarBoxChild } from 'lib/types/bar'; +import { Bind } from 'lib/types/variable'; +import { Attribute, GtkWidget } from 'lib/types/widget'; +import options from 'options'; +import Button from 'types/widgets/button'; + +export const BarItemBox = (child: BarBoxChild): Button => { + const computeVisible = (): Bind | boolean => { + if (child.isVis !== undefined) { + return child.isVis.bind('value'); + } + return child.isVisible; + }; + + return Widget.Button({ + class_name: options.theme.bar.buttons.style.bind('value').as((style) => { + const styleMap = { + default: 'style1', + split: 'style2', + wave: 'style3', + wave2: 'style4', + }; + + const boxClassName = Object.hasOwnProperty.call(child, 'boxClass') ? child.boxClass : ''; + + return `bar_item_box_visible ${styleMap[style]} ${boxClassName}`; + }), + child: child.component, + visible: computeVisible(), + ...child.props, + }); +}; diff --git a/ags/HyprPanel/nix/default.nix b/ags/HyprPanel/nix/default.nix new file mode 100644 index 0000000..f3a946d --- /dev/null +++ b/ags/HyprPanel/nix/default.nix @@ -0,0 +1,64 @@ +{ + inputs, + pkgs, + system, + stdenv, + lib, + writeShellScriptBin, + bun, + dart-sass, + fd, + accountsservice, + btop, + pipewire, + bluez, + bluez-tools, + grimblast, + gpu-screen-recorder, + networkmanager, + brightnessctl, + matugen, + swww, + python3, + libgtop, + gnome-bluetooth, + gobject-introspection, + glib, +}: let + ags = inputs.ags.packages.${system}.default.override { + extraPackages = [accountsservice]; + }; + + pname = "hyprpanel"; + config = stdenv.mkDerivation { + inherit pname; + version = "latest"; + src = ../.; + + buildPhase = '' + ${bun}/bin/bun build ./main.ts \ + --outfile main.js \ + --external "resource://*" \ + --external "gi://*" + ''; + + installPhase = '' + mkdir $out + cp -r assets $out + cp -r scss $out + cp -r widget $out + cp -r services $out + cp -f main.js $out/config.js + ''; + }; +in { + desktop = { + inherit config; + script = writeShellScriptBin pname '' + export PATH=$PATH:${lib.makeBinPath [dart-sass fd btop pipewire bluez bluez-tools networkmanager matugen swww grimblast gpu-screen-recorder brightnessctl gnome-bluetooth python3]} + export GI_TYPELIB_PATH=${libgtop}/lib/girepository-1.0:${glib}/lib/girepository-1.0:$GI_TYPELIB_PATH + ${ags}/bin/ags -b hyprpanel -c ${config}/config.js $@ + ''; + }; +} + diff --git a/ags/HyprPanel/options.ts b/ags/HyprPanel/options.ts new file mode 100644 index 0000000..24c854c --- /dev/null +++ b/ags/HyprPanel/options.ts @@ -0,0 +1,1187 @@ +import { opt, mkOptions } from 'lib/option'; +import { NetstatLabelType, RateUnit, ResourceLabelType } from 'lib/types/bar'; +import { KbLabelType } from 'lib/types/customModules/kbLayout'; +import { + ActiveWsIndicator, + BarButtonStyles, + BarLocation, + NotificationAnchor, + OSDAnchor, + OSDOrientation, + ScalingPriority, + WindowLayer, +} from 'lib/types/options'; +import { MatugenScheme, MatugenTheme, MatugenVariations } from 'lib/types/options'; +import { UnitType } from 'lib/types/weather'; +import { Transition } from 'lib/types/widget'; +import { WorkspaceIcons, WorkspaceIconsColored } from 'lib/types/workspace'; + +// WARN: CHANGING THESE VALUES WILL PREVENT MATUGEN COLOR GENERATION FOR THE CHANGED VALUE +export const colors = { + rosewater: '#f5e0dc', + flamingo: '#f2cdcd', + pink: '#f5c2e7', + mauve: '#cba6f7', + red: '#f38ba8', + maroon: '#eba0ac', + peach: '#fab387', + yellow: '#f9e2af', + green: '#a6e3a1', + teal: '#94e2d5', + sky: '#89dceb', + sapphire: '#74c7ec', + blue: '#89b4fa', + lavender: '#b4befe', + text: '#cdd6f4', + subtext1: '#bac2de', + subtext2: '#a6adc8', + overlay2: '#9399b2', + overlay1: '#7f849c', + overlay0: '#6c7086', + surface2: '#585b70', + surface1: '#45475a', + surface0: '#313244', + base2: '#242438', + base: '#1e1e2e', + mantle: '#181825', + crust: '#11111b', +}; + +// WARN: CHANGING THESE VALUES WILL PREVENT MATUGEN COLOR GENERATION FOR THE CHANGED VALUE +const secondary_colors = { + text: '#cdd6f3', + pink: '#f5c2e6', + red: '#f38ba7', + peach: '#fab386', + mantle: '#181824', + surface1: '#454759', + surface0: '#313243', + overlay1: '#7f849b', + lavender: '#b4befd', + mauve: '#cba6f6', + green: '#a6e3a0', + sky: '#89dcea', + teal: '#94e2d4', + yellow: '#f9e2ad', + maroon: '#eba0ab', + crust: '#11111a', + surface2: '#585b69', +}; + +const tertiary_colors = { + pink: '#f5c2e8', + red: '#f38ba9', + mantle: '#181826', + surface0: '#313245', + overlay1: '#7f849d', + lavender: '#b4beff', + mauve: '#cba6f8', + green: '#a6e3a2', + sky: '#89dcec', + teal: '#94e2d6', + yellow: '#f9e2ae', + maroon: '#eba0ad', + crust: '#11111c', + surface2: '#585b71', +}; + +const options = mkOptions(OPTIONS, { + theme: { + matugen: opt(false), + matugen_settings: { + mode: opt('dark'), + scheme_type: opt('tonal-spot'), + variation: opt('standard_1'), + contrast: opt(0.0), + }, + font: { + size: opt('1.2rem'), + name: opt('Ubuntu Nerd Font'), + weight: opt(600), + }, + notification: { + scaling: opt(100), + background: opt(tertiary_colors.mantle), + opacity: opt(100), + actions: { + background: opt(secondary_colors.lavender), + text: opt(colors.mantle), + }, + label: opt(colors.lavender), + border: opt(secondary_colors.surface0), + border_radius: opt('0.6em'), + time: opt(secondary_colors.overlay1), + text: opt(colors.text), + labelicon: opt(colors.lavender), + close_button: { + background: opt(secondary_colors.red), + label: opt(colors.crust), + }, + }, + osd: { + scaling: opt(100), + duration: opt(2500), + enable: opt(true), + orientation: opt('vertical'), + opacity: opt(100), + bar_container: opt(colors.crust), + icon_container: opt(tertiary_colors.lavender), + bar_color: opt(tertiary_colors.lavender), + bar_empty_color: opt(colors.surface0), + bar_overflow_color: opt(secondary_colors.red), + icon: opt(colors.crust), + label: opt(tertiary_colors.lavender), + monitor: opt(0), + active_monitor: opt(true), + radius: opt('0.4em'), + margins: opt('0px 5px 0px 0px'), + location: opt('right'), + muted_zero: opt(false), + }, + bar: { + scaling: opt(100), + floating: opt(false), + location: opt('top'), + layer: opt('top'), + margin_top: opt('0.5em'), + opacity: opt(100), + margin_bottom: opt('0em'), + margin_sides: opt('0.5em'), + border_radius: opt('0.4em'), + outer_spacing: opt('1.6em'), + label_spacing: opt('0.5em'), + transparent: opt(false), + dropdownGap: opt('2.9em'), + background: opt(colors.crust), + buttons: { + style: opt('default'), + enableBorders: opt(false), + borderSize: opt('0.1em'), + monochrome: opt(false), + spacing: opt('0.25em'), + padding_x: opt('0.7rem'), + padding_y: opt('0.2rem'), + y_margins: opt('0.4em'), + radius: opt('0.3em'), + opacity: opt(100), + background_opacity: opt(100), + background_hover_opacity: opt(100), + background: opt(colors.base2), + icon_background: opt(colors.base2), + hover: opt(colors.surface1), + text: opt(colors.lavender), + icon: opt(colors.lavender), + dashboard: { + background: opt(colors.base2), + enableBorder: opt(false), + border: opt(colors.yellow), + icon: opt(colors.yellow), + spacing: opt('0.5em'), + }, + workspaces: { + background: opt(colors.base2), + enableBorder: opt(false), + smartHighlight: opt(true), + border: opt(colors.pink), + available: opt(colors.sky), + occupied: opt(colors.flamingo), + active: opt(colors.pink), + hover: opt(colors.pink), + numbered_active_highlight_border: opt('0.2em'), + numbered_active_highlight_padding: opt('0.2em'), + numbered_active_highlighted_text_color: opt(colors.mantle), + numbered_active_underline_color: opt(colors.pink), + spacing: opt('0.5em'), + fontSize: opt('1.2em'), + }, + windowtitle: { + background: opt(colors.base2), + enableBorder: opt(false), + border: opt(colors.pink), + text: opt(colors.pink), + icon: opt(colors.pink), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + media: { + enableBorder: opt(false), + border: opt(colors.lavender), + background: opt(colors.base2), + text: opt(colors.lavender), + icon: opt(colors.lavender), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + volume: { + enableBorder: opt(false), + border: opt(colors.maroon), + background: opt(colors.base2), + text: opt(colors.maroon), + icon: opt(colors.maroon), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + network: { + enableBorder: opt(false), + border: opt(colors.mauve), + background: opt(colors.base2), + text: opt(colors.mauve), + icon: opt(colors.mauve), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + bluetooth: { + enableBorder: opt(false), + border: opt(colors.sky), + background: opt(colors.base2), + text: opt(colors.sky), + icon: opt(colors.sky), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + systray: { + enableBorder: opt(false), + border: opt(colors.lavender), + background: opt(colors.base2), + spacing: opt('0.5em'), + }, + battery: { + enableBorder: opt(false), + border: opt(colors.yellow), + background: opt(colors.base2), + text: opt(colors.yellow), + icon: opt(colors.yellow), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + clock: { + enableBorder: opt(false), + border: opt(colors.pink), + background: opt(colors.base2), + text: opt(colors.pink), + icon: opt(colors.pink), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + notifications: { + enableBorder: opt(false), + border: opt(colors.lavender), + background: opt(colors.base2), + icon: opt(colors.lavender), + icon_background: opt(colors.base2), + total: opt(colors.lavender), + spacing: opt('0.5em'), + }, + modules: { + ram: { + enableBorder: opt(false), + border: opt(colors.yellow), + background: opt(colors.base2), + text: opt(colors.yellow), + icon: opt(colors.yellow), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + cpu: { + enableBorder: opt(false), + border: opt(colors.red), + background: opt(colors.base2), + text: opt(colors.red), + icon: opt(colors.red), + icon_background: opt(colors.base2), + spacing: opt('0.5em'), + }, + storage: { + enableBorder: opt(false), + border: opt(colors.pink), + background: opt(colors.base2), + text: opt(colors.pink), + icon: opt(colors.pink), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + netstat: { + enableBorder: opt(false), + border: opt(colors.green), + background: opt(colors.base2), + text: opt(colors.green), + icon: opt(colors.green), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + kbLayout: { + enableBorder: opt(false), + border: opt(colors.sky), + background: opt(colors.base2), + text: opt(colors.sky), + icon: opt(colors.sky), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + updates: { + enableBorder: opt(false), + border: opt(colors.mauve), + background: opt(colors.base2), + text: opt(colors.mauve), + icon: opt(colors.mauve), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + weather: { + enableBorder: opt(false), + border: opt(colors.lavender), + background: opt(colors.base2), + text: opt(colors.lavender), + icon: opt(colors.lavender), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + power: { + enableBorder: opt(false), + border: opt(colors.red), + background: opt(colors.base2), + icon: opt(colors.red), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + submap: { + enableBorder: opt(false), + border: opt(colors.teal), + background: opt(colors.base2), + text: opt(colors.teal), + icon: opt(colors.teal), + icon_background: opt(colors.base2), + spacing: opt('0.45em'), + }, + }, + }, + menus: { + monochrome: opt(false), + background: opt(colors.crust), + opacity: opt(100), + cards: opt(colors.base), + card_radius: opt('0.4em'), + border: { + size: opt('0.13em'), + radius: opt('0.7em'), + color: opt(colors.surface0), + }, + text: opt(colors.text), + dimtext: opt(colors.surface2), + feinttext: opt(colors.surface0), + label: opt(colors.lavender), + popover: { + text: opt(colors.lavender), + background: opt(secondary_colors.mantle), + border: opt(secondary_colors.mantle), + }, + listitems: { + passive: opt(colors.text), + active: opt(secondary_colors.lavender), + }, + icons: { + passive: opt(colors.surface2), + active: opt(colors.lavender), + }, + switch: { + enabled: opt(colors.lavender), + disabled: opt(tertiary_colors.surface0), + puck: opt(secondary_colors.surface1), + }, + check_radio_button: { + background: opt(colors.surface1), + active: opt(tertiary_colors.lavender), + }, + buttons: { + default: opt(colors.lavender), + active: opt(secondary_colors.pink), + disabled: opt(tertiary_colors.surface2), + text: opt(secondary_colors.mantle), + }, + iconbuttons: { + passive: opt(secondary_colors.text), + active: opt(tertiary_colors.lavender), + }, + progressbar: { + foreground: opt(colors.lavender), + background: opt(colors.surface1), + }, + slider: { + primary: opt(colors.lavender), + background: opt(tertiary_colors.surface2), + backgroundhover: opt(colors.surface1), + puck: opt(colors.overlay0), + }, + dropdownmenu: { + background: opt(colors.crust), + text: opt(colors.text), + divider: opt(colors.base), + }, + tooltip: { + background: opt(colors.crust), + text: opt(tertiary_colors.lavender), + }, + menu: { + media: { + scaling: opt(100), + song: opt(tertiary_colors.lavender), + artist: opt(tertiary_colors.teal), + album: opt(tertiary_colors.pink), + background: { + color: opt(colors.crust), + }, + card: { + color: opt(colors.base), + tint: opt(85), + }, + border: { + color: opt(colors.surface0), + }, + buttons: { + inactive: opt(colors.surface2), + enabled: opt(secondary_colors.teal), + background: opt(tertiary_colors.lavender), + text: opt(colors.crust), + }, + slider: { + primary: opt(colors.pink), + background: opt(tertiary_colors.surface2), + backgroundhover: opt(colors.surface1), + puck: opt(colors.overlay0), + }, + }, + volume: { + scaling: opt(100), + card: { + color: opt(colors.base), + }, + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + label: { + color: opt(colors.maroon), + }, + text: opt(colors.text), + listitems: { + passive: opt(colors.text), + active: opt(secondary_colors.maroon), + }, + iconbutton: { + passive: opt(colors.text), + active: opt(colors.maroon), + }, + icons: { + passive: opt(colors.overlay2), + active: opt(colors.maroon), + }, + audio_slider: { + primary: opt(colors.maroon), + background: opt(tertiary_colors.surface2), + backgroundhover: opt(colors.surface1), + puck: opt(colors.surface2), + }, + input_slider: { + primary: opt(colors.maroon), + background: opt(tertiary_colors.surface2), + backgroundhover: opt(colors.surface1), + puck: opt(colors.surface2), + }, + }, + network: { + scaling: opt(100), + card: { + color: opt(colors.base), + }, + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + label: { + color: opt(colors.mauve), + }, + text: opt(colors.text), + status: { + color: opt(colors.overlay0), + }, + listitems: { + passive: opt(colors.text), + active: opt(secondary_colors.mauve), + }, + icons: { + passive: opt(colors.overlay2), + active: opt(colors.mauve), + }, + iconbuttons: { + passive: opt(colors.text), + active: opt(colors.mauve), + }, + switch: { + enabled: opt(colors.mauve), + disabled: opt(tertiary_colors.surface0), + puck: opt(secondary_colors.surface1), + }, + }, + bluetooth: { + scaling: opt(100), + card: { + color: opt(colors.base), + }, + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + label: { + color: opt(colors.sky), + }, + text: opt(colors.text), + status: opt(colors.overlay0), + switch_divider: opt(colors.surface1), + switch: { + enabled: opt(colors.sky), + disabled: opt(tertiary_colors.surface0), + puck: opt(secondary_colors.surface1), + }, + listitems: { + passive: opt(colors.text), + active: opt(secondary_colors.sky), + }, + icons: { + passive: opt(colors.overlay2), + active: opt(colors.sky), + }, + iconbutton: { + passive: opt(colors.text), + active: opt(colors.sky), + }, + }, + systray: { + dropdownmenu: { + background: opt(colors.crust), + text: opt(colors.text), + divider: opt(colors.base), + }, + }, + battery: { + scaling: opt(100), + card: { + color: opt(colors.base), + }, + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + label: { + color: opt(colors.yellow), + }, + text: opt(colors.text), + listitems: { + passive: opt(secondary_colors.text), + active: opt(colors.yellow), + }, + icons: { + passive: opt(colors.overlay2), + active: opt(colors.yellow), + }, + slider: { + primary: opt(colors.yellow), + background: opt(tertiary_colors.surface2), + backgroundhover: opt(colors.surface1), + puck: opt(colors.overlay0), + }, + }, + clock: { + scaling: opt(100), + card: { + color: opt(colors.base), + }, + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + text: opt(colors.text), + time: { + time: opt(colors.pink), + timeperiod: opt(colors.teal), + }, + calendar: { + yearmonth: opt(colors.teal), + weekdays: opt(colors.pink), + paginator: opt(secondary_colors.pink), + currentday: opt(colors.pink), + days: opt(colors.text), + contextdays: opt(colors.surface2), + }, + weather: { + icon: opt(colors.pink), + temperature: opt(colors.text), + status: opt(colors.teal), + stats: opt(colors.pink), + thermometer: { + extremelyhot: opt(colors.red), + hot: opt(colors.peach), + moderate: opt(colors.lavender), + cold: opt(colors.blue), + extremelycold: opt(colors.sky), + }, + hourly: { + time: opt(colors.pink), + icon: opt(colors.pink), + temperature: opt(colors.pink), + }, + }, + }, + dashboard: { + scaling: opt(100), + confirmation_scaling: opt(100), + card: { + color: opt(colors.base), + }, + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + profile: { + name: opt(colors.pink), + size: opt('8.5em'), + radius: opt('0.4em'), + }, + powermenu: { + shutdown: opt(colors.red), + restart: opt(colors.peach), + logout: opt(colors.green), + sleep: opt(colors.sky), + confirmation: { + card: opt(colors.base), + background: opt(colors.crust), + border: opt(colors.surface0), + label: opt(colors.lavender), + body: opt(colors.text), + confirm: opt(colors.green), + deny: opt(colors.red), + button_text: opt(secondary_colors.crust), + }, + }, + shortcuts: { + background: opt(colors.lavender), + text: opt(secondary_colors.mantle), + recording: opt(colors.green), + }, + controls: { + disabled: opt(colors.surface2), + wifi: { + background: opt(colors.mauve), + text: opt(secondary_colors.mantle), + }, + bluetooth: { + background: opt(colors.sky), + text: opt(secondary_colors.mantle), + }, + notifications: { + background: opt(colors.yellow), + text: opt(secondary_colors.mantle), + }, + volume: { + background: opt(colors.maroon), + text: opt(secondary_colors.mantle), + }, + input: { + background: opt(colors.pink), + text: opt(secondary_colors.mantle), + }, + }, + directories: { + left: { + top: { + color: opt(colors.pink), + }, + middle: { + color: opt(colors.yellow), + }, + bottom: { + color: opt(colors.maroon), + }, + }, + right: { + top: { + color: opt(colors.teal), + }, + middle: { + color: opt(colors.mauve), + }, + bottom: { + color: opt(colors.lavender), + }, + }, + }, + monitors: { + bar_background: opt(colors.surface1), + cpu: { + icon: opt(colors.maroon), + bar: opt(tertiary_colors.maroon), + label: opt(colors.maroon), + }, + ram: { + icon: opt(colors.yellow), + bar: opt(tertiary_colors.yellow), + label: opt(colors.yellow), + }, + gpu: { + icon: opt(colors.green), + bar: opt(tertiary_colors.green), + label: opt(colors.green), + }, + disk: { + icon: opt(colors.pink), + bar: opt(tertiary_colors.pink), + label: opt(colors.pink), + }, + }, + }, + power: { + scaling: opt(90), + radius: opt('0.4em'), + background: { + color: opt(colors.crust), + }, + border: { + color: opt(colors.surface0), + }, + buttons: { + shutdown: { + background: opt(colors.base), + icon_background: opt(secondary_colors.red), + text: opt(colors.red), + icon: opt(secondary_colors.mantle), + }, + restart: { + background: opt(colors.base), + icon_background: opt(secondary_colors.peach), + text: opt(colors.peach), + icon: opt(secondary_colors.mantle), + }, + logout: { + background: opt(colors.base), + icon_background: opt(secondary_colors.green), + text: opt(colors.green), + icon: opt(secondary_colors.mantle), + }, + sleep: { + background: opt(colors.base), + icon_background: opt(secondary_colors.sky), + text: opt(colors.sky), + icon: opt(secondary_colors.mantle), + }, + }, + }, + notifications: { + scaling: opt(100), + height: opt('58em'), + label: opt(colors.lavender), + no_notifications_label: opt(colors.surface0), + background: opt(colors.crust), + card: opt(colors.base), + border: opt(colors.surface0), + switch_divider: opt(colors.surface1), + clear: opt(colors.red), + switch: { + enabled: opt(colors.lavender), + disabled: opt(tertiary_colors.surface0), + puck: opt(secondary_colors.surface1), + }, + pager: { + show: opt(true), + background: opt(colors.crust), + button: opt(colors.lavender), + label: opt(colors.overlay2), + }, + scrollbar: { + color: opt(colors.lavender), + width: opt('0.35em'), + radius: opt('0.2em'), + }, + }, + }, + }, + }, + }, + + bar: { + scrollSpeed: opt(5), + layouts: opt({ + '1': { + left: ['dashboard', 'workspaces', 'windowtitle'], + middle: ['media'], + right: ['volume', 'clock', 'notifications'], + }, + '2': { + left: ['dashboard', 'workspaces', 'windowtitle'], + middle: ['media'], + right: ['volume', 'clock', 'notifications'], + }, + '0': { + left: ['dashboard', 'workspaces', 'windowtitle'], + middle: ['media'], + right: ['volume', 'network', 'bluetooth', 'battery', 'systray', 'clock', 'notifications'], + }, + }), + launcher: { + icon: opt('󰣇'), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + windowtitle: { + custom_title: opt(true), + title_map: opt([]), + class_name: opt(true), + label: opt(true), + icon: opt(true), + truncation: opt(true), + truncation_size: opt(50), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + workspaces: { + show_icons: opt(false), + showAllActive: opt(true), + ignored: opt(''), + show_numbered: opt(false), + showWsIcons: opt(false), + numbered_active_indicator: opt('underline'), + icons: { + available: opt(''), + active: opt(''), + occupied: opt(''), + }, + workspaceIconMap: opt({}), + workspaces: opt(10), + spacing: opt(1), + monitorSpecific: opt(true), + hideUnoccupied: opt(true), + workspaceMask: opt(false), + reverse_scroll: opt(false), + scroll_speed: opt(5), + }, + volume: { + label: opt(true), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt('pactl set-sink-volume @DEFAULT_SINK@ +5%'), + scrollDown: opt('pactl set-sink-volume @DEFAULT_SINK@ -5%'), + }, + network: { + truncation: opt(true), + truncation_size: opt(7), + label: opt(true), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + bluetooth: { + label: opt(true), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + battery: { + label: opt(true), + hideLabelWhenFull: opt(false), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + systray: { + ignore: opt([]), + }, + clock: { + icon: opt('󰸗'), + showIcon: opt(true), + showTime: opt(true), + format: opt('%a %b %d %I:%M:%S %p'), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + media: { + show_artist: opt(false), + truncation: opt(true), + show_label: opt(true), + truncation_size: opt(30), + show_active_only: opt(false), + rightClick: opt(''), + middleClick: opt(''), + }, + notifications: { + show_total: opt(false), + hideCountWhenZero: opt(false), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + customModules: { + scrollSpeed: opt(5), + ram: { + icon: opt(''), + label: opt(true), + labelType: opt('percentage'), + round: opt(true), + pollingInterval: opt(2000), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + }, + cpu: { + icon: opt(''), + label: opt(true), + round: opt(true), + pollingInterval: opt(2000), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + storage: { + label: opt(true), + icon: opt('󰋊'), + round: opt(false), + labelType: opt('percentage'), + pollingInterval: opt(2000), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + }, + netstat: { + label: opt(true), + networkInterface: opt(''), + icon: opt('󰖟'), + round: opt(true), + labelType: opt('full'), + rateUnit: opt('auto'), + pollingInterval: opt(2000), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + }, + kbLayout: { + label: opt(true), + labelType: opt('code'), + icon: opt('󰌌'), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + updates: { + updateCommand: opt('$HOME/.config/ags/scripts/checkUpdates.sh -arch'), + label: opt(true), + padZero: opt(true), + icon: opt('󰏖'), + pollingInterval: opt(1000 * 60 * 60 * 6), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + submap: { + label: opt(true), + showSubmapName: opt(true), + enabledIcon: opt('󰌐'), + disabledIcon: opt('󰌌'), + enabledText: opt('Submap On'), + disabledText: opt('Submap off'), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + weather: { + label: opt(true), + unit: opt('imperial'), + leftClick: opt(''), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + power: { + icon: opt(''), + showLabel: opt(true), + leftClick: opt('menu:powerdropdown'), + rightClick: opt(''), + middleClick: opt(''), + scrollUp: opt(''), + scrollDown: opt(''), + }, + }, + }, + + menus: { + transition: opt('crossfade'), + transitionTime: opt(200), + power: { + showLabel: opt(true), + confirmation: opt(true), + sleep: opt('systemctl suspend'), + reboot: opt('systemctl reboot'), + logout: opt('hyprctl dispatch exit'), + shutdown: opt('systemctl poweroff'), + }, + dashboard: { + powermenu: { + confirmation: opt(true), + sleep: opt('systemctl suspend'), + reboot: opt('systemctl reboot'), + logout: opt('hyprctl dispatch exit'), + shutdown: opt('systemctl poweroff'), + avatar: { + image: opt('avatar-default-symbolic'), + name: opt<'system' | string>('system'), + }, + }, + stats: { + enabled: opt(true), + enable_gpu: opt(false), + }, + controls: { + enabled: opt(true), + }, + shortcuts: { + enabled: opt(true), + left: { + shortcut1: { + icon: opt('󰇩'), + tooltip: opt('Microsoft Edge'), + command: opt('microsoft-edge-stable'), + }, + shortcut2: { + icon: opt(''), + tooltip: opt('Spotify'), + command: opt('spotify-launcher'), + }, + shortcut3: { + icon: opt(''), + tooltip: opt('Discord'), + command: opt('discord'), + }, + shortcut4: { + icon: opt(''), + tooltip: opt('Search Apps'), + command: opt('rofi -show drun'), + }, + }, + right: { + shortcut1: { + icon: opt(''), + tooltip: opt('Color Picker'), + command: opt('hyprpicker -a'), + }, + shortcut3: { + icon: opt('󰄀'), + tooltip: opt('Screenshot'), + command: opt('bash -c "$HOME/.config/ags/services/snapshot.sh"'), + }, + }, + }, + directories: { + enabled: opt(true), + left: { + directory1: { + label: opt('󰉍 Downloads'), + command: opt('bash -c "dolphin $HOME/Downloads/"'), + }, + directory2: { + label: opt('󰉏 Videos'), + command: opt('bash -c "dolphin $HOME/Videos/"'), + }, + directory3: { + label: opt('󰚝 Projects'), + command: opt('bash -c "dolphin $HOME/Projects/"'), + }, + }, + right: { + directory1: { + label: opt('󱧶 Documents'), + command: opt('bash -c "dolphin $HOME/Documents/"'), + }, + directory2: { + label: opt('󰉏 Pictures'), + command: opt('bash -c "dolphin $HOME/Pictures/"'), + }, + directory3: { + label: opt('󱂵 Home'), + command: opt('bash -c "dolphin $HOME/"'), + }, + }, + }, + }, + clock: { + time: { + military: opt(false), + hideSeconds: opt(false), + }, + weather: { + enabled: opt(true), + interval: opt(60000), + unit: opt('imperial'), + location: opt('Los Angeles'), + key: opt( + JSON.parse(Utils.readFile(`${App.configDir}/.weather.json`) || '{}')?.weather_api_key || '', + ), + }, + }, + }, + + scalingPriority: opt('gdk'), + + terminal: opt('kitty'), + + tear: opt(false), + + wallpaper: { + enable: opt(true), + image: opt(''), + pywal: opt(false), + }, + + notifications: { + position: opt('top right'), + ignore: opt([]), + displayedTotal: opt(10), + monitor: opt(0), + active_monitor: opt(true), + timeout: opt(7000), + cache_actions: opt(true), + clearDelay: opt(100), + }, + + dummy: opt(true), +}); + +globalThis['options'] = options; +export default options; diff --git a/ags/HyprPanel/package-lock.json b/ags/HyprPanel/package-lock.json new file mode 100644 index 0000000..d15b8fb --- /dev/null +++ b/ags/HyprPanel/package-lock.json @@ -0,0 +1,3089 @@ +{ + "name": "hyprpanel", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hyprpanel", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@types/node": "^22.5.4", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.3.3", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.6.2" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", + "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/type-utils": "8.5.0", + "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", + "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", + "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/utils": "8.5.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/ags/HyprPanel/package.json b/ags/HyprPanel/package.json new file mode 100644 index 0000000..a617f97 --- /dev/null +++ b/ags/HyprPanel/package.json @@ -0,0 +1,29 @@ +{ + "name": "hyprpanel", + "version": "1.0.0", + "description": "A customizble panel built for Hyprland.", + "main": "config.js", + "directories": { + "lib": "lib" + }, + "scripts": { + "lint": "eslint --config .eslintrc.js .", + "lint:fix": "eslint --config .eslintrc.js .", + "format": "prettier --write 'modules/**/*.ts'" + }, + "keywords": [], + "author": "", + "license": "MIT", + "devDependencies": { + "@types/node": "^22.5.4", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.3.3", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.6.2" + } +} diff --git a/ags/HyprPanel/scripts/checkUpdates.sh b/ags/HyprPanel/scripts/checkUpdates.sh new file mode 100755 index 0000000..39bf6ec --- /dev/null +++ b/ags/HyprPanel/scripts/checkUpdates.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +check_arch_updates() { + official_updates=0 + aur_updates=0 + + if [ "$1" = "-y" ]; then + aur_updates=$(yay -Qum 2>/dev/null | wc -l) + elif [ "$1" = "-p" ]; then + official_updates=$(checkupdates 2>/dev/null | wc -l) + else + official_updates=$(checkupdates 2>/dev/null | wc -l) + aur_updates=$(yay -Qum 2>/dev/null | wc -l) + fi + + total_updates=$((official_updates + aur_updates)) + + echo $total_updates +} + +check_ubuntu_updates() { + result=$(apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst) + echo "$result" +} + +check_fedora_updates() { + result=$(dnf check-update -q | grep -v '^Loaded plugins' | grep -v '^No match for' | wc -l) + echo "$result" +} + +case "$1" in +-arch) + check_arch_updates "$2" + ;; +-ubuntu) + check_ubuntu_updates + ;; +-fedora) + check_fedora_updates + ;; +*) + echo "0" + ;; +esac diff --git a/ags/HyprPanel/scripts/fillThemes.js b/ags/HyprPanel/scripts/fillThemes.js new file mode 100644 index 0000000..085d05f --- /dev/null +++ b/ags/HyprPanel/scripts/fillThemes.js @@ -0,0 +1,388 @@ +#!/usr/bin/env node + +/** + * compare_themes.js + * + * A Node.js script to compare theme JSON files against base themes and add missing keys, + * as well as remove any properties that don't exist in the corresponding base theme. + * It assigns values based on matching colors or randomly selects from border colors. + * + * Usage: + * node compare_themes.js [--dry-run] [themes_directory] + * + * If no themes_directory is provided, it defaults to '~/.config/ags/themes'. + */ + +const fs = require('fs'); +const path = require('path'); +const os = require('os'); + +/** + * ANSI color codes for formatting console output. + */ +const COLORS = { + RESET: '\x1b[0m', + FG_RED: '\x1b[31m', + FG_GREEN: '\x1b[32m', + FG_YELLOW: '\x1b[33m', + FG_BLUE: '\x1b[34m', + FG_MAGENTA: '\x1b[35m', + FG_CYAN: '\x1b[36m', + FG_WHITE: '\x1b[37m', + BG_RED: '\x1b[41m', + BG_GREEN: '\x1b[42m', + BG_YELLOW: '\x1b[43m', + BG_BLUE: '\x1b[44m', + BG_MAGENTA: '\x1b[45m', + BG_CYAN: '\x1b[46m', + BG_WHITE: '\x1b[47m', +}; + +/** + * Formats a message with the given color. + * + * @param {string} color - The ANSI color code. + * @param {string} message - The message to format. + * @returns {string} The formatted message. + */ +const formatMessage = (color, message) => `${color}${message}${COLORS.RESET}`; + +/** + * Loads and parses a JSON file. + * + * @param {string} filePath - The path to the JSON file. + * @returns {Object} The parsed JSON object. + */ +const loadJSON = (filePath) => { + try { + const data = fs.readFileSync(filePath, 'utf8'); + return JSON.parse(data); + } catch (error) { + console.error(formatMessage(COLORS.FG_RED, `Error reading or parsing '${filePath}': ${error.message}`)); + process.exit(1); + } +}; + +/** + * Saves a JSON object to a file with indentation. + * + * @param {string} filePath - The path to the JSON file. + * @param {Object} data - The JSON data to save. + */ +const saveJSON = (filePath, data) => { + try { + const jsonString = JSON.stringify(data, null, 2); + fs.writeFileSync(filePath, jsonString, 'utf8'); + } catch (error) { + console.error(formatMessage(COLORS.FG_RED, `Error writing to '${filePath}': ${error.message}`)); + process.exit(1); + } +}; + +/** + * Finds the most common value in an array. + * + * @param {Array} arr - The array to analyze. + * @returns {*} The most common value in the array. + */ +const getMostCommonValue = (arr) => { + const frequency = {}; + let maxFreq = 0; + let mostCommon = arr[0] || null; + + arr.forEach((value) => { + frequency[value] = (frequency[value] || 0) + 1; + if (frequency[value] > maxFreq) { + maxFreq = frequency[value]; + mostCommon = value; + } + }); + + return mostCommon; +}; + +/** + * Compares two JSON objects and finds missing keys in the target. + * + * @param {Object} baseJSON - The base JSON object. + * @param {Object} targetJSON - The target JSON object to compare. + * @returns {Array} An array of missing keys. + */ +const findMissingKeys = (baseJSON, targetJSON) => { + const baseKeys = new Set(Object.keys(baseJSON)); + const targetKeys = new Set(Object.keys(targetJSON)); + + const missingKeys = [...baseKeys].filter((key) => !targetKeys.has(key)); + return missingKeys; +}; + +/** + * Determines if a key should be excluded based on predefined patterns. + * + * @param {string} key - The key to check. + * @returns {boolean} True if the key is excluded, otherwise false. + */ +const isExcludedKey = (key) => { + const excludedPatterns = []; + + return excludedPatterns.some((pattern) => pattern.test(key)); +}; + +/** + * Builds a mapping from values to their corresponding keys in the base theme. + * + * @param {Object} baseJSON - The base JSON object. + * @returns {Object} A map where keys are values and values are arrays of keys. + */ +const buildValueToKeysMap = (baseJSON) => { + const valueToKeysMap = {}; + + Object.entries(baseJSON).forEach(([key, value]) => { + if (!valueToKeysMap[value]) { + valueToKeysMap[value] = []; + } + valueToKeysMap[value].push(key); + }); + + return valueToKeysMap; +}; + +/** + * Collects all border colors from the base theme. + * + * @param {Object} baseJSON - The base JSON object. + * @returns {Array} An array of border color values. + */ +const collectBorderColors = (baseJSON) => { + const borderColors = new Set(); + + Object.entries(baseJSON).forEach(([key, value]) => { + if (/^theme\.bar\.buttons\..*\.border$/.test(key)) { + borderColors.add(value); + } + }); + + return Array.from(borderColors); +}; + +/** + * Determines the best match value for a missing key based on related keys. + * + * @param {string} baseValue - The value of the missing key in the base theme. + * @param {Object} valueToKeysMap - A map from values to keys in the base theme. + * @param {Object} targetJSON - The target JSON object. + * @returns {*} The best matching value or null if a random selection is needed. + */ +const determineBestMatchValue = (baseValue, valueToKeysMap, targetJSON) => { + const relatedBaseKeys = valueToKeysMap[baseValue] || []; + + const correspondingTargetValues = relatedBaseKeys + .map((baseKey) => targetJSON[baseKey]) + .filter((value) => value !== undefined); + + if (correspondingTargetValues.length > 0) { + return getMostCommonValue(correspondingTargetValues); + } + + return null; +}; + +/** + * Finds extra keys in the target JSON that are not present in the base theme. + * + * @param {Object} baseTheme - The base JSON object. + * @param {Object} targetJSON - The target JSON object. + * @returns {Array} An array of extra keys. + */ +const findExtraKeys = (baseTheme, targetJSON) => { + const validKeys = new Set(Object.keys(baseTheme)); + + const targetKeys = Object.keys(targetJSON); + + const extraKeys = targetKeys.filter((key) => !validKeys.has(key) && !isExcludedKey(key)); + + return extraKeys; +}; + +/** + * Creates a backup of a theme file. + * + * @param {string} themePath - The path to the theme file. + */ +const backupTheme = (themePath) => { + const backupDir = path.join(path.dirname(themePath), 'backup'); + if (!fs.existsSync(backupDir)) { + fs.mkdirSync(backupDir); + } + const backupPath = path.join(backupDir, path.basename(themePath)); + fs.copyFileSync(themePath, backupPath); + console.log(formatMessage(COLORS.FG_CYAN, `Backup created at '${backupPath}'.`)); +}; + +/** + * Processes a single theme by adding missing keys and removing extra keys. + * + * @param {string} themePath - The path to the theme file. + * @param {Object} baseTheme - The base JSON object. + * @param {boolean} dryRun - If true, no changes will be written to files. + */ +const processTheme = (themePath, baseTheme, dryRun) => { + const themeJSON = loadJSON(themePath); + const missingKeys = findMissingKeys(baseTheme, themeJSON); + + let hasChanges = false; + + if (missingKeys.length === 0) { + console.log(formatMessage(COLORS.FG_GREEN, `✅ No missing keys in '${path.basename(themePath)}'.`)); + } else { + console.log( + formatMessage( + COLORS.FG_YELLOW, + `\n🔍 Processing '${path.basename(themePath)}': Found ${missingKeys.length} missing key(s).`, + ), + ); + + const valueToKeysMap = buildValueToKeysMap(baseTheme); + const borderColors = collectBorderColors(baseTheme); + + missingKeys.forEach((key) => { + if (isExcludedKey(key)) { + console.log(formatMessage(COLORS.FG_MAGENTA, `❗ Excluded key from addition: "${key}"`)); + return; + } + + const baseValue = baseTheme[key]; + const bestValue = determineBestMatchValue(baseValue, valueToKeysMap, themeJSON); + + if (bestValue !== null) { + themeJSON[key] = bestValue; + console.log(formatMessage(COLORS.FG_GREEN, `➕ Added key: "${key}": "${bestValue}"`)); + } else { + if (borderColors.length === 0) { + console.error(formatMessage(COLORS.FG_RED, '❌ Error: No border colors available to assign.')); + return; + } + const randomColor = borderColors[Math.floor(Math.random() * borderColors.length)]; + themeJSON[key] = randomColor; + console.log( + formatMessage( + COLORS.FG_YELLOW, + `➕ Added key with random border color: "${key}": "${randomColor}"`, + ), + ); + } + + hasChanges = true; + }); + } + + const extraKeys = findExtraKeys(baseTheme, themeJSON); + + if (extraKeys.length === 0) { + console.log(formatMessage(COLORS.FG_GREEN, `✅ No extra keys to remove in '${path.basename(themePath)}'.`)); + } else { + console.log( + formatMessage( + COLORS.FG_YELLOW, + `\n🗑️ Processing '${path.basename(themePath)}': Found ${extraKeys.length} extra key(s) to remove.`, + ), + ); + + extraKeys.forEach((key) => { + delete themeJSON[key]; + console.log(formatMessage(COLORS.FG_RED, `➖ Removed key: "${key}"`)); + hasChanges = true; + }); + } + + if (hasChanges) { + if (dryRun) { + console.log( + formatMessage( + COLORS.FG_CYAN, + `(Dry-Run) 📝 Would update '${path.basename(themePath)}' with missing and extra keys.`, + ), + ); + } else { + backupTheme(themePath); + saveJSON(themePath, themeJSON); + console.log( + formatMessage(COLORS.FG_GREEN, `✅ Updated '${path.basename(themePath)}' with missing and extra keys.`), + ); + } + } else { + console.log(formatMessage(COLORS.FG_BLUE, `ℹ️ No changes made to '${path.basename(themePath)}'.`)); + } +}; + +/** + * The main function that orchestrates the theme comparison and updating. + */ +const main = () => { + const args = process.argv.slice(2); + const dryRunIndex = args.indexOf('--dry-run'); + const dryRun = dryRunIndex !== -1; + if (dryRun) { + args.splice(dryRunIndex, 1); + console.log(formatMessage(COLORS.FG_CYAN, '🔍 Running in Dry-Run mode. No files will be modified.')); + } + + const themesDir = args[0] || path.join(os.homedir(), '.config', 'ags', 'themes'); + + if (!fs.existsSync(themesDir)) { + console.error(formatMessage(COLORS.FG_RED, `❌ Error: Themes directory '${themesDir}' does not exist.`)); + process.exit(1); + } + + const baseThemeFile = 'catppuccin_mocha.json'; + const baseThemeSplitFile = 'catppuccin_mocha_split.json'; + const baseThemePath = path.join(themesDir, baseThemeFile); + const baseThemeSplitPath = path.join(themesDir, baseThemeSplitFile); + + if (!fs.existsSync(baseThemePath)) { + console.error( + formatMessage(COLORS.FG_RED, `❌ Error: Base theme '${baseThemeFile}' does not exist in '${themesDir}'.`), + ); + process.exit(1); + } + + if (!fs.existsSync(baseThemeSplitPath)) { + console.error( + formatMessage( + COLORS.FG_RED, + `❌ Error: Base split theme '${baseThemeSplitFile}' does not exist in '${themesDir}'.`, + ), + ); + process.exit(1); + } + + const baseTheme = loadJSON(baseThemePath); + const baseThemeSplit = loadJSON(baseThemeSplitPath); + + const themeFiles = fs.readdirSync(themesDir).filter((file) => file.endsWith('.json')); + + themeFiles.forEach((file) => { + if (file === baseThemeFile || file === baseThemeSplitFile) { + return; + } + + const themePath = path.join(themesDir, file); + let correspondingBaseTheme; + + if (file.endsWith('_split.json')) { + correspondingBaseTheme = baseThemeSplit; + } else { + correspondingBaseTheme = baseTheme; + } + + try { + processTheme(themePath, correspondingBaseTheme, dryRun); + } catch (error) { + console.error(formatMessage(COLORS.FG_RED, `❌ Error processing '${file}': ${error.message}`)); + } + }); + + console.log(formatMessage(COLORS.FG_GREEN, '\n🎉 All themes have been processed.')); +}; + +main(); diff --git a/ags/HyprPanel/scripts/fillThemes.sh b/ags/HyprPanel/scripts/fillThemes.sh new file mode 100755 index 0000000..8684653 --- /dev/null +++ b/ags/HyprPanel/scripts/fillThemes.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +# Generated by our good friend Chat Jippity +# Might be inefficient but it works + +# Define directories and theme files +THEMES_DIR="$(dirname "$(realpath "$0")")/../themes" +COMPLETE_THEME_FILE="catppuccin_mocha.json" +COMPLETE_SPLIT_THEME_FILE="catppuccin_mocha_split.json" + +# Check if jq is installed +if ! command -v jq &>/dev/null; then + echo "jq is required but not installed. Please install jq and try again." + exit 1 +fi + +# Function to fill missing values +fill_missing_values() { + local complete_theme_file="$1" + local target_theme_file="$2" + + # Load complete theme and target theme into variables + complete_theme=$(jq '.' "$complete_theme_file") + target_theme=$(jq '.' "$target_theme_file") + + # Create associative arrays to map colors to properties for fast lookup + declare -A color_to_props + declare -A prop_to_color + + # Populate color_to_props and prop_to_color arrays from complete theme + while IFS= read -r line; do + key=$(echo "$line" | awk '{print $1}') + value=$(echo "$line" | awk '{print $2}') + color_to_props["$value"]+="$key " + prop_to_color["$key"]="$value" + done < <(echo "$complete_theme" | jq -r 'to_entries[] | "\(.key) \(.value)"') + + # Generate filled theme by iterating over complete theme keys + filled_theme="$target_theme" + for key in "${!prop_to_color[@]}"; do + if ! echo "$target_theme" | jq -e ".\"$key\"" &>/dev/null; then + # Find corresponding color if missing in target theme + value="${prop_to_color[$key]}" + corresponding_color="" + + # Check if other properties with the same color exist in the target theme + for prop in ${color_to_props["$value"]}; do + if echo "$target_theme" | jq -e ".\"$prop\"" &>/dev/null; then + corresponding_color=$(echo "$target_theme" | jq -r ".\"$prop\"") + break + fi + done + + # Add missing property with the corresponding color + if [ -n "$corresponding_color" ]; then + filled_theme=$(echo "$filled_theme" | jq --arg key "$key" --arg value "$corresponding_color" '.[$key] = $value') + echo "Added missing property: $key with value: $corresponding_color to $target_theme_file" + else + # Default action if no corresponding color is found + echo "No corresponding color found for $key; using value from complete theme." + filled_theme=$(echo "$filled_theme" | jq --arg key "$key" --arg value "$value" '.[$key] = $value') + fi + fi + done + + # Write the filled theme back to the target file + echo "$filled_theme" >"$target_theme_file" + echo "Filled missing values in $target_theme_file" +} + +# Process all theme files in the directory +for file in "$THEMES_DIR"/*.json; do + filename=$(basename "$file") + + # Skip the complete theme files + if [[ "$filename" == "$COMPLETE_THEME_FILE" ]] || [[ "$filename" == "$COMPLETE_SPLIT_THEME_FILE" ]]; then + continue + fi + + # Determine whether to use split or non-split complete theme + if [[ "$filename" == *"_split"* ]]; then + fill_missing_values "$THEMES_DIR/$COMPLETE_SPLIT_THEME_FILE" "$file" + else + fill_missing_values "$THEMES_DIR/$COMPLETE_THEME_FILE" "$file" + fi +done diff --git a/ags/HyprPanel/scss/main.scss b/ags/HyprPanel/scss/main.scss new file mode 100644 index 0000000..49328f9 --- /dev/null +++ b/ags/HyprPanel/scss/main.scss @@ -0,0 +1,54 @@ +* { + all: unset; + font-family: $font-name; + font-size: $font-size; + font-weight: $font-weight; +} + +//general +@import "style/colors"; +@import "style/common/common.scss"; +@import "style/common/floating-widget.scss"; +@import "style/common/widget-button.scss"; + +//general styles +@import "style/common/general"; + +//modules - bar +@import "style/bar/bar"; +@import "style/bar/menu"; +@import "style/bar/audio"; +@import "style/bar/media"; +@import "style/bar/network"; +@import "style/bar/bluetooth"; +@import "style/bar/clock"; +@import "style/bar/workspace"; +@import "style/bar/window_title"; +@import "style/bar/systray"; +@import "style/bar/notifications"; +@import "style/bar/power"; +@import "style/bar/battery"; + +//modules - menus +@import "style/menus/menu"; +@import "style/menus/power"; +@import "style/menus/powerdropdown"; +@import "style/menus/audiomenu"; +@import "style/menus/network"; +@import "style/menus/bluetooth"; +@import "style/menus/media"; +@import "style/menus/notifications"; +@import "style/menus/calendar"; +@import "style/menus/energy"; +@import "style/menus/dashboard"; + +//notifications +@import "style/notifications/popups"; + +//osd +@import "style/osd/index"; + +//settings dialog +@import "style/settings/dialog"; + +@import "style/customModules/style"; diff --git a/ags/HyprPanel/scss/optionsTrackers.ts b/ags/HyprPanel/scss/optionsTrackers.ts new file mode 100644 index 0000000..ef360de --- /dev/null +++ b/ags/HyprPanel/scss/optionsTrackers.ts @@ -0,0 +1,58 @@ +import icons from 'lib/icons'; +import { bash, dependencies, Notify, isAnImage } from 'lib/utils'; +import options from 'options'; +import Wallpaper from 'services/Wallpaper'; + +const { matugen } = options.theme; +const { mode, scheme_type, contrast } = options.theme.matugen_settings; + +const ensureMatugenWallpaper = (): void => { + const wallpaperPath = options.wallpaper.image.value; + + if (matugen.value && (!options.wallpaper.image.value.length || !isAnImage(wallpaperPath))) { + Notify({ + summary: 'Matugen Failed', + body: "Please select a wallpaper in 'Theming > General' first.", + iconName: icons.ui.warning, + timeout: 7000, + }); + matugen.value = false; + } +}; + +export const initializeTrackers = (resetCssFunc: () => void): void => { + matugen.connect('changed', () => { + ensureMatugenWallpaper(); + options.resetTheme(); + }); + + mode.connect('changed', () => { + options.resetTheme(); + }); + scheme_type.connect('changed', () => { + options.resetTheme(); + }); + contrast.connect('changed', () => { + options.resetTheme(); + }); + + Wallpaper.connect('changed', () => { + console.info('Wallpaper changed, regenerating Matugen colors...'); + if (options.theme.matugen.value) { + options.resetTheme(); + resetCssFunc(); + } + }); + + options.wallpaper.image.connect('changed', () => { + if ((!Wallpaper.isRunning() && options.theme.matugen.value) || !options.wallpaper.enable.value) { + console.info('Wallpaper path changed, regenerating Matugen colors...'); + options.resetTheme(); + resetCssFunc(); + } + if (options.wallpaper.pywal.value && dependencies('wal')) { + const wallpaperPath = options.wallpaper.image.value; + bash(`wal -i ${wallpaperPath}`); + } + }); +}; diff --git a/ags/HyprPanel/scss/style.ts b/ags/HyprPanel/scss/style.ts new file mode 100644 index 0000000..0679506 --- /dev/null +++ b/ags/HyprPanel/scss/style.ts @@ -0,0 +1,79 @@ +import options from 'options'; +import { bash, dependencies } from 'lib/utils'; +import { MatugenColors, RecursiveOptionsObject } from 'lib/types/options'; +import { initializeTrackers } from './optionsTrackers'; +import { generateMatugenColors, replaceHexValues } from '../services/matugen/index'; +import { isHexColor } from 'globals/variables'; + +const deps = ['font', 'theme', 'bar.flatButtons', 'bar.position', 'bar.battery.charging', 'bar.battery.blocks']; + +function extractVariables(theme: RecursiveOptionsObject, prefix = '', matugenColors?: MatugenColors): string[] { + let result = [] as string[]; + for (const key in theme) { + if (!theme.hasOwnProperty(key)) { + continue; + } + + const themeValue = theme[key]; + + const newPrefix = prefix ? `${prefix}-${key}` : key; + + const replacedValue = + isHexColor(themeValue.value) && matugenColors !== undefined + ? replaceHexValues(themeValue.value, matugenColors) + : themeValue.value; + + if (typeof themeValue === 'function') { + result.push(`$${newPrefix}: ${replacedValue};`); + continue; + } + if (typeof themeValue !== 'object' || themeValue === null || Array.isArray(themeValue)) continue; + + if (typeof themeValue.value !== 'undefined') { + result.push(`$${newPrefix}: ${replacedValue};`); + } else { + result = result.concat(extractVariables(themeValue, newPrefix, matugenColors)); + } + } + + return result; +} + +const resetCss = async (): Promise => { + if (!dependencies('sass')) return; + + try { + const matugenColors = await generateMatugenColors(); + + const variables = extractVariables(options.theme as RecursiveOptionsObject, '', matugenColors); + + const vars = `${TMP}/variables.scss`; + const css = `${TMP}/main.css`; + const scss = `${TMP}/entry.scss`; + const localScss = `${App.configDir}/scss/main.scss`; + + const themeVariables = variables; + const integratedVariables = themeVariables; + + const imports = [vars].map((f) => `@import '${f}';`); + + await Utils.writeFile(integratedVariables.join('\n'), vars); + + let mainScss = Utils.readFile(localScss); + mainScss = `${imports}\n${mainScss}`; + + await Utils.writeFile(mainScss, scss); + + await bash(`sass --load-path=${App.configDir}/scss/ ${scss} ${css}`); + + App.applyCss(css, true); + } catch (error) { + console.error(error); + } +}; + +initializeTrackers(resetCss); + +Utils.monitorFile(`${App.configDir}/scss/style`, resetCss); +options.handler(deps, resetCss); +await resetCss(); diff --git a/ags/HyprPanel/scss/style/bar/audio.scss b/ags/HyprPanel/scss/style/bar/audio.scss new file mode 100644 index 0000000..10e1a9d --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/audio.scss @@ -0,0 +1,59 @@ +.bar-button-icon.volume { + font-size: 1.3em; + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-volume-icon); +} + +.bar-button-label.volume { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-volume-text); + min-width: 2.2em; + margin-left: $bar-buttons-volume-spacing; +} + +.style2 { + .bar-button-icon.volume { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-volume-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-volume-spacing; + border-top-left-radius: if( + $bar-buttons-volume-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-volume-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .bar-button-label.volume { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-volume-spacing; + margin-left: 0em; + } + &.no-label.volume-container { + .bar-button-icon.volume { + border-top-right-radius: if( + $bar-buttons-volume-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-volume-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} +.bar_item_box_visible.volume { + border: if( + $bar-buttons-volume-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-volume-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/bar.scss b/ags/HyprPanel/scss/style/bar/bar.scss new file mode 100644 index 0000000..74bc27c --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/bar.scss @@ -0,0 +1,156 @@ +.bar { + * { + font-size: $font-size * $bar-scaling * 0.01; + } + + .bar-panel-container { + margin-top: if($bar-floating, $bar-margin_top, 0em); + margin-bottom: if($bar-floating, $bar-margin_bottom, 0em); + margin-left: if($bar-floating, $bar-margin_sides, 0em); + margin-right: if($bar-floating, $bar-margin_sides, 0em); + } + + .bar-panel { + $bar-opacity-ratio: $bar-opacity * 0.01; + $transparency-value: 1 - $bar-opacity-ratio; + background: if($bar-transparent, transparent, transparentize($bar-background, $transparency-value)); + border-radius: if($bar-floating, $bar-border_radius, 0em); + } +} + +$bar-button-background-opacity-ratio: $bar-buttons-background_opacity * 0.01; +$transparency-value: 1 - $bar-button-background-opacity-ratio; + +$bar-button-background-hover-opacity-ratio: $bar-buttons-background_hover_opacity * 0.01; +$transparency-value-hover: 1 - $bar-button-background-hover-opacity-ratio; + +.bar_item_box_visible { + background-color: transparentize($bar-buttons-background, $transparency-value); + border-radius: $bar-buttons-radius; + margin: $bar-buttons-y_margins $bar-buttons-spacing; + opacity: $bar-buttons-opacity * 0.01; + padding: $bar-buttons-padding_y $bar-buttons-padding_x; + + &.style3 { + border-bottom-left-radius: 1.3em; + border-top-right-radius: 1.3em; + } + + &.style4 { + border-bottom-right-radius: 1.3em; + border-top-left-radius: 1.3em; + } + + &:hover { + opacity: $bar-buttons-background_hover_opacity * 0.01; + } + + &.battery { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-battery-background), + $transparency-value + ); + } + + &.bluetooth { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-bluetooth-background), + $transparency-value + ); + } + + &.clock { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-clock-background), + $transparency-value + ); + } + + &.media { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-media-background), + $transparency-value + ); + } + + &.dashboard { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-dashboard-background), + $transparency-value + ); + } + + &.network { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-network-background), + $transparency-value + ); + } + + &.notifications { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-notifications-background), + $transparency-value + ); + } + + &.systray { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-systray-background), + $transparency-value + ); + &:hover { + opacity: 1; + } + } + + &.volume { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-volume-background), + $transparency-value + ); + } + + &.windowtitle { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-windowtitle-background), + $transparency-value + ); + } + + &.workspaces { + background-color: transparentize( + if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-workspaces-background), + $transparency-value + ); + &:hover { + opacity: 1; + } + } + + &.style2 { + padding: 0em; + } +} + +.no-label.style2 { + .bar-button-icon { + border-top-right-radius: $bar-buttons-radius; + border-bottom-right-radius: $bar-buttons-radius; + } +} + +.bar_item_box_hidden { + background: none; + border-radius: 0rem; + padding: 0rem 0rem 0rem 0rem; + margin: 0rem 0rem 0rem 0rem; +} + +.box-left { + margin-left: $bar-outer_spacing; +} + +.box-right { + margin-right: $bar-outer_spacing; +} diff --git a/ags/HyprPanel/scss/style/bar/battery.scss b/ags/HyprPanel/scss/style/bar/battery.scss new file mode 100644 index 0000000..f1b449a --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/battery.scss @@ -0,0 +1,63 @@ +.bar-button-label.battery { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-battery-text); + margin-left: $bar-buttons-battery-spacing; +} + +.bar-button-icon.battery { + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-battery-icon); +} + +.style2 { + .bar-button-icon.battery { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-battery-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-battery-spacing; + border-top-left-radius: if( + $bar-buttons-battery-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-battery-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + + &:last-child { + border-radius: $bar-buttons-radius; + } + } + + .bar-button-label.battery { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-battery-spacing; + margin-left: 0em; + } + &.no-label.battery-container { + .bar-button-icon.battery { + border-top-right-radius: if( + $bar-buttons-battery-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-battery-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} + +.bar_item_box_visible.battery { + border: if( + $bar-buttons-battery-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-battery-border), + 0em + ); +} + diff --git a/ags/HyprPanel/scss/style/bar/bluetooth.scss b/ags/HyprPanel/scss/style/bar/bluetooth.scss new file mode 100644 index 0000000..f641765 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/bluetooth.scss @@ -0,0 +1,70 @@ +.bar-button-icon.bluetooth { + font-size: 1.15em; + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-bluetooth-icon); +} + +.bar-button-label.bluetooth { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-bluetooth-text); + margin-left: $bar-buttons-bluetooth-spacing; +} + +.bluetooth-disabled-menu { + font-weight: bold; + font-size: 1.1rem; + color: $surface2; + margin: 6rem 0rem; +} + +.menu-button-isactive { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-bluetooth-text); +} + +.style2 { + .bar-button-icon.bluetooth { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-bluetooth-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-bluetooth-spacing; + border-top-left-radius: if( + $bar-buttons-bluetooth-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-bluetooth-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .bar-button-label.bluetooth { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-bluetooth-spacing; + margin-left: 0em; + } + &.no-label.bluetooth-container { + .bar-button-icon.bluetooth { + border-top-right-radius: if( + $bar-buttons-bluetooth-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-bluetooth-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} + +.bar_item_box_visible.bluetooth { + border: if( + $bar-buttons-bluetooth-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-bluetooth-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/clock.scss b/ags/HyprPanel/scss/style/bar/clock.scss new file mode 100644 index 0000000..c861ce7 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/clock.scss @@ -0,0 +1,59 @@ +.bar-button-label.clock { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-clock-text); + margin-left: $bar-buttons-clock-spacing; +} + +.bar-button-icon.clock { + font-size: 1.2em; + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-clock-icon); +} + +.style2 { + .bar-button-icon.clock { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-clock-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-clock-spacing; + border-top-left-radius: if( + $bar-buttons-clock-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-clock-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .bar-button-label.clock { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-clock-spacing; + margin-left: 0em; + } + &.no-label.clock-container { + .bar-button-icon.clock { + border-top-right-radius: if( + $bar-buttons-clock-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-clock-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} + +.bar_item_box_visible.clock { + border: if( + $bar-buttons-clock-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-clock-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/media.scss b/ags/HyprPanel/scss/style/bar/media.scss new file mode 100644 index 0000000..95e8b49 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/media.scss @@ -0,0 +1,43 @@ +.bar-button-label.media { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-media-text); + margin-left: $bar-buttons-media-spacing; +} + +.bar-button-icon.media { + font-size: 1.2em; + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-media-icon); +} + +.style2 { + .bar-button-icon.media { + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-media-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-media-spacing; + border-top-left-radius: if( + $bar-buttons-media-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-media-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .bar-button-label.media { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-media-spacing; + margin-left: 0em; + } +} + +.bar_item_box_visible.media { + border: if( + $bar-buttons-media-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-media-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/menu.scss b/ags/HyprPanel/scss/style/bar/menu.scss new file mode 100644 index 0000000..224956e --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/menu.scss @@ -0,0 +1,25 @@ +.bar-menu_label { + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-dashboard-icon); + font-size: 1.3em; + border-radius: $bar-buttons-radius; +} + +.bar_item_box_visible.style2.dashboard { + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-dashboard-background); + + .bar-menu_label { + color: if($bar-buttons-monochrome, $bar-buttons-background, $bar-buttons-dashboard-icon); + } +} + +.style2 .bar-menu_label { + padding: $bar-buttons-padding_y $bar-buttons-padding_x; +} + +.bar_item_box_visible.dashboard { + border: if( + $bar-buttons-dashboard-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-dashboard-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/network.scss b/ags/HyprPanel/scss/style/bar/network.scss new file mode 100644 index 0000000..a2b02c4 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/network.scss @@ -0,0 +1,58 @@ +.bar-button-label.network-label { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-network-text); + margin-left: $bar-buttons-network-spacing; +} + +.bar-button-icon.network-icon { + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-network-icon); +} + +.style2 { + .bar-button-icon.network-icon { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-network-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-network-spacing; + border-top-left-radius: if( + $bar-buttons-network-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-network-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .bar-button-label.network-label { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-network-spacing; + margin-left: 0em; + } + &.no-label.network-container { + .bar-button-icon.network-icon { + border-top-right-radius: if( + $bar-buttons-network-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-network-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} + +.bar_item_box_visible.network { + border: if( + $bar-buttons-network-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-network-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/notifications.scss b/ags/HyprPanel/scss/style/bar/notifications.scss new file mode 100644 index 0000000..5818a26 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/notifications.scss @@ -0,0 +1,66 @@ +.bar-button-icon.notifications { + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-notifications-icon); + font-size: 1.3em; +} + +.bar-button-label.notifications { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-notifications-total); + margin-left: $bar-buttons-notifications-spacing; + min-width: 1em; +} + +.style2 { + .bar-button-icon.notifications { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-notifications-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-notifications-spacing; + border-top-left-radius: if( + $bar-buttons-notifications-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-notifications-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-notifications-icon); + + &:last-child { + border-radius: $bar-buttons-radius; + } + } + + .bar-button-label.notifications { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-notifications-spacing; + margin-left: 0em; + } + + &.no-label.notifications-container { + .bar-button-icon.notifications { + border-top-right-radius: if( + $bar-buttons-notifications-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-notifications-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} + +.bar_item_box_visible.notifications { + border: if( + $bar-buttons-notifications-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-notifications-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/power.scss b/ags/HyprPanel/scss/style/bar/power.scss new file mode 100644 index 0000000..e872b0f --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/power.scss @@ -0,0 +1,4 @@ +.bar-power_label { + color: $red; + margin-top: 0.2rem; +} diff --git a/ags/HyprPanel/scss/style/bar/systray.scss b/ags/HyprPanel/scss/style/bar/systray.scss new file mode 100644 index 0000000..f135d24 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/systray.scss @@ -0,0 +1,19 @@ +.systray button:not(:first-child) { + margin-left: $bar-buttons-systray-spacing; +} + +.systray-icon { + font-size: 1.3em; +} + +.style2.systray { + padding: $bar-buttons-padding_y $bar-buttons-padding_x; +} + +.bar_item_box_visible.systray { + border: if( + $bar-buttons-systray-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-systray-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/window_title.scss b/ags/HyprPanel/scss/style/bar/window_title.scss new file mode 100644 index 0000000..0fd422c --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/window_title.scss @@ -0,0 +1,66 @@ +.bar-button-icon.windowtitle { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-windowtitle-icon); +} + +.bar-button-label.windowtitle { + color: if($bar-buttons-monochrome, $bar-buttons-text, $bar-buttons-windowtitle-text); + margin-left: $bar-buttons-windowtitle-spacing; + + &.no-icon { + margin-left: 0; + } +} + +.style2 { + .bar-button-icon.windowtitle { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + background: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-windowtitle-icon_background); + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: $bar-buttons-windowtitle-spacing; + border-top-left-radius: if( + $bar-buttons-windowtitle-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $bar-buttons-windowtitle-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .bar-button-label.windowtitle { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: $bar-buttons-windowtitle-spacing; + margin-left: 0em; + + &.no-icon { + padding-left: $bar-buttons-padding_x; + } + } + &.no-label.windowtitle-container { + .bar-button-icon.windowtitle { + border-top-right-radius: if( + $bar-buttons-windowtitle-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $bar-buttons-windowtitle-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } +} + +.bar_item_box_visible.windowtitle { + border: if( + $bar-buttons-windowtitle-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-windowtitle-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/bar/workspace.scss b/ags/HyprPanel/scss/style/bar/workspace.scss new file mode 100644 index 0000000..967cc74 --- /dev/null +++ b/ags/HyprPanel/scss/style/bar/workspace.scss @@ -0,0 +1,92 @@ +.workspaces { + label { + font-size: 0.2em; + min-width: 4em; + min-height: 4em; + border-radius: 1.9rem * 0.6; + transition: 300ms * 0.5; + background-color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-available); + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-available); + + &.occupied { + background-color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-occupied); + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-occupied); + min-width: 4em; + min-height: 4em; + } + + &.active { + color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-active); + background-color: if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-active); + min-width: 12em; + min-height: 4em; + } + + &.workspace-icon { + background-color: transparent; + min-width: 0em; + min-height: 0em; + border-radius: 0em; + transition: 300ms * 0.5; + font-size: 1em; + } + + &.workspace-number { + background-color: transparent; + min-width: 0em; + min-height: 0em; + border-radius: 0em; + transition: 0ms; + padding: 0em 0.2em; + font-size: $bar-buttons-workspaces-fontSize; + } + + &.underline { + border-top: 0.1em solid transparent; + border-bottom: 0.1em solid $bar-buttons-workspaces-numbered_active_underline_color; + transition: 0ms; + } + + &.highlight { + transition: 0ms; + color: $bar-buttons-workspaces-numbered_active_highlighted_text_color; + border-radius: $bar-buttons-workspaces-numbered_active_highlight_border; + background-color: $bar-buttons-workspaces-active; + padding: 0em $bar-buttons-workspaces-numbered_active_highlight_padding; + } + } +} + +.workspace-button { + &:hover label { + color: $bar-buttons-workspaces-hover; + + &.default { + background-color: $bar-buttons-workspaces-hover; + } + } + + &:hover .can_underline { + border-top: 0.1em solid transparent; + border-bottom: 0.1em solid + if($bar-buttons-monochrome, $bar-buttons-workspaces-hover, $bar-buttons-workspaces-hover); + } + + &:hover .can_highlight { + background-color: $bar-buttons-workspaces-hover; + color: $bar-buttons-workspaces-numbered_active_highlighted_text_color; + border-radius: $bar-buttons-workspaces-numbered_active_highlight_border; + } +} + +.style2.workspaces { + padding: $bar-buttons-padding_y $bar-buttons-padding_x; +} + +.bar_item_box_visible.workspaces { + border: if( + $bar-buttons-workspaces-enableBorder or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $bar-buttons-workspaces-border), + 0em + ); +} diff --git a/ags/HyprPanel/scss/style/colors.scss b/ags/HyprPanel/scss/style/colors.scss new file mode 100644 index 0000000..a117726 --- /dev/null +++ b/ags/HyprPanel/scss/style/colors.scss @@ -0,0 +1,52 @@ +$primary-color: #CDD6F4; +$dark-background: #0e0e1e; +$light-background: #1e1e2e; +$mauve: #cba6f7; +$red: #f38ba8; +$yellow: #f9e2af; +$orange: #fab387; +$teal: #94e2d5; +$lightteal: #bac2de; +$pink: #f5c2e7; +$green: #a6e3a1; +$grey: #585b70; +$blue: #89b4fa; +$lightgrey: #a6adc8; +$lightblue: #74c7ec; + +$rosewater: #f5e0dc; +$flamingo: #f2cdcd; +$pink: #f5c2e7; +$mauve: #cba6f7; +$red: #f38ba8; +$maroon: #eba0ac; +$peach: #fab387; +$yellow: #f9e2af; +$green: #a6e3a1; +$teal: #94e2d5; +$sky: #89dceb; +$sapphire: #74c7ec; +$blue: #89b4fa; +$lavender: #b4befe; +$text: #cdd6f4; +$subtext1: #bac2de; +$subtext2: #a6adc8; +$overlay2: #9399b2; +$overlay1: #7f849c; +$overlay0: #6c7086; +$surface2: #585b70; +$surface1: #45475a; +$surface0: #313244; +$base: #1e1e2e; +$base2: #242438; +$mantle: #181825; +$crust: #11111b; + +$default_fg: $primary-color; +$default_bg: #000000; +$primary_bg: $dark-background; +// $primary_fg: mix($mauve, $primary_bg, 70%); +$primary_fg: mix($mauve, $primary_bg, 70%); +$secondary_fg: $green; +$secondary_bg: $light-background; +$shadow-color: #1e1e2e; diff --git a/ags/HyprPanel/scss/style/common/common.scss b/ags/HyprPanel/scss/style/common/common.scss new file mode 100644 index 0000000..38180fb --- /dev/null +++ b/ags/HyprPanel/scss/style/common/common.scss @@ -0,0 +1,234 @@ +@import "../colors"; + +menu { + margin: 6px; + padding: 6px; + background-color: $primary_bg; + background-clip: border-box; + border-radius: 12px; + border: 1px solid $secondary_bg; + + menuitem { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + min-height: 20px; + min-width: 40px; + padding: 4px 8px; + color: #FFFFFF; + font: initial; + text-shadow: none; + border-radius: 6px; + + &:hover, + &:active { + background-color: $secondary_bg; + } + + &:disabled { + color: $secondary_bg; + } + + arrow { + min-height: 16px; + min-width: 16px; + -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); + margin-left: 8px; + } + } + + separator { + min-height: 1px; + margin: 4px 0; + background-color: $secondary_bg + } +} + +menu>arrow { + min-height: 16px; + min-width: 16px; + padding: 4px; + color: $secondary_bg; +} + +menu>arrow.top { + margin-top: 0; + border-radius: 6px; + -gtk-icon-source: -gtk-icontheme("pan-up-symbolic"); +} + +menu>arrow.bottom { + margin-top: 8px; + margin-bottom: -12px; + border-radius: 6px; + -gtk-icon-source: -gtk-icontheme("pan-down-symbolic"); +} + +check, +radio { + min-height: 15px; + min-width: 15px; + margin: 4px; + padding: 0; + color: transparent; + background-color: $secondary_bg; + transition: all 75ms cubic-bezier(0, 0, 0.2, 1), box-shadow 150ms cubic-bezier(0, 0, 0.2, 1); +} + +radio { + border-radius: 9999px; +} + +check { + border-radius: 4px; +} + +check:hover, +radio:hover { + box-shadow: 0 0 0 4px transparentize($primary_bg, 0.8); + background-color: $primary_bg; +} + +check:active, +radio:active { + box-shadow: 0 0 0 4px transparentize($primary_bg, 0.8); + background-color: $primary_bg; +} + +check:checked, +check:indeterminate, +radio:checked, +radio:indeterminate { + color: $primary_bg; + background-color: $primary_fg; +} + +check:checked:hover, +check:indeterminate:hover, +radio:checked:hover, +radio:indeterminate:hover { + box-shadow: 0 0 0 4px transparentize($primary_fg, 0.8); + background-color: $primary_fg; +} + +check:checked:active, +check:indeterminate:active, +radio:checked:active, +radio:indeterminate:active { + box-shadow: 0 0 0 4px transparentize($primary_fg, 0.8); + background-color: $primary_fg; +} + +switch { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + margin: 4px 0; + border: none; + border-radius: 9999px; + background-color: $secondary_bg; + background-clip: padding-box; + font-size: 0; + color: transparent; +} + +switch:checked { + background-color: $primary_fg; +} + +switch:disabled { + opacity: 0.5; +} + +switch slider { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + min-width: 18px; + min-height: 18px; + margin: 3px; + border-radius: 9999px; + outline: none; + background-color: $default_fg; + border: none; + color: transparent; +} + +scale { + min-height: 2px; + min-width: 2px; +} + +scale.horizontal { + padding: 17px 12px; +} + +scale.vertical { + padding: 12px 17px; +} + +scale slider { + min-height: 18px; + min-width: 18px; + margin: -8px; +} + +scale trough { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + outline: none; + background-color: $secondary_bg; +} + +scale highlight { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); + background-color: $primary_fg; +} + +scale highlight:disabled { + background-color: #1e1e2e; +} + +scale fill { + transition: background-color 75ms cubic-bezier(0, 0, 0.2, 1); +} + +scale fill:disabled { + background-color: transparent; +} + +scale slider { + transition: all 75ms cubic-bezier(0, 0, 0.2, 1); + border-radius: 9999px; + color: $primary_fg; + background-color: $primary_bg; + box-shadow: inset 0 0 0 2px $primary_fg; +} + +scale slider:hover { + box-shadow: inset 0 0 0 2px $primary_fg, 0 0 0 8px transparentize($primary_fg, 0.9); +} + +scale slider:active { + box-shadow: inset 0 0 0 4px $primary_fg, 0 0 0 8px transparentize($primary_fg, 0.9); +} + +tooltip { + box-shadow: none; +} + +separator { + min-width: 1px; + min-height: 1px; + background-color: $secondary_bg; +} + +@keyframes spin { + to { + -gtk-icon-transform: rotate(1turn); + } +} + +spinner { + background: none; + opacity: 0; + -gtk-icon-source: -gtk-icontheme("process-working-symbolic"); +} + +spinner:checked { + opacity: 1; + animation: spin 1s linear infinite; +} diff --git a/ags/HyprPanel/scss/style/common/floating-widget.scss b/ags/HyprPanel/scss/style/common/floating-widget.scss new file mode 100644 index 0000000..e1a9da4 --- /dev/null +++ b/ags/HyprPanel/scss/style/common/floating-widget.scss @@ -0,0 +1,10 @@ +@import "../colors"; + +@mixin floating-widget { + margin: max($spacing, 8px); + border: 0.2rem solid $surface0; + background-color: $base; + color: $primary_fg; + border-radius: 0.5rem; + padding: 1.5rem; +} diff --git a/ags/HyprPanel/scss/style/common/general.scss b/ags/HyprPanel/scss/style/common/general.scss new file mode 100644 index 0000000..da7ee41 --- /dev/null +++ b/ags/HyprPanel/scss/style/common/general.scss @@ -0,0 +1,79 @@ +@import '../colors.scss'; + +.txt-icon { + font-family: "JetBrainsMono Nerd Font Propo", monospace; + font-size: 1.5em; + + &.bluetooth { + font-size: 1em; + } + + &.playback { + font-size: 1.3em; + } + + &.input { + font-size: 1.3em; + } +} + +.bar.txt-icon { + font-family: "JetBrainsMono Nerd Font Propo", monospace; + font-size: 1.2em; +} + +window.popup { + opacity: $bar-menus-opacity * 0.01; + + menuitem { + label { + color: $bar-menus-popover-text; + } + + &:hover { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-text, $bar-menus-popover-text), 0.6); + } + } + + menu { + border-color: $bar-menus-popover-border; + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-popover-background); + } + + separator { + + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-text, $bar-menus-popover-text), 0.7); + min-height: 0.075em; + } + + arrow { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-popover-text); + } +} + +tooltip { + * { + all: unset; + } + + opacity: $bar-menus-opacity * 0.01; + + font-size: 1.1em; + + >*>* { + padding: 0.6em; + border-radius: $bar-menus-border-radius * 0.5; + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-tooltip-text); + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-tooltip-background); + } +} + +check:not(:checked) { + background-color: $bar-menus-check_radio_button-background; + border: 1px solid $bar-menus-check_radio_button-active; +} + +check:checked { + background-color: $bar-menus-check_radio_button-active; + border: 1px solid $bar-menus-check_radio_button-background; +} diff --git a/ags/HyprPanel/scss/style/common/widget-button.scss b/ags/HyprPanel/scss/style/common/widget-button.scss new file mode 100644 index 0000000..657db61 --- /dev/null +++ b/ags/HyprPanel/scss/style/common/widget-button.scss @@ -0,0 +1,52 @@ +$popover-padding: 7px * 1.6; +$padding: 7px; +$spacing: 12px; +$radius: 11px; + +.widget-button { + background: $crust; + opacity: 1; + font-size: 1.6rem; + font-weight: bold; + margin: 10px; + padding: 15px 20px; + border-radius: 10px; + border: 3px solid; + border-color: $crust; + transition: border-color .3s ease-in-out; + transition: opacity .3s ease-in-out; + + &:hover { + border: 3px solid; + border-color: $lavender; + transition: border-color .3s ease-in-out; + } + + &:focus, + &:active { + border: 3px solid; + border-color: $lavender; + } + + image { + border-radius: $radius + ($popover-padding * 1.4); + min-width: 1.2em; + min-height: 1.2em; + font-size: 4em; + } + + label { + margin-top: $spacing; + } + + &:active { + image { + opacity: .3; + transition: opacity .3s ease-in-out; + } + label { + opacity: .3; + transition: opacity .3s ease-in-out; + } + } +} diff --git a/ags/HyprPanel/scss/style/customModules/style.scss b/ags/HyprPanel/scss/style/customModules/style.scss new file mode 100644 index 0000000..1522e8a --- /dev/null +++ b/ags/HyprPanel/scss/style/customModules/style.scss @@ -0,0 +1,366 @@ +/* + * ################################# + * # Default Styling # + * ################################# + */ +.bar-button-label { + margin-left: 0.5em; + color: $text; +} + +.module-icon { + font-size: 1em; +} + +.style2 { + .bar-button-icon { + border-top-left-radius: $bar-buttons-radius; + border-bottom-left-radius: $bar-buttons-radius; + padding: $bar-buttons-padding_y 0em; + padding-left: $bar-buttons-padding_x; + padding-right: 0.5em; + background: $text; + color: $bar-background; + } + + .bar-button-label { + padding: $bar-buttons-padding_y 0em; + padding-right: $bar-buttons-padding_x; + padding-left: 0.5em; + margin-left: 0em; + } +} + +/* + * ################################# + * # Styling Function # + * ################################# + */ +@mixin styleModule( + $class, + $textColor, + $iconColor, + $iconBackground, + $labelBackground, + $spacing, + $borderEnabled, + $borderColor, + $fontSize: 1em +) { + $bar-button-background-opacity-ratio: $bar-buttons-background_opacity * 0.01; + $transparency-value: 1 - $bar-button-background-opacity-ratio; + + $bar-button-background-hover-opacity-ratio: $bar-buttons-background_hover_opacity * 0.01; + $transparency-value-hover: 1 - $bar-button-background-hover-opacity-ratio; + .bar_item_box_visible { + &.#{$class} { + background: transparentize($labelBackground, $transparency-value); + border: if( + $borderEnabled or $bar-buttons-enableBorders, + $bar-buttons-borderSize solid if($bar-buttons-monochrome, $bar-buttons-icon, $borderColor), + 0em + ); + + &.style2 { + background: transparent; + } + + &:hover { + opacity: $bar-buttons-background_hover_opacity * 0.01; + } + } + } + + .module-label.#{$class} { + color: if($bar-buttons-monochrome, $bar-buttons-text, $textColor); + margin-left: $spacing; + border-radius: $bar-buttons-radius; + } + + .module-icon.#{$class} { + color: if($bar-buttons-monochrome, $bar-buttons-icon, $iconColor); + font-size: if($fontSize, $fontSize, 1em); + } + + .style2 { + .module-icon.#{$class} { + background: if($bar-buttons-monochrome, $bar-buttons-icon, $iconBackground); + padding-right: $spacing; + color: if($bar-buttons-monochrome, $bar-buttons-background, $iconColor); + border-top-left-radius: if( + $borderEnabled or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-left-radius: if( + $borderEnabled or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + + .module-label.#{$class} { + background: transparentize($labelBackground, $transparency-value); + padding-left: $spacing * 1.5; + margin-left: 0em; + border-top-left-radius: 0em; + border-bottom-left-radius: 0em; + } + &.no-label.#{$class} { + .module-icon { + border-top-right-radius: if( + $borderEnabled or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + border-bottom-right-radius: if( + $borderEnabled or $bar-buttons-enableBorders, + $bar-buttons-radius * 0.4, + $bar-buttons-radius + ); + } + } + } +} + +/* + * ################################# + * # Ram Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'ram', + // label color + $bar-buttons-modules-ram-text, + // icon color + $bar-buttons-modules-ram-icon, + // icon background if split style is used + $bar-buttons-modules-ram-icon_background, + // label background + $bar-buttons-modules-ram-background, + // inner spacing + $bar-buttons-modules-ram-spacing, + // + // if border enabled + $bar-buttons-modules-ram-enableBorder, + // border color + $bar-buttons-modules-ram-border +); + +/* + * ################################# + * # Cpu Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'cpu', + // label color + $bar-buttons-modules-cpu-text, + // icon color + $bar-buttons-modules-cpu-icon, + // icon background if split style is used + $bar-buttons-modules-cpu-icon_background, + // label background + $bar-buttons-modules-cpu-background, + // inner spacing + $bar-buttons-modules-cpu-spacing, + // if border enabled + $bar-buttons-modules-cpu-enableBorder, + // border color + $bar-buttons-modules-cpu-border, + // custom font size + 1.05em // +); + +/* + * ################################# + * # Storage Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'storage', + // label color + $bar-buttons-modules-storage-text, + // icon color + $bar-buttons-modules-storage-icon, + // icon background if split style is used + $bar-buttons-modules-storage-icon_background, + // label background + $bar-buttons-modules-storage-background, + // inner spacing + $bar-buttons-modules-storage-spacing, + // if border enabled + $bar-buttons-modules-storage-enableBorder, + // border color + $bar-buttons-modules-storage-border, + // custom font size + 1.3em // +); + +/* + * ################################# + * # Netstat Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'netstat', + // label color + $bar-buttons-modules-netstat-text, + // icon color + $bar-buttons-modules-netstat-icon, + // icon background if split style is used + $bar-buttons-modules-netstat-icon_background, + // label background + $bar-buttons-modules-netstat-background, + // inner spacing + $bar-buttons-modules-netstat-spacing, + // if border enabled + $bar-buttons-modules-netstat-enableBorder, + // border color + $bar-buttons-modules-netstat-border, + // custom font size + 1.2em // +); + +/* + * ################################# + * # KB Layout Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'kblayout', + // label color + $bar-buttons-modules-kbLayout-text, + // icon color + $bar-buttons-modules-kbLayout-icon, + // icon background if split style is used + $bar-buttons-modules-kbLayout-icon_background, + // label background + $bar-buttons-modules-kbLayout-background, + // inner spacing + $bar-buttons-modules-kbLayout-spacing, + // if border enabled + $bar-buttons-modules-kbLayout-enableBorder, + // border color + $bar-buttons-modules-kbLayout-border, + // custom font size + 1.2em // +); + +/* + * ################################# + * # Updates Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'updates', + // label color + $bar-buttons-modules-updates-text, + // icon color + $bar-buttons-modules-updates-icon, + // icon background if split style is used + $bar-buttons-modules-updates-icon_background, + // label background + $bar-buttons-modules-updates-background, + // inner spacing + $bar-buttons-modules-updates-spacing, + // if border enabled + $bar-buttons-modules-updates-enableBorder, + // border color + $bar-buttons-modules-updates-border, + // custom font size + 1.2em // +); + +/* + * ################################# + * # Submap Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'submap', + // label color + $bar-buttons-modules-submap-text, + // icon color + $bar-buttons-modules-submap-icon, + // icon background if split style is used + $bar-buttons-modules-submap-icon_background, + // label background + $bar-buttons-modules-submap-background, + // inner spacing + $bar-buttons-modules-submap-spacing, + // if border enabled + $bar-buttons-modules-submap-enableBorder, + // border color + $bar-buttons-modules-submap-border, + // custom font size + 1.2em // +); + +/* + * ################################# + * # Weather Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'weather-custom', + // label color + $bar-buttons-modules-weather-text, + // icon color + $bar-buttons-modules-weather-icon, + // icon background if split style is used + $bar-buttons-modules-weather-icon_background, + // label background + $bar-buttons-modules-weather-background, + // inner spacing + $bar-buttons-modules-weather-spacing, + // if border enabled + $bar-buttons-modules-weather-enableBorder, + // border color + $bar-buttons-modules-weather-border, + // custom font size + 1.2em // +); + +/* + * ################################# + * # Power Module Styling # + * ################################# + */ +@include styleModule( + // + // class name + 'powermodule', + // label color + $red, + // icon color + $bar-buttons-modules-power-icon, + // icon background if split style is used + $bar-buttons-modules-power-icon_background, + // label background + $bar-buttons-modules-power-background, + // inner spacing + $bar-buttons-modules-power-spacing, + // if border enabled + $bar-buttons-modules-power-enableBorder, + // border color + $bar-buttons-modules-power-border, + // custom font size + 1.3em // +); diff --git a/ags/HyprPanel/scss/style/highlights.scss b/ags/HyprPanel/scss/style/highlights.scss new file mode 100644 index 0000000..0cdd921 --- /dev/null +++ b/ags/HyprPanel/scss/style/highlights.scss @@ -0,0 +1,222 @@ +@import "colors"; + +* { + color: $default_fg; + font-family: "JetBrainsMono NF"; + font-size: 0.9rem; +} + +html, body { + padding: 0; + margin: 0; + background-color: $primary_bg; +} + +// scrollbar { +// background-color: red; +// min-width: 5em; +// } + +.code { + background: $light-background; + border-radius: 0.5rem; + + .code-header { + background: $light-background; + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; + border-bottom: 1px solid $primary_fg; + padding: 5px; + + > button { + color: $default_fg; + background: transparent; + float: right; + border: none; + + &:before { + content: '󰆏'; + display: inline-block; + padding-right: 0.5rem; + } + } + } +} + +$languages-map: ( + arduino: "", + armasm: "", + avrasm: "", + bash: "", + c: "", + clojure: "", + coffeescript: "", + cpp: "", + csharp: "󰌛", + css: "", + dockerfile: "󰡨", + go: "", + gradle: "", + haskell: "", + html: "", + java: "", + javascript: "󰌞", + json: "", + latex: "", + lua: "󰢱", + makefile: "", + markdown: "", + mipsasm: "", + nginx: "", + nix: "󱄅", + php: "", + prolog: "", + python: "", + r: "󰟔", + ruby: "", + rust: "", + scss: "", + shell: "", + typescript: "󰛦", + wasm: "", + x86asm: "", + xml: "󰗀", +); + +@each $lang, $content in $languages-map { + [data-language="#{$lang}"]:before { + content: $content; + font-size: 1.1rem; + color: $primary_fg; + padding-right: 0.5rem; + } +} + +pre { + padding: 5px; + overflow-x: scroll; + + code.hljs { + color: $default_fg; + background: transparent; + } +} + +code { + & .hljs-keyword { + color: $mauve; + } + + & .hljs-built_in { + color: $red; + } + + & .hljs-type { + color: $yellow; + } + + & .hljs-literal, + & .hljs-number { + color: $orange; + } + + & .hljs-operator { + color: $teal; + } + + & .hljs-punctuation { + color: $lightteal; + } + + & .hljs-property, + & .hljs-variable.language_, + & .hljs-symbol { + color: $teal; + } + + & .hljs-regexp { + color: $pink; + } + + & .hljs-string, + & .hljs-char.escape_, + & .hljs-subst { + color: $green; + } + + & .hljs-comment { + color: $grey; + } + + & .hljs-doctag { + color: $red; + } + + & .hljs-meta, + & .hljs-title.function_, + & .hljs-section { + color: $orange; + } + + & .hljs-tag, + & .hljs-attribute { + color: $lightgrey; + } + + & .hljs-name, + & .hljs-selector-attr { + color: $mauve; + } + + & .hljs-params, + & .hljs-selector-class, + & .hljs-template-variable { + color: $default_fg; + } + + & .hljs-selector-tag { + color: $yellow; + } + + & .hljs-selector-id { + color: $blue; + } + + & .hljs-bullet, + & .hljs-code, + & .hljs-formula { + color: $teal; + } + + & .hljs-emphasis { + color: $red; + font-style: italic; + } + + & .hljs-strong { + color: $red; + font-weight: bold; + } + + & .hljs-link { + color: $lightblue; + font-style: italic; + } + + & .hljs-quote { + color: $green; + font-style: italic; + } + + & .hljs-addition { + color: $green; + background: rgba(166, 227, 161, 0.15); + } + + & .hljs-deletion { + color: $red; + background: rgba(243, 139, 168, 0.15); + } +} + + diff --git a/ags/HyprPanel/scss/style/menus/audiomenu.scss b/ags/HyprPanel/scss/style/menus/audiomenu.scss new file mode 100644 index 0000000..767b30a --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/audiomenu.scss @@ -0,0 +1,185 @@ +.menu-items-container.audio { + min-width: 18em * $bar-menus-menu-volume-scaling * 0.01; + + @import "./menu.scss"; + + * { + font-size: $font-size * $bar-menus-menu-volume-scaling * 0.01; + } + + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-volume-background-color); + + .menu-items { + border-color: if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-volume-border-color); + opacity: $bar-menus-opacity * 0.01; + } + + .menu-dropdown-label.audio { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-volume-label-color); + } + + .menu-label.audio { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-volume-label-color); + } + + .menu-active.playback, + .menu-active.input { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-volume-text); + } + + .menu-button-isactive.audio { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-volume-icons-active); + } + + .menu-slider.playback { + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-background, $bar-menus-menu-volume-audio_slider-background); + + highlight, + progress { + background: if($bar-menus-monochrome, $bar-menus-slider-primary, $bar-menus-menu-volume-audio_slider-primary); + } + } + + &:hover { + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-backgroundhover, $bar-menus-menu-volume-audio_slider-backgroundhover); + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-slider-puck, $bar-menus-menu-volume-audio_slider-puck); + } + } + } + + .menu-slider.inputs { + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-background, $bar-menus-menu-volume-input_slider-background); + + highlight, + progress { + background: if($bar-menus-monochrome, $bar-menus-slider-primary, $bar-menus-menu-volume-input_slider-primary); + } + } + + &:hover { + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-backgroundhover, $bar-menus-menu-volume-input_slider-backgroundhover); + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-slider-puck, $bar-menus-menu-volume-input_slider-puck); + } + } + } + + .menu-active-percentage.playback, + .menu-active-percentage.input { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-volume-text); + } + + .menu-active-button { + + .menu-active-icon.playback, + .menu-active-icon.input { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-volume-iconbutton-active); + opacity: 1; + } + + &.muted { + + .menu-active-icon.playback, + .menu-active-icon.input { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-passive, $bar-menus-menu-volume-iconbutton-passive); + opacity: 1; + } + } + + &:hover { + + .menu-active-icon.playback, + .menu-active-icon.input { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-passive, $bar-menus-menu-volume-iconbutton-passive); + opacity: 0.3; + } + } + + &.muted:hover { + + .menu-active-icon.playback, + .menu-active-icon.input { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-volume-iconbutton-active); + opacity: 1; + } + } + } + + .menu-button-icon.playback, + .menu-button-icon.input { + color: if($bar-menus-monochrome, $bar-menus-icons-passive, $bar-menus-menu-volume-icons-passive); + + &.active { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-volume-icons-active); + } + } + + .menu-button.audio { + color: if($bar-menus-monochrome, $bar-menus-icons-passive, $bar-menus-menu-volume-icons-passive); + + .menu-button-name.playback, + .menu-button-name.input { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-volume-text); + } + + + &:hover { + + .menu-button-name.playback, + .menu-button-name.input { + color: if($bar-menus-monochrome, $bar-menus-listitems-active, $bar-menus-menu-volume-listitems-active); + } + } + } + + .menu-section-container.volume { + margin-bottom: 0.65em; + } + + .menu-section-container.playback { + margin-top: 0em; + margin-bottom: 1em; + } + + .menu-section-container.input { + margin-top: 0em; + } + + .menu-label-container.input { + border-radius: 0em; + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-volume-card-color); + } + + .menu-label-container.playback { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-volume-card-color); + } + + .menu-items-section.input { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-volume-card-color); + } + + .menu-items-section.playback { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-volume-card-color); + } + + .menu-label-container.selected { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-volume-card-color); + } + + .menu-items-section.selected { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-volume-card-color); + } + + .menu-items-section.playback { + border-radius: 0em; + } +} diff --git a/ags/HyprPanel/scss/style/menus/bluetooth.scss b/ags/HyprPanel/scss/style/menus/bluetooth.scss new file mode 100644 index 0000000..19dd17c --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/bluetooth.scss @@ -0,0 +1,162 @@ +.menu-items-container.bluetooth * { + font-size: $font-size * $bar-menus-menu-bluetooth-scaling * 0.01; +} + +@import "./menu.scss"; + +.menu-items.bluetooth { + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-bluetooth-background-color); + border-color: if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-bluetooth-border-color); + opacity: $bar-menus-opacity * 0.01; + font-size: $font-size * $bar-menus-menu-bluetooth-scaling * 0.01; +} + +.menu-items-container.bluetooth { + + min-width: 18em * $bar-menus-menu-bluetooth-scaling * 0.01; + + font-size: 1.3em; + + .menu-section-container { + margin: 1em 0em; + } + + .menu-label-container { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-bluetooth-card-color); + + .menu-label { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-bluetooth-label-color); + } + + .controls-container { + margin: 0.5em 1em; + } + } + + + .menu-items-section { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-bluetooth-card-color); + min-height: 20em * $bar-menus-menu-bluetooth-scaling * 0.01; + font-size: 1em; + } + + button { + margin-right: 0.5em; + + &.search { + image { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-passive, $bar-menus-menu-bluetooth-iconbutton-passive); + } + + &:hover image { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-bluetooth-iconbutton-active); + } + + font-size: 0.8em; + margin-bottom: 0em; + } + + &:hover { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-bluetooth-iconbutton-active); + } + } + + .menu-icon-button.bluetooth { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-passive, $bar-menus-menu-bluetooth-iconbutton-passive); + + &:hover { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-bluetooth-iconbutton-active); + } + } + + .bluetooth-element-item { + margin-bottom: 0.4em; + + &:hover { + + .menu-button-icon, + .menu-button-name { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-bluetooth-iconbutton-active); + } + } + + image { + margin-right: 0em; + margin-top: 0.0em; + min-height: 1em; + min-width: 1em; + + &.active { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-bluetooth-icons-active); + } + } + + label { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-bluetooth-text); + font-size: 1em; + } + + .menu-button-icon { + font-size: 1.5em; + color: if($bar-menus-monochrome, $bar-menus-icons-passive, $bar-menus-menu-bluetooth-icons-passive); + + &.active { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-bluetooth-icons-active); + } + } + + .connection-status { + font-size: 0.9em; + margin-left: 0.6rem; + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-bluetooth-text); + opacity: 0.4; + } + } + + spinner { + min-height: 1.3em; + min-width: 1.3em; + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-bluetooth-iconbutton-active); + } + + .menu-separator { + margin: 0em 1em; + } + + .menu-switch.bluetooth { + background-color: if($bar-menus-monochrome, $bar-menus-switch-disabled, $bar-menus-menu-bluetooth-switch-disabled); + + &:checked { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-bluetooth-switch-enabled); + } + + slider { + background-color: if($bar-menus-monochrome, $bar-menus-switch-puck, $bar-menus-menu-bluetooth-switch-puck); + } + + &:hover { + trough { + background: if($bar-menus-monochrome, $bar-menus-switch-disabled, $bar-menus-menu-bluetooth-switch-disabled); + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-switch-puck, $bar-menus-menu-bluetooth-switch-puck); + } + } + + &:active { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-bluetooth-switch-enabled); + } + } + + .no-bluetooth-devices.dim, + .search-bluetooth-label.dim, + .bluetooth-disabled.dim { + &:last-child { + margin-bottom: 2em; + } + + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-bluetooth-text); + opacity: 0.5; + } +} diff --git a/ags/HyprPanel/scss/style/menus/calendar.scss b/ags/HyprPanel/scss/style/menus/calendar.scss new file mode 100644 index 0000000..2552ddb --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/calendar.scss @@ -0,0 +1,285 @@ +.calendar-menu-content * { + font-size: $font-size * $bar-menus-menu-clock-scaling * 0.01; +} + +.calendar-content-container { + margin-top: 0em; + min-width: 27em; + min-height: 6em; + background: if( + $bar-menus-monochrome, + $bar-menus-background, + $bar-menus-menu-clock-background-color + ); + border: $bar-menus-border-size solid + if( + $bar-menus-monochrome, + $bar-menus-border-color, + $bar-menus-menu-clock-border-color + ); + border-radius: $bar-menus-border-radius; + margin-right: 0.5em; + opacity: $bar-menus-opacity * 0.01; +} + +.calendar-menu-item-container { + border-radius: $bar-menus-card_radius; + margin-bottom: 1.35em; + background: if( + $bar-menus-monochrome, + $bar-menus-cards, + $bar-menus-menu-clock-card-color + ); +} + +.calendar-content-items { + margin: 1.35em; +} + +.calendar-container-box { + margin: 0.75em; + margin-bottom: 0em; +} + +.calendar-menu-widget { + border-radius: 0.4em; + color: if( + $bar-menus-monochrome, + $bar-menus-text, + $bar-menus-menu-clock-calendar-days + ); + + &:selected { + box-shadow: + inset 0 -0.5em 0 0 if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-clock-calendar-currentday), + inset -0.4em -0.3em 0 0 + if( + $bar-menus-monochrome, + $bar-menus-cards, + $bar-menus-menu-clock-card-color + ), + inset 0.4em 0 0 0.01em + if( + $bar-menus-monochrome, + $bar-menus-cards, + $bar-menus-menu-clock-card-color + ); + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-calendar-currentday + ); + border-radius: 0em; + } + + &.header { + background-color: transparent; + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-calendar-yearmonth + ); + } + + &.button { + color: $text; + font-weight: 900; + font-size: 900em; + } + + &:hover { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-calendar-paginator + ); + } + + &.highlight { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-calendar-weekdays + ); + } + + &:indeterminate { + color: transparentize( + if( + $bar-menus-monochrome, + $bar-menus-text, + $bar-menus-menu-clock-calendar-days + ), + 0.65 + ); + } + + font-size: 1.1em; + padding: 0.35em; +} + +.clock-content-items { + min-height: 8em; + + .clock-content-time { + font-size: 4em; + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-time-time + ); + } + + .clock-content-period { + font-size: 1.75em; + margin-bottom: 1.35em; + margin-right: -0.875em; + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-time-timeperiod + ); + } +} + +.calendar-menu-item-container { + margin-bottom: 0.65em; + &:last-child { + margin-bottom: 0em; + } +} + +.weather-container-box { + margin: 1.5em; + margin-top: 2.5em; + min-width: 3em; + + .calendar-menu-weather.today.icon { + label { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-icon + ); + font-size: 5em; + } + } + + .calendar-menu-weather.today.temp.label { + color: if( + $bar-menus-monochrome, + $bar-menus-text, + $bar-menus-menu-clock-weather-temperature + ); + margin-left: 0.2em; + font-size: 2.5em; + + &.icon { + font-size: 2.5em; + } + } + + .calendar-menu-weather.today.condition.label { + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-weather-status + ); + font-size: 1.5em; + margin-bottom: 0.4em; + } + + .calendar-menu-weather.today.temp.label.icon.weather-color.red { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-thermometer-extremelyhot + ); + } + + .calendar-menu-weather.today.temp.label.icon.weather-color.orange { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-thermometer-hot + ); + } + + .calendar-menu-weather.today.temp.label.icon.weather-color.lavender { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-thermometer-moderate + ); + } + + .calendar-menu-weather.today.temp.label.icon.weather-color.blue { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-thermometer-cold + ); + } + + .calendar-menu-weather.today.temp.label.icon.weather-color.sky { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-thermometer-extremelycold + ); + } +} + +.calendar-menu-weather.today.stats.container { + margin-bottom: 0.75em; + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-weather-stats + ); + + .weather.label { + margin-left: 0.35em; + } +} + +.menu-separator.weather { + margin: 1.5em 0em; +} + +.hourly-weather-time { + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-weather-hourly-time + ); + margin-bottom: 0.5em; +} + +.hourly-weather-icon { + color: if( + $bar-menus-monochrome, + $bar-menus-icons-active, + $bar-menus-menu-clock-weather-hourly-icon + ); + margin-bottom: 0.25em; + font-size: 1.8em; +} + +.hourly-weather-temp { + color: if( + $bar-menus-monochrome, + $bar-menus-label, + $bar-menus-menu-clock-weather-hourly-temperature + ); +} + +.weather.precip.icon { + min-width: 1em; + font-size: 1em; +} + +.weather.wind.icon { + min-width: 1em; + font-size: 1em; +} diff --git a/ags/HyprPanel/scss/style/menus/dashboard.scss b/ags/HyprPanel/scss/style/menus/dashboard.scss new file mode 100644 index 0000000..d292038 --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/dashboard.scss @@ -0,0 +1,386 @@ +.dashboard-menu-content * { + font-size: $font-size * $bar-menus-menu-dashboard-scaling * 0.01; +} + +.dashboard-content-items { + margin-left: 0.50em; + min-width: 28.5em; + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-dashboard-background-color); + border: $bar-menus-border-size solid if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-dashboard-border-color); + border-radius: $bar-menus-border-radius; + opacity: $bar-menus-opacity * 0.01; + + button { + border-radius: 0.4em; + } + + .dashboard-card { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-dashboard-card-color); + margin: 1.3em; + border-radius: $bar-menus-card_radius; + padding: 1.5em; + } + + .profile-picture-container { + margin-right: 0.65em; + margin-bottom: 0.65em; + + .profile-picture { + min-width: $bar-menus-menu-dashboard-profile-size; + min-height: $bar-menus-menu-dashboard-profile-size; + border-radius: $bar-menus-menu-dashboard-profile-radius; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + } + + .profile-name { + font-size: 1.5em; + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-dashboard-profile-name); + margin-top: 0.75em; + } + } + + .power-menu-container { + margin-left: 0em; + margin-bottom: 0.65em; + + .dashboard-button { + min-width: 3em; + min-height: 2.5em; + + &:not(:last-child) { + margin-bottom: 0.75em; + } + + label { + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-dashboard-shortcuts-text); + font-size: 1.7em; + } + + &.shutdown { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-shutdown); + + label { + font-size: 1.9em; + } + } + + &.restart { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-restart); + + label { + font-size: 1.9em; + } + } + + &.lock { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-logout); + } + + &.sleep { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-sleep); + } + + &:hover { + &.shutdown { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-shutdown), 0.5); + } + + &.restart { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-restart), 0.5); + } + + &.lock { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-logout), 0.5); + } + + &.sleep { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-sleep), 0.5); + } + } + + + } + } + + .shortcuts-container { + font-size: 1em; + + .dashboard-card { + padding: 1.5em; + + button { + min-height: 2.5em; + min-width: 2.5em; + } + } + + .card-button-section-container.visible { + margin-right: 1.5em; + } + + .top-button.paired { + margin-bottom: 1.5em; + } + + .container { + margin-top: 0em; + margin-bottom: 0.65em; + + &.most-used { + margin-right: 0.65em; + } + + &.utilities.paired { + margin-left: 0em; + } + + button { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-shortcuts-background); + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-dashboard-shortcuts-text); + min-height: 3em; + + label { + font-size: 1.5em; + } + + &.record.active { + background: $red; + + &:hover { + background: transparentize($red, 0.5); + } + } + + &:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-shortcuts-background), 0.5); + } + } + } + } + + .controls-container { + margin-bottom: 0.65em; + + &.dashboard-card { + margin-top: 0em; + } + + button { + padding: 0em; + min-height: 3em; + min-width: 3.8em; + + label { + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-dashboard-controls-wifi-text); + font-size: 1.6em; + } + + &:not(:last-child) { + margin-right: 1em; + } + + &.wifi { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-wifi-background); + } + + &.bluetooth { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-bluetooth-background); + } + + &.notifications { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-notifications-background); + } + + &.playback { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-volume-background); + } + + &.input { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-input-background); + } + + &.wifi:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-wifi-background), 0.5); + } + + &.bluetooth:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-bluetooth-background), 0.5); + } + + &.notifications:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-notifications-background), 0.5); + } + + &.playback:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-volume-background), 0.5); + } + + &.input:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-input-background), 0.5); + } + + &.disabled { + background: if($bar-menus-monochrome, $bar-menus-buttons-disabled, $bar-menus-menu-dashboard-controls-disabled); + + &.wifi:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-wifi-background), 0.5); + } + + &.bluetooth:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-bluetooth-background), 0.5); + } + + &.notifications:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-notifications-background), 0.5); + } + + &.playback:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-volume-background), 0.5); + } + + &.input:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-controls-input-background), 0.5); + } + } + } + } + + .directories-container { + &.dashboard-card { + margin-top: 0em; + margin-bottom: 0.65em; + padding-left: 1.5em; + padding-right: 0em; + } + + .directory-link { + padding: 0.5em 0em; + min-width: 9em; + + &:last-child { + margin-bottom: 0em; + } + + label { + font-size: 1.3em; + } + + &.right.top { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-directories-right-top-color); + } + + &.right.middle { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-directories-right-middle-color); + } + + &.right.bottom { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-directories-right-bottom-color); + } + + &.left.top { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-directories-left-top-color); + } + + &.left.middle { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-directories-left-middle-color); + } + + &.left.bottom { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-directories-left-bottom-color); + } + + &:hover { + opacity: 0.5; + } + } + } + + .stats-container { + margin-top: 0em; + + .stat { + label { + margin-right: 0.75em; + font-size: 1.3em; + min-width: 1.65em; + } + + &.cpu label { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-dashboard-monitors-cpu-icon); + } + + &.ram label { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-dashboard-monitors-ram-icon); + } + + &.gpu label { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-dashboard-monitors-gpu-icon); + } + + &.storage label { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-dashboard-monitors-disk-icon); + } + + .stats-bar { + levelbar * { + transition: 200ms; + } + + trough { + min-height: 1.05em; + } + + block { + border-radius: 0.4em; + + &.empty { + background: if($bar-menus-monochrome, $bar-menus-progressbar-background, $bar-menus-menu-dashboard-monitors-bar_background); + } + + &.filled { + padding-left: 0.85em; + } + } + } + + &.cpu .stats-bar block.filled { + background: if($bar-menus-monochrome, $bar-menus-progressbar-foreground, $bar-menus-menu-dashboard-monitors-cpu-bar); + } + + &.ram .stats-bar block.filled { + background: if($bar-menus-monochrome, $bar-menus-progressbar-foreground, $bar-menus-menu-dashboard-monitors-ram-bar); + } + + &.gpu .stats-bar block.filled { + background: if($bar-menus-monochrome, $bar-menus-progressbar-foreground, $bar-menus-menu-dashboard-monitors-gpu-bar); + } + + &.storage .stats-bar block.filled { + background: if($bar-menus-monochrome, $bar-menus-progressbar-foreground, $bar-menus-menu-dashboard-monitors-disk-bar); + } + } + + .stat-value { + margin-bottom: 0.75em; + font-size: 0.9em; + + &.cpu { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-dashboard-monitors-cpu-label); + } + + &.ram { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-dashboard-monitors-ram-label); + } + + &.gpu { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-dashboard-monitors-gpu-label); + } + + &.storage { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-dashboard-monitors-disk-label); + } + } + } +} diff --git a/ags/HyprPanel/scss/style/menus/energy.scss b/ags/HyprPanel/scss/style/menus/energy.scss new file mode 100644 index 0000000..45648f3 --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/energy.scss @@ -0,0 +1,108 @@ +.menu-items-container.energy * { + font-size: $font-size * $bar-menus-menu-battery-scaling * 0.01; +} + +.menu-items.energy { + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-battery-background-color); + border-color: if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-battery-border-color); + opacity: $bar-menus-opacity * 0.01; + font-size: $font-size * $bar-menus-menu-battery-scaling * 0.01; +} + +@import "./menu.scss"; + +.menu-items-container.energy { + min-width: 18em * $bar-menus-menu-battery-scaling * 0.01; + + .menu-label { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-battery-label-color); + } + + .menu-label-container { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-battery-card-color); + } + + .uptime { + font-size: 0.92em; + } + + .menu-items-section { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-battery-card-color); + } + + .power-profile-item { + color: if($bar-menus-monochrome, $bar-menus-listitems-passive, $bar-menus-menu-battery-listitems-passive); + margin-bottom: 0.5em; + + label { + margin-left: 1em; + } + + image { + font-size: 1.3em; + min-width: 1em; + min-height: 1em; + color: if($bar-menus-monochrome, $bar-menus-icons-passive, $bar-menus-menu-battery-icons-passive); + } + + &:hover { + color: if($bar-menus-monochrome, $bar-menus-listitems-active, $bar-menus-menu-battery-listitems-active); + + label { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-battery-icons-active); + } + + image { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-battery-icons-active); + } + } + + &.active { + color: if($bar-menus-monochrome, $bar-menus-listitems-active, $bar-menus-menu-battery-listitems-active); + + image { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-battery-icons-active); + } + } + } + + .brightness-container { + padding-bottom: 1em; + } + + .brightness-slider-icon { + font-size: 1.4em; + min-width: 1em; + min-height: 1em; + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-battery-icons-active); + } + + .brightness-slider-label { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-battery-text); + font-size: 0.9em; + min-width: 2.5em; + font-weight: bold; + margin-bottom: 0.2em; + } + + .menu-slider.brightness { + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-background, $bar-menus-menu-battery-slider-background); + + highlight, + progress { + background: if($bar-menus-monochrome, $bar-menus-slider-primary, $bar-menus-menu-battery-slider-primary); + } + } + + &:hover { + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-backgroundhover, $bar-menus-menu-battery-slider-backgroundhover); + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-slider-puck, $bar-menus-menu-battery-slider-puck); + } + } + } +} diff --git a/ags/HyprPanel/scss/style/menus/media.scss b/ags/HyprPanel/scss/style/menus/media.scss new file mode 100644 index 0000000..7c6205c --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/media.scss @@ -0,0 +1,126 @@ +.menu-items.media { + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-media-background-color); + border-color: if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-media-border-color); + opacity: $bar-menus-opacity * 0.01; + +} + +.menu-items-container.media { + * { + font-size: $font-size * $bar-menus-menu-media-scaling * 0.01; + } + + min-width: 23em * $bar-menus-menu-media-scaling * 0.01; + min-height: 10em * $bar-menus-menu-media-scaling * 0.01; + + .menu-section-container { + margin: 1em 0em; + } + + .menu-items-section { + border-radius: $bar-menus-card_radius; + padding: 0em; + } + + .menu-content { + border-radius: 0.4em; + background-size: cover; + background-position: center; + } + + .media-content { + margin: 1em; + } + + .media-indicator-current-song-name { + margin-bottom: 0.75rem; + } + + .media-indicator-current-song-author { + margin-bottom: 0.75rem; + } + + .media-indicator-current-song-name-label { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-media-song); + font-size: 1.35em; + } + + .media-indicator-current-song-author-label { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-media-artist); + font-size: 1em; + } + + .media-indicator-current-song-album-label { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-media-album); + font-size: 1em; + } + + .media-indicator-current-controls { + margin-top: 1.5rem; + margin-bottom: 0.5rem; + } + + .media-indicator-control-button { + margin: 0rem 0.5rem; + } + + .media-indicator-control-button { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-media-buttons-background); + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-media-buttons-text); + min-height: 1.8em; + min-width: 2.5em; + border-radius: 0.2rem; + + &.disabled { + background: if($bar-menus-monochrome, $bar-menus-buttons-disabled, $bar-menus-menu-media-buttons-inactive); + } + + &.enabled { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-media-buttons-background); + + &:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-media-buttons-background), 0.5); + } + + &.active { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-media-buttons-enabled); + + &:hover { + background: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-media-buttons-enabled), 0.5); + } + } + } + + } + + image { + font-size: 1.1em; + } + + .menu-slider.media.progress { + margin-top: 1em; + margin-bottom: 1em; + + trough { + background: if($bar-menus-monochrome, $bar-menus-slider-background, $bar-menus-menu-media-slider-background); + border-radius: 0.2em; + + highlight, + progress { + border-radius: 0.2em; + min-height: .85em; + background: if($bar-menus-monochrome, $bar-menus-slider-primary, $bar-menus-menu-media-slider-primary); + } + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-slider-puck, $bar-menus-menu-media-slider-puck); + } + + &:hover { + trough { + background: transparentize(if($bar-menus-monochrome, $bar-menus-slider-backgroundhover, $bar-menus-menu-media-slider-backgroundhover), 0.3); + } + } + } +} diff --git a/ags/HyprPanel/scss/style/menus/menu.scss b/ags/HyprPanel/scss/style/menus/menu.scss new file mode 100644 index 0000000..349169a --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/menu.scss @@ -0,0 +1,256 @@ +.menu-slider { + trough { + border-radius: 0.3rem; + background: $surface0; + + highlight, + progress { + background: $peach; + border-radius: 0.3rem; + } + } + + slider { + box-shadow: none; + background-color: transparent; + min-height: 0.6rem; + min-width: 0.6rem; + border: 0rem solid transparent; + border-radius: 0.3rem; + } + + &:hover { + trough { + background: $surface0; + } + + slider { + background: $overlay0; + box-shadow: none; + } + } +} + +.menu-switch { + font-size: 1.3em; + background-color: $surface0; + border-radius: 0.2em; + + &:checked { + background: $sky; + } + + trough { + highlight, + progress { + background-color: $peach; + border-radius: 0.3em; + } + } + + slider { + box-shadow: none; + background-color: $overlay0; + min-height: 1em; + min-width: 1em; + border: 0em solid transparent; + border-radius: 0.2em; + margin: 0.1em 0.15em; + } + + &:hover { + trough { + background: $surface0; + } + + slider { + background: $overlay0; + box-shadow: none; + } + } + + &:active { + background-color: $sky; + } +} + +.menu-separator { + min-height: 0.1rem; + margin: 0.6rem 0rem; + background: $surface1; +} + +.menu-items { + background: $crust; + border: $bar-menus-border-size solid $bar-menus-border-color; + border-radius: $bar-menus-border-radius; + color: $text; +} + +.menu-items-container { + border-radius: 0.4em; + font-size: 1.3em; +} + +.menu-section-container { + margin: 1em 0em; + + .menu-label { + color: $text; + font-size: 1.1em; + font-weight: bold; + } + + .menu-label-container { + background: $base; + border-radius: $bar-menus-card_radius; + border-bottom-left-radius: 0em; + border-bottom-right-radius: 0em; + margin: 0em 1em; + min-height: 2em; + } + + &:first-child { + margin-bottom: 0em; + } + + &:last-child { + margin-top: 0em; + } + + &:nth-child(2) { + margin-top: 1em; + } + + .menu-items-section { + background: $base; + border-radius: $bar-menus-card_radius; + border-top-left-radius: 0em; + border-top-right-radius: 0em; + padding: 0.9em; + margin: 0em 1em; + } +} + +.menu-active { + font-size: 0.9em; + font-weight: bold; + margin: 0rem 1em; + margin-bottom: 0.9em; +} + +.menu-active-container { + &:first-child { + margin-bottom: 0.5em; + } +} + +.menu-active-button { + padding: 0.1em; + margin-bottom: -0.2em; + + .menu-active-icon { + font-size: 1.4em; + font-weight: bold; + } + + &.muted image { + color: $maroon; + } + + &:hover image { + color: $maroon; + } +} + +.menu-active-percentage { + font-size: 0.9em; + min-width: 2.5em; + font-weight: bold; +} + +.menu-active-slider { + margin-left: 1rem; + margin-right: 1.5rem; +} + +.menu-active-slider * { + min-height: 0.85em; + border-radius: 0.2em; +} + +.menu-slider-container { + margin-bottom: 0.7rem; +} + +.menu-label-dim { + color: $overlay0; + margin-right: 1rem; + font-size: 1em; + font-weight: bold; +} + +.menu-icon-button { + &:hover { + color: $surface2; + } +} + +.menu-dropdown-label-container { + background: $base; + border-radius: 0.4em; +} + +.menu-button { + margin-bottom: 0.4em; +} + +.menu-button-name { + font-size: 0.95em; + font-weight: bold; + margin-left: 0.5em; + margin-right: 1.2rem; +} + +.menu-button-icon { + font-size: 1.3em; + font-weight: bold; + margin-right: 0.5rem; +} + +.menu-item-box { + margin-bottom: 0.5rem; +} + +.dropdown-menu-container { + min-height: 10em; +} + +.menu-label { + margin: 0.5em 1em; + color: $sky; +} + +.event-box-container { + min-height: 0em; + margin-top: $bar-dropdownGap; +} + +.event-top-padding * { + min-height: 0em; + margin-top: if($bar-floating and $bar-location == 'top', $bar-margin_top, 0); + margin-bottom: if($bar-floating and $bar-location == 'bottom', $bar-margin_bottom, 0); +} + +@keyframes spin { + to { + -gtk-icon-transform: rotate(1turn); + } +} + +image.spinning { + animation-name: spin; + animation-duration: 1s; + animation-timing-function: linear; + animation-iteration-count: infinite; +} diff --git a/ags/HyprPanel/scss/style/menus/network.scss b/ags/HyprPanel/scss/style/menus/network.scss new file mode 100644 index 0000000..b76bee1 --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/network.scss @@ -0,0 +1,184 @@ +.menu-items-container.network * { + font-size: $font-size * $bar-menus-menu-network-scaling * 0.01; +} + +@import './menu.scss'; + +.menu-items.network { + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-network-background-color); + border-color: if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-network-border-color); + opacity: $bar-menus-opacity * 0.01; + font-size: $font-size * $bar-menus-menu-network-scaling * 0.01; +} + +.menu-items-container.network { + min-width: 18em * $bar-menus-menu-network-scaling * 0.01; + font-size: 1.3em; + + .menu-items-section { + padding-bottom: 1.5em; + } + + .menu-label { + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-network-label-color); + } + + .network-icon { + font-size: 1.3em; + min-width: 1em; + min-height: 1em; + color: if($bar-menus-monochrome, $bar-menus-icons-passive, $bar-menus-menu-network-icons-passive); + + &.active { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-network-icons-active); + } + } + + .menu-icon-button.network { + margin: 1em; + } + + .connection-container { + margin-left: 1em; + } + + .connection-status.dim { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-network-text); + opacity: 0.5; + font-size: 0.9em; + } + + .menu-section-container.wifi { + margin-top: 0.65em; + + .menu-items-section { + min-height: 12em; + } + } + + .network-element-item { + &:not(:last-child) { + margin-bottom: 0.5em; + } + + &.staging { + margin-bottom: 0.5em; + } + + &:hover { + .network-icon { + color: if($bar-menus-monochrome, $bar-menus-icons-active, $bar-menus-menu-network-icons-active); + opacity: 1; + } + + .active-connection { + color: if( + $bar-menus-monochrome, + $bar-menus-iconbuttons-active, + $bar-menus-menu-network-iconbuttons-active + ); + } + } + + .active-connection { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-network-text); + } + + .active-connection.dim { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-network-text); + opacity: 0.5; + } + } + + .spinner.wap { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-network-iconbuttons-active); + } + + .network-password-input-container { + background: darken(if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-network-card-color), 5%); + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-network-text); + border-radius: 0.4em; + margin: 0em 2em; + margin-top: 0.75em; + padding: 0.5em; + } + + .close-network-password-input-button { + padding: 0em 0.5em; + + &:hover image { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-network-text); + opacity: 0.5; + } + } + + .menu-icon-button.network.search { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-passive, $bar-menus-menu-network-iconbuttons-passive); + + &:hover { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-network-iconbuttons-active); + } + } + + .menu-icon-button.network.disconnect { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-passive, $bar-menus-menu-network-iconbuttons-passive); + margin: 0em; + margin-top: -0.2em; + margin-left: 1em; + + label { + font-size: 1.4em; + } + + &:hover { + color: if($bar-menus-monochrome, $bar-menus-iconbuttons-active, $bar-menus-menu-network-iconbuttons-active); + } + } + + .waps-not-found.dim { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-network-text); + opacity: 0.5; + } + + .menu-label-container { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-network-card-color); + } + + .menu-items-section { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-network-card-color); + } + + .menu-switch.network { + background-color: if( + $bar-menus-monochrome, + $bar-menus-switch-disabled, + $bar-menus-menu-network-switch-disabled + ); + + &:checked { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-network-switch-enabled); + } + + slider { + background-color: if($bar-menus-monochrome, $bar-menus-switch-puck, $bar-menus-menu-network-switch-puck); + } + + &:hover { + trough { + background: if( + $bar-menus-monochrome, + $bar-menus-switch-disabled, + $bar-menus-menu-network-switch-disabled + ); + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-switch-puck, $bar-menus-menu-network-switch-puck); + } + } + + &:active { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-network-switch-enabled); + } + } +} diff --git a/ags/HyprPanel/scss/style/menus/notifications.scss b/ags/HyprPanel/scss/style/menus/notifications.scss new file mode 100644 index 0000000..5f2d735 --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/notifications.scss @@ -0,0 +1,192 @@ +.notification-menu-content * { + font-size: $font-size * $bar-menus-menu-notifications-scaling * 0.01; +} + +.notification-card-container.menu { + margin: 0em; + min-width: 30.6em * $bar-menus-menu-notifications-scaling * 0.01; + min-height: $bar-menus-menu-notifications-height * $bar-menus-menu-notifications-scaling * 0.01; + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-notifications-background); + border: $bar-menus-border-size solid if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-notifications-border); + border-radius: $bar-menus-border-radius; + margin-right: 0.45em; + opacity: $bar-menus-opacity * 0.01; + + .window-content.notificationsmenu-window { + margin-right: 0.50em; + } + + .menu-content-container.notifications { + margin: 1em; + margin-bottom: 0em; + min-height: 4em; + } + + .notification-menu-controls { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-notifications-card); + margin: 1em 1em; + margin-bottom: 0.5em; + border-radius: $bar-menus-card_radius; + padding: 0.4em 0.75em; + } + + .notification-card.menu { + background: $notification-background; + min-width: 26.2em * $bar-menus-menu-notifications-scaling * 0.01; + font-size: $font-size * $bar-menus-menu-notifications-scaling * 0.01; + border: 0.15em solid $notification-border; + border-radius: 0em; + border-bottom-left-radius: $notification-border_radius; + border-top-left-radius: $notification-border_radius; + margin: 0em; + } + + .notification-card-content-container { + margin-bottom: 0.65em; + + &:last-child { + margin-bottom: 1em; + } + } + + .notification-card-content { + margin-bottom: 0.25em; + } + + .menu-label.notifications { + margin: 0em; + font-size: $font-size * $bar-menus-menu-notifications-scaling * 0.01; + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-notifications-label); + } + + .menu-separator.notification-controls { + min-width: 0.1em; + background-color: if($bar-menus-monochrome, $bar-menus-dropdownmenu-divider, $bar-menus-menu-notifications-switch_divider); + margin: 0em 1em; + } + + .menu-switch.notifications { + background-color: if($bar-menus-monochrome, $bar-menus-switch-disabled, $bar-menus-menu-notifications-switch-disabled); + + &:checked { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-notifications-switch-enabled); + } + + slider { + background-color: if($bar-menus-monochrome, $bar-menus-switch-puck, $bar-menus-menu-notifications-switch-puck); + } + + &:hover { + trough { + background: if($bar-menus-monochrome, $bar-menus-switch-disabled, $bar-menus-menu-notifications-switch-disabled); + } + + slider { + background: if($bar-menus-monochrome, $bar-menus-switch-puck, $bar-menus-menu-notifications-switch-puck); + } + } + + &:active { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-notifications-switch-enabled); + } + } + + .clear-notifications-button { + margin-right: 0.3em; + + &:hover label:not(.removing) { + color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-notifications-clear), 0.5); + } + } + + .clear-notifications-label { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-notifications-clear); + font-size: 1.5em; + + &.removing { + color: $bar-menus-buttons-disabled; + } + } + + scrollbar { + margin-right: 0.2em; + min-width: $bar-menus-menu-notifications-scrollbar-width; + border-radius: $bar-menus-menu-notifications-scrollbar-radius; + background: transparent; + + slider { + min-width: $bar-menus-menu-notifications-scrollbar-width; + border-radius: $bar-menus-menu-notifications-scrollbar-radius; + background: $bar-menus-menu-notifications-scrollbar-color; + } + } +} + +.notification-label-container { + margin-bottom: 8em; + + label { + color: if($bar-menus-monochrome, $bar-menus-feinttext, $bar-menus-menu-notifications-no_notifications_label); + } + + .bell { + font-size: 10em * $bar-menus-menu-notifications-scaling * 0.01; + } + + .message { + font-size: 1.5em * $bar-menus-menu-notifications-scaling * 0.01; + } +} + +.close-notification-button.menu { + background: $notification-close_button-background; + color: $notification-close_button-label; + min-width: 2.1em; + border-radius: 0rem $notification-border_radius $notification-border_radius 0em; + + label { + font-size: 1.5em; + } + + &:hover { + background: transparentize($notification-close_button-background , 0.5); + } +} + +.notification-menu-pager { + background: $bar-menus-menu-notifications-pager-background; + border-radius: $bar-menus-border-radius; + border-top-left-radius: 0em; + border-top-right-radius: 0em; + + .pager-button { + margin: 0em; + padding: 0.25em 1em; + color: $bar-menus-menu-notifications-pager-button; + + .pager-button-label { + font-size: 2em; + } + + &:hover { + .pager-button-label { + color: transparentize($bar-menus-menu-notifications-pager-button, 0.4); + text-decoration: none; + } + } + } + + .pager-label { + color: $bar-menus-menu-notifications-pager-label; + } + + .disabled { + color: transparentize($bar-menus-menu-notifications-pager-button, 0.8); + + &:hover { + .pager-button-label { + color: transparentize($bar-menus-menu-notifications-pager-button, 0.8); + } + } + } +} diff --git a/ags/HyprPanel/scss/style/menus/power.scss b/ags/HyprPanel/scss/style/menus/power.scss new file mode 100644 index 0000000..43c1c03 --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/power.scss @@ -0,0 +1,227 @@ +window#powermenu, +window#verification { + // the fraction has to be more than hyprland ignorealpha + background-color: rgba(0, 0, 0, .4); +} + +$popover-padding: 0.6rem * 1.6; + +window#verification .verification { + * { + font-size: $font-size * $bar-menus-menu-dashboard-confirmation_scaling * 0.01; + } + + @include floating-widget; + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-dashboard-powermenu-confirmation-background); + border: $bar-menus-border-size solid if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-dashboard-powermenu-confirmation-border); + padding: 0.35em * 1.6 * 1.5; + min-width: 20em; + min-height: 6em; + opacity: $bar-menus-opacity * 0.01; + + .verification-content { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-dashboard-powermenu-confirmation-card); + border-radius: $bar-menus-border-radius * 0.5; + padding: 1em; + } + + .text-box { + margin-bottom: 0.3em; + + .title { + font-size: 1.5em; + color: if($bar-menus-monochrome, $bar-menus-label, $bar-menus-menu-dashboard-powermenu-confirmation-label); + margin-bottom: 0.5em; + } + + .desc { + color: if($bar-menus-monochrome, $bar-menus-text, $bar-menus-menu-dashboard-powermenu-confirmation-body); + font-size: 1em; + margin-bottom: 0.55em; + padding: 1em 3em; + } + } + + .verification-button { + background: $bar-menus-buttons-default; + padding: 0.7em 0em; + margin: 0.4em 1.7em; + border-radius: $bar-menus-border-radius * 0.5; + opacity: 1; + transition: border-color 0.2s ease-in-out; + transition: opacity .3s ease-in-out; + + &.bar-verification_yes { + background-color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-confirm); + } + + &.bar-verification_no { + background-color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-deny); + } + + &:hover { + &.bar-verification_yes { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-confirm), 0.6); + transition: background-color 0.2s ease-in-out; + } + + &.bar-verification_no { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-deny), 0.6); + transition: background-color 0.2s ease-in-out; + } + } + + &:focus { + &.bar-verification_yes { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-confirm), 0.6); + transition: background 0.2s ease-in-out; + } + + &.bar-verification_no { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-deny), 0.6); + transition: background 0.2s ease-in-out; + } + } + + &:active { + &.bar-verification_yes { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-confirm), 0.6); + transition: background 0.2s ease-in-out; + } + + &.bar-verification_no { + background-color: transparentize(if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-dashboard-powermenu-confirmation-deny), 0.6); + transition: background 0.2s ease-in-out; + } + + image { + opacity: .3; + transition: opacity .3s ease-in-out; + } + + label { + opacity: .3; + transition: opacity .3s ease-in-out; + } + } + } + + .bar-verification_no label { + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-dashboard-powermenu-confirmation-button_text); + } + + .bar-verification_yes label { + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-dashboard-powermenu-confirmation-button_text); + } +} + +window#powermenu .powermenu { + @include floating-widget; + + &.line { + padding: $popover-padding * 1.5; + } + + &.box { + padding: $popover-padding * 2; + } +} + +.widget-button { + border-color: $crust; + min-width: 4.5em; + min-height: 4.5em; + opacity: 1; + transition: border-color 0.2s ease-in-out; + transition: opacity .3s ease-in-out; + + &:hover { + &.powermenu-button-shutdown { + border-color: $red; + } + + &.powermenu-button-logout { + border-color: $green; + } + + &.powermenu-button-sleep { + border-color: $sky; + } + + &.powermenu-button-reboot { + border-color: $peach; + } + } + + &:focus { + &.powermenu-button-shutdown { + border-color: $red; + } + + &.powermenu-button-logout { + border-color: $green; + } + + &.powermenu-button-sleep { + border-color: $sky; + } + + &.powermenu-button-reboot { + border-color: $peach; + } + } + + &:active { + &.powermenu-button-shutdown { + border-color: rgba($red, .5); + } + + &.powermenu-button-logout { + border-color: rgba($green, .5); + } + + &.powermenu-button-sleep { + border-color: rgba($sky, .5); + } + + &.powermenu-button-reboot { + border-color: rgba($peach, .5); + } + } +} + +.system-button_icon { + &.shutdown { + color: $red; + } + + &.logout { + color: $green; + } + + &.reboot { + color: $peach; + } + + &.sleep { + color: $sky; + } +} + +.system-button_label { + &.shutdown { + color: $red; + } + + &.logout { + color: $green; + } + + &.reboot { + color: $peach; + } + + &.sleep { + color: $sky; + } +} diff --git a/ags/HyprPanel/scss/style/menus/powerdropdown.scss b/ags/HyprPanel/scss/style/menus/powerdropdown.scss new file mode 100644 index 0000000..853835c --- /dev/null +++ b/ags/HyprPanel/scss/style/menus/powerdropdown.scss @@ -0,0 +1,136 @@ +.menu-items-container.power-dropdown * { + font-size: $font-size * $bar-menus-menu-power-scaling * 0.01; +} + +@import "./menu.scss"; + +.menu-items.power-dropdown { + background: if($bar-menus-monochrome, $bar-menus-background, $bar-menus-menu-power-background-color); + border-color: if($bar-menus-monochrome, $bar-menus-border-color, $bar-menus-menu-power-border-color); + opacity: $bar-menus-opacity * 0.01; + font-size: $font-size * $bar-menus-menu-power-scaling * 0.01; +} + +.menu-items-container.power-dropdown { + &.reboot { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-restart-background); + } + + &.logout { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-logout-background); + } + + &.sleep { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-sleep-background); + } + + min-height: 3.5em * $bar-menus-menu-power-scaling * 0.01; + font-size: 1.3em; + margin: 1em; + + .menu-items-section { + padding-bottom: 1.5em; + } + + .power-menu-button { + border-radius: $bar-menus-border-radius * 0.6; + + // This doubles the border-radius so it doesn't show up as + // an artifact behind the button as that has a radius as well + border-top-left-radius: $bar-menus-border-radius * 2; + border-bottom-left-radius: $bar-menus-border-radius * 2; + + &.no-label { + // This doubles the border-radius so it doesn't show up as + // an artifact behind the button as that has a radius as well + border-top-right-radius: $bar-menus-border-radius * 2; + border-bottom-right-radius: $bar-menus-border-radius * 2; + } + + &:hover { + opacity: 0.4; + } + + &:not(:last-child) { + margin-bottom: 1.5em; + } + + .power-button-label { + font-size: 1.1em; + } + + &.shutdown { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-shutdown-background); + } + + &.reboot { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-restart-background); + } + + &.logout { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-logout-background); + } + + &.sleep { + background: if($bar-menus-monochrome, $bar-menus-cards, $bar-menus-menu-power-buttons-sleep-background); + } + + .show-label { + padding-right: 1em; + } + + .no-label { + border-top-right-radius: $bar-menus-border-radius * 0.35; + border-bottom-right-radius: $bar-menus-border-radius * 0.35; + } + + .shutdown-label { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-shutdown-text); + } + + .reboot-label { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-restart-text); + } + + .logout-label { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-logout-text); + } + + .sleep-label { + color: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-sleep-text); + } + } + + label:not(.txt-icon) { + margin-left: 1em; + } + + label.txt-icon { + min-width: 3.75rem * $bar-menus-menu-power-scaling * 0.01; + min-height: 3.75rem * $bar-menus-menu-power-scaling * 0.01; + background: $red; + border-top-left-radius: $bar-menus-border-radius * 0.35; + border-bottom-left-radius: $bar-menus-border-radius * 0.35; + font-size: 1.75em; + + &.shutdown-icon { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-shutdown-icon_background); + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-power-buttons-shutdown-icon); + } + + &.reboot-icon { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-restart-icon_background); + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-power-buttons-restart-icon); + } + + &.logout-icon { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-logout-icon_background); + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-power-buttons-logout-icon); + } + + &.sleep-icon { + background: if($bar-menus-monochrome, $bar-menus-buttons-default, $bar-menus-menu-power-buttons-sleep-icon_background); + color: if($bar-menus-monochrome, $bar-menus-buttons-text, $bar-menus-menu-power-buttons-sleep-icon); + } + } +} diff --git a/ags/HyprPanel/scss/style/notifications/popups.scss b/ags/HyprPanel/scss/style/notifications/popups.scss new file mode 100644 index 0000000..c371c3a --- /dev/null +++ b/ags/HyprPanel/scss/style/notifications/popups.scss @@ -0,0 +1,107 @@ +.notification-card { + color: $notification-text; + background: $notification-background; + margin: 0.45em; + border: 0.15em solid transparentize($notification-border, 0.5); + min-width: 26em; + min-height: 6rem; + border-radius: $notification-border_radius; + opacity: $notification-opacity * 0.01; +} + +.notification-card-container { + * { + font-size: $font-size * $notification-scaling * 0.01; + } + + padding: 1px; +} + +.notification-card-image-container { + margin: 0.65em 0.65em; + border-radius: 0.4em; +} + +.notification-card-image { + border-radius: 0.4em; + min-width: 2.5em; + min-height: 2.5em; + padding: 0.85em 0.85em; + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} + +.notification-card-content { + min-width: 2.9em; + min-height: 2.9em; + padding: 0.5em 0.5em; + margin-right: 0.5rem; + margin-bottom: 0.5rem; +} + +.notification-card-content.noimg { + margin-left: 0.5em; + margin-top: .15em; +} + +.notification-card-header-label { + font-size: 0.95em; + margin-bottom: 0.5em; + color: $notification-label; +} + +.notification-card-body-label { + font-size: 0.84em; + margin-bottom: 1em; + font-weight: 600; +} + +.notification-card-actions { + margin-top: 0.25em; + margin-bottom: 0.4em; +} + +.notification-action-buttons { + color: $notification-actions-text; + background: $notification-actions-background; + min-width: 4em; + min-height: 1.65em; + border-radius: 0.2em; + + &:not(:last-child) { + margin-right: 2rem; + } + + &:hover { + background: transparentize($notification-actions-background, 0.6); + } +} + +.notification-icon { + color: $notification-labelicon; + margin-bottom: 0.4em; + min-width: 1em; + min-height: 1em; + font-size: 1.3em; +} + +.notification-time { + font-size: 0.85em; + color: $notification-time; +} + +.close-notification-button { + background: $notification-close_button-background; + color: $notification-close_button-label; + min-width: 2.1em; + border-radius: 0rem $notification-border_radius*0.7 $notification-border_radius*0.7 0em; + + label { + font-size: 1.5em; + } + + &:hover { + background: transparentize($notification-close_button-background, 0.5); + } +} diff --git a/ags/HyprPanel/scss/style/osd/index.scss b/ags/HyprPanel/scss/style/osd/index.scss new file mode 100644 index 0000000..8b60d26 --- /dev/null +++ b/ags/HyprPanel/scss/style/osd/index.scss @@ -0,0 +1,81 @@ +.indicator { + * { + font-size: $font-size * $osd-scaling * 0.01; + } + + .osd-container { + margin: $osd-margins; + opacity: $osd-opacity * 0.01; + } + + .osd-label-container { + background: $osd-bar_container; + + border-radius: if($osd-orientation =="vertical", $osd-radius $osd-radius 0em 0em, 0em $osd-radius $osd-radius 0em); + + .osd-label { + font-size: 1em; + padding-top: if($osd-orientation =="vertical", 1em, 0em); + padding-right: if($osd-orientation =="horizontal", 1em, 0em); + color: $osd-label; + + &.overflow { + color: $osd-bar_overflow_color; + } + } + } + + .osd-icon-container { + background: $osd-icon_container; + + border-radius: if($osd-orientation =="vertical", 0em 0em $osd-radius $osd-radius, $osd-radius 0em 0em $osd-radius ); + + .osd-icon { + font-size: 2.1em; + padding: if($osd-orientation =="vertical", 0.2em 0em, 0em 0.4em); + color: $osd-icon; + } + } + + .osd-bar-container { + padding: 1.25em; + background: $osd-bar_container; + + .osd-bar { + levelbar * { + transition: 200ms; + } + + trough { + min-height: if($osd-orientation =="vertical", 10em, 0); + min-width: if($osd-orientation =="horizontal", 10em, 0); + } + + block { + border-radius: $osd-radius * 0.5; + + &.empty { + background: $osd-bar_empty_color; + + } + + &.filled { + background: $osd-bar_color; + padding: 0.45em; + } + } + + &.overflow { + block { + &.empty { + background: $osd-bar_color; + } + + &.filled { + background: $osd-bar_overflow_color; + } + } + } + } + } +} diff --git a/ags/HyprPanel/scss/style/settings/dialog.scss b/ags/HyprPanel/scss/style/settings/dialog.scss new file mode 100644 index 0000000..27ac3df --- /dev/null +++ b/ags/HyprPanel/scss/style/settings/dialog.scss @@ -0,0 +1,407 @@ +window.settings-dialog { + opacity: $bar-menus-opacity * 0.01; + background-color: $bar-menus-cards; + color: $bar-menus-text; + + $widget-bg: $bar-menus-cards; + $border: none; + $fg: $bar-menus-text; + + .settings-dialog-box { + min-width: 75em; + } + + .header { + background-color: transparentize($bar-menus-background, 0.1); + border-bottom-left-radius: $bar-menus-border-radius * 0.5; + border-bottom-right-radius: $bar-menus-border-radius * 0.5; + padding: $padding; + + button { + font-weight: bold; + + } + + button.close { + color: $bar-menus-iconbuttons-passive; + + image { + font-size: 2em; + } + + &:hover { + color: $bar-menus-buttons-active; + } + } + + button.reset { + color: $bar-menus-iconbuttons-passive; + padding: $padding*.5; + + image { + font-size: 1.25em; + } + + &:hover { + color: $bar-menus-buttons-active; + } + } + } + + .page { + + .page-content { + padding: $padding*2; + padding-top: 0; + } + } + + .group { + .group-title { + color: $bar-menus-text; + margin-bottom: $spacing*.5; + } + + .group-reset { + margin: $spacing * .5; + padding: $padding * .5; + + &:disabled { + color: transparent; + } + } + + &:not(:first-child) { + margin-top: $spacing; + } + } + + .row { + background-color: $widget-bg; + padding: $padding; + border: $border; + border-top: none; + + &:first-child { + border-radius: $radius $radius 0em 0em; + border: $border; + } + + &:last-child { + border-radius: 0em 0em $radius $radius; + } + + &:first-child:last-child { + border-radius: $radius; + border: $border; + } + + button.reset { + margin-left: $spacing; + } + + label.id, + label.note { + color: transparentize($fg, .4) + } + + entry, + button { + padding: $padding; + } + + spinbutton { + entry { + border-radius: $radius 0em 0em $radius; + } + + button { + border-radius: 0em; + } + + button:last-child { + border-radius: 0em $radius $radius 0em; + } + } + + .enum-setter { + label { + background-color: $widget-bg; + border: $border; + padding: 0em $padding; + border-radius: $radius 0em 0em $radius; + } + + button { + border-radius: 0em; + } + + button:last-child { + border-radius: 0em $radius $radius 0em; + } + } + + &.wallpaper { + button { + margin-top: $spacing * .5; + } + + .preview { + border-radius: $radius; + } + } + } +} + +.option-item { + margin: 0em 2em; + margin-bottom: 1em; + + .reset { + color: $bar-menus-iconbuttons-passive; + } + + .options-label { + color: $bar-menus-text; + } + + .options-sublabel { + font-size: 0.75em; + margin-top: 0.2em; + color: $bar-menus-dimtext; + } + + .options-sublabel-link { + + label { + font-size: 0.75em; + margin-top: 0.2em; + color: $bar-menus-dimtext; + } + + &:hover label { + color: $bar-menus-listitems-active; + } + } + + .inputter-container { + border-radius: $bar-menus-border-radius * 0.5; + + :first-child { + border-radius: $bar-menus-border-radius * 0.5; + } + + padding: 0.35em 0.35em; + background: transparentize($bar-menus-background, 0.6); + margin-right: 1em; + } +} + +.options-header { + margin: 1em 1em; + + .label-name { + color: $bar-menus-label; + font-size: 0.9em; + margin-right: 0.5em; + } +} + +.pager-button { + color: transparentize($bar-menus-text, 0.4); + margin: 0.5em 0.75em; + + &.category label { + font-size: 1.4em; + } + + &:hover { + label { + text-decoration: underline; + color: $bar-menus-text; + } + } + + &.active { + label { + text-decoration: underline; + color: $bar-menus-text; + } + } +} + +.bar-theme-page { + min-height: 40em; +} + +.settings-menu-stack { + background: $red; +} + +.paged-container { + .reset-options { + color: $bar-menus-text; + + image:disabled { + color: $bar-menus-buttons-disabled; + } + + &:hover { + image { + color: transparentize($bar-menus-text, 0.5); + } + } + } + + scrollbar { + margin-right: 0.2em; + min-width: 0.6em; + border-radius: $bar-menus-border-radius; + background: $bar-menus-background; + + slider { + min-width: 0.6em; + border-radius: $bar-menus-border-radius; + background: $bar-menus-buttons-default; + } + } + + selection { + background: $bar-menus-label; + color: $bar-menus-cards; + } + + switch { + font-size: 10px; + + &:checked { + background: $bar-menus-switch-enabled; + } + + slider { + background-color: $bar-menus-switch-puck; + } + + &:active { + background: if($bar-menus-monochrome, $bar-menus-switch-enabled, $bar-menus-menu-bluetooth-switch-enabled); + } + } + + entry { + min-width: 15em; + } +} + +dialog { + background: $bar-menus-cards; + color: $bar-menus-text; + + :selected { + background: transparentize($bar-menus-label, 0.2); + color: transparentize($bar-menus-cards, 0.2); + } + + headerbar { + border-bottom: 0.075em solid $bar-menus-border-color; + background: $bar-menus-cards; + padding: 0.5em; + font-size: 1.5em; + + button { + color: $bar-menus-buttons-text; + min-width: 4.5em; + min-height: 2.5em; + border-radius: $bar-menus-border-radius; + background: $bar-menus-buttons-default; + + &:hover { + background: transparentize($bar-menus-buttons-default, 0.5); + } + } + } + + viewport { + border-right: .25em solid $bar-menus-border-color; + + list { + row { + padding: 0em 1.5em; + + &:hover { + background: $bar-menus-buttons-default; + color: $bar-menus-buttons-text; + } + + label { + margin: 0.5em 0.5em; + font-size: 0.85em; + } + } + } + + } + + stack { + .horizontal .path-bar { + button { + background: $bar-menus-iconbuttons-active; + min-width: 3em; + min-height: 2em; + border-radius: $bar-menus-border-radius * 0.5; + + &:disabled { + background: $bar-menus-buttons-disabled; + } + + &:hover { + background: transparentize($bar-menus-buttons-active, 0.5); + } + + label { + margin: 0em 0.25em; + color: $bar-menus-buttons-text + } + + image { + margin: 0em 0.5em; + color: $bar-menus-buttons-text + } + + margin: 0.25em; + } + } + } + + treeview header button { + padding: 0.25em; + border: .15em solid $bar-menus-border-color; + } + + headerbar { + color: $bar-menus-label; + } +} + +.unsaved-icon { + margin-right: 1em; + font-size: 1em; + color: $yellow; +} + +.options-import, +.options-export { + border-radius: $bar-menus-border-radius * 0.5; + color: $bar-menus-buttons-text; + padding: 0.35em 0.35em; + background: $bar-menus-buttons-default; + margin-right: 1em; + margin-left: 0.5em; + + &:hover { + background: transparentize($bar-menus-buttons-default, 0.8); + } +} + +.options-import { + margin-right: 0em; +} diff --git a/ags/HyprPanel/services/Brightness.ts b/ags/HyprPanel/services/Brightness.ts new file mode 100644 index 0000000..4ac8d49 --- /dev/null +++ b/ags/HyprPanel/services/Brightness.ts @@ -0,0 +1,74 @@ +// <3 Aylur for this brightness service +import { bash, dependencies, sh } from 'lib/utils'; + +if (!dependencies('brightnessctl')) App.quit(); + +const get = (args: string): number => Number(Utils.exec(`brightnessctl ${args}`)); +const screen = await bash`ls -w1 /sys/class/backlight | head -1`; +const kbd = await bash`ls -w1 /sys/class/leds | grep '::kbd_backlight$' | head -1`; + +class Brightness extends Service { + static { + Service.register( + this, + {}, + { + screen: ['float', 'rw'], + kbd: ['int', 'rw'], + }, + ); + } + + #kbdMax = get(`--device ${kbd} max`); + #kbd = get(`--device ${kbd} get`); + #screenMax = get(`--device ${screen} max`); + #screen = get(`--device ${screen} get`) / (get(`--device ${screen} max`) || 1); + + get kbd(): number { + return this.#kbd; + } + get screen(): number { + return this.#screen; + } + + set kbd(value) { + if (value < 0 || value > this.#kbdMax) return; + + sh(`brightnessctl -d ${kbd} s ${value} -q`).then(() => { + this.#kbd = value; + this.changed('kbd'); + }); + } + + set screen(percent) { + if (percent < 0) percent = 0; + + if (percent > 1) percent = 1; + + sh(`brightnessctl set ${Math.round(percent * 100)}% -d ${screen} -q`).then(() => { + this.#screen = percent; + this.changed('screen'); + }); + } + + constructor() { + super(); + + const screenPath = `/sys/class/backlight/${screen}/brightness`; + const kbdPath = `/sys/class/leds/${kbd}/brightness`; + + Utils.monitorFile(screenPath, async (f) => { + const v = await Utils.readFileAsync(f); + this.#screen = Number(v) / this.#screenMax; + this.changed('screen'); + }); + + Utils.monitorFile(kbdPath, async (f) => { + const v = await Utils.readFileAsync(f); + this.#kbd = Number(v) / this.#kbdMax; + this.changed('kbd'); + }); + } +} + +export default new Brightness(); diff --git a/ags/HyprPanel/services/Wallpaper.ts b/ags/HyprPanel/services/Wallpaper.ts new file mode 100644 index 0000000..a27947c --- /dev/null +++ b/ags/HyprPanel/services/Wallpaper.ts @@ -0,0 +1,97 @@ +import { dependencies, sh } from 'lib/utils'; +import options from 'options'; +const hyprland = await Service.import('hyprland'); + +const WP = `${Utils.HOME}/.config/background`; + +class Wallpaper extends Service { + static { + Service.register( + this, + {}, + { + wallpaper: ['string'], + }, + ); + } + + #blockMonitor = false; + #isRunning = false; + + #wallpaper(): void { + if (!dependencies('swww')) return; + + hyprland.monitors.map((m) => m.name); + sh('hyprctl cursorpos').then((pos) => { + sh([ + 'swww', + 'img', + '--invert-y', + '--transition-type', + 'grow', + '--transition-duration', + '1.5', + '--transition-fps', + '30', + '--transition-pos', + pos.replace(' ', ''), + WP, + ]).then(() => { + this.changed('wallpaper'); + }); + }); + } + + async #setWallpaper(path: string): Promise { + this.#blockMonitor = true; + + await sh(`cp ${path} ${WP}`); + this.#wallpaper(); + + this.#blockMonitor = false; + } + + readonly set = (path: string): void => { + this.#setWallpaper(path); + }; + readonly isRunning = (): boolean => { + return this.#isRunning; + }; + + get wallpaper(): string { + return WP; + } + + constructor() { + super(); + + options.wallpaper.enable.connect('changed', () => { + if (options.wallpaper.enable.value) { + this.#isRunning = true; + Utils.execAsync('swww-daemon') + .then(() => { + this.#wallpaper(); + }) + .catch(() => null); + } else { + this.#isRunning = false; + Utils.execAsync('pkill swww-daemon').catch(() => null); + } + }); + + if (!dependencies('swww') || !options.wallpaper.enable.value) return this; + + this.#isRunning = true; + Utils.monitorFile(WP, () => { + if (!this.#blockMonitor) this.#wallpaper(); + }); + + Utils.execAsync('swww-daemon') + .then(() => { + this.#wallpaper(); + }) + .catch(() => null); + } +} + +export default new Wallpaper(); diff --git a/ags/HyprPanel/services/bluetooth.py b/ags/HyprPanel/services/bluetooth.py new file mode 100755 index 0000000..bc26f77 --- /dev/null +++ b/ags/HyprPanel/services/bluetooth.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 + +import dbus +import dbus.service +import dbus.mainloop.glib +from gi.repository import GLib +import subprocess +import logging + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +AGENT_PATH = "/test/agent" +CAPABILITY = "NoInputNoOutput" + +def send_notification_with_actions(title, message, actions, action_handler): + bus = dbus.SessionBus() + notification_object = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications") + notify_interface = dbus.Interface(notification_object, "org.freedesktop.Notifications") + bus.add_signal_receiver(action_handler, + dbus_interface="org.freedesktop.Notifications", + signal_name="ActionInvoked") + notify_interface.Notify("bluetooth_agent", 0, "", title, message, actions, {}, -1) + +class Agent(dbus.service.Object): + def __init__(self, bus): + dbus.service.Object.__init__(self, bus, AGENT_PATH) + + @dbus.service.method("org.bluez.Agent1", in_signature="", out_signature="") + def Release(self): + logging.info("Release") + + def get_device_name(self, device): + bus = dbus.SystemBus() + device_proxy = bus.get_object("org.bluez", device) + device_properties = dbus.Interface(device_proxy, "org.freedesktop.DBus.Properties") + return device_properties.Get("org.bluez.Device1", "Name") + + @dbus.service.method("org.bluez.Agent1", in_signature="o", out_signature="") + def RequestPinCode(self, device): + device_name = self.get_device_name(device) + logging.info(f"RequestPinCode {device_name} ({device})") + self.request_input("Enter PIN code", f"Enter PIN code for device {device_name}", device, "pin") + + @dbus.service.method("org.bluez.Agent1", in_signature="o", out_signature="u") + def RequestPasskey(self, device): + device_name = self.get_device_name(device) + logging.info(f"RequestPasskey {device_name} ({device})") + self.request_input("Enter Passkey", f"Enter passkey for device {device_name}", device, "passkey") + + @dbus.service.method("org.bluez.Agent1", in_signature="ou", out_signature="") + def DisplayPasskey(self, device, passkey): + device_name = self.get_device_name(device) + logging.info(f"DisplayPasskey {device_name} passkey {passkey}") + send_notification_with_actions("Bluetooth Pairing Request", f"Passkey for device {device_name} is {passkey}", [], lambda *args: None) + + @dbus.service.method("org.bluez.Agent1", in_signature="ou", out_signature="") + def RequestConfirmation(self, device, passkey): + device_name = self.get_device_name(device) + logging.info(f"RequestConfirmation {device_name} passkey {passkey}") + actions = ["confirm", "Confirm", "deny", "Deny"] + + def action_handler(notification_id, action_key): + if action_key == "confirm": + logging.info(f"Confirmed pairing for {device_name}") + self.send_reply(device) + elif action_key == "deny": + logging.info(f"Denied pairing for {device_name}") + self.send_error(device, "org.bluez.Error.Rejected") + + send_notification_with_actions("Bluetooth Pairing Request", + f"Confirm passkey {passkey} for device {device_name}", + actions, action_handler) + return + + @dbus.service.method("org.bluez.Agent1", in_signature="o", out_signature="") + def RequestAuthorization(self, device): + device_name = self.get_device_name(device) + logging.info(f"RequestAuthorization {device_name}") + actions = ["confirm", "Confirm", "deny", "Deny"] + + def action_handler(notification_id, action_key): + if action_key == "confirm": + logging.info(f"Authorized device {device_name}") + self.send_reply(device) + elif action_key == "deny": + logging.info(f"Denied authorization for {device_name}") + self.send_error(device, "org.bluez.Error.Rejected") + + send_notification_with_actions("Bluetooth Service Authorization", + f"Authorize device {device_name}", + actions, action_handler) + return + + @dbus.service.method("org.bluez.Agent1", in_signature="os", out_signature="") + def AuthorizeService(self, device, uuid): + device_name = self.get_device_name(device) + logging.info(f"AuthorizeService {device_name} uuid {uuid}") + actions = ["confirm", "Confirm", "deny", "Deny"] + + def action_handler(notification_id, action_key): + if action_key == "confirm": + logging.info(f"Authorized service {uuid} for device {device_name}") + self.send_reply(device) + elif action_key == "deny": + logging.info(f"Denied authorization for service {uuid} on device {device_name}") + self.send_error(device, "org.bluez.Error.Rejected") + + send_notification_with_actions("Bluetooth Service Authorization", + f"Authorize service {uuid} for device {device_name}", + actions, action_handler) + return + + @dbus.service.method("org.bluez.Agent1", in_signature="", out_signature="") + def Cancel(self): + logging.info("Cancel") + + def request_input(self, title, message, device, input_type): + def action_handler(notification_id, action_key): + if action_key == "input": + result = subprocess.run(["zenity", "--entry", "--title", title, "--text", message], capture_output=True, text=True) + user_input = result.stdout.strip() + if input_type == "pin": + self.handle_pin_input(device, user_input) + elif input_type == "passkey": + self.handle_passkey_input(device, user_input) + elif action_key == "cancel": + self.send_error(device, "org.bluez.Error.Rejected") + + actions = ["input", "Enter", "cancel", "Cancel"] + send_notification_with_actions(title, message, actions, action_handler) + + def handle_pin_input(self, device, pin_code): + logging.info(f"PIN code entered for {device}: {pin_code}") + self.send_reply(device) + + def handle_passkey_input(self, device, passkey): + logging.info(f"Passkey entered for {device}: {passkey}") + self.send_reply(device) + + def send_reply(self, device): + logging.info(f"Sending reply for {device}") + bus = dbus.SystemBus() + agent = bus.get_object("org.bluez", device) + agent_interface = dbus.Interface(agent, "org.bluez.Device1") + agent_interface.Pair(reply_handler=self.success_callback, error_handler=self.error_callback) + + def send_error(self, device, error): + logging.info(f"Sending error for {device}") + bus = dbus.SystemBus() + agent = bus.get_object("org.bluez", device) + agent_interface = dbus.Interface(agent, "org.bluez.Device1") + agent_interface.CancelPairing(reply_handler=self.success_callback, error_handler=self.error_callback) + + def success_callback(self): + logging.info("Operation succeeded") + + def error_callback(self, error): + logging.error(f"Operation failed: {error}") + +def register_agent(): + bus = dbus.SystemBus() + manager = dbus.Interface(bus.get_object("org.bluez", "/org/bluez"), "org.bluez.AgentManager1") + path = AGENT_PATH + agent = Agent(bus) + manager.RegisterAgent(path, CAPABILITY) + manager.RequestDefaultAgent(path) + logging.info("Agent registered") + +if __name__ == "__main__": + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + register_agent() + loop = GLib.MainLoop() + loop.run() diff --git a/ags/HyprPanel/services/matugen/index.ts b/ags/HyprPanel/services/matugen/index.ts new file mode 100644 index 0000000..e39c3cb --- /dev/null +++ b/ags/HyprPanel/services/matugen/index.ts @@ -0,0 +1,70 @@ +import { defaultColorMap } from 'lib/types/defaults/options'; +import { ColorMapValue, ColorMapKey, HexColor, MatugenColors } from 'lib/types/options'; +import { getMatugenVariations } from './variations'; +import { bash, dependencies, Notify, isAnImage } from 'lib/utils'; +import options from 'options'; +import icons from 'lib/icons'; +import { Variable } from 'types/variable'; +const { scheme_type, contrast } = options.theme.matugen_settings; +const { matugen } = options.theme; + +const updateOptColor = (color: HexColor, opt: Variable): void => { + opt.value = color; +}; + +export async function generateMatugenColors(): Promise { + if (!matugen.value || !dependencies('matugen')) { + return; + } + const wallpaperPath = options.wallpaper.image.value; + + try { + if (!wallpaperPath.length || !isAnImage(wallpaperPath)) { + Notify({ + summary: 'Matugen Failed', + body: "Please select a wallpaper in 'Theming > General' first.", + iconName: icons.ui.warning, + timeout: 7000, + }); + return; + } + + const normalizedContrast = contrast.value > 1 ? 1 : contrast.value < -1 ? -1 : contrast.value; + const contents = await bash( + `matugen image ${wallpaperPath} -t scheme-${scheme_type.value} --contrast ${normalizedContrast} --json hex`, + ); + + return JSON.parse(contents).colors[options.theme.matugen_settings.mode.value]; + } catch (error) { + const errMsg = `An error occurred while generating matugen colors: ${error}`; + console.error(errMsg); + return; + } +} + +const isColorValid = (color: string): color is ColorMapKey => { + return defaultColorMap.hasOwnProperty(color); +}; + +export const replaceHexValues = (incomingHex: HexColor, matugenColors: MatugenColors): HexColor => { + if (!options.theme.matugen.value) { + return incomingHex; + } + + const matugenVariation = getMatugenVariations(matugenColors, options.theme.matugen_settings.variation.value); + updateOptColor(matugenVariation.base, options.theme.bar.menus.menu.media.card.color as Variable); + + for (const curColor of Object.keys(defaultColorMap)) { + const currentColor: string = curColor; + if (!isColorValid(currentColor)) { + continue; + } + + const curColorValue: ColorMapValue = defaultColorMap[currentColor]; + if (curColorValue === incomingHex) { + return matugenVariation[currentColor]; + } + } + + return incomingHex; +}; diff --git a/ags/HyprPanel/services/matugen/variations.ts b/ags/HyprPanel/services/matugen/variations.ts new file mode 100644 index 0000000..7daba85 --- /dev/null +++ b/ags/HyprPanel/services/matugen/variations.ts @@ -0,0 +1,570 @@ +import { MatugenColors, MatugenVariation, MatugenVariations } from 'lib/types/options'; + +/* + * NOTE: This maps the values of the default colors to the values generated by Matugen. + * Each of the variations are carefully tested and curated to make sure that colors don't + * have weird luminocity overlaps (light on light, dark on dark). + */ +export const getMatugenVariations = (matugenColors: MatugenColors, variation: MatugenVariations): MatugenVariation => { + const matVtns = { + standard_1: { + rosewater: matugenColors.secondary, + flamingo: matugenColors.secondary, + pink: matugenColors.tertiary, + mauve: matugenColors.primary, + red: matugenColors.tertiary, + maroon: matugenColors.primary, + peach: matugenColors.tertiary, + yellow: matugenColors.secondary, + green: matugenColors.primary, + teal: matugenColors.secondary, + sky: matugenColors.secondary, + sapphire: matugenColors.primary, + blue: matugenColors.primary, + lavender: matugenColors.primary, + text: matugenColors.on_background, + subtext1: matugenColors.outline, + subtext2: matugenColors.outline, + overlay2: matugenColors.outline, + overlay1: matugenColors.outline, + overlay0: matugenColors.outline, + surface2: matugenColors.outline, + surface1: matugenColors.surface_bright, + surface0: matugenColors.surface_bright, + base2: matugenColors.inverse_on_surface, + base: matugenColors.inverse_on_surface, + mantle: matugenColors.surface_dim, + crust: matugenColors.surface_dim, + notifications_closer: matugenColors.primary, + notifications_background: matugenColors.surface_dim, + dashboard_btn_text: matugenColors.surface_dim, + red2: matugenColors.tertiary, + peach2: matugenColors.tertiary, + pink2: matugenColors.tertiary, + mantle2: matugenColors.surface_dim, + surface1_2: matugenColors.inverse_on_surface, + surface0_2: matugenColors.surface_bright, + overlay1_2: matugenColors.outline, + text2: matugenColors.on_background, + lavender2: matugenColors.primary, + crust2: matugenColors.surface_dim, + maroon2: matugenColors.primary, + mauve2: matugenColors.primary, + green2: matugenColors.primary, + surface2_2: matugenColors.surface, + sky2: matugenColors.secondary, + teal2: matugenColors.secondary, + yellow2: matugenColors.secondary, + pink3: matugenColors.tertiary, + red3: matugenColors.secondary, + mantle3: matugenColors.inverse_on_surface, + surface0_3: matugenColors.outline, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.outline, + lavender3: matugenColors.primary, + mauve3: matugenColors.primary, + green3: matugenColors.primary, + sky3: matugenColors.secondary, + teal3: matugenColors.secondary, + yellow3: matugenColors.secondary, + maroon3: matugenColors.primary, + crust3: matugenColors.surface_dim, + }, + standard_2: { + rosewater: matugenColors.primary, + flamingo: matugenColors.primary, + pink: matugenColors.tertiary, + mauve: matugenColors.secondary, + red: matugenColors.tertiary, + maroon: matugenColors.secondary, + peach: matugenColors.tertiary, + yellow: matugenColors.primary, + green: matugenColors.secondary, + teal: matugenColors.primary, + sky: matugenColors.primary, + sapphire: matugenColors.secondary, + blue: matugenColors.secondary, + lavender: matugenColors.secondary, + text: matugenColors.on_background, + subtext1: matugenColors.outline, + subtext2: matugenColors.outline, + overlay2: matugenColors.outline, + overlay1: matugenColors.outline, + overlay0: matugenColors.outline, + surface2: matugenColors.outline, + surface1: matugenColors.surface_bright, + surface0: matugenColors.surface_bright, + base2: matugenColors.inverse_on_surface, + base: matugenColors.inverse_on_surface, + mantle: matugenColors.surface_dim, + crust: matugenColors.surface_dim, + notifications_closer: matugenColors.tertiary, + notifications_background: matugenColors.surface_dim, + dashboard_btn_text: matugenColors.surface_dim, + red2: matugenColors.tertiary, + peach2: matugenColors.tertiary, + pink2: matugenColors.tertiary, + mantle2: matugenColors.surface_dim, + surface1_2: matugenColors.inverse_on_surface, + surface0_2: matugenColors.surface_bright, + overlay1_2: matugenColors.outline, + text2: matugenColors.on_background, + lavender2: matugenColors.secondary, + crust2: matugenColors.surface_dim, + maroon2: matugenColors.secondary, + surface2_2: matugenColors.surface, + mauve2: matugenColors.secondary, + green2: matugenColors.secondary, + sky2: matugenColors.primary, + teal2: matugenColors.primary, + yellow2: matugenColors.primary, + pink3: matugenColors.tertiary, + red3: matugenColors.secondary, + mantle3: matugenColors.inverse_on_surface, + surface0_3: matugenColors.outline, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.outline, + lavender3: matugenColors.secondary, + mauve3: matugenColors.secondary, + green3: matugenColors.secondary, + sky3: matugenColors.primary, + teal3: matugenColors.primary, + yellow3: matugenColors.primary, + maroon3: matugenColors.secondary, + crust3: matugenColors.surface_dim, + }, + standard_3: { + rosewater: matugenColors.secondary, + flamingo: matugenColors.secondary, + pink: matugenColors.secondary, + mauve: matugenColors.primary, + red: matugenColors.secondary, + maroon: matugenColors.primary, + peach: matugenColors.secondary, + yellow: matugenColors.secondary, + green: matugenColors.primary, + teal: matugenColors.secondary, + sky: matugenColors.secondary, + sapphire: matugenColors.primary, + blue: matugenColors.primary, + lavender: matugenColors.primary, + text: matugenColors.on_background, + subtext1: matugenColors.outline, + subtext2: matugenColors.outline, + overlay2: matugenColors.outline, + overlay1: matugenColors.outline, + overlay0: matugenColors.outline, + surface2: matugenColors.outline, + surface1: matugenColors.surface_bright, + surface0: matugenColors.surface_bright, + base2: matugenColors.inverse_on_surface, + base: matugenColors.inverse_on_surface, + mantle: matugenColors.surface_dim, + crust: matugenColors.surface_dim, + notifications_closer: matugenColors.secondary, + notifications_background: matugenColors.surface_dim, + dashboard_btn_text: matugenColors.surface_dim, + red2: matugenColors.secondary, + peach2: matugenColors.secondary, + pink2: matugenColors.secondary, + mantle2: matugenColors.surface_dim, + surface1_2: matugenColors.inverse_on_surface, + surface0_2: matugenColors.surface_bright, + surface2_2: matugenColors.surface, + overlay1_2: matugenColors.outline, + text2: matugenColors.on_background, + lavender2: matugenColors.primary, + crust2: matugenColors.surface_dim, + maroon2: matugenColors.primary, + mauve2: matugenColors.primary, + green2: matugenColors.primary, + sky2: matugenColors.secondary, + teal2: matugenColors.secondary, + yellow2: matugenColors.secondary, + pink3: matugenColors.secondary, + red3: matugenColors.secondary, + mantle3: matugenColors.inverse_on_surface, + surface0_3: matugenColors.outline, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.outline, + lavender3: matugenColors.primary, + mauve3: matugenColors.primary, + green3: matugenColors.primary, + sky3: matugenColors.secondary, + teal3: matugenColors.secondary, + yellow3: matugenColors.secondary, + maroon3: matugenColors.primary, + crust3: matugenColors.surface_dim, + }, + vivid_1: { + rosewater: matugenColors.surface, + flamingo: matugenColors.surface, + pink: matugenColors.surface, + mauve: matugenColors.surface, + red: matugenColors.surface, + maroon: matugenColors.surface, + peach: matugenColors.surface, + yellow: matugenColors.surface, + green: matugenColors.surface, + teal: matugenColors.surface, + sky: matugenColors.surface, + sapphire: matugenColors.surface, + blue: matugenColors.surface, + lavender: matugenColors.surface, + text: matugenColors.surface, + subtext1: matugenColors.primary_container, + subtext2: matugenColors.primary_container, + overlay2: matugenColors.primary_container, + overlay1: matugenColors.primary_container, + overlay0: matugenColors.primary_container, + surface2: matugenColors.surface_container_high, + surface1: matugenColors.surface_container_high, + surface0: matugenColors.surface_container_high, + base2: matugenColors.primary, + base: matugenColors.primary, + mantle: matugenColors.surface_container_low, + crust: matugenColors.surface_container_lowest, + red2: matugenColors.primary_container, + peach2: matugenColors.primary_container, + pink2: matugenColors.primary_container, + mantle2: matugenColors.primary, + surface1_2: matugenColors.primary, + surface0_2: matugenColors.primary, + overlay1_2: matugenColors.surface_container_high, + text2: matugenColors.outline, + lavender2: matugenColors.primary_container, + crust2: matugenColors.primary, + maroon2: matugenColors.primary_container, + mauve2: matugenColors.primary_container, + surface2_2: matugenColors.primary_container, + green2: matugenColors.primary_container, + sky2: matugenColors.primary_container, + teal2: matugenColors.primary_container, + yellow2: matugenColors.primary_container, + pink3: matugenColors.primary_fixed, + red3: matugenColors.secondary, + mantle3: matugenColors.primary, + surface0_3: matugenColors.primary, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.primary, + lavender3: matugenColors.primary, + mauve3: matugenColors.primary, + green3: matugenColors.primary_fixed, + sky3: matugenColors.primary, + teal3: matugenColors.primary, + yellow3: matugenColors.primary_fixed, + maroon3: matugenColors.primary_fixed, + crust3: matugenColors.primary, + }, + vivid_2: { + rosewater: matugenColors.surface, + flamingo: matugenColors.surface, + pink: matugenColors.surface, + mauve: matugenColors.surface, + red: matugenColors.surface, + maroon: matugenColors.surface, + peach: matugenColors.surface, + yellow: matugenColors.surface, + green: matugenColors.surface, + teal: matugenColors.surface, + sky: matugenColors.surface, + sapphire: matugenColors.surface, + blue: matugenColors.surface, + lavender: matugenColors.surface, + text: matugenColors.surface, + subtext1: matugenColors.secondary_container, + subtext2: matugenColors.secondary_container, + overlay2: matugenColors.secondary_container, + overlay1: matugenColors.secondary_container, + overlay0: matugenColors.secondary_container, + surface2: matugenColors.surface_container_high, + surface1: matugenColors.surface_container_high, + surface0: matugenColors.surface_container_high, + base2: matugenColors.secondary, + base: matugenColors.secondary, + mantle: matugenColors.surface_container_low, + crust: matugenColors.surface_container_lowest, + red2: matugenColors.secondary_container, + peach2: matugenColors.secondary_container, + pink2: matugenColors.secondary_container, + surface2_2: matugenColors.primary_container, + mantle2: matugenColors.secondary, + surface1_2: matugenColors.secondary, + surface0_2: matugenColors.secondary, + overlay1_2: matugenColors.surface_container_high, + text2: matugenColors.outline, + lavender2: matugenColors.secondary_container, + crust2: matugenColors.secondary, + maroon2: matugenColors.secondary_container, + mauve2: matugenColors.secondary_container, + green2: matugenColors.secondary_container, + sky2: matugenColors.secondary_container, + teal2: matugenColors.secondary_container, + yellow2: matugenColors.secondary_container, + pink3: matugenColors.secondary_fixed, + red3: matugenColors.secondary, + mantle3: matugenColors.secondary, + surface0_3: matugenColors.secondary, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.secondary, + lavender3: matugenColors.secondary, + mauve3: matugenColors.secondary, + green3: matugenColors.secondary_fixed, + sky3: matugenColors.secondary, + teal3: matugenColors.secondary, + yellow3: matugenColors.secondary_fixed, + maroon3: matugenColors.secondary_fixed, + crust3: matugenColors.secondary, + }, + vivid_3: { + rosewater: matugenColors.surface, + flamingo: matugenColors.surface, + pink: matugenColors.surface, + mauve: matugenColors.surface, + red: matugenColors.surface, + maroon: matugenColors.surface, + peach: matugenColors.surface, + yellow: matugenColors.surface, + green: matugenColors.surface, + teal: matugenColors.surface, + sky: matugenColors.surface, + sapphire: matugenColors.surface, + blue: matugenColors.surface, + lavender: matugenColors.surface, + text: matugenColors.surface, + subtext1: matugenColors.tertiary_container, + subtext2: matugenColors.tertiary_container, + overlay2: matugenColors.tertiary_container, + overlay1: matugenColors.tertiary_container, + overlay0: matugenColors.tertiary_container, + surface2: matugenColors.surface_container_high, + surface1: matugenColors.surface_container_high, + surface0: matugenColors.surface_container_high, + base2: matugenColors.tertiary, + base: matugenColors.tertiary, + mantle: matugenColors.surface_container_low, + crust: matugenColors.surface_container_lowest, + red2: matugenColors.tertiary_container, + peach2: matugenColors.tertiary_container, + pink2: matugenColors.tertiary_container, + mantle2: matugenColors.tertiary, + surface1_2: matugenColors.tertiary, + surface0_2: matugenColors.tertiary, + overlay1_2: matugenColors.surface_container_high, + text2: matugenColors.outline, + lavender2: matugenColors.tertiary_container, + surface2_2: matugenColors.primary_container, + crust2: matugenColors.tertiary, + maroon2: matugenColors.tertiary_container, + mauve2: matugenColors.tertiary_container, + green2: matugenColors.tertiary_container, + sky2: matugenColors.tertiary_container, + teal2: matugenColors.tertiary_container, + yellow2: matugenColors.tertiary_container, + pink3: matugenColors.tertiary_fixed, + red3: matugenColors.secondary, + mantle3: matugenColors.tertiary, + surface0_3: matugenColors.tertiary, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.tertiary, + lavender3: matugenColors.tertiary, + mauve3: matugenColors.tertiary, + green3: matugenColors.tertiary_fixed, + sky3: matugenColors.tertiary, + teal3: matugenColors.tertiary, + yellow3: matugenColors.tertiary_fixed, + maroon3: matugenColors.tertiary_fixed, + crust3: matugenColors.tertiary, + }, + monochrome_1: { + rosewater: matugenColors.primary, + flamingo: matugenColors.primary, + pink: matugenColors.primary, + mauve: matugenColors.primary, + red: matugenColors.primary, + maroon: matugenColors.primary, + peach: matugenColors.primary, + yellow: matugenColors.primary, + green: matugenColors.primary, + teal: matugenColors.primary, + sky: matugenColors.primary, + sapphire: matugenColors.primary, + blue: matugenColors.primary, + lavender: matugenColors.primary, + text: matugenColors.on_background, + subtext1: matugenColors.outline, + subtext2: matugenColors.outline, + overlay2: matugenColors.outline, + overlay1: matugenColors.outline, + overlay0: matugenColors.outline, + surface2: matugenColors.outline, + surface1: matugenColors.surface_bright, + surface0: matugenColors.surface_bright, + base2: matugenColors.inverse_on_surface, + base: matugenColors.inverse_on_surface, + mantle: matugenColors.surface_dim, + crust: matugenColors.surface_dim, + notifications_closer: matugenColors.primary, + notifications_background: matugenColors.surface_dim, + dashboard_btn_text: matugenColors.surface_dim, + red2: matugenColors.primary, + peach2: matugenColors.primary, + pink2: matugenColors.primary, + mantle2: matugenColors.surface_dim, + surface1_2: matugenColors.inverse_on_surface, + surface0_2: matugenColors.surface_bright, + surface2_2: matugenColors.surface, + overlay1_2: matugenColors.outline, + text2: matugenColors.on_background, + lavender2: matugenColors.primary, + crust2: matugenColors.surface_dim, + maroon2: matugenColors.primary, + mauve2: matugenColors.primary, + green2: matugenColors.primary, + sky2: matugenColors.primary, + teal2: matugenColors.primary, + yellow2: matugenColors.primary, + pink3: matugenColors.primary, + red3: matugenColors.secondary, + mantle3: matugenColors.inverse_on_surface, + surface0_3: matugenColors.outline, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.outline, + lavender3: matugenColors.primary, + mauve3: matugenColors.primary, + green3: matugenColors.primary, + sky3: matugenColors.primary, + teal3: matugenColors.primary, + yellow3: matugenColors.primary, + maroon3: matugenColors.primary, + crust3: matugenColors.surface_dim, + }, + monochrome_2: { + rosewater: matugenColors.secondary, + flamingo: matugenColors.secondary, + pink: matugenColors.secondary, + mauve: matugenColors.secondary, + red: matugenColors.secondary, + maroon: matugenColors.secondary, + peach: matugenColors.secondary, + yellow: matugenColors.secondary, + green: matugenColors.secondary, + teal: matugenColors.secondary, + sky: matugenColors.secondary, + sapphire: matugenColors.secondary, + blue: matugenColors.secondary, + lavender: matugenColors.secondary, + text: matugenColors.on_background, + subtext1: matugenColors.outline, + subtext2: matugenColors.outline, + overlay2: matugenColors.outline, + overlay1: matugenColors.outline, + overlay0: matugenColors.outline, + surface2: matugenColors.outline, + surface1: matugenColors.surface_bright, + surface0: matugenColors.surface_bright, + base2: matugenColors.inverse_on_surface, + base: matugenColors.inverse_on_surface, + mantle: matugenColors.surface_dim, + crust: matugenColors.surface_dim, + notifications_closer: matugenColors.secondary, + notifications_background: matugenColors.surface_dim, + dashboard_btn_text: matugenColors.surface_dim, + red2: matugenColors.secondary, + peach2: matugenColors.secondary, + pink2: matugenColors.secondary, + mantle2: matugenColors.surface_dim, + surface1_2: matugenColors.inverse_on_surface, + surface0_2: matugenColors.surface_bright, + overlay1_2: matugenColors.outline, + surface2_2: matugenColors.surface, + text2: matugenColors.on_background, + lavender2: matugenColors.secondary, + crust2: matugenColors.surface_dim, + maroon2: matugenColors.secondary, + mauve2: matugenColors.secondary, + green2: matugenColors.secondary, + sky2: matugenColors.secondary, + teal2: matugenColors.secondary, + yellow2: matugenColors.secondary, + pink3: matugenColors.secondary, + red3: matugenColors.secondary, + mantle3: matugenColors.inverse_on_surface, + surface0_3: matugenColors.outline, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.outline, + lavender3: matugenColors.secondary, + mauve3: matugenColors.secondary, + green3: matugenColors.secondary, + sky3: matugenColors.secondary, + teal3: matugenColors.secondary, + yellow3: matugenColors.secondary, + maroon3: matugenColors.secondary, + crust3: matugenColors.surface_dim, + }, + monochrome_3: { + rosewater: matugenColors.tertiary, + flamingo: matugenColors.tertiary, + pink: matugenColors.tertiary, + mauve: matugenColors.tertiary, + red: matugenColors.tertiary, + maroon: matugenColors.tertiary, + peach: matugenColors.tertiary, + yellow: matugenColors.tertiary, + green: matugenColors.tertiary, + teal: matugenColors.tertiary, + sky: matugenColors.tertiary, + sapphire: matugenColors.tertiary, + blue: matugenColors.tertiary, + lavender: matugenColors.tertiary, + text: matugenColors.on_background, + subtext1: matugenColors.outline, + subtext2: matugenColors.outline, + overlay2: matugenColors.outline, + overlay1: matugenColors.outline, + overlay0: matugenColors.outline, + surface2: matugenColors.outline, + surface1: matugenColors.surface_bright, + surface0: matugenColors.surface_bright, + base2: matugenColors.inverse_on_surface, + base: matugenColors.inverse_on_surface, + mantle: matugenColors.surface_dim, + crust: matugenColors.surface_dim, + notifications_closer: matugenColors.tertiary, + notifications_background: matugenColors.surface_dim, + dashboard_btn_text: matugenColors.surface_dim, + red2: matugenColors.tertiary, + peach2: matugenColors.tertiary, + pink2: matugenColors.tertiary, + mantle2: matugenColors.surface_dim, + surface1_2: matugenColors.inverse_on_surface, + surface0_2: matugenColors.surface_bright, + overlay1_2: matugenColors.outline, + text2: matugenColors.on_background, + lavender2: matugenColors.tertiary, + crust2: matugenColors.surface_dim, + maroon2: matugenColors.tertiary, + surface2_2: matugenColors.surface, + mauve2: matugenColors.tertiary, + green2: matugenColors.tertiary, + sky2: matugenColors.tertiary, + teal2: matugenColors.tertiary, + yellow2: matugenColors.tertiary, + pink3: matugenColors.tertiary, + red3: matugenColors.secondary, + mantle3: matugenColors.inverse_on_surface, + surface0_3: matugenColors.outline, + surface2_3: matugenColors.outline, + overlay1_3: matugenColors.outline, + lavender3: matugenColors.tertiary, + mauve3: matugenColors.tertiary, + green3: matugenColors.tertiary, + sky3: matugenColors.tertiary, + teal3: matugenColors.tertiary, + yellow3: matugenColors.tertiary, + maroon3: matugenColors.tertiary, + crust3: matugenColors.surface_dim, + }, + }; + return matVtns[variation]; +}; diff --git a/ags/HyprPanel/services/screen_record.sh b/ags/HyprPanel/services/screen_record.sh new file mode 100755 index 0000000..d3aff6d --- /dev/null +++ b/ags/HyprPanel/services/screen_record.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +outputDir="$HOME/Videos/Screencasts" + +checkRecording() { + if pgrep -f "gpu-screen-recorder" >/dev/null; then + return 0 + else + return 1 + fi +} + +startRecording() { + if checkRecording; then + echo "A recording is already in progress." + exit 1 + fi + + target="$2" + + outputFile="recording_$(date +%Y-%m-%d_%H-%M-%S).mp4" + outputPath="$outputDir/$outputFile" + mkdir -p "$outputDir" + + if [ -z "$target" ]; then + echo "Usage: $0 start screen [screen_name]" + exit 1 + fi + + GPU_TYPE=$(lspci | grep -E 'VGA|3D' | grep -Ev '00:02.0|Integrated' > /dev/null && echo "" || echo "-encoder cpu") + + gpu-screen-recorder -w "$target" -f 60 -a "$(pactl get-default-sink).monitor" -o "$outputPath" $GPU_TYPE & + + echo "Recording started. Output will be saved to $outputPath" +} + +stopRecording() { + if ! checkRecording; then + echo "No recording is in progress." + exit 1 + fi + + pkill -f gpu-screen-recorder + recentFile=$(ls -t "$outputDir"/recording_*.mp4 | head -n 1) + notify-send "Recording stopped" "Your recording has been saved." \ + -i video-x-generic \ + -a "Screen Recorder" \ + -t 10000 \ + -u normal \ + --action="scriptAction:-xdg-open $outputDir=Directory" \ + --action="scriptAction:-xdg-open $recentFile=Play" +} + +case "$1" in +start) + startRecording "$@" + ;; +stop) + stopRecording + ;; +status) + if checkRecording; then + echo "recording" + else + echo "not recording" + fi + ;; +*) + echo "Usage: $0 {start [screen_name|window_id]|stop|status}" + exit 1 + ;; +esac diff --git a/ags/HyprPanel/services/snapshot.sh b/ags/HyprPanel/services/snapshot.sh new file mode 100755 index 0000000..0aa0697 --- /dev/null +++ b/ags/HyprPanel/services/snapshot.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +outputDir="$HOME/Pictures/Screenshots/" +outputFile="snapshot_$(date +%Y-%m-%d_%H-%M-%S).png" +outputPath="$outputDir/$outputFile" +mkdir -p "$outputDir" + +mode=${1:-area} + +case "$mode" in +active) + command="grimblast copysave active $outputPath" + ;; +output) + command="grimblast copysave output $outputPath" + ;; +area) + command="grimblast copysave area $outputPath" + ;; +*) + echo "Invalid option: $mode" + echo "Usage: $0 {active|output|area}" + exit 1 + ;; +esac + +if eval "$command"; then + recentFile=$(find "$outputDir" -name 'snapshot_*.png' -printf '%T+ %p\n' | sort -r | head -n 1 | cut -d' ' -f2-) + notify-send "Grimblast" "Your snapshot has been saved." \ + -i video-x-generic \ + -a "Grimblast" \ + -t 7000 \ + -u normal \ + --action="scriptAction:-xdg-open $outputDir=Directory" \ + --action="scriptAction:-xdg-open $recentFile=View" +fi diff --git a/ags/HyprPanel/themes/catppuccin_frappe.json b/ags/HyprPanel/themes/catppuccin_frappe.json new file mode 100644 index 0000000..a59a4a0 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_frappe.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#232634", + "theme.bar.background": "#232634", + "theme.bar.buttons.media.icon": "#babbf1", + "theme.bar.buttons.media.text": "#babbf1", + "theme.bar.buttons.icon": "#babbf1", + "theme.bar.buttons.text": "#babbf1", + "theme.bar.buttons.hover": "#51576d", + "theme.bar.buttons.background": "#303446", + "theme.bar.menus.text": "#c6d0f5", + "theme.bar.menus.border.color": "#414559", + "theme.bar.buttons.media.background": "#303446", + "theme.bar.menus.menu.volume.text": "#c6d0f5", + "theme.bar.menus.menu.volume.card.color": "#292c3c", + "theme.bar.menus.menu.volume.label.color": "#ea999c", + "theme.bar.menus.popover.text": "#babbf1", + "theme.bar.menus.popover.background": "#232634", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#e78284", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#e78284", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a6d189", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#232634", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#c6d0f5", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#babbf1", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#414559", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#232634", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#292c3c", + "theme.bar.menus.menu.notifications.switch.puck": "#51576d", + "theme.bar.menus.menu.notifications.switch.disabled": "#414559", + "theme.bar.menus.menu.notifications.switch.enabled": "#babbf1", + "theme.bar.menus.menu.notifications.clear": "#e78284", + "theme.bar.menus.menu.notifications.switch_divider": "#51576d", + "theme.bar.menus.menu.notifications.border": "#414559", + "theme.bar.menus.menu.notifications.card": "#292c3c", + "theme.bar.menus.menu.notifications.background": "#232634", + "theme.bar.menus.menu.notifications.no_notifications_label": "#414559", + "theme.bar.menus.menu.notifications.label": "#babbf1", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f4b8e4", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f4b8e4", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f4b8e4", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a6d189", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a6d189", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a6d189", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#e5c890", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#e5c890", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#e5c890", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ea999c", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ea999c", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ea999c", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#51576d", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#babbf1", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#ca9ee6", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#81c8be", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ea999c", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#e5c890", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f4b8e4", + "theme.bar.menus.menu.dashboard.controls.input.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f4b8e4", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ea999c", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#e5c890", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#99d1db", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#ca9ee6", + "theme.bar.menus.menu.dashboard.controls.disabled": "#626880", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a6d189", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#232634", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#babbf1", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#99d1db", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a6d189", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#ef9f76", + "theme.bar.menus.menu.dashboard.profile.name": "#f4b8e4", + "theme.bar.menus.menu.dashboard.border.color": "#414559", + "theme.bar.menus.menu.dashboard.background.color": "#232634", + "theme.bar.menus.menu.dashboard.card.color": "#292c3c", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#99d1db", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#8caaee", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#babbf1", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#ef9f76", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#e78284", + "theme.bar.menus.menu.clock.weather.stats": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.status": "#81c8be", + "theme.bar.menus.menu.clock.weather.temperature": "#c6d0f5", + "theme.bar.menus.menu.clock.weather.icon": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.contextdays": "#626880", + "theme.bar.menus.menu.clock.calendar.days": "#c6d0f5", + "theme.bar.menus.menu.clock.calendar.currentday": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.paginator": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#81c8be", + "theme.bar.menus.menu.clock.time.timeperiod": "#81c8be", + "theme.bar.menus.menu.clock.time.time": "#f4b8e4", + "theme.bar.menus.menu.clock.text": "#c6d0f5", + "theme.bar.menus.menu.clock.border.color": "#414559", + "theme.bar.menus.menu.clock.background.color": "#232634", + "theme.bar.menus.menu.clock.card.color": "#292c3c", + "theme.bar.menus.menu.battery.slider.puck": "#737994", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.battery.slider.background": "#626880", + "theme.bar.menus.menu.battery.slider.primary": "#e5c890", + "theme.bar.menus.menu.battery.icons.active": "#e5c890", + "theme.bar.menus.menu.battery.icons.passive": "#949cbb", + "theme.bar.menus.menu.battery.listitems.active": "#e5c890", + "theme.bar.menus.menu.battery.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.battery.text": "#c6d0f5", + "theme.bar.menus.menu.battery.label.color": "#e5c890", + "theme.bar.menus.menu.battery.border.color": "#414559", + "theme.bar.menus.menu.battery.background.color": "#232634", + "theme.bar.menus.menu.battery.card.color": "#292c3c", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#292c3c", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#c6d0f5", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#232634", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#99d1db", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#c6d0f5", + "theme.bar.menus.menu.bluetooth.icons.active": "#99d1db", + "theme.bar.menus.menu.bluetooth.icons.passive": "#949cbb", + "theme.bar.menus.menu.bluetooth.listitems.active": "#99d1db", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.bluetooth.switch.puck": "#51576d", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#414559", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#99d1db", + "theme.bar.menus.menu.bluetooth.switch_divider": "#51576d", + "theme.bar.menus.menu.bluetooth.status": "#737994", + "theme.bar.menus.menu.bluetooth.text": "#c6d0f5", + "theme.bar.menus.menu.bluetooth.label.color": "#99d1db", + "theme.bar.menus.menu.bluetooth.border.color": "#414559", + "theme.bar.menus.menu.bluetooth.background.color": "#232634", + "theme.bar.menus.menu.bluetooth.card.color": "#292c3c", + "theme.bar.menus.menu.network.iconbuttons.active": "#ca9ee6", + "theme.bar.menus.menu.network.iconbuttons.passive": "#c6d0f5", + "theme.bar.menus.menu.network.icons.active": "#ca9ee6", + "theme.bar.menus.menu.network.icons.passive": "#949cbb", + "theme.bar.menus.menu.network.listitems.active": "#ca9ee6", + "theme.bar.menus.menu.network.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.network.status.color": "#737994", + "theme.bar.menus.menu.network.text": "#c6d0f5", + "theme.bar.menus.menu.network.label.color": "#ca9ee6", + "theme.bar.menus.menu.network.border.color": "#414559", + "theme.bar.menus.menu.network.background.color": "#232634", + "theme.bar.menus.menu.network.card.color": "#292c3c", + "theme.bar.menus.menu.volume.input_slider.puck": "#626880", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.volume.input_slider.background": "#626880", + "theme.bar.menus.menu.volume.input_slider.primary": "#ea999c", + "theme.bar.menus.menu.volume.audio_slider.puck": "#626880", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.volume.audio_slider.background": "#626880", + "theme.bar.menus.menu.volume.audio_slider.primary": "#ea999c", + "theme.bar.menus.menu.volume.icons.active": "#ea999c", + "theme.bar.menus.menu.volume.icons.passive": "#949cbb", + "theme.bar.menus.menu.volume.iconbutton.active": "#ea999c", + "theme.bar.menus.menu.volume.iconbutton.passive": "#c6d0f5", + "theme.bar.menus.menu.volume.listitems.active": "#ea999c", + "theme.bar.menus.menu.volume.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.volume.border.color": "#414559", + "theme.bar.menus.menu.volume.background.color": "#232634", + "theme.bar.menus.menu.media.slider.puck": "#737994", + "theme.bar.menus.menu.media.slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.media.slider.background": "#626880", + "theme.bar.menus.menu.media.slider.primary": "#f4b8e4", + "theme.bar.menus.menu.media.buttons.text": "#232634", + "theme.bar.menus.menu.media.buttons.background": "#babbf1", + "theme.bar.menus.menu.media.buttons.enabled": "#81c8be", + "theme.bar.menus.menu.media.buttons.inactive": "#626880", + "theme.bar.menus.menu.media.border.color": "#414559", + "theme.bar.menus.menu.media.background.color": "#232634", + "theme.bar.menus.menu.media.album": "#f4b8e4", + "theme.bar.menus.menu.media.artist": "#81c8be", + "theme.bar.menus.menu.media.song": "#babbf1", + "theme.bar.menus.tooltip.text": "#c6d0f5", + "theme.bar.menus.tooltip.background": "#232634", + "theme.bar.menus.dropdownmenu.divider": "#292c3c", + "theme.bar.menus.dropdownmenu.text": "#c6d0f5", + "theme.bar.menus.dropdownmenu.background": "#232634", + "theme.bar.menus.slider.puck": "#737994", + "theme.bar.menus.slider.backgroundhover": "#51576d", + "theme.bar.menus.slider.background": "#626880", + "theme.bar.menus.slider.primary": "#babbf1", + "theme.bar.menus.progressbar.background": "#51576d", + "theme.bar.menus.progressbar.foreground": "#babbf1", + "theme.bar.menus.iconbuttons.active": "#babbf1", + "theme.bar.menus.iconbuttons.passive": "#c6d0f5", + "theme.bar.menus.buttons.text": "#232634", + "theme.bar.menus.buttons.disabled": "#626880", + "theme.bar.menus.buttons.active": "#f4b8e4", + "theme.bar.menus.buttons.default": "#babbf1", + "theme.bar.menus.switch.puck": "#51576d", + "theme.bar.menus.switch.disabled": "#414559", + "theme.bar.menus.switch.enabled": "#babbf1", + "theme.bar.menus.icons.active": "#babbf1", + "theme.bar.menus.icons.passive": "#626880", + "theme.bar.menus.listitems.active": "#babbf1", + "theme.bar.menus.listitems.passive": "#c6d0f5", + "theme.bar.menus.label": "#babbf1", + "theme.bar.menus.feinttext": "#414559", + "theme.bar.menus.dimtext": "#626880", + "theme.bar.menus.cards": "#292c3c", + "theme.bar.buttons.notifications.total": "#babbf1", + "theme.bar.buttons.notifications.icon": "#babbf1", + "theme.bar.buttons.notifications.background": "#303446", + "theme.bar.buttons.clock.icon": "#f4b8e4", + "theme.bar.buttons.clock.text": "#f4b8e4", + "theme.bar.buttons.clock.background": "#303446", + "theme.bar.buttons.battery.icon": "#e5c890", + "theme.bar.buttons.battery.text": "#e5c890", + "theme.bar.buttons.battery.background": "#303446", + "theme.bar.buttons.systray.background": "#303446", + "theme.bar.buttons.bluetooth.icon": "#99d1db", + "theme.bar.buttons.bluetooth.text": "#99d1db", + "theme.bar.buttons.bluetooth.background": "#303446", + "theme.bar.buttons.network.icon": "#ca9ee6", + "theme.bar.buttons.network.text": "#ca9ee6", + "theme.bar.buttons.network.background": "#303446", + "theme.bar.buttons.volume.icon": "#ea999c", + "theme.bar.buttons.volume.text": "#ea999c", + "theme.bar.buttons.volume.background": "#303446", + "theme.bar.buttons.windowtitle.icon": "#f4b8e4", + "theme.bar.buttons.windowtitle.text": "#f4b8e4", + "theme.bar.buttons.windowtitle.background": "#303446", + "theme.bar.buttons.workspaces.active": "#f4b8e4", + "theme.bar.buttons.workspaces.occupied": "#eebebe", + "theme.bar.buttons.workspaces.available": "#99d1db", + "theme.bar.buttons.workspaces.hover": "#51576d", + "theme.bar.buttons.workspaces.background": "#303446", + "theme.bar.buttons.dashboard.icon": "#e5c890", + "theme.bar.buttons.dashboard.background": "#303446", + "theme.osd.label": "#babbf1", + "theme.osd.icon": "#232634", + "theme.osd.bar_overflow_color": "#e78284", + "theme.osd.bar_empty_color": "#414559", + "theme.osd.bar_color": "#babbf1", + "theme.osd.icon_container": "#babbf1", + "theme.osd.bar_container": "#232634", + "theme.notification.close_button.label": "#232634", + "theme.notification.close_button.background": "#e78284", + "theme.notification.labelicon": "#babbf1", + "theme.notification.text": "#c6d0f5", + "theme.notification.time": "#838ba7", + "theme.notification.border": "#414559", + "theme.notification.label": "#babbf1", + "theme.notification.actions.text": "#232634", + "theme.notification.actions.background": "#babbf1", + "theme.notification.background": "#232634", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#292c3c", + "theme.bar.menus.check_radio_button.background": "#232534", + "theme.bar.menus.check_radio_button.active": "#b9baf1", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#babbf1", + "theme.bar.menus.menu.notifications.scrollbar.color": "#babbf1", + "theme.bar.menus.menu.notifications.pager.label": "#949cbb", + "theme.bar.menus.menu.notifications.pager.background": "#232634", + "theme.bar.buttons.clock.icon_background": "#f4b8e4", + "theme.bar.buttons.modules.ram.icon": "#e5c890", + "theme.bar.buttons.modules.storage.icon_background": "#e78284", + "theme.bar.menus.popover.border": "#232634", + "theme.bar.buttons.volume.icon_background": "#ea999c", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#99d1db", + "theme.bar.menus.menu.power.buttons.restart.text": "#ef9f76", + "theme.bar.buttons.modules.updates.background": "#303446", + "theme.bar.buttons.modules.storage.icon": "#e78284", + "theme.bar.buttons.modules.netstat.background": "#303446", + "theme.bar.buttons.modules.weather.icon": "#babbf1", + "theme.bar.buttons.modules.netstat.text": "#a6d189", + "theme.bar.buttons.modules.storage.background": "#303446", + "theme.bar.buttons.modules.power.icon": "#e78284", + "theme.bar.buttons.modules.storage.text": "#e78284", + "theme.bar.buttons.modules.cpu.background": "#303446", + "theme.bar.menus.menu.power.border.color": "#414559", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#e78284", + "theme.bar.menus.menu.power.buttons.logout.icon": "#232634", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#ef9f76", + "theme.bar.menus.menu.power.buttons.restart.icon": "#232634", + "theme.bar.buttons.modules.cpu.icon": "#e78284", + "theme.bar.buttons.battery.icon_background": "#e5c890", + "theme.bar.buttons.modules.kbLayout.icon_background": "#99d1db", + "theme.bar.buttons.modules.weather.text": "#babbf1", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#232634", + "theme.bar.menus.menu.power.buttons.sleep.text": "#99d1db", + "theme.bar.buttons.modules.weather.icon_background": "#babbf1", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#292c3c", + "theme.bar.buttons.media.icon_background": "#babbf1", + "theme.bar.menus.menu.power.buttons.logout.background": "#292c3c", + "theme.bar.buttons.modules.kbLayout.icon": "#99d1db", + "theme.bar.buttons.modules.ram.icon_background": "#e5c890", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#e78284", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#e78284", + "theme.bar.menus.menu.power.buttons.sleep.background": "#292c3c", + "theme.bar.buttons.modules.ram.text": "#e5c890", + "theme.bar.menus.menu.power.buttons.logout.text": "#a6d189", + "theme.bar.buttons.modules.updates.icon_background": "#ca9ee6", + "theme.bar.buttons.modules.kbLayout.background": "#303446", + "theme.bar.buttons.modules.power.background": "#303446", + "theme.bar.buttons.modules.weather.background": "#303446", + "theme.bar.buttons.icon_background": "#303446", + "theme.bar.menus.menu.power.background.color": "#232634", + "theme.bar.buttons.modules.ram.background": "#303446", + "theme.bar.buttons.modules.netstat.icon": "#a6d189", + "theme.bar.buttons.windowtitle.icon_background": "#f4b8e4", + "theme.bar.buttons.modules.cpu.icon_background": "#e78284", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a6d189", + "theme.bar.buttons.modules.updates.text": "#ca9ee6", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#232634", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#292c3c", + "theme.bar.buttons.modules.updates.icon": "#ca9ee6", + "theme.bar.buttons.modules.cpu.text": "#e78284", + "theme.bar.buttons.modules.netstat.icon_background": "#a6d189", + "theme.bar.buttons.modules.kbLayout.text": "#99d1db", + "theme.bar.buttons.notifications.icon_background": "#babbf1", + "theme.bar.buttons.modules.power.border": "#e78284", + "theme.bar.buttons.modules.weather.border": "#babbf1", + "theme.bar.buttons.modules.updates.border": "#ca9ee6", + "theme.bar.buttons.modules.kbLayout.border": "#99d1db", + "theme.bar.buttons.modules.netstat.border": "#a6d189", + "theme.bar.buttons.modules.storage.border": "#e78284", + "theme.bar.buttons.modules.cpu.border": "#e78284", + "theme.bar.buttons.modules.ram.border": "#e5c890", + "theme.bar.buttons.notifications.border": "#babbf1", + "theme.bar.buttons.clock.border": "#f4b8e4", + "theme.bar.buttons.battery.border": "#e5c890", + "theme.bar.buttons.systray.border": "#51576d", + "theme.bar.buttons.bluetooth.border": "#99d1db", + "theme.bar.buttons.network.border": "#ca9ee6", + "theme.bar.buttons.volume.border": "#ea999c", + "theme.bar.buttons.media.border": "#babbf1", + "theme.bar.buttons.windowtitle.border": "#f4b8e4", + "theme.bar.buttons.workspaces.border": "#232634", + "theme.bar.buttons.dashboard.border": "#e5c890", + "theme.bar.buttons.modules.submap.background": "#303446", + "theme.bar.buttons.modules.submap.text": "#81c8be", + "theme.bar.buttons.modules.submap.border": "#81c8be", + "theme.bar.buttons.modules.submap.icon": "#81c8be", + "theme.bar.buttons.modules.submap.icon_background": "#303446" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/catppuccin_frappe_split.json b/ags/HyprPanel/themes/catppuccin_frappe_split.json new file mode 100644 index 0000000..2eefc00 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_frappe_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#232634", + "theme.bar.background": "#232634", + "theme.bar.buttons.media.icon": "#303446", + "theme.bar.buttons.media.text": "#babbf1", + "theme.bar.buttons.icon": "#babbf1", + "theme.bar.buttons.text": "#babbf1", + "theme.bar.buttons.hover": "#51576d", + "theme.bar.buttons.background": "#303446", + "theme.bar.menus.text": "#c6d0f5", + "theme.bar.menus.border.color": "#414559", + "theme.bar.buttons.media.background": "#303446", + "theme.bar.menus.menu.volume.text": "#c6d0f5", + "theme.bar.menus.menu.volume.card.color": "#292c3c", + "theme.bar.menus.menu.volume.label.color": "#ea999c", + "theme.bar.menus.popover.text": "#babbf1", + "theme.bar.menus.popover.background": "#232634", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#e78284", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#e78284", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a6d189", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#232634", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#c6d0f5", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#babbf1", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#414559", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#232634", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#292c3c", + "theme.bar.menus.menu.notifications.switch.puck": "#51576d", + "theme.bar.menus.menu.notifications.switch.disabled": "#414559", + "theme.bar.menus.menu.notifications.switch.enabled": "#babbf1", + "theme.bar.menus.menu.notifications.clear": "#e78284", + "theme.bar.menus.menu.notifications.switch_divider": "#51576d", + "theme.bar.menus.menu.notifications.border": "#414559", + "theme.bar.menus.menu.notifications.card": "#292c3c", + "theme.bar.menus.menu.notifications.background": "#232634", + "theme.bar.menus.menu.notifications.no_notifications_label": "#414559", + "theme.bar.menus.menu.notifications.label": "#babbf1", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f4b8e4", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f4b8e4", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f4b8e4", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a6d189", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a6d189", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a6d189", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#e5c890", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#e5c890", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#e5c890", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ea999c", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ea999c", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ea999c", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#51576d", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#babbf1", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#ca9ee6", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#81c8be", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ea999c", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#e5c890", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f4b8e4", + "theme.bar.menus.menu.dashboard.controls.input.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f4b8e4", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ea999c", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#e5c890", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#99d1db", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#232634", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#ca9ee6", + "theme.bar.menus.menu.dashboard.controls.disabled": "#626880", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a6d189", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#232634", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#babbf1", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#99d1db", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a6d189", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#ef9f76", + "theme.bar.menus.menu.dashboard.profile.name": "#f4b8e4", + "theme.bar.menus.menu.dashboard.border.color": "#414559", + "theme.bar.menus.menu.dashboard.background.color": "#232634", + "theme.bar.menus.menu.dashboard.card.color": "#292c3c", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#99d1db", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#8caaee", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#babbf1", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#ef9f76", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#e78284", + "theme.bar.menus.menu.clock.weather.stats": "#f4b8e4", + "theme.bar.menus.menu.clock.weather.status": "#81c8be", + "theme.bar.menus.menu.clock.weather.temperature": "#c6d0f5", + "theme.bar.menus.menu.clock.weather.icon": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.contextdays": "#626880", + "theme.bar.menus.menu.clock.calendar.days": "#c6d0f5", + "theme.bar.menus.menu.clock.calendar.currentday": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.paginator": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f4b8e4", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#81c8be", + "theme.bar.menus.menu.clock.time.timeperiod": "#81c8be", + "theme.bar.menus.menu.clock.time.time": "#f4b8e4", + "theme.bar.menus.menu.clock.text": "#c6d0f5", + "theme.bar.menus.menu.clock.border.color": "#414559", + "theme.bar.menus.menu.clock.background.color": "#232634", + "theme.bar.menus.menu.clock.card.color": "#292c3c", + "theme.bar.menus.menu.battery.slider.puck": "#737994", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.battery.slider.background": "#626880", + "theme.bar.menus.menu.battery.slider.primary": "#e5c890", + "theme.bar.menus.menu.battery.icons.active": "#e5c890", + "theme.bar.menus.menu.battery.icons.passive": "#949cbb", + "theme.bar.menus.menu.battery.listitems.active": "#e5c890", + "theme.bar.menus.menu.battery.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.battery.text": "#c6d0f5", + "theme.bar.menus.menu.battery.label.color": "#e5c890", + "theme.bar.menus.menu.battery.border.color": "#414559", + "theme.bar.menus.menu.battery.background.color": "#232634", + "theme.bar.menus.menu.battery.card.color": "#292c3c", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#292c3c", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#c6d0f5", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#232634", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#99d1db", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#c6d0f5", + "theme.bar.menus.menu.bluetooth.icons.active": "#99d1db", + "theme.bar.menus.menu.bluetooth.icons.passive": "#949cbb", + "theme.bar.menus.menu.bluetooth.listitems.active": "#99d1db", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.bluetooth.switch.puck": "#51576d", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#414559", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#99d1db", + "theme.bar.menus.menu.bluetooth.switch_divider": "#51576d", + "theme.bar.menus.menu.bluetooth.status": "#737994", + "theme.bar.menus.menu.bluetooth.text": "#c6d0f5", + "theme.bar.menus.menu.bluetooth.label.color": "#99d1db", + "theme.bar.menus.menu.bluetooth.border.color": "#414559", + "theme.bar.menus.menu.bluetooth.background.color": "#232634", + "theme.bar.menus.menu.bluetooth.card.color": "#292c3c", + "theme.bar.menus.menu.network.iconbuttons.active": "#ca9ee6", + "theme.bar.menus.menu.network.iconbuttons.passive": "#c6d0f5", + "theme.bar.menus.menu.network.icons.active": "#ca9ee6", + "theme.bar.menus.menu.network.icons.passive": "#949cbb", + "theme.bar.menus.menu.network.listitems.active": "#ca9ee6", + "theme.bar.menus.menu.network.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.network.status.color": "#737994", + "theme.bar.menus.menu.network.text": "#c6d0f5", + "theme.bar.menus.menu.network.label.color": "#ca9ee6", + "theme.bar.menus.menu.network.border.color": "#414559", + "theme.bar.menus.menu.network.background.color": "#232634", + "theme.bar.menus.menu.network.card.color": "#292c3c", + "theme.bar.menus.menu.volume.input_slider.puck": "#626880", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.volume.input_slider.background": "#626880", + "theme.bar.menus.menu.volume.input_slider.primary": "#ea999c", + "theme.bar.menus.menu.volume.audio_slider.puck": "#626880", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.volume.audio_slider.background": "#626880", + "theme.bar.menus.menu.volume.audio_slider.primary": "#ea999c", + "theme.bar.menus.menu.volume.icons.active": "#ea999c", + "theme.bar.menus.menu.volume.icons.passive": "#949cbb", + "theme.bar.menus.menu.volume.iconbutton.active": "#ea999c", + "theme.bar.menus.menu.volume.iconbutton.passive": "#c6d0f5", + "theme.bar.menus.menu.volume.listitems.active": "#ea999c", + "theme.bar.menus.menu.volume.listitems.passive": "#c6d0f5", + "theme.bar.menus.menu.volume.border.color": "#414559", + "theme.bar.menus.menu.volume.background.color": "#232634", + "theme.bar.menus.menu.media.slider.puck": "#737994", + "theme.bar.menus.menu.media.slider.backgroundhover": "#51576d", + "theme.bar.menus.menu.media.slider.background": "#626880", + "theme.bar.menus.menu.media.slider.primary": "#f4b8e4", + "theme.bar.menus.menu.media.buttons.text": "#232634", + "theme.bar.menus.menu.media.buttons.background": "#babbf1", + "theme.bar.menus.menu.media.buttons.enabled": "#81c8be", + "theme.bar.menus.menu.media.buttons.inactive": "#626880", + "theme.bar.menus.menu.media.border.color": "#414559", + "theme.bar.menus.menu.media.background.color": "#232634", + "theme.bar.menus.menu.media.album": "#f4b8e4", + "theme.bar.menus.menu.media.artist": "#81c8be", + "theme.bar.menus.menu.media.song": "#babbf1", + "theme.bar.menus.tooltip.text": "#c6d0f5", + "theme.bar.menus.tooltip.background": "#232634", + "theme.bar.menus.dropdownmenu.divider": "#292c3c", + "theme.bar.menus.dropdownmenu.text": "#c6d0f5", + "theme.bar.menus.dropdownmenu.background": "#232634", + "theme.bar.menus.slider.puck": "#737994", + "theme.bar.menus.slider.backgroundhover": "#51576d", + "theme.bar.menus.slider.background": "#626880", + "theme.bar.menus.slider.primary": "#babbf1", + "theme.bar.menus.progressbar.background": "#51576d", + "theme.bar.menus.progressbar.foreground": "#babbf1", + "theme.bar.menus.iconbuttons.active": "#babbf1", + "theme.bar.menus.iconbuttons.passive": "#c6d0f5", + "theme.bar.menus.buttons.text": "#232634", + "theme.bar.menus.buttons.disabled": "#626880", + "theme.bar.menus.buttons.active": "#f4b8e4", + "theme.bar.menus.buttons.default": "#babbf1", + "theme.bar.menus.switch.puck": "#51576d", + "theme.bar.menus.switch.disabled": "#414559", + "theme.bar.menus.switch.enabled": "#babbf1", + "theme.bar.menus.icons.active": "#babbf1", + "theme.bar.menus.icons.passive": "#626880", + "theme.bar.menus.listitems.active": "#babbf1", + "theme.bar.menus.listitems.passive": "#c6d0f5", + "theme.bar.menus.label": "#babbf1", + "theme.bar.menus.feinttext": "#414559", + "theme.bar.menus.dimtext": "#626880", + "theme.bar.menus.cards": "#292c3c", + "theme.bar.buttons.notifications.total": "#babbf1", + "theme.bar.buttons.notifications.icon": "#303446", + "theme.bar.buttons.notifications.background": "#303446", + "theme.bar.buttons.clock.icon": "#303446", + "theme.bar.buttons.clock.text": "#f4b8e4", + "theme.bar.buttons.clock.background": "#303446", + "theme.bar.buttons.battery.icon": "#303446", + "theme.bar.buttons.battery.text": "#e5c890", + "theme.bar.buttons.battery.background": "#303446", + "theme.bar.buttons.systray.background": "#303446", + "theme.bar.buttons.bluetooth.icon": "#303446", + "theme.bar.buttons.bluetooth.text": "#99d1db", + "theme.bar.buttons.bluetooth.background": "#303446", + "theme.bar.buttons.network.icon": "#303446", + "theme.bar.buttons.network.text": "#ca9ee6", + "theme.bar.buttons.network.background": "#303446", + "theme.bar.buttons.volume.icon": "#303446", + "theme.bar.buttons.volume.text": "#ea999c", + "theme.bar.buttons.volume.background": "#303446", + "theme.bar.buttons.windowtitle.icon": "#303446", + "theme.bar.buttons.windowtitle.text": "#f4b8e4", + "theme.bar.buttons.windowtitle.background": "#303446", + "theme.bar.buttons.workspaces.active": "#f4b8e4", + "theme.bar.buttons.workspaces.occupied": "#eebebe", + "theme.bar.buttons.workspaces.available": "#99d1db", + "theme.bar.buttons.workspaces.hover": "#51576d", + "theme.bar.buttons.workspaces.background": "#303446", + "theme.bar.buttons.dashboard.icon": "#303446", + "theme.bar.buttons.dashboard.background": "#e5c890", + "theme.osd.label": "#babbf1", + "theme.osd.icon": "#232634", + "theme.osd.bar_overflow_color": "#e78284", + "theme.osd.bar_empty_color": "#414559", + "theme.osd.bar_color": "#babbf1", + "theme.osd.icon_container": "#babbf1", + "theme.osd.bar_container": "#232634", + "theme.notification.close_button.label": "#232634", + "theme.notification.close_button.background": "#e78284", + "theme.notification.labelicon": "#babbf1", + "theme.notification.text": "#c6d0f5", + "theme.notification.time": "#838ba7", + "theme.notification.border": "#414559", + "theme.notification.label": "#babbf1", + "theme.notification.actions.text": "#232634", + "theme.notification.actions.background": "#babbf1", + "theme.notification.background": "#232634", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.menus.menu.media.card.color": "#292c3c", + "theme.bar.menus.check_radio_button.background": "#232534", + "theme.bar.menus.check_radio_button.active": "#b9baf1", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#ea999c", + "theme.bar.buttons.network.icon_background": "#ca9ee6", + "theme.bar.buttons.bluetooth.icon_background": "#99d1db", + "theme.bar.buttons.windowtitle.icon_background": "#f4b8e4", + "theme.bar.buttons.media.icon_background": "#babbf1", + "theme.bar.buttons.notifications.icon_background": "#b4befe", + "theme.bar.buttons.battery.icon_background": "#e5c890", + "theme.bar.buttons.clock.icon_background": "#f4b8e4", + "theme.bar.menus.menu.notifications.pager.button": "#babbf1", + "theme.bar.menus.menu.notifications.scrollbar.color": "#babbf1", + "theme.bar.menus.menu.notifications.pager.label": "#949cbb", + "theme.bar.menus.menu.notifications.pager.background": "#232634", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.storage.icon_background": "#e78284", + "theme.bar.menus.popover.border": "#232634", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#99d1db", + "theme.bar.menus.menu.power.buttons.restart.text": "#ef9f76", + "theme.bar.buttons.modules.updates.background": "#303446", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.netstat.background": "#303446", + "theme.bar.buttons.modules.weather.icon": "#303446", + "theme.bar.buttons.modules.netstat.text": "#a6d189", + "theme.bar.buttons.modules.storage.background": "#303446", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.buttons.modules.storage.text": "#e78284", + "theme.bar.buttons.modules.cpu.background": "#303446", + "theme.bar.menus.menu.power.border.color": "#414559", + "theme.bar.buttons.modules.power.icon_background": "#e78284", + "theme.bar.menus.menu.power.buttons.logout.icon": "#232634", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#ef9f76", + "theme.bar.menus.menu.power.buttons.restart.icon": "#232634", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.kbLayout.icon_background": "#99d1db", + "theme.bar.buttons.modules.weather.text": "#babbf1", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#232634", + "theme.bar.menus.menu.power.buttons.sleep.text": "#99d1db", + "theme.bar.buttons.modules.weather.icon_background": "#babbf1", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#292c3c", + "theme.bar.menus.menu.power.buttons.logout.background": "#292c3c", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.ram.icon_background": "#e5c890", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#e78284", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#e78284", + "theme.bar.menus.menu.power.buttons.sleep.background": "#292c3c", + "theme.bar.buttons.modules.ram.text": "#e5c890", + "theme.bar.menus.menu.power.buttons.logout.text": "#a6d189", + "theme.bar.buttons.modules.updates.icon_background": "#ca9ee6", + "theme.bar.buttons.modules.kbLayout.background": "#303446", + "theme.bar.buttons.modules.power.background": "#303446", + "theme.bar.buttons.modules.weather.background": "#303446", + "theme.bar.menus.menu.power.background.color": "#232634", + "theme.bar.buttons.modules.ram.background": "#303446", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon_background": "#e78284", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a6d189", + "theme.bar.buttons.modules.updates.text": "#ca9ee6", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#232634", + "theme.bar.menus.menu.power.buttons.restart.background": "#292c3c", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.cpu.text": "#e78284", + "theme.bar.buttons.modules.netstat.icon_background": "#a6d189", + "theme.bar.buttons.modules.kbLayout.text": "#99d1db", + "theme.bar.buttons.modules.power.border": "#e78284", + "theme.bar.buttons.modules.weather.border": "#babbf1", + "theme.bar.buttons.modules.updates.border": "#ca9ee6", + "theme.bar.buttons.modules.kbLayout.border": "#99d1db", + "theme.bar.buttons.modules.netstat.border": "#a6d189", + "theme.bar.buttons.modules.storage.border": "#e78284", + "theme.bar.buttons.modules.cpu.border": "#e78284", + "theme.bar.buttons.modules.ram.border": "#e5c890", + "theme.bar.buttons.notifications.border": "#babbf1", + "theme.bar.buttons.clock.border": "#f4b8e4", + "theme.bar.buttons.battery.border": "#e5c890", + "theme.bar.buttons.systray.border": "#51576d", + "theme.bar.buttons.bluetooth.border": "#99d1db", + "theme.bar.buttons.network.border": "#ca9ee6", + "theme.bar.buttons.volume.border": "#ea999c", + "theme.bar.buttons.media.border": "#babbf1", + "theme.bar.buttons.windowtitle.border": "#f4b8e4", + "theme.bar.buttons.workspaces.border": "#232634", + "theme.bar.buttons.dashboard.border": "#e5c890", + "theme.bar.buttons.modules.submap.background": "#303446", + "theme.bar.buttons.modules.submap.text": "#81c8be", + "theme.bar.buttons.modules.submap.border": "#81c8be", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.icon_background": "#81c8be" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/catppuccin_latte.json b/ags/HyprPanel/themes/catppuccin_latte.json new file mode 100644 index 0000000..64559e2 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_latte.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#eff1f5", + "theme.bar.background": "#eff1f5", + "theme.bar.buttons.media.icon": "#7287fd", + "theme.bar.buttons.media.text": "#7287fd", + "theme.bar.buttons.icon": "#7287fd", + "theme.bar.buttons.text": "#7287fd", + "theme.bar.buttons.hover": "#bcc0cc", + "theme.bar.buttons.background": "#e6e9ef", + "theme.bar.menus.text": "#4c4f69", + "theme.bar.menus.border.color": "#ccd0da", + "theme.bar.buttons.media.background": "#dcdfe8", + "theme.bar.menus.menu.volume.text": "#4c4f69", + "theme.bar.menus.menu.volume.card.color": "#dcdfe8", + "theme.bar.menus.menu.volume.label.color": "#e64553", + "theme.bar.menus.popover.text": "#7287fd", + "theme.bar.menus.popover.background": "#dce0e8", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#d20f39", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#d20f39", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#40a02b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#dce0e8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#4c4f69", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#7287fd", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#ccd0da", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#dce0e8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#eff1f5", + "theme.bar.menus.menu.notifications.switch.puck": "#bcc0cc", + "theme.bar.menus.menu.notifications.switch.disabled": "#ccd0da", + "theme.bar.menus.menu.notifications.switch.enabled": "#7287fd", + "theme.bar.menus.menu.notifications.clear": "#d20f39", + "theme.bar.menus.menu.notifications.switch_divider": "#bcc0cc", + "theme.bar.menus.menu.notifications.border": "#ccd0da", + "theme.bar.menus.menu.notifications.card": "#dcdfe8", + "theme.bar.menus.menu.notifications.background": "#eff1f5", + "theme.bar.menus.menu.notifications.no_notifications_label": "#ccd0da", + "theme.bar.menus.menu.notifications.label": "#7287fd", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#ea76cb", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#ea76cb", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#ea76cb", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#40a02b", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#40a02b", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#40a02b", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#df8e1d", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#df8e1d", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#df8e1d", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#e64553", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#e64553", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#e64553", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#bcc0cc", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#7287fd", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#8839ef", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#179299", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#e64553", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#df8e1d", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#ea76cb", + "theme.bar.menus.menu.dashboard.controls.input.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.input.background": "#ea76cb", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#e64553", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#df8e1d", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#04a5e5", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#8839ef", + "theme.bar.menus.menu.dashboard.controls.disabled": "#acb0be", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#40a02b", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#7287fd", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#04a5e5", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#40a02b", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#fe640b", + "theme.bar.menus.menu.dashboard.profile.name": "#ea76cb", + "theme.bar.menus.menu.dashboard.border.color": "#ccd0da", + "theme.bar.menus.menu.dashboard.background.color": "#eff1f5", + "theme.bar.menus.menu.dashboard.card.color": "#dcdfe8", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#ea76cb", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#ea76cb", + "theme.bar.menus.menu.clock.weather.hourly.time": "#ea76cb", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#04a5e5", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#1e66f5", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#7287fd", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#fe640b", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#d20f39", + "theme.bar.menus.menu.clock.weather.stats": "#ea76cb", + "theme.bar.menus.menu.clock.weather.status": "#179299", + "theme.bar.menus.menu.clock.weather.temperature": "#4c4f69", + "theme.bar.menus.menu.clock.weather.icon": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.contextdays": "#acb0be", + "theme.bar.menus.menu.clock.calendar.days": "#4c4f69", + "theme.bar.menus.menu.clock.calendar.currentday": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.paginator": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.weekdays": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#179299", + "theme.bar.menus.menu.clock.time.timeperiod": "#179299", + "theme.bar.menus.menu.clock.time.time": "#ea76cb", + "theme.bar.menus.menu.clock.text": "#4c4f69", + "theme.bar.menus.menu.clock.border.color": "#ccd0da", + "theme.bar.menus.menu.clock.background.color": "#eff1f5", + "theme.bar.menus.menu.clock.card.color": "#dcdfe8", + "theme.bar.menus.menu.battery.slider.puck": "#9ca0b0", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.battery.slider.background": "#acb0be", + "theme.bar.menus.menu.battery.slider.primary": "#df8e1d", + "theme.bar.menus.menu.battery.icons.active": "#df8e1d", + "theme.bar.menus.menu.battery.icons.passive": "#7c7f93", + "theme.bar.menus.menu.battery.listitems.active": "#df8e1d", + "theme.bar.menus.menu.battery.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.battery.text": "#4c4f69", + "theme.bar.menus.menu.battery.label.color": "#df8e1d", + "theme.bar.menus.menu.battery.border.color": "#ccd0da", + "theme.bar.menus.menu.battery.background.color": "#eff1f5", + "theme.bar.menus.menu.battery.card.color": "#dcdfe8", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#eff1f5", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#4c4f69", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#dce0e8", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#04a5e5", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#4c4f69", + "theme.bar.menus.menu.bluetooth.icons.active": "#04a5e5", + "theme.bar.menus.menu.bluetooth.icons.passive": "#7c7f93", + "theme.bar.menus.menu.bluetooth.listitems.active": "#04a5e5", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.bluetooth.switch.puck": "#bcc0cc", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#ccd0da", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#04a5e5", + "theme.bar.menus.menu.bluetooth.switch_divider": "#bcc0cc", + "theme.bar.menus.menu.bluetooth.status": "#9ca0b0", + "theme.bar.menus.menu.bluetooth.text": "#4c4f69", + "theme.bar.menus.menu.bluetooth.label.color": "#04a5e5", + "theme.bar.menus.menu.bluetooth.border.color": "#ccd0da", + "theme.bar.menus.menu.bluetooth.background.color": "#eff1f5", + "theme.bar.menus.menu.bluetooth.card.color": "#dcdfe8", + "theme.bar.menus.menu.network.iconbuttons.active": "#8839ef", + "theme.bar.menus.menu.network.iconbuttons.passive": "#4c4f69", + "theme.bar.menus.menu.network.icons.active": "#8839ef", + "theme.bar.menus.menu.network.icons.passive": "#7c7f93", + "theme.bar.menus.menu.network.listitems.active": "#8839ef", + "theme.bar.menus.menu.network.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.network.status.color": "#9ca0b0", + "theme.bar.menus.menu.network.text": "#4c4f69", + "theme.bar.menus.menu.network.label.color": "#8839ef", + "theme.bar.menus.menu.network.border.color": "#ccd0da", + "theme.bar.menus.menu.network.background.color": "#eff1f5", + "theme.bar.menus.menu.network.card.color": "#dcdfe8", + "theme.bar.menus.menu.volume.input_slider.puck": "#acb0be", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.volume.input_slider.background": "#acb0be", + "theme.bar.menus.menu.volume.input_slider.primary": "#e64553", + "theme.bar.menus.menu.volume.audio_slider.puck": "#acb0be", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.volume.audio_slider.background": "#acb0be", + "theme.bar.menus.menu.volume.audio_slider.primary": "#e64553", + "theme.bar.menus.menu.volume.icons.active": "#e64553", + "theme.bar.menus.menu.volume.icons.passive": "#7c7f93", + "theme.bar.menus.menu.volume.iconbutton.active": "#e64553", + "theme.bar.menus.menu.volume.iconbutton.passive": "#4c4f69", + "theme.bar.menus.menu.volume.listitems.active": "#e64553", + "theme.bar.menus.menu.volume.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.volume.border.color": "#ccd0da", + "theme.bar.menus.menu.volume.background.color": "#e6e9ef", + "theme.bar.menus.menu.media.slider.puck": "#9ca0b0", + "theme.bar.menus.menu.media.slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.media.slider.background": "#acb0be", + "theme.bar.menus.menu.media.slider.primary": "#ea76cb", + "theme.bar.menus.menu.media.buttons.text": "#dce0e8", + "theme.bar.menus.menu.media.buttons.background": "#7287fd", + "theme.bar.menus.menu.media.buttons.enabled": "#179299", + "theme.bar.menus.menu.media.buttons.inactive": "#acb0be", + "theme.bar.menus.menu.media.border.color": "#ccd0da", + "theme.bar.menus.menu.media.background.color": "#eff1f5", + "theme.bar.menus.menu.media.album": "#ea76cb", + "theme.bar.menus.menu.media.artist": "#179299", + "theme.bar.menus.menu.media.song": "#7287fd", + "theme.bar.menus.tooltip.text": "#4c4f69", + "theme.bar.menus.tooltip.background": "#dce0e8", + "theme.bar.menus.dropdownmenu.divider": "#eff1f5", + "theme.bar.menus.dropdownmenu.text": "#4c4f69", + "theme.bar.menus.dropdownmenu.background": "#dce0e8", + "theme.bar.menus.slider.puck": "#9ca0b0", + "theme.bar.menus.slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.slider.background": "#acb0be", + "theme.bar.menus.slider.primary": "#7287fd", + "theme.bar.menus.progressbar.background": "#bcc0cc", + "theme.bar.menus.progressbar.foreground": "#7287fd", + "theme.bar.menus.iconbuttons.active": "#7287fd", + "theme.bar.menus.iconbuttons.passive": "#4c4f69", + "theme.bar.menus.buttons.text": "#dce0e8", + "theme.bar.menus.buttons.disabled": "#acb0be", + "theme.bar.menus.buttons.active": "#ea76cb", + "theme.bar.menus.buttons.default": "#7287fd", + "theme.bar.menus.switch.puck": "#bcc0cc", + "theme.bar.menus.switch.disabled": "#ccd0da", + "theme.bar.menus.switch.enabled": "#7287fd", + "theme.bar.menus.icons.active": "#7287fd", + "theme.bar.menus.icons.passive": "#acb0be", + "theme.bar.menus.listitems.active": "#7287fd", + "theme.bar.menus.listitems.passive": "#4c4f69", + "theme.bar.menus.label": "#7287fd", + "theme.bar.menus.feinttext": "#ccd0da", + "theme.bar.menus.dimtext": "#acb0be", + "theme.bar.menus.cards": "#dce0e8", + "theme.bar.buttons.notifications.total": "#7287fd", + "theme.bar.buttons.notifications.icon": "#7287fd", + "theme.bar.buttons.notifications.background": "#dcdfe8", + "theme.bar.buttons.clock.icon": "#ea76cb", + "theme.bar.buttons.clock.text": "#ea76cb", + "theme.bar.buttons.clock.background": "#dcdfe8", + "theme.bar.buttons.battery.icon": "#df8e1d", + "theme.bar.buttons.battery.text": "#df8e1d", + "theme.bar.buttons.battery.background": "#dcdfe8", + "theme.bar.buttons.systray.background": "#dcdfe8", + "theme.bar.buttons.bluetooth.icon": "#04a5e5", + "theme.bar.buttons.bluetooth.text": "#04a5e5", + "theme.bar.buttons.bluetooth.background": "#dcdfe8", + "theme.bar.buttons.network.icon": "#8839ef", + "theme.bar.buttons.network.text": "#8839ef", + "theme.bar.buttons.network.background": "#dcdfe8", + "theme.bar.buttons.volume.icon": "#e64553", + "theme.bar.buttons.volume.text": "#e64553", + "theme.bar.buttons.volume.background": "#dcdfe8", + "theme.bar.buttons.windowtitle.icon": "#ea76cb", + "theme.bar.buttons.windowtitle.text": "#ea76cb", + "theme.bar.buttons.windowtitle.background": "#dcdfe8", + "theme.bar.buttons.workspaces.active": "#ea76cb", + "theme.bar.buttons.workspaces.occupied": "#dd7878", + "theme.bar.buttons.workspaces.available": "#04a5e5", + "theme.bar.buttons.workspaces.hover": "#bcc0cc", + "theme.bar.buttons.workspaces.background": "#dcdfe8", + "theme.bar.buttons.dashboard.icon": "#df8e1d", + "theme.bar.buttons.dashboard.background": "#dcdfe8", + "theme.osd.label": "#7287fd", + "theme.osd.icon": "#ccd0da", + "theme.osd.bar_overflow_color": "#d20f39", + "theme.osd.bar_empty_color": "#acb0be", + "theme.osd.bar_color": "#7287fd", + "theme.osd.icon_container": "#7287fd", + "theme.osd.bar_container": "#ccd0da", + "theme.notification.close_button.label": "#dce0e8", + "theme.notification.close_button.background": "#d20f39", + "theme.notification.labelicon": "#7287fd", + "theme.notification.text": "#4c4f69", + "theme.notification.time": "#8c8fa1", + "theme.notification.border": "#ccd0da", + "theme.notification.label": "#7287fd", + "theme.notification.actions.text": "#dce0e8", + "theme.notification.actions.background": "#7287fd", + "theme.notification.background": "#ccd0da", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.menus.menu.media.card.color": "#dcdfe8", + "theme.bar.menus.check_radio_button.background": "#dcdfe8", + "theme.bar.menus.check_radio_button.active": "#7186fd", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#7287fd", + "theme.bar.menus.menu.notifications.scrollbar.color": "#7287fd", + "theme.bar.menus.menu.notifications.pager.label": "#7c7f93", + "theme.bar.menus.menu.notifications.pager.background": "#eff1f5", + "theme.bar.buttons.clock.icon_background": "#ea76cb", + "theme.bar.buttons.modules.ram.icon": "#df8e1d", + "theme.bar.buttons.modules.storage.icon_background": "#d20f39", + "theme.bar.menus.popover.border": "#dce0e8", + "theme.bar.buttons.volume.icon_background": "#e64553", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#04a5e5", + "theme.bar.menus.menu.power.buttons.restart.text": "#fe640b", + "theme.bar.buttons.modules.updates.background": "#dcdfe8", + "theme.bar.buttons.modules.storage.icon": "#d20f39", + "theme.bar.buttons.modules.netstat.background": "#dcdfe8", + "theme.bar.buttons.modules.weather.icon": "#7287fd", + "theme.bar.buttons.modules.netstat.text": "#40a02b", + "theme.bar.buttons.modules.storage.background": "#dcdfe8", + "theme.bar.buttons.modules.power.icon": "#d20f39", + "theme.bar.buttons.modules.storage.text": "#d20f39", + "theme.bar.buttons.modules.cpu.background": "#dcdfe8", + "theme.bar.menus.menu.power.border.color": "#ccd0da", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#d20f39", + "theme.bar.menus.menu.power.buttons.logout.icon": "#dce0e8", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#fe640b", + "theme.bar.menus.menu.power.buttons.restart.icon": "#dce0e8", + "theme.bar.buttons.modules.cpu.icon": "#d20f39", + "theme.bar.buttons.battery.icon_background": "#df8e1d", + "theme.bar.buttons.modules.kbLayout.icon_background": "#04a5e5", + "theme.bar.buttons.modules.weather.text": "#7287fd", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#dce0e8", + "theme.bar.menus.menu.power.buttons.sleep.text": "#04a5e5", + "theme.bar.buttons.modules.weather.icon_background": "#7287fd", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#dcdfe8", + "theme.bar.buttons.media.icon_background": "#7287fd", + "theme.bar.menus.menu.power.buttons.logout.background": "#dcdfe8", + "theme.bar.buttons.modules.kbLayout.icon": "#04a5e5", + "theme.bar.buttons.modules.ram.icon_background": "#df8e1d", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#d20f39", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#d20f39", + "theme.bar.menus.menu.power.buttons.sleep.background": "#dcdfe8", + "theme.bar.buttons.modules.ram.text": "#df8e1d", + "theme.bar.menus.menu.power.buttons.logout.text": "#40a02b", + "theme.bar.buttons.modules.updates.icon_background": "#8839ef", + "theme.bar.buttons.modules.kbLayout.background": "#dcdfe8", + "theme.bar.buttons.modules.power.background": "#dcdfe8", + "theme.bar.buttons.modules.weather.background": "#dcdfe8", + "theme.bar.buttons.icon_background": "#dcdfe8", + "theme.bar.menus.menu.power.background.color": "#eff1f5", + "theme.bar.buttons.modules.ram.background": "#dcdfe8", + "theme.bar.buttons.modules.netstat.icon": "#40a02b", + "theme.bar.buttons.windowtitle.icon_background": "#ea76cb", + "theme.bar.buttons.modules.cpu.icon_background": "#d20f39", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#40a02b", + "theme.bar.buttons.modules.updates.text": "#8839ef", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#dce0e8", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#dcdfe8", + "theme.bar.buttons.modules.updates.icon": "#8839ef", + "theme.bar.buttons.modules.cpu.text": "#d20f39", + "theme.bar.buttons.modules.netstat.icon_background": "#40a02b", + "theme.bar.buttons.modules.kbLayout.text": "#04a5e5", + "theme.bar.buttons.notifications.icon_background": "#7287fd", + "theme.bar.buttons.modules.power.border": "#d20f39", + "theme.bar.buttons.modules.weather.border": "#7287fd", + "theme.bar.buttons.modules.updates.border": "#8839ef", + "theme.bar.buttons.modules.kbLayout.border": "#04a5e5", + "theme.bar.buttons.modules.netstat.border": "#40a02b", + "theme.bar.buttons.modules.storage.border": "#d20f39", + "theme.bar.buttons.modules.cpu.border": "#d20f39", + "theme.bar.buttons.modules.ram.border": "#df8e1d", + "theme.bar.buttons.notifications.border": "#7287fd", + "theme.bar.buttons.clock.border": "#ea76cb", + "theme.bar.buttons.battery.border": "#df8e1d", + "theme.bar.buttons.systray.border": "#bcc0cc", + "theme.bar.buttons.bluetooth.border": "#04a5e5", + "theme.bar.buttons.network.border": "#8839ef", + "theme.bar.buttons.volume.border": "#e64553", + "theme.bar.buttons.media.border": "#7287fd", + "theme.bar.buttons.windowtitle.border": "#ea76cb", + "theme.bar.buttons.workspaces.border": "#dce0e8", + "theme.bar.buttons.dashboard.border": "#df8e1d", + "theme.bar.buttons.modules.submap.background": "#dcdfe8", + "theme.bar.buttons.modules.submap.text": "#179299", + "theme.bar.buttons.modules.submap.border": "#179299", + "theme.bar.buttons.modules.submap.icon": "#179299", + "theme.bar.buttons.modules.submap.icon_background": "#dcdfe8" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/catppuccin_latte_split.json b/ags/HyprPanel/themes/catppuccin_latte_split.json new file mode 100644 index 0000000..13aa39c --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_latte_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#7287fd", + "theme.bar.menus.menu.notifications.pager.label": "#7c7f93", + "theme.bar.menus.menu.notifications.pager.button": "#7287fd", + "theme.bar.menus.menu.notifications.pager.background": "#eff1f5", + "theme.bar.menus.menu.notifications.switch.puck": "#bcc0cc", + "theme.bar.menus.menu.notifications.switch.disabled": "#ccd0da", + "theme.bar.menus.menu.notifications.switch.enabled": "#7287fd", + "theme.bar.menus.menu.notifications.clear": "#d20f39", + "theme.bar.menus.menu.notifications.switch_divider": "#bcc0cc", + "theme.bar.menus.menu.notifications.border": "#ccd0da", + "theme.bar.menus.menu.notifications.card": "#dcdfe8", + "theme.bar.menus.menu.notifications.background": "#eff1f5", + "theme.bar.menus.menu.notifications.no_notifications_label": "#ccd0da", + "theme.bar.menus.menu.notifications.label": "#7287fd", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#dce0e8", + "theme.bar.menus.menu.power.buttons.sleep.text": "#04a5e5", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#04a5e5", + "theme.bar.menus.menu.power.buttons.sleep.background": "#dcdfe8", + "theme.bar.menus.menu.power.buttons.logout.icon": "#dce0e8", + "theme.bar.menus.menu.power.buttons.logout.text": "#40a02b", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#40a02b", + "theme.bar.menus.menu.power.buttons.logout.background": "#dcdfe8", + "theme.bar.menus.menu.power.buttons.restart.icon": "#dce0e8", + "theme.bar.menus.menu.power.buttons.restart.text": "#fe640b", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#fe640b", + "theme.bar.menus.menu.power.buttons.restart.background": "#dcdfe8", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#dce0e8", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#d20f39", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#d20f39", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#dcdfe8", + "theme.bar.menus.menu.power.border.color": "#ccd0da", + "theme.bar.menus.menu.power.background.color": "#eff1f5", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#ea76cb", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#ea76cb", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#ea76cb", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#40a02b", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#40a02b", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#40a02b", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#df8e1d", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#df8e1d", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#df8e1d", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#e64553", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#e64553", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#e64553", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#bcc0cc", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#7287fd", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#8839ef", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#179299", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#e64553", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#df8e1d", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#ea76cb", + "theme.bar.menus.menu.dashboard.controls.input.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.input.background": "#ea76cb", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#e64553", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#df8e1d", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#04a5e5", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#8839ef", + "theme.bar.menus.menu.dashboard.controls.disabled": "#acb0be", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#40a02b", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#dce0e8", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#7287fd", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#dce0e8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#d20f39", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#40a02b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#4c4f69", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#7287fd", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#ccd0da", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#dce0e8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#eff1f5", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#04a5e5", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#40a02b", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#fe640b", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#d20f39", + "theme.bar.menus.menu.dashboard.profile.name": "#ea76cb", + "theme.bar.menus.menu.dashboard.border.color": "#ccd0da", + "theme.bar.menus.menu.dashboard.background.color": "#eff1f5", + "theme.bar.menus.menu.dashboard.card.color": "#dcdfe8", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#ea76cb", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#ea76cb", + "theme.bar.menus.menu.clock.weather.hourly.time": "#ea76cb", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#04a5e5", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#1e66f5", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#7287fd", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#fe640b", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#d20f39", + "theme.bar.menus.menu.clock.weather.stats": "#ea76cb", + "theme.bar.menus.menu.clock.weather.status": "#179299", + "theme.bar.menus.menu.clock.weather.temperature": "#4c4f69", + "theme.bar.menus.menu.clock.weather.icon": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.contextdays": "#acb0be", + "theme.bar.menus.menu.clock.calendar.days": "#4c4f69", + "theme.bar.menus.menu.clock.calendar.currentday": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.paginator": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.weekdays": "#ea76cb", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#179299", + "theme.bar.menus.menu.clock.time.timeperiod": "#179299", + "theme.bar.menus.menu.clock.time.time": "#ea76cb", + "theme.bar.menus.menu.clock.text": "#4c4f69", + "theme.bar.menus.menu.clock.border.color": "#ccd0da", + "theme.bar.menus.menu.clock.background.color": "#eff1f5", + "theme.bar.menus.menu.clock.card.color": "#dcdfe8", + "theme.bar.menus.menu.battery.slider.puck": "#9ca0b0", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.battery.slider.background": "#acb0be", + "theme.bar.menus.menu.battery.slider.primary": "#df8e1d", + "theme.bar.menus.menu.battery.icons.active": "#df8e1d", + "theme.bar.menus.menu.battery.icons.passive": "#7c7f93", + "theme.bar.menus.menu.battery.listitems.active": "#df8e1d", + "theme.bar.menus.menu.battery.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.battery.text": "#4c4f69", + "theme.bar.menus.menu.battery.label.color": "#df8e1d", + "theme.bar.menus.menu.battery.border.color": "#ccd0da", + "theme.bar.menus.menu.battery.background.color": "#eff1f5", + "theme.bar.menus.menu.battery.card.color": "#dcdfe8", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#eff1f5", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#4c4f69", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#dce0e8", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#04a5e5", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#4c4f69", + "theme.bar.menus.menu.bluetooth.icons.active": "#04a5e5", + "theme.bar.menus.menu.bluetooth.icons.passive": "#7c7f93", + "theme.bar.menus.menu.bluetooth.listitems.active": "#04a5e5", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.bluetooth.switch.puck": "#bcc0cc", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#ccd0da", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#04a5e5", + "theme.bar.menus.menu.bluetooth.switch_divider": "#bcc0cc", + "theme.bar.menus.menu.bluetooth.status": "#9ca0b0", + "theme.bar.menus.menu.bluetooth.text": "#4c4f69", + "theme.bar.menus.menu.bluetooth.label.color": "#04a5e5", + "theme.bar.menus.menu.bluetooth.border.color": "#ccd0da", + "theme.bar.menus.menu.bluetooth.background.color": "#eff1f5", + "theme.bar.menus.menu.bluetooth.card.color": "#dcdfe8", + "theme.bar.menus.menu.network.iconbuttons.active": "#8839ef", + "theme.bar.menus.menu.network.iconbuttons.passive": "#4c4f69", + "theme.bar.menus.menu.network.icons.active": "#8839ef", + "theme.bar.menus.menu.network.icons.passive": "#7c7f93", + "theme.bar.menus.menu.network.listitems.active": "#8839ef", + "theme.bar.menus.menu.network.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.network.status.color": "#9ca0b0", + "theme.bar.menus.menu.network.text": "#4c4f69", + "theme.bar.menus.menu.network.label.color": "#8839ef", + "theme.bar.menus.menu.network.border.color": "#ccd0da", + "theme.bar.menus.menu.network.background.color": "#eff1f5", + "theme.bar.menus.menu.network.card.color": "#dcdfe8", + "theme.bar.menus.menu.volume.input_slider.puck": "#acb0be", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.volume.input_slider.background": "#acb0be", + "theme.bar.menus.menu.volume.input_slider.primary": "#e64553", + "theme.bar.menus.menu.volume.audio_slider.puck": "#acb0be", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.volume.audio_slider.background": "#acb0be", + "theme.bar.menus.menu.volume.audio_slider.primary": "#e64553", + "theme.bar.menus.menu.volume.icons.active": "#e64553", + "theme.bar.menus.menu.volume.icons.passive": "#7c7f93", + "theme.bar.menus.menu.volume.iconbutton.active": "#e64553", + "theme.bar.menus.menu.volume.iconbutton.passive": "#4c4f69", + "theme.bar.menus.menu.volume.listitems.active": "#e64553", + "theme.bar.menus.menu.volume.listitems.passive": "#4c4f69", + "theme.bar.menus.menu.volume.text": "#4c4f69", + "theme.bar.menus.menu.volume.label.color": "#e64553", + "theme.bar.menus.menu.volume.border.color": "#ccd0da", + "theme.bar.menus.menu.volume.background.color": "#e6e9ef", + "theme.bar.menus.menu.volume.card.color": "#dcdfe8", + "theme.bar.menus.menu.media.slider.puck": "#9ca0b0", + "theme.bar.menus.menu.media.slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.menu.media.slider.background": "#acb0be", + "theme.bar.menus.menu.media.slider.primary": "#ea76cb", + "theme.bar.menus.menu.media.buttons.text": "#dce0e8", + "theme.bar.menus.menu.media.buttons.background": "#7287fd", + "theme.bar.menus.menu.media.buttons.enabled": "#179299", + "theme.bar.menus.menu.media.buttons.inactive": "#acb0be", + "theme.bar.menus.menu.media.border.color": "#ccd0da", + "theme.bar.menus.menu.media.card.color": "#dcdfe8", + "theme.bar.menus.menu.media.background.color": "#eff1f5", + "theme.bar.menus.menu.media.album": "#ea76cb", + "theme.bar.menus.menu.media.artist": "#179299", + "theme.bar.menus.menu.media.song": "#7287fd", + "theme.bar.menus.tooltip.text": "#4c4f69", + "theme.bar.menus.tooltip.background": "#dce0e8", + "theme.bar.menus.dropdownmenu.divider": "#eff1f5", + "theme.bar.menus.dropdownmenu.text": "#4c4f69", + "theme.bar.menus.dropdownmenu.background": "#dce0e8", + "theme.bar.menus.slider.puck": "#9ca0b0", + "theme.bar.menus.slider.backgroundhover": "#bcc0cc", + "theme.bar.menus.slider.background": "#acb0be", + "theme.bar.menus.slider.primary": "#7287fd", + "theme.bar.menus.progressbar.background": "#bcc0cc", + "theme.bar.menus.progressbar.foreground": "#7287fd", + "theme.bar.menus.iconbuttons.active": "#7287fd", + "theme.bar.menus.iconbuttons.passive": "#4c4f69", + "theme.bar.menus.buttons.text": "#dce0e8", + "theme.bar.menus.buttons.disabled": "#acb0be", + "theme.bar.menus.buttons.active": "#ea76cb", + "theme.bar.menus.buttons.default": "#7287fd", + "theme.bar.menus.check_radio_button.active": "#7186fd", + "theme.bar.menus.check_radio_button.background": "#dcdfe8", + "theme.bar.menus.switch.puck": "#bcc0cc", + "theme.bar.menus.switch.disabled": "#ccd0da", + "theme.bar.menus.switch.enabled": "#7287fd", + "theme.bar.menus.icons.active": "#7287fd", + "theme.bar.menus.icons.passive": "#acb0be", + "theme.bar.menus.listitems.active": "#7287fd", + "theme.bar.menus.listitems.passive": "#4c4f69", + "theme.bar.menus.popover.border": "#dce0e8", + "theme.bar.menus.popover.background": "#dce0e8", + "theme.bar.menus.popover.text": "#7287fd", + "theme.bar.menus.label": "#7287fd", + "theme.bar.menus.feinttext": "#ccd0da", + "theme.bar.menus.dimtext": "#acb0be", + "theme.bar.menus.text": "#4c4f69", + "theme.bar.menus.border.color": "#ccd0da", + "theme.bar.menus.cards": "#dce0e8", + "theme.bar.menus.background": "#eff1f5", + "theme.bar.buttons.modules.power.icon_background": "#d20f39", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.buttons.modules.power.background": "#dcdfe8", + "theme.bar.buttons.modules.power.border": "#d20f39", + "theme.bar.buttons.modules.weather.icon_background": "#7287fd", + "theme.bar.buttons.modules.weather.icon": "#dcdfe8", + "theme.bar.buttons.modules.weather.text": "#7287fd", + "theme.bar.buttons.modules.weather.background": "#dcdfe8", + "theme.bar.buttons.modules.weather.border": "#7287fd", + "theme.bar.buttons.modules.updates.icon_background": "#8839ef", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.updates.text": "#8839ef", + "theme.bar.buttons.modules.updates.background": "#dcdfe8", + "theme.bar.buttons.modules.updates.border": "#8839ef", + "theme.bar.buttons.modules.kbLayout.icon_background": "#04a5e5", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.kbLayout.text": "#04a5e5", + "theme.bar.buttons.modules.kbLayout.background": "#dcdfe8", + "theme.bar.buttons.modules.kbLayout.border": "#04a5e5", + "theme.bar.buttons.modules.netstat.icon_background": "#40a02b", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.netstat.text": "#40a02b", + "theme.bar.buttons.modules.netstat.background": "#dcdfe8", + "theme.bar.buttons.modules.netstat.border": "#40a02b", + "theme.bar.buttons.modules.storage.icon_background": "#d20f39", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.storage.text": "#d20f39", + "theme.bar.buttons.modules.storage.background": "#dcdfe8", + "theme.bar.buttons.modules.storage.border": "#d20f39", + "theme.bar.buttons.modules.cpu.icon_background": "#d20f39", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.cpu.text": "#d20f39", + "theme.bar.buttons.modules.cpu.background": "#dcdfe8", + "theme.bar.buttons.modules.cpu.border": "#d20f39", + "theme.bar.buttons.modules.ram.icon_background": "#df8e1d", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.ram.text": "#df8e1d", + "theme.bar.buttons.modules.ram.background": "#dcdfe8", + "theme.bar.buttons.modules.ram.border": "#df8e1d", + "theme.bar.buttons.notifications.total": "#7287fd", + "theme.bar.buttons.notifications.icon_background": "#7287fd", + "theme.bar.buttons.notifications.icon": "#dcdee8", + "theme.bar.buttons.notifications.background": "#dcdfe8", + "theme.bar.buttons.notifications.border": "#7287fd", + "theme.bar.buttons.clock.icon_background": "#ea76cb", + "theme.bar.buttons.clock.icon": "#dcdee8", + "theme.bar.buttons.clock.text": "#ea76cb", + "theme.bar.buttons.clock.background": "#dcdfe8", + "theme.bar.buttons.clock.border": "#ea76cb", + "theme.bar.buttons.battery.icon_background": "#df8e1d", + "theme.bar.buttons.battery.icon": "#dcdee8", + "theme.bar.buttons.battery.text": "#df8e1d", + "theme.bar.buttons.battery.background": "#dcdfe8", + "theme.bar.buttons.battery.border": "#df8e1d", + "theme.bar.buttons.systray.background": "#dcdfe8", + "theme.bar.buttons.systray.border": "#bcc0cc", + "theme.bar.buttons.bluetooth.icon_background": "#04a5e5", + "theme.bar.buttons.bluetooth.icon": "#dcdee8", + "theme.bar.buttons.bluetooth.text": "#04a5e5", + "theme.bar.buttons.bluetooth.background": "#dcdfe8", + "theme.bar.buttons.bluetooth.border": "#04a5e5", + "theme.bar.buttons.network.icon_background": "#8839ef", + "theme.bar.buttons.network.icon": "#dcdee8", + "theme.bar.buttons.network.text": "#8839ef", + "theme.bar.buttons.network.background": "#dcdfe8", + "theme.bar.buttons.network.border": "#8839ef", + "theme.bar.buttons.volume.icon_background": "#e64553", + "theme.bar.buttons.volume.icon": "#dcdee8", + "theme.bar.buttons.volume.text": "#e64553", + "theme.bar.buttons.volume.background": "#dcdfe8", + "theme.bar.buttons.volume.border": "#e64553", + "theme.bar.buttons.media.icon_background": "#7287fd", + "theme.bar.buttons.media.icon": "#dcdee8", + "theme.bar.buttons.media.text": "#7287fd", + "theme.bar.buttons.media.background": "#dcdfe8", + "theme.bar.buttons.media.border": "#7287fd", + "theme.bar.buttons.windowtitle.icon_background": "#ea76cb", + "theme.bar.buttons.windowtitle.icon": "#dcdee8", + "theme.bar.buttons.windowtitle.text": "#ea76cb", + "theme.bar.buttons.windowtitle.border": "#ea76cb", + "theme.bar.buttons.windowtitle.background": "#dcdfe8", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.hover": "#bcc0cc", + "theme.bar.buttons.workspaces.active": "#ea76cb", + "theme.bar.buttons.workspaces.occupied": "#dd7878", + "theme.bar.buttons.workspaces.available": "#04a5e5", + "theme.bar.buttons.workspaces.border": "#dce0e8", + "theme.bar.buttons.workspaces.background": "#dcdfe8", + "theme.bar.buttons.dashboard.icon": "#dcdee8", + "theme.bar.buttons.dashboard.border": "#df8e1d", + "theme.bar.buttons.dashboard.background": "#df8e1d", + "theme.bar.buttons.icon": "#7287fd", + "theme.bar.buttons.text": "#7287fd", + "theme.bar.buttons.hover": "#bcc0cc", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.background": "#e6e9ef", + "theme.bar.buttons.style": "split", + "theme.bar.background": "#eff1f5", + "theme.osd.label": "#7287fd", + "theme.osd.icon": "#ccd0da", + "theme.osd.bar_overflow_color": "#d20f39", + "theme.osd.bar_empty_color": "#acb0be", + "theme.osd.bar_color": "#7287fd", + "theme.osd.icon_container": "#7287fd", + "theme.osd.bar_container": "#ccd0da", + "theme.notification.close_button.label": "#dce0e8", + "theme.notification.close_button.background": "#d20f39", + "theme.notification.labelicon": "#7287fd", + "theme.notification.text": "#4c4f69", + "theme.notification.time": "#8c8fa1", + "theme.notification.border": "#ccd0da", + "theme.notification.label": "#7287fd", + "theme.notification.actions.text": "#dce0e8", + "theme.notification.actions.background": "#7287fd", + "theme.notification.background": "#ccd0da", + "theme.bar.buttons.modules.submap.background": "#dcdfe8", + "theme.bar.buttons.modules.submap.text": "#179299", + "theme.bar.buttons.modules.submap.border": "#179299", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.icon_background": "#179299" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/catppuccin_macchiato.json b/ags/HyprPanel/themes/catppuccin_macchiato.json new file mode 100644 index 0000000..cf5ecc8 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_macchiato.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#181926", + "theme.bar.background": "#181926", + "theme.bar.buttons.media.icon": "#b7bdf8", + "theme.bar.buttons.media.text": "#b7bdf8", + "theme.bar.buttons.icon": "#b7bdf8", + "theme.bar.buttons.text": "#b7bdf8", + "theme.bar.buttons.hover": "#494d64", + "theme.bar.buttons.background": "#24273a", + "theme.bar.menus.text": "#cad3f5", + "theme.bar.menus.border.color": "#363a4f", + "theme.bar.buttons.media.background": "#24273a", + "theme.bar.menus.menu.volume.text": "#cad3f5", + "theme.bar.menus.menu.volume.card.color": "#1e2030", + "theme.bar.menus.menu.volume.label.color": "#ee99a0", + "theme.bar.menus.popover.text": "#b7bdf8", + "theme.bar.menus.popover.background": "#181926", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#ed8796", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#ed8796", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a6da95", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#181926", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#cad3f5", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#b7bdf8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#363a4f", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#181926", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1e2030", + "theme.bar.menus.menu.notifications.switch.puck": "#494d64", + "theme.bar.menus.menu.notifications.switch.disabled": "#363a4f", + "theme.bar.menus.menu.notifications.switch.enabled": "#b7bdf8", + "theme.bar.menus.menu.notifications.clear": "#ed8796", + "theme.bar.menus.menu.notifications.switch_divider": "#494d64", + "theme.bar.menus.menu.notifications.border": "#363a4f", + "theme.bar.menus.menu.notifications.card": "#1e2030", + "theme.bar.menus.menu.notifications.background": "#181926", + "theme.bar.menus.menu.notifications.no_notifications_label": "#363a4f", + "theme.bar.menus.menu.notifications.label": "#b7bdf8", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f5bde6", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f5bde6", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f5bde6", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a6da95", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a6da95", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a6da95", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#eed49f", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#eed49f", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#eed49f", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ee99a0", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ee99a0", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ee99a0", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#494d64", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#b7bdf8", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#c6a0f6", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8bd5ca", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ee99a0", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#eed49f", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f5bde6", + "theme.bar.menus.menu.dashboard.controls.input.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f5bde6", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ee99a0", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#eed49f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#91d7e3", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c6a0f6", + "theme.bar.menus.menu.dashboard.controls.disabled": "#5b6078", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a6da95", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#181926", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#b7bdf8", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#91d7e3", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a6da95", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#f5a97f", + "theme.bar.menus.menu.dashboard.profile.name": "#f5bde6", + "theme.bar.menus.menu.dashboard.border.color": "#363a4f", + "theme.bar.menus.menu.dashboard.background.color": "#181926", + "theme.bar.menus.menu.dashboard.card.color": "#1e2030", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f5bde6", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f5bde6", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f5bde6", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#91d7e3", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#8aadf4", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#b7bdf8", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#f5a97f", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#ed8796", + "theme.bar.menus.menu.clock.weather.stats": "#f5bde6", + "theme.bar.menus.menu.clock.weather.status": "#8bd5ca", + "theme.bar.menus.menu.clock.weather.temperature": "#cad3f5", + "theme.bar.menus.menu.clock.weather.icon": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.contextdays": "#5b6078", + "theme.bar.menus.menu.clock.calendar.days": "#cad3f5", + "theme.bar.menus.menu.clock.calendar.currentday": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.paginator": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8bd5ca", + "theme.bar.menus.menu.clock.time.timeperiod": "#8bd5ca", + "theme.bar.menus.menu.clock.time.time": "#f5bde6", + "theme.bar.menus.menu.clock.text": "#cad3f5", + "theme.bar.menus.menu.clock.border.color": "#363a4f", + "theme.bar.menus.menu.clock.background.color": "#181926", + "theme.bar.menus.menu.clock.card.color": "#1e2030", + "theme.bar.menus.menu.battery.slider.puck": "#6e738d", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.battery.slider.background": "#5b6078", + "theme.bar.menus.menu.battery.slider.primary": "#eed49f", + "theme.bar.menus.menu.battery.icons.active": "#eed49f", + "theme.bar.menus.menu.battery.icons.passive": "#939ab7", + "theme.bar.menus.menu.battery.listitems.active": "#eed49f", + "theme.bar.menus.menu.battery.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.battery.text": "#cad3f5", + "theme.bar.menus.menu.battery.label.color": "#eed49f", + "theme.bar.menus.menu.battery.border.color": "#363a4f", + "theme.bar.menus.menu.battery.background.color": "#181926", + "theme.bar.menus.menu.battery.card.color": "#1e2030", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1e2030", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#cad3f5", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#181926", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#91d7e3", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#cad3f5", + "theme.bar.menus.menu.bluetooth.icons.active": "#91d7e3", + "theme.bar.menus.menu.bluetooth.icons.passive": "#939ab7", + "theme.bar.menus.menu.bluetooth.listitems.active": "#91d7e3", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.bluetooth.switch.puck": "#494d64", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#363a4f", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#91d7e3", + "theme.bar.menus.menu.bluetooth.switch_divider": "#494d64", + "theme.bar.menus.menu.bluetooth.status": "#6e738d", + "theme.bar.menus.menu.bluetooth.text": "#cad3f5", + "theme.bar.menus.menu.bluetooth.label.color": "#91d7e3", + "theme.bar.menus.menu.bluetooth.border.color": "#363a4f", + "theme.bar.menus.menu.bluetooth.background.color": "#181926", + "theme.bar.menus.menu.bluetooth.card.color": "#1e2030", + "theme.bar.menus.menu.network.iconbuttons.active": "#c6a0f6", + "theme.bar.menus.menu.network.iconbuttons.passive": "#cad3f5", + "theme.bar.menus.menu.network.icons.active": "#c6a0f6", + "theme.bar.menus.menu.network.icons.passive": "#939ab7", + "theme.bar.menus.menu.network.listitems.active": "#c6a0f6", + "theme.bar.menus.menu.network.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.network.status.color": "#6e738d", + "theme.bar.menus.menu.network.text": "#cad3f5", + "theme.bar.menus.menu.network.label.color": "#c6a0f6", + "theme.bar.menus.menu.network.border.color": "#363a4f", + "theme.bar.menus.menu.network.background.color": "#181926", + "theme.bar.menus.menu.network.card.color": "#1e2030", + "theme.bar.menus.menu.volume.input_slider.puck": "#5b6078", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.volume.input_slider.background": "#5b6078", + "theme.bar.menus.menu.volume.input_slider.primary": "#ee99a0", + "theme.bar.menus.menu.volume.audio_slider.puck": "#5b6078", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.volume.audio_slider.background": "#5b6078", + "theme.bar.menus.menu.volume.audio_slider.primary": "#ee99a0", + "theme.bar.menus.menu.volume.icons.active": "#ee99a0", + "theme.bar.menus.menu.volume.icons.passive": "#939ab7", + "theme.bar.menus.menu.volume.iconbutton.active": "#ee99a0", + "theme.bar.menus.menu.volume.iconbutton.passive": "#cad3f5", + "theme.bar.menus.menu.volume.listitems.active": "#ee99a0", + "theme.bar.menus.menu.volume.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.volume.border.color": "#363a4f", + "theme.bar.menus.menu.volume.background.color": "#181926", + "theme.bar.menus.menu.media.slider.puck": "#6e738d", + "theme.bar.menus.menu.media.slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.media.slider.background": "#5b6078", + "theme.bar.menus.menu.media.slider.primary": "#f5bde6", + "theme.bar.menus.menu.media.buttons.text": "#181926", + "theme.bar.menus.menu.media.buttons.background": "#b7bdf8", + "theme.bar.menus.menu.media.buttons.enabled": "#8bd5ca", + "theme.bar.menus.menu.media.buttons.inactive": "#5b6078", + "theme.bar.menus.menu.media.border.color": "#363a4f", + "theme.bar.menus.menu.media.background.color": "#181926", + "theme.bar.menus.menu.media.album": "#f5bde6", + "theme.bar.menus.menu.media.artist": "#8bd5ca", + "theme.bar.menus.menu.media.song": "#b7bdf8", + "theme.bar.menus.tooltip.text": "#cad3f5", + "theme.bar.menus.tooltip.background": "#181926", + "theme.bar.menus.dropdownmenu.divider": "#1e2030", + "theme.bar.menus.dropdownmenu.text": "#cad3f5", + "theme.bar.menus.dropdownmenu.background": "#181926", + "theme.bar.menus.slider.puck": "#6e738d", + "theme.bar.menus.slider.backgroundhover": "#494d64", + "theme.bar.menus.slider.background": "#5b6078", + "theme.bar.menus.slider.primary": "#b7bdf8", + "theme.bar.menus.progressbar.background": "#494d64", + "theme.bar.menus.progressbar.foreground": "#b7bdf8", + "theme.bar.menus.iconbuttons.active": "#b7bdf8", + "theme.bar.menus.iconbuttons.passive": "#cad3f5", + "theme.bar.menus.buttons.text": "#181926", + "theme.bar.menus.buttons.disabled": "#5b6078", + "theme.bar.menus.buttons.active": "#f5bde6", + "theme.bar.menus.buttons.default": "#b7bdf8", + "theme.bar.menus.switch.puck": "#494d64", + "theme.bar.menus.switch.disabled": "#363a4f", + "theme.bar.menus.switch.enabled": "#b7bdf8", + "theme.bar.menus.icons.active": "#b7bdf8", + "theme.bar.menus.icons.passive": "#5b6078", + "theme.bar.menus.listitems.active": "#b7bdf8", + "theme.bar.menus.listitems.passive": "#cad3f5", + "theme.bar.menus.label": "#b7bdf8", + "theme.bar.menus.feinttext": "#363a4f", + "theme.bar.menus.dimtext": "#5b6078", + "theme.bar.menus.cards": "#1e2030", + "theme.bar.buttons.notifications.total": "#b7bdf8", + "theme.bar.buttons.notifications.icon": "#b7bdf8", + "theme.bar.buttons.notifications.background": "#24273a", + "theme.bar.buttons.clock.icon": "#f5bde6", + "theme.bar.buttons.clock.text": "#f5bde6", + "theme.bar.buttons.clock.background": "#24273a", + "theme.bar.buttons.battery.icon": "#eed49f", + "theme.bar.buttons.battery.text": "#eed49f", + "theme.bar.buttons.battery.background": "#24273a", + "theme.bar.buttons.systray.background": "#24273a", + "theme.bar.buttons.bluetooth.icon": "#91d7e3", + "theme.bar.buttons.bluetooth.text": "#91d7e3", + "theme.bar.buttons.bluetooth.background": "#24273a", + "theme.bar.buttons.network.icon": "#c6a0f6", + "theme.bar.buttons.network.text": "#c6a0f6", + "theme.bar.buttons.network.background": "#24273a", + "theme.bar.buttons.volume.icon": "#ee99a0", + "theme.bar.buttons.volume.text": "#ee99a0", + "theme.bar.buttons.volume.background": "#24273a", + "theme.bar.buttons.windowtitle.icon": "#f5bde6", + "theme.bar.buttons.windowtitle.text": "#f5bde6", + "theme.bar.buttons.windowtitle.background": "#24273a", + "theme.bar.buttons.workspaces.active": "#f5bde6", + "theme.bar.buttons.workspaces.occupied": "#f0c6c6", + "theme.bar.buttons.workspaces.available": "#91d7e3", + "theme.bar.buttons.workspaces.hover": "#494d64", + "theme.bar.buttons.workspaces.background": "#24273a", + "theme.bar.buttons.dashboard.icon": "#eed49f", + "theme.bar.buttons.dashboard.background": "#24273a", + "theme.osd.label": "#b7bdf8", + "theme.osd.icon": "#181926", + "theme.osd.bar_overflow_color": "#ed8796", + "theme.osd.bar_empty_color": "#363a4f", + "theme.osd.bar_color": "#b7bdf8", + "theme.osd.icon_container": "#b7bdf8", + "theme.osd.bar_container": "#181926", + "theme.notification.close_button.label": "#181926", + "theme.notification.close_button.background": "#ed8796", + "theme.notification.labelicon": "#b7bdf8", + "theme.notification.text": "#cad3f5", + "theme.notification.time": "#8087a2", + "theme.notification.border": "#363a4f", + "theme.notification.label": "#b7bdf8", + "theme.notification.actions.text": "#181926", + "theme.notification.actions.background": "#b7bdf8", + "theme.notification.background": "#181926", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.menus.menu.media.card.color": "#1e2030", + "theme.bar.menus.check_radio_button.background": "#181826", + "theme.bar.menus.check_radio_button.active": "#b7bcf8", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#b7bdf8", + "theme.bar.menus.menu.notifications.scrollbar.color": "#b7bdf8", + "theme.bar.menus.menu.notifications.pager.label": "#939ab7", + "theme.bar.menus.menu.notifications.pager.background": "#181926", + "theme.bar.buttons.clock.icon_background": "#f5bde6", + "theme.bar.buttons.modules.ram.icon": "#eed49f", + "theme.bar.buttons.modules.storage.icon_background": "#ed8796", + "theme.bar.menus.popover.border": "#181926", + "theme.bar.buttons.volume.icon_background": "#ee99a0", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#91d7e3", + "theme.bar.menus.menu.power.buttons.restart.text": "#f5a97f", + "theme.bar.buttons.modules.updates.background": "#24273a", + "theme.bar.buttons.modules.storage.icon": "#ed8796", + "theme.bar.buttons.modules.netstat.background": "#24273a", + "theme.bar.buttons.modules.weather.icon": "#b7bdf8", + "theme.bar.buttons.modules.netstat.text": "#a6da95", + "theme.bar.buttons.modules.storage.background": "#24273a", + "theme.bar.buttons.modules.power.icon": "#ed8796", + "theme.bar.buttons.modules.storage.text": "#ed8796", + "theme.bar.buttons.modules.cpu.background": "#24273a", + "theme.bar.menus.menu.power.border.color": "#363a4f", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#ed8796", + "theme.bar.menus.menu.power.buttons.logout.icon": "#181926", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#f5a97f", + "theme.bar.menus.menu.power.buttons.restart.icon": "#181926", + "theme.bar.buttons.modules.cpu.icon": "#ed8796", + "theme.bar.buttons.battery.icon_background": "#eed49f", + "theme.bar.buttons.modules.kbLayout.icon_background": "#91d7e3", + "theme.bar.buttons.modules.weather.text": "#b7bdf8", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#181926", + "theme.bar.menus.menu.power.buttons.sleep.text": "#91d7e3", + "theme.bar.buttons.modules.weather.icon_background": "#b7bdf8", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1e2030", + "theme.bar.buttons.media.icon_background": "#b7bdf8", + "theme.bar.menus.menu.power.buttons.logout.background": "#1e2030", + "theme.bar.buttons.modules.kbLayout.icon": "#91d7e3", + "theme.bar.buttons.modules.ram.icon_background": "#eed49f", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#ed8796", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#ed8796", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1e2030", + "theme.bar.buttons.modules.ram.text": "#eed49f", + "theme.bar.menus.menu.power.buttons.logout.text": "#a6da95", + "theme.bar.buttons.modules.updates.icon_background": "#c6a0f6", + "theme.bar.buttons.modules.kbLayout.background": "#24273a", + "theme.bar.buttons.modules.power.background": "#24273a", + "theme.bar.buttons.modules.weather.background": "#24273a", + "theme.bar.buttons.icon_background": "#24273a", + "theme.bar.menus.menu.power.background.color": "#181926", + "theme.bar.buttons.modules.ram.background": "#24273a", + "theme.bar.buttons.modules.netstat.icon": "#a6da95", + "theme.bar.buttons.windowtitle.icon_background": "#f5bde6", + "theme.bar.buttons.modules.cpu.icon_background": "#ed8796", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a6da95", + "theme.bar.buttons.modules.updates.text": "#c6a0f6", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#181926", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#1e2030", + "theme.bar.buttons.modules.updates.icon": "#c6a0f6", + "theme.bar.buttons.modules.cpu.text": "#ed8796", + "theme.bar.buttons.modules.netstat.icon_background": "#a6da95", + "theme.bar.buttons.modules.kbLayout.text": "#91d7e3", + "theme.bar.buttons.notifications.icon_background": "#b7bdf8", + "theme.bar.buttons.modules.power.border": "#ed8796", + "theme.bar.buttons.modules.weather.border": "#b7bdf8", + "theme.bar.buttons.modules.updates.border": "#c6a0f6", + "theme.bar.buttons.modules.kbLayout.border": "#91d7e3", + "theme.bar.buttons.modules.netstat.border": "#a6da95", + "theme.bar.buttons.modules.storage.border": "#ed8796", + "theme.bar.buttons.modules.cpu.border": "#ed8796", + "theme.bar.buttons.modules.ram.border": "#eed49f", + "theme.bar.buttons.notifications.border": "#b7bdf8", + "theme.bar.buttons.clock.border": "#f5bde6", + "theme.bar.buttons.battery.border": "#eed49f", + "theme.bar.buttons.systray.border": "#494d64", + "theme.bar.buttons.bluetooth.border": "#91d7e3", + "theme.bar.buttons.network.border": "#c6a0f6", + "theme.bar.buttons.volume.border": "#ee99a0", + "theme.bar.buttons.media.border": "#b7bdf8", + "theme.bar.buttons.windowtitle.border": "#f5bde6", + "theme.bar.buttons.workspaces.border": "#181926", + "theme.bar.buttons.dashboard.border": "#eed49f", + "theme.bar.buttons.modules.submap.background": "#24273a", + "theme.bar.buttons.modules.submap.text": "#8bd5ca", + "theme.bar.buttons.modules.submap.border": "#8bd5ca", + "theme.bar.buttons.modules.submap.icon": "#8bd5ca", + "theme.bar.buttons.modules.submap.icon_background": "#24273a" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/catppuccin_macchiato_split.json b/ags/HyprPanel/themes/catppuccin_macchiato_split.json new file mode 100644 index 0000000..d5602a8 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_macchiato_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#181926", + "theme.bar.background": "#181926", + "theme.bar.buttons.media.icon": "#24273a", + "theme.bar.buttons.media.text": "#b7bdf8", + "theme.bar.buttons.icon": "#b7bdf8", + "theme.bar.buttons.text": "#b7bdf8", + "theme.bar.buttons.hover": "#494d64", + "theme.bar.buttons.background": "#24273a", + "theme.bar.menus.text": "#cad3f5", + "theme.bar.menus.border.color": "#363a4f", + "theme.bar.buttons.media.background": "#24273a", + "theme.bar.menus.menu.volume.text": "#cad3f5", + "theme.bar.menus.menu.volume.card.color": "#1e2030", + "theme.bar.menus.menu.volume.label.color": "#ee99a0", + "theme.bar.menus.popover.text": "#b7bdf8", + "theme.bar.menus.popover.background": "#181926", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#ed8796", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#ed8796", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a6da95", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#181926", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#cad3f5", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#b7bdf8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#363a4f", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#181926", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1e2030", + "theme.bar.menus.menu.notifications.switch.puck": "#494d64", + "theme.bar.menus.menu.notifications.switch.disabled": "#363a4f", + "theme.bar.menus.menu.notifications.switch.enabled": "#b7bdf8", + "theme.bar.menus.menu.notifications.clear": "#ed8796", + "theme.bar.menus.menu.notifications.switch_divider": "#494d64", + "theme.bar.menus.menu.notifications.border": "#363a4f", + "theme.bar.menus.menu.notifications.card": "#1e2030", + "theme.bar.menus.menu.notifications.background": "#181926", + "theme.bar.menus.menu.notifications.no_notifications_label": "#363a4f", + "theme.bar.menus.menu.notifications.label": "#b7bdf8", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f5bde6", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f5bde6", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f5bde6", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a6da95", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a6da95", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a6da95", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#eed49f", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#eed49f", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#eed49f", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ee99a0", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ee99a0", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ee99a0", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#494d64", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#b7bdf8", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#c6a0f6", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8bd5ca", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ee99a0", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#eed49f", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f5bde6", + "theme.bar.menus.menu.dashboard.controls.input.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f5bde6", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ee99a0", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#eed49f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#91d7e3", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#181926", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c6a0f6", + "theme.bar.menus.menu.dashboard.controls.disabled": "#5b6078", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a6da95", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#181926", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#b7bdf8", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#91d7e3", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a6da95", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#f5a97f", + "theme.bar.menus.menu.dashboard.profile.name": "#f5bde6", + "theme.bar.menus.menu.dashboard.border.color": "#363a4f", + "theme.bar.menus.menu.dashboard.background.color": "#181926", + "theme.bar.menus.menu.dashboard.card.color": "#1e2030", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f5bde6", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f5bde6", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f5bde6", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#91d7e3", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#8aadf4", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#b7bdf8", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#f5a97f", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#ed8796", + "theme.bar.menus.menu.clock.weather.stats": "#f5bde6", + "theme.bar.menus.menu.clock.weather.status": "#8bd5ca", + "theme.bar.menus.menu.clock.weather.temperature": "#cad3f5", + "theme.bar.menus.menu.clock.weather.icon": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.contextdays": "#5b6078", + "theme.bar.menus.menu.clock.calendar.days": "#cad3f5", + "theme.bar.menus.menu.clock.calendar.currentday": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.paginator": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f5bde6", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8bd5ca", + "theme.bar.menus.menu.clock.time.timeperiod": "#8bd5ca", + "theme.bar.menus.menu.clock.time.time": "#f5bde6", + "theme.bar.menus.menu.clock.text": "#cad3f5", + "theme.bar.menus.menu.clock.border.color": "#363a4f", + "theme.bar.menus.menu.clock.background.color": "#181926", + "theme.bar.menus.menu.clock.card.color": "#1e2030", + "theme.bar.menus.menu.battery.slider.puck": "#6e738d", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.battery.slider.background": "#5b6078", + "theme.bar.menus.menu.battery.slider.primary": "#eed49f", + "theme.bar.menus.menu.battery.icons.active": "#eed49f", + "theme.bar.menus.menu.battery.icons.passive": "#939ab7", + "theme.bar.menus.menu.battery.listitems.active": "#eed49f", + "theme.bar.menus.menu.battery.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.battery.text": "#cad3f5", + "theme.bar.menus.menu.battery.label.color": "#eed49f", + "theme.bar.menus.menu.battery.border.color": "#363a4f", + "theme.bar.menus.menu.battery.background.color": "#181926", + "theme.bar.menus.menu.battery.card.color": "#1e2030", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1e2030", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#cad3f5", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#181926", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#91d7e3", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#cad3f5", + "theme.bar.menus.menu.bluetooth.icons.active": "#91d7e3", + "theme.bar.menus.menu.bluetooth.icons.passive": "#939ab7", + "theme.bar.menus.menu.bluetooth.listitems.active": "#91d7e3", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.bluetooth.switch.puck": "#494d64", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#363a4f", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#91d7e3", + "theme.bar.menus.menu.bluetooth.switch_divider": "#494d64", + "theme.bar.menus.menu.bluetooth.status": "#6e738d", + "theme.bar.menus.menu.bluetooth.text": "#cad3f5", + "theme.bar.menus.menu.bluetooth.label.color": "#91d7e3", + "theme.bar.menus.menu.bluetooth.border.color": "#363a4f", + "theme.bar.menus.menu.bluetooth.background.color": "#181926", + "theme.bar.menus.menu.bluetooth.card.color": "#1e2030", + "theme.bar.menus.menu.network.iconbuttons.active": "#c6a0f6", + "theme.bar.menus.menu.network.iconbuttons.passive": "#cad3f5", + "theme.bar.menus.menu.network.icons.active": "#c6a0f6", + "theme.bar.menus.menu.network.icons.passive": "#939ab7", + "theme.bar.menus.menu.network.listitems.active": "#c6a0f6", + "theme.bar.menus.menu.network.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.network.status.color": "#6e738d", + "theme.bar.menus.menu.network.text": "#cad3f5", + "theme.bar.menus.menu.network.label.color": "#c6a0f6", + "theme.bar.menus.menu.network.border.color": "#363a4f", + "theme.bar.menus.menu.network.background.color": "#181926", + "theme.bar.menus.menu.network.card.color": "#1e2030", + "theme.bar.menus.menu.volume.input_slider.puck": "#5b6078", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.volume.input_slider.background": "#5b6078", + "theme.bar.menus.menu.volume.input_slider.primary": "#ee99a0", + "theme.bar.menus.menu.volume.audio_slider.puck": "#5b6078", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.volume.audio_slider.background": "#5b6078", + "theme.bar.menus.menu.volume.audio_slider.primary": "#ee99a0", + "theme.bar.menus.menu.volume.icons.active": "#ee99a0", + "theme.bar.menus.menu.volume.icons.passive": "#939ab7", + "theme.bar.menus.menu.volume.iconbutton.active": "#ee99a0", + "theme.bar.menus.menu.volume.iconbutton.passive": "#cad3f5", + "theme.bar.menus.menu.volume.listitems.active": "#ee99a0", + "theme.bar.menus.menu.volume.listitems.passive": "#cad3f5", + "theme.bar.menus.menu.volume.border.color": "#363a4f", + "theme.bar.menus.menu.volume.background.color": "#181926", + "theme.bar.menus.menu.media.slider.puck": "#6e738d", + "theme.bar.menus.menu.media.slider.backgroundhover": "#494d64", + "theme.bar.menus.menu.media.slider.background": "#5b6078", + "theme.bar.menus.menu.media.slider.primary": "#f5bde6", + "theme.bar.menus.menu.media.buttons.text": "#181926", + "theme.bar.menus.menu.media.buttons.background": "#b7bdf8", + "theme.bar.menus.menu.media.buttons.enabled": "#8bd5ca", + "theme.bar.menus.menu.media.buttons.inactive": "#5b6078", + "theme.bar.menus.menu.media.border.color": "#363a4f", + "theme.bar.menus.menu.media.background.color": "#181926", + "theme.bar.menus.menu.media.album": "#f5bde6", + "theme.bar.menus.menu.media.artist": "#8bd5ca", + "theme.bar.menus.menu.media.song": "#b7bdf8", + "theme.bar.menus.tooltip.text": "#cad3f5", + "theme.bar.menus.tooltip.background": "#181926", + "theme.bar.menus.dropdownmenu.divider": "#1e2030", + "theme.bar.menus.dropdownmenu.text": "#cad3f5", + "theme.bar.menus.dropdownmenu.background": "#181926", + "theme.bar.menus.slider.puck": "#6e738d", + "theme.bar.menus.slider.backgroundhover": "#494d64", + "theme.bar.menus.slider.background": "#5b6078", + "theme.bar.menus.slider.primary": "#b7bdf8", + "theme.bar.menus.progressbar.background": "#494d64", + "theme.bar.menus.progressbar.foreground": "#b7bdf8", + "theme.bar.menus.iconbuttons.active": "#b7bdf8", + "theme.bar.menus.iconbuttons.passive": "#cad3f5", + "theme.bar.menus.buttons.text": "#181926", + "theme.bar.menus.buttons.disabled": "#5b6078", + "theme.bar.menus.buttons.active": "#f5bde6", + "theme.bar.menus.buttons.default": "#b7bdf8", + "theme.bar.menus.switch.puck": "#494d64", + "theme.bar.menus.switch.disabled": "#363a4f", + "theme.bar.menus.switch.enabled": "#b7bdf8", + "theme.bar.menus.icons.active": "#b7bdf8", + "theme.bar.menus.icons.passive": "#5b6078", + "theme.bar.menus.listitems.active": "#b7bdf8", + "theme.bar.menus.listitems.passive": "#cad3f5", + "theme.bar.menus.label": "#b7bdf8", + "theme.bar.menus.feinttext": "#363a4f", + "theme.bar.menus.dimtext": "#5b6078", + "theme.bar.menus.cards": "#1e2030", + "theme.bar.buttons.notifications.total": "#b7bdf8", + "theme.bar.buttons.notifications.icon": "#24273a", + "theme.bar.buttons.notifications.background": "#24273a", + "theme.bar.buttons.clock.icon": "#24273a", + "theme.bar.buttons.clock.text": "#f5bde6", + "theme.bar.buttons.clock.background": "#24273a", + "theme.bar.buttons.battery.icon": "#24273a", + "theme.bar.buttons.battery.text": "#eed49f", + "theme.bar.buttons.battery.background": "#24273a", + "theme.bar.buttons.systray.background": "#24273a", + "theme.bar.buttons.bluetooth.icon": "#24273a", + "theme.bar.buttons.bluetooth.text": "#91d7e3", + "theme.bar.buttons.bluetooth.background": "#24273a", + "theme.bar.buttons.network.icon": "#24273a", + "theme.bar.buttons.network.text": "#c6a0f6", + "theme.bar.buttons.network.background": "#24273a", + "theme.bar.buttons.volume.icon": "#24273a", + "theme.bar.buttons.volume.text": "#ee99a0", + "theme.bar.buttons.volume.background": "#24273a", + "theme.bar.buttons.windowtitle.icon": "#24273a", + "theme.bar.buttons.windowtitle.text": "#f5bde6", + "theme.bar.buttons.windowtitle.background": "#24273a", + "theme.bar.buttons.workspaces.active": "#f5bde6", + "theme.bar.buttons.workspaces.occupied": "#f0c6c6", + "theme.bar.buttons.workspaces.available": "#91d7e3", + "theme.bar.buttons.workspaces.hover": "#494d64", + "theme.bar.buttons.workspaces.background": "#24273a", + "theme.bar.buttons.dashboard.icon": "#24273a", + "theme.bar.buttons.dashboard.background": "#eed49f", + "theme.osd.label": "#b7bdf8", + "theme.osd.icon": "#181926", + "theme.osd.bar_overflow_color": "#ed8796", + "theme.osd.bar_empty_color": "#363a4f", + "theme.osd.bar_color": "#b7bdf8", + "theme.osd.icon_container": "#b7bdf8", + "theme.osd.bar_container": "#181926", + "theme.notification.close_button.label": "#181926", + "theme.notification.close_button.background": "#ed8796", + "theme.notification.labelicon": "#b7bdf8", + "theme.notification.text": "#cad3f5", + "theme.notification.time": "#8087a2", + "theme.notification.border": "#363a4f", + "theme.notification.label": "#b7bdf8", + "theme.notification.actions.text": "#181926", + "theme.notification.actions.background": "#b7bdf8", + "theme.notification.background": "#181926", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.menus.menu.media.card.color": "#1e2030", + "theme.bar.menus.check_radio_button.background": "#181826", + "theme.bar.menus.check_radio_button.active": "#b7bcf8", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#ee999f", + "theme.bar.buttons.network.icon_background": "#c5a0f6", + "theme.bar.buttons.bluetooth.icon_background": "#91d7e3", + "theme.bar.buttons.windowtitle.icon_background": "#f5bde6", + "theme.bar.buttons.media.icon_background": "#b7bcf8", + "theme.bar.buttons.notifications.icon_background": "#b7bcf8", + "theme.bar.buttons.battery.icon_background": "#eed49f", + "theme.bar.buttons.clock.icon_background": "#f5bde6", + "theme.bar.menus.menu.notifications.pager.button": "#b7bdf8", + "theme.bar.menus.menu.notifications.scrollbar.color": "#b7bdf8", + "theme.bar.menus.menu.notifications.pager.label": "#939ab7", + "theme.bar.menus.menu.notifications.pager.background": "#181926", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.storage.icon_background": "#ed8796", + "theme.bar.menus.popover.border": "#181926", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#91d7e3", + "theme.bar.menus.menu.power.buttons.restart.text": "#f5a97f", + "theme.bar.buttons.modules.updates.background": "#24273a", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.netstat.background": "#24273a", + "theme.bar.buttons.modules.weather.icon": "#24273a", + "theme.bar.buttons.modules.netstat.text": "#a6da95", + "theme.bar.buttons.modules.storage.background": "#24273a", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.buttons.modules.storage.text": "#ed8796", + "theme.bar.buttons.modules.cpu.background": "#24273a", + "theme.bar.menus.menu.power.border.color": "#363a4f", + "theme.bar.buttons.modules.power.icon_background": "#ed8796", + "theme.bar.menus.menu.power.buttons.logout.icon": "#181926", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#f5a97f", + "theme.bar.menus.menu.power.buttons.restart.icon": "#181926", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.kbLayout.icon_background": "#91d7e3", + "theme.bar.buttons.modules.weather.text": "#b7bdf8", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#181926", + "theme.bar.menus.menu.power.buttons.sleep.text": "#91d7e3", + "theme.bar.buttons.modules.weather.icon_background": "#b7bdf8", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1e2030", + "theme.bar.menus.menu.power.buttons.logout.background": "#1e2030", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.ram.icon_background": "#eed49f", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#ed8796", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#ed8796", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1e2030", + "theme.bar.buttons.modules.ram.text": "#eed49f", + "theme.bar.menus.menu.power.buttons.logout.text": "#a6da95", + "theme.bar.buttons.modules.updates.icon_background": "#c6a0f6", + "theme.bar.buttons.modules.kbLayout.background": "#24273a", + "theme.bar.buttons.modules.power.background": "#24273a", + "theme.bar.buttons.modules.weather.background": "#24273a", + "theme.bar.menus.menu.power.background.color": "#181926", + "theme.bar.buttons.modules.ram.background": "#24273a", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon_background": "#ed8796", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a6da95", + "theme.bar.buttons.modules.updates.text": "#c6a0f6", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#181926", + "theme.bar.menus.menu.power.buttons.restart.background": "#1e2030", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.cpu.text": "#ed8796", + "theme.bar.buttons.modules.netstat.icon_background": "#a6da95", + "theme.bar.buttons.modules.kbLayout.text": "#91d7e3", + "theme.bar.buttons.modules.power.border": "#ed8796", + "theme.bar.buttons.modules.weather.border": "#b7bdf8", + "theme.bar.buttons.modules.updates.border": "#c6a0f6", + "theme.bar.buttons.modules.kbLayout.border": "#91d7e3", + "theme.bar.buttons.modules.netstat.border": "#a6da95", + "theme.bar.buttons.modules.storage.border": "#ed8796", + "theme.bar.buttons.modules.cpu.border": "#ed8796", + "theme.bar.buttons.modules.ram.border": "#eed49f", + "theme.bar.buttons.notifications.border": "#b7bdf8", + "theme.bar.buttons.clock.border": "#f5bde6", + "theme.bar.buttons.battery.border": "#eed49f", + "theme.bar.buttons.systray.border": "#494d64", + "theme.bar.buttons.bluetooth.border": "#91d7e3", + "theme.bar.buttons.network.border": "#c6a0f6", + "theme.bar.buttons.volume.border": "#ee99a0", + "theme.bar.buttons.media.border": "#b7bdf8", + "theme.bar.buttons.windowtitle.border": "#f5bde6", + "theme.bar.buttons.workspaces.border": "#181926", + "theme.bar.buttons.dashboard.border": "#eed49f", + "theme.bar.buttons.modules.submap.background": "#24273a", + "theme.bar.buttons.modules.submap.text": "#8bd5ca", + "theme.bar.buttons.modules.submap.border": "#8bd5ca", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.icon_background": "#8bd5ca" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/catppuccin_mocha.json b/ags/HyprPanel/themes/catppuccin_mocha.json new file mode 100644 index 0000000..3290501 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_mocha.json @@ -0,0 +1,342 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#b4befe", + "theme.bar.menus.menu.notifications.pager.label": "#9399b2", + "theme.bar.menus.menu.notifications.pager.button": "#b4befe", + "theme.bar.menus.menu.notifications.pager.background": "#11111b", + "theme.bar.menus.menu.notifications.switch.puck": "#454759", + "theme.bar.menus.menu.notifications.switch.disabled": "#313245", + "theme.bar.menus.menu.notifications.switch.enabled": "#b4befe", + "theme.bar.menus.menu.notifications.clear": "#f38ba8", + "theme.bar.menus.menu.notifications.switch_divider": "#45475a", + "theme.bar.menus.menu.notifications.border": "#313244", + "theme.bar.menus.menu.notifications.card": "#1e1e2e", + "theme.bar.menus.menu.notifications.background": "#11111b", + "theme.bar.menus.menu.notifications.no_notifications_label": "#313244", + "theme.bar.menus.menu.notifications.label": "#b4befe", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#181824", + "theme.bar.menus.menu.power.buttons.sleep.text": "#89dceb", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#89dceb", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1e1e2e", + "theme.bar.menus.menu.power.buttons.logout.icon": "#181824", + "theme.bar.menus.menu.power.buttons.logout.text": "#a6e3a1", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a6e3a1", + "theme.bar.menus.menu.power.buttons.logout.background": "#1e1e2e", + "theme.bar.menus.menu.power.buttons.restart.icon": "#181824", + "theme.bar.menus.menu.power.buttons.restart.text": "#fab387", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#fab387", + "theme.bar.menus.menu.power.buttons.restart.background": "#1e1e2e", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#181824", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#f38ba8", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#f38ba7", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1e1e2e", + "theme.bar.menus.menu.power.border.color": "#313244", + "theme.bar.menus.menu.power.background.color": "#11111b", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f5c2e7", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f5c2e8", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f5c2e7", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a6e3a1", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a6e3a2", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a6e3a1", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f9e2af", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f9e2ae", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f9e2af", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#eba0ac", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#eba0ad", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#eba0ac", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#45475a", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#b4befe", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#cba6f7", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#94e2d5", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#eba0ac", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f9e2af", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f5c2e7", + "theme.bar.menus.menu.dashboard.controls.input.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f5c2e7", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#eba0ac", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f9e2af", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#89dceb", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#cba6f7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#585b70", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a6e3a1", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#181824", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#b4befe", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#11111a", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#f38ba8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a6e3a1", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#cdd6f4", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#b4befe", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#313244", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#11111b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1e1e2e", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#89dceb", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a6e3a1", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#fab387", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#f38ba8", + "theme.bar.menus.menu.dashboard.profile.name": "#f5c2e7", + "theme.bar.menus.menu.dashboard.border.color": "#313244", + "theme.bar.menus.menu.dashboard.background.color": "#11111b", + "theme.bar.menus.menu.dashboard.card.color": "#1e1e2e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#89dceb", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#89b4fa", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#b4befe", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#fab387", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#f38ba8", + "theme.bar.menus.menu.clock.weather.stats": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.status": "#94e2d5", + "theme.bar.menus.menu.clock.weather.temperature": "#cdd6f4", + "theme.bar.menus.menu.clock.weather.icon": "#f5c2e7", + "theme.bar.menus.menu.clock.calendar.contextdays": "#585b70", + "theme.bar.menus.menu.clock.calendar.days": "#cdd6f4", + "theme.bar.menus.menu.clock.calendar.currentday": "#f5c2e7", + "theme.bar.menus.menu.clock.calendar.paginator": "#f5c2e6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f5c2e7", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#94e2d5", + "theme.bar.menus.menu.clock.time.timeperiod": "#94e2d5", + "theme.bar.menus.menu.clock.time.time": "#f5c2e7", + "theme.bar.menus.menu.clock.text": "#cdd6f4", + "theme.bar.menus.menu.clock.border.color": "#313244", + "theme.bar.menus.menu.clock.background.color": "#11111b", + "theme.bar.menus.menu.clock.card.color": "#1e1e2e", + "theme.bar.menus.menu.battery.slider.puck": "#6c7086", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.battery.slider.background": "#585b71", + "theme.bar.menus.menu.battery.slider.primary": "#f9e2af", + "theme.bar.menus.menu.battery.icons.active": "#f9e2af", + "theme.bar.menus.menu.battery.icons.passive": "#9399b2", + "theme.bar.menus.menu.battery.listitems.active": "#f9e2af", + "theme.bar.menus.menu.battery.listitems.passive": "#cdd6f3", + "theme.bar.menus.menu.battery.text": "#cdd6f4", + "theme.bar.menus.menu.battery.label.color": "#f9e2af", + "theme.bar.menus.menu.battery.border.color": "#313244", + "theme.bar.menus.menu.battery.background.color": "#11111b", + "theme.bar.menus.menu.battery.card.color": "#1e1e2e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1e1e2e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#cdd6f4", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#11111b", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#89dceb", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#cdd6f4", + "theme.bar.menus.menu.bluetooth.icons.active": "#89dceb", + "theme.bar.menus.menu.bluetooth.icons.passive": "#9399b2", + "theme.bar.menus.menu.bluetooth.listitems.active": "#89dcea", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#cdd6f4", + "theme.bar.menus.menu.bluetooth.switch.puck": "#454759", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#313245", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#89dceb", + "theme.bar.menus.menu.bluetooth.switch_divider": "#45475a", + "theme.bar.menus.menu.bluetooth.status": "#6c7086", + "theme.bar.menus.menu.bluetooth.text": "#cdd6f4", + "theme.bar.menus.menu.bluetooth.label.color": "#89dceb", + "theme.bar.menus.menu.bluetooth.border.color": "#313244", + "theme.bar.menus.menu.bluetooth.background.color": "#11111b", + "theme.bar.menus.menu.bluetooth.card.color": "#1e1e2e", + "theme.bar.menus.menu.network.iconbuttons.active": "#cba6f7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#cdd6f4", + "theme.bar.menus.menu.network.icons.active": "#cba6f7", + "theme.bar.menus.menu.network.icons.passive": "#9399b2", + "theme.bar.menus.menu.network.listitems.active": "#cba6f6", + "theme.bar.menus.menu.network.listitems.passive": "#cdd6f4", + "theme.bar.menus.menu.network.status.color": "#6c7086", + "theme.bar.menus.menu.network.text": "#cdd6f4", + "theme.bar.menus.menu.network.label.color": "#cba6f7", + "theme.bar.menus.menu.network.border.color": "#313244", + "theme.bar.menus.menu.network.background.color": "#11111b", + "theme.bar.menus.menu.network.card.color": "#1e1e2e", + "theme.bar.menus.menu.volume.input_slider.puck": "#585b70", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.volume.input_slider.background": "#585b71", + "theme.bar.menus.menu.volume.input_slider.primary": "#eba0ac", + "theme.bar.menus.menu.volume.audio_slider.puck": "#585b70", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.volume.audio_slider.background": "#585b71", + "theme.bar.menus.menu.volume.audio_slider.primary": "#eba0ac", + "theme.bar.menus.menu.volume.icons.active": "#eba0ac", + "theme.bar.menus.menu.volume.icons.passive": "#9399b2", + "theme.bar.menus.menu.volume.iconbutton.active": "#eba0ac", + "theme.bar.menus.menu.volume.iconbutton.passive": "#cdd6f4", + "theme.bar.menus.menu.volume.listitems.active": "#eba0ab", + "theme.bar.menus.menu.volume.listitems.passive": "#cdd6f4", + "theme.bar.menus.menu.volume.text": "#cdd6f4", + "theme.bar.menus.menu.volume.label.color": "#eba0ac", + "theme.bar.menus.menu.volume.border.color": "#313244", + "theme.bar.menus.menu.volume.background.color": "#11111b", + "theme.bar.menus.menu.volume.card.color": "#1e1e2e", + "theme.bar.menus.menu.media.slider.puck": "#6c7086", + "theme.bar.menus.menu.media.slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.media.slider.background": "#585b71", + "theme.bar.menus.menu.media.slider.primary": "#f5c2e7", + "theme.bar.menus.menu.media.buttons.text": "#11111b", + "theme.bar.menus.menu.media.buttons.background": "#b4beff", + "theme.bar.menus.menu.media.buttons.enabled": "#94e2d4", + "theme.bar.menus.menu.media.buttons.inactive": "#585b70", + "theme.bar.menus.menu.media.border.color": "#313244", + "theme.bar.menus.menu.media.card.color": "#1e1e2e", + "theme.bar.menus.menu.media.background.color": "#11111b", + "theme.bar.menus.menu.media.album": "#f5c2e8", + "theme.bar.menus.menu.media.artist": "#94e2d6", + "theme.bar.menus.menu.media.song": "#b4beff", + "theme.bar.menus.tooltip.text": "#cdd6f4", + "theme.bar.menus.tooltip.background": "#11111b", + "theme.bar.menus.dropdownmenu.divider": "#1e1e2e", + "theme.bar.menus.dropdownmenu.text": "#cdd6f4", + "theme.bar.menus.dropdownmenu.background": "#11111b", + "theme.bar.menus.slider.puck": "#6c7086", + "theme.bar.menus.slider.backgroundhover": "#45475a", + "theme.bar.menus.slider.background": "#585b71", + "theme.bar.menus.slider.primary": "#b4befe", + "theme.bar.menus.progressbar.background": "#45475a", + "theme.bar.menus.progressbar.foreground": "#b4befe", + "theme.bar.menus.iconbuttons.active": "#b4beff", + "theme.bar.menus.iconbuttons.passive": "#cdd6f3", + "theme.bar.menus.buttons.text": "#181824", + "theme.bar.menus.buttons.disabled": "#585b71", + "theme.bar.menus.buttons.active": "#f5c2e6", + "theme.bar.menus.buttons.default": "#b4befe", + "theme.bar.menus.check_radio_button.active": "#b4beff", + "theme.bar.menus.check_radio_button.background": "#45475a", + "theme.bar.menus.switch.puck": "#454759", + "theme.bar.menus.switch.disabled": "#313245", + "theme.bar.menus.switch.enabled": "#b4befe", + "theme.bar.menus.icons.active": "#b4befe", + "theme.bar.menus.icons.passive": "#585b70", + "theme.bar.menus.listitems.active": "#b4befd", + "theme.bar.menus.listitems.passive": "#cdd6f4", + "theme.bar.menus.popover.border": "#181824", + "theme.bar.menus.popover.background": "#181824", + "theme.bar.menus.popover.text": "#b4befe", + "theme.bar.menus.label": "#b4befe", + "theme.bar.menus.feinttext": "#313244", + "theme.bar.menus.dimtext": "#585b70", + "theme.bar.menus.text": "#cdd6f4", + "theme.bar.menus.border.color": "#313244", + "theme.bar.menus.cards": "#1e1e2e", + "theme.bar.menus.background": "#11111b", + "theme.bar.buttons.modules.power.icon_background": "#f38ba8", + "theme.bar.buttons.modules.power.icon": "#f38ba8", + "theme.bar.buttons.modules.power.background": "#242438", + "theme.bar.buttons.modules.power.border": "#f38ba8", + "theme.bar.buttons.modules.weather.icon_background": "#b4befe", + "theme.bar.buttons.modules.weather.icon": "#b4befe", + "theme.bar.buttons.modules.weather.text": "#b4befe", + "theme.bar.buttons.modules.weather.background": "#242438", + "theme.bar.buttons.modules.weather.border": "#b4befe", + "theme.bar.buttons.modules.updates.icon_background": "#cba6f7", + "theme.bar.buttons.modules.updates.icon": "#cba6f7", + "theme.bar.buttons.modules.updates.text": "#cba6f7", + "theme.bar.buttons.modules.updates.background": "#242438", + "theme.bar.buttons.modules.updates.border": "#cba6f7", + "theme.bar.buttons.modules.kbLayout.icon_background": "#89dceb", + "theme.bar.buttons.modules.kbLayout.icon": "#89dceb", + "theme.bar.buttons.modules.kbLayout.text": "#89dceb", + "theme.bar.buttons.modules.kbLayout.background": "#242438", + "theme.bar.buttons.modules.kbLayout.border": "#89dceb", + "theme.bar.buttons.modules.netstat.icon_background": "#a6e3a1", + "theme.bar.buttons.modules.netstat.icon": "#a6e3a1", + "theme.bar.buttons.modules.netstat.text": "#a6e3a1", + "theme.bar.buttons.modules.netstat.background": "#242438", + "theme.bar.buttons.modules.netstat.border": "#a6e3a1", + "theme.bar.buttons.modules.storage.icon_background": "#f5c2e7", + "theme.bar.buttons.modules.storage.icon": "#f5c2e7", + "theme.bar.buttons.modules.storage.text": "#f5c2e7", + "theme.bar.buttons.modules.storage.background": "#242438", + "theme.bar.buttons.modules.storage.border": "#f5c2e7", + "theme.bar.buttons.modules.cpu.icon_background": "#f38ba8", + "theme.bar.buttons.modules.cpu.icon": "#f38ba8", + "theme.bar.buttons.modules.cpu.text": "#f38ba8", + "theme.bar.buttons.modules.cpu.background": "#242438", + "theme.bar.buttons.modules.cpu.border": "#f38ba8", + "theme.bar.buttons.modules.ram.icon_background": "#f9e2af", + "theme.bar.buttons.modules.ram.icon": "#f9e2af", + "theme.bar.buttons.modules.ram.text": "#f9e2af", + "theme.bar.buttons.modules.ram.background": "#242438", + "theme.bar.buttons.modules.ram.border": "#f9e2af", + "theme.bar.buttons.notifications.total": "#b4befe", + "theme.bar.buttons.notifications.icon_background": "#b4befe", + "theme.bar.buttons.notifications.icon": "#b4befe", + "theme.bar.buttons.notifications.background": "#242438", + "theme.bar.buttons.notifications.border": "#b4befe", + "theme.bar.buttons.clock.icon_background": "#f5c2e7", + "theme.bar.buttons.clock.icon": "#f5c2e7", + "theme.bar.buttons.clock.text": "#f5c2e7", + "theme.bar.buttons.clock.background": "#242438", + "theme.bar.buttons.clock.border": "#f5c2e7", + "theme.bar.buttons.battery.icon_background": "#f9e2af", + "theme.bar.buttons.battery.icon": "#f9e2af", + "theme.bar.buttons.battery.text": "#f9e2af", + "theme.bar.buttons.battery.background": "#242438", + "theme.bar.buttons.battery.border": "#f9e2af", + "theme.bar.buttons.systray.background": "#242438", + "theme.bar.buttons.systray.border": "#b4befe", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.buttons.bluetooth.icon": "#89dceb", + "theme.bar.buttons.bluetooth.text": "#89dceb", + "theme.bar.buttons.bluetooth.background": "#242438", + "theme.bar.buttons.bluetooth.border": "#89dceb", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.network.icon": "#cba6f7", + "theme.bar.buttons.network.text": "#cba6f7", + "theme.bar.buttons.network.background": "#242438", + "theme.bar.buttons.network.border": "#cba6f7", + "theme.bar.buttons.volume.icon_background": "#eba0ac", + "theme.bar.buttons.volume.icon": "#eba0ac", + "theme.bar.buttons.volume.text": "#eba0ac", + "theme.bar.buttons.volume.background": "#242438", + "theme.bar.buttons.volume.border": "#eba0ac", + "theme.bar.buttons.media.icon_background": "#b4befe", + "theme.bar.buttons.media.icon": "#b4befe", + "theme.bar.buttons.media.text": "#b4befe", + "theme.bar.buttons.media.background": "#242438", + "theme.bar.buttons.media.border": "#b4befe", + "theme.bar.buttons.windowtitle.icon_background": "#f5c2e7", + "theme.bar.buttons.windowtitle.icon": "#f5c2e7", + "theme.bar.buttons.windowtitle.text": "#f5c2e7", + "theme.bar.buttons.windowtitle.border": "#f5c2e7", + "theme.bar.buttons.windowtitle.background": "#242438", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.hover": "#f5c2e7", + "theme.bar.buttons.workspaces.active": "#f5c2e7", + "theme.bar.buttons.workspaces.occupied": "#f2cdcd", + "theme.bar.buttons.workspaces.available": "#89dceb", + "theme.bar.buttons.workspaces.border": "#f5c2e7", + "theme.bar.buttons.workspaces.background": "#242438", + "theme.bar.buttons.dashboard.icon": "#f9e2af", + "theme.bar.buttons.dashboard.border": "#f9e2af", + "theme.bar.buttons.dashboard.background": "#242438", + "theme.bar.buttons.icon": "#b4befe", + "theme.bar.buttons.text": "#b4befe", + "theme.bar.buttons.hover": "#45475a", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.background": "#242438", + "theme.bar.buttons.style": "default", + "theme.bar.background": "#11111b", + "theme.osd.label": "#b4beff", + "theme.osd.icon": "#11111b", + "theme.osd.bar_overflow_color": "#f38ba7", + "theme.osd.bar_empty_color": "#313244", + "theme.osd.bar_color": "#b4beff", + "theme.osd.icon_container": "#b4beff", + "theme.osd.bar_container": "#11111b", + "theme.notification.close_button.label": "#11111b", + "theme.notification.close_button.background": "#f38ba7", + "theme.notification.labelicon": "#b4befe", + "theme.notification.text": "#cdd6f4", + "theme.notification.time": "#7f849b", + "theme.notification.border": "#313243", + "theme.notification.label": "#b4befe", + "theme.notification.actions.text": "#181825", + "theme.notification.actions.background": "#b4befd", + "theme.notification.background": "#181826", + "theme.bar.buttons.modules.submap.icon": "#94e2d5", + "theme.bar.buttons.modules.submap.background": "#242438", + "theme.bar.buttons.modules.submap.icon_background": "#242438", + "theme.bar.buttons.modules.submap.text": "#94e2d5", + "theme.bar.buttons.modules.submap.border": "#94e2d5" +} + diff --git a/ags/HyprPanel/themes/catppuccin_mocha_split.json b/ags/HyprPanel/themes/catppuccin_mocha_split.json new file mode 100644 index 0000000..3211324 --- /dev/null +++ b/ags/HyprPanel/themes/catppuccin_mocha_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#11111b", + "theme.bar.background": "#11111b", + "theme.bar.buttons.media.icon": "#1e1e2e", + "theme.bar.buttons.media.text": "#b4befe", + "theme.bar.buttons.icon": "#b4befe", + "theme.bar.buttons.text": "#b4befe", + "theme.bar.buttons.hover": "#45475a", + "theme.bar.buttons.background": "#242438", + "theme.bar.menus.text": "#cdd6f4", + "theme.bar.menus.border.color": "#313244", + "theme.bar.buttons.media.background": "#242438", + "theme.bar.menus.menu.volume.text": "#cdd6f4", + "theme.bar.menus.menu.volume.card.color": "#1e1e2e", + "theme.bar.menus.menu.volume.label.color": "#eba0ac", + "theme.bar.menus.popover.text": "#b4befe", + "theme.bar.menus.popover.background": "#181824", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#f38ba8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#f38ba8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a6e3a1", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#11111a", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#cdd6f4", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#b4befe", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#313244", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#11111b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1e1e2e", + "theme.bar.menus.menu.notifications.switch.puck": "#454759", + "theme.bar.menus.menu.notifications.switch.disabled": "#313245", + "theme.bar.menus.menu.notifications.switch.enabled": "#b4befe", + "theme.bar.menus.menu.notifications.clear": "#f38ba8", + "theme.bar.menus.menu.notifications.switch_divider": "#45475a", + "theme.bar.menus.menu.notifications.border": "#313244", + "theme.bar.menus.menu.notifications.card": "#1e1e2e", + "theme.bar.menus.menu.notifications.background": "#11111b", + "theme.bar.menus.menu.notifications.no_notifications_label": "#313244", + "theme.bar.menus.menu.notifications.label": "#b4befe", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f5c2e7", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f5c2e8", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f5c2e7", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a6e3a1", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a6e3a2", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a6e3a1", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f9e2af", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f9e2ae", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f9e2af", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#eba0ac", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#eba0ad", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#eba0ac", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#45475a", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#b4befe", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#cba6f7", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#94e2d5", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#eba0ac", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f9e2af", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f5c2e7", + "theme.bar.menus.menu.dashboard.controls.input.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f5c2e7", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#eba0ac", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f9e2af", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#89dceb", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#181824", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#cba6f7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#585b70", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a6e3a1", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#181824", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#b4befe", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#89dceb", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a6e3a1", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#fab387", + "theme.bar.menus.menu.dashboard.profile.name": "#f5c2e7", + "theme.bar.menus.menu.dashboard.border.color": "#313244", + "theme.bar.menus.menu.dashboard.background.color": "#11111b", + "theme.bar.menus.menu.dashboard.card.color": "#1e1e2e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#89dceb", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#89b4fa", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#b4befe", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#fab387", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#f38ba8", + "theme.bar.menus.menu.clock.weather.stats": "#f5c2e7", + "theme.bar.menus.menu.clock.weather.status": "#94e2d5", + "theme.bar.menus.menu.clock.weather.temperature": "#cdd6f4", + "theme.bar.menus.menu.clock.weather.icon": "#f5c2e7", + "theme.bar.menus.menu.clock.calendar.contextdays": "#585b70", + "theme.bar.menus.menu.clock.calendar.days": "#cdd6f4", + "theme.bar.menus.menu.clock.calendar.currentday": "#f5c2e7", + "theme.bar.menus.menu.clock.calendar.paginator": "#f5c2e6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f5c2e7", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#94e2d5", + "theme.bar.menus.menu.clock.time.timeperiod": "#94e2d5", + "theme.bar.menus.menu.clock.time.time": "#f5c2e7", + "theme.bar.menus.menu.clock.text": "#cdd6f4", + "theme.bar.menus.menu.clock.border.color": "#313244", + "theme.bar.menus.menu.clock.background.color": "#11111b", + "theme.bar.menus.menu.clock.card.color": "#1e1e2e", + "theme.bar.menus.menu.battery.slider.puck": "#6c7086", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.battery.slider.background": "#585b71", + "theme.bar.menus.menu.battery.slider.primary": "#f9e2af", + "theme.bar.menus.menu.battery.icons.active": "#f9e2af", + "theme.bar.menus.menu.battery.icons.passive": "#9399b2", + "theme.bar.menus.menu.battery.listitems.active": "#f9e2af", + "theme.bar.menus.menu.battery.listitems.passive": "#cdd6f3", + "theme.bar.menus.menu.battery.text": "#cdd6f4", + "theme.bar.menus.menu.battery.label.color": "#f9e2af", + "theme.bar.menus.menu.battery.border.color": "#313244", + "theme.bar.menus.menu.battery.background.color": "#11111b", + "theme.bar.menus.menu.battery.card.color": "#1e1e2e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1e1e2e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#cdd6f4", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#11111b", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#89dceb", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#cdd6f4", + "theme.bar.menus.menu.bluetooth.icons.active": "#89dceb", + "theme.bar.menus.menu.bluetooth.icons.passive": "#9399b2", + "theme.bar.menus.menu.bluetooth.listitems.active": "#89dcea", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#cdd6f4", + "theme.bar.menus.menu.bluetooth.switch.puck": "#454759", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#313245", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#89dceb", + "theme.bar.menus.menu.bluetooth.switch_divider": "#45475a", + "theme.bar.menus.menu.bluetooth.status": "#6c7086", + "theme.bar.menus.menu.bluetooth.text": "#cdd6f4", + "theme.bar.menus.menu.bluetooth.label.color": "#89dceb", + "theme.bar.menus.menu.bluetooth.border.color": "#313244", + "theme.bar.menus.menu.bluetooth.background.color": "#11111b", + "theme.bar.menus.menu.bluetooth.card.color": "#1e1e2e", + "theme.bar.menus.menu.network.iconbuttons.active": "#cba6f7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#cdd6f4", + "theme.bar.menus.menu.network.icons.active": "#cba6f7", + "theme.bar.menus.menu.network.icons.passive": "#9399b2", + "theme.bar.menus.menu.network.listitems.active": "#cba6f6", + "theme.bar.menus.menu.network.listitems.passive": "#cdd6f4", + "theme.bar.menus.menu.network.status.color": "#6c7086", + "theme.bar.menus.menu.network.text": "#cdd6f4", + "theme.bar.menus.menu.network.label.color": "#cba6f7", + "theme.bar.menus.menu.network.border.color": "#313244", + "theme.bar.menus.menu.network.background.color": "#11111b", + "theme.bar.menus.menu.network.card.color": "#1e1e2e", + "theme.bar.menus.menu.volume.input_slider.puck": "#585b70", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.volume.input_slider.background": "#585b71", + "theme.bar.menus.menu.volume.input_slider.primary": "#eba0ac", + "theme.bar.menus.menu.volume.audio_slider.puck": "#585b70", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.volume.audio_slider.background": "#585b71", + "theme.bar.menus.menu.volume.audio_slider.primary": "#eba0ac", + "theme.bar.menus.menu.volume.icons.active": "#eba0ac", + "theme.bar.menus.menu.volume.icons.passive": "#9399b2", + "theme.bar.menus.menu.volume.iconbutton.active": "#eba0ac", + "theme.bar.menus.menu.volume.iconbutton.passive": "#cdd6f4", + "theme.bar.menus.menu.volume.listitems.active": "#eba0ab", + "theme.bar.menus.menu.volume.listitems.passive": "#cdd6f4", + "theme.bar.menus.menu.volume.border.color": "#313244", + "theme.bar.menus.menu.volume.background.color": "#11111b", + "theme.bar.menus.menu.media.slider.puck": "#6c7086", + "theme.bar.menus.menu.media.slider.backgroundhover": "#45475a", + "theme.bar.menus.menu.media.slider.background": "#585b71", + "theme.bar.menus.menu.media.slider.primary": "#f5c2e7", + "theme.bar.menus.menu.media.buttons.text": "#11111b", + "theme.bar.menus.menu.media.buttons.background": "#b4beff", + "theme.bar.menus.menu.media.buttons.enabled": "#94e2d4", + "theme.bar.menus.menu.media.buttons.inactive": "#585b70", + "theme.bar.menus.menu.media.border.color": "#313244", + "theme.bar.menus.menu.media.background.color": "#11111b", + "theme.bar.menus.menu.media.album": "#f5c2e8", + "theme.bar.menus.menu.media.artist": "#94e2d6", + "theme.bar.menus.menu.media.song": "#b4beff", + "theme.bar.menus.tooltip.text": "#cdd6f4", + "theme.bar.menus.tooltip.background": "#11111b", + "theme.bar.menus.dropdownmenu.divider": "#1e1e2e", + "theme.bar.menus.dropdownmenu.text": "#cdd6f4", + "theme.bar.menus.dropdownmenu.background": "#11111b", + "theme.bar.menus.slider.puck": "#6c7086", + "theme.bar.menus.slider.backgroundhover": "#45475a", + "theme.bar.menus.slider.background": "#585b71", + "theme.bar.menus.slider.primary": "#b4befe", + "theme.bar.menus.progressbar.background": "#45475a", + "theme.bar.menus.progressbar.foreground": "#b4befe", + "theme.bar.menus.iconbuttons.active": "#b4beff", + "theme.bar.menus.iconbuttons.passive": "#cdd6f3", + "theme.bar.menus.buttons.text": "#181824", + "theme.bar.menus.buttons.disabled": "#585b71", + "theme.bar.menus.buttons.active": "#f5c2e6", + "theme.bar.menus.buttons.default": "#b4befe", + "theme.bar.menus.switch.puck": "#454759", + "theme.bar.menus.switch.disabled": "#313245", + "theme.bar.menus.switch.enabled": "#b4befe", + "theme.bar.menus.icons.active": "#b4befe", + "theme.bar.menus.icons.passive": "#585b70", + "theme.bar.menus.listitems.active": "#b4befd", + "theme.bar.menus.listitems.passive": "#cdd6f4", + "theme.bar.menus.label": "#b4befe", + "theme.bar.menus.feinttext": "#313244", + "theme.bar.menus.dimtext": "#585b70", + "theme.bar.menus.cards": "#1e1e2e", + "theme.bar.buttons.notifications.total": "#b4befe", + "theme.bar.buttons.notifications.icon": "#1e1e2e", + "theme.bar.buttons.notifications.background": "#242438", + "theme.bar.buttons.clock.icon": "#232338", + "theme.bar.buttons.clock.text": "#f5c2e7", + "theme.bar.buttons.clock.background": "#242438", + "theme.bar.buttons.battery.icon": "#242438", + "theme.bar.buttons.battery.text": "#f9e2af", + "theme.bar.buttons.battery.background": "#242438", + "theme.bar.buttons.systray.background": "#242438", + "theme.bar.buttons.bluetooth.icon": "#1e1e2e", + "theme.bar.buttons.bluetooth.text": "#89dceb", + "theme.bar.buttons.bluetooth.background": "#242438", + "theme.bar.buttons.network.icon": "#242438", + "theme.bar.buttons.network.text": "#cba6f7", + "theme.bar.buttons.network.background": "#242438", + "theme.bar.buttons.volume.icon": "#242438", + "theme.bar.buttons.volume.text": "#eba0ac", + "theme.bar.buttons.volume.background": "#242438", + "theme.bar.buttons.windowtitle.icon": "#1e1e2e", + "theme.bar.buttons.windowtitle.text": "#f5c2e7", + "theme.bar.buttons.windowtitle.background": "#242438", + "theme.bar.buttons.workspaces.active": "#f5c2e7", + "theme.bar.buttons.workspaces.occupied": "#f2cdcd", + "theme.bar.buttons.workspaces.available": "#89dceb", + "theme.bar.buttons.workspaces.hover": "#f5c2e7", + "theme.bar.buttons.workspaces.background": "#242438", + "theme.bar.buttons.dashboard.icon": "#1e1e2e", + "theme.bar.buttons.dashboard.background": "#f9e2af", + "theme.osd.label": "#b4beff", + "theme.osd.icon": "#11111b", + "theme.osd.bar_overflow_color": "#f38ba7", + "theme.osd.bar_empty_color": "#313244", + "theme.osd.bar_color": "#b4beff", + "theme.osd.icon_container": "#b4beff", + "theme.osd.bar_container": "#11111b", + "theme.notification.close_button.label": "#11111b", + "theme.notification.close_button.background": "#f38ba7", + "theme.notification.labelicon": "#b4befe", + "theme.notification.text": "#cdd6f4", + "theme.notification.time": "#7f849b", + "theme.notification.border": "#313243", + "theme.notification.label": "#b4befe", + "theme.notification.actions.text": "#181825", + "theme.notification.actions.background": "#b4befd", + "theme.notification.background": "#181826", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#f5c2e7", + "theme.bar.menus.menu.media.card.color": "#1e1e2e", + "theme.bar.menus.check_radio_button.background": "#45475a", + "theme.bar.menus.check_radio_button.active": "#b4beff", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#eba0ac", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.buttons.windowtitle.icon_background": "#f5c2e7", + "theme.bar.buttons.media.icon_background": "#b4befe", + "theme.bar.buttons.notifications.icon_background": "#b4befe", + "theme.bar.buttons.battery.icon_background": "#f9e2af", + "theme.bar.buttons.clock.icon_background": "#f5c2e7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#b4befe", + "theme.bar.menus.menu.notifications.pager.button": "#b4befe", + "theme.bar.menus.menu.notifications.pager.label": "#9399b2", + "theme.bar.menus.menu.notifications.pager.background": "#11111b", + "theme.bar.buttons.modules.ram.icon_background": "#f9e2af", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon_background": "#f38ba8", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.storage.icon_background": "#f5c2e7", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.netstat.icon_background": "#a6e3a1", + "theme.bar.buttons.modules.kbLayout.icon_background": "#89dceb", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.updates.icon_background": "#cba6f7", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.weather.icon_background": "#b4befe", + "theme.bar.buttons.modules.weather.text": "#b4befe", + "theme.bar.buttons.modules.weather.icon": "#242438", + "theme.bar.buttons.modules.power.icon_background": "#f38ba8", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.menus.menu.power.background.color": "#11111b", + "theme.bar.menus.menu.power.border.color": "#313244", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1e1e2e", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#f38ba7", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#f38ba8", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#181824", + "theme.bar.buttons.modules.netstat.background": "#242438", + "theme.bar.buttons.modules.cpu.background": "#242438", + "theme.bar.buttons.modules.cpu.text": "#f38ba8", + "theme.bar.buttons.modules.storage.text": "#f5c2e7", + "theme.bar.menus.popover.border": "#181824", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#89dceb", + "theme.bar.menus.menu.power.buttons.restart.text": "#fab387", + "theme.bar.buttons.modules.updates.background": "#242438", + "theme.bar.buttons.modules.netstat.text": "#a6e3a1", + "theme.bar.buttons.modules.storage.background": "#242438", + "theme.bar.menus.menu.power.buttons.logout.icon": "#181824", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#fab387", + "theme.bar.menus.menu.power.buttons.restart.icon": "#181824", + "theme.bar.menus.menu.power.buttons.sleep.text": "#89dceb", + "theme.bar.menus.menu.power.buttons.logout.background": "#1e1e2e", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1e1e2e", + "theme.bar.buttons.modules.ram.text": "#f9e2af", + "theme.bar.menus.menu.power.buttons.logout.text": "#a6e3a1", + "theme.bar.buttons.modules.kbLayout.background": "#242438", + "theme.bar.buttons.modules.power.background": "#242438", + "theme.bar.buttons.modules.weather.background": "#242438", + "theme.bar.buttons.modules.ram.background": "#242438", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a6e3a1", + "theme.bar.buttons.modules.updates.text": "#cba6f7", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#181824", + "theme.bar.menus.menu.power.buttons.restart.background": "#1e1e2e", + "theme.bar.buttons.modules.kbLayout.text": "#89dceb", + "theme.bar.buttons.windowtitle.border": "#f5c2e7", + "theme.bar.buttons.modules.power.border": "#f38ba8", + "theme.bar.buttons.modules.weather.border": "#b4befe", + "theme.bar.buttons.modules.updates.border": "#cba6f7", + "theme.bar.buttons.modules.kbLayout.border": "#89dceb", + "theme.bar.buttons.modules.netstat.border": "#a6e3a1", + "theme.bar.buttons.modules.storage.border": "#f5c2e7", + "theme.bar.buttons.modules.cpu.border": "#f38ba8", + "theme.bar.buttons.modules.ram.border": "#f9e2af", + "theme.bar.buttons.notifications.border": "#b4befe", + "theme.bar.buttons.clock.border": "#f5c2e7", + "theme.bar.buttons.battery.border": "#f9e2af", + "theme.bar.buttons.systray.border": "#b4befe", + "theme.bar.buttons.bluetooth.border": "#89dceb", + "theme.bar.buttons.network.border": "#cba6f7", + "theme.bar.buttons.volume.border": "#eba0ac", + "theme.bar.buttons.media.border": "#b4befe", + "theme.bar.buttons.workspaces.border": "#f5c2e7", + "theme.bar.buttons.dashboard.border": "#f9e2af", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.background": "#242438", + "theme.bar.buttons.modules.submap.icon_background": "#94e2d5", + "theme.bar.buttons.modules.submap.text": "#94e2d5", + "theme.bar.buttons.modules.submap.border": "#94e2d5" +} diff --git a/ags/HyprPanel/themes/cyberpunk.json b/ags/HyprPanel/themes/cyberpunk.json new file mode 100644 index 0000000..50a6a09 --- /dev/null +++ b/ags/HyprPanel/themes/cyberpunk.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#FFD700", + "theme.bar.menus.menu.notifications.pager.label": "#9399B2", + "theme.bar.menus.menu.notifications.pager.button": "#FFD700", + "theme.bar.menus.menu.notifications.pager.background": "#0A0A0A", + "theme.bar.menus.menu.notifications.switch.puck": "#333333", + "theme.bar.menus.menu.notifications.switch.disabled": "#2A2A2A", + "theme.bar.menus.menu.notifications.switch.enabled": "#FFD700", + "theme.bar.menus.menu.notifications.clear": "#FF4500", + "theme.bar.menus.menu.notifications.switch_divider": "#333333", + "theme.bar.menus.menu.notifications.border": "#2A2A2A", + "theme.bar.menus.menu.notifications.card": "#1A1A1A", + "theme.bar.menus.menu.notifications.background": "#0A0A0A", + "theme.bar.menus.menu.notifications.no_notifications_label": "#2A2A2A", + "theme.bar.menus.menu.notifications.label": "#FFD700", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.sleep.text": "#00FFFF", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#00FFFF", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.logout.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.logout.text": "#32CD32", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#32CD32", + "theme.bar.menus.menu.power.buttons.logout.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.restart.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.restart.text": "#FFD700", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#FFD700", + "theme.bar.menus.menu.power.buttons.restart.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#FF4500", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#ff4400", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1A1A1A", + "theme.bar.menus.menu.power.border.color": "#2A2A2A", + "theme.bar.menus.menu.power.background.color": "#0A0A0A", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#FF69B4", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#FF69B4", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#FF69B4", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#32CD32", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#32CD32", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#32CD32", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#FFD700", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#FFD700", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#FFD700", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#FF4500", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#FF4500", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#FF4500", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#333333", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#00FFFF", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#FFD700", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#32CD32", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#FF4500", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#FFD700", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#FF69B4", + "theme.bar.menus.menu.dashboard.controls.input.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.input.background": "#FF69B4", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#FF4500", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#FFD700", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#00FFFF", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#FF69B4", + "theme.bar.menus.menu.dashboard.controls.disabled": "#585858", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#32CD32", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#00FFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#FF4500", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#32CD32", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#FFFFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#00FFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#2A2A2A", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#0A0A0A", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1A1A1A", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#00FFFF", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#32CD32", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#FFD700", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#FF4500", + "theme.bar.menus.menu.dashboard.profile.name": "#FF69B4", + "theme.bar.menus.menu.dashboard.border.color": "#2A2A2A", + "theme.bar.menus.menu.dashboard.background.color": "#0A0A0A", + "theme.bar.menus.menu.dashboard.card.color": "#1A1A1A", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#FF69B4", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#FF69B4", + "theme.bar.menus.menu.clock.weather.hourly.time": "#FF69B4", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#00FFFF", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#00BFFF", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#00FFFF", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#FFD700", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#FFD700", + "theme.bar.menus.menu.clock.weather.stats": "#00FFFF", + "theme.bar.menus.menu.clock.weather.status": "#FF69B4", + "theme.bar.menus.menu.clock.weather.temperature": "#32CD32", + "theme.bar.menus.menu.clock.weather.icon": "#FFD700", + "theme.bar.menus.menu.clock.calendar.contextdays": "#585858", + "theme.bar.menus.menu.clock.calendar.days": "#FFD700", + "theme.bar.menus.menu.clock.calendar.currentday": "#00FFFF", + "theme.bar.menus.menu.clock.calendar.paginator": "#00FFFF", + "theme.bar.menus.menu.clock.calendar.weekdays": "#00FFFF", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#FF69B4", + "theme.bar.menus.menu.clock.time.timeperiod": "#32CD32", + "theme.bar.menus.menu.clock.time.time": "#FFD700", + "theme.bar.menus.menu.clock.text": "#00FFFF", + "theme.bar.menus.menu.clock.border.color": "#2A2A2A", + "theme.bar.menus.menu.clock.background.color": "#0A0A0A", + "theme.bar.menus.menu.clock.card.color": "#1A1A1A", + "theme.bar.menus.menu.battery.slider.puck": "#333333", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.battery.slider.background": "#2A2A2A", + "theme.bar.menus.menu.battery.slider.primary": "#FFD700", + "theme.bar.menus.menu.battery.icons.active": "#FFD700", + "theme.bar.menus.menu.battery.icons.passive": "#9399B2", + "theme.bar.menus.menu.battery.listitems.active": "#FFD700", + "theme.bar.menus.menu.battery.listitems.passive": "#00FFFF", + "theme.bar.menus.menu.battery.text": "#FFD700", + "theme.bar.menus.menu.battery.label.color": "#FFD700", + "theme.bar.menus.menu.battery.border.color": "#2A2A2A", + "theme.bar.menus.menu.battery.background.color": "#0A0A0A", + "theme.bar.menus.menu.battery.card.color": "#1A1A1A", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1A1A1A", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#FFD700", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#0A0A0A", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#00FFFF", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#FFD700", + "theme.bar.menus.menu.bluetooth.icons.active": "#00FFFF", + "theme.bar.menus.menu.bluetooth.icons.passive": "#9399B2", + "theme.bar.menus.menu.bluetooth.listitems.active": "#00FFFF", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#FFD700", + "theme.bar.menus.menu.bluetooth.switch.puck": "#333333", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#2A2A2A", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#00FFFF", + "theme.bar.menus.menu.bluetooth.switch_divider": "#333333", + "theme.bar.menus.menu.bluetooth.status": "#FF69B4", + "theme.bar.menus.menu.bluetooth.text": "#FFD700", + "theme.bar.menus.menu.bluetooth.label.color": "#00FFFF", + "theme.bar.menus.menu.bluetooth.border.color": "#2A2A2A", + "theme.bar.menus.menu.bluetooth.background.color": "#0A0A0A", + "theme.bar.menus.menu.bluetooth.card.color": "#1A1A1A", + "theme.bar.menus.menu.network.iconbuttons.active": "#FF69B4", + "theme.bar.menus.menu.network.iconbuttons.passive": "#FFD700", + "theme.bar.menus.menu.network.icons.active": "#FF69B4", + "theme.bar.menus.menu.network.icons.passive": "#9399B2", + "theme.bar.menus.menu.network.listitems.active": "#FF69B4", + "theme.bar.menus.menu.network.listitems.passive": "#FFD700", + "theme.bar.menus.menu.network.status.color": "#FF69B4", + "theme.bar.menus.menu.network.text": "#FFD700", + "theme.bar.menus.menu.network.label.color": "#FF69B4", + "theme.bar.menus.menu.network.border.color": "#2A2A2A", + "theme.bar.menus.menu.network.background.color": "#0A0A0A", + "theme.bar.menus.menu.network.card.color": "#1A1A1A", + "theme.bar.menus.menu.volume.input_slider.puck": "#333333", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.volume.input_slider.background": "#2A2A2A", + "theme.bar.menus.menu.volume.input_slider.primary": "#FF69B4", + "theme.bar.menus.menu.volume.audio_slider.puck": "#333333", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.volume.audio_slider.background": "#2A2A2A", + "theme.bar.menus.menu.volume.audio_slider.primary": "#FF69B4", + "theme.bar.menus.menu.volume.icons.active": "#FF69B4", + "theme.bar.menus.menu.volume.icons.passive": "#9399B2", + "theme.bar.menus.menu.volume.iconbutton.active": "#FF69B4", + "theme.bar.menus.menu.volume.iconbutton.passive": "#FFD700", + "theme.bar.menus.menu.volume.listitems.active": "#FF69B4", + "theme.bar.menus.menu.volume.listitems.passive": "#FFD700", + "theme.bar.menus.menu.volume.text": "#FFFFFF", + "theme.bar.menus.menu.volume.label.color": "#FF69B4", + "theme.bar.menus.menu.volume.border.color": "#2A2A2A", + "theme.bar.menus.menu.volume.background.color": "#0A0A0A", + "theme.bar.menus.menu.volume.card.color": "#1A1A1A", + "theme.bar.menus.menu.media.slider.puck": "#333333", + "theme.bar.menus.menu.media.slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.media.slider.background": "#2A2A2A", + "theme.bar.menus.menu.media.slider.primary": "#FFD700", + "theme.bar.menus.menu.media.buttons.text": "#0A0A0A", + "theme.bar.menus.menu.media.buttons.background": "#FF69B4", + "theme.bar.menus.menu.media.buttons.enabled": "#00FFFF", + "theme.bar.menus.menu.media.buttons.inactive": "#333333", + "theme.bar.menus.menu.media.border.color": "#2A2A2A", + "theme.bar.menus.menu.media.card.color": "#1A1A1A", + "theme.bar.menus.menu.media.background.color": "#0A0A0A", + "theme.bar.menus.menu.media.album": "#FF69B4", + "theme.bar.menus.menu.media.artist": "#00FFFF", + "theme.bar.menus.menu.media.song": "#FFD700", + "theme.bar.menus.tooltip.text": "#FFD700", + "theme.bar.menus.tooltip.background": "#0A0A0A", + "theme.bar.menus.dropdownmenu.divider": "#1A1A1A", + "theme.bar.menus.dropdownmenu.text": "#FFD700", + "theme.bar.menus.dropdownmenu.background": "#0A0A0A", + "theme.bar.menus.slider.puck": "#333333", + "theme.bar.menus.slider.backgroundhover": "#45475A", + "theme.bar.menus.slider.background": "#2A2A2A", + "theme.bar.menus.slider.primary": "#00FFFF", + "theme.bar.menus.progressbar.background": "#45475A", + "theme.bar.menus.progressbar.foreground": "#00FFFF", + "theme.bar.menus.iconbuttons.active": "#00FFFF", + "theme.bar.menus.iconbuttons.passive": "#FFD700", + "theme.bar.menus.buttons.text": "#0A0A0A", + "theme.bar.menus.buttons.disabled": "#333333", + "theme.bar.menus.buttons.active": "#00FFFF", + "theme.bar.menus.buttons.default": "#FFD700", + "theme.bar.menus.check_radio_button.active": "#ffffff", + "theme.bar.menus.check_radio_button.background": "#000000", + "theme.bar.menus.switch.puck": "#333333", + "theme.bar.menus.switch.disabled": "#2A2A2A", + "theme.bar.menus.switch.enabled": "#00FFFF", + "theme.bar.menus.icons.active": "#00FFFF", + "theme.bar.menus.icons.passive": "#333333", + "theme.bar.menus.listitems.active": "#00FFFF", + "theme.bar.menus.listitems.passive": "#FFD700", + "theme.bar.menus.popover.border": "#0A0A0A", + "theme.bar.menus.popover.background": "#0D0D0D", + "theme.bar.menus.popover.text": "#00FFFF", + "theme.bar.menus.label": "#00FFFF", + "theme.bar.menus.feinttext": "#1a1a1a", + "theme.bar.menus.dimtext": "#2b2b2b", + "theme.bar.menus.text": "#FFFFFF", + "theme.bar.menus.border.color": "#2A2A2A", + "theme.bar.menus.cards": "#0a0a0a", + "theme.bar.menus.background": "#0A0A0A", + "theme.bar.buttons.modules.power.icon_background": "#FF4500", + "theme.bar.buttons.modules.power.icon": "#FF4500", + "theme.bar.buttons.modules.power.background": "#121212", + "theme.bar.buttons.modules.weather.icon_background": "#FFD700", + "theme.bar.buttons.modules.weather.icon": "#FFD700", + "theme.bar.buttons.modules.weather.text": "#FFD700", + "theme.bar.buttons.modules.weather.background": "#121212", + "theme.bar.buttons.modules.updates.icon_background": "#FFD700", + "theme.bar.buttons.modules.updates.icon": "#FFD700", + "theme.bar.buttons.modules.updates.text": "#FFD700", + "theme.bar.buttons.modules.updates.background": "#121212", + "theme.bar.buttons.modules.kbLayout.icon_background": "#00FFFF", + "theme.bar.buttons.modules.kbLayout.icon": "#00FFFF", + "theme.bar.buttons.modules.kbLayout.text": "#00FFFF", + "theme.bar.buttons.modules.kbLayout.background": "#121212", + "theme.bar.buttons.modules.netstat.icon_background": "#32CD32", + "theme.bar.buttons.modules.netstat.icon": "#32CD32", + "theme.bar.buttons.modules.netstat.text": "#32CD32", + "theme.bar.buttons.modules.netstat.background": "#121212", + "theme.bar.buttons.modules.storage.icon_background": "#FF4500", + "theme.bar.buttons.modules.storage.icon": "#FF4500", + "theme.bar.buttons.modules.storage.text": "#FF4500", + "theme.bar.buttons.modules.storage.background": "#121212", + "theme.bar.buttons.modules.cpu.icon_background": "#FF4500", + "theme.bar.buttons.modules.cpu.icon": "#FF4500", + "theme.bar.buttons.modules.cpu.text": "#FF4500", + "theme.bar.buttons.modules.cpu.background": "#121212", + "theme.bar.buttons.modules.ram.icon_background": "#FFD700", + "theme.bar.buttons.modules.ram.icon": "#FFD700", + "theme.bar.buttons.modules.ram.text": "#FFD700", + "theme.bar.buttons.modules.ram.background": "#121212", + "theme.bar.buttons.notifications.total": "#f7d04b", + "theme.bar.buttons.notifications.icon_background": "#FFD700", + "theme.bar.buttons.notifications.icon": "#f7d04b", + "theme.bar.buttons.notifications.background": "#121212", + "theme.bar.buttons.clock.icon_background": "#FF69B4", + "theme.bar.buttons.clock.icon": "#5bafff", + "theme.bar.buttons.clock.text": "#5bafff", + "theme.bar.buttons.clock.background": "#121212", + "theme.bar.buttons.battery.icon_background": "#FFD700", + "theme.bar.buttons.battery.icon": "#f7d04b", + "theme.bar.buttons.battery.text": "#f7d04b", + "theme.bar.buttons.battery.background": "#121212", + "theme.bar.buttons.systray.background": "#121212", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.buttons.bluetooth.icon": "#5bafff", + "theme.bar.buttons.bluetooth.text": "#5bafff", + "theme.bar.buttons.bluetooth.background": "#121212", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.network.icon": "#e23fe2", + "theme.bar.buttons.network.text": "#e23fe2", + "theme.bar.buttons.network.background": "#121212", + "theme.bar.buttons.volume.icon_background": "#FF4500", + "theme.bar.buttons.volume.icon": "#ff3f3f", + "theme.bar.buttons.volume.text": "#ff3f3f", + "theme.bar.buttons.volume.background": "#121212", + "theme.bar.buttons.media.icon_background": "#FFD700", + "theme.bar.buttons.media.icon": "#FFD700", + "theme.bar.buttons.media.text": "#00FFFF", + "theme.bar.buttons.media.background": "#111111", + "theme.bar.buttons.windowtitle.icon_background": "#FF69B4", + "theme.bar.buttons.windowtitle.icon": "#5bafff", + "theme.bar.buttons.windowtitle.text": "#5bafff", + "theme.bar.buttons.windowtitle.background": "#121212", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#e23ee2", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.active": "#e23fe2", + "theme.bar.buttons.workspaces.occupied": "#ff3f3f", + "theme.bar.buttons.workspaces.available": "#5bafff", + "theme.bar.buttons.workspaces.hover": "#303030", + "theme.bar.buttons.workspaces.background": "#121212", + "theme.bar.buttons.dashboard.icon": "#f7d04b", + "theme.bar.buttons.dashboard.background": "#121212", + "theme.bar.buttons.icon": "#FFD700", + "theme.bar.buttons.text": "#00FFFF", + "theme.bar.buttons.hover": "#333333", + "theme.bar.buttons.icon_background": "#121212", + "theme.bar.buttons.background": "#111111", + "theme.bar.buttons.style": "default", + "theme.bar.background": "#0A0A0A", + "theme.osd.label": "#5bafff", + "theme.osd.icon": "#0a0a0a", + "theme.osd.bar_overflow_color": "#ff3f3f", + "theme.osd.bar_empty_color": "#1a1a1a", + "theme.osd.bar_color": "#5bafff", + "theme.osd.icon_container": "#5bafff", + "theme.osd.bar_container": "#0a0a0a", + "theme.notification.close_button.label": "#0a0a0a", + "theme.notification.close_button.background": "#ff3f3f", + "theme.notification.labelicon": "#5bafff", + "theme.notification.text": "#d1d1d1", + "theme.notification.time": "#797979", + "theme.notification.border": "#1a1a1a", + "theme.notification.label": "#5bafff", + "theme.notification.actions.text": "#0a0a0a", + "theme.notification.actions.background": "#5bafff", + "theme.notification.background": "#0a0a0a", + "theme.bar.buttons.modules.power.border": "#FF4500", + "theme.bar.buttons.modules.weather.border": "#FFD700", + "theme.bar.buttons.modules.updates.border": "#FFD700", + "theme.bar.buttons.modules.kbLayout.border": "#00FFFF", + "theme.bar.buttons.modules.netstat.border": "#32CD32", + "theme.bar.buttons.modules.storage.border": "#FF4500", + "theme.bar.buttons.modules.cpu.border": "#FF4500", + "theme.bar.buttons.modules.ram.border": "#FFD700", + "theme.bar.buttons.notifications.border": "#f7d04b", + "theme.bar.buttons.clock.border": "#5bafff", + "theme.bar.buttons.battery.border": "#f7d04b", + "theme.bar.buttons.systray.border": "#303030", + "theme.bar.buttons.bluetooth.border": "#5bafff", + "theme.bar.buttons.network.border": "#e23fe2", + "theme.bar.buttons.volume.border": "#ff3f3f", + "theme.bar.buttons.media.border": "#FFD700", + "theme.bar.buttons.windowtitle.border": "#5bafff", + "theme.bar.buttons.workspaces.border": "#e23ee2", + "theme.bar.buttons.dashboard.border": "#f7d04b", + "theme.bar.buttons.modules.submap.background": "#121212", + "theme.bar.buttons.modules.submap.text": "#FF69B4", + "theme.bar.buttons.modules.submap.border": "#FF69B4", + "theme.bar.buttons.modules.submap.icon": "#FF69B4", + "theme.bar.buttons.modules.submap.icon_background": "#121212" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/cyberpunk_split.json b/ags/HyprPanel/themes/cyberpunk_split.json new file mode 100644 index 0000000..b7b183a --- /dev/null +++ b/ags/HyprPanel/themes/cyberpunk_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#00ffff", + "theme.bar.menus.menu.notifications.pager.label": "#9399B2", + "theme.bar.menus.menu.notifications.pager.button": "#00ffff", + "theme.bar.menus.menu.notifications.pager.background": "#0A0A0A", + "theme.bar.menus.menu.notifications.switch.puck": "#333333", + "theme.bar.menus.menu.notifications.switch.disabled": "#2A2A2A", + "theme.bar.menus.menu.notifications.switch.enabled": "#FFD700", + "theme.bar.menus.menu.notifications.clear": "#FF4500", + "theme.bar.menus.menu.notifications.switch_divider": "#333333", + "theme.bar.menus.menu.notifications.border": "#2A2A2A", + "theme.bar.menus.menu.notifications.card": "#1A1A1A", + "theme.bar.menus.menu.notifications.background": "#0A0A0A", + "theme.bar.menus.menu.notifications.no_notifications_label": "#2A2A2A", + "theme.bar.menus.menu.notifications.label": "#FFD700", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.sleep.text": "#00FFFF", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#00FFFF", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.logout.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.logout.text": "#32CD32", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#32CD32", + "theme.bar.menus.menu.power.buttons.logout.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.restart.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.restart.text": "#FFD700", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#FFD700", + "theme.bar.menus.menu.power.buttons.restart.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#0A0A0A", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#FF4500", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#ff4400", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1A1A1A", + "theme.bar.menus.menu.power.border.color": "#2A2A2A", + "theme.bar.menus.menu.power.background.color": "#0A0A0A", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#FF69B4", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#FF69B4", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#FF69B4", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#32CD32", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#32CD32", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#32CD32", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#FFD700", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#FFD700", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#FFD700", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#FF4500", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#FF4500", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#FF4500", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#333333", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#00FFFF", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#FFD700", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#32CD32", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#FF4500", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#FFD700", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#FF69B4", + "theme.bar.menus.menu.dashboard.controls.input.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.input.background": "#FF69B4", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#FF4500", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#FFD700", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#00FFFF", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#FF69B4", + "theme.bar.menus.menu.dashboard.controls.disabled": "#585858", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#32CD32", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#00FFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#0A0A0A", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#FF4500", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#32CD32", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#FFFFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#00FFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#2A2A2A", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#0A0A0A", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1A1A1A", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#00FFFF", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#32CD32", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#FFD700", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#FF4500", + "theme.bar.menus.menu.dashboard.profile.name": "#FF69B4", + "theme.bar.menus.menu.dashboard.border.color": "#2A2A2A", + "theme.bar.menus.menu.dashboard.background.color": "#0A0A0A", + "theme.bar.menus.menu.dashboard.card.color": "#1A1A1A", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#FF69B4", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#FF69B4", + "theme.bar.menus.menu.clock.weather.hourly.time": "#FF69B4", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#00FFFF", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#00BFFF", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#00FFFF", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#FFD700", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#FFD700", + "theme.bar.menus.menu.clock.weather.stats": "#00FFFF", + "theme.bar.menus.menu.clock.weather.status": "#FF69B4", + "theme.bar.menus.menu.clock.weather.temperature": "#32CD32", + "theme.bar.menus.menu.clock.weather.icon": "#FFD700", + "theme.bar.menus.menu.clock.calendar.contextdays": "#585858", + "theme.bar.menus.menu.clock.calendar.days": "#FFD700", + "theme.bar.menus.menu.clock.calendar.currentday": "#00FFFF", + "theme.bar.menus.menu.clock.calendar.paginator": "#00FFFF", + "theme.bar.menus.menu.clock.calendar.weekdays": "#00FFFF", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#FF69B4", + "theme.bar.menus.menu.clock.time.timeperiod": "#32CD32", + "theme.bar.menus.menu.clock.time.time": "#FFD700", + "theme.bar.menus.menu.clock.text": "#00FFFF", + "theme.bar.menus.menu.clock.border.color": "#2A2A2A", + "theme.bar.menus.menu.clock.background.color": "#0A0A0A", + "theme.bar.menus.menu.clock.card.color": "#1A1A1A", + "theme.bar.menus.menu.battery.slider.puck": "#333333", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.battery.slider.background": "#2A2A2A", + "theme.bar.menus.menu.battery.slider.primary": "#FFD700", + "theme.bar.menus.menu.battery.icons.active": "#FFD700", + "theme.bar.menus.menu.battery.icons.passive": "#9399B2", + "theme.bar.menus.menu.battery.listitems.active": "#FFD700", + "theme.bar.menus.menu.battery.listitems.passive": "#00FFFF", + "theme.bar.menus.menu.battery.text": "#FFD700", + "theme.bar.menus.menu.battery.label.color": "#FFD700", + "theme.bar.menus.menu.battery.border.color": "#2A2A2A", + "theme.bar.menus.menu.battery.background.color": "#0A0A0A", + "theme.bar.menus.menu.battery.card.color": "#1A1A1A", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1A1A1A", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#FFD700", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#0A0A0A", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#00FFFF", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#FFD700", + "theme.bar.menus.menu.bluetooth.icons.active": "#00FFFF", + "theme.bar.menus.menu.bluetooth.icons.passive": "#9399B2", + "theme.bar.menus.menu.bluetooth.listitems.active": "#00FFFF", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#FFD700", + "theme.bar.menus.menu.bluetooth.switch.puck": "#333333", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#2A2A2A", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#00FFFF", + "theme.bar.menus.menu.bluetooth.switch_divider": "#333333", + "theme.bar.menus.menu.bluetooth.status": "#FF69B4", + "theme.bar.menus.menu.bluetooth.text": "#FFD700", + "theme.bar.menus.menu.bluetooth.label.color": "#00FFFF", + "theme.bar.menus.menu.bluetooth.border.color": "#2A2A2A", + "theme.bar.menus.menu.bluetooth.background.color": "#0A0A0A", + "theme.bar.menus.menu.bluetooth.card.color": "#1A1A1A", + "theme.bar.menus.menu.network.iconbuttons.active": "#FF69B4", + "theme.bar.menus.menu.network.iconbuttons.passive": "#FFD700", + "theme.bar.menus.menu.network.icons.active": "#FF69B4", + "theme.bar.menus.menu.network.icons.passive": "#9399B2", + "theme.bar.menus.menu.network.listitems.active": "#FF69B4", + "theme.bar.menus.menu.network.listitems.passive": "#FFD700", + "theme.bar.menus.menu.network.status.color": "#FF69B4", + "theme.bar.menus.menu.network.text": "#FFD700", + "theme.bar.menus.menu.network.label.color": "#FF69B4", + "theme.bar.menus.menu.network.border.color": "#2A2A2A", + "theme.bar.menus.menu.network.background.color": "#0A0A0A", + "theme.bar.menus.menu.network.card.color": "#1A1A1A", + "theme.bar.menus.menu.volume.input_slider.puck": "#333333", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.volume.input_slider.background": "#2A2A2A", + "theme.bar.menus.menu.volume.input_slider.primary": "#FF69B4", + "theme.bar.menus.menu.volume.audio_slider.puck": "#333333", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.volume.audio_slider.background": "#2A2A2A", + "theme.bar.menus.menu.volume.audio_slider.primary": "#FF69B4", + "theme.bar.menus.menu.volume.icons.active": "#FF69B4", + "theme.bar.menus.menu.volume.icons.passive": "#9399B2", + "theme.bar.menus.menu.volume.iconbutton.active": "#FF69B4", + "theme.bar.menus.menu.volume.iconbutton.passive": "#FFD700", + "theme.bar.menus.menu.volume.listitems.active": "#FF69B4", + "theme.bar.menus.menu.volume.listitems.passive": "#FFD700", + "theme.bar.menus.menu.volume.text": "#FFFFFF", + "theme.bar.menus.menu.volume.label.color": "#FF69B4", + "theme.bar.menus.menu.volume.border.color": "#2A2A2A", + "theme.bar.menus.menu.volume.background.color": "#0A0A0A", + "theme.bar.menus.menu.volume.card.color": "#1A1A1A", + "theme.bar.menus.menu.media.slider.puck": "#333333", + "theme.bar.menus.menu.media.slider.backgroundhover": "#45475A", + "theme.bar.menus.menu.media.slider.background": "#2A2A2A", + "theme.bar.menus.menu.media.slider.primary": "#FFD700", + "theme.bar.menus.menu.media.buttons.text": "#0A0A0A", + "theme.bar.menus.menu.media.buttons.background": "#FF69B4", + "theme.bar.menus.menu.media.buttons.enabled": "#00FFFF", + "theme.bar.menus.menu.media.buttons.inactive": "#333333", + "theme.bar.menus.menu.media.border.color": "#2A2A2A", + "theme.bar.menus.menu.media.card.color": "#1A1A1A", + "theme.bar.menus.menu.media.background.color": "#0A0A0A", + "theme.bar.menus.menu.media.album": "#FF69B4", + "theme.bar.menus.menu.media.artist": "#00FFFF", + "theme.bar.menus.menu.media.song": "#FFD700", + "theme.bar.menus.tooltip.text": "#FFD700", + "theme.bar.menus.tooltip.background": "#0A0A0A", + "theme.bar.menus.dropdownmenu.divider": "#1A1A1A", + "theme.bar.menus.dropdownmenu.text": "#FFD700", + "theme.bar.menus.dropdownmenu.background": "#0A0A0A", + "theme.bar.menus.slider.puck": "#333333", + "theme.bar.menus.slider.backgroundhover": "#45475A", + "theme.bar.menus.slider.background": "#2A2A2A", + "theme.bar.menus.slider.primary": "#00FFFF", + "theme.bar.menus.progressbar.background": "#45475A", + "theme.bar.menus.progressbar.foreground": "#00FFFF", + "theme.bar.menus.iconbuttons.active": "#00FFFF", + "theme.bar.menus.iconbuttons.passive": "#FFD700", + "theme.bar.menus.buttons.text": "#0A0A0A", + "theme.bar.menus.buttons.disabled": "#333333", + "theme.bar.menus.buttons.active": "#00FFFF", + "theme.bar.menus.buttons.default": "#FFD700", + "theme.bar.menus.check_radio_button.active": "#ffffff", + "theme.bar.menus.check_radio_button.background": "#000000", + "theme.bar.menus.switch.puck": "#333333", + "theme.bar.menus.switch.disabled": "#2A2A2A", + "theme.bar.menus.switch.enabled": "#00FFFF", + "theme.bar.menus.icons.active": "#00FFFF", + "theme.bar.menus.icons.passive": "#333333", + "theme.bar.menus.listitems.active": "#00FFFF", + "theme.bar.menus.listitems.passive": "#FFD700", + "theme.bar.menus.popover.border": "#0A0A0A", + "theme.bar.menus.popover.background": "#0D0D0D", + "theme.bar.menus.popover.text": "#00FFFF", + "theme.bar.menus.label": "#00FFFF", + "theme.bar.menus.feinttext": "#1a1a1a", + "theme.bar.menus.dimtext": "#2b2b2b", + "theme.bar.menus.text": "#FFFFFF", + "theme.bar.menus.border.color": "#2A2A2A", + "theme.bar.menus.cards": "#0a0a0a", + "theme.bar.menus.background": "#0A0A0A", + "theme.bar.buttons.modules.power.icon_background": "#FF4500", + "theme.bar.buttons.modules.power.icon": "#121212", + "theme.bar.buttons.modules.power.background": "#121212", + "theme.bar.buttons.modules.weather.icon_background": "#00ffff", + "theme.bar.buttons.modules.weather.icon": "#121212", + "theme.bar.buttons.modules.weather.text": "#00ffff", + "theme.bar.buttons.modules.weather.background": "#121212", + "theme.bar.buttons.modules.updates.icon_background": "#FFD700", + "theme.bar.buttons.modules.updates.icon": "#121212", + "theme.bar.buttons.modules.updates.text": "#FFD700", + "theme.bar.buttons.modules.updates.background": "#121212", + "theme.bar.buttons.modules.kbLayout.icon_background": "#00FFFF", + "theme.bar.buttons.modules.kbLayout.icon": "#121212", + "theme.bar.buttons.modules.kbLayout.text": "#00FFFF", + "theme.bar.buttons.modules.kbLayout.background": "#121212", + "theme.bar.buttons.modules.netstat.icon_background": "#32CD32", + "theme.bar.buttons.modules.netstat.icon": "#121212", + "theme.bar.buttons.modules.netstat.text": "#32CD32", + "theme.bar.buttons.modules.netstat.background": "#121212", + "theme.bar.buttons.modules.storage.icon_background": "#FF4500", + "theme.bar.buttons.modules.storage.icon": "#121212", + "theme.bar.buttons.modules.storage.text": "#FF4500", + "theme.bar.buttons.modules.storage.background": "#121212", + "theme.bar.buttons.modules.cpu.icon_background": "#FF4500", + "theme.bar.buttons.modules.cpu.icon": "#121212", + "theme.bar.buttons.modules.cpu.text": "#FF4500", + "theme.bar.buttons.modules.cpu.background": "#121212", + "theme.bar.buttons.modules.ram.icon_background": "#FFD700", + "theme.bar.buttons.modules.ram.icon": "#121212", + "theme.bar.buttons.modules.ram.text": "#FFD700", + "theme.bar.buttons.modules.ram.background": "#121212", + "theme.bar.buttons.notifications.total": "#f7d04b", + "theme.bar.buttons.notifications.icon_background": "#f7d04b", + "theme.bar.buttons.notifications.icon": "#121212", + "theme.bar.buttons.notifications.background": "#121212", + "theme.bar.buttons.clock.icon_background": "#5bafff", + "theme.bar.buttons.clock.icon": "#121212", + "theme.bar.buttons.clock.text": "#5bafff", + "theme.bar.buttons.clock.background": "#121212", + "theme.bar.buttons.battery.icon_background": "#f7d04b", + "theme.bar.buttons.battery.icon": "#121212", + "theme.bar.buttons.battery.text": "#f7d04b", + "theme.bar.buttons.battery.background": "#121212", + "theme.bar.buttons.systray.background": "#121212", + "theme.bar.buttons.bluetooth.icon_background": "#5bafff", + "theme.bar.buttons.bluetooth.icon": "#121212", + "theme.bar.buttons.bluetooth.text": "#5bafff", + "theme.bar.buttons.bluetooth.background": "#121212", + "theme.bar.buttons.network.icon_background": "#e23fe2", + "theme.bar.buttons.network.icon": "#121212", + "theme.bar.buttons.network.text": "#e23fe2", + "theme.bar.buttons.network.background": "#121212", + "theme.bar.buttons.volume.icon_background": "#ff3f3f", + "theme.bar.buttons.volume.icon": "#121212", + "theme.bar.buttons.volume.text": "#ff3f3f", + "theme.bar.buttons.volume.background": "#121212", + "theme.bar.buttons.media.icon_background": "#00ffff", + "theme.bar.buttons.media.icon": "#121212", + "theme.bar.buttons.media.text": "#00ffff", + "theme.bar.buttons.media.background": "#111111", + "theme.bar.buttons.windowtitle.icon_background": "#5bafff", + "theme.bar.buttons.windowtitle.icon": "#121212", + "theme.bar.buttons.windowtitle.text": "#5bafff", + "theme.bar.buttons.windowtitle.background": "#121212", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#e23ee2", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#e23fe2", + "theme.bar.buttons.workspaces.active": "#e23fe2", + "theme.bar.buttons.workspaces.occupied": "#ff3f3f", + "theme.bar.buttons.workspaces.available": "#5bafff", + "theme.bar.buttons.workspaces.hover": "#e23fe2", + "theme.bar.buttons.workspaces.background": "#121212", + "theme.bar.buttons.dashboard.icon": "#121212", + "theme.bar.buttons.dashboard.background": "#f7d04b", + "theme.bar.buttons.icon": "#FFD700", + "theme.bar.buttons.text": "#00FFFF", + "theme.bar.buttons.hover": "#333333", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.background": "#111111", + "theme.bar.buttons.style": "split", + "theme.bar.background": "#0A0A0A", + "theme.osd.label": "#5bafff", + "theme.osd.icon": "#0a0a0a", + "theme.osd.bar_overflow_color": "#ff3f3f", + "theme.osd.bar_empty_color": "#1a1a1a", + "theme.osd.bar_color": "#5bafff", + "theme.osd.icon_container": "#5bafff", + "theme.osd.bar_container": "#0a0a0a", + "theme.notification.close_button.label": "#0a0a0a", + "theme.notification.close_button.background": "#ff3f3f", + "theme.notification.labelicon": "#5bafff", + "theme.notification.text": "#d1d1d1", + "theme.notification.time": "#797979", + "theme.notification.border": "#1a1a1a", + "theme.notification.label": "#5bafff", + "theme.notification.actions.text": "#0a0a0a", + "theme.notification.actions.background": "#5bafff", + "theme.notification.background": "#0a0a0a", + "theme.bar.buttons.modules.power.border": "#FF4500", + "theme.bar.buttons.modules.weather.border": "#FFD700", + "theme.bar.buttons.modules.updates.border": "#FFD700", + "theme.bar.buttons.modules.kbLayout.border": "#00FFFF", + "theme.bar.buttons.modules.netstat.border": "#32CD32", + "theme.bar.buttons.modules.storage.border": "#FF4500", + "theme.bar.buttons.modules.cpu.border": "#FF4500", + "theme.bar.buttons.modules.ram.border": "#FFD700", + "theme.bar.buttons.notifications.border": "#f7d04b", + "theme.bar.buttons.clock.border": "#5bafff", + "theme.bar.buttons.battery.border": "#f7d04b", + "theme.bar.buttons.systray.border": "#303030", + "theme.bar.buttons.bluetooth.border": "#5bafff", + "theme.bar.buttons.network.border": "#e23fe2", + "theme.bar.buttons.volume.border": "#ff3f3f", + "theme.bar.buttons.media.border": "#FFD700", + "theme.bar.buttons.windowtitle.border": "#5bafff", + "theme.bar.buttons.workspaces.border": "#e23ee2", + "theme.bar.buttons.dashboard.border": "#f7d04b", + "theme.bar.buttons.modules.submap.background": "#121212", + "theme.bar.buttons.modules.submap.text": "#FF69B4", + "theme.bar.buttons.modules.submap.border": "#FF69B4", + "theme.bar.buttons.modules.submap.icon": "#121212", + "theme.bar.buttons.modules.submap.icon_background": "#FF69B4" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/dracula.json b/ags/HyprPanel/themes/dracula.json new file mode 100644 index 0000000..1bada5f --- /dev/null +++ b/ags/HyprPanel/themes/dracula.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#bd93f9", + "theme.bar.menus.menu.notifications.pager.label": "#6272a4", + "theme.bar.menus.menu.notifications.pager.button": "#bd93f9", + "theme.bar.menus.menu.notifications.pager.background": "#282936", + "theme.bar.menus.menu.notifications.switch.puck": "#44475a", + "theme.bar.menus.menu.notifications.switch.disabled": "#44475a", + "theme.bar.menus.menu.notifications.switch.enabled": "#bd93f9", + "theme.bar.menus.menu.notifications.clear": "#bd93f9", + "theme.bar.menus.menu.notifications.switch_divider": "#44475a", + "theme.bar.menus.menu.notifications.border": "#44475a", + "theme.bar.menus.menu.notifications.card": "#44475a", + "theme.bar.menus.menu.notifications.background": "#282a36", + "theme.bar.menus.menu.notifications.no_notifications_label": "#44475a", + "theme.bar.menus.menu.notifications.label": "#bd93f9", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.sleep.text": "#8be9fd", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#8be9fd", + "theme.bar.menus.menu.power.buttons.sleep.background": "#44475a", + "theme.bar.menus.menu.power.buttons.logout.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.logout.text": "#50fa7b", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#50fa7b", + "theme.bar.menus.menu.power.buttons.logout.background": "#44475a", + "theme.bar.menus.menu.power.buttons.restart.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.restart.text": "#ffb86c", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#ffb86c", + "theme.bar.menus.menu.power.buttons.restart.background": "#44475a", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#bd93f9", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#ff5555", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#44475a", + "theme.bar.menus.menu.power.border.color": "#44475a", + "theme.bar.menus.menu.power.background.color": "#282936", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#ff79c6", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#ff79c6", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#ff79c6", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#50fa7b", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#50fa7b", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#50fa7b", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f1fa8c", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f1fa8c", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f1fa8c", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ffb86c", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ffb86c", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ffb86c", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#6272a4", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#ffb86c", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#bd93f9", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8be9fd", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ff5555", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f1fa8c", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#ff79c6", + "theme.bar.menus.menu.dashboard.controls.input.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.input.background": "#ff79c6", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ffb86c", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f1fa8c", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#8be9fd", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#bd93f9", + "theme.bar.menus.menu.dashboard.controls.disabled": "#44475a", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#50fa7b", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#282a36", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#bd93f9", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#282a36", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#ff5555", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#50fa7b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#f8f8f2", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#bd93f9", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#44475a", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#282a36", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#44475a", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#8be9fd", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#50fa7b", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#ffb86c", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#ff5555", + "theme.bar.menus.menu.dashboard.profile.name": "#ff79c6", + "theme.bar.menus.menu.dashboard.border.color": "#44475a", + "theme.bar.menus.menu.dashboard.background.color": "#282a36", + "theme.bar.menus.menu.dashboard.card.color": "#44475a", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#ff79c6", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#ff79c6", + "theme.bar.menus.menu.clock.weather.hourly.time": "#ff79c6", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#8be9fd", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#8be9fd", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#bd93f9", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#ffb86c", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#ff5555", + "theme.bar.menus.menu.clock.weather.stats": "#ff79c6", + "theme.bar.menus.menu.clock.weather.status": "#8be9fd", + "theme.bar.menus.menu.clock.weather.temperature": "#f8f8f2", + "theme.bar.menus.menu.clock.weather.icon": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.contextdays": "#44475a", + "theme.bar.menus.menu.clock.calendar.days": "#f8f8f2", + "theme.bar.menus.menu.clock.calendar.currentday": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.paginator": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8be9fd", + "theme.bar.menus.menu.clock.time.timeperiod": "#8be9fd", + "theme.bar.menus.menu.clock.time.time": "#ff79c6", + "theme.bar.menus.menu.clock.text": "#f8f8f2", + "theme.bar.menus.menu.clock.border.color": "#44475a", + "theme.bar.menus.menu.clock.background.color": "#282a36", + "theme.bar.menus.menu.clock.card.color": "#44475a", + "theme.bar.menus.menu.battery.slider.puck": "#282936", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.battery.slider.background": "#6272a4", + "theme.bar.menus.menu.battery.slider.primary": "#f1fa8c", + "theme.bar.menus.menu.battery.icons.active": "#f1fa8c", + "theme.bar.menus.menu.battery.icons.passive": "#6272a4", + "theme.bar.menus.menu.battery.listitems.active": "#f1fa8c", + "theme.bar.menus.menu.battery.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.battery.text": "#f8f8f2", + "theme.bar.menus.menu.battery.label.color": "#f1fa8c", + "theme.bar.menus.menu.battery.border.color": "#44475a", + "theme.bar.menus.menu.battery.background.color": "#282a36", + "theme.bar.menus.menu.battery.card.color": "#44475a", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#44475a", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#f8f8f2", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#282a36", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#8be9fd", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#f8f8f2", + "theme.bar.menus.menu.bluetooth.icons.active": "#8be9fd", + "theme.bar.menus.menu.bluetooth.icons.passive": "#6272a4", + "theme.bar.menus.menu.bluetooth.listitems.active": "#8be9fd", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.bluetooth.switch.puck": "#44475a", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#44475a", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#8be9fd", + "theme.bar.menus.menu.bluetooth.switch_divider": "#44475a", + "theme.bar.menus.menu.bluetooth.status": "#44475a", + "theme.bar.menus.menu.bluetooth.text": "#f8f8f2", + "theme.bar.menus.menu.bluetooth.label.color": "#8be9fd", + "theme.bar.menus.menu.bluetooth.border.color": "#44475a", + "theme.bar.menus.menu.bluetooth.background.color": "#282a36", + "theme.bar.menus.menu.bluetooth.card.color": "#44475a", + "theme.bar.menus.menu.network.iconbuttons.active": "#bd93f9", + "theme.bar.menus.menu.network.iconbuttons.passive": "#f8f8f2", + "theme.bar.menus.menu.network.icons.active": "#bd93f9", + "theme.bar.menus.menu.network.icons.passive": "#6272a4", + "theme.bar.menus.menu.network.listitems.active": "#bd93f9", + "theme.bar.menus.menu.network.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.network.status.color": "#44475a", + "theme.bar.menus.menu.network.text": "#f8f8f2", + "theme.bar.menus.menu.network.label.color": "#bd93f9", + "theme.bar.menus.menu.network.border.color": "#44475a", + "theme.bar.menus.menu.network.background.color": "#282a36", + "theme.bar.menus.menu.network.card.color": "#44475a", + "theme.bar.menus.menu.volume.input_slider.puck": "#282936", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.volume.input_slider.background": "#6272a4", + "theme.bar.menus.menu.volume.input_slider.primary": "#ffb86c", + "theme.bar.menus.menu.volume.audio_slider.puck": "#282936", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.volume.audio_slider.background": "#6272a4", + "theme.bar.menus.menu.volume.audio_slider.primary": "#ffb86c", + "theme.bar.menus.menu.volume.icons.active": "#ffb86c", + "theme.bar.menus.menu.volume.icons.passive": "#6272a4", + "theme.bar.menus.menu.volume.iconbutton.active": "#ffb86c", + "theme.bar.menus.menu.volume.iconbutton.passive": "#f8f8f2", + "theme.bar.menus.menu.volume.listitems.active": "#ffb86c", + "theme.bar.menus.menu.volume.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.volume.text": "#f8f8f2", + "theme.bar.menus.menu.volume.label.color": "#ffb86c", + "theme.bar.menus.menu.volume.border.color": "#44475a", + "theme.bar.menus.menu.volume.background.color": "#282a36", + "theme.bar.menus.menu.volume.card.color": "#44475a", + "theme.bar.menus.menu.media.slider.puck": "#282936", + "theme.bar.menus.menu.media.slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.media.slider.background": "#6272a4", + "theme.bar.menus.menu.media.slider.primary": "#ff79c6", + "theme.bar.menus.menu.media.buttons.text": "#282a36", + "theme.bar.menus.menu.media.buttons.background": "#bd93f9", + "theme.bar.menus.menu.media.buttons.enabled": "#8be9fd", + "theme.bar.menus.menu.media.buttons.inactive": "#44475a", + "theme.bar.menus.menu.media.border.color": "#44475a", + "theme.bar.menus.menu.media.card.color": "#44475a", + "theme.bar.menus.menu.media.background.color": "#282a36", + "theme.bar.menus.menu.media.album": "#ff79c6", + "theme.bar.menus.menu.media.artist": "#8be9fd", + "theme.bar.menus.menu.media.song": "#bd93f9", + "theme.bar.menus.tooltip.text": "#f8f8f2", + "theme.bar.menus.tooltip.background": "#282a36", + "theme.bar.menus.dropdownmenu.divider": "#44475a", + "theme.bar.menus.dropdownmenu.text": "#f8f8f2", + "theme.bar.menus.dropdownmenu.background": "#282a36", + "theme.bar.menus.slider.puck": "#44475a", + "theme.bar.menus.slider.backgroundhover": "#44475a", + "theme.bar.menus.slider.background": "#44475a", + "theme.bar.menus.slider.primary": "#bd93f9", + "theme.bar.menus.progressbar.background": "#44475a", + "theme.bar.menus.progressbar.foreground": "#bd93f9", + "theme.bar.menus.iconbuttons.active": "#bd93f9", + "theme.bar.menus.iconbuttons.passive": "#f8f8f2", + "theme.bar.menus.buttons.text": "#282a36", + "theme.bar.menus.buttons.disabled": "#44475a", + "theme.bar.menus.buttons.active": "#ff79c6", + "theme.bar.menus.buttons.default": "#bd93f9", + "theme.bar.menus.check_radio_button.active": "#bd93f9", + "theme.bar.menus.check_radio_button.background": "#282936", + "theme.bar.menus.switch.puck": "#44475a", + "theme.bar.menus.switch.disabled": "#44475a", + "theme.bar.menus.switch.enabled": "#bd93f9", + "theme.bar.menus.icons.active": "#bd93f9", + "theme.bar.menus.icons.passive": "#44475a", + "theme.bar.menus.listitems.active": "#bd93f9", + "theme.bar.menus.listitems.passive": "#f8f8f2", + "theme.bar.menus.popover.border": "#282a36", + "theme.bar.menus.popover.background": "#282a36", + "theme.bar.menus.popover.text": "#bd93f9", + "theme.bar.menus.label": "#bd93f9", + "theme.bar.menus.feinttext": "#44475a", + "theme.bar.menus.dimtext": "#6272a4", + "theme.bar.menus.text": "#f8f8f2", + "theme.bar.menus.border.color": "#44475a", + "theme.bar.menus.cards": "#44475a", + "theme.bar.menus.background": "#6272a4", + "theme.bar.buttons.modules.power.icon_background": "#bd93f9", + "theme.bar.buttons.modules.power.icon": "#ff5454", + "theme.bar.buttons.modules.power.background": "#44475a", + "theme.bar.buttons.modules.power.border": "#bd93f9", + "theme.bar.buttons.modules.weather.icon_background": "#ffb86c", + "theme.bar.buttons.modules.weather.icon": "#ffb86c", + "theme.bar.buttons.modules.weather.text": "#ffb86c", + "theme.bar.buttons.modules.weather.background": "#44475a", + "theme.bar.buttons.modules.weather.border": "#ffb86c", + "theme.bar.buttons.modules.updates.icon_background": "#bd93f9", + "theme.bar.buttons.modules.updates.icon": "#bd93f9", + "theme.bar.buttons.modules.updates.text": "#bd93f9", + "theme.bar.buttons.modules.updates.background": "#44475a", + "theme.bar.buttons.modules.updates.border": "#bd93f9", + "theme.bar.buttons.modules.kbLayout.icon_background": "#8be9fd", + "theme.bar.buttons.modules.kbLayout.icon": "#8be9fd", + "theme.bar.buttons.modules.kbLayout.text": "#8be9fd", + "theme.bar.buttons.modules.kbLayout.background": "#44475a", + "theme.bar.buttons.modules.kbLayout.border": "#8be9fd", + "theme.bar.buttons.modules.netstat.icon_background": "#50fa7b", + "theme.bar.buttons.modules.netstat.icon": "#50fa7b", + "theme.bar.buttons.modules.netstat.text": "#50fa7b", + "theme.bar.buttons.modules.netstat.background": "#44475a", + "theme.bar.buttons.modules.netstat.border": "#50fa7b", + "theme.bar.buttons.modules.storage.icon_background": "#bd93f9", + "theme.bar.buttons.modules.storage.icon": "#bd93f9", + "theme.bar.buttons.modules.storage.text": "#bd93f9", + "theme.bar.buttons.modules.storage.background": "#44475a", + "theme.bar.buttons.modules.storage.border": "#bd93f9", + "theme.bar.buttons.modules.cpu.icon_background": "#ff79c6", + "theme.bar.buttons.modules.cpu.icon": "#ff79c6", + "theme.bar.buttons.modules.cpu.text": "#ff79c6", + "theme.bar.buttons.modules.cpu.background": "#44475a", + "theme.bar.buttons.modules.cpu.border": "#ff79c6", + "theme.bar.buttons.modules.ram.icon_background": "#f1fa8c", + "theme.bar.buttons.modules.ram.icon": "#f1fa8c", + "theme.bar.buttons.modules.ram.text": "#f1fa8c", + "theme.bar.buttons.modules.ram.background": "#44475a", + "theme.bar.buttons.modules.ram.border": "#f1fa8c", + "theme.bar.buttons.notifications.total": "#bd93f9", + "theme.bar.buttons.notifications.icon_background": "#bd93f9", + "theme.bar.buttons.notifications.icon": "#bd93f9", + "theme.bar.buttons.notifications.background": "#44475a", + "theme.bar.buttons.notifications.border": "#bd93f9", + "theme.bar.buttons.clock.icon_background": "#ff79c6", + "theme.bar.buttons.clock.icon": "#ff79c6", + "theme.bar.buttons.clock.text": "#ff79c6", + "theme.bar.buttons.clock.background": "#44475a", + "theme.bar.buttons.clock.border": "#ff79c6", + "theme.bar.buttons.battery.icon_background": "#f1fa8c", + "theme.bar.buttons.battery.icon": "#f1fa8c", + "theme.bar.buttons.battery.text": "#f1fa8c", + "theme.bar.buttons.battery.background": "#44475a", + "theme.bar.buttons.battery.border": "#f1fa8c", + "theme.bar.buttons.systray.background": "#44475a", + "theme.bar.buttons.systray.border": "#6272a4", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.buttons.bluetooth.icon": "#8be9fd", + "theme.bar.buttons.bluetooth.text": "#8be9fd", + "theme.bar.buttons.bluetooth.background": "#44475a", + "theme.bar.buttons.bluetooth.border": "#8be9fd", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.network.icon": "#bd93f9", + "theme.bar.buttons.network.text": "#bd93f9", + "theme.bar.buttons.network.background": "#44475a", + "theme.bar.buttons.network.border": "#bd93f9", + "theme.bar.buttons.volume.icon_background": "#ffb86c", + "theme.bar.buttons.volume.icon": "#ffb86c", + "theme.bar.buttons.volume.text": "#ffb86c", + "theme.bar.buttons.volume.background": "#44475a", + "theme.bar.buttons.volume.border": "#ffb86c", + "theme.bar.buttons.media.icon_background": "#bd93f9", + "theme.bar.buttons.media.icon": "#bd93f9", + "theme.bar.buttons.media.text": "#bd93f9", + "theme.bar.buttons.media.background": "#44475a", + "theme.bar.buttons.media.border": "#bd93f9", + "theme.bar.buttons.windowtitle.icon_background": "#ff79c6", + "theme.bar.buttons.windowtitle.icon": "#f1fa8c", + "theme.bar.buttons.windowtitle.text": "#f1fa8c", + "theme.bar.buttons.windowtitle.border": "#f1fa8c", + "theme.bar.buttons.windowtitle.background": "#44475a", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#e23ee2", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.hover": "#44475a", + "theme.bar.buttons.workspaces.active": "#ff79c6", + "theme.bar.buttons.workspaces.occupied": "#ffb86c", + "theme.bar.buttons.workspaces.available": "#8be9fd", + "theme.bar.buttons.workspaces.border": "#44475a", + "theme.bar.buttons.workspaces.background": "#44475a", + "theme.bar.buttons.dashboard.icon": "#8be8fd", + "theme.bar.buttons.dashboard.border": "#8be8fd", + "theme.bar.buttons.dashboard.background": "#44475a", + "theme.bar.buttons.icon": "#bd93f9", + "theme.bar.buttons.text": "#bd93f9", + "theme.bar.buttons.hover": "#44475a", + "theme.bar.buttons.icon_background": "#44475a", + "theme.bar.buttons.background": "#282936", + "theme.bar.buttons.style": "default", + "theme.bar.background": "#282a36", + "theme.osd.label": "#bd93f9", + "theme.osd.icon": "#282a36", + "theme.osd.bar_overflow_color": "#ff5555", + "theme.osd.bar_empty_color": "#44475a", + "theme.osd.bar_color": "#bd93f9", + "theme.osd.icon_container": "#bd93f9", + "theme.osd.bar_container": "#282a36", + "theme.notification.close_button.label": "#282a36", + "theme.notification.close_button.background": "#bd93f9", + "theme.notification.labelicon": "#bd93f9", + "theme.notification.text": "#f8f8f2", + "theme.notification.time": "#6272a4", + "theme.notification.border": "#44475a", + "theme.notification.label": "#bd93f9", + "theme.notification.actions.text": "#282a36", + "theme.notification.actions.background": "#bd93f9", + "theme.notification.background": "#282a36", + "theme.bar.buttons.modules.submap.background": "#44475a", + "theme.bar.buttons.modules.submap.text": "#8be9fd", + "theme.bar.buttons.modules.submap.border": "#8be9fd", + "theme.bar.buttons.modules.submap.icon": "#8be9fd", + "theme.bar.buttons.modules.submap.icon_background": "#44475a" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/dracula_split.json b/ags/HyprPanel/themes/dracula_split.json new file mode 100644 index 0000000..5c5263c --- /dev/null +++ b/ags/HyprPanel/themes/dracula_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#bd93f9", + "theme.bar.menus.menu.notifications.pager.label": "#6272a4", + "theme.bar.menus.menu.notifications.pager.button": "#bd93f9", + "theme.bar.menus.menu.notifications.pager.background": "#282936", + "theme.bar.menus.menu.notifications.switch.puck": "#44475a", + "theme.bar.menus.menu.notifications.switch.disabled": "#44475a", + "theme.bar.menus.menu.notifications.switch.enabled": "#bd93f9", + "theme.bar.menus.menu.notifications.clear": "#bd93f9", + "theme.bar.menus.menu.notifications.switch_divider": "#44475a", + "theme.bar.menus.menu.notifications.border": "#44475a", + "theme.bar.menus.menu.notifications.card": "#44475a", + "theme.bar.menus.menu.notifications.background": "#282a36", + "theme.bar.menus.menu.notifications.no_notifications_label": "#44475a", + "theme.bar.menus.menu.notifications.label": "#bd93f9", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.sleep.text": "#8be9fd", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#8be9fd", + "theme.bar.menus.menu.power.buttons.sleep.background": "#44475a", + "theme.bar.menus.menu.power.buttons.logout.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.logout.text": "#50fa7b", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#50fa7b", + "theme.bar.menus.menu.power.buttons.logout.background": "#44475a", + "theme.bar.menus.menu.power.buttons.restart.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.restart.text": "#ffb86c", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#ffb86c", + "theme.bar.menus.menu.power.buttons.restart.background": "#44475a", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#282a36", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#ff5454", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#ff5555", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#44475a", + "theme.bar.menus.menu.power.border.color": "#44475a", + "theme.bar.menus.menu.power.background.color": "#282936", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#ff79c6", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#ff79c6", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#ff79c6", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#50fa7b", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#50fa7b", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#50fa7b", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f1fa8c", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f1fa8c", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f1fa8c", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ffb86c", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ffb86c", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ffb86c", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#6272a4", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#ffb86c", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#bd93f9", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8be9fd", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ff5555", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f1fa8c", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#ff79c6", + "theme.bar.menus.menu.dashboard.controls.input.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.input.background": "#ff79c6", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ffb86c", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f1fa8c", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#8be9fd", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#282a36", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#bd93f9", + "theme.bar.menus.menu.dashboard.controls.disabled": "#44475a", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#50fa7b", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#282a36", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#bd93f9", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#282a36", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#ff5555", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#50fa7b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#f8f8f2", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#bd93f9", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#44475a", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#282a36", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#44475a", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#8be9fd", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#50fa7b", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#ffb86c", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#ff5555", + "theme.bar.menus.menu.dashboard.profile.name": "#ff79c6", + "theme.bar.menus.menu.dashboard.border.color": "#44475a", + "theme.bar.menus.menu.dashboard.background.color": "#282a36", + "theme.bar.menus.menu.dashboard.card.color": "#44475a", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#ff79c6", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#ff79c6", + "theme.bar.menus.menu.clock.weather.hourly.time": "#ff79c6", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#8be9fd", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#8be9fd", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#bd93f9", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#ffb86c", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#ff5555", + "theme.bar.menus.menu.clock.weather.stats": "#ff79c6", + "theme.bar.menus.menu.clock.weather.status": "#8be9fd", + "theme.bar.menus.menu.clock.weather.temperature": "#f8f8f2", + "theme.bar.menus.menu.clock.weather.icon": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.contextdays": "#44475a", + "theme.bar.menus.menu.clock.calendar.days": "#f8f8f2", + "theme.bar.menus.menu.clock.calendar.currentday": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.paginator": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#ff79c6", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8be9fd", + "theme.bar.menus.menu.clock.time.timeperiod": "#8be9fd", + "theme.bar.menus.menu.clock.time.time": "#ff79c6", + "theme.bar.menus.menu.clock.text": "#f8f8f2", + "theme.bar.menus.menu.clock.border.color": "#44475a", + "theme.bar.menus.menu.clock.background.color": "#282a36", + "theme.bar.menus.menu.clock.card.color": "#44475a", + "theme.bar.menus.menu.battery.slider.puck": "#282936", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.battery.slider.background": "#6272a4", + "theme.bar.menus.menu.battery.slider.primary": "#f1fa8c", + "theme.bar.menus.menu.battery.icons.active": "#f1fa8c", + "theme.bar.menus.menu.battery.icons.passive": "#6272a4", + "theme.bar.menus.menu.battery.listitems.active": "#f1fa8c", + "theme.bar.menus.menu.battery.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.battery.text": "#f8f8f2", + "theme.bar.menus.menu.battery.label.color": "#f1fa8c", + "theme.bar.menus.menu.battery.border.color": "#44475a", + "theme.bar.menus.menu.battery.background.color": "#282a36", + "theme.bar.menus.menu.battery.card.color": "#44475a", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#44475a", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#f8f8f2", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#282a36", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#8be9fd", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#f8f8f2", + "theme.bar.menus.menu.bluetooth.icons.active": "#8be9fd", + "theme.bar.menus.menu.bluetooth.icons.passive": "#6272a4", + "theme.bar.menus.menu.bluetooth.listitems.active": "#8be9fd", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.bluetooth.switch.puck": "#44475a", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#44475a", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#8be9fd", + "theme.bar.menus.menu.bluetooth.switch_divider": "#44475a", + "theme.bar.menus.menu.bluetooth.status": "#44475a", + "theme.bar.menus.menu.bluetooth.text": "#f8f8f2", + "theme.bar.menus.menu.bluetooth.label.color": "#8be9fd", + "theme.bar.menus.menu.bluetooth.border.color": "#44475a", + "theme.bar.menus.menu.bluetooth.background.color": "#282a36", + "theme.bar.menus.menu.bluetooth.card.color": "#44475a", + "theme.bar.menus.menu.network.iconbuttons.active": "#bd93f9", + "theme.bar.menus.menu.network.iconbuttons.passive": "#f8f8f2", + "theme.bar.menus.menu.network.icons.active": "#bd93f9", + "theme.bar.menus.menu.network.icons.passive": "#6272a4", + "theme.bar.menus.menu.network.listitems.active": "#bd93f9", + "theme.bar.menus.menu.network.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.network.status.color": "#44475a", + "theme.bar.menus.menu.network.text": "#f8f8f2", + "theme.bar.menus.menu.network.label.color": "#bd93f9", + "theme.bar.menus.menu.network.border.color": "#44475a", + "theme.bar.menus.menu.network.background.color": "#282a36", + "theme.bar.menus.menu.network.card.color": "#44475a", + "theme.bar.menus.menu.volume.input_slider.puck": "#282936", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.volume.input_slider.background": "#6272a4", + "theme.bar.menus.menu.volume.input_slider.primary": "#ffb86c", + "theme.bar.menus.menu.volume.audio_slider.puck": "#282936", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.volume.audio_slider.background": "#6272a4", + "theme.bar.menus.menu.volume.audio_slider.primary": "#ffb86c", + "theme.bar.menus.menu.volume.icons.active": "#ffb86c", + "theme.bar.menus.menu.volume.icons.passive": "#6272a4", + "theme.bar.menus.menu.volume.iconbutton.active": "#ffb86c", + "theme.bar.menus.menu.volume.iconbutton.passive": "#f8f8f2", + "theme.bar.menus.menu.volume.listitems.active": "#ffb86c", + "theme.bar.menus.menu.volume.listitems.passive": "#f8f8f2", + "theme.bar.menus.menu.volume.text": "#f8f8f2", + "theme.bar.menus.menu.volume.label.color": "#ffb86c", + "theme.bar.menus.menu.volume.border.color": "#44475a", + "theme.bar.menus.menu.volume.background.color": "#282a36", + "theme.bar.menus.menu.volume.card.color": "#44475a", + "theme.bar.menus.menu.media.slider.puck": "#282936", + "theme.bar.menus.menu.media.slider.backgroundhover": "#6272a4", + "theme.bar.menus.menu.media.slider.background": "#6272a4", + "theme.bar.menus.menu.media.slider.primary": "#ff79c6", + "theme.bar.menus.menu.media.buttons.text": "#282a36", + "theme.bar.menus.menu.media.buttons.background": "#bd93f9", + "theme.bar.menus.menu.media.buttons.enabled": "#8be9fd", + "theme.bar.menus.menu.media.buttons.inactive": "#44475a", + "theme.bar.menus.menu.media.border.color": "#44475a", + "theme.bar.menus.menu.media.card.color": "#44475a", + "theme.bar.menus.menu.media.background.color": "#282a36", + "theme.bar.menus.menu.media.album": "#ff79c6", + "theme.bar.menus.menu.media.artist": "#8be9fd", + "theme.bar.menus.menu.media.song": "#bd93f9", + "theme.bar.menus.tooltip.text": "#f8f8f2", + "theme.bar.menus.tooltip.background": "#282a36", + "theme.bar.menus.dropdownmenu.divider": "#44475a", + "theme.bar.menus.dropdownmenu.text": "#f8f8f2", + "theme.bar.menus.dropdownmenu.background": "#282a36", + "theme.bar.menus.slider.puck": "#44475a", + "theme.bar.menus.slider.backgroundhover": "#44475a", + "theme.bar.menus.slider.background": "#44475a", + "theme.bar.menus.slider.primary": "#bd93f9", + "theme.bar.menus.progressbar.background": "#44475a", + "theme.bar.menus.progressbar.foreground": "#bd93f9", + "theme.bar.menus.iconbuttons.active": "#bd93f9", + "theme.bar.menus.iconbuttons.passive": "#f8f8f2", + "theme.bar.menus.buttons.text": "#282a36", + "theme.bar.menus.buttons.disabled": "#44475a", + "theme.bar.menus.buttons.active": "#ff79c6", + "theme.bar.menus.buttons.default": "#bd93f9", + "theme.bar.menus.check_radio_button.active": "#bd93f9", + "theme.bar.menus.check_radio_button.background": "#282936", + "theme.bar.menus.switch.puck": "#44475a", + "theme.bar.menus.switch.disabled": "#44475a", + "theme.bar.menus.switch.enabled": "#bd93f9", + "theme.bar.menus.icons.active": "#bd93f9", + "theme.bar.menus.icons.passive": "#44475a", + "theme.bar.menus.listitems.active": "#bd93f9", + "theme.bar.menus.listitems.passive": "#f8f8f2", + "theme.bar.menus.popover.border": "#282a36", + "theme.bar.menus.popover.background": "#282a36", + "theme.bar.menus.popover.text": "#bd93f9", + "theme.bar.menus.label": "#bd93f9", + "theme.bar.menus.feinttext": "#44475a", + "theme.bar.menus.dimtext": "#6272a4", + "theme.bar.menus.text": "#f8f8f2", + "theme.bar.menus.border.color": "#44475a", + "theme.bar.menus.cards": "#44475a", + "theme.bar.menus.background": "#6272a4", + "theme.bar.buttons.modules.power.icon_background": "#ff5454", + "theme.bar.buttons.modules.power.icon": "#282936", + "theme.bar.buttons.modules.power.background": "#44475a", + "theme.bar.buttons.modules.power.border": "#bd93f9", + "theme.bar.buttons.modules.weather.icon_background": "#ffb86c", + "theme.bar.buttons.modules.weather.icon": "#282936", + "theme.bar.buttons.modules.weather.text": "#ffb86c", + "theme.bar.buttons.modules.weather.background": "#44475a", + "theme.bar.buttons.modules.weather.border": "#ffb86c", + "theme.bar.buttons.modules.updates.icon_background": "#bd93f9", + "theme.bar.buttons.modules.updates.icon": "#282936", + "theme.bar.buttons.modules.updates.text": "#bd93f9", + "theme.bar.buttons.modules.updates.background": "#44475a", + "theme.bar.buttons.modules.updates.border": "#bd93f9", + "theme.bar.buttons.modules.kbLayout.icon_background": "#8be9fd", + "theme.bar.buttons.modules.kbLayout.icon": "#282936", + "theme.bar.buttons.modules.kbLayout.text": "#8be9fd", + "theme.bar.buttons.modules.kbLayout.background": "#44475a", + "theme.bar.buttons.modules.kbLayout.border": "#8be9fd", + "theme.bar.buttons.modules.netstat.icon_background": "#50fa7b", + "theme.bar.buttons.modules.netstat.icon": "#282936", + "theme.bar.buttons.modules.netstat.text": "#50fa7b", + "theme.bar.buttons.modules.netstat.background": "#44475a", + "theme.bar.buttons.modules.netstat.border": "#50fa7b", + "theme.bar.buttons.modules.storage.icon_background": "#bd93f9", + "theme.bar.buttons.modules.storage.icon": "#282936", + "theme.bar.buttons.modules.storage.text": "#bd93f9", + "theme.bar.buttons.modules.storage.background": "#44475a", + "theme.bar.buttons.modules.storage.border": "#bd93f9", + "theme.bar.buttons.modules.cpu.icon_background": "#ff79c6", + "theme.bar.buttons.modules.cpu.icon": "#282936", + "theme.bar.buttons.modules.cpu.text": "#ff79c6", + "theme.bar.buttons.modules.cpu.background": "#44475a", + "theme.bar.buttons.modules.cpu.border": "#ff79c6", + "theme.bar.buttons.modules.ram.icon_background": "#f1fa8c", + "theme.bar.buttons.modules.ram.icon": "#282936", + "theme.bar.buttons.modules.ram.text": "#f1fa8c", + "theme.bar.buttons.modules.ram.background": "#44475a", + "theme.bar.buttons.modules.ram.border": "#f1fa8c", + "theme.bar.buttons.notifications.total": "#bd93f9", + "theme.bar.buttons.notifications.icon_background": "#bd93f9", + "theme.bar.buttons.notifications.icon": "#44475a", + "theme.bar.buttons.notifications.background": "#44475a", + "theme.bar.buttons.notifications.border": "#bd93f9", + "theme.bar.buttons.clock.icon_background": "#ff79c6", + "theme.bar.buttons.clock.icon": "#44475a", + "theme.bar.buttons.clock.text": "#ff79c6", + "theme.bar.buttons.clock.background": "#44475a", + "theme.bar.buttons.clock.border": "#ff79c6", + "theme.bar.buttons.battery.icon_background": "#f1fa8c", + "theme.bar.buttons.battery.icon": "#44475a", + "theme.bar.buttons.battery.text": "#f1fa8c", + "theme.bar.buttons.battery.background": "#44475a", + "theme.bar.buttons.battery.border": "#f1fa8c", + "theme.bar.buttons.systray.background": "#44475a", + "theme.bar.buttons.systray.border": "#6272a4", + "theme.bar.buttons.bluetooth.icon_background": "#8be9fd", + "theme.bar.buttons.bluetooth.icon": "#44475a", + "theme.bar.buttons.bluetooth.text": "#8be9fd", + "theme.bar.buttons.bluetooth.background": "#44475a", + "theme.bar.buttons.bluetooth.border": "#8be9fd", + "theme.bar.buttons.network.icon_background": "#bd93f9", + "theme.bar.buttons.network.icon": "#44475a", + "theme.bar.buttons.network.text": "#bd93f9", + "theme.bar.buttons.network.background": "#44475a", + "theme.bar.buttons.network.border": "#bd93f9", + "theme.bar.buttons.volume.icon_background": "#ffb86c", + "theme.bar.buttons.volume.icon": "#44475a", + "theme.bar.buttons.volume.text": "#ffb86c", + "theme.bar.buttons.volume.background": "#44475a", + "theme.bar.buttons.volume.border": "#ffb86c", + "theme.bar.buttons.media.icon_background": "#bd93f9", + "theme.bar.buttons.media.icon": "#44475a", + "theme.bar.buttons.media.text": "#bd93f9", + "theme.bar.buttons.media.background": "#44475a", + "theme.bar.buttons.media.border": "#bd93f9", + "theme.bar.buttons.windowtitle.icon_background": "#f1fa8c", + "theme.bar.buttons.windowtitle.icon": "#44475a", + "theme.bar.buttons.windowtitle.text": "#f1fa8c", + "theme.bar.buttons.windowtitle.border": "#f1fa8c", + "theme.bar.buttons.windowtitle.background": "#44475a", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ff79c6", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#ff79c6", + "theme.bar.buttons.workspaces.hover": "#ff79c6", + "theme.bar.buttons.workspaces.active": "#ff79c6", + "theme.bar.buttons.workspaces.occupied": "#ffb86c", + "theme.bar.buttons.workspaces.available": "#8be9fd", + "theme.bar.buttons.workspaces.border": "#44475a", + "theme.bar.buttons.workspaces.background": "#44475a", + "theme.bar.buttons.dashboard.icon": "#44475a", + "theme.bar.buttons.dashboard.border": "#8be8fd", + "theme.bar.buttons.dashboard.background": "#8be8fd", + "theme.bar.buttons.icon": "#bd93f9", + "theme.bar.buttons.text": "#bd93f9", + "theme.bar.buttons.hover": "#44475a", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.background": "#282936", + "theme.bar.buttons.style": "split", + "theme.bar.background": "#282a36", + "theme.osd.label": "#bd93f9", + "theme.osd.icon": "#282a36", + "theme.osd.bar_overflow_color": "#ff5555", + "theme.osd.bar_empty_color": "#44475a", + "theme.osd.bar_color": "#bd93f9", + "theme.osd.icon_container": "#bd93f9", + "theme.osd.bar_container": "#282a36", + "theme.notification.close_button.label": "#282a36", + "theme.notification.close_button.background": "#bd93f9", + "theme.notification.labelicon": "#bd93f9", + "theme.notification.text": "#f8f8f2", + "theme.notification.time": "#6272a4", + "theme.notification.border": "#44475a", + "theme.notification.label": "#bd93f9", + "theme.notification.actions.text": "#282a36", + "theme.notification.actions.background": "#bd93f9", + "theme.notification.background": "#44475a", + "theme.bar.buttons.modules.submap.background": "#44475a", + "theme.bar.buttons.modules.submap.text": "#8be9fd", + "theme.bar.buttons.modules.submap.border": "#8be9fd", + "theme.bar.buttons.modules.submap.icon": "#282936", + "theme.bar.buttons.modules.submap.icon_background": "#8be9fd" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/everforest.json b/ags/HyprPanel/themes/everforest.json new file mode 100644 index 0000000..4789eb4 --- /dev/null +++ b/ags/HyprPanel/themes/everforest.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#2b3339", + "theme.bar.background": "#2b3339", + "theme.bar.buttons.media.icon": "#a7c080", + "theme.bar.buttons.media.text": "#a7c080", + "theme.bar.buttons.icon": "#a7c080", + "theme.bar.buttons.text": "#a7c080", + "theme.bar.buttons.hover": "#445055", + "theme.bar.buttons.background": "#323d43", + "theme.bar.menus.text": "#d3c6aa", + "theme.bar.menus.border.color": "#454b53", + "theme.bar.buttons.media.background": "#323d43", + "theme.bar.menus.menu.volume.text": "#d3c6aa", + "theme.bar.menus.menu.volume.card.color": "#2f383e", + "theme.bar.menus.menu.volume.label.color": "#e67e80", + "theme.bar.menus.popover.text": "#a7c080", + "theme.bar.menus.popover.background": "#3a4248", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#e67e80", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#e67e80", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#2b3339", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#d3c6aa", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#454b53", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#2b3339", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#2f383e", + "theme.bar.menus.menu.notifications.switch.puck": "#445055", + "theme.bar.menus.menu.notifications.switch.disabled": "#454b54", + "theme.bar.menus.menu.notifications.switch.enabled": "#a7c080", + "theme.bar.menus.menu.notifications.clear": "#e67e80", + "theme.bar.menus.menu.notifications.switch_divider": "#445055", + "theme.bar.menus.menu.notifications.border": "#454b53", + "theme.bar.menus.menu.notifications.card": "#2f383e", + "theme.bar.menus.menu.notifications.background": "#2b3339", + "theme.bar.menus.menu.notifications.no_notifications_label": "#454b53", + "theme.bar.menus.menu.notifications.label": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#d699b6", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#d699b6", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#d699b6", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#dbbc7f", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#dbbc7f", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#dbbc7f", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#e67e80", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#e67e80", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#e67e80", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#445055", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#a7c080", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#83c092", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#a7c080", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#e67e80", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#dbbc7f", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#d699b6", + "theme.bar.menus.menu.dashboard.controls.input.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.input.background": "#d699b6", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#e67e80", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#dbbc7f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#83c092", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#83c092", + "theme.bar.menus.menu.dashboard.controls.disabled": "#5c6a72", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a7c080", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#3a4248", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#83c092", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#dbbc7f", + "theme.bar.menus.menu.dashboard.profile.name": "#d699b6", + "theme.bar.menus.menu.dashboard.border.color": "#454b53", + "theme.bar.menus.menu.dashboard.background.color": "#2b3339", + "theme.bar.menus.menu.dashboard.card.color": "#2f383e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#d699b6", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#d699b6", + "theme.bar.menus.menu.clock.weather.hourly.time": "#d699b6", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#83c092", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#83c092", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#a7c080", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#dbbc7f", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#e67e80", + "theme.bar.menus.menu.clock.weather.stats": "#d699b6", + "theme.bar.menus.menu.clock.weather.status": "#83c092", + "theme.bar.menus.menu.clock.weather.temperature": "#d3c6aa", + "theme.bar.menus.menu.clock.weather.icon": "#d699b6", + "theme.bar.menus.menu.clock.calendar.contextdays": "#5c6a72", + "theme.bar.menus.menu.clock.calendar.days": "#d3c6aa", + "theme.bar.menus.menu.clock.calendar.currentday": "#d699b6", + "theme.bar.menus.menu.clock.calendar.paginator": "#d699b6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#d699b6", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#83c092", + "theme.bar.menus.menu.clock.time.timeperiod": "#83c092", + "theme.bar.menus.menu.clock.time.time": "#d699b6", + "theme.bar.menus.menu.clock.text": "#d3c6aa", + "theme.bar.menus.menu.clock.border.color": "#454b53", + "theme.bar.menus.menu.clock.background.color": "#2b3339", + "theme.bar.menus.menu.clock.card.color": "#2f383e", + "theme.bar.menus.menu.battery.slider.puck": "#445055", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#445055", + "theme.bar.menus.menu.battery.slider.background": "#5c6a72", + "theme.bar.menus.menu.battery.slider.primary": "#dbbc7f", + "theme.bar.menus.menu.battery.icons.active": "#dbbc7f", + "theme.bar.menus.menu.battery.icons.passive": "#7a8478", + "theme.bar.menus.menu.battery.listitems.active": "#dbbc7f", + "theme.bar.menus.menu.battery.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.battery.text": "#d3c6aa", + "theme.bar.menus.menu.battery.label.color": "#dbbc7f", + "theme.bar.menus.menu.battery.border.color": "#454b53", + "theme.bar.menus.menu.battery.background.color": "#2b3339", + "theme.bar.menus.menu.battery.card.color": "#2f383e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#2f383e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#d3c6aa", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#2b3339", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#a7c080", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#d3c6aa", + "theme.bar.menus.menu.bluetooth.icons.active": "#a7c080", + "theme.bar.menus.menu.bluetooth.icons.passive": "#868d80", + "theme.bar.menus.menu.bluetooth.listitems.active": "#a7c07f", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.bluetooth.switch.puck": "#454b53", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#2f383e", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#a7c080", + "theme.bar.menus.menu.bluetooth.switch_divider": "#454b53", + "theme.bar.menus.menu.bluetooth.status": "#868d80", + "theme.bar.menus.menu.bluetooth.text": "#d3c6aa", + "theme.bar.menus.menu.bluetooth.label.color": "#a7c080", + "theme.bar.menus.menu.bluetooth.border.color": "#2f383e", + "theme.bar.menus.menu.bluetooth.background.color": "#2b3339", + "theme.bar.menus.menu.bluetooth.card.color": "#2f383e", + "theme.bar.menus.menu.network.iconbuttons.active": "#e69875", + "theme.bar.menus.menu.network.iconbuttons.passive": "#d3c6aa", + "theme.bar.menus.menu.network.icons.active": "#e69875", + "theme.bar.menus.menu.network.icons.passive": "#868d80", + "theme.bar.menus.menu.network.listitems.active": "#e69874", + "theme.bar.menus.menu.network.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.network.status.color": "#868d80", + "theme.bar.menus.menu.network.text": "#d3c6aa", + "theme.bar.menus.menu.network.label.color": "#e69875", + "theme.bar.menus.menu.network.border.color": "#2f383e", + "theme.bar.menus.menu.network.background.color": "#2b3339", + "theme.bar.menus.menu.network.card.color": "#2f383e", + "theme.bar.menus.menu.volume.input_slider.puck": "#83c092", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#454b53", + "theme.bar.menus.menu.volume.input_slider.background": "#83c093", + "theme.bar.menus.menu.volume.input_slider.primary": "#dbbc7f", + "theme.bar.menus.menu.volume.audio_slider.puck": "#83c092", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#454b53", + "theme.bar.menus.menu.volume.audio_slider.background": "#83c093", + "theme.bar.menus.menu.volume.audio_slider.primary": "#dbbc7f", + "theme.bar.menus.menu.volume.icons.active": "#dbbc7f", + "theme.bar.menus.menu.volume.icons.passive": "#868d80", + "theme.bar.menus.menu.volume.iconbutton.active": "#dbbc7f", + "theme.bar.menus.menu.volume.iconbutton.passive": "#d3c6aa", + "theme.bar.menus.menu.volume.listitems.active": "#dbbc7e", + "theme.bar.menus.menu.volume.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.volume.border.color": "#2f383e", + "theme.bar.menus.menu.volume.background.color": "#2b3339", + "theme.bar.menus.menu.media.slider.puck": "#868d80", + "theme.bar.menus.menu.media.slider.backgroundhover": "#454b53", + "theme.bar.menus.menu.media.slider.background": "#83c093", + "theme.bar.menus.menu.media.slider.primary": "#a7c080", + "theme.bar.menus.menu.media.buttons.text": "#2b3339", + "theme.bar.menus.menu.media.buttons.background": "#83c092", + "theme.bar.menus.menu.media.buttons.enabled": "#a7c080", + "theme.bar.menus.menu.media.buttons.inactive": "#83c092", + "theme.bar.menus.menu.media.border.color": "#2f383e", + "theme.bar.menus.menu.media.background.color": "#2b3339", + "theme.bar.menus.menu.media.album": "#a7c080", + "theme.bar.menus.menu.media.artist": "#a7c080", + "theme.bar.menus.menu.media.song": "#83c092", + "theme.bar.menus.tooltip.text": "#d3c6aa", + "theme.bar.menus.tooltip.background": "#2b3339", + "theme.bar.menus.dropdownmenu.divider": "#2f383e", + "theme.bar.menus.dropdownmenu.text": "#d3c6aa", + "theme.bar.menus.dropdownmenu.background": "#2b3339", + "theme.bar.menus.slider.puck": "#868d80", + "theme.bar.menus.slider.backgroundhover": "#454b53", + "theme.bar.menus.slider.background": "#83c093", + "theme.bar.menus.slider.primary": "#83c092", + "theme.bar.menus.progressbar.background": "#454b53", + "theme.bar.menus.progressbar.foreground": "#83c092", + "theme.bar.menus.iconbuttons.active": "#83c092", + "theme.bar.menus.iconbuttons.passive": "#d3c6aa", + "theme.bar.menus.buttons.text": "#2b3339", + "theme.bar.menus.buttons.disabled": "#83c093", + "theme.bar.menus.buttons.active": "#a7c080", + "theme.bar.menus.buttons.default": "#83c092", + "theme.bar.menus.switch.puck": "#454b53", + "theme.bar.menus.switch.disabled": "#2f383e", + "theme.bar.menus.switch.enabled": "#83c092", + "theme.bar.menus.icons.active": "#83c092", + "theme.bar.menus.icons.passive": "#83c092", + "theme.bar.menus.listitems.active": "#83c091", + "theme.bar.menus.listitems.passive": "#d3c6aa", + "theme.bar.menus.label": "#83c092", + "theme.bar.menus.feinttext": "#2f383e", + "theme.bar.menus.dimtext": "#83c092", + "theme.bar.menus.cards": "#2f383e", + "theme.bar.buttons.notifications.total": "#83c092", + "theme.bar.buttons.notifications.icon": "#83c092", + "theme.bar.buttons.notifications.background": "#323d43", + "theme.bar.buttons.clock.icon": "#dbbc7f", + "theme.bar.buttons.clock.text": "#dbbc7f", + "theme.bar.buttons.clock.background": "#323d43", + "theme.bar.buttons.battery.icon": "#e69875", + "theme.bar.buttons.battery.text": "#e69875", + "theme.bar.buttons.battery.background": "#323d43", + "theme.bar.buttons.systray.background": "#323d43", + "theme.bar.buttons.bluetooth.icon": "#a7c080", + "theme.bar.buttons.bluetooth.text": "#a7c080", + "theme.bar.buttons.bluetooth.background": "#323d43", + "theme.bar.buttons.network.icon": "#e69875", + "theme.bar.buttons.network.text": "#e69875", + "theme.bar.buttons.network.background": "#323d43", + "theme.bar.buttons.volume.icon": "#dbbc7f", + "theme.bar.buttons.volume.text": "#dbbc7f", + "theme.bar.buttons.volume.background": "#323d43", + "theme.bar.buttons.windowtitle.icon": "#dbbc7f", + "theme.bar.buttons.windowtitle.text": "#dbbc7f", + "theme.bar.buttons.windowtitle.background": "#323d43", + "theme.bar.buttons.workspaces.active": "#dbbc7f", + "theme.bar.buttons.workspaces.occupied": "#e69875", + "theme.bar.buttons.workspaces.available": "#a7c080", + "theme.bar.buttons.workspaces.hover": "#454b53", + "theme.bar.buttons.workspaces.background": "#323d43", + "theme.bar.buttons.dashboard.icon": "#e69875", + "theme.bar.buttons.dashboard.background": "#323d43", + "theme.osd.label": "#d3c6aa", + "theme.osd.icon": "#2b3339", + "theme.osd.bar_overflow_color": "#e67e80", + "theme.osd.bar_empty_color": "#504945", + "theme.osd.bar_color": "#d3c6aa", + "theme.osd.icon_container": "#d3c6aa", + "theme.osd.bar_container": "#2b3339", + "theme.notification.close_button.label": "#2b3339", + "theme.notification.close_button.background": "#e67e80", + "theme.notification.labelicon": "#d3c6aa", + "theme.notification.text": "#d8caac", + "theme.notification.time": "#a89984", + "theme.notification.border": "#323d43", + "theme.notification.label": "#d3c6aa", + "theme.notification.actions.text": "#2b3339", + "theme.notification.actions.background": "#a7c080", + "theme.notification.background": "#2b3239", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.menus.menu.media.card.color": "#2f383e", + "theme.bar.menus.check_radio_button.background": "#000000", + "theme.bar.menus.check_radio_button.active": "#ffffff", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#a7c080", + "theme.bar.menus.menu.notifications.scrollbar.color": "#a7c080", + "theme.bar.menus.menu.notifications.pager.label": "#7a8478", + "theme.bar.menus.menu.notifications.pager.background": "#2b3339", + "theme.bar.buttons.clock.icon_background": "#d699b6", + "theme.bar.buttons.modules.ram.icon": "#dbbc7f", + "theme.bar.buttons.modules.storage.icon_background": "#e67e80", + "theme.bar.menus.popover.border": "#3a4248", + "theme.bar.buttons.volume.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#83c092", + "theme.bar.menus.menu.power.buttons.restart.text": "#dbbc7f", + "theme.bar.buttons.modules.updates.background": "#323d43", + "theme.bar.buttons.modules.storage.icon": "#e67e80", + "theme.bar.buttons.modules.netstat.background": "#323d43", + "theme.bar.buttons.modules.weather.icon": "#a7c080", + "theme.bar.buttons.modules.netstat.text": "#a7c080", + "theme.bar.buttons.modules.storage.background": "#323d43", + "theme.bar.buttons.modules.power.icon": "#e67e80", + "theme.bar.buttons.modules.storage.text": "#e67e80", + "theme.bar.buttons.modules.cpu.background": "#323d43", + "theme.bar.menus.menu.power.border.color": "#454b53", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.logout.icon": "#3a4248", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#dbbc7f", + "theme.bar.menus.menu.power.buttons.restart.icon": "#3a4248", + "theme.bar.buttons.modules.cpu.icon": "#e67e80", + "theme.bar.buttons.battery.icon_background": "#dbbc7f", + "theme.bar.buttons.modules.kbLayout.icon_background": "#83c092", + "theme.bar.buttons.modules.weather.text": "#a7c080", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#3a4248", + "theme.bar.menus.menu.power.buttons.sleep.text": "#83c092", + "theme.bar.buttons.modules.weather.icon_background": "#a7c080", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#2f383e", + "theme.bar.buttons.media.icon_background": "#a7c080", + "theme.bar.menus.menu.power.buttons.logout.background": "#2f383e", + "theme.bar.buttons.modules.kbLayout.icon": "#83c092", + "theme.bar.buttons.modules.ram.icon_background": "#dbbc7f", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#e67e80", + "theme.bar.menus.menu.power.buttons.sleep.background": "#2f383e", + "theme.bar.buttons.modules.ram.text": "#dbbc7f", + "theme.bar.menus.menu.power.buttons.logout.text": "#a7c080", + "theme.bar.buttons.modules.updates.icon_background": "#83c092", + "theme.bar.buttons.modules.kbLayout.background": "#323d43", + "theme.bar.buttons.modules.power.background": "#323d43", + "theme.bar.buttons.modules.weather.background": "#323d43", + "theme.bar.buttons.icon_background": "#323d43", + "theme.bar.menus.menu.power.background.color": "#2b3339", + "theme.bar.buttons.modules.ram.background": "#323d43", + "theme.bar.buttons.modules.netstat.icon": "#a7c080", + "theme.bar.buttons.windowtitle.icon_background": "#d699b6", + "theme.bar.buttons.modules.cpu.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a7c080", + "theme.bar.buttons.modules.updates.text": "#83c092", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#3a4248", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#2f383e", + "theme.bar.buttons.modules.updates.icon": "#83c092", + "theme.bar.buttons.modules.cpu.text": "#e67e80", + "theme.bar.buttons.modules.netstat.icon_background": "#a7c080", + "theme.bar.buttons.modules.kbLayout.text": "#83c092", + "theme.bar.buttons.notifications.icon_background": "#a7c080", + "theme.bar.buttons.modules.power.border": "#e67e80", + "theme.bar.buttons.modules.weather.border": "#a7c080", + "theme.bar.buttons.modules.updates.border": "#83c092", + "theme.bar.buttons.modules.kbLayout.border": "#83c092", + "theme.bar.buttons.modules.netstat.border": "#a7c080", + "theme.bar.buttons.modules.storage.border": "#e67e80", + "theme.bar.buttons.modules.cpu.border": "#e67e80", + "theme.bar.buttons.modules.ram.border": "#dbbc7f", + "theme.bar.buttons.notifications.border": "#83c092", + "theme.bar.buttons.clock.border": "#dbbc7f", + "theme.bar.buttons.battery.border": "#e69875", + "theme.bar.buttons.systray.border": "#454b53", + "theme.bar.buttons.bluetooth.border": "#a7c080", + "theme.bar.buttons.network.border": "#e69875", + "theme.bar.buttons.volume.border": "#dbbc7f", + "theme.bar.buttons.media.border": "#a7c080", + "theme.bar.buttons.windowtitle.border": "#dbbc7f", + "theme.bar.buttons.workspaces.border": "#2b3339", + "theme.bar.buttons.dashboard.border": "#e69875", + "theme.bar.buttons.modules.submap.background": "#323d43", + "theme.bar.buttons.modules.submap.text": "#83c092", + "theme.bar.buttons.modules.submap.border": "#83c092", + "theme.bar.buttons.modules.submap.icon": "#83c092", + "theme.bar.buttons.modules.submap.icon_background": "#323d43" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/everforest_split.json b/ags/HyprPanel/themes/everforest_split.json new file mode 100644 index 0000000..9f362f4 --- /dev/null +++ b/ags/HyprPanel/themes/everforest_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#2b3339", + "theme.bar.background": "#2b3339", + "theme.bar.buttons.media.icon": "#323d43", + "theme.bar.buttons.media.text": "#a7c080", + "theme.bar.buttons.icon": "#a7c080", + "theme.bar.buttons.text": "#a7c080", + "theme.bar.buttons.hover": "#445055", + "theme.bar.buttons.background": "#323d43", + "theme.bar.menus.text": "#d3c6aa", + "theme.bar.menus.border.color": "#454b53", + "theme.bar.buttons.media.background": "#323d43", + "theme.bar.menus.menu.volume.text": "#d3c6aa", + "theme.bar.menus.menu.volume.card.color": "#2f383e", + "theme.bar.menus.menu.volume.label.color": "#e67e80", + "theme.bar.menus.popover.text": "#a7c080", + "theme.bar.menus.popover.background": "#3a4248", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#e67e80", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#e67e80", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#2b3339", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#d3c6aa", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#454b53", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#2b3339", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#2f383e", + "theme.bar.menus.menu.notifications.switch.puck": "#445055", + "theme.bar.menus.menu.notifications.switch.disabled": "#454b54", + "theme.bar.menus.menu.notifications.switch.enabled": "#a7c080", + "theme.bar.menus.menu.notifications.clear": "#e67e80", + "theme.bar.menus.menu.notifications.switch_divider": "#445055", + "theme.bar.menus.menu.notifications.border": "#454b53", + "theme.bar.menus.menu.notifications.card": "#2f383e", + "theme.bar.menus.menu.notifications.background": "#2b3339", + "theme.bar.menus.menu.notifications.no_notifications_label": "#454b53", + "theme.bar.menus.menu.notifications.label": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#d699b6", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#d699b6", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#d699b6", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#a7c080", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#dbbc7f", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#dbbc7f", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#dbbc7f", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#e67e80", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#e67e80", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#e67e80", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#445055", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#a7c080", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#83c092", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#a7c080", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#e67e80", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#dbbc7f", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#d699b6", + "theme.bar.menus.menu.dashboard.controls.input.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.input.background": "#d699b6", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#e67e80", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#dbbc7f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#83c092", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#3a4248", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#83c092", + "theme.bar.menus.menu.dashboard.controls.disabled": "#5c6a72", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#a7c080", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#3a4248", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#83c092", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#a7c080", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#dbbc7f", + "theme.bar.menus.menu.dashboard.profile.name": "#d699b6", + "theme.bar.menus.menu.dashboard.border.color": "#454b53", + "theme.bar.menus.menu.dashboard.background.color": "#2b3339", + "theme.bar.menus.menu.dashboard.card.color": "#2f383e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#d699b6", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#d699b6", + "theme.bar.menus.menu.clock.weather.hourly.time": "#d699b6", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#83c092", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#83c092", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#a7c080", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#dbbc7f", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#e67e80", + "theme.bar.menus.menu.clock.weather.stats": "#d699b6", + "theme.bar.menus.menu.clock.weather.status": "#83c092", + "theme.bar.menus.menu.clock.weather.temperature": "#d3c6aa", + "theme.bar.menus.menu.clock.weather.icon": "#d699b6", + "theme.bar.menus.menu.clock.calendar.contextdays": "#5c6a72", + "theme.bar.menus.menu.clock.calendar.days": "#d3c6aa", + "theme.bar.menus.menu.clock.calendar.currentday": "#d699b6", + "theme.bar.menus.menu.clock.calendar.paginator": "#d699b6", + "theme.bar.menus.menu.clock.calendar.weekdays": "#d699b6", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#83c092", + "theme.bar.menus.menu.clock.time.timeperiod": "#83c092", + "theme.bar.menus.menu.clock.time.time": "#d699b6", + "theme.bar.menus.menu.clock.text": "#d3c6aa", + "theme.bar.menus.menu.clock.border.color": "#454b53", + "theme.bar.menus.menu.clock.background.color": "#2b3339", + "theme.bar.menus.menu.clock.card.color": "#2f383e", + "theme.bar.menus.menu.battery.slider.puck": "#445055", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#445055", + "theme.bar.menus.menu.battery.slider.background": "#5c6a72", + "theme.bar.menus.menu.battery.slider.primary": "#dbbc7f", + "theme.bar.menus.menu.battery.icons.active": "#dbbc7f", + "theme.bar.menus.menu.battery.icons.passive": "#7a8478", + "theme.bar.menus.menu.battery.listitems.active": "#dbbc7f", + "theme.bar.menus.menu.battery.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.battery.text": "#d3c6aa", + "theme.bar.menus.menu.battery.label.color": "#dbbc7f", + "theme.bar.menus.menu.battery.border.color": "#454b53", + "theme.bar.menus.menu.battery.background.color": "#2b3339", + "theme.bar.menus.menu.battery.card.color": "#2f383e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#2f383e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#d3c6aa", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#2b3339", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#a7c080", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#d3c6aa", + "theme.bar.menus.menu.bluetooth.icons.active": "#a7c080", + "theme.bar.menus.menu.bluetooth.icons.passive": "#868d80", + "theme.bar.menus.menu.bluetooth.listitems.active": "#a7c07f", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.bluetooth.switch.puck": "#454b53", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#2f383e", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#a7c080", + "theme.bar.menus.menu.bluetooth.switch_divider": "#454b53", + "theme.bar.menus.menu.bluetooth.status": "#868d80", + "theme.bar.menus.menu.bluetooth.text": "#d3c6aa", + "theme.bar.menus.menu.bluetooth.label.color": "#a7c080", + "theme.bar.menus.menu.bluetooth.border.color": "#2f383e", + "theme.bar.menus.menu.bluetooth.background.color": "#2b3339", + "theme.bar.menus.menu.bluetooth.card.color": "#2f383e", + "theme.bar.menus.menu.network.iconbuttons.active": "#e69875", + "theme.bar.menus.menu.network.iconbuttons.passive": "#d3c6aa", + "theme.bar.menus.menu.network.icons.active": "#e69875", + "theme.bar.menus.menu.network.icons.passive": "#868d80", + "theme.bar.menus.menu.network.listitems.active": "#e69874", + "theme.bar.menus.menu.network.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.network.status.color": "#868d80", + "theme.bar.menus.menu.network.text": "#d3c6aa", + "theme.bar.menus.menu.network.label.color": "#e69875", + "theme.bar.menus.menu.network.border.color": "#2f383e", + "theme.bar.menus.menu.network.background.color": "#2b3339", + "theme.bar.menus.menu.network.card.color": "#2f383e", + "theme.bar.menus.menu.volume.input_slider.puck": "#83c092", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#454b53", + "theme.bar.menus.menu.volume.input_slider.background": "#83c093", + "theme.bar.menus.menu.volume.input_slider.primary": "#dbbc7f", + "theme.bar.menus.menu.volume.audio_slider.puck": "#83c092", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#454b53", + "theme.bar.menus.menu.volume.audio_slider.background": "#83c093", + "theme.bar.menus.menu.volume.audio_slider.primary": "#dbbc7f", + "theme.bar.menus.menu.volume.icons.active": "#dbbc7f", + "theme.bar.menus.menu.volume.icons.passive": "#868d80", + "theme.bar.menus.menu.volume.iconbutton.active": "#dbbc7f", + "theme.bar.menus.menu.volume.iconbutton.passive": "#d3c6aa", + "theme.bar.menus.menu.volume.listitems.active": "#dbbc7e", + "theme.bar.menus.menu.volume.listitems.passive": "#d3c6aa", + "theme.bar.menus.menu.volume.border.color": "#2f383e", + "theme.bar.menus.menu.volume.background.color": "#2b3339", + "theme.bar.menus.menu.media.slider.puck": "#868d80", + "theme.bar.menus.menu.media.slider.backgroundhover": "#454b53", + "theme.bar.menus.menu.media.slider.background": "#83c093", + "theme.bar.menus.menu.media.slider.primary": "#a7c080", + "theme.bar.menus.menu.media.buttons.text": "#2b3339", + "theme.bar.menus.menu.media.buttons.background": "#83c092", + "theme.bar.menus.menu.media.buttons.enabled": "#a7c080", + "theme.bar.menus.menu.media.buttons.inactive": "#83c092", + "theme.bar.menus.menu.media.border.color": "#2f383e", + "theme.bar.menus.menu.media.background.color": "#2b3339", + "theme.bar.menus.menu.media.album": "#a7c080", + "theme.bar.menus.menu.media.artist": "#a7c080", + "theme.bar.menus.menu.media.song": "#83c092", + "theme.bar.menus.tooltip.text": "#d3c6aa", + "theme.bar.menus.tooltip.background": "#2b3339", + "theme.bar.menus.dropdownmenu.divider": "#2f383e", + "theme.bar.menus.dropdownmenu.text": "#d3c6aa", + "theme.bar.menus.dropdownmenu.background": "#2b3339", + "theme.bar.menus.slider.puck": "#868d80", + "theme.bar.menus.slider.backgroundhover": "#454b53", + "theme.bar.menus.slider.background": "#83c093", + "theme.bar.menus.slider.primary": "#83c092", + "theme.bar.menus.progressbar.background": "#454b53", + "theme.bar.menus.progressbar.foreground": "#83c092", + "theme.bar.menus.iconbuttons.active": "#83c092", + "theme.bar.menus.iconbuttons.passive": "#d3c6aa", + "theme.bar.menus.buttons.text": "#2b3339", + "theme.bar.menus.buttons.disabled": "#83c093", + "theme.bar.menus.buttons.active": "#a7c080", + "theme.bar.menus.buttons.default": "#83c092", + "theme.bar.menus.switch.puck": "#454b53", + "theme.bar.menus.switch.disabled": "#2f383e", + "theme.bar.menus.switch.enabled": "#83c092", + "theme.bar.menus.icons.active": "#83c092", + "theme.bar.menus.icons.passive": "#83c092", + "theme.bar.menus.listitems.active": "#83c091", + "theme.bar.menus.listitems.passive": "#d3c6aa", + "theme.bar.menus.label": "#83c092", + "theme.bar.menus.feinttext": "#2f383e", + "theme.bar.menus.dimtext": "#83c092", + "theme.bar.menus.cards": "#2f383e", + "theme.bar.buttons.notifications.total": "#83c092", + "theme.bar.buttons.notifications.icon": "#323d43", + "theme.bar.buttons.notifications.background": "#323d43", + "theme.bar.buttons.clock.icon": "#323d43", + "theme.bar.buttons.clock.text": "#dbbc7f", + "theme.bar.buttons.clock.background": "#323d43", + "theme.bar.buttons.battery.icon": "#323d43", + "theme.bar.buttons.battery.text": "#e69875", + "theme.bar.buttons.battery.background": "#323d43", + "theme.bar.buttons.systray.background": "#323d43", + "theme.bar.buttons.bluetooth.icon": "#323d43", + "theme.bar.buttons.bluetooth.text": "#a7c080", + "theme.bar.buttons.bluetooth.background": "#323d43", + "theme.bar.buttons.network.icon": "#323d43", + "theme.bar.buttons.network.text": "#e69875", + "theme.bar.buttons.network.background": "#323d43", + "theme.bar.buttons.volume.icon": "#323d43", + "theme.bar.buttons.volume.text": "#dbbc7f", + "theme.bar.buttons.volume.background": "#323d43", + "theme.bar.buttons.windowtitle.icon": "#323d43", + "theme.bar.buttons.windowtitle.text": "#dbbc7f", + "theme.bar.buttons.windowtitle.background": "#323d43", + "theme.bar.buttons.workspaces.active": "#dbbc7f", + "theme.bar.buttons.workspaces.occupied": "#e69875", + "theme.bar.buttons.workspaces.available": "#a7c080", + "theme.bar.buttons.workspaces.hover": "#dbbc7f", + "theme.bar.buttons.workspaces.background": "#323d43", + "theme.bar.buttons.dashboard.icon": "#323d43", + "theme.bar.buttons.dashboard.background": "#e69875", + "theme.osd.label": "#d3c6aa", + "theme.osd.icon": "#2b3339", + "theme.osd.bar_overflow_color": "#e67e80", + "theme.osd.bar_empty_color": "#504945", + "theme.osd.bar_color": "#d3c6aa", + "theme.osd.icon_container": "#d3c6aa", + "theme.osd.bar_container": "#2b3339", + "theme.notification.close_button.label": "#2b3339", + "theme.notification.close_button.background": "#e67e80", + "theme.notification.labelicon": "#d3c6aa", + "theme.notification.text": "#d8caac", + "theme.notification.time": "#a89984", + "theme.notification.border": "#323d43", + "theme.notification.label": "#d3c6aa", + "theme.notification.actions.text": "#2b3339", + "theme.notification.actions.background": "#a7c080", + "theme.notification.background": "#2b3239", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.menus.menu.media.card.color": "#2f383e", + "theme.bar.menus.check_radio_button.background": "#000000", + "theme.bar.menus.check_radio_button.active": "#ffffff", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#dbbc7f", + "theme.bar.buttons.network.icon_background": "#e69875", + "theme.bar.buttons.bluetooth.icon_background": "#a7c080", + "theme.bar.buttons.windowtitle.icon_background": "#dbbc7f", + "theme.bar.buttons.media.icon_background": "#a7c080", + "theme.bar.buttons.notifications.icon_background": "#83c092", + "theme.bar.buttons.battery.icon_background": "#e69875", + "theme.bar.buttons.clock.icon_background": "#dbbc7f", + "theme.bar.menus.menu.notifications.pager.button": "#a7c080", + "theme.bar.menus.menu.notifications.scrollbar.color": "#a7c080", + "theme.bar.menus.menu.notifications.pager.label": "#7a8478", + "theme.bar.menus.menu.notifications.pager.background": "#2b3339", + "theme.bar.buttons.modules.ram.icon": "#21252b", + "theme.bar.buttons.modules.storage.icon_background": "#e67e80", + "theme.bar.menus.popover.border": "#3a4248", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#83c092", + "theme.bar.menus.menu.power.buttons.restart.text": "#dbbc7f", + "theme.bar.buttons.modules.updates.background": "#323d43", + "theme.bar.buttons.modules.storage.icon": "#21252b", + "theme.bar.buttons.modules.netstat.background": "#323d43", + "theme.bar.buttons.modules.weather.icon": "#323d43", + "theme.bar.buttons.modules.netstat.text": "#a7c080", + "theme.bar.buttons.modules.storage.background": "#323d43", + "theme.bar.buttons.modules.power.icon": "#21252b", + "theme.bar.buttons.modules.storage.text": "#e67e80", + "theme.bar.buttons.modules.cpu.background": "#323d43", + "theme.bar.menus.menu.power.border.color": "#454b53", + "theme.bar.buttons.modules.power.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.logout.icon": "#3a4248", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#dbbc7f", + "theme.bar.menus.menu.power.buttons.restart.icon": "#3a4248", + "theme.bar.buttons.modules.cpu.icon": "#21252b", + "theme.bar.buttons.modules.kbLayout.icon_background": "#83c092", + "theme.bar.buttons.modules.weather.text": "#a7c080", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#3a4248", + "theme.bar.menus.menu.power.buttons.sleep.text": "#83c092", + "theme.bar.buttons.modules.weather.icon_background": "#a7c080", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#2f383e", + "theme.bar.menus.menu.power.buttons.logout.background": "#2f383e", + "theme.bar.buttons.modules.kbLayout.icon": "#21252b", + "theme.bar.buttons.modules.ram.icon_background": "#dbbc7f", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#e67e80", + "theme.bar.menus.menu.power.buttons.sleep.background": "#2f383e", + "theme.bar.buttons.modules.ram.text": "#dbbc7f", + "theme.bar.menus.menu.power.buttons.logout.text": "#a7c080", + "theme.bar.buttons.modules.updates.icon_background": "#83c092", + "theme.bar.buttons.modules.kbLayout.background": "#323d43", + "theme.bar.buttons.modules.power.background": "#323d43", + "theme.bar.buttons.modules.weather.background": "#323d43", + "theme.bar.menus.menu.power.background.color": "#2b3339", + "theme.bar.buttons.modules.ram.background": "#323d43", + "theme.bar.buttons.modules.netstat.icon": "#21252b", + "theme.bar.buttons.modules.cpu.icon_background": "#e67e80", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#a7c080", + "theme.bar.buttons.modules.updates.text": "#83c092", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#3a4248", + "theme.bar.menus.menu.power.buttons.restart.background": "#2f383e", + "theme.bar.buttons.modules.updates.icon": "#21252b", + "theme.bar.buttons.modules.cpu.text": "#e67e80", + "theme.bar.buttons.modules.netstat.icon_background": "#a7c080", + "theme.bar.buttons.modules.kbLayout.text": "#83c092", + "theme.bar.buttons.modules.power.border": "#e67e80", + "theme.bar.buttons.modules.weather.border": "#a7c080", + "theme.bar.buttons.modules.updates.border": "#83c092", + "theme.bar.buttons.modules.kbLayout.border": "#83c092", + "theme.bar.buttons.modules.netstat.border": "#a7c080", + "theme.bar.buttons.modules.storage.border": "#e67e80", + "theme.bar.buttons.modules.cpu.border": "#e67e80", + "theme.bar.buttons.modules.ram.border": "#dbbc7f", + "theme.bar.buttons.notifications.border": "#83c092", + "theme.bar.buttons.clock.border": "#dbbc7f", + "theme.bar.buttons.battery.border": "#e69875", + "theme.bar.buttons.systray.border": "#454b53", + "theme.bar.buttons.bluetooth.border": "#a7c080", + "theme.bar.buttons.network.border": "#e69875", + "theme.bar.buttons.volume.border": "#dbbc7f", + "theme.bar.buttons.media.border": "#a7c080", + "theme.bar.buttons.windowtitle.border": "#dbbc7f", + "theme.bar.buttons.workspaces.border": "#2b3339", + "theme.bar.buttons.dashboard.border": "#e69875", + "theme.bar.buttons.modules.submap.background": "#323d43", + "theme.bar.buttons.modules.submap.text": "#83c092", + "theme.bar.buttons.modules.submap.border": "#83c092", + "theme.bar.buttons.modules.submap.icon": "#21252b", + "theme.bar.buttons.modules.submap.icon_background": "#83c092" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/gruvbox.json b/ags/HyprPanel/themes/gruvbox.json new file mode 100644 index 0000000..b6b4a9d --- /dev/null +++ b/ags/HyprPanel/themes/gruvbox.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#83a598", + "theme.bar.menus.menu.notifications.pager.label": "#a89984", + "theme.bar.menus.menu.notifications.pager.button": "#83a598", + "theme.bar.menus.menu.notifications.pager.background": "#1d2021", + "theme.bar.menus.menu.notifications.switch.puck": "#504945", + "theme.bar.menus.menu.notifications.switch.disabled": "#3c3836", + "theme.bar.menus.menu.notifications.switch.enabled": "#83a598", + "theme.bar.menus.menu.notifications.clear": "#83a598", + "theme.bar.menus.menu.notifications.switch_divider": "#504945", + "theme.bar.menus.menu.notifications.border": "#3c3836", + "theme.bar.menus.menu.notifications.card": "#282828", + "theme.bar.menus.menu.notifications.background": "#1d2021", + "theme.bar.menus.menu.notifications.no_notifications_label": "#3c3836", + "theme.bar.menus.menu.notifications.label": "#83a598", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.sleep.text": "#83a598", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#83a598", + "theme.bar.menus.menu.power.buttons.sleep.background": "#282828", + "theme.bar.menus.menu.power.buttons.logout.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.logout.text": "#b8bb26", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#b8bb26", + "theme.bar.menus.menu.power.buttons.logout.background": "#282828", + "theme.bar.menus.menu.power.buttons.restart.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.restart.text": "#fe8019", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#fe8019", + "theme.bar.menus.menu.power.buttons.restart.background": "#282828", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#cc241d", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#cc241d", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#282828", + "theme.bar.menus.menu.power.border.color": "#3c3836", + "theme.bar.menus.menu.power.background.color": "#1d2021", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#d3869b", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#d3869b", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#d3869b", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#b8bb26", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#b8bb26", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#b8bb26", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#fabd2f", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#fabd2f", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#fabd2f", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#fb4934", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#fb4934", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#fb4934", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#504945", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#83a598", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#b16286", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8ec07c", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#fb4934", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#fabd2f", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#d3869b", + "theme.bar.menus.menu.dashboard.controls.input.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.input.background": "#d3869b", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#fb4934", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#fabd2f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#83a598", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#b16286", + "theme.bar.menus.menu.dashboard.controls.disabled": "#665c54", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#b8bb26", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#32302f", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#83a598", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#1d2021", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#d3869b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#8ec07b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#ebdbb2", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#83a598", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#3c3836", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#1d2021", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1d2021", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#83a598", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#b8bb26", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#fe8019", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#cc241d", + "theme.bar.menus.menu.dashboard.profile.name": "#d3869b", + "theme.bar.menus.menu.dashboard.border.color": "#3c3836", + "theme.bar.menus.menu.dashboard.background.color": "#1d2021", + "theme.bar.menus.menu.dashboard.card.color": "#282828", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#d3869b", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#d3869b", + "theme.bar.menus.menu.clock.weather.hourly.time": "#d3869b", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#83a598", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#458588", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#83a598", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#fe8019", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#cc241d", + "theme.bar.menus.menu.clock.weather.stats": "#d3869b", + "theme.bar.menus.menu.clock.weather.status": "#8ec07c", + "theme.bar.menus.menu.clock.weather.temperature": "#ebdbb2", + "theme.bar.menus.menu.clock.weather.icon": "#d3869b", + "theme.bar.menus.menu.clock.calendar.contextdays": "#665c54", + "theme.bar.menus.menu.clock.calendar.days": "#ebdbb2", + "theme.bar.menus.menu.clock.calendar.currentday": "#d3869b", + "theme.bar.menus.menu.clock.calendar.paginator": "#d3869b", + "theme.bar.menus.menu.clock.calendar.weekdays": "#d3869b", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8ec07c", + "theme.bar.menus.menu.clock.time.timeperiod": "#8ec07c", + "theme.bar.menus.menu.clock.time.time": "#d3869b", + "theme.bar.menus.menu.clock.text": "#ebdbb2", + "theme.bar.menus.menu.clock.border.color": "#3c3836", + "theme.bar.menus.menu.clock.background.color": "#1d2021", + "theme.bar.menus.menu.clock.card.color": "#282828", + "theme.bar.menus.menu.battery.slider.puck": "#7c6f64", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#504945", + "theme.bar.menus.menu.battery.slider.background": "#665c54", + "theme.bar.menus.menu.battery.slider.primary": "#fabd2f", + "theme.bar.menus.menu.battery.icons.active": "#fabd2f", + "theme.bar.menus.menu.battery.icons.passive": "#a89984", + "theme.bar.menus.menu.battery.listitems.active": "#fabd2f", + "theme.bar.menus.menu.battery.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.battery.text": "#ebdbb2", + "theme.bar.menus.menu.battery.label.color": "#fabd2f", + "theme.bar.menus.menu.battery.border.color": "#3c3836", + "theme.bar.menus.menu.battery.background.color": "#1d2021", + "theme.bar.menus.menu.battery.card.color": "#282828", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1d2021", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#ebdbb2", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#1d2021", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#83a598", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#ebdbb2", + "theme.bar.menus.menu.bluetooth.icons.active": "#83a598", + "theme.bar.menus.menu.bluetooth.icons.passive": "#a89984", + "theme.bar.menus.menu.bluetooth.listitems.active": "#83a598", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.bluetooth.switch.puck": "#504945", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#3c3836", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#83a598", + "theme.bar.menus.menu.bluetooth.switch_divider": "#504945", + "theme.bar.menus.menu.bluetooth.status": "#7c6f64", + "theme.bar.menus.menu.bluetooth.text": "#ebdbb2", + "theme.bar.menus.menu.bluetooth.label.color": "#83a598", + "theme.bar.menus.menu.bluetooth.border.color": "#3c3836", + "theme.bar.menus.menu.bluetooth.background.color": "#1d2021", + "theme.bar.menus.menu.bluetooth.card.color": "#282828", + "theme.bar.menus.menu.network.iconbuttons.active": "#b16286", + "theme.bar.menus.menu.network.iconbuttons.passive": "#ebdbb2", + "theme.bar.menus.menu.network.icons.active": "#b16286", + "theme.bar.menus.menu.network.icons.passive": "#a89984", + "theme.bar.menus.menu.network.listitems.active": "#b16286", + "theme.bar.menus.menu.network.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.network.status.color": "#7c6f64", + "theme.bar.menus.menu.network.text": "#ebdbb2", + "theme.bar.menus.menu.network.label.color": "#b16286", + "theme.bar.menus.menu.network.border.color": "#3c3836", + "theme.bar.menus.menu.network.background.color": "#1d2021", + "theme.bar.menus.menu.network.card.color": "#282828", + "theme.bar.menus.menu.volume.input_slider.puck": "#665c54", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#504945", + "theme.bar.menus.menu.volume.input_slider.background": "#665c54", + "theme.bar.menus.menu.volume.input_slider.primary": "#fe8018", + "theme.bar.menus.menu.volume.audio_slider.puck": "#665c54", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#504945", + "theme.bar.menus.menu.volume.audio_slider.background": "#665c54", + "theme.bar.menus.menu.volume.audio_slider.primary": "#fe8018", + "theme.bar.menus.menu.volume.icons.active": "#fe8018", + "theme.bar.menus.menu.volume.icons.passive": "#a89984", + "theme.bar.menus.menu.volume.iconbutton.active": "#fe8018", + "theme.bar.menus.menu.volume.iconbutton.passive": "#ebdbb2", + "theme.bar.menus.menu.volume.listitems.active": "#fe8018", + "theme.bar.menus.menu.volume.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.volume.text": "#ebdbb2", + "theme.bar.menus.menu.volume.label.color": "#fe8018", + "theme.bar.menus.menu.volume.border.color": "#3c3836", + "theme.bar.menus.menu.volume.background.color": "#1d2021", + "theme.bar.menus.menu.volume.card.color": "#282828", + "theme.bar.menus.menu.media.slider.puck": "#7c6f64", + "theme.bar.menus.menu.media.slider.backgroundhover": "#504945", + "theme.bar.menus.menu.media.slider.background": "#665c54", + "theme.bar.menus.menu.media.slider.primary": "#d3869b", + "theme.bar.menus.menu.media.buttons.text": "#1d2021", + "theme.bar.menus.menu.media.buttons.background": "#83a598", + "theme.bar.menus.menu.media.buttons.enabled": "#8ec07c", + "theme.bar.menus.menu.media.buttons.inactive": "#665c54", + "theme.bar.menus.menu.media.border.color": "#3c3836", + "theme.bar.menus.menu.media.card.color": "#282828", + "theme.bar.menus.menu.media.background.color": "#1d2021", + "theme.bar.menus.menu.media.album": "#d3869b", + "theme.bar.menus.menu.media.artist": "#8ec07c", + "theme.bar.menus.menu.media.song": "#83a598", + "theme.bar.menus.tooltip.text": "#ebdbb2", + "theme.bar.menus.tooltip.background": "#1d2021", + "theme.bar.menus.dropdownmenu.divider": "#1d2021", + "theme.bar.menus.dropdownmenu.text": "#ebdbb2", + "theme.bar.menus.dropdownmenu.background": "#1d2021", + "theme.bar.menus.slider.puck": "#7c6f64", + "theme.bar.menus.slider.backgroundhover": "#504945", + "theme.bar.menus.slider.background": "#665c54", + "theme.bar.menus.slider.primary": "#83a598", + "theme.bar.menus.progressbar.background": "#504945", + "theme.bar.menus.progressbar.foreground": "#83a598", + "theme.bar.menus.iconbuttons.active": "#83a598", + "theme.bar.menus.iconbuttons.passive": "#ebdbb2", + "theme.bar.menus.buttons.text": "#32302f", + "theme.bar.menus.buttons.disabled": "#665c54", + "theme.bar.menus.buttons.active": "#d3869b", + "theme.bar.menus.buttons.default": "#83a598", + "theme.bar.menus.check_radio_button.active": "#83a598", + "theme.bar.menus.check_radio_button.background": "#3c3836", + "theme.bar.menus.switch.puck": "#504945", + "theme.bar.menus.switch.disabled": "#3c3836", + "theme.bar.menus.switch.enabled": "#83a598", + "theme.bar.menus.icons.active": "#83a598", + "theme.bar.menus.icons.passive": "#665c54", + "theme.bar.menus.listitems.active": "#83a598", + "theme.bar.menus.listitems.passive": "#ebdbb2", + "theme.bar.menus.popover.border": "#32302f", + "theme.bar.menus.popover.background": "#32302f", + "theme.bar.menus.popover.text": "#83a598", + "theme.bar.menus.label": "#83a598", + "theme.bar.menus.feinttext": "#3c3836", + "theme.bar.menus.dimtext": "#665c54", + "theme.bar.menus.text": "#ebdbb2", + "theme.bar.menus.border.color": "#3c3836", + "theme.bar.menus.cards": "#1d2021", + "theme.bar.menus.background": "#1d2021", + "theme.bar.buttons.modules.power.icon_background": "#282828", + "theme.bar.buttons.modules.power.icon": "#cc241d", + "theme.bar.buttons.modules.power.background": "#282828", + "theme.bar.buttons.modules.weather.icon_background": "#282828", + "theme.bar.buttons.modules.weather.icon": "#fe8017", + "theme.bar.buttons.modules.weather.text": "#fe8017", + "theme.bar.buttons.modules.weather.background": "#282828", + "theme.bar.buttons.modules.updates.icon_background": "#282828", + "theme.bar.buttons.modules.updates.icon": "#b16286", + "theme.bar.buttons.modules.updates.text": "#b16286", + "theme.bar.buttons.modules.updates.background": "#282828", + "theme.bar.buttons.modules.kbLayout.icon_background": "#282828", + "theme.bar.buttons.modules.kbLayout.icon": "#83a598", + "theme.bar.buttons.modules.kbLayout.text": "#83a598", + "theme.bar.buttons.modules.kbLayout.background": "#282828", + "theme.bar.buttons.modules.netstat.icon_background": "#282828", + "theme.bar.buttons.modules.netstat.icon": "#b8bb26", + "theme.bar.buttons.modules.netstat.text": "#b8bb26", + "theme.bar.buttons.modules.netstat.background": "#282828", + "theme.bar.buttons.modules.storage.icon_background": "#282828", + "theme.bar.buttons.modules.storage.icon": "#83a598", + "theme.bar.buttons.modules.storage.text": "#83a598", + "theme.bar.buttons.modules.storage.background": "#282828", + "theme.bar.buttons.modules.cpu.icon_background": "#282828", + "theme.bar.buttons.modules.cpu.icon": "#d3869b", + "theme.bar.buttons.modules.cpu.text": "#d3869b", + "theme.bar.buttons.modules.cpu.background": "#282828", + "theme.bar.buttons.modules.ram.icon_background": "#282828", + "theme.bar.buttons.modules.ram.icon": "#fabd2f", + "theme.bar.buttons.modules.ram.text": "#fabd2f", + "theme.bar.buttons.modules.ram.background": "#282828", + "theme.bar.buttons.notifications.total": "#83a598", + "theme.bar.buttons.notifications.icon_background": "#83a598", + "theme.bar.buttons.notifications.icon": "#83a598", + "theme.bar.buttons.notifications.background": "#282828", + "theme.bar.buttons.clock.icon_background": "#d3869b", + "theme.bar.buttons.clock.icon": "#d3869b", + "theme.bar.buttons.clock.text": "#d3869b", + "theme.bar.buttons.clock.background": "#282828", + "theme.bar.buttons.battery.icon_background": "#fabd2f", + "theme.bar.buttons.battery.icon": "#fabd2f", + "theme.bar.buttons.battery.text": "#fabd2f", + "theme.bar.buttons.battery.background": "#282828", + "theme.bar.buttons.systray.background": "#282828", + "theme.bar.buttons.bluetooth.icon_background": "#83a598", + "theme.bar.buttons.bluetooth.icon": "#83a598", + "theme.bar.buttons.bluetooth.text": "#83a598", + "theme.bar.buttons.bluetooth.background": "#282828", + "theme.bar.buttons.network.icon_background": "#b16286", + "theme.bar.buttons.network.icon": "#b16286", + "theme.bar.buttons.network.text": "#b16286", + "theme.bar.buttons.network.background": "#282828", + "theme.bar.buttons.volume.icon_background": "#fe8018", + "theme.bar.buttons.volume.icon": "#fe8018", + "theme.bar.buttons.volume.text": "#fe8018", + "theme.bar.buttons.volume.background": "#282828", + "theme.bar.buttons.media.icon_background": "#83a598", + "theme.bar.buttons.media.icon": "#83a598", + "theme.bar.buttons.media.text": "#83a598", + "theme.bar.buttons.media.background": "#282828", + "theme.bar.buttons.windowtitle.icon_background": "#d3869b", + "theme.bar.buttons.windowtitle.icon": "#d3869b", + "theme.bar.buttons.windowtitle.text": "#d3869b", + "theme.bar.buttons.windowtitle.background": "#282828", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.active": "#d3869b", + "theme.bar.buttons.workspaces.occupied": "#fb4934", + "theme.bar.buttons.workspaces.available": "#83a598", + "theme.bar.buttons.workspaces.hover": "#504945", + "theme.bar.buttons.workspaces.background": "#282828", + "theme.bar.buttons.dashboard.icon": "#fabd2f", + "theme.bar.buttons.dashboard.background": "#282828", + "theme.bar.buttons.icon": "#83a598", + "theme.bar.buttons.text": "#83a598", + "theme.bar.buttons.hover": "#504945", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.background": "#282828", + "theme.bar.buttons.style": "default", + "theme.bar.background": "#1d2021", + "theme.osd.label": "#83a598", + "theme.osd.icon": "#1d2021", + "theme.osd.bar_overflow_color": "#cc241d", + "theme.osd.bar_empty_color": "#3c3836", + "theme.osd.bar_color": "#83a598", + "theme.osd.icon_container": "#83a598", + "theme.osd.bar_container": "#1d2021", + "theme.notification.close_button.label": "#1d2021", + "theme.notification.close_button.background": "#83a598", + "theme.notification.labelicon": "#83a598", + "theme.notification.text": "#ebdbb2", + "theme.notification.time": "#928374", + "theme.notification.border": "#3c3836", + "theme.notification.label": "#83a598", + "theme.notification.actions.text": "#32302f", + "theme.notification.actions.background": "#83a598", + "theme.notification.background": "#32302f", + "theme.bar.buttons.modules.power.border": "#282828", + "theme.bar.buttons.modules.weather.border": "#fe8017", + "theme.bar.buttons.modules.updates.border": "#b16286", + "theme.bar.buttons.modules.kbLayout.border": "#83a598", + "theme.bar.buttons.modules.netstat.border": "#b8bb26", + "theme.bar.buttons.modules.storage.border": "#83a598", + "theme.bar.buttons.modules.cpu.border": "#d3869b", + "theme.bar.buttons.modules.ram.border": "#fabd2f", + "theme.bar.buttons.notifications.border": "#83a598", + "theme.bar.buttons.clock.border": "#d3869b", + "theme.bar.buttons.battery.border": "#fabd2f", + "theme.bar.buttons.systray.border": "#504945", + "theme.bar.buttons.bluetooth.border": "#83a598", + "theme.bar.buttons.network.border": "#b16286", + "theme.bar.buttons.volume.border": "#fe8018", + "theme.bar.buttons.media.border": "#83a598", + "theme.bar.buttons.windowtitle.border": "#d3869b", + "theme.bar.buttons.workspaces.border": "#ffffff", + "theme.bar.buttons.dashboard.border": "#fabd2f", + "theme.bar.buttons.modules.submap.background": "#282828", + "theme.bar.buttons.modules.submap.text": "#8ec07c", + "theme.bar.buttons.modules.submap.border": "#8ec07c", + "theme.bar.buttons.modules.submap.icon": "#8ec07c", + "theme.bar.buttons.modules.submap.icon_background": "#282828" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/gruvbox_split.json b/ags/HyprPanel/themes/gruvbox_split.json new file mode 100644 index 0000000..e41ab29 --- /dev/null +++ b/ags/HyprPanel/themes/gruvbox_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.menu.notifications.scrollbar.color": "#83a598", + "theme.bar.menus.menu.notifications.pager.label": "#a89984", + "theme.bar.menus.menu.notifications.pager.button": "#83a598", + "theme.bar.menus.menu.notifications.pager.background": "#1d2021", + "theme.bar.menus.menu.notifications.switch.puck": "#504945", + "theme.bar.menus.menu.notifications.switch.disabled": "#3c3836", + "theme.bar.menus.menu.notifications.switch.enabled": "#83a598", + "theme.bar.menus.menu.notifications.clear": "#83a598", + "theme.bar.menus.menu.notifications.switch_divider": "#504945", + "theme.bar.menus.menu.notifications.border": "#3c3836", + "theme.bar.menus.menu.notifications.card": "#282828", + "theme.bar.menus.menu.notifications.background": "#1d2021", + "theme.bar.menus.menu.notifications.no_notifications_label": "#3c3836", + "theme.bar.menus.menu.notifications.label": "#83a598", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.sleep.text": "#83a598", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#83a598", + "theme.bar.menus.menu.power.buttons.sleep.background": "#282828", + "theme.bar.menus.menu.power.buttons.logout.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.logout.text": "#b8bb26", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#b8bb26", + "theme.bar.menus.menu.power.buttons.logout.background": "#282828", + "theme.bar.menus.menu.power.buttons.restart.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.restart.text": "#fe8019", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#fe8019", + "theme.bar.menus.menu.power.buttons.restart.background": "#282828", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#32302f", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#cc241d", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#cc241d", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#282828", + "theme.bar.menus.menu.power.border.color": "#3c3836", + "theme.bar.menus.menu.power.background.color": "#1d2021", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#d3869b", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#d3869b", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#d3869b", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#b8bb26", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#b8bb26", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#b8bb26", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#fabd2f", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#fabd2f", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#fabd2f", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#fb4934", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#fb4934", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#fb4934", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#504945", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#83a598", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#b16286", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8ec07c", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#fb4934", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#fabd2f", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#d3869b", + "theme.bar.menus.menu.dashboard.controls.input.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.input.background": "#d3869b", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#fb4934", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#fabd2f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#83a598", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#32302f", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#b16286", + "theme.bar.menus.menu.dashboard.controls.disabled": "#665c54", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#b8bb26", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#32302f", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#83a598", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#1d2021", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#d3869b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#8ec07b", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#ebdbb2", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#83a598", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#3c3836", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#1d2021", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1d2021", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#83a598", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#b8bb26", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#fe8019", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#cc241d", + "theme.bar.menus.menu.dashboard.profile.name": "#d3869b", + "theme.bar.menus.menu.dashboard.border.color": "#3c3836", + "theme.bar.menus.menu.dashboard.background.color": "#1d2021", + "theme.bar.menus.menu.dashboard.card.color": "#282828", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#d3869b", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#d3869b", + "theme.bar.menus.menu.clock.weather.hourly.time": "#d3869b", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#83a598", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#458588", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#83a598", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#fe8019", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#cc241d", + "theme.bar.menus.menu.clock.weather.stats": "#d3869b", + "theme.bar.menus.menu.clock.weather.status": "#8ec07c", + "theme.bar.menus.menu.clock.weather.temperature": "#ebdbb2", + "theme.bar.menus.menu.clock.weather.icon": "#d3869b", + "theme.bar.menus.menu.clock.calendar.contextdays": "#665c54", + "theme.bar.menus.menu.clock.calendar.days": "#ebdbb2", + "theme.bar.menus.menu.clock.calendar.currentday": "#d3869b", + "theme.bar.menus.menu.clock.calendar.paginator": "#d3869b", + "theme.bar.menus.menu.clock.calendar.weekdays": "#d3869b", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8ec07c", + "theme.bar.menus.menu.clock.time.timeperiod": "#8ec07c", + "theme.bar.menus.menu.clock.time.time": "#d3869b", + "theme.bar.menus.menu.clock.text": "#ebdbb2", + "theme.bar.menus.menu.clock.border.color": "#3c3836", + "theme.bar.menus.menu.clock.background.color": "#1d2021", + "theme.bar.menus.menu.clock.card.color": "#282828", + "theme.bar.menus.menu.battery.slider.puck": "#7c6f64", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#504945", + "theme.bar.menus.menu.battery.slider.background": "#665c54", + "theme.bar.menus.menu.battery.slider.primary": "#fabd2f", + "theme.bar.menus.menu.battery.icons.active": "#fabd2f", + "theme.bar.menus.menu.battery.icons.passive": "#a89984", + "theme.bar.menus.menu.battery.listitems.active": "#fabd2f", + "theme.bar.menus.menu.battery.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.battery.text": "#ebdbb2", + "theme.bar.menus.menu.battery.label.color": "#fabd2f", + "theme.bar.menus.menu.battery.border.color": "#3c3836", + "theme.bar.menus.menu.battery.background.color": "#1d2021", + "theme.bar.menus.menu.battery.card.color": "#282828", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1d2021", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#ebdbb2", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#1d2021", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#83a598", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#ebdbb2", + "theme.bar.menus.menu.bluetooth.icons.active": "#83a598", + "theme.bar.menus.menu.bluetooth.icons.passive": "#a89984", + "theme.bar.menus.menu.bluetooth.listitems.active": "#83a598", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.bluetooth.switch.puck": "#504945", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#3c3836", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#83a598", + "theme.bar.menus.menu.bluetooth.switch_divider": "#504945", + "theme.bar.menus.menu.bluetooth.status": "#7c6f64", + "theme.bar.menus.menu.bluetooth.text": "#ebdbb2", + "theme.bar.menus.menu.bluetooth.label.color": "#83a598", + "theme.bar.menus.menu.bluetooth.border.color": "#3c3836", + "theme.bar.menus.menu.bluetooth.background.color": "#1d2021", + "theme.bar.menus.menu.bluetooth.card.color": "#282828", + "theme.bar.menus.menu.network.iconbuttons.active": "#b16286", + "theme.bar.menus.menu.network.iconbuttons.passive": "#ebdbb2", + "theme.bar.menus.menu.network.icons.active": "#b16286", + "theme.bar.menus.menu.network.icons.passive": "#a89984", + "theme.bar.menus.menu.network.listitems.active": "#b16286", + "theme.bar.menus.menu.network.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.network.status.color": "#7c6f64", + "theme.bar.menus.menu.network.text": "#ebdbb2", + "theme.bar.menus.menu.network.label.color": "#b16286", + "theme.bar.menus.menu.network.border.color": "#3c3836", + "theme.bar.menus.menu.network.background.color": "#1d2021", + "theme.bar.menus.menu.network.card.color": "#282828", + "theme.bar.menus.menu.volume.input_slider.puck": "#665c54", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#504945", + "theme.bar.menus.menu.volume.input_slider.background": "#665c54", + "theme.bar.menus.menu.volume.input_slider.primary": "#fe8018", + "theme.bar.menus.menu.volume.audio_slider.puck": "#665c54", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#504945", + "theme.bar.menus.menu.volume.audio_slider.background": "#665c54", + "theme.bar.menus.menu.volume.audio_slider.primary": "#fe8018", + "theme.bar.menus.menu.volume.icons.active": "#fe8018", + "theme.bar.menus.menu.volume.icons.passive": "#a89984", + "theme.bar.menus.menu.volume.iconbutton.active": "#fe8018", + "theme.bar.menus.menu.volume.iconbutton.passive": "#ebdbb2", + "theme.bar.menus.menu.volume.listitems.active": "#fe8018", + "theme.bar.menus.menu.volume.listitems.passive": "#ebdbb2", + "theme.bar.menus.menu.volume.text": "#ebdbb2", + "theme.bar.menus.menu.volume.label.color": "#fe8018", + "theme.bar.menus.menu.volume.border.color": "#3c3836", + "theme.bar.menus.menu.volume.background.color": "#1d2021", + "theme.bar.menus.menu.volume.card.color": "#282828", + "theme.bar.menus.menu.media.slider.puck": "#7c6f64", + "theme.bar.menus.menu.media.slider.backgroundhover": "#504945", + "theme.bar.menus.menu.media.slider.background": "#665c54", + "theme.bar.menus.menu.media.slider.primary": "#d3869b", + "theme.bar.menus.menu.media.buttons.text": "#1d2021", + "theme.bar.menus.menu.media.buttons.background": "#83a598", + "theme.bar.menus.menu.media.buttons.enabled": "#8ec07c", + "theme.bar.menus.menu.media.buttons.inactive": "#665c54", + "theme.bar.menus.menu.media.border.color": "#3c3836", + "theme.bar.menus.menu.media.card.color": "#282828", + "theme.bar.menus.menu.media.background.color": "#1d2021", + "theme.bar.menus.menu.media.album": "#d3869b", + "theme.bar.menus.menu.media.artist": "#8ec07c", + "theme.bar.menus.menu.media.song": "#83a598", + "theme.bar.menus.tooltip.text": "#ebdbb2", + "theme.bar.menus.tooltip.background": "#1d2021", + "theme.bar.menus.dropdownmenu.divider": "#1d2021", + "theme.bar.menus.dropdownmenu.text": "#ebdbb2", + "theme.bar.menus.dropdownmenu.background": "#1d2021", + "theme.bar.menus.slider.puck": "#7c6f64", + "theme.bar.menus.slider.backgroundhover": "#504945", + "theme.bar.menus.slider.background": "#665c54", + "theme.bar.menus.slider.primary": "#83a598", + "theme.bar.menus.progressbar.background": "#504945", + "theme.bar.menus.progressbar.foreground": "#83a598", + "theme.bar.menus.iconbuttons.active": "#83a598", + "theme.bar.menus.iconbuttons.passive": "#ebdbb2", + "theme.bar.menus.buttons.text": "#32302f", + "theme.bar.menus.buttons.disabled": "#665c54", + "theme.bar.menus.buttons.active": "#d3869b", + "theme.bar.menus.buttons.default": "#83a598", + "theme.bar.menus.check_radio_button.active": "#83a598", + "theme.bar.menus.check_radio_button.background": "#3c3836", + "theme.bar.menus.switch.puck": "#504945", + "theme.bar.menus.switch.disabled": "#3c3836", + "theme.bar.menus.switch.enabled": "#83a598", + "theme.bar.menus.icons.active": "#83a598", + "theme.bar.menus.icons.passive": "#665c54", + "theme.bar.menus.listitems.active": "#83a598", + "theme.bar.menus.listitems.passive": "#ebdbb2", + "theme.bar.menus.popover.border": "#32302f", + "theme.bar.menus.popover.background": "#32302f", + "theme.bar.menus.popover.text": "#83a598", + "theme.bar.menus.label": "#83a598", + "theme.bar.menus.feinttext": "#3c3836", + "theme.bar.menus.dimtext": "#665c54", + "theme.bar.menus.text": "#ebdbb2", + "theme.bar.menus.border.color": "#3c3836", + "theme.bar.menus.cards": "#1d2021", + "theme.bar.menus.background": "#1d2021", + "theme.bar.buttons.modules.power.icon_background": "#fb4934", + "theme.bar.buttons.modules.power.icon": "#21252b", + "theme.bar.buttons.modules.power.background": "#282828", + "theme.bar.buttons.modules.weather.icon_background": "#fe8017", + "theme.bar.buttons.modules.weather.icon": "#282828", + "theme.bar.buttons.modules.weather.text": "#fe8017", + "theme.bar.buttons.modules.weather.background": "#282828", + "theme.bar.buttons.modules.updates.icon_background": "#b16286", + "theme.bar.buttons.modules.updates.icon": "#21252b", + "theme.bar.buttons.modules.updates.text": "#b16286", + "theme.bar.buttons.modules.updates.background": "#282828", + "theme.bar.buttons.modules.kbLayout.icon_background": "#83a598", + "theme.bar.buttons.modules.kbLayout.icon": "#21252b", + "theme.bar.buttons.modules.kbLayout.text": "#83a598", + "theme.bar.buttons.modules.kbLayout.background": "#282828", + "theme.bar.buttons.modules.netstat.icon_background": "#b8bb26", + "theme.bar.buttons.modules.netstat.icon": "#21252b", + "theme.bar.buttons.modules.netstat.text": "#b8bb26", + "theme.bar.buttons.modules.netstat.background": "#282828", + "theme.bar.buttons.modules.storage.icon_background": "#83a598", + "theme.bar.buttons.modules.storage.icon": "#21252b", + "theme.bar.buttons.modules.storage.text": "#83a598", + "theme.bar.buttons.modules.storage.background": "#282828", + "theme.bar.buttons.modules.cpu.icon_background": "#d3869b", + "theme.bar.buttons.modules.cpu.icon": "#21252b", + "theme.bar.buttons.modules.cpu.text": "#d3869b", + "theme.bar.buttons.modules.cpu.background": "#282828", + "theme.bar.buttons.modules.ram.icon_background": "#fabd2f", + "theme.bar.buttons.modules.ram.icon": "#21252b", + "theme.bar.buttons.modules.ram.text": "#fabd2f", + "theme.bar.buttons.modules.ram.background": "#282828", + "theme.bar.buttons.notifications.total": "#83a598", + "theme.bar.buttons.notifications.icon_background": "#83a598", + "theme.bar.buttons.notifications.icon": "#282828", + "theme.bar.buttons.notifications.background": "#282828", + "theme.bar.buttons.clock.icon_background": "#d3869b", + "theme.bar.buttons.clock.icon": "#282828", + "theme.bar.buttons.clock.text": "#d3869b", + "theme.bar.buttons.clock.background": "#282828", + "theme.bar.buttons.battery.icon_background": "#fabd2f", + "theme.bar.buttons.battery.icon": "#282828", + "theme.bar.buttons.battery.text": "#fabd2f", + "theme.bar.buttons.battery.background": "#282828", + "theme.bar.buttons.systray.background": "#282828", + "theme.bar.buttons.bluetooth.icon_background": "#83a598", + "theme.bar.buttons.bluetooth.icon": "#282828", + "theme.bar.buttons.bluetooth.text": "#83a598", + "theme.bar.buttons.bluetooth.background": "#282828", + "theme.bar.buttons.network.icon_background": "#b16286", + "theme.bar.buttons.network.icon": "#282828", + "theme.bar.buttons.network.text": "#b16286", + "theme.bar.buttons.network.background": "#282828", + "theme.bar.buttons.volume.icon_background": "#fe8018", + "theme.bar.buttons.volume.icon": "#282828", + "theme.bar.buttons.volume.text": "#fe8018", + "theme.bar.buttons.volume.background": "#282828", + "theme.bar.buttons.media.icon_background": "#83a598", + "theme.bar.buttons.media.icon": "#282828", + "theme.bar.buttons.media.text": "#83a598", + "theme.bar.buttons.media.background": "#282828", + "theme.bar.buttons.windowtitle.icon_background": "#d3869b", + "theme.bar.buttons.windowtitle.icon": "#282828", + "theme.bar.buttons.windowtitle.text": "#d3869b", + "theme.bar.buttons.windowtitle.background": "#282828", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.active": "#d3869b", + "theme.bar.buttons.workspaces.occupied": "#fb4934", + "theme.bar.buttons.workspaces.available": "#83a598", + "theme.bar.buttons.workspaces.hover": "#d3869b", + "theme.bar.buttons.workspaces.background": "#282828", + "theme.bar.buttons.dashboard.icon": "#282828", + "theme.bar.buttons.dashboard.background": "#fabc2f", + "theme.bar.buttons.icon": "#83a598", + "theme.bar.buttons.text": "#83a598", + "theme.bar.buttons.hover": "#504945", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.background": "#282828", + "theme.bar.buttons.style": "split", + "theme.bar.background": "#1d2021", + "theme.osd.label": "#83a598", + "theme.osd.icon": "#1d2021", + "theme.osd.bar_overflow_color": "#cc241d", + "theme.osd.bar_empty_color": "#3c3836", + "theme.osd.bar_color": "#83a598", + "theme.osd.icon_container": "#83a598", + "theme.osd.bar_container": "#1d2021", + "theme.notification.close_button.label": "#1d2021", + "theme.notification.close_button.background": "#83a598", + "theme.notification.labelicon": "#83a598", + "theme.notification.text": "#ebdbb2", + "theme.notification.time": "#928374", + "theme.notification.border": "#3c3836", + "theme.notification.label": "#83a598", + "theme.notification.actions.text": "#32302f", + "theme.notification.actions.background": "#83a598", + "theme.notification.background": "#32302f", + "theme.bar.buttons.modules.power.border": "#282828", + "theme.bar.buttons.modules.weather.border": "#fe8017", + "theme.bar.buttons.modules.updates.border": "#b16286", + "theme.bar.buttons.modules.kbLayout.border": "#83a598", + "theme.bar.buttons.modules.netstat.border": "#b8bb26", + "theme.bar.buttons.modules.storage.border": "#83a598", + "theme.bar.buttons.modules.cpu.border": "#d3869b", + "theme.bar.buttons.modules.ram.border": "#fabd2f", + "theme.bar.buttons.notifications.border": "#83a598", + "theme.bar.buttons.clock.border": "#d3869b", + "theme.bar.buttons.battery.border": "#fabd2f", + "theme.bar.buttons.systray.border": "#504945", + "theme.bar.buttons.bluetooth.border": "#83a598", + "theme.bar.buttons.network.border": "#b16286", + "theme.bar.buttons.volume.border": "#fe8018", + "theme.bar.buttons.media.border": "#83a598", + "theme.bar.buttons.windowtitle.border": "#d3869b", + "theme.bar.buttons.workspaces.border": "#ffffff", + "theme.bar.buttons.dashboard.border": "#fabd2f", + "theme.bar.buttons.modules.submap.background": "#282828", + "theme.bar.buttons.modules.submap.text": "#8ec07c", + "theme.bar.buttons.modules.submap.border": "#8ec07c", + "theme.bar.buttons.modules.submap.icon": "#21252b", + "theme.bar.buttons.modules.submap.icon_background": "#8ec07c" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/monochrome.json b/ags/HyprPanel/themes/monochrome.json new file mode 100644 index 0000000..86cb70b --- /dev/null +++ b/ags/HyprPanel/themes/monochrome.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#000000", + "theme.bar.background": "#000000", + "theme.bar.buttons.media.icon": "#FFFFFF", + "theme.bar.buttons.media.text": "#FFFFFF", + "theme.bar.buttons.icon": "#FFFFFF", + "theme.bar.buttons.text": "#FFFFFF", + "theme.bar.buttons.hover": "#333333", + "theme.bar.buttons.background": "#1A1A1A", + "theme.bar.menus.text": "#CCCCCC", + "theme.bar.menus.border.color": "#333333", + "theme.bar.buttons.media.background": "#090909", + "theme.bar.menus.menu.volume.text": "#CCCCCC", + "theme.bar.menus.menu.volume.card.color": "#1A1A1A", + "theme.bar.menus.menu.volume.label.color": "#FFFFFF", + "theme.bar.menus.popover.text": "#FFFFFF", + "theme.bar.menus.popover.background": "#000000", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#000000", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#CCCCCC", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#FFFFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#333333", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#000000", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1A1A1A", + "theme.bar.menus.menu.notifications.switch.puck": "#333333", + "theme.bar.menus.menu.notifications.switch.disabled": "#333333", + "theme.bar.menus.menu.notifications.switch.enabled": "#FFFFFF", + "theme.bar.menus.menu.notifications.clear": "#ffffff", + "theme.bar.menus.menu.notifications.switch_divider": "#333333", + "theme.bar.menus.menu.notifications.border": "#333333", + "theme.bar.menus.menu.notifications.card": "#1A1A1A", + "theme.bar.menus.menu.notifications.background": "#000000", + "theme.bar.menus.menu.notifications.no_notifications_label": "#333333", + "theme.bar.menus.menu.notifications.label": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#333333", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ffffff", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#ffffff", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.controls.input.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.input.background": "#FFFFFF", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ffffff", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#ffffff", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#ffffff", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#FFFFFF", + "theme.bar.menus.menu.dashboard.controls.disabled": "#333333", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#5CFF5C", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#000000", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#FFFFFF", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#ffffff", + "theme.bar.menus.menu.dashboard.profile.name": "#FFFFFF", + "theme.bar.menus.menu.dashboard.border.color": "#333333", + "theme.bar.menus.menu.dashboard.background.color": "#000000", + "theme.bar.menus.menu.dashboard.card.color": "#1A1A1A", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.hourly.time": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#ffffff", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#ffffff", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#ffffff", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#ffffff", + "theme.bar.menus.menu.clock.weather.stats": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.status": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.temperature": "#CCCCCC", + "theme.bar.menus.menu.clock.weather.icon": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.contextdays": "#333333", + "theme.bar.menus.menu.clock.calendar.days": "#CCCCCC", + "theme.bar.menus.menu.clock.calendar.currentday": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.paginator": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.weekdays": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#ffffff", + "theme.bar.menus.menu.clock.time.timeperiod": "#ffffff", + "theme.bar.menus.menu.clock.time.time": "#FFFFFF", + "theme.bar.menus.menu.clock.text": "#CCCCCC", + "theme.bar.menus.menu.clock.border.color": "#333333", + "theme.bar.menus.menu.clock.background.color": "#000000", + "theme.bar.menus.menu.clock.card.color": "#1A1A1A", + "theme.bar.menus.menu.battery.slider.puck": "#5e5c64", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#5e5c64", + "theme.bar.menus.menu.battery.slider.background": "#5e5c64", + "theme.bar.menus.menu.battery.slider.primary": "#cccccc", + "theme.bar.menus.menu.battery.icons.active": "#ffffff", + "theme.bar.menus.menu.battery.icons.passive": "#9a9996", + "theme.bar.menus.menu.battery.listitems.active": "#ffffff", + "theme.bar.menus.menu.battery.listitems.passive": "#9a9996", + "theme.bar.menus.menu.battery.text": "#CCCCCC", + "theme.bar.menus.menu.battery.label.color": "#ffffff", + "theme.bar.menus.menu.battery.border.color": "#333333", + "theme.bar.menus.menu.battery.background.color": "#000000", + "theme.bar.menus.menu.battery.card.color": "#111111", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1A1A1A", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#CCCCCC", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#000000", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#ffffff", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#9a9996", + "theme.bar.menus.menu.bluetooth.icons.active": "#ffffff", + "theme.bar.menus.menu.bluetooth.icons.passive": "#77767b", + "theme.bar.menus.menu.bluetooth.listitems.active": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#77767b", + "theme.bar.menus.menu.bluetooth.switch.puck": "#9a9996", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#444444", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.switch_divider": "#444444", + "theme.bar.menus.menu.bluetooth.status": "#CCCCCC", + "theme.bar.menus.menu.bluetooth.text": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.label.color": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.border.color": "#444444", + "theme.bar.menus.menu.bluetooth.background.color": "#000000", + "theme.bar.menus.menu.bluetooth.card.color": "#111111", + "theme.bar.menus.menu.network.iconbuttons.active": "#FFFFFF", + "theme.bar.menus.menu.network.iconbuttons.passive": "#77767b", + "theme.bar.menus.menu.network.icons.active": "#FFFFFF", + "theme.bar.menus.menu.network.icons.passive": "#77767b", + "theme.bar.menus.menu.network.listitems.active": "#FFFFFF", + "theme.bar.menus.menu.network.listitems.passive": "#77767b", + "theme.bar.menus.menu.network.status.color": "#CCCCCC", + "theme.bar.menus.menu.network.text": "#FFFFFF", + "theme.bar.menus.menu.network.label.color": "#FFFFFF", + "theme.bar.menus.menu.network.border.color": "#444444", + "theme.bar.menus.menu.network.background.color": "#000000", + "theme.bar.menus.menu.network.card.color": "#111111", + "theme.bar.menus.menu.volume.input_slider.puck": "#CCCCCC", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#444444", + "theme.bar.menus.menu.volume.input_slider.background": "#77767b", + "theme.bar.menus.menu.volume.input_slider.primary": "#FFFFFF", + "theme.bar.menus.menu.volume.audio_slider.puck": "#CCCCCC", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#444444", + "theme.bar.menus.menu.volume.audio_slider.background": "#77767b", + "theme.bar.menus.menu.volume.audio_slider.primary": "#FFFFFF", + "theme.bar.menus.menu.volume.icons.active": "#FFFFFF", + "theme.bar.menus.menu.volume.icons.passive": "#77767b", + "theme.bar.menus.menu.volume.iconbutton.active": "#FFFFFF", + "theme.bar.menus.menu.volume.iconbutton.passive": "#77767b", + "theme.bar.menus.menu.volume.listitems.active": "#FFFFFF", + "theme.bar.menus.menu.volume.listitems.passive": "#77767b", + "theme.bar.menus.menu.volume.border.color": "#444444", + "theme.bar.menus.menu.volume.background.color": "#000000", + "theme.bar.menus.menu.media.slider.puck": "#CCCCCC", + "theme.bar.menus.menu.media.slider.backgroundhover": "#444444", + "theme.bar.menus.menu.media.slider.background": "#77767b", + "theme.bar.menus.menu.media.slider.primary": "#FFFFFF", + "theme.bar.menus.menu.media.buttons.text": "#000000", + "theme.bar.menus.menu.media.buttons.background": "#FFFFFF", + "theme.bar.menus.menu.media.buttons.enabled": "#FFFFFF", + "theme.bar.menus.menu.media.buttons.inactive": "#5e5c64", + "theme.bar.menus.menu.media.border.color": "#444444", + "theme.bar.menus.menu.media.background.color": "#000000", + "theme.bar.menus.menu.media.album": "#FFFFFF", + "theme.bar.menus.menu.media.artist": "#FFFFFF", + "theme.bar.menus.menu.media.song": "#FFFFFF", + "theme.bar.menus.tooltip.text": "#FFFFFF", + "theme.bar.menus.tooltip.background": "#000000", + "theme.bar.menus.dropdownmenu.divider": "#111111", + "theme.bar.menus.dropdownmenu.text": "#FFFFFF", + "theme.bar.menus.dropdownmenu.background": "#000000", + "theme.bar.menus.slider.puck": "#CCCCCC", + "theme.bar.menus.slider.backgroundhover": "#444444", + "theme.bar.menus.slider.background": "#CCCCCC", + "theme.bar.menus.slider.primary": "#FFFFFF", + "theme.bar.menus.progressbar.background": "#444444", + "theme.bar.menus.progressbar.foreground": "#FFFFFF", + "theme.bar.menus.iconbuttons.active": "#FFFFFF", + "theme.bar.menus.iconbuttons.passive": "#FFFFFF", + "theme.bar.menus.buttons.text": "#000000", + "theme.bar.menus.buttons.disabled": "#CCCCCC", + "theme.bar.menus.buttons.active": "#FFFFFF", + "theme.bar.menus.buttons.default": "#FFFFFF", + "theme.bar.menus.switch.puck": "#CCCCCC", + "theme.bar.menus.switch.disabled": "#444444", + "theme.bar.menus.switch.enabled": "#FFFFFF", + "theme.bar.menus.icons.active": "#FFFFFF", + "theme.bar.menus.icons.passive": "#CCCCCC", + "theme.bar.menus.listitems.active": "#FFFFFF", + "theme.bar.menus.listitems.passive": "#FFFFFF", + "theme.bar.menus.label": "#FFFFFF", + "theme.bar.menus.feinttext": "#444444", + "theme.bar.menus.dimtext": "#CCCCCC", + "theme.bar.menus.cards": "#111111", + "theme.bar.buttons.notifications.total": "#FFFFFF", + "theme.bar.buttons.notifications.icon": "#FFFFFF", + "theme.bar.buttons.notifications.background": "#090909", + "theme.bar.buttons.clock.icon": "#FFFFFF", + "theme.bar.buttons.clock.text": "#FFFFFF", + "theme.bar.buttons.clock.background": "#090909", + "theme.bar.buttons.battery.icon": "#FFFFFF", + "theme.bar.buttons.battery.text": "#FFFFFF", + "theme.bar.buttons.battery.background": "#090909", + "theme.bar.buttons.systray.background": "#090909", + "theme.bar.buttons.bluetooth.icon": "#FFFFFF", + "theme.bar.buttons.bluetooth.text": "#FFFFFF", + "theme.bar.buttons.bluetooth.background": "#090909", + "theme.bar.buttons.network.icon": "#FFFFFF", + "theme.bar.buttons.network.text": "#FFFFFF", + "theme.bar.buttons.network.background": "#090909", + "theme.bar.buttons.volume.icon": "#FFFFFF", + "theme.bar.buttons.volume.text": "#FFFFFF", + "theme.bar.buttons.volume.background": "#090909", + "theme.bar.buttons.windowtitle.icon": "#FFFFFF", + "theme.bar.buttons.windowtitle.text": "#FFFFFF", + "theme.bar.buttons.windowtitle.background": "#090909", + "theme.bar.buttons.workspaces.active": "#FFFFFF", + "theme.bar.buttons.workspaces.occupied": "#FFFFFF", + "theme.bar.buttons.workspaces.available": "#FFFFFF", + "theme.bar.buttons.workspaces.hover": "#444444", + "theme.bar.buttons.workspaces.background": "#090909", + "theme.bar.buttons.dashboard.icon": "#FFFFFF", + "theme.bar.buttons.dashboard.background": "#090909", + "theme.osd.label": "#FFFFFF", + "theme.osd.icon": "#000000", + "theme.osd.bar_overflow_color": "#FFFFFF", + "theme.osd.bar_empty_color": "#444444", + "theme.osd.bar_color": "#FFFFFF", + "theme.osd.icon_container": "#FFFFFF", + "theme.osd.bar_container": "#000000", + "theme.notification.close_button.label": "#000000", + "theme.notification.close_button.background": "#FFFFFF", + "theme.notification.labelicon": "#FFFFFF", + "theme.notification.text": "#FFFFFF", + "theme.notification.time": "#CCCCCC", + "theme.notification.border": "#444444", + "theme.notification.label": "#FFFFFF", + "theme.notification.actions.text": "#000000", + "theme.notification.actions.background": "#FFFFFF", + "theme.notification.background": "#1a1a1a", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.menus.menu.media.card.color": "#1A1A1A", + "theme.bar.menus.check_radio_button.background": "#000000", + "theme.bar.menus.check_radio_button.active": "#ffffff", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#FFFFFF", + "theme.bar.menus.menu.notifications.scrollbar.color": "#FFFFFF", + "theme.bar.menus.menu.notifications.pager.label": "#9a9996", + "theme.bar.menus.menu.notifications.pager.background": "#000000", + "theme.bar.buttons.clock.icon_background": "#FFFFFF", + "theme.bar.buttons.modules.ram.icon": "#ffffff", + "theme.bar.buttons.modules.storage.icon_background": "#ffffff", + "theme.bar.menus.popover.border": "#000000", + "theme.bar.buttons.volume.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.restart.text": "#ffffff", + "theme.bar.buttons.modules.updates.background": "#090909", + "theme.bar.buttons.modules.storage.icon": "#ffffff", + "theme.bar.buttons.modules.netstat.background": "#090909", + "theme.bar.buttons.modules.weather.icon": "#FFFFFF", + "theme.bar.buttons.modules.netstat.text": "#ffffff", + "theme.bar.buttons.modules.storage.background": "#090909", + "theme.bar.buttons.modules.power.icon": "#ffffff", + "theme.bar.buttons.modules.storage.text": "#ffffff", + "theme.bar.buttons.modules.cpu.background": "#090909", + "theme.bar.menus.menu.power.border.color": "#333333", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.logout.icon": "#000000", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.restart.icon": "#000000", + "theme.bar.buttons.modules.cpu.icon": "#ffffff", + "theme.bar.buttons.battery.icon_background": "#ffffff", + "theme.bar.buttons.modules.kbLayout.icon_background": "#ffffff", + "theme.bar.buttons.modules.weather.text": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#000000", + "theme.bar.menus.menu.power.buttons.sleep.text": "#ffffff", + "theme.bar.buttons.modules.weather.icon_background": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1A1A1A", + "theme.bar.buttons.media.icon_background": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.logout.background": "#1A1A1A", + "theme.bar.buttons.modules.kbLayout.icon": "#ffffff", + "theme.bar.buttons.modules.ram.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#ffffff", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1A1A1A", + "theme.bar.buttons.modules.ram.text": "#ffffff", + "theme.bar.menus.menu.power.buttons.logout.text": "#ffffff", + "theme.bar.buttons.modules.updates.icon_background": "#FFFFFF", + "theme.bar.buttons.modules.kbLayout.background": "#090909", + "theme.bar.buttons.modules.power.background": "#090909", + "theme.bar.buttons.modules.weather.background": "#090909", + "theme.bar.buttons.icon_background": "#090909", + "theme.bar.menus.menu.power.background.color": "#000000", + "theme.bar.buttons.modules.ram.background": "#090909", + "theme.bar.buttons.modules.netstat.icon": "#ffffff", + "theme.bar.buttons.windowtitle.icon_background": "#FFFFFF", + "theme.bar.buttons.modules.cpu.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#ffffff", + "theme.bar.buttons.modules.updates.text": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#000000", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#1A1A1A", + "theme.bar.buttons.modules.updates.icon": "#FFFFFF", + "theme.bar.buttons.modules.cpu.text": "#ffffff", + "theme.bar.buttons.modules.netstat.icon_background": "#ffffff", + "theme.bar.buttons.modules.kbLayout.text": "#ffffff", + "theme.bar.buttons.notifications.icon_background": "#FFFFFF", + "theme.bar.buttons.modules.power.border": "#ffffff", + "theme.bar.buttons.modules.weather.border": "#FFFFFF", + "theme.bar.buttons.modules.updates.border": "#FFFFFF", + "theme.bar.buttons.modules.kbLayout.border": "#ffffff", + "theme.bar.buttons.modules.netstat.border": "#ffffff", + "theme.bar.buttons.modules.storage.border": "#ffffff", + "theme.bar.buttons.modules.cpu.border": "#ffffff", + "theme.bar.buttons.modules.ram.border": "#ffffff", + "theme.bar.buttons.notifications.border": "#FFFFFF", + "theme.bar.buttons.clock.border": "#FFFFFF", + "theme.bar.buttons.battery.border": "#FFFFFF", + "theme.bar.buttons.systray.border": "#444444", + "theme.bar.buttons.bluetooth.border": "#FFFFFF", + "theme.bar.buttons.network.border": "#FFFFFF", + "theme.bar.buttons.volume.border": "#FFFFFF", + "theme.bar.buttons.media.border": "#FFFFFF", + "theme.bar.buttons.windowtitle.border": "#FFFFFF", + "theme.bar.buttons.workspaces.border": "#FFFFFF", + "theme.bar.buttons.dashboard.border": "#FFFFFF", + "theme.bar.buttons.modules.submap.background": "#090909", + "theme.bar.buttons.modules.submap.text": "#FFFFFF", + "theme.bar.buttons.modules.submap.border": "#FFFFFF", + "theme.bar.buttons.modules.submap.icon": "#FFFFFF", + "theme.bar.buttons.modules.submap.icon_background": "#090909" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/monochrome_split.json b/ags/HyprPanel/themes/monochrome_split.json new file mode 100644 index 0000000..111c155 --- /dev/null +++ b/ags/HyprPanel/themes/monochrome_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#000000", + "theme.bar.background": "#000000", + "theme.bar.buttons.media.icon": "#090909", + "theme.bar.buttons.media.text": "#FFFFFF", + "theme.bar.buttons.icon": "#FFFFFF", + "theme.bar.buttons.text": "#FFFFFF", + "theme.bar.buttons.hover": "#333333", + "theme.bar.buttons.background": "#1A1A1A", + "theme.bar.menus.text": "#CCCCCC", + "theme.bar.menus.border.color": "#333333", + "theme.bar.buttons.media.background": "#090909", + "theme.bar.menus.menu.volume.text": "#CCCCCC", + "theme.bar.menus.menu.volume.card.color": "#1A1A1A", + "theme.bar.menus.menu.volume.label.color": "#FFFFFF", + "theme.bar.menus.popover.text": "#FFFFFF", + "theme.bar.menus.popover.background": "#000000", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#000000", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#CCCCCC", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#FFFFFF", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#333333", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#000000", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#1A1A1A", + "theme.bar.menus.menu.notifications.switch.puck": "#333333", + "theme.bar.menus.menu.notifications.switch.disabled": "#333333", + "theme.bar.menus.menu.notifications.switch.enabled": "#FFFFFF", + "theme.bar.menus.menu.notifications.clear": "#ffffff", + "theme.bar.menus.menu.notifications.switch_divider": "#333333", + "theme.bar.menus.menu.notifications.border": "#333333", + "theme.bar.menus.menu.notifications.card": "#1A1A1A", + "theme.bar.menus.menu.notifications.background": "#000000", + "theme.bar.menus.menu.notifications.no_notifications_label": "#333333", + "theme.bar.menus.menu.notifications.label": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#FFFFFF", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#ffffff", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#333333", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#ffffff", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#ffffff", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#FFFFFF", + "theme.bar.menus.menu.dashboard.controls.input.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.input.background": "#FFFFFF", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#ffffff", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#ffffff", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#ffffff", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#000000", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#FFFFFF", + "theme.bar.menus.menu.dashboard.controls.disabled": "#333333", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#5CFF5C", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#000000", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#FFFFFF", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#ffffff", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#ffffff", + "theme.bar.menus.menu.dashboard.profile.name": "#FFFFFF", + "theme.bar.menus.menu.dashboard.border.color": "#333333", + "theme.bar.menus.menu.dashboard.background.color": "#000000", + "theme.bar.menus.menu.dashboard.card.color": "#1A1A1A", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.hourly.time": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#ffffff", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#ffffff", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#ffffff", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#ffffff", + "theme.bar.menus.menu.clock.weather.stats": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.status": "#FFFFFF", + "theme.bar.menus.menu.clock.weather.temperature": "#CCCCCC", + "theme.bar.menus.menu.clock.weather.icon": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.contextdays": "#333333", + "theme.bar.menus.menu.clock.calendar.days": "#CCCCCC", + "theme.bar.menus.menu.clock.calendar.currentday": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.paginator": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.weekdays": "#FFFFFF", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#ffffff", + "theme.bar.menus.menu.clock.time.timeperiod": "#ffffff", + "theme.bar.menus.menu.clock.time.time": "#FFFFFF", + "theme.bar.menus.menu.clock.text": "#CCCCCC", + "theme.bar.menus.menu.clock.border.color": "#333333", + "theme.bar.menus.menu.clock.background.color": "#000000", + "theme.bar.menus.menu.clock.card.color": "#1A1A1A", + "theme.bar.menus.menu.battery.slider.puck": "#5e5c64", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#5e5c64", + "theme.bar.menus.menu.battery.slider.background": "#5e5c64", + "theme.bar.menus.menu.battery.slider.primary": "#cccccc", + "theme.bar.menus.menu.battery.icons.active": "#ffffff", + "theme.bar.menus.menu.battery.icons.passive": "#9a9996", + "theme.bar.menus.menu.battery.listitems.active": "#ffffff", + "theme.bar.menus.menu.battery.listitems.passive": "#9a9996", + "theme.bar.menus.menu.battery.text": "#CCCCCC", + "theme.bar.menus.menu.battery.label.color": "#ffffff", + "theme.bar.menus.menu.battery.border.color": "#333333", + "theme.bar.menus.menu.battery.background.color": "#000000", + "theme.bar.menus.menu.battery.card.color": "#111111", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#1A1A1A", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#CCCCCC", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#000000", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#ffffff", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#9a9996", + "theme.bar.menus.menu.bluetooth.icons.active": "#ffffff", + "theme.bar.menus.menu.bluetooth.icons.passive": "#77767b", + "theme.bar.menus.menu.bluetooth.listitems.active": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#77767b", + "theme.bar.menus.menu.bluetooth.switch.puck": "#9a9996", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#444444", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.switch_divider": "#444444", + "theme.bar.menus.menu.bluetooth.status": "#CCCCCC", + "theme.bar.menus.menu.bluetooth.text": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.label.color": "#FFFFFF", + "theme.bar.menus.menu.bluetooth.border.color": "#444444", + "theme.bar.menus.menu.bluetooth.background.color": "#000000", + "theme.bar.menus.menu.bluetooth.card.color": "#111111", + "theme.bar.menus.menu.network.iconbuttons.active": "#FFFFFF", + "theme.bar.menus.menu.network.iconbuttons.passive": "#77767b", + "theme.bar.menus.menu.network.icons.active": "#FFFFFF", + "theme.bar.menus.menu.network.icons.passive": "#77767b", + "theme.bar.menus.menu.network.listitems.active": "#FFFFFF", + "theme.bar.menus.menu.network.listitems.passive": "#77767b", + "theme.bar.menus.menu.network.status.color": "#CCCCCC", + "theme.bar.menus.menu.network.text": "#FFFFFF", + "theme.bar.menus.menu.network.label.color": "#FFFFFF", + "theme.bar.menus.menu.network.border.color": "#444444", + "theme.bar.menus.menu.network.background.color": "#000000", + "theme.bar.menus.menu.network.card.color": "#111111", + "theme.bar.menus.menu.volume.input_slider.puck": "#CCCCCC", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#444444", + "theme.bar.menus.menu.volume.input_slider.background": "#77767b", + "theme.bar.menus.menu.volume.input_slider.primary": "#FFFFFF", + "theme.bar.menus.menu.volume.audio_slider.puck": "#CCCCCC", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#444444", + "theme.bar.menus.menu.volume.audio_slider.background": "#77767b", + "theme.bar.menus.menu.volume.audio_slider.primary": "#FFFFFF", + "theme.bar.menus.menu.volume.icons.active": "#FFFFFF", + "theme.bar.menus.menu.volume.icons.passive": "#77767b", + "theme.bar.menus.menu.volume.iconbutton.active": "#FFFFFF", + "theme.bar.menus.menu.volume.iconbutton.passive": "#77767b", + "theme.bar.menus.menu.volume.listitems.active": "#FFFFFF", + "theme.bar.menus.menu.volume.listitems.passive": "#77767b", + "theme.bar.menus.menu.volume.border.color": "#444444", + "theme.bar.menus.menu.volume.background.color": "#000000", + "theme.bar.menus.menu.media.slider.puck": "#CCCCCC", + "theme.bar.menus.menu.media.slider.backgroundhover": "#444444", + "theme.bar.menus.menu.media.slider.background": "#77767b", + "theme.bar.menus.menu.media.slider.primary": "#FFFFFF", + "theme.bar.menus.menu.media.buttons.text": "#000000", + "theme.bar.menus.menu.media.buttons.background": "#FFFFFF", + "theme.bar.menus.menu.media.buttons.enabled": "#FFFFFF", + "theme.bar.menus.menu.media.buttons.inactive": "#5e5c64", + "theme.bar.menus.menu.media.border.color": "#444444", + "theme.bar.menus.menu.media.background.color": "#000000", + "theme.bar.menus.menu.media.album": "#FFFFFF", + "theme.bar.menus.menu.media.artist": "#FFFFFF", + "theme.bar.menus.menu.media.song": "#FFFFFF", + "theme.bar.menus.tooltip.text": "#FFFFFF", + "theme.bar.menus.tooltip.background": "#000000", + "theme.bar.menus.dropdownmenu.divider": "#111111", + "theme.bar.menus.dropdownmenu.text": "#FFFFFF", + "theme.bar.menus.dropdownmenu.background": "#000000", + "theme.bar.menus.slider.puck": "#CCCCCC", + "theme.bar.menus.slider.backgroundhover": "#444444", + "theme.bar.menus.slider.background": "#CCCCCC", + "theme.bar.menus.slider.primary": "#FFFFFF", + "theme.bar.menus.progressbar.background": "#444444", + "theme.bar.menus.progressbar.foreground": "#FFFFFF", + "theme.bar.menus.iconbuttons.active": "#FFFFFF", + "theme.bar.menus.iconbuttons.passive": "#FFFFFF", + "theme.bar.menus.buttons.text": "#000000", + "theme.bar.menus.buttons.disabled": "#CCCCCC", + "theme.bar.menus.buttons.active": "#FFFFFF", + "theme.bar.menus.buttons.default": "#FFFFFF", + "theme.bar.menus.switch.puck": "#CCCCCC", + "theme.bar.menus.switch.disabled": "#444444", + "theme.bar.menus.switch.enabled": "#FFFFFF", + "theme.bar.menus.icons.active": "#FFFFFF", + "theme.bar.menus.icons.passive": "#CCCCCC", + "theme.bar.menus.listitems.active": "#ffffff", + "theme.bar.menus.listitems.passive": "#FFFFFF", + "theme.bar.menus.label": "#FFFFFF", + "theme.bar.menus.feinttext": "#444444", + "theme.bar.menus.dimtext": "#CCCCCC", + "theme.bar.menus.cards": "#111111", + "theme.bar.buttons.notifications.total": "#FFFFFF", + "theme.bar.buttons.notifications.icon": "#090909", + "theme.bar.buttons.notifications.background": "#090909", + "theme.bar.buttons.clock.icon": "#000000", + "theme.bar.buttons.clock.text": "#FFFFFF", + "theme.bar.buttons.clock.background": "#090909", + "theme.bar.buttons.battery.icon": "#090909", + "theme.bar.buttons.battery.text": "#FFFFFF", + "theme.bar.buttons.battery.background": "#090909", + "theme.bar.buttons.systray.background": "#090909", + "theme.bar.buttons.bluetooth.icon": "#090909", + "theme.bar.buttons.bluetooth.text": "#FFFFFF", + "theme.bar.buttons.bluetooth.background": "#090909", + "theme.bar.buttons.network.icon": "#090909", + "theme.bar.buttons.network.text": "#FFFFFF", + "theme.bar.buttons.network.background": "#090909", + "theme.bar.buttons.volume.icon": "#090909", + "theme.bar.buttons.volume.text": "#FFFFFF", + "theme.bar.buttons.volume.background": "#090909", + "theme.bar.buttons.windowtitle.icon": "#090909", + "theme.bar.buttons.windowtitle.text": "#FFFFFF", + "theme.bar.buttons.windowtitle.background": "#090909", + "theme.bar.buttons.workspaces.active": "#FFFFFF", + "theme.bar.buttons.workspaces.occupied": "#FFFFFF", + "theme.bar.buttons.workspaces.available": "#FFFFFF", + "theme.bar.buttons.workspaces.hover": "#444444", + "theme.bar.buttons.workspaces.background": "#090909", + "theme.bar.buttons.dashboard.icon": "#000000", + "theme.bar.buttons.dashboard.background": "#ffffff", + "theme.osd.label": "#FFFFFF", + "theme.osd.icon": "#000000", + "theme.osd.bar_overflow_color": "#FFFFFF", + "theme.osd.bar_empty_color": "#444444", + "theme.osd.bar_color": "#FFFFFF", + "theme.osd.icon_container": "#FFFFFF", + "theme.osd.bar_container": "#000000", + "theme.notification.close_button.label": "#000000", + "theme.notification.close_button.background": "#FFFFFF", + "theme.notification.labelicon": "#FFFFFF", + "theme.notification.text": "#FFFFFF", + "theme.notification.time": "#CCCCCC", + "theme.notification.border": "#444444", + "theme.notification.label": "#FFFFFF", + "theme.notification.actions.text": "#000000", + "theme.notification.actions.background": "#FFFFFF", + "theme.notification.background": "#1a1a1a", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.menus.menu.media.card.color": "#1A1A1A", + "theme.bar.menus.check_radio_button.background": "#000000", + "theme.bar.menus.check_radio_button.active": "#ffffff", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#ffffff", + "theme.bar.buttons.network.icon_background": "#ffffff", + "theme.bar.buttons.bluetooth.icon_background": "#ffffff", + "theme.bar.buttons.windowtitle.icon_background": "#ffffff", + "theme.bar.buttons.media.icon_background": "#ffffff", + "theme.bar.buttons.notifications.icon_background": "#ffffff", + "theme.bar.buttons.battery.icon_background": "#ffffff", + "theme.bar.buttons.clock.icon_background": "#ffffff", + "theme.bar.menus.menu.notifications.pager.button": "#FFFFFF", + "theme.bar.menus.menu.notifications.scrollbar.color": "#FFFFFF", + "theme.bar.menus.menu.notifications.pager.label": "#9a9996", + "theme.bar.menus.menu.notifications.pager.background": "#000000", + "theme.bar.buttons.modules.ram.icon": "#21252b", + "theme.bar.buttons.modules.storage.icon_background": "#ffffff", + "theme.bar.menus.popover.border": "#000000", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.restart.text": "#ffffff", + "theme.bar.buttons.modules.updates.background": "#090909", + "theme.bar.buttons.modules.storage.icon": "#21252b", + "theme.bar.buttons.modules.netstat.background": "#090909", + "theme.bar.buttons.modules.weather.icon": "#090909", + "theme.bar.buttons.modules.netstat.text": "#ffffff", + "theme.bar.buttons.modules.storage.background": "#090909", + "theme.bar.buttons.modules.power.icon": "#21252b", + "theme.bar.buttons.modules.storage.text": "#ffffff", + "theme.bar.buttons.modules.cpu.background": "#090909", + "theme.bar.menus.menu.power.border.color": "#333333", + "theme.bar.buttons.modules.power.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.logout.icon": "#000000", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.restart.icon": "#000000", + "theme.bar.buttons.modules.cpu.icon": "#21252b", + "theme.bar.buttons.modules.kbLayout.icon_background": "#ffffff", + "theme.bar.buttons.modules.weather.text": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#000000", + "theme.bar.menus.menu.power.buttons.sleep.text": "#ffffff", + "theme.bar.buttons.modules.weather.icon_background": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#1A1A1A", + "theme.bar.menus.menu.power.buttons.logout.background": "#1A1A1A", + "theme.bar.buttons.modules.kbLayout.icon": "#21252b", + "theme.bar.buttons.modules.ram.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#ffffff", + "theme.bar.menus.menu.power.buttons.sleep.background": "#1A1A1A", + "theme.bar.buttons.modules.ram.text": "#ffffff", + "theme.bar.menus.menu.power.buttons.logout.text": "#ffffff", + "theme.bar.buttons.modules.updates.icon_background": "#FFFFFF", + "theme.bar.buttons.modules.kbLayout.background": "#090909", + "theme.bar.buttons.modules.power.background": "#090909", + "theme.bar.buttons.modules.weather.background": "#090909", + "theme.bar.menus.menu.power.background.color": "#000000", + "theme.bar.buttons.modules.ram.background": "#090909", + "theme.bar.buttons.modules.netstat.icon": "#21252b", + "theme.bar.buttons.modules.cpu.icon_background": "#ffffff", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#ffffff", + "theme.bar.buttons.modules.updates.text": "#FFFFFF", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#000000", + "theme.bar.menus.menu.power.buttons.restart.background": "#1A1A1A", + "theme.bar.buttons.modules.updates.icon": "#21252b", + "theme.bar.buttons.modules.cpu.text": "#ffffff", + "theme.bar.buttons.modules.netstat.icon_background": "#ffffff", + "theme.bar.buttons.modules.kbLayout.text": "#ffffff", + "theme.bar.buttons.modules.power.border": "#ffffff", + "theme.bar.buttons.modules.weather.border": "#FFFFFF", + "theme.bar.buttons.modules.updates.border": "#FFFFFF", + "theme.bar.buttons.modules.kbLayout.border": "#ffffff", + "theme.bar.buttons.modules.netstat.border": "#ffffff", + "theme.bar.buttons.modules.storage.border": "#ffffff", + "theme.bar.buttons.modules.cpu.border": "#ffffff", + "theme.bar.buttons.modules.ram.border": "#ffffff", + "theme.bar.buttons.notifications.border": "#FFFFFF", + "theme.bar.buttons.clock.border": "#FFFFFF", + "theme.bar.buttons.battery.border": "#FFFFFF", + "theme.bar.buttons.systray.border": "#444444", + "theme.bar.buttons.bluetooth.border": "#FFFFFF", + "theme.bar.buttons.network.border": "#FFFFFF", + "theme.bar.buttons.volume.border": "#FFFFFF", + "theme.bar.buttons.media.border": "#FFFFFF", + "theme.bar.buttons.windowtitle.border": "#FFFFFF", + "theme.bar.buttons.workspaces.border": "#FFFFFF", + "theme.bar.buttons.dashboard.border": "#FFFFFF", + "theme.bar.buttons.modules.submap.background": "#090909", + "theme.bar.buttons.modules.submap.text": "#FFFFFF", + "theme.bar.buttons.modules.submap.border": "#FFFFFF", + "theme.bar.buttons.modules.submap.icon": "#21252b", + "theme.bar.buttons.modules.submap.icon_background": "#FFFFFF" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/nord.json b/ags/HyprPanel/themes/nord.json new file mode 100644 index 0000000..3f9159b --- /dev/null +++ b/ags/HyprPanel/themes/nord.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#2e3440", + "theme.bar.background": "#2e3440", + "theme.bar.buttons.media.icon": "#88c0d0", + "theme.bar.buttons.media.text": "#88c0d0", + "theme.bar.buttons.icon": "#88c0d0", + "theme.bar.buttons.text": "#88c0d0", + "theme.bar.buttons.hover": "#434c53", + "theme.bar.buttons.background": "#3b4252", + "theme.bar.menus.text": "#d8dee9", + "theme.bar.menus.border.color": "#434c53", + "theme.bar.buttons.media.background": "#3b4252", + "theme.bar.menus.menu.volume.text": "#d8dee9", + "theme.bar.menus.menu.volume.card.color": "#3b4252", + "theme.bar.menus.menu.volume.label.color": "#81a1c1", + "theme.bar.menus.popover.text": "#88c0d0", + "theme.bar.menus.popover.background": "#2e3440", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#2e3440", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#d8dee9", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#88c0d0", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#434c53", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#2e3440", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#3b4252", + "theme.bar.menus.menu.notifications.switch.puck": "#434c53", + "theme.bar.menus.menu.notifications.switch.disabled": "#434c53", + "theme.bar.menus.menu.notifications.switch.enabled": "#88c0d0", + "theme.bar.menus.menu.notifications.clear": "#8fbcbb", + "theme.bar.menus.menu.notifications.switch_divider": "#434c53", + "theme.bar.menus.menu.notifications.border": "#434c53", + "theme.bar.menus.menu.notifications.card": "#3b4252", + "theme.bar.menus.menu.notifications.background": "#2e3440", + "theme.bar.menus.menu.notifications.no_notifications_label": "#434c53", + "theme.bar.menus.menu.notifications.label": "#88c0d0", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#434c53", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#88c0d0", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#88c0d0", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8fbcbb", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#81a1c1", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#81a1c1", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#8fbcbb", + "theme.bar.menus.menu.dashboard.controls.input.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.input.background": "#8fbcbb", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#81a1c1", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#81a1c1", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#88c0d0", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#88c0d0", + "theme.bar.menus.menu.dashboard.controls.disabled": "#434c53", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#8fbcbb", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#2e3440", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#88c0d0", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#88c0d0", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#81a1c1", + "theme.bar.menus.menu.dashboard.profile.name": "#8fbcbb", + "theme.bar.menus.menu.dashboard.border.color": "#434c53", + "theme.bar.menus.menu.dashboard.background.color": "#2e3440", + "theme.bar.menus.menu.dashboard.card.color": "#3b4252", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.hourly.time": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#88c0d0", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#88c0d0", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#88c0d0", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#81a1c1", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.stats": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.status": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.temperature": "#d8dee9", + "theme.bar.menus.menu.clock.weather.icon": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.contextdays": "#434c53", + "theme.bar.menus.menu.clock.calendar.days": "#d8dee9", + "theme.bar.menus.menu.clock.calendar.currentday": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.paginator": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.weekdays": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8fbcbb", + "theme.bar.menus.menu.clock.time.timeperiod": "#8fbcbb", + "theme.bar.menus.menu.clock.time.time": "#8fbcbb", + "theme.bar.menus.menu.clock.text": "#d8dee9", + "theme.bar.menus.menu.clock.border.color": "#434c53", + "theme.bar.menus.menu.clock.background.color": "#2e3440", + "theme.bar.menus.menu.clock.card.color": "#3b4252", + "theme.bar.menus.menu.battery.slider.puck": "#4c566a", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.battery.slider.background": "#434c53", + "theme.bar.menus.menu.battery.slider.primary": "#81a1c1", + "theme.bar.menus.menu.battery.icons.active": "#81a1c1", + "theme.bar.menus.menu.battery.icons.passive": "#5e81ac", + "theme.bar.menus.menu.battery.listitems.active": "#81a1c1", + "theme.bar.menus.menu.battery.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.battery.text": "#d8dee9", + "theme.bar.menus.menu.battery.label.color": "#81a1c1", + "theme.bar.menus.menu.battery.border.color": "#434c53", + "theme.bar.menus.menu.battery.background.color": "#2e3440", + "theme.bar.menus.menu.battery.card.color": "#3b4252", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#3b4252", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#d8dee9", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#2e3440", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#88c0d0", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#d8dee9", + "theme.bar.menus.menu.bluetooth.icons.active": "#88c0d0", + "theme.bar.menus.menu.bluetooth.icons.passive": "#5e81ac", + "theme.bar.menus.menu.bluetooth.listitems.active": "#88c0d0", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.bluetooth.switch.puck": "#434c53", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#434c53", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#88c0d0", + "theme.bar.menus.menu.bluetooth.switch_divider": "#434c53", + "theme.bar.menus.menu.bluetooth.status": "#4c566a", + "theme.bar.menus.menu.bluetooth.text": "#d8dee9", + "theme.bar.menus.menu.bluetooth.label.color": "#88c0d0", + "theme.bar.menus.menu.bluetooth.border.color": "#434c53", + "theme.bar.menus.menu.bluetooth.background.color": "#2e3440", + "theme.bar.menus.menu.bluetooth.card.color": "#3b4252", + "theme.bar.menus.menu.network.iconbuttons.active": "#88c0d0", + "theme.bar.menus.menu.network.iconbuttons.passive": "#d8dee9", + "theme.bar.menus.menu.network.icons.active": "#88c0d0", + "theme.bar.menus.menu.network.icons.passive": "#5e81ac", + "theme.bar.menus.menu.network.listitems.active": "#88c0d0", + "theme.bar.menus.menu.network.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.network.status.color": "#4c566a", + "theme.bar.menus.menu.network.text": "#d8dee9", + "theme.bar.menus.menu.network.label.color": "#88c0d0", + "theme.bar.menus.menu.network.border.color": "#434c53", + "theme.bar.menus.menu.network.background.color": "#2e3440", + "theme.bar.menus.menu.network.card.color": "#3b4252", + "theme.bar.menus.menu.volume.input_slider.puck": "#434c53", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.volume.input_slider.background": "#434c53", + "theme.bar.menus.menu.volume.input_slider.primary": "#81a1c1", + "theme.bar.menus.menu.volume.audio_slider.puck": "#434c53", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.volume.audio_slider.background": "#434c53", + "theme.bar.menus.menu.volume.audio_slider.primary": "#81a1c1", + "theme.bar.menus.menu.volume.icons.active": "#81a1c1", + "theme.bar.menus.menu.volume.icons.passive": "#5e81ac", + "theme.bar.menus.menu.volume.iconbutton.active": "#81a1c1", + "theme.bar.menus.menu.volume.iconbutton.passive": "#d8dee9", + "theme.bar.menus.menu.volume.listitems.active": "#81a1c1", + "theme.bar.menus.menu.volume.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.volume.border.color": "#434c53", + "theme.bar.menus.menu.volume.background.color": "#2e3440", + "theme.bar.menus.menu.media.slider.puck": "#4c566a", + "theme.bar.menus.menu.media.slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.media.slider.background": "#434c53", + "theme.bar.menus.menu.media.slider.primary": "#8fbcbb", + "theme.bar.menus.menu.media.buttons.text": "#2e3440", + "theme.bar.menus.menu.media.buttons.background": "#88c0d0", + "theme.bar.menus.menu.media.buttons.enabled": "#8fbcbb", + "theme.bar.menus.menu.media.buttons.inactive": "#434c53", + "theme.bar.menus.menu.media.border.color": "#434c53", + "theme.bar.menus.menu.media.background.color": "#2e3440", + "theme.bar.menus.menu.media.album": "#8fbcbb", + "theme.bar.menus.menu.media.artist": "#8fbcbb", + "theme.bar.menus.menu.media.song": "#88c0d0", + "theme.bar.menus.tooltip.text": "#d8dee9", + "theme.bar.menus.tooltip.background": "#2e3440", + "theme.bar.menus.dropdownmenu.divider": "#3b4252", + "theme.bar.menus.dropdownmenu.text": "#d8dee9", + "theme.bar.menus.dropdownmenu.background": "#2e3440", + "theme.bar.menus.slider.puck": "#4c566a", + "theme.bar.menus.slider.backgroundhover": "#434c53", + "theme.bar.menus.slider.background": "#434c53", + "theme.bar.menus.slider.primary": "#88c0d0", + "theme.bar.menus.progressbar.background": "#434c53", + "theme.bar.menus.progressbar.foreground": "#88c0d0", + "theme.bar.menus.iconbuttons.active": "#88c0d0", + "theme.bar.menus.iconbuttons.passive": "#d8dee9", + "theme.bar.menus.buttons.text": "#2e3440", + "theme.bar.menus.buttons.disabled": "#434c53", + "theme.bar.menus.buttons.active": "#8fbcbb", + "theme.bar.menus.buttons.default": "#88c0d0", + "theme.bar.menus.switch.puck": "#434c53", + "theme.bar.menus.switch.disabled": "#434c53", + "theme.bar.menus.switch.enabled": "#88c0d0", + "theme.bar.menus.icons.active": "#88c0d0", + "theme.bar.menus.icons.passive": "#434c53", + "theme.bar.menus.listitems.active": "#88c0d0", + "theme.bar.menus.listitems.passive": "#d8dee9", + "theme.bar.menus.label": "#88c0d0", + "theme.bar.menus.feinttext": "#434c53", + "theme.bar.menus.dimtext": "#6272a4", + "theme.bar.menus.cards": "#3b4252", + "theme.bar.buttons.notifications.total": "#88c0d0", + "theme.bar.buttons.notifications.icon": "#88c0d0", + "theme.bar.buttons.notifications.background": "#3b4252", + "theme.bar.buttons.clock.icon": "#8fbcbb", + "theme.bar.buttons.clock.text": "#8fbcbb", + "theme.bar.buttons.clock.background": "#3b4252", + "theme.bar.buttons.battery.icon": "#81a1c1", + "theme.bar.buttons.battery.text": "#81a1c1", + "theme.bar.buttons.battery.background": "#3b4252", + "theme.bar.buttons.systray.background": "#3b4252", + "theme.bar.buttons.bluetooth.icon": "#88c0d0", + "theme.bar.buttons.bluetooth.text": "#88c0d0", + "theme.bar.buttons.bluetooth.background": "#3b4252", + "theme.bar.buttons.network.icon": "#88c0d0", + "theme.bar.buttons.network.text": "#88c0d0", + "theme.bar.buttons.network.background": "#3b4252", + "theme.bar.buttons.volume.icon": "#81a1c1", + "theme.bar.buttons.volume.text": "#81a1c1", + "theme.bar.buttons.volume.background": "#3b4252", + "theme.bar.buttons.windowtitle.icon": "#8fbcbb", + "theme.bar.buttons.windowtitle.text": "#8fbcbb", + "theme.bar.buttons.windowtitle.background": "#3b4252", + "theme.bar.buttons.workspaces.active": "#8fbcbb", + "theme.bar.buttons.workspaces.occupied": "#81a1c1", + "theme.bar.buttons.workspaces.available": "#88c0d0", + "theme.bar.buttons.workspaces.hover": "#434c53", + "theme.bar.buttons.workspaces.background": "#3b4252", + "theme.bar.buttons.dashboard.icon": "#81a1c1", + "theme.bar.buttons.dashboard.background": "#3b4252", + "theme.osd.label": "#88c0d0", + "theme.osd.icon": "#2e3440", + "theme.osd.bar_overflow_color": "#8fbcbb", + "theme.osd.bar_empty_color": "#434c53", + "theme.osd.bar_color": "#88c0d0", + "theme.osd.icon_container": "#88c0d0", + "theme.osd.bar_container": "#2e3440", + "theme.notification.close_button.label": "#2e3440", + "theme.notification.close_button.background": "#8fbcbb", + "theme.notification.labelicon": "#88c0d0", + "theme.notification.text": "#d8dee9", + "theme.notification.time": "#4c566a", + "theme.notification.border": "#434c53", + "theme.notification.label": "#88c0d0", + "theme.notification.actions.text": "#2e3440", + "theme.notification.actions.background": "#88c0d0", + "theme.notification.background": "#2e3440", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.menus.menu.media.card.color": "#3b4252", + "theme.bar.menus.check_radio_button.background": "#2e3440", + "theme.bar.menus.check_radio_button.active": "#88c0d0", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#88c0d0", + "theme.bar.menus.menu.notifications.scrollbar.color": "#88c0d0", + "theme.bar.menus.menu.notifications.pager.label": "#5e81ac", + "theme.bar.menus.menu.notifications.pager.background": "#2e3440", + "theme.bar.buttons.clock.icon_background": "#8fbcbb", + "theme.bar.buttons.modules.ram.icon": "#81a1c1", + "theme.bar.buttons.modules.storage.icon_background": "#8fbcbb", + "theme.bar.menus.popover.border": "#2e3440", + "theme.bar.buttons.volume.icon_background": "#81a1c1", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#88c0d0", + "theme.bar.menus.menu.power.buttons.restart.text": "#81a1c1", + "theme.bar.buttons.modules.updates.background": "#3b4252", + "theme.bar.buttons.modules.storage.icon": "#8fbcbb", + "theme.bar.buttons.modules.netstat.background": "#3b4252", + "theme.bar.buttons.modules.weather.icon": "#88c0d0", + "theme.bar.buttons.modules.netstat.text": "#8fbcbb", + "theme.bar.buttons.modules.storage.background": "#3b4252", + "theme.bar.buttons.modules.power.icon": "#8fbcbb", + "theme.bar.buttons.modules.storage.text": "#8fbcbb", + "theme.bar.buttons.modules.cpu.background": "#3b4252", + "theme.bar.menus.menu.power.border.color": "#434c53", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.logout.icon": "#2e3440", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#81a1c1", + "theme.bar.menus.menu.power.buttons.restart.icon": "#2e3440", + "theme.bar.buttons.modules.cpu.icon": "#8fbcbb", + "theme.bar.buttons.battery.icon_background": "#81a1c1", + "theme.bar.buttons.modules.kbLayout.icon_background": "#88c0d0", + "theme.bar.buttons.modules.weather.text": "#88c0d0", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#2e3440", + "theme.bar.menus.menu.power.buttons.sleep.text": "#88c0d0", + "theme.bar.buttons.modules.weather.icon_background": "#88c0d0", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#3b4252", + "theme.bar.buttons.media.icon_background": "#88c0d0", + "theme.bar.menus.menu.power.buttons.logout.background": "#3b4252", + "theme.bar.buttons.modules.kbLayout.icon": "#88c0d0", + "theme.bar.buttons.modules.ram.icon_background": "#81a1c1", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.sleep.background": "#3b4252", + "theme.bar.buttons.modules.ram.text": "#81a1c1", + "theme.bar.menus.menu.power.buttons.logout.text": "#8fbcbb", + "theme.bar.buttons.modules.updates.icon_background": "#88c0d0", + "theme.bar.buttons.modules.kbLayout.background": "#3b4252", + "theme.bar.buttons.modules.power.background": "#3b4252", + "theme.bar.buttons.modules.weather.background": "#3b4252", + "theme.bar.buttons.icon_background": "#3b4252", + "theme.bar.menus.menu.power.background.color": "#2e3440", + "theme.bar.buttons.modules.ram.background": "#3b4252", + "theme.bar.buttons.modules.netstat.icon": "#8fbcbb", + "theme.bar.buttons.windowtitle.icon_background": "#8fbcbb", + "theme.bar.buttons.modules.cpu.icon_background": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#8fbcbb", + "theme.bar.buttons.modules.updates.text": "#88c0d0", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#2e3440", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#3b4252", + "theme.bar.buttons.modules.updates.icon": "#88c0d0", + "theme.bar.buttons.modules.cpu.text": "#8fbcbb", + "theme.bar.buttons.modules.netstat.icon_background": "#8fbcbb", + "theme.bar.buttons.modules.kbLayout.text": "#88c0d0", + "theme.bar.buttons.notifications.icon_background": "#88c0d0", + "theme.bar.buttons.modules.power.border": "#8fbcbb", + "theme.bar.buttons.modules.weather.border": "#88c0d0", + "theme.bar.buttons.modules.updates.border": "#88c0d0", + "theme.bar.buttons.modules.kbLayout.border": "#88c0d0", + "theme.bar.buttons.modules.netstat.border": "#8fbcbb", + "theme.bar.buttons.modules.storage.border": "#8fbcbb", + "theme.bar.buttons.modules.cpu.border": "#8fbcbb", + "theme.bar.buttons.modules.ram.border": "#81a1c1", + "theme.bar.buttons.notifications.border": "#88c0d0", + "theme.bar.buttons.clock.border": "#8fbcbb", + "theme.bar.buttons.battery.border": "#81a1c1", + "theme.bar.buttons.systray.border": "#434c53", + "theme.bar.buttons.bluetooth.border": "#88c0d0", + "theme.bar.buttons.network.border": "#88c0d0", + "theme.bar.buttons.volume.border": "#81a1c1", + "theme.bar.buttons.media.border": "#88c0d0", + "theme.bar.buttons.windowtitle.border": "#8fbcbb", + "theme.bar.buttons.workspaces.border": "#2e3440", + "theme.bar.buttons.dashboard.border": "#81a1c1", + "theme.bar.buttons.modules.submap.background": "#3b4252", + "theme.bar.buttons.modules.submap.text": "#8fbcbb", + "theme.bar.buttons.modules.submap.border": "#8fbcbb", + "theme.bar.buttons.modules.submap.icon": "#8fbcbb", + "theme.bar.buttons.modules.submap.icon_background": "#3b4252" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/nord_split.json b/ags/HyprPanel/themes/nord_split.json new file mode 100644 index 0000000..9541e84 --- /dev/null +++ b/ags/HyprPanel/themes/nord_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#2e3440", + "theme.bar.background": "#2e3440", + "theme.bar.buttons.media.icon": "#3b4252", + "theme.bar.buttons.media.text": "#88c0d0", + "theme.bar.buttons.icon": "#88c0d0", + "theme.bar.buttons.text": "#88c0d0", + "theme.bar.buttons.hover": "#434c53", + "theme.bar.buttons.background": "#3b4252", + "theme.bar.menus.text": "#d8dee9", + "theme.bar.menus.border.color": "#434c53", + "theme.bar.buttons.media.background": "#3b4252", + "theme.bar.menus.menu.volume.text": "#d8dee9", + "theme.bar.menus.menu.volume.card.color": "#3b4252", + "theme.bar.menus.menu.volume.label.color": "#81a1c1", + "theme.bar.menus.popover.text": "#88c0d0", + "theme.bar.menus.popover.background": "#2e3440", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#2e3440", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#d8dee9", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#88c0d0", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#434c53", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#2e3440", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#3b4252", + "theme.bar.menus.menu.notifications.switch.puck": "#434c53", + "theme.bar.menus.menu.notifications.switch.disabled": "#434c53", + "theme.bar.menus.menu.notifications.switch.enabled": "#88c0d0", + "theme.bar.menus.menu.notifications.clear": "#8fbcbb", + "theme.bar.menus.menu.notifications.switch_divider": "#434c53", + "theme.bar.menus.menu.notifications.border": "#434c53", + "theme.bar.menus.menu.notifications.card": "#3b4252", + "theme.bar.menus.menu.notifications.background": "#2e3440", + "theme.bar.menus.menu.notifications.no_notifications_label": "#434c53", + "theme.bar.menus.menu.notifications.label": "#88c0d0", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#8fbcbb", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#81a1c1", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#434c53", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#88c0d0", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#88c0d0", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#8fbcbb", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#81a1c1", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#81a1c1", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#8fbcbb", + "theme.bar.menus.menu.dashboard.controls.input.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.input.background": "#8fbcbb", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#81a1c1", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#81a1c1", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#88c0d0", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#2e3440", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#88c0d0", + "theme.bar.menus.menu.dashboard.controls.disabled": "#434c53", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#8fbcbb", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#2e3440", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#88c0d0", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#88c0d0", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#8fbcbb", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#81a1c1", + "theme.bar.menus.menu.dashboard.profile.name": "#8fbcbb", + "theme.bar.menus.menu.dashboard.border.color": "#434c53", + "theme.bar.menus.menu.dashboard.background.color": "#2e3440", + "theme.bar.menus.menu.dashboard.card.color": "#3b4252", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.hourly.time": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#88c0d0", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#88c0d0", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#88c0d0", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#81a1c1", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.stats": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.status": "#8fbcbb", + "theme.bar.menus.menu.clock.weather.temperature": "#d8dee9", + "theme.bar.menus.menu.clock.weather.icon": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.contextdays": "#434c53", + "theme.bar.menus.menu.clock.calendar.days": "#d8dee9", + "theme.bar.menus.menu.clock.calendar.currentday": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.paginator": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.weekdays": "#8fbcbb", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#8fbcbb", + "theme.bar.menus.menu.clock.time.timeperiod": "#8fbcbb", + "theme.bar.menus.menu.clock.time.time": "#8fbcbb", + "theme.bar.menus.menu.clock.text": "#d8dee9", + "theme.bar.menus.menu.clock.border.color": "#434c53", + "theme.bar.menus.menu.clock.background.color": "#2e3440", + "theme.bar.menus.menu.clock.card.color": "#3b4252", + "theme.bar.menus.menu.battery.slider.puck": "#4c566a", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.battery.slider.background": "#434c53", + "theme.bar.menus.menu.battery.slider.primary": "#81a1c1", + "theme.bar.menus.menu.battery.icons.active": "#81a1c1", + "theme.bar.menus.menu.battery.icons.passive": "#5e81ac", + "theme.bar.menus.menu.battery.listitems.active": "#81a1c1", + "theme.bar.menus.menu.battery.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.battery.text": "#d8dee9", + "theme.bar.menus.menu.battery.label.color": "#81a1c1", + "theme.bar.menus.menu.battery.border.color": "#434c53", + "theme.bar.menus.menu.battery.background.color": "#2e3440", + "theme.bar.menus.menu.battery.card.color": "#3b4252", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#3b4252", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#d8dee9", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#2e3440", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#88c0d0", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#d8dee9", + "theme.bar.menus.menu.bluetooth.icons.active": "#88c0d0", + "theme.bar.menus.menu.bluetooth.icons.passive": "#5e81ac", + "theme.bar.menus.menu.bluetooth.listitems.active": "#88c0d0", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.bluetooth.switch.puck": "#434c53", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#434c53", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#88c0d0", + "theme.bar.menus.menu.bluetooth.switch_divider": "#434c53", + "theme.bar.menus.menu.bluetooth.status": "#4c566a", + "theme.bar.menus.menu.bluetooth.text": "#d8dee9", + "theme.bar.menus.menu.bluetooth.label.color": "#88c0d0", + "theme.bar.menus.menu.bluetooth.border.color": "#434c53", + "theme.bar.menus.menu.bluetooth.background.color": "#2e3440", + "theme.bar.menus.menu.bluetooth.card.color": "#3b4252", + "theme.bar.menus.menu.network.iconbuttons.active": "#88c0d0", + "theme.bar.menus.menu.network.iconbuttons.passive": "#d8dee9", + "theme.bar.menus.menu.network.icons.active": "#88c0d0", + "theme.bar.menus.menu.network.icons.passive": "#5e81ac", + "theme.bar.menus.menu.network.listitems.active": "#88c0d0", + "theme.bar.menus.menu.network.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.network.status.color": "#4c566a", + "theme.bar.menus.menu.network.text": "#d8dee9", + "theme.bar.menus.menu.network.label.color": "#88c0d0", + "theme.bar.menus.menu.network.border.color": "#434c53", + "theme.bar.menus.menu.network.background.color": "#2e3440", + "theme.bar.menus.menu.network.card.color": "#3b4252", + "theme.bar.menus.menu.volume.input_slider.puck": "#434c53", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.volume.input_slider.background": "#434c53", + "theme.bar.menus.menu.volume.input_slider.primary": "#81a1c1", + "theme.bar.menus.menu.volume.audio_slider.puck": "#434c53", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.volume.audio_slider.background": "#434c53", + "theme.bar.menus.menu.volume.audio_slider.primary": "#81a1c1", + "theme.bar.menus.menu.volume.icons.active": "#81a1c1", + "theme.bar.menus.menu.volume.icons.passive": "#5e81ac", + "theme.bar.menus.menu.volume.iconbutton.active": "#81a1c1", + "theme.bar.menus.menu.volume.iconbutton.passive": "#d8dee9", + "theme.bar.menus.menu.volume.listitems.active": "#81a1c1", + "theme.bar.menus.menu.volume.listitems.passive": "#d8dee9", + "theme.bar.menus.menu.volume.border.color": "#434c53", + "theme.bar.menus.menu.volume.background.color": "#2e3440", + "theme.bar.menus.menu.media.slider.puck": "#4c566a", + "theme.bar.menus.menu.media.slider.backgroundhover": "#434c53", + "theme.bar.menus.menu.media.slider.background": "#434c53", + "theme.bar.menus.menu.media.slider.primary": "#8fbcbb", + "theme.bar.menus.menu.media.buttons.text": "#2e3440", + "theme.bar.menus.menu.media.buttons.background": "#88c0d0", + "theme.bar.menus.menu.media.buttons.enabled": "#8fbcbb", + "theme.bar.menus.menu.media.buttons.inactive": "#434c53", + "theme.bar.menus.menu.media.border.color": "#434c53", + "theme.bar.menus.menu.media.background.color": "#2e3440", + "theme.bar.menus.menu.media.album": "#8fbcbb", + "theme.bar.menus.menu.media.artist": "#8fbcbb", + "theme.bar.menus.menu.media.song": "#88c0d0", + "theme.bar.menus.tooltip.text": "#d8dee9", + "theme.bar.menus.tooltip.background": "#2e3440", + "theme.bar.menus.dropdownmenu.divider": "#3b4252", + "theme.bar.menus.dropdownmenu.text": "#d8dee9", + "theme.bar.menus.dropdownmenu.background": "#2e3440", + "theme.bar.menus.slider.puck": "#4c566a", + "theme.bar.menus.slider.backgroundhover": "#434c53", + "theme.bar.menus.slider.background": "#434c53", + "theme.bar.menus.slider.primary": "#88c0d0", + "theme.bar.menus.progressbar.background": "#434c53", + "theme.bar.menus.progressbar.foreground": "#88c0d0", + "theme.bar.menus.iconbuttons.active": "#88c0d0", + "theme.bar.menus.iconbuttons.passive": "#d8dee9", + "theme.bar.menus.buttons.text": "#2e3440", + "theme.bar.menus.buttons.disabled": "#434c53", + "theme.bar.menus.buttons.active": "#8fbcbb", + "theme.bar.menus.buttons.default": "#88c0d0", + "theme.bar.menus.switch.puck": "#434c53", + "theme.bar.menus.switch.disabled": "#434c53", + "theme.bar.menus.switch.enabled": "#88c0d0", + "theme.bar.menus.icons.active": "#88c0d0", + "theme.bar.menus.icons.passive": "#434c53", + "theme.bar.menus.listitems.active": "#88c0d0", + "theme.bar.menus.listitems.passive": "#d8dee9", + "theme.bar.menus.label": "#88c0d0", + "theme.bar.menus.feinttext": "#434c53", + "theme.bar.menus.dimtext": "#6272a4", + "theme.bar.menus.cards": "#3b4252", + "theme.bar.buttons.notifications.total": "#88c0d0", + "theme.bar.buttons.notifications.icon": "#3b4252", + "theme.bar.buttons.notifications.background": "#3b4252", + "theme.bar.buttons.clock.icon": "#3b4252", + "theme.bar.buttons.clock.text": "#8fbcbb", + "theme.bar.buttons.clock.background": "#3b4252", + "theme.bar.buttons.battery.icon": "#3b4252", + "theme.bar.buttons.battery.text": "#81a1c1", + "theme.bar.buttons.battery.background": "#3b4252", + "theme.bar.buttons.systray.background": "#3b4252", + "theme.bar.buttons.bluetooth.icon": "#3b4252", + "theme.bar.buttons.bluetooth.text": "#88c0d0", + "theme.bar.buttons.bluetooth.background": "#3b4252", + "theme.bar.buttons.network.icon": "#3b4252", + "theme.bar.buttons.network.text": "#88c0d0", + "theme.bar.buttons.network.background": "#3b4252", + "theme.bar.buttons.volume.icon": "#3b4252", + "theme.bar.buttons.volume.text": "#81a1c1", + "theme.bar.buttons.volume.background": "#3b4252", + "theme.bar.buttons.windowtitle.icon": "#3b4252", + "theme.bar.buttons.windowtitle.text": "#8fbcbb", + "theme.bar.buttons.windowtitle.background": "#3b4252", + "theme.bar.buttons.workspaces.active": "#8fbcbb", + "theme.bar.buttons.workspaces.occupied": "#81a1c1", + "theme.bar.buttons.workspaces.available": "#88c0d0", + "theme.bar.buttons.workspaces.hover": "#8fbcbb", + "theme.bar.buttons.workspaces.background": "#3b4252", + "theme.bar.buttons.dashboard.icon": "#3b4252", + "theme.bar.buttons.dashboard.background": "#81a1c1", + "theme.osd.label": "#88c0d0", + "theme.osd.icon": "#2e3440", + "theme.osd.bar_overflow_color": "#8fbcbb", + "theme.osd.bar_empty_color": "#434c53", + "theme.osd.bar_color": "#88c0d0", + "theme.osd.icon_container": "#88c0d0", + "theme.osd.bar_container": "#2e3440", + "theme.notification.close_button.label": "#2e3440", + "theme.notification.close_button.background": "#8fbcbb", + "theme.notification.labelicon": "#88c0d0", + "theme.notification.text": "#d8dee9", + "theme.notification.time": "#4c566a", + "theme.notification.border": "#434c53", + "theme.notification.label": "#88c0d0", + "theme.notification.actions.text": "#2e3440", + "theme.notification.actions.background": "#88c0d0", + "theme.notification.background": "#2e3440", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#ffffff", + "theme.bar.menus.menu.media.card.color": "#3b4252", + "theme.bar.menus.check_radio_button.background": "#2e3440", + "theme.bar.menus.check_radio_button.active": "#88c0d0", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#81a1c1", + "theme.bar.buttons.network.icon_background": "#88c0d0", + "theme.bar.buttons.bluetooth.icon_background": "#88c0d0", + "theme.bar.buttons.windowtitle.icon_background": "#8fbcbb", + "theme.bar.buttons.media.icon_background": "#88c0d0", + "theme.bar.buttons.notifications.icon_background": "#88c0d0", + "theme.bar.buttons.battery.icon_background": "#81a1c1", + "theme.bar.buttons.clock.icon_background": "#8fbcbb", + "theme.bar.menus.menu.notifications.pager.button": "#88c0d0", + "theme.bar.menus.menu.notifications.scrollbar.color": "#88c0d0", + "theme.bar.menus.menu.notifications.pager.label": "#5e81ac", + "theme.bar.menus.menu.notifications.pager.background": "#2e3440", + "theme.bar.buttons.modules.ram.icon": "#21252b", + "theme.bar.buttons.modules.storage.icon_background": "#8fbcbb", + "theme.bar.menus.popover.border": "#2e3440", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#88c0d0", + "theme.bar.menus.menu.power.buttons.restart.text": "#81a1c1", + "theme.bar.buttons.modules.updates.background": "#3b4252", + "theme.bar.buttons.modules.storage.icon": "#21252b", + "theme.bar.buttons.modules.netstat.background": "#3b4252", + "theme.bar.buttons.modules.weather.icon": "#3b4252", + "theme.bar.buttons.modules.netstat.text": "#8fbcbb", + "theme.bar.buttons.modules.storage.background": "#3b4252", + "theme.bar.buttons.modules.power.icon": "#21252b", + "theme.bar.buttons.modules.storage.text": "#8fbcbb", + "theme.bar.buttons.modules.cpu.background": "#3b4252", + "theme.bar.menus.menu.power.border.color": "#434c53", + "theme.bar.buttons.modules.power.icon_background": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.logout.icon": "#2e3440", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#81a1c1", + "theme.bar.menus.menu.power.buttons.restart.icon": "#2e3440", + "theme.bar.buttons.modules.cpu.icon": "#21252b", + "theme.bar.buttons.modules.kbLayout.icon_background": "#88c0d0", + "theme.bar.buttons.modules.weather.text": "#88c0d0", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#2e3440", + "theme.bar.menus.menu.power.buttons.sleep.text": "#88c0d0", + "theme.bar.buttons.modules.weather.icon_background": "#88c0d0", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#3b4252", + "theme.bar.menus.menu.power.buttons.logout.background": "#3b4252", + "theme.bar.buttons.modules.kbLayout.icon": "#21252b", + "theme.bar.buttons.modules.ram.icon_background": "#81a1c1", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.sleep.background": "#3b4252", + "theme.bar.buttons.modules.ram.text": "#81a1c1", + "theme.bar.menus.menu.power.buttons.logout.text": "#8fbcbb", + "theme.bar.buttons.modules.updates.icon_background": "#88c0d0", + "theme.bar.buttons.modules.kbLayout.background": "#3b4252", + "theme.bar.buttons.modules.power.background": "#3b4252", + "theme.bar.buttons.modules.weather.background": "#3b4252", + "theme.bar.menus.menu.power.background.color": "#2e3440", + "theme.bar.buttons.modules.ram.background": "#3b4252", + "theme.bar.buttons.modules.netstat.icon": "#21252b", + "theme.bar.buttons.modules.cpu.icon_background": "#8fbcbb", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#8fbcbb", + "theme.bar.buttons.modules.updates.text": "#88c0d0", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#2e3440", + "theme.bar.menus.menu.power.buttons.restart.background": "#3b4252", + "theme.bar.buttons.modules.updates.icon": "#21252b", + "theme.bar.buttons.modules.cpu.text": "#8fbcbb", + "theme.bar.buttons.modules.netstat.icon_background": "#8fbcbb", + "theme.bar.buttons.modules.kbLayout.text": "#88c0d0", + "theme.bar.buttons.modules.power.border": "#8fbcbb", + "theme.bar.buttons.modules.weather.border": "#88c0d0", + "theme.bar.buttons.modules.updates.border": "#88c0d0", + "theme.bar.buttons.modules.kbLayout.border": "#88c0d0", + "theme.bar.buttons.modules.netstat.border": "#8fbcbb", + "theme.bar.buttons.modules.storage.border": "#8fbcbb", + "theme.bar.buttons.modules.cpu.border": "#8fbcbb", + "theme.bar.buttons.modules.ram.border": "#81a1c1", + "theme.bar.buttons.notifications.border": "#88c0d0", + "theme.bar.buttons.clock.border": "#8fbcbb", + "theme.bar.buttons.battery.border": "#81a1c1", + "theme.bar.buttons.systray.border": "#434c53", + "theme.bar.buttons.bluetooth.border": "#88c0d0", + "theme.bar.buttons.network.border": "#88c0d0", + "theme.bar.buttons.volume.border": "#81a1c1", + "theme.bar.buttons.media.border": "#88c0d0", + "theme.bar.buttons.windowtitle.border": "#8fbcbb", + "theme.bar.buttons.workspaces.border": "#2e3440", + "theme.bar.buttons.dashboard.border": "#81a1c1", + "theme.bar.buttons.modules.submap.background": "#3b4252", + "theme.bar.buttons.modules.submap.text": "#8fbcbb", + "theme.bar.buttons.modules.submap.border": "#8fbcbb", + "theme.bar.buttons.modules.submap.icon": "#21252b", + "theme.bar.buttons.modules.submap.icon_background": "#8fbcbb" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/one_dark.json b/ags/HyprPanel/themes/one_dark.json new file mode 100644 index 0000000..8c58b2a --- /dev/null +++ b/ags/HyprPanel/themes/one_dark.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#282c34", + "theme.bar.background": "#282c34", + "theme.bar.buttons.media.icon": "#61afef", + "theme.bar.buttons.media.text": "#61afef", + "theme.bar.buttons.icon": "#61afef", + "theme.bar.buttons.text": "#61afef", + "theme.bar.buttons.hover": "#3e4451", + "theme.bar.buttons.background": "#3e4451", + "theme.bar.menus.text": "#abb2bf", + "theme.bar.menus.border.color": "#4b5263", + "theme.bar.buttons.media.background": "#21252b", + "theme.bar.menus.menu.volume.text": "#abb2bf", + "theme.bar.menus.menu.volume.card.color": "#21252b", + "theme.bar.menus.menu.volume.label.color": "#e06c75", + "theme.bar.menus.popover.text": "#61afef", + "theme.bar.menus.popover.background": "#282c34", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#e06c75", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#e06c75", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#98c379", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#282c34", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#abb2bf", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#61afef", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#4b5263", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#282c34", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#21252b", + "theme.bar.menus.menu.notifications.switch.puck": "#3e4451", + "theme.bar.menus.menu.notifications.switch.disabled": "#4b5263", + "theme.bar.menus.menu.notifications.switch.enabled": "#61afef", + "theme.bar.menus.menu.notifications.clear": "#e06c75", + "theme.bar.menus.menu.notifications.switch_divider": "#3e4451", + "theme.bar.menus.menu.notifications.border": "#4b5263", + "theme.bar.menus.menu.notifications.card": "#21252b", + "theme.bar.menus.menu.notifications.background": "#282c34", + "theme.bar.menus.menu.notifications.no_notifications_label": "#4b5263", + "theme.bar.menus.menu.notifications.label": "#61afef", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#c678dd", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#c678dd", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#c678dd", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#98c379", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#98c379", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#98c379", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#e5c07b", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#e5c07b", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#e5c07b", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#e06c75", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#e06c75", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#e06c75", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#3e4451", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#61afef", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#c678dd", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#56b6c2", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#e06c75", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#e5c07b", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#c678dd", + "theme.bar.menus.menu.dashboard.controls.input.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.input.background": "#c678dd", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#e06c75", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#e5c07b", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#56b6c2", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c678dd", + "theme.bar.menus.menu.dashboard.controls.disabled": "#5c6370", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#98c379", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#282c34", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#61afef", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#56b6c2", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#98c379", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#d19a66", + "theme.bar.menus.menu.dashboard.profile.name": "#c678dd", + "theme.bar.menus.menu.dashboard.border.color": "#4b5263", + "theme.bar.menus.menu.dashboard.background.color": "#282c34", + "theme.bar.menus.menu.dashboard.card.color": "#21252b", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#c678dd", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#c678dd", + "theme.bar.menus.menu.clock.weather.hourly.time": "#c678dd", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#56b6c2", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#61afef", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#61afef", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#d19a66", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#e06c75", + "theme.bar.menus.menu.clock.weather.stats": "#c678dd", + "theme.bar.menus.menu.clock.weather.status": "#56b6c2", + "theme.bar.menus.menu.clock.weather.temperature": "#abb2bf", + "theme.bar.menus.menu.clock.weather.icon": "#c678dd", + "theme.bar.menus.menu.clock.calendar.contextdays": "#5c6370", + "theme.bar.menus.menu.clock.calendar.days": "#abb2bf", + "theme.bar.menus.menu.clock.calendar.currentday": "#c678dd", + "theme.bar.menus.menu.clock.calendar.paginator": "#c678dd", + "theme.bar.menus.menu.clock.calendar.weekdays": "#c678dd", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#56b6c2", + "theme.bar.menus.menu.clock.time.timeperiod": "#56b6c2", + "theme.bar.menus.menu.clock.time.time": "#c678dd", + "theme.bar.menus.menu.clock.text": "#abb2bf", + "theme.bar.menus.menu.clock.border.color": "#4b5263", + "theme.bar.menus.menu.clock.background.color": "#282c34", + "theme.bar.menus.menu.clock.card.color": "#21252b", + "theme.bar.menus.menu.battery.slider.puck": "#3e4451", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#3e4451", + "theme.bar.menus.menu.battery.slider.background": "#5c6370", + "theme.bar.menus.menu.battery.slider.primary": "#e5c07b", + "theme.bar.menus.menu.battery.icons.active": "#e5c07b", + "theme.bar.menus.menu.battery.icons.passive": "#828997", + "theme.bar.menus.menu.battery.listitems.active": "#e5c07b", + "theme.bar.menus.menu.battery.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.battery.text": "#abb2bf", + "theme.bar.menus.menu.battery.label.color": "#e5c07b", + "theme.bar.menus.menu.battery.border.color": "#4b5263", + "theme.bar.menus.menu.battery.background.color": "#282c34", + "theme.bar.menus.menu.battery.card.color": "#21252b", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#21252b", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#abb2bf", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#282c34", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#61afef", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#abb2bf", + "theme.bar.menus.menu.bluetooth.icons.active": "#61afef", + "theme.bar.menus.menu.bluetooth.icons.passive": "#5c6370", + "theme.bar.menus.menu.bluetooth.listitems.active": "#61afef", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.bluetooth.switch.puck": "#4b5263", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#3e4451", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#61afef", + "theme.bar.menus.menu.bluetooth.switch_divider": "#4b5263", + "theme.bar.menus.menu.bluetooth.status": "#5c6370", + "theme.bar.menus.menu.bluetooth.text": "#abb2bf", + "theme.bar.menus.menu.bluetooth.label.color": "#61afef", + "theme.bar.menus.menu.bluetooth.border.color": "#3e4451", + "theme.bar.menus.menu.bluetooth.background.color": "#282c34", + "theme.bar.menus.menu.bluetooth.card.color": "#21252b", + "theme.bar.menus.menu.network.iconbuttons.active": "#c678dd", + "theme.bar.menus.menu.network.iconbuttons.passive": "#abb2bf", + "theme.bar.menus.menu.network.icons.active": "#c678dd", + "theme.bar.menus.menu.network.icons.passive": "#5c6370", + "theme.bar.menus.menu.network.listitems.active": "#c678dd", + "theme.bar.menus.menu.network.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.network.status.color": "#5c6370", + "theme.bar.menus.menu.network.text": "#abb2bf", + "theme.bar.menus.menu.network.label.color": "#c678dd", + "theme.bar.menus.menu.network.border.color": "#3e4451", + "theme.bar.menus.menu.network.background.color": "#282c34", + "theme.bar.menus.menu.network.card.color": "#21252b", + "theme.bar.menus.menu.volume.input_slider.puck": "#4b5263", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#4b5263", + "theme.bar.menus.menu.volume.input_slider.background": "#4b5263", + "theme.bar.menus.menu.volume.input_slider.primary": "#e06c75", + "theme.bar.menus.menu.volume.audio_slider.puck": "#4b5263", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#4b5263", + "theme.bar.menus.menu.volume.audio_slider.background": "#4b5263", + "theme.bar.menus.menu.volume.audio_slider.primary": "#e06c75", + "theme.bar.menus.menu.volume.icons.active": "#e06c75", + "theme.bar.menus.menu.volume.icons.passive": "#5c6370", + "theme.bar.menus.menu.volume.iconbutton.active": "#e06c75", + "theme.bar.menus.menu.volume.iconbutton.passive": "#abb2bf", + "theme.bar.menus.menu.volume.listitems.active": "#e06c75", + "theme.bar.menus.menu.volume.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.volume.border.color": "#3e4451", + "theme.bar.menus.menu.volume.background.color": "#282c34", + "theme.bar.menus.menu.media.slider.puck": "#5c6370", + "theme.bar.menus.menu.media.slider.backgroundhover": "#4b5263", + "theme.bar.menus.menu.media.slider.background": "#4b5263", + "theme.bar.menus.menu.media.slider.primary": "#98c379", + "theme.bar.menus.menu.media.buttons.text": "#282c34", + "theme.bar.menus.menu.media.buttons.background": "#98c379", + "theme.bar.menus.menu.media.buttons.enabled": "#56b6c2", + "theme.bar.menus.menu.media.buttons.inactive": "#4b5263", + "theme.bar.menus.menu.media.border.color": "#3e4451", + "theme.bar.menus.menu.media.background.color": "#282c34", + "theme.bar.menus.menu.media.album": "#98c379", + "theme.bar.menus.menu.media.artist": "#56b6c2", + "theme.bar.menus.menu.media.song": "#98c379", + "theme.bar.menus.tooltip.text": "#abb2bf", + "theme.bar.menus.tooltip.background": "#282c34", + "theme.bar.menus.dropdownmenu.divider": "#21252b", + "theme.bar.menus.dropdownmenu.text": "#abb2bf", + "theme.bar.menus.dropdownmenu.background": "#282c34", + "theme.bar.menus.slider.puck": "#5c6370", + "theme.bar.menus.slider.backgroundhover": "#4b5263", + "theme.bar.menus.slider.background": "#4b5263", + "theme.bar.menus.slider.primary": "#61afef", + "theme.bar.menus.progressbar.background": "#4b5263", + "theme.bar.menus.progressbar.foreground": "#61afef", + "theme.bar.menus.iconbuttons.active": "#61afef", + "theme.bar.menus.iconbuttons.passive": "#abb2bf", + "theme.bar.menus.buttons.text": "#282c34", + "theme.bar.menus.buttons.disabled": "#4b5263", + "theme.bar.menus.buttons.active": "#98c379", + "theme.bar.menus.buttons.default": "#61afef", + "theme.bar.menus.switch.puck": "#4b5263", + "theme.bar.menus.switch.disabled": "#3e4451", + "theme.bar.menus.switch.enabled": "#61afef", + "theme.bar.menus.icons.active": "#61afef", + "theme.bar.menus.icons.passive": "#4b5263", + "theme.bar.menus.listitems.active": "#61afef", + "theme.bar.menus.listitems.passive": "#abb2bf", + "theme.bar.menus.label": "#61afef", + "theme.bar.menus.feinttext": "#3e4451", + "theme.bar.menus.dimtext": "#4b5263", + "theme.bar.menus.cards": "#21252b", + "theme.bar.buttons.notifications.total": "#61afef", + "theme.bar.buttons.notifications.icon": "#61afef", + "theme.bar.buttons.notifications.background": "#21252b", + "theme.bar.buttons.clock.icon": "#98c379", + "theme.bar.buttons.clock.text": "#98c379", + "theme.bar.buttons.clock.background": "#21252b", + "theme.bar.buttons.battery.icon": "#e5c07b", + "theme.bar.buttons.battery.text": "#e5c07b", + "theme.bar.buttons.battery.background": "#21252b", + "theme.bar.buttons.systray.background": "#21252b", + "theme.bar.buttons.bluetooth.icon": "#61afef", + "theme.bar.buttons.bluetooth.text": "#61afef", + "theme.bar.buttons.bluetooth.background": "#21252b", + "theme.bar.buttons.network.icon": "#c678dd", + "theme.bar.buttons.network.text": "#c678dd", + "theme.bar.buttons.network.background": "#21252b", + "theme.bar.buttons.volume.icon": "#e06c75", + "theme.bar.buttons.volume.text": "#e06c75", + "theme.bar.buttons.volume.background": "#21252b", + "theme.bar.buttons.windowtitle.icon": "#98c379", + "theme.bar.buttons.windowtitle.text": "#98c379", + "theme.bar.buttons.windowtitle.background": "#21252b", + "theme.bar.buttons.workspaces.active": "#c678dd", + "theme.bar.buttons.workspaces.occupied": "#e06c75", + "theme.bar.buttons.workspaces.available": "#61afef", + "theme.bar.buttons.workspaces.hover": "#3e4451", + "theme.bar.buttons.workspaces.background": "#21252b", + "theme.bar.buttons.dashboard.icon": "#e5c07b", + "theme.bar.buttons.dashboard.background": "#21252b", + "theme.osd.label": "#61afef", + "theme.osd.icon": "#282c34", + "theme.osd.bar_overflow_color": "#e06c75", + "theme.osd.bar_empty_color": "#4b5263", + "theme.osd.bar_color": "#61afef", + "theme.osd.icon_container": "#61afef", + "theme.osd.bar_container": "#282c34", + "theme.notification.close_button.label": "#282c34", + "theme.notification.close_button.background": "#e06c75", + "theme.notification.labelicon": "#61afef", + "theme.notification.text": "#abb2bf", + "theme.notification.time": "#5c6370", + "theme.notification.border": "#4b5263", + "theme.notification.label": "#61afef", + "theme.notification.actions.text": "#282c34", + "theme.notification.actions.background": "#61afef", + "theme.notification.background": "#282c34", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#21252b", + "theme.bar.menus.check_radio_button.background": "#2e3440", + "theme.bar.menus.check_radio_button.active": "#88c0d0", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#61afef", + "theme.bar.menus.menu.notifications.scrollbar.color": "#61afef", + "theme.bar.menus.menu.notifications.pager.label": "#828997", + "theme.bar.menus.menu.notifications.pager.background": "#282c34", + "theme.bar.buttons.clock.icon_background": "#c678dd", + "theme.bar.buttons.modules.ram.icon": "#e5c07b", + "theme.bar.buttons.modules.storage.icon_background": "#e06c75", + "theme.bar.menus.popover.border": "#282c34", + "theme.bar.buttons.volume.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#56b6c2", + "theme.bar.menus.menu.power.buttons.restart.text": "#d19a66", + "theme.bar.buttons.modules.updates.background": "#21252b", + "theme.bar.buttons.modules.storage.icon": "#e06c75", + "theme.bar.buttons.modules.netstat.background": "#21252b", + "theme.bar.buttons.modules.weather.icon": "#61afef", + "theme.bar.buttons.modules.netstat.text": "#98c379", + "theme.bar.buttons.modules.storage.background": "#21252b", + "theme.bar.buttons.modules.power.icon": "#e06c75", + "theme.bar.buttons.modules.storage.text": "#e06c75", + "theme.bar.buttons.modules.cpu.background": "#21252b", + "theme.bar.menus.menu.power.border.color": "#4b5263", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.logout.icon": "#282c34", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#d19a66", + "theme.bar.menus.menu.power.buttons.restart.icon": "#282c34", + "theme.bar.buttons.modules.cpu.icon": "#e06c75", + "theme.bar.buttons.battery.icon_background": "#e5c07b", + "theme.bar.buttons.modules.kbLayout.icon_background": "#56b6c2", + "theme.bar.buttons.modules.weather.text": "#61afef", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#282c34", + "theme.bar.menus.menu.power.buttons.sleep.text": "#56b6c2", + "theme.bar.buttons.modules.weather.icon_background": "#61afef", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#21252b", + "theme.bar.buttons.media.icon_background": "#61afef", + "theme.bar.menus.menu.power.buttons.logout.background": "#21252b", + "theme.bar.buttons.modules.kbLayout.icon": "#56b6c2", + "theme.bar.buttons.modules.ram.icon_background": "#e5c07b", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#e06c75", + "theme.bar.menus.menu.power.buttons.sleep.background": "#21252b", + "theme.bar.buttons.modules.ram.text": "#e5c07b", + "theme.bar.menus.menu.power.buttons.logout.text": "#98c379", + "theme.bar.buttons.modules.updates.icon_background": "#c678dd", + "theme.bar.buttons.modules.kbLayout.background": "#21252b", + "theme.bar.buttons.modules.power.background": "#21252b", + "theme.bar.buttons.modules.weather.background": "#21252b", + "theme.bar.buttons.icon_background": "#21252b", + "theme.bar.menus.menu.power.background.color": "#282c34", + "theme.bar.buttons.modules.ram.background": "#21252b", + "theme.bar.buttons.modules.netstat.icon": "#98c379", + "theme.bar.buttons.windowtitle.icon_background": "#c678dd", + "theme.bar.buttons.modules.cpu.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#98c379", + "theme.bar.buttons.modules.updates.text": "#c678dd", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#282c34", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#21252b", + "theme.bar.buttons.modules.updates.icon": "#c678dd", + "theme.bar.buttons.modules.cpu.text": "#e06c75", + "theme.bar.buttons.modules.netstat.icon_background": "#98c379", + "theme.bar.buttons.modules.kbLayout.text": "#56b6c2", + "theme.bar.buttons.notifications.icon_background": "#61afef", + "theme.bar.buttons.modules.power.border": "#e06c75", + "theme.bar.buttons.modules.weather.border": "#61afef", + "theme.bar.buttons.modules.updates.border": "#c678dd", + "theme.bar.buttons.modules.kbLayout.border": "#56b6c2", + "theme.bar.buttons.modules.netstat.border": "#98c379", + "theme.bar.buttons.modules.storage.border": "#e06c75", + "theme.bar.buttons.modules.cpu.border": "#e06c75", + "theme.bar.buttons.modules.ram.border": "#e5c07b", + "theme.bar.buttons.notifications.border": "#61afef", + "theme.bar.buttons.clock.border": "#98c379", + "theme.bar.buttons.battery.border": "#e5c07b", + "theme.bar.buttons.systray.border": "#4b5263", + "theme.bar.buttons.bluetooth.border": "#61afef", + "theme.bar.buttons.network.border": "#c678dd", + "theme.bar.buttons.volume.border": "#e06c75", + "theme.bar.buttons.media.border": "#61afef", + "theme.bar.buttons.windowtitle.border": "#98c379", + "theme.bar.buttons.workspaces.border": "#21252b", + "theme.bar.buttons.dashboard.border": "#e5c07b", + "theme.bar.buttons.modules.submap.background": "#21252b", + "theme.bar.buttons.modules.submap.text": "#56b6c2", + "theme.bar.buttons.modules.submap.border": "#56b6c2", + "theme.bar.buttons.modules.submap.icon": "#56b6c2", + "theme.bar.buttons.modules.submap.icon_background": "#21252b" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/one_dark_split.json b/ags/HyprPanel/themes/one_dark_split.json new file mode 100644 index 0000000..7222e05 --- /dev/null +++ b/ags/HyprPanel/themes/one_dark_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#282c34", + "theme.bar.background": "#282c34", + "theme.bar.buttons.media.icon": "#21252b", + "theme.bar.buttons.media.text": "#61afef", + "theme.bar.buttons.icon": "#61afef", + "theme.bar.buttons.text": "#61afef", + "theme.bar.buttons.hover": "#3e4451", + "theme.bar.buttons.background": "#3e4451", + "theme.bar.menus.text": "#abb2bf", + "theme.bar.menus.border.color": "#4b5263", + "theme.bar.buttons.media.background": "#21252b", + "theme.bar.menus.menu.volume.text": "#abb2bf", + "theme.bar.menus.menu.volume.card.color": "#21252b", + "theme.bar.menus.menu.volume.label.color": "#e06c75", + "theme.bar.menus.popover.text": "#61afef", + "theme.bar.menus.popover.background": "#282c34", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#e06c75", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#e06c75", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#98c379", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#282c34", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#abb2bf", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#61afef", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#4b5263", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#282c34", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#21252b", + "theme.bar.menus.menu.notifications.switch.puck": "#3e4451", + "theme.bar.menus.menu.notifications.switch.disabled": "#4b5263", + "theme.bar.menus.menu.notifications.switch.enabled": "#61afef", + "theme.bar.menus.menu.notifications.clear": "#e06c75", + "theme.bar.menus.menu.notifications.switch_divider": "#3e4451", + "theme.bar.menus.menu.notifications.border": "#4b5263", + "theme.bar.menus.menu.notifications.card": "#21252b", + "theme.bar.menus.menu.notifications.background": "#282c34", + "theme.bar.menus.menu.notifications.no_notifications_label": "#4b5263", + "theme.bar.menus.menu.notifications.label": "#61afef", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#c678dd", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#c678dd", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#c678dd", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#98c379", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#98c379", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#98c379", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#e5c07b", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#e5c07b", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#e5c07b", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#e06c75", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#e06c75", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#e06c75", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#3e4451", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#61afef", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#c678dd", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#56b6c2", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#e06c75", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#e5c07b", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#c678dd", + "theme.bar.menus.menu.dashboard.controls.input.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.input.background": "#c678dd", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#e06c75", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#e5c07b", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#56b6c2", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#282c34", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c678dd", + "theme.bar.menus.menu.dashboard.controls.disabled": "#5c6370", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#98c379", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#282c34", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#61afef", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#56b6c2", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#98c379", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#d19a66", + "theme.bar.menus.menu.dashboard.profile.name": "#c678dd", + "theme.bar.menus.menu.dashboard.border.color": "#4b5263", + "theme.bar.menus.menu.dashboard.background.color": "#282c34", + "theme.bar.menus.menu.dashboard.card.color": "#21252b", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#c678dd", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#c678dd", + "theme.bar.menus.menu.clock.weather.hourly.time": "#c678dd", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#56b6c2", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#61afef", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#61afef", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#d19a66", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#e06c75", + "theme.bar.menus.menu.clock.weather.stats": "#c678dd", + "theme.bar.menus.menu.clock.weather.status": "#56b6c2", + "theme.bar.menus.menu.clock.weather.temperature": "#abb2bf", + "theme.bar.menus.menu.clock.weather.icon": "#c678dd", + "theme.bar.menus.menu.clock.calendar.contextdays": "#5c6370", + "theme.bar.menus.menu.clock.calendar.days": "#abb2bf", + "theme.bar.menus.menu.clock.calendar.currentday": "#c678dd", + "theme.bar.menus.menu.clock.calendar.paginator": "#c678dd", + "theme.bar.menus.menu.clock.calendar.weekdays": "#c678dd", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#56b6c2", + "theme.bar.menus.menu.clock.time.timeperiod": "#56b6c2", + "theme.bar.menus.menu.clock.time.time": "#c678dd", + "theme.bar.menus.menu.clock.text": "#abb2bf", + "theme.bar.menus.menu.clock.border.color": "#4b5263", + "theme.bar.menus.menu.clock.background.color": "#282c34", + "theme.bar.menus.menu.clock.card.color": "#21252b", + "theme.bar.menus.menu.battery.slider.puck": "#3e4451", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#3e4451", + "theme.bar.menus.menu.battery.slider.background": "#5c6370", + "theme.bar.menus.menu.battery.slider.primary": "#e5c07b", + "theme.bar.menus.menu.battery.icons.active": "#e5c07b", + "theme.bar.menus.menu.battery.icons.passive": "#828997", + "theme.bar.menus.menu.battery.listitems.active": "#e5c07b", + "theme.bar.menus.menu.battery.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.battery.text": "#abb2bf", + "theme.bar.menus.menu.battery.label.color": "#e5c07b", + "theme.bar.menus.menu.battery.border.color": "#4b5263", + "theme.bar.menus.menu.battery.background.color": "#282c34", + "theme.bar.menus.menu.battery.card.color": "#21252b", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#21252b", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#abb2bf", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#282c34", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#61afef", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#abb2bf", + "theme.bar.menus.menu.bluetooth.icons.active": "#61afef", + "theme.bar.menus.menu.bluetooth.icons.passive": "#5c6370", + "theme.bar.menus.menu.bluetooth.listitems.active": "#61afef", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.bluetooth.switch.puck": "#4b5263", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#3e4451", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#61afef", + "theme.bar.menus.menu.bluetooth.switch_divider": "#4b5263", + "theme.bar.menus.menu.bluetooth.status": "#5c6370", + "theme.bar.menus.menu.bluetooth.text": "#abb2bf", + "theme.bar.menus.menu.bluetooth.label.color": "#61afef", + "theme.bar.menus.menu.bluetooth.border.color": "#3e4451", + "theme.bar.menus.menu.bluetooth.background.color": "#282c34", + "theme.bar.menus.menu.bluetooth.card.color": "#21252b", + "theme.bar.menus.menu.network.iconbuttons.active": "#c678dd", + "theme.bar.menus.menu.network.iconbuttons.passive": "#abb2bf", + "theme.bar.menus.menu.network.icons.active": "#c678dd", + "theme.bar.menus.menu.network.icons.passive": "#5c6370", + "theme.bar.menus.menu.network.listitems.active": "#c678dd", + "theme.bar.menus.menu.network.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.network.status.color": "#5c6370", + "theme.bar.menus.menu.network.text": "#abb2bf", + "theme.bar.menus.menu.network.label.color": "#c678dd", + "theme.bar.menus.menu.network.border.color": "#3e4451", + "theme.bar.menus.menu.network.background.color": "#282c34", + "theme.bar.menus.menu.network.card.color": "#21252b", + "theme.bar.menus.menu.volume.input_slider.puck": "#4b5263", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#4b5263", + "theme.bar.menus.menu.volume.input_slider.background": "#4b5263", + "theme.bar.menus.menu.volume.input_slider.primary": "#e06c75", + "theme.bar.menus.menu.volume.audio_slider.puck": "#4b5263", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#4b5263", + "theme.bar.menus.menu.volume.audio_slider.background": "#4b5263", + "theme.bar.menus.menu.volume.audio_slider.primary": "#e06c75", + "theme.bar.menus.menu.volume.icons.active": "#e06c75", + "theme.bar.menus.menu.volume.icons.passive": "#5c6370", + "theme.bar.menus.menu.volume.iconbutton.active": "#e06c75", + "theme.bar.menus.menu.volume.iconbutton.passive": "#abb2bf", + "theme.bar.menus.menu.volume.listitems.active": "#e06c75", + "theme.bar.menus.menu.volume.listitems.passive": "#abb2bf", + "theme.bar.menus.menu.volume.border.color": "#3e4451", + "theme.bar.menus.menu.volume.background.color": "#282c34", + "theme.bar.menus.menu.media.slider.puck": "#5c6370", + "theme.bar.menus.menu.media.slider.backgroundhover": "#4b5263", + "theme.bar.menus.menu.media.slider.background": "#4b5263", + "theme.bar.menus.menu.media.slider.primary": "#98c379", + "theme.bar.menus.menu.media.buttons.text": "#282c34", + "theme.bar.menus.menu.media.buttons.background": "#98c379", + "theme.bar.menus.menu.media.buttons.enabled": "#56b6c2", + "theme.bar.menus.menu.media.buttons.inactive": "#4b5263", + "theme.bar.menus.menu.media.border.color": "#3e4451", + "theme.bar.menus.menu.media.background.color": "#282c34", + "theme.bar.menus.menu.media.album": "#98c379", + "theme.bar.menus.menu.media.artist": "#56b6c2", + "theme.bar.menus.menu.media.song": "#98c379", + "theme.bar.menus.tooltip.text": "#abb2bf", + "theme.bar.menus.tooltip.background": "#282c34", + "theme.bar.menus.dropdownmenu.divider": "#21252b", + "theme.bar.menus.dropdownmenu.text": "#abb2bf", + "theme.bar.menus.dropdownmenu.background": "#282c34", + "theme.bar.menus.slider.puck": "#5c6370", + "theme.bar.menus.slider.backgroundhover": "#4b5263", + "theme.bar.menus.slider.background": "#4b5263", + "theme.bar.menus.slider.primary": "#61afef", + "theme.bar.menus.progressbar.background": "#4b5263", + "theme.bar.menus.progressbar.foreground": "#61afef", + "theme.bar.menus.iconbuttons.active": "#61afef", + "theme.bar.menus.iconbuttons.passive": "#abb2bf", + "theme.bar.menus.buttons.text": "#282c34", + "theme.bar.menus.buttons.disabled": "#4b5263", + "theme.bar.menus.buttons.active": "#98c379", + "theme.bar.menus.buttons.default": "#61afef", + "theme.bar.menus.switch.puck": "#4b5263", + "theme.bar.menus.switch.disabled": "#3e4451", + "theme.bar.menus.switch.enabled": "#61afef", + "theme.bar.menus.icons.active": "#61afef", + "theme.bar.menus.icons.passive": "#4b5263", + "theme.bar.menus.listitems.active": "#61afef", + "theme.bar.menus.listitems.passive": "#abb2bf", + "theme.bar.menus.label": "#61afef", + "theme.bar.menus.feinttext": "#3e4451", + "theme.bar.menus.dimtext": "#4b5263", + "theme.bar.menus.cards": "#21252b", + "theme.bar.buttons.notifications.total": "#61afef", + "theme.bar.buttons.notifications.icon": "#21252b", + "theme.bar.buttons.notifications.background": "#21252b", + "theme.bar.buttons.clock.icon": "#21252b", + "theme.bar.buttons.clock.text": "#98c379", + "theme.bar.buttons.clock.background": "#21252b", + "theme.bar.buttons.battery.icon": "#21252b", + "theme.bar.buttons.battery.text": "#e5c07b", + "theme.bar.buttons.battery.background": "#21252b", + "theme.bar.buttons.systray.background": "#21252b", + "theme.bar.buttons.bluetooth.icon": "#21252b", + "theme.bar.buttons.bluetooth.text": "#61afef", + "theme.bar.buttons.bluetooth.background": "#21252b", + "theme.bar.buttons.network.icon": "#21252b", + "theme.bar.buttons.network.text": "#c678dd", + "theme.bar.buttons.network.background": "#21252b", + "theme.bar.buttons.volume.icon": "#21252b", + "theme.bar.buttons.volume.text": "#e06c75", + "theme.bar.buttons.volume.background": "#21252b", + "theme.bar.buttons.windowtitle.icon": "#21252b", + "theme.bar.buttons.windowtitle.text": "#98c379", + "theme.bar.buttons.windowtitle.background": "#21252b", + "theme.bar.buttons.workspaces.active": "#c678dd", + "theme.bar.buttons.workspaces.occupied": "#e06c75", + "theme.bar.buttons.workspaces.available": "#61afef", + "theme.bar.buttons.workspaces.hover": "#c678dd", + "theme.bar.buttons.workspaces.background": "#21252b", + "theme.bar.buttons.dashboard.icon": "#21252b", + "theme.bar.buttons.dashboard.background": "#e5c07b", + "theme.osd.label": "#61afef", + "theme.osd.icon": "#282c34", + "theme.osd.bar_overflow_color": "#e06c75", + "theme.osd.bar_empty_color": "#4b5263", + "theme.osd.bar_color": "#61afef", + "theme.osd.icon_container": "#61afef", + "theme.osd.bar_container": "#282c34", + "theme.notification.close_button.label": "#282c34", + "theme.notification.close_button.background": "#e06c75", + "theme.notification.labelicon": "#61afef", + "theme.notification.text": "#abb2bf", + "theme.notification.time": "#5c6370", + "theme.notification.border": "#4b5263", + "theme.notification.label": "#61afef", + "theme.notification.actions.text": "#282c34", + "theme.notification.actions.background": "#61afef", + "theme.notification.background": "#282c34", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#21252b", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#21252b", + "theme.bar.menus.check_radio_button.background": "#2e3440", + "theme.bar.menus.check_radio_button.active": "#88c0d0", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#e06c75", + "theme.bar.buttons.network.icon_background": "#c678dd", + "theme.bar.buttons.bluetooth.icon_background": "#61afef", + "theme.bar.buttons.windowtitle.icon_background": "#98c379", + "theme.bar.buttons.media.icon_background": "#61afef", + "theme.bar.buttons.notifications.icon_background": "#61afef", + "theme.bar.buttons.battery.icon_background": "#e5c07b", + "theme.bar.buttons.clock.icon_background": "#98c379", + "theme.bar.menus.menu.notifications.pager.button": "#61afef", + "theme.bar.menus.menu.notifications.scrollbar.color": "#61afef", + "theme.bar.menus.menu.notifications.pager.label": "#828997", + "theme.bar.menus.menu.notifications.pager.background": "#282c34", + "theme.bar.buttons.modules.ram.icon": "#21252b", + "theme.bar.buttons.modules.storage.icon_background": "#e06c75", + "theme.bar.menus.popover.border": "#282c34", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#56b6c2", + "theme.bar.menus.menu.power.buttons.restart.text": "#d19a66", + "theme.bar.buttons.modules.updates.background": "#21252b", + "theme.bar.buttons.modules.storage.icon": "#21252b", + "theme.bar.buttons.modules.netstat.background": "#21252b", + "theme.bar.buttons.modules.weather.icon": "#21252b", + "theme.bar.buttons.modules.netstat.text": "#98c379", + "theme.bar.buttons.modules.storage.background": "#21252b", + "theme.bar.buttons.modules.power.icon": "#21252b", + "theme.bar.buttons.modules.storage.text": "#e06c75", + "theme.bar.buttons.modules.cpu.background": "#21252b", + "theme.bar.menus.menu.power.border.color": "#4b5263", + "theme.bar.buttons.modules.power.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.logout.icon": "#282c34", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#d19a66", + "theme.bar.menus.menu.power.buttons.restart.icon": "#282c34", + "theme.bar.buttons.modules.cpu.icon": "#21252b", + "theme.bar.buttons.modules.kbLayout.icon_background": "#56b6c2", + "theme.bar.buttons.modules.weather.text": "#61afef", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#282c34", + "theme.bar.menus.menu.power.buttons.sleep.text": "#56b6c2", + "theme.bar.buttons.modules.weather.icon_background": "#61afef", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#21252b", + "theme.bar.menus.menu.power.buttons.logout.background": "#21252b", + "theme.bar.buttons.modules.kbLayout.icon": "#21252b", + "theme.bar.buttons.modules.ram.icon_background": "#e5c07b", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#e06c75", + "theme.bar.menus.menu.power.buttons.sleep.background": "#21252b", + "theme.bar.buttons.modules.ram.text": "#e5c07b", + "theme.bar.menus.menu.power.buttons.logout.text": "#98c379", + "theme.bar.buttons.modules.updates.icon_background": "#c678dd", + "theme.bar.buttons.modules.kbLayout.background": "#21252b", + "theme.bar.buttons.modules.power.background": "#21252b", + "theme.bar.buttons.modules.weather.background": "#21252b", + "theme.bar.menus.menu.power.background.color": "#282c34", + "theme.bar.buttons.modules.ram.background": "#21252b", + "theme.bar.buttons.modules.netstat.icon": "#21252b", + "theme.bar.buttons.modules.cpu.icon_background": "#e06c75", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#98c379", + "theme.bar.buttons.modules.updates.text": "#c678dd", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#282c34", + "theme.bar.menus.menu.power.buttons.restart.background": "#21252b", + "theme.bar.buttons.modules.updates.icon": "#21252b", + "theme.bar.buttons.modules.cpu.text": "#e06c75", + "theme.bar.buttons.modules.netstat.icon_background": "#98c379", + "theme.bar.buttons.modules.kbLayout.text": "#56b6c2", + "theme.bar.buttons.modules.power.border": "#e06c75", + "theme.bar.buttons.modules.weather.border": "#61afef", + "theme.bar.buttons.modules.updates.border": "#c678dd", + "theme.bar.buttons.modules.kbLayout.border": "#56b6c2", + "theme.bar.buttons.modules.netstat.border": "#98c379", + "theme.bar.buttons.modules.storage.border": "#e06c75", + "theme.bar.buttons.modules.cpu.border": "#e06c75", + "theme.bar.buttons.modules.ram.border": "#e5c07b", + "theme.bar.buttons.notifications.border": "#61afef", + "theme.bar.buttons.clock.border": "#98c379", + "theme.bar.buttons.battery.border": "#e5c07b", + "theme.bar.buttons.systray.border": "#4b5263", + "theme.bar.buttons.bluetooth.border": "#61afef", + "theme.bar.buttons.network.border": "#c678dd", + "theme.bar.buttons.volume.border": "#e06c75", + "theme.bar.buttons.media.border": "#61afef", + "theme.bar.buttons.windowtitle.border": "#98c379", + "theme.bar.buttons.workspaces.border": "#21252b", + "theme.bar.buttons.dashboard.border": "#e5c07b", + "theme.bar.buttons.modules.submap.background": "#21252b", + "theme.bar.buttons.modules.submap.text": "#56b6c2", + "theme.bar.buttons.modules.submap.border": "#56b6c2", + "theme.bar.buttons.modules.submap.icon": "#21252b", + "theme.bar.buttons.modules.submap.icon_background": "#56b6c2" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/rose_pine.json b/ags/HyprPanel/themes/rose_pine.json new file mode 100644 index 0000000..9ccd0a0 --- /dev/null +++ b/ags/HyprPanel/themes/rose_pine.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#191724", + "theme.bar.background": "#191724", + "theme.bar.buttons.media.icon": "#c4a7e7", + "theme.bar.buttons.media.text": "#c4a7e7", + "theme.bar.buttons.icon": "#c4a7e7", + "theme.bar.buttons.text": "#c4a7e7", + "theme.bar.buttons.hover": "#26233a", + "theme.bar.buttons.background": "#21202e", + "theme.bar.menus.text": "#e0def4", + "theme.bar.menus.border.color": "#1f1d2e", + "theme.bar.buttons.media.background": "#21202e", + "theme.bar.menus.menu.volume.text": "#e0def4", + "theme.bar.menus.menu.volume.card.color": "#21202e", + "theme.bar.menus.menu.volume.label.color": "#eb6f92", + "theme.bar.menus.popover.text": "#c4a7e7", + "theme.bar.menus.popover.background": "#1f1d2e", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#191724", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#e0def4", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#1f1d2e", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#191724", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#21202e", + "theme.bar.menus.menu.notifications.switch.puck": "#26233a", + "theme.bar.menus.menu.notifications.switch.disabled": "#1f1d2e", + "theme.bar.menus.menu.notifications.switch.enabled": "#c4a7e7", + "theme.bar.menus.menu.notifications.clear": "#eb6f92", + "theme.bar.menus.menu.notifications.switch_divider": "#26233a", + "theme.bar.menus.menu.notifications.border": "#1f1d2e", + "theme.bar.menus.menu.notifications.card": "#21202e", + "theme.bar.menus.menu.notifications.background": "#191724", + "theme.bar.menus.menu.notifications.no_notifications_label": "#1f1d2e", + "theme.bar.menus.menu.notifications.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#26233a", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#30738f", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#9ccfd8", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#eb6f92", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f6c177", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.input.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.input.background": "#30738f", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#eb6f92", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f6c177", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#9ccfd8", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#403d52", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#9ccfd8", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#f6c177", + "theme.bar.menus.menu.dashboard.profile.name": "#c4a7e7", + "theme.bar.menus.menu.dashboard.border.color": "#1f1d2e", + "theme.bar.menus.menu.dashboard.background.color": "#191724", + "theme.bar.menus.menu.dashboard.card.color": "#21202e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.time": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#31748f", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#f6c177", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#eb6f92", + "theme.bar.menus.menu.clock.weather.stats": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.status": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.temperature": "#e0def4", + "theme.bar.menus.menu.clock.weather.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.contextdays": "#403d52", + "theme.bar.menus.menu.clock.calendar.days": "#e0def4", + "theme.bar.menus.menu.clock.calendar.currentday": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.paginator": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.weekdays": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#9ccfd8", + "theme.bar.menus.menu.clock.time.timeperiod": "#9ccfd8", + "theme.bar.menus.menu.clock.time.time": "#c4a7e7", + "theme.bar.menus.menu.clock.text": "#e0def4", + "theme.bar.menus.menu.clock.border.color": "#1f1d2e", + "theme.bar.menus.menu.clock.background.color": "#191724", + "theme.bar.menus.menu.clock.card.color": "#21202e", + "theme.bar.menus.menu.battery.slider.puck": "#26233a", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.battery.slider.background": "#403d52", + "theme.bar.menus.menu.battery.slider.primary": "#f6c177", + "theme.bar.menus.menu.battery.icons.active": "#f6c177", + "theme.bar.menus.menu.battery.icons.passive": "#524f67", + "theme.bar.menus.menu.battery.listitems.active": "#f6c177", + "theme.bar.menus.menu.battery.listitems.passive": "#e0def4", + "theme.bar.menus.menu.battery.text": "#e0def4", + "theme.bar.menus.menu.battery.label.color": "#f6c177", + "theme.bar.menus.menu.battery.border.color": "#1f1d2e", + "theme.bar.menus.menu.battery.background.color": "#191724", + "theme.bar.menus.menu.battery.card.color": "#21202e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#21202e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#e0def4", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#191724", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.icons.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.icons.passive": "#524f67", + "theme.bar.menus.menu.bluetooth.listitems.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.switch.puck": "#26233a", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#1f1d2e", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.switch_divider": "#26233a", + "theme.bar.menus.menu.bluetooth.status": "#26233a", + "theme.bar.menus.menu.bluetooth.text": "#e0def4", + "theme.bar.menus.menu.bluetooth.label.color": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.border.color": "#1f1d2e", + "theme.bar.menus.menu.bluetooth.background.color": "#191724", + "theme.bar.menus.menu.bluetooth.card.color": "#21202e", + "theme.bar.menus.menu.network.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#e0def4", + "theme.bar.menus.menu.network.icons.active": "#c4a7e7", + "theme.bar.menus.menu.network.icons.passive": "#524f67", + "theme.bar.menus.menu.network.listitems.active": "#c4a7e7", + "theme.bar.menus.menu.network.listitems.passive": "#e0def4", + "theme.bar.menus.menu.network.status.color": "#26233a", + "theme.bar.menus.menu.network.text": "#e0def4", + "theme.bar.menus.menu.network.label.color": "#c4a7e7", + "theme.bar.menus.menu.network.border.color": "#1f1d2e", + "theme.bar.menus.menu.network.background.color": "#191724", + "theme.bar.menus.menu.network.card.color": "#21202e", + "theme.bar.menus.menu.volume.input_slider.puck": "#403d52", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.volume.input_slider.background": "#403d52", + "theme.bar.menus.menu.volume.input_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.audio_slider.puck": "#403d52", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.volume.audio_slider.background": "#403d52", + "theme.bar.menus.menu.volume.audio_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.icons.active": "#eb6f92", + "theme.bar.menus.menu.volume.icons.passive": "#524f67", + "theme.bar.menus.menu.volume.iconbutton.active": "#eb6f92", + "theme.bar.menus.menu.volume.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.volume.listitems.active": "#eb6f92", + "theme.bar.menus.menu.volume.listitems.passive": "#e0def4", + "theme.bar.menus.menu.volume.border.color": "#1f1d2e", + "theme.bar.menus.menu.volume.background.color": "#191724", + "theme.bar.menus.menu.media.slider.puck": "#26233a", + "theme.bar.menus.menu.media.slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.media.slider.background": "#403d52", + "theme.bar.menus.menu.media.slider.primary": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.text": "#191724", + "theme.bar.menus.menu.media.buttons.background": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.enabled": "#9ccfd8", + "theme.bar.menus.menu.media.buttons.inactive": "#403d52", + "theme.bar.menus.menu.media.border.color": "#1f1d2e", + "theme.bar.menus.menu.media.background.color": "#191724", + "theme.bar.menus.menu.media.album": "#c4a7e7", + "theme.bar.menus.menu.media.artist": "#9ccfd8", + "theme.bar.menus.menu.media.song": "#c4a7e7", + "theme.bar.menus.tooltip.text": "#e0def4", + "theme.bar.menus.tooltip.background": "#191724", + "theme.bar.menus.dropdownmenu.divider": "#21202e", + "theme.bar.menus.dropdownmenu.text": "#e0def4", + "theme.bar.menus.dropdownmenu.background": "#191724", + "theme.bar.menus.slider.puck": "#26233a", + "theme.bar.menus.slider.backgroundhover": "#26233a", + "theme.bar.menus.slider.background": "#403d52", + "theme.bar.menus.slider.primary": "#c4a7e7", + "theme.bar.menus.progressbar.background": "#26233a", + "theme.bar.menus.progressbar.foreground": "#c4a7e7", + "theme.bar.menus.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.iconbuttons.passive": "#e0def4", + "theme.bar.menus.buttons.text": "#1f1d2e", + "theme.bar.menus.buttons.disabled": "#403d52", + "theme.bar.menus.buttons.active": "#c4a7e7", + "theme.bar.menus.buttons.default": "#c4a7e7", + "theme.bar.menus.switch.puck": "#26233a", + "theme.bar.menus.switch.disabled": "#1f1d2e", + "theme.bar.menus.switch.enabled": "#c4a7e7", + "theme.bar.menus.icons.active": "#c4a7e7", + "theme.bar.menus.icons.passive": "#403d52", + "theme.bar.menus.listitems.active": "#c4a7e7", + "theme.bar.menus.listitems.passive": "#e0def4", + "theme.bar.menus.label": "#c4a7e7", + "theme.bar.menus.feinttext": "#1f1d2e", + "theme.bar.menus.dimtext": "#403d52", + "theme.bar.menus.cards": "#21202e", + "theme.bar.buttons.notifications.total": "#c4a7e7", + "theme.bar.buttons.notifications.icon": "#c4a7e7", + "theme.bar.buttons.notifications.background": "#21202e", + "theme.bar.buttons.clock.icon": "#c4a7e7", + "theme.bar.buttons.clock.text": "#c4a7e7", + "theme.bar.buttons.clock.background": "#21202e", + "theme.bar.buttons.battery.icon": "#f6c177", + "theme.bar.buttons.battery.text": "#f6c177", + "theme.bar.buttons.battery.background": "#21202e", + "theme.bar.buttons.systray.background": "#21202e", + "theme.bar.buttons.bluetooth.icon": "#9ccfd8", + "theme.bar.buttons.bluetooth.text": "#9ccfd8", + "theme.bar.buttons.bluetooth.background": "#21202e", + "theme.bar.buttons.network.icon": "#c4a7e7", + "theme.bar.buttons.network.text": "#c4a7e7", + "theme.bar.buttons.network.background": "#21202e", + "theme.bar.buttons.volume.icon": "#eb6f92", + "theme.bar.buttons.volume.text": "#eb6f92", + "theme.bar.buttons.volume.background": "#21202e", + "theme.bar.buttons.windowtitle.icon": "#c4a7e7", + "theme.bar.buttons.windowtitle.text": "#c4a7e7", + "theme.bar.buttons.windowtitle.background": "#21202e", + "theme.bar.buttons.workspaces.active": "#c4a7e7", + "theme.bar.buttons.workspaces.occupied": "#eb6f92", + "theme.bar.buttons.workspaces.available": "#9ccfd8", + "theme.bar.buttons.workspaces.hover": "#26233a", + "theme.bar.buttons.workspaces.background": "#21202e", + "theme.bar.buttons.dashboard.icon": "#f6c177", + "theme.bar.buttons.dashboard.background": "#21202e", + "theme.osd.label": "#c4a7e7", + "theme.osd.icon": "#191724", + "theme.osd.bar_overflow_color": "#eb6f92", + "theme.osd.bar_empty_color": "#1f1d2e", + "theme.osd.bar_color": "#c4a7e7", + "theme.osd.icon_container": "#c4a7e7", + "theme.osd.bar_container": "#191724", + "theme.notification.close_button.label": "#191724", + "theme.notification.close_button.background": "#eb6f92", + "theme.notification.labelicon": "#c4a7e7", + "theme.notification.text": "#e0def4", + "theme.notification.time": "#403d52", + "theme.notification.border": "#1f1d2e", + "theme.notification.label": "#c4a7e7", + "theme.notification.actions.text": "#1f1d2e", + "theme.notification.actions.background": "#c4a7e7", + "theme.notification.background": "#1f1d2e", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#21202e", + "theme.bar.menus.check_radio_button.background": "#393452", + "theme.bar.menus.check_radio_button.active": "#c4a7e7", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#c4a7e7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#c4a7e7", + "theme.bar.menus.menu.notifications.pager.label": "#524f67", + "theme.bar.menus.menu.notifications.pager.background": "#191724", + "theme.bar.buttons.clock.icon_background": "#c4a7e7", + "theme.bar.buttons.modules.ram.icon": "#f6c177", + "theme.bar.buttons.modules.storage.icon_background": "#eb6f92", + "theme.bar.menus.popover.border": "#1f1d2e", + "theme.bar.buttons.volume.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#9ccfd8", + "theme.bar.menus.menu.power.buttons.restart.text": "#f6c177", + "theme.bar.buttons.modules.updates.background": "#21202e", + "theme.bar.buttons.modules.storage.icon": "#eb6f92", + "theme.bar.buttons.modules.netstat.background": "#21202e", + "theme.bar.buttons.modules.weather.icon": "#c4a7e7", + "theme.bar.buttons.modules.netstat.text": "#9ccfd8", + "theme.bar.buttons.modules.storage.background": "#21202e", + "theme.bar.buttons.modules.power.icon": "#eb6f92", + "theme.bar.buttons.modules.storage.text": "#eb6f92", + "theme.bar.buttons.modules.cpu.background": "#21202e", + "theme.bar.menus.menu.power.border.color": "#1f1d2e", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.logout.icon": "#1f1d2e", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.restart.icon": "#1f1d2e", + "theme.bar.buttons.modules.cpu.icon": "#eb6f92", + "theme.bar.buttons.battery.icon_background": "#f6c177", + "theme.bar.buttons.modules.kbLayout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.weather.text": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#1f1d2e", + "theme.bar.menus.menu.power.buttons.sleep.text": "#9ccfd8", + "theme.bar.buttons.modules.weather.icon_background": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#21202e", + "theme.bar.buttons.media.icon_background": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.logout.background": "#21202e", + "theme.bar.buttons.modules.kbLayout.icon": "#9ccfd8", + "theme.bar.buttons.modules.ram.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#eb6f92", + "theme.bar.menus.menu.power.buttons.sleep.background": "#21202e", + "theme.bar.buttons.modules.ram.text": "#f6c177", + "theme.bar.menus.menu.power.buttons.logout.text": "#9ccfd8", + "theme.bar.buttons.modules.updates.icon_background": "#30738f", + "theme.bar.buttons.modules.kbLayout.background": "#21202e", + "theme.bar.buttons.modules.power.background": "#21202e", + "theme.bar.buttons.modules.weather.background": "#21202e", + "theme.bar.buttons.icon_background": "#21202e", + "theme.bar.menus.menu.power.background.color": "#191724", + "theme.bar.buttons.modules.ram.background": "#21202e", + "theme.bar.buttons.modules.netstat.icon": "#9ccfd8", + "theme.bar.buttons.windowtitle.icon_background": "#c4a7e7", + "theme.bar.buttons.modules.cpu.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.updates.text": "#30738f", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#1f1d2e", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#21202e", + "theme.bar.buttons.modules.updates.icon": "#30738f", + "theme.bar.buttons.modules.cpu.text": "#eb6f92", + "theme.bar.buttons.modules.netstat.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.kbLayout.text": "#9ccfd8", + "theme.bar.buttons.notifications.icon_background": "#c4a7e7", + "theme.bar.buttons.modules.power.border": "#eb6f92", + "theme.bar.buttons.modules.weather.border": "#c4a7e7", + "theme.bar.buttons.modules.updates.border": "#30738f", + "theme.bar.buttons.modules.kbLayout.border": "#9ccfd8", + "theme.bar.buttons.modules.netstat.border": "#9ccfd8", + "theme.bar.buttons.modules.storage.border": "#eb6f92", + "theme.bar.buttons.modules.cpu.border": "#eb6f92", + "theme.bar.buttons.modules.ram.border": "#f6c177", + "theme.bar.buttons.notifications.border": "#c4a7e7", + "theme.bar.buttons.clock.border": "#c4a7e7", + "theme.bar.buttons.battery.border": "#f6c177", + "theme.bar.buttons.systray.border": "#26233a", + "theme.bar.buttons.bluetooth.border": "#9ccfd8", + "theme.bar.buttons.network.border": "#c4a7e7", + "theme.bar.buttons.volume.border": "#eb6f92", + "theme.bar.buttons.media.border": "#c4a7e7", + "theme.bar.buttons.windowtitle.border": "#c4a7e7", + "theme.bar.buttons.workspaces.border": "#1f1d2e", + "theme.bar.buttons.dashboard.border": "#f6c177", + "theme.bar.buttons.modules.submap.background": "#21202e", + "theme.bar.buttons.modules.submap.text": "#9ccfd8", + "theme.bar.buttons.modules.submap.border": "#9ccfd8", + "theme.bar.buttons.modules.submap.icon": "#9ccfd8", + "theme.bar.buttons.modules.submap.icon_background": "#21202e" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/rose_pine_moon.json b/ags/HyprPanel/themes/rose_pine_moon.json new file mode 100644 index 0000000..1c0a5ca --- /dev/null +++ b/ags/HyprPanel/themes/rose_pine_moon.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#232136", + "theme.bar.background": "#232136", + "theme.bar.buttons.media.icon": "#c4a7e7", + "theme.bar.buttons.media.text": "#c4a7e7", + "theme.bar.buttons.icon": "#c4a7e7", + "theme.bar.buttons.text": "#c4a7e7", + "theme.bar.buttons.hover": "#393552", + "theme.bar.buttons.background": "#2a283e", + "theme.bar.menus.text": "#e0def4", + "theme.bar.menus.border.color": "#2a273f", + "theme.bar.buttons.media.background": "#2a283e", + "theme.bar.menus.menu.volume.text": "#e0def4", + "theme.bar.menus.menu.volume.card.color": "#2a283e", + "theme.bar.menus.menu.volume.label.color": "#eb6f92", + "theme.bar.menus.popover.text": "#c4a7e7", + "theme.bar.menus.popover.background": "#2a273f", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#232136", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#e0def4", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#2a273f", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#232136", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#2a283e", + "theme.bar.menus.menu.notifications.switch.puck": "#393552", + "theme.bar.menus.menu.notifications.switch.disabled": "#2a273f", + "theme.bar.menus.menu.notifications.switch.enabled": "#c4a7e7", + "theme.bar.menus.menu.notifications.clear": "#eb6f92", + "theme.bar.menus.menu.notifications.switch_divider": "#393552", + "theme.bar.menus.menu.notifications.border": "#2a273f", + "theme.bar.menus.menu.notifications.card": "#2a283e", + "theme.bar.menus.menu.notifications.background": "#232136", + "theme.bar.menus.menu.notifications.no_notifications_label": "#2a273f", + "theme.bar.menus.menu.notifications.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#393552", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#3e8eb0", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#9ccfd8", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#eb6f92", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f6c177", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.input.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.input.background": "#3e8eb0", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#eb6f92", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f6c177", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#9ccfd8", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#44415a", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#9ccfd8", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#2a273f", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#f6c177", + "theme.bar.menus.menu.dashboard.profile.name": "#c4a7e7", + "theme.bar.menus.menu.dashboard.border.color": "#2a273f", + "theme.bar.menus.menu.dashboard.background.color": "#232136", + "theme.bar.menus.menu.dashboard.card.color": "#2a283e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.time": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#3e8fb0", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#f6c177", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#eb6f92", + "theme.bar.menus.menu.clock.weather.stats": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.status": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.temperature": "#e0def4", + "theme.bar.menus.menu.clock.weather.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.contextdays": "#44415a", + "theme.bar.menus.menu.clock.calendar.days": "#e0def4", + "theme.bar.menus.menu.clock.calendar.currentday": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.paginator": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.weekdays": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#9ccfd8", + "theme.bar.menus.menu.clock.time.timeperiod": "#9ccfd8", + "theme.bar.menus.menu.clock.time.time": "#c4a7e7", + "theme.bar.menus.menu.clock.text": "#e0def4", + "theme.bar.menus.menu.clock.border.color": "#2a273f", + "theme.bar.menus.menu.clock.background.color": "#232136", + "theme.bar.menus.menu.clock.card.color": "#2a283e", + "theme.bar.menus.menu.battery.slider.puck": "#393552", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#393552", + "theme.bar.menus.menu.battery.slider.background": "#44415a", + "theme.bar.menus.menu.battery.slider.primary": "#f6c177", + "theme.bar.menus.menu.battery.icons.active": "#f6c177", + "theme.bar.menus.menu.battery.icons.passive": "#56526e", + "theme.bar.menus.menu.battery.listitems.active": "#f6c177", + "theme.bar.menus.menu.battery.listitems.passive": "#e0def4", + "theme.bar.menus.menu.battery.text": "#e0def4", + "theme.bar.menus.menu.battery.label.color": "#f6c177", + "theme.bar.menus.menu.battery.border.color": "#2a273f", + "theme.bar.menus.menu.battery.background.color": "#232136", + "theme.bar.menus.menu.battery.card.color": "#2a283e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#2a283e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#e0def4", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#232136", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.icons.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.icons.passive": "#56526e", + "theme.bar.menus.menu.bluetooth.listitems.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.switch.puck": "#393552", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#2a273f", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.switch_divider": "#393552", + "theme.bar.menus.menu.bluetooth.status": "#393552", + "theme.bar.menus.menu.bluetooth.text": "#e0def4", + "theme.bar.menus.menu.bluetooth.label.color": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.border.color": "#2a273f", + "theme.bar.menus.menu.bluetooth.background.color": "#232136", + "theme.bar.menus.menu.bluetooth.card.color": "#2a283e", + "theme.bar.menus.menu.network.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#e0def4", + "theme.bar.menus.menu.network.icons.active": "#c4a7e7", + "theme.bar.menus.menu.network.icons.passive": "#56526e", + "theme.bar.menus.menu.network.listitems.active": "#c4a7e7", + "theme.bar.menus.menu.network.listitems.passive": "#e0def4", + "theme.bar.menus.menu.network.status.color": "#393552", + "theme.bar.menus.menu.network.text": "#e0def4", + "theme.bar.menus.menu.network.label.color": "#c4a7e7", + "theme.bar.menus.menu.network.border.color": "#2a273f", + "theme.bar.menus.menu.network.background.color": "#232136", + "theme.bar.menus.menu.network.card.color": "#2a283e", + "theme.bar.menus.menu.volume.input_slider.puck": "#44415a", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#393552", + "theme.bar.menus.menu.volume.input_slider.background": "#44415a", + "theme.bar.menus.menu.volume.input_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.audio_slider.puck": "#44415a", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#393552", + "theme.bar.menus.menu.volume.audio_slider.background": "#44415a", + "theme.bar.menus.menu.volume.audio_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.icons.active": "#eb6f92", + "theme.bar.menus.menu.volume.icons.passive": "#56526e", + "theme.bar.menus.menu.volume.iconbutton.active": "#eb6f92", + "theme.bar.menus.menu.volume.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.volume.listitems.active": "#eb6f92", + "theme.bar.menus.menu.volume.listitems.passive": "#e0def4", + "theme.bar.menus.menu.volume.border.color": "#2a273f", + "theme.bar.menus.menu.volume.background.color": "#232136", + "theme.bar.menus.menu.media.slider.puck": "#393552", + "theme.bar.menus.menu.media.slider.backgroundhover": "#393552", + "theme.bar.menus.menu.media.slider.background": "#44415a", + "theme.bar.menus.menu.media.slider.primary": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.text": "#232136", + "theme.bar.menus.menu.media.buttons.background": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.enabled": "#9ccfd8", + "theme.bar.menus.menu.media.buttons.inactive": "#44415a", + "theme.bar.menus.menu.media.border.color": "#2a273f", + "theme.bar.menus.menu.media.background.color": "#232136", + "theme.bar.menus.menu.media.album": "#c4a7e7", + "theme.bar.menus.menu.media.artist": "#9ccfd8", + "theme.bar.menus.menu.media.song": "#c4a7e7", + "theme.bar.menus.tooltip.text": "#e0def4", + "theme.bar.menus.tooltip.background": "#232136", + "theme.bar.menus.dropdownmenu.divider": "#2a283e", + "theme.bar.menus.dropdownmenu.text": "#e0def4", + "theme.bar.menus.dropdownmenu.background": "#232136", + "theme.bar.menus.slider.puck": "#393552", + "theme.bar.menus.slider.backgroundhover": "#393552", + "theme.bar.menus.slider.background": "#44415a", + "theme.bar.menus.slider.primary": "#c4a7e7", + "theme.bar.menus.progressbar.background": "#393552", + "theme.bar.menus.progressbar.foreground": "#c4a7e7", + "theme.bar.menus.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.iconbuttons.passive": "#e0def4", + "theme.bar.menus.buttons.text": "#2a273f", + "theme.bar.menus.buttons.disabled": "#44415a", + "theme.bar.menus.buttons.active": "#c4a7e7", + "theme.bar.menus.buttons.default": "#c4a7e7", + "theme.bar.menus.switch.puck": "#393552", + "theme.bar.menus.switch.disabled": "#2a273f", + "theme.bar.menus.switch.enabled": "#c4a7e7", + "theme.bar.menus.icons.active": "#c4a7e7", + "theme.bar.menus.icons.passive": "#44415a", + "theme.bar.menus.listitems.active": "#c4a7e7", + "theme.bar.menus.listitems.passive": "#e0def4", + "theme.bar.menus.label": "#c4a7e7", + "theme.bar.menus.feinttext": "#2a273f", + "theme.bar.menus.dimtext": "#44415a", + "theme.bar.menus.cards": "#2a283e", + "theme.bar.buttons.notifications.total": "#c4a7e7", + "theme.bar.buttons.notifications.icon": "#c4a7e7", + "theme.bar.buttons.notifications.background": "#2a283e", + "theme.bar.buttons.clock.icon": "#c4a7e7", + "theme.bar.buttons.clock.text": "#c4a7e7", + "theme.bar.buttons.clock.background": "#2a283e", + "theme.bar.buttons.battery.icon": "#f6c177", + "theme.bar.buttons.battery.text": "#f6c177", + "theme.bar.buttons.battery.background": "#2a283e", + "theme.bar.buttons.systray.background": "#2a283e", + "theme.bar.buttons.bluetooth.icon": "#9ccfd8", + "theme.bar.buttons.bluetooth.text": "#9ccfd8", + "theme.bar.buttons.bluetooth.background": "#2a283e", + "theme.bar.buttons.network.icon": "#c4a7e7", + "theme.bar.buttons.network.text": "#c4a7e7", + "theme.bar.buttons.network.background": "#2a283e", + "theme.bar.buttons.volume.icon": "#eb6f92", + "theme.bar.buttons.volume.text": "#eb6f92", + "theme.bar.buttons.volume.background": "#2a283e", + "theme.bar.buttons.windowtitle.icon": "#c4a7e7", + "theme.bar.buttons.windowtitle.text": "#c4a7e7", + "theme.bar.buttons.windowtitle.background": "#2a283e", + "theme.bar.buttons.workspaces.active": "#c4a7e7", + "theme.bar.buttons.workspaces.occupied": "#eb6f92", + "theme.bar.buttons.workspaces.available": "#9ccfd8", + "theme.bar.buttons.workspaces.hover": "#393552", + "theme.bar.buttons.workspaces.background": "#2a283e", + "theme.bar.buttons.dashboard.icon": "#f6c177", + "theme.bar.buttons.dashboard.background": "#2a283e", + "theme.osd.label": "#c4a7e7", + "theme.osd.icon": "#232136", + "theme.osd.bar_overflow_color": "#eb6f92", + "theme.osd.bar_empty_color": "#2a273f", + "theme.osd.bar_color": "#c4a7e7", + "theme.osd.icon_container": "#c4a7e7", + "theme.osd.bar_container": "#232136", + "theme.notification.close_button.label": "#232136", + "theme.notification.close_button.background": "#eb6f92", + "theme.notification.labelicon": "#c4a7e7", + "theme.notification.text": "#e0def4", + "theme.notification.time": "#56526e", + "theme.notification.border": "#2a273f", + "theme.notification.label": "#c4a7e7", + "theme.notification.actions.text": "#2a273f", + "theme.notification.actions.background": "#c4a7e7", + "theme.notification.background": "#2a273f", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#2a283e", + "theme.bar.menus.check_radio_button.background": "#393452", + "theme.bar.menus.check_radio_button.active": "#c4a7e7", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#c4a7e7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#c4a7e7", + "theme.bar.menus.menu.notifications.pager.label": "#56526e", + "theme.bar.menus.menu.notifications.pager.background": "#232136", + "theme.bar.buttons.modules.ram.icon": "#f6c177", + "theme.bar.buttons.modules.storage.icon_background": "#2a283e", + "theme.bar.buttons.modules.storage.icon": "#c4a7e7", + "theme.bar.buttons.modules.weather.icon": "#c4a7e7", + "theme.bar.buttons.modules.power.icon": "#eb6f92", + "theme.bar.menus.menu.power.border.color": "#2a273f", + "theme.bar.buttons.modules.power.icon_background": "#2a283e", + "theme.bar.buttons.modules.cpu.icon": "#eb6f92", + "theme.bar.buttons.modules.kbLayout.icon_background": "#2a283e", + "theme.bar.buttons.modules.weather.text": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#2a273f", + "theme.bar.buttons.modules.weather.icon_background": "#2a283e", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#2a283e", + "theme.bar.buttons.modules.kbLayout.icon": "#9ccfd8", + "theme.bar.buttons.modules.ram.icon_background": "#2a283e", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#eb6f92", + "theme.bar.buttons.modules.updates.icon_background": "#2a283e", + "theme.bar.menus.menu.power.background.color": "#232136", + "theme.bar.buttons.modules.netstat.icon": "#9ccfd8", + "theme.bar.buttons.modules.cpu.icon_background": "#2a283e", + "theme.bar.buttons.modules.updates.icon": "#3e8eb0", + "theme.bar.buttons.modules.netstat.icon_background": "#2a283e", + "theme.bar.buttons.clock.icon_background": "#c4a7e7", + "theme.bar.menus.popover.border": "#2a273f", + "theme.bar.buttons.volume.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#9ccfd8", + "theme.bar.menus.menu.power.buttons.restart.text": "#f6c177", + "theme.bar.buttons.modules.updates.background": "#2a283e", + "theme.bar.buttons.modules.netstat.background": "#2a283e", + "theme.bar.buttons.modules.netstat.text": "#9ccfd8", + "theme.bar.buttons.modules.storage.background": "#2a283e", + "theme.bar.buttons.modules.storage.text": "#eb6f92", + "theme.bar.buttons.modules.cpu.background": "#2a283e", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.menus.menu.power.buttons.logout.icon": "#2a273f", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.restart.icon": "#2a273f", + "theme.bar.buttons.battery.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.sleep.text": "#9ccfd8", + "theme.bar.buttons.media.icon_background": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.logout.background": "#2a283e", + "theme.bar.menus.menu.power.buttons.sleep.background": "#2a283e", + "theme.bar.buttons.modules.ram.text": "#f6c177", + "theme.bar.menus.menu.power.buttons.logout.text": "#9ccfd8", + "theme.bar.buttons.modules.kbLayout.background": "#2a283e", + "theme.bar.buttons.modules.power.background": "#2a283e", + "theme.bar.buttons.modules.weather.background": "#2a283e", + "theme.bar.buttons.icon_background": "#2a283e", + "theme.bar.buttons.modules.ram.background": "#2a283e", + "theme.bar.buttons.windowtitle.icon_background": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.updates.text": "#3e8eb0", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#2a273f", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#2a283e", + "theme.bar.buttons.modules.cpu.text": "#eb6f92", + "theme.bar.buttons.modules.kbLayout.text": "#9ccfd8", + "theme.bar.buttons.notifications.icon_background": "#c4a7e7", + "theme.bar.buttons.modules.power.border": "#eb6f92", + "theme.bar.buttons.modules.weather.border": "#c4a7e7", + "theme.bar.buttons.modules.updates.border": "#30738f", + "theme.bar.buttons.modules.kbLayout.border": "#9ccfd8", + "theme.bar.buttons.modules.netstat.border": "#9ccfd8", + "theme.bar.buttons.modules.storage.border": "#eb6f92", + "theme.bar.buttons.modules.cpu.border": "#eb6f92", + "theme.bar.buttons.modules.ram.border": "#f6c177", + "theme.bar.buttons.notifications.border": "#c4a7e7", + "theme.bar.buttons.clock.border": "#c4a7e7", + "theme.bar.buttons.battery.border": "#f6c177", + "theme.bar.buttons.systray.border": "#26233a", + "theme.bar.buttons.bluetooth.border": "#9ccfd8", + "theme.bar.buttons.network.border": "#c4a7e7", + "theme.bar.buttons.volume.border": "#eb6f92", + "theme.bar.buttons.media.border": "#c4a7e7", + "theme.bar.buttons.windowtitle.border": "#c4a7e7", + "theme.bar.buttons.workspaces.border": "#1f1d2e", + "theme.bar.buttons.dashboard.border": "#f6c177", + "theme.bar.buttons.modules.submap.background": "#2a283e", + "theme.bar.buttons.modules.submap.text": "#9ccfd8", + "theme.bar.buttons.modules.submap.border": "#9ccfd8", + "theme.bar.buttons.modules.submap.icon": "#9ccfd8", + "theme.bar.buttons.modules.submap.icon_background": "#2a283e" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/rose_pine_moon_split.json b/ags/HyprPanel/themes/rose_pine_moon_split.json new file mode 100644 index 0000000..bbf84e8 --- /dev/null +++ b/ags/HyprPanel/themes/rose_pine_moon_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#232136", + "theme.bar.background": "#232136", + "theme.bar.buttons.media.icon": "#2a283e", + "theme.bar.buttons.media.text": "#c4a7e7", + "theme.bar.buttons.icon": "#c4a7e7", + "theme.bar.buttons.text": "#c4a7e7", + "theme.bar.buttons.hover": "#393552", + "theme.bar.buttons.background": "#2a283e", + "theme.bar.menus.text": "#e0def4", + "theme.bar.menus.border.color": "#2a273f", + "theme.bar.buttons.media.background": "#2a283e", + "theme.bar.menus.menu.volume.text": "#e0def4", + "theme.bar.menus.menu.volume.card.color": "#2a283e", + "theme.bar.menus.menu.volume.label.color": "#eb6f92", + "theme.bar.menus.popover.text": "#c4a7e7", + "theme.bar.menus.popover.background": "#2a273f", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#232136", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#e0def4", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#2a273f", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#232136", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#2a283e", + "theme.bar.menus.menu.notifications.switch.puck": "#393552", + "theme.bar.menus.menu.notifications.switch.disabled": "#2a273f", + "theme.bar.menus.menu.notifications.switch.enabled": "#c4a7e7", + "theme.bar.menus.menu.notifications.clear": "#eb6f92", + "theme.bar.menus.menu.notifications.switch_divider": "#393552", + "theme.bar.menus.menu.notifications.border": "#2a273f", + "theme.bar.menus.menu.notifications.card": "#2a283e", + "theme.bar.menus.menu.notifications.background": "#232136", + "theme.bar.menus.menu.notifications.no_notifications_label": "#2a273f", + "theme.bar.menus.menu.notifications.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#393552", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#3e8eb0", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#9ccfd8", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#eb6f92", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f6c177", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.input.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.input.background": "#3e8eb0", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#eb6f92", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f6c177", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#9ccfd8", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#2a273f", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#44415a", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#9ccfd8", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#2a273f", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#f6c177", + "theme.bar.menus.menu.dashboard.profile.name": "#c4a7e7", + "theme.bar.menus.menu.dashboard.border.color": "#2a273f", + "theme.bar.menus.menu.dashboard.background.color": "#232136", + "theme.bar.menus.menu.dashboard.card.color": "#2a283e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.time": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#3e8fb0", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#f6c177", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#eb6f92", + "theme.bar.menus.menu.clock.weather.stats": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.status": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.temperature": "#e0def4", + "theme.bar.menus.menu.clock.weather.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.contextdays": "#44415a", + "theme.bar.menus.menu.clock.calendar.days": "#e0def4", + "theme.bar.menus.menu.clock.calendar.currentday": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.paginator": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.weekdays": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#9ccfd8", + "theme.bar.menus.menu.clock.time.timeperiod": "#9ccfd8", + "theme.bar.menus.menu.clock.time.time": "#c4a7e7", + "theme.bar.menus.menu.clock.text": "#e0def4", + "theme.bar.menus.menu.clock.border.color": "#2a273f", + "theme.bar.menus.menu.clock.background.color": "#232136", + "theme.bar.menus.menu.clock.card.color": "#2a283e", + "theme.bar.menus.menu.battery.slider.puck": "#393552", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#393552", + "theme.bar.menus.menu.battery.slider.background": "#44415a", + "theme.bar.menus.menu.battery.slider.primary": "#f6c177", + "theme.bar.menus.menu.battery.icons.active": "#f6c177", + "theme.bar.menus.menu.battery.icons.passive": "#56526e", + "theme.bar.menus.menu.battery.listitems.active": "#f6c177", + "theme.bar.menus.menu.battery.listitems.passive": "#e0def4", + "theme.bar.menus.menu.battery.text": "#e0def4", + "theme.bar.menus.menu.battery.label.color": "#f6c177", + "theme.bar.menus.menu.battery.border.color": "#2a273f", + "theme.bar.menus.menu.battery.background.color": "#232136", + "theme.bar.menus.menu.battery.card.color": "#2a283e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#2a283e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#e0def4", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#232136", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.icons.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.icons.passive": "#56526e", + "theme.bar.menus.menu.bluetooth.listitems.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.switch.puck": "#393552", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#2a273f", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.switch_divider": "#393552", + "theme.bar.menus.menu.bluetooth.status": "#393552", + "theme.bar.menus.menu.bluetooth.text": "#e0def4", + "theme.bar.menus.menu.bluetooth.label.color": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.border.color": "#2a273f", + "theme.bar.menus.menu.bluetooth.background.color": "#232136", + "theme.bar.menus.menu.bluetooth.card.color": "#2a283e", + "theme.bar.menus.menu.network.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#e0def4", + "theme.bar.menus.menu.network.icons.active": "#c4a7e7", + "theme.bar.menus.menu.network.icons.passive": "#56526e", + "theme.bar.menus.menu.network.listitems.active": "#c4a7e7", + "theme.bar.menus.menu.network.listitems.passive": "#e0def4", + "theme.bar.menus.menu.network.status.color": "#393552", + "theme.bar.menus.menu.network.text": "#e0def4", + "theme.bar.menus.menu.network.label.color": "#c4a7e7", + "theme.bar.menus.menu.network.border.color": "#2a273f", + "theme.bar.menus.menu.network.background.color": "#232136", + "theme.bar.menus.menu.network.card.color": "#2a283e", + "theme.bar.menus.menu.volume.input_slider.puck": "#44415a", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#393552", + "theme.bar.menus.menu.volume.input_slider.background": "#44415a", + "theme.bar.menus.menu.volume.input_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.audio_slider.puck": "#44415a", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#393552", + "theme.bar.menus.menu.volume.audio_slider.background": "#44415a", + "theme.bar.menus.menu.volume.audio_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.icons.active": "#eb6f92", + "theme.bar.menus.menu.volume.icons.passive": "#56526e", + "theme.bar.menus.menu.volume.iconbutton.active": "#eb6f92", + "theme.bar.menus.menu.volume.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.volume.listitems.active": "#eb6f92", + "theme.bar.menus.menu.volume.listitems.passive": "#e0def4", + "theme.bar.menus.menu.volume.border.color": "#2a273f", + "theme.bar.menus.menu.volume.background.color": "#232136", + "theme.bar.menus.menu.media.slider.puck": "#393552", + "theme.bar.menus.menu.media.slider.backgroundhover": "#393552", + "theme.bar.menus.menu.media.slider.background": "#44415a", + "theme.bar.menus.menu.media.slider.primary": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.text": "#232136", + "theme.bar.menus.menu.media.buttons.background": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.enabled": "#9ccfd8", + "theme.bar.menus.menu.media.buttons.inactive": "#44415a", + "theme.bar.menus.menu.media.border.color": "#2a273f", + "theme.bar.menus.menu.media.background.color": "#232136", + "theme.bar.menus.menu.media.album": "#c4a7e7", + "theme.bar.menus.menu.media.artist": "#9ccfd8", + "theme.bar.menus.menu.media.song": "#c4a7e7", + "theme.bar.menus.tooltip.text": "#e0def4", + "theme.bar.menus.tooltip.background": "#232136", + "theme.bar.menus.dropdownmenu.divider": "#2a283e", + "theme.bar.menus.dropdownmenu.text": "#e0def4", + "theme.bar.menus.dropdownmenu.background": "#232136", + "theme.bar.menus.slider.puck": "#393552", + "theme.bar.menus.slider.backgroundhover": "#393552", + "theme.bar.menus.slider.background": "#44415a", + "theme.bar.menus.slider.primary": "#c4a7e7", + "theme.bar.menus.progressbar.background": "#393552", + "theme.bar.menus.progressbar.foreground": "#c4a7e7", + "theme.bar.menus.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.iconbuttons.passive": "#e0def4", + "theme.bar.menus.buttons.text": "#2a273f", + "theme.bar.menus.buttons.disabled": "#44415a", + "theme.bar.menus.buttons.active": "#c4a7e7", + "theme.bar.menus.buttons.default": "#c4a7e7", + "theme.bar.menus.switch.puck": "#393552", + "theme.bar.menus.switch.disabled": "#2a273f", + "theme.bar.menus.switch.enabled": "#c4a7e7", + "theme.bar.menus.icons.active": "#c4a7e7", + "theme.bar.menus.icons.passive": "#44415a", + "theme.bar.menus.listitems.active": "#c4a7e7", + "theme.bar.menus.listitems.passive": "#e0def4", + "theme.bar.menus.label": "#c4a7e7", + "theme.bar.menus.feinttext": "#2a273f", + "theme.bar.menus.dimtext": "#44415a", + "theme.bar.menus.cards": "#2a283e", + "theme.bar.buttons.notifications.total": "#c4a7e7", + "theme.bar.buttons.notifications.icon": "#2a283e", + "theme.bar.buttons.notifications.background": "#2a283e", + "theme.bar.buttons.clock.icon": "#2a283e", + "theme.bar.buttons.clock.text": "#c4a7e7", + "theme.bar.buttons.clock.background": "#2a283e", + "theme.bar.buttons.battery.icon": "#2a283e", + "theme.bar.buttons.battery.text": "#f6c177", + "theme.bar.buttons.battery.background": "#2a283e", + "theme.bar.buttons.systray.background": "#2a283e", + "theme.bar.buttons.bluetooth.icon": "#2a283e", + "theme.bar.buttons.bluetooth.text": "#9ccfd8", + "theme.bar.buttons.bluetooth.background": "#2a283e", + "theme.bar.buttons.network.icon": "#2a283e", + "theme.bar.buttons.network.text": "#c4a7e7", + "theme.bar.buttons.network.background": "#2a283e", + "theme.bar.buttons.volume.icon": "#2a283e", + "theme.bar.buttons.volume.text": "#eb6f92", + "theme.bar.buttons.volume.background": "#2a283e", + "theme.bar.buttons.windowtitle.icon": "#2a283e", + "theme.bar.buttons.windowtitle.text": "#c4a7e7", + "theme.bar.buttons.windowtitle.background": "#2a283e", + "theme.bar.buttons.workspaces.active": "#c4a7e7", + "theme.bar.buttons.workspaces.occupied": "#eb6f92", + "theme.bar.buttons.workspaces.available": "#9ccfd8", + "theme.bar.buttons.workspaces.hover": "#c4a7e7", + "theme.bar.buttons.workspaces.background": "#2a283e", + "theme.bar.buttons.dashboard.icon": "#2a283e", + "theme.bar.buttons.dashboard.background": "#f6c177", + "theme.osd.label": "#c4a7e7", + "theme.osd.icon": "#232136", + "theme.osd.bar_overflow_color": "#eb6f92", + "theme.osd.bar_empty_color": "#2a273f", + "theme.osd.bar_color": "#c4a7e7", + "theme.osd.icon_container": "#c4a7e7", + "theme.osd.bar_container": "#232136", + "theme.notification.close_button.label": "#232136", + "theme.notification.close_button.background": "#eb6f92", + "theme.notification.labelicon": "#c4a7e7", + "theme.notification.text": "#e0def4", + "theme.notification.time": "#56526e", + "theme.notification.border": "#2a273f", + "theme.notification.label": "#c4a7e7", + "theme.notification.actions.text": "#2a273f", + "theme.notification.actions.background": "#c4a7e7", + "theme.notification.background": "#2a273f", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#2a283e", + "theme.bar.menus.check_radio_button.background": "#393452", + "theme.bar.menus.check_radio_button.active": "#c4a7e7", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#eb6f92", + "theme.bar.buttons.network.icon_background": "#c4a7e7", + "theme.bar.buttons.bluetooth.icon_background": "#9ccfd8", + "theme.bar.buttons.windowtitle.icon_background": "#c4a7e7", + "theme.bar.buttons.media.icon_background": "#c4a7e7", + "theme.bar.buttons.notifications.icon_background": "#c4a7e7", + "theme.bar.buttons.battery.icon_background": "#f6c177", + "theme.bar.buttons.clock.icon_background": "#c4a7e7", + "theme.bar.menus.menu.notifications.pager.button": "#c4a7e7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#c4a7e7", + "theme.bar.menus.menu.notifications.pager.label": "#56526e", + "theme.bar.menus.menu.notifications.pager.background": "#232136", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.storage.icon_background": "#eb6f92", + "theme.bar.menus.popover.border": "#2a273f", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#9ccfd8", + "theme.bar.menus.menu.power.buttons.restart.text": "#f6c177", + "theme.bar.buttons.modules.updates.background": "#2a283e", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.netstat.background": "#2a283e", + "theme.bar.buttons.modules.weather.icon": "#2a283e", + "theme.bar.buttons.modules.netstat.text": "#9ccfd8", + "theme.bar.buttons.modules.storage.background": "#2a283e", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.buttons.modules.storage.text": "#eb6f92", + "theme.bar.buttons.modules.cpu.background": "#2a283e", + "theme.bar.menus.menu.power.border.color": "#2a273f", + "theme.bar.buttons.modules.power.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.logout.icon": "#2a273f", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.restart.icon": "#2a273f", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.kbLayout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.weather.text": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#2a273f", + "theme.bar.menus.menu.power.buttons.sleep.text": "#9ccfd8", + "theme.bar.buttons.modules.weather.icon_background": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#2a283e", + "theme.bar.menus.menu.power.buttons.logout.background": "#2a283e", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.ram.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#eb6f92", + "theme.bar.menus.menu.power.buttons.sleep.background": "#2a283e", + "theme.bar.buttons.modules.ram.text": "#f6c177", + "theme.bar.menus.menu.power.buttons.logout.text": "#9ccfd8", + "theme.bar.buttons.modules.updates.icon_background": "#3e8eb0", + "theme.bar.buttons.modules.kbLayout.background": "#2a283e", + "theme.bar.buttons.modules.power.background": "#2a283e", + "theme.bar.buttons.modules.weather.background": "#2a283e", + "theme.bar.menus.menu.power.background.color": "#232136", + "theme.bar.buttons.modules.ram.background": "#2a283e", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.updates.text": "#3e8eb0", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#2a273f", + "theme.bar.menus.menu.power.buttons.restart.background": "#2a283e", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.cpu.text": "#eb6f92", + "theme.bar.buttons.modules.netstat.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.kbLayout.text": "#9ccfd8", + "theme.bar.buttons.modules.power.border": "#eb6f92", + "theme.bar.buttons.modules.weather.border": "#c4a7e7", + "theme.bar.buttons.modules.updates.border": "#30738f", + "theme.bar.buttons.modules.kbLayout.border": "#9ccfd8", + "theme.bar.buttons.modules.netstat.border": "#9ccfd8", + "theme.bar.buttons.modules.storage.border": "#eb6f92", + "theme.bar.buttons.modules.cpu.border": "#eb6f92", + "theme.bar.buttons.modules.ram.border": "#f6c177", + "theme.bar.buttons.notifications.border": "#c4a7e7", + "theme.bar.buttons.clock.border": "#c4a7e7", + "theme.bar.buttons.battery.border": "#f6c177", + "theme.bar.buttons.systray.border": "#26233a", + "theme.bar.buttons.bluetooth.border": "#9ccfd8", + "theme.bar.buttons.network.border": "#c4a7e7", + "theme.bar.buttons.volume.border": "#eb6f92", + "theme.bar.buttons.media.border": "#c4a7e7", + "theme.bar.buttons.windowtitle.border": "#c4a7e7", + "theme.bar.buttons.workspaces.border": "#1f1d2e", + "theme.bar.buttons.dashboard.border": "#f6c177", + "theme.bar.buttons.modules.submap.background": "#2a283e", + "theme.bar.buttons.modules.submap.text": "#9ccfd8", + "theme.bar.buttons.modules.submap.border": "#9ccfd8", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.icon_background": "#9ccfd8" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/rose_pine_split.json b/ags/HyprPanel/themes/rose_pine_split.json new file mode 100644 index 0000000..404693c --- /dev/null +++ b/ags/HyprPanel/themes/rose_pine_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#191724", + "theme.bar.background": "#191724", + "theme.bar.buttons.media.icon": "#21202e", + "theme.bar.buttons.media.text": "#c4a7e7", + "theme.bar.buttons.icon": "#c4a7e7", + "theme.bar.buttons.text": "#c4a7e7", + "theme.bar.buttons.hover": "#26233a", + "theme.bar.buttons.background": "#21202e", + "theme.bar.menus.text": "#e0def4", + "theme.bar.menus.border.color": "#1f1d2e", + "theme.bar.buttons.media.background": "#21202e", + "theme.bar.menus.menu.volume.text": "#e0def4", + "theme.bar.menus.menu.volume.card.color": "#21202e", + "theme.bar.menus.menu.volume.label.color": "#eb6f92", + "theme.bar.menus.popover.text": "#c4a7e7", + "theme.bar.menus.popover.background": "#1f1d2e", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#eb6f92", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#191724", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#e0def4", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#1f1d2e", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#191724", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#21202e", + "theme.bar.menus.menu.notifications.switch.puck": "#26233a", + "theme.bar.menus.menu.notifications.switch.disabled": "#1f1d2e", + "theme.bar.menus.menu.notifications.switch.enabled": "#c4a7e7", + "theme.bar.menus.menu.notifications.clear": "#eb6f92", + "theme.bar.menus.menu.notifications.switch_divider": "#26233a", + "theme.bar.menus.menu.notifications.border": "#1f1d2e", + "theme.bar.menus.menu.notifications.card": "#21202e", + "theme.bar.menus.menu.notifications.background": "#191724", + "theme.bar.menus.menu.notifications.no_notifications_label": "#1f1d2e", + "theme.bar.menus.menu.notifications.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#c4a7e7", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#9ccfd8", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#f6c177", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#eb6f92", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#26233a", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#30738f", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#9ccfd8", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#eb6f92", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#f6c177", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.input.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.input.background": "#30738f", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#eb6f92", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#f6c177", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#9ccfd8", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#403d52", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#9ccfd8", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#1f1d2e", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#c4a7e7", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#9ccfd8", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#f6c177", + "theme.bar.menus.menu.dashboard.profile.name": "#c4a7e7", + "theme.bar.menus.menu.dashboard.border.color": "#1f1d2e", + "theme.bar.menus.menu.dashboard.background.color": "#191724", + "theme.bar.menus.menu.dashboard.card.color": "#21202e", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.hourly.time": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#31748f", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#f6c177", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#eb6f92", + "theme.bar.menus.menu.clock.weather.stats": "#c4a7e7", + "theme.bar.menus.menu.clock.weather.status": "#9ccfd8", + "theme.bar.menus.menu.clock.weather.temperature": "#e0def4", + "theme.bar.menus.menu.clock.weather.icon": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.contextdays": "#403d52", + "theme.bar.menus.menu.clock.calendar.days": "#e0def4", + "theme.bar.menus.menu.clock.calendar.currentday": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.paginator": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.weekdays": "#c4a7e7", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#9ccfd8", + "theme.bar.menus.menu.clock.time.timeperiod": "#9ccfd8", + "theme.bar.menus.menu.clock.time.time": "#c4a7e7", + "theme.bar.menus.menu.clock.text": "#e0def4", + "theme.bar.menus.menu.clock.border.color": "#1f1d2e", + "theme.bar.menus.menu.clock.background.color": "#191724", + "theme.bar.menus.menu.clock.card.color": "#21202e", + "theme.bar.menus.menu.battery.slider.puck": "#26233a", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.battery.slider.background": "#403d52", + "theme.bar.menus.menu.battery.slider.primary": "#f6c177", + "theme.bar.menus.menu.battery.icons.active": "#f6c177", + "theme.bar.menus.menu.battery.icons.passive": "#524f67", + "theme.bar.menus.menu.battery.listitems.active": "#f6c177", + "theme.bar.menus.menu.battery.listitems.passive": "#e0def4", + "theme.bar.menus.menu.battery.text": "#e0def4", + "theme.bar.menus.menu.battery.label.color": "#f6c177", + "theme.bar.menus.menu.battery.border.color": "#1f1d2e", + "theme.bar.menus.menu.battery.background.color": "#191724", + "theme.bar.menus.menu.battery.card.color": "#21202e", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#21202e", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#e0def4", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#191724", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.icons.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.icons.passive": "#524f67", + "theme.bar.menus.menu.bluetooth.listitems.active": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#e0def4", + "theme.bar.menus.menu.bluetooth.switch.puck": "#26233a", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#1f1d2e", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.switch_divider": "#26233a", + "theme.bar.menus.menu.bluetooth.status": "#26233a", + "theme.bar.menus.menu.bluetooth.text": "#e0def4", + "theme.bar.menus.menu.bluetooth.label.color": "#9ccfd8", + "theme.bar.menus.menu.bluetooth.border.color": "#1f1d2e", + "theme.bar.menus.menu.bluetooth.background.color": "#191724", + "theme.bar.menus.menu.bluetooth.card.color": "#21202e", + "theme.bar.menus.menu.network.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#e0def4", + "theme.bar.menus.menu.network.icons.active": "#c4a7e7", + "theme.bar.menus.menu.network.icons.passive": "#524f67", + "theme.bar.menus.menu.network.listitems.active": "#c4a7e7", + "theme.bar.menus.menu.network.listitems.passive": "#e0def4", + "theme.bar.menus.menu.network.status.color": "#26233a", + "theme.bar.menus.menu.network.text": "#e0def4", + "theme.bar.menus.menu.network.label.color": "#c4a7e7", + "theme.bar.menus.menu.network.border.color": "#1f1d2e", + "theme.bar.menus.menu.network.background.color": "#191724", + "theme.bar.menus.menu.network.card.color": "#21202e", + "theme.bar.menus.menu.volume.input_slider.puck": "#403d52", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.volume.input_slider.background": "#403d52", + "theme.bar.menus.menu.volume.input_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.audio_slider.puck": "#403d52", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.volume.audio_slider.background": "#403d52", + "theme.bar.menus.menu.volume.audio_slider.primary": "#eb6f92", + "theme.bar.menus.menu.volume.icons.active": "#eb6f92", + "theme.bar.menus.menu.volume.icons.passive": "#524f67", + "theme.bar.menus.menu.volume.iconbutton.active": "#eb6f92", + "theme.bar.menus.menu.volume.iconbutton.passive": "#e0def4", + "theme.bar.menus.menu.volume.listitems.active": "#eb6f92", + "theme.bar.menus.menu.volume.listitems.passive": "#e0def4", + "theme.bar.menus.menu.volume.border.color": "#1f1d2e", + "theme.bar.menus.menu.volume.background.color": "#191724", + "theme.bar.menus.menu.media.slider.puck": "#26233a", + "theme.bar.menus.menu.media.slider.backgroundhover": "#26233a", + "theme.bar.menus.menu.media.slider.background": "#403d52", + "theme.bar.menus.menu.media.slider.primary": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.text": "#191724", + "theme.bar.menus.menu.media.buttons.background": "#c4a7e7", + "theme.bar.menus.menu.media.buttons.enabled": "#9ccfd8", + "theme.bar.menus.menu.media.buttons.inactive": "#403d52", + "theme.bar.menus.menu.media.border.color": "#1f1d2e", + "theme.bar.menus.menu.media.background.color": "#191724", + "theme.bar.menus.menu.media.album": "#c4a7e7", + "theme.bar.menus.menu.media.artist": "#9ccfd8", + "theme.bar.menus.menu.media.song": "#c4a7e7", + "theme.bar.menus.tooltip.text": "#e0def4", + "theme.bar.menus.tooltip.background": "#191724", + "theme.bar.menus.dropdownmenu.divider": "#21202e", + "theme.bar.menus.dropdownmenu.text": "#e0def4", + "theme.bar.menus.dropdownmenu.background": "#191724", + "theme.bar.menus.slider.puck": "#26233a", + "theme.bar.menus.slider.backgroundhover": "#26233a", + "theme.bar.menus.slider.background": "#403d52", + "theme.bar.menus.slider.primary": "#c4a7e7", + "theme.bar.menus.progressbar.background": "#26233a", + "theme.bar.menus.progressbar.foreground": "#c4a7e7", + "theme.bar.menus.iconbuttons.active": "#c4a7e7", + "theme.bar.menus.iconbuttons.passive": "#e0def4", + "theme.bar.menus.buttons.text": "#1f1d2e", + "theme.bar.menus.buttons.disabled": "#403d52", + "theme.bar.menus.buttons.active": "#c4a7e7", + "theme.bar.menus.buttons.default": "#c4a7e7", + "theme.bar.menus.switch.puck": "#26233a", + "theme.bar.menus.switch.disabled": "#1f1d2e", + "theme.bar.menus.switch.enabled": "#c4a7e7", + "theme.bar.menus.icons.active": "#c4a7e7", + "theme.bar.menus.icons.passive": "#403d52", + "theme.bar.menus.listitems.active": "#c4a7e7", + "theme.bar.menus.listitems.passive": "#e0def4", + "theme.bar.menus.label": "#c4a7e7", + "theme.bar.menus.feinttext": "#1f1d2e", + "theme.bar.menus.dimtext": "#403d52", + "theme.bar.menus.cards": "#21202e", + "theme.bar.buttons.notifications.total": "#c4a7e7", + "theme.bar.buttons.notifications.icon": "#21202e", + "theme.bar.buttons.notifications.background": "#21202e", + "theme.bar.buttons.clock.icon": "#21202e", + "theme.bar.buttons.clock.text": "#c4a7e7", + "theme.bar.buttons.clock.background": "#21202e", + "theme.bar.buttons.battery.icon": "#21202e", + "theme.bar.buttons.battery.text": "#f6c177", + "theme.bar.buttons.battery.background": "#21202e", + "theme.bar.buttons.systray.background": "#21202e", + "theme.bar.buttons.bluetooth.icon": "#26233a", + "theme.bar.buttons.bluetooth.text": "#9ccfd8", + "theme.bar.buttons.bluetooth.background": "#21202e", + "theme.bar.buttons.network.icon": "#21202e", + "theme.bar.buttons.network.text": "#c4a7e7", + "theme.bar.buttons.network.background": "#21202e", + "theme.bar.buttons.volume.icon": "#21202e", + "theme.bar.buttons.volume.text": "#eb6f92", + "theme.bar.buttons.volume.background": "#21202e", + "theme.bar.buttons.windowtitle.icon": "#21202e", + "theme.bar.buttons.windowtitle.text": "#c4a7e7", + "theme.bar.buttons.windowtitle.background": "#21202e", + "theme.bar.buttons.workspaces.active": "#c4a7e7", + "theme.bar.buttons.workspaces.occupied": "#eb6f92", + "theme.bar.buttons.workspaces.available": "#9ccfd8", + "theme.bar.buttons.workspaces.hover": "#c4a7e7", + "theme.bar.buttons.workspaces.background": "#21202e", + "theme.bar.buttons.dashboard.icon": "#21202e", + "theme.bar.buttons.dashboard.background": "#f6c177", + "theme.osd.label": "#c4a7e7", + "theme.osd.icon": "#191724", + "theme.osd.bar_overflow_color": "#eb6f92", + "theme.osd.bar_empty_color": "#1f1d2e", + "theme.osd.bar_color": "#c4a7e7", + "theme.osd.icon_container": "#c4a7e7", + "theme.osd.bar_container": "#191724", + "theme.notification.close_button.label": "#191724", + "theme.notification.close_button.background": "#eb6f92", + "theme.notification.labelicon": "#c4a7e7", + "theme.notification.text": "#e0def4", + "theme.notification.time": "#403d52", + "theme.notification.border": "#1f1d2e", + "theme.notification.label": "#c4a7e7", + "theme.notification.actions.text": "#1f1d2e", + "theme.notification.actions.background": "#c4a7e7", + "theme.notification.background": "#1f1d2e", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#21202e", + "theme.bar.menus.check_radio_button.background": "#393452", + "theme.bar.menus.check_radio_button.active": "#c4a7e7", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#eb6f92", + "theme.bar.buttons.network.icon_background": "#c4a7e7", + "theme.bar.buttons.bluetooth.icon_background": "#9ccfd8", + "theme.bar.buttons.windowtitle.icon_background": "#c4a7e7", + "theme.bar.buttons.media.icon_background": "#c4a7e7", + "theme.bar.buttons.notifications.icon_background": "#c4a7e7", + "theme.bar.buttons.battery.icon_background": "#f6c177", + "theme.bar.buttons.clock.icon_background": "#c4a7e7", + "theme.bar.menus.menu.notifications.pager.button": "#c4a7e7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#c4a7e7", + "theme.bar.menus.menu.notifications.pager.label": "#524f67", + "theme.bar.menus.menu.notifications.pager.background": "#191724", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.storage.icon_background": "#eb6f92", + "theme.bar.menus.popover.border": "#1f1d2e", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#9ccfd8", + "theme.bar.menus.menu.power.buttons.restart.text": "#f6c177", + "theme.bar.buttons.modules.updates.background": "#21202e", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.netstat.background": "#21202e", + "theme.bar.buttons.modules.weather.icon": "#21202e", + "theme.bar.buttons.modules.netstat.text": "#9ccfd8", + "theme.bar.buttons.modules.storage.background": "#21202e", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.buttons.modules.storage.text": "#eb6f92", + "theme.bar.buttons.modules.cpu.background": "#21202e", + "theme.bar.menus.menu.power.border.color": "#1f1d2e", + "theme.bar.buttons.modules.power.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.logout.icon": "#1f1d2e", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.restart.icon": "#1f1d2e", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.kbLayout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.weather.text": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#1f1d2e", + "theme.bar.menus.menu.power.buttons.sleep.text": "#9ccfd8", + "theme.bar.buttons.modules.weather.icon_background": "#c4a7e7", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#21202e", + "theme.bar.menus.menu.power.buttons.logout.background": "#21202e", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.ram.icon_background": "#f6c177", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#eb6f92", + "theme.bar.menus.menu.power.buttons.sleep.background": "#21202e", + "theme.bar.buttons.modules.ram.text": "#f6c177", + "theme.bar.menus.menu.power.buttons.logout.text": "#9ccfd8", + "theme.bar.buttons.modules.updates.icon_background": "#30738f", + "theme.bar.buttons.modules.kbLayout.background": "#21202e", + "theme.bar.buttons.modules.power.background": "#21202e", + "theme.bar.buttons.modules.weather.background": "#21202e", + "theme.bar.menus.menu.power.background.color": "#191724", + "theme.bar.buttons.modules.ram.background": "#21202e", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon_background": "#eb6f92", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.updates.text": "#30738f", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#1f1d2e", + "theme.bar.menus.menu.power.buttons.restart.background": "#21202e", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.cpu.text": "#eb6f92", + "theme.bar.buttons.modules.netstat.icon_background": "#9ccfd8", + "theme.bar.buttons.modules.kbLayout.text": "#9ccfd8", + "theme.bar.buttons.modules.power.border": "#eb6f92", + "theme.bar.buttons.modules.weather.border": "#c4a7e7", + "theme.bar.buttons.modules.updates.border": "#30738f", + "theme.bar.buttons.modules.kbLayout.border": "#9ccfd8", + "theme.bar.buttons.modules.netstat.border": "#9ccfd8", + "theme.bar.buttons.modules.storage.border": "#eb6f92", + "theme.bar.buttons.modules.cpu.border": "#eb6f92", + "theme.bar.buttons.modules.ram.border": "#f6c177", + "theme.bar.buttons.notifications.border": "#c4a7e7", + "theme.bar.buttons.clock.border": "#c4a7e7", + "theme.bar.buttons.battery.border": "#f6c177", + "theme.bar.buttons.systray.border": "#26233a", + "theme.bar.buttons.bluetooth.border": "#9ccfd8", + "theme.bar.buttons.network.border": "#c4a7e7", + "theme.bar.buttons.volume.border": "#eb6f92", + "theme.bar.buttons.media.border": "#c4a7e7", + "theme.bar.buttons.windowtitle.border": "#c4a7e7", + "theme.bar.buttons.workspaces.border": "#1f1d2e", + "theme.bar.buttons.dashboard.border": "#f6c177", + "theme.bar.buttons.modules.submap.background": "#21202e", + "theme.bar.buttons.modules.submap.text": "#9ccfd8", + "theme.bar.buttons.modules.submap.border": "#9ccfd8", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.icon_background": "#9ccfd8" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/tokyo_night.json b/ags/HyprPanel/themes/tokyo_night.json new file mode 100644 index 0000000..01e63c8 --- /dev/null +++ b/ags/HyprPanel/themes/tokyo_night.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#1a1b26", + "theme.bar.background": "#1a1b26", + "theme.bar.buttons.media.icon": "#bb9af7", + "theme.bar.buttons.media.text": "#bb9af7", + "theme.bar.buttons.icon": "#bb9af7", + "theme.bar.buttons.text": "#bb9af7", + "theme.bar.buttons.hover": "#414868", + "theme.bar.buttons.background": "#272a3d", + "theme.bar.menus.text": "#c0caf5", + "theme.bar.menus.border.color": "#414868", + "theme.bar.buttons.media.background": "#272a3d", + "theme.bar.menus.menu.volume.text": "#c0caf5", + "theme.bar.menus.menu.volume.card.color": "#24283b", + "theme.bar.menus.menu.volume.label.color": "#f7768e", + "theme.bar.menus.popover.text": "#bb9af7", + "theme.bar.menus.popover.background": "#1a1b26", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#f7768e", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#f7768e", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#9ece6a", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#1a1b26", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#c0caf5", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#bb9af7", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#414868", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#1a1b26", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#24283b", + "theme.bar.menus.menu.notifications.switch.puck": "#565f89", + "theme.bar.menus.menu.notifications.switch.disabled": "#565f89", + "theme.bar.menus.menu.notifications.switch.enabled": "#bb9af7", + "theme.bar.menus.menu.notifications.clear": "#f7768e", + "theme.bar.menus.menu.notifications.switch_divider": "#414868", + "theme.bar.menus.menu.notifications.border": "#414868", + "theme.bar.menus.menu.notifications.card": "#24283b", + "theme.bar.menus.menu.notifications.background": "#1a1b26", + "theme.bar.menus.menu.notifications.no_notifications_label": "#414868", + "theme.bar.menus.menu.notifications.label": "#bb9af7", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#9ece6a", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#9ece6a", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#9ece6a", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#e0af68", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#e0af68", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#e0af68", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#414868", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#bb9af7", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#bb9af7", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#73daca", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#f7768e", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#e0af68", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f7768e", + "theme.bar.menus.menu.dashboard.controls.input.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f7768e", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#f7768e", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#e0af68", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#7dcfff", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#bb9af7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#414868", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#9ece6a", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#bb9af7", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#7dcfff", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#9ece6a", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#e0af68", + "theme.bar.menus.menu.dashboard.profile.name": "#f7768e", + "theme.bar.menus.menu.dashboard.border.color": "#414868", + "theme.bar.menus.menu.dashboard.background.color": "#1a1b26", + "theme.bar.menus.menu.dashboard.card.color": "#24283b", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f7768e", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f7768e", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f7768e", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#7dcfff", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#7aa2f7", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#bb9af7", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#e0af68", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#f7768e", + "theme.bar.menus.menu.clock.weather.stats": "#f7768e", + "theme.bar.menus.menu.clock.weather.status": "#73daca", + "theme.bar.menus.menu.clock.weather.temperature": "#c0caf5", + "theme.bar.menus.menu.clock.weather.icon": "#f7768e", + "theme.bar.menus.menu.clock.calendar.contextdays": "#414868", + "theme.bar.menus.menu.clock.calendar.days": "#c0caf5", + "theme.bar.menus.menu.clock.calendar.currentday": "#f7768e", + "theme.bar.menus.menu.clock.calendar.paginator": "#f7768e", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f7768e", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#73daca", + "theme.bar.menus.menu.clock.time.timeperiod": "#73daca", + "theme.bar.menus.menu.clock.time.time": "#f7768e", + "theme.bar.menus.menu.clock.text": "#c0caf5", + "theme.bar.menus.menu.clock.border.color": "#414868", + "theme.bar.menus.menu.clock.background.color": "#1a1b26", + "theme.bar.menus.menu.clock.card.color": "#24283b", + "theme.bar.menus.menu.battery.slider.puck": "#565f89", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#414868", + "theme.bar.menus.menu.battery.slider.background": "#565f89", + "theme.bar.menus.menu.battery.slider.primary": "#e0af68", + "theme.bar.menus.menu.battery.icons.active": "#e0af68", + "theme.bar.menus.menu.battery.icons.passive": "#565f89", + "theme.bar.menus.menu.battery.listitems.active": "#e0af68", + "theme.bar.menus.menu.battery.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.battery.text": "#c0caf5", + "theme.bar.menus.menu.battery.label.color": "#e0af68", + "theme.bar.menus.menu.battery.border.color": "#414868", + "theme.bar.menus.menu.battery.background.color": "#1a1b26", + "theme.bar.menus.menu.battery.card.color": "#24283b", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#24283b", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#c0caf5", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#1a1b26", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#7dcfff", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#c0caf5", + "theme.bar.menus.menu.bluetooth.icons.active": "#7dcfff", + "theme.bar.menus.menu.bluetooth.icons.passive": "#565f89", + "theme.bar.menus.menu.bluetooth.listitems.active": "#7dcfff", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.bluetooth.switch.puck": "#565f89", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#565f89", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#7dcfff", + "theme.bar.menus.menu.bluetooth.switch_divider": "#414868", + "theme.bar.menus.menu.bluetooth.status": "#565f89", + "theme.bar.menus.menu.bluetooth.text": "#c0caf5", + "theme.bar.menus.menu.bluetooth.label.color": "#7dcfff", + "theme.bar.menus.menu.bluetooth.border.color": "#414868", + "theme.bar.menus.menu.bluetooth.background.color": "#1a1b26", + "theme.bar.menus.menu.bluetooth.card.color": "#24283b", + "theme.bar.menus.menu.network.iconbuttons.active": "#bb9af7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#c0caf5", + "theme.bar.menus.menu.network.icons.active": "#bb9af7", + "theme.bar.menus.menu.network.icons.passive": "#565f89", + "theme.bar.menus.menu.network.listitems.active": "#bb9af7", + "theme.bar.menus.menu.network.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.network.status.color": "#565f89", + "theme.bar.menus.menu.network.text": "#c0caf5", + "theme.bar.menus.menu.network.label.color": "#bb9af7", + "theme.bar.menus.menu.network.border.color": "#414868", + "theme.bar.menus.menu.network.background.color": "#1a1b26", + "theme.bar.menus.menu.network.card.color": "#24283b", + "theme.bar.menus.menu.volume.input_slider.puck": "#414868", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#414868", + "theme.bar.menus.menu.volume.input_slider.background": "#565f89", + "theme.bar.menus.menu.volume.input_slider.primary": "#f7768e", + "theme.bar.menus.menu.volume.audio_slider.puck": "#414868", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#414868", + "theme.bar.menus.menu.volume.audio_slider.background": "#565f89", + "theme.bar.menus.menu.volume.audio_slider.primary": "#f7768e", + "theme.bar.menus.menu.volume.icons.active": "#f7768e", + "theme.bar.menus.menu.volume.icons.passive": "#565f89", + "theme.bar.menus.menu.volume.iconbutton.active": "#f7768e", + "theme.bar.menus.menu.volume.iconbutton.passive": "#c0caf5", + "theme.bar.menus.menu.volume.listitems.active": "#f7768e", + "theme.bar.menus.menu.volume.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.volume.border.color": "#414868", + "theme.bar.menus.menu.volume.background.color": "#1a1b26", + "theme.bar.menus.menu.media.slider.puck": "#565f89", + "theme.bar.menus.menu.media.slider.backgroundhover": "#414868", + "theme.bar.menus.menu.media.slider.background": "#565f89", + "theme.bar.menus.menu.media.slider.primary": "#f7768e", + "theme.bar.menus.menu.media.buttons.text": "#1a1b26", + "theme.bar.menus.menu.media.buttons.background": "#bb9af7", + "theme.bar.menus.menu.media.buttons.enabled": "#73daca", + "theme.bar.menus.menu.media.buttons.inactive": "#414868", + "theme.bar.menus.menu.media.border.color": "#414868", + "theme.bar.menus.menu.media.background.color": "#1a1b26", + "theme.bar.menus.menu.media.album": "#f7768e", + "theme.bar.menus.menu.media.artist": "#73daca", + "theme.bar.menus.menu.media.song": "#bb9af7", + "theme.bar.menus.tooltip.text": "#c0caf5", + "theme.bar.menus.tooltip.background": "#1a1b26", + "theme.bar.menus.dropdownmenu.divider": "#24283b", + "theme.bar.menus.dropdownmenu.text": "#c0caf5", + "theme.bar.menus.dropdownmenu.background": "#1a1b26", + "theme.bar.menus.slider.puck": "#565f89", + "theme.bar.menus.slider.backgroundhover": "#414868", + "theme.bar.menus.slider.background": "#565f89", + "theme.bar.menus.slider.primary": "#bb9af7", + "theme.bar.menus.progressbar.background": "#414868", + "theme.bar.menus.progressbar.foreground": "#bb9af7", + "theme.bar.menus.iconbuttons.active": "#bb9af7", + "theme.bar.menus.iconbuttons.passive": "#c0caf5", + "theme.bar.menus.buttons.text": "#1a1b26", + "theme.bar.menus.buttons.disabled": "#565f89", + "theme.bar.menus.buttons.active": "#f7768e", + "theme.bar.menus.buttons.default": "#bb9af7", + "theme.bar.menus.switch.puck": "#565f89", + "theme.bar.menus.switch.disabled": "#565f89", + "theme.bar.menus.switch.enabled": "#bb9af7", + "theme.bar.menus.icons.active": "#bb9af7", + "theme.bar.menus.icons.passive": "#414868", + "theme.bar.menus.listitems.active": "#bb9af7", + "theme.bar.menus.listitems.passive": "#c0caf5", + "theme.bar.menus.label": "#bb9af7", + "theme.bar.menus.feinttext": "#414868", + "theme.bar.menus.dimtext": "#414868", + "theme.bar.menus.cards": "#24283b", + "theme.bar.buttons.notifications.total": "#bb9af7", + "theme.bar.buttons.notifications.icon": "#bb9af7", + "theme.bar.buttons.notifications.background": "#272a3d", + "theme.bar.buttons.clock.icon": "#f7768e", + "theme.bar.buttons.clock.text": "#f7768e", + "theme.bar.buttons.clock.background": "#272a3d", + "theme.bar.buttons.battery.icon": "#e0af68", + "theme.bar.buttons.battery.text": "#e0af68", + "theme.bar.buttons.battery.background": "#272a3d", + "theme.bar.buttons.systray.background": "#272a3d", + "theme.bar.buttons.bluetooth.icon": "#7dcfff", + "theme.bar.buttons.bluetooth.text": "#7dcfff", + "theme.bar.buttons.bluetooth.background": "#272a3d", + "theme.bar.buttons.network.icon": "#bb9af7", + "theme.bar.buttons.network.text": "#bb9af7", + "theme.bar.buttons.network.background": "#272a3d", + "theme.bar.buttons.volume.icon": "#f7768e", + "theme.bar.buttons.volume.text": "#f7768e", + "theme.bar.buttons.volume.background": "#272a3d", + "theme.bar.buttons.windowtitle.icon": "#f7768e", + "theme.bar.buttons.windowtitle.text": "#f7768e", + "theme.bar.buttons.windowtitle.background": "#272a3d", + "theme.bar.buttons.workspaces.active": "#f7768e", + "theme.bar.buttons.workspaces.occupied": "#f7768e", + "theme.bar.buttons.workspaces.available": "#7dcfff", + "theme.bar.buttons.workspaces.hover": "#414868", + "theme.bar.buttons.workspaces.background": "#272a3d", + "theme.bar.buttons.dashboard.icon": "#e0af68", + "theme.bar.buttons.dashboard.background": "#272a3d", + "theme.osd.label": "#bb9af7", + "theme.osd.icon": "#1a1b26", + "theme.osd.bar_overflow_color": "#f7768e", + "theme.osd.bar_empty_color": "#414868", + "theme.osd.bar_color": "#bb9af7", + "theme.osd.icon_container": "#bb9af7", + "theme.osd.bar_container": "#1a1b26", + "theme.notification.close_button.label": "#1a1b26", + "theme.notification.close_button.background": "#f7768e", + "theme.notification.labelicon": "#bb9af7", + "theme.notification.text": "#c0caf5", + "theme.notification.time": "#9aa5ce", + "theme.notification.border": "#565f89", + "theme.notification.label": "#bb9af7", + "theme.notification.actions.text": "#24283b", + "theme.notification.actions.background": "#bb9af7", + "theme.notification.background": "#1a1b26", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#24283b", + "theme.bar.menus.check_radio_button.background": "#3b4261", + "theme.bar.menus.check_radio_button.active": "#bb9af7", + "theme.bar.buttons.style": "default", + "theme.bar.menus.menu.notifications.pager.button": "#bb9af7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#bb9af7", + "theme.bar.menus.menu.notifications.pager.label": "#565f89", + "theme.bar.menus.menu.notifications.pager.background": "#1a1b26", + "theme.bar.buttons.clock.icon_background": "#f7768e", + "theme.bar.buttons.modules.ram.icon": "#e0af68", + "theme.bar.buttons.modules.storage.icon_background": "#f7768e", + "theme.bar.menus.popover.border": "#1a1b26", + "theme.bar.buttons.volume.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#7dcfff", + "theme.bar.menus.menu.power.buttons.restart.text": "#e0af68", + "theme.bar.buttons.modules.updates.background": "#272a3d", + "theme.bar.buttons.modules.storage.icon": "#f7768e", + "theme.bar.buttons.modules.netstat.background": "#272a3d", + "theme.bar.buttons.modules.weather.icon": "#bb9af7", + "theme.bar.buttons.modules.netstat.text": "#9ece6a", + "theme.bar.buttons.modules.storage.background": "#272a3d", + "theme.bar.buttons.modules.power.icon": "#f7768e", + "theme.bar.buttons.modules.storage.text": "#f7768e", + "theme.bar.buttons.modules.cpu.background": "#272a3d", + "theme.bar.menus.menu.power.border.color": "#414868", + "theme.bar.buttons.network.icon_background": "#caa6f7", + "theme.bar.buttons.modules.power.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.logout.icon": "#1a1b26", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#e0af68", + "theme.bar.menus.menu.power.buttons.restart.icon": "#1a1b26", + "theme.bar.buttons.modules.cpu.icon": "#f7768e", + "theme.bar.buttons.battery.icon_background": "#e0af68", + "theme.bar.buttons.modules.kbLayout.icon_background": "#7dcfff", + "theme.bar.buttons.modules.weather.text": "#bb9af7", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#1a1b26", + "theme.bar.menus.menu.power.buttons.sleep.text": "#7dcfff", + "theme.bar.buttons.modules.weather.icon_background": "#bb9af7", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#24283b", + "theme.bar.buttons.media.icon_background": "#bb9af7", + "theme.bar.menus.menu.power.buttons.logout.background": "#24283b", + "theme.bar.buttons.modules.kbLayout.icon": "#7dcfff", + "theme.bar.buttons.modules.ram.icon_background": "#e0af68", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#f7768e", + "theme.bar.menus.menu.power.buttons.sleep.background": "#24283b", + "theme.bar.buttons.modules.ram.text": "#e0af68", + "theme.bar.menus.menu.power.buttons.logout.text": "#9ece6a", + "theme.bar.buttons.modules.updates.icon_background": "#bb9af7", + "theme.bar.buttons.modules.kbLayout.background": "#272a3d", + "theme.bar.buttons.modules.power.background": "#272a3d", + "theme.bar.buttons.modules.weather.background": "#272a3d", + "theme.bar.buttons.icon_background": "#272a3d", + "theme.bar.menus.menu.power.background.color": "#1a1b26", + "theme.bar.buttons.modules.ram.background": "#272a3d", + "theme.bar.buttons.modules.netstat.icon": "#9ece6a", + "theme.bar.buttons.windowtitle.icon_background": "#f7768e", + "theme.bar.buttons.modules.cpu.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#9ece6a", + "theme.bar.buttons.modules.updates.text": "#bb9af7", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#1a1b26", + "theme.bar.buttons.bluetooth.icon_background": "#89dbeb", + "theme.bar.menus.menu.power.buttons.restart.background": "#24283b", + "theme.bar.buttons.modules.updates.icon": "#bb9af7", + "theme.bar.buttons.modules.cpu.text": "#f7768e", + "theme.bar.buttons.modules.netstat.icon_background": "#9ece6a", + "theme.bar.buttons.modules.kbLayout.text": "#7dcfff", + "theme.bar.buttons.notifications.icon_background": "#bb9af7", + "theme.bar.buttons.modules.power.border": "#f7768e", + "theme.bar.buttons.modules.weather.border": "#bb9af7", + "theme.bar.buttons.modules.updates.border": "#bb9af7", + "theme.bar.buttons.modules.kbLayout.border": "#7dcfff", + "theme.bar.buttons.modules.netstat.border": "#9ece6a", + "theme.bar.buttons.modules.storage.border": "#f7768e", + "theme.bar.buttons.modules.cpu.border": "#f7768e", + "theme.bar.buttons.modules.ram.border": "#e0af68", + "theme.bar.buttons.notifications.border": "#bb9af7", + "theme.bar.buttons.clock.border": "#f7768e", + "theme.bar.buttons.battery.border": "#e0af68", + "theme.bar.buttons.systray.border": "#414868", + "theme.bar.buttons.bluetooth.border": "#7dcfff", + "theme.bar.buttons.network.border": "#bb9af7", + "theme.bar.buttons.volume.border": "#f7768e", + "theme.bar.buttons.media.border": "#bb9af7", + "theme.bar.buttons.windowtitle.border": "#f7768e", + "theme.bar.buttons.workspaces.border": "#f7768e", + "theme.bar.buttons.dashboard.border": "#e0af68", + "theme.bar.buttons.modules.submap.background": "#272a3d", + "theme.bar.buttons.modules.submap.text": "#73daca", + "theme.bar.buttons.modules.submap.border": "#73daca", + "theme.bar.buttons.modules.submap.icon": "#73daca", + "theme.bar.buttons.modules.submap.icon_background": "#272a3d" +} \ No newline at end of file diff --git a/ags/HyprPanel/themes/tokyo_night_split.json b/ags/HyprPanel/themes/tokyo_night_split.json new file mode 100644 index 0000000..c4c51ca --- /dev/null +++ b/ags/HyprPanel/themes/tokyo_night_split.json @@ -0,0 +1,341 @@ +{ + "theme.bar.menus.background": "#1a1b26", + "theme.bar.background": "#1a1b26", + "theme.bar.buttons.media.icon": "#272a3d", + "theme.bar.buttons.media.text": "#bb9af7", + "theme.bar.buttons.icon": "#bb9af7", + "theme.bar.buttons.text": "#bb9af7", + "theme.bar.buttons.hover": "#414868", + "theme.bar.buttons.background": "#272a3d", + "theme.bar.menus.text": "#c0caf5", + "theme.bar.menus.border.color": "#414868", + "theme.bar.buttons.media.background": "#272a3d", + "theme.bar.menus.menu.volume.text": "#c0caf5", + "theme.bar.menus.menu.volume.card.color": "#24283b", + "theme.bar.menus.menu.volume.label.color": "#f7768e", + "theme.bar.menus.popover.text": "#bb9af7", + "theme.bar.menus.popover.background": "#1a1b26", + "theme.bar.menus.menu.dashboard.powermenu.shutdown": "#f7768e", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.deny": "#f7768e", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm": "#9ece6a", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text": "#1a1b26", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.body": "#c0caf5", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.label": "#bb9af7", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.border": "#414868", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.background": "#1a1b26", + "theme.bar.menus.menu.dashboard.powermenu.confirmation.card": "#24283b", + "theme.bar.menus.menu.notifications.switch.puck": "#565f89", + "theme.bar.menus.menu.notifications.switch.disabled": "#565f89", + "theme.bar.menus.menu.notifications.switch.enabled": "#bb9af7", + "theme.bar.menus.menu.notifications.clear": "#f7768e", + "theme.bar.menus.menu.notifications.switch_divider": "#414868", + "theme.bar.menus.menu.notifications.border": "#414868", + "theme.bar.menus.menu.notifications.card": "#24283b", + "theme.bar.menus.menu.notifications.background": "#1a1b26", + "theme.bar.menus.menu.notifications.no_notifications_label": "#414868", + "theme.bar.menus.menu.notifications.label": "#bb9af7", + "theme.bar.menus.menu.dashboard.monitors.disk.label": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.disk.bar": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.disk.icon": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.gpu.label": "#9ece6a", + "theme.bar.menus.menu.dashboard.monitors.gpu.bar": "#9ece6a", + "theme.bar.menus.menu.dashboard.monitors.gpu.icon": "#9ece6a", + "theme.bar.menus.menu.dashboard.monitors.ram.label": "#e0af68", + "theme.bar.menus.menu.dashboard.monitors.ram.bar": "#e0af68", + "theme.bar.menus.menu.dashboard.monitors.ram.icon": "#e0af68", + "theme.bar.menus.menu.dashboard.monitors.cpu.label": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.cpu.bar": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.cpu.icon": "#f7768e", + "theme.bar.menus.menu.dashboard.monitors.bar_background": "#414868", + "theme.bar.menus.menu.dashboard.directories.right.bottom.color": "#bb9af7", + "theme.bar.menus.menu.dashboard.directories.right.middle.color": "#bb9af7", + "theme.bar.menus.menu.dashboard.directories.right.top.color": "#73daca", + "theme.bar.menus.menu.dashboard.directories.left.bottom.color": "#f7768e", + "theme.bar.menus.menu.dashboard.directories.left.middle.color": "#e0af68", + "theme.bar.menus.menu.dashboard.directories.left.top.color": "#f7768e", + "theme.bar.menus.menu.dashboard.controls.input.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.input.background": "#f7768e", + "theme.bar.menus.menu.dashboard.controls.volume.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.volume.background": "#f7768e", + "theme.bar.menus.menu.dashboard.controls.notifications.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.notifications.background": "#e0af68", + "theme.bar.menus.menu.dashboard.controls.bluetooth.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.bluetooth.background": "#7dcfff", + "theme.bar.menus.menu.dashboard.controls.wifi.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.controls.wifi.background": "#bb9af7", + "theme.bar.menus.menu.dashboard.controls.disabled": "#414868", + "theme.bar.menus.menu.dashboard.shortcuts.recording": "#9ece6a", + "theme.bar.menus.menu.dashboard.shortcuts.text": "#1a1b26", + "theme.bar.menus.menu.dashboard.shortcuts.background": "#bb9af7", + "theme.bar.menus.menu.dashboard.powermenu.sleep": "#7dcfff", + "theme.bar.menus.menu.dashboard.powermenu.logout": "#9ece6a", + "theme.bar.menus.menu.dashboard.powermenu.restart": "#e0af68", + "theme.bar.menus.menu.dashboard.profile.name": "#f7768e", + "theme.bar.menus.menu.dashboard.border.color": "#414868", + "theme.bar.menus.menu.dashboard.background.color": "#1a1b26", + "theme.bar.menus.menu.dashboard.card.color": "#24283b", + "theme.bar.menus.menu.clock.weather.hourly.temperature": "#f7768e", + "theme.bar.menus.menu.clock.weather.hourly.icon": "#f7768e", + "theme.bar.menus.menu.clock.weather.hourly.time": "#f7768e", + "theme.bar.menus.menu.clock.weather.thermometer.extremelycold": "#7dcfff", + "theme.bar.menus.menu.clock.weather.thermometer.cold": "#7aa2f7", + "theme.bar.menus.menu.clock.weather.thermometer.moderate": "#bb9af7", + "theme.bar.menus.menu.clock.weather.thermometer.hot": "#e0af68", + "theme.bar.menus.menu.clock.weather.thermometer.extremelyhot": "#f7768e", + "theme.bar.menus.menu.clock.weather.stats": "#f7768e", + "theme.bar.menus.menu.clock.weather.status": "#73daca", + "theme.bar.menus.menu.clock.weather.temperature": "#c0caf5", + "theme.bar.menus.menu.clock.weather.icon": "#f7768e", + "theme.bar.menus.menu.clock.calendar.contextdays": "#414868", + "theme.bar.menus.menu.clock.calendar.days": "#c0caf5", + "theme.bar.menus.menu.clock.calendar.currentday": "#f7768e", + "theme.bar.menus.menu.clock.calendar.paginator": "#f7768e", + "theme.bar.menus.menu.clock.calendar.weekdays": "#f7768e", + "theme.bar.menus.menu.clock.calendar.yearmonth": "#73daca", + "theme.bar.menus.menu.clock.time.timeperiod": "#73daca", + "theme.bar.menus.menu.clock.time.time": "#f7768e", + "theme.bar.menus.menu.clock.text": "#c0caf5", + "theme.bar.menus.menu.clock.border.color": "#414868", + "theme.bar.menus.menu.clock.background.color": "#1a1b26", + "theme.bar.menus.menu.clock.card.color": "#24283b", + "theme.bar.menus.menu.battery.slider.puck": "#565f89", + "theme.bar.menus.menu.battery.slider.backgroundhover": "#414868", + "theme.bar.menus.menu.battery.slider.background": "#565f89", + "theme.bar.menus.menu.battery.slider.primary": "#e0af68", + "theme.bar.menus.menu.battery.icons.active": "#e0af68", + "theme.bar.menus.menu.battery.icons.passive": "#565f89", + "theme.bar.menus.menu.battery.listitems.active": "#e0af68", + "theme.bar.menus.menu.battery.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.battery.text": "#c0caf5", + "theme.bar.menus.menu.battery.label.color": "#e0af68", + "theme.bar.menus.menu.battery.border.color": "#414868", + "theme.bar.menus.menu.battery.background.color": "#1a1b26", + "theme.bar.menus.menu.battery.card.color": "#24283b", + "theme.bar.menus.menu.systray.dropdownmenu.divider": "#24283b", + "theme.bar.menus.menu.systray.dropdownmenu.text": "#c0caf5", + "theme.bar.menus.menu.systray.dropdownmenu.background": "#1a1b26", + "theme.bar.menus.menu.bluetooth.iconbutton.active": "#7dcfff", + "theme.bar.menus.menu.bluetooth.iconbutton.passive": "#c0caf5", + "theme.bar.menus.menu.bluetooth.icons.active": "#7dcfff", + "theme.bar.menus.menu.bluetooth.icons.passive": "#565f89", + "theme.bar.menus.menu.bluetooth.listitems.active": "#7dcfff", + "theme.bar.menus.menu.bluetooth.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.bluetooth.switch.puck": "#565f89", + "theme.bar.menus.menu.bluetooth.switch.disabled": "#565f89", + "theme.bar.menus.menu.bluetooth.switch.enabled": "#7dcfff", + "theme.bar.menus.menu.bluetooth.switch_divider": "#414868", + "theme.bar.menus.menu.bluetooth.status": "#565f89", + "theme.bar.menus.menu.bluetooth.text": "#c0caf5", + "theme.bar.menus.menu.bluetooth.label.color": "#7dcfff", + "theme.bar.menus.menu.bluetooth.border.color": "#414868", + "theme.bar.menus.menu.bluetooth.background.color": "#1a1b26", + "theme.bar.menus.menu.bluetooth.card.color": "#24283b", + "theme.bar.menus.menu.network.iconbuttons.active": "#bb9af7", + "theme.bar.menus.menu.network.iconbuttons.passive": "#c0caf5", + "theme.bar.menus.menu.network.icons.active": "#bb9af7", + "theme.bar.menus.menu.network.icons.passive": "#565f89", + "theme.bar.menus.menu.network.listitems.active": "#bb9af7", + "theme.bar.menus.menu.network.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.network.status.color": "#565f89", + "theme.bar.menus.menu.network.text": "#c0caf5", + "theme.bar.menus.menu.network.label.color": "#bb9af7", + "theme.bar.menus.menu.network.border.color": "#414868", + "theme.bar.menus.menu.network.background.color": "#1a1b26", + "theme.bar.menus.menu.network.card.color": "#24283b", + "theme.bar.menus.menu.volume.input_slider.puck": "#414868", + "theme.bar.menus.menu.volume.input_slider.backgroundhover": "#414868", + "theme.bar.menus.menu.volume.input_slider.background": "#565f89", + "theme.bar.menus.menu.volume.input_slider.primary": "#f7768e", + "theme.bar.menus.menu.volume.audio_slider.puck": "#414868", + "theme.bar.menus.menu.volume.audio_slider.backgroundhover": "#414868", + "theme.bar.menus.menu.volume.audio_slider.background": "#565f89", + "theme.bar.menus.menu.volume.audio_slider.primary": "#f7768e", + "theme.bar.menus.menu.volume.icons.active": "#f7768e", + "theme.bar.menus.menu.volume.icons.passive": "#565f89", + "theme.bar.menus.menu.volume.iconbutton.active": "#f7768e", + "theme.bar.menus.menu.volume.iconbutton.passive": "#c0caf5", + "theme.bar.menus.menu.volume.listitems.active": "#f7768e", + "theme.bar.menus.menu.volume.listitems.passive": "#c0caf5", + "theme.bar.menus.menu.volume.border.color": "#414868", + "theme.bar.menus.menu.volume.background.color": "#1a1b26", + "theme.bar.menus.menu.media.slider.puck": "#565f89", + "theme.bar.menus.menu.media.slider.backgroundhover": "#414868", + "theme.bar.menus.menu.media.slider.background": "#565f89", + "theme.bar.menus.menu.media.slider.primary": "#f7768e", + "theme.bar.menus.menu.media.buttons.text": "#1a1b26", + "theme.bar.menus.menu.media.buttons.background": "#bb9af7", + "theme.bar.menus.menu.media.buttons.enabled": "#73daca", + "theme.bar.menus.menu.media.buttons.inactive": "#414868", + "theme.bar.menus.menu.media.border.color": "#414868", + "theme.bar.menus.menu.media.background.color": "#1a1b26", + "theme.bar.menus.menu.media.album": "#f7768e", + "theme.bar.menus.menu.media.artist": "#73daca", + "theme.bar.menus.menu.media.song": "#bb9af7", + "theme.bar.menus.tooltip.text": "#c0caf5", + "theme.bar.menus.tooltip.background": "#1a1b26", + "theme.bar.menus.dropdownmenu.divider": "#24283b", + "theme.bar.menus.dropdownmenu.text": "#c0caf5", + "theme.bar.menus.dropdownmenu.background": "#1a1b26", + "theme.bar.menus.slider.puck": "#565f89", + "theme.bar.menus.slider.backgroundhover": "#414868", + "theme.bar.menus.slider.background": "#565f89", + "theme.bar.menus.slider.primary": "#bb9af7", + "theme.bar.menus.progressbar.background": "#414868", + "theme.bar.menus.progressbar.foreground": "#bb9af7", + "theme.bar.menus.iconbuttons.active": "#bb9af7", + "theme.bar.menus.iconbuttons.passive": "#c0caf5", + "theme.bar.menus.buttons.text": "#1a1b26", + "theme.bar.menus.buttons.disabled": "#565f89", + "theme.bar.menus.buttons.active": "#f7768e", + "theme.bar.menus.buttons.default": "#bb9af7", + "theme.bar.menus.switch.puck": "#565f89", + "theme.bar.menus.switch.disabled": "#565f89", + "theme.bar.menus.switch.enabled": "#bb9af7", + "theme.bar.menus.icons.active": "#bb9af7", + "theme.bar.menus.icons.passive": "#414868", + "theme.bar.menus.listitems.active": "#bb9af7", + "theme.bar.menus.listitems.passive": "#c0caf5", + "theme.bar.menus.label": "#bb9af7", + "theme.bar.menus.feinttext": "#414868", + "theme.bar.menus.dimtext": "#414868", + "theme.bar.menus.cards": "#24283b", + "theme.bar.buttons.notifications.total": "#bb9af7", + "theme.bar.buttons.notifications.icon": "#272a3d", + "theme.bar.buttons.notifications.background": "#272a3d", + "theme.bar.buttons.clock.icon": "#272a3d", + "theme.bar.buttons.clock.text": "#f7768e", + "theme.bar.buttons.clock.background": "#272a3d", + "theme.bar.buttons.battery.icon": "#272a3d", + "theme.bar.buttons.battery.text": "#e0af68", + "theme.bar.buttons.battery.background": "#272a3d", + "theme.bar.buttons.systray.background": "#272a3d", + "theme.bar.buttons.bluetooth.icon": "#272a3d", + "theme.bar.buttons.bluetooth.text": "#7dcfff", + "theme.bar.buttons.bluetooth.background": "#272a3d", + "theme.bar.buttons.network.icon": "#272a3d", + "theme.bar.buttons.network.text": "#bb9af7", + "theme.bar.buttons.network.background": "#272a3d", + "theme.bar.buttons.volume.icon": "#272a3d", + "theme.bar.buttons.volume.text": "#f7768e", + "theme.bar.buttons.volume.background": "#272a3d", + "theme.bar.buttons.windowtitle.icon": "#272a3d", + "theme.bar.buttons.windowtitle.text": "#f7768e", + "theme.bar.buttons.windowtitle.background": "#272a3d", + "theme.bar.buttons.workspaces.active": "#f7768e", + "theme.bar.buttons.workspaces.occupied": "#f7768e", + "theme.bar.buttons.workspaces.available": "#7dcfff", + "theme.bar.buttons.workspaces.hover": "#f7768e", + "theme.bar.buttons.workspaces.background": "#272a3d", + "theme.bar.buttons.dashboard.icon": "#272a3d", + "theme.bar.buttons.dashboard.background": "#e0af68", + "theme.osd.label": "#bb9af7", + "theme.osd.icon": "#1a1b26", + "theme.osd.bar_overflow_color": "#f7768e", + "theme.osd.bar_empty_color": "#414868", + "theme.osd.bar_color": "#bb9af7", + "theme.osd.icon_container": "#bb9af7", + "theme.osd.bar_container": "#1a1b26", + "theme.notification.close_button.label": "#1a1b26", + "theme.notification.close_button.background": "#f7768e", + "theme.notification.labelicon": "#bb9af7", + "theme.notification.text": "#c0caf5", + "theme.notification.time": "#9aa5ce", + "theme.notification.border": "#565f89", + "theme.notification.label": "#bb9af7", + "theme.notification.actions.text": "#24283b", + "theme.notification.actions.background": "#bb9af7", + "theme.notification.background": "#1a1b26", + "theme.bar.buttons.workspaces.numbered_active_highlighted_text_color": "#181825", + "theme.bar.buttons.workspaces.numbered_active_underline_color": "#c678dd", + "theme.bar.menus.menu.media.card.color": "#24283b", + "theme.bar.menus.check_radio_button.background": "#3b4261", + "theme.bar.menus.check_radio_button.active": "#bb9af7", + "theme.bar.buttons.style": "split", + "theme.bar.buttons.icon_background": "#242438", + "theme.bar.buttons.volume.icon_background": "#f7768e", + "theme.bar.buttons.network.icon_background": "#bb9af7", + "theme.bar.buttons.bluetooth.icon_background": "#7dcfff", + "theme.bar.buttons.windowtitle.icon_background": "#f7768e", + "theme.bar.buttons.media.icon_background": "#bb9af7", + "theme.bar.buttons.notifications.icon_background": "#bb9af7", + "theme.bar.buttons.battery.icon_background": "#e0af68", + "theme.bar.buttons.clock.icon_background": "#f7768e", + "theme.bar.menus.menu.notifications.pager.button": "#bb9af7", + "theme.bar.menus.menu.notifications.scrollbar.color": "#bb9af7", + "theme.bar.menus.menu.notifications.pager.label": "#565f89", + "theme.bar.menus.menu.notifications.pager.background": "#1a1b26", + "theme.bar.buttons.modules.ram.icon": "#181825", + "theme.bar.buttons.modules.storage.icon_background": "#f7768e", + "theme.bar.menus.popover.border": "#1a1b26", + "theme.bar.menus.menu.power.buttons.sleep.icon_background": "#7dcfff", + "theme.bar.menus.menu.power.buttons.restart.text": "#e0af68", + "theme.bar.buttons.modules.updates.background": "#272a3d", + "theme.bar.buttons.modules.storage.icon": "#181825", + "theme.bar.buttons.modules.netstat.background": "#272a3d", + "theme.bar.buttons.modules.weather.icon": "#272a3d", + "theme.bar.buttons.modules.netstat.text": "#9ece6a", + "theme.bar.buttons.modules.storage.background": "#272a3d", + "theme.bar.buttons.modules.power.icon": "#181825", + "theme.bar.buttons.modules.storage.text": "#f7768e", + "theme.bar.buttons.modules.cpu.background": "#272a3d", + "theme.bar.menus.menu.power.border.color": "#414868", + "theme.bar.buttons.modules.power.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.logout.icon": "#1a1b26", + "theme.bar.menus.menu.power.buttons.restart.icon_background": "#e0af68", + "theme.bar.menus.menu.power.buttons.restart.icon": "#1a1b26", + "theme.bar.buttons.modules.cpu.icon": "#181825", + "theme.bar.buttons.modules.kbLayout.icon_background": "#7dcfff", + "theme.bar.buttons.modules.weather.text": "#bb9af7", + "theme.bar.menus.menu.power.buttons.shutdown.icon": "#1a1b26", + "theme.bar.menus.menu.power.buttons.sleep.text": "#7dcfff", + "theme.bar.buttons.modules.weather.icon_background": "#bb9af7", + "theme.bar.menus.menu.power.buttons.shutdown.background": "#24283b", + "theme.bar.menus.menu.power.buttons.logout.background": "#24283b", + "theme.bar.buttons.modules.kbLayout.icon": "#181825", + "theme.bar.buttons.modules.ram.icon_background": "#e0af68", + "theme.bar.menus.menu.power.buttons.shutdown.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.shutdown.text": "#f7768e", + "theme.bar.menus.menu.power.buttons.sleep.background": "#24283b", + "theme.bar.buttons.modules.ram.text": "#e0af68", + "theme.bar.menus.menu.power.buttons.logout.text": "#9ece6a", + "theme.bar.buttons.modules.updates.icon_background": "#bb9af7", + "theme.bar.buttons.modules.kbLayout.background": "#272a3d", + "theme.bar.buttons.modules.power.background": "#272a3d", + "theme.bar.buttons.modules.weather.background": "#272a3d", + "theme.bar.menus.menu.power.background.color": "#1a1b26", + "theme.bar.buttons.modules.ram.background": "#272a3d", + "theme.bar.buttons.modules.netstat.icon": "#181825", + "theme.bar.buttons.modules.cpu.icon_background": "#f7768e", + "theme.bar.menus.menu.power.buttons.logout.icon_background": "#9ece6a", + "theme.bar.buttons.modules.updates.text": "#bb9af7", + "theme.bar.menus.menu.power.buttons.sleep.icon": "#1a1b26", + "theme.bar.menus.menu.power.buttons.restart.background": "#24283b", + "theme.bar.buttons.modules.updates.icon": "#181825", + "theme.bar.buttons.modules.cpu.text": "#f7768e", + "theme.bar.buttons.modules.netstat.icon_background": "#9ece6a", + "theme.bar.buttons.modules.kbLayout.text": "#7dcfff", + "theme.bar.buttons.modules.power.border": "#f7768e", + "theme.bar.buttons.modules.weather.border": "#bb9af7", + "theme.bar.buttons.modules.updates.border": "#bb9af7", + "theme.bar.buttons.modules.kbLayout.border": "#7dcfff", + "theme.bar.buttons.modules.netstat.border": "#9ece6a", + "theme.bar.buttons.modules.storage.border": "#f7768e", + "theme.bar.buttons.modules.cpu.border": "#f7768e", + "theme.bar.buttons.modules.ram.border": "#e0af68", + "theme.bar.buttons.notifications.border": "#bb9af7", + "theme.bar.buttons.clock.border": "#f7768e", + "theme.bar.buttons.battery.border": "#e0af68", + "theme.bar.buttons.systray.border": "#414868", + "theme.bar.buttons.bluetooth.border": "#7dcfff", + "theme.bar.buttons.network.border": "#bb9af7", + "theme.bar.buttons.volume.border": "#f7768e", + "theme.bar.buttons.media.border": "#bb9af7", + "theme.bar.buttons.windowtitle.border": "#f7768e", + "theme.bar.buttons.workspaces.border": "#f7768e", + "theme.bar.buttons.dashboard.border": "#e0af68", + "theme.bar.buttons.modules.submap.background": "#272a3d", + "theme.bar.buttons.modules.submap.text": "#73daca", + "theme.bar.buttons.modules.submap.border": "#73daca", + "theme.bar.buttons.modules.submap.icon": "#181825", + "theme.bar.buttons.modules.submap.icon_background": "#73daca" +} \ No newline at end of file diff --git a/ags/HyprPanel/tsconfig.json b/ags/HyprPanel/tsconfig.json new file mode 100644 index 0000000..f2567fd --- /dev/null +++ b/ags/HyprPanel/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "noEmit": true, + "allowImportingTsExtensions": true, + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022"], + "allowJs": true, + "checkJs": false, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "alwaysStrict": true, + "noImplicitThis": true, + "baseUrl": ".", + "typeRoots": ["types", "lib/types/globals"], + "skipLibCheck": true, + "types": [] + }, + "exclude": ["types/@girs/**/*.js"] +} diff --git a/ags/HyprPanel/types b/ags/HyprPanel/types new file mode 120000 index 0000000..a8e3f04 --- /dev/null +++ b/ags/HyprPanel/types @@ -0,0 +1 @@ +/usr/share/com.github.Aylur.ags/types \ No newline at end of file diff --git a/ags/HyprPanel/widget/RegularWindow.ts b/ags/HyprPanel/widget/RegularWindow.ts new file mode 100644 index 0000000..5c85baa --- /dev/null +++ b/ags/HyprPanel/widget/RegularWindow.ts @@ -0,0 +1,3 @@ +import Gtk from 'gi://Gtk?version=3.0'; + +export default Widget.subclass(Gtk.Window); diff --git a/ags/HyprPanel/widget/settings/SettingsDialog.ts b/ags/HyprPanel/widget/settings/SettingsDialog.ts new file mode 100644 index 0000000..8d8cc23 --- /dev/null +++ b/ags/HyprPanel/widget/settings/SettingsDialog.ts @@ -0,0 +1,89 @@ +import RegularWindow from 'widget/RegularWindow'; +import icons from 'lib/icons'; +import options from 'options'; +import { ThemesMenu } from './pages/theme/index'; +import { SettingsMenu } from './pages/config/index'; +import './side_effects'; +import { GBox, GCenterBox } from 'lib/types/widget'; +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0'; + +type Page = 'Configuration' | 'Theming'; + +const CurrentPage = Variable('Configuration'); + +const pagerMap: Page[] = ['Configuration', 'Theming']; + +const Header = (): GCenterBox => + Widget.CenterBox({ + class_name: 'header', + start_widget: Widget.Button({ + class_name: 'reset', + on_clicked: options.reset, + hpack: 'start', + vpack: 'start', + child: Widget.Icon(icons.ui.refresh), + tooltip_text: 'Reset', + }), + center_widget: Widget.Box({}), + end_widget: Widget.Button({ + class_name: 'close', + hpack: 'end', + vpack: 'start', + child: Widget.Icon(icons.ui.close), + on_clicked: () => App.closeWindow('settings-dialog'), + }), + }); + +const PageContainer = (): GBox => { + return Widget.Box({ + hpack: 'fill', + hexpand: true, + vertical: true, + children: CurrentPage.bind('value').as((v) => { + return [ + Widget.Box({ + class_name: 'option-pages-container', + hpack: 'center', + hexpand: true, + children: pagerMap.map((page) => { + return Widget.Button({ + xalign: 0, + hpack: 'center', + class_name: `pager-button ${v === page ? 'active' : ''} category`, + label: page, + on_primary_click: () => (CurrentPage.value = page), + }); + }), + }), + Widget.Stack({ + vexpand: false, + class_name: 'themes-menu-stack', + children: { + Configuration: SettingsMenu(), + Theming: ThemesMenu(), + }, + shown: CurrentPage.bind('value'), + }), + ]; + }), + }); +}; + +export default (): Gtk.Window => + RegularWindow({ + name: 'settings-dialog', + class_name: 'settings-dialog', + title: 'Settings', + setup(win) { + win.on('delete-event', () => { + win.hide(); + return true; + }); + win.set_default_size(200, 300); + }, + child: Widget.Box({ + class_name: 'settings-dialog-box', + vertical: true, + children: [Header(), PageContainer()], + }), + }); diff --git a/ags/HyprPanel/widget/settings/pages/config/bar/index.ts b/ags/HyprPanel/widget/settings/pages/config/bar/index.ts new file mode 100644 index 0000000..f713739 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/bar/index.ts @@ -0,0 +1,781 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import Gtk from 'types/@girs/gtk-3.0/gtk-3.0'; + +export const BarSettings = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'always', + hscroll: 'automatic', + class_name: 'menu-theme-page paged-container', + child: Widget.Box({ + vertical: true, + children: [ + /* + ****************************** + * LAYOUTS * + ****************************** + */ + Header('Layouts'), + Option( + { + opt: options.bar.layouts, + title: 'Bar Layouts for Monitors', + subtitle: 'Wiki Link: https://hyprpanel.com/configuration/panel.html#layouts', + type: 'object', + subtitleLink: 'https://hyprpanel.com/configuration/panel.html#layouts', + }, + 'bar-layout-input', + ), + Option({ + opt: options.theme.bar.floating, + title: 'Floating Bar', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.location, + title: 'Location', + type: 'enum', + enums: ['top', 'bottom'], + }), + Option({ + opt: options.theme.bar.buttons.enableBorders, + title: 'Enable Button Borders', + subtitle: 'Enables button borders for all buttons in the bar.', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.borderSize, + title: 'Button Border Size', + subtitle: 'Button border for the individual modules must be enabled first', + type: 'string', + }), + /* + ****************************** + * SPACING * + ****************************** + */ + Header('Spacing'), + Option({ + opt: options.theme.bar.outer_spacing, + title: 'Outer Spacing', + subtitle: 'Spacing on the outer left and right edges of the bar.', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.y_margins, + title: 'Vertical Margins', + subtitle: 'Spacing above/below the buttons in the bar.', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.spacing, + title: 'Button Spacing', + subtitle: 'Spacing between the buttons in the bar.', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.padding_x, + title: 'Button Horizontal Padding', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.padding_y, + title: 'Button Vertical Padding', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.radius, + title: 'Button Radius', + type: 'string', + }), + Option({ + opt: options.theme.bar.layer, + title: 'Layer', + type: 'enum', + subtitle: 'Layer determines the Z index of your bar.', + enums: ['top', 'bottom', 'overlay', 'background'], + }), + Option({ + opt: options.theme.bar.dropdownGap, + title: 'Dropdown Gap', + subtitle: 'The gap between the dropdown and the bar', + type: 'string', + }), + Option({ + opt: options.theme.bar.margin_top, + title: 'Margin Top', + subtitle: 'Only applies if floating is enabled', + type: 'string', + }), + Option({ + opt: options.theme.bar.margin_bottom, + title: 'Margin Bottom', + subtitle: 'Only applies if floating is enabled', + type: 'string', + }), + Option({ + opt: options.theme.bar.margin_sides, + title: 'Margin Sides', + subtitle: 'Only applies if floating is enabled', + type: 'string', + }), + Option({ + opt: options.theme.bar.border_radius, + title: 'Border Radius', + subtitle: 'Only applies if floating is enabled', + type: 'string', + }), + + /* + ****************************** + * Actions * + ****************************** + */ + + Header('Actions'), + Option({ + opt: options.bar.scrollSpeed, + title: 'Scrolling Speed', + subtitle: 'The speed at which the commands assigned to the scroll event will trigger', + type: 'number', + }), + /* + ****************************** + * DASHBOARD * + ****************************** + */ + Header('Dashboard'), + Option({ + opt: options.bar.launcher.icon, + title: 'Dashboard Menu Icon', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.dashboard.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.launcher.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.launcher.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.launcher.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.launcher.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * WORKSPACES * + ****************************** + */ + Header('Workspaces'), + Option({ + opt: options.theme.bar.buttons.workspaces.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.showAllActive, + title: 'Mark Active Workspace On All Monitors', + subtitle: 'Marks the currently active workspace on each monitor.', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.fontSize, + title: 'Indicator Size', + subtitle: + 'Only applicable to numbered workspaces and mapped icons\n' + + 'Adjust with caution as it may cause the bar to expand', + type: 'string', + }), + Option({ + opt: options.bar.workspaces.show_icons, + title: 'Show Workspace Icons', + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.icons.available, + title: 'Workspace Available', + type: 'string', + }), + Option({ + opt: options.bar.workspaces.icons.active, + title: 'Workspace Active', + type: 'string', + }), + Option({ + opt: options.bar.workspaces.icons.occupied, + title: 'Workspace Occupied', + type: 'string', + }), + Option({ + opt: options.bar.workspaces.show_numbered, + title: 'Show Workspace Numbers', + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.numbered_active_indicator, + title: 'Numbered Workspace Identifier', + subtitle: 'Only applicable if Workspace Numbers are enabled', + type: 'enum', + enums: ['underline', 'highlight', 'color'], + }), + Option({ + opt: options.theme.bar.buttons.workspaces.smartHighlight, + title: 'Smart Highlight', + subtitle: + 'Automatically determines the highlight color of the workspace icon.\n' + + 'Only compatible with mapped icons.', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.numbered_active_highlight_border, + title: 'Highlight Radius', + subtitle: 'Only applicable if Workspace Numbers are enabled', + type: 'string', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.numbered_active_highlight_padding, + title: 'Highlight Padding', + subtitle: 'Only applicable if Workspace Numbers are enabled', + type: 'string', + }), + Option({ + opt: options.bar.workspaces.showWsIcons, + title: 'Map Workspaces to Icons', + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.workspaceIconMap, + title: 'Workspace Icon Mappings', + type: 'object', + }), + Option({ + opt: options.bar.workspaces.spacing, + title: 'Spacing', + subtitle: 'Spacing between workspace icons', + type: 'float', + }), + Option({ + opt: options.bar.workspaces.workspaces, + title: 'Total Workspaces', + subtitle: 'The least amount of workspaces to always show.', + type: 'number', + }), + Option({ + opt: options.bar.workspaces.monitorSpecific, + title: 'Monitor Specific', + subtitle: + 'Only workspaces applicable to the monitor will be displayed.\n' + + "Works in conjuction with 'Total Workspaces'.", + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.hideUnoccupied, + title: 'Hide Unoccupied', + subtitle: 'Only show workspaces that are occupied or active', + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.workspaceMask, + title: 'Mask Workspace Numbers On Monitors', + subtitle: + 'Only applicable if Workspace Numbers and Monitor Specific are enabled.\n' + + "Forces each Monitor's Workspace labels to start from 1.", + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.reverse_scroll, + title: 'Invert Scroll', + subtitle: 'Scrolling up will go to the previous workspace rather than the next.', + type: 'boolean', + }), + Option({ + opt: options.bar.workspaces.scroll_speed, + title: 'Scrolling Speed', + type: 'number', + }), + Option({ + opt: options.bar.workspaces.ignored, + title: 'Ignored Workspaces', + subtitle: 'A regex that defines workspaces to ignore', + type: 'string', + }), + + /* + ****************************** + * WINDOW TITLES * + ****************************** + */ + Header('Window Titles'), + Option({ + opt: options.theme.bar.buttons.windowtitle.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.windowtitle.custom_title, + title: 'Use Custom Title', + type: 'boolean', + }), + Option({ + opt: options.bar.windowtitle.title_map, + title: 'Window Title Mappings', + subtitle: + 'Only applicable if Show Custom Title is enabled\nWiki Link: https://hyprpanel.com/configuration/panel.html#window-title-mappings', + type: 'object', + subtitleLink: 'https://hyprpanel.com/configuration/panel.html#window-title-mappings', + }), + Option({ + opt: options.bar.windowtitle.class_name, + title: 'Use Class Name', + subtitle: + "Only applicable if Show Custom Title is disabled\nDisplays the window's class name instead of its title.", + type: 'boolean', + }), + Option({ + opt: options.bar.windowtitle.label, + title: 'Show Window Title Label', + type: 'boolean', + }), + Option({ + opt: options.bar.windowtitle.icon, + title: 'Show Icon', + type: 'boolean', + }), + Option({ + opt: options.bar.windowtitle.truncation, + title: 'Truncate Window Title', + subtitle: 'Will truncate the window title to the specified size below.', + type: 'boolean', + }), + Option({ + opt: options.bar.windowtitle.truncation_size, + title: 'Truncation Size', + type: 'number', + min: 10, + }), + Option({ + opt: options.theme.bar.buttons.windowtitle.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.windowtitle.leftClick, + title: 'Left Click', + type: 'string', + }), + Option({ + opt: options.bar.windowtitle.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.windowtitle.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.windowtitle.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.windowtitle.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * VOLUME * + ****************************** + */ + Header('Volume'), + Option({ + opt: options.theme.bar.buttons.volume.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.volume.label, + title: 'Show Volume Percentage', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.volume.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.volume.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.volume.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.volume.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.volume.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * NETWORK * + ****************************** + */ + Header('Network'), + Option({ + opt: options.theme.bar.buttons.network.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.network.label, + title: 'Show Network Name', + type: 'boolean', + }), + Option({ + opt: options.bar.network.truncation, + title: 'Truncate Network Name', + subtitle: 'Will truncate the network name to the specified size below.', + type: 'boolean', + }), + Option({ + opt: options.bar.network.truncation_size, + title: 'Truncation Size', + type: 'number', + }), + Option({ + opt: options.theme.bar.buttons.network.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.network.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.network.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.network.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.network.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * BLUETOOTH * + ****************************** + */ + Header('Bluetooth'), + Option({ + opt: options.theme.bar.buttons.bluetooth.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.bluetooth.label, + title: 'Show Bluetooth Label', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.bluetooth.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.bluetooth.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.bluetooth.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.bluetooth.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.bluetooth.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * BATTERY * + ****************************** + */ + Header('Battery'), + Option({ + opt: options.theme.bar.buttons.battery.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.battery.label, + title: 'Show Battery Percentage', + type: 'boolean', + }), + Option({ + opt: options.bar.battery.hideLabelWhenFull, + title: 'Hide Battery Percentage When Full', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.battery.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.battery.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.battery.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.battery.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.battery.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * SYSTEM TRAY * + ****************************** + */ + Header('System Tray'), + Option({ + opt: options.theme.bar.buttons.systray.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.systray.ignore, + title: 'Ignore List', + subtitle: + 'An array of applications to prevent from showing in the system tray.\n' + + 'Wiki: https://hyprpanel.com/configuration/panel.html#system-tray', + subtitleLink: 'https://hyprpanel.com/configuration/panel.html#system-tray', + type: 'object', + }), + + /* + ****************************** + * CLOCK * + ****************************** + */ + Header('Clock'), + Option({ + opt: options.theme.bar.buttons.clock.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.clock.format, + title: 'Clock Format', + type: 'string', + }), + Option({ + opt: options.bar.clock.icon, + title: 'Icon', + type: 'string', + }), + Option({ + opt: options.bar.clock.showIcon, + title: 'Show Icon', + type: 'boolean', + }), + Option({ + opt: options.bar.clock.showTime, + title: 'Show Time', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.clock.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.clock.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.clock.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.clock.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.clock.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + + /* + ****************************** + * MEDIA * + ****************************** + */ + Header('Media'), + Option({ + opt: options.theme.bar.buttons.media.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.media.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.media.show_artist, + title: 'Show Track Artist', + type: 'boolean', + }), + Option({ + opt: options.bar.media.show_label, + title: 'Toggle Media Label', + type: 'boolean', + }), + Option({ + opt: options.bar.media.truncation, + title: 'Truncate Media Label', + subtitle: 'Only applicable if Toggle Media Label is enabled', + type: 'boolean', + }), + Option({ + opt: options.bar.media.truncation_size, + title: 'Truncation Size', + subtitle: 'Only applicable if Toggle Media Label is enabled', + type: 'number', + min: 10, + }), + Option({ + opt: options.bar.media.show_active_only, + title: 'Auto Hide', + subtitle: 'Button will automatically hide if no media is detected.', + type: 'boolean', + }), + Option({ + opt: options.bar.media.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.media.middleClick, + title: 'Middle Click', + type: 'string', + }), + + /* + ****************************** + * NOTIFICATIONS * + ****************************** + */ + Header('Notifications'), + Option({ + opt: options.theme.bar.buttons.notifications.enableBorder, + title: 'Button Border', + type: 'boolean', + }), + Option({ + opt: options.bar.notifications.show_total, + title: 'Show Total # of notifications', + type: 'boolean', + }), + Option({ + opt: options.bar.notifications.hideCountWhenZero, + title: 'Auto Hide Label', + subtitle: 'Hide Total # of notifications when zero', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.buttons.notifications.spacing, + title: 'Inner Spacing', + subtitle: 'Spacing between the icon and the label inside the buttons.', + type: 'string', + }), + Option({ + opt: options.bar.notifications.rightClick, + title: 'Right Click', + type: 'string', + }), + Option({ + opt: options.bar.notifications.middleClick, + title: 'Middle Click', + type: 'string', + }), + Option({ + opt: options.bar.notifications.scrollUp, + title: 'Scroll Up', + type: 'string', + }), + Option({ + opt: options.bar.notifications.scrollDown, + title: 'Scroll Down', + type: 'string', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/general/index.ts b/ags/HyprPanel/widget/settings/pages/config/general/index.ts new file mode 100644 index 0000000..86f6748 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/general/index.ts @@ -0,0 +1,180 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const BarGeneral = (): Scrollable => { + return Widget.Scrollable({ + class_name: 'bar-theme-page paged-container', + vscroll: 'automatic', + child: Widget.Box({ + vertical: true, + children: [ + Header('General Settings'), + Option({ opt: options.theme.font.name, title: 'Font', type: 'font' }), + Option({ opt: options.theme.font.size, title: 'Font Size', type: 'string' }), + Option({ + opt: options.theme.font.weight, + title: 'Font Weight', + subtitle: '100, 200, 300, etc.', + type: 'number', + increment: 100, + min: 100, + max: 900, + }), + Option({ + opt: options.dummy, + title: 'Config', + subtitle: 'WARNING: Importing a configuration will replace your current configuration settings.', + type: 'config_import', + exportData: { + filePath: OPTIONS, + themeOnly: false, + }, + }), + Option({ + opt: options.terminal, + title: 'Terminal', + subtitle: "Tools such as 'btop' will open in this terminal", + type: 'string', + }), + Option({ + opt: options.tear, + title: 'Tearing Compatible', + subtitle: + 'Makes HyprPanel compatible with Hyprland tearing.\n' + + "Enabling this will change all overlays (Notifications, OSDs, Bar) to the 'top' layer instead the 'overlay' layer.", + type: 'boolean', + }), + Option({ + opt: options.menus.transition, + title: 'Menu Transition', + type: 'enum', + enums: ['none', 'crossfade'], + }), + Option({ + opt: options.menus.transitionTime, + title: 'Menu Transition Duration', + type: 'number', + min: 100, + max: 10000, + increment: 100, + }), + + Header('Scaling'), + Option({ + opt: options.scalingPriority, + title: 'Scaling Priority', + type: 'enum', + enums: ['both', 'gdk', 'hyprland'], + }), + Option({ + opt: options.theme.bar.scaling, + title: 'Bar', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.notification.scaling, + title: 'Notifications', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.osd.scaling, + title: 'OSD', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.scaling, + title: 'Dashboard Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.confirmation_scaling, + title: 'Confirmation Dialog', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.media.scaling, + title: 'Media Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.volume.scaling, + title: 'Volume Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.network.scaling, + title: 'Network Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.scaling, + title: 'Bluetooth Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.battery.scaling, + title: 'Battery Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.clock.scaling, + title: 'Clock Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.scaling, + title: 'Notifications Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + Option({ + opt: options.theme.bar.menus.menu.power.scaling, + title: 'Power Menu', + type: 'number', + min: 1, + max: 100, + increment: 5, + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/index.ts b/ags/HyprPanel/widget/settings/pages/config/index.ts new file mode 100644 index 0000000..31f4fa3 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/index.ts @@ -0,0 +1,70 @@ +import { BarGeneral } from './general/index'; +import { BarSettings } from './bar/index'; +import { ClockMenuSettings } from './menus/clock'; +import { DashboardMenuSettings } from './menus/dashboard'; +import { NotificationSettings } from './notifications/index'; +import { OSDSettings } from './osd/index'; +import { CustomModuleSettings } from 'customModules/config'; +import { PowerMenuSettings } from './menus/power'; +import { GBox } from 'lib/types/widget'; + +type Page = + | 'General' + | 'Bar' + | 'Clock Menu' + | 'Dashboard Menu' + | 'Power Menu' + | 'Notifications' + | 'OSD' + | 'Custom Modules'; + +const CurrentPage = Variable('General'); + +const pagerMap: Page[] = [ + 'General', + 'Bar', + 'Notifications', + 'OSD', + 'Power Menu', + 'Clock Menu', + 'Dashboard Menu', + 'Custom Modules', +]; + +export const SettingsMenu = (): GBox => { + return Widget.Box({ + vertical: true, + children: CurrentPage.bind('value').as((v) => { + return [ + Widget.Box({ + class_name: 'option-pages-container', + hpack: 'center', + hexpand: true, + children: pagerMap.map((page) => { + return Widget.Button({ + hpack: 'center', + class_name: `pager-button ${v === page ? 'active' : ''}`, + label: page, + on_primary_click: () => (CurrentPage.value = page), + }); + }), + }), + Widget.Stack({ + vexpand: true, + class_name: 'themes-menu-stack', + children: { + General: BarGeneral(), + Bar: BarSettings(), + Notifications: NotificationSettings(), + OSD: OSDSettings(), + 'Clock Menu': ClockMenuSettings(), + 'Dashboard Menu': DashboardMenuSettings(), + 'Custom Modules': CustomModuleSettings(), + 'Power Menu': PowerMenuSettings(), + }, + shown: CurrentPage.bind('value'), + }), + ]; + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/menus/clock.ts b/ags/HyprPanel/widget/settings/pages/config/menus/clock.ts new file mode 100644 index 0000000..71d8e18 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/menus/clock.ts @@ -0,0 +1,48 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const ClockMenuSettings = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + child: Widget.Box({ + class_name: 'bar-theme-page paged-container', + vertical: true, + children: [ + Header('Time'), + Option({ opt: options.menus.clock.time.military, title: 'Use 24hr time', type: 'boolean' }), + Option({ opt: options.menus.clock.time.hideSeconds, title: 'Hide seconds', type: 'boolean' }), + + Header('Weather'), + Option({ opt: options.menus.clock.weather.enabled, title: 'Enabled', type: 'boolean' }), + Option({ + opt: options.menus.clock.weather.location, + title: 'Location', + subtitle: 'Zip Code, Postal Code, City, etc.', + type: 'string', + }), + Option({ + opt: options.menus.clock.weather.key, + title: 'Weather API Key', + subtitle: 'May require AGS restart. https://weatherapi.com/', + type: 'string', + }), + Option({ + opt: options.menus.clock.weather.unit, + title: 'Units', + type: 'enum', + enums: ['imperial', 'metric'], + }), + Option({ + opt: options.menus.clock.weather.interval, + title: 'Weather Fetching Interval (ms)', + subtitle: 'May require AGS restart.', + type: 'number', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/menus/dashboard.ts b/ags/HyprPanel/widget/settings/pages/config/menus/dashboard.ts new file mode 100644 index 0000000..fbb7128 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/menus/dashboard.ts @@ -0,0 +1,214 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const DashboardMenuSettings = (): Scrollable => { + return Widget.Scrollable({ + class_name: 'bar-theme-page paged-container', + vscroll: 'always', + hscroll: 'automatic', + vexpand: true, + overlayScrolling: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Power Menu'), + Option({ opt: options.menus.dashboard.powermenu.avatar.image, title: 'Profile Image', type: 'img' }), + Option({ + opt: options.menus.dashboard.powermenu.avatar.name, + title: 'Profile Name', + subtitle: "Use 'system' to automatically set system name", + type: 'string', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.profile.size, + title: 'Profile Image Size', + type: 'string', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.profile.radius, + title: 'Profile Image Radius', + type: 'string', + }), + + Option({ + opt: options.menus.dashboard.powermenu.confirmation, + title: 'Show Confirmation Dialogue', + type: 'boolean', + }), + Option({ opt: options.menus.dashboard.powermenu.shutdown, title: 'Shutdown Command', type: 'string' }), + Option({ opt: options.menus.dashboard.powermenu.reboot, title: 'Reboot Command', type: 'string' }), + Option({ opt: options.menus.dashboard.powermenu.logout, title: 'Logout Command', type: 'string' }), + Option({ opt: options.menus.dashboard.powermenu.sleep, title: 'Sleep Command', type: 'string' }), + Header('Controls'), + Option({ opt: options.menus.dashboard.controls.enabled, title: 'Enabled', type: 'boolean' }), + Header('Resource Usage Metrics'), + Option({ opt: options.menus.dashboard.stats.enabled, title: 'Enabled', type: 'boolean' }), + Option({ + opt: options.menus.dashboard.stats.enable_gpu, + title: 'Track GPU', + subtitle: "NOTE: This is currently only available for NVidia GPUs and requires 'python-gpustat'.", + type: 'boolean', + }), + Header('Shortcuts'), + Option({ opt: options.menus.dashboard.shortcuts.enabled, title: 'Enabled', type: 'boolean' }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut1.icon, + title: 'Left - Shortcut 1 (Icon)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut1.command, + title: 'Left - Shortcut 1 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut1.tooltip, + title: 'Left - Shortcut 1 (Tooltip)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut2.icon, + title: 'Left - Shortcut 2 (Icon)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut2.command, + title: 'Left - Shortcut 2 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut2.tooltip, + title: 'Left - Shortcut 2 (Tooltip)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut3.icon, + title: 'Left - Shortcut 3 (Icon)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut3.command, + title: 'Left - Shortcut 3 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut3.tooltip, + title: 'Left - Shortcut 3 (Tooltip)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut4.icon, + title: 'Left - Shortcut 4 (Icon)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut4.command, + title: 'Left - Shortcut 4 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.left.shortcut4.tooltip, + title: 'Left - Shortcut 4 (Tooltip)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.right.shortcut1.icon, + title: 'Right - Shortcut 1 (Icon)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.right.shortcut1.command, + title: 'Right - Shortcut 1 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.right.shortcut1.tooltip, + title: 'Right - Shortcut 1 (Tooltip)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.right.shortcut3.icon, + title: 'Right - Shortcut 3 (Icon)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.right.shortcut3.command, + title: 'Right - Shortcut 3 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.shortcuts.right.shortcut3.tooltip, + title: 'Right - Shortcut 3 (Tooltip)', + type: 'string', + }), + + Header('Directories'), + Option({ opt: options.menus.dashboard.directories.enabled, title: 'Enabled', type: 'boolean' }), + Option({ + opt: options.menus.dashboard.directories.left.directory1.label, + title: 'Left - Directory 1 (Label)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.left.directory1.command, + title: 'Left - Directory 1 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.left.directory2.label, + title: 'Left - Directory 2 (Label)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.left.directory2.command, + title: 'Left - Directory 2 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.left.directory3.label, + title: 'Left - Directory 3 (Label)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.left.directory3.command, + title: 'Left - Directory 3 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.right.directory1.label, + title: 'Right - Directory 1 (Label)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.right.directory1.command, + title: 'Right - Directory 1 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.right.directory2.label, + title: 'Right - Directory 2 (Label)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.right.directory2.command, + title: 'Right - Directory 2 (Command)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.right.directory3.label, + title: 'Right - Directory 3 (Label)', + type: 'string', + }), + Option({ + opt: options.menus.dashboard.directories.right.directory3.command, + title: 'Right - Directory 3 (Command)', + type: 'string', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/menus/power.ts b/ags/HyprPanel/widget/settings/pages/config/menus/power.ts new file mode 100644 index 0000000..e1ce949 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/menus/power.ts @@ -0,0 +1,28 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import { Attribute, Child } from 'lib/types/widget'; +import Scrollable from 'types/widgets/scrollable'; + +export const PowerMenuSettings = (): Scrollable => { + return Widget.Scrollable({ + class_name: 'bar-theme-page paged-container', + vscroll: 'always', + hscroll: 'automatic', + vexpand: true, + overlayScrolling: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Power Menu'), + Option({ opt: options.menus.power.showLabel, title: 'Show Label', type: 'boolean' }), + Option({ opt: options.menus.power.confirmation, title: 'Confirmation Dialog', type: 'boolean' }), + Option({ opt: options.menus.power.shutdown, title: 'Shutdown Command', type: 'string' }), + Option({ opt: options.menus.power.reboot, title: 'Reboot Command', type: 'string' }), + Option({ opt: options.menus.power.logout, title: 'Logout Command', type: 'string' }), + Option({ opt: options.menus.power.sleep, title: 'Sleep Command', type: 'string' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/notifications/index.ts b/ags/HyprPanel/widget/settings/pages/config/notifications/index.ts new file mode 100644 index 0000000..4191d4f --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/notifications/index.ts @@ -0,0 +1,104 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const NotificationSettings = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + child: Widget.Box({ + class_name: 'bar-theme-page paged-container', + vertical: true, + children: [ + Header('Notification Settings'), + Option({ + opt: options.notifications.ignore, + title: 'Ignored Applications', + subtitle: + 'Applications to ignore.\n' + + 'Wiki: https://hyprpanel.com/configuration/notifications.html#ignored-applications', + subtitleLink: 'https://hyprpanel.com/configuration/notifications.html#ignored-applications', + type: 'object', + }), + Option({ + opt: options.notifications.position, + title: 'Notification Location', + type: 'enum', + enums: ['top left', 'top', 'top right', 'right', 'bottom right', 'bottom', 'bottom left', 'left'], + }), + Option({ + opt: options.theme.notification.border_radius, + title: 'Border Radius', + type: 'string', + }), + Option({ + opt: options.notifications.monitor, + title: 'Monitor', + subtitle: 'The ID of the monitor on which to display the notification', + type: 'number', + }), + Option({ + opt: options.notifications.active_monitor, + title: 'Follow Cursor', + subtitle: 'The notification will follow the monitor of your cursor', + type: 'boolean', + }), + Option({ + opt: options.notifications.clearDelay, + title: 'Clear Delay', + subtitle: + 'The delay in milliseconds before a notification is cleared' + + '\nWARNING: Setting this value too low may crash AGS depending on your system.', + type: 'number', + increment: 20, + }), + Option({ + opt: options.notifications.timeout, + title: 'Notification Timeout', + subtitle: 'How long notification popups will last (in milliseconds).', + type: 'number', + }), + Option({ + opt: options.notifications.cache_actions, + title: 'Preserve Actions', + subtitle: 'This will persist the action buttons of a notification after rebooting.', + type: 'boolean', + }), + + Header('Notification Menu Settings'), + Option({ + opt: options.theme.bar.menus.menu.notifications.height, + title: 'Notification Menu Height', + type: 'string', + }), + Option({ + opt: options.notifications.displayedTotal, + title: 'Displayed Total', + subtitle: + 'How many notifications to show in the menu at once.\n' + + 'Newer notifications will display towards the top.', + type: 'number', + min: 1, + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.pager.show, + title: 'Show Pager', + subtitle: 'Shows the pagination footer at the bottom of the menu.', + type: 'boolean', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.scrollbar.width, + title: 'Scrollbar Width', + type: 'string', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.scrollbar.radius, + title: 'Scrollbar Radius', + type: 'string', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/config/osd/index.ts b/ags/HyprPanel/widget/settings/pages/config/osd/index.ts new file mode 100644 index 0000000..f9fca0f --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/config/osd/index.ts @@ -0,0 +1,71 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const OSDSettings = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + child: Widget.Box({ + class_name: 'bar-theme-page paged-container', + vertical: true, + children: [ + Header('On Screen Display'), + Option({ opt: options.theme.osd.enable, title: 'Enabled', type: 'boolean' }), + Option({ + opt: options.theme.osd.duration, + title: 'Duration', + type: 'number', + min: 100, + max: 10000, + increment: 500, + }), + Option({ + opt: options.theme.osd.orientation, + title: 'Orientation', + type: 'enum', + enums: ['horizontal', 'vertical'], + }), + Option({ + opt: options.theme.osd.location, + title: 'Position', + subtitle: 'Position of the OSD on the screen', + type: 'enum', + enums: ['top left', 'top', 'top right', 'right', 'bottom right', 'bottom', 'bottom left', 'left'], + }), + Option({ + opt: options.theme.osd.monitor, + title: 'Monitor', + subtitle: 'The ID of the monitor on which to display the OSD', + type: 'number', + }), + Option({ + opt: options.theme.osd.active_monitor, + title: 'Follow Cursor', + subtitle: 'The OSD will follow the monitor of your cursor', + type: 'boolean', + }), + Option({ + opt: options.theme.osd.radius, + title: 'Radius', + subtitle: 'Radius of the on-screen-display that indicates volume/brightness change', + type: 'string', + }), + Option({ + opt: options.theme.osd.margins, + title: 'Margins', + subtitle: 'Margins in the following format: top right bottom left', + type: 'string', + }), + Option({ + opt: options.theme.osd.muted_zero, + title: 'Mute Volume as Zero', + subtitle: 'Display volume as 0 when muting, instead of previous device volume', + type: 'boolean', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/bar/index.ts b/ags/HyprPanel/widget/settings/pages/theme/bar/index.ts new file mode 100644 index 0000000..0fb513d --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/bar/index.ts @@ -0,0 +1,227 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const BarTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'always', + hscroll: 'automatic', + class_name: 'bar-theme-page paged-container', + child: Widget.Box({ + vertical: true, + children: [ + Header('General'), + Option({ opt: options.theme.bar.transparent, title: 'Transparent', type: 'boolean' }), + Option({ opt: options.theme.bar.background, title: 'Background Color', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.style, + title: 'Button Style', + type: 'enum', + enums: ['default', 'split', 'wave', 'wave2'], + }), + Option({ + opt: options.theme.bar.opacity, + title: 'Background Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ + opt: options.theme.bar.buttons.opacity, + title: 'Button Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ + opt: options.theme.bar.buttons.background_opacity, + title: 'Button Background Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ + opt: options.theme.bar.buttons.background_hover_opacity, + title: 'Button Background Hover Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ + opt: options.theme.bar.buttons.monochrome, + title: 'Use Global Colors', + type: 'boolean', + disabledBinding: options.theme.matugen, + }), + Option({ opt: options.theme.bar.buttons.background, title: 'Button Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.hover, title: 'Button Hover', type: 'color' }), + Option({ opt: options.theme.bar.buttons.text, title: 'Button Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.icon, title: 'Button Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + + Header('Dashboard Button'), + Option({ opt: options.theme.bar.buttons.dashboard.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.dashboard.icon, title: 'Icon', type: 'color' }), + Option({ opt: options.theme.bar.buttons.dashboard.border, title: 'Border', type: 'color' }), + + Header('Workspaces'), + Option({ opt: options.theme.bar.buttons.workspaces.background, title: 'Background', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.workspaces.hover, + title: 'Workspace Hover Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.available, + title: 'Workspace Available Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.occupied, + title: 'Workspace Occupied Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.active, + title: 'Workspace Active Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.numbered_active_highlighted_text_color, + title: 'Highlighted Workspace Text Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.buttons.workspaces.numbered_active_underline_color, + title: 'Workspace Underline Color', + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.workspaces.border, title: 'Border', type: 'color' }), + + Header('Window Title'), + Option({ opt: options.theme.bar.buttons.windowtitle.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.windowtitle.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.windowtitle.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.windowtitle.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.windowtitle.border, title: 'Border', type: 'color' }), + + Header('Media'), + Option({ opt: options.theme.bar.buttons.media.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.media.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.media.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.media.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.media.border, title: 'Border', type: 'color' }), + + Header('Volume'), + Option({ opt: options.theme.bar.buttons.volume.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.volume.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.volume.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.volume.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.volume.border, title: 'Border', type: 'color' }), + + Header('Network'), + Option({ opt: options.theme.bar.buttons.network.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.network.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.network.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.network.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.network.border, title: 'Border', type: 'color' }), + + Header('Bluetooth'), + Option({ opt: options.theme.bar.buttons.bluetooth.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.bluetooth.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.bluetooth.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.bluetooth.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.bluetooth.border, title: 'Border', type: 'color' }), + + Header('System Tray'), + Option({ opt: options.theme.bar.buttons.systray.background, title: 'Background', type: 'color' }), + + Header('Battery'), + Option({ opt: options.theme.bar.buttons.battery.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.battery.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.battery.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.battery.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.battery.border, title: 'Border', type: 'color' }), + + Header('Clock'), + Option({ opt: options.theme.bar.buttons.clock.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.buttons.clock.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.buttons.clock.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.clock.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.clock.border, title: 'Border', type: 'color' }), + + Header('Notifications'), + Option({ opt: options.theme.bar.buttons.notifications.background, title: 'Background', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.notifications.total, + title: 'Notification Count', + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.notifications.icon, title: 'Icon', type: 'color' }), + Option({ + opt: options.theme.bar.buttons.notifications.icon_background, + title: 'Button Icon Background', + subtitle: + "Applies a background color to the icon section of the button.\nRequires 'split' button styling.", + type: 'color', + }), + Option({ opt: options.theme.bar.buttons.notifications.border, title: 'Border', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/index.ts b/ags/HyprPanel/widget/settings/pages/theme/index.ts new file mode 100644 index 0000000..0f09cc5 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/index.ts @@ -0,0 +1,111 @@ +import { BarTheme } from './bar/index'; +import { NotificationsTheme } from './notifications/index'; +import { BatteryMenuTheme } from './menus/battery'; +import { BluetoothMenuTheme } from './menus/bluetooth'; +import { ClockMenuTheme } from './menus/clock'; +import { DashboardMenuTheme } from './menus/dashboard'; +import { MenuTheme } from './menus/index'; +import { MediaMenuTheme } from './menus/media'; +import { NetworkMenuTheme } from './menus/network'; +import { NotificationsMenuTheme } from './menus/notifications'; +import { SystrayMenuTheme } from './menus/systray'; +import { VolumeMenuTheme } from './menus/volume'; +import { OsdTheme } from './osd/index'; +import { Matugen } from './menus/matugen'; +import { CustomModuleTheme } from 'customModules/theme'; +import { PowerMenuTheme } from './menus/power'; +import { GBox } from 'lib/types/widget'; + +type Page = + | 'General Settings' + | 'Matugen Settings' + | 'Bar' + | 'Notifications' + | 'OSD' + | 'Battery Menu' + | 'Bluetooth Menu' + | 'Clock Menu' + | 'Dashboard Menu' + | 'Media Menu' + | 'Network Menu' + | 'Notifications Menu' + | 'System Tray' + | 'Volume Menu' + | 'Power Menu' + | 'Custom Modules'; + +const CurrentPage = Variable('General Settings'); + +const pagerMap: Page[] = [ + 'General Settings', + 'Matugen Settings', + 'Bar', + 'Notifications', + 'OSD', + 'Battery Menu', + 'Bluetooth Menu', + 'Clock Menu', + 'Dashboard Menu', + 'Media Menu', + 'Network Menu', + 'Notifications Menu', + 'System Tray', + 'Volume Menu', + 'Power Menu', + 'Custom Modules', +]; + +export const ThemesMenu = (): GBox => { + return Widget.Box({ + vertical: true, + children: CurrentPage.bind('value').as((v) => { + return [ + Widget.Box({ + class_name: 'option-pages-container', + hpack: 'center', + hexpand: true, + vertical: true, + children: [0, 1, 2].map((section) => { + return Widget.Box({ + children: pagerMap.map((page, index) => { + if (index >= section * 6 && index < section * 6 + 6) { + return Widget.Button({ + hpack: 'center', + xalign: 0, + class_name: `pager-button ${v === page ? 'active' : ''}`, + label: page, + on_primary_click: () => (CurrentPage.value = page), + }); + } + return Widget.Box(); + }), + }); + }), + }), + Widget.Stack({ + vexpand: true, + class_name: 'themes-menu-stack', + children: { + 'General Settings': MenuTheme(), + 'Matugen Settings': Matugen(), + Bar: BarTheme(), + Notifications: NotificationsTheme(), + OSD: OsdTheme(), + 'Battery Menu': BatteryMenuTheme(), + 'Bluetooth Menu': BluetoothMenuTheme(), + 'Clock Menu': ClockMenuTheme(), + 'Dashboard Menu': DashboardMenuTheme(), + 'Media Menu': MediaMenuTheme(), + 'Network Menu': NetworkMenuTheme(), + 'Notifications Menu': NotificationsMenuTheme(), + 'System Tray': SystrayMenuTheme(), + 'Volume Menu': VolumeMenuTheme(), + 'Power Menu': PowerMenuTheme(), + 'Custom Modules': CustomModuleTheme(), + }, + shown: CurrentPage.bind('value'), + }), + ]; + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/battery.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/battery.ts new file mode 100644 index 0000000..6955f80 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/battery.ts @@ -0,0 +1,68 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const BatteryMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page battery paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Battery Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.battery.text, title: 'Text', type: 'color' }), + + Header('Card'), + Option({ opt: options.theme.bar.menus.menu.battery.card.color, title: 'Card', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.battery.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.battery.border.color, title: 'Border', type: 'color' }), + + Header('Label'), + Option({ opt: options.theme.bar.menus.menu.battery.label.color, title: 'Label', type: 'color' }), + + Header('List Items'), + Option({ + opt: options.theme.bar.menus.menu.battery.listitems.active, + title: 'Active/Hover', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.battery.listitems.passive, + title: 'Passive', + type: 'color', + }), + + Header('Icons'), + Option({ opt: options.theme.bar.menus.menu.battery.icons.active, title: 'Active', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.battery.icons.passive, title: 'Passive', type: 'color' }), + + Header('Slider'), + Option({ opt: options.theme.bar.menus.menu.battery.slider.primary, title: 'Primary', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.battery.slider.background, + title: 'Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.battery.slider.backgroundhover, + title: 'Background (Hover)', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.battery.slider.puck, title: 'Puck', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/bluetooth.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/bluetooth.ts new file mode 100644 index 0000000..d3adb36 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/bluetooth.ts @@ -0,0 +1,89 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const BluetoothMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page bluetooth paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Bluetooth Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.bluetooth.text, title: 'Text', type: 'color' }), + + Header('Card'), + Option({ opt: options.theme.bar.menus.menu.bluetooth.card.color, title: 'Card', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.bluetooth.border.color, title: 'Border', type: 'color' }), + + Header('Label'), + Option({ opt: options.theme.bar.menus.menu.bluetooth.label.color, title: 'Label', type: 'color' }), + + Header('Status'), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.status, + title: 'Connection Status', + type: 'color', + }), + + Header('List Items'), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.listitems.active, + title: 'Active/Hover', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.listitems.passive, + title: 'Passive', + type: 'color', + }), + + Header('Icons'), + Option({ opt: options.theme.bar.menus.menu.bluetooth.icons.active, title: 'Active', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.bluetooth.icons.passive, title: 'Passive', type: 'color' }), + + Header('Icon Buttons'), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.iconbutton.active, + title: 'Active', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.iconbutton.passive, + title: 'Passive', + type: 'color', + }), + + Header('Switch'), + Option({ opt: options.theme.bar.menus.menu.bluetooth.switch.enabled, title: 'Enabled', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.switch.disabled, + title: 'Disabled', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.bluetooth.switch.puck, title: 'Puck', type: 'color' }), + + Header('Switch Divider'), + Option({ + opt: options.theme.bar.menus.menu.bluetooth.switch_divider, + title: 'Switch Divider', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/clock.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/clock.ts new file mode 100644 index 0000000..2727939 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/clock.ts @@ -0,0 +1,130 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const ClockMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page clock paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Clock Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.clock.text, title: 'Text', type: 'color' }), + + Header('Card'), + Option({ opt: options.theme.bar.menus.menu.clock.card.color, title: 'Card', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.clock.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.clock.border.color, title: 'Border', type: 'color' }), + + Header('Time'), + Option({ opt: options.theme.bar.menus.menu.clock.time.time, title: 'Time', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.clock.time.timeperiod, + title: 'Period', + subtitle: 'AM/PM', + type: 'color', + }), + + Header('Calendar'), + Option({ + opt: options.theme.bar.menus.menu.clock.calendar.yearmonth, + title: 'Year/Month', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.clock.calendar.weekdays, title: 'Weekdays', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.clock.calendar.paginator, + title: 'Navigation Arrows (Hover)', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.calendar.currentday, + title: 'Current Day', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.clock.calendar.days, title: 'Days', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.clock.calendar.contextdays, + title: 'Trailing/Leading Days', + type: 'color', + }), + + Header('Weather'), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.icon, + title: 'Current Weather Icon', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.temperature, + title: 'Current Temperature', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.status, + title: 'Current Status', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.stats, + title: 'Current Stats', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.thermometer.extremelyhot, + title: 'Thermometer - Extremely Hot', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.thermometer.hot, + title: 'Thermometer - Hot', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.thermometer.moderate, + title: 'Thermometer - Moderate', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.thermometer.cold, + title: 'Thermometer - Cold', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.thermometer.extremelycold, + title: 'Thermometer - Extremely Cold', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.hourly.time, + title: 'Hourly Weather Time', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.hourly.icon, + title: 'Hourly Weather Icon', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.clock.weather.hourly.temperature, + title: 'Hourly Weather Temperature', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/dashboard.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/dashboard.ts new file mode 100644 index 0000000..76bb88f --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/dashboard.ts @@ -0,0 +1,268 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const DashboardMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'always', + hscroll: 'automatic', + class_name: 'menu-theme-page dashboard paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Card'), + Option({ opt: options.theme.bar.menus.menu.dashboard.card.color, title: 'Card', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.dashboard.border.color, title: 'Border', type: 'color' }), + + Header('Profile'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.profile.name, + title: 'Profile Name', + type: 'color', + }), + + Header('Power Menu'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.shutdown, + title: 'Shutdown', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.restart, + title: 'Restart', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.logout, + title: 'Log Out', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.dashboard.powermenu.sleep, title: 'Sleep', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.card, + title: 'Confirmation Dialog Card', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.background, + title: 'Confirmation Dialog Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.border, + title: 'Confirmation Dialog Border', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.label, + title: 'Confirmation Dialog Label', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.body, + title: 'Confirmation Dialog Description', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.confirm, + title: 'Confirmation Dialog Confirm Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.deny, + title: 'Confirmation Dialog Cancel Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.powermenu.confirmation.button_text, + title: 'Confirmation Dialog Button Text', + type: 'color', + }), + + Header('Shortcuts'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.shortcuts.background, + title: 'Primary', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.dashboard.shortcuts.text, title: 'Text', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.shortcuts.recording, + title: 'Recording', + subtitle: 'Color of the Record button when recording is in progress', + type: 'color', + }), + + Header('Controls'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.disabled, + title: 'Module Off', + subtitle: 'Button color when element is disabled', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.wifi.background, + title: 'Wifi Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.wifi.text, + title: 'Wifi Button Text', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.bluetooth.background, + title: 'Bluetooth Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.bluetooth.text, + title: 'Bluetooth Button Text', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.notifications.background, + title: 'Notifications Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.notifications.text, + title: 'Notifications Button Text', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.volume.background, + title: 'Volume Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.volume.text, + title: 'Volume Button Text', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.input.background, + title: 'Input Button', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.controls.input.text, + title: 'Input Button Text', + type: 'color', + }), + + Header('Directories'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.directories.left.top.color, + title: 'Directory: Left - Top', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.directories.left.middle.color, + title: 'Directory: Left - Middle', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.directories.left.bottom.color, + title: 'Directory: Left - Bottom', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.directories.right.top.color, + title: 'Directory: Right - Top', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.directories.right.middle.color, + title: 'Directory: Right - Middle', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.directories.right.bottom.color, + title: 'Directory: Right - Bottom', + type: 'color', + }), + + Header('System Stats'), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.bar_background, + title: 'Bar Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.cpu.icon, + title: 'CPU Icon', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.cpu.bar, + title: 'CPU Bar', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.cpu.label, + title: 'CPU Label', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.ram.icon, + title: 'RAM Icon', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.ram.bar, + title: 'RAM Bar', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.ram.label, + title: 'RAM Label', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.gpu.icon, + title: 'GPU Icon', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.gpu.bar, + title: 'GPU Bar', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.gpu.label, + title: 'GPU Label', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.disk.icon, + title: 'Disk Icon', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.disk.bar, + title: 'Disk Bar', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.dashboard.monitors.disk.label, + title: 'Disk Label', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/index.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/index.ts new file mode 100644 index 0000000..333fe96 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/index.ts @@ -0,0 +1,139 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const MenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('General'), + Option({ + opt: options.dummy, + title: 'Theme', + subtitle: 'WARNING: Importing a theme will replace your current theme color settings.', + type: 'config_import', + exportData: { + filePath: OPTIONS, + themeOnly: true, + }, + }), + Option({ + opt: options.theme.bar.menus.monochrome, + title: 'Use Global Colors', + type: 'boolean', + disabledBinding: options.theme.matugen, + }), + Option({ + opt: options.wallpaper.pywal, + title: 'Generate Pywal Colors', + subtitle: 'Whether to also generate pywal colors with chosen wallpaper', + type: 'boolean', + }), + Option({ + opt: options.wallpaper.enable, + title: 'Apply Wallpapers', + subtitle: 'Whether to apply the wallpaper or to only use it for Matugen color generation.', + type: 'boolean', + }), + Option({ + opt: options.wallpaper.image, + title: 'Wallpaper', + subtitle: options.wallpaper.image.bind('value'), + type: 'wallpaper', + }), + Option({ opt: options.theme.bar.menus.background, title: 'Background Color', type: 'color' }), + Option({ + opt: options.theme.bar.menus.opacity, + title: 'Menu Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ opt: options.theme.bar.menus.cards, title: 'Cards', type: 'color' }), + Option({ opt: options.theme.bar.menus.card_radius, title: 'Card Radius', type: 'string' }), + Option({ opt: options.theme.bar.menus.text, title: 'Primary Text', type: 'color' }), + Option({ opt: options.theme.bar.menus.dimtext, title: 'Dim Text', type: 'color' }), + Option({ opt: options.theme.bar.menus.feinttext, title: 'Feint Text', type: 'color' }), + Option({ opt: options.theme.bar.menus.label, title: 'Label Color', type: 'color' }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.border.size, title: 'Border Width', type: 'string' }), + Option({ opt: options.theme.bar.menus.border.radius, title: 'Border Radius', type: 'string' }), + Option({ opt: options.theme.bar.menus.border.color, title: 'Border Color', type: 'color' }), + + Header('Popover'), + Option({ opt: options.theme.bar.menus.popover.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.menus.popover.background, title: 'Background', type: 'color' }), + + Header('List Items'), + Option({ + opt: options.theme.bar.menus.listitems.active, + title: 'Active', + subtitle: + 'Items of a list (network name, bluetooth device name, playback device, etc.) when active or hovered.', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.listitems.passive, title: 'Passive', type: 'color' }), + + Header('Icons'), + Option({ opt: options.theme.bar.menus.icons.active, title: 'Active', type: 'color' }), + Option({ opt: options.theme.bar.menus.icons.passive, title: 'Passive', type: 'color' }), + + Header('Switch'), + Option({ opt: options.theme.bar.menus.switch.enabled, title: 'Enabled', type: 'color' }), + Option({ opt: options.theme.bar.menus.switch.disabled, title: 'Disabled', type: 'color' }), + Option({ opt: options.theme.bar.menus.switch.puck, title: 'Puck', type: 'color' }), + + Header('Check/Radio Buttons'), + Option({ + opt: options.theme.bar.menus.check_radio_button.background, + title: 'Background', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.check_radio_button.active, title: 'Active', type: 'color' }), + + Header('Buttons'), + Option({ opt: options.theme.bar.menus.buttons.default, title: 'Primary', type: 'color' }), + Option({ opt: options.theme.bar.menus.buttons.active, title: 'Active', type: 'color' }), + Option({ opt: options.theme.bar.menus.buttons.disabled, title: 'Disabled', type: 'color' }), + Option({ opt: options.theme.bar.menus.buttons.text, title: 'Text', type: 'color' }), + + Header('Icon Buttons'), + Option({ opt: options.theme.bar.menus.iconbuttons.passive, title: 'Primary', type: 'color' }), + Option({ opt: options.theme.bar.menus.iconbuttons.active, title: 'Active/Hovered', type: 'color' }), + + Header('Progress Bar'), + Option({ opt: options.theme.bar.menus.progressbar.foreground, title: 'Primary', type: 'color' }), + Option({ opt: options.theme.bar.menus.progressbar.background, title: 'Background', type: 'color' }), + + Header('Slider'), + Option({ opt: options.theme.bar.menus.slider.primary, title: 'Primary', type: 'color' }), + Option({ opt: options.theme.bar.menus.slider.background, title: 'Background', type: 'color' }), + Option({ + opt: options.theme.bar.menus.slider.backgroundhover, + title: 'Background (Hover)', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.slider.puck, title: 'Puck', type: 'color' }), + + Header('Dropdown Menu'), + Option({ opt: options.theme.bar.menus.dropdownmenu.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.menus.dropdownmenu.text, title: 'Text', type: 'color' }), + Option({ opt: options.theme.bar.menus.dropdownmenu.divider, title: 'Divider', type: 'color' }), + + Header('Tooltips'), + Option({ opt: options.theme.bar.menus.tooltip.background, title: 'Background', type: 'color' }), + Option({ opt: options.theme.bar.menus.tooltip.text, title: 'Text', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/matugen.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/matugen.ts new file mode 100644 index 0000000..6f7a208 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/matugen.ts @@ -0,0 +1,71 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const Matugen = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Matugen Settings'), + Option({ + opt: options.theme.matugen, + title: 'Enable Matugen', + subtitle: 'WARNING: THIS WILL REPLACE YOUR CURRENT COLOR SCHEME!!!', + type: 'boolean', + dependencies: ['matugen', 'swww'], + }), + Option({ + opt: options.theme.matugen_settings.mode, + title: 'Matugen Theme', + type: 'enum', + enums: ['light', 'dark'], + }), + Option({ + opt: options.theme.matugen_settings.scheme_type, + title: 'Matugen Scheme', + type: 'enum', + enums: [ + 'content', + 'expressive', + 'fidelity', + 'fruit-salad', + 'monochrome', + 'neutral', + 'rainbow', + 'tonal-spot', + ], + }), + Option({ + opt: options.theme.matugen_settings.variation, + title: 'Matugen Variation', + type: 'enum', + enums: [ + 'standard_1', + 'standard_2', + 'standard_3', + 'monochrome_1', + 'monochrome_2', + 'monochrome_3', + 'vivid_1', + 'vivid_2', + 'vivid_3', + ], + }), + Option({ + opt: options.theme.matugen_settings.contrast, + title: 'Contrast', + subtitle: 'Range: -1 to 1 (Default: 0)', + type: 'float', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/media.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/media.ts new file mode 100644 index 0000000..6058cd9 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/media.ts @@ -0,0 +1,83 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const MediaMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page media paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Media Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.media.song, title: 'Song', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.media.artist, title: 'Artist', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.media.album, title: 'Album', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.media.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.media.border.color, title: 'Border', type: 'color' }), + + Header('Card/Album Art'), + Option({ opt: options.theme.bar.menus.menu.media.card.color, title: 'Color', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.media.card.tint, + title: 'Tint', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + + Header('Buttons'), + Option({ + opt: options.theme.bar.menus.menu.media.buttons.inactive, + title: 'Unavailable', + subtitle: "Disabled button when media control isn't available.", + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.media.buttons.enabled, + title: 'Enabled', + subtitle: 'Ex: Button color when shuffle/loop is enabled.', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.media.buttons.background, + title: 'Background', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.media.buttons.text, title: 'Text', type: 'color' }), + + Header('Slider'), + Option({ + opt: options.theme.bar.menus.menu.media.slider.primary, + title: 'Primary Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.media.slider.background, + title: 'Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.media.slider.backgroundhover, + title: 'Backround (Hover)', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.media.slider.puck, title: 'Puck', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/network.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/network.ts new file mode 100644 index 0000000..b06dfc5 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/network.ts @@ -0,0 +1,86 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const NetworkMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page network paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Network Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.network.text, title: 'Text', type: 'color' }), + + Header('Card'), + Option({ opt: options.theme.bar.menus.menu.network.card.color, title: 'Card', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.network.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.network.border.color, title: 'Border', type: 'color' }), + + Header('Label'), + Option({ opt: options.theme.bar.menus.menu.network.label.color, title: 'Label', type: 'color' }), + + Header('Status'), + Option({ + opt: options.theme.bar.menus.menu.network.status.color, + title: 'Connection Status', + type: 'color', + }), + + Header('Switch'), + Option({ + opt: options.theme.bar.menus.menu.network.switch.enabled, + title: 'Enabled', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.network.switch.disabled, + title: 'Disabled', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.network.switch.puck, title: 'Puck', type: 'color' }), + + Header('List Items'), + Option({ + opt: options.theme.bar.menus.menu.network.listitems.active, + title: 'Active/Hover', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.network.listitems.passive, + title: 'Passive', + type: 'color', + }), + + Header('Icons'), + Option({ opt: options.theme.bar.menus.menu.network.icons.active, title: 'Active', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.network.icons.passive, title: 'Passive', type: 'color' }), + + Header('Icon Buttons'), + Option({ + opt: options.theme.bar.menus.menu.network.iconbuttons.active, + title: 'Active', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.network.iconbuttons.passive, + title: 'Passive', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/notifications.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/notifications.ts new file mode 100644 index 0000000..c313ac6 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/notifications.ts @@ -0,0 +1,81 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const NotificationsMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page notifications paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Notifications Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.notifications.label, title: 'Menu Label', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.notifications.card, title: 'Card', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.notifications.background, + title: 'Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.no_notifications_label, + title: 'Empty Notifications Backdrop', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.notifications.border, title: 'Border', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.notifications.switch_divider, + title: 'Switch Divider', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.clear, + title: 'Clear Notifications Button', + type: 'color', + }), + + Header('Switch'), + Option({ + opt: options.theme.bar.menus.menu.notifications.switch.enabled, + title: 'Enabled', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.switch.disabled, + title: 'Disabled', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.notifications.switch.puck, title: 'Puck', type: 'color' }), + + Header('Scrollbar'), + Option({ + opt: options.theme.bar.menus.menu.notifications.scrollbar.color, + title: 'Scrollbar Color', + type: 'color', + }), + + Header('Pagination'), + Option({ + opt: options.theme.bar.menus.menu.notifications.pager.background, + title: 'Pager Footer Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.pager.button, + title: 'Pager Button Color', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.notifications.pager.label, + title: 'Pager Label Color', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/power.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/power.ts new file mode 100644 index 0000000..43e7398 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/power.ts @@ -0,0 +1,101 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const PowerMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page power paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.power.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.power.border.color, title: 'Border', type: 'color' }), + + Header('Shutdown Button'), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.shutdown.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.shutdown.icon_background, + title: 'Icon Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.shutdown.text, + title: 'Label Text', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.power.buttons.shutdown.icon, title: 'Icon', type: 'color' }), + + Header('Reboot Button'), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.restart.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.restart.icon_background, + title: 'Icon Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.restart.text, + title: 'Label Text', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.power.buttons.restart.icon, title: 'Icon', type: 'color' }), + + Header('Logout Button'), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.logout.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.logout.icon_background, + title: 'Icon Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.logout.text, + title: 'Label Text', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.power.buttons.logout.icon, title: 'Icon', type: 'color' }), + + Header('Sleep Button'), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.sleep.background, + title: 'Label Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.sleep.icon_background, + title: 'Icon Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.power.buttons.sleep.text, + title: 'Label Text', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.power.buttons.sleep.icon, title: 'Icon', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/systray.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/systray.ts new file mode 100644 index 0000000..5276a03 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/systray.ts @@ -0,0 +1,32 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const SystrayMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page systray paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Dropdown Menu'), + Option({ + opt: options.theme.bar.menus.menu.systray.dropdownmenu.background, + title: 'Background', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.systray.dropdownmenu.text, title: 'Text', type: 'color' }), + Option({ + opt: options.theme.bar.menus.menu.systray.dropdownmenu.divider, + title: 'Section Divider', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/menus/volume.ts b/ags/HyprPanel/widget/settings/pages/theme/menus/volume.ts new file mode 100644 index 0000000..efad554 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/menus/volume.ts @@ -0,0 +1,98 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const VolumeMenuTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'menu-theme-page volume paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Volume Menu Theme Settings'), + Option({ opt: options.theme.bar.menus.menu.volume.text, title: 'Text', type: 'color' }), + + Header('Card'), + Option({ opt: options.theme.bar.menus.menu.volume.card.color, title: 'Card', type: 'color' }), + + Header('Background'), + Option({ + opt: options.theme.bar.menus.menu.volume.background.color, + title: 'Background', + type: 'color', + }), + + Header('Border'), + Option({ opt: options.theme.bar.menus.menu.volume.border.color, title: 'Border', type: 'color' }), + + Header('Label'), + Option({ opt: options.theme.bar.menus.menu.volume.label.color, title: 'Label', type: 'color' }), + + Header('List Items'), + Option({ + opt: options.theme.bar.menus.menu.volume.listitems.active, + title: 'Active/Hover', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.volume.listitems.passive, title: 'Passive', type: 'color' }), + + Header('Icon Button'), + Option({ + opt: options.theme.bar.menus.menu.volume.iconbutton.active, + title: 'Active/Hover', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.volume.iconbutton.passive, + title: 'Passive', + type: 'color', + }), + + Header('Icons'), + Option({ opt: options.theme.bar.menus.menu.volume.icons.active, title: 'Active', type: 'color' }), + Option({ opt: options.theme.bar.menus.menu.volume.icons.passive, title: 'Passive', type: 'color' }), + + Header('Audio Slider'), + Option({ + opt: options.theme.bar.menus.menu.volume.audio_slider.primary, + title: 'Primary', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.volume.audio_slider.background, + title: 'Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.volume.audio_slider.backgroundhover, + title: 'Background (Hover)', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.volume.audio_slider.puck, title: 'Puck', type: 'color' }), + + Header('Input Slider'), + Option({ + opt: options.theme.bar.menus.menu.volume.input_slider.primary, + title: 'Primary', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.volume.input_slider.background, + title: 'Background', + type: 'color', + }), + Option({ + opt: options.theme.bar.menus.menu.volume.input_slider.backgroundhover, + title: 'Background (Hover)', + type: 'color', + }), + Option({ opt: options.theme.bar.menus.menu.volume.input_slider.puck, title: 'Puck', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/notifications/index.ts b/ags/HyprPanel/widget/settings/pages/theme/notifications/index.ts new file mode 100644 index 0000000..25adf1a --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/notifications/index.ts @@ -0,0 +1,61 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const NotificationsTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'notifications-theme-page paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('Notifications Theme Settings'), + Option({ opt: options.theme.notification.background, title: 'Notification Background', type: 'color' }), + Option({ + opt: options.theme.notification.opacity, + title: 'Notification Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ + opt: options.theme.notification.actions.background, + title: 'Action Button Background', + subtitle: 'Buttons that perform actions within a notification', + type: 'color', + }), + Option({ + opt: options.theme.notification.actions.text, + title: 'Action Button Text Color', + type: 'color', + }), + Option({ opt: options.theme.notification.label, title: 'Label', type: 'color' }), + Option({ opt: options.theme.notification.border, title: 'Border', type: 'color' }), + Option({ opt: options.theme.notification.time, title: 'Time Stamp', type: 'color' }), + Option({ opt: options.theme.notification.text, title: 'Body Text', type: 'color' }), + Option({ + opt: options.theme.notification.labelicon, + title: 'Label Icon', + subtitle: "Icon that accompanies the label. Doesn't apply if icon is an app icon.", + type: 'color', + }), + Option({ + opt: options.theme.notification.close_button.background, + title: 'Dismiss Button', + type: 'color', + }), + Option({ + opt: options.theme.notification.close_button.label, + title: 'Dismiss Button Text', + type: 'color', + }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/pages/theme/osd/index.ts b/ags/HyprPanel/widget/settings/pages/theme/osd/index.ts new file mode 100644 index 0000000..def8846 --- /dev/null +++ b/ags/HyprPanel/widget/settings/pages/theme/osd/index.ts @@ -0,0 +1,41 @@ +import { Option } from 'widget/settings/shared/Option'; +import { Header } from 'widget/settings/shared/Header'; + +import options from 'options'; +import Scrollable from 'types/widgets/scrollable'; +import { Attribute, Child } from 'lib/types/widget'; + +export const OsdTheme = (): Scrollable => { + return Widget.Scrollable({ + vscroll: 'automatic', + hscroll: 'automatic', + class_name: 'osd-theme-page paged-container', + vexpand: true, + child: Widget.Box({ + vertical: true, + children: [ + Header('On Screen Display Settings'), + Option({ + opt: options.theme.osd.opacity, + title: 'OSD Opacity', + type: 'number', + increment: 5, + min: 0, + max: 100, + }), + Option({ opt: options.theme.osd.bar_color, title: 'Bar', type: 'color' }), + Option({ + opt: options.theme.osd.bar_overflow_color, + title: 'Bar Overflow', + subtitle: 'Overflow color is for when the volume goes over a 100', + type: 'color', + }), + Option({ opt: options.theme.osd.bar_empty_color, title: 'Bar Background', type: 'color' }), + Option({ opt: options.theme.osd.bar_container, title: 'Bar Container', type: 'color' }), + Option({ opt: options.theme.osd.icon, title: 'Icon', type: 'color' }), + Option({ opt: options.theme.osd.icon_container, title: 'Icon Container', type: 'color' }), + Option({ opt: options.theme.osd.label, title: 'Value Text', type: 'color' }), + ], + }), + }); +}; diff --git a/ags/HyprPanel/widget/settings/shared/FileChooser.ts b/ags/HyprPanel/widget/settings/shared/FileChooser.ts new file mode 100644 index 0000000..b7b5f32 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/FileChooser.ts @@ -0,0 +1,251 @@ +import Gtk from 'gi://Gtk?version=3.0'; +import Gio from 'gi://Gio'; +import { bash, Notify } from 'lib/utils'; +import icons from 'lib/icons'; +import { Config } from 'lib/types/filechooser'; +import { hexColorPattern } from 'globals/useTheme'; +import { isHexColor } from 'globals/variables'; + +const whiteListedThemeProp = ['theme.bar.buttons.style']; + +export const loadJsonFile = (filePath: string): Config | null => { + const file = Gio.File.new_for_path(filePath as string); + const [success, content] = file.load_contents(null); + + if (!success) { + console.error(`Failed to import: ${filePath}`); + return null; + } + + const jsonString = new TextDecoder('utf-8').decode(content); + return JSON.parse(jsonString); +}; + +export const saveConfigToFile = (config: object, filePath: string): void => { + const file = Gio.File.new_for_path(filePath); + const outputStream = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + const dataOutputStream = new Gio.DataOutputStream({ base_stream: outputStream }); + + const jsonString = JSON.stringify(config, null, 2); + dataOutputStream.put_string(jsonString, null); + dataOutputStream.close(null); +}; + +export const filterConfigForThemeOnly = (config: Config): Config => { + const filteredConfig: Config = {}; + + for (const key in config) { + const value = config[key]; + if (typeof value === 'string' && hexColorPattern.test(value)) { + filteredConfig[key] = config[key]; + } else if (whiteListedThemeProp.includes(key)) { + filteredConfig[key] = config[key]; + } + } + return filteredConfig; +}; + +export const filterConfigForNonTheme = (config: Config): Config => { + const filteredConfig: Config = {}; + for (const key in config) { + if (whiteListedThemeProp.includes(key)) { + continue; + } + + const value = config[key]; + if (!(typeof value === 'string' && hexColorPattern.test(value))) { + filteredConfig[key] = config[key]; + } + } + return filteredConfig; +}; + +export const saveFileDialog = (filePath: string, themeOnly: boolean): void => { + const original_file_path = filePath; + + const file = Gio.File.new_for_path(original_file_path); + const [success, content] = file.load_contents(null); + + if (!success) { + console.error(`Could not find 'config.json' at ${TMP}`); + return; + } + + const jsonString = new TextDecoder('utf-8').decode(content); + const jsonObject = JSON.parse(jsonString); + + // Function to filter hex color pairs + const filterHexColorPairs = (jsonObject: Config): Config => { + const filteredObject: Config = {}; + + for (const key in jsonObject) { + const value = jsonObject[key]; + if (typeof value === 'string' && isHexColor(value)) { + filteredObject[key] = jsonObject[key]; + } else if (whiteListedThemeProp.includes(key)) { + filteredObject[key] = jsonObject[key]; + } + } + + return filteredObject; + }; + + // Function to filter out hex color pairs (keep only non-hex color value) + const filterOutHexColorPairs = (jsonObject: Config): Config => { + const filteredObject: Config = {}; + + for (const key in jsonObject) { + // do not add key-value pair if its in whiteListedThemeProp + if (whiteListedThemeProp.includes(key)) { + continue; + } + + const value = jsonObject[key]; + if (!(typeof value === 'string' && isHexColor(value))) { + filteredObject[key] = jsonObject[key]; + } + } + + return filteredObject; + }; + + // Filter the JSON object based on the themeOnly flag + const filteredJsonObject = themeOnly ? filterHexColorPairs(jsonObject) : filterOutHexColorPairs(jsonObject); + const filteredContent = JSON.stringify(filteredJsonObject, null, 2); + + const dialog = new Gtk.FileChooserDialog({ + title: 'Save File As', + action: Gtk.FileChooserAction.SAVE, + }); + + dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL); + dialog.add_button(Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT); + dialog.set_current_name(themeOnly ? 'hyprpanel_theme.json' : 'hyprpanel_config.json'); + + const response = dialog.run(); + + if (response === Gtk.ResponseType.ACCEPT) { + const file_path = dialog.get_filename(); + console.info(`Original file path: ${file_path}`); + + const getIncrementedFilePath = (filePath: string): string => { + let increment = 1; + const baseName = filePath.replace(/(\.\w+)$/, ''); + const match = filePath.match(/(\.\w+)$/); + const extension = match ? match[0] : ''; + + let newFilePath = filePath; + let file = Gio.File.new_for_path(newFilePath); + + while (file.query_exists(null)) { + newFilePath = `${baseName}_${increment}${extension}`; + file = Gio.File.new_for_path(newFilePath); + increment++; + } + + return newFilePath; + }; + + const finalFilePath = getIncrementedFilePath(file_path as string); + console.info(`File will be saved at: ${finalFilePath}`); + + try { + const save_file = Gio.File.new_for_path(finalFilePath); + const outputStream = save_file.replace(null, false, Gio.FileCreateFlags.NONE, null); + const dataOutputStream = new Gio.DataOutputStream({ + base_stream: outputStream, + }); + + dataOutputStream.put_string(filteredContent, null); + + dataOutputStream.close(null); + + Notify({ + summary: 'File Saved Successfully', + body: `At ${finalFilePath}.`, + iconName: icons.ui.info, + timeout: 5000, + }); + } catch (e) { + if (e instanceof Error) { + console.error('Failed to write to file:', e.message); + } + } + } + + dialog.destroy(); +}; + +export const importFiles = (themeOnly: boolean = false): void => { + const dialog = new Gtk.FileChooserDialog({ + title: `Import ${themeOnly ? 'Theme' : 'Config'}`, + action: Gtk.FileChooserAction.OPEN, + }); + dialog.set_current_folder(`${App.configDir}/themes`); + dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL); + dialog.add_button(Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT); + + const response = dialog.run(); + + if (response === Gtk.ResponseType.CANCEL) { + dialog.destroy(); + return; + } + if (response === Gtk.ResponseType.ACCEPT) { + const filePath: string | null = dialog.get_filename(); + + if (filePath === null) { + Notify({ + summary: 'Failed to import', + body: 'No file selected.', + iconName: icons.ui.warning, + timeout: 5000, + }); + return; + } + + const importedConfig = loadJsonFile(filePath); + + if (!importedConfig) { + dialog.destroy(); + return; + } + + Notify({ + summary: `Importing ${themeOnly ? 'Theme' : 'Config'}`, + body: `Importing: ${filePath}`, + iconName: icons.ui.info, + timeout: 7000, + }); + + const tmpConfigFile = Gio.File.new_for_path(`${TMP}/config.json`); + const optionsConfigFile = Gio.File.new_for_path(OPTIONS); + + const [tmpSuccess, tmpContent] = tmpConfigFile.load_contents(null); + const [optionsSuccess, optionsContent] = optionsConfigFile.load_contents(null); + + if (!tmpSuccess || !optionsSuccess) { + console.error('Failed to read existing configuration files.'); + dialog.destroy(); + return; + } + + let tmpConfig = JSON.parse(new TextDecoder('utf-8').decode(tmpContent)); + let optionsConfig = JSON.parse(new TextDecoder('utf-8').decode(optionsContent)); + + if (themeOnly) { + const filteredConfig = filterConfigForThemeOnly(importedConfig); + tmpConfig = { ...tmpConfig, ...filteredConfig }; + optionsConfig = { ...optionsConfig, ...filteredConfig }; + } else { + const filteredConfig = filterConfigForNonTheme(importedConfig); + tmpConfig = { ...tmpConfig, ...filteredConfig }; + optionsConfig = { ...optionsConfig, ...filteredConfig }; + } + + saveConfigToFile(tmpConfig, `${TMP}/config.json`); + saveConfigToFile(optionsConfig, OPTIONS); + } + dialog.destroy(); + bash('pkill ags && ags'); +}; diff --git a/ags/HyprPanel/widget/settings/shared/Header.ts b/ags/HyprPanel/widget/settings/shared/Header.ts new file mode 100644 index 0000000..ac25e01 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/Header.ts @@ -0,0 +1,18 @@ +import { GBox } from 'lib/types/widget'; + +export const Header = (headerName: string): GBox => { + return Widget.Box({ + class_name: 'options-header', + children: [ + Widget.Label({ + class_name: 'label-name', + label: headerName, + }), + Widget.Separator({ + vpack: 'center', + hexpand: true, + class_name: 'menu-separator', + }), + ], + }); +}; diff --git a/ags/HyprPanel/widget/settings/shared/Inputter.ts b/ags/HyprPanel/widget/settings/shared/Inputter.ts new file mode 100644 index 0000000..ed52dc1 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/Inputter.ts @@ -0,0 +1,63 @@ +import { RowProps } from 'lib/types/options'; +import { Variable } from 'types/variable'; +import { BoxWidget } from 'lib/types/widget'; +import { numberInputter } from './components/number'; +import { objectInputter } from './components/object'; +import { stringInputter } from './components/string'; +import { booleanInputter } from './components/boolean'; +import { imageInputter } from './components/image'; +import { importInputter } from './components/import'; +import { wallpaperInputter } from './components/wallpaper'; +import { colorInputter } from './components/color'; +import { enumInputter } from './components/enum'; +import { fontInputter } from './components/font'; + +export const Inputter = ( + { + opt, + type = typeof opt.value as RowProps['type'], + enums, + disabledBinding, + dependencies, + exportData, + min = 0, + max = 1000000, + increment = 1, + }: RowProps, + className: string, + isUnsaved: Variable, +): BoxWidget => { + return Widget.Box({ + vpack: 'center', + class_name: /export|import/.test(type || '') ? '' : 'inputter-container', + setup: (self) => { + switch (type) { + case 'number': + return numberInputter(self, opt, min, max, increment, isUnsaved); + case 'float': + case 'object': + return objectInputter(self, opt, isUnsaved, className); + case 'string': + return stringInputter(self, opt, isUnsaved); + case 'enum': + return enumInputter(self, opt, enums!); + case 'boolean': + return booleanInputter(self, opt, disabledBinding, dependencies); + case 'img': + return imageInputter(self, opt); + case 'config_import': + return importInputter(self, exportData); + case 'wallpaper': + return wallpaperInputter(self, opt); + case 'font': + return fontInputter(self, opt); + case 'color': + return colorInputter(self, opt); + default: + return (self.child = Widget.Label({ + label: `No setter with type ${type}`, + })); + } + }, + }); +}; diff --git a/ags/HyprPanel/widget/settings/shared/Label.ts b/ags/HyprPanel/widget/settings/shared/Label.ts new file mode 100644 index 0000000..320ac57 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/Label.ts @@ -0,0 +1,34 @@ +import { GBox, GButton, GLabel } from 'lib/types/widget'; + +export const Label = (name: string, sub = '', subtitleLink = ''): GBox => { + const subTitle = (): GButton | GLabel => { + if (subtitleLink.length) { + return Widget.Button({ + hpack: 'start', + vpack: 'center', + class_name: 'options-sublabel-link', + label: sub, + on_primary_click: () => Utils.execAsync(`bash -c 'xdg-open ${subtitleLink}'`), + }); + } + return Widget.Label({ + hpack: 'start', + vpack: 'center', + class_name: 'options-sublabel', + label: sub, + }); + }; + return Widget.Box({ + vertical: true, + hpack: 'start', + children: [ + Widget.Label({ + hpack: 'start', + vpack: 'center', + class_name: 'options-label', + label: name, + }), + subTitle(), + ], + }); +}; diff --git a/ags/HyprPanel/widget/settings/shared/Option.ts b/ags/HyprPanel/widget/settings/shared/Option.ts new file mode 100644 index 0000000..1807469 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/Option.ts @@ -0,0 +1,33 @@ +import { Label } from './Label'; +import { Inputter } from './Inputter'; +import icons from 'lib/icons'; +import { RowProps } from 'lib/types/options'; +import { GBox } from 'lib/types/widget'; + +export const Option = ( + props: RowProps, + className: string = '', +): GBox => { + const isUnsaved = Variable(false); + + return Widget.Box({ + class_name: 'option-item', + hexpand: true, + children: [ + Widget.Box({ + hpack: 'start', + vpack: 'center', + hexpand: true, + child: Label(props.title, props.subtitle || '', props.subtitleLink), + }), + Inputter(props, className, isUnsaved), + Widget.Button({ + vpack: 'center', + class_name: 'reset-options', + child: Widget.Icon(icons.ui.refresh), + on_clicked: () => props.opt.reset(), + sensitive: props.opt.bind().as((v) => v !== props.opt.initial), + }), + ], + }); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/boolean.ts b/ags/HyprPanel/widget/settings/shared/components/boolean.ts new file mode 100644 index 0000000..cb8255a --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/boolean.ts @@ -0,0 +1,29 @@ +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget } from 'lib/types/widget'; +import { Variable } from 'types/variable'; + +import { dependencies as checkDependencies } from 'lib/utils'; + +export const booleanInputter = ( + self: BoxWidget, + opt: Opt, + disabledBinding: Variable | undefined, + dependencies: string[] | undefined, +): Attribute => { + return (self.child = Widget.Switch({ + sensitive: disabledBinding !== undefined ? disabledBinding.bind('value').as((disabled) => !disabled) : true, + }) + .on('notify::active', (self) => { + if (disabledBinding !== undefined && disabledBinding.value) { + return; + } + if (self.active && dependencies !== undefined && !dependencies.every((d) => checkDependencies(d))) { + self.active = false; + return; + } + opt.value = self.active as T; + }) + .hook(opt, (self) => { + self.active = opt.value as boolean; + })); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/color.ts b/ags/HyprPanel/widget/settings/shared/components/color.ts new file mode 100644 index 0000000..4212e7f --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/color.ts @@ -0,0 +1,19 @@ +import Gdk from 'gi://Gdk'; +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget } from 'lib/types/widget'; + +export const colorInputter = (self: BoxWidget, opt: Opt): Attribute => { + return (self.child = Widget.ColorButton() + .hook(opt, (self) => { + const rgba = new Gdk.RGBA(); + rgba.parse(opt.value as string); + self.rgba = rgba; + }) + .on('color-set', ({ rgba: { red, green, blue } }) => { + const hex = (n: number): string => { + const c = Math.floor(255 * n).toString(16); + return c.length === 1 ? `0${c}` : c; + }; + opt.value = `#${hex(red)}${hex(green)}${hex(blue)}` as T; + })); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/enum.ts b/ags/HyprPanel/widget/settings/shared/components/enum.ts new file mode 100644 index 0000000..423dba0 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/enum.ts @@ -0,0 +1,36 @@ +import { Opt } from 'lib/option'; +import { BoxWidget } from 'lib/types/widget'; +import icons from 'lib/icons'; +import { Box } from 'types/@girs/gtk-3.0/gtk-3.0.cjs'; + +export const enumInputter = ( + self: BoxWidget, + opt: Opt, + values: T[], +): Box => { + const lbl = Widget.Label({ label: opt.bind().as((v) => `${v}`) }); + const step = (dir: 1 | -1): void => { + const i = values.findIndex((i) => i === lbl.label); + opt.setValue( + dir > 0 + ? i + dir > values.length - 1 + ? values[0] + : values[i + dir] + : i + dir < 0 + ? values[values.length - 1] + : values[i + dir], + ); + }; + const next = Widget.Button({ + child: Widget.Icon(icons.ui.arrow.right), + on_clicked: () => step(+1), + }); + const prev = Widget.Button({ + child: Widget.Icon(icons.ui.arrow.left), + on_clicked: () => step(-1), + }); + return (self.child = Widget.Box({ + class_name: 'enum-setter', + children: [lbl, prev, next], + })); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/font.ts b/ags/HyprPanel/widget/settings/shared/components/font.ts new file mode 100644 index 0000000..4428888 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/font.ts @@ -0,0 +1,14 @@ +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget, Child } from 'lib/types/widget'; +import FontButton from 'types/widgets/fontbutton'; + +export const fontInputter = (self: BoxWidget, opt: Opt): FontButton => { + return (self.child = Widget.FontButton({ + show_size: false, + use_size: false, + setup: (self) => + self + .hook(opt, () => (self.font = opt.value as string)) + .on('font-set', ({ font }) => (opt.value = font!.split(' ').slice(0, -1).join(' ') as T)), + })); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/image.ts b/ags/HyprPanel/widget/settings/shared/components/image.ts new file mode 100644 index 0000000..1906004 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/image.ts @@ -0,0 +1,31 @@ +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget, Child } from 'lib/types/widget'; +import FileChooserButton from 'types/widgets/filechooserbutton'; + +export const imageInputter = (self: BoxWidget, opt: Opt): Attribute => { + self.child = createFileChooserButton(opt); + return self.child; +}; + +const createFileChooserButton = (opt: Opt): FileChooserButton => { + return Widget.FileChooserButton({ + class_name: 'image-chooser', + on_file_set: handleFileSet(opt), + }); +}; + +const handleFileSet = + (opt: Opt) => + ({ uri }: { uri: string | null }): void => { + if (!uri) { + console.warn('No URI selected'); + return; + } + + try { + const decodedPath = decodeURIComponent(uri.replace('file://', '')); + opt.value = decodedPath as T; + } catch (error) { + console.error('Failed to decode URI:', error); + } + }; diff --git a/ags/HyprPanel/widget/settings/shared/components/import.ts b/ags/HyprPanel/widget/settings/shared/components/import.ts new file mode 100644 index 0000000..7ab779a --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/import.ts @@ -0,0 +1,24 @@ +import { ThemeExportData } from 'lib/types/options'; +import { Attribute, BoxWidget } from 'lib/types/widget'; +import { importFiles, saveFileDialog } from '../FileChooser'; + +export const importInputter = (self: BoxWidget, exportData?: ThemeExportData): Attribute => { + return (self.child = Widget.Box({ + children: [ + Widget.Button({ + class_name: 'options-import', + label: 'import', + on_clicked: () => { + importFiles(exportData?.themeOnly as boolean); + }, + }), + Widget.Button({ + class_name: 'options-export', + label: 'export', + on_clicked: () => { + saveFileDialog(exportData?.filePath as string, exportData?.themeOnly as boolean); + }, + }), + ], + })); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/number.ts b/ags/HyprPanel/widget/settings/shared/components/number.ts new file mode 100644 index 0000000..893de70 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/number.ts @@ -0,0 +1,45 @@ +import icons from 'lib/icons'; +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget } from 'lib/types/widget'; +import { Variable } from 'types/variable'; + +export const numberInputter = ( + self: BoxWidget, + opt: Opt, + min: number, + max: number, + increment = 1, + isUnsaved: Variable, +): Attribute => { + return (self.children = [ + Widget.Box({ + class_name: 'unsaved-icon-container', + child: isUnsaved.bind('value').as((unsvd) => { + if (unsvd) { + return Widget.Icon({ + class_name: 'unsaved-icon', + icon: icons.ui.warning, + tooltipText: "Press 'Enter' to apply your changes.", + }); + } + return Widget.Box(); + }), + }), + Widget.SpinButton({ + setup(self) { + self.set_range(min, max); + self.set_increments(1 * increment, 5 * increment); + self.on('value-changed', () => { + opt.value = self.value as T; + }); + self.hook(opt, () => { + self.value = opt.value as number; + isUnsaved.value = Number(self.text) !== (opt.value as number); + }); + self.connect('key-release-event', () => { + isUnsaved.value = Number(self.text) !== (opt.value as number); + }); + }, + }), + ]); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/object.ts b/ags/HyprPanel/widget/settings/shared/components/object.ts new file mode 100644 index 0000000..b6efeec --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/object.ts @@ -0,0 +1,37 @@ +import icons from 'lib/icons'; +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget } from 'lib/types/widget'; +import { Variable } from 'types/variable'; + +export const objectInputter = ( + self: BoxWidget, + opt: Opt, + isUnsaved: Variable, + className: string, +): Attribute => { + return (self.children = [ + Widget.Box({ + class_name: 'unsaved-icon-container', + child: isUnsaved.bind('value').as((unsvd) => { + if (unsvd) { + return Widget.Icon({ + class_name: 'unsaved-icon', + icon: icons.ui.warning, + tooltipText: "Press 'Enter' to apply your changes.", + }); + } + return Widget.Box(); + }), + }), + Widget.Entry({ + class_name: className, + on_change: (self) => (isUnsaved.value = self.text !== JSON.stringify(opt.value)), + on_accept: (self) => (opt.value = JSON.parse(self.text || '')), + setup: (self) => + self.hook(opt, () => { + self.text = JSON.stringify(opt.value); + isUnsaved.value = self.text !== JSON.stringify(opt.value); + }), + }), + ]); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/string.ts b/ags/HyprPanel/widget/settings/shared/components/string.ts new file mode 100644 index 0000000..56d18c2 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/string.ts @@ -0,0 +1,34 @@ +import icons from 'lib/icons'; +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget } from 'lib/types/widget'; +import { Variable } from 'types/variable'; + +export const stringInputter = (self: BoxWidget, opt: Opt, isUnsaved: Variable): Attribute => { + return (self.children = [ + Widget.Box({ + class_name: 'unsaved-icon-container', + child: isUnsaved.bind('value').as((unsvd) => { + if (unsvd) { + return Widget.Icon({ + class_name: 'unsaved-icon', + icon: icons.ui.warning, + tooltipText: "Press 'Enter' to apply your changes.", + }); + } + return Widget.Box(); + }), + }), + Widget.Entry({ + class_name: isUnsaved.bind('value').as((unsaved) => (unsaved ? 'unsaved' : '')), + on_change: (self) => (isUnsaved.value = self.text !== opt.value), + on_accept: (self) => { + opt.value = self.text as T; + }, + setup: (self) => + self.hook(opt, () => { + isUnsaved.value = self.text !== opt.value; + self.text = opt.value as string; + }), + }), + ]); +}; diff --git a/ags/HyprPanel/widget/settings/shared/components/wallpaper.ts b/ags/HyprPanel/widget/settings/shared/components/wallpaper.ts new file mode 100644 index 0000000..5e11165 --- /dev/null +++ b/ags/HyprPanel/widget/settings/shared/components/wallpaper.ts @@ -0,0 +1,20 @@ +import { Opt } from 'lib/option'; +import { Attribute, BoxWidget } from 'lib/types/widget'; +import Wallpaper from 'services/Wallpaper'; + +export const wallpaperInputter = ( + self: BoxWidget, + opt: Opt, +): Attribute | void => { + if (typeof opt.value === 'string') { + return (self.child = Widget.FileChooserButton({ + on_file_set: ({ uri }) => { + const newValue: string = uri!.replace('file://', ''); + opt.value = newValue as T; + if (options.wallpaper.enable.value) { + Wallpaper.set(newValue); + } + }, + })); + } +}; diff --git a/ags/HyprPanel/widget/settings/side_effects/index.ts b/ags/HyprPanel/widget/settings/side_effects/index.ts new file mode 100644 index 0000000..6e268c1 --- /dev/null +++ b/ags/HyprPanel/widget/settings/side_effects/index.ts @@ -0,0 +1,34 @@ +import options from 'options'; + +const { show_numbered, show_icons, showWsIcons } = options.bar.workspaces; +const { monochrome: monoBar } = options.theme.bar.buttons; +const { monochrome: monoMenu } = options.theme.bar.menus; +const { matugen } = options.theme; + +show_numbered.connect('changed', ({ value }) => { + if (value === true) { + show_icons.value = false; + showWsIcons.value = false; + } +}); + +show_icons.connect('changed', ({ value }) => { + if (value === true) { + show_numbered.value = false; + showWsIcons.value = false; + } +}); + +showWsIcons.connect('changed', ({ value }) => { + if (value === true) { + show_numbered.value = false; + show_icons.value = false; + } +}); + +matugen.connect('changed', ({ value }) => { + if (value === true) { + monoBar.value = false; + monoMenu.value = false; + } +});