Compare commits
	
		
			213 commits
		
	
	
		
			f55f7474fd
			...
			81377aef7d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 81377aef7d | |||
| f55e861fdd | |||
| 46cf664bb5 | |||
| 85eb695499 | |||
| e2bb0b4a00 | |||
| c1a264e98e | |||
| 377bd48ee5 | |||
| bf49665871 | |||
| a31bebbf74 | |||
| 48368d3be2 | |||
| 9dd3ff1f8f | |||
| 8e84af98ac | |||
| 84849d5b2d | |||
| 9bd427e365 | |||
| 68af92924f | |||
|   | 28cbe5f554 | ||
| b631904365 | |||
| 38c00f771b | |||
| 9dee07646d | |||
| 1438b4f9f1 | |||
| b98b3a1472 | |||
| 5604745c78 | |||
| aa3af5f0e5 | |||
| 0749f112b0 | |||
| e91fc01543 | |||
| 8a0a7d444c | |||
| 4ffecbac0c | |||
| 512774da02 | |||
| 7de6837bb6 | |||
| b07798e0e8 | |||
| 602b82fb04 | |||
| 1ba4fd2d8d | |||
| d3d0ae8fcb | |||
| 0ecc1cbf40 | |||
| 6c644b8a80 | |||
| fcc280a41a | |||
| 9f296a42cd | |||
| dee0d03fad | |||
| 475fe7769c | |||
| 7f3ee1d335 | |||
| e0fc5903cd | |||
| b940df6af7 | |||
| bc64202040 | |||
| 4e1310c367 | |||
| bdf2b6d5ea | |||
| 7331571240 | |||
| 0055bb8146 | |||
| 214622f76f | |||
| 2abc93421c | |||
| c5fe176f38 | |||
| 8964a0c3a3 | |||
| af10032dcb | |||
| b48c99ab6f | |||
| 07caf5671d | |||
| 3a3e949e64 | |||
| 082722b2a8 | |||
| 6f3ab0b8d3 | |||
| ccec508959 | |||
|   | aaf89fc568 | ||
| 4ae8e33508 | |||
| c919b04614 | |||
| 7109d9dcf2 | |||
| b8149a8beb | |||
| 60730c1cd2 | |||
| d0040b8a0f | |||
| 12d9089907 | |||
| 374e91ebba | |||
| 910d6f99c6 | |||
| f10661f33f | |||
| 887507a022 | |||
| 11f014919a | |||
| a0eed0bcc1 | |||
| d8d1fc4b01 | |||
| 5596951ab9 | |||
| d91bb7c006 | |||
| 0873f56c28 | |||
| 0b8a730519 | |||
| 25452b9540 | |||
| 3d1a0dc56f | |||
| 3207e27f1d | |||
| 249b68cb16 | |||
| 7f784a59fa | |||
| ce67d0de9b | |||
| 338e3a25a1 | |||
| 615cea9f50 | |||
| aa2d8c578e | |||
| f020ae8902 | |||
| 4191eb50bf | |||
| 5aae9cdf5d | |||
| f59c08deb5 | |||
| 1898815955 | |||
| 35af389158 | |||
| 1c29de52d3 | |||
| e2a4f1c4bb | |||
| 308f18cdcd | |||
| 5fee6a8970 | |||
| 4c08871afe | |||
| b0cfbf184f | |||
| acb87b6bb1 | |||
| 928db722b4 | |||
| 7174cbcd3d | |||
| 779b437a13 | |||
| c4053ad9c1 | |||
| 728ef6ca9a | |||
| e95ae8039f | |||
| 7ed3b8f63c | |||
| 7701446130 | |||
| 78c70e0560 | |||
| 09715c8570 | |||
| caa0f0de74 | |||
| 0cb5596d22 | |||
| bcf9055675 | |||
| 859ba27ce0 | |||
| 8d9c2a0ed2 | |||
| 7868ac1529 | |||
| 4d20cc82c4 | |||
| f3a2f91254 | |||
| c2d52a2683 | |||
| 45b6a907fb | |||
| 34dbb54d6c | |||
| f9958ab4f7 | |||
| e01e845a43 | |||
| 94f793b6ff | |||
| 625e67339e | |||
| e9451f4a4a | |||
| 1fa7ae2a66 | |||
| c9f7e6b53c | |||
| 3f11846977 | |||
| 3cb560dfe1 | |||
| 4dd03e713b | |||
| aaa88d49d7 | |||
| 671da8f322 | |||
| 664b22c2bb | |||
| bf43fc8e64 | |||
| 7c5bd43295 | |||
| 0555fe90c4 | |||
| df9d1625d7 | |||
| 4fbe8fcfbf | |||
| 6a3585e7e5 | |||
| bee284691a | |||
| 4edb21607c | |||
| 061713745e | |||
| c6b06d5ba7 | |||
| a9ef09a8a4 | |||
| c096dc295a | |||
| da77c223ff | |||
| 79a37fa8eb | |||
| 4ee2e2a877 | |||
| 7da5a6a4a6 | |||
| 8b8725d907 | |||
| 4a2c8ccb39 | |||
| eb1d01174d | |||
| cf9a5b90bd | |||
| 094a457045 | |||
| eeb5472692 | |||
| d0ca588ece | |||
| 2d437acfbb | |||
| 9459f9e1f6 | |||
| 4f20813139 | |||
| 048341b126 | |||
| 2565005fe0 | |||
| 33e5d8fbea | |||
| 54469932ca | |||
| 3ef446f9b3 | |||
| a98484b420 | |||
| 7590d9af07 | |||
| 05274f898b | |||
| 794fb16445 | |||
| 6652e534a4 | |||
| 4ac9af3ca8 | |||
| 033588cb19 | |||
| 10816d1a0a | |||
| f3895ce019 | |||
| 9023bd2b64 | |||
| 7274434d34 | |||
| 757f268a10 | |||
| a83b2f7fa5 | |||
| 7a4216ae43 | |||
| 151da369a0 | |||
| ecbb5c8700 | |||
| edc99e84ef | |||
| a30e2a0bc1 | |||
| 10c1ed7ecb | |||
| df751735d3 | |||
| 15a2488af9 | |||
| 0251c7883b | |||
| a99ae9e8b8 | |||
| 8e7cd348b1 | |||
| c2f10e1c47 | |||
| e00a70ca53 | |||
| 1874a33f84 | |||
| c92c5be401 | |||
| 5284f668a2 | |||
| 0d83bc4c2c | |||
| 0b671a4752 | |||
| 86b4adb6e2 | |||
| 0be36da274 | |||
| e84922c5f9 | |||
| 0329f7e485 | |||
| 44d58268ac | |||
| e490c6be8e | |||
| 5688d97e0c | |||
| dfc0084dd8 | |||
| 8e217a3768 | |||
| 11bd9a3671 | |||
| 723bf4d367 | |||
| 0621d2c448 | |||
| 133b184e70 | |||
| 9d5fcc0668 | |||
| 3773a25ef1 | |||
| c51a2d7fd4 | |||
| 71e0903e63 | |||
| 201041b835 | 
					 251 changed files with 11924 additions and 2596 deletions
				
			
		
							
								
								
									
										
											BIN
										
									
								
								.github/assets/2025-01-26T21:52:48,481278761+11:00.png
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.github/assets/2025-01-26T21:52:48,481278761+11:00.png
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 366 KiB | 
							
								
								
									
										47
									
								
								.github/workflows/cachix.yaml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								.github/workflows/cachix.yaml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| name: "Build packages and push to cache" | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     paths:  | ||||
|       - outputs/pkgs/** | ||||
|       - flake.lock | ||||
|     branches: | ||||
|       - main | ||||
| concurrency: | ||||
|   group: ooknet-cache-${{ github.ref }} | ||||
|   cancel-in-progress: true | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       matrix: | ||||
|         package: | ||||
|           - ook-vim | ||||
|           - live-buds-cli | ||||
|           - caddy-with-cloudflare | ||||
|           - fpp-config | ||||
|           - fpp-launcher | ||||
|           - fpp-sd | ||||
|           - project-plus | ||||
|           - repomix | ||||
|           - website | ||||
|           - wii-u-gc-adapter | ||||
|           - spotify-player | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Configure git | ||||
|         run: git config --global url."https://github.com/".insteadOf "git@github.com:" | ||||
|       - name: Setup Nix | ||||
|         uses: DeterminateSystems/nix-installer-action@main | ||||
|       - name: Magic Nix Cache | ||||
|         uses: DeterminateSystems/magic-nix-cache-action@main | ||||
|       - name: Setup Cachix | ||||
|         uses: cachix/cachix-action@v15 | ||||
|         with: | ||||
|           name: ooknet | ||||
|           authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' | ||||
|           extraPullNames: nix-community | ||||
|       - name: Build packages | ||||
|         run: nix build .#${{ matrix.package }} --print-build-logs | ||||
|         continue-on-error: true | ||||
							
								
								
									
										47
									
								
								.github/workflows/check.yaml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								.github/workflows/check.yaml
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| name: "Nix Flake Check" | ||||
| on: | ||||
|   workflow_dispatch: | ||||
|   push: | ||||
|     branches: | ||||
|       - main | ||||
|     paths-ignore: | ||||
|       - .github/** | ||||
|       - README.md | ||||
|       - .repomixignore | ||||
|       - repomix.config.json | ||||
|       - .gitignore | ||||
| concurrency: | ||||
|   group: ooknet-check-${{ github.ref }} | ||||
|   cancel-in-progress: true | ||||
| jobs: | ||||
|   check-format: | ||||
|     name: Check Formatting | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: DeterminateSystems/nix-installer-action@main | ||||
|       - run: nix run nixpkgs#alejandra -- --check . | ||||
| 
 | ||||
|   check-dead-code: | ||||
|     name: Check Dead Code | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: DeterminateSystems/nix-installer-action@main | ||||
|       - uses: cachix/cachix-action@v15 | ||||
|         with: | ||||
|           name: deadnix | ||||
|       - uses: astro/deadnix-action@main | ||||
| 
 | ||||
|   check-flake: | ||||
|     name: Check Flake | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: webfactory/ssh-agent@v0.9.0 | ||||
|         with: | ||||
|           ssh-private-key: ${{ secrets.KUNZEN_DEPLOY_KEY }} | ||||
|       - uses: DeterminateSystems/nix-installer-action@main | ||||
|       - uses: DeterminateSystems/magic-nix-cache-action@main | ||||
|       - run: nix flake check | ||||
| 
 | ||||
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| repodump.xml | ||||
							
								
								
									
										5
									
								
								.repomixignore
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.repomixignore
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| *.lock | ||||
| **/equicord/options.nix | ||||
| **/gruv.nix | ||||
| .repomixignore | ||||
| repomix* | ||||
							
								
								
									
										152
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,152 @@ | |||
| <h1 align=center> ooknet </h1> | ||||
| <p align= center>A monorepo for all my nix expressions powered by flake-parts.</p> | ||||
| 
 | ||||
| ## Overview | ||||
| 
 | ||||
| This repository serves two main purposes: | ||||
| 
 | ||||
| 1. To serve as a centralized location for all my personal computing | ||||
|    infrastructure | ||||
| 2. To provide a place to experiment and learn about networking, administration, | ||||
|    security, unix, design, and programming | ||||
| 
 | ||||
| > [!WARNING] | ||||
| > This repository is not intended to be used by anyone but myself. It is highly | ||||
| > personalized and likely doesn't fit anyone else's needs. I leave this | ||||
| > repository public to serve as a reference for anyone else building something | ||||
| > similar. | ||||
| 
 | ||||
| ## Features | ||||
| 
 | ||||
| - NixOS configurations for all my hosts | ||||
| - Home-manager configuration for my workstations | ||||
| - Custom packages | ||||
| - Development environments | ||||
| - Declarative secrets with agenix | ||||
| - Personal website | ||||
| - Templates for bootstrapping projects | ||||
| 
 | ||||
| ## Fleet | ||||
| 
 | ||||
| Below are all the hosts I currently maintain within this flake: | ||||
| 
 | ||||
| | host      | spec                                  | role        | description                       | architecture | status | | ||||
| | --------- | ------------------------------------- | ----------- | --------------------------------- | ------------ | ------ | | ||||
| | ooksdesk  | 7500F / RX5700XT / 32 GB DDR5         | Workstation | Primary desktop workstation       | x86_64-linux | UP     | | ||||
| | ookst480s | T480s / i5-8350U / 24 GB DDR4         | Workstation | Primary mobile workstation        | x86_64-linux | UP     | | ||||
| | ooksmicro | GPD Micro PC / N8100 / 8 GB LPDR3     | Workstation | Pocket workstation                | x86_64-linux | UP     | | ||||
| | ooksmedia | i3-10100 / 1650 Super / 8 GB DDR4     | Server      | Homelab/Media server              | x86_64-linux | UP     | | ||||
| | ooksx1    | X1 Carbon G4 / i5 6200U / 8 GB LPDDR3 | Workstation | Alternative mobile workstation    | x86_64-linux | DOWN   | | ||||
| | ooknode   | Linode Nanode                         | Server      | VPS for website                   | x86_64-linux | UP     | | ||||
| | ooksphone | Termux                                | Workstation | Nix environment for android phone | x86_64-linux | DOWN   | | ||||
| 
 | ||||
| ## Architecture | ||||
| 
 | ||||
| As this project serves as a learning environment, its architecture changes | ||||
| frequently. While I'll try to keep this documentation current, what follows is a | ||||
| high-level overview of the current design. | ||||
| 
 | ||||
