commit 72e90c145e6f3312fbb729991613b44d6962c279 Author: Aditya Gupta Date: Thu Jun 11 11:01:51 2026 +0530 init commit diff --git a/fish/completions/copilot.fish b/fish/completions/copilot.fish new file mode 100644 index 0000000..17fdc40 --- /dev/null +++ b/fish/completions/copilot.fish @@ -0,0 +1,103 @@ +# fish completion for copilot +# Generated by `copilot completion fish`. Do not edit by hand. + +complete -c copilot -n '__fish_use_subcommand' -f -a 'login' -d 'Authenticate with Copilot' +complete -c copilot -n '__fish_use_subcommand' -f -a 'help' -d 'Display help information' +complete -c copilot -n '__fish_use_subcommand' -f -a 'init' -d 'Initialize Copilot instructions' +complete -c copilot -n '__fish_use_subcommand' -f -a 'update' -d 'Download the latest version' +complete -c copilot -n '__fish_use_subcommand' -f -a 'version' -d 'Display version information' +complete -c copilot -n '__fish_use_subcommand' -f -a 'plugin' -d 'Manage plugins' +complete -c copilot -n '__fish_use_subcommand' -f -a 'mcp' -d 'Manage MCP servers' +complete -c copilot -n '__fish_use_subcommand' -f -a 'completion' -d 'Generate a shell completion script' +complete -c copilot -l version -s v -f -d 'show version information' +complete -c copilot -l interactive -s i -r -d 'Start interactive mode and automatically execute this prompt' +complete -c copilot -l prompt -s p -r -d 'Execute a prompt in non-interactive mode (exits after completion)' +complete -c copilot -l silent -s s -f -d 'Output only the agent response (no stats), useful for scripting with -p' +complete -c copilot -l enable-memory -f -d 'Enable memory in prompt mode (disabled by default)' +complete -c copilot -l model -r -d 'Set the AI model to use (use \'auto\' to let Copilot pick automatically)' +complete -c copilot -l effort -l reasoning-effort -r -d 'Set the reasoning effort level' -a 'none low medium high xhigh max' +complete -c copilot -l context -r -d 'Set the context window tier (overrides persisted setting)' -a 'default long_context' +complete -c copilot -l enable-reasoning-summaries -f -d 'Request reasoning summaries for OpenAI models' +complete -c copilot -l agent -r -d 'Specify a custom agent to use' +complete -c copilot -l resume -s r -r -d 'Resume from a previous session (optionally specify existing session ID, task ID, ID prefix, or name; name matching is exact, case-insensitive)' +complete -c copilot -l continue -f -d 'Resume the most recent session' +complete -c copilot -l name -s n -r -d 'Set a name for the new session' +complete -c copilot -l session-id -r -d 'Resume an existing session or task by ID, or set the UUID for a new session' +complete -c copilot -l connect -r -d 'Connect directly to a remote session (optionally specify session ID or task ID)' +complete -c copilot -l allow-all-tools -f -d 'Allow all tools to run automatically without confirmation; required for non-interactive mode' +complete -c copilot -l allow-all-paths -f -d 'Disable file path verification and allow access to any path' +complete -c copilot -l disallow-temp-dir -f -d 'Prevent automatic access to the system temporary directory' +complete -c copilot -l no-custom-instructions -f -d 'Disable loading of custom instructions from AGENTS.md and related files' +complete -c copilot -l no-auto-update -f -d 'Disable downloading CLI update automatically (disabled by default in CI environments)' +complete -c copilot -l no-ask-user -f -d 'Disable the ask_user tool (agent works autonomously without asking questions)' +complete -c copilot -l banner -f -d 'Show the startup banner' +complete -c copilot -l no-color -f -d 'Disable all color output' +complete -c copilot -l screen-reader -f -d 'Enable screen reader optimizations' +complete -c copilot -l plain-diff -f -d 'Disable rich diff rendering (syntax highlighting via diff tool specified by git config)' +complete -c copilot -s C -r -d 'Change working directory before doing anything else' +complete -c copilot -l log-dir -r -d 'Set log file directory (default: ~/.copilot/logs/)' +complete -c copilot -l extension-sdk-path -r -d 'Override the bundled @github/copilot-sdk injected into extension subprocesses with a local `copilot-sdk/` folder. Invalid paths fall back to the bundled SDK.' +complete -c copilot -l log-level -r -d 'Set the log level' -a 'none error warning info debug all default' +complete -c copilot -l stream -r -d 'Enable or disable streaming mode' -a 'on off' +complete -c copilot -l output-format -r -d 'Output format: \'text\' (default) or \'json\' (JSONL, one JSON object per line)' -a 'text json' +complete -c copilot -l share -r -d 'Share session to markdown file after completion in non-interactive mode (default: ./copilot-session-.md)' +complete -c copilot -l share-gist -f -d 'Share session to a secret GitHub gist after completion in non-interactive mode' +complete -c copilot -l add-dir -r -d 'Add a directory to the allowed list for file access (can be used multiple times)' +complete -c copilot -l attachment -r -d 'Attach a file (image or native document) to the initial prompt; only valid in non-interactive mode (can be used multiple times)' +complete -c copilot -l disable-mcp-server -r -d 'Disable a specific MCP server (can be used multiple times)' +complete -c copilot -l disable-builtin-mcps -f -d 'Disable all built-in MCP servers (currently: github-mcp-server)' +complete -c copilot -l enable-all-github-mcp-tools -f -d 'Enable all GitHub MCP server tools instead of the default CLI subset. Overrides --add-github-mcp-toolset and --add-github-mcp-tool options.' +complete -c copilot -l add-github-mcp-toolset -r -d 'Add a toolset to enable for the GitHub MCP server instead of the default CLI subset (can be used multiple times). Use "all" for all toolsets.' +complete -c copilot -l add-github-mcp-tool -r -d 'Add a tool to enable for the GitHub MCP server instead of the default CLI subset (can be used multiple times). Use "*" for all tools.' +complete -c copilot -l plugin-dir -r -d 'Load a plugin from a local directory (can be used multiple times)' +complete -c copilot -l additional-mcp-config -r -d 'Additional MCP servers configuration as JSON string or file path (prefix with @) (can be used multiple times; augments config from ~/.copilot/mcp-config.json for this session)' +complete -c copilot -l allow-tool -r -d 'Tools the CLI has permission to use; will not prompt for permission' +complete -c copilot -l deny-tool -r -d 'Tools the CLI does not have permission to use; will not prompt for permission' +complete -c copilot -l available-tools -r -d 'Only these tools will be available to the model' +complete -c copilot -l excluded-tools -r -d 'These tools will not be available to the model' +complete -c copilot -l secret-env-vars -r -d 'Environment variable names whose values are stripped from shell and MCP server environments and redacted from output (e.g., --secret-env-vars=MY_KEY,OTHER_KEY)' +complete -c copilot -l allow-url -r -d 'Allow access to specific URLs or domains' +complete -c copilot -l deny-url -r -d 'Deny access to specific URLs or domains, takes precedence over --allow-url' +complete -c copilot -l allow-all-urls -f -d 'Allow access to all URLs without confirmation' +complete -c copilot -l allow-all -f -d 'Enable all permissions (equivalent to --allow-all-tools --allow-all-paths --allow-all-urls)' +complete -c copilot -l yolo -f -d 'Enable all permissions (equivalent to --allow-all-tools --allow-all-paths --allow-all-urls)' +complete -c copilot -l max-autopilot-continues -r -d 'Maximum number of continuation messages in autopilot mode' +complete -c copilot -l mode -r -d 'Set the initial agent mode' -a 'interactive plan autopilot' +complete -c copilot -l autopilot -f -d 'Start in autopilot mode' +complete -c copilot -l plan -f -d 'Start in plan mode' +complete -c copilot -l experimental -f -d 'Enable experimental features' +complete -c copilot -l no-experimental -f -d 'Disable experimental features' +complete -c copilot -l bash-env -r -d 'Enable BASH_ENV support for bash shells (on|off)' +complete -c copilot -l no-bash-env -f -d 'Disable BASH_ENV support for bash shells' +complete -c copilot -l mouse -r -d 'Enable mouse support in alt screen mode (on|off)' +complete -c copilot -l no-mouse -f -d 'Disable mouse support in alt screen mode' +complete -c copilot -l acp -f -d 'Start as Agent Client Protocol server' +complete -c copilot -l remote -f -d 'Enable remote control of your session from GitHub web and mobile' +complete -c copilot -l no-remote -f -d 'Disable remote control of your session from GitHub web and mobile' +complete -c copilot -n '__fish_seen_subcommand_from login' -l host -r -d 'GitHub host URL (default: https://github.com)' +complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a 'install' -d 'Install a plugin' +complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a 'uninstall' -d 'Uninstall a plugin' +complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a 'update' -d 'Update a plugin' +complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a 'list' -d 'List installed plugins' +complete -c copilot -n '__fish_seen_subcommand_from plugin' -f -a 'marketplace' -d 'Manage plugin marketplaces' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from update' -l all -f -d 'Update all installed plugins' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a 'add' -d 'Add a marketplace' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a 'remove' -d 'Remove a marketplace' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a 'list' -d 'List registered marketplaces' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a 'browse' -d 'Browse plugins in a marketplace' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace' -f -a 'update' -d 'Update marketplace plugin catalogs' +complete -c copilot -n '__fish_seen_subcommand_from plugin; and __fish_seen_subcommand_from marketplace; and __fish_seen_subcommand_from remove' -l force -s f -f -d 'Force removal even if plugins are installed' +complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a 'list' -d 'List configured MCP servers' +complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a 'get' -d 'Show server details' +complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a 'add' -d 'Add an MCP server' +complete -c copilot -n '__fish_seen_subcommand_from mcp' -f -a 'remove' -d 'Remove an MCP server' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from list' -l json -f -d 'Output as JSON' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from get' -l json -f -d 'Output as JSON' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from get' -l show-secrets -f -d 'Show full environment variable and header values (masked by default)' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l transport -r -d 'Server transport' -a 'stdio http sse' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l env -r -d 'Environment variable (KEY=VALUE, can be repeated)' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l header -r -d 'HTTP header for remote servers, can be repeated' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l tools -r -d 'Tool filter: "*" for all, comma-separated list, or "" for none' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l timeout -r -d 'Timeout in milliseconds' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l json -f -d 'Output added config as JSON' +complete -c copilot -n '__fish_seen_subcommand_from mcp; and __fish_seen_subcommand_from add' -l show-secrets -f -d 'Show full environment variable and header values in output, masked by default' diff --git a/fish/completions/nvm.fish b/fish/completions/nvm.fish new file mode 100644 index 0000000..14be1b7 --- /dev/null +++ b/fish/completions/nvm.fish @@ -0,0 +1,21 @@ +complete --command nvm --exclusive +complete --command nvm --exclusive --long version --description "Print version" +complete --command nvm --exclusive --long help --description "Print help" +complete --command nvm --long silent --description "Suppress standard output" + +complete --command nvm --exclusive --condition __fish_use_subcommand --arguments install --description "Download and activate the specified Node version" +complete --command nvm --exclusive --condition __fish_use_subcommand --arguments use --description "Activate the specified Node version in the current shell" +complete --command nvm --exclusive --condition __fish_use_subcommand --arguments list --description "List installed Node versions" +complete --command nvm --exclusive --condition __fish_use_subcommand --arguments list-remote --description "List available Node versions to install" +complete --command nvm --exclusive --condition __fish_use_subcommand --arguments current --description "Print the currently-active Node version" +complete --command nvm --exclusive --condition "__fish_seen_subcommand_from install" --arguments "( + test -e $nvm_data && string split ' ' <$nvm_data/.index +)" +complete --command nvm --exclusive --condition "__fish_seen_subcommand_from use" --arguments "(_nvm_list | string split ' ')" +complete --command nvm --exclusive --condition __fish_use_subcommand --arguments uninstall --description "Uninstall the specified Node version" +complete --command nvm --exclusive --condition "__fish_seen_subcommand_from uninstall" --arguments "( + _nvm_list | string split ' ' | string replace system '' +)" +complete --command nvm --exclusive --condition "__fish_seen_subcommand_from use uninstall" --arguments "( + set --query nvm_default_version && echo default +)" diff --git a/fish/conf.d/fish_frozen_key_bindings.fish b/fish/conf.d/fish_frozen_key_bindings.fish new file mode 100644 index 0000000..495aee9 --- /dev/null +++ b/fish/conf.d/fish_frozen_key_bindings.fish @@ -0,0 +1,14 @@ +# This file was created by fish when upgrading to version 4.3, to migrate +# the 'fish_key_bindings' variable from its old default scope (universal) +# to its new default scope (global). We recommend you delete this file +# and configure key bindings in ~/.config/fish/config.fish if needed. + +# set --global fish_key_bindings fish_default_key_bindings + +# Prior to version 4.3, fish shipped an event handler that runs +# `set --universal fish_key_bindings fish_default_key_bindings` +# whenever the fish_key_bindings variable is erased. +# This means that as long as any fish < 4.3 is still running on this system, +# we cannot complete the migration. +# As a workaround, erase the universal variable at every shell startup. +set --erase --universal fish_key_bindings diff --git a/fish/conf.d/nvm.fish b/fish/conf.d/nvm.fish new file mode 100644 index 0000000..7545699 --- /dev/null +++ b/fish/conf.d/nvm.fish @@ -0,0 +1,28 @@ +set --query XDG_DATA_HOME || set --local XDG_DATA_HOME ~/.local/share +set --query nvm_mirror || set --global nvm_mirror https://nodejs.org/dist +set --query nvm_data || set --global nvm_data $XDG_DATA_HOME/nvm + +function _nvm_install --on-event nvm_install + test ! -d $nvm_data && command mkdir -p $nvm_data + echo "Downloading the Node distribution index..." 2>/dev/null + _nvm_index_update +end + +function _nvm_update --on-event nvm_update + set --query --universal nvm_data && set --erase --universal nvm_data + set --query --universal nvm_mirror && set --erase --universal nvm_mirror + set --query nvm_mirror || set --global nvm_mirror https://nodejs.org/dist +end + +function _nvm_uninstall --on-event nvm_uninstall + command rm -rf $nvm_data + + set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version + + set --names | string replace --filter --regex -- "^nvm" "set --erase nvm" | source + functions --erase (functions --all | string match --entire --regex -- "^_nvm_") +end + +if status is-interactive && set --query nvm_default_version && ! set --query nvm_current_version + nvm use --silent $nvm_default_version +end diff --git a/fish/conf.d/rustup.fish b/fish/conf.d/rustup.fish new file mode 100644 index 0000000..e4cb363 --- /dev/null +++ b/fish/conf.d/rustup.fish @@ -0,0 +1 @@ +source "$HOME/.cargo/env.fish" diff --git a/fish/config.fish b/fish/config.fish new file mode 100644 index 0000000..e116641 --- /dev/null +++ b/fish/config.fish @@ -0,0 +1,45 @@ +set fish_greeting "" +if status is-interactive + # Commands to run in interactive sessions can go here + set -Ux EDITOR nvim + +end + +alias reloadwaybar='pkill -SIGUSR2 waybar' +alias cd='z' +alias man='wikiman' +alias ovim='vim' +alias vim='nvim' +alias edit='nvim' +source "$HOME/.cargo/env.fish" + +# Start ssh-agent if not already running +#if not pgrep -u (id -u) ssh-agent >/dev/null +# ssh-agent -c | source +#end + +# Add SSH keys if not already added +#if test -f ~/.ssh/id_ed25519 +# ssh-add -l >/dev/null 2>&1 +# or ssh-add ~/.ssh/id_ed25519 +#end + +zoxide init fish | source + +# Added by LM Studio CLI (lms) +set -gx PATH $PATH /home/sortedcord/.lmstudio/bin +# End of LM Studio CLI section + +# pnpm +set -gx PNPM_HOME "/home/sortedcord/.local/share/pnpm" +if not string match -q -- $PNPM_HOME $PATH + set -gx PATH "$PNPM_HOME" $PATH +end +# pnpm end + +# claurst +fish_add_path /home/sortedcord/.claurst/bin + + +# Added by Antigravity CLI installer +set -gx PATH "/home/sortedcord/.local/bin" $PATH diff --git a/fish/fish_plugins b/fish/fish_plugins new file mode 100644 index 0000000..aea2aa0 --- /dev/null +++ b/fish/fish_plugins @@ -0,0 +1 @@ +jorgebucaran/nvm.fish diff --git a/fish/fish_variables b/fish/fish_variables new file mode 100644 index 0000000..b39c064 --- /dev/null +++ b/fish/fish_variables @@ -0,0 +1,8 @@ +# This file contains fish universal variable definitions. +# VERSION: 3.0 +SETUVAR --export EDITOR:nvim +SETUVAR __fish_initialized:4300 +SETUVAR _fisher_jorgebucaran_2F_nvm_2E_fish_files:\x7e/\x2econfig/fish/functions/_nvm_index_update\x2efish\x1e\x7e/\x2econfig/fish/functions/_nvm_list\x2efish\x1e\x7e/\x2econfig/fish/functions/_nvm_version_activate\x2efish\x1e\x7e/\x2econfig/fish/functions/_nvm_version_deactivate\x2efish\x1e\x7e/\x2econfig/fish/functions/nvm\x2efish\x1e\x7e/\x2econfig/fish/conf\x2ed/nvm\x2efish\x1e\x7e/\x2econfig/fish/completions/nvm\x2efish +SETUVAR _fisher_plugins:jorgebucaran/nvm\x2efish +SETUVAR _fisher_upgraded_to_4_4:\x1d +SETUVAR fish_user_paths:/home/sortedcord/\x2eclaurst/bin\x1e/home/sortedcord/\x2elocal/bin diff --git a/fish/functions/_nvm_index_update.fish b/fish/functions/_nvm_index_update.fish new file mode 100644 index 0000000..c66753d --- /dev/null +++ b/fish/functions/_nvm_index_update.fish @@ -0,0 +1,20 @@ +function _nvm_index_update + test ! -d $nvm_data && command mkdir -p $nvm_data + + set --local index $nvm_data/.index + + if not command curl -q --location --silent $nvm_mirror/index.tab >$index.temp + command rm -f $index.temp + echo "nvm: Can't update index, host unavailable: \"$nvm_mirror\"" >&2 + return 1 + end + + command awk -v OFS=\t ' + /v0.9.12/ { exit } # Unsupported + NR > 1 { + print $1 (NR == 2 ? " latest" : $10 != "-" ? " lts/" tolower($10) : "") + } + ' $index.temp >$index + + command rm -f $index.temp +end diff --git a/fish/functions/_nvm_list.fish b/fish/functions/_nvm_list.fish new file mode 100644 index 0000000..1623bb8 --- /dev/null +++ b/fish/functions/_nvm_list.fish @@ -0,0 +1,14 @@ +function _nvm_list + set --local versions $nvm_data/* + + set --query versions[1] && + string match --entire --regex -- ( + string replace --all -- $nvm_data/ "" $versions | + string match --regex -- "v\d.+" | + string escape --style=regex | + string join "|" + ) <$nvm_data/.index + + command --all node | + string match --quiet --invert --regex -- "^$nvm_data" && echo system +end diff --git a/fish/functions/_nvm_version_activate.fish b/fish/functions/_nvm_version_activate.fish new file mode 100644 index 0000000..f7dfef7 --- /dev/null +++ b/fish/functions/_nvm_version_activate.fish @@ -0,0 +1,4 @@ +function _nvm_version_activate --argument-names ver + set --global --export nvm_current_version $ver + set --prepend PATH $nvm_data/$ver/bin +end diff --git a/fish/functions/_nvm_version_deactivate.fish b/fish/functions/_nvm_version_deactivate.fish new file mode 100644 index 0000000..24dd36e --- /dev/null +++ b/fish/functions/_nvm_version_deactivate.fish @@ -0,0 +1,5 @@ +function _nvm_version_deactivate --argument-names ver + test "$nvm_current_version" = "$ver" && set --erase nvm_current_version + set --local index (contains --index -- $nvm_data/$ver/bin $PATH) && + set --erase PATH[$index] +end diff --git a/fish/functions/jpg2png.fish b/fish/functions/jpg2png.fish new file mode 100644 index 0000000..51b658b --- /dev/null +++ b/fish/functions/jpg2png.fish @@ -0,0 +1,26 @@ +function jpg2png --description "Convert a JPG image from URL to PNG format" + if test (count $argv) -ne 2 + echo "Usage: jpg2png " + return 1 + end + + set source $argv[1] + set destination $argv[2] + + set temp_jpg (mktemp --suffix=.jpg) + + if not wget -O $temp_jpg $source 2>&1 + echo "Error: Failed to download JPG from $source" + rm -f $temp_jpg + return 1 + end + + if not magick $temp_jpg $destination + echo "Error: Failed to convert JPG to PNG" + rm -f $temp_jpg + return 1 + end + + rm -f $temp_jpg + echo "Successfully converted and saved to $destination" +end diff --git a/fish/functions/nvm.fish b/fish/functions/nvm.fish new file mode 100644 index 0000000..64d94c5 --- /dev/null +++ b/fish/functions/nvm.fish @@ -0,0 +1,237 @@ +function nvm --description "Node version manager" + for silent in --silent -s + if set --local index (contains --index -- $silent $argv) + set --erase argv[$index] && break + end + set --erase silent + end + + set --local cmd $argv[1] + set --local ver $argv[2] + + if set --query silent && ! set --query cmd[1] + echo "nvm: Version number not specified (see nvm -h for usage)" >&2 + return 1 + end + + if ! set --query ver[1] && contains -- "$cmd" install use + for file in .nvmrc .node-version + set file (_nvm_find_up $PWD $file) && read ver <$file && break + end + + if ! set --query ver[1] + echo "nvm: Invalid version or missing \".nvmrc\" file" >&2 + return 1 + end + end + + set --local their_version $ver + + switch "$cmd" + case -v --version + echo "nvm, version 2.2.18" + case "" -h --help + echo "Usage: nvm install Download and activate the specified Node version" + echo " nvm install Install the version specified in the nearest .nvmrc file" + echo " nvm use Activate the specified Node version in the current shell" + echo " nvm use Activate the version specified in the nearest .nvmrc file" + echo " nvm list List installed Node versions" + echo " nvm list-remote List available Node versions to install" + echo " nvm list-remote List Node versions matching a given regex pattern" + echo " nvm current Print the currently-active Node version" + echo " nvm uninstall Uninstall the specified Node version" + echo "Options:" + echo " -s, --silent Suppress standard output" + echo " -v, --version Print the version of nvm" + echo " -h, --help Print this help message" + echo "Variables:" + echo " nvm_arch Override architecture, e.g. x64-musl" + echo " nvm_mirror Use a mirror for downloading Node binaries" + echo " nvm_default_version Set the default version for new shells" + echo " nvm_default_packages Install a list of packages every time a Node version is installed" + echo " nvm_data Set a custom directory for storing nvm data" + echo "Examples:" + echo " nvm install latest Install the latest version of Node" + echo " nvm use 14.15.1 Use Node version 14.15.1" + echo " nvm use system Activate the system's Node version" + + case install + _nvm_index_update + + string match --entire --regex -- (_nvm_version_match $ver) <$nvm_data/.index | read ver alias + + if ! set --query ver[1] + echo "nvm: Invalid version number or alias: \"$their_version\"" >&2 + return 1 + end + + if test ! -e $nvm_data/$ver + set --local os (command uname -s | string lower) + set --local ext tar.gz + set --local arch (command uname -m) + set --local tarcmd tar + + switch $os + case aix + set arch ppc64 + case sunos + case linux + case darwin + case {msys_nt,mingw\*_nt}\* + set os win + set ext zip + set tarcmd bsdtar + case \* + echo "nvm: Unsupported operating system: \"$os\"" >&2 + return 1 + end + + switch $arch + case i\*86 + set arch x86 + case x86_64 + set arch x64 + case arm64 + string match --regex --quiet "v(?\d+)" $ver + if test "$os" = darwin -a $major -lt 16 + set arch x64 + end + case armv6 armv6l + set arch armv6l + case armv7 armv7l + set arch armv7l + case armv8 armv8l aarch64 + set arch arm64 + end + + set --query nvm_arch && set arch $nvm_arch + + set --local dir "node-$ver-$os-$arch" + set --local url $nvm_mirror/$ver/$dir.$ext + + command mkdir -p $nvm_data/$ver + + if ! set --query silent + echo -e "Installing Node \x1b[1m$ver\x1b[22m $alias" + echo -e "Fetching \x1b[4m$url\x1b[24m\x1b[7m" + end + + if ! command curl -q $silent --progress-bar --location $url | + command $tarcmd --extract --gzip --directory $nvm_data/$ver 2>/dev/null + command rm -rf $nvm_data/$ver + echo -e "\033[F\33[2K\x1b[0mnvm: Invalid mirror or host unavailable: \"$url\"" >&2 + return 1 + end + + set --query silent || echo -en "\033[F\33[2K\x1b[0m" + + if test "$os" = win + command mv $nvm_data/$ver/$dir $nvm_data/$ver/bin + else + command mv $nvm_data/$ver/$dir/* $nvm_data/$ver + command rm -rf $nvm_data/$ver/$dir + end + end + + if test $ver != "$nvm_current_version" + set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version + _nvm_version_activate $ver + + set --query nvm_default_packages[1] && npm install --global $silent $nvm_default_packages + end + + set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info) + case use + test $ver = default && set ver $nvm_default_version + _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __ + + if ! set --query ver[1] + echo "nvm: Can't use Node \"$their_version\", version must be installed first" >&2 + return 1 + end + + if test $ver != "$nvm_current_version" + set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version + test $ver != system && _nvm_version_activate $ver + end + + set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info) + case uninstall + if test -z "$ver" + echo "nvm: Not enough arguments for command: \"$cmd\"" >&2 + return 1 + end + + test $ver = default && test ! -z "$nvm_default_version" && set ver $nvm_default_version + + _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __ + + if ! set -q ver[1] + echo "nvm: Node version not installed or invalid: \"$their_version\"" >&2 + return 1 + end + + set --query silent || printf "Uninstalling Node %s %s\n" $ver (string replace ~ \~ "$nvm_data/$ver/bin/node") + + _nvm_version_deactivate $ver + + command rm -rf $nvm_data/$ver + case current + _nvm_current + case ls list + _nvm_list | _nvm_list_format (_nvm_current) $argv[2] + case lsr {ls,list}-remote + _nvm_index_update || return + _nvm_list | command awk ' + FILENAME == "-" && (is_local[$1] = FNR == NR) { next } { + print $0 (is_local[$1] ? " ✓" : "") + } + ' - $nvm_data/.index | _nvm_list_format (_nvm_current) $argv[2] + case \* + echo "nvm: Unknown command or option: \"$cmd\" (see nvm -h for usage)" >&2 + return 1 + end +end + +function _nvm_find_up --argument-names path file + test -e "$path/$file" && echo $path/$file || begin + test ! -z "$path" || return + _nvm_find_up (string replace --regex -- '/[^/]*$' "" $path) $file + end +end + +function _nvm_version_match --argument-names ver + string replace --regex -- '^v?(\d+|\d+\.\d+)$' 'v$1.' $ver | + string replace --filter --regex -- '^v?(\d+)' 'v$1' | + string escape --style=regex || string lower '\b'$ver'(?:/\w+)?$' +end + +function _nvm_list_format --argument-names current regex + command awk -v current="$current" -v regex="$regex" ' + $0 ~ regex { + aliases[versions[i++] = $1] = $2 " " $3 + pad = (n = length($1)) > pad ? n : pad + } + END { + if (!i) exit 1 + while (i--) + printf((current == versions[i] ? " ▶ " : " ") "%"pad"s %s\n", + versions[i], aliases[versions[i]]) + } + ' +end + +function _nvm_current + command --search --quiet node || return + set --query nvm_current_version && echo $nvm_current_version || echo system +end + +function _nvm_node_info + set --local npm_path (string replace bin/npm-cli.js "" (realpath (command --search npm))) + test -f $npm_path/package.json || set --local npm_version_default (command npm --version) + command node --eval " + console.log(process.version) + console.log('$npm_version_default' ? '$npm_version_default': require('$npm_path/package.json').version) + console.log(process.execPath) + " | string replace -- ~ \~ +end diff --git a/fish/functions/y.fish b/fish/functions/y.fish new file mode 100644 index 0000000..a846c63 --- /dev/null +++ b/fish/functions/y.fish @@ -0,0 +1,8 @@ +function y + set tmp (mktemp -t "yazi-cwd.XXXXXX") + yazi $argv --cwd-file="$tmp" + if read -z cwd <"$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] + builtin cd -- "$cwd" + end + rm -f -- "$tmp" +end diff --git a/hypr/environment.lua b/hypr/environment.lua new file mode 100644 index 0000000..125f2b8 --- /dev/null +++ b/hypr/environment.lua @@ -0,0 +1,16 @@ +-- Use NVIDIA GBM + Vulkan for wlroots +hl.env("WLR_RENDERER", "vulkan") +hl.env("GBM_BACKEND", "nvidia-drm") +hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia") + +-- Ensure Hyprland runs fully on the NVIDIA GPU +hl.env("__NV_PRIME_RENDER_OFFLOAD", "1") +hl.env("__VK_LAYER_NV_optimus", "NVIDIA_only") +hl.env("__NV_PRIME_RENDER_OFFLOAD_PROVIDER", "NVIDIA-G0") + +-- Fix cursor and presentation glitches +hl.env("WLR_NO_HARDWARE_CURSORS", "1") +hl.env("WLR_DRM_DEVICES", "/dev/dri/card1") + +-- Fix hyprquickframe preview rendering +hl.env("QSG_RHI_BACKEND", "vulkan") diff --git a/hypr/hy3-usage.md b/hypr/hy3-usage.md new file mode 100644 index 0000000..1ce826d --- /dev/null +++ b/hypr/hy3-usage.md @@ -0,0 +1,479 @@ + + +# hy3 + + + +i3 / sway like layout for [hyprland](https://github.com/hyprwm/hyprland). + +[Installation](#installation), [Configuration](#configuration) + +_Check the [changelog](./CHANGELOG.md) for a list of new features and improvements_ + +### Features + +- [x] i3 like tiling +- [x] Node based window manipulation (you can interact with multiple windows at once) +- [x] Greatly improved tabbed node groups over base hyprland +- [x] Optional autotiling + +Additional features may be suggested in the repo issues or the [matrix room](https://matrix.to/#/#hy3:outfoxxed.me). + +### Demo + + + +--- + +In addition to hy3, I maintain [Quickshell](https://quickshell.outfoxxed.me/?utm_source=hy3-readme), +a toolkit for creating custom bars, widgets, lockscreens, and other desktop shell components +with first class support for Hyprland. + +If that sounds interesting, check out the [website](https://quickshell.outfoxxed.me/?utm_source=hy3-readme). + +--- + +### Stability + +hy3 has a tagged release for each hyprland update, and master tracks hyprland's main branch. +If you are running a release version of hyprland then use the matching tagged hy3 version. +If you are running an untagged hyprland release then use the `master` branch of hy3. + +Commits are tested before pushing and will build against the hyprland release **in the flake.lock file**. +There may be a mismatch with hyprland's main branch. If hy3 fails to build against hyprland's main branch +please make an issue or ping me in the [hy3 matrix room](https://matrix.to/#/#hy3-support:outfoxxed.me). + +Tagged hy3 versions are always checked against the corresponding hyprland tag. + +If you encounter any bugs, please report them in the issue tracker. + +When reporting bugs, please include: + +- Commit hash of the version you are running. +- Steps to reproduce the bug (if you can figure them out) +- backtrace of the crash (if applicable) + +## Installation + +> [!IMPORTANT] +> The master branch of hy3 follows the master branch of hyprland. +> Attempting to use a mismatched hyprland release will result in failure when building or loading hy3. +> +> To use hy3 against a release version of hyprland, +> check out the matching hy3 tag for the hyprland version. +> hy3 tags are formatted as `hl{version}` where `{version}` matches the release version of hyprland. + +### Nix + +#### Hyprland home manager module + +Assuming you use hyprland's home manager module, you can easily integrate hy3 by adding it to the plugins array. + +```nix +# flake.nix + +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1&ref={version}"; + # where {version} is the hyprland release version + # or "github:hyprwm/Hyprland?submodules=1" to follow the development branch + + hy3 = { + url = "github:outfoxxed/hy3?ref=hl{version}"; # where {version} is the hyprland release version + # or "github:outfoxxed/hy3" to follow the development branch. + # (you may encounter issues if you dont do the same for hyprland) + inputs.hyprland.follows = "hyprland"; + }; + }; + + outputs = { nixpkgs, home-manager, hyprland, hy3, ... }: { + homeConfigurations."user@hostname" = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + + modules = [ + hyprland.homeManagerModules.default + + { + wayland.windowManager.hyprland = { + enable = true; + plugins = [ hy3.packages.x86_64-linux.hy3 ]; + }; + } + ]; + }; + }; +} +``` + +#### Manual (Nix) + +hy3's binary is availible as `${hy3.packages..hy3}/lib/libhy3.so`, so you can also +directly use it in your hyprland config like so: + +```nix +# ... +wayland.windowManager.hyprland = { + # ... + extraConfig = '' + plugin = ${hy3.packages.x86_64-linux.hy3}/lib/libhy3.so + ''; +}; +``` + +### hyprpm + +Hyprland now has a dedicated plugin manager, which should be used when your package manager +isn't capable of locking hy3 builds to the correct hyprland version. + +> [!IMPORTANT] +> Make sure hyprpm is activated by putting +> +> ```conf +> exec-once = hyprpm reload -n +> ``` +> +> in your hyprland.conf. (See [the wiki](https://wiki.hyprland.org/Plugins/Using-Plugins/) for details.) + +To install hy3 via hyprpm run + +```sh +hyprpm add https://github.com/outfoxxed/hy3 +``` + +To update hy3 (and all other plugins), run + +```sh +hyprpm update +``` + +Sometimes the headers from hyprland are not updated, if this happens run (See [issue #109](https://github.com/outfoxxed/hy3/issues/109) for an example of where this happened) + +```sh +hyprpm update -f +``` + +(See [the wiki](https://wiki.hyprland.org/Plugins/Using-Plugins/) for details.) + +> [!WARNING] +> When you are running a tagged hyprland version hyprpm (0.34.0+) will build against hy3's +> corrosponding release. However if you are running an untagged build (aka `-git`) hyprpm +> will build against hy3's _latest_ commit. This means **if you are running an out of date +> untagged build of hyprland, hyprpm may pick an incompatible revision of hy3**. +> +> To fix this problem you will either need to update hyprland or manually build the correct +> version of hy3. + +### Manual + +Install hyprland, including its headers and pkg-config file, then run the following commands: + +```sh +cmake -DCMAKE_BUILD_TYPE=Release -B build +cmake --build build +``` + +The plugin will be located at `build/libhy3.so`, and you can load it normally +(See [the hyprland wiki](https://wiki.hyprland.org/Plugins/Using-Plugins/#installing--using-plugins) for details.) + +Note that the hyprland headers and pkg-config file **MUST be installed correctly, for the target version of hyprland**. + +### Arch (AUR) + +> [!NOTE] +> This method of installation is deprecated and you should use _hyprpm_ instead, +> as it is simpler and less error prone. + +> [!CAUTION] +> Pacman is not very reliable when it comes to building packages in the correct order. +> If you get a notification saying _hy3 was compiled for a different version of hyprland_ +> then your packages likely updated in the wrong order, or you have hyprland headers in `/usr/local`. +> +> To fix this, remove `/usr/include/hyprland`, `/usr/local/include/hyprland`, `/usr/share/pkgconfig/hyprland.pc` and `/usr/local/share/pkgconfig/hyprland.pc`, +> then reinstall hyprland and hy3. +> +> If you know how to fix this please open an issue or pr, or message `@outfoxxed:outfoxxed.me` in the [matrix room](https://matrix.to/#/#hy3-support:outfoxxed.me). + +hy3 stable (for arch's `hyprland` package) is availible on the AUR as [hy3](https://aur.archlinux.org/packages/hy3). + +hy3-git (for `hyprland-git` on the AUR, unofficial package) is availible on the AUR as [hy3-git](https://aur.archlinux.org/packages/hy3-git). + +Both packages install hy3 as `/usr/lib/libhy3.so`. +You can enable it in your hyprland configuration by adding the following line anywhere in your `hyprland.conf` + +```conf +plugin = /usr/lib/libhy3.so +``` + +## Configuration + +> [!IMPORTANT] +> The configuration listed below is for the current hy3 commit. +> If you are using a release version of hy3 then make sure you are +> reading the tagged revision of this readme. + +Set your `general:layout` to `hy3` in hyprland.conf. + +hy3 requires using a few custom dispatchers for normal operation. +In your hyprland config replace the following dispatchers: + +- `movefocus` -> `hy3:movefocus` +- `movewindow` -> `hy3:movewindow` + +You can use `hy3:makegroup` to create a new split. + +The [dispatcher list](#dispatcher-list) and [config fields](#config-fields) sections have all the +configuration options, and some explanation as to what they do. +[The hyprland config in my dots](https://git.outfoxxed.me/outfoxxed/nixnew/src/branch/master/modules/hyprland/hyprland.conf) can also be used as a reference. + +### Config fields + +```conf +plugin { + hy3 { + # policy controlling what happens when a node is removed from a group, + # leaving only a group + # 0 = remove the nested group + # 1 = keep the nested group + # 2 = keep the nested group only if its parent is a tab group + node_collapse_policy = # default: 2 + + # offset from group split direction when only one window is in a group + group_inset = # default: 10 + + # if a tab group will automatically be created for the first window spawned in a workspace + tab_first_window = + + # tab group settings + tabs { + # height of the tab bar + height = # default: 22 + + # padding between the tab bar and its focused node + padding = # default: 6 + + # the tab bar should animate in/out from the top instead of below the window + from_top = # default: false + + # radius of tab bar corners + radius = # default: 6 + + # tab bar border width + border_width = # default: 2 + + # render the window title on the bar + render_text = # default: true + + # center the window title + text_center = # default: true + + # font to render the window title with + text_font = # default: Sans + + # height of the window title + text_height = # default: 8 + + # left padding of the window title + text_padding = # default: 3 + + colors { + # active tab bar segment colors + active = # default: rgba(33ccff40) + active_border = # default: rgba(33ccffee) + active_text = # default: rgba(ffffffff) + + # active tab bar segment colors for bars on an unfocused monitor + active_alt_monitor = # default: rgba(60606040) + active_alt_monitor_border = # default: rgba(808080ee) + active_alt_monitor_text = # default: rgba(ffffffff) + + # focused tab bar segment colors (focused node in unfocused container) + focused = # default: rgba(60606040) + focused_border = # default: rgba(808080ee) + focused_text = # default: rgba(ffffffff) + + # inactive tab bar segment colors + inactive = # default: rgba(30303020) + inactive_border = # default: rgba(606060aa) + inactive_text = # default: rgba(ffffffff) + + # urgent tab bar segment colors + urgent = # default: rgba(ff223340) + urgent_border = # default: rgba(ff2233ee) + urgent_text = # default: rgba(ffffffff) + + # locked tab bar segment colors + locked = # default: rgba(90903340) + locked_border = # default: rgba(909033ee) + locked_text = # default: rgba(ffffffff) + } + + # if tab backgrounds should be blurred + # Blur is only visible when the above colors are not opaque. + blur = # default: true + + # opacity multiplier for tabs + # Applies to blur as well as the given colors. + opacity = # default: 1.0 + } + + # autotiling settings + autotile { + # enable autotile + enable = # default: false + + # make autotile-created groups ephemeral + ephemeral_groups = # default: true + + # if a window would be squished smaller than this width, a vertical split will be created + # -1 = never automatically split vertically + # 0 = always automatically split vertically + # = pixel width to split at + trigger_width = # default: 0 + + # if a window would be squished smaller than this height, a horizontal split will be created + # -1 = never automatically split horizontally + # 0 = always automatically split horizontally + # = pixel height to split at + trigger_height = # default: 0 + + # a space or comma separated list of workspace ids where autotile should be enabled + # it's possible to create an exception rule by prefixing the definition with "not:" + # workspaces = 1,2 # autotiling will only be enabled on workspaces 1 and 2 + # workspaces = not:1,2 # autotiling will be enabled on all workspaces except 1 and 2 + workspaces = # default: all + } + } +} +``` + +### Dispatcher list + +- `hy3:makegroup, , [toggle], [ephemeral | force_ephemeral]` - make a vertical / horizontal split or tab group + - `toggle` - if the focused node is the only child of its parent, which is of the type specified, the node's parent will be removed. + - `ephemeral` - the group will be removed once it contains only one node. does not affect existing groups. + - `force_ephemeral` - same as ephemeral, but converts existing single windows groups. +- `hy3:changegroup, ` - change the group the node belongs to, to a different layout + - `untab` will untab the group if it was previously tabbed + - `toggletab` will untab if group is tabbed, and tab if group is untabbed + - `opposite` will toggle between horizontal and vertical layouts if the group is not tabbed. +- `hy3:setephemeral, ` - change the ephemerality of the group the node belongs to +- `hy3:movefocus, , [visible], [warp | nowarp]` - move the focus left, up, down, or right + - `visible` - only move between visible nodes, not hidden tabs + - `warp` - warp the mouse to the selected window, even if `general:no_cursor_warps` is true. + - `nowarp` - does not warp the mouse to the selected window, even if `general:no_cursor_warps` is false. +- `hy3:warpcursor` - warp the cursor to the center of the focused node +- `hy3:movewindow, , [once], [visible]` - move a window left, up, down, or right + - `once` - only move directly to the neighboring group, without moving into any of its subgroups + - `visible` - only move between visible nodes, not hidden tabs +- `hy3:movetoworkspace, , [follow, [warp | nowarp]]` - move the active node to the given workspace + - `follow` - change focus to the given workspace when moving the selected node + - `warp` - warp the mouse to the selected window, even if `general:no_cursor_warps` is true. + - `nowarp` - does not warp the mouse to the selected window, even if `general:no_cursor_warps` is false. +- `hy3:killactive` - close all windows in the focused node +- `hy3:changefocus, ` + - `top` - focus all nodes in the workspace + - `bottom` - focus the single root selection window + - `raise` - raise focus one level + - `lower` - lower focus one level + - `tab` - raise focus to the nearest tab + - `tabnode` - raise focus to the nearest node under the tab +- `hy3:togglefocuslayer, [nowarp]` - toggle focus between tiled and floating layers + - `nowarp` - do not warp the mouse to the newly focused window +- `hy3:focustab, [l | r | left | right | index, ], [prioritize_hovered | require_hovered], [wrap]` + - `l | r | left | right` - direction to change focus towards + - `index, ` - select the `index`th tab + - `prioritize_hovered` - prioritize the tab group under the mouse when multiple are stacked. use the lowest group if none is under the mouse. + - `require_hovered` - affect the tab group under the mouse. do nothing if none are hovered. + - `wrap` - wrap to the opposite size of the tab bar if moving off the end +- `hy3:locktab, [lock | unlock]` - lock the current tab, makingg it behave like a node +- `hy3:debugnodes` - print the node tree into the hyprland log +- :warning: **ALPHA QUALITY** `hy3:setswallow, ` - set the containing node's window swallow state +- :warning: **ALPHA QUALITY** `hy3:expand, ` - expand the current node to cover other nodes + - `expand` - expand by one node + - `shrink` - shrink by one node + - `base` - undo all expansions +- `hy3:equalize, [workspace]` - equalize window sizes in group + - no argument: equalizes immediate siblings of the focused window + - `workspace`: equalizes all windows across the entire workspace tree + +### Lua dispatchers + +When using Hyprland's Lua config, hy3 exposes dispatcher factories under `hl.plugin.hy3`. +The returned functions can be passed to `hl.bind(...)`. + +```lua +local hy3 = hl.plugin.hy3 + +-- all factories return dispatcher functions and dispatchers return no values +-- option tables are optional except for focus_tab + +hy3.make_group("h" | "v" | "tab" | "opposite", { + toggle = true | false, -- default: false + ephemeral = true | false | "force", -- default: false +}) + +hy3.change_group("h" | "v" | "tab" | "untab" | "toggletab" | "opposite") + +hy3.set_ephemeral(true | false | "true" | "false") + +hy3.move_focus("l" | "r" | "u" | "d" | "left" | "right" | "up" | "down", { + visible = true | false, -- default: false + warp = true | false, -- default: follows cursor:no_warps +}) + +hy3.toggle_focus_layer({ + warp = true | false, -- default: true +}) + +hy3.warp_cursor() + +hy3.move_window("l" | "r" | "u" | "d" | "left" | "right" | "up" | "down", { + once = true | false, -- default: false + visible = true | false, -- default: false +}) + +hy3.move_to_workspace("", { + follow = true | false, -- default: false + warp = true | false, -- default: follows cursor:no_warps when follow = true +}) + +hy3.change_focus("top" | "bottom" | "raise" | "lower" | "tab" | "tabnode") + +-- direction and index are mutually exclusive +hy3.focus_tab({ + direction = "l" | "r" | "left" | "right", + mouse = "ignore" | "prioritize_hovered" | "require_hovered", -- default: "ignore" + wrap = true | false, -- default: false +}) + +hy3.focus_tab({ + index = , + mouse = "ignore" | "prioritize_hovered" | "require_hovered", -- default: "ignore" + wrap = true | false, -- default: false +}) + +hy3.set_swallow(true | false | "true" | "false" | "toggle") + +hy3.kill_active() + +hy3.expand("expand" | "shrink" | "base" | "maximize" | "fullscreen", { + fullscreen = "" | "intermediate_maximize" | "fullscreen_maximize" | "maximize_only", +}) + +hy3.lock_tab(nil | "" | "toggle" | "lock" | "unlock") + +hy3.equalize({ + scope = "" | "group" | "workspace", -- default: "group" + workspace = true | false, -- overrides scope if present + recursive = true | false, -- overrides workspace if present +}) + +hy3.debug_nodes() +``` diff --git a/hypr/hyprland.lua b/hypr/hyprland.lua new file mode 100644 index 0000000..9259e7c --- /dev/null +++ b/hypr/hyprland.lua @@ -0,0 +1,346 @@ +-- This is an example Hyprland Lua config file. +-- Refer to the wiki for more information. +-- https://wiki.hypr.land/Configuring/Start/ + +-- Please note not all available settings / options are set here. +-- For a full list, see the wiki + +-- You can (and should!!) split this configuration into multiple files +-- Create your files separately and then require them like this: +-- require("myColors") +require("environment") +local colors = require("rose-pine") + +------------------ +---- MONITORS ---- +------------------ + +-- See https://wiki.hypr.land/Configuring/Basics/Monitors/ +hl.monitor({ + output = "DP-1", + mode = "1920x1080@100", + position = "0x0", + scale = 1, +}) + +hl.monitor({ + output = "HDMI-A-1", + mode = "1920x1080@60", + position = "1920x0", + scale = 1.25, +}) + +--------------------- +---- MY PROGRAMS ---- +--------------------- + +-- Set programs that you use +local terminal = "kitty" +local fileManager = "kitty" +local menu = "hyprlauncher" +local browser = "vivaldi-stable --enable-features=AcceleratedVideoEncoder" +local browserPrivate = "vivaldi --incognito --enable-features=AcceleratedVideoEncoder" + +------------------- +---- AUTOSTART ---- +------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Autostart/ + +-- Autostart necessary processes (like notifications daemons, status bars, etc.) +-- Or execute your favorite apps at launch like this: +hl.on("hyprland.start", function() + hl.exec_cmd("swaybg -i /home/sortedcord/Pictures/Wallpapers/cliff.jpg -m fill") + hl.exec_cmd("wayle shell") + hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP") + hl.exec_cmd("quickshell") + hl.exec_cmd("hyprpm reload -n") +end) + +------------------------------- +---- ENVIRONMENT VARIABLES ---- +------------------------------- + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/ + +hl.env("XCURSOR_SIZE", "24") +hl.env("HYPRCURSOR_SIZE", "24") +hl.env("bitdepth", "10") +hl.env("XDG_DESKTOP_PORTAL_HYPRLAND_FORCE_SHM", "1") + +----------------------- +----- PERMISSIONS ----- +----------------------- + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/ +-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly +-- for security reasons + +-- hl.config({ +-- ecosystem = { +-- enforce_permissions = true, +-- }, +-- }) + +-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow") +-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow") +-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow") + +----------------------- +---- LOOK AND FEEL ---- +----------------------- + +-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/ +hl.config({ + general = { + gaps_in = 3, + gaps_out = 3, + + border_size = 2, + + col = { + active_border = colors.rose, + inactive_border = colors.muted, + }, + + -- Set to true to enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false, + + -- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on + allow_tearing = false, + + layout = "hy3", + }, + + decoration = { + rounding = 0, + rounding_power = 0, + + -- Change transparency of focused and unfocused windows + active_opacity = 1.0, + inactive_opacity = 1.0, + + shadow = { + enabled = false, + range = 4, + render_power = 3, + color = 0xee1a1a1a, + }, + + blur = { + enabled = false, + size = 3, + passes = 1, + vibrancy = 0.1696, + }, + }, + + animations = { + enabled = false, + }, +}) + +-- hy3 plugin settings for i3-like tabbing & container layout +hl.config({ + plugin = { + hy3 = { + -- policy controlling what happens when a node is removed from a group, + -- leaving only a group + -- 0 = remove the nested group + -- 1 = keep the nested group + -- 2 = keep the nested group only if its parent is a tab group + node_collapse_policy = 2, + + -- offset from group split direction when only one window is in a group + group_inset = 10, + + -- if a tab group will automatically be created for the first window spawned in a workspace + tab_first_window = false, + + -- tab group settings + tabs = { + -- height of the tab bar + height = 20, + + -- padding between the tab bar and its focused node + padding = 3, + + -- the tab bar should animate in/out from the top instead of below the window + from_top = false, + + -- radius of tab bar corners + radius = 0, + + -- tab bar border width + border_width = 2, + + -- render the window title on the bar + render_text = true, + + -- center the window title + text_center = true, + + -- font to render the window title with + text_font = "Sans", + + -- height of the window title + text_height = 10, + + -- left padding of the window title + text_padding = 3, + + colors = { + -- active tab bar segment colors (using Rose Pine colors, fully opaque) + active = colors.rose, + active_border = colors.rose, + active_text = colors.base, + + -- active tab bar segment colors for bars on an unfocused monitor + active_alt_monitor = colors.subtle, + active_alt_monitor_border = colors.subtle, + active_alt_monitor_text = colors.base, + + -- focused tab bar segment colors (focused node in unfocused container) + focused = colors.muted, + focused_border = colors.muted, + focused_text = colors.text, + + -- inactive tab bar segment colors + inactive = colors.surface, + inactive_border = colors.overlay, + inactive_text = colors.muted, + + -- urgent tab bar segment colors + urgent = colors.love, + urgent_border = colors.love, + urgent_text = colors.base, + + -- locked tab bar segment colors + locked = colors.gold, + locked_border = colors.gold, + locked_text = colors.base, + }, + + -- if tab backgrounds should be blurred + blur = false, + + -- opacity multiplier for tabs + opacity = 1.0, + }, + + -- autotiling settings + autotile = { + enable = false, + ephemeral_groups = true, + trigger_width = 0, + trigger_height = 0, + workspaces = "all", + }, + }, + }, +}) + +-- Default curves and animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ + +-- Default springs + +-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ +-- "Smart gaps" / "No gaps when only" +-- uncomment all if you wish to use that. +-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 }) +-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 }) +-- hl.window_rule({ +-- name = "no-gaps-wtv1", +-- match = { float = false, workspace = "w[tv1]" }, +-- border_size = 0, +-- rounding = 0, +-- }) +-- hl.window_rule({ +-- name = "no-gaps-f1", +-- match = { float = false, workspace = "f[1]" }, +-- border_size = 0, +-- rounding = 0, +-- }) + +-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more +hl.config({ + dwindle = { + preserve_split = true, -- You probably want this + }, +}) + +-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more +hl.config({ + master = { + new_status = "master", + }, +}) + +-- See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ for more +hl.config({ + scrolling = { + fullscreen_on_one_column = true, + }, +}) + +---------------- +---- MISC ---- +---------------- + +hl.config({ + misc = { + disable_hyprland_logo = true, -- If true disables the random hyprland logo / anime girl background. :( + }, +}) + +--------------- +---- INPUT ---- +--------------- + +hl.config({ + input = { + kb_layout = "us", + kb_variant = "", + kb_model = "", + kb_options = "", + kb_rules = "", + + follow_mouse = 1, + + sensitivity = 0, -- -1.0 - 1.0, 0 means no modification. + + touchpad = { + natural_scroll = false, + }, + }, +}) + +hl.gesture({ + fingers = 3, + direction = "horizontal", + action = "workspace", +}) + +-- Example per-device config +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more +hl.device({ + name = "epic-mouse-v1", + sensitivity = -0.5, +}) + +--------------------- +---- KEYBINDINGS ---- +--------------------- + +require("keybinds").setup({ + terminal = terminal, + menu = menu, + browser = browser, + browserPrivate = browserPrivate, +}) + +-------------------------------- +---- WINDOWS AND WORKSPACES ---- +-------------------------------- + +require("windowrules") diff --git a/hypr/keybinds.lua b/hypr/keybinds.lua new file mode 100644 index 0000000..a413ccc --- /dev/null +++ b/hypr/keybinds.lua @@ -0,0 +1,221 @@ +local M = {} + +function M.setup(opts) + local terminal = opts.terminal + local menu = opts.menu + local browser = opts.browser + local browserPrivate = opts.browserPrivate + + -- Import and setup hy3 plugin helper + local hy3 = hl.plugin.hy3 + if not hy3 then + hy3 = setmetatable({}, { + __index = function(_, k) + return function(...) + return function() + print("hy3 plugin is not loaded, cannot call " .. k) + end + end + end, + }) + end + + -- Track and write split state to /tmp/hy3_split for status bars like Wayle + local current_split = "H" + local function set_split(dir) + current_split = dir + local f = io.open("/tmp/hy3_split", "w") + if f then + f:write(dir) + f:close() + end + end + set_split("H") -- Initialize + + local mainMod = "SUPER" -- Sets "Windows" key as main modifier + + -- Example binds, see https://wiki.hypr.land/Configuring/Basics/Binds/ for more + hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd(terminal)) + hl.bind(mainMod .. " + Q", hl.dsp.window.close()) + hl.bind(mainMod .. " + SHIFT + E", hl.dsp.exit()) + hl.bind(mainMod .. " + SHIFT + R", function() + hl.exec_cmd("hyprctl reload && notify-send 'Hyprland config reloaded'") + end) + hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(terminal .. " fish -c 'y; exec fish'")) + hl.bind(mainMod .. " + SPACE", hl.dsp.window.float({ action = "toggle" })) + hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen()) + hl.bind(mainMod .. " + D", hl.dsp.exec_cmd(menu)) + hl.bind(mainMod .. " + B", hl.dsp.exec_cmd(browser)) + hl.bind(mainMod .. " + SHIFT + B", hl.dsp.exec_cmd(browserPrivate)) + hl.bind(mainMod .. " + P", hl.dsp.window.pseudo()) + -- hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("hyprquickframe")) + hl.bind( + mainMod .. " + S", + hl.dsp.exec_cmd( + ' grim -g "$(slurp)" - | satty -f - --copy-command wl-copy -o "~/Pictures/Screenshots/%Y%m%d_%H%M%S.png"' + ) + ) + -- hl.bind(mainMod .. " + G", hl.dsp.exec_cmd("python /home/sortedcord/Projects/firecrawl-search/main.py")) + + -- Move focus with mainMod + arrow keys (hy3 plugin aware) + hl.bind(mainMod .. " + left", hy3.move_focus("left")) + hl.bind(mainMod .. " + right", hy3.move_focus("right")) + hl.bind(mainMod .. " + up", hy3.move_focus("up")) + hl.bind(mainMod .. " + down", hy3.move_focus("down")) + + -- Move focus with mainMod + hjkl (hy3 plugin aware) + hl.bind(mainMod .. " + H", hy3.move_focus("l")) + hl.bind(mainMod .. " + J", hy3.move_focus("d")) + hl.bind(mainMod .. " + K", hy3.move_focus("u")) + hl.bind(mainMod .. " + L", hy3.move_focus("r")) + + hl.bind(mainMod .. " + W", hl.dsp.exec_cmd("rofi -show window")) + + -- Move window with mainMod + SHIFT + hjkl (hy3 plugin aware) + hl.bind(mainMod .. " + SHIFT + H", hy3.move_window("l")) + hl.bind(mainMod .. " + SHIFT + J", hy3.move_window("d")) + hl.bind(mainMod .. " + SHIFT + K", hy3.move_window("u")) + hl.bind(mainMod .. " + SHIFT + L", hy3.move_window("r")) + + -- i3-like container and layout controls + -- Toggle layout tabbed + hl.bind(mainMod .. " + SHIFT + T", function() + hl.dispatch(hy3.change_group("toggletab")) + if current_split == "T" then + set_split("H") + else + set_split("T") + end + end) + -- Split layout horizontal / vertical toggle + hl.bind(mainMod .. " + SHIFT + G", function() + hl.dispatch(hy3.change_group("opposite")) + if current_split == "H" then + set_split("V") + elseif current_split == "V" then + set_split("H") + end + end) + -- Pre-split vertical (V), horizontal (C), or tab (X) + hl.bind(mainMod .. " + V", function() + hl.dispatch(hy3.make_group("v", { toggle = true })) + set_split("V") + end) + hl.bind(mainMod .. " + C", function() + hl.dispatch(hy3.make_group("h", { toggle = true })) + set_split("H") + end) + hl.bind(mainMod .. " + X", function() + hl.dispatch(hy3.make_group("tab", { toggle = true })) + set_split("T") + end) + -- Focus parent (A) / focus child (SHIFT + A) + hl.bind(mainMod .. " + A", hy3.change_focus("raise")) + hl.bind(mainMod .. " + SHIFT + A", hy3.change_focus("lower")) + -- Cycle tabs with Super + Alt + Left/Right + hl.bind(mainMod .. " + ALT + left", hy3.focus_tab({ direction = "l", wrap = true })) + hl.bind(mainMod .. " + ALT + right", hy3.focus_tab({ direction = "r", wrap = true })) + + -- Switch workspaces with mainMod + [0-9] + -- Move active window/container to a workspace with mainMod + SHIFT + [0-9] (hy3 plugin aware) + for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 + hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i })) + hl.bind(mainMod .. " + SHIFT + " .. key, hy3.move_to_workspace(tostring(i))) + end + + -- Move window to other monitor with mod+semicolon + hl.bind(mainMod .. " + semicolon", hl.dsp.window.move({ monitor = "+1" })) + + -- Swap windows between monitors (mod+shift+semicolon) + -- Detect which monitor we're on and use the correct focus direction + hl.bind(mainMod .. " + SHIFT + semicolon", function() + local active_monitor = hl.get_active_monitor() + local focus_direction = "r" + + -- If we're on the rightmost monitor (HDMI-A-1), focus left instead + if active_monitor.name == "HDMI-A-1" then + focus_direction = "l" + end + + -- Move window to next monitor + hl.dispatch(hl.dsp.window.move({ monitor = "+1" })) + + -- Focus a window on the current monitor using the correct direction (hy3 plugin aware) + hl.dispatch(hy3.move_focus(focus_direction)) + + -- Move the newly focused window back to original monitor + hl.dispatch(hl.dsp.window.move({ monitor = "-1" })) + end) + + -- Example special workspace (scratchpad) + -- hl.bind(mainMod .. " + S", hl.dsp.workspace.toggle_special("magic")) + -- hl.bind(mainMod .. " + SHIFT + S", hl.dsp.window.move({ workspace = "special:magic" })) + + -- Scroll through existing workspaces with mainMod + scroll + -- hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" })) + -- hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" })) + hl.bind(mainMod .. " + Y", hl.dsp.focus({ workspace = "e+1" })) + hl.bind(mainMod .. " + T", hl.dsp.focus({ workspace = "e-1" })) + + -- Move/resize windows with mainMod + LMB/RMB and dragging + hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true }) + hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true }) + + -- Laptop multimedia keys for volume and LCD brightness + hl.bind( + "XF86AudioRaiseVolume", + hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), + { locked = true, repeating = true } + ) + hl.bind( + "XF86AudioLowerVolume", + hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), + { locked = true, repeating = true } + ) + hl.bind( + "XF86AudioMute", + hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), + { locked = true, repeating = true } + ) + hl.bind( + "XF86AudioMicMute", + hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), + { locked = true, repeating = true } + ) + hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, repeating = true }) + hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, repeating = true }) + + -- Requires playerctl + hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true }) + hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) + hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) + hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true }) + + -- Cursor controls (simplified - submaps not supported in Lua API) + -- Jump cursor to a position + hl.bind("SUPER + G + A", hl.dsp.exec_cmd("hyprctl dispatch submap reset && wl-kbptr && hyprctl dispatch submap cursor")) + + -- Cursor movement + hl.bind("SUPER + G + J", hl.dsp.exec_cmd("wlrctl pointer move 0 10"), { repeating = true }) + hl.bind("SUPER + G + K", hl.dsp.exec_cmd("wlrctl pointer move 0 -10"), { repeating = true }) + hl.bind("SUPER + G + L", hl.dsp.exec_cmd("wlrctl pointer move 10 0"), { repeating = true }) + hl.bind("SUPER + G + H", hl.dsp.exec_cmd("wlrctl pointer move -10 0"), { repeating = true }) + + -- Left button + hl.bind("SUPER + G + S", hl.dsp.exec_cmd("wlrctl pointer click left")) + -- Middle button + hl.bind("SUPER + G + D", hl.dsp.exec_cmd("wlrctl pointer click middle")) + -- Right button + hl.bind("SUPER + G + F", hl.dsp.exec_cmd("wlrctl pointer click right")) + + -- Scroll up and down + hl.bind("SUPER + G + E", hl.dsp.exec_cmd("wlrctl pointer scroll 10 0"), { repeating = true }) + hl.bind("SUPER + G + R", hl.dsp.exec_cmd("wlrctl pointer scroll -10 0"), { repeating = true }) + + -- Scroll left and right + hl.bind("SUPER + G + T", hl.dsp.exec_cmd("wlrctl pointer scroll 0 -10"), { repeating = true }) + hl.bind("SUPER + G + G", hl.dsp.exec_cmd("wlrctl pointer scroll 0 10"), { repeating = true }) +end + +return M diff --git a/hypr/rose-pine.lua b/hypr/rose-pine.lua new file mode 100644 index 0000000..d7bd80f --- /dev/null +++ b/hypr/rose-pine.lua @@ -0,0 +1,22 @@ +-- name: Rosé Pine +-- author: jishnurajendran +-- upstream: https://github.com/jishnurajendran/hyprland-rosepine/blob/main/rose-pine.conf +-- All natural pine, faux fur and a bit of soho vibes for the classy minimalist + +return { + base = 0xff191724, + surface = 0xff1f1d2e, + overlay = 0xff26233a, + muted = 0xff6e6a86, + subtle = 0xff908caa, + text = 0xffe0def4, + love = 0xffeb6f92, + gold = 0xfff6c177, + rose = 0xffebbcba, + pine = 0xff31748f, + foam = 0xff9ccfd8, + iris = 0xffc4a7e7, + highlightLow = 0xff21202e, + highlightMed = 0xff403d52, + highlightHigh = 0xff524f67, +} diff --git a/hypr/windowrules.lua b/hypr/windowrules.lua new file mode 100644 index 0000000..0297788 --- /dev/null +++ b/hypr/windowrules.lua @@ -0,0 +1,90 @@ +-- Workspace to monitor mapping +for i = 1, 5 do + hl.workspace_rule({ workspace = i, monitor = "DP-1" }) +end + +for i = 6, 10 do + hl.workspace_rule({ workspace = i, monitor = "HDMI-A-1" }) +end + +-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ +-- and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ + +-- Example window rules that are useful + +local suppressMaximizeRule = hl.window_rule({ + -- Ignore maximize requests from all apps. You'll probably like this. + name = "suppress-maximize-events", + match = { class = ".*" }, + + suppress_event = "maximize", +}) +-- suppressMaximizeRule:set_enabled(false) + +hl.window_rule({ + -- Set Pegasus to fullscreen + name = "pegasus-fullscreen", + match = { class = "pegasus-frontend" }, + fullscreen = true, +}) + +hl.window_rule({ + -- Always float Bitwarden + name = "bitwarden-float", + match = { title = "Bitwarden - Vivaldi" }, + float = true, +}) + +hl.window_rule({ + -- Always float Game Splash Screen + name = "gsplash-float", + match = { class = "gsplash" }, + float = true, + content = "game", +}) + +hl.window_rule({ + -- SCREENCHEAT fullscreen + name = "screencheat-fullscreen", + match = { title = "SCREENCHEAT" }, + fullscreen = true, +}) + +hl.window_rule({ + -- Always float Satty + name = "satty-float", + match = { class = "com.gabm.satty" }, + float = true, +}) + +hl.window_rule({ + -- Fix some dragging issues with XWayland + name = "fix-xwayland-drags", + match = { + class = "^$", + title = "^$", + xwayland = true, + float = true, + fullscreen = false, + pin = false, + }, + + no_focus = true, +}) + +-- Layer rules also return a handle. +-- local overlayLayerRule = hl.layer_rule({ +-- name = "no-anim-overlay", +-- match = { namespace = "^my-overlay$" }, +-- no_anim = true, +-- }) +-- overlayLayerRule:set_enabled(false) + +-- Hyprland-run windowrule +hl.window_rule({ + name = "move-hyprland-run", + match = { class = "hyprland-run" }, + + move = "20 monitor_h-120", + float = true, +}) diff --git a/hyprpanel/config.json b/hyprpanel/config.json new file mode 100644 index 0000000..79331b8 --- /dev/null +++ b/hyprpanel/config.json @@ -0,0 +1,199 @@ +{ + "log_level": "LOG_LEVEL_INFO", + "log_subprocesses_to_journal": false, + "dbus": { + "enabled": true, + "connect_timeout": "20s", + "connect_interval": "0.200s", + "notifications": { + "enabled": true + }, + "systray": { + "enabled": true + }, + "shortcuts": { + "enabled": true + }, + "brightness": { + "enabled": true, + "adjust_step_percent": 5, + "min_brightness": 1, + "enable_logind": true, + "hud_notifications": true + }, + "power": { + "enabled": true, + "low_percent": 10, + "critical_percent": 5, + "low_command": "", + "critical_command": "", + "hud_notifications": true + } + }, + "audio": { + "enabled": true, + "volume_step_percent": 5, + "volume_exceed_maximum": false, + "hud_notifications": true + }, + "panels": [ + { + "id": "panel0", + "edge": "EDGE_RIGHT", + "size": 64, + "monitor": "", + "modules": [ + { + "pager": { + "icon_size": 12, + "active_monitor_only": false, + "scroll_wrap_workspaces": true, + "scroll_include_inactive": true, + "enable_workspace_names": false, + "pinned": [ + 1, + 2, + 3, + 4, + 5, + 6 + ], + "ignore_windows": [], + "preview_width": 256, + "follow_window_on_move": false + } + }, + { + "spacer": { + "size": 16, + "expand": false + } + }, + { + "taskbar": { + "icon_size": 48, + "active_workspace_only": true, + "active_monitor_only": true, + "group_tasks": true, + "hide_indicators": false, + "expand": true, + "max_size": 0, + "pinned": [], + "preview_width": 256 + } + }, + { + "spacer": { + "size": 16, + "expand": false + } + }, + { + "systray": { + "icon_size": 22, + "menu_icon_size": 22, + "auto_hide_statuses": [ + "STATUS_UNSPECIFIED", + "STATUS_PASSIVE", + "STATUS_ACTIVE" + ], + "auto_hide_delay": "4s", + "pinned": [ + "nm-applet", + "chrome_status_icon_1" + ], + "modules": [ + { + "power": { + "icon_size": 22, + "icon_symbolic": true + } + } + ] + } + }, + { + "notifications": { + "icon_size": 24, + "notification_icon_size": 48, + "default_timeout": "7s", + "position": "POSITION_TOP_RIGHT", + "margin": 24, + "persistent": [] + } + }, + { + "hud": { + "notification_icon_size": 64, + "timeout": "2s", + "position": "POSITION_BOTTOM", + "margin": 256 + } + }, + { + "spacer": { + "size": 16, + "expand": false + } + }, + { + "audio": { + "icon_size": 32, + "icon_symbolic": true, + "command_mixer": "pavucontrol", + "enable_source": true + } + }, + { + "spacer": { + "size": 16, + "expand": false + } + }, + { + "clock": { + "time_format": "15:04", + "date_format": "2006-01-02", + "tooltip_time_format": "15:04", + "tooltip_date_format": "Mon, 02 Jan 2006 MST", + "additional_regions": [ + "America/Los_Angeles", + "America/Chicago", + "America/New_York", + "Europe/London" + ] + } + }, + { + "spacer": { + "size": 16, + "expand": false + } + }, + { + "session": { + "icon_size": 48, + "icon_symbolic": true, + "overlay_icon_size": 96, + "overlay_icon_symbolic": true, + "command_logout": "loginctl terminate-session $XDG_SESSION_ID", + "command_reboot": "systemctl reboot", + "command_suspend": "systemctl suspend", + "command_shutdown": "systemctl poweroff" + } + }, + { + "spacer": { + "size": 16, + "expand": false + } + } + ] + } + ], + "icon_overrides": [], + "launch_wrapper": [ + "sh", + "-c" + ] +} \ No newline at end of file diff --git a/hyprpaper/hyprpaper.conf b/hyprpaper/hyprpaper.conf new file mode 100644 index 0000000..6ff7a10 --- /dev/null +++ b/hyprpaper/hyprpaper.conf @@ -0,0 +1,3 @@ +preload = /home/sortedcord/Pictures/Wallpapers/cliff.jpg + +wallpaper = DP-1,/home/sortedcord/Pictures/Wallpapers/cliff.jpg diff --git a/kitty/current-theme.conf b/kitty/current-theme.conf new file mode 100644 index 0000000..cda16f7 --- /dev/null +++ b/kitty/current-theme.conf @@ -0,0 +1,70 @@ +# vim:ft=kitty +## name: Everforest Light Medium +## author: Sainnhe Park +## license: MIT +## upstream: https://github.com/ewal/kitty-everforest/blob/master/themes/everforest_light_medium.conf +## blurb: A green based color scheme designed to be warm and soft + +foreground #5c6a72 +background #fdf6e3 +selection_foreground #829181 +selection_background #eaedc8 + +cursor #5c6a72 +cursor_text_color #f4f0d9 + +url_color #3a94c5 + +active_border_color #8da101 +inactive_border_color #bdc3af +bell_border_color #f57d26 +visual_bell_color none + +wayland_titlebar_color system +macos_titlebar_color system + +active_tab_background #fdf6e3 +active_tab_foreground #5c6a72 +inactive_tab_background #fdf6e3 +inactive_tab_foreground #939f91 +tab_bar_background #fdf6e3 +tab_bar_margin_color none + +mark1_foreground #fdf6e3 +mark1_background #3a94c5 +mark2_foreground #fdf6e3 +mark2_background #d3c6aa +mark3_foreground #fdf6e3 +mark3_background #df69ba + +#: black +color0 #708089 +color8 #829181 + +#: red +color1 #f85552 +color9 #e66868 + +#: green +color2 #8da101 +color10 #93b259 + +#: yellow +color3 #dfa000 +color11 #dfa000 + +#: blue +color4 #3a94c5 +color12 #3a94c5 + +#: magenta +color5 #df69ba +color13 #df69ba + +#: cyan +color6 #35a77c +color14 #35a77c + +#: white +color7 #939f91 +color15 #a6b0a0 diff --git a/kitty/dark-theme.auto.conf b/kitty/dark-theme.auto.conf new file mode 100644 index 0000000..fca9531 --- /dev/null +++ b/kitty/dark-theme.auto.conf @@ -0,0 +1,53 @@ +## name: Rosé Pine +## author: mvllow +## license: MIT +## upstream: https://github.com/rose-pine/kitty/blob/main/dist/rose-pine.conf +## blurb: All natural pine, faux fur and a bit of soho vibes for the classy minimalist + +foreground #e0def4 +background #191724 +selection_foreground #e0def4 +selection_background #403d52 + +cursor #524f67 +cursor_text_color #e0def4 + +url_color #c4a7e7 + +active_tab_foreground #e0def4 +active_tab_background #26233a +inactive_tab_foreground #6e6a86 +inactive_tab_background #191724 + +# black +color0 #26233a +color8 #6e6a86 + +# red +color1 #eb6f92 +color9 #eb6f92 + +# green +color2 #31748f +color10 #31748f + +# yellow +color3 #f6c177 +color11 #f6c177 + +# blue +color4 #9ccfd8 +color12 #9ccfd8 + +# magenta +color5 #c4a7e7 +color13 #c4a7e7 + +# cyan +color6 #ebbcba +color14 #ebbcba + +# white +color7 #e0def4 +color15 #e0def4 + diff --git a/kitty/kitty.conf b/kitty/kitty.conf new file mode 100644 index 0000000..f25f964 --- /dev/null +++ b/kitty/kitty.conf @@ -0,0 +1,17 @@ +# vim:fileencoding=utf-8:foldmethod=marker + +font_family FiraCode Nerd Font +font_size 12 + +window_padding_width 5 + +background_opacity 0.96 +background_blur 0 +# BEGIN_KITTY_THEME +# Everforest Light Medium +include current-theme.conf +# END_KITTY_THEME +window_padding_width 8 + +allow_remote_control yes +# hide_window_decorations yes diff --git a/kitty/kitty.conf.bak b/kitty/kitty.conf.bak new file mode 100644 index 0000000..c9f0f80 --- /dev/null +++ b/kitty/kitty.conf.bak @@ -0,0 +1,17 @@ +# vim:fileencoding=utf-8:foldmethod=marker + +font_family FiraCode Nerd Font +font_size 12 + +window_padding_width 5 + +background_opacity 0.96 +background_blur 0 +# BEGIN_KITTY_THEME +# Afterglow +include current-theme.conf +# END_KITTY_THEME +window_padding_width 8 + +allow_remote_control yes +# hide_window_decorations yes diff --git a/kitty/light-theme.auto.conf b/kitty/light-theme.auto.conf new file mode 100644 index 0000000..4af185f --- /dev/null +++ b/kitty/light-theme.auto.conf @@ -0,0 +1,103 @@ +# vim:ft=kitty +## name: Dawnfox +## author: EdenEast +## license: MIT +## upstream: https://github.com/EdenEast/nightfox.nvim/blob/main/extra/dawnfox/kitty.conf +## blurb: Dawnfox theme from the neovim colorscheme nightfox.nvim. + +#: All the settings below are colors, which you can choose to modify, or use the +#: defaults. You can also add non-color based settings if needed but note that +#: these will not work with using kitty @ set-colors with this theme. For a +#: reference on what these settings do see https://sw.kovidgoyal.net/kitty/conf/ + +#: The basic colors + +foreground #575279 +background #faf4ed +selection_foreground #575279 +selection_background #d0d8d8 + + +#: Cursor colors + +cursor #575279 +cursor_text_color #faf4ed + + +#: URL underline color when hovering with mouse + +url_color #618774 + + +#: kitty window border colors and terminal bell colors + +active_border_color #286983 +inactive_border_color #bdbfc9 +bell_border_color #d7827e +# visual_bell_color none + + +#: OS Window titlebar colors + +# wayland_titlebar_color system +# macos_titlebar_color system + + +#: Tab bar colors + +active_tab_foreground #ebe5df +active_tab_background #286983 +inactive_tab_foreground #9893a5 +inactive_tab_background #d0d8d8 +# tab_bar_background none +# tab_bar_margin_color none + + +#: Colors for marks (marked text in the terminal) + +# mark1_foreground black +# mark1_background #98d3cb +# mark2_foreground black +# mark2_background #f2dcd3 +# mark3_foreground black +# mark3_background #f274bc + + +#: The basic 16 colors + +#: black +color0 #575279 +color8 #5f5695 + +#: red +color1 #b4637a +color9 #c26d85 + +#: green +color2 #618774 +color10 #629f81 + +#: yellow +color3 #ea9d34 +color11 #eea846 + +#: blue +color4 #286983 +color12 #2d81a3 + +#: magenta +color5 #907aa9 +color13 #9a80b9 + +#: cyan +color6 #56949f +color14 #5ca7b4 + +#: white +color7 #e5e9f0 +color15 #e6ebf3 + +#: You can set the remaining 240 colors as color16 to color255. + +color16 #d7827e +color17 #d685af diff --git a/kitty/no-preference-theme.auto.conf b/kitty/no-preference-theme.auto.conf new file mode 100644 index 0000000..fca9531 --- /dev/null +++ b/kitty/no-preference-theme.auto.conf @@ -0,0 +1,53 @@ +## name: Rosé Pine +## author: mvllow +## license: MIT +## upstream: https://github.com/rose-pine/kitty/blob/main/dist/rose-pine.conf +## blurb: All natural pine, faux fur and a bit of soho vibes for the classy minimalist + +foreground #e0def4 +background #191724 +selection_foreground #e0def4 +selection_background #403d52 + +cursor #524f67 +cursor_text_color #e0def4 + +url_color #c4a7e7 + +active_tab_foreground #e0def4 +active_tab_background #26233a +inactive_tab_foreground #6e6a86 +inactive_tab_background #191724 + +# black +color0 #26233a +color8 #6e6a86 + +# red +color1 #eb6f92 +color9 #eb6f92 + +# green +color2 #31748f +color10 #31748f + +# yellow +color3 #f6c177 +color11 #f6c177 + +# blue +color4 #9ccfd8 +color12 #9ccfd8 + +# magenta +color5 #c4a7e7 +color13 #c4a7e7 + +# cyan +color6 #ebbcba +color14 #ebbcba + +# white +color7 #e0def4 +color15 #e0def4 + diff --git a/wayle/config.toml b/wayle/config.toml new file mode 100644 index 0000000..bd1becd --- /dev/null +++ b/wayle/config.toml @@ -0,0 +1,21 @@ +# Wayle configuration file + +[[bar.layout]] +monitor = "*" +left = ["media", "custom-hy3-split","hyprland-workspaces"] +center = ["clock"] +right = ["custom-gpu-temp", "battery", "bluetooth", "network", "microphone", "volume"] + +[[modules.custom]] +id="gpu-temp" +command = "nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader" +interval-ms = 5000 +icon-name = "ld-thermometer-symbolic" +format = "{{ output }}" + +[[modules.custom]] +id = "hy3-split" +command = "cat /tmp/hy3_split 2>/dev/null || echo H" +interval-ms = 250 +icon-name = "ld-layers-symbolic" +format = "{{ output }}" diff --git a/wayle/config.toml.save b/wayle/config.toml.save new file mode 100644 index 0000000..d1ec7dc --- /dev/null +++ b/wayle/config.toml.save @@ -0,0 +1,7 @@ +# Wayle configuration file + +[[bar.layout]] +monitor = "*" +left = ["hyprland-workspaces"] +center = ["clock"] +right = ["battery", "bluetooth", "network", "microphone", "volume"] diff --git a/wayle/runtime.toml b/wayle/runtime.toml new file mode 100644 index 0000000..e69de29 diff --git a/wayle/schema.json b/wayle/schema.json new file mode 100644 index 0000000..50e1066 --- /dev/null +++ b/wayle/schema.json @@ -0,0 +1 @@ +{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"Config","description":"Main configuration structure for Wayle.\n\nRepresents the complete configuration schema that can be loaded\nfrom TOML files. All fields have sensible defaults.","type":"object","properties":{"imports":{"description":"TOML files to import and merge before this config.\n\nPaths are relative to the config file.\nImported values are overridden by values in this file.\n\n```toml\nimports = [\"themes.toml\", \"modules/clock.toml\"]\n```","type":"array","items":{"type":"string"},"default":[]},"general":{"description":"General Wayle settings.","$ref":"#/$defs/GeneralConfig","default":{"font-sans":"Inter","font-mono":"JetBrains Mono","tearing-mode":false}},"bar":{"description":"Bar layout and module placement.","$ref":"#/$defs/BarConfig","default":{"layout":[{"monitor":"*","extends":null,"show":true,"left":["media"],"center":["clock"],"right":["battery","bluetooth","network","microphone","volume"]}],"scale":1.0,"inset-edge":0.0,"inset-ends":0.0,"padding":0.3499999940395355,"padding-ends":0.5,"module-gap":0.5,"location":"top","bg":"bg-surface","background-opacity":100,"border-location":"none","border-width":1,"border-color":"border-accent","rounding":"none","shadow":"none","button-variant":"block-prefix","button-opacity":100,"button-bg-opacity":100,"button-icon-size":1.0,"button-icon-padding":1.0,"button-label-size":1.0,"button-label-weight":"semibold","button-label-padding":1.0,"button-rounding":"sm","button-gap":1.0,"button-icon-position":"start","button-border-location":"all","button-border-width":1,"button-group-border-location":"none","button-group-border-width":1,"button-group-padding":0.0,"button-group-module-gap":0.25,"button-group-background":"bg-elevated","button-group-opacity":100,"button-group-border-color":"border-accent","button-group-rounding":"sm","dropdown-shadow":true,"dropdown-opacity":100,"dropdown-autohide":true,"dropdown-freeze-label":true}},"styling":{"description":"Styling configuration (theme, fonts, scale).","$ref":"#/$defs/StylingConfig","default":{"scale":1.0099999904632568,"rounding":"sm","theme-provider":"wayle","theming-monitor":"","matugen-scheme":"tonal-spot","matugen-contrast":0.0,"matugen-source-color":0,"matugen-light":false,"wallust-palette":"dark16","wallust-saturation":0,"wallust-check-contrast":true,"wallust-backend":"fastresize","wallust-colorspace":"labmixed","wallust-apply-globally":true,"pywal-saturation":0.05,"pywal-contrast":3.0,"pywal-light":false,"pywal-apply-globally":true,"palette":{"bg":"#141420","surface":"#1c1c2c","elevated":"#262638","fg":"#d4d6e8","fg-muted":"#8a8ca4","primary":"#e0947a","red":"#e46870","yellow":"#e0b870","green":"#68c898","blue":"#78a0e0"}}},"modules":{"description":"Module-specific configurations.","$ref":"#/$defs/ModulesConfig","default":{"battery":{"level-icons":["md-battery_android_0-symbolic","md-battery_android_frame_1-symbolic","md-battery_android_frame_2-symbolic","md-battery_android_frame_3-symbolic","md-battery_android_frame_4-symbolic","md-battery_android_frame_5-symbolic","md-battery_android_frame_6-symbolic","md-battery_android_frame_full-symbolic"],"charging-icon":"md-battery_android_frame_bolt-symbolic","alert-icon":"md-battery_android_alert-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","format":"{{ percent }}%","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:battery","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]},"bluetooth":{"disabled-icon":"ld-bluetooth-off-symbolic","disconnected-icon":"ld-bluetooth-symbolic","connected-icon":"ld-bluetooth-connected-symbolic","searching-icon":"ld-bluetooth-searching-symbolic","border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":15,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:bluetooth","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"cava":{"bars":20,"framerate":60,"stereo":false,"noise-reduction":0.65,"monstercat":0.0,"waves":0,"low-cutoff":50,"high-cutoff":17000,"input":"pipe-wire","source":"auto","style":"bars","direction":"normal","color":"accent","button-bg-color":"bg-surface-elevated","bar-width":6,"bar-gap":1,"internal-padding":0.5,"border-show":false,"border-color":"border-accent","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"clock":{"format":"%a %b %d %I:%M %p","icon-name":"tb-calendar-time-symbolic","border-show":false,"border-color":"border-accent","icon-show":true,"icon-color":"auto","icon-bg-color":"accent","label-show":true,"label-color":"accent","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:calendar","right-click":"dropdown:weather","middle-click":"","scroll-up":"","scroll-down":"","dropdown-show-seconds":false},"cpu":{"poll-interval-ms":2000,"temp-sensor":"auto","format":"{{ percent }}%","icon-name":"ld-cpu-symbolic","border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]},"dashboard":{"icon-override":"","border-show":false,"border-color":"yellow","icon-color":"auto","icon-bg-color":"yellow","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","left-click":"dropdown:dashboard","dropdown-lock-command":"loginctl lock-session","dropdown-logout-command":"loginctl terminate-session $XDG_SESSION_ID","dropdown-reboot-command":"systemctl reboot","dropdown-poweroff-command":"systemctl poweroff"},"hyprland-workspaces":{"min-workspace-count":0,"monitor-specific":true,"show-special":true,"urgent-show":true,"urgent-mode":"workspace","display-mode":"label","label-use-name":false,"numbering":"absolute","divider":" ","app-icons-show":false,"app-icons-dedupe":true,"app-icons-fallback":"ld-app-window-symbolic","app-icons-empty":"tb-minus-symbolic","icon-gap":0.30000001192092896,"workspace-padding":0.5,"icon-size":1.0,"label-size":1.0,"workspace-ignore":[],"active-indicator":"background","active-color":"accent","occupied-color":"fg-muted","empty-color":"fg-subtle","container-bg-color":"bg-surface-elevated","border-show":false,"border-color":"border-default","workspace-map":{},"app-icon-map":{}},"hyprsunset":{"format":"{{ status }}","temperature":5000,"gamma":100,"icon-off":"ld-sun-symbolic","icon-on":"ld-moon-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":":toggle","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"idle-inhibit":{"startup-duration":60,"icon-inactive":"tb-coffee-off-symbolic","icon-active":"tb-coffee-symbolic","format":"{{ state }}","border-show":false,"border-color":"green","icon-show":true,"icon-color":"auto","icon-bg-color":"green","label-show":true,"label-color":"green","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"wayle idle toggle --indefinite","right-click":"wayle idle toggle","middle-click":"","scroll-up":"","scroll-down":""},"keybind-mode":{"format":"{{ mode }}","icon-name":"ld-layers-symbolic","auto-hide":false,"border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"keyboard-input":{"format":"{{ alias }}","icon-name":"ld-keyboard-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","layout-alias-map":{}},"media":{"icon-type":"application-mapped","player-icons":{},"players-ignored":[],"player-priority":[],"format":"{{ title }} - {{ artist }}","icon-name":"ld-music-symbolic","spinning-disc-icon":"ld-disc-3-symbolic","border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":35,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:media","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"microphone":{"icon-active":"ld-mic-symbolic","icon-muted":"ld-mic-off-symbolic","border-show":false,"border-color":"red","icon-show":true,"icon-color":"auto","icon-bg-color":"red","label-show":true,"label-color":"red","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:audio","right-click":"","middle-click":"wayle audio input-mute","scroll-up":"","scroll-down":"","thresholds":[]},"network":{"wifi-disabled-icon":"cm-wireless-disabled-symbolic","wifi-acquiring-icon":"cm-wireless-acquiring-symbolic","wifi-offline-icon":"cm-wireless-offline-symbolic","wifi-connected-icon":"cm-wireless-connected-symbolic","wifi-signal-icons":["cm-wireless-signal-weak-symbolic","cm-wireless-signal-ok-symbolic","cm-wireless-signal-good-symbolic","cm-wireless-signal-excellent-symbolic"],"wired-connected-icon":"cm-wired-symbolic","wired-acquiring-icon":"cm-wired-acquiring-symbolic","wired-disconnected-icon":"cm-wired-disconnected-symbolic","border-show":false,"border-color":"accent","icon-show":true,"icon-color":"auto","icon-bg-color":"accent","label-show":true,"label-color":"accent","label-max-length":15,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:network","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"netstat":{"poll-interval-ms":2000,"interface":"auto","format":"{{ down_auto }} {{ up_auto }}","icon-name":"ld-activity-symbolic","border-show":false,"border-color":"red","icon-show":true,"icon-color":"auto","icon-bg-color":"red","label-show":true,"label-color":"red","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"notification":{"icon-name":"ld-bell-symbolic","icon-unread":"ld-bell-dot-symbolic","icon-dnd":"ld-bell-off-symbolic","border-show":false,"border-color":"green","icon-show":true,"icon-color":"auto","icon-bg-color":"green","label-show":true,"label-color":"green","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:notification","right-click":"wayle notify dnd","middle-click":"","scroll-up":"","scroll-down":"","blocklist":[],"icon-source":"automatic","popup-position":"top-right","popup-max-visible":5,"popup-stacking-order":"newest-first","popup-duration":5000,"popup-hover-pause":true,"popup-margin-x":0.0,"popup-margin-y":0.0,"popup-gap":8.0,"popup-monitor":"primary","popup-close-behavior":"dismiss","popup-shadow":true,"popup-urgency-bar":"low","thresholds":[]},"power":{"icon-name":"ld-power-symbolic","border-show":false,"border-color":"red","icon-color":"auto","icon-bg-color":"red","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","left-click":""},"ram":{"poll-interval-ms":5000,"format":"{{ percent }}%","icon-name":"ld-memory-stick-symbolic","border-show":false,"border-color":"green","icon-show":true,"icon-color":"auto","icon-bg-color":"green","label-show":true,"label-color":"green","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]},"storage":{"poll-interval-ms":30000,"mount-point":"/","format":"{{ percent }}%","icon-name":"ld-hard-drive-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]},"separator":{"size":1,"length":1.5,"color":"fg-subtle"},"systray":{"icon-scale":1.0,"item-gap":0.25,"internal-padding":0.5,"blacklist":[],"overrides":[],"border-show":false,"border-color":"border-accent","button-bg-color":"bg-surface-elevated"},"volume":{"level-icons":["ld-volume-symbolic","ld-volume-1-symbolic","ld-volume-2-symbolic"],"icon-muted":"ld-volume-x-symbolic","border-show":false,"border-color":"red","icon-show":true,"icon-color":"auto","icon-bg-color":"red","label-show":true,"label-color":"red","format":"{{ percent }}%","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:audio","right-click":"","middle-click":"wayle audio output-mute","scroll-up":"","scroll-down":"","dropdown-app-icons":"mapped","thresholds":[]},"weather":{"provider":"open-meteo","location":"San Francisco","units":"metric","format":"{{ temp }}{{ temp_unit }}","time-format":"12h","refresh-interval-seconds":1800,"visual-crossing-key":null,"weatherapi-key":null,"icon-name":"ld-sun-symbolic","border-show":false,"border-color":"border-accent","icon-show":true,"icon-color":"auto","icon-bg-color":"accent","label-show":true,"label-color":"accent","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:weather","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"window-title":{"format":"{{ title }}","icon-name":"ld-app-window-symbolic","icon-mappings":{},"border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":50,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"world-clock":{"format":"{{ tz('UTC', '%H:%M %Z') }}","icon-name":"ld-globe-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""},"custom":[]}},"osd":{"description":"On-screen display settings.","$ref":"#/$defs/OsdConfig","default":{"enabled":true,"position":"bottom","duration":2500,"monitor":"primary","margin":150.0,"border":true}},"wallpaper":{"description":"Wallpaper service settings.","$ref":"#/$defs/WallpaperConfig","default":{"engine-enabled":true,"transition-type":"simple","transition-duration":0.699999988079071,"transition-fps":60,"cycling-enabled":false,"cycling-directory":"","cycling-mode":"sequential","cycling-interval-mins":15,"cycling-same-image":false,"monitors":[]}}},"$defs":{"GeneralConfig":{"description":"Shell-wide settings that don't belong to any specific module.","type":"object","properties":{"font-sans":{"description":"Sans-serif font family for UI text and labels.","$ref":"#/$defs/string","default":"Inter"},"font-mono":{"description":"Monospace font family for code and technical content.","$ref":"#/$defs/string","default":"JetBrains Mono"},"tearing-mode":{"description":"Demote overlay surfaces to allow compositor screen tearing.\n\nWhen enabled, surfaces that would normally use the `overlay` layer\nare demoted to `top`, allowing fullscreen games to use direct scanout.","$ref":"#/$defs/boolean","default":false}}},"string":{"type":"string"},"boolean":{"type":"boolean"},"BarConfig":{"description":"Bar chrome: per-monitor layout, spacing, colors, and button styling.","type":"object","properties":{"layout":{"description":"Per-monitor bar layouts. Each entry targets a monitor by connector name\n(e.g., `\"DP-1\"`) or `\"*\"` for all monitors. See [`BarLayout`] for the\nfull shape, including layout inheritance via `extends`.\n\n## Example\n\n```toml\n[[bar.layout]]\nmonitor = \"*\"\nleft = [\"dashboard\"]\ncenter = [\"clock\"]\nright = [\"battery\", \"network\", \"volume\", \"systray\"]\n\n[[bar.layout]]\nmonitor = \"HDMI-1\"\nextends = \"*\"\nright = [\"volume\", \"systray\"]\n```","$ref":"#/$defs/Array_of_BarLayout","default":[{"monitor":"*","extends":null,"show":true,"left":["media"],"center":["clock"],"right":["battery","bluetooth","network","microphone","volume"]}]},"scale":{"description":"Bar-specific scale multiplier for spacing, radius, and other bar elements.","$ref":"#/$defs/ScaleFactor","default":1.0},"inset-edge":{"description":"Gap between bar and its attached screen edge.\n\n- **Orientation**: Distance from top (horizontal bar) or left (vertical bar)","$ref":"#/$defs/Spacing","default":0.0},"inset-ends":{"description":"Gap at the bar's ends.\n\n- **Orientation**: Left/right (horizontal bar), top/bottom (vertical bar)","$ref":"#/$defs/Spacing","default":0.0},"padding":{"description":"Internal spacing along bar thickness.\n\n- **Orientation**: Top/bottom (horizontal bar), left/right (vertical bar)","$ref":"#/$defs/Spacing","default":0.3499999940395355},"padding-ends":{"description":"Internal spacing at bar ends.\n\n- **Orientation**: Left/right (horizontal bar), top/bottom (vertical bar)","$ref":"#/$defs/Spacing","default":0.5},"module-gap":{"description":"Gap between modules and groups on the bar.","$ref":"#/$defs/Spacing","default":0.5},"location":{"description":"Bar position on screen edge.","$ref":"#/$defs/Location","default":"top"},"bg":{"description":"Bar background color.","$ref":"#/$defs/ColorValue","default":"bg-surface"},"background-opacity":{"description":"Bar background opacity (0-100).","$ref":"#/$defs/Percentage","default":100},"border-location":{"description":"Border placement for bar.","$ref":"#/$defs/BorderLocation","default":"none"},"border-width":{"description":"Border width for bar (pixels).","$ref":"#/$defs/uint8","default":1},"border-color":{"description":"Border color for the bar.","$ref":"#/$defs/ColorValue","default":"border-accent"},"rounding":{"description":"Corner rounding level for the bar.","$ref":"#/$defs/RoundingLevel","default":"none"},"shadow":{"description":"Shadow style for the bar.","$ref":"#/$defs/ShadowPreset","default":"none"},"button-variant":{"description":"Visual style variant for bar buttons.","$ref":"#/$defs/BarButtonVariant","default":"block-prefix"},"button-opacity":{"description":"Button opacity (0-100).","$ref":"#/$defs/Percentage","default":100},"button-bg-opacity":{"description":"Button background opacity (0-100).","$ref":"#/$defs/Percentage","default":100},"button-icon-size":{"description":"Button icon size.","$ref":"#/$defs/ScaleFactor","default":1.0},"button-icon-padding":{"description":"Button icon container padding. Only applies to `block-prefix` and `icon-square` variants.","$ref":"#/$defs/ScaleFactor","default":1.0},"button-label-size":{"description":"Button label text size.","$ref":"#/$defs/ScaleFactor","default":1.0},"button-label-weight":{"description":"Button label font weight.","$ref":"#/$defs/FontWeightClass","default":"semibold"},"button-label-padding":{"description":"Button label container padding.","$ref":"#/$defs/ScaleFactor","default":1.0},"button-rounding":{"description":"Corner rounding level for the buttons in the bar.","$ref":"#/$defs/RoundingLevel","default":"sm"},"button-gap":{"description":"Gap between button icon and label.","$ref":"#/$defs/ScaleFactor","default":1.0},"button-icon-position":{"description":"Icon position relative to label in bar buttons.","$ref":"#/$defs/IconPosition","default":"start"},"button-border-location":{"description":"Border placement for bar buttons.","$ref":"#/$defs/BorderLocation","default":"all"},"button-border-width":{"description":"Border width for bar buttons (pixels).","$ref":"#/$defs/uint8","default":1},"button-group-border-location":{"description":"Border placement for button groups.","$ref":"#/$defs/BorderLocation","default":"none"},"button-group-border-width":{"description":"Border width for button groups (pixels).","$ref":"#/$defs/uint8","default":1},"button-group-padding":{"description":"Internal padding for button groups.","$ref":"#/$defs/Spacing","default":0.0},"button-group-module-gap":{"description":"Gap between modules within a group.","$ref":"#/$defs/Spacing","default":0.25},"button-group-background":{"description":"Background color for button groups.","$ref":"#/$defs/ColorValue","default":"bg-elevated"},"button-group-opacity":{"description":"Button group opacity (0-100).","$ref":"#/$defs/Percentage","default":100},"button-group-border-color":{"description":"Border color for button groups.","$ref":"#/$defs/ColorValue","default":"border-accent"},"button-group-rounding":{"description":"Corner rounding level for button groups.","$ref":"#/$defs/RoundingLevel","default":"sm"},"dropdown-shadow":{"description":"Enable dropdown panel shadow.","$ref":"#/$defs/boolean","default":true},"dropdown-opacity":{"description":"Dropdown panel opacity (0-100).","$ref":"#/$defs/Percentage","default":100},"dropdown-autohide":{"description":"Close dropdown when clicking outside it.","$ref":"#/$defs/boolean","default":true},"dropdown-freeze-label":{"description":"Freeze the bar button label while its dropdown is open.\n\nPrevents the button from resizing mid-interaction, which keeps the\ndropdown anchored in place.","$ref":"#/$defs/boolean","default":true}}},"Array_of_BarLayout":{"type":"array","items":{"$ref":"#/$defs/BarLayout"}},"BarLayout":{"description":"Layout configuration for a bar on a specific monitor.\n\n## Examples\n\n```toml\n# Single modules\n[[bar.layout]]\nmonitor = \"*\"\nleft = [\"dashboard\"]\ncenter = [\"clock\"]\nright = [\"systray\"]\n\n# Module with custom CSS class for per-instance styling\n[[bar.layout]]\nmonitor = \"DP-1\"\nleft = [{ module = \"clock\", class = \"primary-clock\" }, \"clock\"]\ncenter = [\"media\"]\n\n# Grouped modules (share a visual container, CSS-targetable by name)\n[[bar.layout]]\nmonitor = \"DP-2\"\nleft = [{ name = \"status\", modules = [\"battery\", \"network\"] }]\n\n# Groups can also contain classed modules\n[[bar.layout]]\nmonitor = \"DP-3\"\nleft = [{ name = \"clocks\", modules = [\n { module = \"clock\", class = \"local\" },\n { module = \"world-clock\", class = \"remote\" }\n]}]\n\n# Inherit from another layout\n[[bar.layout]]\nmonitor = \"*\"\nleft = [\"dashboard\"]\ncenter = [\"clock\"]\nright = [\"systray\"]\n\n[[bar.layout]]\nmonitor = \"HDMI-1\"\nextends = \"*\"\nright = [\"volume\", \"systray\"] # Override just this section\n\n# Hide bar on a specific monitor\n[[bar.layout]]\nmonitor = \"HDMI-2\"\nshow = false\n```","type":"object","properties":{"monitor":{"description":"Monitor connector name (e.g., `\"DP-1\"`) or `\"*\"` for all monitors.","type":"string","default":"*"},"extends":{"description":"Inherit from another layout by its monitor value (e.g., `\"*\"`).","type":["string","null"],"default":null},"show":{"description":"Whether the bar is visible on this monitor.","type":"boolean","default":true},"left":{"description":"Modules in the left section.","type":"array","items":{"$ref":"#/$defs/BarItem"},"default":["media"]},"center":{"description":"Modules in the center section.","type":"array","items":{"$ref":"#/$defs/BarItem"},"default":["clock"]},"right":{"description":"Modules in the right section.","type":"array","items":{"$ref":"#/$defs/BarItem"},"default":["battery","bluetooth","network","microphone","volume"]}}},"BarItem":{"description":"One entry in a bar layout section (`left`, `center`, or `right`).\n\nThree shapes are accepted, all interchangeable in the same array:\n\n- A plain module name: `\"clock\"`\n- A module with a CSS class for per-instance styling: `{ module = \"clock\", class = \"primary\" }`\n- A named group that wraps several modules in a shared container, addressable by CSS ID\n\n## Examples\n\n```toml\n[[bar.layout]]\nmonitor = \"*\"\n\n# Plain module\nleft = [\"dashboard\"]\n\n# Mix of plain and classed modules on the same side\ncenter = [\"clock\", { module = \"clock\", class = \"secondary\" }]\n\n# Named group (renders inside a GTK container with CSS ID `#status`)\nright = [{ name = \"status\", modules = [\"battery\", \"network\", \"volume\"] }]\n\n# Groups can hold classed modules too\n[[bar.layout]]\nmonitor = \"DP-2\"\nleft = [{ name = \"clocks\", modules = [\n { module = \"clock\", class = \"local\" },\n { module = \"world-clock\", class = \"remote\" }\n]}]\n```","anyOf":[{"description":"A single module (plain or with custom CSS class).","$ref":"#/$defs/ModuleRef"},{"description":"A named group of modules with shared visual container.","$ref":"#/$defs/BarGroup"}]},"ModuleRef":{"description":"Reference to a module, optionally with a custom CSS class.\n\n## Examples\n\n```toml\n# Plain module (just the name)\nleft = [\"clock\"]\n\n# Module with custom CSS class\nleft = [{ module = \"clock\", class = \"primary-clock\" }]\n```","anyOf":[{"description":"Module with a custom CSS class.","$ref":"#/$defs/ClassedModule"},{"description":"Plain module reference.","$ref":"#/$defs/BarModule"}]},"ClassedModule":{"description":"A module with an associated CSS class for custom styling.","type":"object","properties":{"module":{"description":"The module type.","$ref":"#/$defs/BarModule"},"class":{"description":"CSS class added to the module's GTK widget.","type":"string"}},"required":["module","class"]},"BarModule":{"description":"Bar module name. Built-in modules or custom modules with a `custom-` pattern.","anyOf":[{"enum":["battery","bluetooth","cava","clock","cpu","dashboard","hyprland-workspaces","hyprsunset","idle-inhibit","keybind-mode","keyboard-input","media","microphone","netstat","network","notifications","power","ram","separator","storage","systray","updates","volume","weather","window-title","world-clock"]},{"description":"Custom module ID (e.g., 'custom-gpu-temp')","type":"string","pattern":"^custom-[a-z0-9-]+$"}]},"BarGroup":{"description":"Named group of modules. The name becomes a CSS ID selector.","type":"object","properties":{"name":{"description":"Unique name for CSS targeting (becomes `#name` selector).","type":"string"},"modules":{"description":"Modules contained in this group.","type":"array","items":{"$ref":"#/$defs/ModuleRef"}}},"required":["name","modules"]},"ScaleFactor":{"description":"Scale multiplier clamped to 0.25-3.0.","type":"number","format":"float","minimum":0.25,"maximum":3.0},"Spacing":{"description":"Non-negative spacing value (clamped at 0).","type":"number","format":"float","minimum":0.0},"Location":{"description":"Bar position on screen.","oneOf":[{"description":"Top edge of the screen.","type":"string","const":"top"},{"description":"Bottom edge of the screen.","type":"string","const":"bottom"},{"description":"Left edge of the screen.","type":"string","const":"left"},{"description":"Right edge of the screen.","type":"string","const":"right"}]},"ColorValue":{"description":"CSS token, hex color (#rgb, #rgba, #rrggbb, or #rrggbbaa), 'transparent', or 'auto'","anyOf":[{"oneOf":[{"description":"`--bg-base` - Application background.","type":"string","const":"bg-base"},{"description":"`--bg-surface` - Elevated surfaces.","type":"string","const":"bg-surface"},{"description":"`--bg-surface-elevated` - Subtle elevation from surface (buttons on surface).","type":"string","const":"bg-surface-elevated"},{"description":"`--bg-elevated` - Higher elevation surfaces.","type":"string","const":"bg-elevated"},{"description":"`--bg-overlay` - Popovers, dialogs.","type":"string","const":"bg-overlay"},{"description":"`--bg-hover` - Hover state background.","type":"string","const":"bg-hover"},{"description":"`--bg-active` - Active/pressed state background.","type":"string","const":"bg-active"},{"description":"`--bg-selected` - Selected item background.","type":"string","const":"bg-selected"},{"description":"`--fg-default` - Primary text color.","type":"string","const":"fg-default"},{"description":"`--fg-muted` - Secondary text color.","type":"string","const":"fg-muted"},{"description":"`--fg-subtle` - Tertiary/hint text color.","type":"string","const":"fg-subtle"},{"description":"`--fg-on-accent` - Text color on accent backgrounds.","type":"string","const":"fg-on-accent"},{"description":"`--accent` - Primary accent color.","type":"string","const":"accent"},{"description":"`--accent-subtle` - Subtle accent background.","type":"string","const":"accent-subtle"},{"description":"`--accent-hover` - Accent hover state.","type":"string","const":"accent-hover"},{"description":"`--status-error` - Error state color.","type":"string","const":"status-error"},{"description":"`--status-warning` - Warning state color.","type":"string","const":"status-warning"},{"description":"`--status-success` - Success state color.","type":"string","const":"status-success"},{"description":"`--status-info` - Info state color.","type":"string","const":"status-info"},{"description":"`--status-error-subtle` - Subtle error background.","type":"string","const":"status-error-subtle"},{"description":"`--status-warning-subtle` - Subtle warning background.","type":"string","const":"status-warning-subtle"},{"description":"`--status-success-subtle` - Subtle success background.","type":"string","const":"status-success-subtle"},{"description":"`--status-info-subtle` - Subtle info background.","type":"string","const":"status-info-subtle"},{"description":"`--status-error-hover` - Error hover state.","type":"string","const":"status-error-hover"},{"description":"`--red` - Red color for stylistic/decorative use.","type":"string","const":"red"},{"description":"`--yellow` - Yellow color for stylistic/decorative use.","type":"string","const":"yellow"},{"description":"`--green` - Green color for stylistic/decorative use.","type":"string","const":"green"},{"description":"`--blue` - Blue color for stylistic/decorative use.","type":"string","const":"blue"},{"description":"`--border-subtle` - Subtle border color.","type":"string","const":"border-subtle"},{"description":"`--border-default` - Default border color.","type":"string","const":"border-default"},{"description":"`--border-strong` - Strong border color.","type":"string","const":"border-strong"},{"description":"`--border-accent` - Accent-colored border.","type":"string","const":"border-accent"},{"description":"`--border-error` - Error state border.","type":"string","const":"border-error"}]},{"enum":["transparent","auto"]},{"type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"}]},"Percentage":{"description":"Percentage value clamped to 0-100.","type":"integer","format":"uint8","minimum":0,"maximum":100},"BorderLocation":{"description":"Border placement for bar buttons.","oneOf":[{"description":"No border.","type":"string","const":"none"},{"description":"Border on top edge only.","type":"string","const":"top"},{"description":"Border on bottom edge only.","type":"string","const":"bottom"},{"description":"Border on left edge only.","type":"string","const":"left"},{"description":"Border on right edge only.","type":"string","const":"right"},{"description":"Border on all edges.","type":"string","const":"all"}]},"uint8":{"type":"integer","format":"uint8","minimum":0,"maximum":255},"RoundingLevel":{"description":"Global rounding preference for UI components.","oneOf":[{"description":"Sharp corners (no rounding).","type":"string","const":"none"},{"description":"Subtle rounding.","type":"string","const":"sm"},{"description":"Moderate rounding (default).","type":"string","const":"md"},{"description":"Pronounced rounding.","type":"string","const":"lg"},{"description":"Pill shape (fully rounded ends).","type":"string","const":"full"}]},"ShadowPreset":{"description":"Shadow style for the bar.","oneOf":[{"description":"No shadow.","type":"string","const":"none"},{"description":"Directional shadow opposite the anchor edge.","type":"string","const":"drop"},{"description":"All-around shadow.","type":"string","const":"floating"}]},"BarButtonVariant":{"description":"Visual style variants for bar buttons.","oneOf":[{"description":"Icon + label, minimal background.","type":"string","const":"basic"},{"description":"Icon in colored pill container that blends into button edge.","type":"string","const":"block-prefix"},{"description":"Button background with colored icon container inside.","type":"string","const":"icon-square"}]},"FontWeightClass":{"description":"Font weight class for typography.\n\nMaps to CSS classes like `.weight-normal`, `.weight-bold`, etc.\nUses the existing `--weight-*` tokens defined in SCSS.","oneOf":[{"description":"Normal weight (--weight-normal: 400).","type":"string","const":"normal"},{"description":"Medium weight (--weight-medium: 500).","type":"string","const":"medium"},{"description":"Semi-bold weight (--weight-semibold: 600).","type":"string","const":"semibold"},{"description":"Bold weight (--weight-bold: 700).","type":"string","const":"bold"}]},"IconPosition":{"description":"Icon position within bar buttons.","oneOf":[{"description":"Icon before label (left for horizontal, top for vertical bars).","type":"string","const":"start"},{"description":"Icon after label (right for horizontal, bottom for vertical bars).","type":"string","const":"end"}]},"StylingConfig":{"description":"Theme, palette, and rounding tokens applied shell-wide. Changes recompile the stylesheet.","type":"object","properties":{"scale":{"description":"Scale multiplier for dropdowns, popovers, and dialogs.","$ref":"#/$defs/ScaleFactor","default":1.0099999904632568},"rounding":{"description":"Corner rounding for dropdowns, popovers, and dialogs.","$ref":"#/$defs/RoundingLevel","default":"sm"},"theme-provider":{"description":"Theme provider (wayle, matugen, pywal, wallust).","$ref":"#/$defs/ThemeProvider","default":"wayle"},"theming-monitor":{"description":"Monitor whose wallpaper drives color extraction. Empty uses the first available.","$ref":"#/$defs/string","default":""},"matugen-scheme":{"description":"Matugen color scheme type.","$ref":"#/$defs/MatugenScheme","default":"tonal-spot"},"matugen-contrast":{"description":"Matugen contrast level (-1.0 to 1.0).","$ref":"#/$defs/SignedNormalizedF64","default":0.0},"matugen-source-color":{"description":"Matugen source color index (0-3).","$ref":"#/$defs/uint8","default":0},"matugen-light":{"description":"Matugen light mode.","$ref":"#/$defs/boolean","default":false},"wallust-palette":{"description":"Wallust palette mode.","$ref":"#/$defs/WallustPalette","default":"dark16"},"wallust-saturation":{"description":"Wallust saturation boost (0-100, 0 disables).","$ref":"#/$defs/Percentage","default":0},"wallust-check-contrast":{"description":"Wallust contrast checking against background.","$ref":"#/$defs/boolean","default":true},"wallust-backend":{"description":"Wallust image sampling backend.","$ref":"#/$defs/WallustBackend","default":"fastresize"},"wallust-colorspace":{"description":"Wallust color space for dominant color selection.","$ref":"#/$defs/WallustColorspace","default":"labmixed"},"wallust-apply-globally":{"description":"Apply wallust colors to terminals and external tools.","$ref":"#/$defs/boolean","default":true},"pywal-saturation":{"description":"Pywal saturation adjustment (0.0-1.0).","$ref":"#/$defs/NormalizedF64","default":0.05},"pywal-contrast":{"description":"Pywal minimum contrast ratio (1.0-21.0).","$ref":"#/$defs/PywalContrast","default":3.0},"pywal-light":{"description":"Pywal light mode.","$ref":"#/$defs/boolean","default":false},"pywal-apply-globally":{"description":"Apply pywal colors to terminals and external tools.","$ref":"#/$defs/boolean","default":true},"palette":{"description":"Active color palette.","$ref":"#/$defs/PaletteConfig","default":{"bg":"#141420","surface":"#1c1c2c","elevated":"#262638","fg":"#d4d6e8","fg-muted":"#8a8ca4","primary":"#e0947a","red":"#e46870","yellow":"#e0b870","green":"#68c898","blue":"#78a0e0"}}}},"ThemeProvider":{"description":"Source of color palette values.\n\nDynamic providers (Matugen, Pywal, Wallust) inject palette tokens at runtime.","oneOf":[{"description":"Static theming using Wayle's built-in palettes.","type":"string","const":"wayle"},{"description":"Dynamic theming via Matugen.","type":"string","const":"matugen"},{"description":"Dynamic theming via Pywal.","type":"string","const":"pywal"},{"description":"Dynamic theming via Wallust.","type":"string","const":"wallust"}]},"MatugenScheme":{"description":"Matugen color scheme type.","oneOf":[{"description":"Adapts to image content.","type":"string","const":"content"},{"description":"Bold, dramatic palette.","type":"string","const":"expressive"},{"description":"Stays close to source colors.","type":"string","const":"fidelity"},{"description":"Playful multi-color palette.","type":"string","const":"fruit-salad"},{"description":"Single-hue grayscale palette.","type":"string","const":"monochrome"},{"description":"Muted, understated palette.","type":"string","const":"neutral"},{"description":"Broad hue spread.","type":"string","const":"rainbow"},{"description":"Balanced Material You default.","type":"string","const":"tonal-spot"},{"description":"High-saturation palette.","type":"string","const":"vibrant"}]},"SignedNormalizedF64":{"description":"Floating-point value clamped to -1.0 to 1.0.","type":"number","format":"double","minimum":-1.0,"maximum":1.0},"WallustPalette":{"description":"Wallust palette mode.","oneOf":[{"description":"8 dark colors with 16-color trick.","type":"string","const":"dark16"},{"description":"8 dark colors, dark background and light contrast.","type":"string","const":"dark"},{"description":"Dark with complementary counterparts.","type":"string","const":"darkcomp"},{"description":"Dark complementary with 16-color trick.","type":"string","const":"darkcomp16"},{"description":"Dark with hard hue colors.","type":"string","const":"harddark"},{"description":"Hard dark with 16-color trick.","type":"string","const":"harddark16"},{"description":"Hard dark complementary variant.","type":"string","const":"harddarkcomp"},{"description":"Hard dark complementary with 16-color trick.","type":"string","const":"harddarkcomp16"},{"description":"Light background, dark foreground.","type":"string","const":"light"},{"description":"Light with 16-color trick.","type":"string","const":"light16"},{"description":"Light with complementary colors.","type":"string","const":"lightcomp"},{"description":"Light complementary with 16-color trick.","type":"string","const":"lightcomp16"},{"description":"Lightest colors with dark background.","type":"string","const":"softdark"},{"description":"Soft dark with 16-color trick.","type":"string","const":"softdark16"},{"description":"Soft dark complementary variant.","type":"string","const":"softdarkcomp"},{"description":"Soft dark complementary with 16-color trick.","type":"string","const":"softdarkcomp16"},{"description":"Light with soft pastel colors.","type":"string","const":"softlight"},{"description":"Soft light with 16-color trick.","type":"string","const":"softlight16"},{"description":"Soft light with complementary colors.","type":"string","const":"softlightcomp"},{"description":"Soft light complementary with 16-color trick.","type":"string","const":"softlightcomp16"},{"description":"ANSI-ordered dark palette for LS_COLORS.","type":"string","const":"ansidark"},{"description":"ANSI dark with 16-color trick.","type":"string","const":"ansidark16"}]},"WallustBackend":{"description":"Wallust image sampling backend.","oneOf":[{"description":"Reads every pixel.","type":"string","const":"full"},{"description":"Resizes image before sampling.","type":"string","const":"resized"},{"description":"Uses ImageMagick convert (pywal method).","type":"string","const":"wal"},{"description":"Fixed 512x512 thumbnail.","type":"string","const":"thumb"},{"description":"SIMD-accelerated resize.","type":"string","const":"fastresize"},{"description":"K-means clustering.","type":"string","const":"kmeans"}]},"WallustColorspace":{"description":"Wallust color space for dominant color selection.","oneOf":[{"description":"CIELAB perceptual color space.","type":"string","const":"lab"},{"description":"LAB with mixing for sparse images.","type":"string","const":"labmixed"},{"description":"Cylindrical LAB (hue/chroma/lightness).","type":"string","const":"lch"},{"description":"LCH with mixing.","type":"string","const":"lchmixed"},{"description":"LCH mapped to ANSI color ordering.","type":"string","const":"lchansi"}]},"NormalizedF64":{"description":"Floating-point value clamped to 0.0-1.0.","type":"number","format":"double","minimum":0.0,"maximum":1.0},"PywalContrast":{"description":"Pywal contrast ratio clamped to 1.0-21.0 (WCAG range).","type":"number","format":"double","minimum":1.0,"maximum":21.0},"PaletteConfig":{"description":"Color palette configuration for the active theme.","type":"object","properties":{"bg":{"description":"Base background color (darkest).","$ref":"#/$defs/HexColor","default":"#141420"},"surface":{"description":"Card and sidebar background.","$ref":"#/$defs/HexColor","default":"#1c1c2c"},"elevated":{"description":"Raised element background.","$ref":"#/$defs/HexColor","default":"#262638"},"fg":{"description":"Primary text color.","$ref":"#/$defs/HexColor","default":"#d4d6e8"},"fg-muted":{"description":"Secondary text color.","$ref":"#/$defs/HexColor","default":"#8a8ca4"},"primary":{"description":"Accent color for interactive elements.","$ref":"#/$defs/HexColor","default":"#e0947a"},"red":{"description":"Red semantic color.","$ref":"#/$defs/HexColor","default":"#e46870"},"yellow":{"description":"Yellow semantic color.","$ref":"#/$defs/HexColor","default":"#e0b870"},"green":{"description":"Green semantic color.","$ref":"#/$defs/HexColor","default":"#68c898"},"blue":{"description":"Blue semantic color.","$ref":"#/$defs/HexColor","default":"#78a0e0"}}},"HexColor":{"description":"GTK4 CSS hex color (#rgb, #rgba, #rrggbb, or #rrggbbaa)","type":"string","pattern":"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"},"ModulesConfig":{"description":"Configuration for all available Wayle modules.","type":"object","properties":{"battery":{"description":"Battery status module.","$ref":"#/$defs/BatteryConfig","default":{"level-icons":["md-battery_android_0-symbolic","md-battery_android_frame_1-symbolic","md-battery_android_frame_2-symbolic","md-battery_android_frame_3-symbolic","md-battery_android_frame_4-symbolic","md-battery_android_frame_5-symbolic","md-battery_android_frame_6-symbolic","md-battery_android_frame_full-symbolic"],"charging-icon":"md-battery_android_frame_bolt-symbolic","alert-icon":"md-battery_android_alert-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","format":"{{ percent }}%","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:battery","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]}},"bluetooth":{"description":"Bluetooth connection module.","$ref":"#/$defs/BluetoothConfig","default":{"disabled-icon":"ld-bluetooth-off-symbolic","disconnected-icon":"ld-bluetooth-symbolic","connected-icon":"ld-bluetooth-connected-symbolic","searching-icon":"ld-bluetooth-searching-symbolic","border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":15,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:bluetooth","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"cava":{"description":"Cava audio visualizer module.","$ref":"#/$defs/CavaConfig","default":{"bars":20,"framerate":60,"stereo":false,"noise-reduction":0.65,"monstercat":0.0,"waves":0,"low-cutoff":50,"high-cutoff":17000,"input":"pipe-wire","source":"auto","style":"bars","direction":"normal","color":"accent","button-bg-color":"bg-surface-elevated","bar-width":6,"bar-gap":1,"internal-padding":0.5,"border-show":false,"border-color":"border-accent","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"clock":{"description":"Clock display module.","$ref":"#/$defs/ClockConfig","default":{"format":"%a %b %d %I:%M %p","icon-name":"tb-calendar-time-symbolic","border-show":false,"border-color":"border-accent","icon-show":true,"icon-color":"auto","icon-bg-color":"accent","label-show":true,"label-color":"accent","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:calendar","right-click":"dropdown:weather","middle-click":"","scroll-up":"","scroll-down":"","dropdown-show-seconds":false}},"cpu":{"description":"CPU usage module.","$ref":"#/$defs/CpuConfig","default":{"poll-interval-ms":2000,"temp-sensor":"auto","format":"{{ percent }}%","icon-name":"ld-cpu-symbolic","border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]}},"dashboard":{"description":"Dashboard module.","$ref":"#/$defs/DashboardConfig","default":{"icon-override":"","border-show":false,"border-color":"yellow","icon-color":"auto","icon-bg-color":"yellow","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","left-click":"dropdown:dashboard","dropdown-lock-command":"loginctl lock-session","dropdown-logout-command":"loginctl terminate-session $XDG_SESSION_ID","dropdown-reboot-command":"systemctl reboot","dropdown-poweroff-command":"systemctl poweroff"}},"hyprland-workspaces":{"description":"Hyprland workspace switcher module.","$ref":"#/$defs/HyprlandWorkspacesConfig","default":{"min-workspace-count":0,"monitor-specific":true,"show-special":true,"urgent-show":true,"urgent-mode":"workspace","display-mode":"label","label-use-name":false,"numbering":"absolute","divider":" ","app-icons-show":false,"app-icons-dedupe":true,"app-icons-fallback":"ld-app-window-symbolic","app-icons-empty":"tb-minus-symbolic","icon-gap":0.30000001192092896,"workspace-padding":0.5,"icon-size":1.0,"label-size":1.0,"workspace-ignore":[],"active-indicator":"background","active-color":"accent","occupied-color":"fg-muted","empty-color":"fg-subtle","container-bg-color":"bg-surface-elevated","border-show":false,"border-color":"border-default","workspace-map":{},"app-icon-map":{}}},"hyprsunset":{"description":"Hyprsunset (blue light filter) module.","$ref":"#/$defs/HyprsunsetConfig","default":{"format":"{{ status }}","temperature":5000,"gamma":100,"icon-off":"ld-sun-symbolic","icon-on":"ld-moon-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":":toggle","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"idle-inhibit":{"description":"Idle inhibitor module.","$ref":"#/$defs/IdleInhibitConfig","default":{"startup-duration":60,"icon-inactive":"tb-coffee-off-symbolic","icon-active":"tb-coffee-symbolic","format":"{{ state }}","border-show":false,"border-color":"green","icon-show":true,"icon-color":"auto","icon-bg-color":"green","label-show":true,"label-color":"green","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"wayle idle toggle --indefinite","right-click":"wayle idle toggle","middle-click":"","scroll-up":"","scroll-down":""}},"keybind-mode":{"description":"Keybind mode indicator module.","$ref":"#/$defs/KeybindModeConfig","default":{"format":"{{ mode }}","icon-name":"ld-layers-symbolic","auto-hide":false,"border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"keyboard-input":{"description":"Keyboard input module.","$ref":"#/$defs/KeyboardInputConfig","default":{"format":"{{ alias }}","icon-name":"ld-keyboard-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","layout-alias-map":{}}},"media":{"description":"Media player module.","$ref":"#/$defs/MediaConfig","default":{"icon-type":"application-mapped","player-icons":{},"players-ignored":[],"player-priority":[],"format":"{{ title }} - {{ artist }}","icon-name":"ld-music-symbolic","spinning-disc-icon":"ld-disc-3-symbolic","border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":35,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:media","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"microphone":{"description":"Microphone input module.","$ref":"#/$defs/MicrophoneConfig","default":{"icon-active":"ld-mic-symbolic","icon-muted":"ld-mic-off-symbolic","border-show":false,"border-color":"red","icon-show":true,"icon-color":"auto","icon-bg-color":"red","label-show":true,"label-color":"red","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:audio","right-click":"","middle-click":"wayle audio input-mute","scroll-up":"","scroll-down":"","thresholds":[]}},"network":{"description":"Network connection module.","$ref":"#/$defs/NetworkConfig","default":{"wifi-disabled-icon":"cm-wireless-disabled-symbolic","wifi-acquiring-icon":"cm-wireless-acquiring-symbolic","wifi-offline-icon":"cm-wireless-offline-symbolic","wifi-connected-icon":"cm-wireless-connected-symbolic","wifi-signal-icons":["cm-wireless-signal-weak-symbolic","cm-wireless-signal-ok-symbolic","cm-wireless-signal-good-symbolic","cm-wireless-signal-excellent-symbolic"],"wired-connected-icon":"cm-wired-symbolic","wired-acquiring-icon":"cm-wired-acquiring-symbolic","wired-disconnected-icon":"cm-wired-disconnected-symbolic","border-show":false,"border-color":"accent","icon-show":true,"icon-color":"auto","icon-bg-color":"accent","label-show":true,"label-color":"accent","label-max-length":15,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:network","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"netstat":{"description":"Network traffic statistics module.","$ref":"#/$defs/NetstatConfig","default":{"poll-interval-ms":2000,"interface":"auto","format":"{{ down_auto }} {{ up_auto }}","icon-name":"ld-activity-symbolic","border-show":false,"border-color":"red","icon-show":true,"icon-color":"auto","icon-bg-color":"red","label-show":true,"label-color":"red","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"notification":{"description":"Notification center module.","$ref":"#/$defs/NotificationConfig","default":{"icon-name":"ld-bell-symbolic","icon-unread":"ld-bell-dot-symbolic","icon-dnd":"ld-bell-off-symbolic","border-show":false,"border-color":"green","icon-show":true,"icon-color":"auto","icon-bg-color":"green","label-show":true,"label-color":"green","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:notification","right-click":"wayle notify dnd","middle-click":"","scroll-up":"","scroll-down":"","blocklist":[],"icon-source":"automatic","popup-position":"top-right","popup-max-visible":5,"popup-stacking-order":"newest-first","popup-duration":5000,"popup-hover-pause":true,"popup-margin-x":0.0,"popup-margin-y":0.0,"popup-gap":8.0,"popup-monitor":"primary","popup-close-behavior":"dismiss","popup-shadow":true,"popup-urgency-bar":"low","thresholds":[]}},"power":{"description":"Power menu module.","$ref":"#/$defs/PowerConfig","default":{"icon-name":"ld-power-symbolic","border-show":false,"border-color":"red","icon-color":"auto","icon-bg-color":"red","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","left-click":""}},"ram":{"description":"RAM usage module.","$ref":"#/$defs/RamConfig","default":{"poll-interval-ms":5000,"format":"{{ percent }}%","icon-name":"ld-memory-stick-symbolic","border-show":false,"border-color":"green","icon-show":true,"icon-color":"auto","icon-bg-color":"green","label-show":true,"label-color":"green","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]}},"storage":{"description":"Storage usage module.","$ref":"#/$defs/StorageConfig","default":{"poll-interval-ms":30000,"mount-point":"/","format":"{{ percent }}%","icon-name":"ld-hard-drive-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":"","thresholds":[]}},"separator":{"description":"Separator module.","$ref":"#/$defs/SeparatorConfig","default":{"size":1,"length":1.5,"color":"fg-subtle"}},"systray":{"description":"System tray module.","$ref":"#/$defs/SystrayConfig","default":{"icon-scale":1.0,"item-gap":0.25,"internal-padding":0.5,"blacklist":[],"overrides":[],"border-show":false,"border-color":"border-accent","button-bg-color":"bg-surface-elevated"}},"volume":{"description":"Volume control module.","$ref":"#/$defs/VolumeConfig","default":{"level-icons":["ld-volume-symbolic","ld-volume-1-symbolic","ld-volume-2-symbolic"],"icon-muted":"ld-volume-x-symbolic","border-show":false,"border-color":"red","icon-show":true,"icon-color":"auto","icon-bg-color":"red","label-show":true,"label-color":"red","format":"{{ percent }}%","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:audio","right-click":"","middle-click":"wayle audio output-mute","scroll-up":"","scroll-down":"","dropdown-app-icons":"mapped","thresholds":[]}},"weather":{"description":"Weather display module.","$ref":"#/$defs/WeatherConfig","default":{"provider":"open-meteo","location":"San Francisco","units":"metric","format":"{{ temp }}{{ temp_unit }}","time-format":"12h","refresh-interval-seconds":1800,"visual-crossing-key":null,"weatherapi-key":null,"icon-name":"ld-sun-symbolic","border-show":false,"border-color":"border-accent","icon-show":true,"icon-color":"auto","icon-bg-color":"accent","label-show":true,"label-color":"accent","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"dropdown:weather","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"window-title":{"description":"Window title module.","$ref":"#/$defs/WindowTitleConfig","default":{"format":"{{ title }}","icon-name":"ld-app-window-symbolic","icon-mappings":{},"border-show":false,"border-color":"blue","icon-show":true,"icon-color":"auto","icon-bg-color":"blue","label-show":true,"label-color":"blue","label-max-length":50,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"world-clock":{"description":"World clock module.","$ref":"#/$defs/WorldClockConfig","default":{"format":"{{ tz('UTC', '%H:%M %Z') }}","icon-name":"ld-globe-symbolic","border-show":false,"border-color":"yellow","icon-show":true,"icon-color":"auto","icon-bg-color":"yellow","label-show":true,"label-color":"yellow","label-max-length":0,"button-bg-color":"bg-surface-elevated","left-click":"","right-click":"","middle-click":"","scroll-up":"","scroll-down":""}},"custom":{"description":"Custom user-defined modules, each backed by a shell command. See\n[`CustomModuleDefinition`] for all fields (id, command, interval, click\nactions, icons, etc.). Reference them in a layout with `custom-`.\n\n## Example\n\n```toml\n[[modules.custom]]\nid = \"gpu-temp\"\ncommand = \"nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader\"\ninterval-ms = 5000\nicon-name = \"ld-thermometer-symbolic\"\n\n[[modules.custom]]\nid = \"weather\"\ncommand = \"curl -s wttr.in/?format=%t\"\ninterval-ms = 600000\n```","$ref":"#/$defs/Array_of_CustomModuleDefinition","default":[]}}},"BatteryConfig":{"description":"Battery level, charging state, and a dropdown with power-profile controls.","type":"object","properties":{"level-icons":{"description":"Icons for battery levels from empty to full.\n\nThe percentage is divided evenly among icons. With 5 icons:\n0-20% uses icons\\[0\\], 21-40% uses icons\\[1\\], etc.","$ref":"#/$defs/Array_of_string","default":["md-battery_android_0-symbolic","md-battery_android_frame_1-symbolic","md-battery_android_frame_2-symbolic","md-battery_android_frame_3-symbolic","md-battery_android_frame_4-symbolic","md-battery_android_frame_5-symbolic","md-battery_android_frame_6-symbolic","md-battery_android_frame_full-symbolic"]},"charging-icon":{"description":"Icon shown when battery is charging.","$ref":"#/$defs/string","default":"md-battery_android_frame_bolt-symbolic"},"alert-icon":{"description":"Icon shown when battery is not present or in an error state.","$ref":"#/$defs/string","default":"md-battery_android_alert-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-show":{"description":"Display percentage label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ percent }}` - Battery level (0-100)\n\n## Examples\n\n- `\"{{ percent }}%\"` - \"45%\"","$ref":"#/$defs/string","default":"{{ percent }}%"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:battery"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"thresholds":{"description":"Dynamic color thresholds based on battery percentage.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `below` for low-value warnings (e.g., low battery).\n\n## Example\n\n```toml\n[[modules.battery.thresholds]]\nbelow = 40\nicon-color = \"status-warning\"\n\n[[modules.battery.thresholds]]\nbelow = 20\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"Array_of_string":{"type":"array","items":{"type":"string"}},"uint32":{"type":"integer","format":"uint32","minimum":0},"ClickAction":{"type":"string"},"Array_of_ThresholdEntry":{"type":"array","items":{"$ref":"#/$defs/ThresholdEntry"}},"ThresholdEntry":{"description":"A threshold entry that maps a numeric value range to color overrides.\n\nAt least one of `above` or `below` must be set. When both are set,\nboth conditions must be satisfied (AND logic).\n\n## TOML Example\n\n```toml\n[[modules.cpu.thresholds]]\nabove = 70\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.cpu.thresholds]]\nabove = 90\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","type":"object","properties":{"above":{"description":"Activate when metric value >= this threshold.","type":["number","null"],"format":"double","default":null},"below":{"description":"Activate when metric value <= this threshold.","type":["number","null"],"format":"double","default":null},"icon-color":{"description":"Override icon color when threshold is active.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}],"default":null},"label-color":{"description":"Override label color when threshold is active.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}],"default":null},"icon-bg-color":{"description":"Override icon background color when threshold is active.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}],"default":null},"button-bg-color":{"description":"Override button background color when threshold is active.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}],"default":null},"border-color":{"description":"Override border color when threshold is active.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}],"default":null}}},"BluetoothConfig":{"description":"Bluetooth connection status with a dropdown for pairing and managing devices.","type":"object","properties":{"disabled-icon":{"description":"Icon when Bluetooth is disabled or unavailable.","$ref":"#/$defs/string","default":"ld-bluetooth-off-symbolic"},"disconnected-icon":{"description":"Icon when Bluetooth is on but no devices connected.","$ref":"#/$defs/string","default":"ld-bluetooth-symbolic"},"connected-icon":{"description":"Icon when devices are connected.","$ref":"#/$defs/string","default":"ld-bluetooth-connected-symbolic"},"searching-icon":{"description":"Icon when scanning for devices.","$ref":"#/$defs/string","default":"ld-bluetooth-searching-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"blue"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-show":{"description":"Display connection label (device name or count).","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":15},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:bluetooth"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"CavaConfig":{"description":"Audio frequency bars visualising the output stream.","type":"object","properties":{"bars":{"description":"Number of frequency bars.","$ref":"#/$defs/BarCount","default":20},"framerate":{"description":"Visualization update rate in frames per second.","$ref":"#/$defs/Framerate","default":60},"stereo":{"description":"Stereo channel visualization (splits bars between left and right).","$ref":"#/$defs/boolean","default":false},"noise-reduction":{"description":"Noise reduction filter strength.","$ref":"#/$defs/NormalizedF64","default":0.65},"monstercat":{"description":"Monstercat-style smoothing across adjacent bars (0.0 = off).","$ref":"#/$defs/double","default":0.0},"waves":{"description":"Wave-style smoothing (0 = off).","$ref":"#/$defs/uint32","default":0},"low-cutoff":{"description":"Low frequency cutoff in Hz.","$ref":"#/$defs/FrequencyHz","default":50},"high-cutoff":{"description":"High frequency cutoff in Hz.","$ref":"#/$defs/FrequencyHz","default":17000},"input":{"description":"Audio capture backend.","$ref":"#/$defs/CavaInput","default":"pipe-wire"},"source":{"description":"Audio source identifier (\"auto\" for automatic selection).","$ref":"#/$defs/string","default":"auto"},"style":{"description":"Visualization rendering style.","$ref":"#/$defs/CavaStyle","default":"bars"},"direction":{"description":"Bar growth direction.","$ref":"#/$defs/CavaDirection","default":"normal"},"color":{"description":"Bar color.","$ref":"#/$defs/ColorValue","default":"accent"},"button-bg-color":{"description":"Module background color.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"bar-width":{"description":"Width of each frequency bar in pixels.","$ref":"#/$defs/uint32","default":6},"bar-gap":{"description":"Gap between frequency bars in pixels.","$ref":"#/$defs/uint32","default":1},"internal-padding":{"description":"Padding at the ends of the visualizer.","$ref":"#/$defs/Spacing","default":0.5},"border-show":{"description":"Display border around the visualizer.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color.","$ref":"#/$defs/ColorValue","default":"border-accent"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"BarCount":{"description":"Frequency bar count clamped to 1-256 (mirrors `wayle_cava::BarCount`).","type":"integer","format":"uint16","minimum":1,"maximum":256},"Framerate":{"description":"Visualization framerate clamped to 1-360 fps (mirrors `wayle_cava::Framerate`).","type":"integer","format":"uint32","minimum":1,"maximum":360},"double":{"type":"number","format":"double"},"FrequencyHz":{"description":"Frequency value in Hz, minimum 1 Hz.\n\nCross-field constraints (high_cutoff > low_cutoff, samplerate/2 > high_cutoff)\nare validated at the service builder.","type":"integer","format":"uint32","minimum":1},"CavaInput":{"description":"Audio capture backend.","oneOf":[{"description":"PipeWire multimedia server.","type":"string","const":"pipe-wire"},{"description":"PulseAudio sound server.","type":"string","const":"pulse"},{"description":"Advanced Linux Sound Architecture.","type":"string","const":"alsa"},{"description":"JACK Audio Connection Kit.","type":"string","const":"jack"},{"description":"Named pipe (FIFO) input.","type":"string","const":"fifo"},{"description":"PortAudio cross-platform library.","type":"string","const":"port-audio"},{"description":"sndio audio subsystem (BSD).","type":"string","const":"sndio"},{"description":"Open Sound System (legacy).","type":"string","const":"oss"},{"description":"Shared memory input.","type":"string","const":"shmem"},{"description":"Windows audio capture (WASAPI).","type":"string","const":"winscap"}]},"CavaStyle":{"description":"Visualization rendering style.","oneOf":[{"description":"Rectangular frequency bars.","type":"string","const":"bars"},{"description":"Smooth curve connecting bar peaks.","type":"string","const":"wave"},{"description":"Bars with floating peak indicators that decay over time.","type":"string","const":"peaks"}]},"CavaDirection":{"description":"Bar growth direction relative to the bar's attached screen edge.","oneOf":[{"description":"Bars grow away from the attached edge.","type":"string","const":"normal"},{"description":"Bars grow toward the attached edge.","type":"string","const":"reverse"},{"description":"Bars grow symmetrically from center.","type":"string","const":"mirror"}]},"ClockConfig":{"description":"Time display with a calendar dropdown.","type":"object","properties":{"format":{"description":"Format string using strftime syntax.\n\n## Common Specifiers\n\n- `%H` - Hour (00-23)\n- `%I` - Hour (01-12)\n- `%M` - Minute (00-59)\n- `%S` - Second (00-59)\n- `%p` - AM/PM\n- `%a` - Abbreviated weekday (Mon, Tue)\n- `%A` - Full weekday (Monday)\n- `%b` - Abbreviated month (Jan, Feb)\n- `%B` - Full month (January)\n- `%d` - Day of month (01-31)\n- `%Y` - Year (2024)\n\n## Examples\n\n- `\"%H:%M\"` - \"14:30\"\n- `\"%I:%M %p\"` - \"02:30 PM\"\n- `\"%a %b %d %I:%M %p\"` - \"Mon Jan 15 02:30 PM\"","$ref":"#/$defs/string","default":"%a %b %d %I:%M %p"},"icon-name":{"description":"Symbolic icon name.","$ref":"#/$defs/string","default":"tb-calendar-time-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"border-accent"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"accent"},"label-show":{"description":"Display text label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"accent"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:calendar"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":"dropdown:weather"},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"dropdown-show-seconds":{"description":"Show seconds in the calendar dropdown clock display.","$ref":"#/$defs/boolean","default":false}}},"CpuConfig":{"description":"CPU usage, frequency, and temperature.","type":"object","properties":{"poll-interval-ms":{"description":"Polling interval in milliseconds.\n\nFaster polling increases CPU usage.","$ref":"#/$defs/uint64","default":2000},"temp-sensor":{"description":"Temperature sensor label.\n\nUse `\"auto\"` for automatic detection, or specify a\nlabel (e.g., `\"Tctl\"`, `\"Package id 0\"`).\n\nRun `sensors` to see available labels.","$ref":"#/$defs/string","default":"auto"},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ percent }}` - CPU usage (0-100)\n- `{{ freq_ghz }}` - Frequency of the busiest core (highest usage)\n- `{{ avg_freq_ghz }}` - Average frequency across cores\n- `{{ max_freq_ghz }}` - Maximum frequency among cores\n- `{{ temp_c }}` - Temperature in Celsius (if available)\n- `{{ temp_f }}` - Temperature in Fahrenheit (if available)\n\n## Examples\n\n- `\"{{ percent }}%\"` - \"45%\"\n- `\"{{ percent }}% @ {{ freq_ghz }}GHz\"` - \"45% @ 3.2GHz\"\n- `\"{{ percent }}% {{ temp_c }}C\"` - \"45% 62C\"","$ref":"#/$defs/string","default":"{{ percent }}%"},"icon-name":{"description":"Icon name.","$ref":"#/$defs/string","default":"ld-cpu-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"blue"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-show":{"description":"Display label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-max-length":{"description":"Max label characters before truncation. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"thresholds":{"description":"Dynamic color thresholds based on CPU usage percentage.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `above` for high-value warnings (e.g., high CPU usage).\n\n## Example\n\n```toml\n[[modules.cpu.thresholds]]\nabove = 70\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.cpu.thresholds]]\nabove = 90\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"uint64":{"type":"integer","format":"uint64","minimum":0},"DashboardConfig":{"description":"Quick-access button with a distro icon; opens the dashboard dropdown.","type":"object","properties":{"icon-override":{"description":"Override the auto-detected distro icon.","$ref":"#/$defs/string","default":""},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:dashboard"},"dropdown-lock-command":{"description":"Shell command for the lock button in the dashboard dropdown.","$ref":"#/$defs/string","default":"loginctl lock-session"},"dropdown-logout-command":{"description":"Shell command for the logout button in the dashboard dropdown.","$ref":"#/$defs/string","default":"loginctl terminate-session $XDG_SESSION_ID"},"dropdown-reboot-command":{"description":"Shell command for the reboot button in the dashboard dropdown.","$ref":"#/$defs/string","default":"systemctl reboot"},"dropdown-poweroff-command":{"description":"Shell command for the power-off button in the dashboard dropdown.","$ref":"#/$defs/string","default":"systemctl poweroff"}}},"HyprlandWorkspacesConfig":{"description":"Hyprland workspace indicators with click-to-switch.","type":"object","properties":{"min-workspace-count":{"description":"Minimum number of workspace buttons to display.\n\nWhen set to 0 (default), only active and occupied workspaces are shown.\nWhen set to N, at least N buttons are always visible, with empty ones\nusing `empty-color` styling.","$ref":"#/$defs/uint8","default":0},"monitor-specific":{"description":"Show only workspaces belonging to the bar's monitor.\n\nWhen true, each bar shows only its monitor's workspaces.\nWhen false, all workspaces from all monitors are shown.","$ref":"#/$defs/boolean","default":true},"show-special":{"description":"Include special workspaces (scratchpads) in the display.\n\nSpecial workspaces have negative IDs in Hyprland.","$ref":"#/$defs/boolean","default":true},"urgent-show":{"description":"Pulse animation on workspaces with urgent windows.\n\nWhen a window requests attention (e.g., terminal bell), the workspace\nbutton pulses until you switch to it.","$ref":"#/$defs/boolean","default":true},"urgent-mode":{"description":"Where the urgent pulse is applied.\n\n- `workspace`: Entire workspace pulses (default)\n- `application`: Only the app icon(s) belonging to the urgent window\n pulse, falling back to `workspace` when app icons are disabled","$ref":"#/$defs/UrgentMode","default":"workspace"},"display-mode":{"description":"What identifies each workspace button.\n\n- `label`: Shows workspace number (or name if `label-use-name` is true)\n- `icon`: Shows icon from `workspace-map` (falls back to label if unmapped)\n- `none`: Shows nothing - only app icons visible","$ref":"#/$defs/DisplayMode","default":"label"},"label-use-name":{"description":"Use workspace name instead of number when displaying labels.\n\nOnly applies when `display-mode = \"label\"` or as fallback for unmapped\nworkspaces in `display-mode = \"icon\"`.","$ref":"#/$defs/boolean","default":false},"numbering":{"description":"How workspace numbers are displayed.\n\n- `absolute`: Show actual Hyprland workspace IDs (1, 2, 3, 4, 5, 6...)\n- `relative`: Show numbers relative to monitor's starting workspace.\n If a monitor has workspaces 4, 5, 6 assigned, they display as 1, 2, 3.\n Useful when keybinds use per-monitor numbering.","$ref":"#/$defs/Numbering","default":"absolute"},"divider":{"description":"Text separator between workspace identity and app icons.\n\nOnly shown when both `display-mode` is not `none` and `app-icons-show`\nis enabled. Common values: `\"|\"`, `\"·\"`, `\"-\"`.","$ref":"#/$defs/string","default":" "},"app-icons-show":{"description":"Show application icons for windows in each workspace.\n\nWhen enabled, displays icons for running applications.\nIcons are resolved via `app-icon-map` configuration.","$ref":"#/$defs/boolean","default":false},"app-icons-dedupe":{"description":"Deduplicate application icons within a workspace.\n\nWhen true, shows only one icon per unique window class.\nWhen false, shows an icon for every window.","$ref":"#/$defs/boolean","default":true},"app-icons-fallback":{"description":"Fallback icon for applications not matched by `app-icon-map`.","$ref":"#/$defs/string","default":"ld-app-window-symbolic"},"app-icons-empty":{"description":"Icon shown for empty workspaces when `app-icons-show` is enabled.\n\nWhen a workspace has no windows but is displayed (via `min-workspace-count`),\nthis icon appears as a placeholder.","$ref":"#/$defs/string","default":"tb-minus-symbolic"},"icon-gap":{"description":"Gap between app icons within a workspace button.\n\nOnly applies to spacing between app icons.","$ref":"#/$defs/Spacing","default":0.30000001192092896},"workspace-padding":{"description":"Padding for workspace content along the bar direction.\n\nFor horizontal bars, controls horizontal (left/right) padding.\nFor vertical bars, controls vertical (top/bottom) padding.","$ref":"#/$defs/Spacing","default":0.5},"icon-size":{"description":"Scale multiplier for workspace icons.\n\nApplies to workspace identity icons and custom icons from `workspace-map`.\nRange: 0.25-3.0.","$ref":"#/$defs/ScaleFactor","default":1.0},"label-size":{"description":"Scale multiplier for workspace labels and dividers.\n\nApplies to workspace number/name labels and the divider text.\nRange: 0.25-3.0.","$ref":"#/$defs/ScaleFactor","default":1.0},"workspace-ignore":{"description":"Workspaces to hide from the display.\n\nGlob patterns matching workspace IDs. Examples:\n- `\"10\"` - hide workspace 10\n- `\"1?\"` - hide workspaces 10-19","$ref":"#/$defs/Array_of_string","default":[]},"active-indicator":{"description":"Visual indicator for the active workspace.","$ref":"#/$defs/ActiveIndicator","default":"background"},"active-color":{"description":"Color for the active (focused) workspace.\n\nApplied to icons and labels. In `background` indicator mode,\nalso used as the button background.","$ref":"#/$defs/ColorValue","default":"accent"},"occupied-color":{"description":"Color for occupied workspaces (has windows but not focused).\n\nApplied to icons and labels.","$ref":"#/$defs/ColorValue","default":"fg-muted"},"empty-color":{"description":"Color for empty workspaces.\n\nApplied to the empty placeholder icon and labels.","$ref":"#/$defs/ColorValue","default":"fg-subtle"},"container-bg-color":{"description":"Background color for the workspaces container.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"border-show":{"description":"Display border around the workspaces container.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color for the workspaces container.","$ref":"#/$defs/ColorValue","default":"border-default"},"workspace-map":{"description":"Per-workspace icon and color overrides.\n\nKeys are workspace IDs (use negative for special workspaces).\n\n## Example\n\n```toml\n[modules.hyprland-workspaces.workspace-map]\n1 = { icon = \"ld-globe-symbolic\", color = \"#4a90d9\" }\n2 = { icon = \"ld-terminal-symbolic\" }\n```","$ref":"#/$defs/WorkspaceMap","default":{}},"app-icon-map":{"description":"Application icon mapping with glob pattern support.\n\nMaps window class or title to symbolic icon names. Supports:\n- No prefix: Matches window class (e.g., `\"*firefox*\"`)\n- `class:` prefix: Explicit class match (e.g., `\"class:org.mozilla.*\"`)\n- `title:` prefix: Matches window title (e.g., `\"title:*YouTube*\"`)\n\nUser mappings are merged with built-in defaults for common applications.\n\n## Example\n\n```toml\n[modules.hyprland-workspaces.app-icon-map]\n\"*firefox*\" = \"ld-globe-symbolic\"\n\"title:*YouTube*\" = \"ld-youtube-symbolic\"\n```","$ref":"#/$defs/Map_of_string","default":{}}}},"UrgentMode":{"description":"Where the urgent pulse animation is applied.","oneOf":[{"description":"Pulse the entire workspace.","type":"string","const":"workspace"},{"description":"Pulse only the app icon(s) belonging to the urgent window.\n\nFalls back to `workspace` when app icons are disabled.","type":"string","const":"application"}]},"DisplayMode":{"description":"What identifies a workspace in the UI.","oneOf":[{"description":"Show workspace number or name.","type":"string","const":"label"},{"description":"Show icon from `workspace-map` (falls back to label if unmapped).","type":"string","const":"icon"},{"description":"Show nothing - only app icons visible.","type":"string","const":"none"}]},"Numbering":{"description":"How workspace numbers are displayed.","oneOf":[{"description":"Show actual Hyprland workspace IDs (1, 2, 3, 4, 5, 6...).","type":"string","const":"absolute"},{"description":"Show numbers relative to monitor's starting workspace.\n\nIf monitor has workspaces 4, 5, 6 assigned, they display as 1, 2, 3.\nUseful when keybinds use per-monitor numbering (Shift+1 for ws 4, etc.).","type":"string","const":"relative"}]},"ActiveIndicator":{"description":"Visual indicator style for the active workspace.","oneOf":[{"description":"Entire button gets a colored background.","type":"string","const":"background"},{"description":"Small colored bar under the workspace button.","type":"string","const":"underline"}]},"WorkspaceMap":{"description":"Per-workspace icon and color overrides, keyed by workspace ID.\n\nTOML table keys are always strings, so `\"1\"` parses into the workspace\nwith ID `1`. Negative IDs refer to Hyprland's special workspaces. Keys\nthat don't appear in the map fall back to the default behaviour set by\n[`HyprlandWorkspacesConfig::display_mode`].\n\n## Examples\n\n```toml\n[modules.hyprland-workspaces.workspace-map]\n# Whole entry on one line with an inline table\n1 = { icon = \"ld-globe-symbolic\", color = \"#4a90d9\" }\n2 = { icon = \"ld-terminal-symbolic\" }\n3 = { icon = \"ld-code-symbolic\", color = \"accent\" }\n\n# Or spread the entry across its own subtable\n[modules.hyprland-workspaces.workspace-map.4]\nicon = \"ld-message-square-symbolic\"\ncolor = \"status-success\"\n\n# Negative IDs target Hyprland special workspaces\n[modules.hyprland-workspaces.workspace-map.-99]\nicon = \"ld-scratch-symbolic\"\n```","type":"object","additionalProperties":false,"patternProperties":{"^-?\\d+$":{"$ref":"#/$defs/WorkspaceStyle"}}},"WorkspaceStyle":{"description":"Per-workspace styling override.","type":"object","properties":{"icon":{"description":"Custom icon for this workspace.","type":["string","null"]},"color":{"description":"Custom background color for this workspace when active.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}]}}},"Map_of_string":{"type":"object","additionalProperties":{"type":"string"}},"HyprsunsetConfig":{"description":"Toggle for Hyprland's blue-light filter.","type":"object","properties":{"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ status }}` - Filter status text (On, Off)\n- `{{ temp }}` - Current temperature in Kelvin (shows \"--\" when disabled)\n- `{{ gamma }}` - Current gamma percentage (shows \"--\" when disabled)\n- `{{ config_temp }}` - Configured temperature (always available)\n- `{{ config_gamma }}` - Configured gamma (always available)\n\n## Examples\n\n- `\"{{ status }}\"` - \"On\"\n- `\"{{ temp }}K {{ gamma }}%\"` - \"4500K 80%\"\n- `\"{{ status }} ({{ temp }}K)\"` - \"On (4500K)\"","$ref":"#/$defs/string","default":"{{ status }}"},"temperature":{"description":"Color temperature in Kelvin when filter is enabled. Range: 1000-20000.","$ref":"#/$defs/uint32","default":5000},"gamma":{"description":"Display gamma percentage when filter is enabled. Range: 0-200.","$ref":"#/$defs/uint32","default":100},"icon-off":{"description":"Icon when filter is disabled (showing normal daylight colors).","$ref":"#/$defs/string","default":"ld-sun-symbolic"},"icon-on":{"description":"Icon when filter is enabled (showing warm night colors).","$ref":"#/$defs/string","default":"ld-moon-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-show":{"description":"Display label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click. Default toggles blue light filter.","$ref":"#/$defs/ClickAction","default":":toggle"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"IdleInhibitConfig":{"description":"Toggle that prevents screen dim, lock, and suspend while active.\n\nControllable from the CLI: `wayle idle on|off|duration|remaining|status`.","type":"object","properties":{"startup-duration":{"description":"Duration in minutes when service starts. 0 means indefinite.","$ref":"#/$defs/uint32","default":60},"icon-inactive":{"description":"Icon when idle inhibitor is inactive.","$ref":"#/$defs/string","default":"tb-coffee-off-symbolic"},"icon-active":{"description":"Icon when idle inhibitor is active.","$ref":"#/$defs/string","default":"tb-coffee-symbolic"},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ state }}` - Inhibitor state text (On, Off)\n- `{{ remaining }}` - Time remaining (e.g., \"45m\", shows \"--\" when indefinite)\n- `{{ duration }}` - Total duration (e.g., \"60m\", shows \"--\" when indefinite)\n\n## Examples\n\n- `\"{{ state }}\"` - \"On\"\n- `\"{{ remaining }}/{{ duration }}\"` - \"45m/60m\"\n- `\"{{ state }} ({{ remaining }})\"` - \"On (45m)\"","$ref":"#/$defs/string","default":"{{ state }}"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"green"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"green"},"label-show":{"description":"Display label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"green"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click. Default toggles indefinite idle inhibit.","$ref":"#/$defs/ClickAction","default":"wayle idle toggle --indefinite"},"right-click":{"description":"Action on right click. Default toggles timed idle inhibit.","$ref":"#/$defs/ClickAction","default":"wayle idle toggle"},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"KeybindModeConfig":{"description":"Current keybind-mode indicator for modal compositors.","type":"object","properties":{"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ mode }}` - Current keybind mode name (shows \"default\" when inactive)\n\n## Examples\n\n- `\"{{ mode }}\"` - \"resize\"\n- `\"Mode: {{ mode }}\"` - \"Mode: resize\"\n- `\"[{{ mode }}]\"` - \"[resize]\"","$ref":"#/$defs/string","default":"{{ mode }}"},"icon-name":{"description":"Symbolic icon name.","$ref":"#/$defs/string","default":"ld-layers-symbolic"},"auto-hide":{"description":"Automatically hide module when no mode is active.","$ref":"#/$defs/boolean","default":false},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"blue"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-show":{"description":"Display text label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"KeyboardInputConfig":{"description":"Active keyboard layout indicator.","type":"object","properties":{"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ layout }}` - Raw layout name from the compositor (e.g., \"English (US)\")\n- `{{ alias }}` - User-defined alias from `layout-alias-map`, falls back to `{{ layout }}`\n\n## Examples\n\n- `\"{{ layout }}\"` - \"English (US)\"\n- `\"{{ alias }}\"` - \"EN\" (with alias map configured)","$ref":"#/$defs/string","default":"{{ alias }}"},"icon-name":{"description":"Symbolic icon name.","$ref":"#/$defs/string","default":"ld-keyboard-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-show":{"description":"Display text label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"layout-alias-map":{"description":"Language name mapping.\n\n## Example\n\n```toml\n[modules.keyboard-input.layout-alias-map]\n\"English (US)\" = \"EN\"\n\"Czech (QWERTY)\" = \"Czech\"\n```","$ref":"#/$defs/Map_of_string","default":{}}}},"MediaConfig":{"description":"Now-playing title and playback controls for the active MPRIS player.","type":"object","properties":{"icon-type":{"description":"Icon display mode.","$ref":"#/$defs/MediaIconType","default":"application-mapped"},"player-icons":{"description":"Custom player-to-icon mappings for application-mapped mode.\n\nKeys are glob patterns matching MPRIS bus names, values are icon names\nfrom the installed icon set. These override built-in mappings when\nmatched.\n\n## Example\n\n```toml\n[modules.media.player-icons]\n\"*spotify*\" = \"si-spotify-symbolic\"\n\"*firefox*\" = \"ld-globe-symbolic\"\n\"*.mpv\" = \"ld-play-circle-symbolic\"\n```","$ref":"#/$defs/Map_of_string","default":{}},"players-ignored":{"description":"Player bus name patterns to exclude from discovery. Requires a restart\nto take effect.\n\n## Example\n\n```toml\n[modules.media]\nplayers-ignored = [\"*chromium*\", \"*discord*\"]\n```","$ref":"#/$defs/Array_of_string","default":[]},"player-priority":{"description":"Preferred player priority order as glob patterns matching bus names.\n\nWhen no player is manually selected, this determines which player\nbecomes active. Patterns are checked in order; first match wins.\nIf no pattern matches, the first playing player is selected.\n\n## Example\n\n```toml\n[modules.media]\nplayer-priority = [\"*spotify*\", \"*firefox*\"]\n```","$ref":"#/$defs/Array_of_string","default":[]},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ title }}` - Track title\n- `{{ artist }}` - Artist name(s)\n- `{{ album }}` - Album name\n- `{{ status }}` - Playback status text (Playing, Paused, Stopped)\n- `{{ status_icon }}` - Playback status icon character\n\n## Examples\n\n- `\"{{ title }} - {{ artist }}\"` - \"Bohemian Rhapsody - Queen\"\n- `\"{{ status_icon }} {{ title }}\"` - \"▶ Bohemian Rhapsody\"\n- `\"{{ artist }}: {{ title }} ({{ album }})\"` - \"Queen: Bohemian Rhapsody (A Night at the Opera)\"","$ref":"#/$defs/string","default":"{{ title }} - {{ artist }}"},"icon-name":{"description":"Symbolic icon name for default mode.","$ref":"#/$defs/string","default":"ld-music-symbolic"},"spinning-disc-icon":{"description":"Icon shown for spinning-disc mode.","$ref":"#/$defs/string","default":"ld-disc-3-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"blue"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-show":{"description":"Display text label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":35},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:media"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"MediaIconType":{"description":"Icon display mode for the media module.","oneOf":[{"description":"Static icon from icon-name field.","type":"string","const":"default"},{"description":"Dynamic icon from media player's desktop entry, falling back to icon-name.","type":"string","const":"application"},{"description":"Spinning disc icon that animates during playback. Uses slightly more CPU.","type":"string","const":"spinning-disc"},{"description":"Maps player to icon via glob patterns, with built-in mappings for common players.","type":"string","const":"application-mapped"}]},"MicrophoneConfig":{"description":"Microphone input level and mute toggle.","type":"object","properties":{"icon-active":{"description":"Icon shown when microphone is active (unmuted).","$ref":"#/$defs/string","default":"ld-mic-symbolic"},"icon-muted":{"description":"Icon shown when microphone is muted.","$ref":"#/$defs/string","default":"ld-mic-off-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"red"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"red"},"label-show":{"description":"Display percentage label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"red"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:audio"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click. Default toggles input mute.","$ref":"#/$defs/ClickAction","default":"wayle audio input-mute"},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"thresholds":{"description":"Dynamic color thresholds based on microphone volume percentage.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `above` for high-value warnings (e.g., high input gain).\n\n## Example\n\n```toml\n[[modules.microphone.thresholds]]\nabove = 70\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.microphone.thresholds]]\nabove = 90\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"NetworkConfig":{"description":"Network connection status with a dropdown for switching connections.","type":"object","properties":{"wifi-disabled-icon":{"description":"WiFi icon when disabled.","$ref":"#/$defs/string","default":"cm-wireless-disabled-symbolic"},"wifi-acquiring-icon":{"description":"WiFi icon when connecting.","$ref":"#/$defs/string","default":"cm-wireless-acquiring-symbolic"},"wifi-offline-icon":{"description":"WiFi icon when disconnected.","$ref":"#/$defs/string","default":"cm-wireless-offline-symbolic"},"wifi-connected-icon":{"description":"WiFi icon when connected but signal strength unavailable.","$ref":"#/$defs/string","default":"cm-wireless-connected-symbolic"},"wifi-signal-icons":{"description":"WiFi signal strength icons from weak to excellent.\n\nThe signal percentage maps to icons: 0-25% uses icons\\[0\\], 26-50% uses\nicons\\[1\\], etc.","$ref":"#/$defs/Array_of_string","default":["cm-wireless-signal-weak-symbolic","cm-wireless-signal-ok-symbolic","cm-wireless-signal-good-symbolic","cm-wireless-signal-excellent-symbolic"]},"wired-connected-icon":{"description":"Wired icon when connected.","$ref":"#/$defs/string","default":"cm-wired-symbolic"},"wired-acquiring-icon":{"description":"Wired icon when connecting.","$ref":"#/$defs/string","default":"cm-wired-acquiring-symbolic"},"wired-disconnected-icon":{"description":"Wired icon when disconnected.","$ref":"#/$defs/string","default":"cm-wired-disconnected-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"accent"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"accent"},"label-show":{"description":"Display connection label (SSID for WiFi, \"Wired\" for ethernet).","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"accent"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":15},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:network"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"NetstatConfig":{"description":"Network traffic counters (up/down rates).","type":"object","properties":{"poll-interval-ms":{"description":"Polling interval in milliseconds.\n\nFaster polling increases CPU usage.","$ref":"#/$defs/uint64","default":2000},"interface":{"description":"Network interface to monitor.\n\nUse `\"auto\"` to select the first active interface, or specify an\ninterface name like `\"eth0\"` or `\"wlan0\"`.","$ref":"#/$defs/string","default":"auto"},"format":{"description":"Format string for the label.\n\n## Download Placeholders\n\n- `{{ down_kib }}` - Download speed in KiB/s\n- `{{ down_mib }}` - Download speed in MiB/s\n- `{{ down_gib }}` - Download speed in GiB/s\n- `{{ down_auto }}` - Download speed with auto unit (e.g., \"1.5 MiB/s\")\n\n## Upload Placeholders\n\n- `{{ up_kib }}` - Upload speed in KiB/s\n- `{{ up_mib }}` - Upload speed in MiB/s\n- `{{ up_gib }}` - Upload speed in GiB/s\n- `{{ up_auto }}` - Upload speed with auto unit (e.g., \"256 KiB/s\")\n\n## Other Placeholders\n\n- `{{ interface }}` - Interface name (e.g., \"wlan0\")\n\n## Examples\n\n- `\"{{ down_auto }} {{ up_auto }}\"` - \"1.5 MiB/s 256 KiB/s\"\n- `\"D:{{ down_mib }} U:{{ up_mib }}\"` - \"D:1.5 U:0.2\"\n- `\"{{ interface }}: {{ down_auto }}\"` - \"wlan0: 1.5 MiB/s\"","$ref":"#/$defs/string","default":"{{ down_auto }} {{ up_auto }}"},"icon-name":{"description":"Icon name.","$ref":"#/$defs/string","default":"ld-activity-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"red"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"red"},"label-show":{"description":"Display label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"red"},"label-max-length":{"description":"Max label characters before truncation. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"NotificationConfig":{"description":"Notification center: icon in the bar, dropdown with history, DND toggle.","type":"object","properties":{"icon-name":{"description":"Icon shown when no notifications and DND is off.","$ref":"#/$defs/string","default":"ld-bell-symbolic"},"icon-unread":{"description":"Icon shown when notifications exist.","$ref":"#/$defs/string","default":"ld-bell-dot-symbolic"},"icon-dnd":{"description":"Icon shown when Do Not Disturb is active.","$ref":"#/$defs/string","default":"ld-bell-off-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"green"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"green"},"label-show":{"description":"Display notification count label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"green"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:notification"},"right-click":{"description":"Action on right click. Default toggles Do Not Disturb.","$ref":"#/$defs/ClickAction","default":"wayle notify dnd"},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"blocklist":{"description":"Glob patterns for app names whose notifications are blocked entirely.\n\nMatched notifications are silently dropped.\nSupports `*` (any characters) and `?` (single character).\n\nExamples: `[\"notify-send\", \"*chromium*\", \"Vivaldi*\"]`","$ref":"#/$defs/Array_of_string","default":[]},"icon-source":{"description":"How notification icons are resolved.\n\n| Mode | Per-notification image | No image provided |\n|------|----------------------|-------------------|\n| `automatic` | Shows the image | Mapped icon |\n| `mapped` | Ignored | Mapped icon |\n| `application` | Shows the image | App's generic icon, then mapped fallback |","$ref":"#/$defs/IconSource","default":"automatic"},"popup-position":{"description":"Screen position for popup notifications.","$ref":"#/$defs/PopupPosition","default":"top-right"},"popup-max-visible":{"description":"Maximum number of popups visible at once.","$ref":"#/$defs/uint32","default":5},"popup-stacking-order":{"description":"Order in which popups stack on screen.","$ref":"#/$defs/StackingOrder","default":"newest-first"},"popup-duration":{"description":"Maximum popup display duration in milliseconds.\n\nApplications may request a shorter timeout, which takes precedence.","$ref":"#/$defs/uint32","default":5000},"popup-hover-pause":{"description":"Pause popup auto-dismiss timer on hover.","$ref":"#/$defs/boolean","default":true},"popup-margin-x":{"description":"Horizontal margin from screen edges.","$ref":"#/$defs/Spacing","default":0.0},"popup-margin-y":{"description":"Vertical margin from screen edges.","$ref":"#/$defs/Spacing","default":0.0},"popup-gap":{"description":"Gap between stacked popups.","$ref":"#/$defs/Spacing","default":8.0},"popup-monitor":{"description":"Target monitor: \"primary\" or a connector name like \"DP-1\".","$ref":"#/$defs/PopupMonitor","default":"primary"},"popup-close-behavior":{"description":"What happens when the close button on a popup is clicked.","$ref":"#/$defs/PopupCloseBehavior","default":"dismiss"},"popup-shadow":{"description":"Display drop shadow on popup cards.","$ref":"#/$defs/boolean","default":true},"popup-urgency-bar":{"description":"Minimum urgency level that displays a colored urgency bar.","$ref":"#/$defs/UrgencyBarThreshold","default":"low"},"thresholds":{"description":"Dynamic color thresholds based on notification count.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `above` for high-value warnings (e.g., many unread\nnotifications).\n\n## Example\n\n```toml\n[[modules.notification.thresholds]]\nabove = 5\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.notification.thresholds]]\nabove = 20\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"IconSource":{"description":"Source for resolving notification icons.","oneOf":[{"description":"Use per-notification images when provided, otherwise Wayle's mapped icon.","type":"string","const":"automatic"},{"description":"Always use Wayle's mapped icons regardless of what the app provides.","type":"string","const":"mapped"},{"description":"Use the full application icon chain, falling back to mapped if unavailable.","type":"string","const":"application"}]},"PopupPosition":{"description":"Screen position for notification popups.","oneOf":[{"description":"Top-left corner.","type":"string","const":"top-left"},{"description":"Top-center edge.","type":"string","const":"top-center"},{"description":"Top-right corner.","type":"string","const":"top-right"},{"description":"Bottom-left corner.","type":"string","const":"bottom-left"},{"description":"Bottom-center edge.","type":"string","const":"bottom-center"},{"description":"Bottom-right corner.","type":"string","const":"bottom-right"},{"description":"Center-left edge.","type":"string","const":"center-left"},{"description":"Center-right edge.","type":"string","const":"center-right"}]},"StackingOrder":{"description":"Order in which popups are stacked on screen.","oneOf":[{"description":"Newest notifications appear closest to the configured position.","type":"string","const":"newest-first"},{"description":"Oldest notifications appear closest to the configured position.","type":"string","const":"oldest-first"}]},"PopupMonitor":{"description":"\"primary\" or a monitor connector name (e.g. \"DP-1\")","type":"string","default":"primary"},"PopupCloseBehavior":{"description":"Behavior when the close button is clicked on a popup card.","oneOf":[{"description":"Hide the popup; notification stays in history.","type":"string","const":"dismiss"},{"description":"Remove the notification entirely.","type":"string","const":"remove"}]},"UrgencyBarThreshold":{"description":"Minimum urgency level that shows a colored urgency bar on popup cards.\n\nAll urgency levels at or above the threshold display the bar.\nFor example, `Normal` shows bars on both normal and critical popups.","oneOf":[{"description":"Show urgency bars on all popups.","type":"string","const":"low"},{"description":"Show urgency bars on normal and critical popups.","type":"string","const":"normal"},{"description":"Show urgency bars on critical popups only.","type":"string","const":"critical"},{"description":"Never show urgency bars.","type":"string","const":"none"}]},"PowerConfig":{"description":"Shutdown, reboot, and logout menu.","type":"object","properties":{"icon-name":{"description":"Icon name to display.","$ref":"#/$defs/string","default":"ld-power-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"red"},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"red"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""}}},"RamConfig":{"description":"Memory and swap usage.","type":"object","properties":{"poll-interval-ms":{"description":"Polling interval in milliseconds.\n\nFaster polling increases CPU usage.","$ref":"#/$defs/uint64","default":5000},"format":{"description":"Format string for the label.\n\n## Memory Placeholders\n\n- `{{ percent }}` - Memory usage as integer (0-100)\n- `{{ used_gib }}` - Used memory in GiB (e.g., \"7.2\")\n- `{{ total_gib }}` - Total memory in GiB (e.g., \"16.0\")\n- `{{ available_gib }}` - Available memory in GiB (e.g., \"8.8\")\n\n## Swap Placeholders\n\n- `{{ swap_percent }}` - Swap usage as integer (0-100)\n- `{{ swap_used_gib }}` - Used swap in GiB\n- `{{ swap_total_gib }}` - Total swap in GiB\n\n## Examples\n\n- `\"{{ percent }}%\"` - \"45%\"\n- `\"{{ used_gib }}/{{ total_gib }} GiB\"` - \"7.2/16.0 GiB\"\n- `\"{{ percent }}% (Swap: {{ swap_percent }}%)\"` - \"45% (Swap: 12%)\"","$ref":"#/$defs/string","default":"{{ percent }}%"},"icon-name":{"description":"Icon name.","$ref":"#/$defs/string","default":"ld-memory-stick-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"green"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"green"},"label-show":{"description":"Display label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"green"},"label-max-length":{"description":"Max label characters before truncation. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"thresholds":{"description":"Dynamic color thresholds based on RAM usage percentage.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `above` for high-value warnings (e.g., high memory usage).\n\n## Example\n\n```toml\n[[modules.ram.thresholds]]\nabove = 80\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.ram.thresholds]]\nabove = 95\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"StorageConfig":{"description":"Disk usage for a mount point.","type":"object","properties":{"poll-interval-ms":{"description":"Polling interval in milliseconds.\n\nFaster polling increases CPU usage.","$ref":"#/$defs/uint64","default":30000},"mount-point":{"description":"Mount point to monitor (e.g., `\"/\"`, `\"/home\"`).","$ref":"#/$defs/string","default":"/"},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ percent }}` - Disk usage as integer (0-100)\n- `{{ used_tib }}` - Used space in TiB\n- `{{ used_gib }}` - Used space in GiB\n- `{{ used_mib }}` - Used space in MiB\n- `{{ used_auto }}` - Used space with auto unit (e.g., \"128.5 GiB\")\n- `{{ total_tib }}` - Total space in TiB\n- `{{ total_gib }}` - Total space in GiB\n- `{{ total_mib }}` - Total space in MiB\n- `{{ total_auto }}` - Total space with auto unit\n- `{{ free_tib }}` - Free space in TiB\n- `{{ free_gib }}` - Free space in GiB\n- `{{ free_mib }}` - Free space in MiB\n- `{{ free_auto }}` - Free space with auto unit\n- `{{ filesystem }}` - Filesystem type (e.g., \"ext4\", \"btrfs\")\n\n## Examples\n\n- `\"{{ percent }}%\"` - \"45%\"\n- `\"{{ used_auto }}/{{ total_auto }}\"` - \"128.5 GiB/512.0 GiB\"\n- `\"{{ free_gib }} GiB free\"` - \"383.5 GiB free\"","$ref":"#/$defs/string","default":"{{ percent }}%"},"icon-name":{"description":"Icon name.","$ref":"#/$defs/string","default":"ld-hard-drive-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-show":{"description":"Display label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-max-length":{"description":"Max label characters before truncation. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"thresholds":{"description":"Dynamic color thresholds based on disk usage percentage.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `above` for high-value warnings (e.g., disk nearly full).\n\n## Example\n\n```toml\n[[modules.storage.thresholds]]\nabove = 70\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.storage.thresholds]]\nabove = 90\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"SeparatorConfig":{"description":"A vertical rule between bar modules.","type":"object","properties":{"size":{"description":"Thickness of the separator line in pixels.","$ref":"#/$defs/uint32","default":1},"length":{"description":"Length of the separator line.","$ref":"#/$defs/Spacing","default":1.5},"color":{"description":"Color of the separator line.","$ref":"#/$defs/ColorValue","default":"fg-subtle"}}},"SystrayConfig":{"description":"System tray icons via the StatusNotifierItem protocol.","type":"object","properties":{"icon-scale":{"description":"Scale multiplier for tray item icons.","$ref":"#/$defs/ScaleFactor","default":1.0},"item-gap":{"description":"Gap between tray items.","$ref":"#/$defs/Spacing","default":0.25},"internal-padding":{"description":"Padding at the ends of the container.\n\nApplies to left/right edges for horizontal bars, or top/bottom edges\nfor vertical bars.","$ref":"#/$defs/Spacing","default":0.5},"blacklist":{"description":"Glob patterns for tray items to hide.\n\nMatches against item ID or title.\nExample: `[\"*discord*\", \"Steam\"]`","$ref":"#/$defs/Array_of_string","default":[]},"overrides":{"description":"Custom icon and color overrides.\n\nFirst matching override wins. Supports glob patterns.\n\n```toml\n[[module.systray.overrides]]\nname = \"*discord*\"\nicon = \"si-discord-symbolic\"\ncolor = \"blue\"\n```","$ref":"#/$defs/Array_of_TrayItemOverride","default":[]},"border-show":{"description":"Display border around container.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"border-accent"},"button-bg-color":{"description":"Container background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"}}},"Array_of_TrayItemOverride":{"type":"array","items":{"$ref":"#/$defs/TrayItemOverride"}},"TrayItemOverride":{"description":"Custom icon and color override for tray items matching a pattern.","type":"object","properties":{"name":{"description":"Glob pattern to match against item ID or title.\n\nExamples: `\"discord\"`, `\"*Discord*\"`, `\"org.kde.*\"`","type":"string"},"icon":{"description":"Custom icon name (symbolic icon).","type":["string","null"]},"color":{"description":"Custom icon color.","anyOf":[{"$ref":"#/$defs/ColorValue"},{"type":"null"}]}},"required":["name"]},"VolumeConfig":{"description":"Output volume control with a dropdown for device and app volumes.","type":"object","properties":{"level-icons":{"description":"Icons for volume levels from low to maximum.\n\nThe percentage is divided evenly among icons. With 3 icons:\n1-33% uses icons\\[0\\], 34-66% uses icons\\[1\\], 67-100% uses icons\\[2\\].","$ref":"#/$defs/Array_of_string","default":["ld-volume-symbolic","ld-volume-1-symbolic","ld-volume-2-symbolic"]},"icon-muted":{"description":"Icon shown when audio output is muted.","$ref":"#/$defs/string","default":"ld-volume-x-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"red"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"red"},"label-show":{"description":"Display percentage label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"red"},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ percent }}` - Volume (0-100)\n\n## Examples\n\n- `\"{{ percent }}%\"` - \"45%\"","$ref":"#/$defs/string","default":"{{ percent }}%"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click. Default opens the audio dropdown.","$ref":"#/$defs/ClickAction","default":"dropdown:audio"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click. Default toggles mute.","$ref":"#/$defs/ClickAction","default":"wayle audio output-mute"},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""},"dropdown-app-icons":{"description":"Icon source for app volume entries in the audio dropdown.","$ref":"#/$defs/AppIconSource","default":"mapped"},"thresholds":{"description":"Dynamic color thresholds based on volume percentage.\n\nEntries are checked in order; the last matching entry wins for each\ncolor slot. Use `above` for high-value warnings (e.g., boosted volume).\n\n## Example\n\n```toml\n[[modules.volume.thresholds]]\nabove = 100\nicon-color = \"status-warning\"\nlabel-color = \"status-warning\"\n\n[[modules.volume.thresholds]]\nabove = 130\nicon-color = \"status-error\"\nlabel-color = \"status-error\"\n```","$ref":"#/$defs/Array_of_ThresholdEntry","default":[]}}},"AppIconSource":{"description":"Icon source for app volume entries in the dropdown.","oneOf":[{"description":"Wayle's curated symbolic icons matched by app name.","type":"string","const":"mapped"},{"description":"Native application icons reported by PulseAudio.","type":"string","const":"native"}]},"WeatherConfig":{"description":"Current conditions with hourly and daily forecasts in a dropdown.","type":"object","properties":{"provider":{"description":"Weather data provider.","$ref":"#/$defs/WeatherProvider","default":"open-meteo"},"location":{"description":"Location for weather data (city name or \"lat,lon\" coordinates).","$ref":"#/$defs/string","default":"San Francisco"},"units":{"description":"Temperature unit.","$ref":"#/$defs/TemperatureUnit","default":"metric"},"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ temp }}` - Current temperature (e.g., \"72\")\n- `{{ temp_unit }}` - Temperature unit symbol (\"°F\" or \"°C\")\n- `{{ feels_like }}` - Feels-like temperature\n- `{{ condition }}` - Weather condition text (e.g., \"Cloudy\")\n- `{{ humidity }}` - Humidity percentage (e.g., \"65%\")\n- `{{ wind_speed }}` - Wind speed with unit (e.g., \"12 km/h\")\n- `{{ wind_dir }}` - Wind direction (e.g., \"NW\")\n- `{{ high }}` - Today's high temperature\n- `{{ low }}` - Today's low temperature\n\n## Examples\n\n- `\"{{ temp }}{{ temp_unit }}\"` - \"22°C\"\n- `\"{{ temp }}{{ temp_unit }} {{ condition }}\"` - \"22°C Partly Cloudy\"\n- `\"{{ temp }}{{ temp_unit }} H:{{ high }} L:{{ low }}\"` - \"22°C H:25 L:18\"","$ref":"#/$defs/string","default":"{{ temp }}{{ temp_unit }}"},"time-format":{"description":"Time display format for sunrise/sunset and hourly forecast.","$ref":"#/$defs/TimeFormat","default":"12h"},"refresh-interval-seconds":{"description":"Polling interval in seconds.","$ref":"#/$defs/uint32","default":1800},"visual-crossing-key":{"description":"Visual Crossing API key. Supports `$VAR_NAME` syntax to reference\nenvironment variables from `.*.env` files in the config directory.","$ref":"#/$defs/Nullable_string","default":null},"weatherapi-key":{"description":"WeatherAPI.com API key. Supports `$VAR_NAME` syntax to reference\nenvironment variables from `.*.env` files in the config directory.","$ref":"#/$defs/Nullable_string","default":null},"icon-name":{"description":"Fallback icon for weather.","$ref":"#/$defs/string","default":"ld-sun-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"border-accent"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"accent"},"label-show":{"description":"Display temperature label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"accent"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":"dropdown:weather"},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"WeatherProvider":{"description":"Weather data provider selection.","oneOf":[{"description":"Open-Meteo (no API key required).","type":"string","const":"open-meteo"},{"description":"Visual Crossing (requires API key).","type":"string","const":"visual-crossing"},{"description":"WeatherAPI.com (requires API key).","type":"string","const":"weather-api"}]},"TemperatureUnit":{"description":"Temperature unit for display.","oneOf":[{"description":"Celsius (metric).","type":"string","const":"metric"},{"description":"Fahrenheit (imperial).","type":"string","const":"imperial"}]},"TimeFormat":{"description":"Time display format.","oneOf":[{"description":"12-hour format with AM/PM (e.g., \"6:30 AM\").","type":"string","const":"12h"},{"description":"24-hour format (e.g., \"06:30\").","type":"string","const":"24h"}]},"Nullable_string":{"type":["string","null"]},"WindowTitleConfig":{"description":"Active window title with optional app-icon prefix.","type":"object","properties":{"format":{"description":"Format string for the label.\n\n## Placeholders\n\n- `{{ title }}` - Window title\n- `{{ app }}` - Application name (WM_CLASS on Hyprland)\n\n## Examples\n\n- `\"{{ title }}\"` - \"README.md - VSCode\"\n- `\"{{ app }}: {{ title }}\"` - \"firefox: GitHub\"","$ref":"#/$defs/string","default":"{{ title }}"},"icon-name":{"description":"Fallback icon when no mapping matches.","$ref":"#/$defs/string","default":"ld-app-window-symbolic"},"icon-mappings":{"description":"Icon mappings. Glob patterns to icon names.\n\nKeys are patterns matching the window class (default) or title (when\nprefixed with `title:`). Values are icon names from the installed icon\nset. User mappings are checked before built-in mappings.\n\n## Example\n\n```toml\n[modules.window-title.icon-mappings]\n\"*firefox*\" = \"ld-globe-symbolic\"\n\"org.mozilla.*\" = \"ld-globe-symbolic\"\n\"title:*YouTube*\" = \"ld-youtube-symbolic\"\n```","$ref":"#/$defs/Map_of_string","default":{}},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"blue"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-show":{"description":"Display text label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"blue"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":50},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"WorldClockConfig":{"description":"Multiple timezones shown together in a dropdown.","type":"object","properties":{"format":{"description":"Format string with embedded timezone blocks.\n\nUse `{{ tz('timezone', 'strftime') }}` to insert a formatted time.\nAnything outside a placeholder stays as literal text.\n\n## Examples\n\n| Format string | Renders as |\n|---|---|\n| `\"{{ tz('UTC', '%H:%M %Z') }}\"` | `14:30 UTC` |\n| `\"NYC {{ tz('America/New_York', '%H:%M') }} TYO {{ tz('Asia/Tokyo', '%H:%M') }}\"` | `NYC 09:30 TYO 23:30` |\n| `\"{{ tz('America/New_York', '%H:%M %Z') }} \\| {{ tz('Europe/London', '%H:%M %Z') }}\"` | `09:30 EST \\| 14:30 GMT` |","$ref":"#/$defs/string","default":"{{ tz('UTC', '%H:%M %Z') }}"},"icon-name":{"description":"Symbolic icon name.","$ref":"#/$defs/string","default":"ld-globe-symbolic"},"border-show":{"description":"Display border around button.","$ref":"#/$defs/boolean","default":false},"border-color":{"description":"Border color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"icon-show":{"description":"Display module icon.","$ref":"#/$defs/boolean","default":true},"icon-color":{"description":"Icon foreground color. Auto selects based on variant for contrast.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-show":{"description":"Display text label.","$ref":"#/$defs/boolean","default":true},"label-color":{"description":"Label text color token.","$ref":"#/$defs/ColorValue","default":"yellow"},"label-max-length":{"description":"Max label characters before truncation with ellipsis. Set to 0 to disable.","$ref":"#/$defs/uint32","default":0},"button-bg-color":{"description":"Button background color token.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"left-click":{"description":"Action on left click.","$ref":"#/$defs/ClickAction","default":""},"right-click":{"description":"Action on right click.","$ref":"#/$defs/ClickAction","default":""},"middle-click":{"description":"Action on middle click.","$ref":"#/$defs/ClickAction","default":""},"scroll-up":{"description":"Action on scroll up.","$ref":"#/$defs/ClickAction","default":""},"scroll-down":{"description":"Action on scroll down.","$ref":"#/$defs/ClickAction","default":""}}},"Array_of_CustomModuleDefinition":{"type":"array","items":{"$ref":"#/$defs/CustomModuleDefinition"}},"CustomModuleDefinition":{"description":"User-defined module that runs a shell command and renders the output in the bar.\n\nFull walkthrough with examples at .","type":"object","properties":{"id":{"description":"Unique identifier for this module.\n\nReferenced in bar layouts as `custom-`. Must be unique across\nall custom module definitions.\n\n## Example\n\n```toml\n[[modules.custom]]\nid = \"gpu-temp\"\n\n# Reference in layout:\n# layout = [\"custom-gpu-temp\", \"clock\"]\n```","type":"string"},"command":{"description":"Shell command to execute.\n\nThe command runs via `sh -c` and should output to stdout.\nStderr is discarded. Commands have a 30-second timeout.\n\n## Output Parsing\n\n- If output starts with `{` or `[`: parsed as JSON\n- Otherwise: treated as plain text\n\n## Behavior by Mode\n\n- **poll**: Executed every `interval-ms` milliseconds\n- **watch**: Spawned once, each stdout line triggers a display update.\n Restarts are controlled by `restart-policy`.","type":["string","null"],"default":null},"mode":{"description":"Execution mode for the command.\n\n| Mode | Behavior |\n|------|----------|\n| `poll` | Run command every `interval-ms` (default) |\n| `watch` | Spawn long-running process, update on each stdout line |\n\nUse `poll` for commands that return current state and exit.\nUse `watch` for commands that stream updates (e.g., `pactl subscribe`).","$ref":"#/$defs/ExecutionMode","default":"poll"},"interval-ms":{"description":"Polling interval in milliseconds.\n\nOnly applies to `poll` mode. Ignored in `watch` mode.\n\nSet to `0` for manual polling mode: no timer is started. In manual\nmode, the command still runs once at startup.","type":"integer","format":"uint64","minimum":0,"default":5000},"restart-policy":{"description":"Restart policy for watch mode.\n\nOnly applies to `watch` mode. Ignored in `poll` mode.\n\n| Policy | Behavior |\n|--------|----------|\n| `never` | Do not restart after exit |\n| `on-exit` | Restart after any exit |\n| `on-failure` | Restart only after non-zero/signal exit |","$ref":"#/$defs/RestartPolicy","default":"never"},"restart-interval-ms":{"description":"Base restart delay in milliseconds for watch mode.\n\nOnly applies to `watch` mode. Ignored in `poll` mode.\n\nUsed when `restart-policy` is `on-exit` or `on-failure`.\nDelay increases exponentially on rapid failures, capped at 30 seconds.","$ref":"#/$defs/RestartDelay","default":1000},"format":{"description":"Format string for the label using Jinja2 template syntax.\n\n## Variables\n\n- `{{ output }}` - Raw command output\n- `{{ field }}` - JSON field access\n- `{{ nested.field }}` - Nested field access\n- `{{ items.0 }}` - Array index access\n\n## Filters\n\n- `{{ val | default('fallback') }}` - Fallback for missing values\n- `{{ \"%02d\" | format(val) }}` - Zero-padding\n- `{{ val | upper }}`, `| lower`, `| trim` - String transforms\n\n## Examples\n\n- `\"{{ output }}°C\"` - Plain text: \"72°C\"\n- `\"{{ percentage }}%\"` - JSON field: \"75%\"\n- `\"{{ data.temp }}°C\"` - Nested: \"22°C\"\n\nIf JSON output contains a `text` field, it overrides this format.","type":"string","default":"{{ output }}"},"tooltip-format":{"description":"Format string for the tooltip (hover text).\n\nSupports the same Jinja2 syntax as `format`. If not set, no tooltip is shown.\nIf JSON output contains a `tooltip` field, it overrides this format.\n\n## Example\n\n```toml\nformat = \"{{ percentage }}%\"\ntooltip-format = \"Volume: {{ percentage }}% on {{ device }}\"\n```","type":["string","null"],"default":null},"hide-if-empty":{"description":"Hide module when output is empty, \"0\", or \"false\".\n\nWhen enabled, the module (including its gap in the bar layout) is\ncompletely hidden if the output indicates an empty/disabled state.","type":"boolean","default":false},"icon-name":{"description":"Static symbolic icon name.\n\nUsed when `icon-names` and `icon-map` don't provide a match.\nShould be a symbolic icon name from the icon theme (e.g., `\"ld-gpu-symbolic\"`).\n\n## Example\n\n```toml\nicon-name = \"ld-temperature-symbolic\"\n```","type":"string","default":""},"icon-names":{"description":"Array of icon names indexed by percentage (0-100).\n\nRequires JSON output with a `percentage` field (0-100).\nThe array is divided evenly across the percentage range.\n\n## Resolution\n\nFor N icons, icon at index `floor(percentage * N / 101)` is selected:\n\n- 4 icons: 0-24% → [0], 25-49% → [1], 50-74% → [2], 75-100% → [3]\n- 5 icons: 0-19% → [0], 20-39% → [1], 40-59% → [2], 60-79% → [3], 80-100% → [4]\n\n## Example\n\n```toml\nicon-names = [\n \"battery-empty-symbolic\",\n \"battery-caution-symbolic\",\n \"battery-low-symbolic\",\n \"battery-good-symbolic\",\n \"battery-full-symbolic\"\n]\n```","type":["array","null"],"items":{"type":"string"},"default":null},"icon-map":{"description":"Map of icon names keyed by the `alt` field value.\n\nRequires JSON output with an `alt` field. The `alt` value is looked up\nin this map. Use `\"default\"` as a fallback key.\n\n**Priority**: `icon-map[alt]` takes precedence over `icon-names[percentage]`,\nallowing state-specific icons to override percentage-based icons.\n\n## Example\n\n```toml\n# Volume with muted state override\nicon-names = [\"vol-0\", \"vol-33\", \"vol-66\", \"vol-100\"]\nicon-map = { \"muted\" = \"audio-volume-muted-symbolic\" }\n\n# Output: {\"percentage\": 50, \"alt\": \"muted\"}\n# Result: Uses \"audio-volume-muted-symbolic\" (alt match beats percentage)\n\n# Output: {\"percentage\": 50}\n# Result: Uses \"vol-33\" (percentage-based, no alt)\n```","type":["object","null"],"additionalProperties":{"type":"string"},"default":null},"class-format":{"description":"Format string for dynamic CSS classes.\n\nSupports the same Jinja2 syntax as `format`. The formatted result is\nsplit on whitespace and each word is added as a CSS class.\n\nCombined with the `class` field from JSON output (if present).\n\n## Example\n\n```toml\nclass-format = \"volume-{{ alt }}\"\n# Output: {\"alt\": \"muted\"} → adds class \"volume-muted\"\n```","type":["string","null"],"default":null},"icon-show":{"description":"Display module icon.","type":"boolean","default":true},"icon-color":{"description":"Icon foreground color.","$ref":"#/$defs/ColorValue","default":"auto"},"icon-bg-color":{"description":"Icon container background color.","$ref":"#/$defs/ColorValue","default":"auto"},"label-show":{"description":"Display text label.","type":"boolean","default":true},"label-color":{"description":"Label text color.","$ref":"#/$defs/ColorValue","default":"auto"},"label-max-length":{"description":"Maximum label length in characters before truncation.\n\nWhen exceeded, label is truncated with ellipsis. Set to `0` to disable.","type":"integer","format":"uint32","minimum":0,"default":0},"button-bg-color":{"description":"Button background color.","$ref":"#/$defs/ColorValue","default":"bg-surface-elevated"},"border-show":{"description":"Display border around button.","type":"boolean","default":false},"border-color":{"description":"Border color.","$ref":"#/$defs/ColorValue","default":"auto"},"left-click":{"description":"Shell command executed on left click.\n\nIf `on-action` is set, it runs after this command completes.","type":"string","default":""},"right-click":{"description":"Shell command executed on right click.\n\nIf `on-action` is set, it runs after this command completes.","type":"string","default":""},"middle-click":{"description":"Shell command executed on middle click.\n\nIf `on-action` is set, it runs after this command completes.","type":"string","default":""},"scroll-up":{"description":"Shell command executed on scroll up.\n\nScroll events are debounced (50ms) to coalesce rapid scrolls.\nIf `on-action` is set, it runs after this command completes.","type":"string","default":""},"scroll-down":{"description":"Shell command executed on scroll down.\n\nScroll events are debounced (50ms) to coalesce rapid scrolls.\nIf `on-action` is set, it runs after this command completes.","type":"string","default":""},"on-action":{"description":"Shell command to run after any click/scroll action completes.\n\nExecutes after the action handler finishes, and its output updates\nthe display immediately. Useful for reflecting state changes without\nwaiting for the next poll interval.\n\n## Example\n\n```toml\n# Volume control with immediate feedback\nscroll-up = \"pactl set-sink-volume @DEFAULT_SINK@ +5%\"\nscroll-down = \"pactl set-sink-volume @DEFAULT_SINK@ -5%\"\non-action = '''\nvol=$(pactl get-sink-volume @DEFAULT_SINK@ | grep -oP '\\d+(?=%)' | head -1)\necho \"{\\\"percentage\\\": $vol}\"\n'''\n```","type":["string","null"],"default":null}},"required":["id"]},"ExecutionMode":{"description":"Execution mode for custom module commands.","oneOf":[{"description":"Run command at regular intervals defined by `interval-ms`.\n\nBest for commands that complete quickly and return current state\n(e.g., reading a file, querying system status).","type":"string","const":"poll"},{"description":"Spawn long-running process and update display on each stdout line.\n\nBest for event-driven updates without polling overhead\n(e.g., `pactl subscribe`, `inotifywait`, `tail -f`).\nConfigure `restart-policy` to control restarts after exit.","type":"string","const":"watch"}]},"RestartPolicy":{"description":"Restart behavior for watch-mode custom modules.","oneOf":[{"description":"Never restart after exit.","type":"string","const":"never"},{"description":"Restart after any exit code (success or failure).","type":"string","const":"on-exit"},{"description":"Restart only after non-zero exit codes or signal termination.","type":"string","const":"on-failure"}]},"RestartDelay":{"description":"Restart delay in milliseconds, clamped to >= 1.","type":"integer","format":"uint64","minimum":1},"OsdConfig":{"description":"On-screen display overlay for transient events like volume and brightness.","type":"object","properties":{"enabled":{"description":"Show OSD overlays for volume, brightness, and keyboard toggles.","$ref":"#/$defs/boolean","default":true},"position":{"description":"Screen anchor position.","$ref":"#/$defs/OsdPosition","default":"bottom"},"duration":{"description":"Auto-dismiss delay in milliseconds.","$ref":"#/$defs/uint32","default":2500},"monitor":{"description":"Target monitor: \"primary\" or a connector name like \"DP-1\".","$ref":"#/$defs/OsdMonitor","default":"primary"},"margin":{"description":"Margin from screen edges.","$ref":"#/$defs/Spacing","default":150.0},"border":{"description":"Show a border around the OSD.","$ref":"#/$defs/boolean","default":true}}},"OsdPosition":{"description":"Screen anchor for the OSD overlay.","oneOf":[{"description":"Top-left corner.","type":"string","const":"top-left"},{"description":"Top-center edge.","type":"string","const":"top"},{"description":"Top-right corner.","type":"string","const":"top-right"},{"description":"Right-center edge.","type":"string","const":"right"},{"description":"Bottom-right corner.","type":"string","const":"bottom-right"},{"description":"Bottom-center edge.","type":"string","const":"bottom"},{"description":"Bottom-left corner.","type":"string","const":"bottom-left"},{"description":"Left-center edge.","type":"string","const":"left"}]},"OsdMonitor":{"description":"\"primary\" or a monitor connector name (e.g. \"DP-1\")","type":"string","default":"primary"},"WallpaperConfig":{"description":"Wallpaper rendering, cycling, and per-monitor overrides.","type":"object","properties":{"engine-enabled":{"description":"Enable the awww wallpaper engine. Disable to use an external wallpaper\ntool while keeping color extraction and theming.","$ref":"#/$defs/boolean","default":true},"transition-type":{"description":"Transition animation type.","$ref":"#/$defs/TransitionType","default":"simple"},"transition-duration":{"description":"Transition animation duration in seconds.","$ref":"#/$defs/TransitionDuration","default":0.699999988079071},"transition-fps":{"description":"Transition animation frame rate.","$ref":"#/$defs/TransitionFps","default":60},"cycling-enabled":{"description":"Enable automatic wallpaper cycling.","$ref":"#/$defs/boolean","default":false},"cycling-directory":{"description":"Directory containing wallpaper images for cycling.","$ref":"#/$defs/string","default":""},"cycling-mode":{"description":"Wallpaper cycling order.","$ref":"#/$defs/CyclingMode","default":"sequential"},"cycling-interval-mins":{"description":"Time between wallpaper changes in minutes.","$ref":"#/$defs/CyclingInterval","default":15},"cycling-same-image":{"description":"Show the same cycling wallpaper on all monitors. Only affects shuffle\nmode since sequential already displays the same image.","$ref":"#/$defs/boolean","default":false},"monitors":{"description":"Per-monitor wallpaper and fit mode settings. Each entry targets a\nmonitor by connector name. See [`MonitorWallpaperConfig`] for the\navailable fields.\n\n## Example\n\n```toml\n[[wallpaper.monitors]]\nname = \"DP-1\"\nwallpaper = \"/home/me/pictures/wall-primary.png\"\nfit-mode = \"fill\"\n\n[[wallpaper.monitors]]\nname = \"HDMI-1\"\nwallpaper = \"/home/me/pictures/wall-secondary.png\"\nfit-mode = \"fit\"\n```","$ref":"#/$defs/Array_of_MonitorWallpaperConfig","default":[]}}},"TransitionType":{"description":"Transition animation type.","oneOf":[{"description":"Instant change with no animation.","type":"string","const":"none"},{"description":"Basic crossfade.","type":"string","const":"simple"},{"description":"Fade with bezier-controlled easing.","type":"string","const":"fade"},{"description":"Wipe from left edge to right.","type":"string","const":"left"},{"description":"Wipe from right edge to left.","type":"string","const":"right"},{"description":"Wipe from top edge to bottom.","type":"string","const":"top"},{"description":"Wipe from bottom edge to top.","type":"string","const":"bottom"},{"description":"Wipe at configurable angle.","type":"string","const":"wipe"},{"description":"Wavy wipe effect.","type":"string","const":"wave"},{"description":"Growing circle from a position.","type":"string","const":"grow"},{"description":"Growing circle from center.","type":"string","const":"center"},{"description":"Shrinking circle from edges inward.","type":"string","const":"outer"},{"description":"Growing circle from random position.","type":"string","const":"any"},{"description":"Randomly selects from all transition types.","type":"string","const":"random"}]},"TransitionDuration":{"description":"Transition duration in seconds, clamped to >= 0.","type":"number","format":"float","minimum":0.0},"TransitionFps":{"description":"Transition frame rate clamped to 1-360 fps.","type":"integer","format":"uint32","minimum":1,"maximum":360},"CyclingMode":{"description":"Wallpaper cycling order.","oneOf":[{"description":"Alphabetical order.","type":"string","const":"sequential"},{"description":"Random order.","type":"string","const":"shuffle"}]},"CyclingInterval":{"description":"Cycling interval in minutes, minimum 1.","type":"integer","format":"uint64","minimum":1},"Array_of_MonitorWallpaperConfig":{"type":"array","items":{"$ref":"#/$defs/MonitorWallpaperConfig"}},"MonitorWallpaperConfig":{"description":"Per-monitor wallpaper configuration.","type":"object","properties":{"name":{"description":"Monitor name (e.g., \"HDMI-1\", \"DP-1\").","type":"string"},"fit-mode":{"description":"Image scaling mode for this monitor.","$ref":"#/$defs/FitMode","default":"fill"},"wallpaper":{"description":"Wallpaper image path for this monitor.","type":"string","default":""}},"required":["name"]},"FitMode":{"description":"Image scaling mode.","oneOf":[{"description":"Scale to cover entire display, cropping excess.","type":"string","const":"fill"},{"description":"Scale to fit within display, letterboxing if needed.","type":"string","const":"fit"},{"description":"Display at original size, centered.","type":"string","const":"center"},{"description":"Stretch to exactly fill, ignoring aspect ratio.","type":"string","const":"stretch"}]}},"$id":"wayle-config-0.2.3"} diff --git a/wayle/themes/schema.json b/wayle/themes/schema.json new file mode 100644 index 0000000..38784b7 --- /dev/null +++ b/wayle/themes/schema.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Palette", + "description": "Ten-color palette for CSS generation.", + "type": "object", + "properties": { + "bg": { + "description": "Base background color (darkest).", + "type": "string" + }, + "surface": { + "description": "Card and sidebar background.", + "type": "string" + }, + "elevated": { + "description": "Raised element background.", + "type": "string" + }, + "fg": { + "description": "Primary text color.", + "type": "string" + }, + "fg_muted": { + "description": "Secondary text color.", + "type": "string" + }, + "primary": { + "description": "Accent color for interactive elements.", + "type": "string" + }, + "red": { + "description": "Red palette color.", + "type": "string" + }, + "yellow": { + "description": "Yellow palette color.", + "type": "string" + }, + "green": { + "description": "Green palette color.", + "type": "string" + }, + "blue": { + "description": "Blue palette color.", + "type": "string" + } + }, + "required": [ + "bg", + "surface", + "elevated", + "fg", + "fg_muted", + "primary", + "red", + "yellow", + "green", + "blue" + ], + "$id": "wayle-theme-0.2.3" +} diff --git a/wayle/tombi.toml b/wayle/tombi.toml new file mode 100644 index 0000000..d16c7c0 --- /dev/null +++ b/wayle/tombi.toml @@ -0,0 +1,10 @@ +[schema] +enabled = true + +[[schemas]] +path = "./schema.json" +include = ["config.toml", "runtime.toml"] + +[[schemas]] +path = "./themes/schema.json" +include = ["themes/*.toml"] diff --git a/wl-kbptr/config b/wl-kbptr/config new file mode 100644 index 0000000..36c7bd7 --- /dev/null +++ b/wl-kbptr/config @@ -0,0 +1,56 @@ +# wl-kbptr can be configured with a configuration file. +# The file location can be passed with the -c parameter. +# Othewise the `$XDG_CONFIG_HOME/wl-kbptr/config` file will +# be loaded if it exits. Below is the default configuration. + +[general] +home_row_keys= +modes=floating +cancellation_status_code=0 + +[mode_tile] +label_color=#fffd +label_select_color=#fd0d +unselectable_bg_color=#2226 +selectable_bg_color=#0304 +selectable_border_color=#040c +label_font_family=sans-serif +label_font_size=8 50% 100 +label_symbols=abcdefghijklmnopqrstuvwxyz + +[mode_floating] +source=detect +label_color=#ffff +label_select_color=#fd0d +unselectable_bg_color=#2226 +selectable_bg_color=#1718 +selectable_border_color=#040c +label_font_family=sans-serif +label_font_size=14 50% 100 +label_symbols=asdfghjklweruio + +[mode_bisect] +label_color=#fffd +label_font_size=20 +label_font_family=sans-serif +label_padding=12 +pointer_size=20 +pointer_color=#e22d +unselectable_bg_color=#2226 +even_area_bg_color=#0304 +even_area_border_color=#0408 +odd_area_bg_color=#0034 +odd_area_border_color=#0048 +history_border_color=#3339 + +[mode_split] +pointer_size=20 +pointer_color=#e22d +bg_color=#2226 +area_bg_color=#11111188 +vertical_color=#8888ffcc +horizontal_color=#008800cc +history_border_color=#3339 + +[mode_click] +button=left