Understanding the hypr_gradient Template Helper in Omarchy
The hypr_gradient helper is a Jinja-style template function that converts theme color tokens into Hyprland-compatible Lua tables or strings, intelligently handling both gradient specifications and solid color fallbacks.
The hypr_gradient helper is a critical component of the Omarchy theming system that bridges theme definitions with Hyprland window manager configurations. Implemented in the omacom/omarchy repository, this utility processes color tokens and gradient specifications, converting them into the specific Lua table format required by Hyprland's configuration files.
What is the hypr_gradient Template Helper?
hypr_gradient is a template processing function designed for Omarchy's theme engine. It resolves theme keys that may contain either solid colors or Hyprland-style gradient definitions, then emits the appropriate Lua syntax for Hyprland's configuration files.
Theme authors invoke the helper using Jinja-style syntax:
{{ hypr_gradient key fallback_color }}
For example:
local active_border_color = {{ hypr_gradient hyprland_active_border accent }}
The helper checks if hyprland_active_border exists in the current theme. If found, it parses the value; if missing, it substitutes the fallback color (in this case, accent).
Implementation and Core Logic
The helper's implementation resides in the theme template processing script, with gradient parsing delegated to a dedicated geometry module.
Primary Implementation File
The core logic lives in bin/omarchy-theme-set-templates around line 141, within the hypr_gradient_value() function. This shell function performs the initial token lookup and determines whether to apply gradient parsing or return a solid color.
Gradient Parsing Dependency
When the helper detects a potential gradient, it delegates parsing to geometry.parseGradientSpec in shell/Commons/BorderGeometry.js (around line 345). This specialized parser extracts color stops and angle information from strings matching the pattern rgba(..) rgba(..) <angle>deg.
Processing Logic and Fallback Behavior
The helper executes a three-step resolution process:
- Token Resolution – Retrieves the value associated with the requested key from the active theme
- Gradient Detection – Tests if the token matches the Hyprland gradient syntax using the geometry parser
- Format Conversion – Returns either a Lua table (for gradients) or a string (for solid colors/fallbacks)
Gradient to Lua Table Conversion
When the parser identifies a valid gradient specification like rgba(33ccffee) rgba(00ff99ee) 45deg, the helper outputs a Lua table:
{ colors = { "rgba(33ccffee)", "rgba(00ff99ee)" }, angle = 45 }
This format matches exactly what Hyprland expects for gradient definitions in its configuration.
Solid Color and Fallback Handling
If the token is a plain color (e.g., #336699 or rgba(595959aa)), or if the key does not exist in the theme, the helper returns a simple Lua string:
"#336699"
According to the test suite in test/cli/gradient-test.txt.tpl (lines 300-456), the fallback mechanism activates immediately when a key is missing, substituting the user-provided fallback color. The specific fallback test case appears around lines 450-453, verifying that {{ hypr_gradient missing accent }} correctly yields the fallback value.
Usage Examples
Converting Theme Gradients
When a theme defines hyprland_active_border as a gradient:
-- hyprland.lua.tpl
local active_border_color = {{ hypr_gradient hyprland_active_border accent }}
If the theme contains:
hyprland_active_border: "rgba(33ccffee) rgba(00ff99ee) 45deg"
The rendered output becomes:
local active_border_color = { colors = { "rgba(33ccffee)", "rgba(00ff99ee)" }, angle = 45 }
Handling Solid Colors
If the same theme key contains a solid color:
hyprland_active_border: "#336699"
The helper outputs:
local active_border_color = "#336699"
Shell Implementation Reference
The underlying shell logic in bin/omarchy-theme-set-templates operates conceptually as follows:
hypr_gradient_value() {
key=$1
fallback=$2
token=$(theme_get "$key")
if [[ -z "$token" ]]; then
echo "\"$fallback\""
return
fi
gradient=$(geometry.parseGradientSpec "$token")
if [[ "$gradient.enabled" == "true" ]]; then
echo "{ colors = { \"${gradient.colors[0]}\", \"${gradient.colors[1]}\" }, angle = ${gradient.angle} }"
else
echo "\"$token\""
fi
}
This pseudocode represents the actual implementation found at line 141 of the template processing script.
Documentation and Testing
The helper is documented in docs/theming.md (lines 169-171), where it appears in the template helper reference table. The documentation specifies the exact syntax and fallback behavior for theme authors.
Validation occurs through the test file test/cli/gradient-test.txt.tpl, which contains both normal gradient cases and fallback scenarios (lines 300-456). These tests ensure that the helper correctly handles the boundary between gradient and non-gradient inputs.
Summary
- The
hypr_gradienthelper converts theme color tokens into Hyprland-compatible Lua syntax - Implementation resides in
bin/omarchy-theme-set-templatesat approximately line 141 within thehypr_gradient_value()function - Gradient parsing utilizes
geometry.parseGradientSpecfromshell/Commons/BorderGeometry.js - The helper outputs Lua tables for gradients (
{ colors = {...}, angle = n }) and strings for solid colors - Fallback colors are applied automatically when theme keys are missing or undefined
- Documented in
docs/theming.md(lines 169-171) and tested intest/cli/gradient-test.txt.tpl(lines 300-456)
Frequently Asked Questions
What file contains the hypr_gradient implementation?
The primary implementation is located in bin/omarchy-theme-set-templates at approximately line 141, specifically within the hypr_gradient_value() shell function. Gradient string parsing is handled by shell/Commons/BorderGeometry.js.
How does hypr_gradient handle missing theme tokens?
When the requested key does not exist in the current theme, the helper immediately returns the fallback color provided as the second argument. According to the test suite in test/cli/gradient-test.txt.tpl (lines 450-453), this behavior is validated to ensure consistent fallback output.
What format does Hyprland expect for gradient definitions?
Hyprland requires gradients as Lua tables with a specific structure: { colors = { "rgba(...)", "rgba(...)" }, angle = <number> }. The hypr_gradient helper automatically generates this structure when it detects gradient syntax (two rgba values followed by an angle in degrees) in the theme token.
Can hypr_gradient be used outside of Hyprland templates?
While designed specifically for Hyprland configuration generation, the helper is technically available in any Omarchy template processed by omarchy-theme-set-templates. However, its output format (Lua tables and strings) is optimized for Hyprland's Lua-based configuration system, making it most appropriate for .lua.tpl template files.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →