1 line
No EOL
151 KiB
JSON
1 line
No EOL
151 KiB
JSON
{"$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-<id>` 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-<id>`.\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 <https://wayle.app/guide/custom-modules>.","type":"object","properties":{"id":{"description":"Unique identifier for this module.\n\nReferenced in bar layouts as `custom-<id>`. 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"} |