diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-15 11:16:09 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-15 11:16:09 +0200 |
| commit | a9f3e65355b64577044467ca70ca16d00fba016b (patch) | |
| tree | e23ba75ade9be67f194a6535d351f6a8fd9909ae /templates | |
| parent | c90c72ed7d5bb5337319a053bf89d73fcb16c604 (diff) | |
| download | unified-desktop-theme-a9f3e65355b64577044467ca70ca16d00fba016b.tar.gz unified-desktop-theme-a9f3e65355b64577044467ca70ca16d00fba016b.zip | |
feat(palette): add Sublime Text as a consumer
Two outputs, not one. The colour scheme themes the editor pane and tracks
the wallpaper accent; the theme themes the UI chrome and sits on the
scheme's fixed accent, because Sublime reads a theme once per window and a
moving accent would leave open windows disagreeing with new ones.
The colour scheme costs no new roles. Its scopes map onto the sixteen ANSI
slots every scheme already declares, so all nine satisfy it and the
identical-role-set selftest passes untouched.
The theme is an override layered over Material Behave rather than a theme
of its own: that theme hardcodes 419 rules of [r,g,b] literals with no
variables, so the chrome surfaces are restated and its geometry, icons and
animations are inherited. It installs under the name of the theme it
overrides, because Sublime merges .sublime-theme files by filename with
Packages/User last; under its own name it would never apply. It also has
to follow Material Behave's material_theme_contrast_mode block and carry
no settings gate, or contrast mode wins.
The accent is replaced by matching the variable's current value rather
than a placeholder: install.sh copies the file out of the repo, so after
the first wallpaper change there is no placeholder left to substitute.
udt-accent --selftest now covers that it stays idempotent.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'templates')
| -rw-r--r-- | templates/sublime/udt.sublime-color-scheme.in | 247 | ||||
| -rw-r--r-- | templates/sublime/udt.sublime-theme.in | 182 |
2 files changed, 429 insertions, 0 deletions
diff --git a/templates/sublime/udt.sublime-color-scheme.in b/templates/sublime/udt.sublime-color-scheme.in new file mode 100644 index 0000000..30eed18 --- /dev/null +++ b/templates/sublime/udt.sublime-color-scheme.in @@ -0,0 +1,247 @@ +// Generated by udt-palette from palette/@SCHEME@.conf. Do not edit. +// +// A Sublime Text color scheme is JSON with comments. Colour scopes map onto the +// terminal roles rather than onto syntax-specific roles of their own: a scheme +// already declares all sixteen ANSI slots, so a syntax theme costs no new roles +// and every shipped scheme satisfies it without editing nine role maps. +// +// @ACCENT@ is left for udt-accent, which substitutes it per wallpaper and +// rewrites this file in place. Sublime watches Packages/User and reloads a +// colour scheme when its file changes, so that reaches a running editor. +{ + "name": "UDT", + "author": "udt-palette (@SCHEME@)", + "variables": + { + "bg": "@BG@", + "bg_alt": "@BG_ALT@", + "bg_deep": "@BG_DEEP@", + "surface": "@SURFACE@", + "surface_alt": "@SURFACE_ALT@", + + "fg": "@FG@", + "fg_dim": "@FG_DIM@", + "fg_faint": "@FG_FAINT@", + + "accent": "@ACCENT@", + + "red": "@RED@", + "green": "@GREEN@", + "yellow": "@YELLOW@", + "blue": "@BLUE@", + "magenta": "@MAGENTA@", + "cyan": "@CYAN@", + + "critical": "@CRITICAL@", + "warning": "@WARNING@", + "success": "@SUCCESS@", + "info": "@INFO@" + }, + "globals": + { + "background": "var(bg)", + "foreground": "var(fg)", + "caret": "var(accent)", + "block_caret": "var(accent)", + "invisibles": "var(fg_faint)", + "line_highlight": "var(surface)", + "selection": "@SELECTION_BG@", + "selection_border": "var(accent)", + "inactive_selection": "var(surface)", + "misspelling": "var(critical)", + "gutter": "var(bg)", + "gutter_foreground": "var(fg_faint)", + "guide": "var(surface)", + "active_guide": "var(accent)", + "stack_guide": "var(surface_alt)", + "find_highlight": "var(warning)", + "find_highlight_foreground": "var(bg)", + "shadow": "var(bg_deep)" + }, + "rules": + [ + { + "name": "Comment", + "scope": "comment, punctuation.definition.comment", + "foreground": "var(fg_faint)", + "font_style": "italic" + }, + { + "name": "String", + "scope": "string, constant.other.symbol", + "foreground": "var(green)" + }, + { + "name": "Escape sequence", + "scope": "constant.character.escape, constant.other.placeholder", + "foreground": "var(magenta)" + }, + { + "name": "Number", + "scope": "constant.numeric", + "foreground": "var(yellow)" + }, + { + "name": "Built-in constant", + "scope": "constant.language", + "foreground": "var(yellow)" + }, + { + "name": "User-defined constant", + "scope": "constant.character, constant.other", + "foreground": "var(yellow)" + }, + { + "name": "Variable", + "scope": "variable", + "foreground": "var(fg)" + }, + { + "name": "Member", + "scope": "variable.other.member, meta.property variable", + "foreground": "var(cyan)" + }, + { + "name": "Language variable", + "scope": "variable.language", + "foreground": "var(magenta)", + "font_style": "italic" + }, + { + "name": "Keyword", + "scope": "keyword, keyword.operator.word", + "foreground": "var(magenta)" + }, + { + "name": "Operator", + "scope": "keyword.operator", + "foreground": "var(cyan)" + }, + { + "name": "Storage", + "scope": "storage, storage.modifier", + "foreground": "var(magenta)" + }, + { + "name": "Storage type", + "scope": "storage.type", + "foreground": "var(blue)", + "font_style": "italic" + }, + { + "name": "Class name", + "scope": "entity.name.class, entity.name.struct, entity.name.type", + "foreground": "var(yellow)", + "font_style": "italic" + }, + { + "name": "Inherited class", + "scope": "entity.other.inherited-class", + "foreground": "var(yellow)", + "font_style": "italic" + }, + { + "name": "Function name", + "scope": "entity.name.function, variable.function", + "foreground": "var(blue)" + }, + { + "name": "Function argument", + "scope": "variable.parameter", + "foreground": "var(accent)", + "font_style": "italic" + }, + { + "name": "Section or namespace", + "scope": "entity.name.namespace, entity.name.section", + "foreground": "var(accent)" + }, + { + "name": "Tag name", + "scope": "entity.name.tag", + "foreground": "var(magenta)" + }, + { + "name": "Tag attribute", + "scope": "entity.other.attribute-name", + "foreground": "var(yellow)", + "font_style": "italic" + }, + { + "name": "Library function", + "scope": "support.function", + "foreground": "var(cyan)" + }, + { + "name": "Library constant", + "scope": "support.constant", + "foreground": "var(yellow)" + }, + { + "name": "Library class/type", + "scope": "support.class, support.type, support.other.namespace", + "foreground": "var(yellow)", + "font_style": "italic" + }, + { + "name": "Punctuation", + "scope": "punctuation, meta.brace, meta.delimiter", + "foreground": "var(fg_dim)" + }, + { + "name": "Invalid", + "scope": "invalid", + "foreground": "var(bg)", + "background": "var(critical)" + }, + { + "name": "Invalid deprecated", + "scope": "invalid.deprecated", + "foreground": "var(bg)", + "background": "var(warning)" + }, + { + "name": "Markup heading", + "scope": "markup.heading, entity.name.section", + "foreground": "var(accent)", + "font_style": "bold" + }, + { + "name": "Markup link", + "scope": "markup.underline.link, string.other.link", + "foreground": "var(info)", + "font_style": "underline" + }, + { + "name": "Markup bold", + "scope": "markup.bold", + "font_style": "bold" + }, + { + "name": "Markup italic", + "scope": "markup.italic", + "font_style": "italic" + }, + { + "name": "Markup raw", + "scope": "markup.raw, markup.inline.raw", + "foreground": "var(warning)", + "background": "var(bg_alt)" + }, + { + "name": "Diff inserted", + "scope": "markup.inserted", + "foreground": "var(success)" + }, + { + "name": "Diff deleted", + "scope": "markup.deleted", + "foreground": "var(critical)" + }, + { + "name": "Diff changed", + "scope": "markup.changed", + "foreground": "var(warning)" + } + ] +} diff --git a/templates/sublime/udt.sublime-theme.in b/templates/sublime/udt.sublime-theme.in new file mode 100644 index 0000000..17d1c1a --- /dev/null +++ b/templates/sublime/udt.sublime-theme.in @@ -0,0 +1,182 @@ +// Generated by udt-palette from palette/@SCHEME@.conf. Do not edit. +// +// An override layered over Material Behave, not a theme of its own. Sublime +// merges every .sublime-theme of the same name across packages, User last, so +// this file re-colours that theme's chrome and inherits its geometry, icons and +// animations untouched. Rename it and it stops applying. +// +// Material Behave hardcodes 419 rules of [r,g,b] literals with no variables to +// override, so the surfaces are restated here rather than remapped. Only colour +// is set: sizes, margins and opacities belong to the parent theme. +// +// Ordering matters. Material Behave ends with a contrast-mode block gated on +// "material_theme_contrast_mode", which re-tints the sidebar, status bar and +// panels a shade darker. Later rules win, so these come after it and carry no +// settings gate of their own, which is what makes them apply either way. +// +// Colours are [r,g,b] arrays because that is what a .sublime-theme takes; the +// colour scheme next door uses hex. Same palette, two syntaxes. +// +// The chrome does NOT track the wallpaper, unlike the colour scheme's accent. +// Sublime reads a theme once per window, so a moving accent would leave open +// windows disagreeing with new ones. The accent here is the scheme's fixed one, +// which is what conky, Qt, GTK and waybar already sit on. +[ + // Editor ground, behind the tabs and in an empty window. + { + "class": "sheet_container_control", + "layer0.tint": @BG@ + }, + + // Tab bar. The strip itself sits a shade off the editor so tabs read as + // raised; the selected tab matches the editor it belongs to. + { + "class": "tabset_control", + "layer0.tint": @BG_DEEP@ + }, + { + "class": "tab_control", + "layer0.tint": @BG_ALT@ + }, + { + "class": "tab_control", + "attributes": ["selected"], + "layer0.tint": @BG@ + }, + { + "class": "tab_label", + "fg": @FG_FAINT@ + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "fg": @FG@ + }, + + // Sidebar. + { + "class": "sidebar_container", + "layer0.tint": @BG_ALT@ + }, + { + "class": "sidebar_tree", + "layer0.tint": @BG_ALT@ + }, + { + "class": "sidebar_label", + "fg": @FG_DIM@ + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "fg": @FG@ + }, + { + "class": "sidebar_heading", + "fg": @FG_FAINT@ + }, + // The hover and selection wash behind a row. Its opacity is the parent + // theme's; only the tint is ours. + { + "class": "tree_row", + "layer1.tint": @ACCENT@ + }, + + // Status bar. Material Behave paints a hidden layer0 and a visible layer1, + // so both are set or the bar changes colour as it redraws. + { + "class": "status_bar", + "layer0.tint": @BG_ALT@, + "layer1.tint": @BG_ALT@ + }, + { + "class": "status_button", + "layer0.tint": @BG_ALT@ + }, + { + "class": "label_control", + "parents": [{"class": "status_bar"}], + "fg": @FG_DIM@ + }, + + // Find, replace and the console. + { + "class": "panel_control", + "layer0.tint": @BG_ALT@, + "layer1.tint": @BG_ALT@ + }, + { + "class": "panel_button_control", + "layer0.tint": @BG_ALT@ + }, + + // Command palette, goto-anything and autocomplete. + { + "class": "quick_panel", + "layer0.tint": @BG_ALT@ + }, + { + "class": "quick_panel_label", + "fg": @FG_DIM@ + }, + { + "class": "quick_panel_label", + "parents": [{"class": "quick_panel_row", "attributes": ["selected"]}], + "fg": @FG@ + }, + { + "class": "quick_panel_score_label", + "fg": @ACCENT@ + }, + { + "class": "quick_panel_path_label", + "fg": @FG_FAINT@ + }, + { + "class": "auto_complete", + "layer0.tint": @BG_ALT@ + }, + { + "class": "auto_complete_label", + "fg": @FG_DIM@ + }, + { + "class": "popup_control", + "layer0.tint": @BG_ALT@ + }, + { + "class": "dialog", + "layer0.tint": @BG_ALT@ + }, + + // Tooltips, and the progress widgets that Material Behave tints per accent. + { + "class": "tool_tip_control", + "layer0.tint": @BG_DEEP@ + }, + { + "class": "tool_tip_label_control", + "fg": @FG_DIM@ + }, + { + "class": "progress_gauge_control", + "layer0.tint": @ACCENT@ + }, + + // Scrollbars and the minimap viewport. + { + "class": "scroll_bar_control", + "layer0.tint": @BG_DEEP@ + }, + { + "class": "puck_control", + "layer0.tint": @FG_FAINT@ + }, + + // Title bar, on the platforms and settings where Material Behave draws it. + { + "class": "title_bar", + "bg": @BG_DEEP@, + "fg": @FG_DIM@ + } +] |