| One of the main goals of this project was to allow for easy bootstrapping of new | ||||
| hosts while maintaining fine-grained configuration on a per-host basis. This is | ||||
| accomplished using a roles and profiles pattern (similar to | ||||
| [Puppet's roles and profiles method](https://www.puppet.com/docs/puppet/7/the_roles_and_profiles_method.html)). | ||||
| 
 | ||||
| #### Roles | ||||
| 
 | ||||
| - **Workstation**: Desktop/laptop systems with GUI environment | ||||
| - **Server**: Headless systems running specific services | ||||
| 
 | ||||
| Roles are declared via their own respective helper functions `mkWorkstation` and | ||||
| `mkServer`. Both being simple wrappers of | ||||
| [`lib.nixosSystem`](https://github.com/NixOS/nixpkgs/blob/e5db80ae487b59b4e9f950d68983ffb0575e26c6/flake.nix#L21) | ||||
| (also see [`lib.evalModules`](https://noogle.dev/f/lib/evalModules)). These | ||||
| functions serve to abstract the boilerplate, leaving a simple interface for | ||||
| declaring hosts. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```nix | ||||
| flake.nixosConfigurations = { | ||||
|   ookst480s = mkWorkstation { | ||||
|     inherit withSystem; | ||||
|     system = "x86_64-linux"; | ||||
|     hostname = "ookst480s"; | ||||
|     type = "laptop"; | ||||
|   }; | ||||
|   ooknode = mkServer { | ||||
|     inherit withSystem; | ||||
|     system = "x86_64-linux"; | ||||
|     hostname = "ooknode"; | ||||
|     domain = "ooknet.org"; | ||||
|     type = "vm"; | ||||
|     profile = "linode"; | ||||
|     services = ["website" "forgejo"];  | ||||
|   }; | ||||
| }; | ||||
| ``` | ||||
| 
 | ||||
| #### Profiles | ||||
| 
 | ||||
| Profiles are collections of related software and configurations that can be | ||||
| enabled on a per-host basis. Here are some example profiles for workstations: | ||||
| 
 | ||||
| - `gaming`: Steam & emulators | ||||
| - `communication`: Discord, Teams, Matrix | ||||
| - `productivity`: Document editing, note-taking | ||||
| - `creative`: Art and design tools | ||||
| - `media`: Audio/video playback and management | ||||
| - `virtualization`: Virtual machine support | ||||
| 
 | ||||
| Example configuration: | ||||
| 
 | ||||
| ```nix | ||||
| ooknet.workstation.profiles = ["gaming" "creative" "media"]; | ||||
| ``` | ||||
| 
 | ||||
| For servers, profiles are defined as services. For example: | ||||
| 
 | ||||
| - `ookflix`: Media server services | ||||
| - `forgjo`: Git server | ||||
| - `website`: My static website | ||||
| 
 | ||||
| ```nix | ||||
| ooknet.server.services = ["ookflix"]; | ||||
| ``` | ||||
| 
 | ||||
| ## Desktop environment | ||||
| 
 | ||||
| <img src=".github/assets/2025-01-26T21:52:48,481278761+11:00.png" /> | ||||
| All workstations currently run a minimal wayland configuration made from a few | ||||
| components: | ||||
| 
 | ||||
| - [Hyprland](https://github.com/hyprwm/Hyprland) | ||||
| - Hypr* ware ([hypridle](https://github.com/hyprwm/hypridle), | ||||
|   [hyprlock](https://github.com/hyprwm/hyprlock), | ||||
|   [hyprpaper](https://github.com/hyprwm/hyprpaper)) | ||||
| - [Waybar](https://github.com/Alexays/Waybar) | ||||
| - [Mako](https://github.com/emersion/mako) | ||||
| - [Gruvbox extended](https://github.com/ooks-io/ooknet/blob/main/outputs/hozen/default.nix) | ||||
| 
 | ||||
| ## Appreciation | ||||
| 
 | ||||
| I want to give some appreciation to the many people/resources who have helped in | ||||
| some way to build this project. | ||||
| 
 | ||||
| ### People | ||||
| 
 | ||||
| - [ghuntley](https://github.com/ghuntley) | ||||
| - [NobbZ](https://github.com/NobbZ) | ||||
| - [notashelf](https://github.com/NotAShelf) | ||||
| - [mic92](https://github.com/Mic92) | ||||
| - [fabaff](https://github.com/fabaff) | ||||
| - [gerg-l](https://github.com/Gerg-L) | ||||
| - [viperML](https://github.com/viperML) | ||||
| - [colemickens](https://github.com/colemickens) | ||||
| - [fufexan](https://github.com/fufexan) | ||||
| - [max-privatevoid](https://github.com/max-privatevoid) | ||||
| 
 | ||||
| ### Resources | ||||
| 
 | ||||
| - [nix.dev](https://nix.dev/) | ||||
| - [noogle](https://noogle.dev/) | ||||
| - [nix-pills](https://nixos.org/guides/nix-pills/) | ||||
							
								
								
									
										2511
									
								
								flake.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										2511
									
								
								flake.lock
									
										
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										51
									
								
								flake.nix
									
										
									
									
									
								
							
							
						
						
									
										51
									
								
								flake.nix
									
										
									
									
									
								
							|  | @ -9,36 +9,63 @@ | |||
| 
 | ||||
|   inputs = { | ||||
|     nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; | ||||
|     flake-parts.url = "github:hercules-ci/flake-parts"; | ||||
| 
 | ||||
|     systems.url = "github:nix-systems/default-linux"; | ||||
| 
 | ||||
|     flake-parts = { | ||||
|       url = "github:hercules-ci/flake-parts"; | ||||
|     }; | ||||
| 
 | ||||
|     flake-utils = { | ||||
|       url = "github:numtide/flake-utils"; | ||||
|       inputs.systems.follows = "systems"; | ||||
|     }; | ||||
| 
 | ||||
|     home-manager = { | ||||
|       url = "github:nix-community/home-manager"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
|     agenix.url = "github:ryantm/agenix"; | ||||
| 
 | ||||
|     nix-index-db = { | ||||
|       url = "github:nix-community/nix-index-database"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
|     zjstatus.url = "github:dj95/zjstatus"; | ||||
|     systems.url = "github:nix-systems/default-linux"; | ||||
| 
 | ||||
|     zjstatus = { | ||||
|       url = "github:dj95/zjstatus"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
| 
 | ||||
|     firefox-addons = { | ||||
|       url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
|     ooks-scripts = { | ||||
|       url = "git+ssh://git@github.com/ooks-io/scripts"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
| 
 | ||||
|     secrets = { | ||||
|       url = "git+ssh://git@github.com/ooks-io/kunzen"; | ||||
|       inputs = { | ||||
|         nixpkgs.follows = "nixpkgs"; | ||||
|         flake-parts.follows = "flake-parts"; | ||||
|         systems.follows = "systems"; | ||||
|       }; | ||||
|     ooknet-website = { | ||||
|       url = "git+ssh://git@github.com/ooks-io/website"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
| 
 | ||||
|     nvf.url = "github:notashelf/nvf/v0.7"; | ||||
|     nvf = { | ||||
|       url = "github:notashelf/nvf"; | ||||
|       inputs = { | ||||
|         systems.follows = "systems"; | ||||
| 
 | ||||
|         nixpkgs.follows = "nixpkgs"; | ||||
|         flake-parts.follows = "flake-parts"; | ||||
|         flake-utils.follows = "flake-utils"; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     # hypr* ecosystem | ||||
|     hyprland.url = "github:hyprwm/hyprland"; | ||||
|     hyprland = { | ||||
|       url = "github:hyprwm/hyprland"; | ||||
|       inputs.systems.follows = "systems"; | ||||
|     }; | ||||
| 
 | ||||
|     hypridle = { | ||||
|       url = "github:hyprwm/hypridle"; | ||||
|  |  | |||
|  | @ -1,9 +0,0 @@ | |||
| { | ||||
|   ooknet.host = { | ||||
|     admin = { | ||||
|       name = "ooks"; | ||||
|       shell = "fish"; | ||||
|       homeManager = true; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -10,6 +10,7 @@ | |||
| 
 | ||||
|   ooknet = { | ||||
|     host = { | ||||
|       syncthing.enable = true; | ||||
|       admin = { | ||||
|         name = "ooks"; | ||||
|         shell = "fish"; | ||||
|  | @ -19,11 +20,13 @@ | |||
|     workstation = { | ||||
|       environment = "hyprland"; | ||||
|       theme = "minimal"; | ||||
|       profiles = ["gaming" "media" "communication" "productivity"]; | ||||
|       profiles = ["creative" "virtualization" "gaming" "media" "communication" "productivity"]; | ||||
|       default = { | ||||
|         browser = "firefox"; | ||||
|         terminal = "foot"; | ||||
|         terminal = "ghostty"; | ||||
|       }; | ||||
|       # FIXME | ||||
|       programs.ollama.enable = true; | ||||
|     }; | ||||
|     console = { | ||||
|       profile = "standard"; | ||||
|  |  | |||
|  | @ -1,17 +1,29 @@ | |||
| { | ||||
|   ooknet.hardware = { | ||||
|     cpu.type = "amd"; | ||||
|     cpu.amd.pstate.enable = true; | ||||
|     cpu = { | ||||
|       type = "amd"; | ||||
|       amd.pstate.enable = true; | ||||
|       cores = 16; | ||||
|     }; | ||||
|     gpu.type = "amd"; | ||||
|     features = ["printing" "ssd" "audio" "video"]; | ||||
|     monitors = [ | ||||
|       { | ||||
|         name = "DP-3"; | ||||
|         name = "DP-1"; | ||||
|         primary = true; | ||||
|         width = 2560; | ||||
|         height = 1440; | ||||
|         refreshRate = 144; | ||||
|         x = 1920; | ||||
|         y = 100; | ||||
|       } | ||||
|       { | ||||
|         name = "DP-2"; | ||||
|         width = 1920; | ||||
|         height = 1080; | ||||
|         refreshRate = 180; | ||||
|         workspace = "1"; | ||||
|         x = 840; | ||||
|         transform = 1; | ||||
|       } | ||||
|     ]; | ||||
|   }; | ||||
|  |  | |||
							
								
								
									
										30
									
								
								hosts/ooksmedia/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								hosts/ooksmedia/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| { | ||||
|   pkgs, | ||||
|   lib, | ||||
|   ... | ||||
| }: { | ||||
|   imports = [ | ||||
|     ./file-system.nix | ||||
|     ./hardware.nix | ||||
|   ]; | ||||
| 
 | ||||
|   ooknet = { | ||||
|     host = { | ||||
|       syncthing.enable = true; | ||||
|       admin = { | ||||
|         name = "ooks"; | ||||
|         shell = "fish"; | ||||
|         homeManager = true; | ||||
|       }; | ||||
|     }; | ||||
|     console = { | ||||
|       profile = "standard"; | ||||
|       editor = "nvim"; | ||||
|       multiplexer = "zellij"; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   boot.kernelPackages = pkgs.linuxPackages_xanmod_latest; | ||||
| 
 | ||||
|   system.stateVersion = lib.mkDefault "24.11"; | ||||
| } | ||||
							
								
								
									
										33
									
								
								hosts/ooksmedia/file-system.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								hosts/ooksmedia/file-system.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| { | ||||
|   fileSystems = { | ||||
|     "/" = { | ||||
|       device = "/dev/disk/by-uuid/50617edf-e788-49cc-9e0c-85a2f90a5550"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=root"]; | ||||
|     }; | ||||
|     "/nix" = { | ||||
|       device = "/dev/disk/by-uuid/50617edf-e788-49cc-9e0c-85a2f90a5550"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=nix"]; | ||||
|     }; | ||||
|     "/persist" = { | ||||
|       device = "/dev/disk/by-uuid/50617edf-e788-49cc-9e0c-85a2f90a5550"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=persist"]; | ||||
|     }; | ||||
|     "/swap" = { | ||||
|       device = "/dev/disk/by-uuid/50617edf-e788-49cc-9e0c-85a2f90a5550"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=swap"]; | ||||
|     }; | ||||
|     "/boot" = { | ||||
|       device = "/dev/disk/by-uuid/B511-09E2"; | ||||
|       fsType = "vfat"; | ||||
|     }; | ||||
|     "/jellyfin" = { | ||||
|       device = "/dev/disk/by-label/jellyfin"; | ||||
|       fsType = "btrfs"; | ||||
|     }; | ||||
|   }; | ||||
|   swapDevices = []; | ||||
| } | ||||
							
								
								
									
										16
									
								
								hosts/ooksmedia/hardware.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								hosts/ooksmedia/hardware.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| { | ||||
|   ooknet.hardware = { | ||||
|     cpu.type = "intel"; | ||||
|     gpu.type = "nvidia"; | ||||
|     features = ["ssd" "audio" "video" "bluetooth"]; | ||||
|     monitors = [ | ||||
|       { | ||||
|         name = "DP-3"; | ||||
|         primary = true; | ||||
|         width = 1920; | ||||
|         height = 1080; | ||||
|         refreshRate = 180; | ||||
|       } | ||||
|     ]; | ||||
|   }; | ||||
| } | ||||
|  | @ -3,7 +3,11 @@ | |||
|   lib, | ||||
|   ... | ||||
| }: { | ||||
|   imports = [./file-system.nix]; | ||||
|   imports = [ | ||||
|     ./file-system.nix | ||||
|     ./hardware.nix | ||||
|   ]; | ||||
| 
 | ||||
|   ooknet = { | ||||
|     host = { | ||||
|       admin = { | ||||
|  | @ -13,34 +17,13 @@ | |||
|       }; | ||||
|     }; | ||||
|     workstation = { | ||||
|       profiles = ["media" "gaming" "communication"]; | ||||
|       profiles = ["media" "communication"]; | ||||
|       environment = "hyprland"; | ||||
|       theme = "minimal"; | ||||
|     }; | ||||
|     console = { | ||||
|       profile = "standard"; | ||||
|     }; | ||||
|     hardware = { | ||||
|       cpu.type = "intel"; | ||||
|       gpu.type = "intel"; | ||||
|       features = [ | ||||
|         "bluetooth" | ||||
|         "backlight" | ||||
|         "battery" | ||||
|         "ssd" | ||||
|         "audio" | ||||
|         "video" | ||||
|       ]; | ||||
|       monitors = [ | ||||
|         { | ||||
|           primary = true; | ||||
|           name = "eDP-1"; | ||||
|           width = 1920; | ||||
|           height = 1080; | ||||
|           workspace = "1"; | ||||
|         } | ||||
|       ]; | ||||
|     }; | ||||
|   }; | ||||
|   boot.kernelPackages = pkgs.linuxKernel.packages.linux_zen; | ||||
|   system.stateVersion = lib.mkDefault "23.11"; | ||||
|  |  | |||
|  | @ -1,63 +1,35 @@ | |||
| # Do not modify this file!  It was generated by ‘nixos-generate-config’ | ||||
| # and may be overwritten by future invocations.  Please make changes | ||||
| # to /etc/nixos/configuration.nix instead. | ||||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   modulesPath, | ||||
|   ... | ||||
| }: { | ||||
|   imports = [ | ||||
|     (modulesPath + "/installer/scan/not-detected.nix") | ||||
|   ]; | ||||
|   boot.initrd.luks.devices."cryptnix".device = "/dev/disk/by-uuid/014d725c-bf13-40a2-a9ab-0dd6185a95f6"; | ||||
| 
 | ||||
|   boot.initrd.availableKernelModules = ["xhci_pci" "nvme" "usb_storage" "sd_mod"]; | ||||
|   boot.initrd.kernelModules = []; | ||||
|   boot.kernelModules = ["kvm-intel"]; | ||||
|   boot.extraModulePackages = []; | ||||
| 
 | ||||
|   fileSystems."/" = { | ||||
|   fileSystems = { | ||||
|     "/" = { | ||||
|       device = "/dev/disk/by-uuid/19e4cf0f-b5ac-4544-a44b-c017b23fd283"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=root"]; | ||||
|     }; | ||||
| 
 | ||||
|   boot.initrd.luks.devices."cryptnix".device = "/dev/disk/by-uuid/014d725c-bf13-40a2-a9ab-0dd6185a95f6"; | ||||
| 
 | ||||
|   fileSystems."/nix" = { | ||||
|     "/nix" = { | ||||
|       device = "/dev/disk/by-uuid/19e4cf0f-b5ac-4544-a44b-c017b23fd283"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=nix"]; | ||||
|     }; | ||||
| 
 | ||||
|   fileSystems."/persist" = { | ||||
|     "/persist" = { | ||||
|       device = "/dev/disk/by-uuid/19e4cf0f-b5ac-4544-a44b-c017b23fd283"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=persist"]; | ||||
|     }; | ||||
| 
 | ||||
|   fileSystems."/swap" = { | ||||
|     "/swap" = { | ||||
|       device = "/dev/disk/by-uuid/19e4cf0f-b5ac-4544-a44b-c017b23fd283"; | ||||
|       fsType = "btrfs"; | ||||
|       options = ["subvol=swap"]; | ||||
|     }; | ||||
| 
 | ||||
|   fileSystems."/boot" = { | ||||
|     "/boot" = { | ||||
|       device = "/dev/disk/by-uuid/F356-6F9C"; | ||||
|       fsType = "vfat"; | ||||
|     }; | ||||
| 
 | ||||
|   }; | ||||
|   swapDevices = []; | ||||
| 
 | ||||
|   # Enables DHCP on each ethernet and wireless interface. In case of scripted networking | ||||
|   # (the default) this is the recommended approach. When using systemd-networkd it's | ||||
|   # still possible to use this option, but it's recommended to use it in conjunction | ||||
|   # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`. | ||||
|   networking.useDHCP = lib.mkDefault true; | ||||
|   # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true; | ||||
|   # networking.interfaces.wlp61s0.useDHCP = lib.mkDefault true; | ||||
|   # networking.interfaces.wwan0.useDHCP = lib.mkDefault true; | ||||
| 
 | ||||
|   powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; | ||||
|   hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										22
									
								
								hosts/ookst480s/hardware.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								hosts/ookst480s/hardware.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| { | ||||
|   ooknet.hardware = { | ||||
|     cpu.type = "intel"; | ||||
|     gpu.type = "intel"; | ||||
|     features = [ | ||||
|       "bluetooth" | ||||
|       "backlight" | ||||
|       "battery" | ||||
|       "ssd" | ||||
|       "audio" | ||||
|       "video" | ||||
|     ]; | ||||
|     monitors = [ | ||||
|       { | ||||
|         primary = true; | ||||
|         name = "eDP-1"; | ||||
|         width = 1920; | ||||
|         height = 1080; | ||||
|       } | ||||
|     ]; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,12 +0,0 @@ | |||
| { | ||||
|   config = { | ||||
|     ooknet.workstation = { | ||||
|       appearance = { | ||||
|         theme = "minimal"; | ||||
|       }; | ||||
|       desktop = { | ||||
|         environment = "hyprland"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,10 +1,8 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkDefault; | ||||
|   inherit (osConfig.ooknet.host) admin; | ||||
| in { | ||||
|   programs.home-manager.enable = true; | ||||
|  | @ -13,7 +11,7 @@ in { | |||
|   home = { | ||||
|     username = admin.name; | ||||
|     homeDirectory = "/home/${config.home.username}"; | ||||
|     stateVersion = mkDefault "22.05"; | ||||
|     stateVersion = "22.05"; | ||||
|     sessionPath = ["${config.home.homeDirectory}/.local/bin"]; | ||||
|   }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,18 +6,21 @@ | |||
|     dataHome = "${config.home.homeDirectory}/.local/share"; | ||||
|     stateHome = "${config.home.homeDirectory}/.local/state"; | ||||
| 
 | ||||
|     userDirs = { | ||||
|     userDirs = let | ||||
|       summit = "${config.home.homeDirectory}/Summit"; | ||||
|     in { | ||||
|       enable = true; | ||||
|       createDirectories = true; | ||||
|       desktop = "${config.home.homeDirectory}/Desktop"; | ||||
|       documents = "${config.home.homeDirectory}/Documents"; | ||||
|       music = "${config.home.homeDirectory}/Media/Music"; | ||||
|       videos = "${config.home.homeDirectory}/Media/Videos"; | ||||
|       pictures = "${config.home.homeDirectory}/Media/Pictures"; | ||||
|       documents = "${summit}/Documents"; | ||||
|       music = "${summit}/Media/Music"; | ||||
|       videos = "${summit}/Media/Videos"; | ||||
|       pictures = "${summit}/Media/Pictures"; | ||||
|       extraConfig = { | ||||
|         XDG_SCREENSHOTS_DIR = "${config.xdg.userDirs.pictures}/Screenshots"; | ||||
|         XDG_CODE_DIR = "${config.home.homeDirectory}/Code"; | ||||
|         XDG_CODE_DIR = "${summit}/code"; | ||||
|         XDG_RECORDINGS_DIR = "${config.xdg.userDirs.videos}/Recordings"; | ||||
|         XDG_NOTES_DIR = "${summit}/notes"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
|  |  | |||
|  | @ -13,10 +13,12 @@ in { | |||
|       lst = "${getExe eza} -T -L 5 --icons --group-directories-first"; | ||||
|       du = "${getExe dust}"; | ||||
|       gitroot = "cd (git rev-parse --show-toplevel)"; | ||||
|       gitedit = "cd (git rev-parse --show-toplevel); nvim -c 'Telescope find_files'; cd -"; | ||||
|     }; | ||||
|     shellAbbrs = { | ||||
|       f = "cd $FLAKE"; | ||||
|       fe = "$EDITOR $FLAKE"; | ||||
|       s = "cd $KUNZEN"; | ||||
|       fe = "$EDITOR (git rev-parse --show-toplevel) -c 'Telescope find_files'"; | ||||
| 
 | ||||
|       nswitch = "${getExe nh} os switch"; | ||||
|     }; | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
|   programs.fish = { | ||||
|     functions = { | ||||
|       fish_user_key_bindings = '' | ||||
|         bind --preset -M insert \cf nvim '+Telescope find_files' $FLAKE | ||||
|         bind --preset -M insert \cf gitedit | ||||
|         bind --preset -M insert \ec fzf_cd_widget | ||||
|       ''; | ||||
|     }; | ||||
|  |  | |||
|  | @ -1,14 +1,72 @@ | |||
| { | ||||
|   lib, | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (hozen) color; | ||||
|   cfg = osConfig.ooknet.console.tools.btop; | ||||
| in { | ||||
|   config = mkIf cfg.enable { | ||||
|     programs.btop = { | ||||
|       enable = true; | ||||
|       settings = { | ||||
|         theme_background = false; | ||||
|         color_theme = "${color.slug}"; | ||||
|         rounded_corners = false; | ||||
|         proc_gradient = false; | ||||
|       }; | ||||
|     }; | ||||
|     xdg.configFile."btop/themes/${color.slug}.theme".text = '' | ||||
|       theme[main_bg]="#${color.layout.body}" | ||||
|       theme[main_fg]="#${color.typography.text}" | ||||
| 
 | ||||
|       theme[title]="#${color.typography.text}" | ||||
|       theme[hi_fg]="#${color.primary.base}" | ||||
|       theme[selected_bg]="#${color.typography.text}" | ||||
|       theme[selected_fg]="#${color.typography.contrast-text}" | ||||
|       theme[inactive_fg]="#${color.typography.contrast-text}" | ||||
| 
 | ||||
|       theme[graph_text]="#${color.typography.text}" | ||||
|       theme[proc_misc]="#${color.green.base}" | ||||
| 
 | ||||
|       theme[cpu_box]="#${color.secondary.base}" | ||||
|       theme[mem_box]="#${color.secondary.base}" | ||||
|       theme[proc_box]="#${color.secondary.base}" | ||||
|       theme[net_box]="#${color.secondary.base}" | ||||
| 
 | ||||
|       theme[temp_start]="#${color.green.base}" | ||||
|       theme[temp_mid]="#${color.orange.base}" | ||||
|       theme[temp_end]="#${color.red.base}" | ||||
| 
 | ||||
|       theme[cpu_start]="#${color.teal.base}" | ||||
|       theme[cpu_mid]="#${color.teal.hard1}" | ||||
|       theme[cpu_end]="#${color.teal.hard2}" | ||||
| 
 | ||||
|       theme[free_start]="#${color.blue.base}" | ||||
|       theme[free_mid]="#${color.blue.hard1}" | ||||
|       theme[free_end]="#${color.blue.hard2}" | ||||
| 
 | ||||
|       theme[available_start]="#${color.orange.base}" | ||||
|       theme[available_mid]="#${color.orange.hard1}" | ||||
|       theme[available_end]="#${color.orange.hard2}" | ||||
| 
 | ||||
|       theme[used_start]="#${color.green.base}" | ||||
|       theme[used_mid]="#${color.green.soft1}" | ||||
|       theme[used_end]="#${color.green.soft2}" | ||||
| 
 | ||||
|       theme[download_start]="#${color.purple.base}" | ||||
|       theme[download_mid]="#${color.purple.hard1}" | ||||
|       theme[download_end]="#${color.purple.hard2}" | ||||
| 
 | ||||
|       theme[upload_start]="#${color.yellow.base}" | ||||
|       theme[upload_mid]="#${color.yellow.hard1}" | ||||
|       theme[upload_end]="#${color.yellow.hard2}" | ||||
| 
 | ||||
|       theme[process_start]="#${color.green.base}" | ||||
|       theme[process_mid]="#${color.orange.base}" | ||||
|       theme[process_end]="#${color.red.base}" | ||||
|     ''; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./bat.nix | ||||
|     ./vale.nix | ||||
|     ./networking.nix | ||||
|     ./btop.nix | ||||
|     ./git.nix | ||||
|     ./fzf.nix | ||||
|  |  | |||
|  | @ -14,4 +14,3 @@ in { | |||
|     home.sessionVariables.EDITOR = mkIf (console.editor == "nvim") "nvim"; | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,54 +1,73 @@ | |||
| { | ||||
|   osConfig, | ||||
|   config, | ||||
|   lib, | ||||
|   pkgs, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) slug palette; | ||||
|   inherit (hozen) color; | ||||
|   inherit (osConfig.ooknet) console; | ||||
|   inherit (osConfig.ooknet.host) admin; | ||||
|   inherit (lib) mkIf; | ||||
| 
 | ||||
|   cfg = osConfig.ooknet.console.tools.zellij; | ||||
| in { | ||||
|   imports = [./options.nix]; | ||||
|   config = mkIf (cfg.enable || console.multiplexer == "zellij") { | ||||
|     programs.zellij = { | ||||
|       enable = true; | ||||
|       settings = { | ||||
|         theme = "${slug}"; | ||||
|         theme = "${color.slug}"; | ||||
|         default_shell = "${admin.shell}"; | ||||
|         default_layout = "default"; | ||||
|         pane_frames = false; | ||||
|         scrollback_editor = "${console.editor}"; | ||||
|         themes = { | ||||
|           "${slug}" = { | ||||
|             fg = "#${palette.base05}"; | ||||
|             bg = "#${palette.base00}"; | ||||
|             black = "#${palette.base00}"; | ||||
|             red = "#${palette.base08}"; | ||||
|             green = "#${palette.base0B}"; | ||||
|             yellow = "#${palette.base0A}"; | ||||
|             blue = "#${palette.base0D}"; | ||||
|             magenta = "#${palette.base0E}"; | ||||
|             cyan = "#${palette.base0C}"; | ||||
|             white = "#${palette.base05}"; | ||||
|             orange = "#${palette.base09}"; | ||||
|           }; | ||||
|           "${color.slug}" = { | ||||
|             fg = "#${color.base05}"; | ||||
|             bg = "#${color.base00}"; | ||||
|             black = "#${color.base00}"; | ||||
|             red = "#${color.base08}"; | ||||
|             green = "#${color.base0B}"; | ||||
|             yellow = "#${color.base0A}"; | ||||
|             blue = "#${color.base0D}"; | ||||
|             magenta = "#${color.base0E}"; | ||||
|             cyan = "#${color.base0C}"; | ||||
|             white = "#${color.base05}"; | ||||
|             orange = "#${color.base09}"; | ||||
|           }; | ||||
|         }; | ||||
|       }; | ||||
| 
 | ||||
|     # Layouts | ||||
|     xdg.configFile = { | ||||
|       # Default layout | ||||
|       "zellij/layouts/default.kdl" = import ./layouts/defaultLayout.nix {inherit pkgs config osConfig;}; | ||||
|       # Layout for bash scripts | ||||
|       "zellij/layouts/script.kdl" = import ./layouts/scriptLayout.nix {inherit pkgs config osConfig;}; | ||||
|       # Layout for configuring my flake | ||||
|       "zellij/layouts/flake.kdl" = import ./layouts/flakeLayout.nix {inherit pkgs config osConfig;}; | ||||
|       # Additional keybinds | ||||
|       "zellij/config.kdl".text = | ||||
|       # layout configurations | ||||
|       layouts = { | ||||
|         default = { | ||||
|           tabs = | ||||
|             #kdl | ||||
|             '' | ||||
|               tab name="terminal" focus=true { | ||||
|                 pane name="term" focus=true | ||||
|               } | ||||
|             ''; | ||||
|         }; | ||||
|         flake = { | ||||
|           tabs = | ||||
|             # kdl | ||||
|             '' | ||||
|               tab name="terminal" focus=true { | ||||
|                 pane name="term" cwd="$FLAKE" focus=true | ||||
|               } | ||||
|               tab name="editor" { | ||||
|                 pane name="edit" edit="$FLAKE" | ||||
|               } | ||||
|               tab name="git" { | ||||
|                 pane name="git" cwd="$FLAKE" command="lazygit" | ||||
|               } | ||||
|             ''; | ||||
|         }; | ||||
|       }; | ||||
| 
 | ||||
|       # keybind configuration | ||||
|       extraSettings = | ||||
|         # kdl | ||||
|         '' | ||||
|           keybinds clear-defaults=true { | ||||
|  |  | |||
|  | @ -1,62 +0,0 @@ | |||
| { | ||||
|   pkgs, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) palette; | ||||
| in { | ||||
|   text = | ||||
|     # kdl | ||||
|     '' | ||||
|       layout { | ||||
|         default_tab_template { | ||||
|           pane size=2 borderless=true { | ||||
|             plugin location="file:${pkgs.zjstatus}/bin/zjstatus.wasm" { | ||||
|               format_left  "{mode}" | ||||
|               format_right "{session} {command_git_branch} {datetime}" | ||||
|               format_center "#[fg=#${palette.base0D},bold] {tabs}" | ||||
|               format_space "" | ||||
| 
 | ||||
|               border_enabled  "true" | ||||
|               border_char     "─" | ||||
|               border_format   "#[fg=#${palette.base05}]{char}" | ||||
|               border_position "bottom" | ||||
| 
 | ||||
|               hide_frame_for_single_pane "true" | ||||
| 
 | ||||
|               mode_normal       "#[fg=#${palette.base0D}] " | ||||
|               mode_tmux         "#[fg=#${palette.base0E}] " | ||||
|               mode_pane         "#[fg=#${palette.base08}] " | ||||
|               mode_tab          "#[fg=#${palette.base08}] " | ||||
|               mode_rename_tab   "#[fg=#${palette.base08}] " | ||||
|               mode_rename_pane  "#[fg=#${palette.base08}] " | ||||
|               mode_session      "#[fg=#${palette.base08}] " | ||||
|               mode_locked       "#[fg=#${palette.base05}] " | ||||
|               mode_move         "#[fg=#${palette.base0B}] " | ||||
|               mode_resize       "#[fg=#${palette.base0B}] " | ||||
|               mode_prompt       "#[fg=#${palette.base0A}] " | ||||
|               mode_search       "#[fg=#${palette.base0A}] " | ||||
|               mode_enter_search "#[fg=#${palette.base0A}] " | ||||
| 
 | ||||
|               tab_normal   "#[bg=#${palette.base01}] {name} " | ||||
|               tab_active   "#[bg=#${palette.base02}] {name} " | ||||
|               tab_separator "  " | ||||
| 
 | ||||
|               command_git_branch_command     "git rev-parse --abbrev-ref HEAD" | ||||
|               command_git_branch_format      "#[fg=#${palette.base0C}] {stdout} " | ||||
|               command_git_branch_interval    "10" | ||||
|               command_git_branch_rendermode  "static" | ||||
| 
 | ||||
|               datetime        "#[fg=#${palette.base05},bold] {format} " | ||||
|               datetime_format "%I:%M %p" | ||||
|               datetime_timezone "${osConfig.time.timeZone}" | ||||
|             } | ||||
|           } | ||||
|         children | ||||
|       } | ||||
|         tab name="terminal" focus=true { | ||||
|             pane name="term" focus=true | ||||
|         } | ||||
|       } | ||||
|     ''; | ||||
| } | ||||
|  | @ -1,70 +0,0 @@ | |||
| { | ||||
|   pkgs, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) palette; | ||||
| in { | ||||
|   text = | ||||
|     /* | ||||
|     kdl | ||||
|     */ | ||||
|     '' | ||||
|       layout { | ||||
|         default_tab_template { | ||||
|           pane size=2 borderless=true { | ||||
|             plugin location="file:${pkgs.zjstatus}/bin/zjstatus.wasm" { | ||||
|               format_left  "{mode}" | ||||
|               format_right "{session} {command_git_branch} {datetime}" | ||||
|               format_center "#[fg=#${palette.base0D},bold] {tabs}" | ||||
|               format_space "" | ||||
| 
 | ||||
|               border_enabled  "true" | ||||
|               border_char     "─" | ||||
|               border_format   "#[fg=#${palette.base05}]{char}" | ||||
|               border_position "bottom" | ||||
| 
 | ||||
|               hide_frame_for_single_pane "true" | ||||
| 
 | ||||
|               mode_normal       "#[fg=#${palette.base0D}] " | ||||
|               mode_tmux         "#[fg=#${palette.base0E}] " | ||||
|               mode_pane         "#[fg=#${palette.base08}] " | ||||
|               mode_tab          "#[fg=#${palette.base08}] " | ||||
|               mode_rename_tab   "#[fg=#${palette.base08}] " | ||||
|               mode_rename_pane  "#[fg=#${palette.base08}] " | ||||
|               mode_session      "#[fg=#${palette.base08}] " | ||||
|               mode_locked       "#[fg=#${palette.base05}] " | ||||
|               mode_move         "#[fg=#${palette.base0B}] " | ||||
|               mode_resize       "#[fg=#${palette.base0B}] " | ||||
|               mode_prompt       "#[fg=#${palette.base0A}] " | ||||
|               mode_search       "#[fg=#${palette.base0A}] " | ||||
|               mode_enter_search "#[fg=#${palette.base0A}] " | ||||
| 
 | ||||
|               tab_normal   "#[bg=#${palette.base01}] {name} " | ||||
|               tab_active   "#[bg=#${palette.base02}] {name} " | ||||
|               tab_separator "  " | ||||
| 
 | ||||
|               command_git_branch_command     "git rev-parse --abbrev-ref HEAD" | ||||
|               command_git_branch_format      "#[fg=#${palette.base0C}] {stdout} " | ||||
|               command_git_branch_interval    "10" | ||||
|               command_git_branch_rendermode  "static" | ||||
| 
 | ||||
|               datetime        "#[fg=#${palette.base05},bold] {format} " | ||||
|               datetime_format "%I:%M %p" | ||||
|               datetime_timezone "${osConfig.time.timeZone}" | ||||
|             } | ||||
|           } | ||||
|         children | ||||
|         } | ||||
|         tab name="terminal" focus=true { | ||||
|             pane name="term" cwd="$FLAKE" focus=true | ||||
|         } | ||||
|         tab name="editor" { | ||||
|             pane name="edit" edit="$FLAKE" | ||||
|         } | ||||
|         tab name="git" { | ||||
|             pane name="git" cwd="$FLAKE" command="lazygit" | ||||
|         } | ||||
|       } | ||||
|     ''; | ||||
| } | ||||
|  | @ -1,68 +0,0 @@ | |||
| { | ||||
|   pkgs, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) palette; | ||||
| in { | ||||
|   text = | ||||
|     /* | ||||
|     kdl | ||||
|     */ | ||||
|     '' | ||||
|       layout { | ||||
|         default_tab_template { | ||||
|           pane size=2 borderless=true { | ||||
|             plugin location="file:${pkgs.zjstatus}/bin/zjstatus.wasm" { | ||||
|               format_left  "{mode}" | ||||
|                 format_right "{session} {command_git_branch} {datetime}" | ||||
|                 format_center "#[fg=#${palette.base0D},bold] {tabs}" | ||||
|                 format_space "" | ||||
| 
 | ||||
|                 border_enabled  "true" | ||||
|                 border_char     "─" | ||||
|                 border_format   "#[fg=#${palette.base05}]{char}" | ||||
|                 border_position "bottom" | ||||
| 
 | ||||
|                 hide_frame_for_single_pane "true" | ||||
| 
 | ||||
|                 mode_normal       "#[fg=#${palette.base0D}] " | ||||
|                 mode_tmux         "#[fg=#${palette.base0E}] " | ||||
|                 mode_pane         "#[fg=#${palette.base08}] " | ||||
|                 mode_tab          "#[fg=#${palette.base08}] " | ||||
|                 mode_rename_tab   "#[fg=#${palette.base08}] " | ||||
|                 mode_rename_pane  "#[fg=#${palette.base08}] " | ||||
|                 mode_session      "#[fg=#${palette.base08}] " | ||||
|                 mode_locked       "#[fg=#${palette.base05}] " | ||||
|                 mode_move         "#[fg=#${palette.base0B}] " | ||||
|                 mode_resize       "#[fg=#${palette.base0B}] " | ||||
|                 mode_prompt       "#[fg=#${palette.base0A}] " | ||||
|                 mode_search       "#[fg=#${palette.base0A}] " | ||||
|                 mode_enter_search "#[fg=#${palette.base0A}] " | ||||
| 
 | ||||
|                 tab_normal   "#[bg=#${palette.base01}] {name} " | ||||
|                 tab_active   "#[bg=#${palette.base02}] {name} " | ||||
|                 tab_separator "  " | ||||
| 
 | ||||
|                 command_git_branch_command     "git rev-parse --abbrev-ref HEAD" | ||||
|                 command_git_branch_format      "#[fg=#${palette.base0C}] {stdout} " | ||||
|                 command_git_branch_interval    "10" | ||||
|                 command_git_branch_rendermode  "static" | ||||
| 
 | ||||
|                 datetime        "#[fg=#${palette.base05},bold] {format} " | ||||
|                 datetime_format "%I:%M %p" | ||||
|                 datetime_timezone "${osConfig.time.timeZone}" | ||||
|             } | ||||
|           } | ||||
|           children | ||||
|         } | ||||
|           tab name="edit" focus=true { | ||||
|               pane edit="./" name="edit" focus=true size="85%" borderless=true | ||||
|               pane name="term" focus=false size="15%" borderless=false | ||||
|           } | ||||
|           tab name="git" focus=false { | ||||
|               pane name="git" focus=false command="lazygit" | ||||
|           } | ||||
|       } | ||||
|     ''; | ||||
| } | ||||
							
								
								
									
										115
									
								
								modules/home/console/tools/multiplexer/zellij/options.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								modules/home/console/tools/multiplexer/zellij/options.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,115 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   inputs', | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (hozen) color; | ||||
|   inherit (lib) optionalAttrs mapAttrs' nameValuePair mkIf mkOption; | ||||
|   inherit (lib.types) nullOr lines submodule str attrsOf; | ||||
| 
 | ||||
|   cfg = config.programs.zellij; | ||||
| 
 | ||||
|   mkZellijLayout = { | ||||
|     zjstatus, | ||||
|     icon ? "", | ||||
|     timeZone, | ||||
|     tabs ? '''', | ||||
|   }: | ||||
|   # kdl | ||||
|   '' | ||||
|     layout { | ||||
|       default_tab_template { | ||||
|         pane size=2 borderless=true { | ||||
|           plugin location="file:${zjstatus}" { | ||||
|             format_left  "{mode}" | ||||
|             format_right "{session} {datetime}" | ||||
|             format_center "#[fg=#${color.base0D},bold] {tabs}" | ||||
|             format_space "" | ||||
| 
 | ||||
|             border_enabled  "true" | ||||
|             border_char     "─" | ||||
|             border_format   "#[fg=#${color.base05}]{char}" | ||||
|             border_position "bottom" | ||||
| 
 | ||||
|             hide_frame_for_single_pane "true" | ||||
| 
 | ||||
|             mode_normal       "#[fg=#${color.base0D}]${icon} " | ||||
|             mode_tmux         "#[fg=#${color.base0E}]${icon} " | ||||
|             mode_pane         "#[fg=#${color.base08}]${icon} " | ||||
|             mode_tab          "#[fg=#${color.base08}]${icon} " | ||||
|             mode_rename_tab   "#[fg=#${color.base08}]${icon} " | ||||
|             mode_rename_pane  "#[fg=#${color.base08}]${icon} " | ||||
|             mode_session      "#[fg=#${color.base08}]${icon} " | ||||
|             mode_locked       "#[fg=#${color.base05}]${icon} " | ||||
|             mode_move         "#[fg=#${color.base0B}]${icon} " | ||||
|             mode_resize       "#[fg=#${color.base0B}]${icon} " | ||||
|             mode_prompt       "#[fg=#${color.base0A}]${icon} " | ||||
|             mode_search       "#[fg=#${color.base0A}]${icon} " | ||||
|             mode_enter_search "#[fg=#${color.base0A}]${icon} " | ||||
| 
 | ||||
|             tab_normal   "#[bg=#${color.base01}] {name} " | ||||
|             tab_active   "#[bg=#${color.base02}] {name} " | ||||
|             tab_separator "  " | ||||
| 
 | ||||
|             datetime        "#[fg=#${color.base05},bold] {format} " | ||||
|             datetime_format "%I:%M %p" | ||||
|             datetime_timezone "${timeZone}" | ||||
|           } | ||||
|         } | ||||
|       children | ||||
|       } | ||||
|       ${tabs} | ||||
|     } | ||||
|   ''; | ||||
| 
 | ||||
|   layoutModule = submodule { | ||||
|     options = { | ||||
|       icon = mkOption { | ||||
|         type = str; | ||||
|         description = "Icon to display on the status bar"; | ||||
|         default = ""; | ||||
|       }; | ||||
|       timeZone = mkOption { | ||||
|         type = str; | ||||
|         description = "Timezone for the datetime display"; | ||||
|         default = osConfig.time.timeZone; | ||||
|       }; | ||||
|       zjstatus = mkOption { | ||||
|         type = str; | ||||
|         default = "${inputs'.zjstatus.packages.default}/bin/zjstatus.wasm"; | ||||
|       }; | ||||
|       tabs = mkOption { | ||||
|         type = lines; | ||||
|         default = ''''; | ||||
|         description = "KDL configuration for layouts tabs"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| in { | ||||
|   options.programs.zellij = { | ||||
|     # TODO: turn this into a binds options | ||||
|     extraSettings = mkOption { | ||||
|       type = nullOr lines; | ||||
|       default = null; | ||||
|       description = "Additional settings in KDL format"; | ||||
|     }; | ||||
|     layouts = mkOption { | ||||
|       type = attrsOf layoutModule; | ||||
|       description = "Zellij layouts with zjstatus"; | ||||
|     }; | ||||
|   }; | ||||
|   config = mkIf cfg.enable { | ||||
|     xdg.configFile = | ||||
|       mapAttrs' (name: layout: | ||||
|         nameValuePair "zellij/layouts/${name}.kdl" { | ||||
|           text = mkZellijLayout layout; | ||||
|         }) | ||||
|       cfg.layouts | ||||
|       // optionalAttrs (cfg.extraSettings != null) { | ||||
|         "zellij/config.kdl".text = cfg.extraSettings; | ||||
|       }; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										13
									
								
								modules/home/console/tools/networking.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								modules/home/console/tools/networking.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| {pkgs, ...}: let | ||||
|   inherit (builtins) attrValues; | ||||
| in { | ||||
|   home.packages = attrValues { | ||||
|     inherit | ||||
|       (pkgs) | ||||
|       traceroute | ||||
|       mtr | ||||
|       dig | ||||
|       nmap | ||||
|       ; | ||||
|   }; | ||||
| } | ||||
|  | @ -5,10 +5,13 @@ | |||
| }: let | ||||
|   cfg = osConfig.ooknet.console.tools.starship; | ||||
|   inherit (lib) concatStrings mkIf; | ||||
|   inherit (osConfig.ooknet.host) admin; | ||||
| in { | ||||
|   config = mkIf cfg.enable { | ||||
|     programs.starship = { | ||||
|       enable = true; | ||||
|       enableTransience = admin.shell == "fish"; | ||||
|       enableInteractive = false; | ||||
|       settings = { | ||||
|         format = concatStrings [ | ||||
|           "$username" | ||||
|  | @ -27,6 +30,14 @@ in { | |||
|         directory = { | ||||
|           truncation_length = 0; | ||||
|           truncate_to_repo = true; | ||||
|           substitutions = { | ||||
|             "Documents" = " Documents"; | ||||
|             "Downloads" = "  Downloads"; | ||||
|             "Music" = "  Music"; | ||||
|             "Pictures" = "  Picures"; | ||||
|             "Screenshots" = "  Screenshots"; | ||||
|             "Summit" = " "; | ||||
|           }; | ||||
|         }; | ||||
| 
 | ||||
|         fill = { | ||||
|  | @ -51,9 +62,9 @@ in { | |||
|         elixir.symbol = " "; | ||||
|         elm.symbol = " "; | ||||
|         gcloud.symbol = " "; | ||||
|         git_branch.symbol = " "; | ||||
|         git_branch.symbol = ""; | ||||
|         golang.symbol = " "; | ||||
|         hg_branch.symbol = " "; | ||||
|         hg_branch.symbol = ""; | ||||
|         java.symbol = " "; | ||||
|         julia.symbol = " "; | ||||
|         memory_usage.symbol = " "; | ||||
|  |  | |||
|  | @ -17,30 +17,24 @@ in { | |||
|         bc # Calculator | ||||
| 
 | ||||
|         # file utility | ||||
|          | ||||
|         duf | ||||
|         du-dust | ||||
|         fd | ||||
|         ripgrep | ||||
|         # archive | ||||
|          | ||||
|         zip | ||||
|         unzip | ||||
|         unrar | ||||
|         # file transfer | ||||
|          | ||||
|         rsync | ||||
|         wget | ||||
|         httpie # Better curl | ||||
| 
 | ||||
|         # resource manager | ||||
|          | ||||
|         powertop | ||||
|         #shell scripting | ||||
|          | ||||
|         gum | ||||
|         # audio ctrl | ||||
|          | ||||
|         pamixer | ||||
|         diffsitter # Better diff | ||||
|         jq # JSON pretty printer and manipulator | ||||
|  | @ -49,15 +43,14 @@ in { | |||
|         killall | ||||
|         acpi | ||||
|         # Notifications | ||||
|          | ||||
|         libnotify | ||||
|         # Nix tooling | ||||
|          | ||||
|         alejandra | ||||
|         cachix | ||||
|         ; | ||||
| 
 | ||||
|       #AI | ||||
|       inherit (self'.packages) repopack; | ||||
|       inherit (self'.packages) repomix; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										29
									
								
								modules/home/console/tools/vale.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								modules/home/console/tools/vale.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| {self, ...}: { | ||||
|   imports = [ | ||||
|     self.homeManagerModules.vale | ||||
|   ]; | ||||
|   programs.vale = { | ||||
|     enable = true; | ||||
|     styles = [ | ||||
|       "microsoft" | ||||
|       "write-good" | ||||
|       "alex" | ||||
|       "readability" | ||||
|       "proselint" | ||||
|     ]; | ||||
|     globalSettings = { | ||||
|       MinAlertLevel = "suggestion"; | ||||
|     }; | ||||
|     formatSettings = { | ||||
|       "*.{md,txt,tex}" = { | ||||
|         BasedOnStyles = [ | ||||
|           "proselint" | ||||
|           "alex" | ||||
|           "Readability" | ||||
|           "Microsoft" | ||||
|         ]; | ||||
|         "Microsoft.Acronyms" = "NO"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./qt.nix | ||||
|     ./qt | ||||
|     ./gtk.nix | ||||
|     ./fonts.nix | ||||
|     ./cursor.nix | ||||
|  |  | |||
|  | @ -1,17 +1,22 @@ | |||
| { | ||||
|   osConfig, | ||||
|   pkgs, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance.fonts) monospace regular; | ||||
|   inherit (lib) optionals; | ||||
| in { | ||||
|   fonts.fontconfig.enable = true; | ||||
|   home.packages = [ | ||||
|   home.packages = | ||||
|     [ | ||||
|       monospace.package | ||||
|       regular.package | ||||
| 
 | ||||
|       pkgs.noto-fonts | ||||
|       pkgs.noto-fonts-cjk-sans | ||||
|       pkgs.noto-fonts-emoji | ||||
|   ]; | ||||
|       pkgs.nerd-fonts.symbols-only | ||||
|     ] | ||||
|     ++ optionals (monospace.fallback != null) [monospace.fallback.package]; | ||||
| } | ||||
|  |  | |||
|  | @ -1,11 +1,12 @@ | |||
| { | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
| 
 | ||||
|   gtkCss = import ./gtkCss.nix {inherit osConfig;}; | ||||
|   gtkCss = import ./gtkCss.nix {inherit hozen;}; | ||||
| in { | ||||
|   config = rec { | ||||
|     gtk = { | ||||
|  | @ -30,7 +31,10 @@ in { | |||
|       gtk4.extraConfig.gtk-application-prefer-dark-theme = true; | ||||
|     }; | ||||
| 
 | ||||
|     dconf.settings."org/gnome/desktop/interface".color-scheme = "prefer-dark"; | ||||
|     dconf.settings = { | ||||
|       "org/gnome/desktop/interface".color-scheme = "prefer-dark"; | ||||
|       "org/gtk/Settings/Debug".enable-inspector-keybinding = true; | ||||
|     }; | ||||
| 
 | ||||
|     #TODO: add gtk css configuration | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,94 +1,106 @@ | |||
| {osConfig}: let | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) palette; | ||||
| {hozen}: let | ||||
|   inherit (hozen) color; | ||||
| in | ||||
|   with palette; | ||||
|   #css | ||||
|   /* | ||||
|   css | ||||
|   */ | ||||
|   '' | ||||
| 
 | ||||
|       @define-color accent_color #${green}; | ||||
|       @define-color accent_bg_color #${text}; | ||||
|       @define-color accent_fg_color #${mantle}; | ||||
|       @define-color destructive_color #${blue}; | ||||
|       @define-color destructive_bg_color #${dull-blue}; | ||||
|       @define-color destructive_fg_color #${text}; | ||||
|       @define-color success_color #${cyan}; | ||||
|       @define-color success_bg_color #${green}; | ||||
|       @define-color success_fg_color #${text}; | ||||
|       @define-color warning_color #${yellow}; | ||||
|       @define-color warning_bg_color #${red}; | ||||
|       @define-color warning_fg_color #${text}; | ||||
|       @define-color error_color #${red}; | ||||
|       @define-color error_bg_color #${dull-red}; | ||||
|       @define-color error_fg_color #${text}; | ||||
|       @define-color window_bg_color #${crust}; | ||||
|       @define-color window_fg_color #${text}; | ||||
|       @define-color view_bg_color #${mantle}; | ||||
|       @define-color view_fg_color #${text}; | ||||
|       @define-color sidebar_bg_color #${crust}; | ||||
|       @define-color sidebar_fg_color #${text}; | ||||
|     @define-color accent_color #${color.primary.base}; | ||||
|     @define-color accent_bg_color #${color.primary.soft1}; | ||||
|     @define-color accent_fg_color #${color.layout.menu}; | ||||
| 
 | ||||
|     @define-color destructive_color #${color.blue.base}; | ||||
|     @define-color destructive_bg_color #${color.blue.soft2}; | ||||
|     @define-color destructive_fg_color #${color.typography.text}; | ||||
| 
 | ||||
|     @define-color success_color #${color.success.base}; | ||||
|     @define-color success_bg_color #${color.success.bg}; | ||||
|     @define-color success_fg_color #${color.success.fg}; | ||||
| 
 | ||||
|     @define-color warning_color #${color.warning.base}; | ||||
|     @define-color warning_bg_color #${color.warning.bg}; | ||||
|     @define-color warning_fg_color #${color.warning.fg}; | ||||
| 
 | ||||
|     @define-color error_color #${color.error.base}; | ||||
|     @define-color error_bg_color #${color.error.bg}; | ||||
|     @define-color error_fg_color #${color.error.fg}; | ||||
| 
 | ||||
|     @define-color window_bg_color #${color.layout.menu}; | ||||
|     @define-color window_fg_color #${color.typography.text}; | ||||
| 
 | ||||
|     @define-color view_bg_color #${color.layout.body}; | ||||
|     @define-color view_fg_color #${color.typography.text}; | ||||
| 
 | ||||
|     @define-color sidebar_bg_color #${color.layout.menu}; | ||||
|     @define-color sidebar_fg_color #${color.typography.text}; | ||||
|     @define-color sidebar_backdrop_color @window_bg_color; | ||||
|     @define-color sidebar_shade_color rgba(0, 0, 0, 0.07); | ||||
|     @define-color secondary_sidebar_bg_color @sidebar_bg_color; | ||||
|     @define-color secondary_sidebar_fg_color @sidebar_fg_color; | ||||
|     @define-color secondary_sidebar_backdrop_color @sidebar_backdrop_color; | ||||
|     @define-color secondary_sidebar_shade_color @sidebar_shade_color; | ||||
|       @define-color headerbar_bg_color #${base}; | ||||
|       @define-color headerbar_fg_color #${text}; | ||||
|       @define-color headerbar_border_color #${text}; | ||||
|     @define-color headerbar_bg_color #${color.layout.header}; | ||||
|     @define-color headerbar_fg_color #${color.typography.text}; | ||||
|     @define-color headerbar_border_color #${color.border.base}; | ||||
|     @define-color headerbar_backdrop_color @window_bg_color; | ||||
|     @define-color headerbar_shade_color rgba(0, 0, 0, 0.36); | ||||
|     @define-color card_bg_color rgba(255, 255, 255, 0.08); | ||||
|       @define-color card_fg_color #${text}; | ||||
|     @define-color card_fg_color #${color.typography.text}; | ||||
|     @define-color card_shade_color rgba(0, 0, 0, 0.36); | ||||
|       @define-color dialog_bg_color #${mantle}; | ||||
|       @define-color dialog_fg_color #${text}; | ||||
|       @define-color popover_bg_color #${mantle}; | ||||
|       @define-color popover_fg_color #${text}; | ||||
|     @define-color dialog_bg_color #${color.layout.body}; | ||||
|     @define-color dialog_fg_color #${color.typography.text}; | ||||
|     @define-color popover_bg_color #${color.layout.menu}; | ||||
|     @define-color popover_fg_color #${color.typography.text}; | ||||
|     @define-color shade_color rgba(0,0,0,0.36); | ||||
|     @define-color scrollbar_outline_color rgba(0,0,0,0.5); | ||||
|       @define-color blue_1 #${blue}; | ||||
|       @define-color blue_2 #${blue}; | ||||
|       @define-color blue_3 #${blue}; | ||||
|       @define-color blue_4 #${blue}; | ||||
|       @define-color blue_5 #${blue}; | ||||
|       @define-color green_1 #b8bb26; | ||||
|       @define-color green_2 #b8bb26; | ||||
|       @define-color green_3 #b8bb26; | ||||
|       @define-color green_4 #b8bb26; | ||||
|       @define-color green_5 #b8bb26; | ||||
|       @define-color yellow_1 #fabd2f; | ||||
|       @define-color yellow_2 #fabd2f; | ||||
|       @define-color yellow_3 #fabd2f; | ||||
|       @define-color yellow_4 #fabd2f; | ||||
|       @define-color yellow_5 #fabd2f; | ||||
|       @define-color orange_1 #fe8019; | ||||
|       @define-color orange_2 #fe8019; | ||||
|       @define-color orange_3 #fe8019; | ||||
|       @define-color orange_4 #fe8019; | ||||
|       @define-color orange_5 #fe8019; | ||||
|       @define-color red_1 #fb4934; | ||||
|       @define-color red_2 #fb4934; | ||||
|       @define-color red_3 #fb4934; | ||||
|       @define-color red_4 #fb4934; | ||||
|       @define-color red_5 #fb4934; | ||||
|       @define-color purple_1 #d3869b; | ||||
|       @define-color purple_2 #d3869b; | ||||
|       @define-color purple_3 #d3869b; | ||||
|       @define-color purple_4 #d3869b; | ||||
|       @define-color purple_5 #d3869b; | ||||
|       @define-color brown_1 #d65d0e; | ||||
|       @define-color brown_2 #d65d0e; | ||||
|       @define-color brown_3 #d65d0e; | ||||
|       @define-color brown_4 #d65d0e; | ||||
|       @define-color brown_5 #d65d0e; | ||||
|       @define-color light_1 #${base05}; | ||||
|       @define-color light_2 #${base06}; | ||||
|       @define-color light_3 #${base07}; | ||||
|       @define-color light_4 #${base07}; | ||||
|       @define-color light_5 #${base07}; | ||||
|       @define-color dark_1 #${base00}; | ||||
|       @define-color dark_2 #${base01}; | ||||
|       @define-color dark_3 #${base02}; | ||||
|       @define-color dark_4 #${base03}; | ||||
|       @define-color dark_5 #${base04}; | ||||
|     @define-color blue_1 #${color.blue.base}; | ||||
|     @define-color blue_2 #${color.blue.base}; | ||||
|     @define-color blue_3 #${color.blue.base}; | ||||
|     @define-color blue_4 #${color.blue.base}; | ||||
|     @define-color blue_5 #${color.blue.base}; | ||||
|     @define-color green_1 #${color.green.base}; | ||||
|     @define-color green_2 #${color.green.base}; | ||||
|     @define-color green_3 #${color.green.base}; | ||||
|     @define-color green_4 #${color.green.base}; | ||||
|     @define-color green_5 #${color.green.base}; | ||||
|     @define-color yellow_1 #${color.yellow.base}; | ||||
|     @define-color yellow_2 #${color.yellow.base}; | ||||
|     @define-color yellow_3 #${color.yellow.base}; | ||||
|     @define-color yellow_4 #${color.yellow.base}; | ||||
|     @define-color yellow_5 #${color.yellow.base}; | ||||
|     @define-color orange_1 #${color.orange.base}; | ||||
|     @define-color orange_2 #${color.orange.base}; | ||||
|     @define-color orange_3 #${color.orange.base}; | ||||
|     @define-color orange_4 #${color.orange.base}; | ||||
|     @define-color orange_5 #${color.orange.base}; | ||||
|     @define-color red_1 #${color.red.base}; | ||||
|     @define-color red_2 #${color.red.base}; | ||||
|     @define-color red_3 #${color.red.base}; | ||||
|     @define-color red_4 #${color.red.base}; | ||||
|     @define-color red_5 #${color.red.base}; | ||||
|     @define-color purple_1 #${color.purple.base}; | ||||
|     @define-color purple_2 #${color.purple.base}; | ||||
|     @define-color purple_3 #${color.purple.base}; | ||||
|     @define-color purple_4 #${color.purple.base}; | ||||
|     @define-color purple_5 #${color.purple.base}; | ||||
|     @define-color brown_1 #${color.brown.base}; | ||||
|     @define-color brown_2 #${color.brown.base}; | ||||
|     @define-color brown_3 #${color.brown.base}; | ||||
|     @define-color brown_4 #${color.brown.base}; | ||||
|     @define-color brown_5 #${color.brown.base}; | ||||
|     @define-color light_1 #${color.neutrals."250"}; | ||||
|     @define-color light_2 #${color.neutrals."200"}; | ||||
|     @define-color light_3 #${color.neutrals."150"}; | ||||
|     @define-color light_4 #${color.neutrals."100"}; | ||||
|     @define-color light_5 #${color.neutrals."50"}; | ||||
|     @define-color dark_1 #${color.neutrals."700"}; | ||||
|     @define-color dark_2 #${color.neutrals."750"}; | ||||
|     @define-color dark_3 #${color.neutrals."800"}; | ||||
|     @define-color dark_4 #${color.neutrals."850"}; | ||||
|     @define-color dark_5 #${color.neutrals."900"}; | ||||
| 
 | ||||
|     * { | ||||
|       border-radius: 0; | ||||
|     } | ||||
|   '' | ||||
|  |  | |||
|  | @ -1,16 +0,0 @@ | |||
| {pkgs, ...}: { | ||||
|   qt = { | ||||
|     enable = true; | ||||
|     style.name = "gtk2"; | ||||
|     platformTheme.name = "gtk2"; | ||||
|   }; | ||||
| 
 | ||||
|   home.packages = with pkgs; [ | ||||
|     libsForQt5.qt5.qtwayland | ||||
|     kdePackages.qtwayland | ||||
|     qt6.qtwayland | ||||
|     kdePackages.qqc2-desktop-style | ||||
|     libsForQt5.qtstyleplugins | ||||
|     qt6Packages.qt6gtk2 | ||||
|   ]; | ||||
| } | ||||
							
								
								
									
										426
									
								
								modules/home/workstation/appearance/qt/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										426
									
								
								modules/home/workstation/appearance/qt/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,426 @@ | |||
| { | ||||
|   pkgs, | ||||
|   hozen, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (hozen) color; | ||||
|   mkKvconig = text: lib.generators.toINI {} text; | ||||
|   kvantumSVG = import ./gruv.nix {inherit color;}; | ||||
| 
 | ||||
|   theme = "KvHozen"; | ||||
| in { | ||||
|   imports = [ | ||||
|     ./kdeglobals.nix | ||||
|   ]; | ||||
| 
 | ||||
|   qt = { | ||||
|     enable = true; | ||||
|     platformTheme.name = "qtct"; | ||||
|     style = { | ||||
|       name = "kvantum"; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   xdg.configFile = { | ||||
|     "Kvantum/kvantum.kvconfig".text = mkKvconig { | ||||
|       General = {inherit theme;}; | ||||
|       #Applications."${theme}" = "org.kde.dolphin, dolphin-emu, faster-project-plus"; | ||||
|     }; | ||||
|     "Kvantum/KvHozen/KvHozen.svg".text = kvantumSVG; | ||||
|     "Kvantum/KvHozen/KvHozen.kvconfig".text = mkKvconig { | ||||
|       # docs: <https://github.com/tsujan/Kvantum/blob/master/Kvantum/doc/Theme-Config> | ||||
|       "%General" = { | ||||
|         author = "ooks"; | ||||
|         comment = "Hozen theme using Hozen color scheme"; | ||||
| 
 | ||||
|         # Window/Widget Behavior | ||||
|         respect_DE = true; | ||||
|         x11drag = "menubar_and_primary_toolbar"; | ||||
|         alt_mnemonic = true; | ||||
|         click_behavior = 0; | ||||
|         double_click = false; | ||||
|         inline_spin_indicators = true; | ||||
|         vertical_spin_indicators = false; | ||||
|         spin_button_width = 16; | ||||
|         combo_as_lineedit = true; | ||||
|         combo_menu = true; | ||||
|         hide_combo_checkboxes = true; | ||||
|         combo_focus_rect = true; | ||||
|         groupbox_top_label = true; | ||||
|         button_contents_shift = false; | ||||
|         fill_rubberband = false; | ||||
|         merge_menubar_with_toolbar = true; | ||||
|         toolbutton_style = 1; | ||||
| 
 | ||||
|         # compositing & effects | ||||
|         composite = true; | ||||
|         translucent_windows = true; | ||||
|         reduce_window_opacity = 10; | ||||
|         reduce_menu_opacity = 0; | ||||
|         blurring = false; | ||||
|         popup_blurring = true; | ||||
|         menu_blur_radius = 5; | ||||
|         tooltip_blur_radius = 5; | ||||
|         contrast = 1.00; | ||||
|         intensity = 1.00; | ||||
|         saturation = 1.00; | ||||
| 
 | ||||
|         # animations & visual feedback | ||||
|         animate_states = false; | ||||
|         no_inactiveness = false; | ||||
|         no_window_pattern = false; | ||||
| 
 | ||||
|         # menu configuration | ||||
|         menubar_mouse_tracking = true; | ||||
|         menu_shadow_depth = 7; | ||||
|         tooltip_shadow_depth = 6; | ||||
|         spread_menuitems = true; | ||||
|         submenu_overlap = 0; | ||||
|         spread_progressbar = true; | ||||
| 
 | ||||
|         # scrollbars & sliders | ||||
|         scroll_width = 8; | ||||
|         scroll_min_extent = 36; | ||||
|         scrollbar_in_view = false; | ||||
|         transient_scrollbar = true; | ||||
|         transient_groove = false; | ||||
|         slider_width = 4; | ||||
|         slider_handle_width = 18; | ||||
|         slider_handle_length = 18; | ||||
| 
 | ||||
|         # layout & sizing | ||||
|         layout_spacing = 2; | ||||
|         layout_margin = 4; | ||||
|         small_icon_size = 16; | ||||
|         large_icon_size = 32; | ||||
|         button_icon_size = 16; | ||||
|         toolbar_icon_size = 16; | ||||
| 
 | ||||
|         # widget specific | ||||
|         check_size = 16; | ||||
|         tooltip_delay = -1; | ||||
|         tree_branch_line = true; | ||||
|         progressbar_thickness = 8; | ||||
|       }; | ||||
| 
 | ||||
|       # color configuration | ||||
|       GeneralColors = { | ||||
|         # Base Colors | ||||
|         "window.color" = "#${color.layout.menu}"; | ||||
|         "inactive.window.color" = "#${color.layout.menu}"; | ||||
|         "base.color" = "#${color.layout.body}"; | ||||
|         "inactive.base.color" = "#${color.layout.body}"; | ||||
|         "alt.base.color" = "#${color.layout.body}"; | ||||
|         "button.color" = "#${color.layout.menu}"; | ||||
|         "light.color" = "#${color.secondary.base}"; | ||||
|         "mid.light.color" = "#${color.secondary.soft1}"; | ||||
|         "dark.color" = "#${color.secondary.hard1}"; | ||||
|         "mid.color" = "#${color.secondary.base}"; | ||||
| 
 | ||||
|         # Highlight Colors | ||||
|         "highlight.color" = "#${color.primary.base}"; | ||||
|         "inactive.highlight.color" = "#${color.primary.soft1}"; | ||||
| 
 | ||||
|         # Text Colors | ||||
|         "text.color" = "#${color.typography.text}"; | ||||
|         "inactive.text.color" = "#${color.typography.subtext}"; | ||||
|         "window.text.color" = "#${color.typography.text}"; | ||||
|         "inactive.window.text.color" = "#${color.typography.subtext}"; | ||||
|         "button.text.color" = "#${color.typography.text}"; | ||||
|         "disabled.text.color" = "#${color.typography.subtext}"; | ||||
|         "tooltip.text.color" = "#${color.typography.text}"; | ||||
|         "highlight.text.color" = "#${color.typography.contrast-text}"; | ||||
|         "link.color" = "#${color.blue.base}"; | ||||
|         "link.visited.color" = "#${color.purple.base}"; | ||||
|         "progress.indicator.text.color" = "#${color.typography.text}"; | ||||
|         "progress.inactive.indicator.text.color" = "#${color.typography.subtext}"; | ||||
|       }; | ||||
| 
 | ||||
|       # Widget-Specific Configurations | ||||
|       Hacks = { | ||||
|         transparent_dolphin_view = false; | ||||
|         blur_konsole = true; | ||||
|         transparent_ktitle_label = true; | ||||
|         transparent_menutitle = true; | ||||
|         respect_darkness = true; | ||||
|         force_size_grip = false; | ||||
|         iconless_pushbutton = true; | ||||
|         iconless_menu = false; | ||||
|         disabled_icon_opacity = 100; | ||||
|         normal_default_pushbutton = true; | ||||
|         tint_on_mouseover = 0; | ||||
|         blur_translucent = true; | ||||
|         kinetic_scrolling = false; | ||||
|         middle_click_scroll = false; | ||||
|         no_selection_tint = false; | ||||
|       }; | ||||
| 
 | ||||
|       # Button Configuration | ||||
|       PanelButtonCommand = { | ||||
|         frame = true; | ||||
|         "frame.element" = "button"; | ||||
|         "frame.expanded" = true; | ||||
|         interior = true; | ||||
|         "interior.element" = "button"; | ||||
|         "indicator.size" = 8; | ||||
|         "text.normal.color" = "#${color.typography.text}"; | ||||
|         "text.focus.color" = "#${color.typography.text}"; | ||||
|         "text.press.color" = "#${color.typography.text}"; | ||||
|         "text.toggle.color" = "#${color.typography.text}"; | ||||
|         "text.shadow" = false; | ||||
|         "text.margin" = 1; | ||||
|         "text.iconspacing" = 4; | ||||
|         "frame.expansion" = 6; | ||||
|       }; | ||||
| 
 | ||||
|       PanelButtonTool = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|       }; | ||||
| 
 | ||||
|       # Window Frames | ||||
|       GenericFrame = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         frame = true; | ||||
|         "frame.element" = "common"; | ||||
|         interior = false; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|       }; | ||||
| 
 | ||||
|       # menu configuration | ||||
|       Menu = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.element" = "menu"; | ||||
|         "interior.element" = "menu"; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|       }; | ||||
| 
 | ||||
|       MenuItem = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         frame = true; | ||||
|         interior = true; | ||||
|         "interior.element" = "menuitem"; | ||||
|         "indicator.size" = 8; | ||||
|         "text.focus.color" = "#${color.typography.text}"; | ||||
|         "text.press.color" = "#${color.typography.text}"; | ||||
|       }; | ||||
| 
 | ||||
|       MenuBarItem = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "interior.element" = "menubaritem"; | ||||
|         frame = false; | ||||
|         "text.margin.top" = 3; | ||||
|         "text.margin.bottom" = 3; | ||||
|         "text.margin.left" = 5; | ||||
|         "text.margin.right" = 5; | ||||
|       }; | ||||
| 
 | ||||
|       MenuBar = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.element" = "menubar"; | ||||
|         "interior.element" = "menubar"; | ||||
|         "frame.bottom" = 0; | ||||
|         "text.normal.color" = "#${color.typography.text}"; | ||||
|       }; | ||||
| 
 | ||||
|       # Scrollbars | ||||
|       ScrollbarSlider = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         frame = true; | ||||
|         interior = false; | ||||
|         "frame.element" = "scrollbarslider"; | ||||
|         "indicator.element" = "grip"; | ||||
|         "indicator.size" = 13; | ||||
|         "frame.left" = 6; | ||||
|         "frame.right" = 6; | ||||
|         "frame.top" = 6; | ||||
|         "frame.bottom" = 6; | ||||
|       }; | ||||
| 
 | ||||
|       ScrollbarGroove = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         interior = false; | ||||
|         frame = false; | ||||
|       }; | ||||
| 
 | ||||
|       # Sliders | ||||
|       Slider = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         frame = false; | ||||
|         "interior.element" = "slider"; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|       }; | ||||
| 
 | ||||
|       SliderCursor = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         frame = false; | ||||
|         "interior.element" = "slidercursor"; | ||||
|       }; | ||||
| 
 | ||||
|       # Progress Bars | ||||
|       Progressbar = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.element" = "progress"; | ||||
|         "interior.element" = "progress"; | ||||
|         "text.margin" = 0; | ||||
|         "text.normal.color" = "#${color.typography.text}"; | ||||
|         "text.focus.color" = "#${color.typography.text}"; | ||||
|         "text.press.color" = "#${color.typography.contrast-text}"; | ||||
|         "text.toggle.color" = "#${color.typography.contrast-text}"; | ||||
|       }; | ||||
| 
 | ||||
|       ProgressbarContents = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         frame = true; | ||||
|         "frame.element" = "progress-pattern"; | ||||
|         "interior.element" = "progress-pattern"; | ||||
|       }; | ||||
| 
 | ||||
|       # Tabs | ||||
|       TabBarFrame = { | ||||
|         inherits = "GenericFrame"; | ||||
|         frame = true; | ||||
|         "frame.element" = "tabBarFrame"; | ||||
|         interior = false; | ||||
|         "frame.top" = 4; | ||||
|         "frame.bottom" = 4; | ||||
|         "frame.left" = 4; | ||||
|         "frame.right" = 4; | ||||
|       }; | ||||
| 
 | ||||
|       TabFrame = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.element" = "tabframe"; | ||||
|         "interior.element" = "tabframe"; | ||||
|       }; | ||||
| 
 | ||||
|       Tab = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "interior.element" = "tab"; | ||||
|         "frame.element" = "tab"; | ||||
|         "frame.top" = 2; | ||||
|         "frame.bottom" = 2; | ||||
|         "frame.left" = 2; | ||||
|         "frame.right" = 2; | ||||
|         "text.margin.left" = 8; | ||||
|         "text.margin.right" = 8; | ||||
|         "text.margin.top" = 2; | ||||
|         "text.margin.bottom" = 2; | ||||
|       }; | ||||
| 
 | ||||
|       # Line Edits | ||||
|       LineEdit = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.element" = "lineedit"; | ||||
|         "interior.element" = "lineedit"; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|         "text.margin.top" = 2; | ||||
|         "text.margin.bottom" = 2; | ||||
|         "text.margin.left" = 2; | ||||
|         "text.margin.right" = 2; | ||||
|       }; | ||||
| 
 | ||||
|       # Combo Boxes | ||||
|       ComboBox = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.element" = "combo"; | ||||
|         "interior.element" = "combo"; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|         "text.margin.top" = 2; | ||||
|         "text.margin.bottom" = 2; | ||||
|         "text.margin.left" = 2; | ||||
|         "text.margin.right" = 2; | ||||
|         "indicator.element" = "carrow"; | ||||
|       }; | ||||
| 
 | ||||
|       # Spinboxes | ||||
|       SpinBox = { | ||||
|         inherits = "ComboBox"; | ||||
|         "frame.element" = "spinbox"; | ||||
|         "interior.element" = "spinbox"; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|         "indicator.element" = "arrow"; | ||||
|         "indicator.size" = 8; | ||||
|       }; | ||||
| 
 | ||||
|       # Group Boxes | ||||
|       GroupBox = { | ||||
|         inherits = "GenericFrame"; | ||||
|         frame = true; | ||||
|         "frame.element" = "group"; | ||||
|         interior = false; | ||||
|         "frame.top" = 4; | ||||
|         "frame.bottom" = 4; | ||||
|         "frame.left" = 4; | ||||
|         "frame.right" = 4; | ||||
|       }; | ||||
| 
 | ||||
|       # tooltips | ||||
|       ToolTip = { | ||||
|         inherits = "PanelButtonCommand"; | ||||
|         "frame.top" = 3; | ||||
|         "frame.bottom" = 3; | ||||
|         "frame.left" = 3; | ||||
|         "frame.right" = 3; | ||||
|         interior = true; | ||||
|         "text.shadow" = false; | ||||
|         "text.margin" = 0; | ||||
|         "frame.element" = "tooltip"; | ||||
|         "interior.element" = "tooltip"; | ||||
|         "frame.expansion" = 0; | ||||
|       }; | ||||
| 
 | ||||
|       # window decorations | ||||
|       Window = { | ||||
|         interior = true; | ||||
|         "interior.element" = "window"; | ||||
|         "frame.element" = "window"; | ||||
|         "frame.top" = 0; | ||||
|         "frame.bottom" = 0; | ||||
|         "frame.left" = 0; | ||||
|         "frame.right" = 0; | ||||
|       }; | ||||
| 
 | ||||
|       Dialog = { | ||||
|         inherits = "Window"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
|   home.packages = with pkgs; [ | ||||
|     libsForQt5.qt5.qtwayland | ||||
|     kdePackages.qtwayland | ||||
|     kdePackages.qqc2-desktop-style | ||||
|     kdePackages.qttools | ||||
|     qt6Packages.qt6gtk2 | ||||
|     qt6.qtwayland | ||||
| 
 | ||||
|     libsForQt5.qtstyleplugins | ||||
|     qt6Packages.qt6gtk2 | ||||
|     libsForQt5.qt5ct | ||||
|     kdePackages.qt6ct | ||||
| 
 | ||||
|     #libsForQt5.breeze-qt5 | ||||
|     #kdePackages.breeze-icons | ||||
|     # kvantum libraries | ||||
|     libsForQt5.qtstyleplugin-kvantum | ||||
|     qt6Packages.qtstyleplugin-kvantum | ||||
|   ]; | ||||
| } | ||||
							
								
								
									
										1960
									
								
								modules/home/workstation/appearance/qt/gruv.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1960
									
								
								modules/home/workstation/appearance/qt/gruv.nix
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										154
									
								
								modules/home/workstation/appearance/qt/kdeglobals.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								modules/home/workstation/appearance/qt/kdeglobals.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,154 @@ | |||
| { | ||||
|   lib, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (hozen) color; | ||||
| in { | ||||
|   xdg.configFile."kdeglobals".text = lib.generators.toINI {} { | ||||
|     "ColorEffects:Disabled" = { | ||||
|       Color = "#${color.layout.menu}"; | ||||
|       ColorAmount = "0.30000000000000004"; | ||||
|       ColorEffect = 2; | ||||
|       ContrastAmount = 0.1; | ||||
|       ContrastEffect = 0; | ||||
|       IntensityAmount = -1; | ||||
|       IntensityEffect = 0; | ||||
|     }; | ||||
|     "ColorEffects:Inactive" = { | ||||
|       ChangeSelectionColor = true; | ||||
|       Color = "#${color.layout.menu}"; | ||||
|       ColorAmount = 0.5; | ||||
|       ColorEffect = 3; | ||||
|       ContrastAmount = 0; | ||||
|       ContrastEffect = 0; | ||||
|       Enable = true; | ||||
|       IntensityAmount = 0; | ||||
|       IntensityEffect = 0; | ||||
|     }; | ||||
|     "Colors:Button" = { | ||||
|       BackgroundAlternate = "#${color.primary.base}"; | ||||
|       BackgroundNormal = "#${color.layout.body}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundInactive = "#${color.typography.subtext}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.typography.text}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     "Colors:Complementary" = { | ||||
|       BackgroundAlternate = "#${color.neutrals."900"}"; | ||||
|       BackgroundNormal = "#${color.layout.dimmed}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundInactive = "#${color.typography.subtext}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.typography.text}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     "Colors:Header" = { | ||||
|       BackgroundAlternate = "#${color.neutrals."900"}"; | ||||
|       BackgroundNormal = "#${color.layout.dimmed}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundInactive = "#${color.typography.subtext}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.typography.text}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     "Colors:Selection" = { | ||||
|       BackgroundAlternate = "#${color.primary.base}"; | ||||
|       BackgroundNormal = "#${color.primary.base}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundInactive = "#${color.layout.dimmed}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.neutrals."900"}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     "Colors:Tooltip" = { | ||||
|       BackgroundAlternate = "#${color.layout.dimmed}"; | ||||
|       BackgroundNormal = "#${color.layout.menu}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundInactive = "#${color.typography.subtext}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.typography.text}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     "Colors:View" = { | ||||
|       BackgroundAlternate = "#${color.layout.dimmed}"; | ||||
|       BackgroundNormal = "#${color.layout.menu}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundInactive = "#${color.typography.subtext}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.typography.text}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     "Colors:Window" = { | ||||
|       BackgroundAlternate = "#${color.neutrals."900"}"; | ||||
|       BackgroundNormal = "#${color.layout.dimmed}"; | ||||
|       DecorationFocus = "#${color.primary.base}"; | ||||
|       DecorationHover = "#${color.layout.body}"; | ||||
|       ForegroundActive = "#${color.orange.base}"; | ||||
|       ForegroundInactive = "#${color.typography.subtext}"; | ||||
|       ForegroundLink = "#${color.primary.base}"; | ||||
|       ForegroundNegative = "#${color.error.base}"; | ||||
|       ForegroundNeutral = "#${color.yellow.base}"; | ||||
|       ForegroundNormal = "#${color.typography.text}"; | ||||
|       ForegroundPositive = "#${color.success.base}"; | ||||
|       ForegroundVisited = "#${color.purple.base}"; | ||||
|     }; | ||||
| 
 | ||||
|     General = { | ||||
|       ColorScheme = "GruvboxMaterial"; | ||||
|       Name = "GruvboxMaterial"; | ||||
|       accentActiveTitlebar = false; | ||||
|       shadeSortColumn = true; | ||||
|     }; | ||||
| 
 | ||||
|     KDE = { | ||||
|       contrast = 4; | ||||
|     }; | ||||
| 
 | ||||
|     WM = { | ||||
|       activeBackground = "#${color.layout.menu}"; | ||||
|       activeBlend = "#${color.typography.text}"; | ||||
|       activeForeground = "#${color.typography.text}"; | ||||
|       inactiveBackground = "#${color.neutrals."900"}"; | ||||
|       inactiveBlend = "#${color.typography.subtext}"; | ||||
|       inactiveForeground = "#${color.typography.subtext}"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -13,6 +13,8 @@ in { | |||
|     browser = mkBind "No browser is enabled"; | ||||
|     terminal = mkBind "No terminal is enabled"; | ||||
|     terminalLaunch = mkBind "Failed to launch tui"; | ||||
|     terminalDropdown = mkBind "Terminal Dropdown not enabled"; | ||||
|     btop = mkBind "Btop binding not set"; | ||||
|     fileManager = mkBind "No file manager is enabled."; | ||||
|     notes = mkBind "No Notes app is enabled"; | ||||
|     discord = mkBind "No Discord app is enabled"; | ||||
|  | @ -20,6 +22,7 @@ in { | |||
|     powerMenu = mkBind "No power menu is enabled"; | ||||
|     lock = mkBind "No screen locker enabled"; | ||||
|     password = mkBind "No password manager enabled"; | ||||
|     quickpass = mkBind "1Password module is not enabled"; | ||||
|     zellijMenu = mkBind "Zellij Menu is not enabled"; | ||||
|     factorio = mkBind "Gaming module is not enabled"; | ||||
|     volume = { | ||||
|  |  | |||
|  | @ -3,12 +3,12 @@ | |||
|   lib, | ||||
|   inputs', | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf mkMerge; | ||||
|   inherit (osConfig.ooknet.host) admin; | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (osConfig.ooknet.workstation) default; | ||||
| 
 | ||||
|   addons = inputs'.firefox-addons.packages; | ||||
|  | @ -45,7 +45,7 @@ in { | |||
|             # onepassword-password-manager # cannot get this to work unfree issue. | ||||
|           ]; | ||||
|           settings = import ./settings/ooksJs.nix; | ||||
|           userChrome = import ./theme/ooksfox.nix {inherit fonts palette;}; | ||||
|           userChrome = import ./theme/ooksfox.nix {inherit fonts hozen;}; | ||||
|           userContent = import ./theme/penguinFoxContent.nix; | ||||
|         }; | ||||
|         profiles.testing = { | ||||
|  |  | |||
|  | @ -1,152 +1,226 @@ | |||
| { | ||||
|   palette, | ||||
|   hozen, | ||||
|   fonts, | ||||
|   ... | ||||
| }: | ||||
| with palette; | ||||
| }: let | ||||
|   inherit (hozen) color; | ||||
| in | ||||
|   #css | ||||
|   '' | ||||
|       /* minimal firefox css ooks  */ | ||||
| 
 | ||||
|       /* ===== Color Variables and Root Styles ===== */ | ||||
|         :root { | ||||
|         /* Fonts */ | ||||
|         --font-mono: ${fonts.monospace.family}, monospace; | ||||
| 
 | ||||
|           --clr-menu: #${color.layout.menu}; | ||||
|           --clr-fg: #${color.typography.text}; | ||||
|           --clr-secondary: #${color.secondary.base}; | ||||
| 
 | ||||
| 
 | ||||
|           --border: 1px solid var(--clr-fg); | ||||
|           --border-active: 1px solid var(--clr-fg); | ||||
|           --border-inactive: 1px solid var(--clr-secondary); | ||||
| 
 | ||||
|           --font-base: ${fonts.monospace.family}; | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|       /* ===== General UI Modifications ===== */ | ||||
|       /* Hide status panel */ | ||||
|       #statuspanel { display: none !important; } | ||||
|         * { | ||||
|           border-radius: 0 !important; | ||||
|           font-family: ${fonts.monospace.family}; | ||||
|         } | ||||
|         #nav-bar { | ||||
|           border: var(--border) !important; | ||||
|           background-color: var(--clr-menu) !important; | ||||
|           margin-top: 0px !important; | ||||
|         } | ||||
|         #urlbar { | ||||
|           text-align: center; | ||||
|         } | ||||
| 
 | ||||
|       /* Remove border radius from menus */ | ||||
|       menupopup, panel { --panel-border-radius: 0px !important; } | ||||
|       menu, menuitem, menucaption { border-radius: 0px !important; } | ||||
| 
 | ||||
|       /* Hide navigation context menu items */ | ||||
|       menupopup > #context-navigation, | ||||
|       menupopup > #context-sep-navigation { display: none !important; } | ||||
| 
 | ||||
|       /* Hide various toolbar buttons */ | ||||
|       #forward-button, | ||||
|       #reload-button, | ||||
|       #stop-button, | ||||
|       #home-button, | ||||
|       #library-button, | ||||
|       #PanelUI-button, | ||||
|       #unified-extensions-button, | ||||
|       #star-button, | ||||
|       #reader-mode-button, | ||||
|       #save-to-pocket-button, | ||||
|       #tracking-protection-icon-container, | ||||
|       #page-action-buttons, | ||||
|       #fxa-toolbar-menu-button, | ||||
|       #identity-box { display: none !important; } | ||||
| 
 | ||||
|       /* Hide customizable UI springs */ | ||||
|       #customizableui-special-spring1, | ||||
|       #customizableui-special-spring2 { display: none; } | ||||
| 
 | ||||
|       /* Hide Personal Toolbar */ | ||||
|       #PersonalToolbar { display: none !important; } | ||||
| 
 | ||||
|       /* ===== URL Bar Styling ===== */ | ||||
| 
 | ||||
|       #urlbar-container { | ||||
|         margin-left: 0 !important; | ||||
|         margin-right: 0 !important; | ||||
|         padding-top: 0 !important; | ||||
|         padding-bottom: 0!important; | ||||
|         .browser-toolbar { | ||||
|           padding-bottom: 1px !important; | ||||
|         } | ||||
| 
 | ||||
|         #urlbar-background { | ||||
|         border: solid 1px !important; | ||||
|         border-radius: 0 !important; | ||||
|         outline: none !important; | ||||
|         background: #${crust} !important; | ||||
|           background-color: transparent !important; | ||||
|           border: unset !important; | ||||
|           box-shadow: unset !important; | ||||
|         } | ||||
| 
 | ||||
|       #navigator-toolbox { | ||||
|         border: none !important; | ||||
|         border-bottom: solid 1px !important;\ | ||||
|         #urlbar-container { | ||||
|          padding: 0 !important; | ||||
|         } | ||||
| 
 | ||||
|       /* Hide URL bar go button */ | ||||
|       .urlbar-go-button { display: none !important; } | ||||
| 
 | ||||
|       /* Remove navigation bar background */ | ||||
|       #nav-bar.browser-toolbar { background: none !important; } | ||||
| 
 | ||||
|       /* Position and style navigation bar */ | ||||
| 
 | ||||
|       #nav-bar { | ||||
|         text-align: center; | ||||
|         min-height: 0 !important; | ||||
|         max-height: 0 !important; | ||||
|         height: 0 !important; | ||||
|         .urlbarView { | ||||
|           text-align: start; | ||||
|           border: var(--border) !important; | ||||
|           margin: 0; | ||||
|           padding: 0 !important; | ||||
|           background-color: var(--clr-menu); | ||||
|         } | ||||
| 
 | ||||
|     /* Expand navigation bar on focus */ | ||||
|       #nav-bar:focus-within { | ||||
|         max-height: 40px !important; | ||||
|         height: 60px !important; | ||||
|         min-height: 15px !important; | ||||
|         .urlbar-input-container { | ||||
|           margin: 0px !important; | ||||
|         } | ||||
| 
 | ||||
|       /* ===== Tab Bar Styling ===== */ | ||||
|       /* Hide title bar buttons and spacer */ | ||||
|       .titlebar-close, | ||||
|       .titlebar-spacer { display: none !important; } | ||||
| 
 | ||||
|       /* Remove tab margin */ | ||||
|       #titlebar { | ||||
|         --proton-tab-block-margin: 0px !important; | ||||
|         --tab-block-margin: 0px !important; | ||||
|         #identity-icon { | ||||
|           color: red !important; | ||||
|         } | ||||
| 
 | ||||
|       /* Remove tab shadows */ | ||||
|       #tabbrowser-tabs:not([noshadowfortests]) .tab-background:is([selected], [multiselected]) { | ||||
|         box-shadow: none !important; | ||||
|         #forward-button, | ||||
|         #stop-button, | ||||
|         #star-button-box, | ||||
|         #translations-button, | ||||
|         #reload-button, | ||||
|         #identity-box, | ||||
|         #tracking-protection-icon-container, | ||||
|         #save-to-pocket-button, | ||||
|         .urlbar-page-action, | ||||
|         .urlbar-go-button, | ||||
|         /* firefox account button */ | ||||
|         #fxa-toolbar-menu-button, | ||||
|         /* hamburger menu icon */ | ||||
|         #PanelUI-button, | ||||
|         #PersonalToolbar | ||||
|         { | ||||
|           display: none; | ||||
|         } | ||||
| 
 | ||||
|       /* Hide tab-related buttons */ | ||||
|       #alltabs-button, | ||||
|         .titlebar-buttonbox-container, | ||||
|         .tab-close-button, | ||||
|         .titlebar-spacer, | ||||
|         #tabs-newtab-button, | ||||
|         #alltabs-button, | ||||
|         #firefox-view-button, | ||||
|       #new-tab-button, | ||||
|       .tab-close-button { display: none !important; } | ||||
| 
 | ||||
|       /* Style tabs */ | ||||
|       tab { | ||||
|         font-family: var(--font-mono); | ||||
|         font-weight: bold; | ||||
|         #new-tab-button { | ||||
|           display: none; | ||||
|         } | ||||
| 
 | ||||
|       /* Set tab and tab bar height */ | ||||
|       #TabsToolbar, .tabbrowser-tab { | ||||
|         max-height: 35px !important; | ||||
|         background: #${crust} !important; | ||||
|         border: none; | ||||
| 
 | ||||
|         #tabbrowser-tabs { | ||||
|           margin: 0 !important; | ||||
|           padding: 0 !important; | ||||
| 
 | ||||
|           margin-inline: 0px !important; | ||||
|           border: unset !important; | ||||
|           border-bottom: var(--border-inactive) !important; | ||||
|         } | ||||
| 
 | ||||
|       /* Center tabs when not overflowing */ | ||||
|       #tabbrowser-arrowscrollbox:not([overflowing]) { | ||||
|         --uc-flex-justify: center; | ||||
|         .tabbrowser-tab { | ||||
|           padding: 3px !important; | ||||
|           padding-left: 3px !important; | ||||
|           --tab-label-mask-size: unset !important; | ||||
|         } | ||||
| 
 | ||||
|       scrollbox[orient="horizontal"] { | ||||
|         justify-content: var(--uc-flex-justify, initial); | ||||
|         .tabbrowser-tab[pinned] { | ||||
|           padding: 3px !important; | ||||
|         } | ||||
| 
 | ||||
|       /* Style selected tabs */ | ||||
|       #tabbrowser-tabs .tabbrowser-tab[selected] .tab-content { | ||||
|         border: solid 1px var(--base05) !important; | ||||
|         color: var(--base07); | ||||
|         background: var(--base02) | ||||
|         #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs])[orient="horizontal"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) { | ||||
|           margin-inline-start: 0px !important; | ||||
|         } | ||||
| 
 | ||||
|       /* Style non-selected tabs */ | ||||
|       tab:not([selected="true"]) { | ||||
|         /* border: solid 1px var(--base05) !important; */ | ||||
|         background: var(--base01) !important; | ||||
|         .tab-stack { | ||||
|           margin-inline: 0 !important; | ||||
|         } | ||||
|         .tab-background { | ||||
|           border-radius: 0px; | ||||
|           border: var(--border-inactive); | ||||
|         } | ||||
|         .tab-background[selected] { | ||||
|          border: var(--border-active); | ||||
|         } | ||||
| 
 | ||||
|         #TabsToolbar { | ||||
|           padding-left: 0px !important; | ||||
|           margin: 0; | ||||
|           padding: 0; | ||||
|         } | ||||
| 
 | ||||
|         /* https://github.com/MrOtherGuy/firefox-csshacks/blob/8957a709e3abb7242fa89339c684f8027e66774c/chrome/autohide_main_toolbar.css#L46 */ | ||||
|     :root{ | ||||
|       --uc-navbar-transform: -40px; | ||||
|       --uc-autohide-toolbar-delay: 1s; | ||||
|       --uc-autohide-toolbar-duration: 100ms; | ||||
|     } | ||||
|     :root[uidensity="compact"]{ --uc-navbar-transform: -34px } | ||||
| 
 | ||||
|     #navigator-toolbox > div{ display: contents; } | ||||
|     :root[sessionrestored] :where(#nav-bar,#PersonalToolbar,#tab-notification-deck,.global-notificationbox){ | ||||
|       transform: translateY(var(--uc-navbar-transform)) | ||||
|     } | ||||
|     :root:is([customizing],[chromehidden*="toolbar"]) :where(#nav-bar,#PersonalToolbar,#tab-notification-deck,.global-notificationbox){ | ||||
|       transform: none !important; | ||||
|       opacity: 1 !important; | ||||
|     } | ||||
| 
 | ||||
|     #nav-bar:not([customizing]){ | ||||
|       opacity: 0; | ||||
|       transition:  transform var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay), opacity var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay) !important; | ||||
|       position: relative; | ||||
|       z-index: 1; | ||||
|     } | ||||
|     #titlebar{ position: relative; z-index: 3 } | ||||
| 
 | ||||
|     #navigator-toolbox, | ||||
|     #sidebar-box, | ||||
|     #sidebar-main, | ||||
|     #sidebar-splitter, | ||||
|     #tabbrowser-tabbox{ | ||||
|       z-index: auto !important; | ||||
|     } | ||||
|     /* Show when toolbox is focused, like when urlbar has received focus */ | ||||
|     #navigator-toolbox:focus-within > .browser-toolbar{ | ||||
|       transform: translateY(0); | ||||
|       opacity: 1; | ||||
|       transition-duration: var(--uc-autohide-toolbar-duration), var(--uc-autohide-toolbar-duration) !important; | ||||
|       transition-delay: 0s !important; | ||||
|     } | ||||
|     /* Show when toolbox is hovered */ | ||||
|     #titlebar:hover ~ .browser-toolbar, | ||||
|     .browser-titlebar:hover ~ :is(#nav-bar,#PersonalToolbar), | ||||
|     #nav-bar:hover, | ||||
|     #nav-bar:hover + #PersonalToolbar{ | ||||
|       transform: translateY(0); | ||||
|       opacity: 1; | ||||
|       transition-duration: var(--uc-autohide-toolbar-duration), var(--uc-autohide-toolbar-duration) !important; | ||||
|       transition-delay: 0s !important; | ||||
|     } | ||||
|     :root[sessionrestored] #urlbar[popover]{ | ||||
|       opacity: 0; | ||||
|       pointer-events: none; | ||||
|       transition: transform var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay), opacity var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay); | ||||
|       transform: translateY(var(--uc-navbar-transform)); | ||||
|     } | ||||
|     #mainPopupSet:has(> [panelopen]:not(#ask-chat-shortcuts,#tab-preview-panel)) ~ toolbox #urlbar[popover], | ||||
|     .browser-titlebar:is(:hover,:focus-within) ~ #nav-bar #urlbar[popover], | ||||
|     #nav-bar:is(:hover,:focus-within) #urlbar[popover], | ||||
|     #urlbar-container > #urlbar[popover]:is([focused],[open]){ | ||||
|       opacity: 1; | ||||
|       pointer-events: auto; | ||||
|       transition-delay: 0ms; | ||||
|       transform: translateY(0); | ||||
|     } | ||||
|     #urlbar-container > #urlbar[popover]:is([focused],[open]){ | ||||
|      transition-duration: 100ms; /* Faster when focused */ | ||||
|     } | ||||
|     /* This ruleset is separate, because not having :has support breaks other selectors as well */ | ||||
|     #mainPopupSet:has(> [panelopen]:not(#ask-chat-shortcuts,#tab-preview-panel)) ~ #navigator-toolbox > .browser-toolbar{ | ||||
|       transition-delay: 33ms !important; | ||||
|       transform: translateY(0); | ||||
|       opacity: 1; | ||||
|     } | ||||
|     /* If tabs are in sidebar then nav-bar doesn't normally have its own background - so we nee to add it back */ | ||||
|     #nav-bar.browser-titlebar{ | ||||
|       background: inherit; | ||||
|     } | ||||
|     #toolbar-menubar:not([autohide="true"]) ~ #nav-bar.browser-titlebar{ | ||||
|       background-position-y: -28px; /* best guess, could vary */ | ||||
|       border-top: none !important; | ||||
|     } | ||||
| 
 | ||||
|     /* Bookmarks toolbar needs so extra rules */ | ||||
|     #PersonalToolbar{ transition: transform var(--uc-autohide-toolbar-duration) ease var(--uc-autohide-toolbar-delay) !important; position: relative; z-index: 1 } | ||||
| 
 | ||||
|     /* Move up the content view */ | ||||
|     :root[sessionrestored]:not([inFullscreen],[chromehidden~="toolbar"]) > body > #browser{ margin-top: var(--uc-navbar-transform); } | ||||
|   '' | ||||
|  |  | |||
|  | @ -1,11 +1,12 @@ | |||
| { | ||||
|   lib, | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (hozen) color; | ||||
|   inherit (osConfig.ooknet.workstation) default; | ||||
|   cfg = osConfig.ooknet.workstation.programs.firefox; | ||||
| in { | ||||
|  | @ -55,17 +56,17 @@ in { | |||
|         '' | ||||
|           :root { | ||||
|             --font: ${fonts.monospace.family}; | ||||
|             --bg: #${palette.base00}; | ||||
|             --fg: #${palette.base05}; | ||||
|             --red: #${palette.base08}; | ||||
|             --green: #${palette.base0B}; | ||||
|             --blue: #${palette.base0D}; | ||||
|             --yellow: #${palette.base0A}; | ||||
|             --purple: #${palette.base0E}; | ||||
|             --orange: #${palette.base09}; | ||||
|             --cyan: #${palette.base0C}; | ||||
|             --comment: #${palette.base04}; | ||||
|             --selectedline: #${palette.base02}; | ||||
|             --bg: #${color.layout.menu}; | ||||
|             --fg: #${color.typography.text}; | ||||
|             --red: #${color.red.base}; | ||||
|             --green: #${color.green.base}; | ||||
|             --blue: #${color.blue.base}; | ||||
|             --yellow: #${color.yellow.base}; | ||||
|             --purple: #${color.purple.base}; | ||||
|             --orange: #${color.orange.base}; | ||||
|             --cyan: #${color.teal.base}; | ||||
|             --comment: #${color.typography.subtext}; | ||||
|             --selectedline: #${color.secondary.base}; | ||||
| 
 | ||||
| 
 | ||||
|             --tridactyl-fg: var(--fg); | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./vesktop | ||||
|     ./equicord | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,4 @@ | |||
| { | ||||
|   #imports = [./options.nix]; | ||||
|   #programs.equicord.enable = true; | ||||
| } | ||||
							
								
								
									
										710
									
								
								modules/home/workstation/communication/equicord/options.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										710
									
								
								modules/home/workstation/communication/equicord/options.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,710 @@ | |||
| { | ||||
|   lib, | ||||
|   pkgs, | ||||
|   config, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf mkOption mkEnableOption mkPackageOption; | ||||
|   inherit (lib.types) listOf str int enum numbers oneOf bool strMatching; | ||||
|   mkBoolOption = default: description: | ||||
|     mkOption { | ||||
|       type = bool; | ||||
|       inherit default description; | ||||
|     }; | ||||
| 
 | ||||
|   mkLabelOption = default: | ||||
|     mkOption { | ||||
|       type = str; | ||||
|       inherit default; | ||||
|       description = "${default} label"; | ||||
|     }; | ||||
| 
 | ||||
|   mkEquibopSelect = attr: v: attr.${v}; | ||||
|   listToString = sep: list: builtins.concatStringsSep sep list; | ||||
| 
 | ||||
|   rgbValue = ''([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])''; | ||||
|   rgbDecimal = strMatching ''${rgbValue}, *${rgbValue}, *${rgbValue}''; | ||||
|   hexColor = strMatching "#[[:xdigit:]]{6}"; | ||||
| 
 | ||||
|   mkHexColorOption = name: | ||||
|     mkOption { | ||||
|       type = oneOf [hexColor (enum [""])]; | ||||
|       default = ""; | ||||
|       description = "${name} color in hex format"; | ||||
|       example = "#ea6962"; | ||||
|     }; | ||||
| 
 | ||||
|   cfg = config.programs.equicord; | ||||
| in { | ||||
|   options.programs.equicord = { | ||||
|     enable = mkEnableOption "Enable Equicord, for of Vencord"; | ||||
|     package = mkPackageOption pkgs "equibop" { | ||||
|       default = "equibop"; | ||||
|       example = pkgs.equicord; | ||||
|     }; | ||||
|     settings = { | ||||
|       autoUpdate = mkEnableOption "Enable auto updating for Equicord" // {default = true;}; | ||||
|       autoUpdateNotification = mkEnableOption "Notify when Equicord automatically updates"; | ||||
|       useQuickCss = mkEnableOption "Enable custom CSS"; | ||||
|       themeLinks = mkOption { | ||||
|         type = listOf str; | ||||
|         default = []; | ||||
|         description = "List of Discord CSS themes to install via link"; | ||||
|         example = ["https://refact0r.github.io/midnight-discord/midnight.css"]; | ||||
|       }; | ||||
|       enabledThemes = mkOption { | ||||
|         type = listOf str; | ||||
|         default = []; | ||||
|         description = "List of themes to enable from XDG_CONFIG_HOME/equibop/themes"; | ||||
|       }; | ||||
|       enableReactDevtools = mkEnableOption "Enable react dev tools extension"; | ||||
|       frameless = mkEnableOption "Enable frameless mode"; | ||||
|       transparent = mkEnableOption "Enable transparent mode. Requires a theme that supports transparency"; | ||||
|       disableMinSize = mkEnableOption "Disable minimum window size"; | ||||
|       notifications = { | ||||
|         timeout = mkOption { | ||||
|           type = int; | ||||
|           default = 5000; | ||||
|           description = "Notification timeout in ms, set to 0 to never automatically time out"; | ||||
|           example = 0; | ||||
|         }; | ||||
|         position = mkOption { | ||||
|           type = enum ["bottom-right" "top-right"]; | ||||
|           default = "bottom-right"; | ||||
|           description = "Position of notifications"; | ||||
|           example = "top-right"; | ||||
|         }; | ||||
|         useNative = mkOption { | ||||
|           type = enum ["always" "never" "not-focused"]; | ||||
|           default = "not-focused"; | ||||
|           description = "When should notifications be used"; | ||||
|           example = "always"; | ||||
|         }; | ||||
|         logLimit = mkOption { | ||||
|           type = int; | ||||
|           default = 50; | ||||
|           description = '' | ||||
|             The amount of notifications to save in the log until old ones are removed. | ||||
|             Set to 0 to disable log. Set to 0 to to disable notification log and 200 to | ||||
|             never automatically remove old notifcations | ||||
|           ''; | ||||
|         }; | ||||
|       }; | ||||
|       plugins = { | ||||
|         # API plugins | ||||
|         ChatInputButtonsAPI.enabled = mkBoolOption true "Chat Input API"; | ||||
|         CommandsAPI.enabled = mkBoolOption true ""; | ||||
|         DynamicImageModalAPI.enabled = mkBoolOption false ""; | ||||
|         MemberListDecoratorsAPI.enabled = mkBoolOption false ""; | ||||
|         MessageAccessoriesAPI.enabled = mkBoolOption true ""; | ||||
|         MessageDecorationsAPI.enabled = mkBoolOption false ""; | ||||
|         MessageEventsAPI.enabled = mkBoolOption false ""; | ||||
|         MessageUpdaterAPI.enabled = mkBoolOption false ""; | ||||
|         ServerListAPI.enabled = mkBoolOption false ""; | ||||
|         UserSettingsAPI.enabled = mkBoolOption true ""; | ||||
| 
 | ||||
|         AccountPanelServerProfile = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Right click your account panel in the bottom left to | ||||
|             view your profile in the current server. | ||||
|           ''; | ||||
|           prioritizeServerProfile = mkEnableOption '' | ||||
|             Prioritize Server Profile when left clicking your account panel. | ||||
|           ''; | ||||
|         }; | ||||
|         AllCallTimers = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Add call timer to all users in a server voice channel. | ||||
|           ''; | ||||
|           showWithoutHover = mkEnableOption '' | ||||
|             Always show the timer without needing to hover. | ||||
|           ''; | ||||
|           showRoleColor = mkEnableOption '' | ||||
|             Show the users role color. | ||||
|           ''; | ||||
|           trackSelf = mkEnableOption '' | ||||
|             Also track yourself. | ||||
|           ''; | ||||
|           showSeconds = mkEnableOption '' | ||||
|             Show seconds in the timer. | ||||
|           ''; | ||||
|           format = mkOption { | ||||
|             type = enum ["stopwatch" "human"]; | ||||
|             default = "human"; | ||||
|             description = '' | ||||
|               Compact or human readable format: | ||||
|               - stopwatch: 30:23:00:42 | ||||
|               - human: 30d 23h 00m 42s | ||||
|             ''; | ||||
|           }; | ||||
|           watchLargeGuilds = mkEnableOption '' | ||||
|             Track users in large guild. Warning this may cause lag if your in a lot | ||||
|             of guilds with active voice users. | ||||
|           ''; | ||||
|         }; | ||||
|         AltKrispSwitch.enabled = mkEnableOption '' | ||||
|           Makes the Noise Suppression Popout switch between None and Krisp instead | ||||
|           of Krisp and Strandard. | ||||
|         ''; | ||||
|         AlwaysAnimate = { | ||||
|           enable = mkEnableOption '' | ||||
|             Animates anything that can be animated. | ||||
|           ''; | ||||
|         }; | ||||
|         AlwaysExpandRoles = { | ||||
|           enabled = mkEnableOption "Always expand the role list in profile popouts."; | ||||
|           hideArrow = mkEnableOption "Hide Arrows."; | ||||
|         }; | ||||
|         AlwaysTrust = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Remove the untrusted domain and suspicious file popup. | ||||
|           ''; | ||||
|           domain = mkEnableOption '' | ||||
|             Remove the untrusted domain popup when opening links. | ||||
|           ''; | ||||
|           file = mkEnableOption '' | ||||
|             Remove the "Potentially Dangerous Download" popup when opening links. | ||||
|           ''; | ||||
|         }; | ||||
|         AmITyping.enabled = mkEnableOption "Shows you if other people can see you typing."; | ||||
|         Anammox = { | ||||
|           enabled = mkEnableOption '' | ||||
|             A microbial process that plays an important part in the nitrogen cycle. | ||||
|             Hide various discord nitro excusive features. | ||||
|           ''; | ||||
|           dms = mkEnableOption "Remove shops above DMs list"; | ||||
|           billing = mkEnableOption "Remove billings settings"; | ||||
|           gift = mkEnableOption "Remove gift button"; | ||||
|           emojiList = mkEnableOption "Remove unavailable catagories from the emoji picker"; | ||||
|         }; | ||||
|         AnonymiseFileNames = { | ||||
|           enabled = mkEnableOption "Anonymise uploaded file names"; | ||||
|           anonymiseByDefault = mkEnableOption "Whether to anonymise file names by default"; | ||||
|           method = mkOption { | ||||
|             type = enum ["random characters" "consistant" "timestamp"]; | ||||
|             default = "random characters"; | ||||
|             apply = mkEquibopSelect { | ||||
|               "random characters" = 0; | ||||
|               "consistent" = 1; | ||||
|               "timestamp" = 2; | ||||
|             }; | ||||
|           }; | ||||
|           randomizedLength = mkOption { | ||||
|             type = int; | ||||
|             default = 7; | ||||
|             description = "Random character length."; | ||||
|           }; | ||||
|           consistent = mkOption { | ||||
|             type = str; | ||||
|             default = "image"; | ||||
|             description = "Consistant filename."; | ||||
|             # doesn't appear to be an option you can change | ||||
|             readOnly = true; | ||||
|           }; | ||||
|         }; | ||||
|         AtSomeone.enabled = mkEnableOption "Mention someone randomly."; | ||||
|         BANger = { | ||||
|           enabled = mkEnableOption "Replaces the GIF i nthe ban dialogue with a custom one."; | ||||
|           source = mkOption { | ||||
|             type = str; | ||||
|             default = ""; | ||||
|             description = "Source to replace ban GIF with (video or GIF)."; | ||||
|             example = "https://i.imgur.com/wp5q52C.mp4"; | ||||
|           }; | ||||
|         }; | ||||
|         BannersEverywhere = { | ||||
|           enabled = mkEnableOption "Display banners in the member list."; | ||||
|           animate = mkEnableOption "Animate banners."; | ||||
|         }; | ||||
|         BetterActivities = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Shows activity icons in the member list and allows showing all activities. | ||||
|           ''; | ||||
|           memberList = mkEnableOption "Show activity icons in the member list"; | ||||
|           iconSize = mkOption { | ||||
|             type = int; | ||||
|             default = 15; | ||||
|             description = "Size of the activity icons."; | ||||
|           }; | ||||
|           specialFirst = mkEnableOption "Show special activities first (Currently Spotify and Twitch)."; | ||||
|           renderGifs = mkEnableOption "Allow rendering GIFs."; | ||||
|           showAppDescription = mkEnableOption "Show application descriptions in the activity tooltip."; | ||||
|           userPopout = mkEnableOption "Show all activities in the profile popout/sidebar."; | ||||
|           allActivitiesStyle = mkOption { | ||||
|             type = enum ["corousel" "list"]; | ||||
|             default = "corousel"; | ||||
|             description = "Style for showing all activities"; | ||||
|           }; | ||||
|         }; | ||||
|         BetterAudioPlayer = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Adds a spectograph and oscilloscope visualizer to audio attachment players. | ||||
|           ''; | ||||
|           oscilloscope = mkEnableOption "Enable oscilloscope visualizer."; | ||||
|           spectograph = mkEnableOption "Enable spectograph visualizer."; | ||||
|           oscilloscopeSolidColor = mkEnableOption "Use colid color for oscilloscope."; | ||||
|           oscilloscopeColor = mkOption { | ||||
|             # not 100% sure if a hex color value can be set via json here | ||||
|             type = rgbDecimal; | ||||
|             default = "255, 255, 255"; | ||||
|             description = "RGB Color for the oscilloscope."; | ||||
|             example = "10, 200, 130"; | ||||
|           }; | ||||
|           spectographSolidColor = mkEnableOption "Use solid color for spectograph."; | ||||
|           spectographColor = mkOption { | ||||
|             type = rgbDecimal; | ||||
|             default = "33, 150, 243"; | ||||
|             example = "10, 200, 130"; | ||||
|           }; | ||||
|         }; | ||||
|         BetterBanReasons = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Create custom reasons to use in the Discord Ban modal, and/or | ||||
|             show a test input by default instead of the options. | ||||
|           ''; | ||||
|           reasons = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = "List of ban reasons"; | ||||
|             example = [ | ||||
|               "uses nix" | ||||
|               "arch user" | ||||
|             ]; | ||||
|           }; | ||||
|           textInputDefault = mkEnableOption '' | ||||
|             Shows a text input instead of a select menu by default. (Equivalent to clicking the "Other" option). | ||||
|           ''; | ||||
|         }; | ||||
|         BetterFolders = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Shows server folders on dedicated sidebar and adds folder related improvements. | ||||
|           ''; | ||||
|           sidebar = mkEnableOption "Display servers from folder on dedicated sidebar."; | ||||
|           sidebarAnim = mkEnableOption "Animate opening the folder sidebar."; | ||||
|           closeAllFolders = mkEnableOption "Close all folders when selecting a server not in a folder."; | ||||
|           closeOthers = mkEnableOption "Close other folders when opening a folder."; | ||||
|           forceOpen = mkEnableOption "Force a folder to open when switching to a server of that folder."; | ||||
|           keepIcons = mkEnableOption '' | ||||
|             Keep showing guild icons in the primary guild bar folder when it's open | ||||
|             in the BetterFolders sidebar. | ||||
|           ''; | ||||
|           showFoldersIcon = mkOption { | ||||
|             type = enum ["never" "always" "when more than one folder is expanded"]; | ||||
|             default = "always"; | ||||
|             description = '' | ||||
|               Show the folder icon above the folder guilds in the BetterFolders sidebar. | ||||
|               Available options: | ||||
|               - "never" | ||||
|               - "always" | ||||
|               - "when more than one folder is expanded" | ||||
|             ''; | ||||
|             apply = mkEquibopSelect { | ||||
|               "never" = 0; | ||||
|               "always" = 1; | ||||
|               "when more than one folder is expanded" = 2; | ||||
|             }; | ||||
|           }; | ||||
|         }; | ||||
|         BetterGifAltText = mkEnableOption '' | ||||
|           Change GIF alt text from simply being 'GIF' to containing the gif tags/filename. | ||||
|         ''; | ||||
|         BetterGifPicker = mkEnableOption "Makes the GIF picker open the favourite category by default"; | ||||
|         BetterInvites = mkEnableOption '' | ||||
|           See invites expiration date, view inviter profile and preview discoverable servers before joining | ||||
|           by clicking their name. | ||||
|         ''; | ||||
|         BetterNotesBox = { | ||||
|           enabled = mkEnableOption "Hide notes or disable spellcheck."; | ||||
|           hide = mkEnableOption "Hide notes."; | ||||
|           noSpellCheck = mkEnableOption "Disable spellcheck in notes"; | ||||
|         }; | ||||
|         BetterQuickReact = { | ||||
|           enabled = mkEnableOption "Improves the quick react buttons in the message context menu"; | ||||
|           frequentEmojis = mkEnableOption "Use frequently used emojis instead of favorite emojis"; | ||||
|           rows = mkOption { | ||||
|             type = numbers.between 1 16; | ||||
|             default = 2; | ||||
|             description = "Rows of quick reactions to display. Number between 1-16"; | ||||
|             example = 4; | ||||
|           }; | ||||
|           columns = mkOption { | ||||
|             type = numbers.between 1 12; | ||||
|             default = 4; | ||||
|             description = "Columns of quick reactions to display. Number betwen 1-12"; | ||||
|             example = 6; | ||||
|           }; | ||||
|           compactMode = mkEnableOption '' | ||||
|             Scales the buttons to 75% of their original scale, whilst increasing the inner emoji to 125% scale. | ||||
|             Emojis will be 93.75% of the original size. Reccomended to have a minimum of 5 columns. | ||||
|           ''; | ||||
|           scroll = mkEnableOption "Enable scrolling the list of emojis"; | ||||
|         }; | ||||
|         BetterRoleContext = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Adds options to copy role color / edit role / view role icon when right clicking roles in | ||||
|             in the user profile | ||||
|           ''; | ||||
|           roleIconFileFormat = mkOption { | ||||
|             type = enum ["webp" "png" "jpg"]; | ||||
|             default = "png"; | ||||
|             description = "File formate to use when viewing role icons"; | ||||
|           }; | ||||
|         }; | ||||
|         BetterRoleDot = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Copy role colour on RoleDot (accessibility setting) click. Also allows using both | ||||
|             RoleDot and coloured names simultaneously. | ||||
|           ''; | ||||
|           bothStyles = mkEnableOption "Show both role dot and coloured names"; | ||||
|           copyRoleColorInProfilePopout = mkEnableOption "Allow click on role dot in profile popout to copy role color"; | ||||
|         }; | ||||
|         BetterSession = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Enhances the sessions (devices) menu. Allows you to view exact timestamps, give each session a | ||||
|             custom name, and receive notifications about new sessions. | ||||
|           ''; | ||||
|           backgroundCheck = mkEnableOption '' | ||||
|             Check for new sessions in the background, and display notifications when they are detected. | ||||
|           ''; | ||||
|           checkInterval = mkOption { | ||||
|             type = int; | ||||
|             default = 20; | ||||
|             description = "How often to check for new sessions in the background (if enabled), in minutes."; | ||||
|           }; | ||||
|         }; | ||||
|         BetterSettings = { | ||||
|           enabled = mkEnableOption "Enhances your settings-menu-opening experience."; | ||||
|           disableFade = mkEnableOption "Disable the crossfade animation."; | ||||
|           organizeMenu = mkEnableOption "Organizes the settings cog context menu into categories."; | ||||
|           eagerLoad = mkEnableOption "Removes the loading delay when opening the menu for the first time."; | ||||
|         }; | ||||
|         BetterUploadButton.enabled = mkEnableOption "Upload with a single click, open menu with right click"; | ||||
|         BetterUserArea.enabled = mkEnableOption '' | ||||
|           Reworks the user area styling to fit more buttons and overall look nicer | ||||
|         ''; | ||||
|         BetterStreamPreview.enabled = mkEnableOption "Allows you to enlarge stream previews"; | ||||
|         BlockKeywords = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Blocks messages containing specific user-defined keywords, as if the user sending them was blocked. | ||||
|           ''; | ||||
|           blockedWords = mkOption { | ||||
|             type = str; | ||||
|             default = ""; | ||||
|             description = "Comma-seperated list of words to block."; | ||||
|             example = "arch,home-manager"; | ||||
|           }; | ||||
|           useRegex = mkEnableOption "Use each value as a regular expression when checking message content (advanced)"; | ||||
|           caseSensitive = mkEnableOption "Whether to use a case sensitive search or not."; | ||||
|           ignoreBlockedMessages = mkEnableOption "Completely ignores (recent) new messages bar"; | ||||
|         }; | ||||
|         BlockKrisp.enabled = mkEnableOption "Prevent Krist from loading"; | ||||
|         BlurNSFW = { | ||||
|           enabled = mkEnableOption "Blur attachments in NSFW channels until hovered."; | ||||
|           blurAmount = mkOption { | ||||
|             type = int; | ||||
|             default = 10; | ||||
|             description = "Blur amount"; | ||||
|           }; | ||||
|         }; | ||||
|         BypassStatus = { | ||||
|           enabled = mkEnableOption '' | ||||
|             Still get notifications from specific sources when in do not disturb mode. | ||||
|             Right-click on users/channels/guilds to set them to bypass do not disturb mode. | ||||
|           ''; | ||||
|           guilds = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = '' | ||||
|               Guilds to let bypass (notified when pinged anywhere in guild). | ||||
|               List of comma seperated guild IDs. | ||||
|             ''; | ||||
|             example = [ | ||||
|               "123451234512345123" | ||||
|               "456456456456456456" | ||||
|             ]; | ||||
|             apply = listToString ","; | ||||
|           }; | ||||
|           channels = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = '' | ||||
|               channels to let bypass (notified when pinged anywhere in channel). | ||||
|               List of . | ||||
|             ''; | ||||
|             example = [ | ||||
|               "123451234512345123" | ||||
|               "456456456456456456" | ||||
|             ]; | ||||
|             apply = listToString ","; | ||||
|           }; | ||||
|           users = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = '' | ||||
|               users to let bypass (notified when pinged anywhere in guild). | ||||
|               List of comma seperated user IDs. | ||||
|             ''; | ||||
|             example = [ | ||||
|               "123451234512345123" | ||||
|               "456456456456456456" | ||||
|             ]; | ||||
|             apply = listToString ","; | ||||
|           }; | ||||
|           notificationSound = mkEnableOption "Whether the notification sound should be played"; | ||||
|           statusToUse = mkOption { | ||||
|             type = enum ["dnd" "invisible" "idle"]; | ||||
|             default = "dnd"; | ||||
|             description = "Status to use for whitelist."; | ||||
|           }; | ||||
|           allowOutsideOfDm = mkEnableOption '' | ||||
|             Allow selected users to bypass status outside of DMs too | ||||
|             (acts like a channel/guild bypass, but it's for all messages sent by the selected users). | ||||
|           ''; | ||||
|         }; | ||||
|         CallTimer = { | ||||
|           enabled = mkEnableOption "Adds a timer to vcs."; | ||||
|           format = mkOption { | ||||
|             type = enum ["human" "stopwatch"]; | ||||
|             default = "human"; | ||||
|             description = "The timer format."; | ||||
|           }; | ||||
|         }; | ||||
|         ChannelBadges = { | ||||
|           enabled = mkEnableOption "Adds badges to channels based on their type."; | ||||
|           oneBadgePerChannel = mkEnableOption "Show only one badge per channel."; | ||||
|           showTextBadge = mkEnableOption "Show Text badge"; | ||||
|           showVoiceBadge = mkEnableOption "Show Voice badge"; | ||||
|           showCategoryBadge = mkEnableOption "Show Category badge"; | ||||
|           showDirectoryBadge = mkEnableOption "Show Directory badge"; | ||||
|           showAnnouncementThreadBadge = mkEnableOption "Show Announcement Thread badge"; | ||||
|           showPublicThreadBadge = mkEnableOption "Show Public Thread badge"; | ||||
|           showPrivateThreadBadge = mkEnableOption "Show Private Thread badge"; | ||||
|           showStageBadge = mkEnableOption "Show Stage badge"; | ||||
|           showAnnouncementBadge = mkEnableOption "Show Announcement badge"; | ||||
|           showForumBadge = mkEnableOption "Show Forum badge"; | ||||
|           showMediaBadge = mkEnableOption "Show Media badge"; | ||||
|           showNSFWBadge = mkEnableOption "Show NSFW badge"; | ||||
|           showLockedBadge = mkEnableOption "Show Locked badge"; | ||||
|           showRulesBadge = mkEnableOption "Show Rules badge"; | ||||
|           showUnknownBadge = mkEnableOption "Show Unknown badge"; | ||||
|           textBadgeLabel = mkLabelOption "Text"; | ||||
|           voiceBadgeLabel = mkLabelOption "Voice"; | ||||
|           categoryBadgeLabel = mkLabelOption "Category"; | ||||
|           announcementBadgeLabel = mkLabelOption "News"; | ||||
|           announcementThreadBadgeLabel = mkLabelOption "News Thread"; | ||||
|           publicThreadBadgeLabel = mkLabelOption "Thread"; | ||||
|           privateThreadBadgeLabel = mkLabelOption "Private Thread"; | ||||
|           stageBadgeLabel = mkLabelOption "Stage"; | ||||
|           directoryBadgeLabel = mkLabelOption "Directory"; | ||||
|           forumBadgeLabel = mkLabelOption "Forum"; | ||||
|           mediaBadgeLabel = mkLabelOption "Media"; | ||||
|           nsfwBadgeLabel = mkLabelOption "NSFW"; | ||||
|           lockedBadgeLabel = mkLabelOption "Locked"; | ||||
|           rulesBadgeLabel = mkLabelOption "Rules"; | ||||
|           unknownBadgeLabel = mkLabelOption "Unknown"; | ||||
|           lockedBadgeColor = mkHexColorOption "Locked badge"; | ||||
|           rulesBadgeColor = mkHexColorOption "Rules badge"; | ||||
|           unknownBadgeColor = mkHexColorOption "Unknown badge"; | ||||
|           nsfwBadgeColor = mkHexColorOption "NSFW badge"; | ||||
|           mediaBadgeColor = mkHexColorOption "Media badge"; | ||||
|           forumBadgeColor = mkHexColorOption "Forum badge"; | ||||
|           directoryBadgeColor = mkHexColorOption "Directory badge"; | ||||
|           stageBadgeColor = mkHexColorOption "Stage badge"; | ||||
|           privateThreadBadgeColor = mkHexColorOption "Private Thread badge"; | ||||
|           publicThreadBadgeColor = mkHexColorOption "Public Thread badge"; | ||||
|           announcementThreadBadgeColor = mkHexColorOption "Announcement Thread badge"; | ||||
|           announcementBadgeColor = mkHexColorOption "Announcement badge"; | ||||
|           categoryBadgeColor = mkHexColorOption "Category badge"; | ||||
|           voiceBadgeColor = mkHexColorOption "Voice badge"; | ||||
|           textBadgeColor = mkHexColorOption "Text Badge"; | ||||
|         }; | ||||
|         # doesn't seem to work for me. May require window decorations? | ||||
|         ChannelTabs.enabled = mkEnableOption '' | ||||
|           Group our commonly visited channels in tabs. Warning: this doesnt appear to be working. | ||||
|         ''; | ||||
|         CharacterCounter = { | ||||
|           enabled = mkEnableOption "Adds a character counter to the chat input."; | ||||
|           colorEffects = mkEnableOption "Turn on or off color effects for getting close to the character limit"; | ||||
|           position = mkEnableOption "Move the character counter to the left side of the chat input"; | ||||
|         }; | ||||
|         CleanChannelName.enabled = mkEnableOption "Remove all emoji and decor from channel names"; | ||||
|         ClearURLs.enabled = mkEnableOption "Remove tracking garbage from URLs"; | ||||
|         ClientSideBlock = { | ||||
|           enabled = mkEnableOption "Allows you to locally hide almost all content from any user"; | ||||
|           usersToBlock = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = "List of User IDs to block"; | ||||
|             example = [ | ||||
|               "123456789" | ||||
|               "987654321" | ||||
|             ]; | ||||
|             apply = listToString ", "; | ||||
|           }; | ||||
|           hideBlockedUser = mkEnableOption "Should blocked users also be hidden everywhere."; | ||||
|           hideBlockedMessages = mkEnableOption "Should messages from blocked users be hidden fully."; | ||||
|           hideEmptyRoles = mkEnableOption "Should role headers be hidden if all of their member are blocked."; | ||||
|           blockedReplyDisplay = mkOption { | ||||
|             type = enum ["displayText" "hideReply"]; | ||||
|             default = "displayText"; | ||||
|             description = '' | ||||
|               What should display instead of the message when someone replies to someone you have hidden. | ||||
|               - "displayText": Display text saying a hidden message was replied to. | ||||
|               - "hideReply": Literally nothing | ||||
|             ''; | ||||
|           }; | ||||
|           guildBlackList = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = "List of guild IDs to disable functionality in"; | ||||
|             apply = listToString ", "; | ||||
|           }; | ||||
|           guildWhiteList = mkOption { | ||||
|             type = listOf str; | ||||
|             default = []; | ||||
|             description = "List of guild IDs to enable functionality in"; | ||||
|             apply = listToString ", "; | ||||
|           }; | ||||
|         }; | ||||
|         ClientTheme = { | ||||
|           enabled = mkEnableOption "Recreation of the old client theme experiment. Add color to your Discord client theme"; | ||||
|           color = mkOption { | ||||
|             type = strMatching "[[:xdigit:]]{6}"; | ||||
|             description = "Themes Color"; | ||||
|             default = "282828"; | ||||
|           }; | ||||
|         }; | ||||
|         ColorSighted.enabled = mkEnableOption "Removes the colorblind-friendly icons from statuses, just like 2015-2017 Discord"; | ||||
|         CommandPalette = { | ||||
|           enabled = mkEnableOption "Allows you to navigate the UI with a keyboard."; | ||||
|           hotkey = mkOption { | ||||
|             # TODO: Regex this | ||||
|             type = listOf str; | ||||
|             default = [ | ||||
|               "control" | ||||
|               "shift" | ||||
|               "p" | ||||
|             ]; | ||||
|             description = "HotKey to toggle the command palette."; | ||||
|             example = [ | ||||
|               "control" | ||||
|               "h" | ||||
|             ]; | ||||
|           }; | ||||
|         }; | ||||
|         ConsoleJanitor = { | ||||
|           enabled = mkEnableOption "Disables annoying console messages/errors"; | ||||
|           disableLoggers = mkEnableOption "Disables Discord loggers"; | ||||
|           disableSpotifyLoggers = mkEnableOption "Disable the Spotify logger, which leaks account information and access token"; | ||||
|           whitlistedLoggers = mkOption { | ||||
|             type = listOf str; | ||||
|             default = [ | ||||
|               "GatewaySocket" | ||||
|               "Routing/Utils" | ||||
|             ]; | ||||
|             description = "List of loggers to allow even if others are hidden."; | ||||
|             apply = listToString "; "; | ||||
|           }; | ||||
|         }; | ||||
|         ConsoleShortcuts.enabled = mkEnableOption '' | ||||
|           Adds shorter Aliases for many things on the window. Run 'shortcutList' for a list. | ||||
|         ''; | ||||
|         CopyEmojiMarkdown = { | ||||
|           enabled = mkEnableOption "Allows you to copy emojis as formatted string (<:blobcatcozy:1026533070955872337>)."; | ||||
|           copyUnicode = mkEnableOption "Copy the raw unicode character instead of :name: for default emojis."; | ||||
|         }; | ||||
|         CopyFileContents.enabled = mkEnableOption "Adds a button to text file attachments to copy their contents."; | ||||
|         CopyUserMention.enabled = mkEnableOption '' | ||||
|           Adds a button to copy user's mention on the user context menu, works best with ValidUser. | ||||
|         ''; | ||||
|         CopyUserURLs.enabled = mkEnableOption "Adds a 'Copy User URL' option to the user context menu."; | ||||
|         CrashHandler = { | ||||
|           enabled = mkBoolOption true "Utility for handling and possibly recovering from chrashes without restart."; | ||||
|           attemptToPreventCrashes = mkBoolOption true "Whether to attempt to prevent Discord crashes."; | ||||
|           attemptToNavigateToHome = mkEnableOption "Whether to attempt to navigate to the home when preventing Discord crashes."; | ||||
|         }; | ||||
|         CtrlEnterSend = { | ||||
|           enabled = mkEnableOption "Use Ctrl+Enter to send messages (customizable)."; | ||||
|           submitRule = mkOption { | ||||
|             type = enum ["ctrl+enter" "shift+enter" "enter"]; | ||||
|             default = "ctrl+enter"; | ||||
|             description = '' | ||||
|               The way to send a messages. | ||||
|               Available options: | ||||
|               - "ctrl+enter" (Enter of Shift+Enter for new line) (cmd+enter on macOS) | ||||
|               - "shift+enter" (Enter for a new Line) | ||||
|               - "enter" (Shift+Enter for new line; Discord default) | ||||
|             ''; | ||||
|           }; | ||||
|           sendMessageInTheMiddleOfACodeBlock = mkEnableOption "Whether to send a message in the middle of a code block."; | ||||
|         }; | ||||
|         CustomIdle = { | ||||
|           enabled = mkEnableOption "Allows you to set the time before Discord goes idle (or disable auto-idle)"; | ||||
|           idleTimeout = { | ||||
|             type = numbers.between 0 60; | ||||
|             default = 20; | ||||
|             description = "Minutes before Discord goes idle (0 to disable auto-idle). 0.0 - 60.0"; | ||||
|           }; | ||||
|           remainInIdle = mkEnableOption "When you come back to Discord, remain idle until you confirm you want to go online"; | ||||
|         }; | ||||
|         CustomSounds.enabled = mkEnableOption "Replace Discord's sounds with your own, custom sounds must be defined via client"; | ||||
|         CustomTimestamps = let | ||||
|           mkTimestampOption = default: description: | ||||
|             mkOption { | ||||
|               type = str; | ||||
|               inherit default description; | ||||
|             }; | ||||
|         in { | ||||
|           enabled = mkEnableOption '' | ||||
|             Custom timestamps on mesages and tooltips. | ||||
|             See <https://momentjs.com/docs/#/displaying/format/> for documentation on formatting. | ||||
|           ''; | ||||
|           cozyFormat = mkTimestampOption "[calander]" "Time format to use in messages on cozy mode."; | ||||
|           compactFormat = mkTimestampOption "LT" "Time format on compact mode and hovering messages."; | ||||
|           tooltipFormat = mkTimestampOption "LLLL • [relative]" "Time format to use on tooltips."; | ||||
|           sameDayFormat = mkTimestampOption "HH:mm:ss" "[calander] format for today."; | ||||
|           lastDayFormat = mkTimestampOption "[yesterday] HH:mm:ss" "[calander] format for yesterday."; | ||||
|           lastWeekFormat = mkTimestampOption "ddd DD.MM.YYYY HH:mm:ss" "[calander] format for last week."; | ||||
|           sameElseFormat = mkTimestampOption "ddd DD.MM.YYYY HH:mm:ss" "[calander] format for older dates."; | ||||
|         }; | ||||
|         # why weebs, why | ||||
|         CuteAnimeBoys.enabled = mkEnableOption "Add a command to send cute anime boys in the chat"; | ||||
|         CuteNekos.enabled = mkEnableOption "Send Nekos to others"; | ||||
|         CutePats.enabled = mkEnableOption "Sending head pats."; | ||||
|         DeadMembers.enabled = mkEnableOption "Shows when the sender of a message has left the guild."; | ||||
|         Dearrow = { | ||||
|           enabled = mkEnableOption "Makes YouTube embed titles and thumbnails less sensationalist, powered by Dearrow."; | ||||
|           hideButton = mkEnableOption "Hides the Dearrow button from Youtube embeds."; | ||||
|           replaceElements = mkOption { | ||||
|             type = enum ["everything" "titles" "thumbnails"]; | ||||
|             default = "everything"; | ||||
|             description = '' | ||||
|               Choose which elements of the embed will be replaced. | ||||
|               Available options: | ||||
|               - "everything" | ||||
|               - "titles" | ||||
|               - "thumbnails" | ||||
|             ''; | ||||
|             apply = mkEquibopSelect { | ||||
|               "everything" = 0; | ||||
|               "titles" = 1; | ||||
|               "thumbnails" = 2; | ||||
|             }; | ||||
|           }; | ||||
|           dearrowByDefault = mkEnableOption "Dearrow videos automatically"; | ||||
|         }; | ||||
|         DecodeBase64 = { | ||||
|           enabled = mkEnableOption "Decode base64 content of any message and copy the decoded content."; | ||||
|           clickMethod = mkOption { | ||||
|             type = enum ["Left" "Right"]; | ||||
|             default = "Left"; | ||||
|           }; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
|   config = mkIf cfg.enable { | ||||
|     # test file until module is complete | ||||
|     xdg.configFile."equibop/test.json".text = builtins.toJSON cfg.settings; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,13 +1,13 @@ | |||
| { | ||||
|   config, | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   lib, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf elem; | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (hozen) color; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (osConfig.ooknet.workstation) profiles; | ||||
| 
 | ||||
|   vesktopMime = {"x-scheme-handler/discord" = ["vesktop.desktop"];}; | ||||
|  | @ -15,9 +15,8 @@ in { | |||
|   config = mkIf (elem "communication" profiles) { | ||||
|     # <https://github.com/AlephNought0/Faery/blob/main/Home/Programs/Vesktop/patchedvesktop.patch> | ||||
|     home.packages = [ | ||||
|       (pkgs.vesktop.overrideAttrs (old: { | ||||
|         patches = (old.patches or []) ++ [./vesktop-patch.patch]; | ||||
|       })) | ||||
|       pkgs.vesktop | ||||
|       pkgs.equibop | ||||
|     ]; | ||||
| 
 | ||||
|     xdg.configFile."vesktop/themes/nix.css".text = | ||||
|  | @ -32,17 +31,17 @@ in { | |||
|         */ | ||||
| 
 | ||||
|         :root { | ||||
|           --nix-bg1: #${palette.base00}; | ||||
|           --nix-bg2: #${palette.base01}; | ||||
|           --nix-bg3: #${palette.base02}; | ||||
|           --nix-bg1: #${color.base00}; | ||||
|           --nix-bg2: #${color.base01}; | ||||
|           --nix-bg3: #${color.base02}; | ||||
| 
 | ||||
|           --nix-fg1: #${palette.base05}; | ||||
|           --nix-fg2: #${palette.base07}; | ||||
|           --nix-fg3: #${palette.base03}; | ||||
|           --nix-link: #${palette.base0D}; | ||||
|           --nix-fg1: #${color.base05}; | ||||
|           --nix-fg2: #${color.base07}; | ||||
|           --nix-fg3: #${color.base03}; | ||||
|           --nix-link: #${color.base0D}; | ||||
| 
 | ||||
|           --nix-accent: #${palette.base08}; | ||||
|           --nix-hi: #${palette.base0B}; | ||||
|           --nix-accent: #${color.base08}; | ||||
|           --nix-hi: #${color.base0B}; | ||||
| 
 | ||||
|           --font-mono: ${fonts.monospace.family}, monospace; | ||||
|           --font-regular: ${fonts.regular.family}, sans serif; | ||||
|  |  | |||
|  | @ -1,76 +0,0 @@ | |||
| diff --git a/src/main/index.ts b/src/main/index.ts
 | ||||
| index 2e0d6f7..70dabba 100644
 | ||||
| --- a/src/main/index.ts
 | ||||
| +++ b/src/main/index.ts
 | ||||
| @@ -35,7 +35,7 @@ function init() {
 | ||||
|      if (hardwareAcceleration === false) { | ||||
|          app.disableHardwareAcceleration(); | ||||
|      } else { | ||||
| -        enabledFeatures.push("VaapiVideoDecodeLinuxGL", "VaapiVideoEncoder", "VaapiVideoDecoder");
 | ||||
| +        enabledFeatures.push("VaapiVideoDecodeLinuxGL", "VaapiVideoEncoder", "VaapiVideoDecoder", "VulkanFromANGLE", "DefaultANGLEVulkan", "VaapiIgnoreDriverChecks", "PlatformHEVCDecoderSupport", "VaapiVP8Encoder", "VaapiVP9Encoder", "VaapiAV1Encoder", "WaylandWindowDecorations", "UseOzonePlatform", "WebRTCPipeWireCapturer");
 | ||||
|      } | ||||
|   | ||||
|      if (disableSmoothScroll) { | ||||
| @@ -48,6 +48,26 @@ function init() {
 | ||||
|      app.commandLine.appendSwitch("disable-renderer-backgrounding"); | ||||
|      app.commandLine.appendSwitch("disable-background-timer-throttling"); | ||||
|      app.commandLine.appendSwitch("disable-backgrounding-occluded-windows"); | ||||
| +    app.commandLine.appendSwitch("disable-renderer-backgrounding");
 | ||||
| +    app.commandLine.appendSwitch("disable-background-timer-throttling");
 | ||||
| +    app.commandLine.appendSwitch("disable-backgrounding-occluded-windows");
 | ||||
| +    app.commandLine.appendSwitch("enable-zero-copy");
 | ||||
| +    app.commandLine.appendSwitch("use-gl=angle");
 | ||||
| +    app.commandLine.appendSwitch("use-angle=gl");
 | ||||
| +    app.commandLine.appendSwitch("use-vulkan");
 | ||||
| +    app.commandLine.appendSwitch("enable-oop-rasterization");
 | ||||
| +    app.commandLine.appendSwitch("enable-raw-draw");
 | ||||
| +    app.commandLine.appendSwitch("enable-gpu-rasterization");
 | ||||
| +    app.commandLine.appendSwitch("enable-gpu-compositing");
 | ||||
| +    app.commandLine.appendSwitch("enable-native-gpu-memory-buffers");
 | ||||
| +    app.commandLine.appendSwitch("enable-accelerated-2d-canvas");
 | ||||
| +    app.commandLine.appendSwitch("enable-accelerated-video-decode");
 | ||||
| +    app.commandLine.appendSwitch("enable-accelerated-mjpeg-decode");
 | ||||
| +    app.commandLine.appendSwitch("disable-gpu-vsync");
 | ||||
| +    app.commandLine.appendSwitch("disable-frame-rate-limit");
 | ||||
| +    app.commandLine.appendSwitch("ozone-platform-hint=auto");
 | ||||
| +    app.commandLine.appendSwitch("enable-webrtc-pipewire-capturer");
 | ||||
| +    app.commandLine.appendSwitch("ozone-platform=wayland");
 | ||||
|      if (process.platform === "win32") { | ||||
|          disabledFeatures.push("CalculateNativeWinOcclusion"); | ||||
|      } | ||||
|       | ||||
| diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx
 | ||||
| index c7403b9..9b454e6 100644
 | ||||
| --- a/src/renderer/components/ScreenSharePicker.tsx
 | ||||
| +++ b/src/renderer/components/ScreenSharePicker.tsx
 | ||||
| @@ -84,9 +84,9 @@ addPatch({
 | ||||
|          const width = Math.round(height * (16 / 9)); | ||||
|   | ||||
|          Object.assign(opts, { | ||||
| -            bitrateMin: 500000,
 | ||||
| -            bitrateMax: 8000000,
 | ||||
| -            bitrateTarget: 600000
 | ||||
| +            bitrateMin: 10000000,
 | ||||
| +            bitrateMax: 60000000,
 | ||||
| +            bitrateTarget: 32000000
 | ||||
|          }); | ||||
|          if (opts?.encode) { | ||||
|              Object.assign(opts.encode, { | ||||
| 
 | ||||
| diff --git a/src/main/settings.ts b/src/main/settings.ts
 | ||||
| index 6fad97f..dfc64e3 100644
 | ||||
| --- a/src/main/settings.ts
 | ||||
| +++ b/src/main/settings.ts
 | ||||
| @@ -26,8 +26,10 @@ function loadSettings<T extends object = any>(file: string, name: string) {
 | ||||
| 
 | ||||
|      const store = new SettingsStore(settings); | ||||
|      store.addGlobalChangeListener(o => { | ||||
| -        mkdirSync(dirname(file), { recursive: true });
 | ||||
| -        writeFileSync(file, JSON.stringify(o, null, 4));
 | ||||
| +        try {
 | ||||
| +            mkdirSync(dirname(file), { recursive: true });
 | ||||
| +            writeFileSync(file, JSON.stringify(o, null, 4));
 | ||||
| +        } catch {}
 | ||||
|      }); | ||||
| 
 | ||||
|      return store; | ||||
							
								
								
									
										13
									
								
								modules/home/workstation/creative/aseprite.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								modules/home/workstation/creative/aseprite.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| { | ||||
|   lib, | ||||
|   osConfig, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf elem; | ||||
|   inherit (osConfig.ooknet.workstation) profiles; | ||||
| in { | ||||
|   config = mkIf (elem "creative" profiles) { | ||||
|     home.packages = [pkgs.aseprite]; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,5 +1,6 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./inkscape.nix | ||||
|     ./aseprite.nix | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ in { | |||
|     ./wow.nix | ||||
|     ./wine.nix | ||||
|     ./bottles.nix | ||||
|     ./emulation.nix | ||||
|     ./project-plus | ||||
|   ]; | ||||
|   config = mkIf (elem "gaming" profiles) { | ||||
|     ooknet.binds = { | ||||
|  |  | |||
							
								
								
									
										29
									
								
								modules/home/workstation/gaming/emulation.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								modules/home/workstation/gaming/emulation.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| { | ||||
|   lib, | ||||
|   osConfig, | ||||
|   pkgs, | ||||
|   self', | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf elem; | ||||
|   inherit (builtins) attrValues; | ||||
|   inherit (osConfig.ooknet.workstation) profiles; | ||||
| in { | ||||
|   config = mkIf (elem "gaming" profiles) { | ||||
|     home.packages = attrValues { | ||||
|       inherit | ||||
|         (pkgs) | ||||
|         ryujinx | ||||
|         ; | ||||
|       inherit | ||||
|         (self'.packages) | ||||
|         wii-u-gc-adapter | ||||
|         ; | ||||
|     }; | ||||
|     ooknet.gaming.project-plus = { | ||||
|       enable = true; | ||||
|       startFullscreen = true; | ||||
|       netplay.nickname = "ooks"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										5
									
								
								modules/home/workstation/gaming/project-plus/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								modules/home/workstation/gaming/project-plus/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./options.nix | ||||
|   ]; | ||||
| } | ||||
							
								
								
									
										140
									
								
								modules/home/workstation/gaming/project-plus/options.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								modules/home/workstation/gaming/project-plus/options.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,140 @@ | |||
| { | ||||
|   lib, | ||||
|   self', | ||||
|   config, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkOption mkEnableOption mkIf; | ||||
|   inherit (lib.types) package str path attrsOf anything bool int; | ||||
|   cfg = config.ooknet.gaming.project-plus; | ||||
| in { | ||||
|   options.ooknet.gaming.project-plus = { | ||||
|     enable = mkEnableOption "Enable Project Plus"; | ||||
|     package = mkOption { | ||||
|       type = package; | ||||
|       default = self'.packages.project-plus.override { | ||||
|         inherit (cfg) userDir; | ||||
|       }; | ||||
|     }; | ||||
|     userDir = mkOption { | ||||
|       type = str; | ||||
|       default = "${config.xdg.configHome}/project-plus"; | ||||
|       description = '' | ||||
|         Location of the Dolphin User directory, this is the path that the wrapped package | ||||
|         will use for User configuration. defaults to "\$\{config.xdg.configHome}/project-plus" | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|     launcherSource = mkOption { | ||||
|       type = path; | ||||
|       default = "${self'.packages.fpp-launcher}/Launcher"; | ||||
|       description = '' | ||||
|         Location of the faster-project-plus launcher files. | ||||
|       ''; | ||||
|     }; | ||||
|     sdCardSource = mkOption { | ||||
|       type = path; | ||||
|       default = "${self'.packages.fpp-sd}/sd.raw"; | ||||
|       description = '' | ||||
|         Location of the faster-project-plus sd card | ||||
|       ''; | ||||
|     }; | ||||
|     userSource = mkOption { | ||||
|       type = path; | ||||
|       default = "${self'.packages.fpp-config}/Binaries/User"; | ||||
|     }; | ||||
| 
 | ||||
|     netplay = { | ||||
|       nickname = mkOption { | ||||
|         type = str; | ||||
|         default = "Player"; | ||||
|         description = "Netplay nickname displayed to other players"; | ||||
|       }; | ||||
|       disableMusic = mkOption { | ||||
|         type = bool; | ||||
|         default = true; | ||||
|         description = "Whether to disable music during netplay"; | ||||
|       }; | ||||
|       buffer = mkOption { | ||||
|         type = int; | ||||
|         default = 4; | ||||
|         description = "Default netplay buffer"; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     analytics = { | ||||
|       enable = mkEnableOption "Enable anaylytics"; | ||||
|     }; | ||||
| 
 | ||||
|     startFullscreen = mkEnableOption "Start emulated game fullscreen"; | ||||
| 
 | ||||
|     gamesDir = mkOption { | ||||
|       type = str; | ||||
|       default = "./Games"; | ||||
|       description = '' | ||||
|         Location of the directory that stores all game isos, this is where you should store | ||||
|         your brawl iso. Defaults to "./Brawl" (The . is relative to the User dolphin directory) | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|     extraSettings = mkOption { | ||||
|       type = attrsOf anything; | ||||
|       default = {}; | ||||
|       description = '' | ||||
|         Additional settings for Dolphin.ini | ||||
|       ''; | ||||
|     }; | ||||
|   }; | ||||
|   config = mkIf cfg.enable { | ||||
|     home.packages = [cfg.package]; | ||||
|     xdg.configFile = { | ||||
|       "project-plus/Config/Dolphin.ini" = { | ||||
|         text = lib.generators.toINI {} { | ||||
|           # default settings to ensure project-plus works OOTB. | ||||
|           General = { | ||||
|             IsoPaths = 2; | ||||
|             IsoPath0 = "${cfg.userDir}/Games"; | ||||
|             IsoPath1 = "${cfg.userDir}/Launcher"; | ||||
|             WiiSDCardPath = "${cfg.userDir}/Wii/sd.raw"; | ||||
|           }; | ||||
|           Core = { | ||||
|             DefaultISO = "${cfg.userDir}/Games/brawl.iso"; | ||||
|           }; | ||||
|           Netplay = { | ||||
|             SelectedHostGame = "Project+ Netplay Launcher.dol"; | ||||
|             BufferSize = cfg.netplay.buffer; | ||||
|             Nickname = cfg.netplay.nickname; | ||||
|             MusicOff = cfg.netplay.disableMusic; | ||||
|             ListenPort = "0x0a42"; | ||||
|             HostPort = "0x0a42"; | ||||
|             ConnectPort = "0x0a42"; | ||||
|             HostCode = 00000000; | ||||
|             TraversalChoice = "traversal"; | ||||
|           }; | ||||
|           Analytics = { | ||||
|             Enabled = cfg.analytics.enable; | ||||
|             PermissionAsked = true; | ||||
|           }; | ||||
|           Display = { | ||||
|             Fullscreen = cfg.startFullscreen; | ||||
|           }; | ||||
|         }; | ||||
|       }; | ||||
|       # Copy dolphin GameSettings configuration from faster-project-plus config | ||||
|       # This includes various Gecko Code files to make for a better Netplay experience | ||||
|       "project-plus/GameSettings" = { | ||||
|         source = "${cfg.userSource}/GameSettings"; | ||||
|         recursive = true; | ||||
|       }; | ||||
|       "project-plus/Launcher" = { | ||||
|         source = "${cfg.launcherSource}"; | ||||
|         recursive = true; | ||||
|       }; | ||||
|       # Cant get this to work, does the sd card need to be writable for dolphin to use it? | ||||
|       # for now sd card will need to be manually placed in the SD directory | ||||
|       # "project-plus/Wii/sd.raw" = { | ||||
|       #   source = cfg.sdCardSource; | ||||
|       # }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,55 +0,0 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf mkEnableOption mkOption; | ||||
|   inherit (lib.types) str package; | ||||
|   inherit (config.ooknet) gaming; | ||||
|   gamesDir = config.xdg.userDirs.extraConfig.XDG_GAMES_DIR; | ||||
|   cfg = config.ooknet.gaming.world-of-warcraft; | ||||
| in { | ||||
|   options.ooknet.gaming.world-of-warcraft = { | ||||
|     enable = mkEnableOption "Enable the World of Warcraft module"; | ||||
| 
 | ||||
|     proton = { | ||||
|       package = mkOption { | ||||
|         type = package; | ||||
|         default = pkgs.proton-ge-custom; | ||||
|       }; | ||||
|       prefix = { | ||||
|         path = mkOption { | ||||
|           type = str; | ||||
|           default = "${gaming.prefixPath}/WoW"; | ||||
|         }; | ||||
|       }; | ||||
|       compatDataPath = mkOption { | ||||
|         type = str; | ||||
|         default = "${gaming.compatDataPath}/"; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     gamePrefixPath = mkOption { | ||||
|       type = str; | ||||
|       default = "${cfg.winePrefixesPath}/WoW"; | ||||
|       description = "Location where the World of Warcraft prefix will be stored."; | ||||
|     }; | ||||
| 
 | ||||
|     gamePath = mkOption { | ||||
|       type = str; | ||||
|       default = "${cfg.world-of-warcraft.gamePrefixPath}/drive_c/Program Files (x86)/World of Warcraft"; | ||||
|       description = "Location where the World of Warcraft installation will be symlinked."; | ||||
|     }; | ||||
| 
 | ||||
|     gameSharedPath = mkOption { | ||||
|       type = str; | ||||
|       default = "${cfg.wineProgramsPath}/World Of Warcraft"; | ||||
|       description = "Location where World of Warcraft game files are stored."; | ||||
|     }; | ||||
|   }; | ||||
|   config = | ||||
|     mkIf cfg.enable { | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
|  | @ -2,7 +2,6 @@ | |||
|   lib, | ||||
|   osConfig, | ||||
|   pkgs, | ||||
|   self', | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf elem; | ||||
|  |  | |||
|  | @ -2,11 +2,13 @@ | |||
|   lib, | ||||
|   osConfig, | ||||
|   inputs', | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (osConfig.ooknet.workstation) environment; | ||||
|   inherit (osConfig.ooknet.hardware) primaryMonitor; | ||||
|   inherit (hozen) color; | ||||
|   inherit (lib) mkIf; | ||||
| in { | ||||
|   config = mkIf (environment == "hyprland") { | ||||
|  | @ -29,10 +31,11 @@ in { | |||
|         background = { | ||||
|           monitor = ""; | ||||
|           path = ""; | ||||
|           color = "0xff${palette.base01}"; | ||||
|           color = "0xff${color.layout.body}"; | ||||
|         }; | ||||
| 
 | ||||
|         input-field = { | ||||
|           monitor = primaryMonitor; | ||||
|           size = "200, 30"; | ||||
| 
 | ||||
|           position = "0, 0"; | ||||
|  | @ -42,18 +45,18 @@ in { | |||
|           rounding = 0; | ||||
|           fade_on_empty = false; | ||||
|           placeholder_text = ""; | ||||
|           outer_color = "0xff${palette.base03}"; | ||||
|           inner_color = "0xff${palette.base00}"; | ||||
|           font_color = "0xff${palette.base05}"; | ||||
|           outer_color = "0xff${color.secondary.base}"; | ||||
|           inner_color = "0xff${color.layout.menu}"; | ||||
|           font_color = "0xff${color.typography.text}"; | ||||
|         }; | ||||
| 
 | ||||
|         label = { | ||||
|           monitor = ""; | ||||
|           text = " LOCKED"; | ||||
|           monitor = primaryMonitor; | ||||
|           text = "LOCKED"; | ||||
|           position = "0, 150"; | ||||
|           valign = "center"; | ||||
|           halign = "center"; | ||||
|           color = "0xff${palette.base08}"; | ||||
|           color = "0xff${color.red.base}"; | ||||
|           font_size = 30; | ||||
|           font_family = "${fonts.monospace.family}"; | ||||
|         }; | ||||
|  |  | |||
|  | @ -1,37 +1,42 @@ | |||
| { | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (osConfig.ooknet.workstation) environment; | ||||
|   inherit (hozen) color; | ||||
|   inherit (lib) mkIf; | ||||
| in { | ||||
|   config = mkIf (environment == "hyprland") { | ||||
|     services.mako = { | ||||
|       enable = true; | ||||
|       layer = "overlay"; | ||||
|       font = "${fonts.regular.family} 12"; | ||||
|       padding = "10,10"; | ||||
|       anchor = "top-right"; | ||||
|       width = 300; | ||||
|       height = 100; | ||||
|       borderSize = 2; | ||||
|       defaultTimeout = 3000; | ||||
|       backgroundColor = "#${palette.base00}dd"; | ||||
|       borderColor = "#${palette.base05}dd"; | ||||
|       textColor = "#${palette.base05}dd"; | ||||
|       backgroundColor = "#${color.layout.menu}"; | ||||
|       borderColor = "#${color.border.active}"; | ||||
|       textColor = "#${color.typography.text}"; | ||||
|       extraConfig = '' | ||||
|         [app-name="system-notify"] | ||||
|         padding=3,3 | ||||
|         text-alignment=center | ||||
|         font=${fonts.regular.family} 16 | ||||
|         anchor=top-center | ||||
|         width=100 | ||||
|         height=100 | ||||
|         [app-name="spotify_player"] | ||||
|         border-color=#${color.green.base} | ||||
|         [urgency=critical] | ||||
|         padding=3,3 | ||||
|         width=100 | ||||
|         width=300 | ||||
|         height=100 | ||||
|         anchor=top-center | ||||
|         border-color=#${palette.base08}dd | ||||
|         border-color=#${color.red.base}dd | ||||
|       ''; | ||||
|     }; | ||||
|   }; | ||||
|  |  | |||
|  | @ -2,13 +2,14 @@ | |||
|   lib, | ||||
|   config, | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (osConfig.ooknet.workstation) environment; | ||||
|   inherit (hozen) color; | ||||
|   inherit (config.lib.formats.rasi) mkLiteral; | ||||
| in { | ||||
|   config = mkIf (environment == "hyprland") { | ||||
|  | @ -19,10 +20,10 @@ in { | |||
|       terminal = "${config.home.sessionVariables.TERMINAL}"; | ||||
|       theme = { | ||||
|         "*" = { | ||||
|           background = mkLiteral "#${palette.base00}"; | ||||
|           foreground = mkLiteral "#${palette.base05}"; | ||||
|           selected = mkLiteral "#${palette.base0B}"; | ||||
|           message = mkLiteral "#${palette.base0D}"; | ||||
|           background = mkLiteral "#${color.layout.menu}"; | ||||
|           foreground = mkLiteral "#${color.typography.text}"; | ||||
|           selected = mkLiteral "#${color.primary.base}"; | ||||
|           message = mkLiteral "#${color.blue.base}"; | ||||
| 
 | ||||
|           background-color = mkLiteral "@background"; | ||||
|           border-color = mkLiteral "@foreground"; | ||||
|  |  | |||
|  | @ -3,10 +3,11 @@ | |||
|   lib, | ||||
|   pkgs, | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (hozen) color; | ||||
|   inherit (osConfig.ooknet.hardware) monitors; | ||||
|   inherit (osConfig.ooknet.workstation) environment; | ||||
|   inherit (lib) mkIf head; | ||||
|  | @ -22,7 +23,7 @@ in { | |||
|       settings.mainBar = { | ||||
|         layer = "top"; | ||||
|         position = "top"; | ||||
|         height = 30; | ||||
|         height = 32; | ||||
|         width = monitorWidth; | ||||
|         exclusive = true; | ||||
|         margin-top = 10; | ||||
|  | @ -89,8 +90,8 @@ in { | |||
|         '' | ||||
|           * { | ||||
|             font-family: "${fonts.monospace.family}"; | ||||
|             font-size: 19px; | ||||
|             border: solid #${palette.base05}; | ||||
|             font-size: ${toString fonts.monospace.size}px; | ||||
|             border: solid #${color.border.base}; | ||||
|           } | ||||
| 
 | ||||
|           window#waybar { | ||||
|  | @ -101,32 +102,32 @@ in { | |||
|           #clock, | ||||
|           #battery, | ||||
|           #workspaces { | ||||
|             background-color: #${palette.base00}; | ||||
|             background-color: #${color.layout.header}; | ||||
|             padding-right: 10px; | ||||
|           } | ||||
| 
 | ||||
|           #clock { | ||||
|             padding-left: 10px; | ||||
|             border: 2px solid #${palette.base05}; | ||||
|             border: 2px solid #${color.border.base}; | ||||
|             border-right: 0px; | ||||
|             border-top-left-radius: 10px; | ||||
|           } | ||||
| 
 | ||||
|           #battery { | ||||
|             padding-left: 10px; | ||||
|             border-top: 2px solid #${palette.base05}; | ||||
|             border-bottom: 2px solid #${palette.base05}; | ||||
|             border-top: 2px solid #${color.border.base}; | ||||
|             border-bottom: 2px solid #${color.border.base}; | ||||
|             border-left: 0px; | ||||
|           } | ||||
| 
 | ||||
|           #battery.good { | ||||
|             color: #${palette.base0B}; | ||||
|             color: #${color.success.base}; | ||||
|           } | ||||
|           #battery.warning { | ||||
|             color: #${palette.base0A}; | ||||
|             color: #${color.warning.base}; | ||||
|           } | ||||
|           #battery.critical { | ||||
|             color: #${palette.base08}; | ||||
|             color: #${color.error.base}; | ||||
|           } | ||||
| 
 | ||||
|           #tray { | ||||
|  | @ -137,7 +138,7 @@ in { | |||
|           } | ||||
| 
 | ||||
|           #workspaces { | ||||
|             border: 2px solid #${palette.base05}; | ||||
|             border: 2px solid #${color.border.base}; | ||||
|             border-left: 0; | ||||
|             border-top-right-radius: 10px; | ||||
|           } | ||||
|  | @ -145,15 +146,15 @@ in { | |||
|           #workspace button, | ||||
|           #workspaces button.active, | ||||
|           #workspaces button.visible { | ||||
|             color: #${palette.base0B}; | ||||
|             color: #${color.primary.base}; | ||||
|           } | ||||
| 
 | ||||
|           #workspaces button.urgent { | ||||
|             color: #${palette.base08}; | ||||
|             color: #${color.orange.base}; | ||||
|           } | ||||
| 
 | ||||
|           #custom-hyprrecord { | ||||
|             color: #${palette.base08}; | ||||
|             color: #${color.red.base}; | ||||
|             padding-right: 20px; | ||||
|           } | ||||
|         ''; | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ in { | |||
|       enable = true; | ||||
|       package = inputs'.hyprland.packages.hyprland; | ||||
|       xwayland.enable = true; | ||||
|       systemd = { | ||||
|       systemd = mkIf (!osConfig.programs.uwsm.enable) { | ||||
|         enable = true; | ||||
|         variables = ["--all"]; | ||||
|       }; | ||||
|  | @ -28,7 +28,7 @@ in { | |||
|         CLUTTER_BACKEND = "wayland"; | ||||
|         NIXOS_OZONE_WL = "1"; | ||||
|         GDK_BACKEND = "wayland"; | ||||
|         QT_QPA_PLATFORM = "wayland"; | ||||
|         QT_QPA_PLATFORM = "wayland;xcb"; | ||||
|         QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; | ||||
|         DISABLE_QT5_COMPAT = "0"; | ||||
|         QT_AUTO_SCREEN_SCALE_FACTOR = "1"; | ||||
|  |  | |||
|  | @ -1,18 +1,23 @@ | |||
| {osConfig, ...}: let | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme cursor; | ||||
|   inherit (colorscheme) palette; | ||||
| { | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance) cursor; | ||||
|   inherit (hozen) color; | ||||
| in { | ||||
|   wayland.windowManager.hyprland = { | ||||
|     #plugins = [inputs'.hyprland-plugins.packages.borders-plus-plus]; | ||||
|     settings = { | ||||
|       # cursor = { | ||||
|       #   inactive_timeout = 4; | ||||
|       # }; | ||||
|       general = { | ||||
|         border_size = 2; | ||||
|         "col.inactive_border" = "rgb(${color.neutrals."700"})"; | ||||
|         "col.active_border" = "rgb(${color.neutrals."650"})"; | ||||
|         gaps_in = 10; | ||||
|         gaps_out = 10; | ||||
|         border_size = 2; | ||||
|         "col.active_border" = "0xff${palette.base05}"; | ||||
|         "col.inactive_border" = "0xff${palette.base02}"; | ||||
|       }; | ||||
| 
 | ||||
|       exec-once = [ | ||||
|  | @ -30,14 +35,25 @@ in { | |||
|           enabled = false; | ||||
|           ignore_opacity = true; | ||||
|         }; | ||||
| 
 | ||||
|         drop_shadow = true; | ||||
|         shadow_range = 12; | ||||
|         shadow_offset = "3 3"; | ||||
|         "col.shadow" = "0x44000000"; | ||||
|         "col.shadow_inactive" = "0x66000000"; | ||||
|         shadow = { | ||||
|           enabled = true; | ||||
|           range = 2; | ||||
|           sharp = true; | ||||
|           offset = "2 2"; | ||||
|           color = "0xff${color.neutrals."850"}"; | ||||
|           color_inactive = "0xff${color.neutrals."850"}"; | ||||
|         }; | ||||
| 
 | ||||
|       }; | ||||
|       # FIXME | ||||
|       #"plugin:borders-plus-plus" = { | ||||
|       #  enabled = true; | ||||
|       #  add_borders = 1; | ||||
|       #  "col.border_1" = "rgb(${color.neutrals."600"})"; | ||||
|       # | ||||
|       #  border_size_1 = 2; | ||||
|       #  border_size_2 = 2; | ||||
|       #  natural_rounding = false; | ||||
|       #}; | ||||
|       animations = { | ||||
|         enabled = false; | ||||
|       }; | ||||
|  |  | |||
|  | @ -2,17 +2,20 @@ | |||
|   inherit (config.ooknet) binds; | ||||
| in { | ||||
|   wayland.windowManager.hyprland.settings = { | ||||
|     # TODO: build better binds interface | ||||
|     bind = [ | ||||
|       # Program Launch | ||||
|       "SUPER,          b,             exec,     ${binds.browser}" | ||||
|       "SUPER,          return,        exec,     ${binds.terminal}" | ||||
|       "SUPERSHIFT,     return,        exec,     ${binds.terminal} --title=dropdown" | ||||
|       "SUPER,          e,             exec,     ${binds.terminalLaunch} $EDITOR" | ||||
|       "SUPERSHIFT,     P,             exec,     ${binds.password}" | ||||
|       "SUPERCTRL,      P,             exec,     ${binds.quickpass}" | ||||
|       "SUPER,          d,             exec,     ${binds.discord}" | ||||
|       "SUPERSHIFT,     e,             exec,     ${binds.fileManager}" | ||||
|       "SUPERSHIFT,     S,             exec,     ${binds.steam}" | ||||
|       "SUPERSHIFT,     n,             exec,     ${binds.notes}" | ||||
|       "SUPER,          escape,        exec,     ${binds.terminalLaunch} --title=BTOP btop" | ||||
|       "SUPER,          escape,        exec,     ${binds.btop}" | ||||
|       "SUPER CTRL,     return,        exec,     ${binds.zellijMenu}" | ||||
|       "SUPER,          delete,        exec,     ${binds.powerMenu}" | ||||
|       "SUPERSHIFT,     F,             exec,     ${binds.factorio}" | ||||
|  |  | |||
|  | @ -8,5 +8,7 @@ | |||
|     ./monitor.nix | ||||
|     ./gestures.nix | ||||
|     ./appearance.nix | ||||
|     ./workspaces.nix | ||||
|     ./options | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
|     enable_swallow = true; | ||||
| 
 | ||||
|     # TODO: use terminal/file-explorer module | ||||
|     swallow_regex = "foot|nemo"; | ||||
|     swallow_regex = "foot|nemo|com.mitchellh.ghostty"; | ||||
| 
 | ||||
|     focus_on_activate = true; | ||||
|   }; | ||||
|  |  | |||
							
								
								
									
										140
									
								
								modules/home/workstation/hyprland/settings/options/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								modules/home/workstation/hyprland/settings/options/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,140 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   ... | ||||
| }: let | ||||
|   inherit | ||||
|     (lib) | ||||
|     flatten | ||||
|     attrValues | ||||
|     concatStringsSep | ||||
|     filterAttrs | ||||
|     mapAttrsToList | ||||
|     boolToString | ||||
|     mkOption | ||||
|     isBool | ||||
|     ; | ||||
|   inherit | ||||
|     (lib.types) | ||||
|     listOf | ||||
|     attrsOf | ||||
|     submodule | ||||
|     nullOr | ||||
|     str | ||||
|     int | ||||
|     bool | ||||
|     oneOf | ||||
|     ; | ||||
| 
 | ||||
|   # our cursed regex types | ||||
|   hyprland = import ./rules.nix {inherit lib;}; | ||||
| 
 | ||||
|   _toString = type: val: | ||||
|     if isBool val | ||||
|     then | ||||
|       if type == "windowrule" | ||||
|       then | ||||
|         if val | ||||
|         then "1" | ||||
|         else "0" | ||||
|       else boolToString val # for workspace rules | ||||
|     else toString val; | ||||
| 
 | ||||
|   # format rules for hyprland | ||||
|   formatRules = type: rule: | ||||
|     concatStringsSep "," ( | ||||
|       mapAttrsToList (name: value: "${name}:${_toString type value}") | ||||
|       (filterAttrs (_: v: v != null) rule) | ||||
|     ); | ||||
| 
 | ||||
|   # workspace handling | ||||
|   mkWorkspaces = mapAttrsToList ( | ||||
|     selector: rules: "${selector},${formatRules "workspacerule" rules}" | ||||
|   ); | ||||
| 
 | ||||
|   # rule options | ||||
|   mkRuleOption = type: description: | ||||
|     mkOption { | ||||
|       type = nullOr type; | ||||
|       default = null; | ||||
|       inherit description; | ||||
|     }; | ||||
| 
 | ||||
|   # window rule matchers | ||||
|   windowRuleMatchers = submodule { | ||||
|     options = { | ||||
|       class = mkRuleOption str "Window class matcher"; | ||||
|       title = mkRuleOption str "Window title matcher"; | ||||
|       initialClass = mkRuleOption str "Initial window class matcher"; | ||||
|       initialTitle = mkRuleOption str "Initial window title matcher"; | ||||
|       tag = mkRuleOption str "Window tag matcher"; | ||||
|       xwayland = mkRuleOption bool "Match XWayland windows"; | ||||
|       floating = mkRuleOption bool "Match floating windows"; | ||||
|       fullscreen = mkRuleOption bool "Match fullscreen windows"; | ||||
|       workspace = mkRuleOption str "Match windows on specific workspace"; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   # Workspace rules submodule | ||||
|   workspaceRules = submodule { | ||||
|     options = { | ||||
|       name = mkRuleOption str "Default name of workspace"; | ||||
|       monitor = mkRuleOption str "Binds workspace to monitor"; | ||||
|       default = mkRuleOption bool "Set as default workspace for monitor"; | ||||
|       gapsin = mkRuleOption int "Gaps between windows"; | ||||
|       gapsout = mkRuleOption int "Gaps between windows and monitor edges"; | ||||
|       bordersize = mkRuleOption int "Border size around windows"; | ||||
|       border = mkRuleOption bool "Draw borders"; | ||||
|       shadow = mkRuleOption bool "Draw shadows"; | ||||
|       rounding = mkRuleOption bool "Draw rounded corners"; | ||||
|       decorate = mkRuleOption bool "Draw window decorations"; | ||||
|       persistent = mkRuleOption bool "Keep workspace alive when empty"; | ||||
|       on-created-empty = mkRuleOption str "Command to run when workspace created empty"; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   # Window rules type using our validated types from rules.nix | ||||
|   windowRuleType = listOf (oneOf (attrValues hyprland.types)); | ||||
| 
 | ||||
|   cfg = config.wayland.windowManager.hyprland; | ||||
| in { | ||||
|   options.wayland.windowManager.hyprland = { | ||||
|     # Workspace configuration | ||||
|     workspaces = mkOption { | ||||
|       type = attrsOf workspaceRules; | ||||
|       default = {}; | ||||
|       description = "Workspace-specific configurations"; | ||||
|     }; | ||||
| 
 | ||||
|     # Window rules configuration | ||||
|     windowRules = mkOption { | ||||
|       type = listOf (submodule { | ||||
|         options = { | ||||
|           matches = mkOption { | ||||
|             type = windowRuleMatchers; | ||||
|             description = "Window matching criteria"; | ||||
|           }; | ||||
|           rules = mkOption { | ||||
|             type = windowRuleType; | ||||
|             description = "Rules to apply to matching windows"; | ||||
|           }; | ||||
|         }; | ||||
|       }); | ||||
|       default = []; | ||||
|       description = "Window-specific rules"; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   config.wayland.windowManager.hyprland.settings = { | ||||
|     workspace = mkWorkspaces cfg.workspaces; | ||||
|     windowrulev2 = let | ||||
|       # Convert rules to Hyprland format | ||||
|       formatWindowRule = rule: let | ||||
|         matches = formatRules "windowrule" rule.matches; | ||||
|         rules = map (r: "${r},${matches}") rule.rules; | ||||
|       in | ||||
|         rules; | ||||
|     in | ||||
|       flatten (map formatWindowRule cfg.windowRules); | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										241
									
								
								modules/home/workstation/hyprland/settings/options/rules.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								modules/home/workstation/hyprland/settings/options/rules.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,241 @@ | |||
| {lib, ...}: let | ||||
|   inherit (lib) concatStringsSep attrValues; | ||||
|   inherit (lib.types) enum strMatching; | ||||
| 
 | ||||
|   # helper function for constructing regex patterns for hyprland rules | ||||
|   mkRegexTarget = { | ||||
|     name, | ||||
|     regex ? [], | ||||
|     extraRegex ? "", | ||||
|     optional ? false, | ||||
|   }: let | ||||
|     regexPart = concatStringsSep "|" regex; | ||||
|     parameterPart = | ||||
|       if optional | ||||
|       then "( (${regexPart}))?" | ||||
|       else " (${regexPart})"; | ||||
|   in | ||||
|     strMatching "${name}${parameterPart}${extraRegex}"; | ||||
| 
 | ||||
|   # basic windowrules that can be validated with simple enum | ||||
| 
 | ||||
|   basicWindowRules = enum [ | ||||
|     "float" | ||||
|     "tile" | ||||
|     "fullscreen" | ||||
|     "maximize" | ||||
|     "pseudo" | ||||
|     "noinitialfocus" | ||||
|     "pin" | ||||
|     "unset" | ||||
|     "nomaxsize" | ||||
|     "stayfocused" | ||||
|   ]; | ||||
| 
 | ||||
|   # toggleable options | ||||
|   toggleableRules = [ | ||||
|     # window decoration | ||||
|     "decorate" # window decorations | ||||
|     "noborder" # borders | ||||
|     "noshadow" # shadows | ||||
|     "norounding" # corner rounding | ||||
| 
 | ||||
|     # Visual effects | ||||
|     "noblur" # blur | ||||
|     "noanim" # animations | ||||
|     "nodim" # dimming | ||||
|     "opaque" # opacity enforcement | ||||
|     "forcergbx" # RGB handling | ||||
|     "xray" # blur xray mode | ||||
|     "immediate" # tearing mode | ||||
| 
 | ||||
|     # Behavior | ||||
|     "dimaround" # dim around window | ||||
|     "focusonactivate" # focus on activation request | ||||
|     "nofocus" # disable focus | ||||
|     "stayfocused" # keep focus | ||||
|     "keepaspectratio" # maintain aspect ratio | ||||
|     "nearestneighbor" # nearest neighbor filtering | ||||
|     "nomaxsize" # disable max size | ||||
|     "noshortcutsinhibit" # shortcut inhibiting | ||||
|     "allowsinput" # XWayland input forcing | ||||
|     "renderunfocused" # unfocused rendering | ||||
|     "syncfullscreen" # fullscreen sync | ||||
|   ]; | ||||
| 
 | ||||
|   # reusable regex pattens to be used in constructing our types | ||||
|   patterns = { | ||||
|     # toggles | ||||
|     onOpt = "1|true|on|yes|0|salse|off|no|toggle|unset"; | ||||
| 
 | ||||
|     # numbers | ||||
|     float = "[+-]?([0-9]*[.])?[0-9]+"; | ||||
|     int = "[0-9]+"; | ||||
|     alpha = ''(0|0?\.[[:digit:]]+|1|1\.0)''; | ||||
|     percentage = "[0-9]+(%)?"; | ||||
| 
 | ||||
|     # position | ||||
|     anchor = "100%-w?-[0-9]+"; | ||||
|     coordinate = "${patterns.percentage}|${patterns.anchor}"; | ||||
|     deg = "(0-360)"; | ||||
| 
 | ||||
|     # identification | ||||
|     numericId = "[1-9][0-9]*"; | ||||
|     sign = "[+-]"; | ||||
|     relative = "${patterns.sign}${patterns.numericId}"; | ||||
|     monitorPrefix = "(m|r)"; | ||||
|     monitorRelative = "${patterns.monitorPrefix}(${patterns.sign}${patterns.numericId}|~${patterns.numericId})"; | ||||
|     emptyModifiers = "[mn]*"; | ||||
|     empty = "empty${patterns.emptyModifiers}"; | ||||
|     mode = "(always|focus|fullscreen|none)"; | ||||
|     ident = "[A-Za-z0-9_][A-Za-z0-9_ -]*"; | ||||
|     name = "name:${patterns.ident}"; | ||||
|     special = "special(:[a-zA-Z0-9_-]+)?"; | ||||
|     previous = "previous(_per_monitor)?"; | ||||
|     openWorkspace = "e(${patterns.sign}${patterns.numericId}|~${patterns.numericId})"; | ||||
| 
 | ||||
|     # colors | ||||
|     rgbValue = ''([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])''; | ||||
|     rgbaHex = ''rgba\([[:xdigit:]]{8}\)''; | ||||
|     rgbaDecimal = ''rgba\(${patterns.rgbValue}, *${patterns.rgbValue}, *${patterns.rgbValue}, *${patterns.alpha}\)''; | ||||
|     rgbHex = ''rgb\([[:xdigit:]]{3}([[:xdigit:]]{3})?\)''; | ||||
|     rgbDecimal = ''rgb\(${patterns.rgbValue}, *${patterns.rgbValue}, *${patterns.rgbValue}\)''; | ||||
|     legacy = ''0x[[:xdigit:]]{8}''; | ||||
|     color = concatStringsSep "|" [ | ||||
|       patterns.rgbaHex | ||||
|       patterns.rgbaDecimal | ||||
|       patterns.rgbHex | ||||
|       patterns.rgbDecimal | ||||
|       patterns.legacy | ||||
|     ]; | ||||
|   }; | ||||
| 
 | ||||
|   mkToggleableRules = name: | ||||
|     mkRegexTarget { | ||||
|       inherit name; | ||||
|       regex = [patterns.onOpt]; | ||||
|       optional = true; | ||||
|     }; | ||||
| 
 | ||||
|   toggleTargets = builtins.listToAttrs (map (name: { | ||||
|       inherit name; | ||||
|       value = mkToggleableRules name; | ||||
|     }) | ||||
|     toggleableRules); | ||||
| 
 | ||||
|   # regex patterns to pass to the workspace rule | ||||
| 
 | ||||
|   types = | ||||
|     { | ||||
|       inherit basicWindowRules; | ||||
|       workspace = mkRegexTarget { | ||||
|         name = "workspace"; | ||||
|         regex = attrValues { | ||||
|           inherit (patterns) numericId relative monitorRelative empty name special previous openWorkspace; | ||||
|         }; | ||||
|         extraRegex = "( +silent)?"; | ||||
|       }; | ||||
| 
 | ||||
|       monitor = mkRegexTarget { | ||||
|         name = "monitor"; | ||||
|         regex = attrValues { | ||||
|           inherit (patterns) numericId ident; | ||||
|         }; | ||||
|       }; | ||||
| 
 | ||||
|       group = mkRegexTarget { | ||||
|         name = "group"; | ||||
|         regex = ["set|new|lock|barred|deny|invade|override|unset"]; | ||||
|       }; | ||||
| 
 | ||||
|       size = mkRegexTarget { | ||||
|         name = "size"; | ||||
|         regex = [ | ||||
|           "([0-9]+|[<>][0-9]+)(%|px)?( ([0-9]+|[<>][0-9]+)(%|px)?)?" | ||||
|         ]; | ||||
|       }; | ||||
| 
 | ||||
|       move = mkRegexTarget { | ||||
|         name = "move"; | ||||
|         regex = [ | ||||
|           "(${patterns.coordinate}) (${patterns.coordinate})" | ||||
|           "cursor (${patterns.percentage}) (${patterns.percentage})" | ||||
|           "onscreen cursor (${patterns.percentage}) (${patterns.percentage})" | ||||
|         ]; | ||||
|       }; | ||||
| 
 | ||||
|       bordercolor = mkRegexTarget { | ||||
|         name = "bordercolor"; | ||||
|         regex = [patterns.color]; | ||||
|       }; | ||||
| 
 | ||||
|       idleinhibit = mkRegexTarget { | ||||
|         name = "idleinhibit"; | ||||
|         regex = [patterns.mode]; | ||||
|       }; | ||||
| 
 | ||||
|       opacity = mkRegexTarget { | ||||
|         name = "opacity"; | ||||
|         regex = let | ||||
|           opacityValue = "${patterns.alpha}( override)?"; | ||||
|         in [ | ||||
|           opacityValue | ||||
|           "${opacityValue} ${opacityValue}" | ||||
|           "${opacityValue} ${opacityValue} ${opacityValue}" | ||||
|         ]; | ||||
|       }; | ||||
| 
 | ||||
|       center = mkRegexTarget { | ||||
|         name = "center"; | ||||
|         regex = ["[0-1]"]; | ||||
|         optional = true; | ||||
|       }; | ||||
| 
 | ||||
|       roundingpower = mkRegexTarget { | ||||
|         name = "roundingpower"; | ||||
|         regex = [patterns.float]; | ||||
|       }; | ||||
| 
 | ||||
|       bordersize = mkRegexTarget { | ||||
|         name = "bordersize"; | ||||
|         regex = [patterns.int]; | ||||
|       }; | ||||
| 
 | ||||
|       rounding = mkRegexTarget { | ||||
|         name = "rounding"; | ||||
|         regex = [patterns.int]; | ||||
|       }; | ||||
| 
 | ||||
|       scrollmouse = mkRegexTarget { | ||||
|         name = "scrollmouse"; | ||||
|         regex = [patterns.float]; | ||||
|       }; | ||||
| 
 | ||||
|       scrolltouchpad = mkRegexTarget { | ||||
|         name = "scrolltouchpad"; | ||||
|         regex = [patterns.float]; | ||||
|       }; | ||||
| 
 | ||||
|       tag = mkRegexTarget { | ||||
|         name = "tag"; | ||||
|         regex = [''[+-]?[[:alnum:]_]+\*?'']; | ||||
|       }; | ||||
| 
 | ||||
|       maxsize = mkRegexTarget { | ||||
|         name = "maxsize"; | ||||
|         regex = ["${patterns.int} ${patterns.int}"]; | ||||
|       }; | ||||
| 
 | ||||
|       minsize = mkRegexTarget { | ||||
|         name = "minsize"; | ||||
|         regex = ["${patterns.int} ${patterns.int}"]; | ||||
|       }; | ||||
|       animation = mkRegexTarget { | ||||
|         name = "animation"; | ||||
|         regex = ["(slide)( (left|right|up|down|top|bottom))?|(popin)( ([0-9]+%))?"]; | ||||
|       }; | ||||
|     } | ||||
|     // toggleTargets; | ||||
| in { | ||||
|   inherit types; | ||||
| } | ||||
|  | @ -1,24 +1,75 @@ | |||
| {osConfig, ...}: let | ||||
|   monitor = builtins.elemAt osConfig.ooknet.hardware.monitors 0; | ||||
| 
 | ||||
|   widthMinusGaps = toString (monitor.width - 23); | ||||
| in { | ||||
|   wayland.windowManager.hyprland.windowRules = [ | ||||
|     # TODO tag games for immediate | ||||
|     { | ||||
|   wayland.windowManager.hyprland.settings = { | ||||
|     windowrulev2 = [ | ||||
|       "float,move 191 15,size 924 396,class:^(1Password)$" | ||||
| 
 | ||||
|       "float, title:^(Picture-in-Picture)$" | ||||
|       "pin, title:^(Picture-in-Picture)$" | ||||
| 
 | ||||
|       "float,move 237 175, size 1200 720,title:^(File Upload)$" | ||||
| 
 | ||||
|       "workspace 4, title:^(Vesktop)$" | ||||
| 
 | ||||
|       # Floating BTOP | ||||
|       "float,title:^(BTOP)$" | ||||
|       "size 85%,title:^(BTOP)$" | ||||
|       "pin,title:^(BTOP)$" | ||||
|       "center,title:^(BTOP)$" | ||||
|       "stayfocused,title:^(BTOP)$" | ||||
| 
 | ||||
|       # Tearing | ||||
|       "immediate, title:^(TEKKEN™8)$" | ||||
|     ]; | ||||
|   }; | ||||
|       matches = {initialTitle = "Syncthing Tray";}; | ||||
|       rules = ["float" "center 1" "size 50%"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {class = "factorio";}; | ||||
|       rules = ["tag +games"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {initialTitle = "World of Warcraft";}; | ||||
|       rules = ["tag +games"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {title = "TEKKEN™8";}; | ||||
|       rules = ["tag +games"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {initialTitle = "Dolphin";}; | ||||
|       rules = ["tag +games" "idleinhibit focus"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {tag = "games";}; | ||||
|       rules = ["workspace 6" "immediate"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {title = "Steam";}; | ||||
|       rules = ["workspace 5"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {title = "Steam Settings";}; | ||||
|       rules = ["float" "size 50%" "center 1"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {class = "firefox";}; | ||||
|       rules = ["idleinhibit fullscreen"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {class = "1Password";}; | ||||
|       rules = ["center 1" "float" "size 50%"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {title = "BTOP";}; | ||||
|       rules = ["float" "size 85%" "pin" "center 1" "stayfocused" "dimaround"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {class = "vesktop";}; | ||||
|       rules = ["workspace 4 silent"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {title = "^(Picture-in-Picture)$";}; | ||||
|       rules = ["float" "pin"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {title = "^(Open Files)$";}; | ||||
|       rules = ["center 1" "float" "size 50%"]; | ||||
|     } | ||||
|     { | ||||
|       matches = {initialTitle = "dropdown";}; | ||||
|       rules = [ | ||||
|         "monitor 0" | ||||
|         "animation slide down" | ||||
|         "float" | ||||
|         "move 12 46" | ||||
|         "size ${widthMinusGaps} 30%" | ||||
|       ]; | ||||
|     } | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										37
									
								
								modules/home/workstation/hyprland/settings/workspaces.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								modules/home/workstation/hyprland/settings/workspaces.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| {osConfig, ...}: let | ||||
|   inherit (osConfig.ooknet) hardware; | ||||
|   multiMonitor = builtins.length hardware.monitors > 1; | ||||
|   primary = hardware.primaryMonitor; | ||||
|   secondary = | ||||
|     if multiMonitor | ||||
|     then (builtins.elemAt hardware.monitors 1).name | ||||
|     else primary; | ||||
| in { | ||||
|   wayland.windowManager.hyprland.workspaces = { | ||||
|     "1" = { | ||||
|       name = "terminal"; | ||||
|       monitor = primary; | ||||
|       default = true; | ||||
|     }; | ||||
|     "2" = { | ||||
|       name = "browser"; | ||||
|       monitor = primary; | ||||
|     }; | ||||
|     "3" = { | ||||
|       name = "media"; | ||||
|       monitor = secondary; | ||||
|       default = true; | ||||
|     }; | ||||
|     "4" = { | ||||
|       name = "discord"; | ||||
|       monitor = secondary; | ||||
|     }; | ||||
|     "5" = { | ||||
|       name = "gaming"; | ||||
|       monitor = primary; | ||||
|     }; | ||||
|     "r[6-9]" = { | ||||
|       monitor = primary; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -3,17 +3,17 @@ | |||
|   pkgs, | ||||
|   config, | ||||
|   lib, | ||||
|   hozen, | ||||
|   self', | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf getExe elem; | ||||
|   inherit (builtins) attrValues; | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) palette; | ||||
|   inherit (osConfig.networking) hostName; | ||||
|   inherit (osConfig.ooknet.console.tools) zellij; | ||||
|   inherit (osConfig.ooknet.console) multiplexer; | ||||
|   inherit (osConfig.ooknet.workstation) profiles; | ||||
|   inherit (osConfig.age.secrets) spotify_key; | ||||
|   inherit (config.ooknet) binds; | ||||
|   inherit (hozen) color; | ||||
| in { | ||||
|   config = mkIf (elem "media" profiles) { | ||||
|     home.packages = attrValues { | ||||
|  | @ -35,6 +35,7 @@ in { | |||
|     programs = { | ||||
|       spotify-player = { | ||||
|         enable = true; | ||||
|         package = self'.packages.spotify-player; | ||||
|         settings = { | ||||
|           theme = "default"; | ||||
|           client_id_command = "cat ${spotify_key.path}"; | ||||
|  | @ -58,14 +59,12 @@ in { | |||
|           pause_icon = "▌▌"; | ||||
|           liked_icon = "♥"; | ||||
|           playback_window_position = "Top"; | ||||
|           cover_img_length = 9; | ||||
|           cover_img_width = 5; | ||||
|           playback_window_width = 6; | ||||
| 
 | ||||
|           device = { | ||||
|             name = "${hostName}"; | ||||
|             device_type = "speaker"; | ||||
|             volume = 100; | ||||
|             volume = 60; | ||||
|             bitrate = 320; | ||||
|             audio_cache = false; | ||||
|             normalization = false; | ||||
|  | @ -80,56 +79,25 @@ in { | |||
|           color = { | ||||
|             gradient = 1; | ||||
|             gradient_count = 5; | ||||
|             gradient_color_1 = "'#${palette.base0A}'"; | ||||
|             gradient_color_2 = "'#${palette.base0B}'"; | ||||
|             gradient_color_3 = "'#${palette.base0C}'"; | ||||
|             gradient_color_4 = "'#${palette.base0D}'"; | ||||
|             gradient_color_5 = "'#${palette.base0E}'"; | ||||
|             gradient_color_1 = "'#${color.primary.base}'"; | ||||
|             gradient_color_2 = "'#${color.primary.hard1}'"; | ||||
|             gradient_color_3 = "'#${color.primary.hard2}'"; | ||||
|             gradient_color_4 = "'#${color.primary.hard3}'"; | ||||
|             gradient_color_5 = "'#${color.primary.hard4}'"; | ||||
|           }; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     xdg.configFile."zellij/layouts/music.kdl".text = | ||||
|       mkIf (zellij.enable || multiplexer == "zellij") | ||||
|       /* | ||||
|       kdl | ||||
|       */ | ||||
|     programs.zellij.layouts.music = { | ||||
|       icon = ""; | ||||
|       tabs = | ||||
|         # kdl | ||||
|         '' | ||||
|         layout { | ||||
|         default_tab_template { | ||||
|             pane size=2 borderless=true { | ||||
|                 plugin location="file:${pkgs.zjstatus}/bin/zjstatus.wasm" { | ||||
|                     format_left   "{mode}" | ||||
|                     format_right  "{session} {datetime}" | ||||
|                     format_center "#[fg=#89B4FA,bold] {tabs}" | ||||
|                     format_space  "" | ||||
| 
 | ||||
|                     border_enabled  "true" | ||||
|                     border_char     "─" | ||||
|                     border_format   "#[fg=#${palette.base0D}]{char}" | ||||
|                     border_position "bottom" | ||||
| 
 | ||||
|                     hide_frame_for_single_pane "true" | ||||
| 
 | ||||
|                     mode_normal       "#[fg=${palette.base0D}]" | ||||
| 
 | ||||
|                     tab_normal   "#[bg=#${palette.base01}] {name} " | ||||
|                     tab_active   "#[bg=#${palette.base02}] {name} " | ||||
|                     tab_separator "  " | ||||
| 
 | ||||
|                     datetime        "#[fg=#${palette.base05},bold] {format} " | ||||
|                     datetime_format "%I:%M %p" | ||||
|                     datetime_timezone "${osConfig.time.timeZone}" | ||||
|                 } | ||||
|             } | ||||
|             children | ||||
|         } | ||||
| 
 | ||||
|           tab name="spotify" focus=true { | ||||
|             pane name="spotify" { | ||||
|               borderless true | ||||
|                     command "${getExe pkgs.spotify-player}" | ||||
|               command "${getExe self'.packages.spotify-player}" | ||||
|               focus true | ||||
|             } | ||||
|             pane name="Visualizer" { | ||||
|  | @ -139,11 +107,7 @@ in { | |||
|               command "${getExe pkgs.cava}" | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         ''; | ||||
| 
 | ||||
|     home.shellAliases = mkIf (zellij.enable || multiplexer == "zellij") { | ||||
|       zjm = "zellij --layout music"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ | |||
|   # admin = osConfig.ooknet.host.admin; | ||||
|   # TODO: use admin.githubUsername | ||||
|   notesRepo = "git@github.com:ooks-io/notes.git"; | ||||
|   notesPath = "${config.xdg.userDirs.documents}/notes"; | ||||
|   notesPath = "${config.xdg.userDirs.extraConfig.XDG_NOTES_DIR}"; | ||||
| in { | ||||
|   config = mkIf (elem "productivity" profiles) { | ||||
|     home.packages = [pkgs.obsidian]; | ||||
|  |  | |||
|  | @ -1,12 +1,13 @@ | |||
| { | ||||
|   lib, | ||||
|   osConfig, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf elem; | ||||
|   inherit (osConfig.ooknet.appearance.colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance) fonts; | ||||
|   inherit (osConfig.ooknet.workstation) profiles; | ||||
|   inherit (hozen) color; | ||||
| 
 | ||||
|   zathuraMime = {"application/pdf" = ["org.pwmt.zathura.desktop"];}; | ||||
| in { | ||||
|  | @ -17,26 +18,26 @@ in { | |||
|         font = "${fonts.regular.family} 14"; | ||||
|         recolor = true; | ||||
|         selection-clipboard = "clipboard"; | ||||
|         default-bg = "#${palette.base00}"; | ||||
|         default-fg = "#${palette.base01}"; | ||||
|         statusbar-bg = "#${palette.base02}"; | ||||
|         statusbar-fg = "#${palette.base04}"; | ||||
|         inputbar-bg = "#${palette.base00}"; | ||||
|         inputbar-fg = "#${palette.base07}"; | ||||
|         notification-bg = "#${palette.base00}"; | ||||
|         notification-fg = "#${palette.base07}"; | ||||
|         notification-error-bg = "#${palette.base00}"; | ||||
|         notification-error-fg = "#${palette.base08}"; | ||||
|         notification-warning-bg = "#${palette.base00}"; | ||||
|         notification-warning-fg = "#${palette.base08}"; | ||||
|         highlight-color = "#${palette.base0A}"; | ||||
|         highlight-active-color = "#${palette.base0D}"; | ||||
|         completion-bg = "#${palette.base01}"; | ||||
|         completion-fg = "#${palette.base05}"; | ||||
|         completions-highlight-bg = "#${palette.base0D}"; | ||||
|         completions-highlight-fg = "#${palette.base07}"; | ||||
|         recolor-lightcolor = "#${palette.base00}"; | ||||
|         recolor-darkcolor = "#${palette.base06}"; | ||||
|         default-bg = "#${color.layout.body}"; | ||||
|         default-fg = "#${color.typography.text}"; | ||||
|         statusbar-bg = "#${color.layout.header}"; | ||||
|         statusbar-fg = "#${color.typography.text}"; | ||||
|         inputbar-bg = "#${color.layout.menu}"; | ||||
|         inputbar-fg = "#${color.typography.text-bright}"; | ||||
|         notification-bg = "#${color.layout.menu}"; | ||||
|         notification-fg = "#${color.typography.text}"; | ||||
|         notification-error-bg = "#${color.layout.menu}"; | ||||
|         notification-error-fg = "#${color.error.base}"; | ||||
|         notification-warning-bg = "#${color.layout.menu}"; | ||||
|         notification-warning-fg = "#${color.warning.base}"; | ||||
|         highlight-color = "#${color.primary.base}"; | ||||
|         highlight-active-color = "#${color.primary.hard1}"; | ||||
|         completion-bg = "#${color.layout.menu}"; | ||||
|         completion-fg = "#${color.typography.text}"; | ||||
|         completion-highlight-bg = "#${color.primary.base}"; | ||||
|         completion-highlight-fg = "#${color.typography.contrast-text}"; | ||||
|         recolor-lightcolor = "#${color.typography.text}"; | ||||
|         recolor-darkcolor = "#${color.layout.body}"; | ||||
|       }; | ||||
|     }; | ||||
|     xdg.mimeApps = { | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./foot.nix | ||||
|     ./ghostty.nix | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
|  | @ -1,12 +1,29 @@ | |||
| { | ||||
|   osConfig, | ||||
|   lib, | ||||
|   hozen, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (osConfig.ooknet.appearance) colorscheme fonts; | ||||
|   inherit (colorscheme) palette; | ||||
|   inherit (osConfig.ooknet.appearance.fonts) monospace; | ||||
|   inherit (hozen) color; | ||||
|   inherit (lib) mkMerge mkIf; | ||||
|   inherit (osConfig.ooknet.workstation) default; | ||||
| 
 | ||||
|   mkFontConfig = font: style: let | ||||
|     mkFont = f: let | ||||
|       sizeAttr = | ||||
|         if f.bitmap | ||||
|         then "pixelsize" | ||||
|         else "size"; | ||||
|       familyStyle = f.variants.${style} or f.variants.regular; | ||||
|     in "${familyStyle}:${sizeAttr}=${toString font.size}"; | ||||
|     primary = mkFont font; | ||||
|     fallback = | ||||
|       if font.fallback != null | ||||
|       then ",${mkFont font.fallback}" | ||||
|       else ""; | ||||
|   in "${primary}${fallback}"; | ||||
| 
 | ||||
|   cfg = osConfig.ooknet.workstation.programs.foot; | ||||
| in { | ||||
|   config = mkMerge [ | ||||
|  | @ -17,16 +34,17 @@ in { | |||
|         settings = { | ||||
|           main = { | ||||
|             term = "xterm-256color"; | ||||
|             font = "${fonts.monospace.family}:pixelsize=18:antialias=true"; | ||||
|             font-bold = "${fonts.monospace.family}:style=Bold:pixelsize=18:antialias=true"; | ||||
|             font-italic = "${fonts.monospace.family}:style=Italic:pixelsize=18:antialias=true"; | ||||
|             font-bold-italic = "${fonts.monospace.family}:style=Bold Italic:pixelsize=18:antialias=true"; | ||||
|             dpi-aware = "yes"; | ||||
|             letter-spacing = "-1px"; | ||||
|             font = mkFontConfig monospace "regular"; | ||||
|             font-bold = mkFontConfig monospace "bold"; | ||||
|             font-italic = mkFontConfig monospace "italic"; | ||||
|             font-bold-italic = mkFontConfig monospace "boldItalic"; | ||||
|             dpi-aware = false; | ||||
|             letter-spacing = "0"; | ||||
|             bold-text-in-bright = "palette-based"; | ||||
|             resize-delay-ms = "80"; | ||||
|             pad = "9x9 center"; | ||||
|             selection-target = "clipboard"; | ||||
|             font-size-adjustment = "1px"; | ||||
|           }; | ||||
| 
 | ||||
|           tweak = { | ||||
|  | @ -41,30 +59,30 @@ in { | |||
| 
 | ||||
|           colors = { | ||||
|             alpha = 1.0; | ||||
|             foreground = "${palette.base05}"; | ||||
|             background = "${palette.base00}"; | ||||
|             regular0 = "${palette.base00}"; # black | ||||
|             regular1 = "${palette.red}"; # red | ||||
|             regular2 = "${palette.green}"; # green | ||||
|             regular3 = "${palette.yellow}"; # yellow | ||||
|             regular4 = "${palette.blue}"; # blue | ||||
|             regular5 = "${palette.purple}"; # magenta | ||||
|             regular6 = "${palette.cyan}"; # cyan | ||||
|             regular7 = "${palette.base05}"; # white | ||||
|             bright0 = "${palette.base03}"; # bright black | ||||
|             bright1 = "${palette.bright-red}"; # bright red | ||||
|             bright2 = "${palette.bright-green}"; # bright green | ||||
|             bright3 = "${palette.bright-yellow}"; # bright yellow | ||||
|             bright4 = "${palette.bright-blue}"; # bright blue | ||||
|             bright5 = "${palette.bright-purple}"; # bright magenta | ||||
|             bright6 = "${palette.bright-cyan}"; # bright cyan | ||||
|             bright7 = "${palette.base07}"; # bright white | ||||
|             "16" = "${palette.base09}"; | ||||
|             "17" = "${palette.base0F}"; | ||||
|             "18" = "${palette.base01}"; | ||||
|             "19" = "${palette.base02}"; | ||||
|             "20" = "${palette.base04}"; | ||||
|             "21" = "${palette.base06}"; | ||||
|             foreground = "${color.base05}"; | ||||
|             background = "${color.base00}"; | ||||
|             regular0 = "${color.base00}"; # black | ||||
|             regular1 = "${color.base08}"; # red | ||||
|             regular2 = "${color.base0B}"; # green | ||||
|             regular3 = "${color.base0A}"; # yellow | ||||
|             regular4 = "${color.base0D}"; # blue | ||||
|             regular5 = "${color.base0E}"; # magenta | ||||
|             regular6 = "${color.base0C}"; # cyan | ||||
|             regular7 = "${color.base05}"; # white | ||||
|             bright0 = "${color.base03}"; # bright black | ||||
|             bright1 = "${color.base08}"; # bright red | ||||
|             bright2 = "${color.base0B}"; # bright green | ||||
|             bright3 = "${color.base0A}"; # bright yellow | ||||
|             bright4 = "${color.base0D}"; # bright blue | ||||
|             bright5 = "${color.base0E}"; # bright magenta | ||||
|             bright6 = "${color.base0C}"; # bright cyan | ||||
|             bright7 = "${color.base07}"; # bright white | ||||
|             "16" = "${color.base09}"; | ||||
|             "17" = "${color.base0F}"; | ||||
|             "18" = "${color.base01}"; | ||||
|             "19" = "${color.base02}"; | ||||
|             "20" = "${color.base04}"; | ||||
|             "21" = "${color.base06}"; | ||||
|           }; | ||||
|         }; | ||||
|       }; | ||||
|  | @ -73,7 +91,6 @@ in { | |||
|     (mkIf (default.terminal == "foot") { | ||||
|       home.sessionVariables = { | ||||
|         TERMINAL = "foot"; | ||||
|         TERM = "foot"; | ||||
|       }; | ||||
|       ooknet.binds.terminal = "foot"; | ||||
|       ooknet.binds.terminalLaunch = "foot"; | ||||
|  |  | |||
							
								
								
									
										91
									
								
								modules/home/workstation/terminal/ghostty.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								modules/home/workstation/terminal/ghostty.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,91 @@ | |||
| { | ||||
|   lib, | ||||
|   hozen, | ||||
|   osConfig, | ||||
|   config, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf mkMerge; | ||||
|   inherit (hozen) color; | ||||
|   inherit (osConfig.ooknet.host) admin; | ||||
|   inherit (osConfig.ooknet.appearance.fonts) monospace; | ||||
|   inherit (osConfig.ooknet.workstation) default; | ||||
| 
 | ||||
|   # getShader = shader: "${self'.packages.ghostty-shaders}/${shader}.glsl"; | ||||
| 
 | ||||
|   cfg = osConfig.ooknet.workstation.programs.ghostty; | ||||
| in { | ||||
|   config = mkMerge [ | ||||
|     (mkIf (cfg.enable || default.terminal == "ghostty") { | ||||
|       programs.ghostty = { | ||||
|         enable = true; | ||||
|         enableFishIntegration = admin.shell == "fish"; | ||||
|         clearDefaultKeybinds = true; | ||||
|         settings = { | ||||
|           # defined below | ||||
|           theme = "hozen"; | ||||
| 
 | ||||
|           # font config | ||||
|           font-size = monospace.size; | ||||
|           font-family = monospace.family; | ||||
| 
 | ||||
|           # padding | ||||
|           window-padding-x = 9; | ||||
|           window-padding-y = 9; | ||||
| 
 | ||||
|           # box drawing glyph thickness | ||||
|           adjust-box-thickness = -10; # why where they so thick? | ||||
| 
 | ||||
|           # disable the decorations | ||||
|           gtk-titlebar = false; | ||||
|           window-decoration = false; | ||||
|           resize-overlay = "never"; | ||||
| 
 | ||||
|           # disable close terminal prompt | ||||
|           confirm-close-surface = false; | ||||
| 
 | ||||
|           keybind = [ | ||||
|             "ctrl+equal=increase_font_size:1" | ||||
|             "ctrl+minus=decrease_font_size:1" | ||||
|             "ctrl+zero=reset_font_size" | ||||
|             "ctrl+shift+v=paste_from_clipboard" | ||||
|             "ctrl+shift+c=copy_to_clipboard" | ||||
|           ]; | ||||
|         }; | ||||
|         themes.hozen = { | ||||
|           background = "${color.base00}"; | ||||
|           foreground = "${color.base05}"; | ||||
|           palette = [ | ||||
|             "0=#${color.base00}" # black | ||||
|             "1=#${color.base08}" # red | ||||
|             "2=#${color.base0B}" # green | ||||
|             "3=#${color.base0A}" # yellow | ||||
|             "4=#${color.base0D}" # blue | ||||
|             "5=#${color.base0E}" # magenta | ||||
|             "6=#${color.base0C}" # cyan | ||||
|             "7=#${color.base05}" # white | ||||
|             "8=#${color.base03}" # bright black | ||||
|             "9=#${color.base08}" # bright red | ||||
|             "10=#${color.base0B}" # bright green | ||||
|             "11=#${color.base0A}" # bright yellow | ||||
|             "12=#${color.base0D}" # bright blue | ||||
|             "13=#${color.base0E}" # bright magenta | ||||
|             "14=#${color.base0C}" # bright cyan | ||||
|             "15=#${color.base07}" # bright white | ||||
|           ]; | ||||
|         }; | ||||
|       }; | ||||
|     }) | ||||
|     (mkIf (default.terminal == "ghostty") { | ||||
|       home.sessionVariables = { | ||||
|         TERMINAL = "ghostty"; | ||||
|       }; | ||||
|       ooknet.binds = { | ||||
|         terminal = "ghostty"; | ||||
|         terminalLaunch = "ghostty -e"; | ||||
|         terminalDropdown = "ghostty --title=dropdown"; | ||||
|         btop = mkIf config.programs.btop.enable "ghostty --title=BTOP -e btop"; | ||||
|       }; | ||||
|     }) | ||||
|   ]; | ||||
| } | ||||
|  | @ -7,6 +7,9 @@ | |||
|   cfg = osConfig.programs._1password; | ||||
| in { | ||||
|   config = mkIf cfg.enable { | ||||
|     ooknet.binds.password = "1password"; | ||||
|     ooknet.binds = { | ||||
|       password = "1password"; | ||||
|       quickpass = "1password --quick-access"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
|  | @ -1,10 +1,16 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./ookpower.nix | ||||
|     ./tailscale-applet.nix | ||||
|     ./live-buds-cli.nix | ||||
|     ./virt-manager.nix | ||||
|     ./1password.nix | ||||
|     ./ookvolume.nix | ||||
|     ./kdeconnect.nix | ||||
|     ./ookbrightness.nix | ||||
|     ./zellijMenu.nix | ||||
|     ./syncthing-applet.nix | ||||
|     ./nemo.nix | ||||
|     ./qtscrcpy.nix | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										13
									
								
								modules/home/workstation/tools/live-buds-cli.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								modules/home/workstation/tools/live-buds-cli.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | |||
| { | ||||
|   osConfig, | ||||
|   self', | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf elem; | ||||
|   inherit (osConfig.ooknet.hardware) features; | ||||
| in { | ||||
|   config = mkIf (elem "bluetooth" features) { | ||||
|     home.packages = [self'.packages.live-buds-cli]; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										12
									
								
								modules/home/workstation/tools/nemo.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								modules/home/workstation/tools/nemo.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| {pkgs, ...}: let | ||||
|   nemoMime = { | ||||
|     "inode/directory" = ["nemo.desktop"]; | ||||
|   }; | ||||
| in { | ||||
|   home.packages = [pkgs.nemo-with-extensions]; | ||||
|   xdg.mimeApps = { | ||||
|     associations.added = nemoMime; | ||||
|     defaultApplications = nemoMime; | ||||
|   }; | ||||
|   ooknet.binds.fileManager = "nemo"; | ||||
| } | ||||
|  | @ -1,14 +1,177 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   inputs', | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (config.programs) rofi; | ||||
| 
 | ||||
|   powermenu = pkgs.writeShellApplication { | ||||
|     name = "powermenu"; | ||||
|     runtimeInputs = [pkgs.rofi-wayland]; | ||||
|     text = | ||||
|       # bash | ||||
|       '' | ||||
| 
 | ||||
|         pid_file="/tmp/my_countdown.pid" | ||||
| 
 | ||||
|         DRY= | ||||
|         COUNTDOWN= | ||||
| 
 | ||||
|         while [ $# -gt 0 ]; do | ||||
|           key="$1" | ||||
|           case $key in | ||||
|           -c | --countdown) | ||||
|             COUNTDOWN=true | ||||
|             shift | ||||
|             ;; | ||||
|           -d | --dry) | ||||
|             DRY=true | ||||
|             shift | ||||
|             ;; | ||||
|           *) | ||||
|             break | ||||
|             ;; | ||||
|           esac | ||||
|         done | ||||
| 
 | ||||
|         notify() { | ||||
|           notify-send -u critical -a system-notify -t 1000 -h string:x-canonical-private-synchronous:anything "$@" | ||||
|         } | ||||
| 
 | ||||
|         # Used for development, instead of running command, notifies if command was successful and exits. | ||||
|         dry_success() { | ||||
|           if [ "$DRY" == "true" ]; then | ||||
|             TITLE="Action Successful:" | ||||
|             notify "$TITLE" "$1" | ||||
|             exit 0 | ||||
|           fi | ||||
|         } | ||||
| 
 | ||||
|         cancel() { | ||||
|           if [ -f "$pid_file" ]; then | ||||
|             # Read the process ID from the file and kill the process | ||||
|             kill "$(cat "$pid_file")" &>/dev/null | ||||
|             notify-send "Action canceled" | ||||
|             rm -f "$pid_file" | ||||
|           else | ||||
|             echo "No countdown to cancel." | ||||
|           fi | ||||
|         } | ||||
| 
 | ||||
|         countdown() { | ||||
|           if [ "$COUNTDOWN" == "true" ]; then | ||||
|             msg="''${1:-doing something}" | ||||
|             echo $$ >"$pid_file" | ||||
|             for i in {5..1}; do | ||||
|               notify-send "$msg in $i" -h string:x-canonical-private-synchronous:anything | ||||
|               sleep 1 | ||||
|             done | ||||
|             echo "Countdown done" | ||||
|             rm -f "$pid_file" | ||||
|           fi | ||||
|         } | ||||
| 
 | ||||
|         action_logout() { | ||||
|           countdown "Logging out" | ||||
|           dry_success "Logged out" | ||||
|           PROCESS="Hyprland|\.Hyprland-wrapp" | ||||
|           if pgrep -x $PROCESS >/dev/null; then | ||||
|             hyprctl dispatch exit 0 | ||||
|             sleep 2 | ||||
|             if pgrep -x $PROCESS; then | ||||
|               pkill -9 $PROCESS | ||||
|             fi | ||||
|           fi | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         action_poweroff() { | ||||
|           countdown "Shutting down" | ||||
|           dry_success "Shutdown" | ||||
|           poweroff | ||||
|         } | ||||
| 
 | ||||
|         action_lock() { | ||||
|           dry_success "Screen Locked" | ||||
|           hyprlock | ||||
|         } | ||||
| 
 | ||||
|         action_reboot() { | ||||
|           countdown "Rebooting" | ||||
|           dry_success "Reboot" | ||||
|           reboot | ||||
|         } | ||||
| 
 | ||||
|         action_suspend() { | ||||
|           countdown "Suspending" | ||||
|           dry_success "Suspend" | ||||
|           suspend | ||||
|         } | ||||
| 
 | ||||
|         action_dmenu() { | ||||
|           selection=$(echo -e " Reboot\n Lock\n Logout\n Shutdown\n Suspend" | rofi -dmenu -i) | ||||
| 
 | ||||
|           case "$selection" in | ||||
|           " Shutdown") action_poweroff ;; | ||||
|           " Reboot") action_reboot ;; | ||||
|           " Lock") action_lock ;; | ||||
|           " Logout") action_logout ;; | ||||
|           " Suspend") action_suspend ;; | ||||
|           *) | ||||
|             echo "ERROR" "Invalid option" | ||||
|             exit 1 | ||||
|             ;; | ||||
|           esac | ||||
|         } | ||||
|         # Check if the script is already running and decide to cancel or start countdown | ||||
|         if [ -f "$pid_file" ]; then | ||||
|           cancel | ||||
|         else | ||||
|           ACTION=''${1:-usage} | ||||
|           case "$ACTION" in | ||||
|           logout) | ||||
|             action_logout | ||||
|             ;; | ||||
|           poweroff) | ||||
|             action_poweroff | ||||
|             ;; | ||||
|           reboot) | ||||
|             action_reboot | ||||
|             ;; | ||||
|           lock) | ||||
|             action_lock | ||||
|             ;; | ||||
|           usage) | ||||
|             echo " Usage: powermenu [OPTION]... [ACTION usage|dmenu|logout|poweroff|reboot|lock]" | ||||
|             echo "" | ||||
|             echo "Options:" | ||||
|             echo "  -c, --countdown       Enable 5 seconds countdown before action is performed" | ||||
|             echo "  -d, --dry             Print instead of perform action debug/development" | ||||
|             echo "" | ||||
|             echo "Actions:" | ||||
|             echo "  usage                 Print help information" | ||||
|             echo "  dmenu                 Open menu with rofi for selecting action" | ||||
|             echo "  logout                Kills current active Hyprland session" | ||||
|             echo "  poweroff              Shut down current host" | ||||
|             echo "  reboot                Restart current host" | ||||
|             echo "  lock                  Locks current session with hyprlock" | ||||
|             echo "" | ||||
|             ;; | ||||
|           dmenu) | ||||
|             action_dmenu | ||||
|             ;; | ||||
|           *) | ||||
|             echo "Invalid action: $ACTION (expecting: usage|logout|poweroff|reboot|lock)" | ||||
|             ;; | ||||
|           esac | ||||
|         fi | ||||
|       ''; | ||||
|   }; | ||||
| in { | ||||
|   config = mkIf rofi.enable { | ||||
|     home.packages = [inputs'.ooks-scripts.packages.powermenu]; | ||||
|     home.packages = [powermenu]; | ||||
|     ooknet.binds.powerMenu = "powermenu -c dmenu"; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										5
									
								
								modules/home/workstation/tools/qtscrcpy.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								modules/home/workstation/tools/qtscrcpy.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | |||
| {pkgs, ...}: { | ||||
|   home.packages = [ | ||||
|     pkgs.scrcpy | ||||
|   ]; | ||||
| } | ||||
							
								
								
									
										15
									
								
								modules/home/workstation/tools/syncthing-applet.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								modules/home/workstation/tools/syncthing-applet.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| { | ||||
|   osConfig, | ||||
|   pkgs, | ||||
|   lib, | ||||
|   ook, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (ook.lib.services) mkTrayService; | ||||
|   inherit (osConfig.ooknet.host) syncthing; | ||||
| in { | ||||
|   config = mkIf syncthing.enable { | ||||
|     systemd.user.services."syncthing-applet" = mkTrayService "${pkgs.syncthingtray-minimal}/bin/syncthingtray --wait"; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										20
									
								
								modules/home/workstation/tools/tailscale-applet.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								modules/home/workstation/tools/tailscale-applet.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| { | ||||
|   lib, | ||||
|   pkgs, | ||||
|   ook, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (ook.lib.services) mkGraphicalService; | ||||
|   inherit (lib) getExe; | ||||
| in { | ||||
|   systemd.user.services.tailscale-applet = mkGraphicalService { | ||||
|     Unit = { | ||||
|       Description = "Tray applet for tailscale"; | ||||
|       Requires = ["tray.target"]; | ||||
|     }; | ||||
|     Service = { | ||||
|       ExecStart = "${getExe pkgs.tailscale-systray}"; | ||||
|       Restart = "on-abort"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										19
									
								
								modules/home/workstation/tools/virt-manager.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								modules/home/workstation/tools/virt-manager.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| { | ||||
|   lib, | ||||
|   osConfig, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) elem mkIf; | ||||
|   inherit (osConfig.ooknet.workstation) profiles; | ||||
| in { | ||||
|   config = mkIf (elem "virtualization" profiles) { | ||||
|     # setup connections for virt-manager | ||||
|     # see <https://nixos.wiki/wiki/Virt-manager> | ||||
|     dconf.settings = { | ||||
|       "org/virt-manager/virt-manager/connections" = { | ||||
|         autoconnect = ["qemu:///system"]; | ||||
|         uris = ["qemu:///system"]; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -10,7 +10,7 @@ | |||
|   inherit (config.ooknet) binds; | ||||
|   zellijmenu = pkgs.writeShellApplication { | ||||
|     name = "zellijmenu"; | ||||
|     runtimeInputs = with pkgs; [coreutils rofi-wayland]; | ||||
|     runtimeInputs = with pkgs; [zellij coreutils rofi-wayland]; | ||||
|     text = | ||||
|       /* | ||||
|       bash | ||||
|  | @ -91,7 +91,7 @@ | |||
|                 echo "No layout given" | ||||
|                 continue | ||||
|               fi | ||||
|               zellij_cmd -s "$session_name" --layout "$layout" | ||||
|               zellij_cmd  --layout "$layout" attach -c "$session_name" | ||||
|               break | ||||
|               ;; | ||||
|             "select") | ||||
|  |  | |||
|  | @ -1,29 +1,53 @@ | |||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) isString hasPrefix removePrefix mkOption mkOptionType; | ||||
|   inherit (lib.types) enum str nullOr package path int attrsOf coercedTo; | ||||
|   hexColorType = mkOptionType { | ||||
|     name = "hex-color"; | ||||
|     descriptionClass = "noun"; | ||||
|     description = "RGB color in hex format"; | ||||
|     check = x: isString x && !(hasPrefix "#" x); | ||||
| {lib, ...}: let | ||||
|   inherit (lib) mkOption; | ||||
|   inherit (lib.types) str package path int bool submodule nullOr; | ||||
| 
 | ||||
|   mkVariantOption = { | ||||
|     regular = mkOption { | ||||
|       type = str; | ||||
|       default = ""; | ||||
|     }; | ||||
|     bold = mkOption { | ||||
|       type = str; | ||||
|       default = ""; | ||||
|     }; | ||||
|     italic = mkOption { | ||||
|       type = str; | ||||
|       default = ""; | ||||
|     }; | ||||
|     boldItalic = mkOption { | ||||
|       type = str; | ||||
|       default = ""; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   mkFontOption = { | ||||
|   mkBaseFontOption = { | ||||
|     family = mkOption { | ||||
|       type = str; | ||||
|       default = ""; | ||||
|     }; | ||||
|     variants = mkVariantOption; | ||||
|     package = mkOption { | ||||
|       type = package; | ||||
|       default = null; | ||||
|     }; | ||||
|     size = mkOption { | ||||
|       type = int; | ||||
|       default = 18; | ||||
|     }; | ||||
|     bitmap = mkOption { | ||||
|       type = bool; | ||||
|       default = false; | ||||
|     }; | ||||
|   }; | ||||
|   mkFontOption = | ||||
|     mkBaseFontOption | ||||
|     // { | ||||
|       fallback = mkOption { | ||||
|         type = nullOr (submodule {options = mkBaseFontOption;}); | ||||
|         default = null; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|   cfg = config.ooknet.appearance; | ||||
| in { | ||||
|   #  imports = [./palettes]; | ||||
|   options.ooknet.appearance = { | ||||
|  | @ -51,24 +75,5 @@ in { | |||
|         default = 22; | ||||
|       }; | ||||
|     }; | ||||
|     # Credit to github:misterio77/nix-colors | ||||
|     colorscheme = { | ||||
|       name = mkOption { | ||||
|         type = enum ["gruvbox-material-medium"]; | ||||
|         default = "gruvbox-material-medium"; | ||||
|       }; | ||||
|       variant = mkOption { | ||||
|         type = enum ["dark" "light"]; | ||||
|         default = "dark"; | ||||
|       }; | ||||
|       slug = mkOption { | ||||
|         type = str; | ||||
|         default = "${toString cfg.colorscheme.name}-${toString cfg.colorscheme.variant}"; | ||||
|       }; | ||||
|       palette = mkOption { | ||||
|         type = attrsOf (coercedTo str (removePrefix "#") hexColorType); | ||||
|         default = (import ./palettes/${config.ooknet.appearance.colorscheme.slug}.nix).colorscheme.palette; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
|  | @ -1,285 +0,0 @@ | |||
| let | ||||
|   /* | ||||
|   extended version of gruvbox/gruvbox material to support multiple frameworks: | ||||
| 
 | ||||
|   - tailwind | ||||
|   - base16/24 | ||||
|   - semantic | ||||
| 
 | ||||
|   references: | ||||
| 
 | ||||
|   shades | ||||
|   <https://coolors.co/dfd2b3-d9c7a5-d4be98-c6b395-b4a288-a49384-99897a-8b7c6f> | ||||
|   <https://coolors.co/1a1a1a-212121-282828-343232-3f3b3b-4d4947-585350-645f59-716860-7d6f64> | ||||
| 
 | ||||
|   colors | ||||
|   <https://coolors.co/69713f-737c45-7f884c-8c9654-9aa55c-a9b665-b1be74-b8c481-bec98c-c4ce96> | ||||
|   <https://coolors.co/e57b76-ea6962-e95149-e33e35> | ||||
|   <https://coolors.co/e69965-e78a4e-e07b38-de732b> | ||||
|   */ | ||||
|   colors = { | ||||
|     #shades | ||||
| 
 | ||||
|     shade-50 = "#dfd2b3"; | ||||
|     shade-100 = "#d9c7a5"; | ||||
|     shade-150 = "#d4be98"; | ||||
|     shade-200 = "#c6b395"; | ||||
|     shade-250 = "#b4a288"; | ||||
|     shade-300 = "#a49384"; | ||||
|     shade-350 = "#99897a"; | ||||
|     shade-400 = "#8b7c6f"; | ||||
|     shade-450 = "#7d6f64"; | ||||
|     shade-500 = "#716860"; | ||||
|     shade-550 = "#645f59"; | ||||
|     shade-600 = "#585350"; | ||||
|     shade-650 = "#4d4947"; | ||||
|     shade-700 = "#3f3b3b"; | ||||
|     shade-750 = "#343232"; | ||||
|     shade-800 = "#282828"; | ||||
|     shade-850 = "#212121"; | ||||
|     shade-900 = "#1a1a1a"; | ||||
| 
 | ||||
|     # we use green as the primary color here. | ||||
|     primary = "#a9b665"; | ||||
| 
 | ||||
|     # color scale for our primary accent color. | ||||
|     primary-dark-1 = "#b1be74"; | ||||
|     primary-dark-2 = "${colors.primary-dark-1}"; | ||||
|     primary-dark-3 = "#b8c481"; | ||||
|     primary-dark-4 = "${colors.primary-dark-3}"; | ||||
|     primary-dark-5 = "#bec98c"; | ||||
|     primary-dark-6 = "${colors.primary-dark-4}"; | ||||
|     primary-dark-7 = "#c4ce96"; | ||||
| 
 | ||||
|     primary-light-1 = "#9aa55c"; | ||||
|     primary-light-2 = "${colors.primary-light-1}"; | ||||
|     primary-light-3 = "#8c9654"; | ||||
|     primary-light-4 = "${colors.primary-dark-3}"; | ||||
|     primary-light-5 = "#7f884c"; | ||||
|     primary-light-6 = "${colors.primary-dark-5}"; | ||||
|     primary-light-7 = "#69713f"; | ||||
| 
 | ||||
|     primary-alpha-10 = "${colors.primary}19"; | ||||
|     primary-alpha-20 = "${colors.primary}33"; | ||||
|     primary-alpha-30 = "${colors.primary}4b"; | ||||
|     primary-alpha-40 = "${colors.primary}66"; | ||||
|     primary-alpha-50 = "${colors.primary}80"; | ||||
|     primary-alpha-60 = "${colors.primary}99"; | ||||
|     primary-alpha-70 = "${colors.primary}b3"; | ||||
|     primary-alpha-80 = "${colors.primary}cc"; | ||||
|     primary-alpha-90 = "${colors.primary}e1"; | ||||
| 
 | ||||
|     primary-hover = "${colors.primary-light-2}"; | ||||
|     primary-active = "${colors.primary-light-4}"; | ||||
| 
 | ||||
|     # we use green as the secondary color here. | ||||
|     secondary = "${colors.shade-700}"; | ||||
| 
 | ||||
|     # color scale for our secondary accent color. | ||||
|     secondary-dark-1 = "${colors.shade-550}"; | ||||
|     secondary-dark-2 = "${colors.shade-500}"; | ||||
|     secondary-dark-3 = "${colors.shade-450}"; | ||||
|     secondary-dark-4 = "${colors.shade-400}"; | ||||
|     secondary-dark-5 = "${colors.shade-350}"; | ||||
|     secondary-dark-6 = "${colors.shade-300}"; | ||||
|     secondary-dark-7 = "${colors.shade-250}"; | ||||
|     secondary-dark-8 = "${colors.shade-200}"; | ||||
|     secondary-dark-9 = "${colors.shade-150}"; | ||||
|     secondary-dark-10 = "${colors.shade-100}"; | ||||
|     secondary-dark-11 = "${colors.shade-100}"; | ||||
|     secondary-dark-12 = "${colors.shade-100}"; | ||||
|     secondary-dark-13 = "${colors.shade-100}"; | ||||
| 
 | ||||
|     secondary-light-1 = "${colors.shade-650}"; | ||||
|     secondary-light-2 = "${colors.shade-700}"; | ||||
|     secondary-light-3 = "${colors.shade-750}"; | ||||
|     secondary-light-4 = "${colors.shade-800}"; | ||||
| 
 | ||||
|     secondary-alpha-10 = "${colors.secondary}19"; | ||||
|     secondary-alpha-20 = "${colors.secondary}33"; | ||||
|     secondary-alpha-30 = "${colors.secondary}4b"; | ||||
|     secondary-alpha-40 = "${colors.secondary}66"; | ||||
|     secondary-alpha-50 = "${colors.secondary}80"; | ||||
|     secondary-alpha-60 = "${colors.secondary}99"; | ||||
|     secondary-alpha-70 = "${colors.secondary}b3"; | ||||
|     secondary-alpha-80 = "${colors.secondary}cc"; | ||||
|     secondary-alpha-90 = "${colors.secondary}e1"; | ||||
| 
 | ||||
|     secondary-hover = "${colors.secondary-light-1}"; | ||||
|     secondary-active = "${colors.secondary-light-2}"; | ||||
| 
 | ||||
|     red-light = "#e57b76"; | ||||
|     red = "#ea6962"; | ||||
|     red-dark-1 = "#e7534b"; | ||||
|     red-dark-2 = "#e33e35"; | ||||
| 
 | ||||
|     orange-light = "#e69965"; | ||||
|     orange = "#e78a4e"; | ||||
|     orange-dark-1 = "#e07b38"; | ||||
|     orange-dark-2 = "#de732b"; | ||||
| 
 | ||||
|     yellow-light = "#d9b06d"; | ||||
|     yellow = "#d8a657"; | ||||
|     yellow-dark-1 = "#d09a43"; | ||||
|     yellow-dark-2 = "#c99136"; | ||||
| 
 | ||||
|     olive-light = "#beb874"; | ||||
|     olive = "#b9b25f"; | ||||
|     olive-dark-1 = "#ada652"; | ||||
|     olive-dark-2 = "#9b944b"; | ||||
| 
 | ||||
|     green-light = "#b1be74"; | ||||
|     green = "#a9b665"; | ||||
|     green-dark-1 = "#9aa55c"; | ||||
|     green-dark-2 = "#8c9654"; | ||||
| 
 | ||||
|     teal-light = "#9abb95"; | ||||
|     teal = "#89b482"; | ||||
|     teal-dark-1 = "#7aa573"; | ||||
|     teal-dark-2 = "#6c9a65"; | ||||
| 
 | ||||
|     blue-light = "#91b6ae"; | ||||
|     blue = "#7daea3"; | ||||
|     blue-dark-1 = "#6ea096"; | ||||
|     blue-dark-2 = "#63978d"; | ||||
| 
 | ||||
|     violet-light = "#dba3c7"; | ||||
|     violet = "#d892c1"; | ||||
|     violet-dark-1 = "#cd7eb3"; | ||||
|     violet-dark-2 = "#c86faa"; | ||||
| 
 | ||||
|     purple-light = "#d9a0af"; | ||||
|     purple = "#d3869b"; | ||||
|     purple-dark-1 = "#ca778d"; | ||||
|     purple-dark-2 = "#c26680"; | ||||
| 
 | ||||
|     pink-light = "#d8abcc"; | ||||
|     pink = "#cf91be"; | ||||
|     pink-dark-1 = "#c47eb1"; | ||||
|     pink-dark-2 = "#bc71a8"; | ||||
| 
 | ||||
|     brown-light = "#b18568"; | ||||
|     brown = "#a87757"; | ||||
|     brown-dark-1 = "#976b4e"; | ||||
|     brown-dark-2 = "#896248"; | ||||
| 
 | ||||
|     grey-light = "${colors.shade-350}"; | ||||
|     grey = "${colors.shade-450}"; | ||||
|     grey-dark-1 = "${colors.shade-500}"; | ||||
|     grey-dark-2 = "${colors.shade-550}"; | ||||
| 
 | ||||
|     black-light = "${colors.shade-700}"; | ||||
|     black = "${colors.shade-800}"; | ||||
|     black-dark-1 = "${colors.shade-850}"; | ||||
|     black-dark-2 = "${colors.shade-900}"; | ||||
| 
 | ||||
|     # semantic | ||||
|     body = "${colors.shade-700}"; | ||||
|     header = "${colors.shade-800}"; | ||||
|     text = "${colors.shade-150}"; | ||||
|     text-light = "${colors.shade-100}"; | ||||
|     text-lighter = "${colors.shade-50}"; | ||||
|     texter-dark = "${colors.shade-200}"; | ||||
|     text-darker = "${colors.shade-350}"; | ||||
|     footer = "${colors.shade-800}"; | ||||
|     menu = "${colors.shade-800}"; | ||||
|     border-active = "${colors.shade-150}"; | ||||
|     border-inactive = "${colors.shade-600}"; | ||||
| 
 | ||||
|     error-bg = "${colors.red}"; | ||||
|     error-bg-active = "${colors.red-dark-1}"; | ||||
|     error-bg-hover = "${colors.red-dark-2}"; | ||||
|     error-text = "${colors.shade-800}"; | ||||
|     error-border = "${colors.red-light}"; | ||||
| 
 | ||||
|     success-bg = "${colors.green}"; | ||||
|     success-bg-active = "${colors.green-dark-1}"; | ||||
|     success-bg-hover = "${colors.green-dark-2}"; | ||||
|     success-text = "${colors.shade-800}"; | ||||
|     success-border = "${colors.green-light}"; | ||||
| 
 | ||||
|     warning-bg = "${colors.yellow}"; | ||||
|     warning-bg-active = "${colors.yellow-dark-1}"; | ||||
|     warning-bg-hover = "${colors.yellow-dark-2}"; | ||||
|     warning-text = "${colors.shade-800}"; | ||||
|     warning-border = "${colors.yellow-light}"; | ||||
| 
 | ||||
|     info-bg = "${colors.blue}"; | ||||
|     info-bg-active = "${colors.blue-dark-1}"; | ||||
|     info-bg-hover = "${colors.blue-dark-2}"; | ||||
|     info-text = "${colors.shade-800}"; | ||||
|     info-border = "${colors.blue-light}"; | ||||
| 
 | ||||
|     tip-bg = "${colors.teal}"; | ||||
|     tip-bg-active = "${colors.teal-dark-1}"; | ||||
|     tip-bg-hover = "${colors.teal-dark-2}"; | ||||
|     tip-text = "${colors.shade-800}"; | ||||
|     tip-border = "${colors.teal-light}"; | ||||
| 
 | ||||
|     input-text = "${colors.text-light}"; | ||||
| 
 | ||||
|     # syntax | ||||
| 
 | ||||
|     syntax = { | ||||
|       string = "${colors.green}"; | ||||
|       number = "${colors.purple}"; | ||||
|       float = "${colors.purple}"; | ||||
|       boolean = "${colors.purple}"; | ||||
|       type = "${colors.yellow}"; | ||||
|       structure = "${colors.orange}"; | ||||
|       statement = "${colors.red}"; | ||||
|       label = "${colors.orange}"; | ||||
|       operator = "${colors.orange}"; | ||||
|       identifier = "${colors.blue}"; | ||||
|       function = "${colors.green}"; | ||||
|       storageClass = "${colors.orange}"; | ||||
|       constant = "${colors.teal}"; | ||||
|       exception = "${colors.red}"; | ||||
|       preproc = "${colors.purple}"; | ||||
|       include = "${colors.purple}"; | ||||
|       define = "${colors.purple}"; | ||||
|       macro = "${colors.teal}"; | ||||
|       preCondit = "${colors.purple}"; | ||||
|       special = "${colors.yellow}"; | ||||
|       specialChar = "${colors.yellow}"; | ||||
|       comment = "${colors.text-darker}"; | ||||
|       todo = "${colors.purple}"; | ||||
|       tag = "${colors.tag}"; | ||||
| 
 | ||||
|       mdH1 = "${colors.red}"; | ||||
|       mdH2 = "${colors.orange}"; | ||||
|       mdH3 = "${colors.yellow}"; | ||||
|       mdH4 = "${colors.green}"; | ||||
|       mdH5 = "${colors.blue}"; | ||||
|       mdH6 = "${colors.purple}"; | ||||
|     }; | ||||
| 
 | ||||
|     # base 16/24 | ||||
|     base00 = "${colors.shade-800}"; | ||||
|     base01 = "${colors.shade-700}"; | ||||
|     base02 = "${colors.shade-600}"; | ||||
|     base03 = "${colors.shade-450}"; | ||||
|     base04 = "${colors.shade-300}"; | ||||
|     base05 = "${colors.shade-150}"; | ||||
|     base06 = "${colors.shade-100}"; | ||||
|     base07 = "${colors.shade-50}"; | ||||
|     base08 = "${colors.red}"; | ||||
|     base09 = "${colors.orange}"; | ||||
|     base0A = "${colors.yellow}"; | ||||
|     base0B = "${colors.green}"; | ||||
|     base0C = "${colors.teal}"; | ||||
|     base0D = "${colors.blue}"; | ||||
|     base0E = "${colors.purple}"; | ||||
|     base0F = "${colors.brown}"; | ||||
|     base10 = "${colors.shade-850}"; | ||||
|     base11 = "${colors.shade-900}"; | ||||
|     base12 = "${colors.red-light}"; | ||||
|     base13 = "${colors.yellow-light}"; | ||||
|     base14 = "${colors.green-light}"; | ||||
|     base15 = "${colors.teal-light}"; | ||||
|     base16 = "${colors.blue-light}"; | ||||
|     base17 = "${colors.purple-light}"; | ||||
|   }; | ||||
| in { | ||||
|   inherit colors; | ||||
| } | ||||
|  | @ -1,65 +0,0 @@ | |||
| { | ||||
|   colorscheme = { | ||||
|     palette = { | ||||
|       crust = "#282828"; | ||||
|       mantle = "#32302f"; | ||||
|       base = "#3a3735"; | ||||
|       surface-0 = "#45403d"; | ||||
|       surface-1 = "#504945"; | ||||
|       surface-2 = "#5A524C"; | ||||
|       overlay-0 = "#696059"; | ||||
|       overlay-1 = "#70665C"; | ||||
|       overlay-2 = "#7C6F64"; | ||||
|       subtext-0 = "#928374"; | ||||
|       subtext-1 = "#A89984"; | ||||
|       text = "#d4be98"; | ||||
| 
 | ||||
|       red = "#ea6962"; | ||||
|       dull-red = "#D87974"; | ||||
|       bright-red = "#F47771"; | ||||
|       orange = "#e78a4e"; | ||||
|       dull-orange = "#D39063"; | ||||
|       bright-orange = "#F3995E"; | ||||
|       yellow = "#d8a657"; | ||||
|       dull-yellow = "#c2A16B"; | ||||
|       bright-yellow = "#E5B361"; | ||||
|       green = "#a9b665"; | ||||
|       dull-green = "#989F7A"; | ||||
|       bright-green = "#B8C86A"; | ||||
|       cyan = "#89b482"; | ||||
|       dull-cyan = "#93A790"; | ||||
|       bright-cyan = "#92C78A"; | ||||
|       blue = "#7daea3"; | ||||
|       dull-blue = "#939A98"; | ||||
|       bright-blue = "#85C1B4"; | ||||
|       purple = "#d3869b"; | ||||
|       dull-purple = "#C397A3"; | ||||
|       bright-purple = "#E193A8"; | ||||
| 
 | ||||
|       base00 = "#282828"; | ||||
|       base01 = "#32302f"; | ||||
|       base02 = "#504945"; | ||||
|       base03 = "#7C6F64"; | ||||
|       base04 = "#A89984"; | ||||
|       base05 = "#D4BE98"; | ||||
|       base06 = "#DDc7a1"; | ||||
|       base07 = "#FBF1C7"; | ||||
|       base08 = "#EA6962"; | ||||
|       base09 = "#E78A4E"; | ||||
|       base0A = "#d8a657"; | ||||
|       base0B = "#A9B665"; | ||||
|       base0C = "#89B482"; | ||||
|       base0D = "#7DAEA3"; | ||||
|       base0E = "#D3869B"; | ||||
|       base0F = "#E37B35"; | ||||
|       base10 = "#141617"; | ||||
|       base11 = "#050505"; | ||||
|       base12 = "#F47771"; | ||||
|       base13 = "#D8A657"; | ||||
|       base14 = "#B7C86A"; | ||||
|       base15 = "#92C78A"; | ||||
|       base16 = "#85C1B4"; | ||||
|       base17 = "#E193A8"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,22 +0,0 @@ | |||
| # References: | ||||
| 
 | ||||
| ## Dark | ||||
| 
 | ||||
| ### Shades | ||||
| 
 | ||||
| - (https://coolors.co/1a1a1a-212121-282828-343232-3f3b3b-4d4947-585350-645f59-716860-7d6f64)[Dark] | ||||
| - (https://coolors.co/dfd2b3-d9c7a5-d4be98-c6b395-b4a288-a49384-99897a-8b7c6f)[light] | ||||
| 
 | ||||
| ### Colors | ||||
| 
 | ||||
| - [https://coolors.co/69713f-737c45-7f884c-8c9654-9aa55c-a9b665-b1be74-b8c481-bec98c-c4ce96](Green) | ||||
| - [https://coolors.co/e57b76-ea6962-e95149-e33e35](Red) | ||||
| - [https://coolors.co/e69965-e78a4e-e07b38-de732b](Orange) | ||||
| - [https://coolors.co/d9b06d-d8a657-d09a43-c99136](Yellow) | ||||
| - [https://coolors.co/beb874-b9b25f-ada652-9b944b](Olive) | ||||
| - [https://coolors.co/9abb95-89b482-7aa573-6c9a65](Teal) | ||||
| - [https://coolors.co/91b6ae-7daea3-6ea096-63978d](Blue) | ||||
| - [https://coolors.co/dba3c7-d892c1-cd7eb3-c86faa](Violet) | ||||
| - [https://coolors.co/d9a0af-d3869b-ca778d-c26680](Purple) | ||||
| - [https://coolors.co/d8abcc-cf91be-c47eb1-bc71a8](Pink) | ||||
| - [https://coolors.co/b18568-a87757-976b4e-896248](Brown) | ||||
|  | @ -1,11 +1,10 @@ | |||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   pkgs, | ||||
|   keys, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (config.ooknet.host) admin; | ||||
|   inherit (config.ooknet.secrets) keys; | ||||
| 
 | ||||
|   ifTheyExist = groups: builtins.filter (group: builtins.hasAttr group config.users.groups) groups; | ||||
| in { | ||||
|  |  | |||
|  | @ -1,12 +0,0 @@ | |||
| { | ||||
|   keys, | ||||
|   config, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (config.ooknet.host) admin; | ||||
| in { | ||||
|   users = { | ||||
|     groups.builder = {}; | ||||
|     users.builder = (key: ''command="nix-daemon --stdio",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ${key}'') keys.users.${admin.name}; | ||||
|   }; | ||||
| } | ||||
|  | @ -1,15 +1,16 @@ | |||
| { | ||||
|   imports = [ | ||||
|     ./nix.nix | ||||
|     ./distributed-builds.nix | ||||
|     ./home-manager.nix | ||||
|     ./boot.nix | ||||
|     ./admin.nix | ||||
|     ./locale.nix | ||||
|     ./options.nix | ||||
|     ./secrets.nix | ||||
|     ./openssh.nix | ||||
|     ./tailscale.nix | ||||
|     ./networking.nix | ||||
|     ./security | ||||
|     ./syncthing.nix | ||||
|   ]; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										60
									
								
								modules/nixos/base/distributed-builds.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								modules/nixos/base/distributed-builds.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,60 @@ | |||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|   inherit (config.ooknet.host) admin; | ||||
|   inherit (config.networking) hostName; | ||||
|   inherit (config.ooknet.secrets) keys; | ||||
| 
 | ||||
|   mkBuilderMachine = { | ||||
|     host, | ||||
|     speedFactor, | ||||
|     systems ? ["x86_64-linux"], | ||||
|     supportedFeatures ? ["big-parallel" "kvm" "nixos-test"], | ||||
|     maxJobs, | ||||
|   }: { | ||||
|     inherit speedFactor systems supportedFeatures maxJobs; | ||||
|     hostName = host; | ||||
|     protocol = "ssh-ng"; | ||||
|     sshKey = "/home/${admin.name}/.ssh/builder"; | ||||
|   }; | ||||
| 
 | ||||
|   builders = { | ||||
|     ooksdesk = mkBuilderMachine { | ||||
|       host = "ooksdesk"; | ||||
|       speedFactor = 16; | ||||
|       maxJobs = 4; | ||||
|     }; | ||||
|     ooksmedia = mkBuilderMachine { | ||||
|       host = "ooksmedia"; | ||||
|       speedFactor = 8; | ||||
|       maxJobs = 1; | ||||
|     }; | ||||
|   }; | ||||
| in { | ||||
|   users = mkIf (hostName == "ooksdesk" || hostName == "ooksmedia") { | ||||
|     groups.builder = {}; | ||||
|     users.builder = { | ||||
|       createHome = false; | ||||
|       isSystemUser = true; | ||||
|       useDefaultShell = true; | ||||
|       group = "builder"; | ||||
|       openssh.authorizedKeys.keys = [ | ||||
|         '' | ||||
|           command="nix-daemon --stdio",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ${keys.users.${admin.name}} | ||||
|         '' | ||||
|       ]; | ||||
|     }; | ||||
|   }; | ||||
|   nix = { | ||||
|     distributedBuilds = true; | ||||
|     buildMachines = | ||||
|       if hostName == "ooksdesk" | ||||
|       then [] | ||||
|       else if hostName == "ooksmedia" | ||||
|       then [builders.ooksdesk] | ||||
|       else [builders.ooksdesk builders.ooksmedia]; | ||||
|   }; | ||||
| } | ||||
|  | @ -5,6 +5,8 @@ | |||
|   self', | ||||
|   lib, | ||||
|   config, | ||||
|   hozen, | ||||
|   ook, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkIf; | ||||
|  | @ -16,7 +18,7 @@ in { | |||
|       useUserPackages = true; | ||||
|       backupFileExtension = "hm.old"; | ||||
|       verbose = true; | ||||
|       extraSpecialArgs = {inherit inputs inputs' self self';}; | ||||
|       extraSpecialArgs = {inherit ook hozen inputs inputs' self self';}; | ||||
|       users.${admin.name} = { | ||||
|         imports = ["${self}/modules/home/base"]; | ||||
|       }; | ||||
|  |  | |||
|  | @ -1,5 +1,11 @@ | |||
| {lib, ...}: let | ||||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: let | ||||
|   inherit (lib) mkForce mkDefault; | ||||
|   inherit (config.ooknet) host; | ||||
| in { | ||||
|   networking = { | ||||
|     enableIPv6 = true; | ||||
|  | @ -7,21 +13,21 @@ in { | |||
|     useDHCP = mkForce false; | ||||
|     usePredictableInterfaceNames = mkDefault true; | ||||
|     nameservers = [ | ||||
|       #quad9 IPv6 | ||||
|       "2620:fe::fe" | ||||
|       "2620:fe::9" | ||||
| 
 | ||||
|       #quad9 IPv4 | ||||
|       "9.9.9.9" | ||||
|       "149.112.112.112" | ||||
|       "8.8.8.8" | ||||
|       "8.8.4.4" | ||||
|     ]; | ||||
|     networkmanager = { | ||||
|       enable = true; | ||||
|       dns = "systemd-resolved"; | ||||
|       plugins = mkForce []; | ||||
|       wifi = { | ||||
|         macAddress = "random"; | ||||
|         scanRandMacAddress = true; | ||||
|         # why does my server have wifi? not sure. | ||||
|         # ensure my mac addr is static so I can reserve an IP | ||||
|         macAddress = | ||||
|           if host.role == "server" | ||||
|           then "permanent" | ||||
|           else "random"; | ||||
|         scanRandMacAddress = host.role != "server"; | ||||
|         powersave = true; | ||||
|       }; | ||||
|       unmanaged = ["interface-name:tailscale*"]; | ||||
|  | @ -32,8 +38,10 @@ in { | |||
|       enable = true; | ||||
| 
 | ||||
|       domains = ["~."]; | ||||
|       fallbackDns = ["9.9.9.9"]; #quad9 | ||||
|       fallbackDns = ["8.8.8.8"]; # google dns | ||||
|     }; | ||||
|   }; | ||||
|   systemd.services.NetworkManager-wait-online.enable = false; | ||||
|   # sometimes causes issues with network manager service never actually starting | ||||
|   # requiring me to manually start the service. fine on a workstation, not on a server | ||||
|   systemd.services.NetworkManager-wait-online.serviceConfig.ExecStart = ["" "${pkgs.networkmanager}/bin/nm-online -q"]; | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| { | ||||
|   inputs', | ||||
|   inputs, | ||||
|   pkgs, | ||||
|   lib, | ||||
|  | @ -7,11 +6,15 @@ | |||
|   ... | ||||
| }: let | ||||
|   inherit (builtins) attrValues; | ||||
|   inherit (lib) mkIf mapAttrsToList; | ||||
|   inherit (lib) mkIf mapAttrs mapAttrsToList filterAttrs isType; | ||||
|   inherit (config.ooknet.host) role admin; | ||||
| 
 | ||||
|   flakeInputs = filterAttrs (_: v: isType "flake" v) inputs; | ||||
| 
 | ||||
|   paths = { | ||||
|     FLAKE = "/home/${admin.name}/.config/ooknet"; | ||||
|     FLAKE = "/home/${admin.name}/Summit/ooknet"; | ||||
|     WEBSITE = "${paths.FLAKE}/outputs/pkgs/website"; | ||||
|     KUNZEN = "/home/${admin.name}/Summit/kunzen"; | ||||
|   }; | ||||
| in { | ||||
|   environment = { | ||||
|  | @ -20,7 +23,6 @@ in { | |||
|     defaultPackages = []; | ||||
|     systemPackages = attrValues { | ||||
|       inherit (pkgs) git deadnix statix; | ||||
|       inherit (inputs'.agenix.packages) default; | ||||
|     }; | ||||
| 
 | ||||
|     # location of the configuration flake | ||||
|  | @ -35,28 +37,29 @@ in { | |||
|       dates = "Sun *-*-* 14:00"; | ||||
|       options = "--delete-older-than 14d"; | ||||
|     }; | ||||
|     registry = { | ||||
|       nixpkgs.flake = inputs.nixpkgs; | ||||
|       default.flake = inputs.nixpkgs; | ||||
|     }; | ||||
|     nixPath = mapAttrsToList (name: _: "${name}=${name}") config.nix.registry; | ||||
|     # from github:fufexan | ||||
|     registry = mapAttrs (_: v: {flake = v;}) flakeInputs; | ||||
|     nixPath = mapAttrsToList (key: _: "${key}=flake:${key}") config.nix.registry; | ||||
|     settings = { | ||||
|       trusted-users = ["@wheel" "root" "builder"]; | ||||
|       experimental-features = ["nix-command" "flakes"]; | ||||
|       accept-flake-config = true; | ||||
|       accept-flake-config = false; | ||||
|       auto-optimise-store = true; | ||||
|       warn-dirty = false; | ||||
|       # cache | ||||
|       builders-use-substitutes = true; | ||||
|       substituters = [ | ||||
|         "https://cache.nixos.org?priority=10" | ||||
|         "https://nix-community.cachix.org" | ||||
|         "https://neovim-flake.cachix.org" | ||||
|         "https://ooknet.cachix.org" | ||||
|       ]; | ||||
|       trusted-public-keys = [ | ||||
|         "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" | ||||
|         "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" | ||||
|         "neovim-flake.cachix.org-1:iyQ6lHFhnB5UkVpxhQqLJbneWBTzM8LBYOFPLNH4qZw=" | ||||
|         "ooknet.cachix.org-1:mtr4ue+8ux58b8mgTGRAG/txxHBnZvgX7Gi3amno+zs=" | ||||
|       ]; | ||||
|       # TODO: setup builders -- builders-use-substitutes = true; | ||||
|     }; | ||||
|   }; | ||||
|   nixpkgs = { | ||||
|  | @ -73,7 +76,5 @@ in { | |||
|   # nix rebuild utililty | ||||
|   programs.nh = mkIf (role == "workstation") { | ||||
|     enable = true; | ||||
|     # sets an environment variable FLAKE that nh will refer to by default | ||||
|     flake = mkIf admin.homeManager "/home/${admin.name}/.config/ooknet"; | ||||
|   }; | ||||
| } | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue