aboutsummaryrefslogtreecommitdiffstats
path: root/palette
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-09-11 17:20:50 +0200
committerDanilo M. <danix@danix.xyz>2026-09-11 17:20:50 +0200
commit7b55910a786c7652ac80a576399ebd9f81a8ac72 (patch)
tree4adaedb0f0ac5003ecc0e19093a2cb5871b18deb /palette
parentc7cb9dad4e782ee0ff99773c3607ec3b7792c723 (diff)
downloadunified-desktop-theme-7b55910a786c7652ac80a576399ebd9f81a8ac72.tar.gz
unified-desktop-theme-7b55910a786c7652ac80a576399ebd9f81a8ac72.zip
feat(palette): generate every themed config from one scheme
Colours were written down five times: rofi's palette.rasi, the waybar theme, the kitty theme, the conky and dunst templates, and a MACCHIATO dict inside udt-accent. Changing scheme meant finding all five, and they had already drifted: the active waybar theme was Macchiato while theme.css next to it was Mocha, and nothing imported the latter. Now a scheme is two files. palette/<scheme>.conf holds the colours under the scheme's own names, and palette/roles-<scheme>.conf says what each is for. palette/roles.conf is one `scheme =` line selecting the pair. bin/udt-palette renders that into each consumer's syntax and install.sh runs it first. The role map is per-scheme rather than shared because the palettes are genuinely different shapes: Nord has no `base`, Dracula no `surface0`, and forcing Catppuccin's names onto them would have meant either renaming their colours or inventing values. A role names a palette colour with two optional modifiers, `name/75` for alpha and `name*50` for brightness. The second exists because GTK's shade() has no palette name to point at. Ships macchiato, tokyo-night, nord and dracula. --selftest resolves every role in every scheme and asserts they define the same set, so a scheme that cannot satisfy a consumer fails at install rather than when someone switches to it. Verified against the live configs: all 46 waybar colours resolve identically to the previously active theme including its alpha() and shade() derivations, the kitty theme is colour-for-colour identical, and the rofi palette has the same 26 values. Generated files are gitignored; switching scheme and switching back reproduces the originals. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015gbjA2bmswN8jyPDKzrvqe
Diffstat (limited to 'palette')
-rw-r--r--palette/dracula.conf29
-rw-r--r--palette/macchiato.conf40
-rw-r--r--palette/nord.conf41
-rw-r--r--palette/roles-dracula.conf101
-rw-r--r--palette/roles-macchiato.conf115
-rw-r--r--palette/roles-nord.conf101
-rw-r--r--palette/roles-tokyo-night.conf99
-rw-r--r--palette/roles.conf14
-rw-r--r--palette/tokyo-night.conf43
9 files changed, 583 insertions, 0 deletions
diff --git a/palette/dracula.conf b/palette/dracula.conf
new file mode 100644
index 0000000..c1b41fb
--- /dev/null
+++ b/palette/dracula.conf
@@ -0,0 +1,29 @@
+# Dracula.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Source: https://draculatheme.com/contribute
+#
+# Dracula ships six accents and three greys, fewer than Catppuccin's ten and
+# nine. The two extra surfaces below are not upstream: they are interpolated
+# between background and current_line so roles that want a third depth have
+# one. Everything else is the published palette.
+
+background = #282a36
+current_line = #44475a
+selection = #44475a
+foreground = #f8f8f2
+comment = #6272a4
+
+cyan = #8be9fd
+green = #50fa7b
+orange = #ffb86c
+pink = #ff79c6
+purple = #bd93f9
+red = #ff5555
+yellow = #f1fa8c
+
+# Interpolated, not upstream. See the note above.
+surface_low = #21222c
+surface_mid = #343746
+surface_high = #565872
diff --git a/palette/macchiato.conf b/palette/macchiato.conf
new file mode 100644
index 0000000..8ba796f
--- /dev/null
+++ b/palette/macchiato.conf
@@ -0,0 +1,40 @@
+# Catppuccin Macchiato.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Source: https://github.com/catppuccin/palette
+#
+# Colour definitions only, in the scheme's own names. Nothing here says what a
+# colour is used for; roles.conf does that. Adding a scheme means adding a file
+# like this one, not editing any consumer.
+
+rosewater = #f4dbd6
+flamingo = #f0c6c6
+pink = #f5bde6
+mauve = #c6a0f6
+red = #ed8796
+maroon = #ee99a0
+peach = #f5a97f
+yellow = #eed49f
+green = #a6da95
+teal = #8bd5ca
+sky = #91d7e3
+sapphire = #7dc4e4
+blue = #8aadf4
+lavender = #b7bdf8
+
+text = #cad3f5
+subtext1 = #b8c0e0
+subtext0 = #a5adcb
+
+overlay2 = #939ab7
+overlay1 = #8087a2
+overlay0 = #6e738d
+
+surface2 = #5b6078
+surface1 = #494d64
+surface0 = #363a4f
+
+base = #24273a
+mantle = #1e2030
+crust = #181926
diff --git a/palette/nord.conf b/palette/nord.conf
new file mode 100644
index 0000000..a3454b7
--- /dev/null
+++ b/palette/nord.conf
@@ -0,0 +1,41 @@
+# Nord.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Source: https://www.nordtheme.com/docs/colors-and-palettes
+#
+# Nord names its colours nord0..nord15 and nothing else, so that is what this
+# file uses. The aurora and frost groupings below are Nord's own; the readable
+# aliases are a convenience for roles.conf and are the same colours.
+
+nord0 = #2e3440
+nord1 = #3b4252
+nord2 = #434c5e
+nord3 = #4c566a
+
+nord4 = #d8dee9
+nord5 = #e5e9f0
+nord6 = #eceff4
+
+nord7 = #8fbcbb
+nord8 = #88c0d0
+nord9 = #81a1c1
+nord10 = #5e81ac
+
+nord11 = #bf616a
+nord12 = #d08770
+nord13 = #ebcb8b
+nord14 = #a3be8c
+nord15 = #b48ead
+
+# Aliases, same values. Nord has no sixteenth hue, so the darker frost blue
+# stands in where a scheme with more accents would offer one.
+frost_teal = #8fbcbb
+frost_cyan = #88c0d0
+frost_blue = #81a1c1
+frost_deep = #5e81ac
+aurora_red = #bf616a
+aurora_orange = #d08770
+aurora_yellow = #ebcb8b
+aurora_green = #a3be8c
+aurora_purple = #b48ead
diff --git a/palette/roles-dracula.conf b/palette/roles-dracula.conf
new file mode 100644
index 0000000..40aa2a6
--- /dev/null
+++ b/palette/roles-dracula.conf
@@ -0,0 +1,101 @@
+# Role assignments for Dracula.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Dracula ships three greys where Catppuccin has nine, so this leans on the
+# interpolated surfaces in palette/dracula.conf. It has no distinct bright
+# variants, so bright_* name the same colours as normal.
+
+[ui]
+bg = background
+bg_alt = surface_low
+bg_deep = surface_low
+surface = surface_mid
+surface_alt = current_line
+border = current_line
+
+fg = foreground
+fg_dim = comment
+fg_faint = surface_high
+
+accent = purple
+
+[state]
+warning = yellow
+critical = red
+success = green
+info = cyan
+
+[waybar]
+main_br = comment
+main_bg = surface_low
+main_fg = foreground
+hover_bg = background
+hover_fg = foreground/75
+outline = surface_low*50
+
+workspaces = surface_low
+temperature = surface_low
+memory = background
+cpu = surface_mid
+time = surface_mid
+date = background
+tray = surface_low
+volume = surface_low
+backlight = background
+battery = surface_mid
+charging = green
+
+[conky]
+heading = purple
+label = comment
+rule = current_line
+value = cyan
+highlight = pink
+ok = green
+body = foreground
+body_outline = current_line
+body_shade = surface_low
+
+[terminal]
+cursor = foreground
+selection_bg = selection
+selection_fg = foreground
+url = cyan
+tab_active_bg = purple
+tab_active_fg = background
+tab_inactive_bg = surface_low
+tab_inactive_fg = foreground
+border_active = purple
+border_inactive = comment
+
+black = current_line
+red = red
+green = green
+yellow = yellow
+blue = purple
+magenta = pink
+cyan = cyan
+white = foreground
+
+bright_black = surface_high
+bright_red = red
+bright_green = green
+bright_yellow = orange
+bright_blue = purple
+bright_magenta = pink
+bright_cyan = cyan
+bright_white = foreground
+
+# kitty extras: marks, scrollbar, bell, tab bar ground.
+mark1 = purple
+mark2 = pink
+mark3 = cyan
+scrollbar_handle = comment
+scrollbar_track = current_line
+bell_border = yellow
+tab_bar_bg = surface_low
+
+[accents]
+# Dracula ships six accents.
+snap = pink purple red orange yellow green cyan
diff --git a/palette/roles-macchiato.conf b/palette/roles-macchiato.conf
new file mode 100644
index 0000000..0a34f03
--- /dev/null
+++ b/palette/roles-macchiato.conf
@@ -0,0 +1,115 @@
+# Role assignments for Catppuccin Macchiato.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Every role in here names a colour from palette/macchiato.conf. See
+# palette/roles.conf for what the roles mean and how to select a scheme.
+
+[ui]
+# Surfaces, darkest to lightest. Most consumers only need the first three.
+bg = base
+bg_alt = mantle
+bg_deep = crust
+surface = surface0
+surface_alt = surface1
+border = surface1
+
+# Text, brightest to dimmest.
+fg = text
+fg_dim = subtext0
+fg_faint = overlay0
+
+# The one colour that tracks the wallpaper. udt-accent overrides this per
+# wallpaper for rofi, dunst, Hyprland and Firefox; the value here is the
+# fallback, and what the consumers that do not track it sit on permanently.
+accent = lavender
+
+[state]
+# Notification urgency, waybar module states, conky warnings.
+warning = yellow
+critical = red
+success = green
+info = teal
+
+[waybar]
+# Bar chrome. These were already role names in ~/.config/waybar/theme.css.
+main_br = subtext0
+main_bg = crust
+main_fg = text
+hover_bg = base
+hover_fg = text/75
+outline = crust*50
+
+# Per-module backgrounds. Alternating depths, not semantic: the bar reads as
+# stripes, so neighbouring modules differ.
+workspaces = mantle
+temperature = mantle
+memory = base
+cpu = surface0
+time = surface0
+date = base
+tray = mantle
+volume = mantle
+backlight = base
+battery = surface0
+charging = green
+
+[conky]
+# conky indexes colours by number. The names say what each number draws.
+heading = lavender
+label = subtext0
+rule = surface1
+value = teal
+highlight = mauve
+ok = green
+body = text
+body_outline = surface1
+body_shade = mantle
+
+[terminal]
+# The 16 ANSI slots, plus kitty's own chrome. normal and bright are separate
+# because a scheme may offer distinct pairs; Catppuccin and Dracula do not, so
+# these name the same colours twice.
+cursor = rosewater
+selection_bg = rosewater
+selection_fg = base
+url = rosewater
+tab_active_bg = mauve
+tab_active_fg = crust
+tab_inactive_bg = mantle
+tab_inactive_fg = text
+border_active = lavender
+border_inactive = overlay0
+
+black = surface1
+red = red
+green = green
+yellow = yellow
+blue = blue
+magenta = pink
+cyan = teal
+white = subtext1
+
+bright_black = surface2
+bright_red = red
+bright_green = green
+bright_yellow = yellow
+bright_blue = blue
+bright_magenta = pink
+bright_cyan = teal
+bright_white = subtext0
+
+# kitty extras: marks, scrollbar, bell, tab bar ground.
+mark1 = lavender
+mark2 = mauve
+mark3 = sapphire
+scrollbar_handle = overlay2
+scrollbar_track = surface1
+bell_border = yellow
+tab_bar_bg = crust
+
+[accents]
+# The hues udt-accent snaps a wallpaper to. Near-neutral tints (rosewater,
+# flamingo) and near-duplicate hues (maroon, sapphire) are left out so the
+# snapping has one candidate per region of the wheel.
+snap = pink mauve lavender red peach yellow green teal sky blue
diff --git a/palette/roles-nord.conf b/palette/roles-nord.conf
new file mode 100644
index 0000000..b04e9c8
--- /dev/null
+++ b/palette/roles-nord.conf
@@ -0,0 +1,101 @@
+# Role assignments for Nord.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Nord's Polar Night (nord0..nord3) is the only dark group, so bg_deep reuses
+# nord0 rather than inventing a darker shade. Nord has no pink or magenta, so
+# the aurora purple fills both.
+
+[ui]
+bg = nord0
+bg_alt = nord1
+bg_deep = nord0
+surface = nord1
+surface_alt = nord2
+border = nord3
+
+fg = nord4
+fg_dim = nord4
+fg_faint = nord3
+
+accent = frost_cyan
+
+[state]
+warning = aurora_yellow
+critical = aurora_red
+success = aurora_green
+info = frost_teal
+
+[waybar]
+main_br = nord4
+main_bg = nord0
+main_fg = nord6
+hover_bg = nord1
+hover_fg = nord6/75
+outline = nord0*50
+
+workspaces = nord1
+temperature = nord1
+memory = nord0
+cpu = nord2
+time = nord2
+date = nord0
+tray = nord1
+volume = nord1
+backlight = nord0
+battery = nord2
+charging = aurora_green
+
+[conky]
+heading = frost_cyan
+label = nord4
+rule = nord3
+value = frost_teal
+highlight = aurora_purple
+ok = aurora_green
+body = nord6
+body_outline = nord3
+body_shade = nord1
+
+[terminal]
+cursor = nord4
+selection_bg = nord2
+selection_fg = nord6
+url = frost_cyan
+tab_active_bg = aurora_purple
+tab_active_fg = nord0
+tab_inactive_bg = nord1
+tab_inactive_fg = nord4
+border_active = frost_cyan
+border_inactive = nord3
+
+black = nord1
+red = aurora_red
+green = aurora_green
+yellow = aurora_yellow
+blue = frost_blue
+magenta = aurora_purple
+cyan = frost_teal
+white = nord5
+
+bright_black = nord3
+bright_red = aurora_red
+bright_green = aurora_green
+bright_yellow = aurora_orange
+bright_blue = frost_cyan
+bright_magenta = aurora_purple
+bright_cyan = frost_teal
+bright_white = nord6
+
+# kitty extras: marks, scrollbar, bell, tab bar ground.
+mark1 = frost_cyan
+mark2 = aurora_purple
+mark3 = frost_teal
+scrollbar_handle = nord3
+scrollbar_track = nord2
+bell_border = aurora_yellow
+tab_bar_bg = nord0
+
+[accents]
+# Nord has nine usable hues, one fewer than Catppuccin.
+snap = aurora_purple frost_blue aurora_red aurora_orange aurora_yellow aurora_green frost_teal frost_cyan frost_deep
diff --git a/palette/roles-tokyo-night.conf b/palette/roles-tokyo-night.conf
new file mode 100644
index 0000000..fb54926
--- /dev/null
+++ b/palette/roles-tokyo-night.conf
@@ -0,0 +1,99 @@
+# Role assignments for Tokyo Night.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Tokyo Night carries fewer surface depths than Catppuccin, so bg_highlight
+# does double duty as both surfaces. Its comment colour is the dim foreground.
+
+[ui]
+bg = bg
+bg_alt = bg_dark
+bg_deep = bg_float
+surface = bg_highlight
+surface_alt = bg_visual
+border = fg_gutter
+
+fg = fg
+fg_dim = fg_dark
+fg_faint = comment
+
+accent = blue
+
+[state]
+warning = yellow
+critical = red
+success = green
+info = cyan
+
+[waybar]
+main_br = fg_dark
+main_bg = bg_dark
+main_fg = fg
+hover_bg = bg
+hover_fg = fg/75
+outline = bg_dark*50
+
+workspaces = bg_dark
+temperature = bg_dark
+memory = bg
+cpu = bg_highlight
+time = bg_highlight
+date = bg
+tray = bg_dark
+volume = bg_dark
+backlight = bg
+battery = bg_highlight
+charging = green
+
+[conky]
+heading = blue
+label = fg_dark
+rule = fg_gutter
+value = cyan
+highlight = magenta
+ok = green
+body = fg
+body_outline = fg_gutter
+body_shade = bg_dark
+
+[terminal]
+cursor = orange
+selection_bg = bg_visual
+selection_fg = fg
+url = cyan
+tab_active_bg = magenta
+tab_active_fg = bg_dark
+tab_inactive_bg = bg_dark
+tab_inactive_fg = fg
+border_active = blue
+border_inactive = comment
+
+black = terminal_black
+red = red
+green = green
+yellow = yellow
+blue = blue
+magenta = magenta
+cyan = cyan
+white = fg_dark
+
+bright_black = comment
+bright_red = red1
+bright_green = green1
+bright_yellow = orange
+bright_blue = blue5
+bright_magenta = purple
+bright_cyan = blue1
+bright_white = fg
+
+# kitty extras: marks, scrollbar, bell, tab bar ground.
+mark1 = blue
+mark2 = magenta
+mark3 = cyan
+scrollbar_handle = comment
+scrollbar_track = fg_gutter
+bell_border = yellow
+tab_bar_bg = bg_dark
+
+[accents]
+snap = magenta purple blue red orange yellow green teal cyan blue1
diff --git a/palette/roles.conf b/palette/roles.conf
new file mode 100644
index 0000000..3b789b8
--- /dev/null
+++ b/palette/roles.conf
@@ -0,0 +1,14 @@
+# Scheme selection.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# This is the one line to change to retheme the desktop. It picks a pair of
+# files: palette/<scheme>.conf, which holds the colours under the scheme's own
+# names, and palette/roles-<scheme>.conf, which says what each colour is for.
+#
+# Run ./install.sh afterwards. Every themed config is generated from that pair,
+# so nothing else needs editing.
+#
+# Available: macchiato, tokyo-night, nord, dracula
+
+scheme = macchiato
diff --git a/palette/tokyo-night.conf b/palette/tokyo-night.conf
new file mode 100644
index 0000000..eb1b0b6
--- /dev/null
+++ b/palette/tokyo-night.conf
@@ -0,0 +1,43 @@
+# Tokyo Night.
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+# Licensed under the GNU General Public License v2 only.
+#
+# Source: https://github.com/folke/tokyonight.nvim (the "night" variant)
+#
+# Tokyo Night names colours by hue rather than by role, and carries three
+# background depths plus a distinct float/sidebar shade. The names below are
+# upstream's own.
+
+bg = #1a1b26
+bg_dark = #16161e
+bg_highlight = #292e42
+bg_float = #16161e
+bg_visual = #283457
+
+fg = #c0caf5
+fg_dark = #a9b1d6
+fg_gutter = #3b4261
+
+comment = #565f89
+terminal_black = #414868
+
+blue = #7aa2f7
+blue0 = #3d59a5
+blue1 = #2ac3de
+blue2 = #0db9d7
+blue5 = #89ddff
+blue6 = #b4f9f8
+blue7 = #394b70
+
+cyan = #7dcfff
+magenta = #bb9af7
+magenta2 = #ff007c
+purple = #9d7cd8
+orange = #ff9e64
+yellow = #e0af68
+green = #9ece6a
+green1 = #73daca
+green2 = #41a6b5
+teal = #1abc9c
+red = #f7768e
+red1 = #db4b4b