diff options
Diffstat (limited to 'scripts')
34 files changed, 21279 insertions, 2666 deletions
diff --git a/scripts/theme-studio/Makefile b/scripts/theme-studio/Makefile index 374c7fb1b..7b8430182 100644 --- a/scripts/theme-studio/Makefile +++ b/scripts/theme-studio/Makefile @@ -16,7 +16,10 @@ OUT ?= ../../themes EMACS ?= emacs EMACSCLIENT ?= emacsclient -.PHONY: help test check check-generated coverage gen open theme theme-load theme-reload +.PHONY: help test check check-generated coverage gen open theme theme-load theme-reload face-coverage-dump face-coverage face-coverage-diff + +# Scratch path for the face-coverage Emacs data dump. +FACE_DUMP ?= /tmp/face-coverage-data.json .DEFAULT_GOAL := help @@ -31,6 +34,8 @@ help: @echo " make theme JSON=x.json - Convert a Theme Studio JSON export to OUT/<name>-theme.el" @echo " make theme-load THEME=x - Disable all custom themes, then load THEME in current Emacs" @echo " make theme-reload JSON=x - Convert JSON, then cleanly reload its theme in current Emacs" + @echo " make face-coverage - Regenerate face-coverage.org from the live Emacs daemon" + @echo " make face-coverage-diff - Show the coverage delta vs the committed face-coverage.org" test: @./run-tests.sh @@ -101,3 +106,16 @@ endif @theme_name='$(THEME)'; \ if [ -z "$$theme_name" ]; then theme_name="$$(basename '$(JSON)' .json)"; fi; \ $(MAKE) theme-load THEME="$$theme_name" OUT='$(OUT)' EMACSCLIENT='$(EMACSCLIENT)' + +# Dump face/group/package data from the running daemon (falls back to a batch +# Emacs that loads the full init when no daemon is reachable). +face-coverage-dump: + @$(EMACSCLIENT) -e '(progn (load "$(HERE)face-coverage-dump.el") (face-coverage-dump "$(FACE_DUMP)"))' >/dev/null 2>&1 \ + || $(EMACS) --batch -l "$$HOME/.emacs.d/init.el" -l "$(HERE)face-coverage-dump.el" \ + --eval '(face-coverage-dump "$(FACE_DUMP)")' + +face-coverage: face-coverage-dump + @python3 face_coverage.py --data "$(FACE_DUMP)" + +face-coverage-diff: face-coverage-dump + @python3 face_coverage.py --data "$(FACE_DUMP)" --compare face-coverage.org diff --git a/scripts/theme-studio/WIP.json b/scripts/theme-studio/WIP.json new file mode 100644 index 000000000..9735383e4 --- /dev/null +++ b/scripts/theme-studio/WIP.json @@ -0,0 +1,8454 @@ +{ + "name": "WIP", + "palette": [ + [ + "#0a0c0d", + "silver-4", + "silver" + ], + [ + "#2c2f32", + "silver-3", + "silver" + ], + [ + "#53575c", + "silver-2", + "silver" + ], + [ + "#7c838a", + "silver-1", + "silver" + ], + [ + "#a9b2bb", + "silver", + "silver" + ], + [ + "#bac1c8", + "silver+1", + "silver" + ], + [ + "#cbd0d6", + "silver+2", + "silver" + ], + [ + "#dce0e3", + "silver+3", + "silver" + ], + [ + "#edeff1", + "silver+4", + "silver" + ], + [ + "#202327", + "blue-4", + "blue" + ], + [ + "#303842", + "blue-3", + "blue" + ], + [ + "#424f5e", + "blue-2", + "blue" + ], + [ + "#54677d", + "blue-1", + "blue" + ], + [ + "#67809c", + "blue", + "blue" + ], + [ + "#788da6", + "blue+1", + "blue" + ], + [ + "#899bb1", + "blue+2", + "blue" + ], + [ + "#9ba8bb", + "blue+3", + "blue" + ], + [ + "#adb6c6", + "blue+4", + "blue" + ], + [ + "#0b0701", + "gold-5", + "gold" + ], + [ + "#2d2306", + "gold-4", + "gold" + ], + [ + "#544412", + "gold-3", + "gold" + ], + [ + "#7e671f", + "gold-2", + "gold" + ], + [ + "#ab8d2e", + "gold-1", + "gold" + ], + [ + "#dab53d", + "gold", + "gold" + ], + [ + "#e0c266", + "gold+1", + "gold" + ], + [ + "#e6ce88", + "gold+2", + "gold" + ], + [ + "#eddba7", + "gold+3", + "gold" + ], + [ + "#f3e7c5", + "gold+4", + "gold" + ], + [ + "#f9f3e2", + "gold+5", + "gold" + ], + [ + "#2b1d19", + "terracotta-5", + "terracotta" + ], + [ + "#482c23", + "terracotta-4", + "terracotta" + ], + [ + "#663b2e", + "terracotta-3", + "terracotta" + ], + [ + "#864a38", + "terracotta-2", + "terracotta" + ], + [ + "#a85b42", + "terracotta-1", + "terracotta" + ], + [ + "#cb6b4d", + "terracotta", + "terracotta" + ], + [ + "#cb7b64", + "terracotta+1", + "terracotta" + ], + [ + "#cb8b7a", + "terracotta+2", + "terracotta" + ], + [ + "#c99990", + "terracotta+3", + "terracotta" + ], + [ + "#c7a8a5", + "terracotta+4", + "terracotta" + ], + [ + "#c3b6bb", + "terracotta+5", + "terracotta" + ], + [ + "#040009", + "regal-4", + "regal" + ], + [ + "#170429", + "regal-3", + "regal" + ], + [ + "#2f0c4e", + "regal-2", + "regal" + ], + [ + "#4a1876", + "regal-1", + "regal" + ], + [ + "#6624a0", + "regal", + "regal" + ], + [ + "#8255b5", + "regal+1", + "regal" + ], + [ + "#9f80c9", + "regal+2", + "regal" + ], + [ + "#bea9dc", + "regal+3", + "regal" + ], + [ + "#ded4ee", + "regal+4", + "regal" + ], + [ + "#100f0f", + "ground", + "ground" + ], + [ + "#222223", + "ground+1", + "ground" + ], + [ + "#363638", + "ground+2", + "ground" + ], + [ + "#4a4b4f", + "ground+3", + "ground" + ], + [ + "#606267", + "ground+4", + "ground" + ], + [ + "#777980", + "ground+5", + "ground" + ], + [ + "#8e919a", + "ground+6", + "ground" + ], + [ + "#a6aab4", + "ground+7", + "ground" + ], + [ + "#050801", + "olive-drab-4", + "olive-drab" + ], + [ + "#1b2506", + "olive-drab-3", + "olive-drab" + ], + [ + "#374712", + "olive-drab-2", + "olive-drab" + ], + [ + "#546c20", + "olive-drab-1", + "olive-drab" + ], + [ + "#74932f", + "olive-drab", + "olive-drab" + ], + [ + "#8ea85e", + "olive-drab+1", + "olive-drab" + ], + [ + "#a9be87", + "olive-drab+2", + "olive-drab" + ], + [ + "#c5d4ae", + "olive-drab+3", + "olive-drab" + ], + [ + "#e2e9d6", + "olive-drab+4", + "olive-drab" + ], + [ + "#bfc4d0", + "fg", + "ground" + ], + [ + "#18272a", + "aquamarine-4", + "dark-cyan" + ], + [ + "#1d4049", + "aquamarine-3", + "dark-cyan" + ], + [ + "#1e5b69", + "aquamarine-2", + "dark-cyan" + ], + [ + "#18788c", + "aquamarine-1", + "dark-cyan" + ], + [ + "#0096b0", + "aquamarine", + "dark-cyan" + ], + [ + "#47a0b7", + "aquamarine+1", + "dark-cyan" + ], + [ + "#6ba9bd", + "aquamarine+2", + "dark-cyan" + ], + [ + "#88b2c3", + "aquamarine+3", + "dark-cyan" + ], + [ + "#a4bbca", + "aquamarine+4", + "dark-cyan" + ], + [ + "#282f36", + "sky-4", + "sky" + ], + [ + "#425262", + "sky-3", + "sky" + ], + [ + "#5e7892", + "sky-2", + "sky" + ], + [ + "#7ba1c5", + "sky-1", + "sky" + ], + [ + "#9acbfb", + "sky", + "sky" + ], + [ + "#a2caf3", + "sky+1", + "sky" + ], + [ + "#aac9ea", + "sky+2", + "sky" + ], + [ + "#b1c7e1", + "sky+3", + "sky" + ], + [ + "#b8c6d9", + "sky+4", + "sky" + ], + [ + "#5f8bf9", + "link", + "link" + ] + ], + "syntax": { + "bg": { + "fg": "#100f0f", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "p": { + "fg": "#bfc4d0", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "kw": { + "fg": "#67809c", + "bg": null, + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": "italic", + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "bi": { + "fg": "#a9b2bb", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "pp": { + "fg": "#dce0e3", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "fnd": { + "fg": "#cbd0d6", + "bg": null, + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": "italic", + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "fnc": { + "fg": "#bac1c8", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "dec": { + "fg": "#a9b2bb", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "ty": { + "fg": "#ab8d2e", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "prop": { + "fg": "#a9b2bb", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "con": { + "fg": "#dab53d", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "num": { + "fg": "#cb6b4d", + "bg": null, + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "str": { + "fg": "#74932f", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "esc": { + "fg": "#bfc4d0", + "bg": "#222223", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "re": { + "fg": "#74932f", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "doc": { + "fg": "#bfc4d0", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "cm": { + "fg": "#a9b2bb", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": "italic", + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "cmd": { + "fg": "#a9b2bb", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": "italic", + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "var": { + "fg": "#dab53d", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "op": { + "fg": "#dce0e3", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "punc": { + "fg": "#dce0e3", + "bg": null, + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + } + }, + "ui": { + "cursor": { + "fg": "#100f0f", + "bg": "#bac1c8", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "region": { + "fg": "#100f0f", + "bg": "#ab8d2e", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "hl-line": { + "fg": null, + "bg": "#222223", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": "highlight", + "height": null + }, + "highlight": { + "fg": "#eddba7", + "bg": null, + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "mode-line": { + "fg": "#cbd0d6", + "bg": "#424f5e", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": { + "style": "line", + "width": 1, + "color": "#a9b2bb" + }, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "mode-line-highlight": { + "fg": "#e6ce88", + "bg": "#424f5e", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "mode-line-inactive": { + "fg": "#100f0f", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": { + "style": "line", + "width": 1, + "color": "#54677d" + }, + "inverse": false, + "extend": false, + "inherit": "mode-line", + "height": 2 + }, + "fringe": { + "fg": "#f3e7c5", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "line-number": { + "fg": "#54677d", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "line-number-current-line": { + "fg": "#e6ce88", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "minibuffer-prompt": { + "fg": "#899bb1", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "isearch": { + "fg": null, + "bg": "#4a4b4f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "lazy-highlight": { + "fg": null, + "bg": "#4a4b4f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "isearch-fail": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "show-paren-match": { + "fg": "#100f0f", + "bg": "#74932f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "show-paren-mismatch": { + "fg": "#edeff1", + "bg": "#cb6b4d", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "link": { + "fg": "#0000ee", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": { + "style": "line", + "color": null + }, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "error": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "warning": { + "fg": "#ab8d2e", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "success": { + "fg": "#74932f", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": "bold", + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + }, + "vertical-border": { + "fg": "#4a4b4f", + "bg": "#100f0f", + "distant-fg": null, + "family": null, + "weight": null, + "slant": null, + "underline": null, + "strike": null, + "overline": null, + "box": null, + "inverse": false, + "extend": false, + "inherit": null, + "height": null + } + }, + "locks": [ + "bg", + "bi", + "fnc", + "prop", + "var", + "fnd", + "dec", + "ty", + "cmd", + "cm", + "ui:cursor", + "ui:fringe", + "ui:line-number", + "ui:line-number-current-line", + "ui:minibuffer-prompt", + "ui:isearch-fail", + "ui:show-paren-match", + "ui:error", + "ui:warning", + "ui:success", + "con", + "pkg:git-gutter:git-gutter:deleted", + "pkg:git-gutter:git-gutter:modified", + "pkg:git-gutter:git-gutter:added", + "pkg:git-gutter:git-gutter:unchanged", + "pkg:git-gutter:git-gutter:separator", + "ui:link", + "p", + "pp", + "op", + "punc", + "num", + "ui:lazy-highlight", + "ui:isearch", + "ui:hl-line", + "ui:highlight", + "str", + "esc", + "re", + "doc", + "kw", + "pkg:org-mode:org-headline-todo", + "pkg:org-mode:org-document-title", + "pkg:org-mode:org-document-info", + "pkg:org-mode:org-document-info-keyword", + "pkg:org-mode:org-level-1", + "pkg:org-mode:org-level-2", + "pkg:org-mode:org-level-3", + "pkg:org-mode:org-level-4", + "pkg:org-mode:org-level-5", + "pkg:org-mode:org-level-6", + "pkg:org-mode:org-level-7", + "pkg:org-mode:org-level-8", + "pkg:org-mode:org-headline-done", + "pkg:org-mode:org-todo", + "pkg:org-mode:org-done", + "pkg:org-mode:org-priority", + "pkg:org-mode:org-tag", + "pkg:org-mode:org-tag-group", + "pkg:org-mode:org-special-keyword", + "pkg:org-mode:org-drawer", + "pkg:org-mode:org-property-value", + "pkg:org-mode:org-checkbox", + "pkg:org-mode:org-checkbox-statistics-todo", + "pkg:org-mode:org-checkbox-statistics-done", + "pkg:org-mode:org-warning", + "pkg:org-mode:org-link", + "pkg:org-mode:org-footnote", + "pkg:org-mode:org-date", + "pkg:org-mode:org-sexp-date", + "pkg:org-mode:org-date-selected", + "pkg:org-mode:org-target", + "pkg:org-mode:org-macro", + "pkg:org-mode:org-cite", + "pkg:org-mode:org-cite-key", + "pkg:org-mode:org-block", + "pkg:org-mode:org-block-begin-line", + "pkg:org-mode:org-block-end-line", + "pkg:org-mode:org-code", + "pkg:org-mode:org-verbatim", + "pkg:org-mode:org-inline-src-block", + "pkg:org-mode:org-quote", + "pkg:org-mode:org-verse", + "pkg:org-mode:org-latex-and-related", + "pkg:org-mode:org-table", + "pkg:org-mode:org-table-header", + "pkg:org-mode:org-table-row", + "pkg:org-mode:org-formula", + "pkg:org-mode:org-column", + "pkg:org-mode:org-column-title", + "pkg:org-mode:org-list-dt", + "pkg:org-mode:org-meta-line", + "pkg:org-mode:org-ellipsis", + "pkg:org-mode:org-hide", + "pkg:org-mode:org-indent", + "pkg:org-mode:org-archived", + "pkg:org-mode:org-default", + "pkg:org-mode:org-dispatcher-highlight", + "pkg:org-mode:org-agenda-structure", + "pkg:org-mode:org-agenda-structure-secondary", + "pkg:org-mode:org-agenda-structure-filter", + "pkg:org-mode:org-agenda-date", + "pkg:org-mode:org-agenda-date-today", + "pkg:org-mode:org-agenda-date-weekend", + "pkg:org-mode:org-agenda-date-weekend-today", + "pkg:org-mode:org-agenda-current-time", + "pkg:org-mode:org-agenda-done", + "pkg:org-mode:org-agenda-dimmed-todo-face", + "pkg:org-mode:org-agenda-calendar-event", + "pkg:org-mode:org-agenda-calendar-sexp", + "pkg:org-mode:org-agenda-calendar-daterange", + "pkg:org-mode:org-agenda-diary", + "pkg:org-mode:org-agenda-clocking", + "pkg:org-mode:org-agenda-column-dateline", + "pkg:org-mode:org-agenda-restriction-lock", + "pkg:org-mode:org-agenda-filter-category", + "pkg:org-mode:org-agenda-filter-effort", + "pkg:org-mode:org-agenda-filter-regexp", + "pkg:org-mode:org-agenda-filter-tags", + "pkg:org-mode:org-scheduled", + "pkg:org-mode:org-scheduled-previously", + "pkg:org-mode:org-upcoming-deadline", + "pkg:org-mode:org-upcoming-distant-deadline", + "pkg:org-mode:org-imminent-deadline", + "pkg:org-mode:org-time-grid", + "pkg:org-mode:org-clock-overlay", + "pkg:org-mode:org-mode-line-clock", + "pkg:org-mode:org-mode-line-clock-overrun", + "pkg:emms:emms-browser-album-face", + "pkg:emms:emms-browser-albumartist-face", + "pkg:emms:emms-browser-artist-face", + "pkg:emms:emms-browser-composer-face", + "pkg:emms:emms-browser-performer-face", + "pkg:emms:emms-browser-track-face", + "pkg:emms:emms-browser-year/genre-face", + "pkg:emms:emms-metaplaylist-mode-current-face", + "pkg:emms:emms-metaplaylist-mode-face", + "pkg:emms:emms-playlist-selected-face", + "pkg:emms:emms-playlist-track-face", + "pkg:org-drill:org-drill-hidden-cloze-face", + "pkg:org-drill:org-drill-visible-cloze-face", + "pkg:org-drill:org-drill-visible-cloze-hint-face", + "pkg:pearl:pearl-preamble-summary", + "pkg:dashboard:dashboard-items-face", + "pkg:dashboard:dashboard-no-items-face", + "pkg:dashboard:dashboard-footer-face", + "pkg:dashboard:dashboard-footer-icon-face", + "pkg:dashboard:dashboard-text-banner", + "pkg:dashboard:dashboard-heading", + "pkg:dashboard:dashboard-navigator", + "pkg:auto-dim-other-buffers:auto-dim-other-buffers", + "pkg:auto-dim-other-buffers:auto-dim-other-buffers-hide", + "pkg:calibredb:calibredb-search-header-library-name-face", + "pkg:calibredb:calibredb-search-header-library-path-face", + "pkg:calibredb:calibredb-search-header-total-face", + "pkg:calibredb:calibredb-search-header-filter-face", + "pkg:calibredb:calibredb-search-header-sort-face", + "pkg:calibredb:calibredb-search-header-highlight-face", + "pkg:calibredb:calibredb-id-face", + "pkg:calibredb:calibredb-title-face", + "pkg:calibredb:calibredb-author-face", + "pkg:calibredb:calibredb-format-face", + "pkg:calibredb:calibredb-size-face", + "pkg:calibredb:calibredb-tag-face", + "pkg:calibredb:calibredb-date-face", + "pkg:calibredb:calibredb-mark-face", + "pkg:calibredb:calibredb-series-face", + "pkg:calibredb:calibredb-publisher-face", + "pkg:calibredb:calibredb-pubdate-face", + "pkg:calibredb:calibredb-language-face", + "pkg:calibredb:calibredb-comment-face", + "pkg:calibredb:calibredb-archive-face", + "pkg:calibredb:calibredb-favorite-face", + "pkg:calibredb:calibredb-file-face", + "pkg:calibredb:calibredb-ids-face", + "pkg:calibredb:calibredb-highlight-face", + "pkg:calibredb:calibredb-current-page-button-face", + "pkg:calibredb:calibredb-mouse-face", + "pkg:calibredb:calibredb-title-detailed-view-face", + "pkg:calibredb:calibredb-edit-annotation-header-title-face", + "pkg:company:company-echo-common", + "pkg:company:company-preview-common", + "pkg:company:company-preview-search", + "pkg:company:company-tooltip-annotation", + "pkg:company:company-tooltip-annotation-selection", + "pkg:company:company-tooltip-common", + "pkg:company:company-tooltip-common-selection", + "pkg:company:company-tooltip-quick-access", + "pkg:company:company-tooltip-quick-access-selection", + "pkg:company:company-tooltip-scrollbar-thumb", + "pkg:company:company-tooltip-selection", + "pkg:company:company-echo", + "pkg:company:company-preview", + "pkg:company:company-tooltip", + "pkg:company:company-tooltip-deprecated", + "pkg:company:company-tooltip-mouse", + "pkg:company:company-tooltip-scrollbar-track", + "pkg:company:company-tooltip-search", + "pkg:company:company-tooltip-search-selection", + "pkg:dired:dired-header", + "pkg:dired:dired-directory", + "pkg:dired:dired-symlink", + "pkg:dired:dired-broken-symlink", + "pkg:dired:dired-special", + "pkg:dired:dired-set-id", + "pkg:dired:dired-perm-write", + "pkg:dired:dired-mark", + "pkg:dired:dired-marked", + "pkg:dired:dired-flagged", + "pkg:dired:dired-ignored", + "pkg:dired:dired-warning", + "pkg:org-noter:org-noter-notes-exist-face", + "pkg:org-noter:org-noter-no-notes-exist-face", + "pkg:elfeed:elfeed-search-date-face", + "pkg:elfeed:elfeed-search-title-face", + "pkg:elfeed:elfeed-search-tag-face", + "pkg:elfeed:elfeed-search-unread-count-face", + "pkg:elfeed:elfeed-search-filter-face", + "pkg:elfeed:elfeed-search-last-update-face", + "pkg:elfeed:elfeed-log-date-face", + "pkg:elfeed:elfeed-log-error-level-face", + "pkg:elfeed:elfeed-log-warn-level-face", + "pkg:elfeed:elfeed-log-info-level-face", + "pkg:elfeed:elfeed-log-debug-level-face", + "pkg:elfeed:elfeed-search-unread-title-face", + "pkg:elfeed:elfeed-search-feed-face", + "pkg:org-mode:org-scheduled-today", + "pkg:ghostel:ghostel-default", + "pkg:ghostel:ghostel-fake-cursor", + "pkg:ghostel:ghostel-fake-cursor-box", + "pkg:ghostel:ghostel-color-black", + "pkg:ghostel:ghostel-color-red", + "pkg:ghostel:ghostel-color-green", + "pkg:ghostel:ghostel-color-yellow", + "pkg:ghostel:ghostel-color-blue", + "pkg:ghostel:ghostel-color-magenta", + "pkg:ghostel:ghostel-color-cyan", + "pkg:ghostel:ghostel-color-white", + "pkg:ghostel:ghostel-color-bright-black", + "pkg:ghostel:ghostel-color-bright-red", + "pkg:ghostel:ghostel-color-bright-green", + "pkg:ghostel:ghostel-color-bright-yellow", + "pkg:ghostel:ghostel-color-bright-blue", + "pkg:ghostel:ghostel-color-bright-magenta", + "pkg:ghostel:ghostel-color-bright-cyan", + "pkg:ghostel:ghostel-color-bright-white", + "pkg:shr:shr-h1", + "pkg:shr:shr-h2", + "pkg:shr:shr-h3", + "pkg:shr:shr-h4", + "pkg:shr:shr-h5", + "pkg:shr:shr-h6", + "pkg:shr:shr-text", + "pkg:shr:shr-code", + "pkg:shr:shr-mark", + "pkg:shr:shr-sup", + "pkg:shr:shr-abbreviation", + "pkg:shr:shr-sliced-image", + "pkg:signel:signel-timestamp-face", + "pkg:signel:signel-my-msg-face", + "pkg:signel:signel-other-msg-face", + "pkg:signel:signel-error-face", + "pkg:org-faces:org-faces-todo", + "pkg:org-faces:org-faces-project", + "pkg:org-faces:org-faces-doing", + "pkg:org-faces:org-faces-waiting", + "pkg:org-faces:org-faces-verify", + "pkg:org-faces:org-faces-stalled", + "pkg:org-faces:org-faces-delegated", + "pkg:org-faces:org-faces-failed", + "pkg:org-faces:org-faces-done", + "pkg:org-faces:org-faces-cancelled", + "pkg:org-faces:org-faces-priority-a", + "pkg:org-faces:org-faces-priority-b", + "pkg:org-faces:org-faces-priority-c", + "pkg:org-faces:org-faces-priority-d", + "pkg:org-faces:org-faces-todo-dim", + "pkg:org-faces:org-faces-project-dim", + "pkg:org-faces:org-faces-doing-dim", + "pkg:org-faces:org-faces-waiting-dim", + "pkg:org-faces:org-faces-verify-dim", + "pkg:org-faces:org-faces-stalled-dim", + "pkg:org-faces:org-faces-delegated-dim", + "pkg:org-faces:org-faces-failed-dim", + "pkg:org-faces:org-faces-done-dim", + "pkg:org-faces:org-faces-cancelled-dim", + "pkg:org-faces:org-faces-priority-a-dim", + "pkg:org-faces:org-faces-priority-b-dim", + "pkg:org-faces:org-faces-priority-c-dim", + "pkg:org-faces:org-faces-priority-d-dim", + "pkg:gnus:gnus-header-name", + "pkg:gnus:gnus-header-from", + "pkg:gnus:gnus-header-subject", + "pkg:gnus:gnus-header-content", + "pkg:gnus:gnus-header-newsgroups", + "pkg:pearl:pearl-modified-highlight", + "pkg:pearl:pearl-modified-local", + "pkg:pearl:pearl-modified-unknown", + "pkg:pearl:pearl-readonly-comment", + "pkg:pearl:pearl-editable-comment", + "ui:mode-line", + "ui:mode-line-highlight", + "pkg:alert:alert-high-face", + "pkg:alert:alert-normal-face", + "pkg:alert:alert-trivial-face", + "pkg:alert:alert-urgent-face", + "pkg:alert:alert-moderate-face", + "pkg:alert:alert-low-face", + "ui:show-paren-mismatch", + "ui:vertical-border", + "pkg:ansi-color:ansi-color-black", + "pkg:ansi-color:ansi-color-red", + "pkg:ansi-color:ansi-color-green", + "pkg:ansi-color:ansi-color-yellow", + "pkg:ansi-color:ansi-color-blue", + "pkg:ansi-color:ansi-color-magenta", + "pkg:ansi-color:ansi-color-cyan", + "pkg:ansi-color:ansi-color-white", + "pkg:ansi-color:ansi-color-bright-black", + "pkg:ansi-color:ansi-color-bright-red", + "pkg:ansi-color:ansi-color-bright-green", + "pkg:ansi-color:ansi-color-bright-yellow", + "pkg:ansi-color:ansi-color-bright-blue", + "pkg:ansi-color:ansi-color-bright-magenta", + "pkg:ansi-color:ansi-color-bright-cyan", + "pkg:ansi-color:ansi-color-bright-white", + "pkg:dashboard:dashboard-banner-logo-title", + "pkg:json-mode:json-mode-object-name-face", + "pkg:malyon:malyon-face-bold", + "pkg:malyon:malyon-face-error", + "pkg:malyon:malyon-face-italic", + "pkg:malyon:malyon-face-plain", + "pkg:malyon:malyon-face-reverse", + "pkg:mu4e:mu4e-title-face", + "pkg:mu4e:mu4e-context-face", + "pkg:mu4e:mu4e-modeline-face", + "pkg:mu4e:mu4e-ok-face", + "pkg:mu4e:mu4e-warning-face", + "pkg:mu4e:mu4e-header-title-face", + "pkg:mu4e:mu4e-header-key-face", + "pkg:mu4e:mu4e-header-value-face", + "pkg:mu4e:mu4e-header-face", + "pkg:mu4e:mu4e-header-highlight-face", + "pkg:mu4e:mu4e-header-marks-face", + "pkg:mu4e:mu4e-unread-face", + "pkg:mu4e:mu4e-flagged-face", + "pkg:mu4e:mu4e-replied-face", + "pkg:mu4e:mu4e-forwarded-face", + "pkg:mu4e:mu4e-draft-face", + "pkg:mu4e:mu4e-trashed-face", + "pkg:mu4e:mu4e-related-face", + "pkg:mu4e:mu4e-contact-face", + "pkg:mu4e:mu4e-special-header-value-face", + "pkg:mu4e:mu4e-url-number-face", + "pkg:mu4e:mu4e-link-face", + "pkg:mu4e:mu4e-footer-face", + "pkg:mu4e:mu4e-region-code", + "pkg:mu4e:mu4e-system-face", + "pkg:mu4e:mu4e-highlight-face", + "pkg:mu4e:mu4e-compose-separator-face", + "pkg:rainbow-delimiters:rainbow-delimiters-base-error-face", + "pkg:rainbow-delimiters:rainbow-delimiters-base-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-1-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-2-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-3-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-4-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-5-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-6-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-7-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-8-face", + "pkg:rainbow-delimiters:rainbow-delimiters-depth-9-face", + "pkg:rainbow-delimiters:rainbow-delimiters-mismatched-face", + "pkg:rainbow-delimiters:rainbow-delimiters-unmatched-face", + "pkg:shr:shr-link", + "pkg:shr:shr-selected-link", + "pkg:shr:shr-strike-through" + ], + "packages": { + "org-mode": { + "org-document-title": { + "fg": "#ab8d2e", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "height": 1.2, + "source": "user" + }, + "org-document-info": { + "fg": "#ab8d2e", + "bg": "#100f0f", + "inherit": null, + "height": 1.15, + "source": "user" + }, + "org-document-info-keyword": { + "fg": "#7c838a", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-1": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-2": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-3": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-4": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-5": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-6": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-7": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-level-8": { + "fg": "#cbd0d6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-headline-todo": { + "fg": "#f3e7c5", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-headline-done": { + "fg": "#777980", + "bg": "#100f0f", + "slant": "italic", + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-todo": { + "fg": "#74932f", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-done": { + "fg": "#8e919a", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-priority": { + "fg": "#a9b2bb", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-tag": { + "fg": "#67809c", + "bg": "#100f0f", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-tag-group": { + "fg": "#67809c", + "bg": "#222223", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-special-keyword": { + "fg": "#777980", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-drawer": { + "fg": "#777980", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-property-value": { + "fg": "#777980", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-checkbox": { + "fg": "#a9b2bb", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-checkbox-statistics-todo": { + "fg": "#e0c266", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-checkbox-statistics-done": { + "fg": "#777980", + "bg": "#100f0f", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-warning": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-link": { + "fg": "#899bb1", + "bg": "#100f0f", + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-footnote": { + "fg": "#788da6", + "bg": "#100f0f", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-date": { + "fg": "#bac1c8", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-sexp-date": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-date-selected": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-target": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-macro": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-cite": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-cite-key": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-block": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-block-begin-line": { + "fg": "#8ea85e", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-block-end-line": { + "fg": "#8ea85e", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-code": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-verbatim": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-inline-src-block": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-quote": { + "fg": "#74932f", + "bg": "#100f0f", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-verse": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-latex-and-related": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-table": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "default" + }, + "org-table-header": { + "fg": "#bac1c8", + "bg": "#424f5e", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-table-row": { + "fg": "#bac1c8", + "bg": "#100f0f", + "inherit": null, + "box": { + "style": "line", + "width": 1, + "color": "#100f0f" + }, + "source": "user" + }, + "org-formula": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-column": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-column-title": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-list-dt": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-meta-line": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "default" + }, + "org-ellipsis": { + "fg": "#606267", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-hide": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-indent": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-archived": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-default": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-dispatcher-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-structure": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-structure-secondary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-structure-filter": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-date": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-date-today": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-date-weekend": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-date-weekend-today": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-current-time": { + "fg": "#eddba7", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-agenda-done": { + "fg": "#8e919a", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-agenda-dimmed-todo-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-calendar-event": { + "fg": "#9ba8bb", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-agenda-calendar-sexp": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-calendar-daterange": { + "fg": null, + "bg": null, + "inherit": null, + "source": "user" + }, + "org-agenda-diary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-clocking": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-column-dateline": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-restriction-lock": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-filter-category": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-filter-effort": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-filter-regexp": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-agenda-filter-tags": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-scheduled": { + "fg": "#788da6", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-scheduled-today": { + "fg": "#788da6", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-scheduled-previously": { + "fg": "#cb7b64", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-upcoming-deadline": { + "fg": "#cb7b64", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-upcoming-distant-deadline": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-imminent-deadline": { + "fg": "#cb8b7a", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-time-grid": { + "fg": "#ab8d2e", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-clock-overlay": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-mode-line-clock": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + }, + "org-mode-line-clock-overrun": { + "fg": null, + "bg": null, + "inherit": null, + "source": "cleared" + } + }, + "magit": { + "magit-section-heading": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-section-secondary-heading": { + "fg": "#998162", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-section-heading-selection": { + "fg": "#dab53d", + "bg": "#264364", + "inherit": null, + "source": "default" + }, + "magit-section-highlight": { + "fg": null, + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "magit-section-child-count": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-added": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-added-highlight": { + "fg": "#5d9b86", + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "magit-diff-removed": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-removed-highlight": { + "fg": "#cb6b4d", + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "magit-diff-context": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-context-highlight": { + "fg": "#a9b2bb", + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "magit-diff-file-heading": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-diff-file-heading-highlight": { + "fg": "#e4eaf8", + "bg": "#1a1714", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-diff-file-heading-selection": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-heading": { + "fg": "#838d97", + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-heading-highlight": { + "fg": "#e4eaf8", + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-heading-selection": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-hunk-region": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-lines-heading": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-lines-boundary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-base": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-base-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-our": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-our-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-their": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-their-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-conflict-heading": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-conflict-heading-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-revision-summary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-revision-summary-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diff-whitespace-warning": { + "fg": null, + "bg": "#cb6b4d", + "inherit": null, + "source": "default" + }, + "magit-diffstat-added": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-diffstat-removed": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-branch-current": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-branch-local": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-branch-remote": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-branch-remote-head": { + "fg": "#5d9b86", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-branch-upstream": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-branch-warning": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-head": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-tag": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-hash": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-filename": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-dimmed": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-keyword": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-keyword-squash": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-refname": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-refname-stash": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-refname-wip": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-refname-pullreq": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-log-author": { + "fg": "#998162", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-log-date": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-log-graph": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-header-line": { + "fg": "#e4eaf8", + "bg": "#2f343a", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-header-line-key": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-header-line-log-select": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-process-ok": { + "fg": "#5d9b86", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-process-ng": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-mode-line-process": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-mode-line-process-error": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-bisect-good": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-bisect-bad": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-bisect-skip": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-heading": { + "fg": "#838d97", + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "magit-blame-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-hash": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-name": { + "fg": "#998162", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-date": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-summary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-dimmed": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-blame-margin": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-cherry-equivalent": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-cherry-unmatched": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-signature-good": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-signature-bad": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "magit-signature-untrusted": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-signature-expired": { + "fg": "#998162", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-signature-expired-key": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-signature-revoked": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-signature-error": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-commit": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-amend": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-merge": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-checkout": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-reset": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-rebase": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-cherry-pick": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-remote": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-reflog-other": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-pick": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-stop": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-part": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-head": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-drop": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-done": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-onto": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-sequence-exec": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-left-margin": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-comment-action": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-comment-branch-local": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-comment-branch-remote": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-comment-detached": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-comment-file": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-comment-heading": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-keyword": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-nonempty-second-line": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-overlong-summary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-summary": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-trailer-token": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "git-commit-trailer-value": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "elfeed": { + "elfeed-search-date-face": { + "fg": "#74932f", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "elfeed-search-title-face": { + "fg": "#7c838a", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "elfeed-search-unread-title-face": { + "fg": "#e6ce88", + "bg": null, + "inherit": null, + "source": "user" + }, + "elfeed-search-feed-face": { + "fg": "#9f80c9", + "bg": null, + "inherit": null, + "source": "user" + }, + "elfeed-search-tag-face": { + "fg": "#899bb1", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "elfeed-search-unread-count-face": { + "fg": "#ab8d2e", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "elfeed-search-filter-face": { + "fg": "#ab8d2e", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "elfeed-search-last-update-face": { + "fg": "#ab8d2e", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "elfeed-log-date-face": { + "fg": "#74932f", + "bg": null, + "inherit": null, + "source": "user" + }, + "elfeed-log-error-level-face": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "elfeed-log-warn-level-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "elfeed-log-info-level-face": { + "fg": "#74932f", + "bg": null, + "inherit": null, + "source": "user" + }, + "elfeed-log-debug-level-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "mu4e": { + "mu4e-title-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-context-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "mu4e-modeline-face": { + "fg": "#8e919a", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-ok-face": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-warning-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-header-title-face": { + "fg": "#67809c", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-header-key-face": { + "fg": "#67809c", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "mu4e-header-value-face": { + "fg": "#67809c", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-header-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-header-highlight-face": { + "fg": null, + "bg": "#363638", + "inherit": "mu4e-header-face", + "source": "user" + }, + "mu4e-header-marks-face": { + "fg": "#67809c", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "mu4e-unread-face": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-flagged-face": { + "fg": "#dab53d", + "bg": null, + "inherit": "mu4e-header-highlight-face", + "source": "user" + }, + "mu4e-replied-face": { + "fg": "#67809c", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "mu4e-forwarded-face": { + "fg": "#67809c", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "mu4e-draft-face": { + "fg": "#9f80c9", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "mu4e-trashed-face": { + "fg": "#7c838a", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "mu4e-related-face": { + "fg": "#8e919a", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "mu4e-contact-face": { + "fg": "#e6ce88", + "bg": null, + "inherit": "fixed-pitch", + "source": "user" + }, + "mu4e-special-header-value-face": { + "fg": "#cbd0d6", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-url-number-face": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "mu4e-link-face": { + "fg": "#0000ee", + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "user" + }, + "mu4e-footer-face": { + "fg": "#8e919a", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-region-code": { + "fg": "#9f80c9", + "bg": null, + "inherit": null, + "source": "user" + }, + "mu4e-system-face": { + "fg": "#cb6b4d", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "mu4e-highlight-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "mu4e-compose-separator-face": { + "fg": "#100f0f", + "bg": "#546c20", + "weight": "bold", + "inherit": null, + "source": "user" + } + }, + "gnus": { + "gnus-header-name": { + "fg": "#8e919a", + "bg": null, + "inherit": null, + "source": "user" + }, + "gnus-header-from": { + "fg": "#74932f", + "bg": null, + "inherit": null, + "source": "user" + }, + "gnus-header-subject": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "gnus-header-content": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "user" + }, + "gnus-header-newsgroups": { + "fg": "#8e919a", + "bg": null, + "inherit": null, + "source": "user" + }, + "gnus-cite-1": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-2": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-3": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-4": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-5": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-6": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-7": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-8": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-9": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-10": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-11": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-cite-attribution": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-signature": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-button": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-emphasis-bold": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-emphasis-italic": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-emphasis-underline": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-emphasis-strikethru": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "gnus-emphasis-highlight-words": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "org-faces": { + "org-faces-todo": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-project": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-doing": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-waiting": { + "fg": "#899bb1", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-verify": { + "fg": "#9ba8bb", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-stalled": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-delegated": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-faces-failed": { + "fg": "#777980", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-faces-done": { + "fg": "#777980", + "bg": "#100f0f", + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-faces-cancelled": { + "fg": "#777980", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-faces-priority-a": { + "fg": "#e6ce88", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-priority-b": { + "fg": "#dab53d", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-priority-c": { + "fg": "#ab8d2e", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-priority-d": { + "fg": "#7e671f", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-todo-dim": { + "fg": "#546c20", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-project-dim": { + "fg": "#546c20", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-doing-dim": { + "fg": "#546c20", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-waiting-dim": { + "fg": "#788da6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-verify-dim": { + "fg": "#788da6", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-stalled-dim": { + "fg": "#7e671f", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-delegated-dim": { + "fg": "#546c20", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "org-faces-failed-dim": { + "fg": "#4a4b4f", + "bg": "#100f0f", + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-faces-done-dim": { + "fg": "#4a4b4f", + "bg": "#100f0f", + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-faces-cancelled-dim": { + "fg": "#4a4b4f", + "bg": "#100f0f", + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "org-faces-priority-a-dim": { + "fg": "#ab8d2e", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-priority-b-dim": { + "fg": "#7e671f", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-priority-c-dim": { + "fg": "#544412", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "org-faces-priority-d-dim": { + "fg": "#544412", + "bg": "#100f0f", + "weight": "bold", + "inherit": null, + "source": "user" + } + }, + "ghostel": { + "ghostel-default": { + "fg": "#edeff1", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-fake-cursor": { + "fg": "#100f0f", + "bg": "#a9b2bb", + "inherit": null, + "source": "user" + }, + "ghostel-fake-cursor-box": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-black": { + "fg": "#8e919a", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-red": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-green": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-yellow": { + "fg": "#ab8d2e", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-blue": { + "fg": "#899bb1", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-magenta": { + "fg": "#9f80c9", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-cyan": { + "fg": "#0096b0", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-white": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-black": { + "fg": "#bfc4d0", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-red": { + "fg": "#cb8b7a", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-bright-green": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-bright-yellow": { + "fg": "#e6ce88", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-blue": { + "fg": "#adb6c6", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-bright-magenta": { + "fg": "#bea9dc", + "bg": null, + "inherit": null, + "source": "default" + }, + "ghostel-color-bright-cyan": { + "fg": "#6ba9bd", + "bg": null, + "inherit": null, + "source": "user" + }, + "ghostel-color-bright-white": { + "fg": "#edeff1", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "ansi-color": { + "ansi-color-black": { + "fg": "#100f0f", + "bg": "#bfc4d0", + "inherit": null, + "source": "user" + }, + "ansi-color-red": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + }, + "ansi-color-green": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "ansi-color-yellow": { + "fg": "#e0c266", + "bg": null, + "inherit": null, + "source": "user" + }, + "ansi-color-blue": { + "fg": "#899bb1", + "bg": null, + "inherit": null, + "source": "user" + }, + "ansi-color-magenta": { + "fg": "#9f80c9", + "bg": null, + "inherit": null, + "source": "user" + }, + "ansi-color-cyan": { + "fg": "#47a0b7", + "bg": null, + "inherit": null, + "source": "user" + }, + "ansi-color-white": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "ansi-color-bright-black": { + "fg": "#363638", + "bg": null, + "weight": "bold", + "inherit": "ansi-color-black", + "source": "user" + }, + "ansi-color-bright-red": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-red", + "source": "user" + }, + "ansi-color-bright-green": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-green", + "source": "user" + }, + "ansi-color-bright-yellow": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-yellow", + "source": "user" + }, + "ansi-color-bright-blue": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-blue", + "source": "user" + }, + "ansi-color-bright-magenta": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-bright-magenta", + "source": "user" + }, + "ansi-color-bright-cyan": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-cyan", + "source": "user" + }, + "ansi-color-bright-white": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "ansi-color-bright-white", + "source": "user" + } + }, + "auto-dim-other-buffers": { + "auto-dim-other-buffers": { + "fg": "#777980", + "bg": null, + "inherit": null, + "source": "user" + }, + "auto-dim-other-buffers-hide": { + "fg": "#0a0c0d", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "dashboard": { + "dashboard-banner-logo-title": { + "fg": "#dab53d", + "bg": "#100f0f", + "weight": "bold", + "slant": "italic", + "inherit": "default", + "height": 1.25, + "source": "user" + }, + "dashboard-text-banner": { + "fg": "#dab53d", + "bg": null, + "inherit": "default", + "source": "user" + }, + "dashboard-heading": { + "fg": "#67809c", + "bg": "#100f0f", + "weight": "bold", + "slant": "italic", + "inherit": "font-lock-keyword-face", + "source": "user" + }, + "dashboard-items-face": { + "fg": null, + "bg": null, + "inherit": "widget-button", + "source": "user" + }, + "dashboard-navigator": { + "fg": "#a9b2bb", + "bg": "#100f0f", + "slant": "italic", + "inherit": "font-lock-keyword-face", + "source": "user" + }, + "dashboard-no-items-face": { + "fg": null, + "bg": null, + "inherit": "widget-button", + "source": "user" + }, + "dashboard-footer-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-doc-face", + "source": "default" + }, + "dashboard-footer-icon-face": { + "fg": null, + "bg": null, + "inherit": "dashboard-footer-face", + "source": "default" + } + }, + "lsp-mode": { + "lsp-signature-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "lsp-signature-highlight-function-argument": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "lsp-signature-posframe": { + "fg": null, + "bg": null, + "inherit": null, + "source": "user" + }, + "lsp-face-highlight-read": { + "fg": null, + "bg": "#264364", + "inherit": null, + "source": "default" + }, + "lsp-face-highlight-write": { + "fg": null, + "bg": "#3d2f4a", + "inherit": null, + "source": "default" + }, + "lsp-face-highlight-textual": { + "fg": null, + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "lsp-face-rename": { + "fg": null, + "bg": "#2f343a", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "lsp-rename-placeholder-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "lsp-inlay-hint-face": { + "fg": "#777980", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "lsp-inlay-hint-parameter-face": { + "fg": "#8e919a", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "lsp-inlay-hint-type-face": { + "fg": "#5d9b86", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "lsp-details-face": { + "fg": "#5e6770", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "lsp-installation-buffer-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "lsp-installation-finished-buffer-face": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "git-gutter": { + "git-gutter:added": { + "fg": "#74932f", + "bg": "#74932f", + "inherit": null, + "source": "user" + }, + "git-gutter:modified": { + "fg": "#ab8d2e", + "bg": "#ab8d2e", + "inherit": null, + "source": "user" + }, + "git-gutter:deleted": { + "fg": "#cb6b4d", + "bg": "#cb6b4d", + "inherit": null, + "source": "user" + }, + "git-gutter:unchanged": { + "fg": "#a9b2bb", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "git-gutter:separator": { + "fg": "#54677d", + "bg": "#100f0f", + "inherit": null, + "source": "user" + } + }, + "flycheck": { + "flycheck-error": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-warning": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-info": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-fringe-error": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-fringe-warning": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-fringe-info": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-delimited-error": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-delimiter": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-error": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-warning": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-info": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-error-message": { + "fg": "#cdced1", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-checker-name": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-column-number": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-line-number": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-filename": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-id": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "flycheck-error-list-id-with-explainer": { + "fg": "#838d97", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "flycheck-error-list-highlight": { + "fg": null, + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "flycheck-verify-select-checker": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "dired": { + "dired-header": { + "fg": "#54677d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "dired-directory": { + "fg": "#67809c", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "dired-symlink": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "dired-broken-symlink": { + "fg": "#cb7b64", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "dired-special": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "user" + }, + "dired-set-id": { + "fg": "#cb7b64", + "bg": null, + "inherit": null, + "source": "user" + }, + "dired-perm-write": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "dired-mark": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dired-marked": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dired-flagged": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "dired-ignored": { + "fg": "#777980", + "bg": null, + "inherit": null, + "source": "user" + }, + "dired-warning": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + } + }, + "dirvish": { + "dirvish-inactive": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-free-space": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-hl-line": { + "fg": null, + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "dirvish-hl-line-inactive": { + "fg": null, + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "dirvish-file-modes": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-link-number": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-user-id": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-group-id": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-size": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-time": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-inode-number": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-file-device-number": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-subtree-guide": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-subtree-state": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-collapse-dir-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-collapse-empty-dir-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-collapse-file-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-emerge-group-title": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-media-info-heading": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-media-info-property-key": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-0": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-1": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-2": { + "fg": "#2ba178", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-narrow-match-face-3": { + "fg": "#6624a0", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-narrow-split": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-proc-running": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-proc-finished": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-proc-failed": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-git-commit-message-face": { + "fg": "#998162", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "dirvish-vc-added-state": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-edited-state": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-removed-state": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-conflict-state": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "dirvish-vc-locked-state": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-missing-state": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-needs-merge-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-needs-update-state": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "dirvish-vc-unregistered-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "calibredb": { + "calibredb-search-header-library-name-face": { + "fg": "#bfc4d0", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "calibredb-search-header-library-path-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-search-header-total-face": { + "fg": "#74932f", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-search-header-filter-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "calibredb-search-header-sort-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-search-header-highlight-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "calibredb-id-face": { + "fg": "#606267", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-title-face": { + "fg": "#cbd0d6", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "calibredb-author-face": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-format-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-size-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-tag-face": { + "fg": "#788da6", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-date-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-mark-face": { + "fg": "#e6ce88", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "calibredb-series-face": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-publisher-face": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-pubdate-face": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-language-face": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-comment-face": { + "fg": "#bac1c8", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "calibredb-archive-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-favorite-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "calibredb-file-face": { + "fg": "#ab8d2e", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-ids-face": { + "fg": "#7c838a", + "bg": null, + "inherit": null, + "source": "user" + }, + "calibredb-highlight-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "calibredb-current-page-button-face": { + "fg": "#bfc4d0", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "calibredb-mouse-face": { + "fg": null, + "bg": "#363638", + "inherit": null, + "source": "user" + }, + "calibredb-title-detailed-view-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "calibredb-edit-annotation-header-title-face": { + "fg": "#bfc4d0", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + } + }, + "erc": { + "erc-header-line": { + "fg": "#e4eaf8", + "bg": "#2f343a", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-timestamp-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-notice-face": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-default-face": { + "fg": "#cdced1", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-current-nick-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-my-nick-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-my-nick-prefix-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-nick-default-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-nick-prefix-face": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-button-nick-default-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-nick-msg-face": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-direct-msg-face": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-action-face": { + "fg": "#5d9b86", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "erc-keyword-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-pal-face": { + "fg": "#2ba178", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-fool-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-dangerous-host-face": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-error-face": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-input-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-prompt-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-command-indicator-face": { + "fg": "#838d97", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-information": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-button": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-bold-face": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "erc-italic-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "erc-underline-face": { + "fg": "#a9b2bb", + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "default" + }, + "erc-inverse-face": { + "fg": "#100f0f", + "bg": "#a9b2bb", + "inherit": null, + "source": "default" + }, + "erc-spoiler-face": { + "fg": "#100f0f", + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "erc-fill-wrap-merge-indicator-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-keep-place-indicator-arrow": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "erc-keep-place-indicator-line": { + "fg": null, + "bg": "#1a1714", + "inherit": null, + "source": "default" + } + }, + "org-drill": { + "org-drill-hidden-cloze-face": { + "fg": "#100f0f", + "bg": "#67809c", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-drill-visible-cloze-face": { + "fg": "#e0c266", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "org-drill-visible-cloze-hint-face": { + "fg": "#788da6", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + } + }, + "org-noter": { + "org-noter-notes-exist-face": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "org-noter-no-notes-exist-face": { + "fg": "#606267", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "signel": { + "signel-timestamp-face": { + "fg": "#899bb1", + "bg": null, + "inherit": null, + "source": "user" + }, + "signel-my-msg-face": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "signel-other-msg-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "user" + }, + "signel-error-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "pearl": { + "pearl-preamble-summary": { + "fg": "#67809c", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "pearl-editable-comment": { + "fg": "#dce0e3", + "bg": "#374712", + "inherit": null, + "source": "user" + }, + "pearl-readonly-comment": { + "fg": "#edeff1", + "bg": "#424f5e", + "inherit": null, + "source": "user" + }, + "pearl-modified-highlight": { + "fg": "#dab53d", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "pearl-modified-local": { + "fg": "#dab53d", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "pearl-modified-unknown": { + "fg": "#dab53d", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + } + }, + "slack": { + "slack-room-info-title-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-room-info-title-room-name-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-room-info-section-title-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-room-info-section-label-face": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-room-unread-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-message-output-header": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-message-output-text": { + "fg": "#cdced1", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-message-output-reaction": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-message-output-reaction-pressed": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-message-deleted-face": { + "fg": "#5e6770", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "slack-new-message-marker-face": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-all-thread-buffer-thread-header-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-message-mention-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-message-mention-me-face": { + "fg": "#dab53d", + "bg": "#264364", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-message-mention-keyword-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-channel-button-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-bold-face": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-italic-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-code-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-code-block-face": { + "fg": "#cb6b4d", + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-strike-face": { + "fg": "#5e6770", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-blockquote-face": { + "fg": "#a9b2bb", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "slack-mrkdwn-list-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-attachment-header": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-attachment-footer": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-attachment-pad": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-attachment-field-title": { + "fg": "#838d97", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-message-attachment-preview-header-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-preview-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-block-highlight-source-overlay-face": { + "fg": null, + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "slack-message-action-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-message-action-primary-face": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-message-action-danger-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-button-block-element-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-button-primary-block-element-face": { + "fg": "#5d9b86", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-button-danger-block-element-face": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-select-block-element-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-overflow-block-element-face": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-date-picker-block-element-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-dialog-title-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-dialog-element-label-face": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-dialog-element-hint-face": { + "fg": "#5e6770", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "slack-dialog-element-placeholder-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-dialog-element-error-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-dialog-submit-button-face": { + "fg": "#5d9b86", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-dialog-cancel-button-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-dialog-select-element-input-face": { + "fg": "#a9b2bb", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-user-active-face": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-user-dnd-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-user-profile-header-face": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-user-profile-property-name-face": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-profile-image-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-search-result-message-header-face": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-search-result-message-username-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-modeline-has-unreads-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "slack-modeline-channel-has-unreads-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "slack-modeline-thread-has-unreads-face": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "telega": { + "telega-root-heading": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-tracking": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-unread-unmuted-modeline": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-username": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-user-online-status": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-user-non-online-status": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-secret-title": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-contact-birthdays-today": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-muted-count": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-unmuted-count": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-mention-count": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-has-chatbuf-brackets": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-delim-face": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-shadow": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-link": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-blue": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-red": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-msg-heading": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-msg-user-title": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-msg-self-title": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-msg-deleted": { + "fg": "#5e6770", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "telega-msg-sponsored": { + "fg": "#5e6770", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "telega-msg-inline-reply": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-msg-inline-forward": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-msg-inline-other": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-bold": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-entity-type-italic": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "telega-entity-type-underline": { + "fg": "#a9b2bb", + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "default" + }, + "telega-entity-type-strikethrough": { + "fg": "#5e6770", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "default" + }, + "telega-entity-type-code": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-pre": { + "fg": "#cb6b4d", + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "telega-entity-type-blockquote": { + "fg": "#a9b2bb", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "telega-entity-type-mention": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-hashtag": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-cashtag": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-botcommand": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-texturl": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-entity-type-spoiler": { + "fg": "#2f343a", + "bg": "#2f343a", + "inherit": null, + "source": "default" + }, + "telega-reaction": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-reaction-chosen": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-reaction-paid": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-reaction-paid-chosen": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-highlight-text-face": { + "fg": "#100f0f", + "bg": "#dab53d", + "inherit": null, + "source": "default" + }, + "telega-button-highlight": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-chat-prompt": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-chat-prompt-aux": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-chat-input-attachment": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-topic-button": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-filter-active": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-filter-button-active": { + "fg": "#100f0f", + "bg": "#dab53d", + "inherit": null, + "source": "default" + }, + "telega-filter-button-inactive": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-checklist-stats-done": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-checklist-stats-todo": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button-active": { + "fg": "#100f0f", + "bg": "#e4eaf8", + "inherit": null, + "source": "default" + }, + "telega-box-button-default-active": { + "fg": "#100f0f", + "bg": "#a9b2bb", + "inherit": null, + "source": "default" + }, + "telega-box-button-default-passive": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button-primary-active": { + "fg": "#100f0f", + "bg": "#e4eaf8", + "inherit": null, + "source": "default" + }, + "telega-box-button-primary-passive": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button-success-active": { + "fg": "#100f0f", + "bg": "#2ba178", + "inherit": null, + "source": "default" + }, + "telega-box-button-success-passive": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button-danger-active": { + "fg": "#100f0f", + "bg": "#cb6b4d", + "inherit": null, + "source": "default" + }, + "telega-box-button-danger-passive": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button-ui-active": { + "fg": "#100f0f", + "bg": "#dab53d", + "inherit": null, + "source": "default" + }, + "telega-box-button-ui-passive": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button2-active": { + "fg": "#100f0f", + "bg": "#e4eaf8", + "inherit": null, + "source": "default" + }, + "telega-box-button2-passive": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-box-button2-white-foreground": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-describe-item-title": { + "fg": "#838d97", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-describe-section-title": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-describe-subsection-title": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-enckey-00": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-enckey-01": { + "fg": "#5d9b86", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-enckey-10": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-enckey-11": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-blue": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-green": { + "fg": "#2ba178", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-orange": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-palette-builtin-purple": { + "fg": "#6624a0", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-webpage-title": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-webpage-subtitle": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-webpage-header": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "telega-webpage-subheader": { + "fg": "#dab53d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-webpage-outline": { + "fg": "#5e6770", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-webpage-fixed": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-webpage-preformatted": { + "fg": "#cb6b4d", + "bg": "#1a1714", + "inherit": null, + "source": "default" + }, + "telega-webpage-marked": { + "fg": "#100f0f", + "bg": "#dab53d", + "inherit": null, + "source": "default" + }, + "telega-webpage-strike-through": { + "fg": "#5e6770", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "default" + }, + "telega-webpage-chat-link": { + "fg": "#e4eaf8", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-link-preview-sitename": { + "fg": "#838d97", + "bg": null, + "inherit": null, + "source": "default" + }, + "telega-link-preview-title": { + "fg": "#e4eaf8", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + } + }, + "shr": { + "shr-h1": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "height": 1.4, + "source": "default" + }, + "shr-h2": { + "fg": "#bfc4d0", + "bg": null, + "weight": "bold", + "inherit": null, + "height": 1.2, + "source": "user" + }, + "shr-h3": { + "fg": "#a6aab4", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "shr-h4": { + "fg": "#8e919a", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "shr-h5": { + "fg": "#777980", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "shr-h6": { + "fg": "#606267", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "shr-text": { + "fg": "#bfc4d0", + "bg": null, + "inherit": null, + "source": "user" + }, + "shr-link": { + "fg": "#5f8bf9", + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "user" + }, + "shr-selected-link": { + "fg": "#777980", + "bg": null, + "weight": "bold", + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "user" + }, + "shr-code": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + }, + "shr-mark": { + "fg": "#100f0f", + "bg": "#dab53d", + "inherit": null, + "source": "default" + }, + "shr-strike-through": { + "fg": "#8e919a", + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "shr-sup": { + "fg": "#a6aab4", + "bg": null, + "inherit": null, + "source": "user" + }, + "shr-abbreviation": { + "fg": "#a6aab4", + "bg": null, + "slant": "italic", + "inherit": null, + "source": "user" + }, + "shr-sliced-image": { + "fg": "#a6aab4", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "2048-game": { + "twentyfortyeight-face-1024": { + "fg": "#a9be87", + "bg": null, + "inherit": null, + "source": "user" + }, + "twentyfortyeight-face-128": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-16": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-2": { + "fg": "#100f0f", + "bg": null, + "inherit": null, + "source": "user" + }, + "twentyfortyeight-face-2048": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "twentyfortyeight-face-256": { + "fg": "#47a0b7", + "bg": null, + "inherit": null, + "source": "user" + }, + "twentyfortyeight-face-32": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-4": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "twentyfortyeight-face-512": { + "fg": "#9f80c9", + "bg": null, + "inherit": null, + "source": "user" + }, + "twentyfortyeight-face-64": { + "fg": null, + "bg": null, + "inherit": null, + "source": "user" + }, + "twentyfortyeight-face-8": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "alert": { + "alert-high-face": { + "fg": "#dab53d", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "alert-low-face": { + "fg": "#7ba1c5", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "alert-moderate-face": { + "fg": "#a9be87", + "bg": null, + "inherit": null, + "source": "user" + }, + "alert-normal-face": { + "fg": "#bac1c8", + "bg": null, + "inherit": null, + "source": "user" + }, + "alert-trivial-face": { + "fg": "#9f80c9", + "bg": null, + "inherit": null, + "source": "user" + }, + "alert-urgent-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "all-the-icons": { + "all-the-icons-blue": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-blue-alt": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-cyan": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-cyan-alt": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dblue": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dcyan": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dgreen": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dmaroon": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dorange": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dpink": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dpurple": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dred": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dsilver": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-dyellow": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-green": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lblue": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lcyan": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lgreen": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lmaroon": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lorange": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lpink": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lpurple": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lred": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lsilver": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-lyellow": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-maroon": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-orange": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-pink": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-purple": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-purple-alt": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-red": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-red-alt": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-silver": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "all-the-icons-yellow": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "company": { + "company-echo": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "company-echo-common": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "company-preview": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "inherit": [ + "company-tooltip-selection", + "company-tooltip" + ], + "source": "user" + }, + "company-preview-common": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "inherit": "company-tooltip-common-selection", + "source": "user" + }, + "company-preview-search": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "inherit": "company-tooltip-common-selection", + "source": "user" + }, + "company-tooltip": { + "fg": "#100f0f", + "bg": "#bfc4d0", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "company-tooltip-annotation": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "company-tooltip-annotation-selection": { + "fg": null, + "bg": "#100f0f", + "inherit": "company-tooltip-annotation", + "source": "user" + }, + "company-tooltip-common": { + "fg": "#cb6b4d", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "company-tooltip-common-selection": { + "fg": null, + "bg": "#100f0f", + "inherit": "company-tooltip-common", + "source": "user" + }, + "company-tooltip-deprecated": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "strike": { + "color": null + }, + "inherit": null, + "source": "user" + }, + "company-tooltip-mouse": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "inherit": "highlight", + "source": "user" + }, + "company-tooltip-quick-access": { + "fg": null, + "bg": "#100f0f", + "inherit": "company-tooltip-annotation", + "source": "user" + }, + "company-tooltip-quick-access-selection": { + "fg": null, + "bg": "#100f0f", + "inherit": "company-tooltip-annotation-selection", + "source": "user" + }, + "company-tooltip-scrollbar-thumb": { + "fg": "#100f0f", + "bg": "#cb6b4d", + "weight": "bold", + "inherit": null, + "source": "user" + }, + "company-tooltip-scrollbar-track": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "inherit": null, + "source": "user" + }, + "company-tooltip-search": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "inherit": "highlight", + "source": "user" + }, + "company-tooltip-search-selection": { + "fg": "#bfc4d0", + "bg": "#100f0f", + "inherit": "highlight", + "source": "user" + }, + "company-tooltip-selection": { + "fg": "#100f0f", + "bg": "#67809c", + "weight": "bold", + "inherit": null, + "source": "user" + } + }, + "company-box": { + "company-box-annotation": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "company-box-background": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "company-box-candidate": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "company-box-numbers": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "company-box-scrollbar": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "company-box-selection": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "consult": { + "consult-async-failed": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-async-finished": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-async-running": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-async-split": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-bookmark": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-buffer": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-file": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-grep-context": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-help": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-highlight-mark": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-highlight-match": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-key": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-line-number": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-line-number-prefix": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-line-number-wrapped": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-narrow-indicator": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-preview-insertion": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-preview-line": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-preview-match": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "consult-separator": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "embark": { + "embark-collect-annotation": { + "fg": null, + "bg": null, + "inherit": "completions-annotations", + "source": "default" + }, + "embark-collect-candidate": { + "fg": null, + "bg": null, + "inherit": "default", + "source": "default" + }, + "embark-collect-group-separator": { + "fg": null, + "bg": null, + "strike": { + "color": null + }, + "inherit": "shadow", + "source": "default" + }, + "embark-collect-group-title": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": "shadow", + "source": "default" + }, + "embark-keybinding": { + "fg": null, + "bg": null, + "inherit": "success", + "source": "default" + }, + "embark-keybinding-repeat": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "embark-keymap": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "embark-selected": { + "fg": null, + "bg": null, + "inherit": "match", + "source": "default" + }, + "embark-target": { + "fg": null, + "bg": null, + "inherit": "highlight", + "source": "default" + }, + "embark-verbose-indicator-documentation": { + "fg": null, + "bg": null, + "inherit": "completions-annotations", + "source": "default" + }, + "embark-verbose-indicator-shadowed": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "embark-verbose-indicator-title": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": null, + "height": 1.1, + "source": "default" + } + }, + "emms": { + "emms-browser-album-face": { + "fg": "#8ea85e", + "bg": null, + "inherit": null, + "source": "user" + }, + "emms-browser-albumartist-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "emms-browser-artist-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "emms-browser-composer-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "emms-browser-performer-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "emms-browser-track-face": { + "fg": "#788da6", + "bg": null, + "inherit": null, + "source": "user" + }, + "emms-browser-year/genre-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "emms-metaplaylist-mode-current-face": { + "fg": "#cb8b7a", + "bg": null, + "inherit": null, + "source": "user" + }, + "emms-metaplaylist-mode-face": { + "fg": "#cb6b4d", + "bg": null, + "inherit": null, + "source": "user" + }, + "emms-playlist-selected-face": { + "fg": "#e6ce88", + "bg": null, + "weight": "bold", + "inherit": null, + "source": "user" + }, + "emms-playlist-track-face": { + "fg": "#cbd0d6", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "flyspell-correct": { + "flyspell-correct-highlight-face": { + "fg": null, + "bg": "#363638", + "inherit": "isearch", + "source": "user" + } + }, + "highlight-indent-guides": { + "highlight-indent-guides-character-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-even-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-odd-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-stack-character-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-stack-even-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-stack-odd-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-top-character-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-top-even-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "highlight-indent-guides-top-odd-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "hl-todo": { + "hl-todo": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "hl-todo-flymake-type": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "json-mode": { + "json-mode-object-name-face": { + "fg": "#e0c266", + "bg": null, + "inherit": null, + "source": "user" + } + }, + "llama": { + "llama-##-macro": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "llama-deleted-argument": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "llama-llama-macro": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "llama-mandatory-argument": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "llama-optional-argument": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "lv": { + "lv-separator": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "magit-section": { + "magit-left-margin": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-section-child-count": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-section-heading": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-section-heading-selection": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-section-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "magit-section-secondary-heading": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "malyon": { + "malyon-face-bold": { + "fg": "#788da6", + "bg": null, + "weight": "bold", + "inherit": "bold", + "source": "user" + }, + "malyon-face-error": { + "fg": "#cb6b4d", + "bg": null, + "weight": "bold", + "inherit": "error", + "source": "user" + }, + "malyon-face-italic": { + "fg": "#67809c", + "bg": null, + "slant": "italic", + "inherit": "italic", + "source": "user" + }, + "malyon-face-plain": { + "fg": null, + "bg": null, + "inherit": "default", + "source": "default" + }, + "malyon-face-reverse": { + "fg": "#100f0f", + "bg": "#bfc4d0", + "inherit": "default", + "source": "user" + } + }, + "marginalia": { + "marginalia-archive": { + "fg": null, + "bg": null, + "inherit": "warning", + "source": "default" + }, + "marginalia-char": { + "fg": null, + "bg": null, + "inherit": "marginalia-key", + "source": "default" + }, + "marginalia-date": { + "fg": null, + "bg": null, + "inherit": "marginalia-key", + "source": "default" + }, + "marginalia-documentation": { + "fg": null, + "bg": null, + "inherit": "completions-annotations", + "source": "default" + }, + "marginalia-file-name": { + "fg": null, + "bg": null, + "inherit": "marginalia-documentation", + "source": "default" + }, + "marginalia-file-owner": { + "fg": null, + "bg": null, + "inherit": "font-lock-preprocessor-face", + "source": "default" + }, + "marginalia-file-priv-dir": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "marginalia-file-priv-exec": { + "fg": null, + "bg": null, + "inherit": "font-lock-function-name-face", + "source": "default" + }, + "marginalia-file-priv-link": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "marginalia-file-priv-no": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "marginalia-file-priv-other": { + "fg": null, + "bg": null, + "inherit": "font-lock-constant-face", + "source": "default" + }, + "marginalia-file-priv-rare": { + "fg": null, + "bg": null, + "inherit": "font-lock-variable-name-face", + "source": "default" + }, + "marginalia-file-priv-read": { + "fg": null, + "bg": null, + "inherit": "font-lock-type-face", + "source": "default" + }, + "marginalia-file-priv-write": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "marginalia-function": { + "fg": null, + "bg": null, + "inherit": "font-lock-function-name-face", + "source": "default" + }, + "marginalia-installed": { + "fg": null, + "bg": null, + "inherit": "success", + "source": "default" + }, + "marginalia-key": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "marginalia-lighter": { + "fg": null, + "bg": null, + "inherit": "marginalia-size", + "source": "default" + }, + "marginalia-list": { + "fg": null, + "bg": null, + "inherit": "font-lock-constant-face", + "source": "default" + }, + "marginalia-mode": { + "fg": null, + "bg": null, + "inherit": "marginalia-key", + "source": "default" + }, + "marginalia-modified": { + "fg": null, + "bg": null, + "inherit": "font-lock-negation-char-face", + "source": "default" + }, + "marginalia-null": { + "fg": null, + "bg": null, + "inherit": "font-lock-comment-face", + "source": "default" + }, + "marginalia-number": { + "fg": null, + "bg": null, + "inherit": "font-lock-constant-face", + "source": "default" + }, + "marginalia-off": { + "fg": null, + "bg": null, + "inherit": "error", + "source": "default" + }, + "marginalia-on": { + "fg": null, + "bg": null, + "inherit": "success", + "source": "default" + }, + "marginalia-size": { + "fg": null, + "bg": null, + "inherit": "marginalia-number", + "source": "default" + }, + "marginalia-string": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "marginalia-symbol": { + "fg": null, + "bg": null, + "inherit": "font-lock-type-face", + "source": "default" + }, + "marginalia-true": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "marginalia-type": { + "fg": null, + "bg": null, + "inherit": "marginalia-key", + "source": "default" + }, + "marginalia-value": { + "fg": null, + "bg": null, + "inherit": "marginalia-key", + "source": "default" + }, + "marginalia-version": { + "fg": null, + "bg": null, + "inherit": "marginalia-number", + "source": "default" + } + }, + "markdown-mode": { + "markdown-blockquote-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-doc-face", + "source": "default" + }, + "markdown-bold-face": { + "fg": null, + "bg": null, + "inherit": "bold", + "source": "default" + }, + "markdown-code-face": { + "fg": null, + "bg": null, + "inherit": "fixed-pitch", + "source": "default" + }, + "markdown-comment-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-comment-face", + "source": "default" + }, + "markdown-footnote-marker-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-footnote-text-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-comment-face", + "source": "default" + }, + "markdown-gfm-checkbox-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "markdown-header-delimiter-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-header-face": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": [ + "font-lock-function-name-face" + ], + "source": "default" + }, + "markdown-header-face-1": { + "fg": null, + "bg": null, + "inherit": "markdown-header-face", + "source": "default" + }, + "markdown-header-face-2": { + "fg": null, + "bg": null, + "inherit": "markdown-header-face", + "source": "default" + }, + "markdown-header-face-3": { + "fg": null, + "bg": null, + "inherit": "markdown-header-face", + "source": "default" + }, + "markdown-header-face-4": { + "fg": null, + "bg": null, + "inherit": "markdown-header-face", + "source": "default" + }, + "markdown-header-face-5": { + "fg": null, + "bg": null, + "inherit": "markdown-header-face", + "source": "default" + }, + "markdown-header-face-6": { + "fg": null, + "bg": null, + "inherit": "markdown-header-face", + "source": "default" + }, + "markdown-header-rule-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-highlight-face": { + "fg": null, + "bg": null, + "inherit": "highlight", + "source": "default" + }, + "markdown-highlighting-face": { + "fg": "#100f0f", + "bg": "#e6ce88", + "inherit": null, + "source": "user" + }, + "markdown-hr-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-html-attr-name-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-variable-name-face", + "source": "default" + }, + "markdown-html-attr-value-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "markdown-html-entity-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-variable-name-face", + "source": "default" + }, + "markdown-html-tag-delimiter-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-html-tag-name-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-type-face", + "source": "default" + }, + "markdown-inline-code-face": { + "fg": null, + "bg": null, + "inherit": [ + "markdown-code-face", + "font-lock-constant-face" + ], + "source": "default" + }, + "markdown-italic-face": { + "fg": null, + "bg": null, + "inherit": "italic", + "source": "default" + }, + "markdown-language-info-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "markdown-language-keyword-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-type-face", + "source": "default" + }, + "markdown-line-break-face": { + "fg": null, + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": "font-lock-constant-face", + "source": "default" + }, + "markdown-link-face": { + "fg": null, + "bg": null, + "inherit": "link", + "source": "default" + }, + "markdown-link-title-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-comment-face", + "source": "default" + }, + "markdown-list-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-markup-face": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "markdown-math-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "markdown-metadata-key-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-variable-name-face", + "source": "default" + }, + "markdown-metadata-value-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "markdown-missing-link-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-warning-face", + "source": "default" + }, + "markdown-plain-url-face": { + "fg": null, + "bg": null, + "inherit": "markdown-link-face", + "source": "default" + }, + "markdown-pre-face": { + "fg": null, + "bg": null, + "inherit": [ + "markdown-code-face", + "font-lock-constant-face" + ], + "source": "default" + }, + "markdown-reference-face": { + "fg": null, + "bg": null, + "inherit": "markdown-markup-face", + "source": "default" + }, + "markdown-strike-through-face": { + "fg": null, + "bg": null, + "strike": { + "color": null + }, + "inherit": null, + "source": "default" + }, + "markdown-table-face": { + "fg": null, + "bg": null, + "inherit": [ + "markdown-code-face" + ], + "source": "default" + }, + "markdown-url-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + } + }, + "nerd-icons": { + "nerd-icons-blue": { + "fg": "#6a9fb5", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-blue-alt": { + "fg": "#2188b6", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-cyan": { + "fg": "#75b5aa", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-cyan-alt": { + "fg": "#0595bd", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dblue": { + "fg": "#446674", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dcyan": { + "fg": "#48746d", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dgreen": { + "fg": "#6d8143", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dmaroon": { + "fg": "#72584b", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dorange": { + "fg": "#915b2d", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dpink": { + "fg": "#7e5d5f", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dpurple": { + "fg": "#694863", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dred": { + "fg": "#843031", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dsilver": { + "fg": "#838484", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-dyellow": { + "fg": "#b48d56", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-green": { + "fg": "#90a959", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lblue": { + "fg": "#677174", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lcyan": { + "fg": "#2c7d6e", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lgreen": { + "fg": "#3d6837", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lmaroon": { + "fg": "#ce7a4e", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lorange": { + "fg": "#ffa500", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lpink": { + "fg": "#ff505b", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lpurple": { + "fg": "#e69dd6", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lred": { + "fg": "#eb595a", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lsilver": { + "fg": "#7f7869", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-lyellow": { + "fg": "#ff9300", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-maroon": { + "fg": "#8f5536", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-orange": { + "fg": "#d4843e", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-pink": { + "fg": "#fc505b", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-purple": { + "fg": "#68295b", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-purple-alt": { + "fg": "#5d54e1", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-red": { + "fg": "#ac4142", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-red-alt": { + "fg": "#843031", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-silver": { + "fg": "#716e68", + "bg": null, + "inherit": null, + "source": "default" + }, + "nerd-icons-yellow": { + "fg": "#ffcc0e", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "nerd-icons-completion": { + "nerd-icons-completion-dir-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "orderless": { + "orderless-match-face-0": { + "fg": "#cbd0d6", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "orderless-match-face-1": { + "fg": "#c99990", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "orderless-match-face-2": { + "fg": "#c5d4ae", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + }, + "orderless-match-face-3": { + "fg": "#bea9dc", + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "user" + } + }, + "org-roam": { + "org-roam-dailies-calendar-note": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-dim": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-header-line": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-olp": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-preview-heading": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-preview-heading-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-preview-heading-selection": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-preview-region": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-roam-title": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "org-superstar": { + "org-superstar-first": { + "fg": null, + "bg": null, + "inherit": "org-warning", + "source": "default" + }, + "org-superstar-header-bullet": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "org-superstar-item": { + "fg": null, + "bg": null, + "inherit": "default", + "source": "default" + }, + "org-superstar-leading": { + "fg": "#bebebe", + "bg": null, + "inherit": "default", + "source": "default" + } + }, + "prescient": { + "prescient-primary-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "prescient-secondary-highlight": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + } + }, + "rainbow-delimiters": { + "rainbow-delimiters-base-error-face": { + "fg": "#cb8b7a", + "bg": null, + "inherit": "rainbow-delimiters-base-face", + "source": "user" + }, + "rainbow-delimiters-base-face": { + "fg": "#cbd0d6", + "bg": null, + "inherit": "unspecified", + "source": "user" + }, + "rainbow-delimiters-depth-1-face": { + "fg": "#9f80c9", + "bg": null, + "inherit": "rainbow-delimiters-base-face", + "source": "user" + }, + "rainbow-delimiters-depth-2-face": { + "fg": "#788da6", + "bg": null, + "inherit": "rainbow-delimiters-base-face", + "source": "user" + }, + "rainbow-delimiters-depth-3-face": { + "fg": "#a9be87", + "bg": null, + "inherit": "rainbow-delimiters-base-face", + "source": "user" + }, + "rainbow-delimiters-depth-4-face": { + "fg": "#e0c266", + "bg": null, + "inherit": "rainbow-delimiters-base-face", + "source": "user" + }, + "rainbow-delimiters-depth-5-face": { + "fg": "#0096b0", + "bg": null, + "inherit": "rainbow-delimiters-base-face", + "source": "user" + }, + "rainbow-delimiters-depth-6-face": { + "fg": null, + "bg": null, + "inherit": "rainbow-delimiters-depth-1-face", + "source": "user" + }, + "rainbow-delimiters-depth-7-face": { + "fg": null, + "bg": null, + "inherit": "rainbow-delimiters-depth-2-face", + "source": "user" + }, + "rainbow-delimiters-depth-8-face": { + "fg": null, + "bg": null, + "inherit": "rainbow-delimiters-depth-3-face", + "source": "user" + }, + "rainbow-delimiters-depth-9-face": { + "fg": null, + "bg": null, + "inherit": "rainbow-delimiters-depth-4-face", + "source": "user" + }, + "rainbow-delimiters-mismatched-face": { + "fg": null, + "bg": null, + "inherit": "rainbow-delimiters-base-error-face", + "source": "user" + }, + "rainbow-delimiters-unmatched-face": { + "fg": null, + "bg": null, + "inherit": "rainbow-delimiters-base-error-face", + "source": "user" + } + }, + "symbol-overlay": { + "symbol-overlay-default-face": { + "fg": null, + "bg": null, + "inherit": "highlight", + "source": "default" + }, + "symbol-overlay-face-1": { + "fg": "#000000", + "bg": "#1e90ff", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-2": { + "fg": "#000000", + "bg": "#ff69b4", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-3": { + "fg": "#000000", + "bg": "#ffff00", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-4": { + "fg": "#000000", + "bg": "#da70d6", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-5": { + "fg": "#000000", + "bg": "#ff0000", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-6": { + "fg": "#000000", + "bg": "#fa8072", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-7": { + "fg": "#000000", + "bg": "#00ff7f", + "inherit": null, + "source": "default" + }, + "symbol-overlay-face-8": { + "fg": "#000000", + "bg": "#40e0d0", + "inherit": null, + "source": "default" + } + }, + "tmr": { + "tmr-description": { + "fg": null, + "bg": null, + "inherit": "bold", + "source": "default" + }, + "tmr-duration": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "tmr-end-time": { + "fg": null, + "bg": null, + "inherit": "error", + "source": "default" + }, + "tmr-finished": { + "fg": null, + "bg": null, + "inherit": "error", + "source": "default" + }, + "tmr-is-acknowledged": { + "fg": null, + "bg": null, + "inherit": "success", + "source": "default" + }, + "tmr-must-be-acknowledged": { + "fg": null, + "bg": null, + "inherit": "warning", + "source": "default" + }, + "tmr-start-time": { + "fg": null, + "bg": null, + "inherit": "success", + "source": "default" + }, + "tmr-tabulated-acknowledgement": { + "fg": null, + "bg": null, + "inherit": "bold", + "source": "default" + }, + "tmr-tabulated-description": { + "fg": null, + "bg": null, + "inherit": "font-lock-doc-face", + "source": "default" + }, + "tmr-tabulated-end-time": { + "fg": "#800040", + "bg": null, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-remaining-time": { + "fg": "#603f00", + "bg": null, + "inherit": null, + "source": "default" + }, + "tmr-tabulated-start-time": { + "fg": "#004476", + "bg": null, + "inherit": null, + "source": "default" + } + }, + "transient": { + "transient-active-infix": { + "fg": null, + "bg": null, + "inherit": "highlight", + "source": "default" + }, + "transient-argument": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "font-lock-string-face", + "source": "default" + }, + "transient-delimiter": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "transient-disabled-suffix": { + "fg": "#000000", + "bg": "#ff0000", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "transient-enabled-suffix": { + "fg": "#000000", + "bg": "#00ff00", + "weight": "bold", + "inherit": null, + "source": "default" + }, + "transient-heading": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "transient-higher-level": { + "fg": null, + "bg": null, + "inherit": null, + "box": { + "style": "line", + "width": 1, + "color": "grey60" + }, + "source": "default" + }, + "transient-inactive-argument": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "transient-inactive-value": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "transient-inapt-argument": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "shadow", + "source": "default" + }, + "transient-inapt-suffix": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": "shadow", + "source": "default" + }, + "transient-key": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "transient-key-exit": { + "fg": "#aa2222", + "bg": null, + "inherit": "transient-key", + "source": "default" + }, + "transient-key-noop": { + "fg": "#cccccc", + "bg": null, + "inherit": "transient-key", + "source": "default" + }, + "transient-key-recurse": { + "fg": "#2266ff", + "bg": null, + "inherit": "transient-key", + "source": "default" + }, + "transient-key-return": { + "fg": "#aaaa11", + "bg": null, + "inherit": "transient-key", + "source": "default" + }, + "transient-key-stack": { + "fg": "#dd4488", + "bg": null, + "inherit": "transient-key", + "source": "default" + }, + "transient-key-stay": { + "fg": "#22aa22", + "bg": null, + "inherit": "transient-key", + "source": "default" + }, + "transient-mismatched-key": { + "fg": null, + "bg": null, + "inherit": null, + "box": { + "style": "line", + "width": 1, + "color": "#ff00ff" + }, + "source": "default" + }, + "transient-nonstandard-key": { + "fg": null, + "bg": null, + "inherit": null, + "box": { + "style": "line", + "width": 1, + "color": "#00ffff" + }, + "source": "default" + }, + "transient-unreachable": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + }, + "transient-unreachable-key": { + "fg": null, + "bg": null, + "inherit": [ + "shadow", + "transient-key" + ], + "source": "default" + }, + "transient-value": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "font-lock-string-face", + "source": "default" + } + }, + "vertico": { + "vertico-current": { + "fg": null, + "bg": null, + "inherit": "highlight", + "source": "default" + }, + "vertico-group-separator": { + "fg": null, + "bg": null, + "strike": { + "color": null + }, + "inherit": "vertico-group-title", + "source": "default" + }, + "vertico-group-title": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": "shadow", + "source": "default" + }, + "vertico-multiline": { + "fg": null, + "bg": null, + "inherit": "shadow", + "source": "default" + } + }, + "web-mode": { + "web-mode-annotation-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-comment-face", + "source": "default" + }, + "web-mode-annotation-html-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": "web-mode-annotation-face", + "source": "default" + }, + "web-mode-annotation-tag-face": { + "fg": null, + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": "web-mode-annotation-face", + "source": "default" + }, + "web-mode-annotation-type-face": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": "web-mode-annotation-face", + "source": "default" + }, + "web-mode-annotation-value-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": "web-mode-annotation-face", + "source": "default" + }, + "web-mode-block-attr-name-face": { + "fg": "#8fbc8f", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-block-attr-value-face": { + "fg": "#5f9ea0", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-block-comment-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-comment-face", + "source": "default" + }, + "web-mode-block-control-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-preprocessor-face", + "source": "default" + }, + "web-mode-block-delimiter-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-preprocessor-face", + "source": "default" + }, + "web-mode-block-face": { + "fg": null, + "bg": "#ffffe0", + "inherit": null, + "source": "default" + }, + "web-mode-block-string-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-bold-face": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "web-mode-builtin-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "web-mode-comment-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-comment-face", + "source": "default" + }, + "web-mode-comment-keyword-face": { + "fg": null, + "bg": null, + "weight": "bold", + "inherit": null, + "source": "default" + }, + "web-mode-constant-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-constant-face", + "source": "default" + }, + "web-mode-css-at-rule-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-constant-face", + "source": "default" + }, + "web-mode-css-color-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "web-mode-css-comment-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-comment-face", + "source": "default" + }, + "web-mode-css-function-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "web-mode-css-priority-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "web-mode-css-property-name-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-variable-name-face", + "source": "default" + }, + "web-mode-css-pseudo-class-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-builtin-face", + "source": "default" + }, + "web-mode-css-selector-class-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "web-mode-css-selector-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "web-mode-css-selector-tag-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "web-mode-css-string-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-css-variable-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": "web-mode-variable-name-face", + "source": "default" + }, + "web-mode-current-column-highlight-face": { + "fg": null, + "bg": "#3e3c36", + "inherit": null, + "source": "default" + }, + "web-mode-current-element-highlight-face": { + "fg": "#ffffff", + "bg": "#000000", + "inherit": null, + "source": "default" + }, + "web-mode-doctype-face": { + "fg": "#bebebe", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-error-face": { + "fg": null, + "bg": "#ff0000", + "inherit": null, + "source": "default" + }, + "web-mode-filter-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-function-name-face", + "source": "default" + }, + "web-mode-folded-face": { + "fg": null, + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "default" + }, + "web-mode-function-call-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-function-name-face", + "source": "default" + }, + "web-mode-function-name-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-function-name-face", + "source": "default" + }, + "web-mode-html-attr-custom-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-html-attr-name-face", + "source": "default" + }, + "web-mode-html-attr-engine-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-block-delimiter-face", + "source": "default" + }, + "web-mode-html-attr-equal-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-html-attr-name-face", + "source": "default" + }, + "web-mode-html-attr-name-face": { + "fg": "#8b8989", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-html-attr-value-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "web-mode-html-entity-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-bracket-face": { + "fg": "#242424", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-custom-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-html-tag-face", + "source": "default" + }, + "web-mode-html-tag-face": { + "fg": "#8b8989", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-html-tag-namespaced-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-block-control-face", + "source": "default" + }, + "web-mode-html-tag-unclosed-face": { + "fg": null, + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": "web-mode-html-tag-face", + "source": "default" + }, + "web-mode-inlay-face": { + "fg": null, + "bg": "#ffffe0", + "inherit": null, + "source": "default" + }, + "web-mode-interpolate-color1-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-interpolate-color2-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-interpolate-color3-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-interpolate-color4-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-italic-face": { + "fg": null, + "bg": null, + "slant": "italic", + "inherit": null, + "source": "default" + }, + "web-mode-javascript-comment-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-comment-face", + "source": "default" + }, + "web-mode-javascript-string-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-json-comment-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-comment-face", + "source": "default" + }, + "web-mode-json-context-face": { + "fg": "#cd69c9", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-json-key-face": { + "fg": "#dda0dd", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-json-string-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-jsx-depth-1-face": { + "fg": null, + "bg": "#000053", + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-2-face": { + "fg": null, + "bg": "#001970", + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-3-face": { + "fg": null, + "bg": "#002984", + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-4-face": { + "fg": null, + "bg": "#49599a", + "inherit": null, + "source": "default" + }, + "web-mode-jsx-depth-5-face": { + "fg": null, + "bg": "#9499b7", + "inherit": null, + "source": "default" + }, + "web-mode-keyword-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-keyword-face", + "source": "default" + }, + "web-mode-param-name-face": { + "fg": "#cdc9c9", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-part-comment-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-comment-face", + "source": "default" + }, + "web-mode-part-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-block-face", + "source": "default" + }, + "web-mode-part-string-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-string-face", + "source": "default" + }, + "web-mode-preprocessor-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-preprocessor-face", + "source": "default" + }, + "web-mode-script-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-part-face", + "source": "default" + }, + "web-mode-sql-keyword-face": { + "fg": null, + "bg": null, + "weight": "bold", + "slant": "italic", + "inherit": null, + "source": "default" + }, + "web-mode-string-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-string-face", + "source": "default" + }, + "web-mode-style-face": { + "fg": null, + "bg": null, + "inherit": "web-mode-part-face", + "source": "default" + }, + "web-mode-symbol-face": { + "fg": "#eeb422", + "bg": null, + "inherit": null, + "source": "default" + }, + "web-mode-type-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-type-face", + "source": "default" + }, + "web-mode-underline-face": { + "fg": null, + "bg": null, + "underline": { + "style": "line", + "color": null + }, + "inherit": null, + "source": "default" + }, + "web-mode-variable-name-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-variable-name-face", + "source": "default" + }, + "web-mode-warning-face": { + "fg": null, + "bg": null, + "inherit": "font-lock-warning-face", + "source": "default" + }, + "web-mode-whitespace-face": { + "fg": null, + "bg": "#68228b", + "inherit": null, + "source": "default" + } + }, + "yasnippet": { + "yas--field-debug-face": { + "fg": null, + "bg": null, + "inherit": null, + "source": "default" + }, + "yas-field-highlight-face": { + "fg": null, + "bg": null, + "inherit": "region", + "source": "default" + } + } + } +}
\ No newline at end of file diff --git a/scripts/theme-studio/app-core.js b/scripts/theme-studio/app-core.js index 74b441b96..f02191c67 100644 --- a/scripts/theme-studio/app-core.js +++ b/scripts/theme-studio/app-core.js @@ -9,22 +9,108 @@ // where normHex (app-util.js) and the colormath helpers are already present from // the bodies inlined above this one. import { normHex } from './app-util.js'; -import { oklch2hex, srgb2oklab, oklab2oklch, oklab2lrgb, lrgb2hex, inGamut, contrast } from './colormath.js'; +import { oklch2hex, srgb2oklab, oklab2lrgb, lrgb2hex, inGamut, contrast, oklchOf, isPureEndpointHex, reliefColors } from './colormath.js'; // Resolve a palette name (or a raw #hex) to a hex; null when the name is unknown. function nameToHex(n,palette){if(!n)return null;if(/^#/.test(n))return n;const p=palette.find(p=>p[1]===n);return p?p[0]:null;} +// Convert a face dict's legacy boolean style fields to the new shape: bold -> +// weight "bold", italic -> slant "italic", underline true -> {style:line,color}, +// strike true -> {color}. An explicit weight/slant already set wins over the +// legacy flag. Faces already in the new shape pass through, so this is safe on +// any input. Mirrors migrate_legacy in face_specs.py; keep the two in step. +function migrateLegacyFace(d){ + const out=Object.assign({},d||{}); + if('bold' in out){const b=out.bold;delete out.bold;if(b&&out.weight==null)out.weight='bold';} + if('italic' in out){const i=out.italic;delete out.italic;if(i&&out.slant==null)out.slant='italic';} + if('underline' in out){if(out.underline===true)out.underline={style:'line',color:null};else if(out.underline===false)out.underline=null;} + if('strike' in out){if(out.strike===true)out.strike={color:null};else if(out.strike===false)out.strike=null;} + return out; +} + +// --- face CSS rendering ------------------------------------------------------ +// Pure builders for the face preview/inline CSS strings. app.js's syntaxStyle / +// uiCss / ofs / udeco wrappers differ only in how they resolve fg/bg and whether +// they add a font-size; they all delegate here. cssWeight maps the curated weight +// names to numeric CSS weights; faceDecoration is the underline/strike value. +function cssWeight(w){const M={light:300,normal:400,medium:500,semibold:600,bold:700,heavy:900};return w&&M[w]!=null?M[w]:'normal';} +function faceDecoration(face){return ((face.underline?'underline ':'')+(face.strike?'line-through':'')).trim()||'none';} +// A face's :box, rendered as an inset box-shadow (no layout shift). Returns the +// box-shadow VALUE (or '' for no box). 'line' is a flat border in the box color +// (or the face's own color when unset); 'released'/'pressed' are the 3D button +// styles Emacs draws, derived from explicit box color when set, otherwise BG so +// they read on any color (reliefColors is ported from xterm.c). +function boxCss(b,bg){if(!b||!b.style)return '';const w=b.width||1; + if(b.style==='released'||b.style==='pressed'){ + const r=(b.color||bg)?reliefColors(b.color||bg):{hl:null,sh:null}; + const hl=r.hl||'#ffffff33',sh=r.sh||'#00000066'; + const [a,z]=b.style==='released'?[hl,sh]:[sh,hl]; + return `inset ${w}px ${w}px 0 ${a},inset -${w}px -${w}px 0 ${z}`;} + return `inset 0 0 0 ${w}px ${b.color||'currentColor'}`;} +// CSS declaration string for FACE with already-resolved FG/BG. opts: noBg +// (never emit background), fontSize (em number for height), boxBg (background +// handed to the relief shading). Declaration order matches the strings the four +// callers previously assembled by hand, so the rendered output is unchanged. +function faceCss(face,fg,bg,opts){ + opts=opts||{}; + const parts=['color:'+fg]; + if(bg&&!opts.noBg)parts.push('background:'+bg); + parts.push('font-weight:'+cssWeight(face.weight), + 'font-style:'+(face.slant||'normal'), + 'text-decoration:'+faceDecoration(face)); + if(opts.fontSize!=null)parts.push('font-size:'+opts.fontSize+'em'); + const bx=boxCss(face.box,opts.boxBg); + if(bx)parts.push('box-shadow:'+bx); + return parts.join(';'); +} + +// Single source of truth for the per-face attribute model. One row per +// attribute drives both normalizePkgFace (defaulting + palette resolution) and +// packagesForExport (which attrs serialize and when). Adding a face attribute +// is one row here, not an edit in four hand-kept lists. +// def : value when unset +// resolve : fg/bg/distant-fg run through the palette name->hex resolver +// coerce : 'bool' -> !!v ; 'height' -> v||1 ; default -> v ?? def +// emit : export rule -- 'always' | 'truthy' | 'non-one' | 'bool' +// A hoisted function rather than a const: the inlined page calls normalizePkgFace +// at top level (seedPkgmap) before this point in source order, and a const would +// be in its temporal dead zone there; a function declaration is hoisted. +function faceAttrs(){return [ + {k:'fg', def:null, resolve:true, emit:'always'}, + {k:'bg', def:null, resolve:true, emit:'always'}, + {k:'distant-fg', def:null, resolve:true, emit:'truthy'}, + {k:'family', def:null, emit:'truthy'}, + {k:'weight', def:null, emit:'truthy'}, + {k:'slant', def:null, emit:'truthy'}, + {k:'underline', def:null, emit:'truthy'}, + {k:'strike', def:null, emit:'truthy'}, + {k:'overline', def:null, emit:'truthy'}, + {k:'inherit', def:null, emit:'always'}, + {k:'height', def:1, coerce:'height', emit:'non-one'}, + {k:'box', def:null, emit:'truthy'}, + {k:'inverse', def:false, coerce:'bool', emit:'bool'}, + {k:'extend', def:false, coerce:'bool', emit:'bool'}, +];} + function normalizePkgFace(d,source,palette){ - d=d||{}; + d=migrateLegacyFace(d||{}); const resolve=(v)=>palette?nameToHex(v,palette):v; - return {fg:resolve(d.fg)??null,bg:resolve(d.bg)??null,bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit??null,height:d.height||1,box:d.box??null,source:source||d.source||'user'}; + const out={}; + for(const a of faceAttrs()){ + let v=a.resolve?resolve(d[a.k]):d[a.k]; + out[a.k]=a.coerce==='bool'?!!v:a.coerce==='height'?(v||1):(v??a.def); + } + out.source=source||d.source||'user'; + return out; } + // Seed the package-face map from the app inventory's per-face defaults. function buildPkgmap(apps,palette){const m={};for(const app in apps){m[app]={};for(const row of apps[app].faces){m[app][row[0]]=normalizePkgFace(row[2],'default',palette);}}return m;} // The package faces worth exporting (anything seeded or user-touched), trimmed. -function packagesForExport(map){const out={};for(const app in map){const faces={};for(const face in map[app]){const f=map[app][face];if(f.source==='default'||f.source==='user'||f.source==='cleared'){const o={fg:f.fg,bg:f.bg,bold:f.bold,italic:f.italic,underline:!!f.underline,strike:!!f.strike,inherit:f.inherit,source:f.source};if(f.height&&f.height!==1)o.height=f.height;if(f.box)o.box=f.box;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;} +// Driven by FACE_ATTRS: each attribute's `emit` rule decides whether it lands. +function packagesForExport(map){const out={};for(const app in map){const faces={};for(const face in map[app]){const f=map[app][face];if(f.source==='default'||f.source==='user'||f.source==='cleared'){const o={};for(const a of faceAttrs()){const v=f[a.k];if(a.emit==='always')o[a.k]=v;else if(a.emit==='truthy'){if(v)o[a.k]=v;}else if(a.emit==='non-one'){if(v&&v!==1)o[a.k]=v;}else if(a.emit==='bool'){if(v)o[a.k]=true;}}o.source=f.source;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;} // Merge an imported package block into a face map, filling missing fields. function mergePackagesInto(map,pkgs){if(!pkgs)return;for(const app in pkgs){if(!map[app])map[app]={};for(const face in pkgs[app]){const f=pkgs[app][face]||{};map[app][face]=normalizePkgFace(f,f.source||'user');}}} @@ -46,16 +132,16 @@ const SYNTAX_INHERIT={cmd:'cm',doc:'str',prop:'var',fnc:'fnd'}; // theme's default foreground (the chain's floor). `dec` (decorator) is pinned to // `ty`: Emacs has no decorator face and renders decorators with // font-lock-type-face, so a dec color set in the studio would never reach Emacs. +// Walk an inherit chain from START, returning the first truthy valueFn(key) or +// null. nextFn(key) gives the parent key; a seen-set guards against a cycle. +function walkInheritChain(start,nextFn,valueFn){ + let k=start;const seen={}; + while(k&&!seen[k]){seen[k]=1;const v=valueFn(k);if(v)return v;k=nextFn(k);} + return null; +} function resolveSyntaxFg(cat,syntax,defaultFg){ - let k=(cat==='dec')?'ty':cat; - const seen={}; - while(k&&!seen[k]){ - seen[k]=1; - const fg=syntax[k]&&syntax[k].fg; - if(fg)return fg; - k=SYNTAX_INHERIT[k]; - } - return defaultFg; + const start=(cat==='dec')?'ty':cat; + return walkInheritChain(start,k=>SYNTAX_INHERIT[k],k=>syntax[k]&&syntax[k].fg)||defaultFg; } // Emacs built-in inherit chains for the ui faces whose parent is also a studio ui @@ -67,26 +153,7 @@ const UI_INHERIT={'mode-line-inactive':'mode-line','line-number-current-line':'l // nothing up the chain is set. The caller applies its own floor (default fg, // ground, or transparent), since that floor differs per attribute and face. function resolveUiAttr(face,attr,uimap){ - let f=face; - const seen={}; - while(f&&!seen[f]){ - seen[f]=1; - const v=uimap[f]&&uimap[f][attr]; - if(v)return v; - f=UI_INHERIT[f]; - } - return null; -} - -// Text color for a swatch-dropdown popup row. A row showing a real palette color -// sits on the popup's own fixed background, so its name/hex text must inherit the -// popup foreground (return '' to use the CSS color). Coloring it for contrast -// against the swatch instead picks near-black text for a mid/dark swatch, which -// is unreadable on the dark popup. Only the "default" row, filled solid with -// SHOWN, uses a contrast color computed against that fill. -function dropdownRowTextColor(hex,shown,textOnFn){ - if(hex)return ''; - return shown?textOnFn(shown):''; + return walkInheritChain(face,f=>UI_INHERIT[f],f=>uimap[f]&&uimap[f][attr]); } // Turn a theme name into a safe filename slug: collapse runs of disallowed @@ -154,9 +221,7 @@ function lMax(hue,chroma,fgSet,target){ // the editable truth; these pure functions group it, regenerate a ramp, and plan // assignment re-point across a regenerate. -function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} function isReservedGroundLikeName(name){return /^(bg|fg)(?:[-_+].+|\d.*)$/i.test(name||'');} -function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';} function interpOklabHex(a,b,t,offset){ const lab={L:a.L+(b.L-a.L)*t,a:a.a+(b.a-a.a)*t,b:a.b+(b.b-a.b)*t}; const lrgb=oklab2lrgb(lab.L,lab.a,lab.b); @@ -436,11 +501,58 @@ function faceBoxNonDefaults(cur,def){ return { fg: !eq(cur.fg,def.fg), bg: !eq(cur.bg,def.bg), - style: ['bold','italic','underline','strike'].some(a=>!!cur[a]!==!!def[a]), + style: ['weight','slant','strike'].some(a=>JSON.stringify(cur[a]??null)!==JSON.stringify(def[a]??null)), inherit: !eq(cur.inherit,def.inherit), height: (cur.height||1)!==(def.height||1), box: JSON.stringify(cur.box??null)!==JSON.stringify(def.box??null), }; } -export { nameToHex, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, dropdownRowTextColor, paletteOptionList, galleryModel, appViewKeysSorted, faceBoxNonDefaults, stepViewIndex, spanNeighborHex, slugify, fgSetFor, floor, lMax, COVERED_FACES, columnsFromPalette, usedPaletteHexes, paletteUsages, regenColumn, rankByLightness, stepRepointPlan, sortColumns, sortColumnMembers, groundRoleOfEntry, groundColumnMembersFromPalette, clearPalettePlan, deletePaletteColumnPlan, areAllLocked, lockToggleLabel, toggleLockSet }; +// True when the per-row expander hides at least one attribute that differs from +// the face's default, so the collapsed toggle can flag it. Covers exactly the +// attributes the expander holds: distant-fg, family, underline, overline, +// inverse, extend, and (for ui/syntax) inherit + height. The in-row controls +// (fg/bg/weight/slant/strike/box) have their own cell markers and are excluded. +function overflowNonDefault(cur,def,showInheritHeight){ + cur=cur||{}; def=def||{}; + const eq=(a,b)=>JSON.stringify(a??null)===JSON.stringify(b??null); + if(['distant-fg','family','underline','overline'].some(a=>!eq(cur[a],def[a])))return true; + if((!!cur.inverse)!==(!!def.inverse))return true; + if((!!cur.extend)!==(!!def.extend))return true; + if(showInheritHeight){ + if(!eq(cur.inherit,def.inherit))return true; + if((cur.height||1)!==(def.height||1))return true; + } + return false; +} + +// Height bounds for a face :height scaling factor. 0.1 is Emacs's own floor (a +// smaller value errors out) and doubles as the modeline-shrink-to-nothing value; +// 2.0 is the studio's chosen ceiling. The number input's min/max attributes only +// guard its stepper arrows — typed or pasted values bypass them — so every height +// edit is coerced through clampHeight instead. +const HEIGHT_MIN=0.1, HEIGHT_MAX=2.0; +// Coerce a height-field value to either null (unset → inherit the default height) +// or a number clamped into [min,max]. Blank/whitespace/non-numeric → null; any +// number, including 0, a negative, or an over-max value, snaps into range. +function clampHeight(raw,min=HEIGHT_MIN,max=HEIGHT_MAX){ + if(raw===null||raw===undefined)return null; + const s=(''+raw).trim(); + if(s==='')return null; + const n=parseFloat(s); + if(!isFinite(n))return null; + return n<min?min:n>max?max:n; +} + +// Compose an element-hover tooltip: the face's docstring on top, the existing +// hover text (e.g. the bare face name) below it, separated by a blank line. A +// missing doc or base collapses to whichever is present; missing both yields ''. +// Keyed lookups (FACE_DOCS[face], SYNTAX_DOCS[kind]) supply DOC; BASE is +// whatever title the element carried before. +function composeHoverTitle(doc,base){ + doc=doc||''; base=base||''; + if(doc&&base)return doc+'\n\n'+base; + return doc||base; +} + +export { nameToHex, migrateLegacyFace, cssWeight, faceDecoration, boxCss, faceCss, composeHoverTitle, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, paletteOptionList, galleryModel, appViewKeysSorted, faceBoxNonDefaults, overflowNonDefault, clampHeight, HEIGHT_MIN, HEIGHT_MAX, stepViewIndex, spanNeighborHex, slugify, fgSetFor, floor, lMax, COVERED_FACES, columnsFromPalette, usedPaletteHexes, paletteUsages, regenColumn, rankByLightness, stepRepointPlan, sortColumns, sortColumnMembers, groundRoleOfEntry, groundColumnMembersFromPalette, clearPalettePlan, deletePaletteColumnPlan, areAllLocked, lockToggleLabel, toggleLockSet }; diff --git a/scripts/theme-studio/app.js b/scripts/theme-studio/app.js index fea46f227..85570e213 100644 --- a/scripts/theme-studio/app.js +++ b/scripts/theme-studio/app.js @@ -1,10 +1,11 @@ const SAMPLES=SAMPLES_J, CATS=CATS_J, UI_FACES=UIFACES_J, APPS=APPS_J; const COLOR_NAMES=COLOR_NAMES_J; +const FACE_DOCS=FACE_DOCS_J, SYNTAX_DOCS=SYNTAX_DOCS_J; // face/category -> docstring first line, for element hovers let MAP=MAP_J, PALETTE=PALETTE_J, SYNTAX=SYNTAX_J, UIMAP=UIMAP_J; let LOCKED=new Set(LOCKS_J); // rows whose choice is decided (controls disabled, skipped by erase/reset batch actions) const DELTAE_MIN=0.02; // OKLab ΔE below this = colors too close to tell apart (perceptual-metrics spec) const DEFAULT_UIMAP=JSON.parse(JSON.stringify(UIMAP)); -function syntaxBlank(k){return {fg:MAP[k]||null,bg:null,bold:false,italic:false,underline:false,strike:false,box:null};} +function syntaxBlank(k){return {fg:MAP[k]||null,bg:null,'distant-fg':null,family:null,weight:null,slant:null,underline:null,strike:null,overline:null,box:null,inverse:false,extend:false,inherit:null,height:null};} function syncSyntaxCache(k){const s=SYNTAX[k]||syntaxBlank(k);MAP[k]=s.fg||'';} function syncAllSyntaxCache(){CATS.forEach(c=>syncSyntaxCache(c[0]));} function syncSyntaxFromCache(){CATS.forEach(c=>{const k=c[0];syntaxFace(k).fg=MAP[k]||null;});} @@ -46,7 +47,7 @@ function effBg(v){return v||MAP['bg'];} // fg:MAP['p']} repeated across app.js, palette-actions.js, and the browser gates. function groundPair(){return {bg:MAP['bg'],fg:MAP['p']};} function cid(l){return l.replace(/\W/g,'');} -function buildLangSel(){const s=document.getElementById('langsel');s.innerHTML='';for(const lang in SAMPLES){const o=document.createElement('option');o.value=lang;o.textContent=lang;s.appendChild(o);}} +function buildLangSel(){const s=document.getElementById('langsel');s.innerHTML='';for(const lang of Object.keys(SAMPLES).sort((a,b)=>a.localeCompare(b))){const o=document.createElement('option');o.value=lang;o.textContent=lang;s.appendChild(o);}if(SAMPLES['Elisp'])s.value='Elisp';} function renderCode(){ const lang=document.getElementById('langsel').value;let html=''; for(const line of SAMPLES[lang]){ @@ -137,15 +138,155 @@ function mkLockCell(lockKey,els){ else{el.dataset.locked=on?'1':'';el.classList.toggle('locked',on);if(el.syncLocked)el.syncLocked();}});} lk.onclick=()=>{LOCKED.has(lockKey)?LOCKED.delete(lockKey):LOCKED.add(lockKey);paint();updateLockToggles();}; paint();td.appendChild(lk);return td;} -// B/I/U/S style buttons shared by the UI and package tables. isOn(attr) reads the -// current state of an attribute, onToggle(attr) flips it and repaints. Returns -// the button list so the caller appends them and hands them to mkLockCell. -function mkStyleButtons(isOn,onToggle){ - return ['bold','italic','underline','strike'].map(at=>{ - const b=document.createElement('button');b.className='sbtn'+(isOn(at)?' on':'');b.textContent='a'; - b.style.fontWeight=at==='bold'?'bold':'normal';b.style.fontStyle=at==='italic'?'italic':'normal'; - b.style.textDecoration=at==='underline'?'underline':at==='strike'?'line-through':'none';b.title=at; - b.onclick=()=>{onToggle(at);b.classList.toggle('on',!!isOn(at));};return b;});} +// The in-row style controls, shared by the syntax / UI / package tables: a weight +// selector, a slant selector, and box-like underline and strike controls. Each +// edit mutates the face object and calls onChange to repaint. Returns the control +// elements so the caller lays them out and hands them to mkLockCell. +const WEIGHT_OPTS=[['light','light'],['normal','normal'],['medium','medium'],['semibold','semibold'],['bold','bold'],['heavy','heavy']]; +const SLANT_OPTS=[['normal','normal'],['italic','italic'],['oblique','oblique']]; +// A compact custom dropdown for an enum attribute (weight / slant), themed like +// the color dropdown. The trigger shows the current value drawn in its own weight +// or slant; the popup lists each option drawn with the attribute applied, so the +// choice previews itself. opts.styleFor(value) returns the preview style props +// ({fontWeight} / {fontStyle}); opts.placeholder is the unset-state label. +function mkEnumDropdown(options,get,set,opts={}){ + const t=document.createElement('div');t.className='cdd enumdd';t.tabIndex=0; + const styleFor=opts.styleFor||(()=>({})); + const labelOf=v=>{const o=options.find(p=>p[0]===v);return o?o[1]:'';}; + function applyPreview(el,v){el.style.fontWeight='';el.style.fontStyle='';const s=styleFor(v);if(s.fontWeight)el.style.fontWeight=s.fontWeight;if(s.fontStyle)el.style.fontStyle=s.fontStyle;} + function paint(){const v=get()||'';t.dataset.val=v;t.classList.toggle('is-default',!v); + t.textContent=v?labelOf(v):(opts.placeholder||'set');applyPreview(t,v);t.title=opts.title||'';} + paint(); + t.onclick=(e)=>{e.stopPropagation();if(t.dataset.locked==='1')return;if(_ddPop){closeColorDropdown();return;} + const pop=document.createElement('div');pop.className='cddpop enumpop';const cur=get()||''; + const pick=v=>{set(v||null);paint();closeColorDropdown();}; + const def=document.createElement('button');def.type='button'; + def.className='enumopt enumdef'+(cur===''?' sel':'');def.textContent='default'; + def.title='clear — use the default';def.onclick=ev=>{ev.stopPropagation();pick('');};pop.appendChild(def); + for(const [v,label] of options){const b=document.createElement('button');b.type='button'; + b.className='enumopt'+(v===cur?' sel':'');b.textContent=label;applyPreview(b,v); + b.onclick=ev=>{ev.stopPropagation();pick(v);};pop.appendChild(b);} + document.body.appendChild(pop);const r=t.getBoundingClientRect(); + pop.style.left=r.left+'px';pop.style.minWidth=r.width+'px';pop.style.top=(r.bottom+2)+'px'; + const ph=pop.getBoundingClientRect().height; + if(r.bottom+ph>window.innerHeight-6)pop.style.top=Math.max(6,r.top-ph-2)+'px'; + _ddPop=pop;}; + t.setValue=()=>paint();t.syncLocked=()=>paint(); + return t;} +// Underline control: none / line / wave glyph buttons plus a color swatch shown +// while a style is active. Mirrors mkBoxControl; get()/set() read and write the +// underline object ({style,color}) or null. +function mkLineStyleControl(states,get,set,opts={}){const wrap=document.createElement('div');wrap.className='boxctl'; + const cluster=document.createElement('div');cluster.className='boxcluster';const btns={}; + states.forEach(([v,title,glyph])=>{const b=document.createElement('button');b.className='boxbtn';b.dataset.style=v;b.textContent=glyph;b.title=title; + b.onclick=()=>{const cur=get();set(v?(opts.toState?opts.toState(v,cur):Object.assign({color:(cur&&cur.color)||null},opts.styled?{style:v}:{})):null);paint();}; + cluster.appendChild(b);btns[v]=b;}); + const dd=mkColorDropdown(ddList((get()&&get().color)||''),(get()&&get().color)||'',h=>{const cur=get();if(!cur)return;set(Object.assign({},cur,{color:h||null}));paint();},{compact:true,defaultHex:opts.defaultHex}); + function paint(){const cur=get(),active=opts.styled?(cur&&cur.style?cur.style:''):(cur?'on':''); + for(const v in btns)btns[v].classList.toggle('on',v===active); + dd.style.display=active?'':'none';dd.setValue(cur&&cur.color?cur.color:''); + const locked=wrap.dataset.locked==='1';for(const v in btns)btns[v].disabled=locked; + const ddoff=locked||!active;dd.dataset.locked=ddoff?'1':'';dd.classList.toggle('locked',ddoff);if(dd.syncLocked)dd.syncLocked();} + wrap.syncLocked=()=>paint();wrap.append(cluster,dd);paint();return wrap;} +function mkUnderlineControl(get,set,opts={}){ + return mkLineStyleControl([['','no underline',''],['line','underline','_'],['wave','wavy underline','~']],get,set,Object.assign({styled:true},opts));} +function mkStrikeControl(get,set,opts={}){ + return mkLineStyleControl([['','no strike',''],['on','strike-through','S']],get,set,Object.assign({styled:false},opts));} +// In-row style controls: weight + slant selectors and a strike control. The +// underline control lives in the per-row expander (it carries the wave/color +// detail), keeping the row compact. +function mkStyleControls(face,onChange,opts={}){ + const w=mkEnumDropdown(WEIGHT_OPTS,()=>face.weight,v=>{face.weight=v;onChange();},{placeholder:'weight',title:'font weight',styleFor:v=>({fontWeight:cssWeight(v)})}); + const s=mkEnumDropdown(SLANT_OPTS,()=>face.slant,v=>{face.slant=v;onChange();},{placeholder:'slant',title:'font slant',styleFor:v=>({fontStyle:v||'normal'})}); + const k=mkStrikeControl(()=>face.strike,v=>{face.strike=v;onChange();},opts); + return [w,s,k];} +function mkOverlineControl(get,set,opts={}){ + return mkLineStyleControl([['','no overline',''],['on','overline','O']],get,set,Object.assign({styled:false},opts));} +function mkCheck(get,set){const c=document.createElement('input');c.type='checkbox';c.className='detailcheck';c.checked=!!get();c.onchange=()=>set(c.checked);return c;} +// The per-row attribute editor revealed by the expander: distant-fg, family, +// overline, inverse, extend, and (for ui/syntax, where inherit/height have no +// inline column) inherit + height. Each control mutates FACE and calls onChange. +// Returns the element plus the interactive controls so the row's lock cell can +// disable them. opts.inheritOptions and opts.showInheritHeight gate the last two. +// Hover help for each expander field, so the detail labels explain themselves the +// way the table-header labels do. Keyed by the label text passed to add(). +const DETAIL_HOVERS={ + 'distant fg':'foreground swapped in when the text sits on a background too close to its own color to read (Emacs :distant-foreground)', + 'family':'font family for this face; blank inherits the default (Emacs :family)', + 'underline':'underline style and color (Emacs :underline)', + 'overline':'a line drawn above the text (Emacs :overline)', + 'inverse':'swap the foreground and background (Emacs :inverse-video)', + 'extend':'extend the background past the end of the line to the window edge (Emacs :extend)', + 'inherit':'base face this one inherits unset attributes from (Emacs :inherit)', + 'height':'text size as a scaling factor of the inherited height, 0.1 to 2.0 (Emacs :height)' +}; +function mkDetailEditor(face,onChange,opts={}){ + const wrap=document.createElement('div');wrap.className='detailedit';const locks=[]; + const add=(label,el)=>{const g=document.createElement('label');g.className='detailfield';g.title=DETAIL_HOVERS[label]||'';const s=document.createElement('span');s.textContent=label;g.append(s,el);wrap.appendChild(g);locks.push(el);}; + const df=mkColorDropdown(ddList(face['distant-fg']||''),face['distant-fg']||'',h=>{face['distant-fg']=h||null;onChange();},{compact:true,defaultHex:opts.defaultHex}); + add('distant fg',df); + const fam=document.createElement('input');fam.type='text';fam.className='detailinput';fam.placeholder='font family';fam.value=face.family||'';fam.onchange=()=>{face.family=fam.value.trim()||null;onChange();}; + add('family',fam); + add('underline',mkUnderlineControl(()=>face.underline,v=>{face.underline=v;onChange();},opts)); + add('overline',mkOverlineControl(()=>face.overline,v=>{face.overline=v;onChange();},opts)); + add('inverse',mkCheck(()=>face.inverse,v=>{face.inverse=v;onChange();})); + add('extend',mkCheck(()=>face.extend,v=>{face.extend=v;onChange();})); + if(opts.showInheritHeight){ + const isel=document.createElement('select');isel.className='chip detailsel'; + (opts.inheritOptions||['']).forEach(o=>{const op=document.createElement('option');op.value=o;op.textContent=o||'— none —';isel.appendChild(op);}); + isel.value=face.inherit||'';isel.onchange=()=>{face.inherit=isel.value||null;onChange();};add('inherit',isel); + const hin=document.createElement('input');hin.type='number';hin.min=''+HEIGHT_MIN;hin.max=''+HEIGHT_MAX;hin.step='0.05';hin.className='hstep';hin.value=face.height||1;hin.onchange=()=>{const raw=hin.value,h=clampHeight(raw);face.height=h;hin.value=h==null?1:h;if(h!=null&&parseFloat(raw)!==h)notify('height clamped to '+h+' (allowed '+HEIGHT_MIN+'–'+HEIGHT_MAX+')',false);onChange();};add('height',hin); + } + return {el:wrap,locks};} +// Wire a per-row expander: a toggle button plus a hidden detail row (colspan +// across the table) holding mkDetailEditor. The caller drops the button into a +// cell, adds the returned locks to the row's lock cell, and inserts detailRow +// right after the main row. +// Which rows have their detail expanded, keyed by the row's element/face key. +// Held outside the DOM so a table rebuild (a package edit rebuilds the whole +// table) re-opens the rows that were open, instead of collapsing them under the +// user — editing a value in an open expander must not close it. +let EXPANDED=new Set(); +function mkExpander(face,colspan,onChange,opts={}){ + const detail=document.createElement('tr');detail.className='detailrow';detail.style.display='none'; + if(opts.expandKey&&EXPANDED.has(opts.expandKey))detail.style.display=''; + const btn=document.createElement('button');btn.className='exptoggle'; + // The disclosure triangle shows the row's state: ▶ collapsed, ▼ expanded. + const setGlyph=()=>{const open=detail.style.display!=='none';btn.textContent=open?'▼':'▶';btn.classList.toggle('on',open);}; + // Flag the toggle when collapsed and at least one hidden attribute differs from + // the default, so a non-default attribute is never invisible. ndCheck re-runs + // after every edit (for tiers whose onChange does not rebuild the row). + const ndCheck=opts.ndCheck||(()=>false); + const refreshNd=()=>{const nd=ndCheck();btn.classList.toggle('exp-nd',nd);btn.title=nd?'more attributes (some differ from default)':'more attributes';}; + const wrapped=()=>{onChange();refreshNd();}; + const td=document.createElement('td');td.colSpan=colspan;const {el,locks}=mkDetailEditor(face,wrapped,opts);td.appendChild(el);detail.appendChild(td); + btn.onclick=()=>{const willOpen=detail.style.display==='none';detail.style.display=willOpen?'':'none'; + if(opts.expandKey){willOpen?EXPANDED.add(opts.expandKey):EXPANDED.delete(opts.expandKey);} + setGlyph();syncExpandAllBtns();}; + refreshNd();setGlyph(); + return {btn,detail,locks};} +// Expand/collapse every row in a table at once, then sync the per-row triangles. +function setAllExpanded(tableId,expand){ + const tb=document.getElementById(tableId);if(!tb)return; + tb.querySelectorAll('tr.detailrow').forEach(d=>{d.style.display=expand?'':'none';const k=d.dataset.detailFor;if(k){expand?EXPANDED.add(k):EXPANDED.delete(k);}}); + tb.querySelectorAll('.exptoggle').forEach(b=>{b.textContent=expand?'▼':'▶';b.classList.toggle('on',expand);}); +} +// The header-level expand/collapse-all toggle for a table. Its label and triangle +// track the aggregate: any row open -> ▼ collapse all; all closed -> ▶ expand all. +const EXPALL_TABLE={syntaxexpandall:'legbody',uiexpandall:'uibody',pkgexpandall:'pkgbody'}; +function syncExpandAllBtns(){ + for(const id in EXPALL_TABLE){const btn=document.getElementById(id);const tb=document.getElementById(EXPALL_TABLE[id]);if(!btn||!tb)continue; + const anyOpen=[...tb.querySelectorAll('tr.detailrow')].some(d=>d.style.display!=='none'); + btn.textContent=anyOpen?'▼ collapse all':'▶ expand all';} +} +function toggleAllExpanded(id){ + const tableId=EXPALL_TABLE[id],tb=document.getElementById(tableId);if(!tb)return; + const anyOpen=[...tb.querySelectorAll('tr.detailrow')].some(d=>d.style.display!=='none'); + setAllExpanded(tableId,!anyOpen);syncExpandAllBtns(); +} +// Column count for a table's detail-row colspan, read from its header so the +// expander never hardcodes a width that drifts when a column is added. +function tableColCount(tableId){const h=document.querySelector('#'+tableId+' thead tr');return h?h.cells.length:1;} // Apply a batch action to every editable row in a tier. keyFn maps a row entry to // its lock key, or null to skip the row entirely (syntax bg and the default fg); // resetFn does the actual clearing. Locked rows are left untouched. @@ -170,7 +311,7 @@ function updateLockToggle(tier){ const ids={syntax:'syntaxlocktoggle',ui:'uilocktoggle',pkg:'pkglocktoggle'},b=document.getElementById(ids[tier]);if(!b)return; b.textContent=lockToggleLabel(tierLockKeys(tier),LOCKED); } -function updateLockToggles(){updateLockToggle('syntax');updateLockToggle('ui');updateLockToggle('pkg');} +function updateLockToggles(){updateLockToggle('syntax');updateLockToggle('ui');updateLockToggle('pkg');updateViewLockIndicators();} function toggleAllLocks(tier){ const all=areAllLocked(tierLockKeys(tier),LOCKED); LOCKED=toggleLockSet(tierLockKeys(tier),LOCKED); @@ -209,22 +350,25 @@ function buildTable(){ const crTd=document.createElement('td');crTd.style.whiteSpace='nowrap';crTd.style.fontSize='10pt'; function rowFg(){return kind==='bg'?MAP['p']:effFg(syntaxFace(kind).fg);} function rowBg(){return syntaxFace(kind).bg||MAP['bg'];} - function styleEx(){const s=syntaxFace(kind);exTd.style.color=rowFg();exTd.style.background=rowBg();exTd.style.fontWeight=s.bold?'bold':'normal';exTd.style.fontStyle=s.italic?'italic':'normal';exTd.style.textDecoration=(s.underline?'underline ':'')+(s.strike?'line-through':'')||'none';exTd.style.boxShadow=boxCss(s.box,rowBg());} + function styleEx(){const s=syntaxFace(kind);exTd.style.color=rowFg();exTd.style.background=rowBg();exTd.style.fontWeight=cssWeight(s.weight);exTd.style.fontStyle=s.slant||'normal';exTd.style.textDecoration=(s.underline?'underline ':'')+(s.strike?'line-through':'')||'none';exTd.style.boxShadow=boxCss(s.box,rowBg());} function styleCr(){const r=contrast(rowFg(),rowBg());crTd.innerHTML=crHtml(r);} const dd=mkColorDropdown(list,cur,(hex)=>{const s=syntaxFace(kind);s.fg=hex||null;syncSyntaxCache(kind);styleEx();styleCr();renderCode();if(kind==='bg'||kind==='p'){applyGround();buildTable();buildPkgTable();buildPkgPreview();}repaintCovered();},{compact:true,defaultHex:rowFg()}); const bgd=mkColorDropdown(ddList(sf.bg||''),sf.bg||'',hex=>{const s=syntaxFace(kind);s.bg=hex||null;styleEx();styleCr();renderCode();repaintCovered();},{compact:true,defaultHex:rowBg()}); styleEx();styleCr(); const stTd=document.createElement('td'); - const stBtns=mkStyleButtons(at=>syntaxFace(kind)[at],at=>{const s=syntaxFace(kind);s[at]=!s[at];styleEx();renderCode();}); - const stCluster=document.createElement('div');stCluster.className='stylecluster';stBtns.forEach(b=>stCluster.appendChild(b));stTd.appendChild(stCluster); + const stCtls=mkStyleControls(syntaxFace(kind),()=>{styleEx();renderCode();},{defaultHex:rowFg()}); + const stCluster=document.createElement('div');stCluster.className='stylecluster';stCtls.forEach(c=>stCluster.appendChild(c));stTd.appendChild(stCluster); const c0=document.createElement('td');c0.appendChild(dd); const cB=document.createElement('td');cB.appendChild(bgd); const cX=document.createElement('td');const boxCtl=mkBoxControl(()=>syntaxFace(kind).box,b=>{syntaxFace(kind).box=b;styleEx();renderCode();},{compact:true});cX.appendChild(boxCtl); - const lkTd=mkLockCell(kind,[dd,bgd,...stBtns,boxCtl]); - const c2=document.createElement('td');c2.className='cat';c2.textContent=label;c2.style.cursor='pointer';c2.title='flash this category in the code';c2.onclick=()=>flashTokens(kind); - tr.appendChild(c2);tr.appendChild(lkTd);tr.appendChild(c0);tr.appendChild(cB);tr.appendChild(stTd);tr.appendChild(cX);tr.appendChild(crTd);tr.appendChild(exTd); - tb.appendChild(tr);} - updateLockToggle('syntax'); + const exp=mkExpander(syntaxFace(kind),tableColCount('legtable'),()=>{styleEx();renderCode();},{expandKey:kind,showInheritHeight:true,inheritOptions:[''].concat(BASE_INHERITS),defaultHex:rowFg(),ndCheck:()=>overflowNonDefault(syntaxFace(kind),DEFAULT_SYNTAX[kind],true)}); + exp.detail.dataset.detailFor=kind; + const lkTd=mkLockCell(kind,[dd,bgd,...stCtls,boxCtl,...exp.locks]); + const c2=document.createElement('td');c2.className='cat';c2.title=composeHoverTitle(SYNTAX_DOCS[kind],c2.title);c2.appendChild(exp.btn); + const c2lbl=document.createElement('span');c2lbl.textContent=' '+label;c2lbl.style.cursor='pointer';c2lbl.title='flash this category in the code';c2lbl.onclick=()=>flashTokens(kind);c2.appendChild(c2lbl); + tr.appendChild(lkTd);tr.appendChild(c2);tr.appendChild(c0);tr.appendChild(cB);tr.appendChild(stTd);tr.appendChild(cX);tr.appendChild(crTd);tr.appendChild(exTd); + tb.appendChild(tr);tb.appendChild(exp.detail);} + updateLockToggle('syntax');syncExpandAllBtns(); } PALETTE_ACTIONS_J function notify(msg,err){const m=document.getElementById('palmsg');if(!m)return;m.textContent=msg;m.style.color=err?'#cb6b4d':'#8a9496';m.style.opacity='1';clearTimeout(m._t);m._t=setTimeout(()=>{m.style.opacity='0';},err?4000:2800);} @@ -358,12 +502,23 @@ function exportObj(){normalizePalette();const o={name:themeName(),palette:PALETT function exportState(){const t=document.getElementById('export');t.value=JSON.stringify(exportObj(),null,1);t.style.display='block';t.focus();t.select();} function toggleJSON(){const t=document.getElementById('export'),b=document.getElementById('jsonbtn');if(t.style.display==='block'){t.style.display='none';b.textContent='show';}else{exportState();b.textContent='hide';}} function updateTitle(){const n=document.getElementById('themename').value.trim();document.getElementById('pagetitle').textContent=(n||'Untitled')+': theme';} -function exportTheme(){const blob=new Blob([JSON.stringify(exportObj(),null,1)],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=fileSlug()+'.json';a.click();} +// Export the theme JSON. Prefer the File System Access API (showSaveFilePicker) +// so re-exporting overwrites the chosen file in place -- a blob download routes +// through the browser's downloads folder, which uniquifies a re-save as +// "name (1).json" rather than replacing it. Fall back to the blob download where +// the API is absent (mirrors importTheme's showOpenFilePicker/fileinput fallback). +async function exportTheme(){ + const data=JSON.stringify(exportObj(),null,1); + if(!window.showSaveFilePicker){const blob=new Blob([data],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=fileSlug()+'.json';a.click();return;} + try{const h=await window.showSaveFilePicker({suggestedName:fileSlug()+'.json',types:[{description:'theme JSON',accept:{'application/json':['.json']}}]}); + const w=await h.createWritable();await w.write(data);await w.close(); + notify('saved "'+fileSlug()+'.json"',false); + }catch(e){if(e&&e.name!=='AbortError')notify('export failed: '+e.message,true);}} function applyImported(text){const d=JSON.parse(text);lastGone={};if(d.name)document.getElementById('themename').value=d.name;if(d.palette)PALETTE=d.palette.map(normalizePaletteEntry); if(!d.syntax)throw new Error('theme JSON is missing syntax; convert older files first'); - SYNTAX={};CATS.forEach(c=>{const k=c[0];SYNTAX[k]=Object.assign(syntaxBlank(k),d.syntax[k]||{});});syncAllSyntaxCache(); + SYNTAX={};CATS.forEach(c=>{const k=c[0];SYNTAX[k]=Object.assign(syntaxBlank(k),migrateLegacyFace(d.syntax[k]||{}));});syncAllSyntaxCache(); LOCKED=new Set(d.locks||[]); - if(d.ui)Object.assign(UIMAP,d.ui); + if(d.ui)for(const k in d.ui)UIMAP[k]=Object.assign(uiFaceBlank(),migrateLegacyFace(d.ui[k])); PKGMAP=seedPkgmap();if(d.packages)mergePackagesInto(PKGMAP,d.packages); refreshPaletteState({pkgPreview:true});updateTitle();} function importFile(ev){const f=ev.target.files[0];if(!f)return;const r=new FileReader(); @@ -381,45 +536,27 @@ async function importTheme(){ // against the new ground for faces without their own bg). function applyGround(){document.querySelectorAll('pre').forEach(p=>p.style.background=MAP['bg']);UI_FACES.forEach(([f])=>{if(document.getElementById('uiprev-'+f))paintUI(f);});} function uf(f){return UIMAP[f]||{};} -function udeco(o){return `font-weight:${o.bold?'bold':'normal'};font-style:${o.italic?'italic':'normal'};text-decoration:${(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none'}`;} -// A face's :box, rendered as an inset box-shadow (no layout shift). Returns the -// box-shadow VALUE (or '' for no box). 'line' is a flat border in the box color -// (or the face's own color when unset); 'released'/'pressed' are the 3D button -// styles Emacs draws, derived from explicit box color when set, otherwise the -// background so they read on any color. -function boxCss(b,bg){if(!b||!b.style)return '';const w=b.width||1; - if(b.style==='released'||b.style==='pressed'){ - // Emacs derives the 3D edges from a base color (reliefColors, ported from - // xterm.c); the translucent pair is only the no-color fallback. - const r=(b.color||bg)?reliefColors(b.color||bg):{hl:null,sh:null}; - const hl=r.hl||'#ffffff33',sh=r.sh||'#00000066'; - const [a,z]=b.style==='released'?[hl,sh]:[sh,hl]; - return `inset ${w}px ${w}px 0 ${a},inset -${w}px -${w}px 0 ${z}`;} - return `inset 0 0 0 ${w}px ${b.color||'currentColor'}`;} -function syntaxStyle(k){const s=syntaxFace(k),fg=(k==='bg'?MAP['p']:resolveSyntaxFg(k,SYNTAX,MAP['p'])),bg=s.bg||null,dec=(s.underline?'underline ':'')+(s.strike?'line-through':''), - bx=boxCss(s.box,bg||MAP['bg']); - return `color:${fg};${bg?'background:'+bg+';':''}font-weight:${s.bold?'bold':'normal'};font-style:${s.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'}${bx?';box-shadow:'+bx:''}`;} +// Map a weight name to a CSS font-weight for the live previews. The named +// weights light/medium/semibold/heavy aren't CSS keywords, so resolve to the +// numeric scale; an unset weight renders normal. +// cssWeight, boxCss, faceDecoration, and faceCss live in app-core.js now. +// udeco keeps its own (untrimmed) decoration form, so it stays here. +function udeco(o){return 'font-weight:'+cssWeight(o.weight)+';font-style:'+(o.slant||'normal')+';text-decoration:'+((o.underline?'underline ':'')+(o.strike?'line-through':'')||'none');} +function syntaxStyle(k){const s=syntaxFace(k),fg=(k==='bg'?MAP['p']:resolveSyntaxFg(k,SYNTAX,MAP['p'])),bg=s.bg||null;return faceCss(s,fg,bg,{boxBg:bg||MAP['bg']});} // The per-row box control: none / line / raised / pressed plus optional line // color. get()/set() read and write the face's box object (null = no box). // Box control: a 2x2 cluster of radio buttons for the four box styles (no box / // line / pressed / raised), plus a compact color swatch shown only while a box // style is active. Replaces the old wide select+swatch to reclaim column width. -function mkBoxControl(get,set,opts={}){const wrap=document.createElement('div');wrap.className='boxctl'; - const cluster=document.createElement('div');cluster.className='boxcluster'; - const states=[['','no box',''],['line','line box','□'],['pressed','pressed','▼'],['released','raised','▲']]; - const btns={}; - states.forEach(([v,title,glyph])=>{const b=document.createElement('button');b.className='boxbtn';b.dataset.style=v;b.textContent=glyph;b.title=title; - b.onclick=()=>{const cur=get();set(v?{style:v,width:(cur&&cur.width)||1,color:(cur&&cur.color)||null}:null);paint();}; - cluster.appendChild(b);btns[v]=b;}); - const dd=mkColorDropdown(ddList((get()&&get().color)||''),(get()&&get().color)||'',h=>{const cur=get();if(!cur)return;set(Object.assign({},cur,{color:h||null}));paint();},{compact:true,defaultHex:opts.defaultHex}); - function paint(){const cur=get(),style=cur&&cur.style?cur.style:''; - for(const v in btns)btns[v].classList.toggle('on',v===style); - dd.style.display=style?'':'none';dd.setValue(cur&&cur.color?cur.color:''); - const locked=wrap.dataset.locked==='1'; - for(const v in btns)btns[v].disabled=locked; - const ddoff=locked||!style;dd.dataset.locked=ddoff?'1':'';dd.classList.toggle('locked',ddoff);if(dd.syncLocked)dd.syncLocked();} - wrap.syncLocked=()=>paint(); - wrap.append(cluster,dd);paint();return wrap;} +// Box control: a 2x2 cluster of the four box styles (no box / line / pressed / +// raised) plus a compact color swatch shown while a style is active. Shares the +// cluster/dropdown/paint machinery with mkLineStyleControl; it differs only in +// that its state object carries `width`, so it passes a toState builder. +function mkBoxControl(get,set,opts={}){ + return mkLineStyleControl( + [['','no box',''],['line','line box','□'],['pressed','pressed','▼'],['released','raised','▲']], + get,set, + Object.assign({styled:true,toState:(v,cur)=>({style:v,width:(cur&&cur.width)||1,color:(cur&&cur.color)||null})},opts));} function flashRow(tr){if(!tr)return;tr.scrollIntoView({block:'center',behavior:'smooth'});tr.classList.remove('flash');void tr.offsetWidth;tr.classList.add('flash');} function flashEl(el){if(!el)return;el.scrollIntoView({block:'nearest',inline:'nearest',behavior:'smooth'});el.classList.remove('flashtok');void el.offsetWidth;el.classList.add('flashtok');} // Flash every matching element but scroll only the first into view, so a face @@ -432,14 +569,12 @@ function flashUiPreview(f){const sp=document.querySelectorAll(`#mockframe [data- function flashPkg(f){flashRow(document.querySelector(`#pkgbody tr[data-face="${f}"]`));} function flashPkgPreview(f){const sp=document.querySelectorAll(`#pkgpreview [data-face="${f}"]`);if(sp.length){flashEls(sp);return;}const row=document.querySelector(`#pkgbody tr[data-face="${f}"]`);if(row)flashEl(row.querySelector('.cat'));} function mockSpan(k,t){return `<span data-k="${k}" style="${syntaxStyle(k)}">${esc(t)}</span>`;} -function uiCss(o,fgv,bgv,opts={}){const fg=fgv===undefined?effFg(o.fg):fgv,bg=bgv===undefined?o.bg:bgv,dec=(o.underline?'underline ':'')+(o.strike?'line-through':''), - bx=boxCss(o.box,bg||MAP['bg']); - return `color:${fg};${bg&&!opts.noBg?'background:'+bg+';':''}font-weight:${o.bold?'bold':'normal'};font-style:${o.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'}${bx?';box-shadow:'+bx:''}`;} +function uiCss(o,fgv,bgv,opts={}){const fg=fgv===undefined?effFg(o.fg):fgv,bg=bgv===undefined?o.bg:bgv;return faceCss(o,fg,bg,{noBg:opts.noBg,boxBg:bg||MAP['bg']});} function syncMockHeight(){const t=document.getElementById('uitable'),m=document.getElementById('mockframe');if(!t||!m)return;const lb=m.previousElementSibling,lbh=lb?lb.getBoundingClientRect().height+10:30;m.style.height=Math.max(t.getBoundingClientRect().height-lbh,220)+'px';} function buildMockFrame(){ const fr=document.getElementById('mockframe');if(!fr)return; const bg=MAP['bg'],fg=MAP['p']; - const ln=uf('line-number'),lnc=uf('line-number-current-line'),hl=uf('hl-line'),hil=uf('highlight'),reg=uf('region'),isr=uf('isearch'),isf=uf('isearch-fail'),laz=uf('lazy-highlight'),par=uf('show-paren-match'),parx=uf('show-paren-mismatch'),cur=uf('cursor'),ml=uf('mode-line'),mli=uf('mode-line-inactive'),mb=uf('minibuffer-prompt'),frng=uf('fringe'),vb=uf('vertical-border'),lnk=uf('link'),err=uf('error'),wrn=uf('warning'),suc=uf('success'); + const ln=uf('line-number'),lnc=uf('line-number-current-line'),hl=uf('hl-line'),hil=uf('highlight'),reg=uf('region'),isr=uf('isearch'),isf=uf('isearch-fail'),laz=uf('lazy-highlight'),par=uf('show-paren-match'),parx=uf('show-paren-mismatch'),cur=uf('cursor'),ml=uf('mode-line'),mli=uf('mode-line-inactive'),mlh=uf('mode-line-highlight'),mb=uf('minibuffer-prompt'),frng=uf('fringe'),vb=uf('vertical-border'),lnk=uf('link'),err=uf('error'),wrn=uf('warning'),suc=uf('success'); const lines=[ {t:[['cmd',';; '],['cm','init.el - your config']]}, {t:[['punc','('],['kw','require'],['p',' '],['con',"'cl-lib"],['punc',')']]}, @@ -500,7 +635,8 @@ function buildMockFrame(){ buf+=`<div class="ln" ${rowFace?'data-face="hl-line" ':''}style="${rowStyle}"><span class="fr" data-face="fringe" style="${uiCss(frng,frng.fg||fg,frng.bg||bg)};text-align:center;font-size:10px;overflow:hidden" title="fringe">${L.cont?'↪':''}</span><span class="num" data-face="${nFace}" style="${uiCss(isc?lnc:ln,nFg,nBg)}">${i+1}</span><span class="cd">${cd||' '}</span></div>`; }); let html=`<div class="mbuf" style="background:${bg}"><div class="mbuftext">${buf}</div><div class="vborder" data-face="vertical-border" title="vertical-border" style="background:${vb.fg||vb.bg||'#2f343a'}"></div></div>`; - html+=`<div class="bar" data-face="mode-line" style="${uiCss(ml,ml.fg||bg,ml.bg||fg)}"> init.el (Emacs Lisp) L5 git:main </div>`; + const mlhStyle=uiCss(mlh,mlh.fg||ml.fg||bg,mlh.bg||ml.bg||fg); + html+=`<div class="bar" data-face="mode-line" style="${uiCss(ml,ml.fg||bg,ml.bg||fg)}"> init.el (Emacs Lisp) L5 <span data-face="mode-line-highlight" title="mode-line-highlight (hover)" style="${mlhStyle}">git:main</span> </div>`; html+=`<div class="bar" data-face="mode-line-inactive" style="${uiCss(mli,resolveUiAttr('mode-line-inactive','fg',UIMAP)||fg,resolveUiAttr('mode-line-inactive','bg',UIMAP)||bg)}"> *Messages* (Fundamental)</div>`; html+=`<div class="echo" style="color:${fg}"><span data-face="minibuffer-prompt" style="${uiCss(mb,mb.fg||fg,mb.bg||null)}">I-search:</span> count <span data-face="isearch-fail" style="${uiCss(isf,isf.fg||fg,isf.bg||'transparent')}">zzz [no match]</span></div>`; html+=`<div class="echo"><span data-face="link" style="${uiCss(lnk,lnk.fg||fg,lnk.bg||null)}">https://gnu.org</span> <span data-face="error" style="${uiCss(err,err.fg||fg,err.bg||null)}">error</span> <span data-face="warning" style="${uiCss(wrn,wrn.fg||fg,wrn.bg||null)}">warning</span> <span data-face="success" style="${uiCss(suc,suc.fg||fg,suc.bg||null)}">ok</span></div>`; @@ -513,21 +649,33 @@ function buildMockFrame(){ function uiSelect(face,attr){const cur=UIMAP[face][attr]||''; return mkColorDropdown(ddList(cur),cur,h=>{UIMAP[face][attr]=h||null;paintUI(face);buildMockFrame();},{compact:true,defaultHex:attr==='fg'?effFg(null):effBg(null)});} const BASE_INHERITS=['fixed-pitch','variable-pitch','default','link','bold','italic','shadow']; -function uiFaceBlank(){return {fg:null,bg:null,bold:false,italic:false,underline:false,strike:false};} -function seedFace(d){return normalizePkgFace({fg:pname(d.fg),bg:pname(d.bg),bold:d.bold,italic:d.italic,underline:d.underline,strike:d.strike,inherit:d.inherit,height:d.height,box:d.box},'default');} +function uiFaceBlank(){return {fg:null,bg:null,'distant-fg':null,family:null,weight:null,slant:null,underline:null,strike:null,overline:null,box:null,inverse:false,extend:false,inherit:null,height:null};} +function seedFace(d){return normalizePkgFace({fg:pname(d.fg),bg:pname(d.bg),'distant-fg':pname(d['distant-fg']),family:d.family,weight:d.weight,slant:d.slant,bold:d.bold,italic:d.italic,underline:d.underline,strike:d.strike,overline:d.overline,inherit:d.inherit,height:d.height,box:d.box,inverse:d.inverse,extend:d.extend},'default');} function curApp(){const s=document.getElementById('viewsel');const v=s&&s.value;return (v&&v[0]!=='@')?v:Object.keys(APPS)[0];} function pkgEffFg(app,face,seen){return effResolve(PKGMAP,app,face,'fg',seen);} function pkgEffBg(app,face,seen){return effResolve(PKGMAP,app,face,'bg',seen);} // One dropdown drives the whole assignment panel: two editor entries (@code, // @ui) then a non-selectable "package faces" optgroup holding every app, // alphabetically by label. onViewChange shows exactly one of the three view blocks. +// Lock keys for one view value (@code / @ui / a package app), so the view +// dropdown can flag a view whose every element is locked. +function viewLockKeys(v){ + if(v==='@code')return syntaxLockKeys(); + if(v==='@ui')return uiLockKeys(); + return (APPS[v]?APPS[v].faces:[]).map(f=>'pkg:'+v+':'+f[0]); +} +// Prefix a lock glyph on every view whose elements are all locked; leave the rest +// bare. The base label rides in dataset.label so re-running never stacks glyphs. +function updateViewLockIndicators(){const s=document.getElementById('viewsel');if(!s)return; + for(const o of s.querySelectorAll('option')){const base=o.dataset.label||o.textContent; + o.textContent=(areAllLocked(viewLockKeys(o.value),LOCKED)?'🔒 ':'')+base;}} function buildViewSel(){const s=document.getElementById('viewsel');if(!s)return;s.innerHTML=''; - const mk=(v,t)=>{const o=document.createElement('option');o.value=v;o.textContent=t;return o;}; + const mk=(v,t)=>{const o=document.createElement('option');o.value=v;o.dataset.label=t;o.textContent=t;return o;}; s.appendChild(mk('@code','color/code assignments')); s.appendChild(mk('@ui','ui faces')); const og=document.createElement('optgroup');og.label='package faces'; for(const app of appViewKeysSorted(APPS))og.appendChild(mk(app,APPS[app].label)); - s.appendChild(og);} + s.appendChild(og);updateViewLockIndicators();} // The ‹ › buttons flanking the dropdown step the selection by DIR and re-render // the view (faces table + preview), so you can walk the list without reopening it. function stepView(dir){ @@ -535,6 +683,13 @@ function stepView(dir){ const i=stepViewIndex(s.selectedIndex,s.options.length,dir); if(i!==s.selectedIndex){s.selectedIndex=i;onViewChange();} } +// The ‹ › buttons flanking the language dropdown step the selection by DIR and +// re-render the code sample + package preview, mirroring the view-dropdown nav. +function stepLang(dir){ + const s=document.getElementById('langsel');if(!s)return; + const i=stepViewIndex(s.selectedIndex,s.options.length,dir); + if(i!==s.selectedIndex){s.selectedIndex=i;renderCode();buildPkgPreview();} +} function onViewChange(){const s=document.getElementById('viewsel');const v=(s&&s.value)||'@code'; const show=(id,on)=>{const e=document.getElementById(id);if(e)e.style.display=on?'':'none';}; show('view-code',v==='@code');show('view-ui',v==='@ui');show('view-pkg',v[0]!=='@'); @@ -552,487 +707,32 @@ function buildPkgTable(){ const f=PKGMAP[app][face],tr=document.createElement('tr');tr.dataset.face=face; const def=normalizePkgFace(row[2]||{},'default',PALETTE); const nd=faceBoxNonDefaults( - {fg:nameToHex(f.fg,PALETTE),bg:nameToHex(f.bg,PALETTE),bold:f.bold,italic:f.italic,underline:f.underline,strike:f.strike,inherit:f.inherit,height:f.height,box:f.box}, - {fg:nameToHex(def.fg,PALETTE),bg:nameToHex(def.bg,PALETTE),bold:def.bold,italic:def.italic,underline:def.underline,strike:def.strike,inherit:def.inherit,height:def.height,box:def.box}); - const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.title=face;c0.style.cursor='pointer';c0.onclick=()=>flashPkgPreview(face); + {fg:nameToHex(f.fg,PALETTE),bg:nameToHex(f.bg,PALETTE),weight:f.weight,slant:f.slant,underline:f.underline,strike:f.strike,inherit:f.inherit,height:f.height,box:f.box}, + {fg:nameToHex(def.fg,PALETTE),bg:nameToHex(def.bg,PALETTE),weight:def.weight,slant:def.slant,underline:def.underline,strike:def.strike,inherit:def.inherit,height:def.height,box:def.box}); + const exp=mkExpander(f,tableColCount('pkgtable'),()=>{f.source='user';pkgChanged();},{expandKey:face,showInheritHeight:true,inheritOptions:inh,defaultHex:effFg(pkgEffFg(app,face)),ndCheck:()=>overflowNonDefault(f,def,true)}); + exp.detail.dataset.detailFor=face; + const c0=document.createElement('td');c0.className='cat';c0.title=composeHoverTitle(FACE_DOCS[face],face);c0.appendChild(exp.btn); + const c0lbl=document.createElement('span');c0lbl.textContent=' '+label;c0lbl.style.cursor='pointer';c0lbl.onclick=()=>flashPkgPreview(face);c0.appendChild(c0lbl); const fgd=mkColorDropdown(ddList(f.fg||''),f.fg||'',h=>{f.fg=h||null;f.source='user';pkgChanged();},{compact:true,defaultHex:effFg(pkgEffFg(app,face))}), bgd=mkColorDropdown(ddList(f.bg||''),f.bg||'',h=>{f.bg=h||null;f.source='user';pkgChanged();},{compact:true,defaultHex:effBg(pkgEffBg(app,face))}); const cf=document.createElement('td');cf.appendChild(fgd); const cb=document.createElement('td');cb.appendChild(bgd); const cw=document.createElement('td'); - const pkBtns=mkStyleButtons(at=>f[at],at=>{f[at]=!f[at];f.source='user';pkgChanged();}); - const pkCluster=document.createElement('div');pkCluster.className='stylecluster';pkBtns.forEach(b=>pkCluster.appendChild(b));cw.appendChild(pkCluster); - const ci=document.createElement('td');const isel=document.createElement('select');isel.className='chip';isel.style.cssText='width:150px;font:10pt monospace';inh.forEach(o=>{const op=document.createElement('option');op.value=o;op.textContent=o||'— none —';isel.appendChild(op);});isel.value=f.inherit||'';isel.onchange=()=>{f.inherit=isel.value||null;f.source='user';pkgChanged();};ci.appendChild(isel); - const ch=document.createElement('td');const hin=document.createElement('input');hin.type='number';hin.min='0.8';hin.max='2.5';hin.step='0.05';hin.value=f.height||1;hin.className='hstep';hin.onchange=()=>{f.height=parseFloat(hin.value)||1;f.source='user';pkgChanged();};ch.appendChild(hin); + const pkCtls=mkStyleControls(f,()=>{f.source='user';pkgChanged();},{defaultHex:effFg(pkgEffFg(app,face))}); + const pkCluster=document.createElement('div');pkCluster.className='stylecluster';pkCtls.forEach(c=>pkCluster.appendChild(c));cw.appendChild(pkCluster); const cc=document.createElement('td');cc.style.fontSize='10pt';cc.style.whiteSpace='nowrap';const efg=effFg(pkgEffFg(app,face)),ebg=effBg(pkgEffBg(app,face)),r=contrast(efg,ebg);cc.innerHTML=crHtml(r); const cx=document.createElement('td');const boxCtl=mkBoxControl(()=>f.box,b=>{f.box=b;f.source='user';pkgChanged();},{compact:true});cx.appendChild(boxCtl); - const cL=mkLockCell('pkg:'+app+':'+face,[fgd,bgd,...pkBtns,isel,hin,boxCtl]); + const cL=mkLockCell('pkg:'+app+':'+face,[fgd,bgd,...pkCtls,boxCtl,...exp.locks]); if(nd.fg)cf.classList.add('nd');if(nd.bg)cb.classList.add('nd');if(nd.style)cw.classList.add('nd'); - if(nd.inherit)ci.classList.add('nd');if(nd.height)ch.classList.add('nd');if(nd.box)cx.classList.add('nd'); - tr.append(c0,cL,cf,cb,cw,cc,ci,ch,cx);tb.appendChild(tr); + if(nd.box)cx.classList.add('nd'); + tr.append(cL,c0,cf,cb,cw,cx,cc);tb.appendChild(tr);tb.appendChild(exp.detail); } applyTableSort('pkgbody'); - updateLockToggle('pkg'); + updateLockToggle('pkg');syncExpandAllBtns(); } -function ofs(app,face){const f=PKGMAP[app][face]||{},fg=effFg(pkgEffFg(app,face)),bg=pkgEffBg(app,face);const dec=(f.underline?'underline ':'')+(f.strike?'line-through':'');const bx=boxCss(f.box,bg||MAP['bg']);return `color:${fg};${bg?'background:'+bg+';':''}font-weight:${f.bold?'bold':'normal'};font-style:${f.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'};font-size:${(f.height||1)}em${bx?';box-shadow:'+bx:''}`;} -function os(app,face,txt){return `<span data-face="${face}" style="${ofs(app,face)}">${txt}</span>`;} -// Shared wrapper for the line-based package previews: a monospace pre block. -// Each renderer builds its own L array of os(...) lines and returns previewLines(L). -function previewLines(L){return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;} -function renderOrgPreview(){const a='org-mode',L=[]; - L.push(os(a,'org-document-info-keyword','#+TITLE:')+' '+os(a,'org-document-title','Project Notes')); - L.push(os(a,'org-document-info-keyword','#+AUTHOR:')+' '+os(a,'org-document-info','Craig Jennings')); - L.push(os(a,'org-meta-line','#+STARTUP: overview')); - L.push(''); - L.push(os(a,'org-level-1','* Inbox')+' '+os(a,'org-tag',':work:')+os(a,'org-tag-group',':@office:')); - L.push(os(a,'org-level-2','** ')+os(a,'org-todo','TODO')+os(a,'org-level-2',' Draft the spec')+' '+os(a,'org-priority','[#A]')+' '+os(a,'org-tag',':spec:')); - L.push(' '+os(a,'org-special-keyword','SCHEDULED:')+' '+os(a,'org-date','<2026-06-08 Sun>')+' '+os(a,'org-special-keyword','DEADLINE:')+' '+os(a,'org-date','<2026-06-12 Thu>')); - L.push(' '+os(a,'org-drawer',':PROPERTIES:')); - L.push(' '+os(a,'org-special-keyword',':ID:')+' '+os(a,'org-property-value','abc-123-def')); - L.push(' '+os(a,'org-drawer',':END:')); - L.push(' '+os(a,'org-list-dt','- term ::')+' definition, with a '+os(a,'org-footnote','[fn:1]')+' note.'); - L.push(' '+os(a,'org-checkbox','[X]')+' done item '+os(a,'org-checkbox-statistics-done','[2/2]')); - L.push(' '+os(a,'org-checkbox','[ ]')+' open item '+os(a,'org-checkbox-statistics-todo','[0/3]')+' '+os(a,'org-warning','(!)')); - L.push(os(a,'org-level-2','** ')+os(a,'org-done','DONE')+os(a,'org-headline-done',' Ship the tool')); - L.push(os(a,'org-level-3','*** ')+os(a,'org-todo','TODO')+os(a,'org-headline-todo',' Heading three')); - L.push(os(a,'org-level-4','**** four')+' / '+os(a,'org-level-5','***** five')+' / '+os(a,'org-level-6','****** six')+' / '+os(a,'org-level-7','******* seven')+' / '+os(a,'org-level-8','******** eight')); - L.push(' Inline '+os(a,'org-code','=code=')+', '+os(a,'org-verbatim','~verbatim~')+', '+os(a,'org-inline-src-block','src_py{1+1}')+','); - L.push(' a '+os(a,'org-link','[[https://gnu.org][link]]')+', a '+os(a,'org-target','<<target>>')+', a '+os(a,'org-macro','{{{macro}}}')+','); - L.push(' a '+os(a,'org-cite','[cite:')+os(a,'org-cite-key','@knuth1984')+os(a,'org-cite',']')+', a date '+os(a,'org-sexp-date','<%%(diary-float 6 5 2)>')+'.'); - L.push(' '+os(a,'org-quote','#+begin_quote')+' a '+os(a,'org-verse','verse')+' line, latex '+os(a,'org-latex-and-related','$E = mc^2$')+'.'); - L.push(''); - L.push(' '+os(a,'org-block-begin-line','#+begin_src elisp')); - L.push(' '+os(a,'org-block',' (message "hi")')); - L.push(' '+os(a,'org-block-end-line','#+end_src')); - L.push(''); - L.push(' '+os(a,'org-table-header','| name | hex |')); - L.push(' '+os(a,'org-table','|------+---------|')); - L.push(' '+os(a,'org-table-row','| blue | #67809c |')+' '+os(a,'org-formula',':=vsum(@2)')); - L.push(' '+os(a,'org-column-title','Effort')+' '+os(a,'org-column','| 0:30 |')+' '+os(a,'org-archived','* archived')+os(a,'org-ellipsis',' ...')); - L.push(''); - L.push(os(a,'org-agenda-structure','Week-agenda (W23):')); - L.push(os(a,'org-agenda-date','Monday 8 June 2026')); - L.push(os(a,'org-agenda-date-today','Tuesday 9 June 2026')+' '+os(a,'org-agenda-current-time','10:24')+' '+os(a,'org-time-grid','----------')); - L.push(os(a,'org-agenda-date-weekend','Saturday 13 June')+' / '+os(a,'org-agenda-date-weekend-today','wknd-today')); - L.push(' '+os(a,'org-scheduled-previously','Sched.past:')+' overdue '+os(a,'org-agenda-done','x done item')); - L.push(' '+os(a,'org-scheduled','Scheduled:')+' a task '+os(a,'org-scheduled-today','due today')); - L.push(' '+os(a,'org-imminent-deadline','Deadline!')+' / '+os(a,'org-upcoming-deadline','upcoming')+' / '+os(a,'org-upcoming-distant-deadline','distant')); - L.push(' '+os(a,'org-agenda-dimmed-todo-face','dimmed todo')+' '+os(a,'org-agenda-diary','diary')+' '+os(a,'org-agenda-clocking','clocking')); - L.push(' '+os(a,'org-agenda-calendar-event','cal-event')+' / '+os(a,'org-agenda-calendar-sexp','cal-sexp')+' / '+os(a,'org-agenda-calendar-daterange','range')); - L.push(' '+os(a,'org-agenda-structure-secondary','secondary')+' '+os(a,'org-agenda-structure-filter','filter')+' '+os(a,'org-agenda-restriction-lock','lock')+' '+os(a,'org-agenda-column-dateline','col-date')); - L.push(' Filters: '+os(a,'org-agenda-filter-category','cat')+' '+os(a,'org-agenda-filter-tags','tags')+' '+os(a,'org-agenda-filter-effort','effort')+' '+os(a,'org-agenda-filter-regexp','re')); - L.push(' '+os(a,'org-mode-line-clock','[0:45]')+' / '+os(a,'org-mode-line-clock-overrun','[OVER]')+' '+os(a,'org-dispatcher-highlight','[d]ispatch')); - return previewLines(L); -} -function renderMagitPreview(){const a='magit',L=[]; - L.push(os(a,'magit-header-line',' Magit: dotemacs ')+' '+os(a,'magit-header-line-key','g')+os(a,'magit-header-line-log-select',' refresh')); - L.push(os(a,'magit-head','Head:')+' '+os(a,'magit-branch-current','main')+' '+os(a,'magit-diff-revision-summary','Ship the tool')); - L.push(os(a,'magit-head','Merge:')+' '+os(a,'magit-branch-remote','origin/main')+' '+os(a,'magit-branch-local','main')); - L.push(os(a,'magit-head','Push:')+' '+os(a,'magit-branch-remote-head','origin/main')); - L.push(os(a,'magit-head','Upstream:')+' '+os(a,'magit-branch-upstream','origin/main')+' '+os(a,'magit-branch-warning','(diverged)')); - L.push(''); - L.push(os(a,'magit-section-heading','Untracked files')+' '+os(a,'magit-section-child-count','(2)')); - L.push(' '+os(a,'magit-filename','notes.txt')+' '+os(a,'magit-dimmed','(ignored sibling)')); - L.push(os(a,'magit-section-highlight',' scratch.el (highlighted row)')); - L.push(''); - L.push(os(a,'magit-section-heading','Unstaged changes')+' '+os(a,'magit-section-child-count','(1)')); - L.push(os(a,'magit-diff-file-heading','modified generate.py')); - L.push(os(a,'magit-diff-hunk-heading','@@ -1,4 +1,5 @@ def main')); - L.push(os(a,'magit-diff-context',' unchanged context')); - L.push(os(a,'magit-diff-removed','- old line')+os(a,'magit-diff-whitespace-warning',' ')); - L.push(os(a,'magit-diff-added','+ new line')); - L.push(''); - L.push(os(a,'magit-section-heading','Staged changes')+' '+os(a,'magit-diffstat-added','++++')+os(a,'magit-diffstat-removed','--')); - L.push(os(a,'magit-diff-file-heading-highlight','modified README.md (highlighted heading)')); - L.push(os(a,'magit-diff-hunk-heading-highlight','@@ hunk heading highlight @@')); - L.push(os(a,'magit-diff-added-highlight','+ added highlight')+' '+os(a,'magit-diff-removed-highlight','- removed highlight')); - L.push(os(a,'magit-diff-context-highlight',' context highlight')); - L.push(''); - L.push(os(a,'magit-section-heading','Stashes')); - L.push(' '+os(a,'magit-refname-stash','stash@{0}')+' '+os(a,'magit-refname-wip','wip')+' '+os(a,'magit-refname-pullreq','pr/42')+' '+os(a,'magit-refname','refs/heads/x')); - L.push(''); - L.push(os(a,'magit-section-heading','Recent commits')); - L.push(os(a,'magit-log-graph','* ')+os(a,'magit-hash','b5b1869f')+' '+os(a,'magit-log-date','06-08')+' '+os(a,'magit-log-author','Craig')+' enlarge the picker'); - L.push(os(a,'magit-log-graph','* ')+os(a,'magit-hash','4fa5e995')+' '+os(a,'magit-log-date','06-07')+' '+os(a,'magit-log-author','Craig')+' '+os(a,'magit-keyword','[feat]')+' picker'); - L.push(os(a,'magit-log-graph','* ')+os(a,'magit-hash','de07e01a')+' '+os(a,'magit-log-date','06-05')+' '+os(a,'magit-log-author','Craig')+' '+os(a,'magit-tag','v0.3')+' '+os(a,'magit-keyword-squash','!squash')); - L.push(''); - L.push(os(a,'magit-section-secondary-heading','Merge conflict')+' '+os(a,'magit-diff-lines-heading','lines 10-14')+os(a,'magit-diff-lines-boundary','|')); - L.push(' '+os(a,'magit-diff-conflict-heading','=======')+' '+os(a,'magit-diff-conflict-heading-highlight','(hl)')); - L.push(' '+os(a,'magit-diff-base','base')+'/'+os(a,'magit-diff-base-highlight','base-hl')+' '+os(a,'magit-diff-our','ours')+'/'+os(a,'magit-diff-our-highlight','ours-hl')+' '+os(a,'magit-diff-their','theirs')+'/'+os(a,'magit-diff-their-highlight','theirs-hl')); - L.push(' '+os(a,'magit-diff-hunk-region','hunk-region')+' '+os(a,'magit-diff-file-heading-selection','file-sel')+' '+os(a,'magit-diff-hunk-heading-selection','hunk-sel')+' '+os(a,'magit-section-heading-selection','sec-sel')+' '+os(a,'magit-diff-revision-summary-highlight','rev-sum-hl')); - L.push(''); - L.push(os(a,'magit-section-heading','Reflog')); - L.push(' '+os(a,'magit-reflog-commit','commit')+' '+os(a,'magit-reflog-amend','amend')+' '+os(a,'magit-reflog-merge','merge')+' '+os(a,'magit-reflog-checkout','checkout')+' '+os(a,'magit-reflog-reset','reset')+' '+os(a,'magit-reflog-rebase','rebase')+' '+os(a,'magit-reflog-cherry-pick','cherry-pick')+' '+os(a,'magit-reflog-remote','remote')+' '+os(a,'magit-reflog-other','other')); - L.push(os(a,'magit-section-heading','Rebase sequence')); - L.push(' '+os(a,'magit-sequence-pick','pick')+' '+os(a,'magit-sequence-stop','stop')+' '+os(a,'magit-sequence-part','part')+' '+os(a,'magit-sequence-head','head')+' '+os(a,'magit-sequence-drop','drop')+' '+os(a,'magit-sequence-done','done')+' '+os(a,'magit-sequence-onto','onto')+' '+os(a,'magit-sequence-exec','exec')); - L.push(os(a,'magit-section-heading','Bisect / Cherry / Process')); - L.push(' '+os(a,'magit-bisect-good','good')+' '+os(a,'magit-bisect-bad','bad')+' '+os(a,'magit-bisect-skip','skip')+' '+os(a,'magit-cherry-equivalent','equivalent')+' '+os(a,'magit-cherry-unmatched','unmatched')); - L.push(' '+os(a,'magit-process-ok','OK')+' '+os(a,'magit-process-ng','NG')+' '+os(a,'magit-mode-line-process','[fetch]')+' '+os(a,'magit-mode-line-process-error','[error]')); - L.push(os(a,'magit-section-heading','Blame')); - L.push(os(a,'magit-blame-margin','margin')+os(a,'magit-blame-heading',' b5b1869f ')) - L.push(' '+os(a,'magit-blame-hash','b5b1869f')+' '+os(a,'magit-blame-name','Craig')+' '+os(a,'magit-blame-date','2026-06-08')+' '+os(a,'magit-blame-summary','enlarge picker')+' '+os(a,'magit-blame-highlight','hl')+' '+os(a,'magit-blame-dimmed','dim')); - L.push(os(a,'magit-section-heading','Signatures')+os(a,'magit-left-margin',' ')); - L.push(' '+os(a,'magit-signature-good','good')+' '+os(a,'magit-signature-bad','bad')+' '+os(a,'magit-signature-untrusted','untrusted')+' '+os(a,'magit-signature-expired','expired')+' '+os(a,'magit-signature-expired-key','expired-key')+' '+os(a,'magit-signature-revoked','revoked')+' '+os(a,'magit-signature-error','error')); - return previewLines(L);} -function renderElfeedPreview(){const a='elfeed',L=[]; - L.push(os(a,'elfeed-search-filter-face','@6-months-ago +unread')+' '+os(a,'elfeed-search-unread-count-face','3/120')+' '+os(a,'elfeed-search-last-update-face','updated 02:24')); - L.push(''); - L.push(os(a,'elfeed-search-date-face','2026-06-08')+' '+os(a,'elfeed-search-feed-face','Planet Emacs')+' '+os(a,'elfeed-search-unread-title-face','New release of Magit')+' '+os(a,'elfeed-search-tag-face',':emacs:')); - L.push(os(a,'elfeed-search-date-face','2026-06-07')+' '+os(a,'elfeed-search-feed-face','LWN')+' '+os(a,'elfeed-search-unread-title-face','Kernel 6.18 lands')+' '+os(a,'elfeed-search-tag-face',':linux:')); - L.push(os(a,'elfeed-search-date-face','2026-06-05')+' '+os(a,'elfeed-search-feed-face','Hacker News')+' '+os(a,'elfeed-search-title-face','Show HN: a theme editor')+' '+os(a,'elfeed-search-tag-face',':show:')); - L.push(''); - L.push(os(a,'elfeed-log-date-face','02:24:01')+' '+os(a,'elfeed-log-info-level-face','INFO ')+' updated 12 feeds'); - L.push(os(a,'elfeed-log-date-face','02:24:02')+' '+os(a,'elfeed-log-warn-level-face','WARN ')+' slow feed: example.com'); - L.push(os(a,'elfeed-log-date-face','02:24:03')+' '+os(a,'elfeed-log-error-level-face','ERROR')+' failed: bad.example'); - L.push(os(a,'elfeed-log-date-face','02:24:04')+' '+os(a,'elfeed-log-debug-level-face','DEBUG')+' parsed 340 entries'); - return previewLines(L);} -function renderGhostelPreview(){const a='ghostel',L=[]; - L.push(os(a,'ghostel-default','craig@host')+' '+os(a,'ghostel-color-green','~/code')+' $ ls'+os(a,'ghostel-fake-cursor',' ')+os(a,'ghostel-fake-cursor-box','[ ]')); - L.push(''); - L.push(os(a,'ghostel-default','normal:')+' '+os(a,'ghostel-color-black','black')+' '+os(a,'ghostel-color-red','red')+' '+os(a,'ghostel-color-green','green')+' '+os(a,'ghostel-color-yellow','yellow')+' '+os(a,'ghostel-color-blue','blue')+' '+os(a,'ghostel-color-magenta','magenta')+' '+os(a,'ghostel-color-cyan','cyan')+' '+os(a,'ghostel-color-white','white')); - L.push(os(a,'ghostel-default','bright:')+' '+os(a,'ghostel-color-bright-black','black')+' '+os(a,'ghostel-color-bright-red','red')+' '+os(a,'ghostel-color-bright-green','green')+' '+os(a,'ghostel-color-bright-yellow','yellow')+' '+os(a,'ghostel-color-bright-blue','blue')+' '+os(a,'ghostel-color-bright-magenta','magenta')+' '+os(a,'ghostel-color-bright-cyan','cyan')+' '+os(a,'ghostel-color-bright-white','white')); - L.push(''); - L.push(os(a,'ghostel-default','default terminal output, 256-color text and a blinking ')+os(a,'ghostel-fake-cursor','cursor')+'.'); - return previewLines(L);} -function renderDashboardPreview(){const a='dashboard',L=[]; - L.push(os(a,'dashboard-text-banner',' [ dashboard banner image ]')); - L.push(os(a,'dashboard-banner-logo-title','Emacs: The Editor That Saves Your Soul')); - L.push(''); - L.push(os(a,'dashboard-navigator',' Code Files Terminal Agenda')); - L.push(os(a,'dashboard-navigator',' Feeds Books Flashcards Music')); - L.push(os(a,'dashboard-navigator',' Email IRC Telegram')); - L.push(os(a,'dashboard-navigator',' Slack Linear')); - L.push(''); - L.push(''); - L.push(os(a,'dashboard-heading','Projects:')); - L.push(' ~/'); - L.push(' ~/.emacs.d/'); - L.push(' ~/projects/work/'); - L.push(' ~/org/roam/'); - L.push(' ~/projects/home/'); - L.push(''); - L.push(os(a,'dashboard-heading','Bookmarks')); - L.push(' Cesar Aira, The Little Buddhist Monk & the Proof'); - L.push(' Edward Abbey, The Fool’s Progress: An Honest Novel'); - L.push(' Agatha Christie, The A.B.C. Murders'); - L.push(''); - L.push(os(a,'dashboard-heading','Recent Files:')); - L.push(' theme-theme.el'); - L.push(' todo.org'); - L.push(' theme-studio-palette-generator-spec.org'); - return previewLines(L);} -function renderMu4ePreview(){const a='mu4e',L=[]; - const pad=(s,n)=>{s=String(s);return s.length>=n?s.slice(0,n):s+' '.repeat(n-s.length);}; - // One header line: the flags column in mu4e-header-marks-face, the rest of the - // row in the message's state face (unread, replied, flagged, ...). - const row=(flags,date,from,subj,face)=> - os(a,'mu4e-header-marks-face',pad(flags,4))+os(a,face,pad(date,12)+pad(from,17)+subj); - // status / context bar - L.push(os(a,'mu4e-title-face','mu4e')+' '+os(a,'mu4e-context-face','[Personal]')+' '+os(a,'mu4e-ok-face','online')+' '+os(a,'mu4e-warning-face','2 retrying')+' '+os(a,'mu4e-modeline-face','[12/340]')); - L.push(''); - // column header + the message list, one row per state - L.push(os(a,'mu4e-header-title-face',pad('Flags',4)+pad('Date',12)+pad('From',17)+'Subject')); - L.push(row('N','2026-06-14','Christine Park','Re: quarterly numbers','mu4e-unread-face')); - L.push(row('','2026-06-13','Bob Lin','Lunch on Friday?','mu4e-header-face')); - // current line at point: the whole row gets the highlight background - L.push(os(a,'mu4e-header-highlight-face',row('R','2026-06-13','dev-list','merged the parser fix','mu4e-replied-face'))); - L.push(row('F','2026-06-12','Carol Reyes','Fwd: the signed contract','mu4e-forwarded-face')); - L.push(row('D','2026-06-11','(draft)','Notes to finish later','mu4e-draft-face')); - L.push(row('T','2026-06-10','spam@nowhere','You have won a prize','mu4e-trashed-face')); - L.push(row('','2026-06-09','Erin (cc)','thread you follow','mu4e-related-face')); - L.push(row('!','2026-06-08','Frank Diaz','budget needs sign-off','mu4e-flagged-face')); - L.push(''); - // a message view below the list - L.push(os(a,'mu4e-header-key-face','From:')+' '+os(a,'mu4e-contact-face','Christine Park <christine@example.com>')); - L.push(os(a,'mu4e-header-key-face','To:')+' '+os(a,'mu4e-special-header-value-face','craig, dev-list@gnu.org')); - L.push(os(a,'mu4e-header-key-face','Subject:')+' '+os(a,'mu4e-header-value-face','Re: quarterly numbers')); - L.push(''); - L.push(' Body with a '+os(a,'mu4e-highlight-face','search hit')+', a link '+os(a,'mu4e-url-number-face','[1]')+' '+os(a,'mu4e-link-face','https://example.com')+', and a '+os(a,'mu4e-region-code','code region')+'.'); - L.push(' '+os(a,'mu4e-system-face','*** mu: 340 messages indexed ***')); - L.push(' '+os(a,'mu4e-footer-face','-- Sent with mu4e')); - L.push(''); - L.push(os(a,'mu4e-compose-separator-face','--text follows this line--')); - return previewLines(L);} -function renderGnusPreview(){const a='gnus',L=[]; - // mu4e renders the open message with gnus, so this is the article view: - // a header block, a body with inline emphasis and a button, then a quoted - // reply chain (one cite face per nesting level) and the signature. - L.push(os(a,'gnus-header-name','From: ')+os(a,'gnus-header-from','Christine Park <christine@example.com>')); - L.push(os(a,'gnus-header-name','To: ')+os(a,'gnus-header-content','craig@cjennings.net')); - L.push(os(a,'gnus-header-name','Newsgroups: ')+os(a,'gnus-header-newsgroups','gnu.emacs.help')); - L.push(os(a,'gnus-header-name','Subject: ')+os(a,'gnus-header-subject','Re: quarterly numbers')); - L.push(os(a,'gnus-header-name','Date: ')+os(a,'gnus-header-content','Sat, 14 Jun 2026 09:12:04 -0500')); - L.push(''); - L.push('Thanks for the draft. The '+os(a,'gnus-emphasis-bold','revenue line')+' is '+os(a,'gnus-emphasis-italic','close')+', but the '+os(a,'gnus-emphasis-underline','footnote')+' is '+os(a,'gnus-emphasis-strikethru','wrong')+' '+os(a,'gnus-emphasis-highlight-words','FIXME')+'.'); - L.push('See the worksheet: '+os(a,'gnus-button','[https://example.com/q2]')); - L.push(''); - L.push(os(a,'gnus-cite-attribution','On Fri, Bob Lin wrote:')); - L.push(os(a,'gnus-cite-1','> The Q2 totals are ready for review.')); - L.push(os(a,'gnus-cite-2','>> Did the Segpay refund post yet?')); - L.push(os(a,'gnus-cite-3','>>> Yes, it cleared on the 5th.')); - L.push(os(a,'gnus-cite-4','>>>> Good, then we are square.')); - L.push(os(a,'gnus-cite-5','>>>>> earlier reply, level 5')); - L.push(os(a,'gnus-cite-6','>>>>>> level 6')); - L.push(os(a,'gnus-cite-7','>>>>>>> level 7')); - L.push(os(a,'gnus-cite-8','>>>>>>>> level 8')); - L.push(os(a,'gnus-cite-9','>>>>>>>>> level 9')); - L.push(os(a,'gnus-cite-10','>>>>>>>>>> level 10')); - L.push(os(a,'gnus-cite-11','>>>>>>>>>>> level 11')); - L.push(''); - L.push(os(a,'gnus-signature','-- ')); - L.push(os(a,'gnus-signature','Christine Park, Finance')); - return previewLines(L);} -function renderOrgFacesPreview(){const a='org-faces',L=[]; - L.push('Agenda header row -- one face per keyword and priority (this config, not built-in org):'); - L.push(''); - L.push(os(a,'org-faces-todo','TODO')+' Draft the spec '+os(a,'org-faces-priority-a','[#A]')); - L.push(os(a,'org-faces-project','PROJECT')+' Theme studio overhaul '+os(a,'org-faces-priority-b','[#B]')); - L.push(os(a,'org-faces-doing','DOING')+' Wire the faces '+os(a,'org-faces-priority-c','[#C]')); - L.push(os(a,'org-faces-waiting','WAITING')+' On review '+os(a,'org-faces-priority-d','[#D]')); - L.push(os(a,'org-faces-verify','VERIFY')+' Confirm the round-trip'); - L.push(os(a,'org-faces-stalled','STALLED')+' Blocked on upstream'); - L.push(os(a,'org-faces-delegated','DELEGATED')+' Handed to Kostya'); - L.push(os(a,'org-faces-failed','FAILED')+' Could not reproduce'); - L.push(os(a,'org-faces-done','DONE')+' Shipped the module'); - L.push(os(a,'org-faces-cancelled','CANCELLED')+' Dropped the approach'); - L.push(''); - L.push('Unfocused (auto-dim) -- the -dim variants auto-dim remaps onto in non-selected windows:'); - L.push(''); - L.push(os(a,'org-faces-todo-dim','TODO')+' Draft the spec '+os(a,'org-faces-priority-a-dim','[#A]')); - L.push(os(a,'org-faces-project-dim','PROJECT')+' Theme studio overhaul '+os(a,'org-faces-priority-b-dim','[#B]')); - L.push(os(a,'org-faces-doing-dim','DOING')+' Wire the faces '+os(a,'org-faces-priority-c-dim','[#C]')); - L.push(os(a,'org-faces-waiting-dim','WAITING')+' On review '+os(a,'org-faces-priority-d-dim','[#D]')); - L.push(os(a,'org-faces-verify-dim','VERIFY')+' Confirm the round-trip'); - L.push(os(a,'org-faces-stalled-dim','STALLED')+' Blocked on upstream'); - L.push(os(a,'org-faces-delegated-dim','DELEGATED')+' Handed to Kostya'); - L.push(os(a,'org-faces-failed-dim','FAILED')+' Could not reproduce'); - L.push(os(a,'org-faces-done-dim','DONE')+' Shipped the module'); - L.push(os(a,'org-faces-cancelled-dim','CANCELLED')+' Dropped the approach'); - return previewLines(L);} -function renderLspPreview(){const a='lsp-mode',L=[]; - L.push(os(a,'lsp-signature-face','process(')+os(a,'lsp-signature-highlight-function-argument','items: list')+os(a,'lsp-signature-face',') -> None')); - L.push(os(a,'lsp-signature-posframe',' docs: iterate over items and process each one ')); - L.push(''); - L.push('def process(items):'); - L.push(' n = len(items)'+os(a,'lsp-inlay-hint-type-face',': int')); - L.push(' handle('+os(a,'lsp-inlay-hint-parameter-face','arg:')+'n)'+os(a,'lsp-inlay-hint-face',' # hint')); - L.push(' '+os(a,'lsp-face-highlight-read','value')+' = '+os(a,'lsp-face-highlight-write','value')+' + '+os(a,'lsp-face-highlight-textual','value')); - L.push(' rename '+os(a,'lsp-face-rename','oldName')+' to '+os(a,'lsp-rename-placeholder-face','newName')); - L.push(' getName() '+os(a,'lsp-details-face','str the cached getter')); - L.push(''); - L.push(os(a,'lsp-installation-buffer-face','Installing pyright...')+' '+os(a,'lsp-installation-finished-buffer-face','done.')); - return previewLines(L);} -function renderGitGutterPreview(){const a='git-gutter',L=[]; - L.push(os(a,'git-gutter:added','+')+os(a,'git-gutter:separator','|')+' added line of code'); - L.push(os(a,'git-gutter:modified','~')+os(a,'git-gutter:separator','|')+' modified line of code'); - L.push(os(a,'git-gutter:deleted','_')+os(a,'git-gutter:separator','|')+' (deleted lines marker)'); - L.push(os(a,'git-gutter:unchanged',' ')+os(a,'git-gutter:separator','|')+' '+os(a,'git-gutter:unchanged','unchanged line of code')); - return previewLines(L);} -function renderFlycheckPreview(){const a='flycheck',L=[]; - L.push(os(a,'flycheck-fringe-error','E')+os(a,'flycheck-fringe-warning','W')+os(a,'flycheck-fringe-info','I')+' x = '+os(a,'flycheck-error','undefined_name')+'('+os(a,'flycheck-warning','unused_arg')+') '+os(a,'flycheck-info','# note')); - L.push(' '+os(a,'flycheck-error-delimiter','[')+os(a,'flycheck-delimited-error','err')+os(a,'flycheck-error-delimiter',']')); - L.push(''); - L.push(os(a,'flycheck-error-list-checker-name','pyright')+' '+os(a,'flycheck-verify-select-checker','(selected checker)')); - L.push(os(a,'flycheck-error-list-filename','main.py')+':'+os(a,'flycheck-error-list-line-number','12')+':'+os(a,'flycheck-error-list-column-number','4')+' '+os(a,'flycheck-error-list-error','error')+' '+os(a,'flycheck-error-list-error-message','undefined name x')+' '+os(a,'flycheck-error-list-id','[E0602]')); - L.push(os(a,'flycheck-error-list-filename','main.py')+':'+os(a,'flycheck-error-list-line-number','18')+':'+os(a,'flycheck-error-list-column-number','1')+' '+os(a,'flycheck-error-list-warning','warning')+' '+os(a,'flycheck-error-list-error-message','unused import')+' '+os(a,'flycheck-error-list-id-with-explainer','[W0611?]')); - L.push(os(a,'flycheck-error-list-highlight','main.py:20 '+os(a,'flycheck-error-list-info','info')+' highlighted row')); - return previewLines(L);} -function renderDiredPreview(){const a='dired',L=[]; - L.push(os(a,'dired-header','/home/craig/code:')); - L.push(' '+os(a,'dired-perm-write','drwxr-xr-x')+' craig 4096 '+os(a,'dired-directory','src/')); - L.push(' -rw-r--r-- craig 120 notes.org'); - L.push(' '+os(a,'dired-perm-write','lrwxrwxrwx')+' craig 18 '+os(a,'dired-symlink','latest -> v2.1')); - L.push(' lrwxrwxrwx craig -- '+os(a,'dired-broken-symlink','dead -> gone')); - L.push(os(a,'dired-flagged','D')+' -rw-r--r-- craig 40 deleteme.tmp'); - L.push(os(a,'dired-mark','*')+' '+os(a,'dired-marked','-rw-r--r-- craig 210 marked.txt')); - L.push(' -rw-r--r-- craig 0 '+os(a,'dired-ignored','.gitignore')); - L.push(' '+os(a,'dired-set-id','-rwsr-xr-x')+' root 900 setuid.bin'); - L.push(' '+os(a,'dired-special','prw-r--r--')+' craig 0 fifo.pipe'); - L.push(os(a,'dired-warning','! disk space low on /home')); - return previewLines(L);} -function renderDirvishPreview(){const a='dirvish',L=[]; - L.push(os(a,'dirvish-inactive','~/code')+' '+os(a,'dirvish-free-space','[free 24G]')); - L.push(os(a,'dirvish-hl-line',' '+os(a,'dirvish-file-modes','-rw-r--r--')+' '+os(a,'dirvish-file-link-number','1')+' '+os(a,'dirvish-file-user-id','craig')+' '+os(a,'dirvish-file-group-id','staff')+' '+os(a,'dirvish-file-size','4.0K')+' '+os(a,'dirvish-file-time','Jun 8 02:24')+' init.el ')); - L.push(' '+os(a,'dirvish-file-modes','drwxr-xr-x')+' '+os(a,'dirvish-file-link-number','5')+' '+os(a,'dirvish-file-user-id','craig')+' '+os(a,'dirvish-file-group-id','staff')+' '+os(a,'dirvish-file-size',' - ')+' '+os(a,'dirvish-file-time','Jun 7 18:00')+' '+os(a,'dirvish-collapse-dir-face','src')+os(a,'dirvish-subtree-state','+')+os(a,'dirvish-subtree-guide',' |')); - L.push(os(a,'dirvish-hl-line-inactive',' inactive-window current line ')); - L.push(' inode '+os(a,'dirvish-file-inode-number','1048576')+' dev '+os(a,'dirvish-file-device-number','8,1')+' '+os(a,'dirvish-collapse-empty-dir-face','empty/')+' '+os(a,'dirvish-collapse-file-face','file.txt')); - L.push(' VC '+os(a,'dirvish-vc-added-state','A')+os(a,'dirvish-vc-edited-state','M')+os(a,'dirvish-vc-removed-state','D')+os(a,'dirvish-vc-conflict-state','C')+os(a,'dirvish-vc-locked-state','L')+os(a,'dirvish-vc-missing-state','!')+os(a,'dirvish-vc-needs-merge-face','m')+os(a,'dirvish-vc-needs-update-state','u')+os(a,'dirvish-vc-unregistered-face','?')); - L.push(' git '+os(a,'dirvish-git-commit-message-face','feat: enlarge the picker')); - L.push(' '+os(a,'dirvish-media-info-heading','Media')+' '+os(a,'dirvish-media-info-property-key','Dimensions:')+' 1920x1080'); - L.push(' proc '+os(a,'dirvish-proc-running','running')+' / '+os(a,'dirvish-proc-finished','finished')+' / '+os(a,'dirvish-proc-failed','failed')); - L.push(' narrow '+os(a,'dirvish-narrow-match-face-0','m0')+' '+os(a,'dirvish-narrow-match-face-1','m1')+' '+os(a,'dirvish-narrow-match-face-2','m2')+' '+os(a,'dirvish-narrow-match-face-3','m3')+os(a,'dirvish-narrow-split',' | ')+os(a,'dirvish-emerge-group-title','Group: images')); - return previewLines(L);} -function renderCalibredbPreview(){const a='calibredb',L=[]; - L.push(os(a,'calibredb-search-header-library-name-face','Calibre')+' '+os(a,'calibredb-search-header-library-path-face','~/books')+' '+os(a,'calibredb-search-header-total-face','412 books')+' '+os(a,'calibredb-search-header-filter-face','tag:scifi')+' '+os(a,'calibredb-search-header-sort-face','sort:date')+' '+os(a,'calibredb-search-header-highlight-face','[*]')); - L.push(''); - L.push(os(a,'calibredb-id-face','1')+' '+os(a,'calibredb-title-face','Dune')+' '+os(a,'calibredb-author-face','Herbert')+' '+os(a,'calibredb-format-face','EPUB')+' '+os(a,'calibredb-size-face','2.1M')+' '+os(a,'calibredb-tag-face',':scifi:')+' '+os(a,'calibredb-date-face','2026-06-08')); - L.push(os(a,'calibredb-mark-face','*')+os(a,'calibredb-id-face','2')+' '+os(a,'calibredb-title-face','Foundation')+' '+os(a,'calibredb-author-face','Asimov')+' '+os(a,'calibredb-series-face','[Foundation #1]')+' '+os(a,'calibredb-publisher-face','Bantam')+' '+os(a,'calibredb-pubdate-face','1951')); - L.push(''); - L.push(os(a,'calibredb-title-detailed-view-face','Foundation (detailed)')+' '+os(a,'calibredb-language-face','eng')+' '+os(a,'calibredb-favorite-face','* fav')+' '+os(a,'calibredb-archive-face','archived')); - L.push(os(a,'calibredb-ids-face','isbn:0553293354')+' '+os(a,'calibredb-file-face','foundation.epub')+' '+os(a,'calibredb-comment-face','A classic of the genre.')); - L.push(os(a,'calibredb-edit-annotation-header-title-face','Annotations')+' '+os(a,'calibredb-highlight-face','highlighted passage')+' '+os(a,'calibredb-current-page-button-face','[page 42]')+' '+os(a,'calibredb-mouse-face','hover row')); - return previewLines(L);} -function renderErcPreview(){const a='erc',L=[]; - L.push(os(a,'erc-header-line',' #emacs on Libera.Chat 18 users ')); - L.push(os(a,'erc-timestamp-face','[10:24]')+' '+os(a,'erc-notice-face','*** alice has joined #emacs')); - L.push(os(a,'erc-timestamp-face','[10:25]')+' <'+os(a,'erc-my-nick-prefix-face','@')+os(a,'erc-my-nick-face','craig')+'> '+os(a,'erc-input-face','hello everyone')); - L.push(os(a,'erc-timestamp-face','[10:25]')+' <'+os(a,'erc-nick-prefix-face','+')+os(a,'erc-nick-default-face','bob')+'> '+os(a,'erc-default-face','hi craig, see ')+os(a,'erc-button','this link')+os(a,'erc-default-face',' cc ')+os(a,'erc-button-nick-default-face','@alice')); - L.push(os(a,'erc-timestamp-face','[10:26]')+' '+os(a,'erc-action-face','* craig waves')+' '+os(a,'erc-keyword-face','emacs')+' '+os(a,'erc-pal-face','<friend>')+' '+os(a,'erc-fool-face','<troll>')+' '+os(a,'erc-dangerous-host-face','<bad@host>')); - L.push(os(a,'erc-timestamp-face','[10:27]')+' '+os(a,'erc-direct-msg-face','(DM)')+' <'+os(a,'erc-nick-msg-face','bob')+'> psst '+os(a,'erc-current-nick-face','craig')+' '+os(a,'erc-information','-info-')); - L.push(os(a,'erc-error-face','*** ERROR: connection reset')); - L.push(os(a,'erc-command-indicator-face','/help')+' '+os(a,'erc-bold-face','bold')+' '+os(a,'erc-italic-face','italic')+' '+os(a,'erc-underline-face','underline')+' '+os(a,'erc-inverse-face','inverse')+' '+os(a,'erc-spoiler-face','spoiler')); - L.push(os(a,'erc-keep-place-indicator-arrow','>')+os(a,'erc-keep-place-indicator-line',' ---- last read ---- ')+os(a,'erc-fill-wrap-merge-indicator-face','+')); - L.push(os(a,'erc-prompt-face','craig>')+' '+os(a,'erc-input-face','type a message...')); - return previewLines(L);} -function renderOrgdrillPreview(){const a='org-drill',L=[]; - L.push('Q: The capital of France is '+os(a,'org-drill-hidden-cloze-face','[...]')+'.'); - L.push('A: The capital of France is '+os(a,'org-drill-visible-cloze-face','Paris')+'.'); - L.push(' '+os(a,'org-drill-visible-cloze-hint-face','hint: P____')); - return previewLines(L);} -function renderOrgnoterPreview(){const a='org-noter',L=[]; - L.push('org-noter paper.pdf'); - L.push(' page 1 '+os(a,'org-noter-notes-exist-face','[notes]')); - L.push(' page 2 '+os(a,'org-noter-no-notes-exist-face','[no notes]')); - return previewLines(L);} -function renderSignelPreview(){const a='signel',L=[]; - L.push(os(a,'signel-timestamp-face','[10:24]')+' '+os(a,'signel-my-msg-face','Me: hey, are we still on for tonight?')); - L.push(os(a,'signel-timestamp-face','[10:25]')+' '+os(a,'signel-other-msg-face','Christine: yes! see you at 7')); - L.push(os(a,'signel-error-face','(failed to send -- retrying)')); - return previewLines(L);} -function renderPearlPreview(){const a='pearl',L=[]; - L.push(os(a,'pearl-preamble-summary','PEARL-42 Fix the broken picker')); - L.push('State: '+os(a,'pearl-modified-local','In Progress')+' Priority: '+os(a,'pearl-modified-highlight','High')+' Estimate: '+os(a,'pearl-modified-unknown','?')); - L.push(' '+os(a,'pearl-editable-comment','> add a comment (editable)')); - L.push(' '+os(a,'pearl-readonly-comment','> created by automation (read-only)')); - return previewLines(L);} -function renderShrPreview(){const a='shr',L=[]; - L.push(os(a,'shr-text','shr renders nov (EPUB), eww (web), elfeed, and HTML mail.')); - L.push(''); - L.push(os(a,'shr-h1','Chapter One: The Beginning')); - L.push(os(a,'shr-h2','A Section Heading')); - L.push(os(a,'shr-h3','A subsection')+' '+os(a,'shr-h4','h4')+' / '+os(a,'shr-h5','h5')+' / '+os(a,'shr-h6','h6')); - L.push(os(a,'shr-text','Body text flows in shr-text, with a ')+os(a,'shr-link','hyperlink')+os(a,'shr-text',' and a ')+os(a,'shr-selected-link','focused link')+os(a,'shr-text',',')); - L.push(os(a,'shr-text','some ')+os(a,'shr-code','inline_code()')+os(a,'shr-text',', a ')+os(a,'shr-mark','highlighted mark')+os(a,'shr-text',', ')+os(a,'shr-strike-through','struck out')+os(a,'shr-text',', a footnote')+os(a,'shr-sup','[1]')+os(a,'shr-text',',')); - L.push(os(a,'shr-text','an ')+os(a,'shr-abbreviation','HTML')+os(a,'shr-text',' abbreviation, and an ')+os(a,'shr-sliced-image','[image]')+os(a,'shr-text',' slice.')); - return previewLines(L);} -function renderSlackPreview(){const a='slack',L=[]; - L.push(os(a,'slack-room-info-title-room-name-face','#general')+' '+os(a,'slack-room-info-title-face','Acme Workspace')); - L.push(os(a,'slack-room-info-section-title-face','Topic')+' '+os(a,'slack-room-info-section-label-face','daily standup')+' '+os(a,'slack-room-unread-face','3 unread')); - L.push(os(a,'slack-new-message-marker-face','---------------- new messages ----------------')); - L.push(os(a,'slack-message-output-header','craig 10:24')); - L.push(' '+os(a,'slack-message-output-text','hey ')+os(a,'slack-message-mention-me-face','@craig')+os(a,'slack-message-output-text',', see ')+os(a,'slack-message-mention-face','@alice')+os(a,'slack-message-output-text',' in ')+os(a,'slack-channel-button-face','#general')+' '+os(a,'slack-message-mention-keyword-face','urgent')); - L.push(' '+os(a,'slack-mrkdwn-bold-face','*bold*')+' '+os(a,'slack-mrkdwn-italic-face','_italic_')+' '+os(a,'slack-mrkdwn-code-face','`code`')+' '+os(a,'slack-mrkdwn-strike-face','~strike~')); - L.push(' '+os(a,'slack-mrkdwn-blockquote-face','> quoted')+' '+os(a,'slack-mrkdwn-list-face','- item')); - L.push(' '+os(a,'slack-mrkdwn-code-block-face','``` code block ```')); - L.push(' '+os(a,'slack-message-output-reaction',':thumbsup: 3')+' '+os(a,'slack-message-output-reaction-pressed',':heart: 1')+' '+os(a,'slack-message-deleted-face','(message deleted)')); - L.push(' '+os(a,'slack-all-thread-buffer-thread-header-face','Thread: 2 replies')); - L.push(os(a,'slack-attachment-header','Attachment')+' '+os(a,'slack-attachment-field-title','Field:')+' val '+os(a,'slack-message-attachment-preview-header-face','Preview')+' '+os(a,'slack-preview-face','snippet')+os(a,'slack-attachment-pad',' | ')+os(a,'slack-attachment-footer','footer')); - L.push(os(a,'slack-block-highlight-source-overlay-face',' highlighted source block ')); - L.push('Actions: '+os(a,'slack-message-action-face','Edit')+' '+os(a,'slack-message-action-primary-face','Approve')+' '+os(a,'slack-message-action-danger-face','Delete')); - L.push('Blocks: '+os(a,'slack-button-block-element-face','[Button]')+os(a,'slack-button-primary-block-element-face','[Primary]')+os(a,'slack-button-danger-block-element-face','[Danger]')+os(a,'slack-select-block-element-face','[Select v]')+os(a,'slack-overflow-block-element-face','[...]')+os(a,'slack-date-picker-block-element-face','[Date]')); - L.push('Dialog: '+os(a,'slack-dialog-title-face','Title')+' '+os(a,'slack-dialog-element-label-face','Label')+' '+os(a,'slack-dialog-element-hint-face','(hint)')+' '+os(a,'slack-dialog-element-placeholder-face','placeholder')+' '+os(a,'slack-dialog-element-error-face','error')+' '+os(a,'slack-dialog-select-element-input-face','[input v]')+' '+os(a,'slack-dialog-submit-button-face','[Submit]')+os(a,'slack-dialog-cancel-button-face','[Cancel]')); - L.push('Users: '+os(a,'slack-user-active-face','alice (active)')+' '+os(a,'slack-user-dnd-face','bob (dnd)')+' '+os(a,'slack-profile-image-face','[img]')+' '+os(a,'slack-user-profile-header-face','Profile')+' '+os(a,'slack-user-profile-property-name-face','Title:')+' Dev'); - L.push('Search: '+os(a,'slack-search-result-message-header-face','#general')+' '+os(a,'slack-search-result-message-username-face','craig')); - L.push('Modeline: '+os(a,'slack-modeline-has-unreads-face','* unreads')+' '+os(a,'slack-modeline-channel-has-unreads-face','#ch')+' '+os(a,'slack-modeline-thread-has-unreads-face','thread')); - return previewLines(L);} -function renderTelegaPreview(){const a='telega',L=[]; - L.push(os(a,'telega-root-heading','Telegram')+' '+os(a,'telega-tracking','[tracking]')+' '+os(a,'telega-unread-unmuted-modeline','5 unread')); - L.push(os(a,'telega-has-chatbuf-brackets','[')+os(a,'telega-username','Christine')+os(a,'telega-has-chatbuf-brackets',']')+' '+os(a,'telega-user-online-status','online')+' '+os(a,'telega-unmuted-count','3')+' '+os(a,'telega-mention-count','@2')+os(a,'telega-delim-face',' | ')+os(a,'telega-secret-title','Secret')+' '+os(a,'telega-muted-count','muted')); - L.push(os(a,'telega-username','Bob')+' '+os(a,'telega-user-non-online-status','last seen recently')+' '+os(a,'telega-contact-birthdays-today','birthday today')+' '+os(a,'telega-shadow','shadow')+' '+os(a,'telega-link','link')+' '+os(a,'telega-blue','blue')+' '+os(a,'telega-red','red')); - L.push(''); - L.push(os(a,'telega-msg-heading','Today')); - L.push(os(a,'telega-msg-user-title','Christine')+' '+os(a,'telega-msg-inline-reply','| reply to Bob')+' '+os(a,'telega-msg-inline-forward','fwd from Carol')+' '+os(a,'telega-msg-inline-other','via bot')); - L.push(' '+os(a,'telega-entity-type-bold','bold')+' '+os(a,'telega-entity-type-italic','italic')+' '+os(a,'telega-entity-type-underline','underline')+' '+os(a,'telega-entity-type-strikethrough','strike')+' '+os(a,'telega-entity-type-code','code')+' '+os(a,'telega-entity-type-spoiler','spoiler')); - L.push(' '+os(a,'telega-entity-type-pre','pre block')+' '+os(a,'telega-entity-type-blockquote','> quote')+' '+os(a,'telega-entity-type-mention','@user')+' '+os(a,'telega-entity-type-hashtag','#tag')+' '+os(a,'telega-entity-type-cashtag','$USD')+' '+os(a,'telega-entity-type-botcommand','/start')+' '+os(a,'telega-entity-type-texturl','link')); - L.push(os(a,'telega-msg-self-title','Me')+' '+os(a,'telega-reaction',':+1: 2')+' '+os(a,'telega-reaction-chosen',':heart: 1')+' '+os(a,'telega-reaction-paid',':star: 5')+' '+os(a,'telega-reaction-paid-chosen',':star: paid')+' '+os(a,'telega-msg-deleted','(deleted)')+' '+os(a,'telega-msg-sponsored','Sponsored')); - L.push(' checklist '+os(a,'telega-checklist-stats-done','2 done')+' / '+os(a,'telega-checklist-stats-todo','3 todo')+' '+os(a,'telega-highlight-text-face','search hit')+' '+os(a,'telega-button-highlight','[active btn]')); - L.push(os(a,'telega-chat-prompt','>')+' '+os(a,'telega-chat-prompt-aux','reply')+' '+os(a,'telega-chat-input-attachment','[photo.jpg]')+' '+os(a,'telega-topic-button','# Topic')+' '+os(a,'telega-filter-active','Main')+' '+os(a,'telega-filter-button-active','[Unread]')+os(a,'telega-filter-button-inactive','[All]')); - L.push('Buttons '+os(a,'telega-box-button','[box]')+os(a,'telega-box-button-active','[on]')+os(a,'telega-box-button-default-active','[def]')+os(a,'telega-box-button-default-passive','[def-]')+os(a,'telega-box-button-primary-active','[pri]')+os(a,'telega-box-button-primary-passive','[pri-]')+os(a,'telega-box-button-success-active','[ok]')+os(a,'telega-box-button-success-passive','[ok-]')); - L.push(' '+os(a,'telega-box-button-danger-active','[del]')+os(a,'telega-box-button-danger-passive','[del-]')+os(a,'telega-box-button-ui-active','[ui]')+os(a,'telega-box-button-ui-passive','[ui-]')+os(a,'telega-box-button2-active','[b2]')+os(a,'telega-box-button2-passive','[b2-]')+os(a,'telega-box-button2-white-foreground','[b2w]')); - L.push('Describe '+os(a,'telega-describe-section-title','Section')+' '+os(a,'telega-describe-subsection-title','Sub')+' '+os(a,'telega-describe-item-title','Item:')+' enckey '+os(a,'telega-enckey-00','00')+os(a,'telega-enckey-01','01')+os(a,'telega-enckey-10','10')+os(a,'telega-enckey-11','11')); - L.push('Palette '+os(a,'telega-palette-builtin-blue','blue')+' '+os(a,'telega-palette-builtin-green','green')+' '+os(a,'telega-palette-builtin-orange','orange')+' '+os(a,'telega-palette-builtin-purple','purple')); - L.push(os(a,'telega-link-preview-sitename','example.com')+' '+os(a,'telega-link-preview-title','Link preview title')); - L.push('Webpage '+os(a,'telega-webpage-title','Title')+' '+os(a,'telega-webpage-subtitle','Subtitle')+' '+os(a,'telega-webpage-header','Header')+' '+os(a,'telega-webpage-subheader','Subheader')+' '+os(a,'telega-webpage-outline','outline')+' '+os(a,'telega-webpage-fixed','fixed')+' '+os(a,'telega-webpage-preformatted','pre')+' '+os(a,'telega-webpage-marked','marked')+' '+os(a,'telega-webpage-strike-through','strike')+' '+os(a,'telega-webpage-chat-link','chat-link')); - return previewLines(L);} -function genericPreview(app){let h='<div style="padding:10px 14px;font:12pt/1.8 monospace">';for(const [face,label] of APPS[app].faces)h+=`<div data-face="${face}" style="${ofs(app,face)}">${esc(label)}</div>`;return h+'</div>';} -// Bespoke split preview: a focused window beside its auto-dimmed twin, both -// showing the language selected at the top of the page (kept in sync via the -// langsel onchange, which re-runs buildPkgPreview). The left pane carries the -// real per-token syntax colors; the right pane shows what auto-dim does -- every -// default/font-lock face remaps to the single `auto-dim-other-buffers' face, so -// the same code collapses to one faded foreground on the dim background. The -// trailing row demonstrates `auto-dim-other-buffers-hide' (org hidden text whose -// foreground matches the background, so it vanishes in a dimmed window). -function renderAutodimPreview(){ - const a='auto-dim-other-buffers'; - const langsel=document.getElementById('langsel'); - const lang=(langsel&&langsel.value)||Object.keys(SAMPLES)[0]; - const lines=(SAMPLES[lang]||[]).slice(0,9); - let lit=''; - for(const line of lines){ - if(!line.length){lit+='\n';continue;} - for(const [k,t] of line)lit+=`<span data-k="${k}" style="${syntaxStyle(k)}">${esc(t)}</span>`; - lit+='\n';} - const dimFg=effFg(pkgEffFg(a,'auto-dim-other-buffers')),dimBg=pkgEffBg(a,'auto-dim-other-buffers')||'#000000'; - let dim=''; - for(const line of lines){ - if(!line.length){dim+='\n';continue;} - for(const [,t] of line)dim+=esc(t); - dim+='\n';} - const hideFg=effFg(pkgEffFg(a,'auto-dim-other-buffers-hide')),hideBg=pkgEffBg(a,'auto-dim-other-buffers-hide')||dimBg; - const foldText='··· folded body (hidden when dimmed) ···'; - const accent=uf('cursor').bg||'#67809c'; - const pane=(label,body,bg,focused)=> - `<div style="flex:1;min-width:20ch;border:${focused?'2px solid '+accent:'1px solid #2a2a2a'};border-radius:4px;overflow:hidden">` - +`<div style="text-align:center;font:bold 10pt monospace;padding:4px;color:${focused?'#cdced1':'#8a8a8a'};background:${focused?'#1a1a1a':'#0a0a0a'};border-bottom:1px solid #2a2a2a">${label}</div>` - +`<div style="padding:10px 12px;font:12pt/1.6 monospace;white-space:pre;background:${bg}">${body}</div></div>`; - const litBody=lit+'\n'+`<span style="color:#5e6770">${esc(foldText)}</span>`; - const dimBody=`<span data-face="auto-dim-other-buffers" style="color:${dimFg}">${dim}</span>\n` - +`<span data-face="auto-dim-other-buffers-hide" style="color:${hideFg};background:${hideBg}">${esc(foldText)}</span>`; - return `<div style="display:flex;gap:12px;padding:12px 16px;background:${MAP['bg']}">` - +pane('normal',litBody,MAP['bg'],true) - +pane('auto-dim',dimBody,dimBg,false) - +`</div>`; -} -function renderMarkdownPreview(){const a='markdown-mode',L=[]; - const dl='markdown-header-delimiter-face',mk='markdown-markup-face'; - L.push(os(a,mk,'---')); - L.push(os(a,'markdown-metadata-key-face','title:')+' '+os(a,'markdown-metadata-value-face','Project Name')); - L.push(os(a,'markdown-metadata-key-face','version:')+' '+os(a,'markdown-metadata-value-face','1.2.0')); - L.push(os(a,mk,'---')); - L.push(''); - L.push(os(a,dl,'#')+' '+os(a,'markdown-header-face-1','Project Name')); - L.push(''); - L.push(os(a,'markdown-comment-face','<!-- a one-line tagline -->')); - L.push('A library for '+os(a,'markdown-bold-face','**doing things**')+' and '+os(a,'markdown-italic-face','*other things*')+'.'); - L.push(''); - L.push(os(a,dl,'##')+' '+os(a,'markdown-header-face-2','Installation')); - L.push(''); - L.push('Run '+os(a,'markdown-inline-code-face','`npm install project`')+' to get started.'); - L.push(''); - L.push(os(a,mk,'```')+os(a,'markdown-language-keyword-face','sh')); - L.push(os(a,'markdown-pre-face',' git clone https://example.com/project.git')); - L.push(os(a,'markdown-pre-face',' cd project; make')); - L.push(os(a,mk,'```')); - L.push(''); - L.push(os(a,dl,'###')+' '+os(a,'markdown-header-face-3','Usage')); - L.push(''); - L.push(os(a,'markdown-list-face','- ')+'See the '+os(a,'markdown-link-face','[docs]')+os(a,'markdown-url-face','(https://example.com/docs)')+' for details.'); - L.push(os(a,'markdown-list-face','- ')+'Or browse '+os(a,'markdown-plain-url-face','https://example.com')+' directly.'); - L.push(os(a,'markdown-gfm-checkbox-face','- [x]')+' shipped '+os(a,'markdown-gfm-checkbox-face','- [ ]')+' planned'); - L.push(''); - L.push(os(a,'markdown-blockquote-face','> A note worth quoting, with a footnote')+os(a,'markdown-footnote-marker-face','[^1]')+os(a,'markdown-blockquote-face','.')); - L.push(''); - L.push(os(a,'markdown-table-face','| Option | Default |')); - L.push(os(a,'markdown-table-face','|--------|---------|')); - L.push(os(a,'markdown-table-face','| debug | false |')); - L.push(''); - L.push(os(a,'markdown-hr-face','---')); - L.push(''); - L.push(os(a,'markdown-strike-through-face','~~deprecated~~')+' '+os(a,'markdown-highlight-face','==important==')+' '+os(a,'markdown-math-face','$E = mc^2$')); - L.push(os(a,'markdown-html-tag-delimiter-face','<')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','>')+'Ctrl-C'+os(a,'markdown-html-tag-delimiter-face','</')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','>')); - L.push(os(a,'markdown-footnote-marker-face','[^1]:')+' '+os(a,'markdown-footnote-text-face','the footnote text.')); - return previewLines(L);} +// The per-package preview renderers live in previews.js, spliced here so the +// PACKAGE_PREVIEWS registry below can reference them. +PREVIEWS_J const PACKAGE_PREVIEWS={ autodim:renderAutodimPreview,markdown:renderMarkdownPreview, org:renderOrgPreview,magit:renderMagitPreview,elfeed:renderElfeedPreview,ghostel:renderGhostelPreview, @@ -1085,38 +785,37 @@ function worstCellHtml(face){ const report=coveredContrastReport(face); if(report===null)return null; if(report.empty)return '<span title="this overlay has no syntax foreground set yet">no fg set</span>'; - return `<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1))}">${report.worst.ratio.toFixed(1)} ${report.worst.verdict}</span>`; + return `<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1))}">${report.worst.ratio.toFixed(1)}</span>`; } // Repaint every covered overlay face (their floors depend on the syntax palette, // so a syntax-color edit has to refresh them even though it doesn't rebuild the table). function repaintCovered(){COVERED_FACES.forEach(f=>{if(UIMAP[f]&&document.getElementById('uicr-'+f))paintUI(f);});} -function paintUI(face){const pv=document.getElementById('uiprev-'+face);if(!pv)return;const o=UIMAP[face];pv.style.color=effFg(o.fg);pv.style.background=effBg(o.bg);pv.style.fontWeight=o.bold?'bold':'normal';pv.style.fontStyle=o.italic?'italic':'normal';pv.style.textDecoration=(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none';pv.style.boxShadow=boxCss(o.box,effBg(o.bg)); +function paintUI(face){const pv=document.getElementById('uiprev-'+face);if(!pv)return;const o=UIMAP[face];pv.style.color=effFg(o.fg);pv.style.background=effBg(o.bg);pv.style.fontWeight=cssWeight(o.weight);pv.style.fontStyle=o.slant||'normal';pv.style.textDecoration=(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none';pv.style.boxShadow=boxCss(o.box,effBg(o.bg)); const report=coveredContrastReport(face); - pv.querySelectorAll('.crerr').forEach(e=>e.remove()); pv.title=''; - if(report&&report.failures&&report.failures.length){ - const badge=document.createElement('span');badge.className='crerr';badge.textContent=report.worst.ratio.toFixed(1)+' FAIL';badge.title=failureTitle(report);pv.title=badge.title;pv.appendChild(badge); - } - const cr=document.getElementById('uicr-'+face);if(cr){cr.title='';if(report!==null){if(report.empty){cr.title='this overlay has no syntax foreground set yet';cr.innerHTML='<span title="this overlay has no syntax foreground set yet">no fg set</span>';}else{const title=failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1);cr.title=title;cr.innerHTML=`<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(title)}">${report.worst.ratio.toFixed(1)} ${report.worst.verdict}</span>`;}}else{const efg=effFg(o.fg),ebg=effBg(o.bg),r=contrast(efg,ebg);cr.innerHTML=crHtml(r);}}} + const cr=document.getElementById('uicr-'+face);if(cr){cr.title='';if(report!==null){if(report.empty){cr.title='this overlay has no syntax foreground set yet';cr.innerHTML='<span title="this overlay has no syntax foreground set yet">no fg set</span>';}else{const title=failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1);cr.title=title;cr.innerHTML=`<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(title)}">${report.worst.ratio.toFixed(1)}</span>`;}}else{const efg=effFg(o.fg),ebg=effBg(o.bg),r=contrast(efg,ebg);cr.innerHTML=crHtml(r);}}} function buildUITable(){ const tb=document.getElementById('uibody');tb.innerHTML=''; for(const [face,label,ex] of UI_FACES){ const tr=document.createElement('tr');tr.dataset.face=face; - const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.style.cursor='pointer';c0.title='flash this face in the live preview';c0.onclick=()=>flashUiPreview(face); + const exp=mkExpander(UIMAP[face],tableColCount('uitable'),()=>{paintUI(face);buildMockFrame();},{expandKey:face,showInheritHeight:true,inheritOptions:[''].concat(BASE_INHERITS),defaultHex:effFg(UIMAP[face].fg),ndCheck:()=>overflowNonDefault(UIMAP[face],DEFAULT_UIMAP[face],true)}); + exp.detail.dataset.detailFor=face; + const c0=document.createElement('td');c0.className='cat';c0.title=composeHoverTitle(FACE_DOCS[face],c0.title);c0.appendChild(exp.btn); + const c0lbl=document.createElement('span');c0lbl.textContent=' '+label;c0lbl.style.cursor='pointer';c0lbl.title='flash this face in the live preview';c0lbl.onclick=()=>flashUiPreview(face);c0.appendChild(c0lbl); const fgSel=uiSelect(face,'fg'),bgSel=uiSelect(face,'bg'); const cF=document.createElement('td');cF.appendChild(fgSel); const cB=document.createElement('td');cB.appendChild(bgSel); const cS=document.createElement('td'); - const stBtns=mkStyleButtons(at=>UIMAP[face][at],at=>{UIMAP[face][at]=!UIMAP[face][at];paintUI(face);buildMockFrame();}); - const uiCluster=document.createElement('div');uiCluster.className='stylecluster';stBtns.forEach(b=>uiCluster.appendChild(b));cS.appendChild(uiCluster); + const stCtls=mkStyleControls(UIMAP[face],()=>{paintUI(face);buildMockFrame();},{defaultHex:effFg(UIMAP[face].fg)}); + const uiCluster=document.createElement('div');uiCluster.className='stylecluster';stCtls.forEach(c=>uiCluster.appendChild(c));cS.appendChild(uiCluster); const cC=document.createElement('td');cC.id='uicr-'+face;cC.style.whiteSpace='nowrap';cC.style.fontSize='10pt'; const cP=document.createElement('td');cP.className='ex';cP.id='uiprev-'+face;cP.textContent=ex;cP.style.padding='4px 10px';cP.style.borderRadius='4px'; const cX=document.createElement('td');const boxCtl=mkBoxControl(()=>UIMAP[face].box,b=>{UIMAP[face].box=b;paintUI(face);buildMockFrame();},{compact:true});cX.appendChild(boxCtl); - const cL=mkLockCell('ui:'+face,[fgSel,bgSel,...stBtns,boxCtl]); - tr.appendChild(c0);tr.appendChild(cL);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cC);tr.appendChild(cP);tr.appendChild(cX);tb.appendChild(tr);paintUI(face); + const cL=mkLockCell('ui:'+face,[fgSel,bgSel,...stCtls,boxCtl,...exp.locks]); + tr.appendChild(cL);tr.appendChild(c0);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cX);tr.appendChild(cC);tr.appendChild(cP);tb.appendChild(tr);tb.appendChild(exp.detail);paintUI(face); } applyTableSort('uibody'); - updateLockToggle('ui'); + updateLockToggle('ui');syncExpandAllBtns(); } // Generic header-click sort, shared by all three tables. Reads a swatch // dropdown's value, a select value, a numeric input, or cell text (numeric when @@ -1126,7 +825,13 @@ function buildUITable(){ let tableSort={}; function cellVal(td){if(!td)return '';const dd=td.querySelector('.cdd');if(dd)return (dd.dataset.val||'').toLowerCase();const s=td.querySelector('select');if(s)return s.value.toLowerCase();const i=td.querySelector('input');if(i)return parseFloat(i.value)||0;const t=td.innerText.trim();const n=parseFloat(t);return (!isNaN(n)&&/^[-\d.]/.test(t))?n:t.toLowerCase();} function srtTable(tbId,col){tableSort[tbId]={col,asc:!(tableSort[tbId]&&tableSort[tbId].col===col&&tableSort[tbId].asc)};applyTableSort(tbId);} -function applyTableSort(tbId){const s=tableSort[tbId];if(!s)return;const tb=document.getElementById(tbId);if(!tb)return;const dir=s.asc?1:-1;const r=[...tb.rows];r.sort((a,b)=>{const x=cellVal(a.cells[s.col]),y=cellVal(b.cells[s.col]);return ((typeof x==='number'&&typeof y==='number')?x-y:(x<y?-1:x>y?1:0))*dir;});r.forEach(x=>tb.appendChild(x));} +function applyTableSort(tbId){const s=tableSort[tbId];if(!s)return;const tb=document.getElementById(tbId);if(!tb)return;const dir=s.asc?1:-1; + // Sort only the main rows; each expander detail row rides along right after its + // parent (matched by data-detail-for) so a sort never separates the pair. + const details={};[...tb.rows].forEach(x=>{if(x.classList.contains('detailrow'))details[x.dataset.detailFor]=x;}); + const mains=[...tb.rows].filter(x=>!x.classList.contains('detailrow')); + mains.sort((a,b)=>{const x=cellVal(a.cells[s.col]),y=cellVal(b.cells[s.col]);return ((typeof x==='number'&&typeof y==='number')?x-y:(x<y?-1:x>y?1:0))*dir;}); + mains.forEach(x=>{tb.appendChild(x);const key=x.dataset.face||x.dataset.kind;if(key&&details[key])tb.appendChild(details[key]);});} function initApp(){ paletteShowFull=false; // open collapsed to base colors; the arrow expands the spans buildLangSel();buildViewSel();renderPalette();rebuildColorTables();renderCode();applyGround(); diff --git a/scripts/theme-studio/app_inventory.py b/scripts/theme-studio/app_inventory.py index ed904b119..11ca605d1 100644 --- a/scripts/theme-studio/app_inventory.py +++ b/scripts/theme-studio/app_inventory.py @@ -7,33 +7,14 @@ import os from collections.abc import Sequence from typing import Any +from face_data import BESPOKE_APP_SPECS -BESPOKE_APPS = { - "magit", - "elfeed", - "org", - "org-mode", - "mu4e", - "gnus", - "org-faces", - "ghostel", - "auto-dim-other-buffers", - "dashboard", - "lsp-mode", - "git-gutter", - "flycheck", - "dired", - "dirvish", - "calibredb", - "erc", - "org-drill", - "org-noter", - "signel", - "pearl", - "slack", - "telega", - "shr", -} + +# Keys of the bespoke apps (single-sourced in face_data), excluded from the +# generic-inventory path so they aren't also emitted as plain inventory apps. +# "org" is an explicit alias of the "org-mode" bespoke app, so an inventory +# package literally named "org" never gets a duplicate generic entry. +BESPOKE_APPS = {spec[0] for spec in BESPOKE_APP_SPECS} | {"org"} # Inventory apps (not in BESPOKE_APPS) default to the generic preview. A few have diff --git a/scripts/theme-studio/browser-gates.js b/scripts/theme-studio/browser-gates.js index de11bc3ee..503d7ea11 100644 --- a/scripts/theme-studio/browser-gates.js +++ b/scripts/theme-studio/browser-gates.js @@ -1,7 +1,56 @@ +// Shared gate harness. Each call site keeps its literal location.hash==='#NAMEtest' +// check (run-tests.sh greps it); gate() owns the ok/notes/A setup and the verdict +// postamble. Note format standardized to ' fails=note1,note2'. +function gate(id, body){ + const name=id.toUpperCase(); + let ok=true;const notes=[]; + const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; + body(A); + const verdict=name+' '+(ok?'PASS':'FAIL'); + document.title=verdict; + const d=document.createElement('div');d.id=id; + d.textContent=verdict+(notes.length?' fails='+notes.join(','):''); + document.body.appendChild(d); +} +function withSavedState(keys, body){ + // Snapshot the named studio globals, run BODY, then restore them in a finally + // so opening the studio at a #gate hash doesn't leave its state mutated for + // interactive use. Each key maps to a [get, set, clone] triple over the live + // let-binding. Scope the keys to what the gate actually touches. + // JSON clone (not structuredClone): the studio data objects carry values + // structuredClone throws on, and a JSON round-trip of the data is exactly what + // the gates' own local saves already use. + const jc=x=>JSON.parse(JSON.stringify(x)); + const reg={ + PALETTE:[()=>PALETTE, v=>{PALETTE=v;}, jc], + MAP:[()=>MAP, v=>{MAP=v;}, jc], + SYNTAX:[()=>SYNTAX, v=>{SYNTAX=v;}, jc], + UIMAP:[()=>UIMAP, v=>{UIMAP=v;}, jc], + PKGMAP:[()=>PKGMAP, v=>{PKGMAP=v;}, jc], + LOCKED:[()=>LOCKED, v=>{LOCKED.clear();for(const k of v)LOCKED.add(k);}, s=>new Set(s)], + }; + const snap=keys.map(k=>[k, reg[k][2](reg[k][0]())]); + try{ body(); } + finally{ for(const [k,v] of snap) reg[k][1](v); } +} +// Shared preview-face validator for the #mdtest / #mupreviewtest / #gnustest +// gates: render HTML into a detached div, then assert it exercises at least +// MINCOUNT data-faces, that every data-face is a real face of the package +// (drawn from FACES, the app's face rows), and that each face in REQUIRED is +// present. A is the gate's assertion collector; NAME labels the failure note. +function assertPreviewFaces(A, html, faces, minCount, name, required){ + const box=document.createElement('div');box.innerHTML=html; + const valid=new Set((faces||[]).map(r=>r[0])); + const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); + A(used.length>=minCount,'preview exercises many faces ('+used.length+')'); + const bad=used.filter(f=>!valid.has(f)); + A(bad.length===0,'every data-face is a real '+name+' face; bad='+bad.join(',')); + for(const f of required) A(used.includes(f),'preview includes '+f); +} // Phase-1 self-test (open with #selftest): seed -> export -> import -> compare. function pkgSelftest(){ const seeded=seedPkgmap(); - seeded['org-mode']['org-level-2']={fg:'#e8bd30',bg:null,bold:false,italic:false,inherit:'org-level-1',height:1.2,source:'user'}; + seeded['org-mode']['org-level-2']={fg:'#e8bd30',bg:null,weight:null,slant:null,inherit:'org-level-1',height:1.2,source:'user'}; const exp=packagesForExport(seeded); const round=seedPkgmap();mergePackagesInto(round,exp); const roundtrip=JSON.stringify(exp)===JSON.stringify(packagesForExport(round)); @@ -9,11 +58,11 @@ function pkgSelftest(){ const l2=exp['org-mode']['org-level-2']; const inherited=l2.inherit==='org-level-1'&&l2.source==='user'; const height=l2.height===1.2 && !('height' in (exp['org-mode']['org-todo'])); - const sc=seedPkgmap();sc['org-mode']['org-todo']={fg:null,bg:null,bold:false,italic:false,inherit:null,height:1,source:'cleared'}; + const sc=seedPkgmap();sc['org-mode']['org-todo']={fg:null,bg:null,weight:null,slant:null,inherit:null,height:1,source:'cleared'}; const cleared='org-todo' in packagesForExport(sc)['org-mode']; const su=seedPkgmap();mergePackagesInto(su,{'zzz-pkg':{'zzz-face':{fg:'#112233',source:'user'}}}); const unknown=!!(su['zzz-pkg']&&su['zzz-pkg']['zzz-face'].fg==='#112233'); - PKGMAP['__cyc']={a:{fg:null,bg:null,bold:false,italic:false,inherit:'b',height:1,source:'user'},b:{fg:null,bg:null,bold:false,italic:false,inherit:'a',height:1,source:'user'}}; + PKGMAP['__cyc']={a:{fg:null,bg:null,weight:null,slant:null,inherit:'b',height:1,source:'user'},b:{fg:null,bg:null,weight:null,slant:null,inherit:'a',height:1,source:'user'}}; let cyc=true;try{pkgEffFg('__cyc','a');}catch(e){cyc=false;}delete PKGMAP['__cyc']; const verdict=(roundtrip&&oldjson&&inherited&&height&&cleared&&unknown&&cyc)?'PASS':'FAIL'; document.title='SELFTEST '+verdict; @@ -24,7 +73,7 @@ if(location.hash==='#selftest')pkgSelftest(); // preserve, across all three tiers. (1) Locking a row disables its controls via // the shared mkLockCell. (2) reset/erase batch actions update editable rows but // leave locked rows (syntax bare-kind, ui:, pkg: keys) untouched. -if(location.hash==='#locktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#locktest')gate('locktest',A=>withSavedState(['PALETTE','MAP','SYNTAX','UIMAP','PKGMAP','LOCKED'],()=>{ const cssRgb=h=>{const [r,g,b]=hex2rgb(h);return 'rgb('+r+', '+g+', '+b+')';}; LOCKED.clear();buildTable(); {const k=CATS.map(c=>c[0]).filter(k=>k!=='bg'&&k!=='p')[0]; @@ -94,48 +143,46 @@ if(location.hash==='#locktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c if(filter&&faces.length>1){filter.value=faces[0];buildPkgTable();const b=document.getElementById('pkglocktoggle');b.click(); A(faces.every(face=>LOCKED.has('pkg:'+app+':'+face)),'pkg lock-all covers the whole package even when filtered'); filter.value='';buildPkgTable();}} - document.title='LOCKTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='locktest';d.textContent='LOCKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + })); // Sort gate (open with #sorttest): all three tables now share srtTable/cellVal. // Verifies the syntax table (which used to have its own srt) sorts by color // value and by element name, that a repeat click reverses, and that the UI and // package tables still sort. Guards the unified sort for the later stages. -if(location.hash==='#sorttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; - const ddVals=tb=>[...document.querySelectorAll('#'+tb+' tr')].map(tr=>{const dd=tr.cells[2].querySelector('.cdd');return dd?(dd.dataset.val||''):'';}); - const txtVals=tb=>[...document.querySelectorAll('#'+tb+' tr')].map(tr=>tr.cells[0].innerText.trim().toLowerCase()); +if(location.hash==='#sorttest')gate('sorttest',A=>{ + const ddVals=tb=>[...document.querySelectorAll('#'+tb+' tr:not(.detailrow)')].map(tr=>{const dd=tr.cells[2].querySelector('.cdd');return dd?(dd.dataset.val||''):'';}); + const txtVals=tb=>[...document.querySelectorAll('#'+tb+' tr:not(.detailrow)')].map(tr=>tr.cells[1].innerText.trim().toLowerCase()); const asc=a=>a.every((v,i)=>i===0||a[i-1]<=v),desc=a=>a.every((v,i)=>i===0||a[i-1]>=v); buildTable(); srtTable('legbody',2);A(asc(ddVals('legbody')),'legbody-color-asc'); srtTable('legbody',2);A(desc(ddVals('legbody')),'legbody-color-desc'); - srtTable('legbody',0);A(asc(txtVals('legbody')),'legbody-elements-asc'); - buildUITable();srtTable('uibody',0);A(asc(txtVals('uibody')),'uibody-face-asc'); + srtTable('legbody',1);A(asc(txtVals('legbody')),'legbody-elements-asc'); + buildUITable();srtTable('uibody',1);A(asc(txtVals('uibody')),'uibody-face-asc'); buildPkgTable();srtTable('pkgbody',2);A(asc(ddVals('pkgbody')),'pkgbody-fg-asc'); - document.title='SORTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='sorttest';d.textContent='SORTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Live-buffer rendering gate (open with #mocktest): pins the face-faithfulness // fixes so they cannot silently regress — overlay faces keep syntax colors and // honor their styles, the cursor sits on a glyph, line numbers honor weight, the // fringe shows its foreground indicator, and the mode-line carries its box. -if(location.hash==='#mocktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#mocktest')gate('mocktest',A=>withSavedState(['UIMAP','PKGMAP'],()=>{ const Q=s=>document.querySelector('#mockframe '+s); buildMockFrame(); A(Q('[data-face="highlight"] [data-k]'),'highlight-keeps-token-colors'); A(Q('[data-face="region"] [data-k]'),'region-keeps-token-colors'); const curCell=Q('[data-face="cursor"]'); A(curCell&&curCell.textContent.trim().length===1,'cursor-on-glyph'); - UIMAP['cursor']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false,box:null};buildMockFrame(); + UIMAP['cursor']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null,box:null};buildMockFrame(); const curStyled=Q('[data-face="cursor"]'),curSt=curStyled&&curStyled.getAttribute('style')||''; A(curSt.includes('#112233')&&curSt.includes('#aabbcc'),'cursor preview honors fg and bg: '+curSt); - UIMAP['hl-line']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false,box:null};buildMockFrame(); + UIMAP['hl-line']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null,box:null};buildMockFrame(); const hlStyled=Q('[data-face="hl-line"]'),hlSt=hlStyled&&hlStyled.getAttribute('style')||''; A(hlSt.includes('#112233')&&hlSt.includes('#aabbcc'),'hl-line preview honors fg and bg: '+hlSt); - UIMAP['link']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:true,strike:false,box:null};buildMockFrame(); + UIMAP['link']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:{style:'line',color:null},strike:null,box:null};buildMockFrame(); const linkStyled=Q('[data-face="link"]'),linkSt=linkStyled&&linkStyled.getAttribute('style')||''; A(linkSt.includes('#112233')&&linkSt.includes('#aabbcc'),'inline UI face preview honors fg and bg: '+linkSt); const missing=UI_FACES.map(f=>f[0]).filter(f=>!Q('[data-face="'+f+'"]')); A(missing.length===0,'all UI faces are represented in live buffer preview: '+missing.join(',')); buildTable();buildUITable();buildPkgTable(); - [['#legbody tr[data-kind="kw"]',5],['#uibody tr[data-face="mode-line"]',7],['#pkgbody tr',8]].forEach(([sel,idx])=>{ + [['#legbody tr[data-kind="kw"]',5],['#uibody tr[data-face="mode-line"]',5],['#pkgbody tr',5]].forEach(([sel,idx])=>{ const cell=document.querySelector(sel)?.cells[idx],ctl=cell&&cell.querySelector('.boxctl'); A(cell&&ctl&&ctl.getBoundingClientRect().width<=cell.getBoundingClientRect().width,'box control fits its table cell for '+sel); }); @@ -150,28 +197,27 @@ if(location.hash==='#mocktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c const ch=parseFloat(getComputedStyle(textBox).fontSize)*0.65; A(br.left-tr.right<=ch*4.8,'vertical-border-near-text'); }else A(false,'vertical-border-layout-elements-present'); - UIMAP['line-number-current-line'].bold=true;buildMockFrame(); + UIMAP['line-number-current-line'].weight='bold';buildMockFrame(); const curNum=Q('[data-face="line-number-current-line"]'); - A(curNum&&/font-weight:\s*bold/.test(curNum.getAttribute('style')||''),'line-number-honors-weight'); - UIMAP['region'].bold=false;buildUITable(); - const uiBold=[...document.querySelectorAll('#uibody tr')].find(r=>r.dataset.face==='region').querySelector('.sbtn[title="bold"]'); - A(uiBold&&!uiBold.classList.contains('on'),'ui style button starts off when model is false'); - uiBold.click(); - A(uiBold.classList.contains('on')&&UIMAP['region'].bold===true,'ui style button visual state turns on with model'); - uiBold.click(); - A(!uiBold.classList.contains('on')&&UIMAP['region'].bold===false,'ui style button visual state turns off with model'); - const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].bold=false;buildPkgTable(); - const pkgBtn=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"] .sbtn[title="bold"]'); - A(pkgBtn()&&!pkgBtn().classList.contains('on'),'pkg style button starts off when model is false'); - pkgBtn().click(); - A(pkgBtn()&&pkgBtn().classList.contains('on')&&PKGMAP[app][face].bold===true,'pkg style button visual state turns on after rebuild'); - document.title='MOCKTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='mocktest';d.textContent='MOCKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + A(curNum&&/font-weight:\s*700/.test(curNum.getAttribute('style')||''),'line-number-honors-weight'); + UIMAP['region'].weight=null;UIMAP['region'].slant=null;UIMAP['region'].underline=null;buildUITable(); + const regionRow=[...document.querySelectorAll('#uibody tr')].find(r=>r.dataset.face==='region'); + const pickEnum=(dd,label)=>{dd.click();const o=[..._ddPop.querySelectorAll('.enumopt')].find(b=>b.textContent===label);if(o)o.click();}; + const uiWeight=regionRow.querySelector('.enumdd'); + A(uiWeight&&uiWeight.dataset.val==='','ui weight dropdown starts empty when model is unset'); + pickEnum(uiWeight,'bold'); + A(UIMAP['region'].weight==='bold','ui weight dropdown writes the model'); + const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].weight=null;buildPkgTable(); + const pkgWeight=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"] .enumdd'); + A(pkgWeight()&&pkgWeight().dataset.val==='','pkg weight dropdown starts empty when model is unset'); + pickEnum(pkgWeight(),'heavy'); + A(PKGMAP[app][face].weight==='heavy'&&PKGMAP[app][face].source==='user','pkg weight dropdown writes the model and marks the face edited'); + })); // Palette-generator gate (open with #generatortest): previewing is non-mutating, // clicking a generated tile loads the existing selector, adding creates a normal // singleton base column, and appending a preview column commits all span members // under one stable column id. -if(location.hash==='#generatortest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#generatortest')gate('generatortest',A=>{ const before=JSON.stringify(PALETTE); A(document.getElementById('genaccents').value==='5','default accent count is 5'); A(document.getElementById('gensource').value==='palette','default generator source is palette'); @@ -221,12 +267,11 @@ if(location.hash==='#generatortest'){let ok=true;const notes=[];const A=(c,n)=>{ GEN_PROPOSAL={summary:{generated:1,rejected:0,minContrast:null},columns:[{name:'medium-aquamarine',members:[{name:'medium-aquamarine',hex:'#66cdaa',offset:0,columnId:'medium-aquamarine'}]}]}; renderGeneratorPreview(); A(document.querySelector('#genpreview .genchip .gn').textContent==='medium aquamarine','generated tile names display spaces instead of hyphens'); - document.title='GENERATORTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='generatortest';d.textContent='GENERATORTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Auto-dim gate (open with #autodimtest): the bespoke split preview shows the // selected language in both panes -- the left in real syntax colors, the right // collapsed to the single auto-dim-other-buffers face -- and tracks the langsel. -if(location.hash==='#autodimtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#autodimtest')gate('autodimtest',A=>{ const langs=Object.keys(SAMPLES),ls=document.getElementById('langsel'); ls.value=langs[0]; const box=document.createElement('div');box.innerHTML=renderAutodimPreview(); @@ -240,8 +285,7 @@ if(location.hash==='#autodimtest'){let ok=true;const notes=[];const A=(c,n)=>{if if(langs.length>1){const t1=box.textContent;ls.value=langs[1]; const box2=document.createElement('div');box2.innerHTML=renderAutodimPreview(); A(box2.textContent!==t1,'preview tracks the language selector');ls.value=langs[0];} - document.title='AUTODIMTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='autodimtest';d.textContent='AUTODIMTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); if(location.hash.startsWith('#pick')){openPicker();const m=location.hash.slice(5);if(m){const b=document.querySelector('.pmode button[data-m="'+m+'"]');if(b)b.click();}} if(location.hash==='#cursortest'){document.getElementById('newhexstr').value='#67809c';openPicker();const sc=document.getElementById('svcur'),hc=document.getElementById('huecur');const L=parseFloat(sc.style.left||'0'),T=parseFloat(sc.style.top||'0'),H=parseFloat(hc.style.top||'0');const ok=L>1&&T>1&&H>1;document.title='CURSORTEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='cursortest';d.textContent='CURSORTEST '+(ok?'PASS':'FAIL')+' left='+sc.style.left+' top='+sc.style.top+' hue='+hc.style.top;document.body.appendChild(d);} if(location.hash.startsWith('#app')){const ap=location.hash.slice(4),s=document.getElementById('appsel');if(s&&ap){s.value=ap;pkgChanged();}} @@ -292,25 +336,23 @@ if(location.hash==='#readouttest'){const hex='#67809c';document.getElementById(' // Worst-case readout gate (open with #contrasttest): a covered overlay face shows // the floor over its foreground set and names the limiting foreground, an // out-of-scope face keeps the single-pair readout, and an empty set reads "no fg set". -if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#contrasttest')gate('contrasttest',A=>{ const saveMAP=Object.assign({},MAP),saveUI=JSON.parse(JSON.stringify(UIMAP)); CATS.forEach(c=>{if(c[0]!=='bg'&&c[0]!=='p')setSyntaxFg(c[0],'');}); setSyntaxFg('p','#f0fef0');setSyntaxFg('kw','#67809c');setSyntaxFg('str','#a3b18a');setSyntaxFg('bg','#000000'); - UIMAP['region']={fg:null,bg:'#202830',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#202830',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const cell=document.getElementById('uicr-region'); - A(cell&&/^\d+\.\d (PASS|FAIL)$/.test(cell.textContent.trim()),'region shows compact worst-case readout: '+(cell&&cell.textContent)); + A(cell&&/^\d+\.\d$/.test(cell.textContent.trim()),'region shows a bare worst-case number (no PASS/FAIL word): '+(cell&&cell.textContent)); A(cell&&!cell.textContent.includes('#67809c'),'compact readout omits limiting fg details: '+(cell&&cell.textContent)); A(cell&&cell.title.includes('kw (keyword) #67809c'),'hover names failing keyword blue: '+(cell&&cell.title)); - const badge=document.querySelector('#uiprev-region .crerr'); - A(badge&&badge.textContent.trim()===cell.textContent.trim(),'region preview shows failing contrast badge: '+(badge&&badge.textContent)); - A(badge&&badge.title.includes('kw (keyword) #67809c'),'preview badge hover carries failures: '+(badge&&badge.title)); - const firstFail=badge&&badge.title.split('\n')[1]; - A(firstFail&&firstFail.includes('kw (keyword) #67809c'),'failures are sorted from worst first: '+firstFail); + A(!document.querySelector('#uiprev-region .crerr'),'region preview no longer carries a failing-contrast badge'); + const firstFail=cell.title.split('\n')[1]; + A(firstFail&&firstFail.includes('kw (keyword) #67809c'),'failures are sorted from worst first (in the cell hover): '+firstFail); const fl=floor('#202830',fgSetForFace('region').set); A(fl.limitingHex==='#67809c','floor limiting is blue, got '+fl.limitingHex); A(Math.abs(fl.ratio-contrast('#67809c','#202830'))<1e-9,'floor ratio matches blue-on-bg'); - UIMAP['region']={fg:'#f0fef0',bg:'#202830',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:'#f0fef0',bg:'#202830',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const pairCell=document.getElementById('uicr-region'),pairWant=contrast('#f0fef0','#202830'); A(pairCell&&Math.abs(parseFloat(pairCell.textContent)-pairWant)<0.06,'region with explicit fg rates its own fg/bg pair: got '+(pairCell&&pairCell.textContent.trim())+' want '+pairWant.toFixed(1)); @@ -319,23 +361,23 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i const ml=document.getElementById('uicr-mode-line'); A(worstCellHtml('mode-line')===null,'mode-line is out of scope (single-pair)'); A(ml&&/^\d/.test(ml.textContent.trim()),'mode-line cell is a numeric ratio: '+(ml&&ml.textContent)); - UIMAP['region']={fg:null,bg:'#202830',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#202830',weight:null,slant:null,underline:null,strike:null}; setSyntaxFg('p','');CATS.forEach(c=>{if(c[0]!=='bg')setSyntaxFg(c[0],'');});buildUITable(); const empty=document.getElementById('uicr-region'); A(empty&&empty.textContent.trim()==='no fg set','empty set reads the no-set message: '+(empty&&empty.textContent)); // A two-color face (own fg AND own bg) rates its own pair, never the ground bg. - UIMAP['mode-line']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false}; + UIMAP['mode-line']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const two=document.getElementById('uicr-mode-line'),twoWant=contrast('#112233','#aabbcc'); A(two&&Math.abs(parseFloat(two.textContent)-twoWant)<0.06,'ui two-color face rates own fg-on-bg: got '+(two&&two.textContent.trim())+' want '+twoWant.toFixed(1)); const tApp=Object.keys(APPS)[0],tFace=APPS[tApp].faces[0][0],savePF=JSON.parse(JSON.stringify(PKGMAP[tApp][tFace])); Object.assign(PKGMAP[tApp][tFace],{fg:'#112233',bg:'#aabbcc',inherit:null});buildPkgTable(); - const prow=document.querySelector('#pkgbody tr[data-face="'+tFace+'"]'),pcell=prow&&prow.children[5]; + const prow=document.querySelector('#pkgbody tr[data-face="'+tFace+'"]'),pcell=prow&&prow.children[6]; A(pcell&&Math.abs(parseFloat(pcell.textContent)-twoWant)<0.06,'pkg two-color face rates own fg-on-bg: got '+(pcell&&pcell.textContent.trim())+' want '+twoWant.toFixed(1)); PKGMAP[tApp][tFace]=savePF;buildPkgTable(); // A ground-bg change must not clobber a face's own preview bg, must leave a // two-color ratio alone, and must re-rate a ground-dependent face's cell. - UIMAP['fringe']={fg:'#ddeeff',bg:null,bold:false,italic:false,underline:false,strike:false}; + UIMAP['fringe']={fg:'#ddeeff',bg:null,weight:null,slant:null,underline:null,strike:null}; buildUITable(); setSyntaxFg('bg','#440000');applyGround(); const pv=document.getElementById('uiprev-mode-line'); @@ -346,7 +388,7 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i A(frc&&Math.abs(parseFloat(frc.textContent)-frWant)<0.06,'ground change re-rates a ground-dependent face: got '+(frc&&frc.textContent.trim())+' want '+frWant.toFixed(1)); // A default-fg (p) change through the real syntax dropdown re-rates a face // whose fg falls back to it. Drives the DOM so the handler wiring is pinned. - UIMAP['fringe']={fg:null,bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false}; + UIMAP['fringe']={fg:null,bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const pLocked=LOCKED.has('p');if(pLocked){LOCKED.delete('p');buildTable();} const pdd=document.querySelector('#legbody tr[data-kind="p"] .cdd'); @@ -359,14 +401,13 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i }else A(false,'syntax table has a p row with a dropdown'); if(pLocked){LOCKED.add('p');buildTable();} for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();applyGround(); - document.title='CONTRASTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='contrasttest';d.textContent='CONTRASTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Bevel gate (open with #beveltest): released/pressed boxes derive their // highlight and shadow from the face's effective bg per Emacs's relief // algorithm, and pressed draws the shadow edge first. -if(location.hash==='#beveltest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#beveltest')gate('beveltest',A=>{ const saveUI=JSON.parse(JSON.stringify(UIMAP)),saveP=PALETTE.slice(),savePK=JSON.parse(JSON.stringify(PKGMAP)); - UIMAP['mode-line']={fg:'#d8dee9',bg:'#30343c',bold:false,italic:false,underline:false,strike:false,box:{style:'released',width:1,color:null}}; + UIMAP['mode-line']={fg:'#d8dee9',bg:'#30343c',weight:null,slant:null,underline:null,strike:null,box:{style:'released',width:1,color:null}}; buildUITable(); const pv=document.getElementById('uiprev-mode-line'); const bs=pv&&pv.style.boxShadow; @@ -382,22 +423,21 @@ if(location.hash==='#beveltest'){let ok=true;const notes=[];const A=(c,n)=>{if(! A(bs3&&bs3.includes('rgb(255, 42, 42)')&&bs3.includes('rgb(143, 0, 0)'),'released style derives relief from explicit box color: '+bs3); PALETTE=[['#ff0000','red','red'],['#30343c','slate','slate']]; buildUITable(); - const mlrow=document.querySelector('#uibody tr[data-face="mode-line"]'),boxCell=mlrow&&mlrow.cells[7],lineBtn=boxCell&&boxCell.querySelector('.boxbtn[data-style="line"]'),boxDd=boxCell&&boxCell.querySelector('.cdd'); + const mlrow=document.querySelector('#uibody tr[data-face="mode-line"]'),boxCell=mlrow&&mlrow.cells[5],lineBtn=boxCell&&boxCell.querySelector('.boxbtn[data-style="line"]'),boxDd=boxCell&&boxCell.querySelector('.cdd'); if(lineBtn&&boxDd){lineBtn.click();boxDd.click();const redRow=[...document.querySelectorAll('.cddpop .cddgc')].find(c=>(c.dataset.name||'').includes('red'));if(redRow)redRow.click();} A(UIMAP['mode-line'].box&&UIMAP['mode-line'].box.color==='#ff0000','UI box color dropdown writes box.color'); const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].box={style:'line',width:1,color:null};buildPkgTable(); - const prow=document.querySelector('#pkgbody tr[data-face="'+face+'"]'),pbox=prow&&prow.cells[8],pdd=pbox&&pbox.querySelector('.cdd'); + const prow=document.querySelector('#pkgbody tr[data-face="'+face+'"]'),pbox=prow&&prow.cells[5],pdd=pbox&&pbox.querySelector('.cdd'); if(pdd){pdd.click();const redRow=[...document.querySelectorAll('.cddpop .cddgc')].find(c=>(c.dataset.name||'').includes('red'));if(redRow)redRow.click();} A(PKGMAP[app][face].box&&PKGMAP[app][face].box.color==='#ff0000','package box color dropdown writes box.color'); PALETTE=saveP;PKGMAP=savePK;for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();buildPkgTable(); - document.title='BEVELTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='beveltest';d.textContent='BEVELTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Gallery gate (open with #gallerytest): the color dropdown opens a 2D grid in // the palette-panel shape. Driven on a throwaway dropdown so no real face state // is mutated. Covers: grid opens, every palette color has a cell, a cell click // fires onPick + updates the trigger, the pick highlights on reopen, the default // chip clears. -if(location.hash==='#gallerytest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#gallerytest')gate('gallerytest',A=>withSavedState(['MAP','SYNTAX'],()=>{ let picked='__none__'; const dd=mkColorDropdown(ddList(''),'',(hex)=>{picked=hex;},{}); document.body.appendChild(dd); @@ -421,11 +461,10 @@ if(location.hash==='#gallerytest'){let ok=true;const notes=[];const A=(c,n)=>{if trig.click();const defc=document.querySelector('.cddpop.cddgrid .cddgdef');if(defc)defc.click(); A(picked==='','the default chip clears the assignment: '+JSON.stringify(picked)); dd.remove();closeColorDropdown(); - document.title='GALLERYTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='gallerytest';d.textContent='GALLERYTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + })); // Preview-link gate (open with #previewlinktest): known bespoke-preview face // mappings stay wired to the face that Emacs actually uses. -if(location.hash==='#previewlinktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#previewlinktest')gate('previewlinktest',A=>{ const box=document.createElement('div'); box.innerHTML=renderOrgPreview(); const headline=[...box.querySelectorAll('[data-face="org-headline-todo"]')].find(e=>e.textContent.includes('Heading three')); @@ -440,11 +479,10 @@ if(location.hash==='#previewlinktest'){let ok=true;const notes=[];const A=(c,n)= const bob=[...box.querySelectorAll('[data-face="erc-default-face"]')].some(e=>e.textContent.includes('hi craig')); A(own,'erc own sent message uses erc-input-face'); A(bob,'erc remote message uses erc-default-face'); - document.title='PREVIEWLINKTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='previewlinktest';d.textContent='PREVIEWLINKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Safe-lightness gate (open with #safetest): the OKLCH picker shades the unsafe // lightness band for a selected covered face and hides it when no face is selected. -if(location.hash==='#safetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#safetest')gate('safetest',A=>withSavedState(['MAP','SYNTAX'],()=>{ const saveMAP=Object.assign({},MAP); setSyntaxFg('p','#f0fef0');setSyntaxFg('kw','#67809c');setSyntaxFg('bg','#000000'); document.getElementById('newhexstr').value='#202830';openPicker();setPkModel('oklch'); @@ -456,11 +494,10 @@ if(location.hash==='#safetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c A(band&&band.style.display==='none','safe band hidden when no face is selected'); for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);syncSyntaxFromCache(); setPkModel('hsv');closePicker(); - document.title='SAFETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='safetest';d.textContent='SAFETEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + })); // Gone-rebind gate (open with #healtest): deleting a named color then recreating // the name re-points face references stranded on the old hex to the new color. -if(location.hash==='#healtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#healtest')gate('healtest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),savePK=JSON.parse(JSON.stringify(PKGMAP)),saveG=Object.assign({},lastGone),saveSel=selectedIdx; PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue']];setSyntaxFg('kw','#67809c');lastGone={};selectedIdx=null;renderPalette();buildTable(); const blue=[...document.querySelectorAll('#pals .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='blue'); @@ -473,12 +510,11 @@ if(location.hash==='#healtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c A(!('blue' in lastGone),'heal consumed the gone entry'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);PKGMAP=savePK;lastGone=saveG;selectedIdx=saveSel; renderPalette();buildTable();buildUITable();if(document.getElementById('pkgbody'))buildPkgTable(); - document.title='HEALTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='healtest';d.textContent='HEALTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Column-strip gate (open with #columntest): the palette renders as a pinned // ground column plus structural columns, chips keep their controls, and renaming // a color leaves it in the same strip because the column id is stable. -if(location.hash==='#columntest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#columntest')gate('columntest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveG=Object.assign({},lastGone),saveSel=selectedIdx; setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0'); PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg'],['#c0402a','red'],['#3a6ea5','blue'],['#808080','gray']];selectedIdx=null;renderPalette(); @@ -561,13 +597,12 @@ if(location.hash==='#columntest'){let ok=true;const notes=[];const A=(c,n)=>{if( A(lastGone['blue']==='#3a6ea5'&&lastGone['blue+1']==='#92acc2','clear palette records removed names for recovery'); A(selectedIdx===null,'clear palette clears selected color'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();lastGone=saveG;selectedIdx=saveSel;renderPalette(); - document.title='COLUMNTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='columntest';d.textContent='COLUMNTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Count-control gate (open with #counttest): the per-column count regenerates the // column — count up adds symmetric steps, count down drops the extremes, a // reference to a surviving step follows the new hex, a reference to a removed step // is left on its old (now-gone) hex. -if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#counttest')gate('counttest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),saveSel=selectedIdx; paletteShowFull=true; // this gate asserts span tiles, so render the full palette setSyntaxFg('bg','#204060');setSyntaxFg('p','#f0fef0'); @@ -594,8 +629,8 @@ if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(! regenColumn('#67809c',2,{ground:groundPair()}).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)])); const innerOld=regenColumn('#67809c',2,{ground:groundPair()}).members.find(m=>m.offset===1).hex; // survives a count change const outerOld=regenColumn('#67809c',2,{ground:groundPair()}).members.find(m=>m.offset===2).hex; // dropped on count-down - UIMAP['region']={fg:null,bg:innerOld,bold:false,italic:false,underline:false,strike:false}; - UIMAP['highlight']={fg:null,bg:outerOld,bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:innerOld,weight:null,slant:null,underline:null,strike:null}; + UIMAP['highlight']={fg:null,bg:outerOld,weight:null,slant:null,underline:null,strike:null}; selectedIdx=null;renderPalette(); const blueSpanInput=document.querySelector('#pals .fstrip[data-column="blue"] .fcount input'); A(blueSpanInput&&blueSpanInput.max==='8','normal column span control allows up to 8 per side'); @@ -613,17 +648,16 @@ if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(! const lo=_lum(MAP['bg']),hi=_lum(MAP['p']),blue=PALETTE.filter(p=>p[2]==='blue').map(p=>_lum(p[0])); A(blue.length&&blue.every(L=>L>=lo-1e-6&&L<=hi+1e-6),'generated span stays within the bg/fg bounds');} PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette(); - document.title='COUNTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='counttest';d.textContent='COUNTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Base-edit + ground-edit gate (open with #baseedittest): editing a column base // recolors the whole column at the same count and references follow; editing a // ground swatch writes the bg/fg assignment. -if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#baseedittest')gate('baseedittest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),saveSel=selectedIdx; setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0'); PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg']]; regenColumn('#67809c',2,{ground:groundPair()}).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)])); - UIMAP['region']={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#67809c',weight:null,slant:null,underline:null,strike:null}; renderPalette();buildUITable(); selectedIdx=PALETTE.findIndex(p=>p[0].toLowerCase()==='#67809c'); document.getElementById('newhexstr').value='#3a8a8a';document.getElementById('newname').value='teal'; @@ -649,11 +683,10 @@ if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{i A(!PALETTE.some(p=>/^fg[+-]\d+$/.test(p[1])),'editing fg does not generate fg span tiles from a same-hex normal column'); A(PALETTE.find(p=>p[1]==='fg')[2]==='ground','editing fg preserves the ground column id'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette(); - document.title='BASEEDITTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='baseedittest';d.textContent='BASEEDITTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Round-trip gate (open with #roundtriptest): export stays a flat palette with // stable column ids, and import does not need color-derived column reconstruction. -if(location.hash==='#roundtriptest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#roundtriptest')gate('roundtriptest',A=>{ const stable=o=>Array.isArray(o)?o.map(stable):(o&&typeof o==='object'?Object.fromEntries(Object.keys(o).sort().map(k=>[k,stable(o[k])])):o); const diff=(a,b,p='')=>{if(JSON.stringify(a)===JSON.stringify(b))return '';if(typeof a!==typeof b||!a||!b||typeof a!=='object')return p+': '+JSON.stringify(a)+' != '+JSON.stringify(b); const ks=[...new Set([...Object.keys(a),...Object.keys(b)])].sort();for(const k of ks){const d=diff(a[k],b[k],p?p+'.'+k:k);if(d)return d;}return p;}; @@ -671,13 +704,12 @@ if(location.hash==='#roundtriptest'){let ok=true;const notes=[];const A=(c,n)=>{ A(obj.palette.some(e=>e[1]==='renamed-blue'&&e[2]==='blue'),'renamed color keeps its stable column id through export/import'); A(obj.locks&&obj.locks.includes('kw')&&obj.locks.includes('ui:region'),'lock state survives export/import'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();LOCKED=saveL; - document.title='ROUNDTRIPTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='roundtriptest';d.textContent='ROUNDTRIPTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // View-selector gate (open with #viewtest): the assignment panel is driven by a // single #viewsel dropdown -- two editor entries (@code, @ui) then a "package // faces" optgroup of every app, alphabetically by label -- and switching it // shows exactly one of the three view blocks. -if(location.hash==='#viewtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#viewtest')gate('viewtest',A=>{ const sel=document.getElementById('viewsel'); A(!!sel,'viewsel-exists'); if(sel){ @@ -697,13 +729,13 @@ if(location.hash==='#viewtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c A(curApp()===firstApp,'curApp-returns-selected-app'); A(!document.querySelector('#pkgbody .sbtn[title="reset to default"]'),'no-per-row-reset-button'); } - document.title='VIEWTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='viewtest';d.textContent='VIEWTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Non-default-marker gate (open with #ndtest): a per-face setting cell gets the // .nd corner flag only when its value differs from the face's seed default. Cell -// order in a pkg row: 0 label, 1 lock, 2 fg, 3 bg, 4 style, 5 contrast, 6 inherit, -// 7 size, 8 box. -if(location.hash==='#ndtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +// order in a pkg row: 0 lock, 1 label, 2 fg, 3 bg, 4 style, 5 box, 6 contrast. +// inherit + height live in the row expander, so a non-default height flags the +// expander toggle (exp-nd) rather than an inline cell. +if(location.hash==='#ndtest')gate('ndtest',A=>withSavedState(['PKGMAP','LOCKED'],()=>{ LOCKED.clear(); const app=curApp(),row=APPS[app].faces[0],face=row[0]; PKGMAP[app][face]=seedFace(row[2]||{});buildPkgTable(); @@ -711,29 +743,27 @@ if(location.hash==='#ndtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ A(tr0&&![...tr0.cells].some(c=>c.classList.contains('nd')),'default-face-has-no-marker'); PKGMAP[app][face].height=1.7;PKGMAP[app][face].source='user';buildPkgTable(); const tr1=document.querySelector('#pkgbody tr[data-face="'+face+'"]'); - A(tr1.cells[7].classList.contains('nd'),'nondefault-height-marks-size-box'); + A(tr1.querySelector('.exptoggle').classList.contains('exp-nd'),'nondefault-height-flags-expander'); A(!tr1.cells[4].classList.contains('nd'),'unchanged-style-box-stays-unmarked'); - PKGMAP[app][face].height=(row[2]&&row[2].height)||1;PKGMAP[app][face].bold=!((row[2]&&row[2].bold));buildPkgTable(); + PKGMAP[app][face].height=(row[2]&&row[2].height)||1;PKGMAP[app][face].weight=seedFace(row[2]||{}).weight==='bold'?null:'bold';buildPkgTable(); const tr2=document.querySelector('#pkgbody tr[data-face="'+face+'"]'); - A(tr2.cells[4].classList.contains('nd'),'toggled-bold-marks-style-box'); - A(!tr2.cells[7].classList.contains('nd'),'restored-height-unmarks-size-box'); + A(tr2.cells[4].classList.contains('nd'),'toggled-weight-marks-style-box'); + A(!tr2.querySelector('.exptoggle').classList.contains('exp-nd'),'restored-height-unflags-expander'); PKGMAP[app][face]=seedFace(row[2]||{});buildPkgTable(); - document.title='NDTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='ndtest';d.textContent='NDTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + })); // Contrast-cell gate (open with #crtest): the per-face contrast column shows a // bare colored number (no PASS/FAIL word); the WCAG verdict lives in the hover. -if(location.hash==='#crtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#crtest')gate('crtest',A=>{ const app=curApp(),face=APPS[app].faces[0][0];buildPkgTable(); - const cell=document.querySelector('#pkgbody tr[data-face="'+face+'"]').cells[5]; + const cell=document.querySelector('#pkgbody tr[data-face="'+face+'"]').cells[6]; const span=cell&&cell.querySelector('span'); A(span&&/^\d+\.\d$/.test(span.textContent.trim()),'contrast cell is a bare number: '+(span&&span.textContent)); A(span&&!/PASS|FAIL/.test(span.textContent),'no PASS/FAIL word in the contrast cell'); A(span&&span.title&&/(passes|fails) WCAG/i.test(span.title),'contrast cell carries a WCAG hover: '+(span&&span.title)); - document.title='CRTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='crtest';d.textContent='CRTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // View-nav gate (open with #navtest): the prev/next arrows flanking the view // dropdown step the selection (clamped, no wrap) and re-render the view. -if(location.hash==='#navtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#navtest')gate('navtest',A=>{ const sel=document.getElementById('viewsel'),prev=document.getElementById('viewprev'),next=document.getElementById('viewnext'); A(!!prev&&!!next,'nav arrows exist'); if(sel&&prev&&next){ @@ -747,57 +777,35 @@ if(location.hash==='#navtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c) sel.selectedIndex=2;onViewChange(); A(sel.options[2]&&sel.options[2].value[0]!=='@'&&vis('view-pkg'),'stepping to a package shows the pkg view'); } - document.title='NAVTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='navtest';d.textContent='NAVTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Markdown-preview gate (open with #mdtest): markdown-mode has a dedicated README // renderer, and every data-face it emits is a real markdown-mode face. -if(location.hash==='#mdtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#mdtest')gate('mdtest',A=>{ A(APPS['markdown-mode']&&APPS['markdown-mode'].preview==='markdown','markdown-mode wired to the markdown preview'); A(!!PACKAGE_PREVIEWS['markdown'],'markdown renderer registered'); if(PACKAGE_PREVIEWS['markdown']&&APPS['markdown-mode']){ - const box=document.createElement('div');box.innerHTML=PACKAGE_PREVIEWS['markdown'](); - const valid=new Set(APPS['markdown-mode'].faces.map(r=>r[0])); - const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); - A(used.length>=15,'preview exercises many faces ('+used.length+')'); - const bad=used.filter(f=>!valid.has(f)); - A(bad.length===0,'every data-face is a real markdown face; bad='+bad.join(',')); - for(const f of ['markdown-header-face-1','markdown-bold-face','markdown-inline-code-face','markdown-blockquote-face','markdown-gfm-checkbox-face','markdown-table-face']) - A(used.includes(f),'preview includes '+f); + assertPreviewFaces(A, PACKAGE_PREVIEWS['markdown'](), APPS['markdown-mode'].faces, 15, 'markdown', + ['markdown-header-face-1','markdown-bold-face','markdown-inline-code-face','markdown-blockquote-face','markdown-gfm-checkbox-face','markdown-table-face']); } - document.title='MDTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='mdtest';d.textContent='MDTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // mu4e-preview gate (open with #mupreviewtest): the mu4e preview is a realistic // headers list + message view, and every data-face it emits is a real mu4e face. -if(location.hash==='#mupreviewtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; - const box=document.createElement('div');box.innerHTML=renderMu4ePreview(); - const valid=new Set((APPS['mu4e']&&APPS['mu4e'].faces||[]).map(r=>r[0])); - const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); - A(used.length>=20,'preview exercises many faces ('+used.length+')'); - const bad=used.filter(f=>!valid.has(f)); - A(bad.length===0,'every data-face is a real mu4e face; bad='+bad.join(',')); - for(const f of ['mu4e-unread-face','mu4e-flagged-face','mu4e-replied-face','mu4e-draft-face','mu4e-trashed-face','mu4e-header-highlight-face','mu4e-header-marks-face','mu4e-contact-face','mu4e-compose-separator-face']) - A(used.includes(f),'preview includes '+f); - document.title='MUPREVIEWTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='mupreviewtest';d.textContent='MUPREVIEWTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} +if(location.hash==='#mupreviewtest')gate('mupreviewtest',A=>{ + assertPreviewFaces(A, renderMu4ePreview(), APPS['mu4e']&&APPS['mu4e'].faces, 20, 'mu4e', + ['mu4e-unread-face','mu4e-flagged-face','mu4e-replied-face','mu4e-draft-face','mu4e-trashed-face','mu4e-header-highlight-face','mu4e-header-marks-face','mu4e-contact-face','mu4e-compose-separator-face']); + }); // gnus-preview gate (open with #gnustest): gnus is its own view package (it drives // the mu4e article view), and every data-face its preview emits is a real gnus face. -if(location.hash==='#gnustest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#gnustest')gate('gnustest',A=>{ A(!!APPS['gnus'],'gnus is a registered view package'); A(APPS['gnus']&&APPS['gnus'].preview==='gnus','gnus uses the gnus preview renderer'); - const box=document.createElement('div');box.innerHTML=renderGnusPreview(); - const valid=new Set((APPS['gnus']&&APPS['gnus'].faces||[]).map(r=>r[0])); - const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); - A(used.length>=20,'preview exercises many faces ('+used.length+')'); - const bad=used.filter(f=>!valid.has(f)); - A(bad.length===0,'every data-face is a real gnus face; bad='+bad.join(',')); - for(const f of ['gnus-header-name','gnus-header-from','gnus-header-subject','gnus-cite-1','gnus-cite-attribution','gnus-signature','gnus-button','gnus-emphasis-highlight-words']) - A(used.includes(f),'preview includes '+f); - document.title='GNUSTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='gnustest';d.textContent='GNUSTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + assertPreviewFaces(A, renderGnusPreview(), APPS['gnus']&&APPS['gnus'].faces, 20, 'gnus', + ['gnus-header-name','gnus-header-from','gnus-header-subject','gnus-cite-1','gnus-cite-attribution','gnus-signature','gnus-button','gnus-emphasis-highlight-words']); + }); // picker-distinct gate (open with #pickertest): the color picker panel must stand // out from the page background. It carries a highlighted gold accent border, and its // background is meaningfully lighter than the body so the two are easy to tell apart. -if(location.hash==='#pickertest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#pickertest')gate('pickertest',A=>{ const pk=document.getElementById('picker');A(!!pk,'picker element exists'); if(pk){const cs=getComputedStyle(pk),body=getComputedStyle(document.body); const bc=(cs.borderTopColor.match(/\d+/g)||[]).slice(0,3).map(Number); @@ -807,15 +815,14 @@ if(location.hash==='#pickertest'){let ok=true;const notes=[];const A=(c,n)=>{if( const lift=pkbg.map((c,i)=>c-bdbg[i]); A(lift.every(d=>d>=12),'picker background is clearly lighter than the page (per-channel lift '+lift.join(',')+')'); } - document.title='PICKERTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='pickertest';d.textContent='PICKERTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Box-cluster gate (open with #boxtest): the box control is a 2x2 cluster of // four radio buttons (none / line / pressed / raised); the color swatch shows // only while a box style is active. -if(location.hash==='#boxtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#boxtest')gate('boxtest',A=>{ LOCKED.clear();const f=UI_FACES[0][0];const saveBox=UIMAP[f].box; UIMAP[f].box=null;buildUITable(); - const cell=document.querySelector('#uibody tr[data-face="'+f+'"]').cells[7]; + const cell=document.querySelector('#uibody tr[data-face="'+f+'"]').cells[5]; A(!!cell.querySelector('.boxcluster'),'box-cluster-present'); A(cell.querySelectorAll('.boxbtn').length===4,'four-box-buttons'); const dd=cell.querySelector('.cstep'); @@ -828,30 +835,185 @@ if(location.hash==='#boxtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c) A(UIMAP[f].box===null,'blank-click-clears-box'); A(dd.style.display==='none','color-hidden-again-after-clear'); UIMAP[f].box=saveBox;buildUITable(); - document.title='BOXTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='boxtest';d.textContent='BOXTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} -// Style-cluster gate (open with #styletest): the B/I/U/S style buttons sit in a -// 2x2 cluster (multi-toggle), mirroring the box cluster's square layout. -if(location.hash==='#styletest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; + }); +// Style-cluster gate (open with #styletest): the style cell holds a weight +// selector, a slant selector, and box-like underline and strike controls. +if(location.hash==='#styletest')gate('styletest',A=>{ buildUITable();const f=UI_FACES[0][0]; const cell=document.querySelector('#uibody tr[data-face="'+f+'"]').cells[4]; const cluster=cell.querySelector('.stylecluster'); A(!!cluster,'style-cluster-present'); - A(cluster&&cluster.querySelectorAll('.sbtn').length===4,'four-style-buttons-in-cluster'); - document.title='STYLETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='styletest';d.textContent='STYLETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + const dds=cluster?cluster.querySelectorAll('.enumdd'):[]; + A(dds.length===2,'weight-and-slant-custom-dropdowns-present'); + dds[0]&&dds[0].click(); + const wopts=_ddPop?[..._ddPop.querySelectorAll('.enumopt')]:[]; + A(wopts.some(b=>b.textContent==='semibold'),'weight-dropdown-spells-out-the-curated-range: '+wopts.map(b=>b.textContent).join(',')); + const wbold=wopts.find(b=>b.textContent==='bold'); + A(wbold&&wbold.style.fontWeight==='700','weight-options-preview-their-own-weight: bold renders 700, got '+(wbold&&wbold.style.fontWeight)); + closeColorDropdown(); + dds[1]&&dds[1].click(); + const sopts=_ddPop?[..._ddPop.querySelectorAll('.enumopt')]:[]; + A(sopts.some(b=>b.textContent==='oblique'),'slant-dropdown-offers-oblique: '+sopts.map(b=>b.textContent).join(',')); + const sital=sopts.find(b=>b.textContent==='italic'); + A(sital&&sital.style.fontStyle==='italic','slant-options-preview-their-own-slant: italic renders italic'); + closeColorDropdown(); + A(cluster&&cluster.querySelectorAll('.boxctl').length===1,'strike-control-in-row-underline-moved-to-expander'); + }); +// Expander gate (open with #expandtest): the per-row "more" toggle reveals a +// detail row with the overflow attribute editor, and its controls write the model. +if(location.hash==='#expandtest')gate('expandtest',A=>{ + buildUITable(); + const row=document.querySelector('#uibody tr[data-face="region"]'); + const detail=document.querySelector('#uibody tr.detailrow[data-detail-for="region"]'); + A(!!detail,'detail-row-present'); + A(detail&&detail.style.display==='none','detail-row-hidden-by-default'); + const btn=row.querySelector('.exptoggle'); + A(!!btn,'expander-toggle-present'); + btn&&btn.click(); + A(detail&&detail.style.display!=='none','toggle-reveals-detail-row'); + const ed=detail&&detail.querySelector('.detailedit'); + A(ed&&ed.querySelectorAll('.detailfield').length>=6,'detail-editor-has-the-overflow-fields'); + // ui faces also expose inherit + height in the expander + A(ed&&ed.querySelector('select.detailsel'),'ui-expander-offers-inherit'); + A(ed&&ed.querySelector('input.hstep'),'ui-expander-offers-height'); + // underline moved into the expander; its wave style writes a styled object + const uiUnder=ed&&ed.querySelector('.boxctl .boxbtn[data-style="wave"]'); + A(!!uiUnder,'underline-control-in-expander'); + uiUnder&&uiUnder.click(); + A(UIMAP['region'].underline&&UIMAP['region'].underline.style==='wave','underline-control-writes-a-wavy-object'); + // family text input writes the model + const fam=ed&&ed.querySelector('input.detailinput'); + if(fam){fam.value='Iosevka';fam.dispatchEvent(new Event('change'));} + A(UIMAP['region'].family==='Iosevka','family-input-writes-the-model'); + // inverse checkbox writes the model + const inv=ed&&ed.querySelector('input.detailcheck'); + if(inv){inv.checked=true;inv.dispatchEvent(new Event('change'));} + A(UIMAP['region'].inverse===true,'inverse-checkbox-writes-the-model'); + // a hidden non-default attribute flags the collapsed toggle (reset region to its + // default first, since the edits above left several overflow attrs changed) + UIMAP['region']=JSON.parse(JSON.stringify(DEFAULT_UIMAP['region']));buildUITable(); + const cleanbtn=document.querySelector('#uibody tr[data-face="region"] .exptoggle'); + A(cleanbtn&&!cleanbtn.classList.contains('exp-nd'),'toggle-unflagged-when-overflow-matches-default'); + UIMAP['region']=JSON.parse(JSON.stringify(DEFAULT_UIMAP['region']));UIMAP['region'].overline={color:null};buildUITable(); + const ndbtn=document.querySelector('#uibody tr[data-face="region"] .exptoggle'); + A(ndbtn&&ndbtn.classList.contains('exp-nd'),'collapsed-toggle-flags-a-hidden-non-default-attr'); + // package expander now exposes inherit + height (folded out of inline columns) + buildPkgTable();const pface=APPS[curApp()].faces[0][0]; + const pdetail=document.querySelector('#pkgbody tr.detailrow[data-detail-for="'+pface+'"]'); + A(pdetail&&pdetail.querySelector('select.detailsel'),'package-expander-offers-inherit'); + }); +// Height-clamp gate (open with #heighttest): the expander height field coerces a +// typed value into [HEIGHT_MIN,HEIGHT_MAX] and writes the clamped number back, so +// an out-of-range type/paste can't reach the model. Guards the fact that an +// <input type=number> min/max only constrain its steppers, never typed text. +if(location.hash==='#heighttest')gate('heighttest',A=>{ + const face=UI_FACES[0][0],save=JSON.parse(JSON.stringify(UIMAP[face])); + buildUITable(); + const hin=()=>document.querySelector('#uibody tr.detailrow[data-detail-for="'+face+'"] .hstep'); + const typeHeight=(v)=>{const h=hin();h.value=v;h.dispatchEvent(new Event('change'));}; + typeHeight('5'); + A(UIMAP[face].height===HEIGHT_MAX,'above-max-clamps-to-ceiling: '+UIMAP[face].height); + A(hin().value===''+HEIGHT_MAX,'field-shows-the-clamped-ceiling: '+hin().value); + typeHeight('0.05'); + A(UIMAP[face].height===HEIGHT_MIN,'below-floor-clamps-to-floor: '+UIMAP[face].height); + typeHeight('1.2'); + A(UIMAP[face].height===1.2,'in-range-value-passes-through: '+UIMAP[face].height); + typeHeight(''); + A(UIMAP[face].height===null,'blank-unsets-to-null: '+UIMAP[face].height); + UIMAP[face]=save;buildUITable(); + }); +// Language-dropdown gate (open with #langtest): the language list is sorted +// alphabetically with Elisp pinned as the default selection, and the ‹ › arrows +// step the selection (clamped, no wrap). +if(location.hash==='#langtest')gate('langtest',A=>{ + buildLangSel(); + const s=document.getElementById('langsel'); + const labels=[...s.options].map(o=>o.value); + const sorted=[...labels].sort((a,b)=>a.localeCompare(b)); + A(JSON.stringify(labels)===JSON.stringify(sorted),'languages are alphabetical: '+labels.join(',')); + A(s.value==='Elisp','Elisp is the default selection: '+s.value); + s.selectedIndex=0;stepLang(-1); + A(s.selectedIndex===0,'prev clamps at the first language'); + stepLang(1); + A(s.selectedIndex===1,'next steps forward one'); + s.selectedIndex=s.options.length-1;stepLang(1); + A(s.selectedIndex===s.options.length-1,'next clamps at the last language'); + }); +// View-lock-indicator gate (open with #viewlocktest): the view dropdown prefixes a +// lock glyph on a view whose every element is locked, and clears it otherwise. +if(location.hash==='#viewlocktest')gate('viewlocktest',A=>withSavedState(['LOCKED'],()=>{ + LOCKED.clear();updateViewLockIndicators(); + const s=document.getElementById('viewsel'),codeOpt=()=>[...s.options].find(o=>o.value==='@code'); + A(codeOpt()&&!codeOpt().textContent.startsWith('🔒'),'unlocked view shows no lock glyph: '+(codeOpt()&&codeOpt().textContent)); + syntaxLockKeys().forEach(k=>LOCKED.add(k));updateViewLockIndicators(); + A(codeOpt()&&codeOpt().textContent.startsWith('🔒'),'fully-locked view shows the lock glyph: '+(codeOpt()&&codeOpt().textContent)); + A(codeOpt()&&codeOpt().textContent.includes('color/code assignments'),'glyph prefixes the base label, not replaces it'); + LOCKED.delete(syntaxLockKeys()[0]);updateViewLockIndicators(); + A(codeOpt()&&!codeOpt().textContent.startsWith('🔒'),'unlocking one element clears the glyph'); + LOCKED.clear();updateViewLockIndicators(); + })); +// Detail-hover gate (open with #detailhovertest): every label in the expander +// detail row carries an explanatory hover, the way the table-header labels do. +if(location.hash==='#detailhovertest')gate('detailhovertest',A=>{ + buildUITable(); + const f=UI_FACES[0][0],detail=document.querySelector('#uibody tr.detailrow[data-detail-for="'+f+'"]'); + const fields=detail?[...detail.querySelectorAll('.detailfield')]:[]; + A(fields.length>0,'detail row has fields'); + A(fields.every(g=>g.title&&g.title.length>0),'every detail field has a hover: '+fields.map(g=>g.querySelector('span').textContent+(g.title?'+':'-')).join(' ')); + const inh=fields.find(g=>g.querySelector('span').textContent==='inherit'); + A(inh&&/inherit/i.test(inh.title),'inherit field hover mentions inheritance: '+(inh&&inh.title)); + }); +// Expand/collapse-all gate (open with #expandalltest): the header toggle opens or +// closes every row's detail at once, the per-row triangles track state (▶ closed, +// ▼ open), and the header button's label follows the aggregate. +if(location.hash==='#expandalltest')gate('expandalltest',A=>{ + buildUITable(); + const tb=document.getElementById('uibody'),btn=document.getElementById('uiexpandall'); + const details=()=>[...tb.querySelectorAll('tr.detailrow')]; + const open=()=>details().filter(d=>d.style.display!=='none').length; + const firstTog=()=>tb.querySelector('.exptoggle'); + A(firstTog()&&firstTog().textContent==='▶','row toggle starts collapsed (▶): '+(firstTog()&&firstTog().textContent)); + A(btn&&btn.textContent.indexOf('▶')===0&&/expand all/.test(btn.textContent),'button starts ▶ expand all: '+(btn&&btn.textContent)); + toggleAllExpanded('uiexpandall'); + A(open()===details().length&&open()>0,'expand all opens every row: '+open()+'/'+details().length); + A(firstTog().textContent==='▼','row toggles flip to ▼ after expand all'); + A(btn.textContent.indexOf('▼')===0&&/collapse all/.test(btn.textContent),'button flips to ▼ collapse all: '+btn.textContent); + toggleAllExpanded('uiexpandall'); + A(open()===0,'collapse all closes every row'); + A(firstTog().textContent==='▶','row toggles return to ▶ after collapse all'); + firstTog().click(); + A(open()===1,'a single row toggle opens just that row'); + A(btn.textContent.indexOf('▼')===0,'button reflects a single open row as ▼ collapse all'); + }); +// Expander-persistence gate (open with #expandpersisttest): a package edit rebuilds +// the whole table, so an open expander must reopen instead of collapsing under the +// user. Editing a value inside the open expander must not close the row. +if(location.hash==='#expandpersisttest')gate('expandpersisttest',A=>withSavedState(['PKGMAP'],()=>{ + EXPANDED.clear(); + const app=curApp(),face=APPS[app].faces[0][0];buildPkgTable(); + const row=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"]'); + const detail=()=>document.querySelector('#pkgbody tr.detailrow[data-detail-for="'+face+'"]'); + A(detail()&&detail().style.display==='none','expander starts collapsed'); + row().querySelector('.exptoggle').click(); + A(detail()&&detail().style.display!=='none','expander opens on toggle'); + const hin=detail().querySelector('.hstep');hin.value='1.4';hin.dispatchEvent(new Event('change')); + A(detail()&&detail().style.display!=='none','expander stays open after an in-expander edit rebuilds the row'); + A(PKGMAP[app][face].height===1.4,'the in-expander edit still wrote the model'); + row().querySelector('.exptoggle').click();buildPkgTable(); + A(detail()&&detail().style.display==='none','a collapsed expander stays collapsed across a rebuild'); + EXPANDED.clear();buildPkgTable(); + })); // Palette default-state gate (open with #paldefaulttest): the studio opens with // the palette collapsed to base colors so the span tints don't crowd the first // view. initApp() ran at page load, so the live toggle reflects the opening state. -if(location.hash==='#paldefaulttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#paldefaulttest')gate('paldefaulttest',A=>{ const tg=document.getElementById('paltoggle'); A(!!tg,'palette toggle present after boot'); A(tg&&tg.textContent==='▶','palette opens collapsed to base colors (arrow shows right-pointing ▶)'); - document.title='PALDEFAULTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='paldefaulttest';d.textContent='PALDEFAULTTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Palette display-toggle gate (open with #paltoggletest): the arrow control // collapses each column to its base color and expands back to full spans. -if(location.hash==='#paltoggletest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#paltoggletest')gate('paltoggletest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP); paletteShowFull=true; // start expanded so the first click collapses to base-only setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); @@ -868,16 +1030,15 @@ if(location.hash==='#paltoggletest'){let ok=true;const notes=[];const A=(c,n)=>{ document.getElementById('paltoggle').click(); A(blueChips()===5,'toggling-back-restores-spans'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();renderPalette(); - document.title='PALTOGGLETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='paltoggletest';d.textContent='PALTOGGLETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Unused-tile gate (open with #unusedtest): a palette color referenced nowhere // in the theme gets the .unused flag; a column with no used members gets // .unused-col; referenced colors stay unflagged. -if(location.hash==='#unusedtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#unusedtest')gate('unusedtest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveSyn=JSON.parse(JSON.stringify(SYNTAX)),saveU=JSON.parse(JSON.stringify(UIMAP)); setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); PALETTE=[['#101010','bg','ground'],['#f0f0f0','fg','ground'],['#67809c','blue','blue'],['#123456','teal','teal']]; - for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,bold:false,italic:false,underline:false,strike:false}; + for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,weight:null,slant:null,underline:null,strike:null}; setSyntaxFg('kw','#67809c'); renderPalette(); const tealStrip=document.querySelector('#pals .fstrip[data-column="teal"]'); @@ -889,38 +1050,67 @@ if(location.hash==='#unusedtest'){let ok=true;const notes=[];const A=(c,n)=>{if( A(tealStrip&&tealStrip.classList.contains('unused-col'),'all-unused-column-flagged'); A(blueStrip&&!blueStrip.classList.contains('unused-col'),'used-column-not-flagged'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const k in SYNTAX)delete SYNTAX[k];Object.assign(SYNTAX,saveSyn);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);syncSyntaxFromCache();renderPalette(); - document.title='UNUSEDTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='unusedtest';d.textContent='UNUSEDTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Gone-assignment gate (open with #gonetest): a swatch whose assigned color is // no longer in the palette gets the .gone flag; an assignment to a present color // does not. -if(location.hash==='#gonetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#gonetest')gate('gonetest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)); setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); PALETTE=[['#101010','bg','ground'],['#f0f0f0','fg','ground'],['#67809c','blue','blue']]; - UIMAP['region']={fg:null,bg:'#deadbe',bold:false,italic:false,underline:false,strike:false}; - UIMAP['highlight']={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#deadbe',weight:null,slant:null,underline:null,strike:null}; + UIMAP['highlight']={fg:null,bg:'#67809c',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const goneDd=document.querySelector('#uibody tr[data-face="region"]').cells[3].querySelector('.cdd'); const okDd=document.querySelector('#uibody tr[data-face="highlight"]').cells[3].querySelector('.cdd'); A(goneDd&&goneDd.classList.contains('gone'),'assignment-to-missing-color-flagged'); A(okDd&&!okDd.classList.contains('gone'),'assignment-to-present-color-not-flagged'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);syncSyntaxFromCache();buildUITable(); - document.title='GONETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='gonetest';d.textContent='GONETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Tile-usage-hover gate (open with #usagetest): a tile's title lists the // "view area > element" pairings that use its color, under the name/hex line. -if(location.hash==='#usagetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#usagetest')gate('usagetest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)); setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); PALETTE=[['#101010','bg','ground'],['#f0f0f0','fg','ground'],['#67809c','blue','blue']]; const f0=UI_FACES[0][0],f0label=UI_FACES[0][1]||f0; - for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,bold:false,italic:false,underline:false,strike:false}; - UIMAP[f0]={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false}; + for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,weight:null,slant:null,underline:null,strike:null}; + UIMAP[f0]={fg:null,bg:'#67809c',weight:null,slant:null,underline:null,strike:null}; renderPalette(); const blueChip=document.querySelector('#pals .fstrip[data-column="blue"] .pchip'); A(blueChip&&blueChip.title.includes('ui faces > '+f0label),'hover-title-lists-ui-face-usage'); A(blueChip&&blueChip.title.split('\n').length>1,'usage-list-on-its-own-line-under-current-info'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);syncSyntaxFromCache();renderPalette(); - document.title='USAGETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='usagetest';d.textContent='USAGETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); +// Element-docstring hovers (open with #hovertest): each table's category cell +// carries the face's Emacs docstring on top of its prior hover text, and the +// existing label-span hints are left intact (added in addition, not replaced). +if(location.hash==='#hovertest')gate('hovertest',A=>{ + buildTable();buildUITable();buildPkgTable(); + const synCell=document.querySelector('#legbody tr[data-kind="kw"] .cat'); + A(synCell&&synCell.title===SYNTAX_DOCS['kw'],'syntax cat cell shows the category face docstring: '+(synCell&&synCell.title)); + const synLbl=document.querySelector('#legbody tr[data-kind="kw"] .cat span'); + A(synLbl&&synLbl.title==='flash this category in the code','syntax label-span hint left intact'); + const uiCell=document.querySelector('#uibody tr[data-face="mode-line"] .cat'); + A(uiCell&&uiCell.title===FACE_DOCS['mode-line'],'ui cat cell shows the face docstring: '+(uiCell&&uiCell.title)); + const app=curApp(),docFace=APPS[app].faces.map(r=>r[0]).find(f=>FACE_DOCS[f]); + A(docFace,'a package face with a docstring exists to test'); + if(docFace){const pkgCell=document.querySelector('#pkgbody tr[data-face="'+docFace+'"] .cat'); + A(pkgCell&&pkgCell.title===FACE_DOCS[docFace]+'\n\n'+docFace,'package cat cell shows docstring on top of the face name: '+(pkgCell&&JSON.stringify(pkgCell.title)));} + }); +// Export via the File System Access API (open with #savetest): exportTheme writes +// the theme JSON straight to the picked file handle and closes it, so re-exporting +// overwrites in place instead of the browser uniquifying to "name (1).json". +if(location.hash==='#savetest'){(async()=>{let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; + let written='',closed=false,pickerArgs=null; + const orig=window.showSaveFilePicker; + window.showSaveFilePicker=async(opts)=>{pickerArgs=opts;return {name:'WIP.json',createWritable:async()=>({write:async d=>{written+=d;},close:async()=>{closed=true;}})};}; + try{ + await exportTheme(); + A(written===JSON.stringify(exportObj(),null,1),'export writes the theme JSON to the picked file'); + A(closed,'writable stream is closed so the file is committed'); + A(pickerArgs&&/\.json$/.test(pickerArgs.suggestedName||''),'picker suggests a .json name: '+(pickerArgs&&pickerArgs.suggestedName)); + }catch(e){A(false,'exportTheme threw: '+e.message);} + finally{window.showSaveFilePicker=orig;} + document.title='SAVETEST '+(ok?'PASS':'FAIL'); + const d=document.createElement('div');d.id='savetest';d.textContent='SAVETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);})();} diff --git a/scripts/theme-studio/build-theme.el b/scripts/theme-studio/build-theme.el index ebfc2eb5c..4432ef57c 100644 --- a/scripts/theme-studio/build-theme.el +++ b/scripts/theme-studio/build-theme.el @@ -71,6 +71,17 @@ independently is not possible without clobbering types.") "Non-nil when S is a \"#rrggbb\" hex color string." (and (stringp s) (string-match-p "\\`#[0-9a-fA-F]\\{6\\}\\'" s))) +(defun build-theme/--obj-get (obj key) + "Value of KEY in alist OBJ, or nil." + (cdr (assq key obj))) + +(defun build-theme/--inherit-symbol (value) + "Coerce an inherit VALUE (a face-name string, symbol, or nil) to a symbol." + (cond ((null value) nil) + ((symbolp value) value) + ((stringp value) (intern value)) + (t nil))) + (defun build-theme/--box (box) "Convert a box spec alist (style/color/width) to an Emacs `:box' value, or nil. STYLE is \"line\", \"released\", or \"pressed\"; WIDTH defaults to 1; COLOR (a hex @@ -88,23 +99,72 @@ unset." (list :line-width width))) (t nil))))) -(defun build-theme/--attrs (inherit fg bg bold italic underline strike height &optional box) - "Build a face-attribute plist from the given fields, in canonical order. -INHERIT is a face symbol or nil. FG and BG are hex strings or nil. BOLD, -ITALIC, UNDERLINE, and STRIKE are booleans. HEIGHT is a float multiplier; 1.0 -(or nil) is omitted as the default. BOX is a box spec alist or nil. Only set -attributes are written, so a fully-nil face yields an empty plist." - (let ((plist nil) (bx (build-theme/--box box))) - (when bx (setq plist (list :box bx))) - (when (and height (numberp height) (/= height 1.0)) - (setq plist (append (list :height height) plist))) - (when strike (setq plist (append (list :strike-through t) plist))) - (when underline (setq plist (append (list :underline t) plist))) - (when italic (setq plist (append (list :slant 'italic) plist))) - (when bold (setq plist (append (list :weight 'bold) plist))) - (when bg (setq plist (append (list :background bg) plist))) - (when fg (setq plist (append (list :foreground fg) plist))) - (when inherit (setq plist (append (list :inherit inherit) plist))) +(defun build-theme/--weight (obj) + "Weight symbol for OBJ: explicit `weight' string, else the legacy `bold' flag." + (let ((w (build-theme/--obj-get obj 'weight))) + (cond ((and (stringp w) (> (length w) 0)) (intern w)) + ((build-theme/--obj-get obj 'bold) 'bold)))) + +(defun build-theme/--slant (obj) + "Slant symbol for OBJ: explicit `slant' string, else the legacy `italic' flag." + (let ((s (build-theme/--obj-get obj 'slant))) + (cond ((and (stringp s) (> (length s) 0)) (intern s)) + ((build-theme/--obj-get obj 'italic) 'italic)))) + +(defun build-theme/--line-attr (val) + "Coerce an overline/strike-through VAL to an Emacs attribute value. +nil and t pass through; a {color: C} alist becomes C, or t when COLOR is unset. +Tolerates the legacy boolean form." + (cond ((null val) nil) + ((eq val t) t) + ((consp val) (or (build-theme/--obj-get val 'color) t)) + (t t))) + +(defun build-theme/--underline (obj) + "Underline attribute value for OBJ. +nil when unset. t is a plain line in the face color. A color or wave style +yields a (:color C :style S) plist. Tolerates the legacy boolean form." + (let ((u (build-theme/--obj-get obj 'underline))) + (cond ((null u) nil) + ((eq u t) t) + ((consp u) + (let* ((color (build-theme/--obj-get u 'color)) + (style (build-theme/--obj-get u 'style)) + (wave (and (stringp style) (not (equal style "line")) (intern style)))) + (cond ((and color wave) (list :color color :style wave)) + (color (list :color color)) + (wave (list :style wave)) + (t t)))) + (t t)))) + +(defun build-theme/--attrs (obj) + "Build a face-attribute plist from face-spec alist OBJ, in canonical order. +Reads the full attribute model -- inherit, family, fg/bg, distant-foreground, +weight, slant, height, underline, overline, strike-through, box, inverse-video, +extend -- and tolerates the older boolean bold/italic/underline/strike fields. +Only attributes that are set appear, so a blank face yields nil." + (let* ((height (build-theme/--obj-get obj 'height)) + (family (build-theme/--obj-get obj 'family)) + (pairs + (list + (cons :inherit (build-theme/--inherit-symbol (build-theme/--obj-get obj 'inherit))) + (cons :family (and (stringp family) (> (length family) 0) family)) + (cons :foreground (build-theme/--obj-get obj 'fg)) + (cons :background (build-theme/--obj-get obj 'bg)) + (cons :distant-foreground (build-theme/--obj-get obj 'distant-fg)) + (cons :weight (build-theme/--weight obj)) + (cons :slant (build-theme/--slant obj)) + (cons :height (and (numberp height) (/= height 1.0) height)) + (cons :underline (build-theme/--underline obj)) + (cons :overline (build-theme/--line-attr (build-theme/--obj-get obj 'overline))) + (cons :strike-through (build-theme/--line-attr (build-theme/--obj-get obj 'strike))) + (cons :box (build-theme/--box (build-theme/--obj-get obj 'box))) + (cons :inverse-video (and (build-theme/--obj-get obj 'inverse) t)) + (cons :extend (and (build-theme/--obj-get obj 'extend) t)))) + (plist nil)) + (dolist (pair pairs) + (when (cdr pair) + (setq plist (nconc plist (list (car pair) (cdr pair)))))) plist)) (defun build-theme/--face-spec (face attrs) @@ -113,17 +173,6 @@ Return nil when ATTRS is empty, so cleared faces emit nothing." (when attrs (list face (list (list t attrs))))) -(defun build-theme/--obj-get (obj key) - "Value of KEY in alist OBJ, or nil." - (cdr (assq key obj))) - -(defun build-theme/--inherit-symbol (value) - "Coerce an inherit VALUE (a face-name string, symbol, or nil) to a symbol." - (cond ((null value) nil) - ((symbolp value) value) - ((stringp value) (intern value)) - (t nil))) - ;;; --------------------------------------------------------------------------- ;;; Tiers @@ -131,7 +180,7 @@ Return nil when ATTRS is empty, so cleared faces emit nothing." "Build the `default' face spec from SYNTAX bg / p entries." (let ((bg (build-theme/--obj-get (build-theme/--obj-get syntax 'bg) 'fg)) (fg (build-theme/--obj-get (build-theme/--obj-get syntax 'p) 'fg))) - (build-theme/--face-spec 'default (build-theme/--attrs nil fg bg nil nil nil nil nil)))) + (build-theme/--face-spec 'default (build-theme/--attrs (list (cons 'fg fg) (cons 'bg bg)))))) (defun build-theme/--syntax-face-specs (syntax) "Build syntax-tier face specs from SYNTAX. @@ -143,59 +192,33 @@ Each category fans out to the font-lock faces in (faces (cdr pair)) (obj (build-theme/--obj-get syntax cat))) (when obj - (let ((attrs (build-theme/--attrs nil - (build-theme/--obj-get obj 'fg) - (build-theme/--obj-get obj 'bg) - (build-theme/--obj-get obj 'bold) - (build-theme/--obj-get obj 'italic) - (build-theme/--obj-get obj 'underline) - (build-theme/--obj-get obj 'strike) - nil - (build-theme/--obj-get obj 'box)))) + (let ((attrs (build-theme/--attrs obj))) (dolist (face faces) (when-let ((spec (build-theme/--face-spec face attrs))) (push spec specs))))))) (nreverse specs))) -(defun build-theme/--ui-face-specs (ui) - "Build UI-tier face specs from the UI alist (face -> {fg,bg,bold,italic})." +(defun build-theme/--specs-from-entries (entries) + "Build face specs from ENTRIES, an alist of (face . attribute-alist). +Empty-attr entries emit nothing (cleared faces drop out)." (let (specs) - (dolist (entry ui) - (let* ((face (car entry)) - (obj (cdr entry)) - (attrs (build-theme/--attrs nil - (build-theme/--obj-get obj 'fg) - (build-theme/--obj-get obj 'bg) - (build-theme/--obj-get obj 'bold) - (build-theme/--obj-get obj 'italic) - (build-theme/--obj-get obj 'underline) - (build-theme/--obj-get obj 'strike) - nil - (build-theme/--obj-get obj 'box)))) - (when-let ((spec (build-theme/--face-spec face attrs))) - (push spec specs)))) + (dolist (entry entries) + (when-let ((spec (build-theme/--face-spec + (car entry) + (build-theme/--attrs (cdr entry))))) + (push spec specs))) (nreverse specs))) +(defun build-theme/--ui-face-specs (ui) + "Build UI-tier face specs from the UI alist (face -> attribute alist)." + (build-theme/--specs-from-entries ui)) + (defun build-theme/--package-face-specs (packages) "Build package-tier face specs from the PACKAGES alist (app -> face -> spec)." (let (specs) (dolist (app packages) - (dolist (entry (cdr app)) - (let* ((face (car entry)) - (obj (cdr entry)) - (attrs (build-theme/--attrs - (build-theme/--inherit-symbol (build-theme/--obj-get obj 'inherit)) - (build-theme/--obj-get obj 'fg) - (build-theme/--obj-get obj 'bg) - (build-theme/--obj-get obj 'bold) - (build-theme/--obj-get obj 'italic) - (build-theme/--obj-get obj 'underline) - (build-theme/--obj-get obj 'strike) - (build-theme/--obj-get obj 'height) - (build-theme/--obj-get obj 'box)))) - (when-let ((spec (build-theme/--face-spec face attrs))) - (push spec specs))))) - (nreverse specs))) + (setq specs (nconc specs (build-theme/--specs-from-entries (cdr app))))) + specs)) (defun build-theme/--all-specs (data) "Build the full ordered face-spec list from parsed theme.json DATA." @@ -248,8 +271,8 @@ Signal a `file-missing' error when JSON-FILE does not exist." "Convert JSON-FILE (a theme.json export) into a deftheme file. Write themes/<name>-theme.el, where <name> is JSON-FILE's basename, into OUT-DIR (default: the themes/ directory of this repo). The basename names the -theme so each export lands under its own file (sterling.json -> sterling-theme.el), -rather than colliding on whatever the JSON's internal name field happens to be. +theme so each export lands under its own file (sterling.json becomes +sterling-theme.el), not the name field inside the JSON. Return the written path." (let* ((data (build-theme/--parse json-file)) (name (file-name-base json-file)) diff --git a/scripts/theme-studio/capture-default-faces.py b/scripts/theme-studio/capture-default-faces.py index 60f8967da..a5214fd5a 100644 --- a/scripts/theme-studio/capture-default-faces.py +++ b/scripts/theme-studio/capture-default-faces.py @@ -17,6 +17,8 @@ import re import subprocess import tempfile +from face_specs import FACE_ATTRS + HERE = pathlib.Path(__file__).resolve().parent ROOT = HERE.parents[1] OUT = HERE / "emacs-default-faces.json" @@ -85,20 +87,11 @@ BUILTIN_FEATURES = [ "shr", ] -ATTRS = { - ":foreground": "foreground", - ":background": "background", - ":weight": "weight", - ":slant": "slant", - ":underline": "underline", - ":strike-through": "strike", - ":box": "box", - ":height": "height", - ":inherit": "inherit", - ":inverse-video": "inverseVideo", - ":extend": "extend", - ":distant-foreground": "distantForeground", -} +# Emacs face :attribute keyword -> snapshot field name, derived from the shared +# face-attribute spec so the capture, the seed extraction, and STYLE_DEFAULTS all +# stay in step. Attributes the snapshot doesn't carry (e.g. family) have no +# capture keyword and are skipped. +ATTRS = {a["capture"]: a["snapshot"] for a in FACE_ATTRS if a["capture"]} def x11_colors() -> dict[str, str]: @@ -170,47 +163,45 @@ def normalize_value(value: object) -> object: return value +def _condition_clauses_pass(clauses: dict) -> bool: + """Apply the four display-condition rules to a {key: values} mapping. + Returns False when any present clause excludes the GUI-light target.""" + if "class" in clauses: + vals = clauses["class"] + if "color" not in vals and "grayscale" not in vals: + return False + if "min-colors" in clauses: + vals = clauses["min-colors"] + if vals and isinstance(vals[0], int) and vals[0] > 16777216: + return False + if "background" in clauses: + vals = clauses["background"] + if vals and "light" not in vals: + return False + if "type" in clauses: + if "tty" in clauses["type"]: + return False + return True + + def condition_matches(condition: object) -> bool: if condition in (True, "t", None): return True if condition == "default": return False + # Normalize the two display-spec shapes -- a {key: values} dict, or a list of + # [key, *values] clauses -- to one {key: values} mapping, then run the four + # rules once (see `_condition_clauses_pass'). if isinstance(condition, dict): - if "class" in condition: - vals = condition["class"] or [] - if "color" not in vals and "grayscale" not in vals: - return False - if "min-colors" in condition: - vals = condition["min-colors"] or [] - if vals and isinstance(vals[0], int) and vals[0] > 16777216: - return False - if "background" in condition: - vals = condition["background"] or [] - if vals and "light" not in vals: - return False - if "type" in condition and "tty" in (condition["type"] or []): - return False - return True + clauses = {k: (condition[k] or []) for k in condition} + return _condition_clauses_pass(clauses) if not isinstance(condition, list): return False + clauses = {} for clause in condition: - if not isinstance(clause, list) or not clause: - continue - key = clause[0] - vals = clause[1:] - if key == "class": - if "color" not in vals and "grayscale" not in vals: - return False - elif key == "min-colors": - if vals and isinstance(vals[0], int) and vals[0] > 16777216: - return False - elif key == "background": - if vals and "light" not in vals: - return False - elif key == "type": - if "tty" in vals: - return False - return True + if isinstance(clause, list) and clause: + clauses[clause[0]] = clause[1:] + return _condition_clauses_pass(clauses) def choose_gui_light(default_spec: object) -> dict[str, object]: @@ -364,9 +355,40 @@ def main() -> None: (add-to-list 'load-path dir)) (dolist (feature (mapcar #'intern ts-probe-builtin-features)) (ignore-errors (require feature))) +(defun ts-probe--eval-deffaces (file) + "Evaluate only the `defface' forms in FILE. + +A defface form is self-contained, so registering a face this way avoids +loading the whole package (and its dependencies / side effects), which in +batch -Q is fragile: a missing dependency or mid-load error would silently +drop every face in the file. Each form is evaluated independently. + +Catch any error from `read', not just `end-of-file': a reader-level error +(unrecognized syntax) otherwise propagates out and aborts the whole pass, +dropping every face in every later file. Stop reading this file instead." + (when (file-readable-p file) + (with-temp-buffer + (insert-file-contents file) + (goto-char (point-min)) + (condition-case nil + (while t + (let ((form (read (current-buffer)))) + (when (and (consp form) (eq (car form) 'defface)) + (ignore-errors (eval form t))))) + (error nil))))) +;; Pass 1: best-effort full load. Registers faces that are defined by a macro +;; or loop rather than a literal defface (e.g. rainbow-delimiters depth faces, +;; markdown header faces), which pass 2 cannot see. Failures are swallowed. (dolist (file ts-probe-package-files) (with-temp-file {elisp_quote(str(PROGRESS))} (insert file)) (ignore-errors (load file nil t))) +;; Pass 2: evaluate literal defface forms directly. Robustly registers faces +;; whose package failed to fully load in pass 1 (e.g. transient needing +;; cond-let, magit's transient/forge stack) and resets literal faces to their +;; pristine defface default spec. Runs last so the default spec wins over any +;; customization a pass-1 load may have applied. +(dolist (file ts-probe-package-files) + (ts-probe--eval-deffaces file)) (defun ts-probe--proper-list-p (value) (or (null value) (and (consp value) (ts-probe--proper-list-p (cdr value))))) @@ -397,6 +419,7 @@ def main() -> None: (slant . ,(ts-probe--safe (ts-probe--attr face :slant))) (underline . ,(ts-probe--safe (ts-probe--attr face :underline))) (strike . ,(ts-probe--safe (ts-probe--attr face :strike-through))) + (overline . ,(ts-probe--safe (ts-probe--attr face :overline))) (box . ,(ts-probe--safe (ts-probe--attr face :box))) (height . ,(ts-probe--safe (ts-probe--attr face :height))) (inherit . ,(ts-probe--safe (ts-probe--attr face :inherit))) diff --git a/scripts/theme-studio/colormath.js b/scripts/theme-studio/colormath.js index 2a7328e54..b57da9131 100644 --- a/scripts/theme-studio/colormath.js +++ b/scripts/theme-studio/colormath.js @@ -217,4 +217,9 @@ function reliefColors(bgHex) { return { hl: one(1.2, 0x8000), sh: one(0.6, 0x4000) }; } -export { srgb2oklab, oklab2oklch, oklch2oklab, oklch2hex, apca, deltaE, hex2rgb, lin, rl, contrast, rating, hsv2rgb, rgb2hsv, rgb2hex, oklab2lrgb, inGamut, lrgb2hex, planeCell, paletteWarnings, reliefColors }; +// OKLCH of a hex, and the pure black/white endpoint test. Shared by app-core +// and palette-generator-core (both previously kept their own identical copies). +function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} +function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';} + +export { srgb2oklab, oklab2oklch, oklch2oklab, oklch2hex, apca, deltaE, hex2rgb, lin, rl, contrast, rating, hsv2rgb, rgb2hsv, rgb2hex, oklab2lrgb, inGamut, lrgb2hex, planeCell, paletteWarnings, reliefColors, oklchOf, isPureEndpointHex }; diff --git a/scripts/theme-studio/daneel-palette.scss b/scripts/theme-studio/daneel-palette.scss new file mode 100644 index 000000000..2b61b4f57 --- /dev/null +++ b/scripts/theme-studio/daneel-palette.scss @@ -0,0 +1,67 @@ +/* Coolors Exported Palette - https://coolors.co/bfb48f-3083dc-363020-605c4e-451f55-0a2463-6e0d25-3f7d20-140400 */ + +/* CSS HEX */ +--sand: #bfb48fff; +--brilliant-azure: #3083dcff; +--dark-khaki: #363020ff; +--stone-brown: #605c4eff; +--dark-amethyst: #451f55ff; +--imperial-blue: #0a2463ff; +--dark-amaranth: #6e0d25ff; +--green: #3f7d20ff; +--coffee-bean: #140400ff; + +/* CSS HSL */ +--sand: hsla(46, 27%, 65%, 1); +--brilliant-azure: hsla(211, 71%, 53%, 1); +--dark-khaki: hsla(44, 26%, 17%, 1); +--stone-brown: hsla(47, 10%, 34%, 1); +--dark-amethyst: hsla(282, 47%, 23%, 1); +--imperial-blue: hsla(222, 82%, 21%, 1); +--dark-amaranth: hsla(345, 79%, 24%, 1); +--green: hsla(100, 59%, 31%, 1); +--coffee-bean: hsla(12, 100%, 4%, 1); + +/* SCSS HEX */ +$sand: #bfb48fff; +$brilliant-azure: #3083dcff; +$dark-khaki: #363020ff; +$stone-brown: #605c4eff; +$dark-amethyst: #451f55ff; +$imperial-blue: #0a2463ff; +$dark-amaranth: #6e0d25ff; +$green: #3f7d20ff; +$coffee-bean: #140400ff; + +/* SCSS HSL */ +$sand: hsla(46, 27%, 65%, 1); +$brilliant-azure: hsla(211, 71%, 53%, 1); +$dark-khaki: hsla(44, 26%, 17%, 1); +$stone-brown: hsla(47, 10%, 34%, 1); +$dark-amethyst: hsla(282, 47%, 23%, 1); +$imperial-blue: hsla(222, 82%, 21%, 1); +$dark-amaranth: hsla(345, 79%, 24%, 1); +$green: hsla(100, 59%, 31%, 1); +$coffee-bean: hsla(12, 100%, 4%, 1); + +/* SCSS RGB */ +$sand: rgba(191, 180, 143, 1); +$brilliant-azure: rgba(48, 131, 220, 1); +$dark-khaki: rgba(54, 48, 32, 1); +$stone-brown: rgba(96, 92, 78, 1); +$dark-amethyst: rgba(69, 31, 85, 1); +$imperial-blue: rgba(10, 36, 99, 1); +$dark-amaranth: rgba(110, 13, 37, 1); +$green: rgba(63, 125, 32, 1); +$coffee-bean: rgba(20, 4, 0, 1); + +/* SCSS Gradient */ +$gradient-top: linear-gradient(0deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-right: linear-gradient(90deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-bottom: linear-gradient(180deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-left: linear-gradient(270deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-top-right: linear-gradient(45deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-bottom-right: linear-gradient(135deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-top-left: linear-gradient(225deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-bottom-left: linear-gradient(315deg, #bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff); +$gradient-radial: radial-gradient(#bfb48fff, #3083dcff, #363020ff, #605c4eff, #451f55ff, #0a2463ff, #6e0d25ff, #3f7d20ff, #140400ff);
\ No newline at end of file diff --git a/scripts/theme-studio/default_faces.py b/scripts/theme-studio/default_faces.py index ce2bf3196..b9633cfa7 100644 --- a/scripts/theme-studio/default_faces.py +++ b/scripts/theme-studio/default_faces.py @@ -6,6 +6,8 @@ import json import pathlib from typing import Any +from face_specs import FACE_ATTRS + class DefaultFaces: def __init__(self, data: dict[str, Any] | None): @@ -35,30 +37,46 @@ class DefaultFaces: data = self.face(face, effective) return data.get(attr + "Hex") or data.get(attr) + def _seed_value(self, attr: dict[str, Any], data: dict[str, Any]) -> Any: + """Turn a snapshot field into a model value per the attribute's kind. + + The snapshot speaks a different dialect than the model: colors carry a + Hex variant with a name fallback; weight/slant are value-narrowed to the + legacy bold/italic until the snapshot refresh; underline/strike/overline + are truthy flags that become objects; inverse/extend coerce Emacs's "t". + Returns None (skip) when the attribute is unset or not seedable. + """ + kind, snap = attr["kind"], attr["snapshot"] + if not kind: + return None + if kind == "color": + return data.get(snap + "Hex") or data.get(snap) + if kind == "weight-bold": + return "bold" if data.get(snap) == "bold" else None + if kind == "slant-italic": + return "italic" if data.get(snap) == "italic" else None + if kind == "underline-obj": + return {"style": "line", "color": None} if data.get(snap) else None + if kind == "color-obj": + return {"color": None} if data.get(snap) else None + if kind == "bool": + return True if data.get(snap) in (True, "t") else None + if kind == "scalar": + return data.get(snap) or None + if kind == "height": + h = data.get(snap) + return h if (h and h != 1) else None + if kind == "box": + return self.box_to_theme(data.get(snap)) + return None + def seed(self, face: str, effective: bool = False) -> dict[str, Any]: data = self.face(face, effective) out: dict[str, Any] = {} - fg = data.get("foregroundHex") or data.get("foreground") - bg = data.get("backgroundHex") or data.get("background") - if fg: - out["fg"] = fg - if bg: - out["bg"] = bg - if data.get("weight") == "bold": - out["bold"] = True - if data.get("slant") == "italic": - out["italic"] = True - if data.get("underline"): - out["underline"] = True - if data.get("strike"): - out["strike"] = True - if data.get("inherit"): - out["inherit"] = data.get("inherit") - if data.get("height") and data.get("height") != 1: - out["height"] = data.get("height") - box = self.box_to_theme(data.get("box")) - if box: - out["box"] = box + for attr in FACE_ATTRS: + v = self._seed_value(attr, data) + if v: + out[attr["model"]] = v return out def box_to_theme(self, box: Any) -> dict[str, Any] | None: @@ -123,32 +141,30 @@ class DefaultFaces: "packageInherits": package_inherits, } - def _build_color_hex(self) -> dict[str, str]: - out: dict[str, str] = {} + def _iter_color_pairs(self): + """Yield (name, hexValue) over every face's chosen/effective color attrs. + Both color maps walk this same nested structure; they differ only in which + of the pair is the key and how each filters.""" if not self.data: - return out + return for data in self.data.get("faces", {}).values(): for block in ("chosenGuiLight", "effectiveGuiLight"): face_data = data.get(block, {}) or {} for attr in ("foreground", "background", "distantForeground"): - name = face_data.get(attr) - hex_value = face_data.get(attr + "Hex") - if name and hex_value: - out[str(name).lower().replace(" ", "")] = hex_value + yield face_data.get(attr), face_data.get(attr + "Hex") + + def _build_color_hex(self) -> dict[str, str]: + out: dict[str, str] = {} + for name, hex_value in self._iter_color_pairs(): + if name and hex_value: + out[str(name).lower().replace(" ", "")] = hex_value return out def _build_color_names(self) -> dict[str, str]: out: dict[str, str] = {} - if not self.data: - return out - for data in self.data.get("faces", {}).values(): - for block in ("chosenGuiLight", "effectiveGuiLight"): - face_data = data.get(block, {}) or {} - for attr in ("foreground", "background", "distantForeground"): - hex_value = face_data.get(attr + "Hex") - name = face_data.get(attr) - if hex_value and name and not str(name).startswith("#"): - out.setdefault(hex_value.lower(), str(name).lower().replace(" ", "-")) + for name, hex_value in self._iter_color_pairs(): + if hex_value and name and not str(name).startswith("#"): + out.setdefault(hex_value.lower(), str(name).lower().replace(" ", "-")) return out diff --git a/scripts/theme-studio/emacs-default-faces.json b/scripts/theme-studio/emacs-default-faces.json index 51db612d2..d68f6798e 100644 --- a/scripts/theme-studio/emacs-default-faces.json +++ b/scripts/theme-studio/emacs-default-faces.json @@ -35,6 +35,7 @@ "foreground": "Dark Orange", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -72,6 +73,7 @@ "foreground": "Dark Blue", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -112,6 +114,7 @@ "foreground": "Gold", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -142,6 +145,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -179,6 +183,7 @@ "foreground": "Dark Violet", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -219,6 +224,7 @@ "foreground": "Red", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -269,6 +275,7 @@ "foreground": "#6A9FB5", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -319,6 +326,7 @@ "foreground": "#2188b6", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -369,6 +377,7 @@ "foreground": "#75B5AA", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -419,6 +428,7 @@ "foreground": "#61dafb", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -469,6 +479,7 @@ "foreground": "#446674", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -519,6 +530,7 @@ "foreground": "#48746D", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -569,6 +581,7 @@ "foreground": "#6D8143", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -619,6 +632,7 @@ "foreground": "#72584B", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -669,6 +683,7 @@ "foreground": "#915B2D", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -719,6 +734,7 @@ "foreground": "#B18286", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -769,6 +785,7 @@ "foreground": "#694863", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -819,6 +836,7 @@ "foreground": "#843031", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -869,6 +887,7 @@ "foreground": "#838484", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -919,6 +938,7 @@ "foreground": "#B48D56", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -969,6 +989,7 @@ "foreground": "#90A959", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1019,6 +1040,7 @@ "foreground": "#8FD7F4", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1069,6 +1091,7 @@ "foreground": "#A5FDEC", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1119,6 +1142,7 @@ "foreground": "#C6E87A", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1169,6 +1193,7 @@ "foreground": "#CE7A4E", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1219,6 +1244,7 @@ "foreground": "#FFA500", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1269,6 +1295,7 @@ "foreground": "#FFBDC1", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1319,6 +1346,7 @@ "foreground": "#E69DD6", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1369,6 +1397,7 @@ "foreground": "#EB595A", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1419,6 +1448,7 @@ "foreground": "#B9B6AA", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1469,6 +1499,7 @@ "foreground": "#FFC16D", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1519,6 +1550,7 @@ "foreground": "#8F5536", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1569,6 +1601,7 @@ "foreground": "#D4843E", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1619,6 +1652,7 @@ "foreground": "#F2B4B8", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1669,6 +1703,7 @@ "foreground": "#AA759F", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1719,6 +1754,7 @@ "foreground": "#5D54E1", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1769,6 +1805,7 @@ "foreground": "#AC4142", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1819,6 +1856,7 @@ "foreground": "#ce5643", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1869,6 +1907,7 @@ "foreground": "#716E68", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -1919,45 +1958,114 @@ "foreground": "#FFD446", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", "weight": "normal" }, "company-box-annotation": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "company-tooltip-annotation" + }, + "default-spec": [ + [ + "t", + ":inherit", + "company-tooltip-annotation" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "firebrick4", + "foregroundHex": "#8b1a1a", "height": 1, + "inherit": "company-tooltip-annotation", + "selectedInherits": [ + "company-tooltip-annotation" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "LightCyan3", + "height": 1, + "inherit": "company-tooltip-annotation", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "company-box-background": { - "chosenGuiLight": {}, + "background": "yellow", + "box": "nil", + "chosenGuiLight": { + "inherit": "company-tooltip" + }, + "default-spec": [ + [ + "t", + ":inherit", + "company-tooltip" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "cornsilk", + "backgroundHex": "#fff8dc", "box": null, "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "company-tooltip", + "selectedInherits": [ + "company-tooltip" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "black", + "height": 1, + "inherit": "company-tooltip", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "company-box-candidate": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "black", + "foregroundHex": "#000000" + }, + "default-spec": [ + [ + [ + [ + "background", + "light" + ] + ], + ":foreground", + "black" + ], + [ + "t", + ":foreground", + "white" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -1970,10 +2078,29 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "white", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "company-box-numbers": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "company-box-candidate" + }, + "default-spec": [ + [ + "t", + ":inherit", + "company-box-candidate" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -1981,44 +2108,106 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "company-box-candidate", + "selectedInherits": [ + "company-box-candidate" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "white", + "height": 1, + "inherit": "company-box-candidate", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "company-box-scrollbar": { - "chosenGuiLight": {}, + "background": "green", + "box": "nil", + "chosenGuiLight": { + "inherit": "company-tooltip-selection" + }, + "default-spec": [ + [ + "t", + ":inherit", + "company-tooltip-selection" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "light blue", + "backgroundHex": "#add8e6", "box": null, "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "company-tooltip-selection", + "selectedInherits": [ + "company-tooltip-selection" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "company-tooltip-selection", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "company-box-selection": { - "chosenGuiLight": {}, + "background": "green", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "inherit": "company-tooltip-selection" + }, + "default-spec": [ + [ + "t", + ":inherit", + "company-tooltip-selection", + ":extend", + "t" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "light blue", + "backgroundHex": "#add8e6", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "company-tooltip-selection", + "selectedInherits": [ + "company-tooltip-selection" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "company-tooltip-selection", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "company-echo": { "background": "unspecified-bg", @@ -2041,6 +2230,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2095,6 +2285,7 @@ "foreground": "firebrick1", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2146,6 +2337,7 @@ "company-tooltip-selection", "company-tooltip" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2184,6 +2376,7 @@ "foreground": "pale turquoise", "height": 1, "inherit": "company-tooltip-common-selection", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2222,6 +2415,7 @@ "foreground": "pale turquoise", "height": 1, "inherit": "company-tooltip-common-selection", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2305,6 +2499,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2355,6 +2550,7 @@ "foreground": "LightCyan3", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2393,6 +2589,7 @@ "foreground": "LightCyan3", "height": 1, "inherit": "company-tooltip-annotation", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2443,6 +2640,7 @@ "foreground": "pale turquoise", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2481,6 +2679,7 @@ "foreground": "pale turquoise", "height": 1, "inherit": "company-tooltip-common", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2517,6 +2716,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "t", "underline": "nil", @@ -2555,6 +2755,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2593,6 +2794,7 @@ "foreground": "LightCyan3", "height": 1, "inherit": "company-tooltip-annotation", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2631,6 +2833,7 @@ "foreground": "LightCyan3", "height": 1, "inherit": "company-tooltip-annotation-selection", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2681,6 +2884,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2731,6 +2935,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2769,6 +2974,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2807,6 +3013,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2884,6 +3091,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2922,6 +3130,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2960,6 +3169,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -2992,16 +3202,17 @@ "slant": "normal", "strike": null, "underline": null, - "weight": "bold" + "weight": "normal" }, "exists": true, "foreground": "unspecified-fg", "height": 1, "inherit": "consult-narrow-indicator", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", - "weight": "bold" + "weight": "normal" }, "consult-async-split": { "background": "unspecified-bg", @@ -3036,6 +3247,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-negation-char-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3074,6 +3286,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -3104,6 +3317,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3142,6 +3356,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3180,6 +3395,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3218,6 +3434,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3256,6 +3473,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "consult-highlight-match", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3294,6 +3512,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "match", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3332,6 +3551,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3370,6 +3590,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "consult-key", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3408,6 +3629,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "line-number", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3417,7 +3639,8 @@ "background": "unspecified-bg", "box": "nil", "chosenGuiLight": { - "inherit": "font-lock-warning-face" + "inherit": "warning", + "weight": "normal" }, "default-spec": [ [ @@ -3425,19 +3648,21 @@ ":inherit", "consult-line-number-prefix", ":inherit", - "font-lock-warning-face" + "warning", + ":weight", + "normal" ] ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkOrange", + "foregroundHex": "#ff8c00", "height": 1, - "inherit": "font-lock-warning-face", + "inherit": "warning", "selectedInherits": [ - "font-lock-warning-face" + "warning" ], "slant": "normal", "strike": null, @@ -3447,23 +3672,27 @@ "exists": true, "foreground": "unspecified-fg", "height": 1, - "inherit": "font-lock-warning-face", + "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", - "weight": "bold" + "weight": "normal" }, "consult-narrow-indicator": { "background": "unspecified-bg", "box": "nil", "chosenGuiLight": { - "inherit": "warning" + "inherit": "warning", + "weight": "normal" }, "default-spec": [ [ "t", ":inherit", - "warning" + "warning", + ":weight", + "normal" ] ], "effectiveGuiLight": { @@ -3480,16 +3709,17 @@ "slant": "normal", "strike": null, "underline": null, - "weight": "bold" + "weight": "normal" }, "exists": true, "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", - "weight": "bold" + "weight": "normal" }, "consult-preview-insertion": { "background": "unspecified-bg", @@ -3525,6 +3755,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "region", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3567,6 +3798,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "consult-preview-insertion", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3605,74 +3837,27 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "isearch", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", "weight": "normal" }, "consult-separator": { - "background": "unspecified-bg", - "box": "nil", - "chosenGuiLight": { - "foreground": "#ccc" - }, - "default-spec": [ - [ - [ - [ - "class", - "color" - ], - [ - "min-colors", - 88 - ], - [ - "background", - "light" - ] - ], - ":foreground", - "#ccc" - ], - [ - [ - [ - "class", - "color" - ], - [ - "min-colors", - 88 - ], - [ - "background", - "dark" - ] - ], - ":foreground", - "#333" - ] - ], + "chosenGuiLight": {}, "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "#ccc", + "foreground": "black", + "foregroundHex": "#000000", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": true, - "foreground": "unspecified-fg", - "height": 1, - "inherit": "nil", - "slant": "normal", - "strike": "nil", - "underline": "nil", - "weight": "normal" + "exists": false }, "cursor": { "background": "white", @@ -3719,6 +3904,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3757,6 +3943,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3797,6 +3984,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-doc-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -3837,6 +4025,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dashboard-footer-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -3877,6 +4066,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3917,6 +4107,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "widget-button", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3957,6 +4148,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -3997,6 +4189,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "widget-button", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4037,6 +4230,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4068,6 +4262,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4108,6 +4303,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dired-directory", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4148,6 +4344,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4188,6 +4385,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4226,6 +4424,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dired-ignored", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4266,6 +4465,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dirvish-file-link-number", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -4306,6 +4506,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dirvish-file-user-id", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4346,6 +4547,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dirvish-file-link-number", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -4386,6 +4588,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -4435,6 +4638,7 @@ "foreground": "#a9a1e1", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4480,6 +4684,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "completions-annotations", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4529,6 +4734,7 @@ "foreground": "#5699AF", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4569,6 +4775,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-preprocessor-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4609,6 +4816,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -4654,6 +4862,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dired-ignored", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4696,6 +4905,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4738,6 +4948,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "region", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4776,6 +4987,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -4827,6 +5039,7 @@ "dired-header", "bold" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -4873,6 +5086,7 @@ "inherit": [ "italic" ], + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -4950,6 +5164,7 @@ "foreground": "blue", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5027,6 +5242,7 @@ "foreground": "magenta", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5104,6 +5320,7 @@ "foreground": "green", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5181,6 +5398,7 @@ "foreground": "yellow", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5219,6 +5437,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-negation-char-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5257,6 +5476,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5295,6 +5515,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5333,6 +5554,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5378,6 +5600,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dired-ignored", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5423,6 +5646,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "dired-ignored", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5461,6 +5685,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-locally-added-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5499,6 +5724,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-conflict-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5537,6 +5763,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-edited-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5575,6 +5802,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-locked-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5613,6 +5841,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-missing-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5662,6 +5891,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5700,6 +5930,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-needs-update-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5738,6 +5969,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vc-removed-state", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5778,6 +6010,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -5816,6 +6049,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -5851,6 +6085,7 @@ "foreground": "magenta2", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5886,6 +6121,7 @@ "foreground": "red", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5921,6 +6157,7 @@ "foreground": "deep sky blue", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -5956,6 +6193,7 @@ "foreground": "goldenrod", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6016,6 +6254,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6076,6 +6315,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6114,6 +6354,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "mode-line-buffer-id", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6144,6 +6385,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6204,6 +6446,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6264,6 +6507,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6324,6 +6568,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6358,6 +6603,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6396,6 +6642,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "completions-annotations", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -6434,6 +6681,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6444,6 +6692,7 @@ "box": "nil", "chosenGuiLight": { "inherit": "shadow", + "slant": "italic", "strike": "t" }, "default-spec": [ @@ -6453,7 +6702,8 @@ "shadow", ":strike-through", "t", - "italic" + ":italic", + "t" ] ], "effectiveGuiLight": { @@ -6467,7 +6717,7 @@ "selectedInherits": [ "shadow" ], - "slant": "normal", + "slant": "italic", "strike": "t", "underline": null, "weight": "normal" @@ -6476,7 +6726,8 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", - "slant": "normal", + "overline": "nil", + "slant": "italic", "strike": "t", "underline": "nil", "weight": "normal" @@ -6517,6 +6768,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -6555,6 +6807,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6593,6 +6846,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6627,6 +6881,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -6667,6 +6922,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "match", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6705,6 +6961,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6743,6 +7000,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "completions-annotations", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -6781,6 +7039,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -6818,6 +7077,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7019,6 +7279,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7104,6 +7365,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7193,6 +7455,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7278,6 +7541,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7405,6 +7669,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7435,6 +7700,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7500,6 +7766,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -7530,6 +7797,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7568,6 +7836,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7598,6 +7867,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7636,6 +7906,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7666,6 +7937,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7706,6 +7978,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "mode-line-buffer-id", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7740,6 +8013,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7778,6 +8052,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -7831,6 +8106,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "flycheck-error-list-id", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -7869,6 +8145,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7899,6 +8176,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7937,6 +8215,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -7975,6 +8254,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8013,6 +8293,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8051,6 +8332,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8116,6 +8398,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -8162,6 +8445,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8227,6 +8511,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -8267,6 +8552,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "isearch", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8305,6 +8591,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-punctuation-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8461,6 +8748,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8499,6 +8787,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -8682,6 +8971,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -8843,6 +9133,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -8881,6 +9172,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-punctuation-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8919,6 +9211,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -8957,6 +9250,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-regexp-grouping-backslash", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -8995,6 +9289,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9120,6 +9415,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9276,6 +9572,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9314,6 +9611,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-punctuation-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9345,6 +9643,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9376,6 +9675,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9414,6 +9714,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9452,6 +9753,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -9490,6 +9792,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-property-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -9521,6 +9824,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -9559,6 +9863,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -9713,6 +10018,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -9869,6 +10175,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -10032,6 +10339,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -10070,6 +10378,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -10133,6 +10442,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10171,6 +10481,7 @@ "foreground": "black", "height": 1, "inherit": "ansi-color-black", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10209,6 +10520,7 @@ "foreground": "blue2", "height": 1, "inherit": "ansi-color-blue", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10247,6 +10559,7 @@ "foreground": "gray30", "height": 1, "inherit": "ansi-color-bright-black", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10285,6 +10598,7 @@ "foreground": "blue1", "height": 1, "inherit": "ansi-color-bright-blue", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10323,6 +10637,7 @@ "foreground": "cyan2", "height": 1, "inherit": "ansi-color-bright-cyan", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10361,6 +10676,7 @@ "foreground": "green2", "height": 1, "inherit": "ansi-color-bright-green", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10399,6 +10715,7 @@ "foreground": "magenta2", "height": 1, "inherit": "ansi-color-bright-magenta", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10437,6 +10754,7 @@ "foreground": "red2", "height": 1, "inherit": "ansi-color-bright-red", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10475,6 +10793,7 @@ "foreground": "white", "height": 1, "inherit": "ansi-color-bright-white", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10513,6 +10832,7 @@ "foreground": "yellow2", "height": 1, "inherit": "ansi-color-bright-yellow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10551,6 +10871,7 @@ "foreground": "cyan3", "height": 1, "inherit": "ansi-color-cyan", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10589,6 +10910,7 @@ "foreground": "green3", "height": 1, "inherit": "ansi-color-green", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10627,6 +10949,7 @@ "foreground": "magenta3", "height": 1, "inherit": "ansi-color-magenta", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10665,6 +10988,7 @@ "foreground": "red3", "height": 1, "inherit": "ansi-color-red", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10703,6 +11027,7 @@ "foreground": "grey90", "height": 1, "inherit": "ansi-color-white", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10741,6 +11066,7 @@ "foreground": "yellow3", "height": 1, "inherit": "ansi-color-yellow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10779,6 +11105,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10841,6 +11168,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -10879,13 +11207,25 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "cursor", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", "weight": "normal" }, "git-commit-comment-action": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "bold" + }, + "default-spec": [ + [ + "t", + ":inherit", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -10893,111 +11233,272 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "bold", + "selectedInherits": [ + "bold" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "bold", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "git-commit-comment-branch-local": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-branch-local" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-branch-local" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b", "height": 1, + "inherit": "magit-branch-local", + "selectedInherits": [ + "magit-branch-local" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-branch-local", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "git-commit-comment-branch-remote": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-branch-remote" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-branch-remote" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkOliveGreen4", + "foregroundHex": "#6e8b3d", "height": 1, + "inherit": "magit-branch-remote", + "selectedInherits": [ + "magit-branch-remote" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-branch-remote", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "git-commit-comment-detached": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "git-commit-comment-branch-local" + }, + "default-spec": [ + [ + "t", + ":inherit", + "git-commit-comment-branch-local" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b", "height": 1, + "inherit": "git-commit-comment-branch-local", + "selectedInherits": [ + "git-commit-comment-branch-local" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "git-commit-comment-branch-local", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "git-commit-comment-file": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "git-commit-trailer-value" + }, + "default-spec": [ + [ + "t", + ":inherit", + "git-commit-trailer-value" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "git-commit-trailer-value", + "selectedInherits": [ + "git-commit-trailer-value" + ], + "slant": "italic", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "git-commit-trailer-value", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "git-commit-comment-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "git-commit-trailer-token" + }, + "default-spec": [ + [ + "t", + ":inherit", + "git-commit-trailer-token" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "LightGray", + "foregroundHex": "#d3d3d3", "height": 1, + "inherit": "git-commit-trailer-token", + "selectedInherits": [ + "git-commit-trailer-token" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "git-commit-trailer-token", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "git-commit-keyword": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-string-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-string-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "font-lock-string-face", + "selectedInherits": [ + "font-lock-string-face" + ], + "slant": "italic", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-string-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "git-commit-nonempty-second-line": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-warning-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-warning-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -11005,15 +11506,38 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "font-lock-warning-face", + "selectedInherits": [ + "font-lock-warning-face" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-warning-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "git-commit-overlong-summary": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-warning-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-warning-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -11021,60 +11545,141 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "font-lock-warning-face", + "selectedInherits": [ + "font-lock-warning-face" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-warning-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "git-commit-summary": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-type-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-type-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "Gray90", + "foregroundHex": "#e5e5e5", "height": 1, + "inherit": "font-lock-type-face", + "selectedInherits": [ + "font-lock-type-face" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-type-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "t", + "weight": "bold" }, "git-commit-trailer-token": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-keyword-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-keyword-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "LightGray", + "foregroundHex": "#d3d3d3", "height": 1, + "inherit": "font-lock-keyword-face", + "selectedInherits": [ + "font-lock-keyword-face" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-keyword-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "git-commit-trailer-value": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-string-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-string-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "font-lock-string-face", + "selectedInherits": [ + "font-lock-string-face" + ], + "slant": "italic", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-string-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "git-gutter:added": { "background": "unspecified-bg", @@ -11118,6 +11723,7 @@ "foreground": "green", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11165,6 +11771,7 @@ "foreground": "red", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11212,6 +11819,7 @@ "foreground": "magenta", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11259,6 +11867,7 @@ "foreground": "cyan", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11303,6 +11912,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11426,6 +12036,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11457,6 +12068,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11488,6 +12100,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11519,6 +12132,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11550,6 +12164,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11581,6 +12196,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11612,6 +12228,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11643,6 +12260,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11674,6 +12292,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11705,6 +12324,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11747,6 +12367,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11787,6 +12408,7 @@ "foreground": "#cc9393", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11825,6 +12447,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -11944,6 +12567,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -12064,48 +12688,27 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", "weight": "normal" }, "json-mode-object-name-face": { - "background": "unspecified-bg", - "box": "nil", - "chosenGuiLight": { - "inherit": "font-lock-variable-name-face" - }, - "default-spec": [ - [ - "t", - ":inherit", - "font-lock-variable-name-face" - ] - ], + "chosenGuiLight": {}, "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "Gray90", - "foregroundHex": "#e5e5e5", + "foreground": "black", + "foregroundHex": "#000000", "height": 1, - "inherit": "font-lock-variable-name-face", - "selectedInherits": [ - "font-lock-variable-name-face" - ], - "slant": "italic", + "slant": "normal", "strike": null, "underline": null, - "weight": "bold" + "weight": "normal" }, - "exists": true, - "foreground": "unspecified-fg", - "height": 1, - "inherit": "font-lock-variable-name-face", - "slant": "italic", - "strike": "nil", - "underline": "nil", - "weight": "bold" + "exists": false }, "lazy-highlight": { "background": "unspecified-bg", @@ -12223,6 +12826,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -12274,6 +12878,7 @@ "shadow", "default" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -12312,6 +12917,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "line-number", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -12420,6 +13026,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "underline", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -12458,6 +13065,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-call-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -12547,6 +13155,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-warning-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -12585,6 +13194,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -12623,6 +13233,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-use-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -12661,77 +13272,190 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", "weight": "bold" }, "lsp-details-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "height": 0.8, + "inherit": "shadow" + }, + "default-spec": [ + [ + "t", + ":height", + 0.8, + ":inherit", + "shadow" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, "foreground": "black", "foregroundHex": "#000000", - "height": 1, + "height": 0.8, + "inherit": "shadow", + "selectedInherits": [ + "shadow" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 0, + "inherit": "shadow", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "lsp-face-highlight-read": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "highlight", + "underline": "t" + }, + "default-spec": [ + [ + "t", + ":inherit", + "highlight", + ":underline", + "t" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "darkseagreen2", + "backgroundHex": "#b4eeb4", "box": null, "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "highlight", + "selectedInherits": [ + "highlight" + ], "slant": "normal", "strike": null, - "underline": null, + "underline": "t", "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "t", + "weight": "normal" }, "lsp-face-highlight-textual": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "highlight" + }, + "default-spec": [ + [ + "t", + ":inherit", + "highlight" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "darkseagreen2", + "backgroundHex": "#b4eeb4", "box": null, "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "highlight", + "selectedInherits": [ + "highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "lsp-face-highlight-write": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "highlight", + "weight": "bold" + }, + "default-spec": [ + [ + "t", + ":inherit", + "highlight", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "darkseagreen2", + "backgroundHex": "#b4eeb4", "box": null, "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "highlight", + "selectedInherits": [ + "highlight" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "lsp-face-rename": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "underline": "t" + }, + "default-spec": [ + [ + "t", + ":underline", + "t" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -12741,125 +13465,299 @@ "height": 1, "slant": "normal", "strike": null, - "underline": null, + "underline": "t", "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "t", + "weight": "normal" }, "lsp-inlay-hint-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-comment-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-comment-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "font-lock-comment-face", + "selectedInherits": [ + "font-lock-comment-face" + ], + "slant": "italic", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-comment-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "lsp-inlay-hint-parameter-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "lsp-inlay-hint-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "lsp-inlay-hint-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "lsp-inlay-hint-face", + "selectedInherits": [ + "lsp-inlay-hint-face" + ], + "slant": "italic", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "lsp-inlay-hint-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "lsp-inlay-hint-type-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "lsp-inlay-hint-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "lsp-inlay-hint-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "lsp-inlay-hint-face", + "selectedInherits": [ + "lsp-inlay-hint-face" + ], + "slant": "italic", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "lsp-inlay-hint-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "lsp-installation-buffer-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "green", + "foregroundHex": "#00ff00" + }, + "default-spec": [ + [ + "t", + ":foreground", + "green" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "green", + "foregroundHex": "#00ff00", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "green", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "lsp-installation-finished-buffer-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "orange", + "foregroundHex": "#ffa500" + }, + "default-spec": [ + [ + "t", + ":foreground", + "orange" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "orange", + "foregroundHex": "#ffa500", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "orange", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "lsp-rename-placeholder-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-variable-name-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-variable-name-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "Gray90", + "foregroundHex": "#e5e5e5", "height": 1, - "slant": "normal", + "inherit": "font-lock-variable-name-face", + "selectedInherits": [ + "font-lock-variable-name-face" + ], + "slant": "italic", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-variable-name-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "lsp-signature-face": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "lsp-details-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "lsp-details-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, "foreground": "black", "foregroundHex": "#000000", - "height": 1, + "height": 0.8, + "inherit": "lsp-details-face", + "selectedInherits": [ + "lsp-details-face" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 0, + "inherit": "lsp-details-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "lsp-signature-highlight-function-argument": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "eldoc-highlight-function-argument" + }, + "default-spec": [ + [ + "t", + ":inherit", + "eldoc-highlight-function-argument" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -12867,15 +13765,38 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "eldoc-highlight-function-argument", + "selectedInherits": [ + "eldoc-highlight-function-argument" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "eldoc-highlight-function-argument", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "lsp-signature-posframe": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "tooltip" + }, + "default-spec": [ + [ + "t", + ":inherit", + "tooltip" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -12883,12 +13804,24 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "tooltip", + "selectedInherits": [ + "tooltip" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "tooltip", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "lv-separator": { "background": "unspecified-bg", @@ -12943,61 +13876,130 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", "weight": "normal" }, "magit-bisect-bad": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "IndianRed4", + "foregroundHex": "#8b3a3a" + }, + "default-spec": [ + [ + "t", + ":foreground", + "IndianRed4" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "IndianRed4", + "foregroundHex": "#8b3a3a", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "IndianRed4", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-bisect-good": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "DarkOliveGreen", + "foregroundHex": "#556b2f" + }, + "default-spec": [ + [ + "t", + ":foreground", + "DarkOliveGreen" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkOliveGreen", + "foregroundHex": "#556b2f", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "DarkOliveGreen", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-bisect-skip": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "DarkGoldenrod", + "foregroundHex": "#b8860b" + }, + "default-spec": [ + [ + "t", + ":foreground", + "DarkGoldenrod" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkGoldenrod", + "foregroundHex": "#b8860b", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "DarkGoldenrod", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-date": { + "background": "unspecified-bg", + "box": "nil", "chosenGuiLight": {}, + "default-spec": [ + [ + "t", + "nil" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13010,26 +14012,71 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-dimmed": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-dimmed", + "slant": "normal", + "weight": "normal" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-dimmed", + ":weight", + "normal", + ":slant", + "normal" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey50", + "foregroundHex": "#7f7f7f", "height": 1, + "inherit": "magit-dimmed", + "selectedInherits": [ + "magit-dimmed" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-dimmed", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-hash": { + "background": "unspecified-bg", + "box": "nil", "chosenGuiLight": {}, + "default-spec": [ + [ + "t", + "nil" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13042,30 +14089,118 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "inherit": "magit-blame-highlight", + "slant": "normal", + "weight": "normal" + }, + "default-spec": [ + [ + "t", + ":extend", + "t", + ":inherit", + "magit-blame-highlight", + ":weight", + "normal", + ":slant", + "normal" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "magit-blame-highlight", + "selectedInherits": [ + "magit-blame-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-blame-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey80", + "backgroundHex": "#cccccc", + "extend": "t", + "foreground": "black", + "foregroundHex": "#000000" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey80", + ":foreground", + "black" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey25", + ":foreground", + "white" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, @@ -13074,26 +14209,72 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-margin": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-blame-highlight", + "slant": "normal", + "weight": "normal" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-blame-highlight", + ":weight", + "normal", + ":slant", + "normal" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "magit-blame-highlight", + "selectedInherits": [ + "magit-blame-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-blame-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-name": { + "background": "unspecified-bg", + "box": "nil", "chosenGuiLight": {}, + "default-spec": [ + [ + "t", + "nil" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13106,10 +14287,26 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-blame-summary": { + "background": "unspecified-bg", + "box": "nil", "chosenGuiLight": {}, + "default-spec": [ + [ + "t", + "nil" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13122,74 +14319,261 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-branch-current": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "box": "t", + "inherit": "magit-branch-local" + }, + "default-spec": [ + [ + [ + [ + "supports", + [ + ":box", + "t" + ] + ] + ], + ":inherit", + "magit-branch-local", + ":box", + "t" + ], + [ + "t", + ":inherit", + "magit-branch-local", + ":inverse-video", + "t" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", - "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "box": "t", + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b", "height": 1, + "inherit": "magit-branch-local", + "selectedInherits": [ + "magit-branch-local" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-branch-local", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-branch-local": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "SkyBlue4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "LightSkyBlue1" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-branch-remote": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "DarkOliveGreen4", + "foregroundHex": "#6e8b3d" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "DarkOliveGreen4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "DarkSeaGreen2" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkOliveGreen4", + "foregroundHex": "#6e8b3d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-branch-remote-head": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "box": "t", + "inherit": "magit-branch-remote" + }, + "default-spec": [ + [ + [ + [ + "supports", + [ + ":box", + "t" + ] + ] + ], + ":inherit", + "magit-branch-remote", + ":box", + "t" + ], + [ + "t", + ":inherit", + "magit-branch-remote", + ":inverse-video", + "t" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", - "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "box": "t", + "foreground": "DarkOliveGreen4", + "foregroundHex": "#6e8b3d", "height": 1, + "inherit": "magit-branch-remote", + "selectedInherits": [ + "magit-branch-remote" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-branch-remote", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-branch-upstream": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "slant": "italic" + }, + "default-spec": [ + [ + "t", + ":slant", + "italic" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13197,463 +14581,1561 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, - "slant": "normal", + "slant": "italic", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-branch-warning": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "warning" + }, + "default-spec": [ + [ + "t", + ":inherit", + "warning" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkOrange", + "foregroundHex": "#ff8c00", "height": 1, + "inherit": "warning", + "selectedInherits": [ + "warning" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "warning", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-cherry-equivalent": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "magenta", + "foregroundHex": "#ff00ff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "magenta" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "magenta", + "foregroundHex": "#ff00ff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "magenta", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-cherry-unmatched": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "cyan", + "foregroundHex": "#00ffff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "cyan" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "cyan", + "foregroundHex": "#00ffff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "cyan", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-added": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "#ddffdd", + "backgroundHex": "#ddffdd", + "extend": "t", + "foreground": "#22aa22", + "foregroundHex": "#22aa22" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "#ddffdd", + ":foreground", + "#22aa22" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "#335533", + ":foreground", + "#ddffdd" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#ddffdd", + "backgroundHex": "#ddffdd", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#22aa22", + "foregroundHex": "#22aa22", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-added-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "#cceecc", + "backgroundHex": "#cceecc", + "extend": "t", + "foreground": "#22aa22", + "foregroundHex": "#22aa22" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "#cceecc", + ":foreground", + "#22aa22" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "#336633", + ":foreground", + "#cceecc" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#cceecc", + "backgroundHex": "#cceecc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#22aa22", + "foregroundHex": "#22aa22", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-base": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "#ffffcc", + "backgroundHex": "#ffffcc", + "extend": "t", + "foreground": "#aaaa11", + "foregroundHex": "#aaaa11" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "#ffffcc", + ":foreground", + "#aaaa11" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "#555522", + ":foreground", + "#ffffcc" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#ffffcc", + "backgroundHex": "#ffffcc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#aaaa11", + "foregroundHex": "#aaaa11", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-base-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "#eeeebb", + "backgroundHex": "#eeeebb", + "extend": "t", + "foreground": "#aaaa11", + "foregroundHex": "#aaaa11" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "#eeeebb", + ":foreground", + "#aaaa11" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "#666622", + ":foreground", + "#eeeebb" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#eeeebb", + "backgroundHex": "#eeeebb", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#aaaa11", + "foregroundHex": "#aaaa11", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-conflict-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-hunk-heading" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-hunk-heading" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey90", + "backgroundHex": "#e5e5e5", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, + "inherit": "magit-diff-hunk-heading", + "selectedInherits": [ + "magit-diff-hunk-heading" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-hunk-heading", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-conflict-heading-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-hunk-heading-highlight" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-hunk-heading-highlight" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, + "inherit": "magit-diff-hunk-heading-highlight", + "selectedInherits": [ + "magit-diff-hunk-heading-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-hunk-heading-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-context": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "grey50", + "foregroundHex": "#7f7f7f" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":foreground", + "grey50" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":foreground", + "grey70" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey50", + "foregroundHex": "#7f7f7f", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-context-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey95", + "backgroundHex": "#f2f2f2", + "extend": "t", + "foreground": "grey50", + "foregroundHex": "#7f7f7f" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey95", + ":foreground", + "grey50" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey20", + ":foreground", + "grey70" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey95", + "backgroundHex": "#f2f2f2", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey50", + "foregroundHex": "#7f7f7f", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-file-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "weight": "bold" + }, + "default-spec": [ + [ + "t", + ":extend", + "t", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-diff-file-heading-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "inherit": "magit-section-highlight" + }, + "default-spec": [ + [ + "t", + ":extend", + "t", + ":inherit", + "magit-section-highlight" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey95", + "backgroundHex": "#f2f2f2", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "magit-section-highlight", + "selectedInherits": [ + "magit-section-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-section-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-file-heading-selection": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", + "inherit": "magit-diff-file-heading-highlight" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":inherit", + "magit-diff-file-heading-highlight", + ":foreground", + "salmon4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":inherit", + "magit-diff-file-heading-highlight", + ":foreground", + "LightSalmon3" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey95", + "backgroundHex": "#f2f2f2", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", "height": 1, + "inherit": "magit-diff-file-heading-highlight", + "selectedInherits": [ + "magit-diff-file-heading-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-hunk-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey90", + "backgroundHex": "#e5e5e5", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey90", + ":foreground", + "grey20" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey25", + ":foreground", + "grey95" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey90", + "backgroundHex": "#e5e5e5", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-hunk-heading-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey80", + "backgroundHex": "#cccccc", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey80", + ":foreground", + "grey20" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey35", + ":foreground", + "grey95" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-hunk-heading-selection": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", + "inherit": "magit-diff-hunk-heading-highlight" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":inherit", + "magit-diff-hunk-heading-highlight", + ":foreground", + "salmon4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":inherit", + "magit-diff-hunk-heading-highlight", + ":foreground", + "LightSalmon3" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", "height": 1, + "inherit": "magit-diff-hunk-heading-highlight", + "selectedInherits": [ + "magit-diff-hunk-heading-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-hunk-region": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "unspecified", + "inherit": "bold" + }, + "default-spec": [ + [ + "t", + ":inherit", + "bold", + ":extend", + "unspecified" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, + "extend": "unspecified", "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "bold", + "selectedInherits": [ + "bold" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "bold", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-diff-lines-boundary": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "inherit": "magit-diff-lines-heading" + }, + "default-spec": [ + [ + "t", + ":extend", + "t", + ":inherit", + "magit-diff-lines-heading" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "LightSalmon3", + "backgroundHex": "#cd8162", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, + "inherit": "magit-diff-lines-heading", + "selectedInherits": [ + "magit-diff-lines-heading" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-lines-heading", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-lines-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "LightSalmon3", + "backgroundHex": "#cd8162", + "extend": "t", + "inherit": "magit-diff-hunk-heading-highlight" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":inherit", + "magit-diff-hunk-heading-highlight", + ":background", + "LightSalmon3" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":inherit", + "magit-diff-hunk-heading-highlight", + ":foreground", + "grey80", + ":background", + "salmon4" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "LightSalmon3", + "backgroundHex": "#cd8162", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, + "inherit": "magit-diff-hunk-heading-highlight", + "selectedInherits": [ + "magit-diff-hunk-heading-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-our": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-removed" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-removed" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#ffdddd", + "backgroundHex": "#ffdddd", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#aa2222", + "foregroundHex": "#aa2222", "height": 1, + "inherit": "magit-diff-removed", + "selectedInherits": [ + "magit-diff-removed" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-removed", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-our-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-removed-highlight" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-removed-highlight" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#eecccc", + "backgroundHex": "#eecccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#aa2222", + "foregroundHex": "#aa2222", "height": 1, + "inherit": "magit-diff-removed-highlight", + "selectedInherits": [ + "magit-diff-removed-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-removed-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-removed": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "#ffdddd", + "backgroundHex": "#ffdddd", + "extend": "t", + "foreground": "#aa2222", + "foregroundHex": "#aa2222" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "#ffdddd", + ":foreground", + "#aa2222" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "#553333", + ":foreground", + "#ffdddd" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#ffdddd", + "backgroundHex": "#ffdddd", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#aa2222", + "foregroundHex": "#aa2222", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-removed-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "#eecccc", + "backgroundHex": "#eecccc", + "extend": "t", + "foreground": "#aa2222", + "foregroundHex": "#aa2222" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "#eecccc", + ":foreground", + "#aa2222" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "#663333", + ":foreground", + "#eecccc" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#eecccc", + "backgroundHex": "#eecccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#aa2222", + "foregroundHex": "#aa2222", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-revision-summary": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-hunk-heading" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-hunk-heading" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey90", + "backgroundHex": "#e5e5e5", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, + "inherit": "magit-diff-hunk-heading", + "selectedInherits": [ + "magit-diff-hunk-heading" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-hunk-heading", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-revision-summary-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-hunk-heading-highlight" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-hunk-heading-highlight" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey20", + "foregroundHex": "#333333", "height": 1, + "inherit": "magit-diff-hunk-heading-highlight", + "selectedInherits": [ + "magit-diff-hunk-heading-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-hunk-heading-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-their": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-added" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-added" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#ddffdd", + "backgroundHex": "#ddffdd", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#22aa22", + "foregroundHex": "#22aa22", "height": 1, + "inherit": "magit-diff-added", + "selectedInherits": [ + "magit-diff-added" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-added", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-their-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-diff-added-highlight" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-diff-added-highlight" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "#cceecc", + "backgroundHex": "#cceecc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "#22aa22", + "foregroundHex": "#22aa22", "height": 1, + "inherit": "magit-diff-added-highlight", + "selectedInherits": [ + "magit-diff-added-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-diff-added-highlight", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diff-whitespace-warning": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "trailing-whitespace" + }, + "default-spec": [ + [ + "t", + ":inherit", + "trailing-whitespace" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13661,63 +16143,215 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "trailing-whitespace", + "selectedInherits": [ + "trailing-whitespace" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "trailing-whitespace", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diffstat-added": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "#22aa22", + "foregroundHex": "#22aa22" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "#22aa22" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "#448844" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "#22aa22", + "foregroundHex": "#22aa22", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-diffstat-removed": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "#aa2222", + "foregroundHex": "#aa2222" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "#aa2222" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "#aa4444" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "#aa2222", + "foregroundHex": "#aa2222", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-dimmed": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey50", + "foregroundHex": "#7f7f7f" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey50" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey50" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey50", + "foregroundHex": "#7f7f7f", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-filename": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "weight": "normal" + }, + "default-spec": [ + [ + "t", + ":weight", + "normal" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13730,74 +16364,229 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-hash": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey60", + "foregroundHex": "#999999" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey60" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey40" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey60", + "foregroundHex": "#999999", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-head": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-branch-local" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":inherit", + "magit-branch-local" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":inherit", + "magit-branch-local" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b", "height": 1, + "inherit": "magit-branch-local", + "selectedInherits": [ + "magit-branch-local" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-header-line": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-section-heading" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-section-heading" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "DarkGoldenrod4", + "foregroundHex": "#8b6508", "height": 1, + "inherit": "magit-section-heading", + "selectedInherits": [ + "magit-section-heading" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-section-heading", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-header-line-key": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-builtin-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-builtin-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "LightGray", + "foregroundHex": "#d3d3d3", "height": 1, + "inherit": "font-lock-builtin-face", + "selectedInherits": [ + "font-lock-builtin-face" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-builtin-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-header-line-log-select": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "bold" + }, + "default-spec": [ + [ + "t", + ":inherit", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13805,31 +16594,77 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "bold", + "selectedInherits": [ + "bold" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "bold", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-keyword": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-string-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-string-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DimGray", + "foregroundHex": "#696969", "height": 1, - "slant": "normal", + "inherit": "font-lock-string-face", + "selectedInherits": [ + "font-lock-string-face" + ], + "slant": "italic", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-string-face", + "overline": "nil", + "slant": "italic", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-keyword-squash": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "font-lock-warning-face" + }, + "default-spec": [ + [ + "t", + ":inherit", + "font-lock-warning-face" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13837,15 +16672,38 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "font-lock-warning-face", + "selectedInherits": [ + "font-lock-warning-face" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "font-lock-warning-face", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-left-margin": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "default" + }, + "default-spec": [ + [ + "t", + ":inherit", + "default" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13853,63 +16711,235 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "default", + "selectedInherits": [ + "default" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "default", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-log-author": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "firebrick", + "foregroundHex": "#b22222", + "slant": "normal", + "weight": "normal" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "firebrick", + ":slant", + "normal", + ":weight", + "normal" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "tomato", + ":slant", + "normal", + ":weight", + "normal" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "firebrick", + "foregroundHex": "#b22222", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-log-date": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey30", + "foregroundHex": "#4d4d4d", + "slant": "normal", + "weight": "normal" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey30", + ":slant", + "normal", + ":weight", + "normal" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey80", + ":slant", + "normal", + ":weight", + "normal" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-log-graph": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey30", + "foregroundHex": "#4d4d4d" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey30" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey80" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-mode-line-process": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "mode-line-emphasis" + }, + "default-spec": [ + [ + "t", + ":inherit", + "mode-line-emphasis" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -13917,271 +16947,662 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "mode-line-emphasis", + "selectedInherits": [ + "mode-line-emphasis" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "mode-line-emphasis", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-mode-line-process-error": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "error" + }, + "default-spec": [ + [ + "t", + ":inherit", + "error" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "Red1", + "foregroundHex": "#ff0000", "height": 1, + "inherit": "error", + "selectedInherits": [ + "error" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "error", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-process-ng": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "red", + "foregroundHex": "#ff0000", + "inherit": "magit-section-heading" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-section-heading", + ":foreground", + "red" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "red", + "foregroundHex": "#ff0000", "height": 1, + "inherit": "magit-section-heading", + "selectedInherits": [ + "magit-section-heading" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "red", + "height": 1, + "inherit": "magit-section-heading", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-process-ok": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "green", + "foregroundHex": "#00ff00", + "inherit": "magit-section-heading" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-section-heading", + ":foreground", + "green" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "green", + "foregroundHex": "#00ff00", "height": 1, + "inherit": "magit-section-heading", + "selectedInherits": [ + "magit-section-heading" + ], "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "green", + "height": 1, + "inherit": "magit-section-heading", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-amend": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "magenta", + "foregroundHex": "#ff00ff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "magenta" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "magenta", + "foregroundHex": "#ff00ff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "magenta", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-checkout": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "blue", + "foregroundHex": "#0000ff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "blue" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "blue", + "foregroundHex": "#0000ff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "blue", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-cherry-pick": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "green", + "foregroundHex": "#00ff00" + }, + "default-spec": [ + [ + "t", + ":foreground", + "green" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "green", + "foregroundHex": "#00ff00", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "green", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-commit": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "green", + "foregroundHex": "#00ff00" + }, + "default-spec": [ + [ + "t", + ":foreground", + "green" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "green", + "foregroundHex": "#00ff00", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "green", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-merge": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "green", + "foregroundHex": "#00ff00" + }, + "default-spec": [ + [ + "t", + ":foreground", + "green" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "green", + "foregroundHex": "#00ff00", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "green", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-other": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "cyan", + "foregroundHex": "#00ffff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "cyan" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "cyan", + "foregroundHex": "#00ffff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "cyan", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-rebase": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "magenta", + "foregroundHex": "#ff00ff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "magenta" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "magenta", + "foregroundHex": "#ff00ff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "magenta", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-remote": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "cyan", + "foregroundHex": "#00ffff" + }, + "default-spec": [ + [ + "t", + ":foreground", + "cyan" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "cyan", + "foregroundHex": "#00ffff", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "cyan", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-reflog-reset": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "red", + "foregroundHex": "#ff0000" + }, + "default-spec": [ + [ + "t", + ":foreground", + "red" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "red", + "foregroundHex": "#ff0000", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "red", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-refname": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey30", + "foregroundHex": "#4d4d4d" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey30" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey80" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-refname-pullreq": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-refname" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-refname" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, + "inherit": "magit-refname", + "selectedInherits": [ + "magit-refname" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-refname", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-refname-stash": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-refname" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-refname" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, + "inherit": "magit-refname", + "selectedInherits": [ + "magit-refname" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-refname", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-refname-wip": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-refname" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-refname" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, + "inherit": "magit-refname", + "selectedInherits": [ + "magit-refname" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-refname", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-section-child-count": { + "background": "unspecified-bg", + "box": "nil", "chosenGuiLight": {}, + "default-spec": [ + [ + "t", + "nil" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -14194,46 +17615,198 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-section-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "DarkGoldenrod4", + "foregroundHex": "#8b6508", + "weight": "bold" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":foreground", + "DarkGoldenrod4", + ":weight", + "bold" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":foreground", + "LightGoldenrod2", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "DarkGoldenrod4", + "foregroundHex": "#8b6508", "height": 1, "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-section-heading-selection": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":foreground", + "salmon4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":foreground", + "LightSalmon3" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-section-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey95", + "backgroundHex": "#f2f2f2", + "extend": "t" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey95" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey20" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey95", + "backgroundHex": "#f2f2f2", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, @@ -14242,122 +17815,362 @@ "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-section-secondary-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "weight": "bold" + }, + "default-spec": [ + [ + "t", + ":extend", + "t", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, + "extend": "t", "foreground": "black", "foregroundHex": "#000000", "height": 1, "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-sequence-done": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-hash" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-hash" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey60", + "foregroundHex": "#999999", "height": 1, + "inherit": "magit-hash", + "selectedInherits": [ + "magit-hash" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-hash", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-drop": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "IndianRed", + "foregroundHex": "#cd5c5c" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "IndianRed" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "IndianRed" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "IndianRed", + "foregroundHex": "#cd5c5c", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-exec": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-hash" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-hash" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey60", + "foregroundHex": "#999999", "height": 1, + "inherit": "magit-hash", + "selectedInherits": [ + "magit-hash" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-hash", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-head": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "SkyBlue4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "LightSkyBlue1" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "SkyBlue4", + "foregroundHex": "#4a708b", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-onto": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-sequence-done" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-sequence-done" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey60", + "foregroundHex": "#999999", "height": 1, + "inherit": "magit-sequence-done", + "selectedInherits": [ + "magit-sequence-done" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "magit-sequence-done", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-part": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "Goldenrod4", + "foregroundHex": "#8b6914" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "Goldenrod4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "LightGoldenrod2" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "Goldenrod4", + "foregroundHex": "#8b6914", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-pick": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "default" + }, + "default-spec": [ + [ + "t", + ":inherit", + "default" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -14365,156 +18178,400 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "default", + "selectedInherits": [ + "default" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "default", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-sequence-stop": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "DarkOliveGreen4", + "foregroundHex": "#6e8b3d" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "DarkOliveGreen4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "DarkSeaGreen2" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "DarkOliveGreen4", + "foregroundHex": "#6e8b3d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-signature-bad": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "red", + "foregroundHex": "#ff0000", + "weight": "bold" + }, + "default-spec": [ + [ + "t", + ":foreground", + "red", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "red", + "foregroundHex": "#ff0000", "height": 1, "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "red", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "magit-signature-error": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "light blue", + "foregroundHex": "#add8e6" + }, + "default-spec": [ + [ + "t", + ":foreground", + "light blue" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "light blue", + "foregroundHex": "#add8e6", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "light blue", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-signature-expired": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "orange", + "foregroundHex": "#ffa500" + }, + "default-spec": [ + [ + "t", + ":foreground", + "orange" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "orange", + "foregroundHex": "#ffa500", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "orange", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-signature-expired-key": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": "magit-signature-expired" + }, + "default-spec": [ + [ + "t", + ":inherit", + "magit-signature-expired" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "orange", + "foregroundHex": "#ffa500", "height": 1, + "inherit": "magit-signature-expired", + "selectedInherits": [ + "magit-signature-expired" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "orange", + "height": 1, + "inherit": "magit-signature-expired", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-signature-good": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "green", + "foregroundHex": "#00ff00" + }, + "default-spec": [ + [ + "t", + ":foreground", + "green" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "green", + "foregroundHex": "#00ff00", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "green", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-signature-revoked": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "violet red", + "foregroundHex": "#d02090" + }, + "default-spec": [ + [ + "t", + ":foreground", + "violet red" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "violet red", + "foregroundHex": "#d02090", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "violet red", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-signature-untrusted": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "medium aquamarine", + "foregroundHex": "#66cdaa" + }, + "default-spec": [ + [ + "t", + ":foreground", + "medium aquamarine" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "medium aquamarine", + "foregroundHex": "#66cdaa", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "medium aquamarine", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "magit-tag": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "Goldenrod4", + "foregroundHex": "#8b6914" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "Goldenrod4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "LightGoldenrod2" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "Goldenrod4", + "foregroundHex": "#8b6914", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "malyon-face-bold": { "background": "unspecified-bg", @@ -14549,6 +18606,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "bold", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14587,6 +18645,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14625,6 +18684,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "italic", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -14663,6 +18723,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14705,6 +18766,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14743,6 +18805,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14781,6 +18844,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-key", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14819,6 +18883,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-key", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14857,6 +18922,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "completions-annotations", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -14895,6 +18961,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-documentation", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -14933,6 +19000,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-preprocessor-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -14971,6 +19039,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15009,6 +19078,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15047,6 +19117,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15085,6 +19156,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15123,6 +19195,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15161,6 +19234,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -15199,6 +19273,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15237,6 +19312,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15275,6 +19351,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15313,6 +19390,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15351,6 +19429,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15389,6 +19468,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-size", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15427,6 +19507,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15465,6 +19546,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-key", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15503,6 +19585,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-negation-char-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15541,6 +19624,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -15579,6 +19663,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15617,6 +19702,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15655,6 +19741,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15693,6 +19780,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-number", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15731,6 +19819,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -15769,6 +19858,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15807,6 +19897,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15845,6 +19936,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-key", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15883,6 +19975,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-key", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -15921,6 +20014,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "marginalia-number", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -15961,6 +20055,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-doc-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -16001,6 +20096,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "bold", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16041,6 +20137,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "fixed-pitch", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16081,6 +20178,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -16121,6 +20219,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16161,6 +20260,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -16201,6 +20301,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16241,6 +20342,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16292,6 +20394,7 @@ "inherit": [ "font-lock-function-name-face" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16335,6 +20438,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-header-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16378,6 +20482,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-header-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16421,6 +20526,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-header-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16464,6 +20570,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-header-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16507,6 +20614,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-header-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16550,6 +20658,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-header-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16590,6 +20699,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16630,6 +20740,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16671,6 +20782,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16711,6 +20823,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16751,6 +20864,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -16791,6 +20905,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -16831,6 +20946,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -16871,6 +20987,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -16911,6 +21028,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -16964,6 +21082,7 @@ "markdown-code-face", "font-lock-constant-face" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -17004,6 +21123,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "italic", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17044,6 +21164,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17084,6 +21205,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -17127,6 +21249,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -17167,6 +21290,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "link", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -17207,6 +21331,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17247,6 +21372,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17293,6 +21419,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17333,6 +21460,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17373,6 +21501,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17413,6 +21542,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17453,6 +21583,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-warning-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17493,6 +21624,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-link-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -17546,6 +21678,7 @@ "markdown-code-face", "font-lock-constant-face" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -17586,6 +21719,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "markdown-markup-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17622,6 +21756,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "t", "underline": "nil", @@ -17670,6 +21805,7 @@ "inherit": [ "markdown-code-face" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17710,6 +21846,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -17765,6 +21902,7 @@ "foreground": "cyan", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17837,6 +21975,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -17959,6 +22098,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "mode-line", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18009,6 +22149,7 @@ "foreground": "#6A9FB5", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18059,6 +22200,7 @@ "foreground": "#2188b6", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18090,6 +22232,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18140,6 +22283,7 @@ "foreground": "#75B5AA", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18190,6 +22334,7 @@ "foreground": "#61dafb", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18240,6 +22385,7 @@ "foreground": "#446674", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18290,6 +22436,7 @@ "foreground": "#48746D", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18340,6 +22487,7 @@ "foreground": "#6D8143", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18390,6 +22538,7 @@ "foreground": "#72584B", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18440,6 +22589,7 @@ "foreground": "#915B2D", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18490,6 +22640,7 @@ "foreground": "#B18286", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18540,6 +22691,7 @@ "foreground": "#694863", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18590,6 +22742,7 @@ "foreground": "#843031", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18640,6 +22793,7 @@ "foreground": "#838484", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18690,6 +22844,7 @@ "foreground": "#B48D56", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18740,6 +22895,7 @@ "foreground": "#90A959", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18790,6 +22946,7 @@ "foreground": "#8FD7F4", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18840,6 +22997,7 @@ "foreground": "#A5FDEC", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18890,6 +23048,7 @@ "foreground": "#C6E87A", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18940,6 +23099,7 @@ "foreground": "#CE7A4E", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -18990,6 +23150,7 @@ "foreground": "#FFA500", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19040,6 +23201,7 @@ "foreground": "#FFBDC1", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19090,6 +23252,7 @@ "foreground": "#E69DD6", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19140,6 +23303,7 @@ "foreground": "#EB595A", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19190,6 +23354,7 @@ "foreground": "#B9B6AA", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19240,6 +23405,7 @@ "foreground": "#FFC16D", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19290,6 +23456,7 @@ "foreground": "#8F5536", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19340,6 +23507,7 @@ "foreground": "#D4843E", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19390,6 +23558,7 @@ "foreground": "#F2B4B8", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19440,6 +23609,7 @@ "foreground": "#AA759F", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19490,6 +23660,7 @@ "foreground": "#5D54E1", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19540,6 +23711,7 @@ "foreground": "#AC4142", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19590,6 +23762,7 @@ "foreground": "#ce5643", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19640,6 +23813,7 @@ "foreground": "#716E68", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19690,6 +23864,7 @@ "foreground": "#FFD446", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19767,6 +23942,7 @@ "foreground": "blue", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19844,6 +24020,7 @@ "foreground": "magenta", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19921,6 +24098,7 @@ "foreground": "green", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -19998,13 +24176,32 @@ "foreground": "yellow", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", "weight": "bold" }, "org-roam-dailies-calendar-note": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "inherit": [ + "org-link" + ], + "underline": "nil" + }, + "default-spec": [ + [ + "t", + ":inherit", + [ + "org-link" + ], + ":underline", + "nil" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -20012,127 +24209,489 @@ "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": [ + "org-link" + ], + "selectedInherits": [ + "org-link" + ], "slant": "normal", "strike": null, - "underline": null, + "underline": "nil", "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": [ + "org-link" + ], + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-dim": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey60", + "foregroundHex": "#999999" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey60" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey40" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey60", + "foregroundHex": "#999999", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-header-line": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "DarkGoldenrod4", + "foregroundHex": "#8b6508", + "weight": "bold" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":foreground", + "DarkGoldenrod4", + ":weight", + "bold" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":foreground", + "LightGoldenrod2", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "DarkGoldenrod4", + "foregroundHex": "#8b6508", "height": 1, "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-olp": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "foreground": "grey60", + "foregroundHex": "#999999" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":foreground", + "grey60" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":foreground", + "grey40" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "foreground": "grey60", + "foregroundHex": "#999999", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-preview-heading": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey80", + "backgroundHex": "#cccccc", + "extend": "t", + "foreground": "grey30", + "foregroundHex": "#4d4d4d" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey80", + ":foreground", + "grey30" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey25", + ":foreground", + "grey70" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey80", + "backgroundHex": "#cccccc", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-preview-heading-highlight": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "background": "grey75", + "backgroundHex": "#bfbfbf", + "extend": "t", + "foreground": "grey30", + "foregroundHex": "#4d4d4d" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":background", + "grey75", + ":foreground", + "grey30" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":background", + "grey35", + ":foreground", + "grey70" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey75", + "backgroundHex": "#bfbfbf", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "grey30", + "foregroundHex": "#4d4d4d", "height": 1, "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-preview-heading-selection": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", + "inherit": "org-roam-preview-heading-highlight" + }, + "default-spec": [ + [ + [ + [ + "class", + "color" + ], + [ + "background", + "light" + ] + ], + ":extend", + "t", + ":inherit", + "org-roam-preview-heading-highlight", + ":foreground", + "salmon4" + ], + [ + [ + [ + "class", + "color" + ], + [ + "background", + "dark" + ] + ], + ":extend", + "t", + ":inherit", + "org-roam-preview-heading-highlight", + ":foreground", + "LightSalmon3" + ] + ], "effectiveGuiLight": { - "background": "white", - "backgroundHex": "#ffffff", + "background": "grey75", + "backgroundHex": "#bfbfbf", "box": null, - "foreground": "black", - "foregroundHex": "#000000", + "extend": "t", + "foreground": "salmon4", + "foregroundHex": "#8b4c39", "height": 1, + "inherit": "org-roam-preview-heading-highlight", + "selectedInherits": [ + "org-roam-preview-heading-highlight" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "normal" }, "org-roam-preview-region": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "extend": "unspecified", + "inherit": "bold" + }, + "default-spec": [ + [ + "t", + ":inherit", + "bold", + ":extend", + "unspecified" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", "box": null, + "extend": "unspecified", "foreground": "black", "foregroundHex": "#000000", "height": 1, + "inherit": "bold", + "selectedInherits": [ + "bold" + ], "slant": "normal", "strike": null, "underline": null, "weight": "normal" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "bold", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "org-roam-title": { - "chosenGuiLight": {}, + "background": "unspecified-bg", + "box": "nil", + "chosenGuiLight": { + "weight": "bold" + }, + "default-spec": [ + [ + "t", + ":weight", + "bold" + ] + ], "effectiveGuiLight": { "background": "white", "backgroundHex": "#ffffff", @@ -20143,9 +24702,17 @@ "slant": "normal", "strike": null, "underline": null, - "weight": "normal" + "weight": "bold" }, - "exists": false + "exists": true, + "foreground": "unspecified-fg", + "height": 1, + "inherit": "nil", + "overline": "nil", + "slant": "normal", + "strike": "nil", + "underline": "nil", + "weight": "bold" }, "org-superstar-first": { "background": "unspecified-bg", @@ -20180,6 +24747,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "org-warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20210,6 +24778,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20248,6 +24817,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20290,6 +24860,7 @@ "foreground": "gray", "height": 1, "inherit": "default", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20324,6 +24895,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20365,6 +24937,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "prescient-primary-highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -20414,6 +24987,7 @@ "foreground": "#88090B", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20454,6 +25028,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20524,6 +25099,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20594,6 +25170,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20664,6 +25241,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20734,6 +25312,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20804,6 +25383,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20874,6 +25454,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -20944,6 +25525,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21014,6 +25596,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21084,6 +25667,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "rainbow-delimiters-base-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21124,6 +25708,7 @@ "foreground": "#88090B", "height": 1, "inherit": "rainbow-delimiters-unmatched-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21164,6 +25749,7 @@ "foreground": "#88090B", "height": 1, "inherit": "rainbow-delimiters-base-error-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21315,6 +25901,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21406,6 +25993,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "underline", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -21459,6 +26047,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21559,6 +26148,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21599,6 +26189,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21640,6 +26231,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21681,6 +26273,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21722,6 +26315,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21763,6 +26357,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21804,6 +26399,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21845,6 +26441,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21886,6 +26483,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21927,6 +26525,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21965,6 +26564,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "bold", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -21991,6 +26591,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22029,6 +26630,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22067,6 +26669,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "error", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22105,6 +26708,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22143,6 +26747,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "warning", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22181,6 +26786,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "success", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22219,6 +26825,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "bold", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22257,6 +26864,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-doc-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -22328,6 +26936,7 @@ "foreground": "magenta", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22399,6 +27008,7 @@ "foreground": "yellow", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22470,6 +27080,7 @@ "foreground": "cyan", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22508,6 +27119,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22549,6 +27161,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -22587,6 +27200,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22629,6 +27243,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22671,6 +27286,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22709,6 +27325,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22779,6 +27396,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22817,6 +27435,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22855,6 +27474,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22896,6 +27516,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -22937,6 +27558,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -22975,6 +27597,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23042,6 +27665,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23109,6 +27733,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23176,6 +27801,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23243,6 +27869,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23310,6 +27937,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23377,6 +28005,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23447,6 +28076,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23517,6 +28147,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23555,6 +28186,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23609,6 +28241,7 @@ "shadow", "transient-key" ], + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23650,6 +28283,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -23689,6 +28323,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23728,6 +28363,7 @@ "foreground": "white", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23767,6 +28403,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23806,6 +28443,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23845,6 +28483,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23884,6 +28523,7 @@ "foreground": "white", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23923,6 +28563,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -23962,6 +28603,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24001,6 +28643,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24040,6 +28683,7 @@ "foreground": "white", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24079,6 +28723,7 @@ "foreground": "black", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24116,6 +28761,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "mode-line-inactive", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24158,6 +28804,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "highlight", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24199,6 +28846,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "vertico-group-title", + "overline": "nil", "slant": "italic", "strike": "t", "underline": "nil", @@ -24240,6 +28888,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24278,6 +28927,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "shadow", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24338,6 +28988,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24376,6 +29027,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24417,6 +29069,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-annotation-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24458,6 +29111,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-annotation-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "t", @@ -24499,6 +29153,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-annotation-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24540,6 +29195,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-annotation-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24575,6 +29231,7 @@ "foreground": "#8fbc8f", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24610,6 +29267,7 @@ "foreground": "#5f9ea0", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24648,6 +29306,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24686,6 +29345,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-preprocessor-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24724,6 +29384,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-preprocessor-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24859,6 +29520,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24897,6 +29559,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -24931,6 +29594,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -24969,6 +29633,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25007,6 +29672,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -25044,6 +29710,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25082,6 +29749,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -25120,6 +29788,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-constant-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -25158,6 +29827,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25196,6 +29866,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -25234,6 +29905,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25272,6 +29944,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25310,6 +29983,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -25348,6 +30022,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-builtin-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25386,6 +30061,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25424,6 +30100,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25462,6 +30139,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25500,6 +30178,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -25541,6 +30220,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -25576,6 +30256,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25615,6 +30296,7 @@ "foreground": "#ffffff", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25650,6 +30332,7 @@ "foreground": "Grey", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25685,6 +30368,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25723,6 +30407,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25757,6 +30442,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -25795,6 +30481,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25833,6 +30520,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-function-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25871,6 +30559,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-html-attr-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25909,6 +30598,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-block-delimiter-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -25947,6 +30637,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-html-attr-name-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26082,6 +30773,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26120,6 +30812,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26154,6 +30847,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26289,6 +30983,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26327,6 +31022,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-html-tag-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26462,6 +31158,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26500,6 +31197,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-block-control-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26541,6 +31239,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-html-tag-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -26676,6 +31375,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -26714,6 +31414,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26752,6 +31453,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26790,6 +31492,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26828,6 +31531,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26862,6 +31566,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26900,6 +31605,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26938,6 +31644,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -26976,6 +31683,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27011,6 +31719,7 @@ "foreground": "orchid3", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27046,6 +31755,7 @@ "foreground": "plum", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27084,6 +31794,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27119,6 +31830,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27154,6 +31866,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27189,6 +31902,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27224,6 +31938,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27259,6 +31974,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27297,6 +32013,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-keyword-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27332,6 +32049,7 @@ "foreground": "Snow3", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27370,6 +32088,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-comment-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27408,6 +32127,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-block-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27446,6 +32166,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27484,6 +32205,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-preprocessor-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27522,6 +32244,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-part-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27559,6 +32282,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27597,6 +32321,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-string-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27635,6 +32360,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "web-mode-part-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27670,6 +32396,7 @@ "foreground": "goldenrod2", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27708,6 +32435,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-type-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -27742,6 +32470,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "t", @@ -27780,6 +32509,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-variable-name-face", + "overline": "nil", "slant": "italic", "strike": "nil", "underline": "nil", @@ -27818,6 +32548,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "font-lock-warning-face", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27853,6 +32584,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27879,6 +32611,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "nil", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27920,6 +32653,7 @@ "foreground": "unspecified-fg", "height": 1, "inherit": "region", + "overline": "nil", "slant": "normal", "strike": "nil", "underline": "nil", @@ -27932,9 +32666,9 @@ "default-foreground": "black", "display-color-cells": 16777216, "emacs-version": "30.2", - "loaded-defface-file-count": 56, + "loaded-defface-file-count": 55, "package-face-count": 643, - "package-unresolved-face-count": 23, + "package-unresolved-face-count": 25, "resolution-model": "gui-light-24bit-from-face-default-spec", "window-system": "batch" }, @@ -27953,12 +32687,12 @@ "twentyfortyeight-face-8": "/home/cjennings/.emacs.d/elpa/2048-game-20230809.356/2048-game.el" }, "alert": { - "alert-high-face": "/home/cjennings/.emacs.d/elpa/alert-20250615.1845/alert.el", - "alert-low-face": "/home/cjennings/.emacs.d/elpa/alert-20250615.1845/alert.el", - "alert-moderate-face": "/home/cjennings/.emacs.d/elpa/alert-20250615.1845/alert.el", - "alert-normal-face": "/home/cjennings/.emacs.d/elpa/alert-20250615.1845/alert.el", - "alert-trivial-face": "/home/cjennings/.emacs.d/elpa/alert-20250615.1845/alert.el", - "alert-urgent-face": "/home/cjennings/.emacs.d/elpa/alert-20250615.1845/alert.el" + "alert-high-face": "/home/cjennings/.emacs.d/elpa/alert-20260316.2025/alert.el", + "alert-low-face": "/home/cjennings/.emacs.d/elpa/alert-20260316.2025/alert.el", + "alert-moderate-face": "/home/cjennings/.emacs.d/elpa/alert-20260316.2025/alert.el", + "alert-normal-face": "/home/cjennings/.emacs.d/elpa/alert-20260316.2025/alert.el", + "alert-trivial-face": "/home/cjennings/.emacs.d/elpa/alert-20260316.2025/alert.el", + "alert-urgent-face": "/home/cjennings/.emacs.d/elpa/alert-20260316.2025/alert.el" }, "all-the-icons": { "all-the-icons-blue": "/home/cjennings/.emacs.d/elpa/all-the-icons-20250527.927/all-the-icons-faces.el", @@ -28026,36 +32760,35 @@ "company-box-selection": "/home/cjennings/.emacs.d/elpa/company-box-20240320.921/company-box.el" }, "consult": { - "consult-async-failed": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-async-finished": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-async-running": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-async-split": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-bookmark": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-buffer": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-file": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-grep-context": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-help": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-highlight-mark": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-highlight-match": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-key": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-line-number": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-line-number-prefix": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-line-number-wrapped": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-narrow-indicator": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-preview-insertion": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-preview-line": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-preview-match": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el", - "consult-separator": "/home/cjennings/.emacs.d/elpa/consult-2.6/consult.el" + "consult-async-failed": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-async-finished": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-async-running": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-async-split": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-bookmark": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-buffer": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-file": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-grep-context": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-help": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-highlight-mark": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-highlight-match": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-key": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-line-number": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-line-number-prefix": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-line-number-wrapped": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-narrow-indicator": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-preview-insertion": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-preview-line": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el", + "consult-preview-match": "/home/cjennings/.emacs.d/elpa/consult-3.4/consult.el" }, "dashboard": { - "dashboard-banner-logo-title": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-footer-face": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-footer-icon-face": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-heading": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-items-face": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-navigator": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-no-items-face": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el", - "dashboard-text-banner": "/home/cjennings/.emacs.d/elpa/dashboard-20250708.57/dashboard-widgets.el" + "dashboard-banner-logo-title": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-footer-face": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-footer-icon-face": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-heading": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-items-face": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-navigator": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-no-items-face": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el", + "dashboard-text-banner": "/home/cjennings/.emacs.d/elpa/dashboard-20260402.436/dashboard-widgets.el" }, "dirvish": { "dirvish-collapse-dir-face": "/home/cjennings/.emacs.d/elpa/dirvish-2.3.0/extensions/dirvish-collapse.el", @@ -28098,64 +32831,64 @@ "dirvish-vc-unregistered-face": "/home/cjennings/.emacs.d/elpa/dirvish-2.3.0/extensions/dirvish-vc.el" }, "elfeed": { - "elfeed-log-date-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-log.el", - "elfeed-log-debug-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-log.el", - "elfeed-log-error-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-log.el", - "elfeed-log-info-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-log.el", - "elfeed-log-warn-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-log.el", - "elfeed-search-date-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-feed-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-filter-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-last-update-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-tag-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-title-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-unread-count-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el", - "elfeed-search-unread-title-face": "/home/cjennings/.emacs.d/elpa/elfeed-20241202.22/elfeed-search.el" + "elfeed-log-date-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-log.el", + "elfeed-log-debug-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-log.el", + "elfeed-log-error-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-log.el", + "elfeed-log-info-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-log.el", + "elfeed-log-warn-level-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-log.el", + "elfeed-search-date-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-feed-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-filter-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-last-update-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-tag-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-title-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-unread-count-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el", + "elfeed-search-unread-title-face": "/home/cjennings/.emacs.d/elpa/elfeed-20260218.1306/elfeed-search.el" }, "embark": { - "embark-collect-annotation": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-collect-candidate": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-collect-group-separator": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-collect-group-title": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-keybinding": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-keybinding-repeat": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-keymap": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-selected": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-target": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-verbose-indicator-documentation": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-verbose-indicator-shadowed": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el", - "embark-verbose-indicator-title": "/home/cjennings/.emacs.d/elpa/embark-1.1/embark.el" + "embark-collect-annotation": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-collect-candidate": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-collect-group-separator": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-collect-group-title": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-keybinding": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-keybinding-repeat": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-keymap": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-selected": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-target": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-verbose-indicator-documentation": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-verbose-indicator-shadowed": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el", + "embark-verbose-indicator-title": "/home/cjennings/.emacs.d/elpa/embark-1.2/embark.el" }, "emms": { - "emms-metaplaylist-mode-current-face": "/home/cjennings/.emacs.d/elpa/emms-24/emms-metaplaylist-mode.el", - "emms-metaplaylist-mode-face": "/home/cjennings/.emacs.d/elpa/emms-24/emms-metaplaylist-mode.el", - "emms-playlist-selected-face": "/home/cjennings/.emacs.d/elpa/emms-24/emms-playlist-mode.el", - "emms-playlist-track-face": "/home/cjennings/.emacs.d/elpa/emms-24/emms-playlist-mode.el" + "emms-metaplaylist-mode-current-face": "/home/cjennings/.emacs.d/elpa/emms-25/emms-metaplaylist-mode.el", + "emms-metaplaylist-mode-face": "/home/cjennings/.emacs.d/elpa/emms-25/emms-metaplaylist-mode.el", + "emms-playlist-selected-face": "/home/cjennings/.emacs.d/elpa/emms-25/emms-playlist-mode.el", + "emms-playlist-track-face": "/home/cjennings/.emacs.d/elpa/emms-25/emms-playlist-mode.el" }, "flycheck": { - "flycheck-delimited-error": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-delimiter": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-checker-name": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-column-number": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-error": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-error-message": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-filename": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-highlight": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-id": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-id-with-explainer": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-info": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-line-number": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-error-list-warning": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-fringe-error": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-fringe-info": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-fringe-warning": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-info": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-verify-select-checker": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el", - "flycheck-warning": "/home/cjennings/.emacs.d/elpa/flycheck-35.0/flycheck.el" + "flycheck-delimited-error": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-delimiter": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-checker-name": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-column-number": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-error": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-error-message": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-filename": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-highlight": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-id": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-id-with-explainer": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-info": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-line-number": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-error-list-warning": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-fringe-error": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-fringe-info": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-fringe-warning": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-info": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-verify-select-checker": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el", + "flycheck-warning": "/home/cjennings/.emacs.d/elpa/flycheck-36.0/flycheck.el" }, "flyspell-correct": { - "flyspell-correct-highlight-face": "/home/cjennings/.emacs.d/elpa/flyspell-correct-20220520.630/flyspell-correct.el" + "flyspell-correct-highlight-face": "/home/cjennings/.emacs.d/elpa/flyspell-correct-20260106.955/flyspell-correct.el" }, "ghostel": { "ghostel-color-black": "/home/cjennings/.emacs.d/elpa/ghostel-20260604.2049/ghostel.el", @@ -28186,161 +32919,159 @@ "git-gutter:unchanged": "/home/cjennings/.emacs.d/elpa/git-gutter-20241212.1415/git-gutter.el" }, "highlight-indent-guides": { - "highlight-indent-guides-character-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-even-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-odd-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-stack-character-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-stack-even-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-stack-odd-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-top-character-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-top-even-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el", - "highlight-indent-guides-top-odd-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20241229.2012/highlight-indent-guides.el" + "highlight-indent-guides-character-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-even-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-odd-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-stack-character-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-stack-even-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-stack-odd-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-top-character-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-top-even-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el", + "highlight-indent-guides-top-odd-face": "/home/cjennings/.emacs.d/elpa/highlight-indent-guides-20260202.1243/highlight-indent-guides.el" }, "hl-todo": { - "hl-todo": "/home/cjennings/.emacs.d/elpa/hl-todo-20250531.2218/hl-todo.el", - "hl-todo-flymake-type": "/home/cjennings/.emacs.d/elpa/hl-todo-20250531.2218/hl-todo.el" - }, - "json-mode": { - "json-mode-object-name-face": "/home/cjennings/.emacs.d/elpa/json-mode-0.2/json-mode.el" + "hl-todo": "/home/cjennings/.emacs.d/elpa/hl-todo-20260101.1834/hl-todo.el", + "hl-todo-flymake-type": "/home/cjennings/.emacs.d/elpa/hl-todo-20260101.1834/hl-todo.el" }, + "json-mode": null, "llama": { - "llama-deleted-argument": "/home/cjennings/.emacs.d/elpa/llama-1.0.0/llama.el", - "llama-llama-macro": "/home/cjennings/.emacs.d/elpa/llama-1.0.0/llama.el", - "llama-mandatory-argument": "/home/cjennings/.emacs.d/elpa/llama-1.0.0/llama.el", - "llama-optional-argument": "/home/cjennings/.emacs.d/elpa/llama-1.0.0/llama.el" + "llama-deleted-argument": "/home/cjennings/.emacs.d/elpa/llama-1.0.4/llama.el", + "llama-llama-macro": "/home/cjennings/.emacs.d/elpa/llama-1.0.4/llama.el", + "llama-mandatory-argument": "/home/cjennings/.emacs.d/elpa/llama-1.0.4/llama.el", + "llama-optional-argument": "/home/cjennings/.emacs.d/elpa/llama-1.0.4/llama.el" }, "lsp-mode": { - "lsp-details-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-face-highlight-read": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-face-highlight-textual": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-face-highlight-write": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-face-rename": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-inlay-hint-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-inlay-hint-parameter-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-inlay-hint-type-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-installation-buffer-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-installation-finished-buffer-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-rename-placeholder-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-signature-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-signature-highlight-function-argument": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el", - "lsp-signature-posframe": "/home/cjennings/.emacs.d/elpa/lsp-mode-20250708.39/lsp-mode.el" + "lsp-details-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-face-highlight-read": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-face-highlight-textual": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-face-highlight-write": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-face-rename": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-inlay-hint-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-inlay-hint-parameter-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-inlay-hint-type-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-installation-buffer-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-installation-finished-buffer-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-rename-placeholder-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-signature-face": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-signature-highlight-function-argument": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el", + "lsp-signature-posframe": "/home/cjennings/.emacs.d/elpa/lsp-mode-20260408.702/lsp-mode.el" }, "lv": { "lv-separator": "/home/cjennings/.emacs.d/elpa/lv-0.15.0/lv.el" }, "magit": { - "git-commit-comment-action": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-comment-branch-local": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-comment-branch-remote": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-comment-detached": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-comment-file": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-comment-heading": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-keyword": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-nonempty-second-line": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-overlong-summary": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-summary": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-trailer-token": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "git-commit-trailer-value": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/git-commit.el", - "magit-bisect-bad": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-bisect.el", - "magit-bisect-good": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-bisect.el", - "magit-bisect-skip": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-bisect.el", - "magit-blame-date": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-dimmed": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-hash": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-heading": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-margin": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-name": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-blame-summary": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-blame.el", - "magit-branch-current": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-branch-local": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-branch-remote": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-branch-remote-head": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-branch-upstream": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-branch-warning": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-cherry-equivalent": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-cherry-unmatched": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-diff-added": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-added-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-base": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-base-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-conflict-heading": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-conflict-heading-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-context": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-context-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-file-heading": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-file-heading-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-file-heading-selection": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-hunk-heading": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-hunk-heading-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-hunk-heading-selection": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-hunk-region": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-lines-boundary": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-lines-heading": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-our": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-our-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-removed": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-removed-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-revision-summary": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-revision-summary-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-their": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-their-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diff-whitespace-warning": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diffstat-added": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-diffstat-removed": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-diff.el", - "magit-dimmed": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-filename": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-hash": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-head": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-header-line": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-log.el", - "magit-header-line-key": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-header-line-log-select": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-log.el", - "magit-keyword": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-keyword-squash": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-log-author": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-log.el", - "magit-log-date": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-log.el", - "magit-log-graph": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-log.el", - "magit-mode-line-process": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-process.el", - "magit-mode-line-process-error": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-process.el", - "magit-process-ng": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-process.el", - "magit-process-ok": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-process.el", - "magit-reflog-amend": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-checkout": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-cherry-pick": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-commit": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-merge": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-other": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-rebase": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-remote": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-reflog-reset": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-reflog.el", - "magit-refname": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-refname-pullreq": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-refname-stash": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-refname-wip": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-sequence-done": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-drop": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-exec": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-head": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-onto": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-part": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-pick": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-sequence-stop": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit-sequence.el", - "magit-signature-bad": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-signature-error": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-signature-expired": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-signature-expired-key": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-signature-good": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-signature-revoked": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-signature-untrusted": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el", - "magit-tag": "/home/cjennings/.emacs.d/elpa/magit-4.4.0/magit.el" + "git-commit-comment-action": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-comment-branch-local": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-comment-branch-remote": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-comment-detached": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-comment-file": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-comment-heading": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-keyword": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-nonempty-second-line": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-overlong-summary": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-summary": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-trailer-token": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "git-commit-trailer-value": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/git-commit.el", + "magit-bisect-bad": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-bisect.el", + "magit-bisect-good": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-bisect.el", + "magit-bisect-skip": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-bisect.el", + "magit-blame-date": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-dimmed": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-hash": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-heading": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-margin": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-name": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-blame-summary": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-blame.el", + "magit-branch-current": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-branch-local": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-branch-remote": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-branch-remote-head": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-branch-upstream": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-branch-warning": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-cherry-equivalent": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-cherry-unmatched": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-diff-added": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-added-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-base": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-base-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-conflict-heading": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-conflict-heading-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-context": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-context-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-file-heading": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-file-heading-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-file-heading-selection": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-hunk-heading": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-hunk-heading-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-hunk-heading-selection": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-hunk-region": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-lines-boundary": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-lines-heading": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-our": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-our-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-removed": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-removed-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-revision-summary": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-revision-summary-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-their": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-their-highlight": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diff-whitespace-warning": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diffstat-added": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-diffstat-removed": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-diff.el", + "magit-dimmed": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-filename": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-hash": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-head": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-header-line": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-header-line-key": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-header-line-log-select": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-log.el", + "magit-keyword": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-keyword-squash": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-log-author": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-log.el", + "magit-log-date": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-log.el", + "magit-log-graph": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-log.el", + "magit-mode-line-process": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-process.el", + "magit-mode-line-process-error": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-process.el", + "magit-process-ng": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-process.el", + "magit-process-ok": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-process.el", + "magit-reflog-amend": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-checkout": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-cherry-pick": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-commit": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-merge": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-other": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-rebase": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-remote": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-reflog-reset": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-reflog.el", + "magit-refname": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-refname-pullreq": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-refname-stash": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-refname-wip": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-sequence-done": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-drop": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-exec": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-head": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-onto": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-part": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-pick": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-sequence-stop": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit-sequence.el", + "magit-signature-bad": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-signature-error": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-signature-expired": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-signature-expired-key": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-signature-good": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-signature-revoked": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-signature-untrusted": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el", + "magit-tag": "/home/cjennings/.emacs.d/elpa/magit-4.5.0/magit.el" }, "magit-section": { - "magit-left-margin": "/home/cjennings/.emacs.d/elpa/magit-section-4.4.0/magit-section.el", - "magit-section-child-count": "/home/cjennings/.emacs.d/elpa/magit-section-4.4.0/magit-section.el", - "magit-section-heading": "/home/cjennings/.emacs.d/elpa/magit-section-4.4.0/magit-section.el", - "magit-section-heading-selection": "/home/cjennings/.emacs.d/elpa/magit-section-4.4.0/magit-section.el", - "magit-section-highlight": "/home/cjennings/.emacs.d/elpa/magit-section-4.4.0/magit-section.el", - "magit-section-secondary-heading": "/home/cjennings/.emacs.d/elpa/magit-section-4.4.0/magit-section.el" + "magit-left-margin": "/home/cjennings/.emacs.d/elpa/magit-section-4.5.0/magit-section.el", + "magit-section-child-count": "/home/cjennings/.emacs.d/elpa/magit-section-4.5.0/magit-section.el", + "magit-section-heading": "/home/cjennings/.emacs.d/elpa/magit-section-4.5.0/magit-section.el", + "magit-section-heading-selection": "/home/cjennings/.emacs.d/elpa/magit-section-4.5.0/magit-section.el", + "magit-section-highlight": "/home/cjennings/.emacs.d/elpa/magit-section-4.5.0/magit-section.el", + "magit-section-secondary-heading": "/home/cjennings/.emacs.d/elpa/magit-section-4.5.0/magit-section.el" }, "malyon": { "malyon-face-bold": "/home/cjennings/.emacs.d/elpa/malyon-20161208.2125/malyon.el", @@ -28350,139 +33081,139 @@ "malyon-face-reverse": "/home/cjennings/.emacs.d/elpa/malyon-20161208.2125/malyon.el" }, "marginalia": { - "marginalia-archive": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-char": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-date": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-documentation": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-name": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-owner": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-dir": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-exec": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-link": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-no": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-other": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-rare": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-read": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-file-priv-write": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-function": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-installed": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-key": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-lighter": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-list": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-mode": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-modified": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-null": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-number": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-off": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-on": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-size": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-string": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-symbol": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-true": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-type": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-value": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el", - "marginalia-version": "/home/cjennings/.emacs.d/elpa/marginalia-2.1/marginalia.el" + "marginalia-archive": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-char": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-date": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-documentation": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-name": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-owner": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-dir": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-exec": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-link": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-no": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-other": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-rare": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-read": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-file-priv-write": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-function": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-installed": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-key": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-lighter": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-list": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-mode": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-modified": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-null": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-number": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-off": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-on": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-size": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-string": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-symbol": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-true": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-type": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-value": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el", + "marginalia-version": "/home/cjennings/.emacs.d/elpa/marginalia-2.10/marginalia.el" }, "markdown-mode": { - "markdown-blockquote-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-bold-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-code-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-comment-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-footnote-marker-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-footnote-text-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-gfm-checkbox-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-header-delimiter-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-header-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-header-rule-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-highlight-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-highlighting-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-hr-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-html-attr-name-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-html-attr-value-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-html-entity-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-html-tag-delimiter-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-html-tag-name-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-inline-code-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-italic-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-language-info-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-language-keyword-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-line-break-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-link-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-link-title-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-list-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-markup-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-math-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-metadata-key-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-metadata-value-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-missing-link-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-plain-url-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-pre-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-reference-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-strike-through-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-table-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el", - "markdown-url-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.7/markdown-mode.el" + "markdown-blockquote-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-bold-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-code-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-comment-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-footnote-marker-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-footnote-text-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-gfm-checkbox-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-header-delimiter-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-header-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-header-rule-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-highlight-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-highlighting-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-hr-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-html-attr-name-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-html-attr-value-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-html-entity-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-html-tag-delimiter-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-html-tag-name-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-inline-code-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-italic-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-language-info-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-language-keyword-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-line-break-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-link-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-link-title-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-list-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-markup-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-math-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-metadata-key-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-metadata-value-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-missing-link-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-plain-url-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-pre-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-reference-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-strike-through-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-table-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el", + "markdown-url-face": "/home/cjennings/.emacs.d/elpa/markdown-mode-2.8/markdown-mode.el" }, "nerd-icons": { - "nerd-icons-blue": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-blue-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-cyan": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-cyan-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dblue": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dcyan": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dgreen": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dmaroon": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dorange": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dpink": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dpurple": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dred": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dsilver": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-dyellow": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-green": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lblue": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lcyan": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lgreen": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lmaroon": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lorange": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lpink": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lpurple": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lred": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lsilver": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-lyellow": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-maroon": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-orange": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-pink": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-purple": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-purple-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-red": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-red-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-silver": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el", - "nerd-icons-yellow": "/home/cjennings/.emacs.d/elpa/nerd-icons-20250718.355/nerd-icons-faces.el" + "nerd-icons-blue": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-blue-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-cyan": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-cyan-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dblue": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dcyan": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dgreen": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dmaroon": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dorange": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dpink": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dpurple": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dred": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dsilver": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-dyellow": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-green": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lblue": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lcyan": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lgreen": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lmaroon": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lorange": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lpink": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lpurple": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lred": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lsilver": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-lyellow": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-maroon": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-orange": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-pink": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-purple": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-purple-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-red": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-red-alt": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-silver": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el", + "nerd-icons-yellow": "/home/cjennings/.emacs.d/elpa/nerd-icons-20260325.346/nerd-icons-faces.el" }, "nerd-icons-completion": { - "nerd-icons-completion-dir-face": "/home/cjennings/.emacs.d/elpa/nerd-icons-completion-20250509.1949/nerd-icons-completion.el" + "nerd-icons-completion-dir-face": "/home/cjennings/.emacs.d/elpa/nerd-icons-completion-20251029.2106/nerd-icons-completion.el" }, "orderless": { - "orderless-match-face-0": "/home/cjennings/.emacs.d/elpa/orderless-1.4/orderless.el", - "orderless-match-face-1": "/home/cjennings/.emacs.d/elpa/orderless-1.4/orderless.el", - "orderless-match-face-2": "/home/cjennings/.emacs.d/elpa/orderless-1.4/orderless.el", - "orderless-match-face-3": "/home/cjennings/.emacs.d/elpa/orderless-1.4/orderless.el" + "orderless-match-face-0": "/home/cjennings/.emacs.d/elpa/orderless-1.6/orderless.el", + "orderless-match-face-1": "/home/cjennings/.emacs.d/elpa/orderless-1.6/orderless.el", + "orderless-match-face-2": "/home/cjennings/.emacs.d/elpa/orderless-1.6/orderless.el", + "orderless-match-face-3": "/home/cjennings/.emacs.d/elpa/orderless-1.6/orderless.el" }, "org-roam": { - "org-roam-dailies-calendar-note": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-dailies.el", - "org-roam-dim": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-header-line": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-olp": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-preview-heading": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-preview-heading-highlight": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-preview-heading-selection": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-preview-region": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el", - "org-roam-title": "/home/cjennings/.emacs.d/elpa/org-roam-20250701.528/org-roam-mode.el" + "org-roam-dailies-calendar-note": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-dailies.el", + "org-roam-dim": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-header-line": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-olp": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-preview-heading": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-preview-heading-highlight": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-preview-heading-selection": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-preview-region": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el", + "org-roam-title": "/home/cjennings/.emacs.d/elpa/org-roam-20260224.1637/org-roam-mode.el" }, "org-superstar": { - "org-superstar-first": "/home/cjennings/.emacs.d/elpa/org-superstar-1.5.1/org-superstar.el", - "org-superstar-header-bullet": "/home/cjennings/.emacs.d/elpa/org-superstar-1.5.1/org-superstar.el", - "org-superstar-item": "/home/cjennings/.emacs.d/elpa/org-superstar-1.5.1/org-superstar.el", - "org-superstar-leading": "/home/cjennings/.emacs.d/elpa/org-superstar-1.5.1/org-superstar.el" + "org-superstar-first": "/home/cjennings/.emacs.d/elpa/org-superstar-1.7.0/org-superstar.el", + "org-superstar-header-bullet": "/home/cjennings/.emacs.d/elpa/org-superstar-1.7.0/org-superstar.el", + "org-superstar-item": "/home/cjennings/.emacs.d/elpa/org-superstar-1.7.0/org-superstar.el", + "org-superstar-leading": "/home/cjennings/.emacs.d/elpa/org-superstar-1.7.0/org-superstar.el" }, "prescient": { "prescient-primary-highlight": "/home/cjennings/.emacs.d/elpa/prescient-20250816.19/prescient.el", @@ -28506,132 +33237,132 @@ "symbol-overlay-face-8": "/home/cjennings/.emacs.d/elpa/symbol-overlay-4.3/symbol-overlay.el" }, "tmr": { - "tmr-description": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-duration": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-end-time": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-finished": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-is-acknowledged": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-must-be-acknowledged": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-start-time": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-tabulated-acknowledgement": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-tabulated-description": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-tabulated-end-time": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-tabulated-remaining-time": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el", - "tmr-tabulated-start-time": "/home/cjennings/.emacs.d/elpa/tmr-1.1.0/tmr.el" + "tmr-description": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-duration": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-end-time": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-finished": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-is-acknowledged": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-must-be-acknowledged": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-start-time": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-tabulated-acknowledgement": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-tabulated-description": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-tabulated-end-time": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-tabulated-remaining-time": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el", + "tmr-tabulated-start-time": "/home/cjennings/.emacs.d/elpa/tmr-1.3.0/tmr.el" }, "transient": { - "transient-active-infix": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-argument": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-delimiter": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-disabled-suffix": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-enabled-suffix": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-heading": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-higher-level": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-inactive-argument": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-inactive-value": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-inapt-argument": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-inapt-suffix": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key-exit": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key-noop": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key-recurse": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key-return": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key-stack": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-key-stay": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-mismatched-key": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-nonstandard-key": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-unreachable": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-unreachable-key": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el", - "transient-value": "/home/cjennings/.emacs.d/elpa/transient-0.10.0/transient.el" + "transient-active-infix": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-argument": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-delimiter": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-disabled-suffix": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-enabled-suffix": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-heading": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-higher-level": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-inactive-argument": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-inactive-value": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-inapt-argument": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-inapt-suffix": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key-exit": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key-noop": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key-recurse": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key-return": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key-stack": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-key-stay": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-mismatched-key": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-nonstandard-key": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-unreachable": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-unreachable-key": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el", + "transient-value": "/home/cjennings/.emacs.d/elpa/transient-0.12.0/transient.el" }, "vertico": { - "vertico-current": "/home/cjennings/.emacs.d/elpa/vertico-2.4/vertico.el", - "vertico-group-separator": "/home/cjennings/.emacs.d/elpa/vertico-2.4/vertico.el", - "vertico-group-title": "/home/cjennings/.emacs.d/elpa/vertico-2.4/vertico.el", - "vertico-multiline": "/home/cjennings/.emacs.d/elpa/vertico-2.4/vertico.el" + "vertico-current": "/home/cjennings/.emacs.d/elpa/vertico-2.8/vertico.el", + "vertico-group-separator": "/home/cjennings/.emacs.d/elpa/vertico-2.8/vertico.el", + "vertico-group-title": "/home/cjennings/.emacs.d/elpa/vertico-2.8/vertico.el", + "vertico-multiline": "/home/cjennings/.emacs.d/elpa/vertico-2.8/vertico.el" }, "web-mode": { - "web-mode-annotation-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-annotation-html-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-annotation-tag-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-annotation-type-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-annotation-value-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-attr-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-attr-value-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-control-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-delimiter-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-block-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-bold-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-builtin-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-comment-keyword-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-constant-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-at-rule-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-color-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-function-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-priority-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-property-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-pseudo-class-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-selector-class-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-selector-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-selector-tag-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-css-variable-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-current-column-highlight-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-current-element-highlight-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-doctype-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-error-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-filter-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-folded-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-function-call-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-function-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-attr-custom-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-attr-engine-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-attr-equal-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-attr-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-attr-value-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-entity-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-tag-bracket-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-tag-custom-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-tag-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-tag-namespaced-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-html-tag-unclosed-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-inlay-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-interpolate-color1-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-interpolate-color2-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-interpolate-color3-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-interpolate-color4-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-italic-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-javascript-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-javascript-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-json-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-json-context-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-json-key-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-json-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-jsx-depth-1-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-jsx-depth-2-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-jsx-depth-3-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-jsx-depth-4-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-jsx-depth-5-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-keyword-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-param-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-part-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-part-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-part-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-preprocessor-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-script-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-sql-keyword-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-style-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-symbol-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-type-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-underline-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-variable-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-warning-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el", - "web-mode-whitespace-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.21/web-mode.el" + "web-mode-annotation-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-annotation-html-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-annotation-tag-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-annotation-type-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-annotation-value-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-attr-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-attr-value-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-control-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-delimiter-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-block-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-bold-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-builtin-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-comment-keyword-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-constant-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-at-rule-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-color-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-function-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-priority-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-property-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-pseudo-class-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-selector-class-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-selector-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-selector-tag-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-css-variable-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-current-column-highlight-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-current-element-highlight-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-doctype-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-error-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-filter-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-folded-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-function-call-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-function-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-attr-custom-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-attr-engine-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-attr-equal-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-attr-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-attr-value-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-entity-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-tag-bracket-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-tag-custom-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-tag-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-tag-namespaced-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-html-tag-unclosed-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-inlay-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-interpolate-color1-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-interpolate-color2-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-interpolate-color3-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-interpolate-color4-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-italic-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-javascript-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-javascript-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-json-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-json-context-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-json-key-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-json-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-jsx-depth-1-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-jsx-depth-2-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-jsx-depth-3-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-jsx-depth-4-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-jsx-depth-5-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-keyword-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-param-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-part-comment-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-part-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-part-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-preprocessor-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-script-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-sql-keyword-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-string-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-style-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-symbol-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-type-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-underline-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-variable-name-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-warning-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el", + "web-mode-whitespace-face": "/home/cjennings/.emacs.d/elpa/web-mode-17.3.23/web-mode.el" }, "yasnippet": { "yas--field-debug-face": "/home/cjennings/.emacs.d/elpa/yasnippet-0.14.3/yasnippet.el", @@ -29362,6 +34093,9 @@ ] }, "package-unresolved-faces": { + "consult": [ + "consult-separator" + ], "emms": [ "emms-browser-album-face", "emms-browser-albumartist-face", @@ -29371,6 +34105,9 @@ "emms-browser-track-face", "emms-browser-year/genre-face" ], + "json-mode": [ + "json-mode-object-name-face" + ], "llama": [ "llama-##-macro" ], diff --git a/scripts/theme-studio/face-coverage-dump.el b/scripts/theme-studio/face-coverage-dump.el new file mode 100644 index 000000000..6fc73469f --- /dev/null +++ b/scripts/theme-studio/face-coverage-dump.el @@ -0,0 +1,51 @@ +;;; face-coverage-dump.el --- Dump face/group/package data for the coverage worklist -*- lexical-binding: t -*- + +;;; Commentary: +;; Emits a JSON file that face_coverage.py consumes to build face-coverage.org. +;; For every face in `face-list' it records the name, its documentation string, +;; and the file its `defface' lives in (used to classify built-in vs package). +;; It also dumps every customization group's documentation and every elpa +;; package's summary, so the builder can describe each bucket offline. +;; +;; Run against a live daemon to capture actually-loaded packages: +;; emacsclient -e '(progn (load ".../face-coverage-dump.el") +;; (face-coverage-dump "/tmp/face-coverage-data.json"))' +;; or on a clean checkout via `emacs --batch -l init.el' then the same calls +;; (lazily-loaded packages will be absent until required). + +;;; Code: + +(require 'json) +(require 'package) + +(defun face-coverage-dump (outfile) + "Write face, group, and package data as JSON to OUTFILE." + (let ((faces nil) + (groups (make-hash-table :test 'equal)) + (packages (make-hash-table :test 'equal))) + (dolist (f (face-list)) + (push (vector (symbol-name f) + (or (face-documentation f) :null) + (or (symbol-file f 'defface) :null)) + faces)) + (mapatoms + (lambda (s) + (let ((d (get s 'group-documentation))) + (when (stringp d) (puthash (symbol-name s) d groups))))) + (when (boundp 'package-alist) + (dolist (entry package-alist) + (let ((sum (ignore-errors (package-desc-summary (cadr entry))))) + (when (stringp sum) (puthash (symbol-name (car entry)) sum packages))))) + ;; Docstrings carry curly quotes and other non-ASCII; bind the write coding + ;; system so `with-temp-file' never drops into the interactive + ;; select-safe-coding-system prompt (which pops in the daemon's frame). + (let ((n (length faces)) + (coding-system-for-write 'utf-8-unix)) + (with-temp-file outfile + (insert (json-serialize (list :faces (vconcat (nreverse faces)) + :groups groups + :packages packages)))) + (message "face-coverage-dump: %d faces -> %s" n outfile)))) + +(provide 'face-coverage-dump) +;;; face-coverage-dump.el ends here diff --git a/scripts/theme-studio/face-coverage.org b/scripts/theme-studio/face-coverage.org new file mode 100644 index 000000000..b5f8b795b --- /dev/null +++ b/scripts/theme-studio/face-coverage.org @@ -0,0 +1,2715 @@ +#+TITLE: theme-studio — face coverage master list +#+DATE: 2026-06-18 +#+TODO: TODO DOING | DONE +#+STARTUP: overview + +Every known face (live Emacs face-list union everything theme-studio manages). DONE = the +studio already themes it; TODO = not yet. Three top-level tiers: +- emacs-core: the standalone built-in faces (frame chrome, cursor, region, mode line, search). +- emacs-general: built-in Emacs subsystems (org, gnus, erc, diff, vc, custom, ...), one child each. +- one heading per third-party package installed from elpa (magit, vertico, consult, ...). +Tier is decided by where each face's defface lives: /usr/share/emacs = built-in, elpa = package. +The line under each bucket is its group/package description; the line under each face is its +Emacs docstring (first line), where one exists. + +Totals: 690 / 1293 faces covered; 1129 carry a docstring. Tiers: core 1, general 75, packages 43. +Coverage tiers in the studio: syntax font-lock=23, UI tier=21, package inventory=643 (39 packages). + +Mechanism to close a TODO: core/UI faces -> UI_FACES in generate.py; package + subsystem faces +-> package-inventory.json (regenerable via build-inventory.el / app_inventory.py). + +* DOING emacs-core [24/74] + Standalone built-in faces: frame chrome, cursor, region, mode line, search, line numbers, base typography. +** TODO blink-matching-paren-offscreen + Face for showing in the echo area matched open paren that is off-screen. +** TODO bold + Basic bold face. +** TODO bold-italic + Basic bold-italic face. +** TODO border + Basic face for the frame border under X. +** TODO button + Default face used for buttons. +** TODO child-frame-border + Basic face for the internal border of child frames. +** TODO completions-common-part + Face for the parts of completions which matched the pattern. +** TODO completions-first-difference + Face for the first character after point in completions. +** DONE cursor + Basic face for the cursor color under X. +** DONE default + Basic default face. +** DONE error + Basic face used to highlight errors and to denote failure. +** TODO escape-glyph + Face for characters displayed as sequences using '^' or '\'. +** TODO fill-column-indicator + Face for displaying fill column indicator. +** DONE fixed-pitch + The basic fixed-pitch face. +** TODO fixed-pitch-serif + The basic fixed-pitch face with serifs. +** DONE fringe + Basic face for the fringes to the left and right of windows under X. +** TODO glyphless-char + Face for displaying non-graphic characters (e.g. U+202A (LRE)). +** TODO header-line + Basic header-line face. +** TODO header-line-highlight + Basic header line face for highlighting. +** TODO help-key-binding + Face for keybindings in *Help* buffers. +** DONE highlight + Basic face for highlighting. +** DONE hl-line + Default face for highlighting the current line in Hl-Line mode. +** TODO homoglyph + Face for lookalike characters. +** TODO internal-border + Basic face for the internal border. +** DONE isearch + Face for highlighting Isearch matches. +** DONE isearch-fail + Face for highlighting failed part in Isearch echo-area message. +** TODO isearch-group-1 + Face for highlighting Isearch the odd group matches. +** TODO isearch-group-2 + Face for highlighting Isearch the even group matches. +** TODO italic + Basic italic face. +** DONE lazy-highlight + Face for lazy highlighting of matches other than the current one. +** DONE line-number + Face for displaying line numbers. +** DONE line-number-current-line + Face for displaying the current line number. +** TODO line-number-major-tick + Face for highlighting "major ticks" (as in a ruler). +** TODO line-number-minor-tick + Face for highlighting "minor ticks" (as in a ruler). +** DONE link + Basic face for unvisited links. +** TODO link-visited + Basic face for visited links. +** TODO match + Face used to highlight matches permanently. +** TODO menu + Basic face for the font and colors of the menu bar and popup menus. +** DONE minibuffer-prompt + Face for minibuffer prompts. +** DONE mode-line + Face for the mode lines as well as header lines. +** TODO mode-line-active + Face for the selected mode line. +** TODO mode-line-buffer-id + Face used for buffer identification parts of the mode line. +** TODO mode-line-emphasis + Face used to emphasize certain mode line features. +** DONE mode-line-highlight + Basic mode line face for highlighting. +** DONE mode-line-inactive + Basic mode line face for non-selected windows. +** TODO mouse + Basic face for the mouse color under X. +** TODO mouse-drag-and-drop-region + Face to highlight original text during dragging. +** TODO next-error + Face used to highlight next error locus. +** TODO nobreak-hyphen + Face for displaying nobreak hyphens. +** TODO nobreak-space + Face for displaying nobreak space. +** TODO query-replace + Face for highlighting query replacement matches. +** DONE region + Basic face for highlighting the region. +** TODO scroll-bar + Basic face for the scroll bar colors under X. +** TODO secondary-selection + Basic face for displaying the secondary selection. +** TODO separator-line + Face for separator lines. +** TODO shadow + Basic face for shadowed text. +** DONE show-paren-match + Face used for a matching paren. +** TODO show-paren-match-expression + Face used for a matching paren when highlighting the whole expression. +** DONE show-paren-mismatch + Face used for a mismatching paren. +** DONE success + Basic face used to indicate successful operation. +** TODO tool-bar + Basic tool-bar face. +** TODO tooltip + Face for tooltips. +** TODO trailing-whitespace + Basic face for highlighting trailing whitespace. +** TODO tty-menu-disabled-face + Face for displaying disabled items in TTY menus. +** TODO tty-menu-enabled-face + Face for displaying enabled items in TTY menus. +** TODO tty-menu-selected-face + Face for displaying the currently selected item in TTY menus. +** TODO underline + Basic underlined face. +** DONE variable-pitch + The basic variable-pitch face. +** TODO variable-pitch-text + The proportional face used for longer texts. +** DONE vertical-border + Face used for vertical window dividers on ttys. +** DONE warning + Basic face used to highlight warnings. +** TODO window-divider + Basic face for window dividers. +** TODO window-divider-first-pixel + Basic face for first pixel line/column of window dividers. +** TODO window-divider-last-pixel + Basic face for last pixel line/column of window dividers. + +* DOING emacs-general [23/563] + Built-in Emacs subsystems, one child per subsystem. +** TODO abbrev [0/1] + Abbreviation handling, typing shortcuts, macros. +*** TODO abbrev-table-name + Face used for displaying the abbrev table name in 'edit-abbrevs-mode'. +** TODO ansi-color [0/23] + Translating SGR control sequences to faces. +*** TODO ansi-color-black + Face used to render black color code. +*** TODO ansi-color-blue + Face used to render blue color code. +*** TODO ansi-color-bold + Face used to render bold text. +*** TODO ansi-color-bright-black + Face used to render bright black color code. +*** TODO ansi-color-bright-blue + Face used to render bright blue color code. +*** TODO ansi-color-bright-cyan + Face used to render bright cyan color code. +*** TODO ansi-color-bright-green + Face used to render bright green color code. +*** TODO ansi-color-bright-magenta + Face used to render bright magenta color code. +*** TODO ansi-color-bright-red + Face used to render bright red color code. +*** TODO ansi-color-bright-white + Face used to render bright white color code. +*** TODO ansi-color-bright-yellow + Face used to render bright yellow color code. +*** TODO ansi-color-cyan + Face used to render cyan color code. +*** TODO ansi-color-faint + Face used to render faint text. +*** TODO ansi-color-fast-blink + Face used to render rapidly blinking text. +*** TODO ansi-color-green + Face used to render green color code. +*** TODO ansi-color-inverse + Face used to render inverted video text. +*** TODO ansi-color-italic + Face used to render italic text. +*** TODO ansi-color-magenta + Face used to render magenta color code. +*** TODO ansi-color-red + Face used to render red color code. +*** TODO ansi-color-slow-blink + Face used to render slowly blinking text. +*** TODO ansi-color-underline + Face used to render underlined text. +*** TODO ansi-color-white + Face used to render white color code. +*** TODO ansi-color-yellow + Face used to render yellow color code. +** TODO apropos [0/8] + Apropos commands for users and programmers. +*** TODO apropos-button + Face for buttons that indicate a face in Apropos. +*** TODO apropos-function-button + Button face indicating a function, macro, or command in Apropos. +*** TODO apropos-keybinding + Face for lists of keybinding in Apropos output. +*** TODO apropos-misc-button + Button face indicating a miscellaneous object type in Apropos. +*** TODO apropos-property + Face for property name in Apropos output, or nil for none. +*** TODO apropos-symbol + Face for the symbol name in Apropos output. +*** TODO apropos-user-option-button + Button face indicating a user option in Apropos. +*** TODO apropos-variable-button + Button face indicating a variable in Apropos. +** TODO bookmark [0/2] + Setting, annotation and jumping to bookmarks. +*** TODO bookmark-face + Face used to highlight current line. +*** TODO bookmark-menu-bookmark + Face used to highlight bookmark names in bookmark menu buffers. +** TODO breakpoint [0/2] +*** TODO breakpoint-disabled + Face for disabled breakpoint icon in fringe. +*** TODO breakpoint-enabled + Face for enabled breakpoint icon in fringe. +** TODO browse [0/1] +*** TODO browse-url-button + Face for 'browse-url' buttons (i.e., links). +** TODO buffer [0/1] +*** TODO buffer-menu-buffer + Face for buffer names in the Buffer Menu. +** TODO calendar [0/4] + Calendar and time management support. +*** TODO calendar-month-header + Face used for month headers in the calendar. +*** TODO calendar-today + Face for indicating today's date in the calendar. +*** TODO calendar-weekday-header + Face used for weekday column headers in the calendar. +*** TODO calendar-weekend-header + Face used for weekend column headers in the calendar. +** TODO change-log [0/8] + Change log maintenance. +*** TODO change-log-acknowledgment + Face for highlighting acknowledgments. +*** TODO change-log-conditionals + Face for highlighting conditionals of the form '[...]'. +*** TODO change-log-date + Face used to highlight dates in date lines. +*** TODO change-log-email + Face for highlighting author email addresses. +*** TODO change-log-file + Face for highlighting file names. +*** TODO change-log-function + Face for highlighting items of the form '<....>'. +*** TODO change-log-list + Face for highlighting parenthesized lists of functions or variables. +*** TODO change-log-name + Face for highlighting author names. +** TODO comint [0/2] + General command interpreter in a window stuff. +*** TODO comint-highlight-input + Face to use to highlight user input. +*** TODO comint-highlight-prompt + Face to use to highlight prompts. +** TODO compilation [0/8] + Run compiler as inferior of Emacs, parse error messages. +*** TODO compilation-column-number + Face for displaying column numbers in compiler messages. +*** TODO compilation-error + Face used to highlight compiler errors. +*** TODO compilation-info + Face used to highlight compiler information. +*** TODO compilation-line-number + Face for displaying line numbers in compiler messages. +*** TODO compilation-mode-line-exit + Face for Compilation mode's "exit" mode line indicator. +*** TODO compilation-mode-line-fail + Face for Compilation mode's "error" mode line indicator. +*** TODO compilation-mode-line-run + Face for Compilation mode's "running" mode line indicator. +*** TODO compilation-warning + Face used to highlight compiler warnings. +** TODO completions [0/4] + Faces for the default *Completions* buffer. +*** TODO completions-annotations + Face to use for annotations in the *Completions* buffer. +*** TODO completions-group-separator + Face used for the separator lines between the candidate groups. +*** TODO completions-group-title + Face used for the title text of the candidate group headlines. +*** TODO completions-highlight + Default face for highlighting the current completion candidate. +** TODO confusingly [0/1] +*** TODO confusingly-reordered + Face for highlighting text that was bidi-reordered in confusing ways. +** TODO custom [0/25] + Faces used by customize. +*** TODO custom-button + Face for custom buffer buttons if 'custom-raised-buttons' is non-nil. +*** TODO custom-button-mouse + Mouse face for custom buffer buttons if 'custom-raised-buttons' is non-nil. +*** TODO custom-button-pressed + Face for pressed custom buttons if 'custom-raised-buttons' is non-nil. +*** TODO custom-button-pressed-unraised + Face for pressed custom buttons if 'custom-raised-buttons' is nil. +*** TODO custom-button-unraised + Face for custom buffer buttons if 'custom-raised-buttons' is nil. +*** TODO custom-changed + Face used when the customize item has been changed. +*** TODO custom-comment + Face used for comments on variables or faces. +*** TODO custom-comment-tag + Face used for the comment tag on variables or faces. +*** TODO custom-documentation + Face used for documentation strings in customization buffers. +*** TODO custom-face-tag + Face used for face tags. +*** TODO custom-group-subtitle + Face for the "Subgroups:" subtitle in Custom buffers. +*** TODO custom-group-tag + Face for low level group tags. +*** TODO custom-group-tag-1 + Face for group tags. +*** TODO custom-invalid + Face used when the customize item is invalid. +*** TODO custom-link + Face for links in customization buffers. +*** TODO custom-modified + Face used when the customize item has been modified. +*** TODO custom-rogue + Face used when the customize item is not defined for customization. +*** TODO custom-saved + Face used when the customize item has been saved. +*** TODO custom-set + Face used when the customize item has been set. +*** TODO custom-state + Face used for State descriptions in the customize buffer. +*** TODO custom-themed + Face used when the customize item has been set by a theme. +*** TODO custom-variable-button + Face used for pushable variable tags. +*** TODO custom-variable-obsolete + Face used for obsolete variables. +*** TODO custom-variable-tag + Face used for unpushable variable tags. +*** TODO custom-visibility + Face for the 'custom-visibility' widget. +** TODO diary [0/1] + Faces for diary entries in the calendar. +*** TODO diary + Face for highlighting diary entries. +** TODO diff [0/18] + Comparing files with `diff'. +*** TODO diff-added + 'diff-mode' face used to highlight added lines. +*** TODO diff-changed + 'diff-mode' face used to highlight changed lines. +*** TODO diff-changed-unspecified + 'diff-mode' face used to highlight changed lines. +*** TODO diff-context + 'diff-mode' face used to highlight context and other side-information. +*** TODO diff-error + 'diff-mode' face for error messages from diff. +*** TODO diff-file-header + 'diff-mode' face used to highlight file header lines. +*** TODO diff-function + 'diff-mode' face used to highlight function names produced by "diff -p". +*** TODO diff-header + 'diff-mode' face inherited by hunk and index header faces. +*** TODO diff-hunk-header + 'diff-mode' face used to highlight hunk header lines. +*** TODO diff-index + 'diff-mode' face used to highlight index header lines. +*** TODO diff-indicator-added + 'diff-mode' face used to highlight indicator of added lines (+, >). +*** TODO diff-indicator-changed + 'diff-mode' face used to highlight indicator of changed lines. +*** TODO diff-indicator-removed + 'diff-mode' face used to highlight indicator of removed lines (-, <). +*** TODO diff-nonexistent + 'diff-mode' face used to highlight nonexistent files in recursive diffs. +*** TODO diff-refine-added + Face used for added characters shown by 'diff-refine-hunk'. +*** TODO diff-refine-changed + Face used for char-based changes shown by 'diff-refine-hunk'. +*** TODO diff-refine-removed + Face used for removed characters shown by 'diff-refine-hunk'. +*** TODO diff-removed + 'diff-mode' face used to highlight removed lines. +** TODO dired [0/12] + Directory editing. +*** TODO dired-broken-symlink + Face used for broken symbolic links. +*** TODO dired-directory + Face used for subdirectories. +*** TODO dired-flagged + Face used for files flagged for deletion. +*** TODO dired-header + Face used for directory headers. +*** TODO dired-ignored + Face used for files suffixed with 'completion-ignored-extensions'. +*** TODO dired-mark + Face used for Dired marks. +*** TODO dired-marked + Face used for marked files. +*** TODO dired-perm-write + Face used to highlight permissions of group- and world-writable files. +*** TODO dired-set-id + Face used to highlight permissions of suid and guid files. +*** TODO dired-special + Face used for sockets, pipes, block devices and char devices. +*** TODO dired-symlink + Face used for symbolic links. +*** TODO dired-warning + Face used to highlight a part of a buffer that needs user attention. +** TODO doc [0/1] + Support for Emacs documentation. +*** TODO doc-view-svg-face + Face used for SVG images. +** TODO edmacro [0/1] +*** TODO edmacro-label + Face used for labels in 'edit-kbd-macro'. +** TODO eldoc [0/1] + Show function arglist or variable docstring in echo area. +*** TODO eldoc-highlight-function-argument + Face used for the argument at point in a function's argument list. +** TODO elisp [0/1] +*** TODO elisp-shorthand-font-lock-face + Face for highlighting shorthands in Emacs Lisp. +** TODO epa [0/8] + The EasyPG Assistant. +*** TODO epa-field-body + Face for the body of the attribute field. +*** TODO epa-field-name + Face for the name of the attribute field. +*** TODO epa-mark + Face used for displaying the high validity. +*** TODO epa-string + Face used for displaying the string. +*** TODO epa-validity-disabled + Face used for displaying the disabled validity. +*** TODO epa-validity-high + Face for high validity EPA information. +*** TODO epa-validity-low + Face used for displaying the low validity. +*** TODO epa-validity-medium + Face for medium validity EPA information. +** TODO erc [0/31] + Emacs Internet Relay Chat client. +*** TODO erc-action-face + ERC face for actions generated by /ME. +*** TODO erc-bold-face + ERC bold face. +*** TODO erc-button + ERC button face. +*** TODO erc-button-nick-default-face + Default face for a buttonized nickname. +*** TODO erc-command-indicator-face + Face for echoed command lines, including the prompt. +*** TODO erc-current-nick-face + ERC face for occurrences of your current nickname. +*** TODO erc-dangerous-host-face + ERC face for people on dangerous hosts. +*** TODO erc-default-face + ERC default face. +*** TODO erc-direct-msg-face + ERC face used for messages you receive in the main erc buffer. +*** TODO erc-error-face + ERC face for errors. +*** TODO erc-fill-wrap-merge-indicator-face + ERC 'fill-wrap' merge-indicator face. +*** TODO erc-fool-face + ERC face for fools on the channel. +*** TODO erc-header-line + ERC face used for the header line. +*** TODO erc-information + Face for local administrative messages of low to moderate importance. +*** TODO erc-input-face + ERC face used for your input. +*** TODO erc-inverse-face + ERC inverse face. +*** TODO erc-italic-face + ERC italic face. +*** TODO erc-keep-place-indicator-arrow + Face for arrow value of option 'erc-keep-place-indicator-style'. +*** TODO erc-keep-place-indicator-line + Face for option 'erc-keep-place-indicator-style'. +*** TODO erc-keyword-face + ERC face for your keywords. +*** TODO erc-my-nick-face + ERC face for your current nickname in messages sent by you. +*** TODO erc-my-nick-prefix-face + ERC face used for my user mode prefix. +*** TODO erc-nick-default-face + ERC nickname default face. +*** TODO erc-nick-msg-face + ERC nickname face for private messages. +*** TODO erc-nick-prefix-face + ERC face used for user mode prefix. +*** TODO erc-notice-face + ERC face for notices. +*** TODO erc-pal-face + ERC face for your pals. +*** TODO erc-prompt-face + ERC face for the prompt. +*** TODO erc-spoiler-face + ERC spoiler face. +*** TODO erc-timestamp-face + ERC timestamp face. +*** TODO erc-underline-face + ERC underline face. +** TODO erc-ansi [0/32] + Emacs Internet Relay Chat client. +*** TODO bg:erc-color-face0 + ERC face. +*** TODO bg:erc-color-face1 + ERC face. +*** TODO bg:erc-color-face10 + ERC face. +*** TODO bg:erc-color-face11 + ERC face. +*** TODO bg:erc-color-face12 + ERC face. +*** TODO bg:erc-color-face13 + ERC face. +*** TODO bg:erc-color-face14 + ERC face. +*** TODO bg:erc-color-face15 + ERC face. +*** TODO bg:erc-color-face2 + ERC face. +*** TODO bg:erc-color-face3 + ERC face. +*** TODO bg:erc-color-face4 + ERC face. +*** TODO bg:erc-color-face5 + ERC face. +*** TODO bg:erc-color-face6 + ERC face. +*** TODO bg:erc-color-face7 + ERC face. +*** TODO bg:erc-color-face8 + ERC face. +*** TODO bg:erc-color-face9 + ERC face. +*** TODO fg:erc-color-face0 + ERC face. +*** TODO fg:erc-color-face1 + ERC face. +*** TODO fg:erc-color-face10 + ERC face. +*** TODO fg:erc-color-face11 + ERC face. +*** TODO fg:erc-color-face12 + ERC face. +*** TODO fg:erc-color-face13 + ERC face. +*** TODO fg:erc-color-face14 + ERC face. +*** TODO fg:erc-color-face15 + ERC face. +*** TODO fg:erc-color-face2 + ERC face. +*** TODO fg:erc-color-face3 + ERC face. +*** TODO fg:erc-color-face4 + ERC face. +*** TODO fg:erc-color-face5 + ERC face. +*** TODO fg:erc-color-face6 + ERC face. +*** TODO fg:erc-color-face7 + ERC face. +*** TODO fg:erc-color-face8 + ERC face. +*** TODO fg:erc-color-face9 + ERC face. +** TODO ert [0/2] + ERT, the Emacs Lisp regression testing tool. +*** TODO ert-test-result-expected + Face used for expected results in the ERT results buffer. +*** TODO ert-test-result-unexpected + Face used for unexpected results in the ERT results buffer. +** TODO eww [0/8] + Emacs Web Wowser. +*** TODO eww-form-checkbox + Face for eww buffer buttons. +*** TODO eww-form-file + Face for eww buffer buttons. +*** TODO eww-form-select + Face for eww buffer buttons. +*** TODO eww-form-submit + Face for eww buffer buttons. +*** TODO eww-form-text + Face for eww text inputs. +*** TODO eww-form-textarea + Face for eww textarea inputs. +*** TODO eww-invalid-certificate + Face for web pages with invalid certificates. +*** TODO eww-valid-certificate + Face for web pages with valid certificates. +** TODO ffap [0/1] + Find file or URL at point. +*** TODO ffap + Face used to highlight the current buffer substring. +** TODO file [0/1] + Support for editing files. +*** TODO file-name-shadow + Face used by 'file-name-shadow-mode' for the shadow. +** DOING font-lock [23/28] + Font Lock mode text highlighting package. +*** DONE font-lock-bracket-face + Font Lock mode face used to highlight brackets, braces, and parens. +*** DONE font-lock-builtin-face + Font Lock mode face used to highlight builtins. +*** DONE font-lock-comment-delimiter-face + Font Lock mode face used to highlight comment delimiters. +*** DONE font-lock-comment-face + Font Lock mode face used to highlight comments. +*** DONE font-lock-constant-face + Font Lock mode face used to highlight constants and labels. +*** DONE font-lock-delimiter-face + Font Lock mode face used to highlight delimiters. +*** DONE font-lock-doc-face + Font Lock mode face used to highlight documentation embedded in program code. +*** TODO font-lock-doc-markup-face + Font Lock mode face used to highlight embedded documentation mark-up. +*** DONE font-lock-escape-face + Font Lock mode face used to highlight escape sequences in strings. +*** DONE font-lock-function-call-face + Font Lock mode face used to highlight function calls. +*** DONE font-lock-function-name-face + Font Lock mode face used to highlight function names. +*** DONE font-lock-keyword-face + Font Lock mode face used to highlight keywords. +*** DONE font-lock-misc-punctuation-face + Font Lock mode face used to highlight miscellaneous punctuation. +*** TODO font-lock-negation-char-face + Font Lock mode face used to highlight easy to overlook negation. +*** DONE font-lock-number-face + Font Lock mode face used to highlight numbers. +*** DONE font-lock-operator-face + Font Lock mode face used to highlight operators. +*** DONE font-lock-preprocessor-face + Font Lock mode face used to highlight preprocessor directives. +*** DONE font-lock-property-name-face + Font Lock mode face used to highlight properties of an object. +*** DONE font-lock-property-use-face + Font Lock mode face used to highlight property references. +*** DONE font-lock-punctuation-face + Font Lock mode face used to highlight punctuation characters. +*** DONE font-lock-regexp-face + Font Lock mode face used to highlight regexp literals. +*** TODO font-lock-regexp-grouping-backslash + Font Lock mode face for backslashes in Lisp regexp grouping constructs. +*** TODO font-lock-regexp-grouping-construct + Font Lock mode face used to highlight grouping constructs in Lisp regexps. +*** DONE font-lock-string-face + Font Lock mode face used to highlight strings. +*** DONE font-lock-type-face + Font Lock mode face used to highlight type and class names. +*** DONE font-lock-variable-name-face + Font Lock mode face used to highlight variable names. +*** DONE font-lock-variable-use-face + Font Lock mode face used to highlight variable references. +*** TODO font-lock-warning-face + Font Lock mode face used to highlight warnings. +** TODO gnus-button [0/1] + The coffee-brewing, all singing, all dancing, kitchen sink newsreader. +*** TODO gnus-button + Face used for highlighting a button in the article buffer. +** TODO gnus-emphasis [0/9] + The coffee-brewing, all singing, all dancing, kitchen sink newsreader. +*** TODO gnus-emphasis-bold + Face used for displaying strong emphasized text (*word*). +*** TODO gnus-emphasis-bold-italic + Face used for displaying bold italic emphasized text (/*word*/). +*** TODO gnus-emphasis-highlight-words + Face used for displaying highlighted words. +*** TODO gnus-emphasis-italic + Face used for displaying italic emphasized text (/word/). +*** TODO gnus-emphasis-strikethru + Face used for displaying strike-through text (-word-). +*** TODO gnus-emphasis-underline + Face used for displaying underlined emphasized text (_word_). +*** TODO gnus-emphasis-underline-bold + Face used for displaying underlined bold emphasized text (_*word*_). +*** TODO gnus-emphasis-underline-bold-italic + Face used for displaying underlined bold italic emphasized text. +*** TODO gnus-emphasis-underline-italic + Face used for displaying underlined italic emphasized text (_/word/_). +** TODO gnus-group [0/22] + Group buffers. +*** TODO gnus-group-mail-1 + Level 1 mailgroup face. +*** TODO gnus-group-mail-1-empty + Level 1 empty mailgroup face. +*** TODO gnus-group-mail-2 + Level 2 mailgroup face. +*** TODO gnus-group-mail-2-empty + Level 2 empty mailgroup face. +*** TODO gnus-group-mail-3 + Level 3 mailgroup face. +*** TODO gnus-group-mail-3-empty + Level 3 empty mailgroup face. +*** TODO gnus-group-mail-low + Low level mailgroup face. +*** TODO gnus-group-mail-low-empty + Low level empty mailgroup face. +*** TODO gnus-group-news-1 + Level 1 newsgroup face. +*** TODO gnus-group-news-1-empty + Level 1 empty newsgroup face. +*** TODO gnus-group-news-2 + Level 2 newsgroup face. +*** TODO gnus-group-news-2-empty + Level 2 empty newsgroup face. +*** TODO gnus-group-news-3 + Level 3 newsgroup face. +*** TODO gnus-group-news-3-empty + Level 3 empty newsgroup face. +*** TODO gnus-group-news-4 + Level 4 newsgroup face. +*** TODO gnus-group-news-4-empty + Level 4 empty newsgroup face. +*** TODO gnus-group-news-5 + Level 5 newsgroup face. +*** TODO gnus-group-news-5-empty + Level 5 empty newsgroup face. +*** TODO gnus-group-news-6 + Level 6 newsgroup face. +*** TODO gnus-group-news-6-empty + Level 6 empty newsgroup face. +*** TODO gnus-group-news-low + Low level newsgroup face. +*** TODO gnus-group-news-low-empty + Low level empty newsgroup face. +** TODO gnus-header [0/6] + The coffee-brewing, all singing, all dancing, kitchen sink newsreader. +*** TODO gnus-header + Base face used for all Gnus header faces. +*** TODO gnus-header-content + Face used for displaying header content. +*** TODO gnus-header-from + Face used for displaying from headers. +*** TODO gnus-header-name + Face used for displaying header names. +*** TODO gnus-header-newsgroups + Face used for displaying newsgroups headers. +*** TODO gnus-header-subject + Face used for displaying subject headers. +** TODO gnus-signature [0/1] + The coffee-brewing, all singing, all dancing, kitchen sink newsreader. +*** TODO gnus-signature + Face used for highlighting a signature in the article buffer. +** TODO gnus-splash [0/1] + The coffee-brewing, all singing, all dancing, kitchen sink newsreader. +*** TODO gnus-splash + Face for the splash screen. +** TODO gnus-summary [0/17] + Summary buffers. +*** TODO gnus-summary-cancelled + Face used for canceled articles. +*** TODO gnus-summary-high-ancient + Face used for high interest ancient articles. +*** TODO gnus-summary-high-read + Face used for high interest read articles. +*** TODO gnus-summary-high-ticked + Face used for high interest ticked articles. +*** TODO gnus-summary-high-undownloaded + Face used for high interest uncached articles. +*** TODO gnus-summary-high-unread + Face used for high interest unread articles. +*** TODO gnus-summary-low-ancient + Face used for low interest ancient articles. +*** TODO gnus-summary-low-read + Face used for low interest read articles. +*** TODO gnus-summary-low-ticked + Face used for low interest ticked articles. +*** TODO gnus-summary-low-undownloaded + Face used for low interest uncached articles. +*** TODO gnus-summary-low-unread + Face used for low interest unread articles. +*** TODO gnus-summary-normal-ancient + Face used for normal interest ancient articles. +*** TODO gnus-summary-normal-read + Face used for normal interest read articles. +*** TODO gnus-summary-normal-ticked + Face used for normal interest ticked articles. +*** TODO gnus-summary-normal-undownloaded + Face used for normal interest uncached articles. +*** TODO gnus-summary-normal-unread + Face used for normal interest unread articles. +*** TODO gnus-summary-selected + Face used for selected articles. +** TODO grep [0/1] + Run `grep' and display the results. +*** TODO grep-heading + Face of headings when 'grep-use-headings' is non-nil. +** TODO gud [0/1] + The "Grand Unified Debugger" interface. +*** TODO gud-highlight-current-line-face + Face for highlighting the source code line being executed. +** TODO help [0/2] + Support for Emacs help systems. +*** TODO help-argument-name + Face to highlight argument names in *Help* buffers. +*** TODO help-for-help-header + Face used for headers in the 'help-for-help' buffer. +** TODO holiday [0/1] + Faces for holidays in the calendar. +*** TODO holiday + Face for indicating in the calendar dates that have holidays. +** TODO ibuffer [0/1] + Advanced replacement for `buffer-menu'. +*** TODO ibuffer-locked-buffer + Face used for locked buffers in Ibuffer. +** TODO icon [0/2] +*** TODO icon + Face for buttons. +*** TODO icon-button + Face for buttons. +** TODO image-dired [0/6] + Use Dired to browse your images as thumbnails, and more. +*** TODO image-dired-thumb-flagged + Face for images flagged for deletion in thumbnail buffer. +*** TODO image-dired-thumb-header-directory-name + Face for the directory name in the header line of the thumbnail buffer. +*** TODO image-dired-thumb-header-file-name + Face for the file name in the header line of the thumbnail buffer. +*** TODO image-dired-thumb-header-file-size + Face for the file size in the header line of the thumbnail buffer. +*** TODO image-dired-thumb-header-image-count + Face for the image count in the header line of the thumbnail buffer. +*** TODO image-dired-thumb-mark + Face for marked images in thumbnail buffer. +** TODO info [0/13] + Info subsystem. +*** TODO Info-quoted + Face used for quoted elements. +*** TODO info-header-node + Face for Info nodes in a node header. +*** TODO info-header-xref + Face for Info cross-references in a node header. +*** TODO info-index-match + Face used to highlight matches in an index entry. +*** TODO info-menu-header + Face for headers in Info menus. +*** TODO info-menu-star + Face used to emphasize '*' in an Info menu. +*** TODO info-node + Face for Info node names. +*** TODO info-title-1 + Face for info titles at level 1. +*** TODO info-title-2 + Face for info titles at level 2. +*** TODO info-title-3 + Face for info titles at level 3. +*** TODO info-title-4 + Face for info titles at level 4. +*** TODO info-xref + Face for unvisited Info cross-references. +*** TODO info-xref-visited + Face for visited Info cross-references. +** TODO kmacro [0/3] + Simplified keyboard macro user interface. +*** TODO kmacro-menu-flagged + Face used for keyboard macros flagged for deletion. +*** TODO kmacro-menu-mark + Face used for the Keyboard Macro Menu marks. +*** TODO kmacro-menu-marked + Face used for keyboard macros marked for duplication. +** TODO log [0/4] +*** TODO log-edit-header + Face for the headers in 'log-edit-mode' buffers. +*** TODO log-edit-headers-separator + Face for the separator line in 'log-edit-mode' buffers. +*** TODO log-edit-summary + Face for the summary in 'log-edit-mode' buffers. +*** TODO log-edit-unknown-header + Face for unknown headers in 'log-edit-mode' buffers. +** TODO makefile [0/4] + Makefile editing commands for Emacs. +*** TODO makefile-makepp-perl + Face to use for additionally highlighting Perl code in Font-Lock mode. +*** TODO makefile-shell + Face to use for additionally highlighting Shell commands in Font-Lock mode. +*** TODO makefile-space + Face to use for highlighting leading spaces in Font-Lock mode. +*** TODO makefile-targets + Face to use for additionally highlighting rule targets in Font-Lock mode. +** TODO message [0/7] + Mail and news message composing. +*** TODO message-cited-text-1 + Face used for displaying 1st-level cited text. +*** TODO message-cited-text-2 + Face used for displaying 2nd-level cited text. +*** TODO message-cited-text-3 + Face used for displaying 3rd-level cited text. +*** TODO message-cited-text-4 + Face used for displaying 4th-level cited text. +*** TODO message-mml + Face used for displaying MML. +*** TODO message-separator + Face used for displaying the separator. +*** TODO message-signature-separator + Face used for displaying the signature separator. +** TODO message-header [0/7] + Message Headers. +*** TODO message-header-cc + Face used for displaying Cc headers. +*** TODO message-header-name + Face used for displaying header names. +*** TODO message-header-newsgroups + Face used for displaying Newsgroups headers. +*** TODO message-header-other + Face used for displaying other headers. +*** TODO message-header-subject + Face used for displaying Subject headers. +*** TODO message-header-to + Face used for displaying To headers. +*** TODO message-header-xheader + Face used for displaying X-Header headers. +** TODO mm [0/2] + MIME handling faces (gnus/mm). +*** TODO mm-command-output + Face used for displaying output from commands. +*** TODO mm-uu-extract + Face for extracted buffers. +** TODO next [0/1] +*** TODO next-error-message + Face used to highlight the current error message in the 'next-error' buffer. +** TODO org [0/88] + Outline-based notes management and organizer. +*** TODO org-archived + Face for headline with the ARCHIVE tag. +*** TODO org-checkbox + Face for checkboxes. +*** TODO org-checkbox-statistics-done + Face used for finished checkbox statistics. +*** TODO org-checkbox-statistics-todo + Face used for unfinished checkbox statistics. +*** TODO org-cite + Face for citations. +*** TODO org-cite-key + Face for citation keys. +*** TODO org-clock-overlay + Basic face for displaying the secondary selection. +*** TODO org-code + Face for fixed-width text like code snippets. +*** TODO org-column + Face for column display of entry properties. +*** TODO org-column-title + Face for column display of entry properties. +*** TODO org-date + Face for date/time stamps. +*** TODO org-date-selected + Face for highlighting the calendar day when using 'org-read-date'. +*** TODO org-default + Face used for default text. +*** TODO org-dispatcher-highlight + Face for highlighted keys in the dispatcher. +*** TODO org-done + Face used for todo keywords that indicate DONE items. +*** TODO org-drawer + Face used for drawers. +*** TODO org-drill-hidden-cloze-face + The face used to hide the contents of cloze phrases. +*** TODO org-drill-visible-cloze-face + The face used to hide the contents of cloze phrases. +*** TODO org-drill-visible-cloze-hint-face + The face used to hide the contents of cloze phrases. +*** TODO org-ellipsis + Face for the ellipsis in folded text. +*** TODO org-faces-cancelled + Face for the CANCELLED keyword. +*** TODO org-faces-cancelled-dim + Dimmed CANCELLED keyword for non-selected windows. +*** TODO org-faces-delegated + Face for the DELEGATED keyword. +*** TODO org-faces-delegated-dim + Dimmed DELEGATED keyword for non-selected windows. +*** TODO org-faces-doing + Face for the DOING keyword. +*** TODO org-faces-doing-dim + Dimmed DOING keyword for non-selected windows. +*** TODO org-faces-done + Face for the DONE keyword. +*** TODO org-faces-done-dim + Dimmed DONE keyword for non-selected windows. +*** TODO org-faces-failed + Face for the FAILED keyword. +*** TODO org-faces-failed-dim + Dimmed FAILED keyword for non-selected windows. +*** TODO org-faces-priority-a + Face for the [#A] priority cookie. +*** TODO org-faces-priority-a-dim + Dimmed [#A] priority cookie for non-selected windows. +*** TODO org-faces-priority-b + Face for the [#B] priority cookie. +*** TODO org-faces-priority-b-dim + Dimmed [#B] priority cookie for non-selected windows. +*** TODO org-faces-priority-c + Face for the [#C] priority cookie. +*** TODO org-faces-priority-c-dim + Dimmed [#C] priority cookie for non-selected windows. +*** TODO org-faces-priority-d + Face for the [#D] priority cookie. +*** TODO org-faces-priority-d-dim + Dimmed [#D] priority cookie for non-selected windows. +*** TODO org-faces-project + Face for the PROJECT keyword. +*** TODO org-faces-project-dim + Dimmed PROJECT keyword for non-selected windows. +*** TODO org-faces-stalled + Face for the STALLED keyword. +*** TODO org-faces-stalled-dim + Dimmed STALLED keyword for non-selected windows. +*** TODO org-faces-todo + Face for the TODO keyword. +*** TODO org-faces-todo-dim + Dimmed TODO keyword for non-selected windows. +*** TODO org-faces-verify + Face for the VERIFY keyword. +*** TODO org-faces-verify-dim + Dimmed VERIFY keyword for non-selected windows. +*** TODO org-faces-waiting + Face for the WAITING keyword. +*** TODO org-faces-waiting-dim + Dimmed WAITING keyword for non-selected windows. +*** TODO org-footnote + Face for footnotes. +*** TODO org-formula + Face for formulas. +*** TODO org-headline-done + Face used to indicate that a headline is DONE. +*** TODO org-headline-todo + Face used to indicate that a headline is marked as TODO. +*** TODO org-hide + Face used to hide leading stars in headlines. +*** TODO org-imminent-deadline + Face for current deadlines in the agenda. +*** TODO org-indent + Face for outline indentation. +*** TODO org-inline-src-block + Face used for inline source blocks as a whole. +*** TODO org-latex-and-related + Face used to highlight LaTeX data, entities and sub/superscript. +*** TODO org-level-1 + Face used for level 1 headlines. +*** TODO org-level-2 + Face used for level 2 headlines. +*** TODO org-level-3 + Face used for level 3 headlines. +*** TODO org-level-4 + Face used for level 4 headlines. +*** TODO org-level-5 + Face used for level 5 headlines. +*** TODO org-level-6 + Face used for level 6 headlines. +*** TODO org-level-7 + Face used for level 7 headlines. +*** TODO org-level-8 + Face used for level 8 headlines. +*** TODO org-link + Face for links. +*** TODO org-list-dt + Default face for definition terms in lists. +*** TODO org-macro + Face for macros. +*** TODO org-meta-line + Face for meta lines starting with "#+". +*** TODO org-mode-line-clock + Face used for clock display in mode line. +*** TODO org-mode-line-clock-overrun + Face used for clock display for overrun tasks in mode line. +*** TODO org-property-value + Face used for the value of a property. +*** TODO org-quote + Face for #+BEGIN_QUOTE ... #+END_QUOTE blocks. +*** TODO org-scheduled + Face for items scheduled for a certain day. +*** TODO org-scheduled-previously + Face for items scheduled previously, and not yet done. +*** TODO org-scheduled-today + Face for items scheduled for a certain day. +*** TODO org-sexp-date + Face for diary-like sexp date specifications. +*** TODO org-special-keyword + Face used for special keywords. +*** TODO org-tag + Default face for tags. +*** TODO org-tag-group + Face for group tags. +*** TODO org-target + Face for link targets. +*** TODO org-time-grid + Face used for time grids. +*** TODO org-todo + Face for TODO keywords. +*** TODO org-upcoming-deadline + Face for items scheduled previously, and not yet done. +*** TODO org-upcoming-distant-deadline + Face for items scheduled previously, not done, and have a distant deadline. +*** TODO org-verbatim + Face for fixed-with text like code snippets. +*** TODO org-verse + Face for #+BEGIN_VERSE ... #+END_VERSE blocks. +*** TODO org-warning + Face for deadlines and TODO keywords. +** TODO org-agenda [0/21] + Options concerning agenda views in Org mode. +*** TODO org-agenda-calendar-daterange + Face used to show entries with a date range in the agenda. +*** TODO org-agenda-calendar-event + Face used to show events and appointments in the agenda. +*** TODO org-agenda-calendar-sexp + Face used to show events computed from a S-expression. +*** TODO org-agenda-clocking + Face marking the current clock item in the agenda. +*** TODO org-agenda-column-dateline + Face used in agenda column view for datelines with summaries. +*** TODO org-agenda-current-time + Face used to show the current time in the time grid. +*** TODO org-agenda-date + Face used in agenda for normal days. +*** TODO org-agenda-date-today + Face used in agenda for today. +*** TODO org-agenda-date-weekend + Face used in agenda for weekend days. +*** TODO org-agenda-date-weekend-today + Face used in agenda for today during weekends. +*** TODO org-agenda-diary + Face used for agenda entries that come from the Emacs diary. +*** TODO org-agenda-dimmed-todo-face + Face used to dim blocked tasks in the agenda. +*** TODO org-agenda-done + Face used in agenda, to indicate lines switched to DONE. +*** TODO org-agenda-filter-category + Face for categories in the mode-line when filtering the agenda. +*** TODO org-agenda-filter-effort + Face for effort in the mode-line when filtering the agenda. +*** TODO org-agenda-filter-regexp + Face for regexp(s) in the mode-line when filtering the agenda. +*** TODO org-agenda-filter-tags + Face for tag(s) in the mode-line when filtering the agenda. +*** TODO org-agenda-restriction-lock + Face for showing the agenda restriction lock. +*** TODO org-agenda-structure + Face used in agenda for captions and dates. +*** TODO org-agenda-structure-filter + Face used for the current type of task filter in the agenda. +*** TODO org-agenda-structure-secondary + Face used for secondary information in agenda block headers. +** TODO org-block [0/3] + Outline-based notes management and organizer. +*** TODO org-block + Face used for text inside various blocks. +*** TODO org-block-begin-line + Face used for the line delimiting the begin of source blocks. +*** TODO org-block-end-line + Face used for the line delimiting the end of source blocks. +** TODO org-document [0/3] + Outline-based notes management and organizer. +*** TODO org-document-info + Face for document information such as the author and date. +*** TODO org-document-info-keyword + Face for document information keywords. +*** TODO org-document-title + Face for document title, i.e. that which follows the #+TITLE: keyword. +** TODO org-priority [0/1] + Outline-based notes management and organizer. +*** TODO org-priority + Face used for priority cookies. +** TODO org-table [0/3] + Options concerning tables in Org mode. +*** TODO org-table + Face used for tables. +*** TODO org-table-header + Face for table header. +*** TODO org-table-row + Face used to fontify whole table rows (including newlines and indentation). +** TODO outline [0/8] + Support for hierarchical outlining. +*** TODO outline-1 + Level 1. +*** TODO outline-2 + Level 2. +*** TODO outline-3 + Level 3. +*** TODO outline-4 + Level 4. +*** TODO outline-5 + Level 5. +*** TODO outline-6 + Level 6. +*** TODO outline-7 + Level 7. +*** TODO outline-8 + Level 8. +** TODO package [0/15] + Manager for Emacs Lisp packages. +*** TODO package-description + Face used on package description summaries in the package menu. +*** TODO package-help-section-name + Face used on section names in package description buffers. +*** TODO package-name + Face used on package names in the package menu. +*** TODO package-status-avail-obso + Face used on the status and version of avail-obso packages. +*** TODO package-status-available + Face used on the status and version of available packages. +*** TODO package-status-built-in + Face used on the status and version of built-in packages. +*** TODO package-status-dependency + Face used on the status and version of dependency packages. +*** TODO package-status-disabled + Face used on the status and version of disabled packages. +*** TODO package-status-external + Face used on the status and version of external packages. +*** TODO package-status-from-source + Face used on the status and version of installed packages. +*** TODO package-status-held + Face used on the status and version of held packages. +*** TODO package-status-incompat + Face used on the status and version of incompat packages. +*** TODO package-status-installed + Face used on the status and version of installed packages. +*** TODO package-status-new + Face used on the status and version of new packages. +*** TODO package-status-unsigned + Face used on the status and version of unsigned packages. +** TODO read [0/1] +*** TODO read-multiple-choice-face + Face for the symbol name in 'read-multiple-choice' output. +** TODO rectangle [0/1] + Operations on rectangles. +*** TODO rectangle-preview + The face to use for the 'string-rectangle' preview. +** TODO sh [0/3] + Shell programming utilities. +*** TODO sh-escaped-newline + Face used for (non-escaped) backslash at end of a line in Shell-script mode. +*** TODO sh-heredoc + Face to show a here-document. +*** TODO sh-quoted-exec + Face to show quoted execs like `blabla`. +** TODO shell [0/3] + Running shell from within Emacs buffers. +*** TODO shell-highlight-undef-alias-face + Face used for shell command aliases. +*** TODO shell-highlight-undef-defined-face + Face used for existing shell commands. +*** TODO shell-highlight-undef-undefined-face + Face used for non-existent shell commands. +** TODO shr [0/15] + Simple HTML Renderer. +*** TODO shr-abbreviation + Face for <abbr> elements. +*** TODO shr-code + Face used for rendering <code> blocks. +*** TODO shr-h1 + Face for <h1> elements. +*** TODO shr-h2 + Face for <h2> elements. +*** TODO shr-h3 + Face for <h3> elements. +*** TODO shr-h4 + Face for <h4> elements. +*** TODO shr-h5 + Face for <h5> elements. +*** TODO shr-h6 + Face for <h6> elements. +*** TODO shr-link + Face for link elements. +*** TODO shr-mark + Face used for <mark> elements. +*** TODO shr-selected-link + Temporary face for externally visited link elements. +*** TODO shr-sliced-image + Face used for sliced images. +*** TODO shr-strike-through + Face for <s> elements. +*** TODO shr-sup + Face for <sup> and <sub> elements. +*** TODO shr-text + Face used for rendering text. +** TODO smerge [0/7] + Minor mode to highlight and resolve diff3 conflicts. +*** TODO smerge-base + Face for the base code. +*** TODO smerge-lower + Face for the 'lower' version of a conflict. +*** TODO smerge-markers + Face for the conflict markers. +*** TODO smerge-refined-added + Face used for added characters shown by 'smerge-refine'. +*** TODO smerge-refined-changed + Face used for char-based changes shown by 'smerge-refine'. +*** TODO smerge-refined-removed + Face used for removed characters shown by 'smerge-refine'. +*** TODO smerge-upper + Face for the 'upper' version of a conflict. +** TODO tab-bar [0/6] + Frame-local tabs. +*** TODO tab-bar + Tab bar face. +*** TODO tab-bar-tab + Tab bar face for selected tab. +*** TODO tab-bar-tab-group-current + Tab bar face for current group tab. +*** TODO tab-bar-tab-group-inactive + Tab bar face for inactive group tab. +*** TODO tab-bar-tab-inactive + Tab bar face for non-selected tab. +*** TODO tab-bar-tab-ungrouped + Tab bar face for ungrouped tab when tab groups are used. +** TODO tab-line [0/1] + Faces used in the tab line. +*** TODO tab-line + Tab line face. +** TODO table [0/1] + Text based table manipulation utilities. +*** TODO table-cell + Face used for table cell contents. +** TODO tabulated-list [0/1] + Tabulated-list customization group. +*** TODO tabulated-list-fake-header + Face used on fake header lines. +** TODO treesit [0/2] + Incremental parser. +*** TODO treesit-explorer-anonymous-node + Face for anonymous nodes in tree-sitter explorer. +*** TODO treesit-explorer-field-name + Face for field names in tree-sitter explorer. +** TODO vc [0/12] + Faces used in the mode line by the VC state indicator. +*** TODO vc-conflict-state + Face for VC modeline state when the file contains merge conflicts. +*** TODO vc-edited-state + Face for VC modeline state when the file is edited. +*** TODO vc-git-log-edit-summary-max-warning + Face for Git commit summary lines beyond the maximum length. +*** TODO vc-git-log-edit-summary-target-warning + Face for Git commit summary lines beyond the target length. +*** TODO vc-ignored-state + Face for VC modeline state when the file is registered, but ignored. +*** TODO vc-locally-added-state + Face for VC modeline state when the file is locally added. +*** TODO vc-locked-state + Face for VC modeline state when the file locked. +*** TODO vc-missing-state + Face for VC modeline state when the file is missing from the file system. +*** TODO vc-needs-update-state + Face for VC modeline state when the file needs update. +*** TODO vc-removed-state + Face for VC modeline state when the file was removed from the VC system. +*** TODO vc-state-base + Base face for VC state indicator. +*** TODO vc-up-to-date-state + Face for VC modeline state when the file is up to date. +** TODO which-func [0/1] + Display the current function name in the mode line. +*** TODO which-func + Face used to highlight mode line function names. +** TODO which-key [0/9] + Customization options for `which-key-mode'. +*** TODO which-key-command-description-face + Face for the key description when it is a command. +*** TODO which-key-docstring-face + Face for docstrings. +*** TODO which-key-group-description-face + Face for the key description when it is a group or prefix. +*** TODO which-key-highlighted-command-face + Default face for highlighted command descriptions. +*** TODO which-key-key-face + Face for which-key keys. +*** TODO which-key-local-map-description-face + Face for the key description when it is found in 'current-local-map'. +*** TODO which-key-note-face + Face for notes or hints occasionally provided. +*** TODO which-key-separator-face + Face for the separator (default separator is an arrow). +*** TODO which-key-special-key-face + Face for special keys (SPC, TAB, RET). +** TODO widget [0/7] + Faces used by the widget library. +*** TODO widget-button + Face used for widget buttons. +*** TODO widget-button-pressed + Face used for pressed buttons. +*** TODO widget-documentation + Face used for documentation text. +*** TODO widget-field + Face used for editable fields. +*** TODO widget-inactive + Face used for inactive widgets. +*** TODO widget-single-line-field + Face used for editable fields spanning only a single line. +*** TODO widget-unselected + Face used for unselected widgets. +** TODO xref [0/3] + Cross-referencing commands. +*** TODO xref-file-header + Face used to highlight file header in the xref buffer. +*** TODO xref-line-number + Face for displaying line numbers in the xref buffer. +*** TODO xref-match + Face used to highlight matches in the xref buffer. + +* TODO adob [0/1] + auto-dim-other-buffers: dimmed inactive windows. +** TODO adob--hack + A hack to make fringe refresh work. Do not use. + +* DOING alert [6/8] + Notification system for Emacs similar to Growl +** DONE alert-high-face + High alert face. +** DONE alert-low-face + Low alert face. +** DONE alert-moderate-face + Moderate alert face. +** DONE alert-normal-face + Normal alert face. +** TODO alert-saved-fringe-face +** TODO alert-saved-mode-line-face +** DONE alert-trivial-face + Trivial alert face. +** DONE alert-urgent-face + Urgent alert face. + +* DONE all-the-icons [34/34] + Manage how All The Icons formats icons. +** DONE all-the-icons-blue + Face for blue icons +** DONE all-the-icons-blue-alt + Face for blue icons +** DONE all-the-icons-cyan + Face for cyan icons +** DONE all-the-icons-cyan-alt + Face for cyan icons +** DONE all-the-icons-dblue + Face for dblue icons +** DONE all-the-icons-dcyan + Face for dcyan icons +** DONE all-the-icons-dgreen + Face for dgreen icons +** DONE all-the-icons-dmaroon + Face for dmaroon icons +** DONE all-the-icons-dorange + Face for dorange icons +** DONE all-the-icons-dpink + Face for dpink icons +** DONE all-the-icons-dpurple + Face for dpurple icons +** DONE all-the-icons-dred + Face for dred icons +** DONE all-the-icons-dsilver + Face for dsilver icons +** DONE all-the-icons-dyellow + Face for dyellow icons +** DONE all-the-icons-green + Face for green icons +** DONE all-the-icons-lblue + Face for lblue icons +** DONE all-the-icons-lcyan + Face for lcyan icons +** DONE all-the-icons-lgreen + Face for lgreen icons +** DONE all-the-icons-lmaroon + Face for lmaroon icons +** DONE all-the-icons-lorange + Face for lorange icons +** DONE all-the-icons-lpink + Face for lpink icons +** DONE all-the-icons-lpurple + Face for lpurple icons +** DONE all-the-icons-lred + Face for lred icons +** DONE all-the-icons-lsilver + Face for lsilver icons +** DONE all-the-icons-lyellow + Face for lyellow icons +** DONE all-the-icons-maroon + Face for maroon icons +** DONE all-the-icons-orange + Face for orange icons +** DONE all-the-icons-pink + Face for pink icons +** DONE all-the-icons-purple + Face for purple icons +** DONE all-the-icons-purple-alt + Face for purple icons +** DONE all-the-icons-red + Face for red icons +** DONE all-the-icons-red-alt + Face for dred icons +** DONE all-the-icons-silver + Face for silver icons +** DONE all-the-icons-yellow + Face for yellow icons + +* TODO auto [0/2] +** TODO auto-dim-other-buffers + Face with a (presumably) dimmed background for non-selected window. +** TODO auto-dim-other-buffers-hide + Face with a (presumably) dimmed background and matching foreground. + +* DONE company [19/19] + Extensible inline text completion mechanism. +** DONE company-echo + Face used for completions in the echo area. +** DONE company-echo-common + Face used for the common part of completions in the echo area. +** DONE company-preview + Face used for the completion preview. +** DONE company-preview-common + Face used for the common part of the completion preview. +** DONE company-preview-search + Face used for the search string in the completion preview. +** DONE company-tooltip + Face used for the tooltip. +** DONE company-tooltip-annotation + Face used for the completion annotation in the tooltip. +** DONE company-tooltip-annotation-selection + Face used for the selected completion annotation in the tooltip. +** DONE company-tooltip-common + Face used for the common completion in the tooltip. +** DONE company-tooltip-common-selection + Face used for the selected common completion in the tooltip. +** DONE company-tooltip-deprecated + Face used for the deprecated items. +** DONE company-tooltip-mouse + Face used for the tooltip item under the mouse. +** DONE company-tooltip-quick-access + Face used for the quick-access hints shown in the tooltip. +** DONE company-tooltip-quick-access-selection + Face used for the selected quick-access hints shown in the tooltip. +** DONE company-tooltip-scrollbar-thumb + Face used for the tooltip scrollbar thumb (bar). +** DONE company-tooltip-scrollbar-track + Face used for the tooltip scrollbar track (trough). +** DONE company-tooltip-search + Face used for the search string in the tooltip. +** DONE company-tooltip-search-selection + Face used for the search string inside the selection in the tooltip. +** DONE company-tooltip-selection + Face used for the selection in the tooltip. + +* DONE company-box [6/6] + Front-end for Company. +** DONE company-box-annotation + company-box-annotation is an alias for the face `company-tooltip-annotation'. +** DONE company-box-background + company-box-background is an alias for the face `company-tooltip'. +** DONE company-box-candidate + company-box-candidate is an alias for the face `company-tooltip'. +** DONE company-box-numbers + company-box-numbers is an alias for the face `company-tooltip'. +** DONE company-box-scrollbar + Face used for the scrollbar. +** DONE company-box-selection + company-box-selection is an alias for the face `company-tooltip-selection'. + +* DOING consult [20/21] + Search and navigate via `completing-read'. +** DONE consult-async-failed + Face used if asynchronous process has failed. +** DONE consult-async-finished + Face used if asynchronous process has finished. +** TODO consult-async-option + Face used to highlight asynchronous command options. +** DONE consult-async-running + Face used if asynchronous process is running. +** DONE consult-async-split + Face used to highlight punctuation character. +** DONE consult-bookmark + Face used to highlight bookmarks in 'consult-buffer'. +** DONE consult-buffer + Face used to highlight buffers in 'consult-buffer'. +** DONE consult-file + Face used to highlight files in 'consult-buffer'. +** DONE consult-grep-context + Face used to highlight grep context in 'consult-grep'. +** DONE consult-help + Face used to highlight help, e.g., in 'consult-register-store'. +** DONE consult-highlight-mark + Face used for mark positions in completion candidates. +** DONE consult-highlight-match + Face used to highlight matches in the completion candidates. +** DONE consult-key + Face used to highlight keys, e.g., in 'consult-register'. +** DONE consult-line-number + Face used to highlight location line in 'consult-global-mark'. +** DONE consult-line-number-prefix + Face used to highlight line number prefixes. +** DONE consult-line-number-wrapped + Face used to highlight line number prefixes after wrap around. +** DONE consult-narrow-indicator + Face used for the narrowing indicator. +** DONE consult-preview-insertion + Face used for previews of text to be inserted. +** DONE consult-preview-line + Face used for line previews. +** DONE consult-preview-match + Face used for match previews, e.g., in 'consult-line'. +** DONE consult-separator + +* DONE dashboard [8/8] + Extensible startup screen. +** DONE dashboard-banner-logo-title + Face used for the banner title. +** DONE dashboard-footer-face + Face used for footer text. +** DONE dashboard-footer-icon-face + Face used for icon in footer. +** DONE dashboard-heading + Face used for widget headings. +** DONE dashboard-items-face + Face used for items. +** DONE dashboard-navigator + Face used for the navigator. +** DONE dashboard-no-items-face + Face used for no items. +** DONE dashboard-text-banner + Face used for text banners. + +* DONE dirvish [38/38] + A better Dired. +** DONE dirvish-collapse-dir-face + Face used for directories in 'collapse' attribute. +** DONE dirvish-collapse-empty-dir-face + Face used for empty directories in 'collapse' attribute. +** DONE dirvish-collapse-file-face + Face used for files in 'collapse' attribute. +** DONE dirvish-emerge-group-title + Face used for emerge group title. +** DONE dirvish-file-device-number +** DONE dirvish-file-group-id +** DONE dirvish-file-inode-number +** DONE dirvish-file-link-number +** DONE dirvish-file-modes +** DONE dirvish-file-size +** DONE dirvish-file-time +** DONE dirvish-file-user-id +** DONE dirvish-free-space +** DONE dirvish-git-commit-message-face + Face for commit message overlays. +** DONE dirvish-hl-line + Face used for Dirvish line highlighting in focused Dirvish window. +** DONE dirvish-hl-line-inactive + Face used for Dirvish line highlighting in unfocused Dirvish windows. +** DONE dirvish-inactive + Face used for mode-line segments in unfocused Dirvish windows. +** DONE dirvish-media-info-heading +** DONE dirvish-media-info-property-key +** DONE dirvish-narrow-match-face-0 + Face for matches of components numbered 0 mod 4. +** DONE dirvish-narrow-match-face-1 + Face for matches of components numbered 1 mod 4. +** DONE dirvish-narrow-match-face-2 + Face for matches of components numbered 2 mod 4. +** DONE dirvish-narrow-match-face-3 + Face for matches of components numbered 3 mod 4. +** DONE dirvish-narrow-split + Face used to highlight punctuation character. +** DONE dirvish-proc-failed + Face used if asynchronous process has failed. +** DONE dirvish-proc-finished + Face used if asynchronous process has finished. +** DONE dirvish-proc-running + Face used if asynchronous process is running. +** DONE dirvish-subtree-guide + Face used for 'expanded-state' attribute. +** DONE dirvish-subtree-state + Face used for 'expanded-state' attribute. +** DONE dirvish-vc-added-state + Face used for 'added' vc state in the Dirvish buffer. +** DONE dirvish-vc-conflict-state + Face used for 'conflict' vc state in the Dirvish buffer. +** DONE dirvish-vc-edited-state + Face used for 'edited' vc state in the Dirvish buffer. +** DONE dirvish-vc-locked-state + Face used for 'locked' vc state in the Dirvish buffer. +** DONE dirvish-vc-missing-state + Face used for 'missing' vc state in the Dirvish buffer. +** DONE dirvish-vc-needs-merge-face + Face used for 'needs-merge' vc state in the Dirvish buffer. +** DONE dirvish-vc-needs-update-state + Face used for 'needs-update' vc state in the Dirvish buffer. +** DONE dirvish-vc-removed-state + Face used for 'removed' vc state in the Dirvish buffer. +** DONE dirvish-vc-unregistered-face + Face used for 'unregistered' vc state in the Dirvish buffer. + +* TODO edit-indirect [0/1] + Editing regions in separate buffers. +** TODO edit-indirect-edited-region + Face used to highlight an indirectly edited region. + +* DONE elfeed [13/13] + An Emacs web feed reader. +** DONE elfeed-log-date-face + Face for showing the date in the elfeed log buffer. +** DONE elfeed-log-debug-level-face + Face for showing the 'debug' log level in the elfeed log buffer. +** DONE elfeed-log-error-level-face + Face for showing the 'error' log level in the elfeed log buffer. +** DONE elfeed-log-info-level-face + Face for showing the 'info' log level in the elfeed log buffer. +** DONE elfeed-log-warn-level-face + Face for showing the 'warn' log level in the elfeed log buffer. +** DONE elfeed-search-date-face + Face used in search mode for dates. +** DONE elfeed-search-feed-face + Face used in search mode for feed titles. +** DONE elfeed-search-filter-face + Face for showing the current Elfeed search filter. +** DONE elfeed-search-last-update-face + Face for showing the date and time the database was last updated. +** DONE elfeed-search-tag-face + Face used in search mode for tags. +** DONE elfeed-search-title-face + Face used in search mode for titles. +** DONE elfeed-search-unread-count-face + Face used in search mode for unread entry titles. +** DONE elfeed-search-unread-title-face + Face used in search mode for unread entry titles. + +* DONE embark [12/12] + Emacs Mini-Buffer Actions Rooted in Keymaps. +** DONE embark-collect-annotation + Face for annotations in Embark Collect. +** DONE embark-collect-candidate + Face for candidates in Embark Collect buffers. +** DONE embark-collect-group-separator + Face for group titles in Embark Collect buffers. +** DONE embark-collect-group-title + Face for group titles in Embark Collect buffers. +** DONE embark-keybinding + Face used to display key bindings. +** DONE embark-keybinding-repeat + Face used to indicate keybindings as repeatable. +** DONE embark-keymap + Face used to display keymaps. +** DONE embark-selected + Face for selected candidates. +** DONE embark-target + Face used to highlight the target at point during 'embark-act'. +** DONE embark-verbose-indicator-documentation + Face used by the verbose action indicator to display binding descriptions. +** DONE embark-verbose-indicator-shadowed + Face used by the verbose action indicator for the shadowed targets. +** DONE embark-verbose-indicator-title + Face used by the verbose action indicator for the title. + +* DONE emms [11/11] + The Emacs Multimedia System +** DONE emms-browser-album-face +** DONE emms-browser-albumartist-face +** DONE emms-browser-artist-face +** DONE emms-browser-composer-face +** DONE emms-browser-performer-face +** DONE emms-browser-track-face +** DONE emms-browser-year/genre-face +** DONE emms-metaplaylist-mode-current-face +** DONE emms-metaplaylist-mode-face +** DONE emms-playlist-selected-face +** DONE emms-playlist-track-face + +* DONE flycheck [20/20] + On-the-fly syntax checking +** DONE flycheck-delimited-error +** DONE flycheck-error +** DONE flycheck-error-delimiter +** DONE flycheck-error-list-checker-name +** DONE flycheck-error-list-column-number +** DONE flycheck-error-list-error +** DONE flycheck-error-list-error-message +** DONE flycheck-error-list-filename +** DONE flycheck-error-list-highlight +** DONE flycheck-error-list-id +** DONE flycheck-error-list-id-with-explainer +** DONE flycheck-error-list-info +** DONE flycheck-error-list-line-number +** DONE flycheck-error-list-warning +** DONE flycheck-fringe-error +** DONE flycheck-fringe-info +** DONE flycheck-fringe-warning +** DONE flycheck-info +** DONE flycheck-verify-select-checker +** DONE flycheck-warning + +* DONE flyspell-correct [1/1] + Correcting words with flyspell via custom interface. +** DONE flyspell-correct-highlight-face + +* DONE ghostel [19/19] + Terminal emulator powered by libghostty. +** DONE ghostel-color-black + Face used to render black color code. +** DONE ghostel-color-blue + Face used to render blue color code. +** DONE ghostel-color-bright-black + Face used to render bright black color code. +** DONE ghostel-color-bright-blue + Face used to render bright blue color code. +** DONE ghostel-color-bright-cyan + Face used to render bright cyan color code. +** DONE ghostel-color-bright-green + Face used to render bright green color code. +** DONE ghostel-color-bright-magenta + Face used to render bright magenta color code. +** DONE ghostel-color-bright-red + Face used to render bright red color code. +** DONE ghostel-color-bright-white + Face used to render bright white color code. +** DONE ghostel-color-bright-yellow + Face used to render bright yellow color code. +** DONE ghostel-color-cyan + Face used to render cyan color code. +** DONE ghostel-color-green + Face used to render green color code. +** DONE ghostel-color-magenta + Face used to render magenta color code. +** DONE ghostel-color-red + Face used to render red color code. +** DONE ghostel-color-white + Face used to render white color code. +** DONE ghostel-color-yellow + Face used to render yellow color code. +** DONE ghostel-default + Base face used to derive ghostel terminal default fg/bg colors. +** DONE ghostel-fake-cursor + Face for the hollow hint cursor drawn in copy and Emacs modes. +** DONE ghostel-fake-cursor-box + Face for the solid hint cursor drawn for box-style cursors. + +* DONE git-commit [12/12] + Edit Git commit messages. +** DONE git-commit-comment-action + Face used for actions in commit message comments. +** DONE git-commit-comment-branch-local + Face used for names of local branches in commit message comments. +** DONE git-commit-comment-branch-remote + Face used for names of remote branches in commit message comments. +** DONE git-commit-comment-detached + Face used for detached 'HEAD' in commit message comments. +** DONE git-commit-comment-file + Face used for file names in commit message comments. +** DONE git-commit-comment-heading + Face used for headings in commit message comments. +** DONE git-commit-keyword + Face used for keywords in commit messages. +** DONE git-commit-nonempty-second-line + Face used for non-whitespace on the second line of commit messages. +** DONE git-commit-overlong-summary + Face used for the tail of overlong commit message summaries. +** DONE git-commit-summary + Face used for the summary in commit messages. +** DONE git-commit-trailer-token + Face used for Git trailer tokens in commit messages. +** DONE git-commit-trailer-value + Face used for Git trailer values in commit messages. + +* DONE git-gutter [5/5] + Port of Sublime Text plugin GitGutter. +** DONE git-gutter:added +** DONE git-gutter:deleted +** DONE git-gutter:modified +** DONE git-gutter:separator +** DONE git-gutter:unchanged + +* DONE highlight-indent-guides [9/9] + Minor mode to highlight indentation. +** DONE highlight-indent-guides-character-face +** DONE highlight-indent-guides-even-face +** DONE highlight-indent-guides-odd-face +** DONE highlight-indent-guides-stack-character-face +** DONE highlight-indent-guides-stack-even-face +** DONE highlight-indent-guides-stack-odd-face +** DONE highlight-indent-guides-top-character-face +** DONE highlight-indent-guides-top-even-face +** DONE highlight-indent-guides-top-odd-face + +* DONE hl-todo [2/2] + Highlight TODO and similar keywords in comments and strings. +** DONE hl-todo + Base face used to highlight TODO and similar keywords. +** DONE hl-todo-flymake-type + Face used for the Flymake diagnostics type 'hl-todo-flymake'. + +* DONE json-mode [1/1] + Major mode for editing JSON. +** DONE json-mode-object-name-face + +* DONE llama [5/5] + Compact syntax for short lambda. +** DONE llama-##-macro + Face used for the name of the '##' macro. +** DONE llama-deleted-argument + Face used for deleted arguments '_%1'...'_%9', '_&1'...'_&9' and '_&*'. +** DONE llama-llama-macro + Face used for the name of the 'llama' macro. +** DONE llama-mandatory-argument + Face used for mandatory arguments '%1' through '%9' and '%'. +** DONE llama-optional-argument + Face used for optional arguments '&1' through '&9', '&' and '&*'. + +* DONE lsp [14/14] + Language Server Protocol client. +** DONE lsp-details-face + Used to display additional information throughout 'lsp'. +** DONE lsp-face-highlight-read + Face used for highlighting symbols being read. +** DONE lsp-face-highlight-textual + Face used for textual occurrences of symbols. +** DONE lsp-face-highlight-write + Face used for highlighting symbols being written to. +** DONE lsp-face-rename + Face used to highlight the identifier being renamed. +** DONE lsp-inlay-hint-face + The face to use for the JavaScript inlays. +** DONE lsp-inlay-hint-parameter-face + Face for inlay parameter hints (e.g. function parameter names at +** DONE lsp-inlay-hint-type-face + Face for inlay type hints (e.g. inferred variable types). +** DONE lsp-installation-buffer-face + Face used for installation buffers still in progress. +** DONE lsp-installation-finished-buffer-face + Face used for finished installation buffers. +** DONE lsp-rename-placeholder-face + Face used to display the rename placeholder in. +** DONE lsp-signature-face + Used to display signatures in 'imenu', .... +** DONE lsp-signature-highlight-function-argument + The face to use to highlight function arguments in signatures. +** DONE lsp-signature-posframe + Background and foreground for 'lsp-signature-posframe'. + +* DONE lv [1/1] + The other echo area. +** DONE lv-separator + Face used to draw line between the lv window and the echo area. + +* DONE magit [93/93] + Controlling Git from Emacs. +** DONE magit-bisect-bad + Face for bad bisect revisions. +** DONE magit-bisect-good + Face for good bisect revisions. +** DONE magit-bisect-skip + Face for skipped bisect revisions. +** DONE magit-blame-date + Face used for dates when blaming. +** DONE magit-blame-dimmed + Face used for the blame margin in some cases when blaming. +** DONE magit-blame-hash + Face used for commit hashes when blaming. +** DONE magit-blame-heading + Face used for blame headings by default when blaming. +** DONE magit-blame-highlight + Face used for highlighting when blaming. +** DONE magit-blame-margin + Face used for the blame margin by default when blaming. +** DONE magit-blame-name + Face used for author and committer names when blaming. +** DONE magit-blame-summary + Face used for commit summaries when blaming. +** DONE magit-branch-current + Face for current branch. +** DONE magit-branch-local + Face for local branches. +** DONE magit-branch-remote + Face for remote branch head labels shown in log buffer. +** DONE magit-branch-remote-head + Face for current branch. +** DONE magit-branch-upstream + Face for upstream branch. +** DONE magit-branch-warning + Face for warning about (missing) branch. +** DONE magit-cherry-equivalent + Face for equivalent cherry commits. +** DONE magit-cherry-unmatched + Face for unmatched cherry commits. +** DONE magit-diff-added + Face for lines in a diff that have been added. +** DONE magit-diff-added-highlight + Face for lines in a diff that have been added. +** DONE magit-diff-base + Face for lines in a diff for the base side in a conflict. +** DONE magit-diff-base-highlight + Face for lines in a diff for the base side in a conflict. +** DONE magit-diff-conflict-heading + Face for conflict markers. +** DONE magit-diff-conflict-heading-highlight + Face for conflict markers. +** DONE magit-diff-context + Face for lines in a diff that are unchanged. +** DONE magit-diff-context-highlight + Face for lines in the current context in a diff. +** DONE magit-diff-file-heading + Face for diff file headings. +** DONE magit-diff-file-heading-highlight + Face for current diff file headings. +** DONE magit-diff-file-heading-selection + Face for selected diff file headings. +** DONE magit-diff-hunk-heading + Face for diff hunk headings. +** DONE magit-diff-hunk-heading-highlight + Face for current diff hunk headings. +** DONE magit-diff-hunk-heading-selection + Face for selected diff hunk headings. +** DONE magit-diff-hunk-region + Face used by 'magit-diff-highlight-hunk-region-using-face'. +** DONE magit-diff-lines-boundary + Face for boundary of marked lines in diff hunk. +** DONE magit-diff-lines-heading + Face for diff hunk heading when lines are marked. +** DONE magit-diff-our + Face for lines in a diff for our side in a conflict. +** DONE magit-diff-our-highlight + Face for lines in a diff for our side in a conflict. +** DONE magit-diff-removed + Face for lines in a diff that have been removed. +** DONE magit-diff-removed-highlight + Face for lines in a diff that have been removed. +** DONE magit-diff-revision-summary + Face for commit message summaries. +** DONE magit-diff-revision-summary-highlight + Face for highlighted commit message summaries. +** DONE magit-diff-their + Face for lines in a diff for their side in a conflict. +** DONE magit-diff-their-highlight + Face for lines in a diff for their side in a conflict. +** DONE magit-diff-whitespace-warning + Face for highlighting whitespace errors added lines. +** DONE magit-diffstat-added + Face for addition indicator in diffstat. +** DONE magit-diffstat-removed + Face for removal indicator in diffstat. +** DONE magit-dimmed + Face for text that shouldn't stand out. +** DONE magit-filename + Face for filenames. +** DONE magit-hash + Face for the commit object name in the log output. +** DONE magit-head + Face for the symbolic ref 'HEAD'. +** DONE magit-header-line + Face for the 'header-line' in some Magit modes. +** DONE magit-header-line-key + Face for keys in the 'header-line'. +** DONE magit-header-line-log-select + Face for the 'header-line' in 'magit-log-select-mode'. +** DONE magit-keyword + Face for parts of commit messages inside brackets. +** DONE magit-keyword-squash + Face for squash! and similar keywords in commit messages. +** DONE magit-left-margin + Face used for the left margin. +** DONE magit-log-author + Face for the author part of the log output. +** DONE magit-log-date + Face for the date part of the log output. +** DONE magit-log-graph + Face for the graph part of the log output. +** DONE magit-mode-line-process + Face for 'mode-line-process' status when Git is running for side-effects. +** DONE magit-mode-line-process-error + Face for 'mode-line-process' error status. +** DONE magit-process-ng + Face for non-zero exit-status. +** DONE magit-process-ok + Face for zero exit-status. +** DONE magit-reflog-amend + Face for amend commands in reflogs. +** DONE magit-reflog-checkout + Face for checkout commands in reflogs. +** DONE magit-reflog-cherry-pick + Face for cherry-pick commands in reflogs. +** DONE magit-reflog-commit + Face for commit commands in reflogs. +** DONE magit-reflog-merge + Face for merge, checkout and branch commands in reflogs. +** DONE magit-reflog-other + Face for other commands in reflogs. +** DONE magit-reflog-rebase + Face for rebase commands in reflogs. +** DONE magit-reflog-remote + Face for pull and clone commands in reflogs. +** DONE magit-reflog-reset + Face for reset commands in reflogs. +** DONE magit-refname + Face for refnames without a dedicated face. +** DONE magit-refname-pullreq + Face for pullreq refnames. +** DONE magit-refname-stash + Face for stash refnames. +** DONE magit-refname-wip + Face for wip refnames. +** DONE magit-sequence-done + Face used in sequence sections. +** DONE magit-sequence-drop + Face used in sequence sections. +** DONE magit-sequence-exec + Face used in sequence sections. +** DONE magit-sequence-head + Face used in sequence sections. +** DONE magit-sequence-onto + Face used in sequence sections. +** DONE magit-sequence-part + Face used in sequence sections. +** DONE magit-sequence-pick + Face used in sequence sections. +** DONE magit-sequence-stop + Face used in sequence sections. +** DONE magit-signature-bad + Face for bad signatures. +** DONE magit-signature-error + Face for signatures that cannot be checked (e.g., missing key). +** DONE magit-signature-expired + Face for signatures that have expired. +** DONE magit-signature-expired-key + Face for signatures made by an expired key. +** DONE magit-signature-good + Face for good signatures. +** DONE magit-signature-revoked + Face for signatures made by a revoked key. +** DONE magit-signature-untrusted + Face for good untrusted signatures. +** DONE magit-tag + Face for tag labels shown in log buffer. + +* DONE magit-section [5/5] + Expandable sections. +** DONE magit-section-child-count + Face used for child counts at the end of some section headings. +** DONE magit-section-heading + Face for section headings. +** DONE magit-section-heading-selection + Face for selected section headings. +** DONE magit-section-highlight + Face for highlighting the current section. +** DONE magit-section-secondary-heading + Face for section headings of some secondary headings. + +* DONE malyon [5/5] + Play Z-machine interactive fiction games. +** DONE malyon-face-bold + Bold face for game text. +** DONE malyon-face-error + Face for game errors. +** DONE malyon-face-italic + Italic face for game text. +** DONE malyon-face-plain + Basic face for game text. +** DONE malyon-face-reverse + Face for reverse-video text. + +* DONE marginalia [32/32] + Enrich existing commands with completion annotations. +** DONE marginalia-archive + Face used to highlight package archives. +** DONE marginalia-char + Face used to highlight character annotations. +** DONE marginalia-date + Face used to highlight dates. +** DONE marginalia-documentation + Face used to highlight documentation strings. +** DONE marginalia-file-name + Face used to highlight file names. +** DONE marginalia-file-owner + Face used to highlight file owner and group names. +** DONE marginalia-file-priv-dir + Face used to highlight the dir file privilege attribute. +** DONE marginalia-file-priv-exec + Face used to highlight the exec file privilege attribute. +** DONE marginalia-file-priv-link + Face used to highlight the link file privilege attribute. +** DONE marginalia-file-priv-no + Face used to highlight the no file privilege attribute. +** DONE marginalia-file-priv-other + Face used to highlight some other file privilege attribute. +** DONE marginalia-file-priv-rare + Face used to highlight a rare file privilege attribute. +** DONE marginalia-file-priv-read + Face used to highlight the read file privilege attribute. +** DONE marginalia-file-priv-write + Face used to highlight the write file privilege attribute. +** DONE marginalia-function + Face used to highlight function symbols. +** DONE marginalia-installed + Face used to highlight the status of packages. +** DONE marginalia-key + Face used to highlight keys. +** DONE marginalia-lighter + Face used to highlight minor mode lighters. +** DONE marginalia-list + Face used to highlight list expressions. +** DONE marginalia-mode + Face used to highlight buffer major modes. +** DONE marginalia-modified + Face used to highlight buffer modification indicators. +** DONE marginalia-null + Face used to highlight null or unbound variable values. +** DONE marginalia-number + Face used to highlight numeric values. +** DONE marginalia-off + Face used to signal disabled modes. +** DONE marginalia-on + Face used to signal enabled modes. +** DONE marginalia-size + Face used to highlight sizes. +** DONE marginalia-string + Face used to highlight string values. +** DONE marginalia-symbol + Face used to highlight general symbols. +** DONE marginalia-true + Face used to highlight true variable values. +** DONE marginalia-type + Face used to highlight types. +** DONE marginalia-value + Face used to highlight general variable values. +** DONE marginalia-version + Face used to highlight package versions. + +* DONE markdown [43/43] + Major mode for editing text files in Markdown format. +** DONE markdown-blockquote-face + Face for blockquote sections. +** DONE markdown-bold-face + Face for bold text. +** DONE markdown-code-face + Face for inline code, pre blocks, and fenced code blocks. +** DONE markdown-comment-face + Face for HTML comments. +** DONE markdown-footnote-marker-face + Face for footnote markers. +** DONE markdown-footnote-text-face + Face for footnote text. +** DONE markdown-gfm-checkbox-face + Face for GFM checkboxes. +** DONE markdown-header-delimiter-face + Base face for headers hash delimiter. +** DONE markdown-header-face + Base face for headers. +** DONE markdown-header-face-1 + Face for level 1 headers. +** DONE markdown-header-face-2 + Face for level 2 headers. +** DONE markdown-header-face-3 + Face for level 3 headers. +** DONE markdown-header-face-4 + Face for level 4 headers. +** DONE markdown-header-face-5 + Face for level 5 headers. +** DONE markdown-header-face-6 + Face for level 6 headers. +** DONE markdown-header-rule-face + Base face for headers rules. +** DONE markdown-highlight-face + Face for mouse highlighting. +** DONE markdown-highlighting-face + Face for highlighting. +** DONE markdown-hr-face + Face for horizontal rules. +** DONE markdown-html-attr-name-face + Face for HTML attribute names. +** DONE markdown-html-attr-value-face + Face for HTML attribute values. +** DONE markdown-html-entity-face + Face for HTML entities. +** DONE markdown-html-tag-delimiter-face + Face for HTML tag delimiters. +** DONE markdown-html-tag-name-face + Face for HTML tag names. +** DONE markdown-inline-code-face + Face for inline code. +** DONE markdown-italic-face + Face for italic text. +** DONE markdown-language-info-face + Face for programming language info strings. +** DONE markdown-language-keyword-face + Face for programming language identifiers. +** DONE markdown-line-break-face + Face for hard line breaks. +** DONE markdown-link-face + Face for link text, ie the alias portion of a link. +** DONE markdown-link-title-face + Face for reference link titles. +** DONE markdown-list-face + Face for list item markers. +** DONE markdown-markup-face + Face for markup elements. +** DONE markdown-math-face + Face for LaTeX expressions. +** DONE markdown-metadata-key-face + Face for metadata keys. +** DONE markdown-metadata-value-face + Face for metadata values. +** DONE markdown-missing-link-face + Face for the link text if the link points to a missing file. +** DONE markdown-plain-url-face + Face for URLs that are also links. +** DONE markdown-pre-face + Face for preformatted text. +** DONE markdown-reference-face + Face for link references. +** DONE markdown-strike-through-face + Face for strike-through text. +** DONE markdown-table-face + Face for tables. +** DONE markdown-url-face + Face for URLs that are part of markup. + +* DONE nerd-icons [34/34] + Manage how Nerd Fonts formats icons. +** DONE nerd-icons-blue + Face for blue icons. +** DONE nerd-icons-blue-alt + Face for blue icons. +** DONE nerd-icons-cyan + Face for cyan icons. +** DONE nerd-icons-cyan-alt + Face for cyan icons. +** DONE nerd-icons-dblue + Face for dblue icons. +** DONE nerd-icons-dcyan + Face for dcyan icons. +** DONE nerd-icons-dgreen + Face for dgreen icons. +** DONE nerd-icons-dmaroon + Face for dmaroon icons. +** DONE nerd-icons-dorange + Face for dorange icons. +** DONE nerd-icons-dpink + Face for dpink icons. +** DONE nerd-icons-dpurple + Face for dpurple icons. +** DONE nerd-icons-dred + Face for dred icons. +** DONE nerd-icons-dsilver + Face for dsilver icons. +** DONE nerd-icons-dyellow + Face for dyellow icons. +** DONE nerd-icons-green + Face for green icons. +** DONE nerd-icons-lblue + Face for lblue icons. +** DONE nerd-icons-lcyan + Face for lcyan icons. +** DONE nerd-icons-lgreen + Face for lgreen icons. +** DONE nerd-icons-lmaroon + Face for lmaroon icons. +** DONE nerd-icons-lorange + Face for lorange icons. +** DONE nerd-icons-lpink + Face for lpink icons. +** DONE nerd-icons-lpurple + Face for lpurple icons. +** DONE nerd-icons-lred + Face for lred icons. +** DONE nerd-icons-lsilver + Face for lsilver icons. +** DONE nerd-icons-lyellow + Face for lyellow icons. +** DONE nerd-icons-maroon + Face for maroon icons. +** DONE nerd-icons-orange + Face for orange icons. +** DONE nerd-icons-pink + Face for pink icons. +** DONE nerd-icons-purple + Face for purple icons. +** DONE nerd-icons-purple-alt + Face for purple icons. +** DONE nerd-icons-red + Face for red icons. +** DONE nerd-icons-red-alt + Face for dred icons. +** DONE nerd-icons-silver + Face for silver icons. +** DONE nerd-icons-yellow + Face for yellow icons. + +* DONE nerd-icons-completion [1/1] + Add icons to completion candidates. +** DONE nerd-icons-completion-dir-face + Face for the directory icon. + +* DONE orderless [4/4] + Completion method that matches space-separated regexps in any order. +** DONE orderless-match-face-0 + Face for matches of components numbered 0 mod 4. +** DONE orderless-match-face-1 + Face for matches of components numbered 1 mod 4. +** DONE orderless-match-face-2 + Face for matches of components numbered 2 mod 4. +** DONE orderless-match-face-3 + Face for matches of components numbered 3 mod 4. + +* DONE org-roam [9/9] + A database abstraction layer for Org-mode. +** DONE org-roam-dailies-calendar-note + Face for dates with a daily-note in the calendar. +** DONE org-roam-dim + Face for the dimmer part of the widgets. +** DONE org-roam-header-line + Face for the 'header-line' in some Org-roam modes. +** DONE org-roam-olp + Face for the OLP of the node. +** DONE org-roam-preview-heading + Face for preview headings. +** DONE org-roam-preview-heading-highlight + Face for current preview headings. +** DONE org-roam-preview-heading-selection + Face for selected preview headings. +** DONE org-roam-preview-region + Face used by 'org-roam-highlight-preview-region-using-face'. +** DONE org-roam-title + Face for Org-roam titles. + +* DOING org-superstar [4/5] + Use UTF8 bullets for headlines and plain lists. +** DONE org-superstar-first + Face used to display the first bullet of an inline task. +** DONE org-superstar-header-bullet + Face containing distinguishing features headline bullets. +** DONE org-superstar-item + Face used to display prettified item bullets. +** DONE org-superstar-leading + Face used to display prettified leading stars in a headline. +** TODO org-superstar-ordered-item + Face used to display ordered list item bullets. + +* DONE prescient [2/2] + Simple but effective candidate sorting by usage. +** DONE prescient-primary-highlight + Face used to highlight the parts of candidates that match the input. +** DONE prescient-secondary-highlight + Additional face used to highlight parts of candidates. + +* DONE rainbow-delimiters [13/13] + Highlight brackets according to their depth +** DONE rainbow-delimiters-base-error-face +** DONE rainbow-delimiters-base-face +** DONE rainbow-delimiters-depth-1-face +** DONE rainbow-delimiters-depth-2-face +** DONE rainbow-delimiters-depth-3-face +** DONE rainbow-delimiters-depth-4-face +** DONE rainbow-delimiters-depth-5-face +** DONE rainbow-delimiters-depth-6-face +** DONE rainbow-delimiters-depth-7-face +** DONE rainbow-delimiters-depth-8-face +** DONE rainbow-delimiters-depth-9-face +** DONE rainbow-delimiters-mismatched-face +** DONE rainbow-delimiters-unmatched-face + +* DONE symbol-overlay [9/9] + Highlight symbols with keymap-enabled overlays +** DONE symbol-overlay-default-face +** DONE symbol-overlay-face-1 +** DONE symbol-overlay-face-2 +** DONE symbol-overlay-face-3 +** DONE symbol-overlay-face-4 +** DONE symbol-overlay-face-5 +** DONE symbol-overlay-face-6 +** DONE symbol-overlay-face-7 +** DONE symbol-overlay-face-8 + +* DOING tmr [12/17] + TMR May Ring: set timers using a simple notation. +** DONE tmr-description + Face for styling the description of a timer. +** DONE tmr-duration + Face for styling the duration of a timer. +** DONE tmr-end-time + Face for styling the start time of a timer. +** DONE tmr-finished + Face for styling the description of a finished timer. +** DONE tmr-is-acknowledged + Face for styling the acknowledgment confirmation. +** TODO tmr-mode-line-active + Face for active timers in the mode-line. +** TODO tmr-mode-line-soon + Face for timers that will expire in the next 2 minutes. +** TODO tmr-mode-line-urgent + Face for timers that will expire in the next 30 seconds. +** DONE tmr-must-be-acknowledged + Face for styling the acknowledgment confirmation. +** TODO tmr-paused + Face for styling the description of a paused timer. +** DONE tmr-start-time + Face for styling the start time of a timer. +** DONE tmr-tabulated-acknowledgement + Acknowledgement indicator in the 'tmr-tabulated-view'. +** DONE tmr-tabulated-description + Description of timer in the 'tmr-tabulated-view'. +** DONE tmr-tabulated-end-time + End time in the 'tmr-tabulated-view'. +** TODO tmr-tabulated-paused + Face for styling the description of a paused timer. +** DONE tmr-tabulated-remaining-time + Remaining time in the 'tmr-tabulated-view'. +** DONE tmr-tabulated-start-time + Start time in the 'tmr-tabulated-view'. + +* DONE transient [23/23] + Transient commands. +** DONE transient-active-infix + Face used for the infix for which the value is being read. +** DONE transient-argument + Face used for enabled arguments. +** DONE transient-delimiter + Face used for delimiters and separators. +** DONE transient-disabled-suffix + Face used for disabled levels while editing suffix levels. +** DONE transient-enabled-suffix + Face used for enabled levels while editing suffix levels. +** DONE transient-heading + Face used for headings. +** DONE transient-higher-level + Face optionally used to highlight suffixes on higher levels. +** DONE transient-inactive-argument + Face used for inactive arguments. +** DONE transient-inactive-value + Face used for inactive values. +** DONE transient-inapt-argument + Face used for inapt arguments with a (currently ignored) value. +** DONE transient-inapt-suffix + Face used for suffixes that are inapt at this time. +** DONE transient-key + Face used for keys. +** DONE transient-key-exit + Face used for keys of suffixes that exit the menu. +** DONE transient-key-noop + Face used for keys of suffixes that currently cannot be invoked. +** DONE transient-key-recurse + Face used for keys of sub-menus whose suffixes return to the parent menu. +** DONE transient-key-return + Face used for keys of suffixes that return to the parent menu. +** DONE transient-key-stack + Face used for keys of sub-menus that exit the parent menu. +** DONE transient-key-stay + Face used for keys of suffixes that don't exit the menu. +** DONE transient-mismatched-key + Face optionally used to highlight keys without a short-argument. +** DONE transient-nonstandard-key + Face optionally used to highlight keys conflicting with short-argument. +** DONE transient-unreachable + Face used for suffixes unreachable from the current prefix sequence. +** DONE transient-unreachable-key + Face used for keys unreachable from the current prefix sequence. +** DONE transient-value + Face used for values. + +* DONE twentyfortyeight [11/11] + Tile faces for the 2048 game. +** DONE twentyfortyeight-face-1024 + Face for the tile 1024. +** DONE twentyfortyeight-face-128 + Face for the tile 128. +** DONE twentyfortyeight-face-16 + Face for the tile 16. +** DONE twentyfortyeight-face-2 + Face for the tile 2. +** DONE twentyfortyeight-face-2048 + Face for the tile 2048. +** DONE twentyfortyeight-face-256 + Face for the tile 256. +** DONE twentyfortyeight-face-32 + Face for the tile 32. +** DONE twentyfortyeight-face-4 + Face for the tile 4. +** DONE twentyfortyeight-face-512 + Face for the tile 512. +** DONE twentyfortyeight-face-64 + Face for the tile 64. +** DONE twentyfortyeight-face-8 + Face for the tile 8. + +* DONE vertico [4/4] + VERTical Interactive COmpletion. +** DONE vertico-current + Face used to highlight the currently selected candidate. +** DONE vertico-group-separator + Face used for the separator lines of the candidate groups. +** DONE vertico-group-title + Face used for the title text of the candidate group headlines. +** DONE vertico-multiline + Face used to highlight multiline replacement characters. + +* DONE web-mode [81/81] + major mode for editing web templates +** DONE web-mode-annotation-face +** DONE web-mode-annotation-html-face +** DONE web-mode-annotation-tag-face +** DONE web-mode-annotation-type-face +** DONE web-mode-annotation-value-face +** DONE web-mode-block-attr-name-face +** DONE web-mode-block-attr-value-face +** DONE web-mode-block-comment-face +** DONE web-mode-block-control-face +** DONE web-mode-block-delimiter-face +** DONE web-mode-block-face +** DONE web-mode-block-string-face +** DONE web-mode-bold-face +** DONE web-mode-builtin-face +** DONE web-mode-comment-face +** DONE web-mode-comment-keyword-face +** DONE web-mode-constant-face +** DONE web-mode-css-at-rule-face +** DONE web-mode-css-color-face +** DONE web-mode-css-comment-face +** DONE web-mode-css-function-face +** DONE web-mode-css-priority-face +** DONE web-mode-css-property-name-face +** DONE web-mode-css-pseudo-class-face +** DONE web-mode-css-selector-class-face +** DONE web-mode-css-selector-face +** DONE web-mode-css-selector-tag-face +** DONE web-mode-css-string-face +** DONE web-mode-css-variable-face +** DONE web-mode-current-column-highlight-face +** DONE web-mode-current-element-highlight-face +** DONE web-mode-doctype-face +** DONE web-mode-error-face +** DONE web-mode-filter-face +** DONE web-mode-folded-face +** DONE web-mode-function-call-face +** DONE web-mode-function-name-face +** DONE web-mode-html-attr-custom-face +** DONE web-mode-html-attr-engine-face +** DONE web-mode-html-attr-equal-face +** DONE web-mode-html-attr-name-face +** DONE web-mode-html-attr-value-face +** DONE web-mode-html-entity-face +** DONE web-mode-html-tag-bracket-face +** DONE web-mode-html-tag-custom-face +** DONE web-mode-html-tag-face +** DONE web-mode-html-tag-namespaced-face +** DONE web-mode-html-tag-unclosed-face +** DONE web-mode-inlay-face +** DONE web-mode-interpolate-color1-face +** DONE web-mode-interpolate-color2-face +** DONE web-mode-interpolate-color3-face +** DONE web-mode-interpolate-color4-face +** DONE web-mode-italic-face +** DONE web-mode-javascript-comment-face +** DONE web-mode-javascript-string-face +** DONE web-mode-json-comment-face +** DONE web-mode-json-context-face +** DONE web-mode-json-key-face +** DONE web-mode-json-string-face +** DONE web-mode-jsx-depth-1-face +** DONE web-mode-jsx-depth-2-face +** DONE web-mode-jsx-depth-3-face +** DONE web-mode-jsx-depth-4-face +** DONE web-mode-jsx-depth-5-face +** DONE web-mode-keyword-face +** DONE web-mode-param-name-face +** DONE web-mode-part-comment-face +** DONE web-mode-part-face +** DONE web-mode-part-string-face +** DONE web-mode-preprocessor-face +** DONE web-mode-script-face +** DONE web-mode-sql-keyword-face +** DONE web-mode-string-face +** DONE web-mode-style-face +** DONE web-mode-symbol-face +** DONE web-mode-type-face +** DONE web-mode-underline-face +** DONE web-mode-variable-name-face +** DONE web-mode-warning-face +** DONE web-mode-whitespace-face + +* DONE yas [2/2] + Faces for YASnippet template fields. +** DONE yas--field-debug-face + The face used for debugging some overlays normally hidden +** DONE yas-field-highlight-face + The face used to highlight the currently active field of a snippet diff --git a/scripts/theme-studio/face-docs-dump.el b/scripts/theme-studio/face-docs-dump.el new file mode 100644 index 000000000..7148f79da --- /dev/null +++ b/scripts/theme-studio/face-docs-dump.el @@ -0,0 +1,77 @@ +;;; face-docs-dump.el --- Dump face docstrings for theme-studio hovers -*- lexical-binding: t -*- + +;;; Commentary: +;; Emits face-docs.json, the checked-in asset generate.py inlines so the +;; theme-studio element hovers can show each face's Emacs docstring on top of +;; the existing tooltip text. Two maps: +;; +;; "faces" -- face-name -> first docstring line, for every face in +;; `face-list' that carries documentation. Keys the UI and +;; package tables (both keyed by real Emacs face name). +;; "syntax" -- theme-studio syntax-category key (kw, doc, str, ...) -> +;; first docstring line of the font-lock face it colors. Keys +;; the syntax table. The category->face mapping is read from +;; `build-theme/--syntax-face-map' (build-theme.el) so it stays +;; single-sourced; bg and p map to the `default' face. +;; +;; Run against a live daemon so lazily-loaded package faces are present: +;; emacsclient -e '(progn (load ".../face-docs-dump.el") +;; (face-docs-dump "/path/to/face-docs.json"))' + +;;; Code: + +(require 'json) + +(defun face-docs--first-line (doc) + "Return the first non-empty line of DOC, whitespace-collapsed, or nil. +Returns nil when DOC is not a non-empty string." + (when (and (stringp doc) (not (string-empty-p doc))) + (let ((line (seq-find (lambda (l) (not (string-blank-p l))) + (split-string doc "\n")))) + (when line + (string-trim (replace-regexp-in-string "[ \t]+" " " line)))))) + +(defun face-docs--faces-map () + "Hash of face-name -> first docstring line for documented faces." + (let ((faces (make-hash-table :test 'equal))) + (dolist (f (face-list)) + (let ((doc (face-docs--first-line (face-documentation f)))) + (when doc (puthash (symbol-name f) doc faces)))) + faces)) + +(defun face-docs--syntax-map () + "Hash of syntax-category key -> first docstring line of its primary face. +Reads `build-theme/--syntax-face-map' for the category->faces mapping; +adds bg and p as the `default' face." + (let ((syntax (make-hash-table :test 'equal)) + (pairs (append '((bg . (default)) (p . (default))) + (and (boundp 'build-theme/--syntax-face-map) + build-theme/--syntax-face-map)))) + (dolist (entry pairs) + (let* ((kind (car entry)) + (face (car (cdr entry))) + (doc (and (facep face) + (face-docs--first-line (face-documentation face))))) + (when doc (puthash (symbol-name kind) doc syntax)))) + syntax)) + +(defun face-docs-dump (outfile) + "Write the face and syntax docstring maps as JSON to OUTFILE. +Loads build-theme.el (sibling file) for the syntax-category face map." + (let ((bt (expand-file-name "build-theme.el" + (file-name-directory + (or load-file-name buffer-file-name default-directory))))) + (when (file-exists-p bt) (load bt nil t))) + (let ((faces (face-docs--faces-map)) + (syntax (face-docs--syntax-map)) + ;; Docstrings carry curly quotes and other non-ASCII; pin the write + ;; coding system so `with-temp-file' never opens the interactive + ;; select-safe-coding-system prompt in the daemon frame. + (coding-system-for-write 'utf-8-unix)) + (with-temp-file outfile + (insert (json-serialize (list :faces faces :syntax syntax)))) + (message "face-docs-dump: %d faces, %d syntax keys -> %s" + (hash-table-count faces) (hash-table-count syntax) outfile))) + +(provide 'face-docs-dump) +;;; face-docs-dump.el ends here diff --git a/scripts/theme-studio/face-docs.json b/scripts/theme-studio/face-docs.json new file mode 100644 index 000000000..9641413ac --- /dev/null +++ b/scripts/theme-studio/face-docs.json @@ -0,0 +1 @@ +{"faces":{"flyspell-duplicate":"Flyspell face for words that appear twice in a row.","flyspell-incorrect":"Flyspell face for misspelled words.","hl-line":"Default face for highlighting the current line in Hl-Line mode.","ghostel-default":"Base face used to derive ghostel terminal default fg/bg colors.","ghostel-fake-cursor-box":"Face for the solid hint cursor drawn for box-style cursors.","ghostel-fake-cursor":"Face for the hollow hint cursor drawn in copy and Emacs modes.","ghostel-color-bright-white":"Face used to render bright white color code.","ghostel-color-bright-cyan":"Face used to render bright cyan color code.","ghostel-color-bright-magenta":"Face used to render bright magenta color code.","ghostel-color-bright-blue":"Face used to render bright blue color code.","ghostel-color-bright-yellow":"Face used to render bright yellow color code.","ghostel-color-bright-green":"Face used to render bright green color code.","ghostel-color-bright-red":"Face used to render bright red color code.","ghostel-color-bright-black":"Face used to render bright black color code.","ghostel-color-white":"Face used to render white color code.","ghostel-color-cyan":"Face used to render cyan color code.","ghostel-color-magenta":"Face used to render magenta color code.","ghostel-color-blue":"Face used to render blue color code.","ghostel-color-yellow":"Face used to render yellow color code.","ghostel-color-green":"Face used to render green color code.","ghostel-color-red":"Face used to render red color code.","ghostel-color-black":"Face used to render black color code.","apropos-misc-button":"Button face indicating a miscellaneous object type in Apropos.","apropos-user-option-button":"Button face indicating a user option in Apropos.","apropos-variable-button":"Button face indicating a variable in Apropos.","apropos-function-button":"Button face indicating a function, macro, or command in Apropos.","apropos-button":"Face for buttons that indicate a face in Apropos.","apropos-property":"Face for property name in Apropos output, or nil for none.","apropos-keybinding":"Face for lists of keybinding in Apropos output.","apropos-symbol":"Face for the symbol name in Apropos output.","hl-todo-flymake-type":"Face used for the Flymake diagnostics type ‘hl-todo-flymake’.","hl-todo":"Base face used to highlight TODO and similar keywords.","org-roam-dailies-calendar-note":"Face for dates with a daily-note in the calendar.","org-roam-dim":"Face for the dimmer part of the widgets.","org-roam-preview-region":"Face used by ‘org-roam-highlight-preview-region-using-face’.","org-roam-preview-heading-selection":"Face for selected preview headings.","org-roam-preview-heading-highlight":"Face for current preview headings.","org-roam-preview-heading":"Face for preview headings.","org-roam-olp":"Face for the OLP of the node.","org-roam-title":"Face for Org-roam titles.","org-roam-header-line":"Face for the ‘header-line’ in some Org-roam modes.","malyon-face-reverse":"Face for reverse-video text.","malyon-face-italic":"Italic face for game text.","malyon-face-error":"Face for game errors.","malyon-face-bold":"Bold face for game text.","malyon-face-plain":"Basic face for game text.","twentyfortyeight-face-2048":"Face for the tile 2048.","twentyfortyeight-face-1024":"Face for the tile 1024.","twentyfortyeight-face-512":"Face for the tile 512.","twentyfortyeight-face-256":"Face for the tile 256.","twentyfortyeight-face-128":"Face for the tile 128.","twentyfortyeight-face-64":"Face for the tile 64.","twentyfortyeight-face-32":"Face for the tile 32.","twentyfortyeight-face-16":"Face for the tile 16.","twentyfortyeight-face-8":"Face for the tile 8.","twentyfortyeight-face-4":"Face for the tile 4.","twentyfortyeight-face-2":"Face for the tile 2.","tmr-mode-line-urgent":"Face for timers that will expire in the next 30 seconds.","tmr-mode-line-soon":"Face for timers that will expire in the next 2 minutes.","tmr-mode-line-active":"Face for active timers in the mode-line.","tmr-tabulated-description":"Description of timer in the ‘tmr-tabulated-view’.","tmr-tabulated-acknowledgement":"Acknowledgement indicator in the ‘tmr-tabulated-view’.","tmr-tabulated-paused":"Face for styling the description of a paused timer.","tmr-tabulated-remaining-time":"Remaining time in the ‘tmr-tabulated-view’.","tmr-tabulated-end-time":"End time in the ‘tmr-tabulated-view’.","tmr-tabulated-start-time":"Start time in the ‘tmr-tabulated-view’.","tmr-paused":"Face for styling the description of a paused timer.","tmr-finished":"Face for styling the description of a finished timer.","tmr-must-be-acknowledged":"Face for styling the acknowledgment confirmation.","tmr-is-acknowledged":"Face for styling the acknowledgment confirmation.","tmr-end-time":"Face for styling the start time of a timer.","tmr-start-time":"Face for styling the start time of a timer.","tmr-description":"Face for styling the description of a timer.","tmr-duration":"Face for styling the duration of a timer.","magit-blame-date":"Face used for dates when blaming.","magit-blame-name":"Face used for author and committer names when blaming.","magit-blame-hash":"Face used for commit hashes when blaming.","magit-blame-summary":"Face used for commit summaries when blaming.","magit-blame-heading":"Face used for blame headings by default when blaming.","magit-blame-dimmed":"Face used for the blame margin in some cases when blaming.","magit-blame-margin":"Face used for the blame margin by default when blaming.","magit-blame-highlight":"Face used for highlighting when blaming.","magit-reflog-other":"Face for other commands in reflogs.","magit-reflog-remote":"Face for pull and clone commands in reflogs.","magit-reflog-cherry-pick":"Face for cherry-pick commands in reflogs.","magit-reflog-rebase":"Face for rebase commands in reflogs.","magit-reflog-reset":"Face for reset commands in reflogs.","magit-reflog-checkout":"Face for checkout commands in reflogs.","magit-reflog-merge":"Face for merge, checkout and branch commands in reflogs.","magit-reflog-amend":"Face for amend commands in reflogs.","magit-reflog-commit":"Face for commit commands in reflogs.","magit-bisect-bad":"Face for bad bisect revisions.","magit-bisect-skip":"Face for skipped bisect revisions.","magit-bisect-good":"Face for good bisect revisions.","magit-sequence-exec":"Face used in sequence sections.","magit-sequence-onto":"Face used in sequence sections.","magit-sequence-done":"Face used in sequence sections.","magit-sequence-drop":"Face used in sequence sections.","magit-sequence-head":"Face used in sequence sections.","magit-sequence-part":"Face used in sequence sections.","magit-sequence-stop":"Face used in sequence sections.","magit-sequence-pick":"Face used in sequence sections.","magit-filename":"Face for filenames.","magit-cherry-equivalent":"Face for equivalent cherry commits.","magit-cherry-unmatched":"Face for unmatched cherry commits.","magit-signature-error":"Face for signatures that cannot be checked (e.g., missing key).","magit-signature-revoked":"Face for signatures made by a revoked key.","magit-signature-expired-key":"Face for signatures made by an expired key.","magit-signature-expired":"Face for signatures that have expired.","magit-signature-untrusted":"Face for good untrusted signatures.","magit-signature-bad":"Face for bad signatures.","magit-signature-good":"Face for good signatures.","magit-keyword-squash":"Face for squash! and similar keywords in commit messages.","magit-keyword":"Face for parts of commit messages inside brackets.","magit-refname-pullreq":"Face for pullreq refnames.","magit-refname-wip":"Face for wip refnames.","magit-refname-stash":"Face for stash refnames.","magit-refname":"Face for refnames without a dedicated face.","magit-head":"Face for the symbolic ref ‘HEAD’.","magit-branch-warning":"Face for warning about (missing) branch.","magit-branch-upstream":"Face for upstream branch.","magit-branch-current":"Face for current branch.","magit-branch-local":"Face for local branches.","magit-branch-remote-head":"Face for current branch.","magit-branch-remote":"Face for remote branch head labels shown in log buffer.","magit-tag":"Face for tag labels shown in log buffer.","magit-hash":"Face for the commit object name in the log output.","magit-dimmed":"Face for text that shouldn’t stand out.","magit-header-line-key":"Face for keys in the ‘header-line’.","magit-header-line":"Face for the ‘header-line’ in some Magit modes.","magit-header-line-log-select":"Face for the ‘header-line’ in ‘magit-log-select-mode’.","magit-log-date":"Face for the date part of the log output.","magit-log-author":"Face for the author part of the log output.","magit-log-graph":"Face for the graph part of the log output.","magit-diffstat-removed":"Face for removal indicator in diffstat.","magit-diffstat-added":"Face for addition indicator in diffstat.","magit-diff-whitespace-warning":"Face for highlighting whitespace errors added lines.","magit-diff-context-highlight":"Face for lines in the current context in a diff.","magit-diff-their-highlight":"Face for lines in a diff for their side in a conflict.","magit-diff-base-highlight":"Face for lines in a diff for the base side in a conflict.","magit-diff-our-highlight":"Face for lines in a diff for our side in a conflict.","magit-diff-removed-highlight":"Face for lines in a diff that have been removed.","magit-diff-added-highlight":"Face for lines in a diff that have been added.","magit-diff-context":"Face for lines in a diff that are unchanged.","magit-diff-their":"Face for lines in a diff for their side in a conflict.","magit-diff-base":"Face for lines in a diff for the base side in a conflict.","magit-diff-our":"Face for lines in a diff for our side in a conflict.","magit-diff-removed":"Face for lines in a diff that have been removed.","magit-diff-added":"Face for lines in a diff that have been added.","magit-diff-conflict-heading":"Face for conflict markers.","magit-diff-lines-boundary":"Face for boundary of marked lines in diff hunk.","magit-diff-lines-heading":"Face for diff hunk heading when lines are marked.","magit-diff-revision-summary-highlight":"Face for highlighted commit message summaries.","magit-diff-revision-summary":"Face for commit message summaries.","magit-diff-conflict-heading-highlight":"Face for conflict markers.","magit-diff-hunk-region":"Face used by ‘magit-diff-highlight-hunk-region-using-face’.","magit-diff-hunk-heading-selection":"Face for selected diff hunk headings.","magit-diff-hunk-heading-highlight":"Face for current diff hunk headings.","magit-diff-hunk-heading":"Face for diff hunk headings.","magit-diff-file-heading-selection":"Face for selected diff file headings.","magit-diff-file-heading-highlight":"Face for current diff file headings.","magit-diff-file-heading":"Face for diff file headings.","smerge-refined-added":"Face used for added characters shown by ‘smerge-refine’.","smerge-refined-removed":"Face used for removed characters shown by ‘smerge-refine’.","smerge-refined-changed":"Face used for char-based changes shown by ‘smerge-refine’.","smerge-markers":"Face for the conflict markers.","smerge-base":"Face for the base code.","smerge-lower":"Face for the ‘lower’ version of a conflict.","smerge-upper":"Face for the ‘upper’ version of a conflict.","git-commit-comment-action":"Face used for actions in commit message comments.","git-commit-comment-file":"Face used for file names in commit message comments.","git-commit-comment-heading":"Face used for headings in commit message comments.","git-commit-comment-detached":"Face used for detached ‘HEAD’ in commit message comments.","git-commit-comment-branch-remote":"Face used for names of remote branches in commit message comments.","git-commit-comment-branch-local":"Face used for names of local branches in commit message comments.","git-commit-trailer-value":"Face used for Git trailer values in commit messages.","git-commit-trailer-token":"Face used for Git trailer tokens in commit messages.","git-commit-keyword":"Face used for keywords in commit messages.","git-commit-nonempty-second-line":"Face used for non-whitespace on the second line of commit messages.","git-commit-overlong-summary":"Face used for the tail of overlong commit message summaries.","git-commit-summary":"Face used for the summary in commit messages.","log-edit-unknown-header":"Face for unknown headers in ‘log-edit-mode’ buffers.","log-edit-header":"Face for the headers in ‘log-edit-mode’ buffers.","log-edit-headers-separator":"Face for the separator line in ‘log-edit-mode’ buffers.","log-edit-summary":"Face for the summary in ‘log-edit-mode’ buffers.","change-log-acknowledgment":"Face for highlighting acknowledgments.","change-log-function":"Face for highlighting items of the form ‘<....>’.","change-log-conditionals":"Face for highlighting conditionals of the form ‘[...]’.","change-log-list":"Face for highlighting parenthesized lists of functions or variables.","change-log-file":"Face for highlighting file names.","change-log-email":"Face for highlighting author email addresses.","change-log-name":"Face for highlighting author names.","change-log-date":"Face used to highlight dates in date lines.","magit-mode-line-process-error":"Face for ‘mode-line-process’ error status.","magit-mode-line-process":"Face for ‘mode-line-process’ status when Git is running for side-effects.","magit-process-ng":"Face for non-zero exit-status.","magit-process-ok":"Face for zero exit-status.","which-func":"Face used to highlight mode line function names.","magit-left-margin":"Face used for the left margin.","magit-section-child-count":"Face used for child counts at the end of some section headings.","magit-section-heading-selection":"Face for selected section headings.","magit-section-secondary-heading":"Face for section headings of some secondary headings.","magit-section-heading":"Face for section headings.","magit-section-highlight":"Face for highlighting the current section.","llama-deleted-argument":"Face used for deleted arguments ‘_%1’...‘_%9’, ‘_&1’...‘_&9’ and ‘_&*’.","llama-optional-argument":"Face used for optional arguments ‘&1’ through ‘&9’, ‘&’ and ‘&*’.","llama-mandatory-argument":"Face used for mandatory arguments ‘%1’ through ‘%9’ and ‘%’.","llama-llama-macro":"Face used for the name of the ‘llama’ macro.","llama-##-macro":"Face used for the name of the ‘##’ macro.","table-cell":"Face used for table cell contents.","which-key-docstring-face":"Face for docstrings.","which-key-special-key-face":"Face for special keys (SPC, TAB, RET).","which-key-group-description-face":"Face for the key description when it is a group or prefix.","which-key-highlighted-command-face":"Default face for highlighted command descriptions.","which-key-local-map-description-face":"Face for the key description when it is found in ‘current-local-map’.","which-key-command-description-face":"Face for the key description when it is a command.","which-key-note-face":"Face for notes or hints occasionally provided.","which-key-separator-face":"Face for the separator (default separator is an arrow).","which-key-key-face":"Face for which-key keys.","org-superstar-first":"Face used to display the first bullet of an inline task.","org-superstar-ordered-item":"Face used to display ordered list item bullets.","org-superstar-item":"Face used to display prettified item bullets.","org-superstar-header-bullet":"Face containing distinguishing features headline bullets.","org-superstar-leading":"Face used to display prettified leading stars in a headline.","org-indent":"Face for outline indentation.","company-box-numbers":"company-box-numbers is an alias for the face `company-tooltip'.","company-box-scrollbar":"Face used for the scrollbar.","company-box-background":"company-box-background is an alias for the face `company-tooltip'.","company-box-selection":"company-box-selection is an alias for the face `company-tooltip-selection'.","company-box-annotation":"company-box-annotation is an alias for the face `company-tooltip-annotation'.","company-box-candidate":"company-box-candidate is an alias for the face `company-tooltip'.","makefile-makepp-perl":"Face to use for additionally highlighting Perl code in Font-Lock mode.","makefile-shell":"Face to use for additionally highlighting Shell commands in Font-Lock mode.","makefile-targets":"Face to use for additionally highlighting rule targets in Font-Lock mode.","makefile-space":"Face to use for highlighting leading spaces in Font-Lock mode.","grep-heading":"Face of headings when ‘grep-use-headings’ is non-nil.","ibuffer-locked-buffer":"Face used for locked buffers in Ibuffer.","org-drill-hidden-cloze-face":"The face used to hide the contents of cloze phrases.","org-drill-visible-cloze-hint-face":"The face used to hide the contents of cloze phrases.","org-drill-visible-cloze-face":"The face used to hide the contents of cloze phrases.","alert-trivial-face":"Trivial alert face.","alert-low-face":"Low alert face.","alert-normal-face":"Normal alert face.","alert-moderate-face":"Moderate alert face.","alert-high-face":"High alert face.","alert-urgent-face":"Urgent alert face.","org-faces-priority-d-dim":"Dimmed [#D] priority cookie for non-selected windows.","org-faces-priority-c-dim":"Dimmed [#C] priority cookie for non-selected windows.","org-faces-priority-b-dim":"Dimmed [#B] priority cookie for non-selected windows.","org-faces-priority-a-dim":"Dimmed [#A] priority cookie for non-selected windows.","org-faces-cancelled-dim":"Dimmed CANCELLED keyword for non-selected windows.","org-faces-done-dim":"Dimmed DONE keyword for non-selected windows.","org-faces-failed-dim":"Dimmed FAILED keyword for non-selected windows.","org-faces-delegated-dim":"Dimmed DELEGATED keyword for non-selected windows.","org-faces-stalled-dim":"Dimmed STALLED keyword for non-selected windows.","org-faces-verify-dim":"Dimmed VERIFY keyword for non-selected windows.","org-faces-waiting-dim":"Dimmed WAITING keyword for non-selected windows.","org-faces-doing-dim":"Dimmed DOING keyword for non-selected windows.","org-faces-project-dim":"Dimmed PROJECT keyword for non-selected windows.","org-faces-todo-dim":"Dimmed TODO keyword for non-selected windows.","org-faces-priority-d":"Face for the [#D] priority cookie.","org-faces-priority-c":"Face for the [#C] priority cookie.","org-faces-priority-b":"Face for the [#B] priority cookie.","org-faces-priority-a":"Face for the [#A] priority cookie.","org-faces-cancelled":"Face for the CANCELLED keyword.","org-faces-done":"Face for the DONE keyword.","org-faces-failed":"Face for the FAILED keyword.","org-faces-delegated":"Face for the DELEGATED keyword.","org-faces-stalled":"Face for the STALLED keyword.","org-faces-verify":"Face for the VERIFY keyword.","org-faces-waiting":"Face for the WAITING keyword.","org-faces-doing":"Face for the DOING keyword.","org-faces-project":"Face for the PROJECT keyword.","org-faces-todo":"Face for the TODO keyword.","eww-valid-certificate":"Face for web pages with valid certificates.","eww-invalid-certificate":"Face for web pages with invalid certificates.","eww-form-textarea":"Face for eww textarea inputs.","eww-form-text":"Face for eww text inputs.","eww-form-select":"Face for eww buffer buttons.","eww-form-checkbox":"Face for eww buffer buttons.","eww-form-file":"Face for eww buffer buttons.","eww-form-submit":"Face for eww buffer buttons.","gnus-header-content":"Face used for displaying header content.","gnus-header-name":"Face used for displaying header names.","gnus-header-newsgroups":"Face used for displaying newsgroups headers.","gnus-header-subject":"Face used for displaying subject headers.","gnus-header-from":"Face used for displaying from headers.","gnus-header":"Base face used for all Gnus header faces.","gnus-signature":"Face used for highlighting a signature in the article buffer.","gnus-button":"Face used for highlighting a button in the article buffer.","gnus-emphasis-highlight-words":"Face used for displaying highlighted words.","gnus-emphasis-strikethru":"Face used for displaying strike-through text (-word-).","gnus-emphasis-underline-bold-italic":"Face used for displaying underlined bold italic emphasized text.","gnus-emphasis-bold-italic":"Face used for displaying bold italic emphasized text (/*word*/).","gnus-emphasis-underline-italic":"Face used for displaying underlined italic emphasized text (_/word/_).","gnus-emphasis-underline-bold":"Face used for displaying underlined bold emphasized text (_*word*_).","gnus-emphasis-underline":"Face used for displaying underlined emphasized text (_word_).","gnus-emphasis-italic":"Face used for displaying italic emphasized text (/word/).","gnus-emphasis-bold":"Face used for displaying strong emphasized text (*word*).","mm-uu-extract":"Face for extracted buffers.","shr-sliced-image":"Face used for sliced images.","shr-mark":"Face used for <mark> elements.","shr-code":"Face used for rendering <code> blocks.","shr-h6":"Face for <h6> elements.","shr-h5":"Face for <h5> elements.","shr-h4":"Face for <h4> elements.","shr-h3":"Face for <h3> elements.","shr-h2":"Face for <h2> elements.","shr-h1":"Face for <h1> elements.","shr-sup":"Face for <sup> and <sub> elements.","shr-abbreviation":"Face for <abbr> elements.","shr-selected-link":"Temporary face for externally visited link elements.","shr-link":"Face for link elements.","shr-strike-through":"Face for <s> elements.","shr-text":"Face used for rendering text.","message-signature-separator":"Face used for displaying the signature separator.","message-mml":"Face used for displaying MML.","message-cited-text-4":"Face used for displaying 4th-level cited text.","message-cited-text-3":"Face used for displaying 3rd-level cited text.","message-cited-text-2":"Face used for displaying 2nd-level cited text.","message-cited-text-1":"Face used for displaying 1st-level cited text.","message-separator":"Face used for displaying the separator.","message-header-xheader":"Face used for displaying X-Header headers.","message-header-name":"Face used for displaying header names.","message-header-other":"Face used for displaying other headers.","message-header-newsgroups":"Face used for displaying Newsgroups headers.","message-header-subject":"Face used for displaying Subject headers.","message-header-cc":"Face used for displaying Cc headers.","message-header-to":"Face used for displaying To headers.","gnus-splash":"Face for the splash screen.","gnus-summary-low-read":"Face used for low interest read articles.","gnus-summary-high-read":"Face used for high interest read articles.","gnus-summary-normal-read":"Face used for normal interest read articles.","gnus-summary-low-unread":"Face used for low interest unread articles.","gnus-summary-high-unread":"Face used for high interest unread articles.","gnus-summary-normal-unread":"Face used for normal interest unread articles.","gnus-summary-low-undownloaded":"Face used for low interest uncached articles.","gnus-summary-high-undownloaded":"Face used for high interest uncached articles.","gnus-summary-normal-undownloaded":"Face used for normal interest uncached articles.","gnus-summary-low-ancient":"Face used for low interest ancient articles.","gnus-summary-high-ancient":"Face used for high interest ancient articles.","gnus-summary-normal-ancient":"Face used for normal interest ancient articles.","gnus-summary-low-ticked":"Face used for low interest ticked articles.","gnus-summary-high-ticked":"Face used for high interest ticked articles.","gnus-summary-normal-ticked":"Face used for normal interest ticked articles.","gnus-summary-cancelled":"Face used for canceled articles.","gnus-summary-selected":"Face used for selected articles.","gnus-group-mail-low":"Low level mailgroup face.","gnus-group-mail-low-empty":"Low level empty mailgroup face.","gnus-group-mail-3":"Level 3 mailgroup face.","gnus-group-mail-3-empty":"Level 3 empty mailgroup face.","gnus-group-mail-2":"Level 2 mailgroup face.","gnus-group-mail-2-empty":"Level 2 empty mailgroup face.","gnus-group-mail-1":"Level 1 mailgroup face.","gnus-group-mail-1-empty":"Level 1 empty mailgroup face.","gnus-group-news-low":"Low level newsgroup face.","gnus-group-news-low-empty":"Low level empty newsgroup face.","gnus-group-news-6":"Level 6 newsgroup face.","gnus-group-news-6-empty":"Level 6 empty newsgroup face.","gnus-group-news-5":"Level 5 newsgroup face.","gnus-group-news-5-empty":"Level 5 empty newsgroup face.","gnus-group-news-4":"Level 4 newsgroup face.","gnus-group-news-4-empty":"Level 4 empty newsgroup face.","gnus-group-news-3":"Level 3 newsgroup face.","gnus-group-news-3-empty":"Level 3 empty newsgroup face.","gnus-group-news-2":"Level 2 newsgroup face.","gnus-group-news-2-empty":"Level 2 empty newsgroup face.","gnus-group-news-1":"Level 1 newsgroup face.","gnus-group-news-1-empty":"Level 1 empty newsgroup face.","doc-view-svg-face":"Face used for SVG images.","sh-escaped-newline":"Face used for (non-escaped) backslash at end of a line in Shell-script mode.","sh-quoted-exec":"Face to show quoted execs like `blabla`.","sh-heredoc":"Face to show a here-document.","org-mode-line-clock-overrun":"Face used for clock display for overrun tasks in mode line.","org-mode-line-clock":"Face used for clock display in mode line.","org-tag-group":"Face for group tags.","org-macro":"Face for macros.","org-latex-and-related":"Face used to highlight LaTeX data, entities and sub/superscript.","org-agenda-calendar-sexp":"Face used to show events computed from a S-expression.","org-agenda-calendar-event":"Face used to show events and appointments in the agenda.","org-agenda-calendar-daterange":"Face used to show entries with a date range in the agenda.","org-agenda-diary":"Face used for agenda entries that come from the Emacs diary.","org-agenda-current-time":"Face used to show the current time in the time grid.","org-time-grid":"Face used for time grids.","org-agenda-filter-regexp":"Face for regexp(s) in the mode-line when filtering the agenda.","org-agenda-filter-effort":"Face for effort in the mode-line when filtering the agenda.","org-agenda-filter-category":"Face for categories in the mode-line when filtering the agenda.","org-agenda-filter-tags":"Face for tag(s) in the mode-line when filtering the agenda.","org-agenda-restriction-lock":"Face for showing the agenda restriction lock.","org-upcoming-distant-deadline":"Face for items scheduled previously, not done, and have a distant deadline.","org-upcoming-deadline":"Face for items scheduled previously, and not yet done.","org-imminent-deadline":"Face for current deadlines in the agenda.","org-scheduled-previously":"Face for items scheduled previously, and not yet done.","org-agenda-dimmed-todo-face":"Face used to dim blocked tasks in the agenda.","org-scheduled-today":"Face for items scheduled for a certain day.","org-scheduled":"Face for items scheduled for a certain day.","org-agenda-date-weekend":"Face used in agenda for weekend days.","org-agenda-clocking":"Face marking the current clock item in the agenda.","org-agenda-date-weekend-today":"Face used in agenda for today during weekends.","org-agenda-date-today":"Face used in agenda for today.","org-agenda-date":"Face used in agenda for normal days.","org-agenda-structure-filter":"Face used for the current type of task filter in the agenda.","org-agenda-structure-secondary":"Face used for secondary information in agenda block headers.","org-agenda-structure":"Face used in agenda for captions and dates.","org-clock-overlay":"Basic face for displaying the secondary selection.","org-verse":"Face for #+BEGIN_VERSE ... #+END_VERSE blocks.","org-quote":"Face for #+BEGIN_QUOTE ... #+END_QUOTE blocks.","org-verbatim":"Face for fixed-with text like code snippets.","org-inline-src-block":"Face used for inline source blocks as a whole.","org-block-end-line":"Face used for the line delimiting the end of source blocks.","org-block-begin-line":"Face used for the line delimiting the begin of source blocks.","org-block":"Face used for text inside various blocks.","org-document-info-keyword":"Face for document information keywords.","org-document-info":"Face for document information such as the author and date.","org-document-title":"Face for document title, i.e. that which follows the #+TITLE: keyword.","org-meta-line":"Face for meta lines starting with \"#+\".","org-code":"Face for fixed-width text like code snippets.","org-formula":"Face for formulas.","org-table-header":"Face for table header.","org-table-row":"Face used to fontify whole table rows (including newlines and indentation).","org-table":"Face used for tables.","org-checkbox-statistics-done":"Face used for finished checkbox statistics.","org-checkbox-statistics-todo":"Face used for unfinished checkbox statistics.","org-checkbox":"Face for checkboxes.","org-priority":"Face used for priority cookies.","org-headline-done":"Face used to indicate that a headline is DONE.","org-headline-todo":"Face used to indicate that a headline is marked as TODO.","org-agenda-done":"Face used in agenda, to indicate lines switched to DONE.","org-done":"Face used for todo keywords that indicate DONE items.","org-todo":"Face for TODO keywords.","org-list-dt":"Default face for definition terms in lists.","org-tag":"Default face for tags.","org-sexp-date":"Face for diary-like sexp date specifications.","org-date-selected":"Face for highlighting the calendar day when using ‘org-read-date’.","org-date":"Face for date/time stamps.","org-target":"Face for link targets.","org-ellipsis":"Face for the ellipsis in folded text.","org-footnote":"Face for footnotes.","org-link":"Face for links.","org-cite-key":"Face for citation keys.","org-cite":"Face for citations.","org-archived":"Face for headline with the ARCHIVE tag.","org-warning":"Face for deadlines and TODO keywords.","org-agenda-column-dateline":"Face used in agenda column view for datelines with summaries.","org-column-title":"Face for column display of entry properties.","org-column":"Face for column display of entry properties.","org-property-value":"Face used for the value of a property.","org-drawer":"Face used for drawers.","org-special-keyword":"Face used for special keywords.","org-level-8":"Face used for level 8 headlines.","org-level-7":"Face used for level 7 headlines.","org-level-6":"Face used for level 6 headlines.","org-level-5":"Face used for level 5 headlines.","org-level-4":"Face used for level 4 headlines.","org-level-3":"Face used for level 3 headlines.","org-level-2":"Face used for level 2 headlines.","org-level-1":"Face used for level 1 headlines.","org-dispatcher-highlight":"Face for highlighted keys in the dispatcher.","org-hide":"Face used to hide leading stars in headlines.","org-default":"Face used for default text.","calendar-month-header":"Face used for month headers in the calendar.","calendar-weekend-header":"Face used for weekend column headers in the calendar.","calendar-weekday-header":"Face used for weekday column headers in the calendar.","holiday":"Face for indicating in the calendar dates that have holidays.","diary":"Face for highlighting diary entries.","calendar-today":"Face for indicating today’s date in the calendar.","lsp-inlay-hint-parameter-face":"Face for inlay parameter hints (e.g. function parameter names at","lsp-inlay-hint-type-face":"Face for inlay type hints (e.g. inferred variable types).","lsp-inlay-hint-face":"The face to use for the JavaScript inlays.","lsp-installation-buffer-face":"Face used for installation buffers still in progress.","lsp-installation-finished-buffer-face":"Face used for finished installation buffers.","lsp-signature-face":"Used to display signatures in ‘imenu’, ....","lsp-details-face":"Used to display additional information throughout ‘lsp’.","lsp-rename-placeholder-face":"Face used to display the rename placeholder in.","lsp-face-rename":"Face used to highlight the identifier being renamed.","lsp-signature-highlight-function-argument":"The face to use to highlight function arguments in signatures.","lsp-signature-posframe":"Background and foreground for ‘lsp-signature-posframe’.","lsp-face-highlight-write":"Face used for highlighting symbols being written to.","lsp-face-highlight-read":"Face used for highlighting symbols being read.","lsp-face-highlight-textual":"Face used for textual occurrences of symbols.","diff-refine-added":"Face used for added characters shown by ‘diff-refine-hunk’.","diff-refine-removed":"Face used for removed characters shown by ‘diff-refine-hunk’.","diff-refine-changed":"Face used for char-based changes shown by ‘diff-refine-hunk’.","diff-error":"‘diff-mode’ face for error messages from diff.","diff-nonexistent":"‘diff-mode’ face used to highlight nonexistent files in recursive diffs.","diff-context":"‘diff-mode’ face used to highlight context and other side-information.","diff-function":"‘diff-mode’ face used to highlight function names produced by \"diff -p\".","diff-indicator-changed":"‘diff-mode’ face used to highlight indicator of changed lines.","diff-indicator-added":"‘diff-mode’ face used to highlight indicator of added lines (+, >).","diff-indicator-removed":"‘diff-mode’ face used to highlight indicator of removed lines (-, <).","diff-changed":"‘diff-mode’ face used to highlight changed lines.","diff-changed-unspecified":"‘diff-mode’ face used to highlight changed lines.","diff-added":"‘diff-mode’ face used to highlight added lines.","diff-removed":"‘diff-mode’ face used to highlight removed lines.","diff-hunk-header":"‘diff-mode’ face used to highlight hunk header lines.","diff-index":"‘diff-mode’ face used to highlight index header lines.","diff-file-header":"‘diff-mode’ face used to highlight file header lines.","diff-header":"‘diff-mode’ face inherited by hunk and index header faces.","vc-git-log-edit-summary-max-warning":"Face for Git commit summary lines beyond the maximum length.","vc-git-log-edit-summary-target-warning":"Face for Git commit summary lines beyond the target length.","xref-match":"Face used to highlight matches in the xref buffer.","xref-line-number":"Face for displaying line numbers in the xref buffer.","xref-file-header":"Face used to highlight file header in the xref buffer.","edit-indirect-edited-region":"Face used to highlight an indirectly edited region.","markdown-header-face-6":"Face for level 6 headers.","markdown-header-face-5":"Face for level 5 headers.","markdown-header-face-4":"Face for level 4 headers.","markdown-header-face-3":"Face for level 3 headers.","markdown-header-face-2":"Face for level 2 headers.","markdown-header-face-1":"Face for level 1 headers.","markdown-header-face":"Base face for headers.","markdown-highlighting-face":"Face for highlighting.","markdown-html-entity-face":"Face for HTML entities.","markdown-html-attr-value-face":"Face for HTML attribute values.","markdown-html-attr-name-face":"Face for HTML attribute names.","markdown-html-tag-delimiter-face":"Face for HTML tag delimiters.","markdown-html-tag-name-face":"Face for HTML tag names.","markdown-hr-face":"Face for horizontal rules.","markdown-highlight-face":"Face for mouse highlighting.","markdown-gfm-checkbox-face":"Face for GFM checkboxes.","markdown-metadata-value-face":"Face for metadata values.","markdown-metadata-key-face":"Face for metadata keys.","markdown-math-face":"Face for LaTeX expressions.","markdown-comment-face":"Face for HTML comments.","markdown-line-break-face":"Face for hard line breaks.","markdown-link-title-face":"Face for reference link titles.","markdown-plain-url-face":"Face for URLs that are also links.","markdown-url-face":"Face for URLs that are part of markup.","markdown-footnote-text-face":"Face for footnote text.","markdown-footnote-marker-face":"Face for footnote markers.","markdown-reference-face":"Face for link references.","markdown-missing-link-face":"Face for the link text if the link points to a missing file.","markdown-link-face":"Face for link text, ie the alias portion of a link.","markdown-language-info-face":"Face for programming language info strings.","markdown-language-keyword-face":"Face for programming language identifiers.","markdown-table-face":"Face for tables.","markdown-pre-face":"Face for preformatted text.","markdown-inline-code-face":"Face for inline code.","markdown-code-face":"Face for inline code, pre blocks, and fenced code blocks.","markdown-blockquote-face":"Face for blockquote sections.","markdown-list-face":"Face for list item markers.","markdown-header-delimiter-face":"Base face for headers hash delimiter.","markdown-header-rule-face":"Base face for headers rules.","markdown-markup-face":"Face for markup elements.","markdown-strike-through-face":"Face for strike-through text.","markdown-bold-face":"Face for bold text.","markdown-italic-face":"Face for italic text.","outline-8":"Level 8.","outline-7":"Level 7.","outline-6":"Level 6.","outline-5":"Level 5.","outline-4":"Level 4.","outline-3":"Level 3.","outline-2":"Level 2.","outline-1":"Level 1.","lv-separator":"Face used to draw line between the lv window and the echo area.","compilation-column-number":"Face for displaying column numbers in compiler messages.","compilation-line-number":"Face for displaying line numbers in compiler messages.","compilation-mode-line-exit":"Face for Compilation mode’s \"exit\" mode line indicator.","compilation-mode-line-run":"Face for Compilation mode’s \"running\" mode line indicator.","compilation-mode-line-fail":"Face for Compilation mode’s \"error\" mode line indicator.","compilation-info":"Face used to highlight compiler information.","compilation-warning":"Face used to highlight compiler warnings.","compilation-error":"Face used to highlight compiler errors.","breakpoint-disabled":"Face for disabled breakpoint icon in fringe.","breakpoint-enabled":"Face for enabled breakpoint icon in fringe.","gud-highlight-current-line-face":"Face for highlighting the source code line being executed.","ert-test-result-unexpected":"Face used for unexpected results in the ERT results buffer.","ert-test-result-expected":"Face used for expected results in the ERT results buffer.","yas--field-debug-face":"The face used for debugging some overlays normally hidden","yas-field-highlight-face":"The face used to highlight the currently active field of a snippet","treesit-explorer-field-name":"Face for field names in tree-sitter explorer.","treesit-explorer-anonymous-node":"Face for anonymous nodes in tree-sitter explorer.","dirvish-vc-needs-update-state":"Face used for ‘needs-update’ vc state in the Dirvish buffer.","dirvish-vc-locked-state":"Face used for ‘locked’ vc state in the Dirvish buffer.","dirvish-vc-conflict-state":"Face used for ‘conflict’ vc state in the Dirvish buffer.","dirvish-vc-missing-state":"Face used for ‘missing’ vc state in the Dirvish buffer.","dirvish-vc-removed-state":"Face used for ‘removed’ vc state in the Dirvish buffer.","dirvish-vc-added-state":"Face used for ‘added’ vc state in the Dirvish buffer.","dirvish-vc-edited-state":"Face used for ‘edited’ vc state in the Dirvish buffer.","dirvish-git-commit-message-face":"Face for commit message overlays.","dirvish-vc-unregistered-face":"Face used for ‘unregistered’ vc state in the Dirvish buffer.","dirvish-vc-needs-merge-face":"Face used for ‘needs-merge’ vc state in the Dirvish buffer.","shell-highlight-undef-alias-face":"Face used for shell command aliases.","shell-highlight-undef-undefined-face":"Face used for non-existent shell commands.","shell-highlight-undef-defined-face":"Face used for existing shell commands.","dirvish-collapse-file-face":"Face used for files in ‘collapse’ attribute.","dirvish-collapse-empty-dir-face":"Face used for empty directories in ‘collapse’ attribute.","dirvish-collapse-dir-face":"Face used for directories in ‘collapse’ attribute.","dirvish-narrow-split":"Face used to highlight punctuation character.","dirvish-narrow-match-face-3":"Face for matches of components numbered 3 mod 4.","dirvish-narrow-match-face-2":"Face for matches of components numbered 2 mod 4.","dirvish-narrow-match-face-1":"Face for matches of components numbered 1 mod 4.","dirvish-narrow-match-face-0":"Face for matches of components numbered 0 mod 4.","dirvish-subtree-guide":"Face used for ‘expanded-state’ attribute.","dirvish-subtree-state":"Face used for ‘expanded-state’ attribute.","dirvish-emerge-group-title":"Face used for emerge group title.","dirvish-proc-failed":"Face used if asynchronous process has failed.","dirvish-proc-finished":"Face used if asynchronous process has finished.","dirvish-proc-running":"Face used if asynchronous process is running.","dirvish-inactive":"Face used for mode-line segments in unfocused Dirvish windows.","dirvish-hl-line-inactive":"Face used for Dirvish line highlighting in unfocused Dirvish windows.","dirvish-hl-line":"Face used for Dirvish line highlighting in focused Dirvish window.","dashboard-footer-icon-face":"Face used for icon in footer.","dashboard-footer-face":"Face used for footer text.","dashboard-no-items-face":"Face used for no items.","dashboard-items-face":"Face used for items.","dashboard-heading":"Face used for widget headings.","dashboard-navigator":"Face used for the navigator.","dashboard-banner-logo-title":"Face used for the banner title.","dashboard-text-banner":"Face used for text banners.","rectangle-preview":"The face to use for the ‘string-rectangle’ preview.","transient-mismatched-key":"Face optionally used to highlight keys without a short-argument.","transient-nonstandard-key":"Face optionally used to highlight keys conflicting with short-argument.","transient-unreachable-key":"Face used for keys unreachable from the current prefix sequence.","transient-key-exit":"Face used for keys of suffixes that exit the menu.","transient-key-stack":"Face used for keys of sub-menus that exit the parent menu.","transient-key-recurse":"Face used for keys of sub-menus whose suffixes return to the parent menu.","transient-key-return":"Face used for keys of suffixes that return to the parent menu.","transient-key-noop":"Face used for keys of suffixes that currently cannot be invoked.","transient-key-stay":"Face used for keys of suffixes that don’t exit the menu.","transient-key":"Face used for keys.","transient-delimiter":"Face used for delimiters and separators.","transient-higher-level":"Face optionally used to highlight suffixes on higher levels.","transient-disabled-suffix":"Face used for disabled levels while editing suffix levels.","transient-enabled-suffix":"Face used for enabled levels while editing suffix levels.","transient-active-infix":"Face used for the infix for which the value is being read.","transient-inapt-suffix":"Face used for suffixes that are inapt at this time.","transient-unreachable":"Face used for suffixes unreachable from the current prefix sequence.","transient-inactive-value":"Face used for inactive values.","transient-value":"Face used for values.","transient-inapt-argument":"Face used for inapt arguments with a (currently ignored) value.","transient-inactive-argument":"Face used for inactive arguments.","transient-argument":"Face used for enabled arguments.","transient-heading":"Face used for headings.","image-dired-thumb-flagged":"Face for images flagged for deletion in thumbnail buffer.","image-dired-thumb-mark":"Face for marked images in thumbnail buffer.","image-dired-thumb-header-image-count":"Face for the image count in the header line of the thumbnail buffer.","image-dired-thumb-header-file-size":"Face for the file size in the header line of the thumbnail buffer.","image-dired-thumb-header-directory-name":"Face for the directory name in the header line of the thumbnail buffer.","image-dired-thumb-header-file-name":"Face for the file name in the header line of the thumbnail buffer.","erc-keyword-face":"ERC face for your keywords.","erc-fool-face":"ERC face for fools on the channel.","erc-pal-face":"ERC face for your pals.","erc-dangerous-host-face":"ERC face for people on dangerous hosts.","erc-current-nick-face":"ERC face for occurrences of your current nickname.","bg:erc-color-face15":"ERC face.","bg:erc-color-face14":"ERC face.","bg:erc-color-face13":"ERC face.","bg:erc-color-face12":"ERC face.","bg:erc-color-face11":"ERC face.","bg:erc-color-face10":"ERC face.","bg:erc-color-face9":"ERC face.","bg:erc-color-face8":"ERC face.","bg:erc-color-face7":"ERC face.","bg:erc-color-face6":"ERC face.","bg:erc-color-face5":"ERC face.","bg:erc-color-face4":"ERC face.","bg:erc-color-face3":"ERC face.","bg:erc-color-face2":"ERC face.","bg:erc-color-face1":"ERC face.","bg:erc-color-face0":"ERC face.","fg:erc-color-face15":"ERC face.","fg:erc-color-face14":"ERC face.","fg:erc-color-face13":"ERC face.","fg:erc-color-face12":"ERC face.","fg:erc-color-face11":"ERC face.","fg:erc-color-face10":"ERC face.","fg:erc-color-face9":"ERC face.","fg:erc-color-face8":"ERC face.","fg:erc-color-face7":"ERC face.","fg:erc-color-face6":"ERC face.","fg:erc-color-face5":"ERC face.","fg:erc-color-face4":"ERC face.","fg:erc-color-face3":"ERC face.","fg:erc-color-face2":"ERC face.","fg:erc-color-face1":"ERC face.","fg:erc-color-face0":"ERC face.","erc-underline-face":"ERC underline face.","erc-spoiler-face":"ERC spoiler face.","erc-inverse-face":"ERC inverse face.","erc-italic-face":"ERC italic face.","erc-bold-face":"ERC bold face.","erc-command-indicator-face":"Face for echoed command lines, including the prompt.","erc-keep-place-indicator-arrow":"Face for arrow value of option ‘erc-keep-place-indicator-style’.","erc-keep-place-indicator-line":"Face for option ‘erc-keep-place-indicator-style’.","comint-highlight-prompt":"Face to use to highlight prompts.","comint-highlight-input":"Face to use to highlight user input.","ansi-color-bright-white":"Face used to render bright white color code.","ansi-color-bright-cyan":"Face used to render bright cyan color code.","ansi-color-bright-magenta":"Face used to render bright magenta color code.","ansi-color-bright-blue":"Face used to render bright blue color code.","ansi-color-bright-yellow":"Face used to render bright yellow color code.","ansi-color-bright-green":"Face used to render bright green color code.","ansi-color-bright-red":"Face used to render bright red color code.","ansi-color-bright-black":"Face used to render bright black color code.","ansi-color-white":"Face used to render white color code.","ansi-color-cyan":"Face used to render cyan color code.","ansi-color-magenta":"Face used to render magenta color code.","ansi-color-blue":"Face used to render blue color code.","ansi-color-yellow":"Face used to render yellow color code.","ansi-color-green":"Face used to render green color code.","ansi-color-red":"Face used to render red color code.","ansi-color-black":"Face used to render black color code.","ansi-color-inverse":"Face used to render inverted video text.","ansi-color-fast-blink":"Face used to render rapidly blinking text.","ansi-color-slow-blink":"Face used to render slowly blinking text.","ansi-color-underline":"Face used to render underlined text.","ansi-color-italic":"Face used to render italic text.","ansi-color-faint":"Face used to render faint text.","ansi-color-bold":"Face used to render bold text.","erc-button-nick-default-face":"Default face for a buttonized nickname.","erc-button":"ERC button face.","erc-fill-wrap-merge-indicator-face":"ERC ‘fill-wrap’ merge-indicator face.","erc-timestamp-face":"ERC timestamp face.","erc-nick-msg-face":"ERC nickname face for private messages.","erc-nick-default-face":"ERC nickname default face.","erc-my-nick-face":"ERC face for your current nickname in messages sent by you.","erc-information":"Face for local administrative messages of low to moderate importance.","erc-error-face":"ERC face for errors.","erc-action-face":"ERC face for actions generated by /ME.","erc-notice-face":"ERC face for notices.","erc-prompt-face":"ERC face for the prompt.","erc-input-face":"ERC face used for your input.","erc-header-line":"ERC face used for the header line.","erc-direct-msg-face":"ERC face used for messages you receive in the main erc buffer.","erc-my-nick-prefix-face":"ERC face used for my user mode prefix.","erc-nick-prefix-face":"ERC face used for user mode prefix.","erc-default-face":"ERC default face.","prescient-secondary-highlight":"Additional face used to highlight parts of candidates.","prescient-primary-highlight":"Face used to highlight the parts of candidates that match the input.","company-echo-common":"Face used for the common part of completions in the echo area.","company-echo":"Face used for completions in the echo area.","company-preview-search":"Face used for the search string in the completion preview.","company-preview-common":"Face used for the common part of the completion preview.","company-preview":"Face used for the completion preview.","company-tooltip-scrollbar-track":"Face used for the tooltip scrollbar track (trough).","company-tooltip-scrollbar-thumb":"Face used for the tooltip scrollbar thumb (bar).","company-tooltip-quick-access-selection":"Face used for the selected quick-access hints shown in the tooltip.","company-tooltip-quick-access":"Face used for the quick-access hints shown in the tooltip.","company-tooltip-annotation-selection":"Face used for the selected completion annotation in the tooltip.","company-tooltip-annotation":"Face used for the completion annotation in the tooltip.","company-tooltip-common-selection":"Face used for the selected common completion in the tooltip.","company-tooltip-common":"Face used for the common completion in the tooltip.","company-tooltip-mouse":"Face used for the tooltip item under the mouse.","company-tooltip-search-selection":"Face used for the search string inside the selection in the tooltip.","company-tooltip-search":"Face used for the search string in the tooltip.","company-tooltip-deprecated":"Face used for the deprecated items.","company-tooltip-selection":"Face used for the selection in the tooltip.","company-tooltip":"Face used for the tooltip.","embark-selected":"Face for selected candidates.","embark-collect-annotation":"Face for annotations in Embark Collect.","embark-collect-group-separator":"Face for group titles in Embark Collect buffers.","embark-collect-group-title":"Face for group titles in Embark Collect buffers.","embark-collect-candidate":"Face for candidates in Embark Collect buffers.","embark-verbose-indicator-shadowed":"Face used by the verbose action indicator for the shadowed targets.","embark-verbose-indicator-title":"Face used by the verbose action indicator for the title.","embark-verbose-indicator-documentation":"Face used by the verbose action indicator to display binding descriptions.","embark-target":"Face used to highlight the target at point during ‘embark-act’.","embark-keymap":"Face used to display keymaps.","embark-keybinding":"Face used to display key bindings.","embark-keybinding-repeat":"Face used to indicate keybindings as repeatable.","ffap":"Face used to highlight the current buffer substring.","orderless-match-face-3":"Face for matches of components numbered 3 mod 4.","orderless-match-face-2":"Face for matches of components numbered 2 mod 4.","orderless-match-face-1":"Face for matches of components numbered 1 mod 4.","orderless-match-face-0":"Face for matches of components numbered 0 mod 4.","consult-line-number-wrapped":"Face used to highlight line number prefixes after wrap around.","consult-line-number-prefix":"Face used to highlight line number prefixes.","consult-buffer":"Face used to highlight buffers in ‘consult-buffer’.","consult-bookmark":"Face used to highlight bookmarks in ‘consult-buffer’.","consult-grep-context":"Face used to highlight grep context in ‘consult-grep’.","consult-file":"Face used to highlight files in ‘consult-buffer’.","consult-line-number":"Face used to highlight location line in ‘consult-global-mark’.","consult-key":"Face used to highlight keys, e.g., in ‘consult-register’.","consult-help":"Face used to highlight help, e.g., in ‘consult-register-store’.","consult-async-option":"Face used to highlight asynchronous command options.","consult-async-split":"Face used to highlight punctuation character.","consult-async-failed":"Face used if asynchronous process has failed.","consult-async-finished":"Face used if asynchronous process has finished.","consult-async-running":"Face used if asynchronous process is running.","consult-narrow-indicator":"Face used for the narrowing indicator.","consult-preview-insertion":"Face used for previews of text to be inserted.","consult-preview-match":"Face used for match previews, e.g., in ‘consult-line’.","consult-highlight-mark":"Face used for mark positions in completion candidates.","consult-highlight-match":"Face used to highlight matches in the completion candidates.","consult-preview-line":"Face used for line previews.","nerd-icons-completion-dir-face":"Face for the directory icon.","marginalia-file-priv-rare":"Face used to highlight a rare file privilege attribute.","marginalia-file-priv-other":"Face used to highlight some other file privilege attribute.","marginalia-file-priv-exec":"Face used to highlight the exec file privilege attribute.","marginalia-file-priv-write":"Face used to highlight the write file privilege attribute.","marginalia-file-priv-read":"Face used to highlight the read file privilege attribute.","marginalia-file-priv-link":"Face used to highlight the link file privilege attribute.","marginalia-file-priv-dir":"Face used to highlight the dir file privilege attribute.","marginalia-file-priv-no":"Face used to highlight the no file privilege attribute.","marginalia-file-owner":"Face used to highlight file owner and group names.","marginalia-file-name":"Face used to highlight file names.","marginalia-modified":"Face used to highlight buffer modification indicators.","marginalia-string":"Face used to highlight string values.","marginalia-number":"Face used to highlight numeric values.","marginalia-size":"Face used to highlight sizes.","marginalia-installed":"Face used to highlight the status of packages.","marginalia-archive":"Face used to highlight package archives.","marginalia-version":"Face used to highlight package versions.","marginalia-date":"Face used to highlight dates.","marginalia-mode":"Face used to highlight buffer major modes.","marginalia-list":"Face used to highlight list expressions.","marginalia-symbol":"Face used to highlight general symbols.","marginalia-function":"Face used to highlight function symbols.","marginalia-true":"Face used to highlight true variable values.","marginalia-null":"Face used to highlight null or unbound variable values.","marginalia-value":"Face used to highlight general variable values.","marginalia-documentation":"Face used to highlight documentation strings.","marginalia-off":"Face used to signal disabled modes.","marginalia-on":"Face used to signal enabled modes.","marginalia-lighter":"Face used to highlight minor mode lighters.","marginalia-char":"Face used to highlight character annotations.","marginalia-type":"Face used to highlight types.","marginalia-key":"Face used to highlight keys.","vertico-current":"Face used to highlight the currently selected candidate.","vertico-group-separator":"Face used for the separator lines of the candidate groups.","vertico-group-title":"Face used for the title text of the candidate group headlines.","vertico-multiline":"Face used to highlight multiline replacement characters.","nerd-icons-dsilver":"Face for dsilver icons.","nerd-icons-lsilver":"Face for lsilver icons.","nerd-icons-silver":"Face for silver icons.","nerd-icons-dpink":"Face for dpink icons.","nerd-icons-lpink":"Face for lpink icons.","nerd-icons-pink":"Face for pink icons.","nerd-icons-dcyan":"Face for dcyan icons.","nerd-icons-lcyan":"Face for lcyan icons.","nerd-icons-cyan-alt":"Face for cyan icons.","nerd-icons-cyan":"Face for cyan icons.","nerd-icons-dorange":"Face for dorange icons.","nerd-icons-lorange":"Face for lorange icons.","nerd-icons-orange":"Face for orange icons.","nerd-icons-dpurple":"Face for dpurple icons.","nerd-icons-lpurple":"Face for lpurple icons.","nerd-icons-purple-alt":"Face for purple icons.","nerd-icons-purple":"Face for purple icons.","nerd-icons-dmaroon":"Face for dmaroon icons.","nerd-icons-lmaroon":"Face for lmaroon icons.","nerd-icons-maroon":"Face for maroon icons.","nerd-icons-dblue":"Face for dblue icons.","nerd-icons-lblue":"Face for lblue icons.","nerd-icons-blue-alt":"Face for blue icons.","nerd-icons-blue":"Face for blue icons.","nerd-icons-dyellow":"Face for dyellow icons.","nerd-icons-lyellow":"Face for lyellow icons.","nerd-icons-yellow":"Face for yellow icons.","nerd-icons-dgreen":"Face for dgreen icons.","nerd-icons-lgreen":"Face for lgreen icons.","nerd-icons-green":"Face for green icons.","nerd-icons-red-alt":"Face for dred icons.","nerd-icons-dred":"Face for dred icons.","nerd-icons-lred":"Face for lred icons.","nerd-icons-red":"Face for red icons.","all-the-icons-dsilver":"Face for dsilver icons","all-the-icons-lsilver":"Face for lsilver icons","all-the-icons-silver":"Face for silver icons","all-the-icons-dpink":"Face for dpink icons","all-the-icons-lpink":"Face for lpink icons","all-the-icons-pink":"Face for pink icons","all-the-icons-dcyan":"Face for dcyan icons","all-the-icons-lcyan":"Face for lcyan icons","all-the-icons-cyan-alt":"Face for cyan icons","all-the-icons-cyan":"Face for cyan icons","all-the-icons-dorange":"Face for dorange icons","all-the-icons-lorange":"Face for lorange icons","all-the-icons-orange":"Face for orange icons","all-the-icons-dpurple":"Face for dpurple icons","all-the-icons-lpurple":"Face for lpurple icons","all-the-icons-purple-alt":"Face for purple icons","all-the-icons-purple":"Face for purple icons","all-the-icons-dmaroon":"Face for dmaroon icons","all-the-icons-lmaroon":"Face for lmaroon icons","all-the-icons-maroon":"Face for maroon icons","all-the-icons-dblue":"Face for dblue icons","all-the-icons-lblue":"Face for lblue icons","all-the-icons-blue-alt":"Face for blue icons","all-the-icons-blue":"Face for blue icons","all-the-icons-dyellow":"Face for dyellow icons","all-the-icons-lyellow":"Face for lyellow icons","all-the-icons-yellow":"Face for yellow icons","all-the-icons-dgreen":"Face for dgreen icons","all-the-icons-lgreen":"Face for lgreen icons","all-the-icons-green":"Face for green icons","all-the-icons-red-alt":"Face for dred icons","all-the-icons-dred":"Face for dred icons","all-the-icons-lred":"Face for lred icons","all-the-icons-red":"Face for red icons","adob--hack":"A hack to make fringe refresh work. Do not use.","auto-dim-other-buffers-hide":"Face with a (presumably) dimmed background and matching foreground.","auto-dim-other-buffers":"Face with a (presumably) dimmed background for non-selected window.","epa-field-body":"Face for the body of the attribute field.","epa-field-name":"Face for the name of the attribute field.","epa-mark":"Face used for displaying the high validity.","epa-string":"Face used for displaying the string.","epa-validity-disabled":"Face used for displaying the disabled validity.","epa-validity-low":"Face used for displaying the low validity.","epa-validity-medium":"Face for medium validity EPA information.","epa-validity-high":"Face for high validity EPA information.","mm-command-output":"Face used for displaying output from commands.","edmacro-label":"Face used for labels in ‘edit-kbd-macro’.","kmacro-menu-marked":"Face used for keyboard macros marked for duplication.","kmacro-menu-flagged":"Face used for keyboard macros flagged for deletion.","kmacro-menu-mark":"Face used for the Keyboard Macro Menu marks.","custom-group-subtitle":"Face for the \"Subgroups:\" subtitle in Custom buffers.","custom-group-tag":"Face for low level group tags.","custom-group-tag-1":"Face for group tags.","custom-face-tag":"Face used for face tags.","custom-visibility":"Face for the ‘custom-visibility’ widget.","custom-variable-button":"Face used for pushable variable tags.","custom-variable-tag":"Face used for unpushable variable tags.","custom-variable-obsolete":"Face used for obsolete variables.","custom-comment-tag":"Face used for the comment tag on variables or faces.","custom-comment":"Face used for comments on variables or faces.","custom-link":"Face for links in customization buffers.","custom-state":"Face used for State descriptions in the customize buffer.","custom-documentation":"Face used for documentation strings in customization buffers.","custom-button-pressed-unraised":"Face for pressed custom buttons if ‘custom-raised-buttons’ is nil.","custom-button-pressed":"Face for pressed custom buttons if ‘custom-raised-buttons’ is non-nil.","custom-button-unraised":"Face for custom buffer buttons if ‘custom-raised-buttons’ is nil.","custom-button-mouse":"Mouse face for custom buffer buttons if ‘custom-raised-buttons’ is non-nil.","custom-button":"Face for custom buffer buttons if ‘custom-raised-buttons’ is non-nil.","custom-saved":"Face used when the customize item has been saved.","custom-themed":"Face used when the customize item has been set by a theme.","custom-changed":"Face used when the customize item has been changed.","custom-set":"Face used when the customize item has been set.","custom-modified":"Face used when the customize item has been modified.","custom-rogue":"Face used when the customize item is not defined for customization.","custom-invalid":"Face used when the customize item is invalid.","widget-button-pressed":"Face used for pressed buttons.","widget-unselected":"Face used for unselected widgets.","widget-inactive":"Face used for inactive widgets.","widget-single-line-field":"Face used for editable fields spanning only a single line.","widget-field":"Face used for editable fields.","widget-button":"Face used for widget buttons.","widget-documentation":"Face used for documentation text.","bookmark-face":"Face used to highlight current line.","bookmark-menu-bookmark":"Face used to highlight bookmark names in bookmark menu buffers.","dired-ignored":"Face used for files suffixed with ‘completion-ignored-extensions’.","dired-special":"Face used for sockets, pipes, block devices and char devices.","dired-broken-symlink":"Face used for broken symbolic links.","dired-symlink":"Face used for symbolic links.","dired-directory":"Face used for subdirectories.","dired-set-id":"Face used to highlight permissions of suid and guid files.","dired-perm-write":"Face used to highlight permissions of group- and world-writable files.","dired-warning":"Face used to highlight a part of a buffer that needs user attention.","dired-flagged":"Face used for files flagged for deletion.","dired-marked":"Face used for marked files.","dired-mark":"Face used for Dired marks.","dired-header":"Face used for directory headers.","Info-quoted":"Face used for quoted elements.","info-index-match":"Face used to highlight matches in an index entry.","info-header-node":"Face for Info nodes in a node header.","info-header-xref":"Face for Info cross-references in a node header.","info-xref-visited":"Face for visited Info cross-references.","info-xref":"Face for unvisited Info cross-references.","info-menu-star":"Face used to emphasize ‘*’ in an Info menu.","info-menu-header":"Face for headers in Info menus.","info-title-4":"Face for info titles at level 4.","info-title-3":"Face for info titles at level 3.","info-title-2":"Face for info titles at level 2.","info-title-1":"Face for info titles at level 1.","info-node":"Face for Info node names.","package-status-avail-obso":"Face used on the status and version of avail-obso packages.","package-status-incompat":"Face used on the status and version of incompat packages.","package-status-unsigned":"Face used on the status and version of unsigned packages.","package-status-dependency":"Face used on the status and version of dependency packages.","package-status-from-source":"Face used on the status and version of installed packages.","package-status-installed":"Face used on the status and version of installed packages.","package-status-disabled":"Face used on the status and version of disabled packages.","package-status-held":"Face used on the status and version of held packages.","package-status-new":"Face used on the status and version of new packages.","package-status-available":"Face used on the status and version of available packages.","package-status-external":"Face used on the status and version of external packages.","package-status-built-in":"Face used on the status and version of built-in packages.","package-description":"Face used on package description summaries in the package menu.","package-name":"Face used on package names in the package menu.","package-help-section-name":"Face used on section names in package description buffers.","browse-url-button":"Face for ‘browse-url’ buttons (i.e., links).","icon-button":"Face for buttons.","icon":"Face for buttons.","tooltip":"Face for tooltips.","eldoc-highlight-function-argument":"Face used for the argument at point in a function’s argument list.","elisp-shorthand-font-lock-face":"Face for highlighting shorthands in Emacs Lisp.","vc-ignored-state":"Face for VC modeline state when the file is registered, but ignored.","vc-edited-state":"Face for VC modeline state when the file is edited.","vc-missing-state":"Face for VC modeline state when the file is missing from the file system.","vc-removed-state":"Face for VC modeline state when the file was removed from the VC system.","vc-conflict-state":"Face for VC modeline state when the file contains merge conflicts.","vc-locally-added-state":"Face for VC modeline state when the file is locally added.","vc-locked-state":"Face for VC modeline state when the file locked.","vc-needs-update-state":"Face for VC modeline state when the file needs update.","vc-up-to-date-state":"Face for VC modeline state when the file is up to date.","vc-state-base":"Base face for VC state indicator.","buffer-menu-buffer":"Face for buffer names in the Buffer Menu.","tabulated-list-fake-header":"Face used on fake header lines.","match":"Face used to highlight matches permanently.","query-replace":"Face for highlighting query replacement matches.","tab-bar-tab-ungrouped":"Tab bar face for ungrouped tab when tab groups are used.","tab-bar-tab-group-inactive":"Tab bar face for inactive group tab.","tab-bar-tab-group-current":"Tab bar face for current group tab.","tab-bar-tab-inactive":"Tab bar face for non-selected tab.","tab-bar-tab":"Tab bar face for selected tab.","file-name-shadow":"Face used by ‘file-name-shadow-mode’ for the shadow.","isearch-group-2":"Face for highlighting Isearch the even group matches.","isearch-group-1":"Face for highlighting Isearch the odd group matches.","lazy-highlight":"Face for lazy highlighting of matches other than the current one.","isearch-fail":"Face for highlighting failed part in Isearch echo-area message.","isearch":"Face for highlighting Isearch matches.","mouse-drag-and-drop-region":"Face to highlight original text during dragging.","font-lock-misc-punctuation-face":"Font Lock mode face used to highlight miscellaneous punctuation.","font-lock-delimiter-face":"Font Lock mode face used to highlight delimiters.","font-lock-bracket-face":"Font Lock mode face used to highlight brackets, braces, and parens.","font-lock-punctuation-face":"Font Lock mode face used to highlight punctuation characters.","font-lock-property-use-face":"Font Lock mode face used to highlight property references.","font-lock-property-name-face":"Font Lock mode face used to highlight properties of an object.","font-lock-operator-face":"Font Lock mode face used to highlight operators.","font-lock-number-face":"Font Lock mode face used to highlight numbers.","font-lock-escape-face":"Font Lock mode face used to highlight escape sequences in strings.","font-lock-regexp-grouping-construct":"Font Lock mode face used to highlight grouping constructs in Lisp regexps.","font-lock-regexp-grouping-backslash":"Font Lock mode face for backslashes in Lisp regexp grouping constructs.","font-lock-regexp-face":"Font Lock mode face used to highlight regexp literals.","font-lock-preprocessor-face":"Font Lock mode face used to highlight preprocessor directives.","font-lock-negation-char-face":"Font Lock mode face used to highlight easy to overlook negation.","font-lock-warning-face":"Font Lock mode face used to highlight warnings.","font-lock-constant-face":"Font Lock mode face used to highlight constants and labels.","font-lock-type-face":"Font Lock mode face used to highlight type and class names.","font-lock-variable-use-face":"Font Lock mode face used to highlight variable references.","font-lock-variable-name-face":"Font Lock mode face used to highlight variable names.","font-lock-function-call-face":"Font Lock mode face used to highlight function calls.","font-lock-function-name-face":"Font Lock mode face used to highlight function names.","font-lock-builtin-face":"Font Lock mode face used to highlight builtins.","font-lock-keyword-face":"Font Lock mode face used to highlight keywords.","font-lock-doc-markup-face":"Font Lock mode face used to highlight embedded documentation mark-up.","font-lock-doc-face":"Font Lock mode face used to highlight documentation embedded in program code.","font-lock-string-face":"Font Lock mode face used to highlight strings.","font-lock-comment-delimiter-face":"Font Lock mode face used to highlight comment delimiters.","font-lock-comment-face":"Font Lock mode face used to highlight comments.","completions-common-part":"Face for the parts of completions which matched the pattern.","completions-first-difference":"Face for the first character after point in completions.","completions-highlight":"Default face for highlighting the current completion candidate.","completions-annotations":"Face to use for annotations in the *Completions* buffer.","completions-group-separator":"Face used for the separator lines between the candidate groups.","completions-group-title":"Face used for the title text of the candidate group headlines.","blink-matching-paren-offscreen":"Face for showing in the echo area matched open paren that is off-screen.","separator-line":"Face for separator lines.","next-error-message":"Face used to highlight the current error message in the ‘next-error’ buffer.","next-error":"Face used to highlight next error locus.","confusingly-reordered":"Face for highlighting text that was bidi-reordered in confusing ways.","help-for-help-header":"Face used for headers in the ‘help-for-help’ buffer.","abbrev-table-name":"Face used for displaying the abbrev table name in ‘edit-abbrevs-mode’.","button":"Default face used for buttons.","show-paren-mismatch":"Face used for a mismatching paren.","show-paren-match-expression":"Face used for a matching paren when highlighting the whole expression.","show-paren-match":"Face used for a matching paren.","tty-menu-selected-face":"Face for displaying the currently selected item in TTY menus.","tty-menu-disabled-face":"Face for displaying disabled items in TTY menus.","tty-menu-enabled-face":"Face for displaying enabled items in TTY menus.","read-multiple-choice-face":"Face for the symbol name in ‘read-multiple-choice’ output.","success":"Basic face used to indicate successful operation.","warning":"Basic face used to highlight warnings.","error":"Basic face used to highlight errors and to denote failure.","glyphless-char":"Face for displaying non-graphic characters (e.g. U+202A (LRE)).","help-key-binding":"Face for keybindings in *Help* buffers.","help-argument-name":"Face to highlight argument names in *Help* buffers.","menu":"Basic face for the font and colors of the menu bar and popup menus.","tab-line":"Tab line face.","tab-bar":"Tab bar face.","tool-bar":"Basic tool-bar face.","mouse":"Basic face for the mouse color under X.","cursor":"Basic face for the cursor color under X.","border":"Basic face for the frame border under X.","scroll-bar":"Basic face for the scroll bar colors under X.","fringe":"Basic face for the fringes to the left and right of windows under X.","minibuffer-prompt":"Face for minibuffer prompts.","child-frame-border":"Basic face for the internal border of child frames.","internal-border":"Basic face for the internal border.","window-divider-last-pixel":"Basic face for last pixel line/column of window dividers.","window-divider-first-pixel":"Basic face for first pixel line/column of window dividers.","window-divider":"Basic face for window dividers.","vertical-border":"Face used for vertical window dividers on ttys.","header-line-highlight":"Basic header line face for highlighting.","header-line":"Basic header-line face.","mode-line-buffer-id":"Face used for buffer identification parts of the mode line.","mode-line-emphasis":"Face used to emphasize certain mode line features.","mode-line-highlight":"Basic mode line face for highlighting.","mode-line-inactive":"Basic mode line face for non-selected windows.","mode-line-active":"Face for the selected mode line.","mode-line":"Face for the mode lines as well as header lines.","nobreak-hyphen":"Face for displaying nobreak hyphens.","nobreak-space":"Face for displaying nobreak space.","homoglyph":"Face for lookalike characters.","escape-glyph":"Face for characters displayed as sequences using ‘^’ or ‘\\’.","fill-column-indicator":"Face for displaying fill column indicator.","line-number-minor-tick":"Face for highlighting \"minor ticks\" (as in a ruler).","line-number-major-tick":"Face for highlighting \"major ticks\" (as in a ruler).","line-number-current-line":"Face for displaying the current line number.","line-number":"Face for displaying line numbers.","trailing-whitespace":"Basic face for highlighting trailing whitespace.","secondary-selection":"Basic face for displaying the secondary selection.","region":"Basic face for highlighting the region.","highlight":"Basic face for highlighting.","link-visited":"Basic face for visited links.","link":"Basic face for unvisited links.","shadow":"Basic face for shadowed text.","variable-pitch-text":"The proportional face used for longer texts.","variable-pitch":"The basic variable-pitch face.","fixed-pitch-serif":"The basic fixed-pitch face with serifs.","fixed-pitch":"The basic fixed-pitch face.","underline":"Basic underlined face.","bold-italic":"Basic bold-italic face.","italic":"Basic italic face.","bold":"Basic bold face.","default":"Basic default face."},"syntax":{"bg":"Basic default face.","p":"Basic default face.","kw":"Font Lock mode face used to highlight keywords.","bi":"Font Lock mode face used to highlight builtins.","pp":"Font Lock mode face used to highlight preprocessor directives.","fnd":"Font Lock mode face used to highlight function names.","fnc":"Font Lock mode face used to highlight function calls.","ty":"Font Lock mode face used to highlight type and class names.","prop":"Font Lock mode face used to highlight properties of an object.","con":"Font Lock mode face used to highlight constants and labels.","num":"Font Lock mode face used to highlight numbers.","str":"Font Lock mode face used to highlight strings.","esc":"Font Lock mode face used to highlight escape sequences in strings.","re":"Font Lock mode face used to highlight regexp literals.","doc":"Font Lock mode face used to highlight documentation embedded in program code.","cm":"Font Lock mode face used to highlight comments.","cmd":"Font Lock mode face used to highlight comment delimiters.","var":"Font Lock mode face used to highlight variable names.","op":"Font Lock mode face used to highlight operators.","punc":"Font Lock mode face used to highlight punctuation characters."}}
\ No newline at end of file diff --git a/scripts/theme-studio/face_coverage.py b/scripts/theme-studio/face_coverage.py new file mode 100644 index 000000000..c6200e05c --- /dev/null +++ b/scripts/theme-studio/face_coverage.py @@ -0,0 +1,369 @@ +#!/usr/bin/env python3 +"""Build (and diff) face-coverage.org from a face-coverage-dump.el JSON dump. + +The worklist lists every known face -- the live Emacs face-list unioned with +everything theme-studio manages -- grouped into three tiers: + + emacs-core standalone built-in faces (frame chrome, cursor, region, ...) + emacs-general built-in Emacs subsystems (org, gnus, erc, diff, vc, ...) + <package> one heading per third-party elpa package + +Tier is decided by where each face's defface lives: /usr/share/emacs is built-in, +elpa is a package. Each face carries its docstring; each bucket carries its +customization-group doc or package summary. + +Usage: + python3 face_coverage.py --data DUMP.json --out face-coverage.org + python3 face_coverage.py --data DUMP.json --compare face-coverage.org + +The builder is deterministic given a dump. The --compare mode regenerates in +memory and reports the coverage delta against an existing org file (newly +covered, newly present, disappeared, per-tier totals) without writing. +""" + +import argparse +import collections +import datetime +import json +import os +import re +import sys + +import generate # sibling module: UI_FACES, CATS + +HERE = os.path.dirname(os.path.abspath(__file__)) + +# Faces that belong to emacs-core (fundamental display faces), even though their +# name prefix would otherwise route them to a subsystem bucket. +CORE_HINT = { + 'default', 'cursor', 'region', 'secondary-selection', 'highlight', 'hl-line', + 'shadow', 'match', 'fringe', 'minibuffer-prompt', 'mode-line', 'mode-line-inactive', + 'mode-line-highlight', 'mode-line-emphasis', 'mode-line-buffer-id', 'mode-line-active', + 'header-line', 'header-line-highlight', 'vertical-border', 'window-divider', + 'window-divider-first-pixel', 'window-divider-last-pixel', 'line-number', + 'line-number-current-line', 'line-number-major-tick', 'line-number-minor-tick', + 'isearch', 'isearch-fail', 'isearch-group-1', 'isearch-group-2', 'lazy-highlight', + 'show-paren-match', 'show-paren-mismatch', 'show-paren-match-expression', 'link', + 'link-visited', 'error', 'warning', 'success', 'tooltip', 'trailing-whitespace', + 'fill-column-indicator', 'escape-glyph', 'homoglyph', 'nobreak-space', 'nobreak-hyphen', + 'glyphless-char', 'button', 'help-key-binding', 'separator-line', 'scroll-bar', 'tool-bar', + 'menu', 'border', 'internal-border', 'child-frame-border', 'mouse', 'mouse-drag-and-drop-region', + 'bold', 'italic', 'bold-italic', 'underline', 'fixed-pitch', 'fixed-pitch-serif', + 'variable-pitch', 'variable-pitch-text', 'next-error', 'query-replace', + 'completions-common-part', 'completions-first-difference', 'blink-matching-paren-offscreen', + 'tty-menu-disabled-face', 'tty-menu-enabled-face', 'tty-menu-selected-face', +} + +# Extra subsystem/package buckets beyond the package-inventory keys, so every +# face routes to a named bucket rather than falling into emacs-core. +EXTRA_FAMILIES = { + 'font-lock', 'org', 'org-agenda', 'org-block', 'org-table', 'org-habit', 'org-document', + 'org-priority', 'gnus', 'gnus-group', 'gnus-summary', 'gnus-header', 'gnus-cite', + 'gnus-server', 'gnus-splash', 'gnus-emphasis', 'gnus-signature', 'gnus-button', 'erc', + 'message', 'message-header', 'custom', 'diff', 'smerge', 'ediff', 'dired', 'image-dired', + 'wdired', 'info', 'vc', 'shr', 'eww', 'epa', 'package', 'compilation', 'outline', + 'completions', 'widget', 'apropos', 'change-log', 'calendar', 'diary', 'holiday', + 'which-key', 'tab-bar', 'tab-line', 'ansi-color', 'xref', 'comint', 'shell', 'sh', + 'makefile', 'eshell', 'term', 'help', 'eldoc', 'ert', 'kmacro', 'gud', 'bookmark', + 'ibuffer', 'grep', 'tabulated-list', 'flymake', 'flyspell', 'whitespace', + 'rainbow-delimiters', 'tmr', 'alert', 'breakpoint', 'mm', 'treesit', 'image', 'icon', + 'auto', 'buffer', 'browse', 'confusingly', 'adob', 'log', 'next', 'read', 'table', + 'rectangle', 'file', 'ffap', 'edmacro', 'elisp', 'doc', 'markdown', 'lsp', 'abbrev', + 'which-func', 'git-gutter', 'git-commit', 'twentyfortyeight', 'yas', 'edit-indirect', +} + +# Curated descriptions for buckets whose group/package docs don't resolve. +DESC_FALLBACK = { + 'completions': 'Faces for the default *Completions* buffer.', + 'twentyfortyeight': 'Tile faces for the 2048 game.', + 'yas': 'Faces for YASnippet template fields.', + 'json-mode': 'Major mode for editing JSON.', + 'adob': 'auto-dim-other-buffers: dimmed inactive windows.', + 'diary': 'Faces for diary entries in the calendar.', + 'holiday': 'Faces for holidays in the calendar.', + 'mm': 'MIME handling faces (gnus/mm).', + 'emacs-core': 'Standalone built-in faces: frame chrome, cursor, region, mode line, ' + 'search, line numbers, base typography.', + 'emacs-general': 'Built-in Emacs subsystems, one child per subsystem.', +} + + +def clean_doc(doc): + """First non-empty line of DOC, smart-quotes normalized, whitespace collapsed.""" + if not doc: + return '' + line = next((ln for ln in doc.split('\n') if ln.strip()), '') + line = (line.replace('‘', "'").replace('’', "'") + .replace('“', '"').replace('”', '"').replace('—', '-')) + return re.sub(r'[ \t]+', ' ', line).strip() + + +def load_managed(): + """Return the set of faces theme-studio already themes (its three tiers).""" + bt = open(os.path.join(HERE, 'build-theme.el')).read() + fontlock = set(re.findall(r'font-lock-[a-z-]+', bt)) + ui = {f[0] for f in generate.UI_FACES} + inv = json.load(open(os.path.join(HERE, 'package-inventory.json'))) + pkg = {f for faces in inv.values() for f in faces if isinstance(f, str)} + managed = fontlock | ui | pkg | {'default', 'fixed-pitch', 'variable-pitch'} + return managed, fontlock, ui, pkg, inv + + +# Built-in source files whose faces are core display faces, not a subsystem; +# an unrecognized face from one of these stays in emacs-core rather than +# spawning an odd subsystem bucket under emacs-general. +CORE_FILES = {'faces', 'frame'} + + +def path_kind(path): + """Classify a defface source PATH into a coarse origin kind. + Returns one of: 'none' (no path), 'elpa', 'user', 'builtin', 'other'. + Shared by bucket_from_source and bucket_of_source, which each map the kind + to their own vocabulary.""" + if not path: + return 'none' + if '/elpa/' in path: + return 'elpa' + if '/.emacs.d/modules' in path: + return 'user' + if path.startswith('/usr/share/emacs') or path.startswith('/usr/lib/emacs'): + return 'builtin' + return 'other' + + +def bucket_from_source(path): + """Derive a bucket name from a face's defface file, for faces that match no + known family. elpa -> the package dir name (version stripped); built-in -> + the source file basename; otherwise emacs-core (can't tell).""" + kind = path_kind(path) + if kind == 'elpa': + pkgdir = path.split('/elpa/', 1)[1].split('/', 1)[0] + return re.sub(r'-[0-9].*$', '', pkgdir) or 'emacs-core' + if kind == 'user': + return 'user-config' + if kind == 'builtin': + base = os.path.basename(path) + base = base[:-3] if base.endswith('.el') else base + return 'emacs-core' if base in CORE_FILES else base + return 'emacs-core' # 'none' or 'other' + + +def make_group_of(families, src): + fams = sorted(families, key=len, reverse=True) + + def group_of(f): + if f.startswith('bg:erc') or f.startswith('fg:erc'): + return 'erc-ansi' + if f in CORE_HINT: + return 'emacs-core' + if f.startswith('font-lock'): + return 'font-lock' + for p in fams: + if f == p or (f.startswith(p) and len(f) > len(p) and f[len(p)] in '-:/'): + return p + if f.lower().startswith('info-'): + return 'info' + # Unrecognized: route by where the defface lives so a newly-loaded + # package buckets itself instead of falling into emacs-core. + return bucket_from_source(src.get(f, '')) + return group_of + + +def bucket_of_source(path): + return {'none': 'unloaded', 'elpa': 'elpa', 'user': 'user', + 'builtin': 'builtin', 'other': 'other'}[path_kind(path)] + + +def classify(name, items, src, pkgfaces): + """core / general / package for a bucket, by its faces' defface source.""" + if name == 'emacs-core': + return 'core' + c = collections.Counter(bucket_of_source(src.get(f, '')) for f in items) + loaded = c['elpa'] + c['builtin'] + c['user'] + c['other'] + if loaded == 0: + return 'package' if any(f in pkgfaces for f in items) else 'general' + if c['elpa'] >= max(c['builtin'], c['user'], c['other']): + return 'package' + if c['other'] > c['builtin'] and c['other'] >= c['elpa']: + return 'package' + return 'general' + + +def resolve_desc(bucket, groups, packages): + """One-line description for BUCKET via group doc / package summary / parent.""" + if bucket in DESC_FALLBACK: + # umbrella tiers and curated fills take precedence over a weak group hit + if bucket in ('emacs-core', 'emacs-general'): + return DESC_FALLBACK[bucket] + for cand in (bucket, bucket + '-faces', bucket + 's', bucket + '-mode', bucket + '-mode-faces'): + if groups.get(cand): + return clean_doc(groups[cand]) + for cand in (bucket, bucket + '-mode'): + if packages.get(cand): + return clean_doc(packages[cand]) + if '-' in bucket: + parent = bucket.rsplit('-', 1)[0] + if groups.get(parent): + return clean_doc(groups[parent]) + return DESC_FALLBACK.get(bucket, '') + + +def status(done, total): + return 'DONE' if done == total else ('TODO' if done == 0 else 'DOING') + + +def build(data, today): + faces_raw = data['faces'] + docs = {row[0]: ('' if row[1] in (None, ':null') else clean_doc(row[1])) for row in faces_raw} + src = {row[0]: ('' if row[2] in (None, ':null') else row[2]) for row in faces_raw} + groups_doc = data.get('groups', {}) + packages = data.get('packages', {}) + + managed, fontlock, ui, pkgfaces, inv = load_managed() + universe = sorted(set(docs.keys()) | managed) + + families = set(inv.keys()) | EXTRA_FAMILIES + group_of = make_group_of(families, src) + groups = collections.defaultdict(list) + for f in universe: + groups[group_of(f)].append(f) + + cls = {k: classify(k, v, src, pkgfaces) for k, v in groups.items()} + done = lambda items: sum(1 for f in items if f in managed) + + gen_groups = sorted(k for k in groups if cls[k] == 'general') + pkg_groups = sorted(k for k in groups if cls[k] == 'package') + gen_faces = [f for k in gen_groups for f in groups[k]] + tot_done = done(universe) + ndoc = sum(1 for f in universe if docs.get(f)) + + out = [] + + def emit_desc(bucket, stars): + d = resolve_desc(bucket, groups_doc, packages) + if d: + out.append(' ' * (stars + 1) + d) + + def emit_face(f, stars): + out.append('%s %s %s' % ('*' * stars, 'DONE' if f in managed else 'TODO', f)) + if docs.get(f): + out.append(' ' * (stars + 1) + docs[f]) + + out += [ + '#+TITLE: theme-studio — face coverage master list', + '#+DATE: %s' % today, + '#+TODO: TODO DOING | DONE', + '#+STARTUP: overview', + '', + 'Every known face (live Emacs face-list union everything theme-studio manages). DONE = the', + 'studio already themes it; TODO = not yet. Three top-level tiers:', + '- emacs-core: the standalone built-in faces (frame chrome, cursor, region, mode line, search).', + '- emacs-general: built-in Emacs subsystems (org, gnus, erc, diff, vc, custom, ...), one child each.', + '- one heading per third-party package installed from elpa (magit, vertico, consult, ...).', + "Tier is decided by where each face's defface lives: /usr/share/emacs = built-in, elpa = package.", + 'The line under each bucket is its group/package description; the line under each face is its', + 'Emacs docstring (first line), where one exists.', + '', + 'Totals: %d / %d faces covered; %d carry a docstring. Tiers: core 1, general %d, packages %d.' + % (tot_done, len(universe), ndoc, len(gen_groups), len(pkg_groups)), + 'Coverage tiers in the studio: syntax font-lock=%d, UI tier=%d, package inventory=%d (%d packages).' + % (len(fontlock), len(ui), len(pkgfaces), len(inv)), + '', + 'Mechanism to close a TODO: core/UI faces -> UI_FACES in generate.py; package + subsystem faces', + '-> package-inventory.json (regenerable via build-inventory.el / app_inventory.py).', + '', + ] + + core = sorted(groups['emacs-core']) + out.append('* %s emacs-core [%d/%d]' % (status(done(core), len(core)), done(core), len(core))) + emit_desc('emacs-core', 1) + for f in core: + emit_face(f, 2) + out.append('') + + out.append('* %s emacs-general [%d/%d]' + % (status(done(gen_faces), len(gen_faces)), done(gen_faces), len(gen_faces))) + emit_desc('emacs-general', 1) + for k in gen_groups: + items = sorted(groups[k]) + out.append('** %s %s [%d/%d]' % (status(done(items), len(items)), k, done(items), len(items))) + emit_desc(k, 2) + for f in items: + emit_face(f, 3) + out.append('') + + for k in pkg_groups: + items = sorted(groups[k]) + out.append('* %s %s [%d/%d]' % (status(done(items), len(items)), k, done(items), len(items))) + emit_desc(k, 1) + for f in items: + emit_face(f, 2) + out.append('') + + summary = { + 'total': (tot_done, len(universe)), + 'core': (done(core), len(core)), + 'general': (done(gen_faces), len(gen_faces)), + 'packages': len(pkg_groups), + } + return '\n'.join(out), summary + + +def parse_states(text): + """face -> 'DONE'/'TODO' from an org worklist (face headings have no cookie).""" + states = {} + for m in re.finditer(r'^\*+ (TODO|DONE) (\S+)$', text, re.M): + states[m.group(2)] = m.group(1) + return states + + +def compare(old_text, new_text): + old, new = parse_states(old_text), parse_states(new_text) + newly_covered = sorted(f for f in new if new[f] == 'DONE' and old.get(f) == 'TODO') + newly_present = sorted(set(new) - set(old)) + disappeared = sorted(set(old) - set(new)) + old_done = sum(1 for s in old.values() if s == 'DONE') + new_done = sum(1 for s in new.values() if s == 'DONE') + return { + 'newly_covered': newly_covered, + 'newly_present': newly_present, + 'disappeared': disappeared, + 'old': (old_done, len(old)), + 'new': (new_done, len(new)), + } + + +def main(argv): + ap = argparse.ArgumentParser(description='Build or diff face-coverage.org') + ap.add_argument('--data', default='/tmp/face-coverage-data.json', + help='JSON dump from face-coverage-dump.el') + ap.add_argument('--out', default=os.path.join(HERE, 'face-coverage.org'), + help='org file to write (build mode)') + ap.add_argument('--compare', metavar='ORG', + help='regenerate in memory and report the delta against ORG, do not write') + ap.add_argument('--date', default=None, help='override the #+DATE stamp (YYYY-MM-DD)') + args = ap.parse_args(argv) + + data = json.load(open(args.data)) + today = args.date or datetime.date.today().isoformat() + text, summary = build(data, today) + + if args.compare: + old_text = open(args.compare).read() + d = compare(old_text, text) + print('coverage: %d/%d -> %d/%d' % (d['old'][0], d['old'][1], d['new'][0], d['new'][1])) + print('newly covered (%d): %s' % (len(d['newly_covered']), ' '.join(d['newly_covered']) or '-')) + print('newly present (%d): %s' % (len(d['newly_present']), ' '.join(d['newly_present']) or '-')) + print('disappeared (%d): %s' % (len(d['disappeared']), ' '.join(d['disappeared']) or '-')) + return 0 + + with open(args.out, 'w') as fh: + fh.write(text) + print('wrote %s — %d/%d covered, core %d/%d, general %d/%d, %d package groups' + % (args.out, summary['total'][0], summary['total'][1], summary['core'][0], + summary['core'][1], summary['general'][0], summary['general'][1], summary['packages'])) + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/scripts/theme-studio/face_data.py b/scripts/theme-studio/face_data.py index a73db7137..d94f23068 100644 --- a/scripts/theme-studio/face_data.py +++ b/scripts/theme-studio/face_data.py @@ -143,6 +143,21 @@ GHOSTEL_SEED={ "ghostel-color-blue":{"fg":"blue"},"ghostel-color-magenta":{"fg":"regal"},"ghostel-color-cyan":{"fg":"sage"},"ghostel-color-white":{"fg":"silver"}, "ghostel-color-bright-black":{"fg":"steel"},"ghostel-color-bright-red":{"fg":"#de4949"},"ghostel-color-bright-green":{"fg":"#84b068"},"ghostel-color-bright-yellow":{"fg":"#eed376"}, "ghostel-color-bright-blue":{"fg":"#7a9abe"},"ghostel-color-bright-magenta":{"fg":"#b07fd0"},"ghostel-color-bright-cyan":{"fg":"#7fc0a8"},"ghostel-color-bright-white":{"fg":"white"}} +# ansi-color (built-in, not in the inventory): the 16 ANSI palette faces that every +# ANSI consumer resolves -- vterm, eshell, compilation, and ghostel (whose +# ghostel-color-* faces :inherit these). Theming ansi-color-* drives the 16 +# colors everywhere at once. Seed mirrors the ghostel palette so the two agree. +# Note: a face left unset here inherits nothing extra; a consumer that sets its +# own color directly (e.g. a seeded ghostel-color-red) overrides this inheritance. +ANSI_COLOR_FACES=("ansi-color-black ansi-color-red ansi-color-green ansi-color-yellow " + "ansi-color-blue ansi-color-magenta ansi-color-cyan ansi-color-white " + "ansi-color-bright-black ansi-color-bright-red ansi-color-bright-green ansi-color-bright-yellow " + "ansi-color-bright-blue ansi-color-bright-magenta ansi-color-bright-cyan ansi-color-bright-white").split() +ANSI_COLOR_SEED={ + "ansi-color-black":{"fg":"pewter"},"ansi-color-red":{"fg":"terracotta"},"ansi-color-green":{"fg":"emerald"},"ansi-color-yellow":{"fg":"gold"}, + "ansi-color-blue":{"fg":"blue"},"ansi-color-magenta":{"fg":"regal"},"ansi-color-cyan":{"fg":"sage"},"ansi-color-white":{"fg":"silver"}, + "ansi-color-bright-black":{"fg":"steel"},"ansi-color-bright-red":{"fg":"#de4949"},"ansi-color-bright-green":{"fg":"#84b068"},"ansi-color-bright-yellow":{"fg":"#eed376"}, + "ansi-color-bright-blue":{"fg":"#7a9abe"},"ansi-color-bright-magenta":{"fg":"#b07fd0"},"ansi-color-bright-cyan":{"fg":"#7fc0a8"},"ansi-color-bright-white":{"fg":"white"}} # auto-dim-other-buffers: non-selected windows recede to a faded fg on a near-black # bg. The -hide face keeps org hidden text invisible in a dimmed window (fg=bg). AUTODIM_FACES=("auto-dim-other-buffers auto-dim-other-buffers-hide").split() @@ -328,3 +343,34 @@ GNUS_SEED={ "gnus-cite-1":{"fg":"sage"},"gnus-cite-2":{"fg":"steel"},"gnus-cite-3":{"fg":"gold"},"gnus-cite-4":{"fg":"blue"},"gnus-cite-5":{"fg":"sage"},"gnus-cite-6":{"fg":"steel"},"gnus-cite-7":{"fg":"gold"},"gnus-cite-8":{"fg":"blue"},"gnus-cite-9":{"fg":"sage"},"gnus-cite-10":{"fg":"steel"},"gnus-cite-11":{"fg":"gold"},"gnus-cite-attribution":{"fg":"silver","italic":True}, "gnus-signature":{"fg":"pewter","italic":True},"gnus-button":{"fg":"blue","underline":True}, "gnus-emphasis-bold":{"bold":True},"gnus-emphasis-italic":{"italic":True},"gnus-emphasis-underline":{"underline":True},"gnus-emphasis-strikethru":{"fg":"pewter","strike":True},"gnus-emphasis-highlight-words":{"fg":"gold","bold":True}} + +# The bespoke package apps, single-sourced here. Each row is +# (key, label, preview, FACES, prefix, SEED); add an app by adding one row. +# generate.py builds APPS from this, and app_inventory derives the set of +# bespoke keys (to exclude them from the generic-inventory path) from it too. +BESPOKE_APP_SPECS=[ + ("org-mode","org-mode","org",ORG_FACES,"org-",ORG_SEED), + ("magit","magit","magit",MAGIT_FACES,"magit-",MAGIT_SEED), + ("elfeed","elfeed","elfeed",ELFEED_FACES,"elfeed-",ELFEED_SEED), + ("mu4e","mu4e","mu4e",MU4E_FACES,"mu4e-",MU4E_SEED), + ("gnus","gnus (mu4e article view)","gnus",GNUS_FACES,"gnus-",GNUS_SEED), + ("org-faces","org-faces","orgfaces",ORGFACES_FACES,"org-faces-",ORGFACES_SEED), + ("ghostel","ghostel","ghostel",GHOSTEL_FACES,"ghostel-",GHOSTEL_SEED), + ("ansi-color","ansi-color (vterm/eshell/compilation/ghostel)","ansicolor",ANSI_COLOR_FACES,"ansi-color-",ANSI_COLOR_SEED), + ("auto-dim-other-buffers","auto-dim","autodim",AUTODIM_FACES,"auto-dim-other-buffers-",AUTODIM_SEED), + ("dashboard","dashboard","dashboard",DASHBOARD_FACES,"dashboard-",DASHBOARD_SEED), + ("lsp-mode","lsp-mode","lsp",LSP_FACES,"lsp-",LSP_SEED), + ("git-gutter","git-gutter","gitgutter",GITGUTTER_FACES,"git-gutter:",GITGUTTER_SEED), + ("flycheck","flycheck","flycheck",FLYCHECK_FACES,"flycheck-",FLYCHECK_SEED), + ("dired","dired","dired",DIRED_FACES,"dired-",DIRED_SEED), + ("dirvish","dirvish","dirvish",DIRVISH_FACES,"dirvish-",DIRVISH_SEED), + ("calibredb","calibredb","calibredb",CALIBREDB_FACES,"calibredb-",CALIBREDB_SEED), + ("erc","erc","erc",ERC_FACES,"erc-",ERC_SEED), + ("org-drill","org-drill","orgdrill",ORGDRILL_FACES,"org-drill-",ORGDRILL_SEED), + ("org-noter","org-noter","orgnoter",ORGNOTER_FACES,"org-noter-",ORGNOTER_SEED), + ("signel","signel","signel",SIGNEL_FACES,"signel-",SIGNEL_SEED), + ("pearl","pearl","pearl",PEARL_FACES,"pearl-",PEARL_SEED), + ("slack","slack","slack",SLACK_FACES,"slack-",SLACK_SEED), + ("telega","telega","telega",TELEGA_FACES,"telega-",TELEGA_SEED), + ("shr","shr (HTML: nov/eww/mail)","shr",SHR_FACES,"shr-",SHR_SEED), +] diff --git a/scripts/theme-studio/face_specs.py b/scripts/theme-studio/face_specs.py index 20894cd6d..1b3e150d6 100644 --- a/scripts/theme-studio/face_specs.py +++ b/scripts/theme-studio/face_specs.py @@ -5,27 +5,82 @@ from __future__ import annotations from typing import Any -STYLE_DEFAULTS: dict[str, Any] = { - "fg": None, - "bg": None, - "bold": False, - "italic": False, - "underline": False, - "strike": False, - "box": None, -} - -PACKAGE_DEFAULTS: dict[str, Any] = { - **STYLE_DEFAULTS, - "inherit": None, - "height": 1, -} +# The full per-face attribute model, in its final shape, as one spec list that is +# the single source for: STYLE_DEFAULTS (model key -> default), the capture probe +# map in capture-default-faces.py (emacs :attr -> snapshot field), and the +# snapshot extraction in default_faces.seed (snapshot field + kind -> model value). +# Per row: +# model : theme-model key +# default : value when unset +# capture : the Emacs face :attribute keyword the capture probes (None = not +# captured, e.g. family, which the model carries but the snapshot omits) +# snapshot : the field name the capture writes (and seed reads) +# kind : how seed turns the snapshot field into a model value (None = not seeded) +# weight/slant replaced the legacy bold/italic booleans; underline/strike/overline +# are objects ({style: line|wave, color} / {color}); inherit and height apply to +# every tier. Keep this in step with app-core.js FACE_ATTRS (separate runtime). +FACE_ATTRS: list[dict[str, Any]] = [ + {"model": "fg", "default": None, "capture": ":foreground", "snapshot": "foreground", "kind": "color"}, + {"model": "bg", "default": None, "capture": ":background", "snapshot": "background", "kind": "color"}, + {"model": "distant-fg", "default": None, "capture": ":distant-foreground", "snapshot": "distantForeground", "kind": "color"}, + {"model": "family", "default": None, "capture": None, "snapshot": None, "kind": None}, + {"model": "weight", "default": None, "capture": ":weight", "snapshot": "weight", "kind": "weight-bold"}, + {"model": "slant", "default": None, "capture": ":slant", "snapshot": "slant", "kind": "slant-italic"}, + {"model": "underline", "default": None, "capture": ":underline", "snapshot": "underline", "kind": "underline-obj"}, + {"model": "strike", "default": None, "capture": ":strike-through", "snapshot": "strike", "kind": "color-obj"}, + {"model": "overline", "default": None, "capture": ":overline", "snapshot": "overline", "kind": "color-obj"}, + {"model": "box", "default": None, "capture": ":box", "snapshot": "box", "kind": "box"}, + {"model": "inverse", "default": False, "capture": ":inverse-video", "snapshot": "inverseVideo", "kind": "bool"}, + {"model": "extend", "default": False, "capture": ":extend", "snapshot": "extend", "kind": "bool"}, + {"model": "inherit", "default": None, "capture": ":inherit", "snapshot": "inherit", "kind": "scalar"}, + {"model": "height", "default": None, "capture": ":height", "snapshot": "height", "kind": "height"}, +] + +# model key -> default, derived from the spec above (order preserved). +STYLE_DEFAULTS: dict[str, Any] = {a["model"]: a["default"] for a in FACE_ATTRS} + +# Kept as a distinct name for callers, but inherit/height are no longer +# package-only, so the package defaults are now the same full set. +PACKAGE_DEFAULTS: dict[str, Any] = dict(STYLE_DEFAULTS) + + +def migrate_legacy(spec: dict[str, Any]) -> dict[str, Any]: + """Convert a face spec's legacy boolean style fields to the new shape. + + bold -> weight "bold", italic -> slant "italic", underline true -> + {style: line, color: null}, strike true -> {color: null}. An explicit + weight/slant already present wins over the legacy flag. Specs already in the + new shape pass through unchanged, so this is safe to apply to any input. The + JS side mirrors this in app-core.js migrateLegacyFace; keep them in step. + """ + out = dict(spec) + if "bold" in out: + bold = out.pop("bold") + if bold and not out.get("weight"): + out["weight"] = "bold" + if "italic" in out: + italic = out.pop("italic") + if italic and not out.get("slant"): + out["slant"] = "italic" + if "underline" in out: + underline = out["underline"] + if underline is True: + out["underline"] = {"style": "line", "color": None} + elif underline is False: + out["underline"] = None + if "strike" in out: + strike = out["strike"] + if strike is True: + out["strike"] = {"color": None} + elif strike is False: + out["strike"] = None + return out def face_spec(spec: dict[str, Any] | None = None, *, package: bool = False) -> dict[str, Any]: out = dict(PACKAGE_DEFAULTS if package else STYLE_DEFAULTS) if spec: - out.update(spec) + out.update(migrate_legacy(spec)) return out diff --git a/scripts/theme-studio/generate.py b/scripts/theme-studio/generate.py index c489b79cc..6baa67a91 100644 --- a/scripts/theme-studio/generate.py +++ b/scripts/theme-studio/generate.py @@ -2,7 +2,7 @@ import json, os, re from app_inventory import add_inventory_apps, apply_default_face_seeds, apply_package_overrides, face_rows from default_faces import DefaultFaces from face_data import * -from face_specs import face_spec, ui_face_spec +from face_specs import face_spec, ui_face_spec, migrate_legacy HERE=os.path.dirname(os.path.abspath(__file__)) def read_text(name): @@ -37,6 +37,9 @@ COLORMATH_BODY=strip_exports(read_text('colormath.js')) # (MAP_J, PALETTE_J, COLORMATH_J, ...); those are filled after it is spliced in. STYLES=read_text('styles.css') APP_BODY=read_text('app.js') +# Bespoke per-package preview renderers, spliced into the page <script> via the +# PREVIEWS_J token in app.js. No imports/exports, so read raw. +PREVIEWS_BODY=read_text('previews.js') # Pure package-model + dropdown logic, inlined into the page (and unit-tested via # test-app-core.mjs) the same way colormath.js is. APP_CORE_BODY=strip_exports(read_text('app-core.js')) @@ -55,13 +58,21 @@ PALETTE_ACTIONS_BODY=strip_exports(read_text('palette-actions.js')) # under the test harness while still shipping one self-contained HTML file. BROWSER_GATES_BODY=strip_exports(read_text('browser-gates.js')) COLOR_NAMES=read_json('color-names.json') +# Face docstrings (first line each), dumped from a live Emacs via +# face-docs-dump.el. Two maps: "faces" keyed by real face name (UI + package +# tables), "syntax" keyed by theme-studio category (the syntax table). Inlined so +# the element hovers can show each face's docstring on top of the existing title. +_face_docs=read_json('face-docs.json') +FACE_DOCS=_face_docs['faces'] +SYNTAX_DOCS=_face_docs['syntax'] ns={} src=read_text('samples.py') exec(src[:src.index('# THEME_STUDIO_DATA_END')], ns) -SAMPLES={"Elisp":ns['ELS'],"Go":ns['GOS'],"Python":ns['PYS'],"TypeScript":ns['TSS'],"Java":ns['JAS'],"C":ns['CS'],"C++":ns['CPS'],"Rust":ns['RUSTS'],"Zig":ns['ZIGS'],"Shell":ns['SHS']} +SAMPLES={"Elisp":ns['ELS'],"Go":ns['GOS'],"Python":ns['PYS'],"TypeScript":ns['TSS'],"Java":ns['JAS'],"C":ns['CS'],"C++":ns['CPS'],"Rust":ns['RUSTS'],"Zig":ns['ZIGS'],"Shell":ns['SHS'], + "Racket":ns['RACKETS'],"Scheme":ns['SCHEMES'],"Haskell":ns['HASKELLS'],"OCaml":ns['OCAMLS'],"Scala":ns['SCALAS'],"Kotlin":ns['KOTLINS'],"Swift":ns['SWIFTS'],"Lua":ns['LUAS'],"Ruby":ns['RUBYS'],"Perl":ns['PERLS'],"R":ns['RLANGS'],"Erlang":ns['ERLANGS'],"SQL":ns['SQLS'],"PHP":ns['PHPS'],"Ada":ns['ADAS'],"Fortran":ns['FORTRANS'],"MATLAB":ns['MATLABS'],"Assembly":ns['ASMS']} COLS=ns['COLS'] DEFAULT_FACES_PATH=os.path.join(HERE,'emacs-default-faces.json') -DEFAULTS=DefaultFaces.from_path(DEFAULT_FACES_PATH) + def column_id(name): name = name or 'color' if re.fullmatch(r'color-\d+', name): @@ -100,19 +111,34 @@ def initial_maps(cols,defaults): def apply_builtin_fallback_styles(uimap): """Fill the small set of style defaults used when no Emacs snapshot exists.""" - uimap["link"]["underline"]=True + uimap["link"]["underline"]={"style":"line","color":None} for face in ("lazy-highlight","show-paren-match"): - uimap[face]["underline"]=True + uimap[face]["underline"]={"style":"line","color":None} for face in ("error","warning","success"): - uimap[face]["bold"]=True + uimap[face]["weight"]="bold" for face in ("mode-line","mode-line-inactive"): uimap[face]["box"]={"style":"released","width":1,"color":None} +def apply_hover_box_default(uimap): + """Seed the mode-line hover face's box. + + `mode-line-highlight` (applied via mouse-face to the clickable mode-line + segments) is absent from the captured Emacs snapshot, so seed() returns + blank for it in both branches below. Emacs's stock default is a raised + released-button box; default to that so the studio reflects current + behavior, then let the user flatten or recolor it. A future snapshot that + captures the face wins (the box-already-set guard leaves it alone).""" + face=uimap.get("mode-line-highlight") + if face and not face.get("box"): + face["box"]={"style":"released","width":1,"color":None} + def build_uimap(ui_faces,defaults): if defaults.available: - return {face[0]:ui_face_spec(defaults.seed(face[0],False)) for face in ui_faces} - uimap={face[0]:ui_face_spec() for face in ui_faces} - apply_builtin_fallback_styles(uimap) + uimap={face[0]:ui_face_spec(defaults.seed(face[0],False)) for face in ui_faces} + else: + uimap={face[0]:ui_face_spec() for face in ui_faces} + apply_builtin_fallback_styles(uimap) + apply_hover_box_default(uimap) return uimap def build_syntax(cols,map_,bold,italic,defaults): @@ -133,7 +159,7 @@ def apply_seed_basics(data,palette,uimap,locks): palette=data['palette'] if data.get('ui'): for key,value in data['ui'].items(): - uimap[key]=value + uimap[key]=migrate_legacy(value) if 'locks' in data: locks=data['locks'] return palette,uimap,locks @@ -159,33 +185,28 @@ def add_palette_color(palette,defaults,value,label=None): name=base+'-'+str(n); n+=1 palette.append([value,name,column_id(name)]) +def _harvest_spec_colors(palette,defaults,spec): + """Add a face spec's fg, bg, and box color (if any) to the palette, in order.""" + add_palette_color(palette,defaults,spec.get('fg')) + add_palette_color(palette,defaults,spec.get('bg')) + if spec.get('box'): + add_palette_color(palette,defaults,spec['box'].get('color')) + def add_default_palette_colors(palette,map_,syntax,uimap,apps,defaults): for key,value in map_.items(): add_palette_color(palette,defaults,value,'bg' if key=='bg' else 'fg' if key=='p' else None) for spec in syntax.values(): - add_palette_color(palette,defaults,spec.get('fg')) - add_palette_color(palette,defaults,spec.get('bg')) - if spec.get('box'): - add_palette_color(palette,defaults,spec['box'].get('color')) + _harvest_spec_colors(palette,defaults,spec) for _face,spec in uimap.items(): - add_palette_color(palette,defaults,spec.get('fg')) - add_palette_color(palette,defaults,spec.get('bg')) - if spec.get('box'): - add_palette_color(palette,defaults,spec['box'].get('color')) + _harvest_spec_colors(palette,defaults,spec) for app in apps.values(): for _face,_label,spec in app['faces']: - add_palette_color(palette,defaults,spec.get('fg')) - add_palette_color(palette,defaults,spec.get('bg')) - if spec.get('box'): - add_palette_color(palette,defaults,spec['box'].get('color')) + _harvest_spec_colors(palette,defaults,spec) def apply_seed_packages(apps,data,seed): if seed: apply_package_overrides(apps,data.get('packages')) -MAP,BOLD,ITALIC_MAP=initial_maps(COLS,DEFAULTS) - -PALETTE=[[MAP['bg'],"bg","ground"],[MAP['p'],"fg","ground"]] CATS=[["bg","bg (ground)","Aa Bb 123"],["p","fg","other / whitespace"],["kw","keyword","class def if return"],["bi","builtin","len echo printf"], ["pp","preprocessor","#include #define"],["fnd","function · def","resolve push"], ["fnc","function · call","printf rsync get"],["dec","decorator → type","@dataclass"], @@ -197,7 +218,9 @@ CATS=[["bg","bg (ground)","Aa Bb 123"],["p","fg","other / whitespace"],["kw","ke ["punc","punctuation","{ } ( ) ;"]] UI_FACES=[["cursor","cursor","Aa|"],["region","region (selection)","selected text"], ["hl-line","hl-line (current line)","current line"],["highlight","highlight","hover"], - ["mode-line","mode-line","status active"],["mode-line-inactive","mode-line-inactive","status idle"], + ["mode-line","mode-line","status active"], + ["mode-line-highlight","mode-line-highlight (hover)","git:main"], + ["mode-line-inactive","mode-line-inactive","status idle"], ["fringe","fringe","| |"],["line-number","line-number"," 42"], ["line-number-current-line","line-number-current-line","> 42"],["minibuffer-prompt","minibuffer-prompt","M-x "], ["isearch","isearch (match)","match"],["lazy-highlight","lazy-highlight","other match"], @@ -205,95 +228,97 @@ UI_FACES=[["cursor","cursor","Aa|"],["region","region (selection)","selected tex ["show-paren-mismatch","show-paren-mismatch",") ("],["link","link","https://"], ["error","error","error!"],["warning","warning","warning"], ["success","success","ok"],["vertical-border","vertical-border","|"]] -UIMAP=build_uimap(UI_FACES,DEFAULTS) -# Optional palette seed: THEME_STUDIO_SEED=<file.json> seeds the tool's starting -# palette / syntax / UI from a theme.json (path relative to -# this dir), instead of the hardcoded defaults above. Unset leaves them unchanged. -# Placed after every default it overrides (notably UIMAP) so the merge has targets. -# Mirrors what the in-page Import does, so reseed and import agree. -LOCKS=[] -# THEME_STUDIO_SEED=<file>.json opens an existing theme as the starting point. -# Unset starts empty: only bg/fg are in the palette. -_seed=os.environ.get('THEME_STUDIO_SEED') -_d=load_seed_data(_seed) -PALETTE,UIMAP,LOCKS=apply_seed_basics(_d,PALETTE,UIMAP,LOCKS) -PALETTE=normalize_palette(PALETTE) -SYNTAX=build_syntax(COLS,MAP,BOLD,ITALIC_MAP,DEFAULTS) -apply_syntax_seed(_d if _seed else {},SYNTAX,MAP) -# Bespoke package face lists and seed defaults live in face_data.py. Each entry -# is (key, label, preview, FACES, prefix, SEED); add an app by adding one row. -_BESPOKE_APPS=[ - ("org-mode","org-mode","org",ORG_FACES,"org-",ORG_SEED), - ("magit","magit","magit",MAGIT_FACES,"magit-",MAGIT_SEED), - ("elfeed","elfeed","elfeed",ELFEED_FACES,"elfeed-",ELFEED_SEED), - ("mu4e","mu4e","mu4e",MU4E_FACES,"mu4e-",MU4E_SEED), - ("gnus","gnus (mu4e article view)","gnus",GNUS_FACES,"gnus-",GNUS_SEED), - ("org-faces","org-faces","orgfaces",ORGFACES_FACES,"org-faces-",ORGFACES_SEED), - ("ghostel","ghostel","ghostel",GHOSTEL_FACES,"ghostel-",GHOSTEL_SEED), - ("auto-dim-other-buffers","auto-dim","autodim",AUTODIM_FACES,"auto-dim-other-buffers-",AUTODIM_SEED), - ("dashboard","dashboard","dashboard",DASHBOARD_FACES,"dashboard-",DASHBOARD_SEED), - ("lsp-mode","lsp-mode","lsp",LSP_FACES,"lsp-",LSP_SEED), - ("git-gutter","git-gutter","gitgutter",GITGUTTER_FACES,"git-gutter:",GITGUTTER_SEED), - ("flycheck","flycheck","flycheck",FLYCHECK_FACES,"flycheck-",FLYCHECK_SEED), - ("dired","dired","dired",DIRED_FACES,"dired-",DIRED_SEED), - ("dirvish","dirvish","dirvish",DIRVISH_FACES,"dirvish-",DIRVISH_SEED), - ("calibredb","calibredb","calibredb",CALIBREDB_FACES,"calibredb-",CALIBREDB_SEED), - ("erc","erc","erc",ERC_FACES,"erc-",ERC_SEED), - ("org-drill","org-drill","orgdrill",ORGDRILL_FACES,"org-drill-",ORGDRILL_SEED), - ("org-noter","org-noter","orgnoter",ORGNOTER_FACES,"org-noter-",ORGNOTER_SEED), - ("signel","signel","signel",SIGNEL_FACES,"signel-",SIGNEL_SEED), - ("pearl","pearl","pearl",PEARL_FACES,"pearl-",PEARL_SEED), - ("slack","slack","slack",SLACK_FACES,"slack-",SLACK_SEED), - ("telega","telega","telega",TELEGA_FACES,"telega-",TELEGA_SEED), - ("shr","shr (HTML: nov/eww/mail)","shr",SHR_FACES,"shr-",SHR_SEED), -] -APPS={key:{"label":label,"preview":preview,"faces":face_rows(faces,prefix,seed)} - for key,label,preview,faces,prefix,seed in _BESPOKE_APPS} -# Phase 6: merge the generated all-package inventory (refresh with build-inventory.el). -# Bespoke apps stay; every other installed package becomes an editable generic app. -_inv_path=os.path.join(HERE,"package-inventory.json") -add_inventory_apps(APPS, _inv_path) -apply_default_face_seeds(APPS, DEFAULTS) -# Apply seed theme package overrides when THEME_STUDIO_SEED is set: each full -# per-face spec (color + structure) replaces the hardcoded face seed before render. -apply_seed_packages(APPS,_d,_seed) +OUT=os.path.join(HERE,'theme-studio.html') +_CACHE={} -if DEFAULTS.available: - add_default_palette_colors(PALETTE,MAP,SYNTAX,UIMAP,APPS,DEFAULTS) +def _build(): + """Assemble the page, caching the derived data + HTML. Deferred from import + so a consumer that only needs the cheap module constants (e.g. + face_coverage.py reading UI_FACES) does not pay the full DEFAULTS + inventory + + fill cost; the file write stays __main__-guarded as before.""" + if _CACHE: + return _CACHE + DEFAULTS=DefaultFaces.from_path(DEFAULT_FACES_PATH) + MAP,BOLD,ITALIC_MAP=initial_maps(COLS,DEFAULTS) + PALETTE=[[MAP['bg'],"bg","ground"],[MAP['p'],"fg","ground"]] + UIMAP=build_uimap(UI_FACES,DEFAULTS) -PALETTE=normalize_palette(PALETTE) -HTML=read_text('theme-studio.template.html') -# Fill the data placeholders. str.replace is literal (no backref interpretation), -# so backslashes in the inlined JS survive intact — the escaping-bug class that -# the triple-quoted string used to cause is gone now that app.js is a real file. -# Caveat: these tokens are replaced everywhere they appear, including inside code -# comments. Don't write a placeholder name (COLORMATH_J, APP_CORE_J, ...) in -# prose in any inlined file, or that prose gets the body spliced into it too. -def fill_data(s): - return (s.replace("COLORMATH_J",COLORMATH_BODY) - .replace("APP_CORE_J",APP_CORE_BODY) - .replace("APP_UTIL_J",APP_UTIL_BODY) - .replace("PALETTE_GENERATOR_CORE_J",PALETTE_GENERATOR_CORE_BODY) - .replace("PALETTE_GENERATOR_UI_J",PALETTE_GENERATOR_UI_BODY) - .replace("PALETTE_ACTIONS_J",PALETTE_ACTIONS_BODY) - .replace("BROWSER_GATES_J",BROWSER_GATES_BODY) - .replace("COLOR_NAMES_J",json.dumps(COLOR_NAMES)) - .replace("SAMPLES_J",json.dumps(SAMPLES)) - .replace("PALETTE_J",json.dumps(PALETTE)).replace("CATS_J",json.dumps(CATS)) - .replace("UIFACES_J",json.dumps(UI_FACES)).replace("UIMAP_J",json.dumps(UIMAP)).replace("APPS_J",json.dumps(APPS)) - .replace("SYNTAX_J",json.dumps(SYNTAX)).replace("MAP_J",json.dumps(MAP)).replace("LOCKS_J",json.dumps(LOCKS))) + # Optional palette seed: THEME_STUDIO_SEED=<file.json> seeds the tool's starting + # palette / syntax / UI from a theme.json (path relative to + # this dir), instead of the hardcoded defaults above. Unset leaves them unchanged. + # Placed after every default it overrides (notably UIMAP) so the merge has targets. + # Mirrors what the in-page Import does, so reseed and import agree. + LOCKS=[] + # THEME_STUDIO_SEED=<file>.json opens an existing theme as the starting point. + # Unset starts empty: only bg/fg are in the palette. + _seed=os.environ.get('THEME_STUDIO_SEED') + _d=load_seed_data(_seed) + PALETTE,UIMAP,LOCKS=apply_seed_basics(_d,PALETTE,UIMAP,LOCKS) + PALETTE=normalize_palette(PALETTE) + SYNTAX=build_syntax(COLS,MAP,BOLD,ITALIC_MAP,DEFAULTS) + apply_syntax_seed(_d if _seed else {},SYNTAX,MAP) + # Bespoke apps are single-sourced as BESPOKE_APP_SPECS in face_data.py (one + # row per app: key, label, preview, FACES, prefix, SEED). + APPS={key:{"label":label,"preview":preview,"faces":face_rows(faces,prefix,seed)} + for key,label,preview,faces,prefix,seed in BESPOKE_APP_SPECS} + # Phase 6: merge the generated all-package inventory (refresh with build-inventory.el). + # Bespoke apps stay; every other installed package becomes an editable generic app. + _inv_path=os.path.join(HERE,"package-inventory.json") + add_inventory_apps(APPS, _inv_path) + apply_default_face_seeds(APPS, DEFAULTS) + # Apply seed theme package overrides when THEME_STUDIO_SEED is set: each full + # per-face spec (color + structure) replaces the hardcoded face seed before render. + apply_seed_packages(APPS,_d,_seed) -# Splice the stylesheet and script in first, then fill the data placeholders they -# carry. The page contains app.js exactly as fill_data(APP_BODY) renders it — -# APP_FILLED is that rendering, the handle the inline-integrity test asserts on. -HTML=fill_data(HTML.replace("STYLES_CSS",STYLES).replace("APP_JS",APP_BODY)) -APP_FILLED=fill_data(APP_BODY) -OUT=os.path.join(HERE,'theme-studio.html') + if DEFAULTS.available: + add_default_palette_colors(PALETTE,MAP,SYNTAX,UIMAP,APPS,DEFAULTS) + + PALETTE=normalize_palette(PALETTE) + HTML=read_text('theme-studio.template.html') + # Fill the data placeholders. str.replace is literal (no backref interpretation), + # so backslashes in the inlined JS survive intact — the escaping-bug class that + # the triple-quoted string used to cause is gone now that app.js is a real file. + # Caveat: these tokens are replaced everywhere they appear, including inside code + # comments. Don't write a placeholder name (COLORMATH_J, APP_CORE_J, ...) in + # prose in any inlined file, or that prose gets the body spliced into it too. + def fill_data(s): + return (s.replace("COLORMATH_J",COLORMATH_BODY) + .replace("APP_CORE_J",APP_CORE_BODY) + .replace("PREVIEWS_J",PREVIEWS_BODY) + .replace("APP_UTIL_J",APP_UTIL_BODY) + .replace("PALETTE_GENERATOR_CORE_J",PALETTE_GENERATOR_CORE_BODY) + .replace("PALETTE_GENERATOR_UI_J",PALETTE_GENERATOR_UI_BODY) + .replace("PALETTE_ACTIONS_J",PALETTE_ACTIONS_BODY) + .replace("BROWSER_GATES_J",BROWSER_GATES_BODY) + .replace("COLOR_NAMES_J",json.dumps(COLOR_NAMES)) + .replace("FACE_DOCS_J",json.dumps(FACE_DOCS)).replace("SYNTAX_DOCS_J",json.dumps(SYNTAX_DOCS)) + .replace("SAMPLES_J",json.dumps(SAMPLES)) + .replace("PALETTE_J",json.dumps(PALETTE)).replace("CATS_J",json.dumps(CATS)) + .replace("UIFACES_J",json.dumps(UI_FACES)).replace("UIMAP_J",json.dumps(UIMAP)).replace("APPS_J",json.dumps(APPS)) + .replace("SYNTAX_J",json.dumps(SYNTAX)).replace("MAP_J",json.dumps(MAP)).replace("LOCKS_J",json.dumps(LOCKS))) + + # Splice the stylesheet and script in first, then fill the data placeholders they + # carry. The page contains app.js exactly as fill_data(APP_BODY) renders it — + # APP_FILLED is that rendering, the handle the inline-integrity test asserts on. + HTML=fill_data(HTML.replace("STYLES_CSS",STYLES).replace("APP_JS",APP_BODY)) + APP_FILLED=fill_data(APP_BODY) + _CACHE.update(DEFAULTS=DEFAULTS, MAP=MAP, BOLD=BOLD, ITALIC_MAP=ITALIC_MAP, + PALETTE=PALETTE, UIMAP=UIMAP, LOCKS=LOCKS, SYNTAX=SYNTAX, + APPS=APPS, HTML=HTML, APP_FILLED=APP_FILLED) + return _CACHE + +def __getattr__(name): + # PEP 562: lazily expose any built attribute (HTML, MAP, APPS, ...). Every + # other name is a real module global and never reaches here. + built = _build() + if name in built: + return built[name] + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") def render_theme_studio(out_path=OUT): with open(out_path,"w") as out: - out.write(HTML) + out.write(_build()['HTML']) print("wrote",out_path) if __name__=='__main__': diff --git a/scripts/theme-studio/inline-strip.mjs b/scripts/theme-studio/inline-strip.mjs new file mode 100644 index 000000000..112d55ce6 --- /dev/null +++ b/scripts/theme-studio/inline-strip.mjs @@ -0,0 +1,15 @@ +// Shared by the inline-integrity tests (test-colormath.mjs, test-app-core.mjs, +// test-app-util.mjs). Mirrors strip_exports in generate.py: drop top-level +// export/import lines (a pure module may import a peer for its own unit tests, +// while the inlined page copy relies on that peer already being present), then +// rstrip. The page is asserted to carry the stripped body verbatim, so this MUST +// stay aligned with generate.py's strip_exports -- one definition keeps the three +// test copies from drifting apart. +// +// (This file matches the `*.mjs` test glob in run-tests.sh; it carries no tests, +// so it contributes zero to the count.) +export const stripInlinedBody = (s) => + s.split('\n') + .filter((l) => !(l.startsWith('export') || l.startsWith('import'))) + .join('\n') + .replace(/\s+$/, ''); diff --git a/scripts/theme-studio/palette-generator-core.js b/scripts/theme-studio/palette-generator-core.js index 6bce0d59a..6ad2bf44f 100644 --- a/scripts/theme-studio/palette-generator-core.js +++ b/scripts/theme-studio/palette-generator-core.js @@ -2,11 +2,9 @@ // from app-core.js, but owns candidate hue selection, naming, contrast filtering, // and conversion from preview columns to palette entries. import { normHex } from './app-util.js'; -import { oklch2hex, srgb2oklab, oklab2oklch, contrast, deltaE } from './colormath.js'; +import { oklch2hex, contrast, deltaE, oklchOf, isPureEndpointHex } from './colormath.js'; import { columnsFromPalette } from './app-core.js'; -function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} -function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';} function generatedExistingNames(palette){ return new Set((palette||[]).map(p=>(p&&p[1]||'').toLowerCase()).filter(Boolean)); } @@ -27,7 +25,7 @@ function uniqueGeneratedName(base,used){ function hueOfHex(hex,fallback){ const h=typeof hex==='string'?normHex(hex):null; if(!h)return fallback; - const lch=oklab2oklch(srgb2oklab(h)); + const lch=oklchOf(h); return Number.isFinite(lch.H)?lch.H:fallback; } function generatorSourceHue(palette,ground,cfg){ @@ -143,16 +141,14 @@ function randomChroma(rng){ } function vibeChroma(vibe,rng){ const rnd=typeof rng==='function'?rng:Math.random; - if(vibe==='muted')return 0.045+rnd()*0.035; - if(vibe==='pastel')return 0.035+rnd()*0.045; - if(vibe==='deep')return 0.085+rnd()*0.055; - if(vibe==='jewel')return 0.12+rnd()*0.075; - if(vibe==='earthy')return 0.055+rnd()*0.04; - if(vibe==='warm'||vibe==='cool')return 0.08+rnd()*0.06; - if(vibe==='neon')return 0.18+rnd()*0.09; - if(vibe==='strange')return 0.145+rnd()*0.095; - if(vibe==='balanced')return 0.075+rnd()*0.045; - return 0.12+rnd()*0.07; + // [base, range]: chroma is base + rnd()*range. Table, not an if-ladder, so a + // vibe is one row to read or tune. The default covers unknown vibes. + const t={muted:[0.045,0.035],pastel:[0.035,0.045],deep:[0.085,0.055], + jewel:[0.12,0.075],earthy:[0.055,0.04],warm:[0.08,0.06], + cool:[0.08,0.06],neon:[0.18,0.09],strange:[0.145,0.095], + balanced:[0.075,0.045]}; + const [base,range]=t[vibe]||[0.12,0.07]; + return base+rnd()*range; } function accentCandidateForHue(hue,ground,cfg){ const C=cfg&&cfg.vibe?vibeChroma(cfg.vibe,cfg.rng):(cfg&&cfg.scheme==='random'?randomChroma(cfg.rng):generatorChroma(cfg&&cfg.chromaMode)), target=generatorTarget(cfg&&cfg.contrastMode), bg=ground&&ground.bg; diff --git a/scripts/theme-studio/previews.js b/scripts/theme-studio/previews.js new file mode 100644 index 000000000..bef8b7c12 --- /dev/null +++ b/scripts/theme-studio/previews.js @@ -0,0 +1,463 @@ +// previews.js -- the bespoke per-package preview renderers, extracted from +// app.js. Pure preview HTML builders (ofs/os/previewLines + renderXxxPreview); +// they reference shared globals (PKGMAP, MAP, faceCss, effFg, ...) and are +// inlined into the page's single script element via the PREVIEWS_J token in app.js. +function ofs(app,face){const f=PKGMAP[app][face]||{},fg=effFg(pkgEffFg(app,face)),bg=pkgEffBg(app,face);return faceCss(f,fg,bg,{fontSize:(f.height||1),boxBg:bg||MAP['bg']});} +function os(app,face,txt){return `<span data-face="${face}" style="${ofs(app,face)}">${txt}</span>`;} +// Shared wrapper for the line-based package previews: a monospace pre block. +// Each renderer builds its own L array of os(...) lines and returns previewLines(L). +function previewLines(L){return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;} +function renderOrgPreview(){const a='org-mode',L=[]; + L.push(os(a,'org-document-info-keyword','#+TITLE:')+' '+os(a,'org-document-title','Project Notes')); + L.push(os(a,'org-document-info-keyword','#+AUTHOR:')+' '+os(a,'org-document-info','Craig Jennings')); + L.push(os(a,'org-meta-line','#+STARTUP: overview')); + L.push(''); + L.push(os(a,'org-level-1','* Inbox')+' '+os(a,'org-tag',':work:')+os(a,'org-tag-group',':@office:')); + L.push(os(a,'org-level-2','** ')+os(a,'org-todo','TODO')+os(a,'org-level-2',' Draft the spec')+' '+os(a,'org-priority','[#A]')+' '+os(a,'org-tag',':spec:')); + L.push(' '+os(a,'org-special-keyword','SCHEDULED:')+' '+os(a,'org-date','<2026-06-08 Sun>')+' '+os(a,'org-special-keyword','DEADLINE:')+' '+os(a,'org-date','<2026-06-12 Thu>')); + L.push(' '+os(a,'org-drawer',':PROPERTIES:')); + L.push(' '+os(a,'org-special-keyword',':ID:')+' '+os(a,'org-property-value','abc-123-def')); + L.push(' '+os(a,'org-drawer',':END:')); + L.push(' '+os(a,'org-list-dt','- term ::')+' definition, with a '+os(a,'org-footnote','[fn:1]')+' note.'); + L.push(' '+os(a,'org-checkbox','[X]')+' done item '+os(a,'org-checkbox-statistics-done','[2/2]')); + L.push(' '+os(a,'org-checkbox','[ ]')+' open item '+os(a,'org-checkbox-statistics-todo','[0/3]')+' '+os(a,'org-warning','(!)')); + L.push(os(a,'org-level-2','** ')+os(a,'org-done','DONE')+os(a,'org-headline-done',' Ship the tool')); + L.push(os(a,'org-level-3','*** ')+os(a,'org-todo','TODO')+os(a,'org-headline-todo',' Heading three')); + L.push(os(a,'org-level-4','**** four')+' / '+os(a,'org-level-5','***** five')+' / '+os(a,'org-level-6','****** six')+' / '+os(a,'org-level-7','******* seven')+' / '+os(a,'org-level-8','******** eight')); + L.push(' Inline '+os(a,'org-code','=code=')+', '+os(a,'org-verbatim','~verbatim~')+', '+os(a,'org-inline-src-block','src_py{1+1}')+','); + L.push(' a '+os(a,'org-link','[[https://gnu.org][link]]')+', a '+os(a,'org-target','<<target>>')+', a '+os(a,'org-macro','{{{macro}}}')+','); + L.push(' a '+os(a,'org-cite','[cite:')+os(a,'org-cite-key','@knuth1984')+os(a,'org-cite',']')+', a date '+os(a,'org-sexp-date','<%%(diary-float 6 5 2)>')+'.'); + L.push(' '+os(a,'org-quote','#+begin_quote')+' a '+os(a,'org-verse','verse')+' line, latex '+os(a,'org-latex-and-related','$E = mc^2$')+'.'); + L.push(''); + L.push(' '+os(a,'org-block-begin-line','#+begin_src elisp')); + L.push(' '+os(a,'org-block',' (message "hi")')); + L.push(' '+os(a,'org-block-end-line','#+end_src')); + L.push(''); + L.push(' '+os(a,'org-table-header','| name | hex |')); + L.push(' '+os(a,'org-table','|------+---------|')); + L.push(' '+os(a,'org-table-row','| blue | #67809c |')+' '+os(a,'org-formula',':=vsum(@2)')); + L.push(' '+os(a,'org-column-title','Effort')+' '+os(a,'org-column','| 0:30 |')+' '+os(a,'org-archived','* archived')+os(a,'org-ellipsis',' ...')); + L.push(''); + L.push(os(a,'org-agenda-structure','Week-agenda (W23):')); + L.push(os(a,'org-agenda-date','Monday 8 June 2026')); + L.push(os(a,'org-agenda-date-today','Tuesday 9 June 2026')+' '+os(a,'org-agenda-current-time','10:24')+' '+os(a,'org-time-grid','----------')); + L.push(os(a,'org-agenda-date-weekend','Saturday 13 June')+' / '+os(a,'org-agenda-date-weekend-today','wknd-today')); + L.push(' '+os(a,'org-scheduled-previously','Sched.past:')+' overdue '+os(a,'org-agenda-done','x done item')); + L.push(' '+os(a,'org-scheduled','Scheduled:')+' a task '+os(a,'org-scheduled-today','due today')); + L.push(' '+os(a,'org-imminent-deadline','Deadline!')+' / '+os(a,'org-upcoming-deadline','upcoming')+' / '+os(a,'org-upcoming-distant-deadline','distant')); + L.push(' '+os(a,'org-agenda-dimmed-todo-face','dimmed todo')+' '+os(a,'org-agenda-diary','diary')+' '+os(a,'org-agenda-clocking','clocking')); + L.push(' '+os(a,'org-agenda-calendar-event','cal-event')+' / '+os(a,'org-agenda-calendar-sexp','cal-sexp')+' / '+os(a,'org-agenda-calendar-daterange','range')); + L.push(' '+os(a,'org-agenda-structure-secondary','secondary')+' '+os(a,'org-agenda-structure-filter','filter')+' '+os(a,'org-agenda-restriction-lock','lock')+' '+os(a,'org-agenda-column-dateline','col-date')); + L.push(' Filters: '+os(a,'org-agenda-filter-category','cat')+' '+os(a,'org-agenda-filter-tags','tags')+' '+os(a,'org-agenda-filter-effort','effort')+' '+os(a,'org-agenda-filter-regexp','re')); + L.push(' '+os(a,'org-mode-line-clock','[0:45]')+' / '+os(a,'org-mode-line-clock-overrun','[OVER]')+' '+os(a,'org-dispatcher-highlight','[d]ispatch')); + return previewLines(L); +} +function renderMagitPreview(){const a='magit',L=[]; + L.push(os(a,'magit-header-line',' Magit: dotemacs ')+' '+os(a,'magit-header-line-key','g')+os(a,'magit-header-line-log-select',' refresh')); + L.push(os(a,'magit-head','Head:')+' '+os(a,'magit-branch-current','main')+' '+os(a,'magit-diff-revision-summary','Ship the tool')); + L.push(os(a,'magit-head','Merge:')+' '+os(a,'magit-branch-remote','origin/main')+' '+os(a,'magit-branch-local','main')); + L.push(os(a,'magit-head','Push:')+' '+os(a,'magit-branch-remote-head','origin/main')); + L.push(os(a,'magit-head','Upstream:')+' '+os(a,'magit-branch-upstream','origin/main')+' '+os(a,'magit-branch-warning','(diverged)')); + L.push(''); + L.push(os(a,'magit-section-heading','Untracked files')+' '+os(a,'magit-section-child-count','(2)')); + L.push(' '+os(a,'magit-filename','notes.txt')+' '+os(a,'magit-dimmed','(ignored sibling)')); + L.push(os(a,'magit-section-highlight',' scratch.el (highlighted row)')); + L.push(''); + L.push(os(a,'magit-section-heading','Unstaged changes')+' '+os(a,'magit-section-child-count','(1)')); + L.push(os(a,'magit-diff-file-heading','modified generate.py')); + L.push(os(a,'magit-diff-hunk-heading','@@ -1,4 +1,5 @@ def main')); + L.push(os(a,'magit-diff-context',' unchanged context')); + L.push(os(a,'magit-diff-removed','- old line')+os(a,'magit-diff-whitespace-warning',' ')); + L.push(os(a,'magit-diff-added','+ new line')); + L.push(''); + L.push(os(a,'magit-section-heading','Staged changes')+' '+os(a,'magit-diffstat-added','++++')+os(a,'magit-diffstat-removed','--')); + L.push(os(a,'magit-diff-file-heading-highlight','modified README.md (highlighted heading)')); + L.push(os(a,'magit-diff-hunk-heading-highlight','@@ hunk heading highlight @@')); + L.push(os(a,'magit-diff-added-highlight','+ added highlight')+' '+os(a,'magit-diff-removed-highlight','- removed highlight')); + L.push(os(a,'magit-diff-context-highlight',' context highlight')); + L.push(''); + L.push(os(a,'magit-section-heading','Stashes')); + L.push(' '+os(a,'magit-refname-stash','stash@{0}')+' '+os(a,'magit-refname-wip','wip')+' '+os(a,'magit-refname-pullreq','pr/42')+' '+os(a,'magit-refname','refs/heads/x')); + L.push(''); + L.push(os(a,'magit-section-heading','Recent commits')); + L.push(os(a,'magit-log-graph','* ')+os(a,'magit-hash','b5b1869f')+' '+os(a,'magit-log-date','06-08')+' '+os(a,'magit-log-author','Craig')+' enlarge the picker'); + L.push(os(a,'magit-log-graph','* ')+os(a,'magit-hash','4fa5e995')+' '+os(a,'magit-log-date','06-07')+' '+os(a,'magit-log-author','Craig')+' '+os(a,'magit-keyword','[feat]')+' picker'); + L.push(os(a,'magit-log-graph','* ')+os(a,'magit-hash','de07e01a')+' '+os(a,'magit-log-date','06-05')+' '+os(a,'magit-log-author','Craig')+' '+os(a,'magit-tag','v0.3')+' '+os(a,'magit-keyword-squash','!squash')); + L.push(''); + L.push(os(a,'magit-section-secondary-heading','Merge conflict')+' '+os(a,'magit-diff-lines-heading','lines 10-14')+os(a,'magit-diff-lines-boundary','|')); + L.push(' '+os(a,'magit-diff-conflict-heading','=======')+' '+os(a,'magit-diff-conflict-heading-highlight','(hl)')); + L.push(' '+os(a,'magit-diff-base','base')+'/'+os(a,'magit-diff-base-highlight','base-hl')+' '+os(a,'magit-diff-our','ours')+'/'+os(a,'magit-diff-our-highlight','ours-hl')+' '+os(a,'magit-diff-their','theirs')+'/'+os(a,'magit-diff-their-highlight','theirs-hl')); + L.push(' '+os(a,'magit-diff-hunk-region','hunk-region')+' '+os(a,'magit-diff-file-heading-selection','file-sel')+' '+os(a,'magit-diff-hunk-heading-selection','hunk-sel')+' '+os(a,'magit-section-heading-selection','sec-sel')+' '+os(a,'magit-diff-revision-summary-highlight','rev-sum-hl')); + L.push(''); + L.push(os(a,'magit-section-heading','Reflog')); + L.push(' '+os(a,'magit-reflog-commit','commit')+' '+os(a,'magit-reflog-amend','amend')+' '+os(a,'magit-reflog-merge','merge')+' '+os(a,'magit-reflog-checkout','checkout')+' '+os(a,'magit-reflog-reset','reset')+' '+os(a,'magit-reflog-rebase','rebase')+' '+os(a,'magit-reflog-cherry-pick','cherry-pick')+' '+os(a,'magit-reflog-remote','remote')+' '+os(a,'magit-reflog-other','other')); + L.push(os(a,'magit-section-heading','Rebase sequence')); + L.push(' '+os(a,'magit-sequence-pick','pick')+' '+os(a,'magit-sequence-stop','stop')+' '+os(a,'magit-sequence-part','part')+' '+os(a,'magit-sequence-head','head')+' '+os(a,'magit-sequence-drop','drop')+' '+os(a,'magit-sequence-done','done')+' '+os(a,'magit-sequence-onto','onto')+' '+os(a,'magit-sequence-exec','exec')); + L.push(os(a,'magit-section-heading','Bisect / Cherry / Process')); + L.push(' '+os(a,'magit-bisect-good','good')+' '+os(a,'magit-bisect-bad','bad')+' '+os(a,'magit-bisect-skip','skip')+' '+os(a,'magit-cherry-equivalent','equivalent')+' '+os(a,'magit-cherry-unmatched','unmatched')); + L.push(' '+os(a,'magit-process-ok','OK')+' '+os(a,'magit-process-ng','NG')+' '+os(a,'magit-mode-line-process','[fetch]')+' '+os(a,'magit-mode-line-process-error','[error]')); + L.push(os(a,'magit-section-heading','Blame')); + L.push(os(a,'magit-blame-margin','margin')+os(a,'magit-blame-heading',' b5b1869f ')) + L.push(' '+os(a,'magit-blame-hash','b5b1869f')+' '+os(a,'magit-blame-name','Craig')+' '+os(a,'magit-blame-date','2026-06-08')+' '+os(a,'magit-blame-summary','enlarge picker')+' '+os(a,'magit-blame-highlight','hl')+' '+os(a,'magit-blame-dimmed','dim')); + L.push(os(a,'magit-section-heading','Signatures')+os(a,'magit-left-margin',' ')); + L.push(' '+os(a,'magit-signature-good','good')+' '+os(a,'magit-signature-bad','bad')+' '+os(a,'magit-signature-untrusted','untrusted')+' '+os(a,'magit-signature-expired','expired')+' '+os(a,'magit-signature-expired-key','expired-key')+' '+os(a,'magit-signature-revoked','revoked')+' '+os(a,'magit-signature-error','error')); + return previewLines(L);} +function renderElfeedPreview(){const a='elfeed',L=[]; + L.push(os(a,'elfeed-search-filter-face','@6-months-ago +unread')+' '+os(a,'elfeed-search-unread-count-face','3/120')+' '+os(a,'elfeed-search-last-update-face','updated 02:24')); + L.push(''); + L.push(os(a,'elfeed-search-date-face','2026-06-08')+' '+os(a,'elfeed-search-feed-face','Planet Emacs')+' '+os(a,'elfeed-search-unread-title-face','New release of Magit')+' '+os(a,'elfeed-search-tag-face',':emacs:')); + L.push(os(a,'elfeed-search-date-face','2026-06-07')+' '+os(a,'elfeed-search-feed-face','LWN')+' '+os(a,'elfeed-search-unread-title-face','Kernel 6.18 lands')+' '+os(a,'elfeed-search-tag-face',':linux:')); + L.push(os(a,'elfeed-search-date-face','2026-06-05')+' '+os(a,'elfeed-search-feed-face','Hacker News')+' '+os(a,'elfeed-search-title-face','Show HN: a theme editor')+' '+os(a,'elfeed-search-tag-face',':show:')); + L.push(''); + L.push(os(a,'elfeed-log-date-face','02:24:01')+' '+os(a,'elfeed-log-info-level-face','INFO ')+' updated 12 feeds'); + L.push(os(a,'elfeed-log-date-face','02:24:02')+' '+os(a,'elfeed-log-warn-level-face','WARN ')+' slow feed: example.com'); + L.push(os(a,'elfeed-log-date-face','02:24:03')+' '+os(a,'elfeed-log-error-level-face','ERROR')+' failed: bad.example'); + L.push(os(a,'elfeed-log-date-face','02:24:04')+' '+os(a,'elfeed-log-debug-level-face','DEBUG')+' parsed 340 entries'); + return previewLines(L);} +function renderGhostelPreview(){const a='ghostel',L=[]; + L.push(os(a,'ghostel-default','craig@host')+' '+os(a,'ghostel-color-green','~/code')+' $ ls'+os(a,'ghostel-fake-cursor',' ')+os(a,'ghostel-fake-cursor-box','[ ]')); + L.push(''); + L.push(os(a,'ghostel-default','normal:')+' '+os(a,'ghostel-color-black','black')+' '+os(a,'ghostel-color-red','red')+' '+os(a,'ghostel-color-green','green')+' '+os(a,'ghostel-color-yellow','yellow')+' '+os(a,'ghostel-color-blue','blue')+' '+os(a,'ghostel-color-magenta','magenta')+' '+os(a,'ghostel-color-cyan','cyan')+' '+os(a,'ghostel-color-white','white')); + L.push(os(a,'ghostel-default','bright:')+' '+os(a,'ghostel-color-bright-black','black')+' '+os(a,'ghostel-color-bright-red','red')+' '+os(a,'ghostel-color-bright-green','green')+' '+os(a,'ghostel-color-bright-yellow','yellow')+' '+os(a,'ghostel-color-bright-blue','blue')+' '+os(a,'ghostel-color-bright-magenta','magenta')+' '+os(a,'ghostel-color-bright-cyan','cyan')+' '+os(a,'ghostel-color-bright-white','white')); + L.push(''); + L.push(os(a,'ghostel-default','default terminal output, 256-color text and a blinking ')+os(a,'ghostel-fake-cursor','cursor')+'.'); + return previewLines(L);} +function renderDashboardPreview(){const a='dashboard',L=[]; + L.push(os(a,'dashboard-text-banner',' [ dashboard banner image ]')); + L.push(os(a,'dashboard-banner-logo-title','Emacs: The Editor That Saves Your Soul')); + L.push(''); + L.push(os(a,'dashboard-navigator',' Code Files Terminal Agenda')); + L.push(os(a,'dashboard-navigator',' Feeds Books Flashcards Music')); + L.push(os(a,'dashboard-navigator',' Email IRC Telegram')); + L.push(os(a,'dashboard-navigator',' Slack Linear')); + L.push(''); + L.push(''); + L.push(os(a,'dashboard-heading','Projects:')); + L.push(' ~/'); + L.push(' ~/.emacs.d/'); + L.push(' ~/projects/work/'); + L.push(' ~/org/roam/'); + L.push(' ~/projects/home/'); + L.push(''); + L.push(os(a,'dashboard-heading','Bookmarks')); + L.push(' Cesar Aira, The Little Buddhist Monk & the Proof'); + L.push(' Edward Abbey, The Fool’s Progress: An Honest Novel'); + L.push(' Agatha Christie, The A.B.C. Murders'); + L.push(''); + L.push(os(a,'dashboard-heading','Recent Files:')); + L.push(' theme-theme.el'); + L.push(' todo.org'); + L.push(' theme-studio-palette-generator-spec.org'); + return previewLines(L);} +function renderMu4ePreview(){const a='mu4e',L=[]; + const pad=(s,n)=>{s=String(s);return s.length>=n?s.slice(0,n):s+' '.repeat(n-s.length);}; + // One header line: the flags column in mu4e-header-marks-face, the rest of the + // row in the message's state face (unread, replied, flagged, ...). + const row=(flags,date,from,subj,face)=> + os(a,'mu4e-header-marks-face',pad(flags,4))+os(a,face,pad(date,12)+pad(from,17)+subj); + // status / context bar + L.push(os(a,'mu4e-title-face','mu4e')+' '+os(a,'mu4e-context-face','[Personal]')+' '+os(a,'mu4e-ok-face','online')+' '+os(a,'mu4e-warning-face','2 retrying')+' '+os(a,'mu4e-modeline-face','[12/340]')); + L.push(''); + // column header + the message list, one row per state + L.push(os(a,'mu4e-header-title-face',pad('Flags',4)+pad('Date',12)+pad('From',17)+'Subject')); + L.push(row('N','2026-06-14','Christine Park','Re: quarterly numbers','mu4e-unread-face')); + L.push(row('','2026-06-13','Bob Lin','Lunch on Friday?','mu4e-header-face')); + // current line at point: the whole row gets the highlight background + L.push(os(a,'mu4e-header-highlight-face',row('R','2026-06-13','dev-list','merged the parser fix','mu4e-replied-face'))); + L.push(row('F','2026-06-12','Carol Reyes','Fwd: the signed contract','mu4e-forwarded-face')); + L.push(row('D','2026-06-11','(draft)','Notes to finish later','mu4e-draft-face')); + L.push(row('T','2026-06-10','spam@nowhere','You have won a prize','mu4e-trashed-face')); + L.push(row('','2026-06-09','Erin (cc)','thread you follow','mu4e-related-face')); + L.push(row('!','2026-06-08','Frank Diaz','budget needs sign-off','mu4e-flagged-face')); + L.push(''); + // a message view below the list + L.push(os(a,'mu4e-header-key-face','From:')+' '+os(a,'mu4e-contact-face','Christine Park <christine@example.com>')); + L.push(os(a,'mu4e-header-key-face','To:')+' '+os(a,'mu4e-special-header-value-face','craig, dev-list@gnu.org')); + L.push(os(a,'mu4e-header-key-face','Subject:')+' '+os(a,'mu4e-header-value-face','Re: quarterly numbers')); + L.push(''); + L.push(' Body with a '+os(a,'mu4e-highlight-face','search hit')+', a link '+os(a,'mu4e-url-number-face','[1]')+' '+os(a,'mu4e-link-face','https://example.com')+', and a '+os(a,'mu4e-region-code','code region')+'.'); + L.push(' '+os(a,'mu4e-system-face','*** mu: 340 messages indexed ***')); + L.push(' '+os(a,'mu4e-footer-face','-- Sent with mu4e')); + L.push(''); + L.push(os(a,'mu4e-compose-separator-face','--text follows this line--')); + return previewLines(L);} +function renderGnusPreview(){const a='gnus',L=[]; + // mu4e renders the open message with gnus, so this is the article view: + // a header block, a body with inline emphasis and a button, then a quoted + // reply chain (one cite face per nesting level) and the signature. + L.push(os(a,'gnus-header-name','From: ')+os(a,'gnus-header-from','Christine Park <christine@example.com>')); + L.push(os(a,'gnus-header-name','To: ')+os(a,'gnus-header-content','craig@cjennings.net')); + L.push(os(a,'gnus-header-name','Newsgroups: ')+os(a,'gnus-header-newsgroups','gnu.emacs.help')); + L.push(os(a,'gnus-header-name','Subject: ')+os(a,'gnus-header-subject','Re: quarterly numbers')); + L.push(os(a,'gnus-header-name','Date: ')+os(a,'gnus-header-content','Sat, 14 Jun 2026 09:12:04 -0500')); + L.push(''); + L.push('Thanks for the draft. The '+os(a,'gnus-emphasis-bold','revenue line')+' is '+os(a,'gnus-emphasis-italic','close')+', but the '+os(a,'gnus-emphasis-underline','footnote')+' is '+os(a,'gnus-emphasis-strikethru','wrong')+' '+os(a,'gnus-emphasis-highlight-words','FIXME')+'.'); + L.push('See the worksheet: '+os(a,'gnus-button','[https://example.com/q2]')); + L.push(''); + L.push(os(a,'gnus-cite-attribution','On Fri, Bob Lin wrote:')); + L.push(os(a,'gnus-cite-1','> The Q2 totals are ready for review.')); + L.push(os(a,'gnus-cite-2','>> Did the Segpay refund post yet?')); + L.push(os(a,'gnus-cite-3','>>> Yes, it cleared on the 5th.')); + L.push(os(a,'gnus-cite-4','>>>> Good, then we are square.')); + L.push(os(a,'gnus-cite-5','>>>>> earlier reply, level 5')); + L.push(os(a,'gnus-cite-6','>>>>>> level 6')); + L.push(os(a,'gnus-cite-7','>>>>>>> level 7')); + L.push(os(a,'gnus-cite-8','>>>>>>>> level 8')); + L.push(os(a,'gnus-cite-9','>>>>>>>>> level 9')); + L.push(os(a,'gnus-cite-10','>>>>>>>>>> level 10')); + L.push(os(a,'gnus-cite-11','>>>>>>>>>>> level 11')); + L.push(''); + L.push(os(a,'gnus-signature','-- ')); + L.push(os(a,'gnus-signature','Christine Park, Finance')); + return previewLines(L);} +function renderOrgFacesPreview(){const a='org-faces',L=[]; + L.push('Agenda header row -- one face per keyword and priority (this config, not built-in org):'); + L.push(''); + L.push(os(a,'org-faces-todo','TODO')+' Draft the spec '+os(a,'org-faces-priority-a','[#A]')); + L.push(os(a,'org-faces-project','PROJECT')+' Theme studio overhaul '+os(a,'org-faces-priority-b','[#B]')); + L.push(os(a,'org-faces-doing','DOING')+' Wire the faces '+os(a,'org-faces-priority-c','[#C]')); + L.push(os(a,'org-faces-waiting','WAITING')+' On review '+os(a,'org-faces-priority-d','[#D]')); + L.push(os(a,'org-faces-verify','VERIFY')+' Confirm the round-trip'); + L.push(os(a,'org-faces-stalled','STALLED')+' Blocked on upstream'); + L.push(os(a,'org-faces-delegated','DELEGATED')+' Handed to Kostya'); + L.push(os(a,'org-faces-failed','FAILED')+' Could not reproduce'); + L.push(os(a,'org-faces-done','DONE')+' Shipped the module'); + L.push(os(a,'org-faces-cancelled','CANCELLED')+' Dropped the approach'); + L.push(''); + L.push('Unfocused (auto-dim) -- the -dim variants auto-dim remaps onto in non-selected windows:'); + L.push(''); + L.push(os(a,'org-faces-todo-dim','TODO')+' Draft the spec '+os(a,'org-faces-priority-a-dim','[#A]')); + L.push(os(a,'org-faces-project-dim','PROJECT')+' Theme studio overhaul '+os(a,'org-faces-priority-b-dim','[#B]')); + L.push(os(a,'org-faces-doing-dim','DOING')+' Wire the faces '+os(a,'org-faces-priority-c-dim','[#C]')); + L.push(os(a,'org-faces-waiting-dim','WAITING')+' On review '+os(a,'org-faces-priority-d-dim','[#D]')); + L.push(os(a,'org-faces-verify-dim','VERIFY')+' Confirm the round-trip'); + L.push(os(a,'org-faces-stalled-dim','STALLED')+' Blocked on upstream'); + L.push(os(a,'org-faces-delegated-dim','DELEGATED')+' Handed to Kostya'); + L.push(os(a,'org-faces-failed-dim','FAILED')+' Could not reproduce'); + L.push(os(a,'org-faces-done-dim','DONE')+' Shipped the module'); + L.push(os(a,'org-faces-cancelled-dim','CANCELLED')+' Dropped the approach'); + return previewLines(L);} +function renderLspPreview(){const a='lsp-mode',L=[]; + L.push(os(a,'lsp-signature-face','process(')+os(a,'lsp-signature-highlight-function-argument','items: list')+os(a,'lsp-signature-face',') -> None')); + L.push(os(a,'lsp-signature-posframe',' docs: iterate over items and process each one ')); + L.push(''); + L.push('def process(items):'); + L.push(' n = len(items)'+os(a,'lsp-inlay-hint-type-face',': int')); + L.push(' handle('+os(a,'lsp-inlay-hint-parameter-face','arg:')+'n)'+os(a,'lsp-inlay-hint-face',' # hint')); + L.push(' '+os(a,'lsp-face-highlight-read','value')+' = '+os(a,'lsp-face-highlight-write','value')+' + '+os(a,'lsp-face-highlight-textual','value')); + L.push(' rename '+os(a,'lsp-face-rename','oldName')+' to '+os(a,'lsp-rename-placeholder-face','newName')); + L.push(' getName() '+os(a,'lsp-details-face','str the cached getter')); + L.push(''); + L.push(os(a,'lsp-installation-buffer-face','Installing pyright...')+' '+os(a,'lsp-installation-finished-buffer-face','done.')); + return previewLines(L);} +function renderGitGutterPreview(){const a='git-gutter',L=[]; + L.push(os(a,'git-gutter:added','+')+os(a,'git-gutter:separator','|')+' added line of code'); + L.push(os(a,'git-gutter:modified','~')+os(a,'git-gutter:separator','|')+' modified line of code'); + L.push(os(a,'git-gutter:deleted','_')+os(a,'git-gutter:separator','|')+' (deleted lines marker)'); + L.push(os(a,'git-gutter:unchanged',' ')+os(a,'git-gutter:separator','|')+' '+os(a,'git-gutter:unchanged','unchanged line of code')); + return previewLines(L);} +function renderFlycheckPreview(){const a='flycheck',L=[]; + L.push(os(a,'flycheck-fringe-error','E')+os(a,'flycheck-fringe-warning','W')+os(a,'flycheck-fringe-info','I')+' x = '+os(a,'flycheck-error','undefined_name')+'('+os(a,'flycheck-warning','unused_arg')+') '+os(a,'flycheck-info','# note')); + L.push(' '+os(a,'flycheck-error-delimiter','[')+os(a,'flycheck-delimited-error','err')+os(a,'flycheck-error-delimiter',']')); + L.push(''); + L.push(os(a,'flycheck-error-list-checker-name','pyright')+' '+os(a,'flycheck-verify-select-checker','(selected checker)')); + L.push(os(a,'flycheck-error-list-filename','main.py')+':'+os(a,'flycheck-error-list-line-number','12')+':'+os(a,'flycheck-error-list-column-number','4')+' '+os(a,'flycheck-error-list-error','error')+' '+os(a,'flycheck-error-list-error-message','undefined name x')+' '+os(a,'flycheck-error-list-id','[E0602]')); + L.push(os(a,'flycheck-error-list-filename','main.py')+':'+os(a,'flycheck-error-list-line-number','18')+':'+os(a,'flycheck-error-list-column-number','1')+' '+os(a,'flycheck-error-list-warning','warning')+' '+os(a,'flycheck-error-list-error-message','unused import')+' '+os(a,'flycheck-error-list-id-with-explainer','[W0611?]')); + L.push(os(a,'flycheck-error-list-highlight','main.py:20 '+os(a,'flycheck-error-list-info','info')+' highlighted row')); + return previewLines(L);} +function renderDiredPreview(){const a='dired',L=[]; + L.push(os(a,'dired-header','/home/craig/code:')); + L.push(' '+os(a,'dired-perm-write','drwxr-xr-x')+' craig 4096 '+os(a,'dired-directory','src/')); + L.push(' -rw-r--r-- craig 120 notes.org'); + L.push(' '+os(a,'dired-perm-write','lrwxrwxrwx')+' craig 18 '+os(a,'dired-symlink','latest -> v2.1')); + L.push(' lrwxrwxrwx craig -- '+os(a,'dired-broken-symlink','dead -> gone')); + L.push(os(a,'dired-flagged','D')+' -rw-r--r-- craig 40 deleteme.tmp'); + L.push(os(a,'dired-mark','*')+' '+os(a,'dired-marked','-rw-r--r-- craig 210 marked.txt')); + L.push(' -rw-r--r-- craig 0 '+os(a,'dired-ignored','.gitignore')); + L.push(' '+os(a,'dired-set-id','-rwsr-xr-x')+' root 900 setuid.bin'); + L.push(' '+os(a,'dired-special','prw-r--r--')+' craig 0 fifo.pipe'); + L.push(os(a,'dired-warning','! disk space low on /home')); + return previewLines(L);} +function renderDirvishPreview(){const a='dirvish',L=[]; + L.push(os(a,'dirvish-inactive','~/code')+' '+os(a,'dirvish-free-space','[free 24G]')); + L.push(os(a,'dirvish-hl-line',' '+os(a,'dirvish-file-modes','-rw-r--r--')+' '+os(a,'dirvish-file-link-number','1')+' '+os(a,'dirvish-file-user-id','craig')+' '+os(a,'dirvish-file-group-id','staff')+' '+os(a,'dirvish-file-size','4.0K')+' '+os(a,'dirvish-file-time','Jun 8 02:24')+' init.el ')); + L.push(' '+os(a,'dirvish-file-modes','drwxr-xr-x')+' '+os(a,'dirvish-file-link-number','5')+' '+os(a,'dirvish-file-user-id','craig')+' '+os(a,'dirvish-file-group-id','staff')+' '+os(a,'dirvish-file-size',' - ')+' '+os(a,'dirvish-file-time','Jun 7 18:00')+' '+os(a,'dirvish-collapse-dir-face','src')+os(a,'dirvish-subtree-state','+')+os(a,'dirvish-subtree-guide',' |')); + L.push(os(a,'dirvish-hl-line-inactive',' inactive-window current line ')); + L.push(' inode '+os(a,'dirvish-file-inode-number','1048576')+' dev '+os(a,'dirvish-file-device-number','8,1')+' '+os(a,'dirvish-collapse-empty-dir-face','empty/')+' '+os(a,'dirvish-collapse-file-face','file.txt')); + L.push(' VC '+os(a,'dirvish-vc-added-state','A')+os(a,'dirvish-vc-edited-state','M')+os(a,'dirvish-vc-removed-state','D')+os(a,'dirvish-vc-conflict-state','C')+os(a,'dirvish-vc-locked-state','L')+os(a,'dirvish-vc-missing-state','!')+os(a,'dirvish-vc-needs-merge-face','m')+os(a,'dirvish-vc-needs-update-state','u')+os(a,'dirvish-vc-unregistered-face','?')); + L.push(' git '+os(a,'dirvish-git-commit-message-face','feat: enlarge the picker')); + L.push(' '+os(a,'dirvish-media-info-heading','Media')+' '+os(a,'dirvish-media-info-property-key','Dimensions:')+' 1920x1080'); + L.push(' proc '+os(a,'dirvish-proc-running','running')+' / '+os(a,'dirvish-proc-finished','finished')+' / '+os(a,'dirvish-proc-failed','failed')); + L.push(' narrow '+os(a,'dirvish-narrow-match-face-0','m0')+' '+os(a,'dirvish-narrow-match-face-1','m1')+' '+os(a,'dirvish-narrow-match-face-2','m2')+' '+os(a,'dirvish-narrow-match-face-3','m3')+os(a,'dirvish-narrow-split',' | ')+os(a,'dirvish-emerge-group-title','Group: images')); + return previewLines(L);} +function renderCalibredbPreview(){const a='calibredb',L=[]; + L.push(os(a,'calibredb-search-header-library-name-face','Calibre')+' '+os(a,'calibredb-search-header-library-path-face','~/books')+' '+os(a,'calibredb-search-header-total-face','412 books')+' '+os(a,'calibredb-search-header-filter-face','tag:scifi')+' '+os(a,'calibredb-search-header-sort-face','sort:date')+' '+os(a,'calibredb-search-header-highlight-face','[*]')); + L.push(''); + L.push(os(a,'calibredb-id-face','1')+' '+os(a,'calibredb-title-face','Dune')+' '+os(a,'calibredb-author-face','Herbert')+' '+os(a,'calibredb-format-face','EPUB')+' '+os(a,'calibredb-size-face','2.1M')+' '+os(a,'calibredb-tag-face',':scifi:')+' '+os(a,'calibredb-date-face','2026-06-08')); + L.push(os(a,'calibredb-mark-face','*')+os(a,'calibredb-id-face','2')+' '+os(a,'calibredb-title-face','Foundation')+' '+os(a,'calibredb-author-face','Asimov')+' '+os(a,'calibredb-series-face','[Foundation #1]')+' '+os(a,'calibredb-publisher-face','Bantam')+' '+os(a,'calibredb-pubdate-face','1951')); + L.push(''); + L.push(os(a,'calibredb-title-detailed-view-face','Foundation (detailed)')+' '+os(a,'calibredb-language-face','eng')+' '+os(a,'calibredb-favorite-face','* fav')+' '+os(a,'calibredb-archive-face','archived')); + L.push(os(a,'calibredb-ids-face','isbn:0553293354')+' '+os(a,'calibredb-file-face','foundation.epub')+' '+os(a,'calibredb-comment-face','A classic of the genre.')); + L.push(os(a,'calibredb-edit-annotation-header-title-face','Annotations')+' '+os(a,'calibredb-highlight-face','highlighted passage')+' '+os(a,'calibredb-current-page-button-face','[page 42]')+' '+os(a,'calibredb-mouse-face','hover row')); + return previewLines(L);} +function renderErcPreview(){const a='erc',L=[]; + L.push(os(a,'erc-header-line',' #emacs on Libera.Chat 18 users ')); + L.push(os(a,'erc-timestamp-face','[10:24]')+' '+os(a,'erc-notice-face','*** alice has joined #emacs')); + L.push(os(a,'erc-timestamp-face','[10:25]')+' <'+os(a,'erc-my-nick-prefix-face','@')+os(a,'erc-my-nick-face','craig')+'> '+os(a,'erc-input-face','hello everyone')); + L.push(os(a,'erc-timestamp-face','[10:25]')+' <'+os(a,'erc-nick-prefix-face','+')+os(a,'erc-nick-default-face','bob')+'> '+os(a,'erc-default-face','hi craig, see ')+os(a,'erc-button','this link')+os(a,'erc-default-face',' cc ')+os(a,'erc-button-nick-default-face','@alice')); + L.push(os(a,'erc-timestamp-face','[10:26]')+' '+os(a,'erc-action-face','* craig waves')+' '+os(a,'erc-keyword-face','emacs')+' '+os(a,'erc-pal-face','<friend>')+' '+os(a,'erc-fool-face','<troll>')+' '+os(a,'erc-dangerous-host-face','<bad@host>')); + L.push(os(a,'erc-timestamp-face','[10:27]')+' '+os(a,'erc-direct-msg-face','(DM)')+' <'+os(a,'erc-nick-msg-face','bob')+'> psst '+os(a,'erc-current-nick-face','craig')+' '+os(a,'erc-information','-info-')); + L.push(os(a,'erc-error-face','*** ERROR: connection reset')); + L.push(os(a,'erc-command-indicator-face','/help')+' '+os(a,'erc-bold-face','bold')+' '+os(a,'erc-italic-face','italic')+' '+os(a,'erc-underline-face','underline')+' '+os(a,'erc-inverse-face','inverse')+' '+os(a,'erc-spoiler-face','spoiler')); + L.push(os(a,'erc-keep-place-indicator-arrow','>')+os(a,'erc-keep-place-indicator-line',' ---- last read ---- ')+os(a,'erc-fill-wrap-merge-indicator-face','+')); + L.push(os(a,'erc-prompt-face','craig>')+' '+os(a,'erc-input-face','type a message...')); + return previewLines(L);} +function renderOrgdrillPreview(){const a='org-drill',L=[]; + L.push('Q: The capital of France is '+os(a,'org-drill-hidden-cloze-face','[...]')+'.'); + L.push('A: The capital of France is '+os(a,'org-drill-visible-cloze-face','Paris')+'.'); + L.push(' '+os(a,'org-drill-visible-cloze-hint-face','hint: P____')); + return previewLines(L);} +function renderOrgnoterPreview(){const a='org-noter',L=[]; + L.push('org-noter paper.pdf'); + L.push(' page 1 '+os(a,'org-noter-notes-exist-face','[notes]')); + L.push(' page 2 '+os(a,'org-noter-no-notes-exist-face','[no notes]')); + return previewLines(L);} +function renderSignelPreview(){const a='signel',L=[]; + L.push(os(a,'signel-timestamp-face','[10:24]')+' '+os(a,'signel-my-msg-face','Me: hey, are we still on for tonight?')); + L.push(os(a,'signel-timestamp-face','[10:25]')+' '+os(a,'signel-other-msg-face','Christine: yes! see you at 7')); + L.push(os(a,'signel-error-face','(failed to send -- retrying)')); + return previewLines(L);} +function renderPearlPreview(){const a='pearl',L=[]; + L.push(os(a,'pearl-preamble-summary','PEARL-42 Fix the broken picker')); + L.push('State: '+os(a,'pearl-modified-local','In Progress')+' Priority: '+os(a,'pearl-modified-highlight','High')+' Estimate: '+os(a,'pearl-modified-unknown','?')); + L.push(' '+os(a,'pearl-editable-comment','> add a comment (editable)')); + L.push(' '+os(a,'pearl-readonly-comment','> created by automation (read-only)')); + return previewLines(L);} +function renderShrPreview(){const a='shr',L=[]; + L.push(os(a,'shr-text','shr renders nov (EPUB), eww (web), elfeed, and HTML mail.')); + L.push(''); + L.push(os(a,'shr-h1','Chapter One: The Beginning')); + L.push(os(a,'shr-h2','A Section Heading')); + L.push(os(a,'shr-h3','A subsection')+' '+os(a,'shr-h4','h4')+' / '+os(a,'shr-h5','h5')+' / '+os(a,'shr-h6','h6')); + L.push(os(a,'shr-text','Body text flows in shr-text, with a ')+os(a,'shr-link','hyperlink')+os(a,'shr-text',' and a ')+os(a,'shr-selected-link','focused link')+os(a,'shr-text',',')); + L.push(os(a,'shr-text','some ')+os(a,'shr-code','inline_code()')+os(a,'shr-text',', a ')+os(a,'shr-mark','highlighted mark')+os(a,'shr-text',', ')+os(a,'shr-strike-through','struck out')+os(a,'shr-text',', a footnote')+os(a,'shr-sup','[1]')+os(a,'shr-text',',')); + L.push(os(a,'shr-text','an ')+os(a,'shr-abbreviation','HTML')+os(a,'shr-text',' abbreviation, and an ')+os(a,'shr-sliced-image','[image]')+os(a,'shr-text',' slice.')); + return previewLines(L);} +function renderSlackPreview(){const a='slack',L=[]; + L.push(os(a,'slack-room-info-title-room-name-face','#general')+' '+os(a,'slack-room-info-title-face','Acme Workspace')); + L.push(os(a,'slack-room-info-section-title-face','Topic')+' '+os(a,'slack-room-info-section-label-face','daily standup')+' '+os(a,'slack-room-unread-face','3 unread')); + L.push(os(a,'slack-new-message-marker-face','---------------- new messages ----------------')); + L.push(os(a,'slack-message-output-header','craig 10:24')); + L.push(' '+os(a,'slack-message-output-text','hey ')+os(a,'slack-message-mention-me-face','@craig')+os(a,'slack-message-output-text',', see ')+os(a,'slack-message-mention-face','@alice')+os(a,'slack-message-output-text',' in ')+os(a,'slack-channel-button-face','#general')+' '+os(a,'slack-message-mention-keyword-face','urgent')); + L.push(' '+os(a,'slack-mrkdwn-bold-face','*bold*')+' '+os(a,'slack-mrkdwn-italic-face','_italic_')+' '+os(a,'slack-mrkdwn-code-face','`code`')+' '+os(a,'slack-mrkdwn-strike-face','~strike~')); + L.push(' '+os(a,'slack-mrkdwn-blockquote-face','> quoted')+' '+os(a,'slack-mrkdwn-list-face','- item')); + L.push(' '+os(a,'slack-mrkdwn-code-block-face','``` code block ```')); + L.push(' '+os(a,'slack-message-output-reaction',':thumbsup: 3')+' '+os(a,'slack-message-output-reaction-pressed',':heart: 1')+' '+os(a,'slack-message-deleted-face','(message deleted)')); + L.push(' '+os(a,'slack-all-thread-buffer-thread-header-face','Thread: 2 replies')); + L.push(os(a,'slack-attachment-header','Attachment')+' '+os(a,'slack-attachment-field-title','Field:')+' val '+os(a,'slack-message-attachment-preview-header-face','Preview')+' '+os(a,'slack-preview-face','snippet')+os(a,'slack-attachment-pad',' | ')+os(a,'slack-attachment-footer','footer')); + L.push(os(a,'slack-block-highlight-source-overlay-face',' highlighted source block ')); + L.push('Actions: '+os(a,'slack-message-action-face','Edit')+' '+os(a,'slack-message-action-primary-face','Approve')+' '+os(a,'slack-message-action-danger-face','Delete')); + L.push('Blocks: '+os(a,'slack-button-block-element-face','[Button]')+os(a,'slack-button-primary-block-element-face','[Primary]')+os(a,'slack-button-danger-block-element-face','[Danger]')+os(a,'slack-select-block-element-face','[Select v]')+os(a,'slack-overflow-block-element-face','[...]')+os(a,'slack-date-picker-block-element-face','[Date]')); + L.push('Dialog: '+os(a,'slack-dialog-title-face','Title')+' '+os(a,'slack-dialog-element-label-face','Label')+' '+os(a,'slack-dialog-element-hint-face','(hint)')+' '+os(a,'slack-dialog-element-placeholder-face','placeholder')+' '+os(a,'slack-dialog-element-error-face','error')+' '+os(a,'slack-dialog-select-element-input-face','[input v]')+' '+os(a,'slack-dialog-submit-button-face','[Submit]')+os(a,'slack-dialog-cancel-button-face','[Cancel]')); + L.push('Users: '+os(a,'slack-user-active-face','alice (active)')+' '+os(a,'slack-user-dnd-face','bob (dnd)')+' '+os(a,'slack-profile-image-face','[img]')+' '+os(a,'slack-user-profile-header-face','Profile')+' '+os(a,'slack-user-profile-property-name-face','Title:')+' Dev'); + L.push('Search: '+os(a,'slack-search-result-message-header-face','#general')+' '+os(a,'slack-search-result-message-username-face','craig')); + L.push('Modeline: '+os(a,'slack-modeline-has-unreads-face','* unreads')+' '+os(a,'slack-modeline-channel-has-unreads-face','#ch')+' '+os(a,'slack-modeline-thread-has-unreads-face','thread')); + return previewLines(L);} +function renderTelegaPreview(){const a='telega',L=[]; + L.push(os(a,'telega-root-heading','Telegram')+' '+os(a,'telega-tracking','[tracking]')+' '+os(a,'telega-unread-unmuted-modeline','5 unread')); + L.push(os(a,'telega-has-chatbuf-brackets','[')+os(a,'telega-username','Christine')+os(a,'telega-has-chatbuf-brackets',']')+' '+os(a,'telega-user-online-status','online')+' '+os(a,'telega-unmuted-count','3')+' '+os(a,'telega-mention-count','@2')+os(a,'telega-delim-face',' | ')+os(a,'telega-secret-title','Secret')+' '+os(a,'telega-muted-count','muted')); + L.push(os(a,'telega-username','Bob')+' '+os(a,'telega-user-non-online-status','last seen recently')+' '+os(a,'telega-contact-birthdays-today','birthday today')+' '+os(a,'telega-shadow','shadow')+' '+os(a,'telega-link','link')+' '+os(a,'telega-blue','blue')+' '+os(a,'telega-red','red')); + L.push(''); + L.push(os(a,'telega-msg-heading','Today')); + L.push(os(a,'telega-msg-user-title','Christine')+' '+os(a,'telega-msg-inline-reply','| reply to Bob')+' '+os(a,'telega-msg-inline-forward','fwd from Carol')+' '+os(a,'telega-msg-inline-other','via bot')); + L.push(' '+os(a,'telega-entity-type-bold','bold')+' '+os(a,'telega-entity-type-italic','italic')+' '+os(a,'telega-entity-type-underline','underline')+' '+os(a,'telega-entity-type-strikethrough','strike')+' '+os(a,'telega-entity-type-code','code')+' '+os(a,'telega-entity-type-spoiler','spoiler')); + L.push(' '+os(a,'telega-entity-type-pre','pre block')+' '+os(a,'telega-entity-type-blockquote','> quote')+' '+os(a,'telega-entity-type-mention','@user')+' '+os(a,'telega-entity-type-hashtag','#tag')+' '+os(a,'telega-entity-type-cashtag','$USD')+' '+os(a,'telega-entity-type-botcommand','/start')+' '+os(a,'telega-entity-type-texturl','link')); + L.push(os(a,'telega-msg-self-title','Me')+' '+os(a,'telega-reaction',':+1: 2')+' '+os(a,'telega-reaction-chosen',':heart: 1')+' '+os(a,'telega-reaction-paid',':star: 5')+' '+os(a,'telega-reaction-paid-chosen',':star: paid')+' '+os(a,'telega-msg-deleted','(deleted)')+' '+os(a,'telega-msg-sponsored','Sponsored')); + L.push(' checklist '+os(a,'telega-checklist-stats-done','2 done')+' / '+os(a,'telega-checklist-stats-todo','3 todo')+' '+os(a,'telega-highlight-text-face','search hit')+' '+os(a,'telega-button-highlight','[active btn]')); + L.push(os(a,'telega-chat-prompt','>')+' '+os(a,'telega-chat-prompt-aux','reply')+' '+os(a,'telega-chat-input-attachment','[photo.jpg]')+' '+os(a,'telega-topic-button','# Topic')+' '+os(a,'telega-filter-active','Main')+' '+os(a,'telega-filter-button-active','[Unread]')+os(a,'telega-filter-button-inactive','[All]')); + L.push('Buttons '+os(a,'telega-box-button','[box]')+os(a,'telega-box-button-active','[on]')+os(a,'telega-box-button-default-active','[def]')+os(a,'telega-box-button-default-passive','[def-]')+os(a,'telega-box-button-primary-active','[pri]')+os(a,'telega-box-button-primary-passive','[pri-]')+os(a,'telega-box-button-success-active','[ok]')+os(a,'telega-box-button-success-passive','[ok-]')); + L.push(' '+os(a,'telega-box-button-danger-active','[del]')+os(a,'telega-box-button-danger-passive','[del-]')+os(a,'telega-box-button-ui-active','[ui]')+os(a,'telega-box-button-ui-passive','[ui-]')+os(a,'telega-box-button2-active','[b2]')+os(a,'telega-box-button2-passive','[b2-]')+os(a,'telega-box-button2-white-foreground','[b2w]')); + L.push('Describe '+os(a,'telega-describe-section-title','Section')+' '+os(a,'telega-describe-subsection-title','Sub')+' '+os(a,'telega-describe-item-title','Item:')+' enckey '+os(a,'telega-enckey-00','00')+os(a,'telega-enckey-01','01')+os(a,'telega-enckey-10','10')+os(a,'telega-enckey-11','11')); + L.push('Palette '+os(a,'telega-palette-builtin-blue','blue')+' '+os(a,'telega-palette-builtin-green','green')+' '+os(a,'telega-palette-builtin-orange','orange')+' '+os(a,'telega-palette-builtin-purple','purple')); + L.push(os(a,'telega-link-preview-sitename','example.com')+' '+os(a,'telega-link-preview-title','Link preview title')); + L.push('Webpage '+os(a,'telega-webpage-title','Title')+' '+os(a,'telega-webpage-subtitle','Subtitle')+' '+os(a,'telega-webpage-header','Header')+' '+os(a,'telega-webpage-subheader','Subheader')+' '+os(a,'telega-webpage-outline','outline')+' '+os(a,'telega-webpage-fixed','fixed')+' '+os(a,'telega-webpage-preformatted','pre')+' '+os(a,'telega-webpage-marked','marked')+' '+os(a,'telega-webpage-strike-through','strike')+' '+os(a,'telega-webpage-chat-link','chat-link')); + return previewLines(L);} +function genericPreview(app){let h='<div style="padding:10px 14px;font:12pt/1.8 monospace">';for(const [face,label] of APPS[app].faces)h+=`<div data-face="${face}" style="${ofs(app,face)}">${esc(label)}</div>`;return h+'</div>';} +// Bespoke split preview: a focused window beside its auto-dimmed twin, both +// showing the language selected at the top of the page (kept in sync via the +// langsel onchange, which re-runs buildPkgPreview). The left pane carries the +// real per-token syntax colors; the right pane shows what auto-dim does -- every +// default/font-lock face remaps to the single `auto-dim-other-buffers' face, so +// the same code collapses to one faded foreground on the dim background. The +// trailing row demonstrates `auto-dim-other-buffers-hide' (org hidden text whose +// foreground matches the background, so it vanishes in a dimmed window). +function renderAutodimPreview(){ + const a='auto-dim-other-buffers'; + const langsel=document.getElementById('langsel'); + const lang=(langsel&&langsel.value)||Object.keys(SAMPLES)[0]; + const lines=(SAMPLES[lang]||[]).slice(0,9); + let lit=''; + for(const line of lines){ + if(!line.length){lit+='\n';continue;} + for(const [k,t] of line)lit+=`<span data-k="${k}" style="${syntaxStyle(k)}">${esc(t)}</span>`; + lit+='\n';} + const dimFg=effFg(pkgEffFg(a,'auto-dim-other-buffers')),dimBg=pkgEffBg(a,'auto-dim-other-buffers')||'#000000'; + let dim=''; + for(const line of lines){ + if(!line.length){dim+='\n';continue;} + for(const [,t] of line)dim+=esc(t); + dim+='\n';} + const hideFg=effFg(pkgEffFg(a,'auto-dim-other-buffers-hide')),hideBg=pkgEffBg(a,'auto-dim-other-buffers-hide')||dimBg; + const foldText='··· folded body (hidden when dimmed) ···'; + const accent=uf('cursor').bg||'#67809c'; + const pane=(label,body,bg,focused)=> + `<div style="flex:1;min-width:20ch;border:${focused?'2px solid '+accent:'1px solid #2a2a2a'};border-radius:4px;overflow:hidden">` + +`<div style="text-align:center;font:bold 10pt monospace;padding:4px;color:${focused?'#cdced1':'#8a8a8a'};background:${focused?'#1a1a1a':'#0a0a0a'};border-bottom:1px solid #2a2a2a">${label}</div>` + +`<div style="padding:10px 12px;font:12pt/1.6 monospace;white-space:pre;background:${bg}">${body}</div></div>`; + const litBody=lit+'\n'+`<span style="color:#5e6770">${esc(foldText)}</span>`; + const dimBody=`<span data-face="auto-dim-other-buffers" style="color:${dimFg}">${dim}</span>\n` + +`<span data-face="auto-dim-other-buffers-hide" style="color:${hideFg};background:${hideBg}">${esc(foldText)}</span>`; + return `<div style="display:flex;gap:12px;padding:12px 16px;background:${MAP['bg']}">` + +pane('normal',litBody,MAP['bg'],true) + +pane('auto-dim',dimBody,dimBg,false) + +`</div>`; +} +function renderMarkdownPreview(){const a='markdown-mode',L=[]; + const dl='markdown-header-delimiter-face',mk='markdown-markup-face'; + L.push(os(a,mk,'---')); + L.push(os(a,'markdown-metadata-key-face','title:')+' '+os(a,'markdown-metadata-value-face','Project Name')); + L.push(os(a,'markdown-metadata-key-face','version:')+' '+os(a,'markdown-metadata-value-face','1.2.0')); + L.push(os(a,mk,'---')); + L.push(''); + L.push(os(a,dl,'#')+' '+os(a,'markdown-header-face-1','Project Name')); + L.push(''); + L.push(os(a,'markdown-comment-face','<!-- a one-line tagline -->')); + L.push('A library for '+os(a,'markdown-bold-face','**doing things**')+' and '+os(a,'markdown-italic-face','*other things*')+'.'); + L.push(''); + L.push(os(a,dl,'##')+' '+os(a,'markdown-header-face-2','Installation')); + L.push(''); + L.push('Run '+os(a,'markdown-inline-code-face','`npm install project`')+' to get started.'); + L.push(''); + L.push(os(a,mk,'```')+os(a,'markdown-language-keyword-face','sh')); + L.push(os(a,'markdown-pre-face',' git clone https://example.com/project.git')); + L.push(os(a,'markdown-pre-face',' cd project; make')); + L.push(os(a,mk,'```')); + L.push(''); + L.push(os(a,dl,'###')+' '+os(a,'markdown-header-face-3','Usage')); + L.push(''); + L.push(os(a,'markdown-list-face','- ')+'See the '+os(a,'markdown-link-face','[docs]')+os(a,'markdown-url-face','(https://example.com/docs)')+' for details.'); + L.push(os(a,'markdown-list-face','- ')+'Or browse '+os(a,'markdown-plain-url-face','https://example.com')+' directly.'); + L.push(os(a,'markdown-gfm-checkbox-face','- [x]')+' shipped '+os(a,'markdown-gfm-checkbox-face','- [ ]')+' planned'); + L.push(''); + L.push(os(a,'markdown-blockquote-face','> A note worth quoting, with a footnote')+os(a,'markdown-footnote-marker-face','[^1]')+os(a,'markdown-blockquote-face','.')); + L.push(''); + L.push(os(a,'markdown-table-face','| Option | Default |')); + L.push(os(a,'markdown-table-face','|--------|---------|')); + L.push(os(a,'markdown-table-face','| debug | false |')); + L.push(''); + L.push(os(a,'markdown-hr-face','---')); + L.push(''); + L.push(os(a,'markdown-strike-through-face','~~deprecated~~')+' '+os(a,'markdown-highlight-face','==important==')+' '+os(a,'markdown-math-face','$E = mc^2$')); + L.push(os(a,'markdown-html-tag-delimiter-face','<')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','>')+'Ctrl-C'+os(a,'markdown-html-tag-delimiter-face','</')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','>')); + L.push(os(a,'markdown-footnote-marker-face','[^1]:')+' '+os(a,'markdown-footnote-text-face','the footnote text.')); + return previewLines(L);} diff --git a/scripts/theme-studio/run-tests.sh b/scripts/theme-studio/run-tests.sh index 6666fb0b9..6107287d7 100755 --- a/scripts/theme-studio/run-tests.sh +++ b/scripts/theme-studio/run-tests.sh @@ -41,6 +41,22 @@ if node --test ./*.mjs >/tmp/ts-node.log 2>&1; then pass_msg "Node unit tests ($(grep -E '^. tests' /tmp/ts-node.log | grep -oE '[0-9]+' | head -1) tests)" else fail_msg "Node unit tests"; grep -E 'not ok|AssertionError|Error' /tmp/ts-node.log | sed 's/^/ /' | head -20; fi +# 3b. ERT tests for the theme-studio Emacs code: build-theme.el (the theme.json +# -> deftheme emitter, tests under the repo's tests/ dir) and face-docs-dump.el +# (the hover-docstring asset generator, test alongside it here). Run them in one +# headless batch. Skip cleanly if no emacs is on PATH (JS/Python gates still run). +BT_TESTS="$HERE/../../tests/test-build-theme.el" +FD_TESTS="$HERE/test-face-docs-dump.el" +if command -v emacs >/dev/null 2>&1 && [ -f "$BT_TESTS" ]; then + if emacs --batch --no-site-file --no-site-lisp \ + -L "$HERE/../.." -L "$HERE/../../modules" -L "$HERE/../../tests" -L "$HERE/../../themes" \ + -l "$BT_TESTS" -l "$FD_TESTS" -f ert-run-tests-batch-and-exit >/tmp/ts-bt.log 2>&1; then + pass_msg "theme-studio ERT tests ($(grep -oE 'Ran [0-9]+' /tmp/ts-bt.log | awk '{print $2}') tests)" + else fail_msg "theme-studio ERT tests"; grep -E 'FAILED|Error' /tmp/ts-bt.log | sed 's/^/ /' | head -20; fi +else + skip_msg "theme-studio ERT tests (no emacs on PATH)" +fi + # 4. Syntax-check the inlined page script. python3 - <<'PY' && node --check /tmp/ts-script.js >/dev/null 2>&1 && pass_msg "spliced page <script> parses" || fail_msg "spliced page <script> syntax" import re diff --git a/scripts/theme-studio/samples.py b/scripts/theme-studio/samples.py index 02605e75b..585fff04c 100644 --- a/scripts/theme-studio/samples.py +++ b/scripts/theme-studio/samples.py @@ -288,6 +288,419 @@ ZIGS=[ [('punc','}')], ] +RACKETS=[ + [('pp','#lang'),('p',' '),('pp','racket')], + [], + [('cmd',';;'),('p',' '),('cm','Compute Fibonacci numbers with memoization')], + [('punc','('),('kw','require'),('p',' '),('var','racket/list'),('punc',')')], + [], + [('punc','('),('kw','define'),('p',' '),('punc','('),('fnd','fib'),('p',' '),('var','n'),('punc',')')], + [('p',' '),('punc','('),('kw','cond'),('p',' ')], + [('p',' '),('punc','[('),('bi','<'),('p',' '),('var','n'),('p',' '),('num','2'),('punc',')'),('p',' '),('var','n'),('punc',']')], + [('p',' '),('punc','['),('con','else'),('p',' ')], + [('p',' '),('punc','('),('bi','+'),('p',' '),('punc','('),('fnc','fib'),('p',' '),('punc','('),('bi','-'),('p',' '),('var','n'),('p',' '),('num','1'),('punc','))'),('p',' ')], + [('p',' '),('punc','('),('fnc','fib'),('p',' '),('punc','('),('bi','-'),('p',' '),('var','n'),('p',' '),('num','2'),('punc',')))])]')], + [], + [('cmd',';;'),('p',' '),('cm','A point struct with two fields')], + [('punc','('),('kw','struct'),('p',' '),('ty','point'),('p',' '),('punc','('),('prop','x'),('p',' '),('prop','y'),('punc',')'),('p',' '),('con','#:transparent'),('punc',')')], + [], + [('punc','('),('kw','define'),('p',' '),('var','origin'),('p',' '),('punc','('),('fnc','point'),('p',' '),('num','0'),('p',' '),('num','0'),('punc','))')], + [], + [('punc','('),('kw','define'),('p',' '),('var','nums'),('p',' '),('punc','('),('kw','quote'),('p',' '),('punc','('),('num','1'),('p',' '),('num','2'),('p',' '),('num','3'),('p',' '),('num','4'),('p',' '),('num','5'),('punc','))')], + [], + [('punc','('),('kw','define'),('p',' '),('var','squared'),('p',' ')], + [('p',' '),('punc','('),('bi','map'),('p',' '),('punc','('),('kw','lambda'),('p',' '),('punc','('),('var','x'),('punc',')'),('p',' '),('punc','('),('bi','*'),('p',' '),('var','x'),('p',' '),('var','x'),('punc','))'),('p',' '),('var','nums'),('punc','))')], + [], + [('punc','('),('bi','printf'),('p',' '),('str','"squares: ~a\\n"'),('p',' '),('var','squared'),('punc',')')], + [('punc','('),('bi','displayln'),('p',' '),('punc','('),('fnc','first'),('p',' '),('var','squared'),('punc','))')], +] +SCHEMES=[ + [('cmd',';;'),('p',' '),('cm','Tail-recursive factorial in Scheme')], + [], + [('punc','('),('kw','define'),('p',' '),('punc','('),('fnd','factorial'),('p',' '),('var','n'),('punc',')')], + [('p',' '),('punc','('),('kw','let'),('p',' '),('fnd','loop'),('p',' '),('punc','(['),('var','acc'),('p',' '),('num','1'),('punc',']'),('p',' '),('punc','['),('var','i'),('p',' '),('var','n'),('punc','])')], + [('p',' '),('punc','('),('kw','if'),('p',' '),('punc','('),('bi','='),('p',' '),('var','i'),('p',' '),('num','0'),('punc',')')], + [('p',' '),('var','acc'),('p',' ')], + [('p',' '),('punc','('),('fnc','loop'),('p',' '),('punc','('),('bi','*'),('p',' '),('var','acc'),('p',' '),('var','i'),('punc',')'),('p',' '),('punc','('),('bi','-'),('p',' '),('var','i'),('p',' '),('num','1'),('punc','))))')], + [], + [('cmd',';;'),('p',' '),('cm','Higher-order map over a quoted list')], + [('punc','('),('kw','define'),('p',' '),('var','primes'),('p',' '),('punc','('),('kw','quote'),('p',' '),('punc','('),('num','2'),('p',' '),('num','3'),('p',' '),('num','5'),('p',' '),('num','7'),('p',' '),('num','11'),('punc','))')], + [], + [('punc','('),('kw','define'),('p',' '),('punc','('),('fnd','double'),('p',' '),('var','x'),('punc',')')], + [('p',' '),('punc','('),('bi','*'),('p',' '),('var','x'),('p',' '),('num','2'),('punc',')')], + [], + [('punc','('),('kw','define'),('p',' '),('var','doubled'),('p',' '),('punc','('),('bi','map'),('p',' '),('var','double'),('p',' '),('var','primes'),('punc','))')], + [], + [('cmd',';;'),('p',' '),('cm','Predicate using cond and recursion')], + [('punc','('),('kw','define'),('p',' '),('punc','('),('fnd','member?'),('p',' '),('var','x'),('p',' '),('var','lst'),('punc',')')], + [('p',' '),('punc','('),('kw','cond'),('p',' ')], + [('p',' '),('punc','[('),('bi','null?'),('p',' '),('var','lst'),('punc',')'),('p',' '),('con','#f'),('punc',']')], + [('p',' '),('punc','[('),('bi','equal?'),('p',' '),('punc','('),('bi','car'),('p',' '),('var','lst'),('punc',')'),('p',' '),('var','x'),('punc',')'),('p',' '),('con','#t'),('punc',']')], + [('p',' '),('punc','['),('con','else'),('p',' '),('punc','('),('fnc','member?'),('p',' '),('var','x'),('p',' '),('punc','('),('bi','cdr'),('p',' '),('var','lst'),('punc','))]'),('punc',')')], + [], + [('punc','('),('bi','display'),('p',' '),('punc','('),('fnc','member?'),('p',' '),('num','5'),('p',' '),('var','primes'),('punc','))')], + [('punc','('),('bi','newline'),('punc',')')], +] +HASKELLS=[ + [('cmd','-- |'),('cm',' Compute statistics over a stream of samples.')], + [('pp','{-# LANGUAGE ScopedTypeVariables #-}')], + [('kw','module'),('p',' '),('ty','Stats'),('p',' '),('punc','('),('var','mean'),('punc',','),('p',' '),('var','variance'),('punc',')'),('p',' '),('kw','where')], + [], + [('kw','import'),('p',' '),('kw','qualified'),('p',' '),('ty','Data.List'),('p',' '),('kw','as'),('p',' '),('ty','L')], + [], + [('cmd','-- |'),('cm',' A labelled measurement.')], + [('kw','data'),('p',' '),('ty','Sample'),('p',' '),('op','='),('p',' '),('ty','Sample')], + [('p',' '),('p',' '),('punc','{'),('p',' '),('prop','label'),('p',' '),('op','::'),('p',' '),('ty','String')], + [('p',' '),('p',' '),('punc',','),('p',' '),('prop','value'),('p',' '),('op','::'),('p',' '),('ty','Double')], + [('p',' '),('p',' '),('punc','}'),('p',' '),('kw','deriving'),('p',' '),('punc','('),('ty','Show'),('punc',','),('p',' '),('ty','Eq'),('punc',')')], + [], + [('cmd','-- |'),('cm',' Arithmetic mean; returns 0 for an empty list.')], + [('fnd','mean'),('p',' '),('op','::'),('p',' '),('punc','['),('ty','Double'),('punc',']'),('p',' '),('op','->'),('p',' '),('ty','Double')], + [('fnd','mean'),('p',' '),('con','[]'),('p',' '),('op','='),('p',' '),('num','0')], + [('fnd','mean'),('p',' '),('var','xs'),('p',' '),('op','='),('p',' '),('fnc','sum'),('p',' '),('var','xs'),('p',' '),('op','/'),('p',' '),('fnc','fromIntegral'),('p',' '),('punc','('),('fnc','length'),('p',' '),('var','xs'),('punc',')')], + [], + [('fnd','variance'),('p',' '),('op','::'),('p',' '),('punc','['),('ty','Double'),('punc',']'),('p',' '),('op','->'),('p',' '),('ty','Double')], + [('fnd','variance'),('p',' '),('var','xs'),('p',' '),('op','='),('p',' '),('kw','let'),('p',' '),('var','m'),('p',' '),('op','='),('p',' '),('fnc','mean'),('p',' '),('var','xs')], + [('p',' '),('kw','in'),('p',' '),('fnc','mean'),('p',' '),('punc','['),('p',' '),('punc','('),('var','x'),('p',' '),('op','-'),('p',' '),('var','m'),('punc',')'),('p',' '),('op','^'),('p',' '),('num','2'),('p',' '),('op','|'),('p',' '),('var','x'),('p',' '),('op','<-'),('p',' '),('var','xs'),('p',' '),('punc',']')], + [], + [('cmd','-- |'),('cm',' Demo entry point.')], + [('fnd','main'),('p',' '),('op','::'),('p',' '),('ty','IO'),('p',' '),('punc','('),('punc',')')], + [('fnd','main'),('p',' '),('op','='),('p',' '),('kw','do')], + [('p',' '),('kw','let'),('p',' '),('var','samples'),('p',' '),('op','='),('p',' '),('punc','['),('num','1.0'),('punc',','),('p',' '),('num','2.5'),('punc',','),('p',' '),('num','3.5'),('punc',']')], + [('p',' '),('fnc','putStrLn'),('p',' '),('punc','('),('str','"mean = "'),('p',' '),('op','++'),('p',' '),('fnc','show'),('p',' '),('punc','('),('fnc','mean'),('p',' '),('var','samples'),('punc','))')], +] +OCAMLS=[ + [('cmd','(*'),('cm',' Simple expression evaluator with variant types. '),('cmd','*)')], + [], + [('kw','type'),('p',' '),('ty','expr'),('p',' '),('op','=')], + [('p',' '),('p',' '),('op','|'),('p',' '),('ty','Num'),('p',' '),('kw','of'),('p',' '),('ty','float')], + [('p',' '),('p',' '),('op','|'),('p',' '),('ty','Var'),('p',' '),('kw','of'),('p',' '),('ty','string')], + [('p',' '),('p',' '),('op','|'),('p',' '),('ty','Add'),('p',' '),('kw','of'),('p',' '),('ty','expr'),('p',' '),('op','*'),('p',' '),('ty','expr')], + [('p',' '),('p',' '),('op','|'),('p',' '),('ty','Mul'),('p',' '),('kw','of'),('p',' '),('ty','expr'),('p',' '),('op','*'),('p',' '),('ty','expr')], + [], + [('cmd','(**'),('cm',' Evaluate [e] under environment [env]. '),('cmd','*)')], + [('kw','let'),('p',' '),('kw','rec'),('p',' '),('fnd','eval'),('p',' '),('var','env'),('p',' '),('var','e'),('p',' '),('op','=')], + [('p',' '),('kw','match'),('p',' '),('var','e'),('p',' '),('kw','with')], + [('p',' '),('op','|'),('p',' '),('ty','Num'),('p',' '),('var','n'),('p',' '),('op','->'),('p',' '),('var','n')], + [('p',' '),('op','|'),('p',' '),('ty','Var'),('p',' '),('var','x'),('p',' '),('op','->'),('p',' '),('ty','List'),('punc','.'),('fnc','assoc'),('p',' '),('var','x'),('p',' '),('var','env')], + [('p',' '),('op','|'),('p',' '),('ty','Add'),('p',' '),('punc','('),('var','a'),('punc',','),('p',' '),('var','b'),('punc',')'),('p',' '),('op','->'),('p',' '),('fnc','eval'),('p',' '),('var','env'),('p',' '),('var','a'),('p',' '),('op','+.'),('p',' '),('fnc','eval'),('p',' '),('var','env'),('p',' '),('var','b')], + [('p',' '),('op','|'),('p',' '),('ty','Mul'),('p',' '),('punc','('),('var','a'),('punc',','),('p',' '),('var','b'),('punc',')'),('p',' '),('op','->'),('p',' '),('fnc','eval'),('p',' '),('var','env'),('p',' '),('var','a'),('p',' '),('op','*.'),('p',' '),('fnc','eval'),('p',' '),('var','env'),('p',' '),('var','b')], + [], + [('kw','let'),('p',' '),('punc','()'),('p',' '),('op','='),('p',' '),('kw','let'),('p',' '),('var','env'),('p',' '),('op','='),('p',' '),('punc','['),('p',' '),('punc','('),('str','"x"'),('punc',','),('p',' '),('num','3.0'),('punc',')'),('p',' '),('punc',']'),('p',' '),('kw','in')], + [('p',' '),('kw','let'),('p',' '),('var','e'),('p',' '),('op','='),('p',' '),('ty','Add'),('p',' '),('punc','('),('ty','Var'),('p',' '),('str','"x"'),('punc',','),('p',' '),('ty','Num'),('p',' '),('num','4.0'),('punc',')'),('p',' '),('kw','in')], + [('p',' '),('ty','Printf'),('punc','.'),('fnc','printf'),('p',' '),('str','"result = %g\\n"'),('p',' '),('punc','('),('fnc','eval'),('p',' '),('var','env'),('p',' '),('var','e'),('punc',')')], +] +SCALAS=[ + [('cmd','//'),('cm',' Geometry helpers for 2D shapes')], + [('kw','package'),('p',' '),('var','geometry')], + [], + [('kw','import'),('p',' '),('var','scala'),('op','.'),('var','math'),('op','.'),('fnc','sqrt')], + [], + [('dec','@inline'),('p',' '),('kw','final'),('p',' '),('kw','case'),('p',' '),('kw','class'),('p',' '),('ty','Point'),('punc','('),('kw','val'),('p',' '),('prop','x'),('op',':'),('p',' '),('ty','Double'),('punc',','),('p',' '),('kw','val'),('p',' '),('prop','y'),('op',':'),('p',' '),('ty','Double'),('punc',')'),('p',' '),('punc','{')], + [('p',' '),('kw','def'),('p',' '),('fnd','distanceTo'),('punc','('),('var','that'),('op',':'),('p',' '),('ty','Point'),('punc',')'),('op',':'),('p',' '),('ty','Double'),('p',' '),('op','='),('p',' '),('punc','{')], + [('p',' '),('kw','val'),('p',' '),('var','dx'),('p',' '),('op','='),('p',' '),('var','x'),('p',' '),('op','-'),('p',' '),('var','that'),('op','.'),('prop','x')], + [('p',' '),('kw','val'),('p',' '),('var','dy'),('p',' '),('op','='),('p',' '),('var','y'),('p',' '),('op','-'),('p',' '),('var','that'),('op','.'),('prop','y')], + [('p',' '),('fnc','sqrt'),('punc','('),('var','dx'),('p',' '),('op','*'),('p',' '),('var','dx'),('p',' '),('op','+'),('p',' '),('var','dy'),('p',' '),('op','*'),('p',' '),('var','dy'),('punc',')')], + [('p',' '),('punc','}')], + [('punc','}')], + [], + [('kw','object'),('p',' '),('ty','Geometry'),('p',' '),('punc','{')], + [('p',' '),('kw','val'),('p',' '),('var','origin'),('p',' '),('op','='),('p',' '),('ty','Point'),('punc','('),('num','0.0'),('punc',','),('p',' '),('num','0.0'),('punc',')')], + [('p',' '),('kw','val'),('p',' '),('var','pts'),('p',' '),('op','='),('p',' '),('ty','List'),('punc','('),('ty','Point'),('punc','('),('num','3.0'),('punc',','),('p',' '),('num','4.0'),('punc','),'),('p',' '),('ty','Point'),('punc','('),('num','1.0'),('punc',','),('p',' '),('num','2.0'),('punc','))')], + [('p',' '),('kw','val'),('p',' '),('var','dists'),('p',' '),('op','='),('p',' '),('kw','for'),('p',' '),('punc','('),('var','p'),('p',' '),('op','<-'),('p',' '),('var','pts'),('punc',')'),('p',' '),('kw','yield'),('p',' '),('var','origin'),('op','.'),('fnc','distanceTo'),('punc','('),('var','p'),('punc',')')], + [], + [('p',' '),('kw','def'),('p',' '),('fnd','main'),('punc','('),('var','args'),('op',':'),('p',' '),('ty','Array'),('punc','['),('ty','String'),('punc',']'),('punc',')'),('op',':'),('p',' '),('ty','Unit'),('p',' '),('op','='),('p',' '),('punc','{')], + [('p',' '),('var','dists'),('op','.'),('fnc','foreach'),('punc','('),('var','d'),('p',' '),('op','=>'),('p',' '),('fnc','println'),('punc','('),('str','s"dist = $d"'),('punc',')'),('punc',')')], + [('p',' '),('kw','val'),('p',' '),('var','ok'),('p',' '),('op','='),('p',' '),('var','dists'),('op','.'),('fnc','nonEmpty'),('p',' '),('op','&&'),('p',' '),('con','true')], + [('p',' '),('punc','}')], + [('punc','}')], +] +KOTLINS=[ + [('cmd','//'),('cm',' User repository with a simple cache')], + [('kw','package'),('p',' '),('var','com'),('op','.'),('var','example'),('op','.'),('var','data')], + [], + [('kw','import'),('p',' '),('var','kotlin'),('op','.'),('var','collections'),('op','.'),('var','mutableMapOf')], + [], + [('kw','data'),('p',' '),('kw','class'),('p',' '),('ty','User'),('punc','('),('kw','val'),('p',' '),('prop','id'),('op',':'),('p',' '),('ty','Int'),('punc',','),('p',' '),('kw','val'),('p',' '),('prop','name'),('op',':'),('p',' '),('ty','String'),('punc',')')], + [], + [('kw','class'),('p',' '),('ty','UserRepo'),('p',' '),('punc','{')], + [('p',' '),('kw','private'),('p',' '),('kw','val'),('p',' '),('var','cache'),('p',' '),('op','='),('p',' '),('bi','mutableMapOf'),('punc','<'),('ty','Int'),('punc',','),('p',' '),('ty','User'),('punc','>'),('punc','()')], + [], + [('p',' '),('dec','@JvmStatic'),('p',' ')], + [('p',' '),('kw','fun'),('p',' '),('fnd','findById'),('punc','('),('var','id'),('op',':'),('p',' '),('ty','Int'),('punc',')'),('op',':'),('p',' '),('ty','User'),('op','?'),('p',' '),('op','='),('p',' '),('var','cache'),('punc','['),('var','id'),('punc',']')], + [], + [('p',' '),('kw','fun'),('p',' '),('fnd','save'),('punc','('),('var','user'),('op',':'),('p',' '),('ty','User'),('punc',')'),('p',' '),('punc','{')], + [('p',' '),('var','cache'),('punc','['),('var','user'),('op','.'),('prop','id'),('punc',']'),('p',' '),('op','='),('p',' '),('var','user')], + [('p',' '),('bi','println'),('punc','('),('str','"saved '),('esc','\\n'),('str','"'),('p',' '),('op','+'),('p',' '),('var','user'),('op','.'),('prop','name'),('punc',')')], + [('p',' '),('punc','}')], + [('punc','}')], + [], + [('kw','fun'),('p',' '),('fnd','main'),('punc','()'),('p',' '),('punc','{')], + [('p',' '),('kw','val'),('p',' '),('var','repo'),('p',' '),('op','='),('p',' '),('ty','UserRepo'),('punc','()')], + [('p',' '),('var','repo'),('op','.'),('fnc','save'),('punc','('),('ty','User'),('punc','('),('num','1'),('punc',','),('p',' '),('str','"Ada"'),('punc','))')], + [('p',' '),('kw','val'),('p',' '),('var','found'),('p',' '),('op','='),('p',' '),('var','repo'),('op','.'),('fnc','findById'),('punc','('),('num','1'),('punc',')'),('p',' '),('op','?:'),('p',' '),('kw','return')], + [('p',' '),('bi','println'),('punc','('),('var','found'),('punc',')')], + [('punc','}')], +] +SWIFTS=[ + [('cmd','//'),('cm',' Account model with balance guard')], + [('kw','import'),('p',' '),('ty','Foundation')], + [], + [('dec','@frozen'),('p',' ')], + [('kw','struct'),('p',' '),('ty','Account'),('p',' '),('punc','{')], + [('p',' '),('kw','let'),('p',' '),('prop','id'),('op',':'),('p',' '),('ty','Int')], + [('p',' '),('kw','var'),('p',' '),('prop','balance'),('op',':'),('p',' '),('ty','Double'),('p',' '),('op','='),('p',' '),('num','0.0')], + [], + [('p',' '),('kw','func'),('p',' '),('fnd','withdraw'),('punc','('),('var','amount'),('op',':'),('p',' '),('ty','Double'),('punc',')'),('p',' '),('op','->'),('p',' '),('ty','Bool'),('p',' '),('punc','{')], + [('p',' '),('kw','guard'),('p',' '),('var','amount'),('p',' '),('op','<='),('p',' '),('prop','balance'),('p',' '),('kw','else'),('p',' '),('punc','{')], + [('p',' '),('kw','return'),('p',' '),('con','false')], + [('p',' '),('punc','}')], + [('p',' '),('prop','balance'),('p',' '),('op','-='),('p',' '),('var','amount')], + [('p',' '),('kw','return'),('p',' '),('con','true')], + [('p',' '),('punc','}')], + [('punc','}')], + [], + [('kw','let'),('p',' '),('var','acct'),('p',' '),('op','='),('p',' '),('ty','Account'),('punc','('),('var','id'),('op',':'),('p',' '),('num','7'),('punc',','),('p',' '),('var','balance'),('op',':'),('p',' '),('num','100.0'),('punc',')')], + [('kw','var'),('p',' '),('var','copy'),('p',' '),('op','='),('p',' '),('var','acct')], + [('kw','let'),('p',' '),('var','ok'),('p',' '),('op','='),('p',' '),('var','copy'),('op','.'),('fnc','withdraw'),('punc','('),('var','amount'),('op',':'),('p',' '),('num','30.0'),('punc',')')], + [('bi','print'),('punc','('),('str','"acct ok="'),('punc',','),('p',' '),('var','ok'),('punc',')')], +] +LUAS=[ + [('cmd','--'),('cm',' Account module: balances and transfers')], + [('kw','local'),('p',' '),('ty','Account'),('op','='),('punc','{}')], + [('ty','Account'),('punc','.'),('prop','__index'),('op','='),('ty','Account')], + [], + [('kw','local'),('p',' '),('var','rates'),('op','='),('p',' '),('punc','{'),('str','"usd"'),('op','='),('num','1.0'),('punc',','),('p',' '),('str','"eur"'),('op','='),('num','0.92'),('punc','}')], + [], + [('kw','function'),('p',' '),('ty','Account'),('op','.'),('fnd','new'),('punc','('),('var','name'),('punc',','),('p',' '),('var','balance'),('punc',')')], + [('p',' '),('kw','local'),('p',' '),('var','self'),('op','='),('p',' '),('fnc','setmetatable'),('punc','('),('punc','{}'),('punc',','),('p',' '),('ty','Account'),('punc',')')], + [('p',' '),('var','self'),('punc','.'),('prop','name'),('op','='),('var','name')], + [('p',' '),('var','self'),('punc','.'),('prop','balance'),('op','='),('p',' '),('var','balance'),('p',' '),('kw','or'),('p',' '),('num','0')], + [('p',' '),('kw','return'),('p',' '),('var','self')], + [('kw','end')], + [], + [('kw','function'),('p',' '),('ty','Account'),('op',':'),('fnd','report'),('punc','()')], + [('p',' '),('kw','for'),('p',' '),('var','code'),('punc',','),('p',' '),('var','rate'),('p',' '),('kw','in'),('p',' '),('bi','pairs'),('punc','('),('var','rates'),('punc',')'),('p',' '),('kw','do')], + [('p',' '),('bi','print'),('punc','('),('var','code'),('punc',','),('p',' '),('var','self'),('punc','.'),('prop','balance'),('p',' '),('op','*'),('p',' '),('var','rate'),('punc',')')], + [('p',' '),('kw','end')], + [('p',' '),('kw','if'),('p',' '),('var','self'),('punc','.'),('prop','balance'),('p',' '),('op','=='),('p',' '),('num','0'),('p',' '),('kw','then')], + [('p',' '),('kw','return'),('p',' '),('con','nil')], + [('p',' '),('kw','end')], + [('p',' '),('kw','return'),('p',' '),('con','true')], + [('kw','end')], +] +RUBYS=[ + [('cmd','#'),('cm',' Inventory tracker with tagged items')], + [('kw','class'),('p',' '),('ty','Inventory')], + [('p',' '),('kw','def'),('p',' '),('fnd','initialize'),('punc','('),('var','items'),('p',' '),('op','='),('p',' '),('punc','[]'),('punc',')')], + [('p',' '),('var','@items'),('p',' '),('op','='),('p',' '),('var','items')], + [('p',' '),('var','@tags'),('p',' '),('op','='),('p',' '),('punc','{'),('prop','sku:'),('p',' '),('con','nil'),('punc','}')], + [('p',' '),('kw','end')], + [], + [('p',' '),('kw','def'),('p',' '),('fnd','add'),('punc','('),('var','name'),('punc',','),('p',' '),('var','price'),('punc',')')], + [('p',' '),('kw','return'),('p',' '),('con','false'),('p',' '),('kw','unless'),('p',' '),('var','name'),('p',' '),('op','=~'),('p',' '),('re','/\\A\\w+\\z/')], + [('p',' '),('var','@items'),('p',' '),('op','<<'),('p',' '),('punc','{'),('p',' '),('prop','name:'),('p',' '),('var','name'),('punc',','),('p',' '),('prop','price:'),('p',' '),('var','price'),('p',' '),('punc','}')], + [('p',' '),('kw','end')], + [], + [('p',' '),('kw','def'),('p',' '),('fnd','total'),('punc','('),('var','tax'),('p',' '),('op','='),('p',' '),('num','0.08'),('punc',')')], + [('p',' '),('var','sum'),('p',' '),('op','='),('p',' '),('num','0')], + [('p',' '),('var','@items'),('punc','.'),('fnc','each'),('p',' '),('kw','do'),('p',' '),('punc','|'),('var','item'),('punc','|')], + [('p',' '),('var','sum'),('p',' '),('op','+='),('p',' '),('var','item'),('punc','['),('prop',':price'),('punc',']')], + [('p',' '),('kw','end')], + [('p',' '),('bi','printf'),('punc','('),('str','"total: %.2f\\n"'),('punc',','),('p',' '),('var','sum'),('p',' '),('op','*'),('p',' '),('punc','('),('num','1'),('p',' '),('op','+'),('p',' '),('var','tax'),('punc','))')], + [('p',' '),('kw','end')], + [('kw','end')], +] +PERLS=[ + [('cmd','#'),('cm','!/usr/bin/perl')], + [('kw','use'),('p',' '),('pp','strict'),('punc',';')], + [('kw','use'),('p',' '),('pp','warnings'),('punc',';')], + [], + [('cmd','#'),('cm',' Parse a config line into a hash')], + [('kw','sub'),('p',' '),('fnd','parse_config'),('p',' '),('punc','{')], + [('p',' '),('kw','my'),('p',' '),('punc','('),('var','$line'),('punc',')'),('p',' '),('op','='),('p',' '),('var','@_'),('punc',';')], + [('p',' '),('kw','my'),('p',' '),('var','%conf'),('p',' '),('op','='),('p',' '),('punc','()'),('punc',';')], + [], + [('p',' '),('kw','if'),('p',' '),('punc','('),('var','$line'),('p',' '),('op','=~'),('p',' '),('re','/^(\\w+)\\s*=\\s*(.+)$/'),('punc',')'),('p',' '),('punc','{')], + [('p',' '),('var','$conf'),('punc','{'),('var','$1'),('punc','}'),('p',' '),('op','='),('p',' '),('var','$2'),('punc',';')], + [('p',' '),('punc','}')], + [], + [('p',' '),('kw','return'),('p',' '),('op','\\'),('var','%conf'),('punc',';')], + [('punc','}')], + [], + [('kw','my'),('p',' '),('var','$ref'),('p',' '),('op','='),('p',' '),('fnc','parse_config'),('punc','('),('str','"host = localhost"'),('punc',')'),('punc',';')], + [('kw','my'),('p',' '),('var','@keys'),('p',' '),('op','='),('p',' '),('bi','keys'),('p',' '),('var','%$ref'),('punc',';')], + [('bi','print'),('p',' '),('var','@keys'),('punc',';')], +] +RLANGS=[ + [('cmd','#'),('cm',' Summarize sales by region and fit a model')], + [('var','library'),('punc','('),('bi','dplyr'),('punc',')')], + [], + [('var','sales'),('p',' '),('op','<-'),('p',' '),('fnc','read.csv'),('punc','('),('str','"sales.csv"'),('punc',','),('p',' '),('prop','stringsAsFactors'),('p',' '),('op','='),('p',' '),('con','FALSE'),('punc',')')], + [('var','regions'),('p',' '),('op','<-'),('p',' '),('bi','c'),('punc','('),('str','"North"'),('punc',','),('p',' '),('str','"South"'),('punc',','),('p',' '),('str','"East"'),('punc',','),('p',' '),('str','"West"'),('punc',')')], + [], + [('cmd','#'),('cm',' Compute mean revenue per region')], + [('fnd','summarize_region'),('p',' '),('op','<-'),('p',' '),('kw','function'),('punc','('),('var','df'),('punc',','),('p',' '),('var','reg'),('punc',')'),('p',' '),('punc','{')], + [('p',' '),('var','subset'),('p',' '),('op','<-'),('p',' '),('var','df'),('punc','['),('var','df'),('op','$'),('prop','region'),('p',' '),('op','=='),('p',' '),('var','reg'),('punc',','),('p',' '),('punc',']')], + [('p',' '),('kw','if'),('p',' '),('punc','('),('fnc','nrow'),('punc','('),('var','subset'),('punc',')'),('p',' '),('op','=='),('p',' '),('num','0'),('punc',')'),('p',' '),('punc','{')], + [('p',' '),('kw','return'),('punc','('),('con','NA'),('punc',')')], + [('p',' '),('punc','}')], + [('p',' '),('fnc','mean'),('punc','('),('var','subset'),('op','$'),('prop','revenue'),('punc',','),('p',' '),('prop','na.rm'),('p',' '),('op','='),('p',' '),('con','TRUE'),('punc',')')], + [('punc','}')], + [], + [('var','means'),('p',' '),('op','<-'),('p',' '),('fnc','sapply'),('punc','('),('var','regions'),('punc',','),('p',' '),('kw','function'),('punc','('),('var','r'),('punc',')'),('p',' '),('fnc','summarize_region'),('punc','('),('var','sales'),('punc',','),('p',' '),('var','r'),('punc',')'),('punc',')')], + [('var','sales'),('p',' '),('op','%>%'),('p',' '),('fnc','filter'),('punc','('),('prop','revenue'),('p',' '),('op','>'),('p',' '),('num','1000'),('punc',')'),('p',' '),('op','%>%'),('p',' '),('fnc','head'),('punc','('),('num','5'),('punc',')')], + [], + [('var','model'),('p',' '),('op','<-'),('p',' '),('fnc','lm'),('punc','('),('prop','revenue'),('p',' '),('op','~'),('p',' '),('prop','units'),('p',' '),('op','+'),('p',' '),('prop','region'),('punc',','),('p',' '),('prop','data'),('p',' '),('op','='),('p',' '),('var','sales'),('punc',')')], + [('fnc','print'),('punc','('),('fnc','summary'),('punc','('),('var','model'),('punc',')'),('punc',')')], +] +ERLANGS=[ + [('cmd','%'),('cm',' Bank account server with pattern matching')], + [('pp','-module'),('punc','('),('ty','bank'),('punc',').')], + [('pp','-export'),('punc','(['),('fnc','start'),('op','/'),('num','0'),('punc',','),('p',' '),('fnc','balance'),('op','/'),('num','1'),('punc','])'),('punc','.')], + [], + [('fnd','start'),('punc','()'),('p',' '),('op','->')], + [('p',' '),('fnc','spawn'),('punc','('),('kw','fun'),('punc','()'),('p',' '),('op','->'),('p',' '),('fnc','loop'),('punc','('),('num','0'),('punc',')'),('p',' '),('kw','end'),('punc',').')], + [], + [('fnd','loop'),('punc','('),('var','Balance'),('punc',')'),('p',' '),('op','->')], + [('p',' '),('kw','receive')], + [('p',' '),('punc','{'),('con','deposit'),('punc',','),('p',' '),('var','Amount'),('punc','}'),('p',' '),('kw','when'),('p',' '),('var','Amount'),('p',' '),('op','>'),('p',' '),('num','0'),('p',' '),('op','->')], + [('p',' '),('fnc','loop'),('punc','('),('var','Balance'),('p',' '),('op','+'),('p',' '),('var','Amount'),('punc',')'),('punc',';')], + [('p',' '),('punc','{'),('con','withdraw'),('punc',','),('p',' '),('var','Amount'),('punc','}'),('p',' '),('op','->')], + [('p',' '),('fnc','loop'),('punc','('),('var','Balance'),('p',' '),('op','-'),('p',' '),('var','Amount'),('punc',')'),('punc',';')], + [('p',' '),('punc','{'),('con','balance'),('punc',','),('p',' '),('var','From'),('punc','}'),('p',' '),('op','->')], + [('p',' '),('var','From'),('p',' '),('op','!'),('p',' '),('punc','{'),('con','ok'),('punc',','),('p',' '),('var','Balance'),('punc','}'),('punc',','),('p',' '),('fnc','loop'),('punc','('),('var','Balance'),('punc',')')], + [('p',' '),('kw','end'),('punc','.')], + [], + [('fnd','balance'),('punc','('),('var','Pid'),('punc',')'),('p',' '),('op','->')], + [('p',' '),('var','Pid'),('p',' '),('op','!'),('p',' '),('punc','{'),('con','balance'),('punc',','),('p',' '),('fnc','self'),('punc','()'),('punc','}'),('punc',','),('p',' '),('kw','receive'),('p',' '),('punc','{'),('con','ok'),('punc',','),('p',' '),('var','B'),('punc','}'),('p',' '),('op','->'),('p',' '),('var','B'),('p',' '),('kw','end'),('punc','.')], +] +SQLS=[ + [('cmd','-- '),('cm','Monthly revenue by active customer')], + [('kw','SELECT'),('p',' '),('prop','c.id'),('punc',','),('p',' '),('prop','c.name'),('punc',',')], + [('p',' '),('bi','COUNT'),('punc','('),('prop','o.id'),('punc',')'),('p',' '),('kw','AS'),('p',' '),('var','order_count'),('punc',',')], + [('p',' '),('bi','COALESCE'),('punc','('),('bi','SUM'),('punc','('),('prop','o.total'),('punc','),'),('p',' '),('num','0'),('punc',')'),('p',' '),('kw','AS'),('p',' '),('var','revenue')], + [('kw','FROM'),('p',' '),('prop','customers'),('p',' '),('var','c')], + [('kw','JOIN'),('p',' '),('prop','orders'),('p',' '),('var','o'),('p',' '),('kw','ON'),('p',' '),('prop','o.customer_id'),('p',' '),('op','='),('p',' '),('prop','c.id')], + [('kw','WHERE'),('p',' '),('prop','c.active'),('p',' '),('op','='),('p',' '),('con','TRUE')], + [('p',' '),('kw','AND'),('p',' '),('prop','o.created_at'),('p',' '),('op','>='),('p',' '),('str',"'2024-01-01'")], + [('p',' '),('kw','AND'),('p',' '),('prop','o.status'),('p',' '),('op','<>'),('p',' '),('con','NULL')], + [('kw','GROUP BY'),('p',' '),('prop','c.id'),('punc',','),('p',' '),('prop','c.name')], + [('kw','HAVING'),('p',' '),('bi','COUNT'),('punc','('),('prop','o.id'),('punc',')'),('p',' '),('op','>'),('p',' '),('num','5')], + [('kw','ORDER BY'),('p',' '),('var','revenue'),('p',' '),('kw','DESC')], + [('kw','LIMIT'),('p',' '),('num','25'),('punc',';')], + [], + [('cmd','-- '),('cm','Flag stale accounts for review')], + [('kw','UPDATE'),('p',' '),('prop','customers')], + [('kw','SET'),('p',' '),('prop','status'),('p',' '),('op','='),('p',' '),('str',"'dormant'")], + [('kw','WHERE'),('p',' '),('prop','last_login'),('p',' '),('op','<'),('p',' '),('bi','CURRENT_DATE'),('p',' '),('op','-'),('p',' '),('kw','INTERVAL'),('p',' '),('str',"'90 days'")], + [('p',' '),('kw','AND'),('p',' '),('prop','active'),('p',' '),('op','='),('p',' '),('con','FALSE'),('punc',';')], +] +PHPS=[ + [('pp','<?php')], + [('kw','namespace'),('p',' '),('ty','App\\Service'),('punc',';')], + [], + [('cmd','/** '),('doc','Computes invoice totals. */')], + [('dec','#[Service]')], + [('kw','class'),('p',' '),('ty','InvoiceCalculator')], + [('punc','{')], + [('p',' '),('kw','public'),('p',' '),('ty','float'),('p',' '),('var','$taxRate'),('p',' '),('op','='),('p',' '),('num','0.0825'),('punc',';')], + [], + [('p',' '),('kw','public'),('p',' '),('kw','function'),('p',' '),('fnd','total'),('punc','('),('kw','array'),('p',' '),('var','$items'),('punc',')'),('op',':'),('p',' '),('ty','float')], + [('p',' '),('punc','{')], + [('p',' '),('cmd','// '),('cm','sum each line item')], + [('p',' '),('var','$prices'),('p',' '),('op','='),('p',' '),('bi','array_map'),('punc','('),('kw','fn'),('punc','('),('var','$i'),('punc',')'),('p',' '),('op','=>'),('p',' '),('var','$i'),('op','['),('str',"'price'"),('op',']'),('punc',','),('p',' '),('var','$items'),('punc',')'),('punc',';')], + [('p',' '),('var','$subtotal'),('p',' '),('op','='),('p',' '),('bi','array_sum'),('punc','('),('var','$prices'),('punc',')'),('punc',';')], + [], + [('p',' '),('kw','if'),('p',' '),('punc','('),('var','$subtotal'),('p',' '),('op','==='),('p',' '),('num','0'),('punc',')'),('p',' '),('punc','{')], + [('p',' '),('kw','return'),('p',' '),('num','0.0'),('punc',';')], + [('p',' '),('punc','}')], + [], + [('p',' '),('var','$total'),('p',' '),('op','='),('p',' '),('var','$subtotal'),('p',' '),('op','*'),('p',' '),('punc','('),('num','1'),('p',' '),('op','+'),('p',' '),('var','$this'),('op','->'),('prop','taxRate'),('punc',')'),('punc',';')], + [('p',' '),('fnc','printf'),('punc','('),('str','"Total: %.2f\\n"'),('punc',','),('p',' '),('var','$total'),('punc',')'),('punc',';')], + [('p',' '),('kw','return'),('p',' '),('var','$total'),('punc',';')], + [('p',' '),('punc','}')], + [('punc','}')], +] +ADAS=[ + [('cmd','-- '),('cm','Compute factorial and print the result')], + [('pp','with'),('p',' '),('var','Ada.Text_IO'),('punc',';')], + [('pp','use'),('p',' '),('var','Ada.Text_IO'),('punc',';')], + [], + [('kw','procedure'),('p',' '),('fnd','Factorial_Demo'),('p',' '),('kw','is')], + [('p',' '),('var','N'),('p',' '),('punc',':'),('p',' '),('ty','Integer'),('p',' '),('op',':='),('p',' '),('num','5'),('punc',';')], + [('p',' '),('var','Result'),('p',' '),('punc',':'),('p',' '),('ty','Integer'),('p',' '),('op',':='),('p',' '),('num','1'),('punc',';')], + [('kw','begin')], + [('p',' '),('kw','for'),('p',' '),('var','I'),('p',' '),('kw','in'),('p',' '),('num','1'),('p',' '),('op','..'),('p',' '),('var','N'),('p',' '),('kw','loop')], + [('p',' '),('var','Result'),('p',' '),('op',':='),('p',' '),('var','Result'),('p',' '),('op','*'),('p',' '),('var','I'),('punc',';')], + [('p',' '),('kw','end'),('p',' '),('kw','loop'),('punc',';')], + [], + [('p',' '),('kw','if'),('p',' '),('var','Result'),('p',' '),('op','>'),('p',' '),('num','0'),('p',' '),('kw','then')], + [('p',' '),('bi','Put_Line'),('punc','('),('str','"Factorial = "'),('p',' '),('op','&'),('p',' '),('var','Integer'),('punc',"'"),('var','Image'),('punc','('),('var','Result'),('punc','))'),('punc',';')], + [('p',' '),('kw','end'),('p',' '),('kw','if'),('punc',';')], + [('kw','end'),('p',' '),('fnd','Factorial_Demo'),('punc',';')], +] +FORTRANS=[ + [('cmd','! '),('cm','Sum the elements of an array')], + [('kw','program'),('p',' '),('fnd','array_sum')], + [('p',' '),('kw','implicit none')], + [('p',' '),('ty','integer'),('p',' '),('punc','::'),('p',' '),('var','i'),('punc',','),('p',' '),('var','n')], + [('p',' '),('ty','real'),('punc','('),('var','kind'),('op','='),('num','8'),('punc',')'),('p',' '),('punc','::'),('p',' '),('var','total')], + [('p',' '),('ty','real'),('punc','('),('var','kind'),('op','='),('num','8'),('punc',')'),('punc',','),('p',' '),('kw','dimension'),('punc','('),('num','5'),('punc',')'),('p',' '),('punc','::'),('p',' '),('var','a')], + [], + [('p',' '),('var','n'),('p',' '),('op','='),('p',' '),('num','5')], + [('p',' '),('var','total'),('p',' '),('op','='),('p',' '),('num','0.0')], + [('p',' '),('var','a'),('p',' '),('op','='),('p',' '),('punc','['),('num','1.0'),('punc',','),('p',' '),('num','2.0'),('punc',','),('p',' '),('num','3.0'),('punc',','),('p',' '),('num','4.0'),('punc',','),('p',' '),('num','5.0'),('punc',']')], + [], + [('p',' '),('kw','do'),('p',' '),('var','i'),('p',' '),('op','='),('p',' '),('num','1'),('punc',','),('p',' '),('var','n')], + [('p',' '),('var','total'),('p',' '),('op','='),('p',' '),('var','total'),('p',' '),('op','+'),('p',' '),('var','a'),('punc','('),('var','i'),('punc',')')], + [('p',' '),('kw','end do')], + [], + [('p',' '),('bi','print'),('p',' '),('op','*'),('punc',','),('p',' '),('str','"Sum = "'),('punc',','),('p',' '),('var','total')], + [('kw','end program'),('p',' '),('fnd','array_sum')], +] +MATLABS=[ + [('cmd','% '),('cm','Normalize a vector and report its length')], + [('kw','function'),('p',' '),('var','out'),('p',' '),('op','='),('p',' '),('fnd','normalize_vec'),('punc','('),('var','v'),('punc',')')], + [('p',' '),('var','n'),('p',' '),('op','='),('p',' '),('bi','length'),('punc','('),('var','v'),('punc',')'),('punc',';')], + [('p',' '),('var','acc'),('p',' '),('op','='),('p',' '),('num','0'),('punc',';')], + [], + [('p',' '),('kw','for'),('p',' '),('var','i'),('p',' '),('op','='),('p',' '),('num','1'),('op',':'),('var','n')], + [('p',' '),('var','acc'),('p',' '),('op','='),('p',' '),('var','acc'),('p',' '),('op','+'),('p',' '),('var','v'),('punc','('),('var','i'),('punc',')'),('op','^'),('num','2'),('punc',';')], + [('p',' '),('kw','end')], + [], + [('p',' '),('var','mag'),('p',' '),('op','='),('p',' '),('bi','sqrt'),('punc','('),('var','acc'),('punc',')'),('punc',';')], + [('p',' '),('kw','if'),('p',' '),('var','mag'),('p',' '),('op','=='),('p',' '),('num','0')], + [('p',' '),('var','out'),('p',' '),('op','='),('p',' '),('bi','zeros'),('punc','('),('bi','size'),('punc','('),('var','v'),('punc',')'),('punc',')'),('punc',';')], + [('p',' '),('kw','else')], + [('p',' '),('var','out'),('p',' '),('op','='),('p',' '),('var','v'),('p',' '),('op','/'),('p',' '),('var','mag'),('punc',';')], + [('p',' '),('kw','end')], + [], + [('p',' '),('bi','disp'),('punc','('),('str','"vector length:"'),('punc',')'),('punc',';')], + [('p',' '),('bi','disp'),('punc','('),('var','n'),('punc',')'),('punc',';')], + [('kw','end')], +] +ASMS=[ + [('cmd',';'),('cm',' print a greeting via the write syscall')], + [('pp','section'),('p',' '),('pp','.data')], + [('p',' '),('var','msg'),('p',' '),('pp','db'),('p',' '),('str','"Hello, world!"'),('punc',','),('p',' '),('num','0xA')], + [('p',' '),('con','msglen'),('p',' '),('pp','equ'),('p',' '),('var','$'),('p',' '),('op','-'),('p',' '),('var','msg')], + [], + [('pp','section'),('p',' '),('pp','.text')], + [('p',' '),('bi','global'),('p',' '),('fnc','_start')], + [], + [('fnd','_start'),('punc',':')], + [('p',' '),('kw','mov'),('p',' '),('var','rax'),('punc',','),('p',' '),('num','1'),('p',' '),('cmd',';'),('cm',' sys_write')], + [('p',' '),('kw','mov'),('p',' '),('var','rdi'),('punc',','),('p',' '),('num','1'),('p',' '),('cmd',';'),('cm',' stdout')], + [('p',' '),('kw','lea'),('p',' '),('var','rsi'),('punc',','),('p',' '),('punc','['),('var','rel'),('p',' '),('var','msg'),('punc',']')], + [('p',' '),('kw','mov'),('p',' '),('var','rdx'),('punc',','),('p',' '),('con','msglen')], + [('p',' '),('kw','syscall')], + [], + [('p',' '),('kw','mov'),('p',' '),('var','rax'),('punc',','),('p',' '),('num','60'),('p',' '),('cmd',';'),('cm',' sys_exit')], + [('p',' '),('kw','xor'),('p',' '),('var','rdi'),('punc',','),('p',' '),('var','rdi'),('p',' '),('cmd',';'),('cm',' status 0')], + [('p',' '),('kw','syscall')], +] + # THEME_STUDIO_DATA_END: generate.py execs only the lines above this marker (the # code samples and COLS). Everything below is the standalone /tmp/dupre-canon.html # preview generator, run only when samples.py is executed directly. diff --git a/scripts/theme-studio/styles.css b/scripts/theme-studio/styles.css index 720539cfd..a22777035 100644 --- a/scripts/theme-studio/styles.css +++ b/scripts/theme-studio/styles.css @@ -4,8 +4,8 @@ .wrap{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:14px;padding-bottom:10px} .col{flex:0 0 auto;width:460px} pre{background:#0d0b0a;border:1px solid #252321;border-radius:8px;padding:14px 16px;font-size:12pt;overflow:auto;white-space:pre} - table.leg{border-collapse:collapse} table.leg td{padding:4px 12px;vertical-align:middle} - table.leg th{cursor:pointer;color:#b4b1a2;text-align:left;padding:4px 12px;user-select:none;font-weight:normal} + table.leg{border-collapse:collapse} table.leg td{padding:4px 8px;vertical-align:middle} + table.leg th{cursor:pointer;color:#b4b1a2;text-align:left;padding:4px 8px;user-select:none;font-weight:normal} #legtable th:nth-child(3),#legtable th:nth-child(4), #legtable td:nth-child(3),#legtable td:nth-child(4), #uitable th:nth-child(3),#uitable th:nth-child(4), @@ -19,8 +19,18 @@ .boxbtn{width:17px;height:15px;padding:0;border:1px solid #3a3a3a;border-radius:3px;background:#1f1c19;color:#cdced1;font:11px monospace;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center} .boxbtn.on{background:#3a3320;border-color:#e8bd30;color:#e8bd30} .boxbtn:disabled{opacity:.3;cursor:default} - .stylecluster{display:grid;grid-template-columns:repeat(2,1fr);gap:2px;width:max-content} - .stylecluster .sbtn{margin:0} + .stylecluster{display:flex;flex-wrap:wrap;align-items:center;gap:4px;width:max-content;max-width:210px} + .exptoggle{width:18px;height:18px;padding:0;border:1px solid #3a3a3a;border-radius:3px;background:#1f1c19;color:#8a9496;font:12px monospace;line-height:1;cursor:pointer;vertical-align:middle} + .exptoggle.on{background:#3a3320;border-color:#e8bd30;color:#e8bd30} + .exptoggle.exp-nd{border-color:#e8bd30;color:#e8bd30} + .exptoggle:disabled{opacity:.3;cursor:default} + tr.detailrow>td{background:#15120f;border-top:1px solid #2a2a2a;padding:8px 14px} + .detailedit{display:flex;flex-wrap:wrap;align-items:center;gap:14px} + .detailfield{display:flex;align-items:center;gap:5px;font:11px monospace;color:#b4b1a2} + .detailfield>span{white-space:nowrap} + input.detailinput{width:120px;padding:3px 5px;font:11px monospace;background:#1f1c19;color:#cdced1;border:1px solid #3a3a3a;border-radius:4px} + select.detailsel{width:130px;font:10pt monospace} + input.detailcheck{width:15px;height:15px;cursor:pointer} table.leg th:hover{color:#e8bd30} select.chip{appearance:none;border:1px solid #00000060;border-radius:5px;padding:5px 10px;font:bold 14px monospace;width:160px;cursor:pointer} /* Prev/next arrows flanking the view dropdown: step the selection without reopening it. @@ -41,6 +51,14 @@ .cdd.compact.is-default{border-color:#8f7810;box-shadow:inset 0 0 0 1px #8f7810} .cddsw{display:inline-block;width:13px;height:13px;border-radius:3px;border:1px solid #0007;flex:none} .cdd.compact .cddsw{width:18px;height:18px} + .cdd.enumdd{width:auto;min-width:60px;max-width:96px;justify-content:center;background:#161412;color:#cdced1;font:13px monospace;padding:5px 8px} + .cdd.enumdd.is-default{color:#8a8a82} + .cdd.enumdd.locked{cursor:default;opacity:.85;box-shadow:inset 0 0 0 2px #e8bd3088} + .enumpop{display:flex;flex-direction:column;gap:2px;min-width:96px} + .enumopt{text-align:left;font:13px monospace;color:#cdced1;background:#161412;border:1px solid #3a3a3a;border-radius:4px;padding:4px 10px;cursor:pointer} + .enumopt:hover{background:#252321} + .enumopt.sel{outline:1px solid #e8bd30;outline-offset:1px} + .enumdef{color:#9a9a92} .cddpop{position:fixed;z-index:200;background:#161412;border:1px solid #3a3a3a;border-radius:6px;box-shadow:0 12px 34px #000c;max-height:70vh;overflow:auto;padding:8px} .cddghead{display:flex;align-items:center;gap:8px;margin-bottom:7px} .cddgdef{font:bold 11px monospace;color:#cdced1;background:#161412;border:1px solid #3a3a3a;border-radius:4px;padding:3px 10px;cursor:pointer} @@ -59,7 +77,6 @@ .boxctl .cstepbtn{width:18px} .legctl{margin:0 0 8px;display:flex;gap:8px;align-items:center} .cat{color:#b4b1a2} .ex{font-size:17px} - .crerr{display:inline-block;margin-left:8px;padding:0 4px;border-radius:3px;background:#2b130e;color:#cb6b4d;border:1px solid #7b3324;font:9pt monospace;vertical-align:middle} .paltoggle{align-self:flex-start;width:22px;height:22px;padding:0;border:1px solid #3a3a3a;border-radius:4px;background:#1f1c19;color:#e8bd30;font:12px monospace;line-height:1;cursor:pointer;margin-right:6px} /* Barber-pole flag: a ring of two alternating contrasting colors, drawn with a masked repeating gradient so it overlays without shifting layout. Distinct diff --git a/scripts/theme-studio/test-app-core.mjs b/scripts/theme-studio/test-app-core.mjs index 8f62ae55a..217ea0e6b 100644 --- a/scripts/theme-studio/test-app-core.mjs +++ b/scripts/theme-studio/test-app-core.mjs @@ -7,9 +7,11 @@ import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { fileURLToPath } from 'node:url'; import { - nameToHex, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, dropdownRowTextColor, paletteOptionList, spanNeighborHex, slugify, + nameToHex, migrateLegacyFace, normalizePkgFace, buildPkgmap, packagesForExport, mergePackagesInto, effResolve, resolveSyntaxFg, resolveUiAttr, paletteOptionList, spanNeighborHex, slugify, clearPalettePlan, deletePaletteColumnPlan, groundColumnMembersFromPalette, areAllLocked, lockToggleLabel, toggleLockSet, - galleryModel, appViewKeysSorted, faceBoxNonDefaults, stepViewIndex, + galleryModel, appViewKeysSorted, faceBoxNonDefaults, overflowNonDefault, stepViewIndex, + cssWeight, faceDecoration, boxCss, faceCss, composeHoverTitle, + clampHeight, HEIGHT_MIN, HEIGHT_MAX, } from './app-core.js'; import { planPaletteGenerator, entriesForGeneratedColumn } from './palette-generator-core.js'; import { oklch2hex, deltaE } from './colormath.js'; @@ -621,7 +623,7 @@ test('buildPkgmap: Normal — seeds faces, resolving names and applying defaults ] } }; const m = buildPkgmap(apps, PAL); assert.equal(m['org-mode']['org-todo'].fg, '#67809c'); - assert.equal(m['org-mode']['org-todo'].bold, true); + assert.equal(m['org-mode']['org-todo'].weight, 'bold'); // legacy bold migrated on seed assert.equal(m['org-mode']['org-todo'].source, 'default'); assert.equal(m['org-mode']['org-todo'].height, 1); assert.equal(m['org-mode']['org-done'].inherit, 'org-todo'); @@ -630,16 +632,63 @@ test('buildPkgmap: Normal — seeds faces, resolving names and applying defaults test('normalizePkgFace: Normal — fills every package face field', () => { assert.deepEqual(normalizePkgFace({ fg: 'blue', bold: true, inherit: 'base' }, 'default', PAL), { - fg: '#67809c', bg: null, bold: true, italic: false, underline: false, - strike: false, inherit: 'base', height: 1, box: null, source: 'default', + fg: '#67809c', bg: null, 'distant-fg': null, family: null, weight: 'bold', + slant: null, underline: null, strike: null, overline: null, + inherit: 'base', height: 1, box: null, inverse: false, extend: false, + source: 'default', }); }); +test('migrateLegacyFace: Normal — legacy booleans become the new shape', () => { + assert.deepEqual( + migrateLegacyFace({ bold: true, italic: true, underline: true, strike: true }), + { weight: 'bold', slant: 'italic', underline: { style: 'line', color: null }, strike: { color: null } }, + ); +}); + +test('migrateLegacyFace: Boundary — false booleans clear, explicit weight/slant win', () => { + const m = migrateLegacyFace({ bold: false, italic: false, underline: false, strike: false }); + assert.ok(!('weight' in m), 'bold:false sets no weight'); + assert.ok(!('slant' in m), 'italic:false sets no slant'); + assert.equal(m.underline, null); + assert.equal(m.strike, null); + assert.ok(!('bold' in m) && !('italic' in m), 'legacy booleans are removed'); + // an explicit weight/slant already set is not overwritten by the legacy flag + assert.equal(migrateLegacyFace({ bold: true, weight: 'light' }).weight, 'light'); + assert.equal(migrateLegacyFace({ italic: true, slant: 'oblique' }).slant, 'oblique'); +}); + +test('migrateLegacyFace: Boundary — a new-shape face passes through unchanged (idempotent)', () => { + const f = { weight: 'semibold', slant: 'oblique', underline: { style: 'wave', color: '#abcdef' }, strike: { color: null } }; + assert.deepEqual(migrateLegacyFace(f), f); + assert.deepEqual(migrateLegacyFace(migrateLegacyFace(f)), f); +}); + +test('normalizePkgFace: Normal — carries the additive attribute model', () => { + const f = normalizePkgFace({ + fg: 'blue', 'distant-fg': '#222222', family: 'Iosevka', + overline: { color: '#abcdef' }, inverse: true, extend: 1, height: 1.4, + }, 'user', PAL); + assert.equal(f['distant-fg'], '#222222'); + assert.equal(f.family, 'Iosevka'); + assert.deepEqual(f.overline, { color: '#abcdef' }); + assert.equal(f.inverse, true); + assert.equal(f.extend, true); // coerced to boolean + assert.equal(f.height, 1.4); +}); + +test('normalizePkgFace: Boundary — distant-fg resolves through the palette', () => { + const f = normalizePkgFace({ 'distant-fg': 'blue' }, 'user', PAL); + assert.equal(f['distant-fg'], '#67809c'); +}); + test('buildPkgmap: Boundary — a face with no default dict still seeds blank', () => { const m = buildPkgmap({ a: { faces: [['f', 'f']] } }, PAL); assert.deepEqual(m.a.f, { - fg: null, bg: null, bold: false, italic: false, underline: false, - strike: false, inherit: null, height: 1, box: null, source: 'default', + fg: null, bg: null, 'distant-fg': null, family: null, weight: null, + slant: null, underline: null, strike: null, overline: null, + inherit: null, height: 1, box: null, inverse: false, extend: false, + source: 'default', }); }); @@ -670,15 +719,29 @@ test('effResolve: Error — an inherit cycle terminates at null, no overflow', ( test('packagesForExport: Normal — exports sourced faces, omits height 1', () => { const m = { a: { f: { - fg: '#67809c', bg: null, bold: true, italic: false, underline: false, - strike: false, inherit: null, height: 1, source: 'user', + fg: '#67809c', bg: null, weight: 'bold', slant: null, underline: null, + strike: null, inherit: null, height: 1, source: 'user', } } }; const out = packagesForExport(m); assert.equal(out.a.f.fg, '#67809c'); + assert.equal(out.a.f.weight, 'bold'); assert.equal(out.a.f.source, 'user'); + assert.ok(!('slant' in out.a.f), 'unset slant is omitted'); assert.ok(!('height' in out.a.f), 'height 1 is omitted'); }); +test('packagesForExport: Normal — emits weight/slant/underline/strike only when set', () => { + const m = { a: { f: normalizePkgFace({ + fg: '#67809c', weight: 'semibold', slant: 'oblique', + underline: { style: 'wave', color: '#abcdef' }, strike: { color: null }, + }, 'user') } }; + const o = packagesForExport(m).a.f; + assert.equal(o.weight, 'semibold'); + assert.equal(o.slant, 'oblique'); + assert.deepEqual(o.underline, { style: 'wave', color: '#abcdef' }); + assert.deepEqual(o.strike, { color: null }); +}); + test('packagesForExport: Boundary — keeps a non-default height', () => { const m = { a: { f: { fg: null, bg: null, source: 'user', height: 1.2 } } }; assert.equal(packagesForExport(m).a.f.height, 1.2); @@ -689,15 +752,47 @@ test('packagesForExport: Error — faces with an unknown source are skipped', () assert.deepEqual(packagesForExport(m), {}); }); +test('packagesForExport: Normal — emits additive attrs only when set', () => { + const m = { a: { f: normalizePkgFace({ + fg: '#67809c', 'distant-fg': '#222222', family: 'Iosevka', + overline: { color: '#abcdef' }, inverse: true, extend: true, + }, 'user') } }; + const o = packagesForExport(m).a.f; + assert.equal(o['distant-fg'], '#222222'); + assert.equal(o.family, 'Iosevka'); + assert.deepEqual(o.overline, { color: '#abcdef' }); + assert.equal(o.inverse, true); + assert.equal(o.extend, true); +}); + +test('packagesForExport: Boundary — unset additive attrs are omitted', () => { + const m = { a: { f: normalizePkgFace({ fg: '#67809c' }, 'user') } }; + const o = packagesForExport(m).a.f; + for (const k of ['distant-fg', 'family', 'overline', 'inverse', 'extend']) { + assert.ok(!(k in o), k + ' is omitted when unset'); + } +}); + test('mergePackagesInto: Normal — fills missing fields with defaults', () => { const m = {}; mergePackagesInto(m, { a: { f: { fg: '#112233' } } }); assert.deepEqual(m.a.f, { - fg: '#112233', bg: null, bold: false, italic: false, underline: false, - strike: false, inherit: null, height: 1, box: null, source: 'user', + fg: '#112233', bg: null, 'distant-fg': null, family: null, weight: null, + slant: null, underline: null, strike: null, overline: null, + inherit: null, height: 1, box: null, inverse: false, extend: false, + source: 'user', }); }); +test('mergePackagesInto: Normal — migrates a legacy preset face on import', () => { + const m = {}; + mergePackagesInto(m, { a: { f: { fg: '#112233', bold: true, italic: true, underline: true } } }); + assert.equal(m.a.f.weight, 'bold'); + assert.equal(m.a.f.slant, 'italic'); + assert.deepEqual(m.a.f.underline, { style: 'line', color: null }); + assert.ok(!('bold' in m.a.f) && !('italic' in m.a.f), 'legacy booleans dropped'); +}); + test('mergePackagesInto: Boundary — undefined pkgs is a no-op', () => { const m = { a: { f: { fg: '#000000' } } }; mergePackagesInto(m, undefined); @@ -724,35 +819,34 @@ test('slugify: Error — an all-disallowed name falls back to "theme"', () => { // Guards the one-source-of-truth contract, same as the colormath integrity test: // the page must carry app-core.js's body (sans exports) verbatim. Requires // `python3 generate.py` to have run first. -const stripExports = (s) => - s.split('\n').filter((l) => !(l.startsWith('export') || l.startsWith('import'))).join('\n').replace(/\s+$/, ''); +import { stripInlinedBody } from './inline-strip.mjs'; test('inline-integrity: theme-studio.html contains the app-core.js body verbatim', () => { - const body = stripExports(readFileSync(here + 'app-core.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'app-core.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing the app-core.js body verbatim'); }); test('inline-integrity: theme-studio.html contains palette-generator-core.js verbatim', () => { - const body = stripExports(readFileSync(here + 'palette-generator-core.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'palette-generator-core.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing palette-generator-core.js verbatim'); }); test('inline-integrity: theme-studio.html contains palette-generator-ui.js verbatim', () => { - const body = stripExports(readFileSync(here + 'palette-generator-ui.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'palette-generator-ui.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing palette-generator-ui.js verbatim'); }); test('inline-integrity: theme-studio.html contains palette-actions.js verbatim', () => { - const body = stripExports(readFileSync(here + 'palette-actions.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'palette-actions.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing palette-actions.js verbatim'); }); test('inline-integrity: theme-studio.html contains browser-gates.js verbatim', () => { - const body = stripExports(readFileSync(here + 'browser-gates.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'browser-gates.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing browser-gates.js verbatim'); }); @@ -806,23 +900,6 @@ test('resolveUiAttr: a face with no inherit and an unset attribute returns null' assert.equal(resolveUiAttr('region', 'bg', { 'region': { bg: null } }), null); }); -// dropdownRowTextColor: a popup row showing a real palette color inherits the -// popup foreground (legible on the fixed dark popup); only the filled default -// row uses a contrast color against its own background. textOn is stubbed so the -// test asserts the decision, not the contrast math. -const stubTextOn = (h) => (h === '#000000' ? '#fff' : '#000'); -test('dropdownRowTextColor: a real palette color inherits the popup fg (empty)', () => { - assert.equal(dropdownRowTextColor('#2a3a5a', '#2a3a5a', stubTextOn), ''); -}); -test('dropdownRowTextColor: a dark swatch still inherits (regression: blues were unreadable)', () => { - assert.equal(dropdownRowTextColor('#000000', '#000000', stubTextOn), ''); -}); -test('dropdownRowTextColor: the filled default row contrasts against its fill', () => { - assert.equal(dropdownRowTextColor('', '#cdced1', stubTextOn), '#000'); -}); -test('dropdownRowTextColor: a default row with no fill inherits (empty)', () => { - assert.equal(dropdownRowTextColor('', '', stubTextOn), ''); -}); // appViewKeysSorted: the assignment-view dropdown lists package apps // alphabetically by display label, independent of the APPS build order @@ -864,10 +941,36 @@ test('faceBoxNonDefaults: a set fg over an empty default flags fg', () => { assert.equal(faceBoxNonDefaults({ fg: '#8ea85e' }, {}).fg, true); assert.equal(faceBoxNonDefaults({}, {}).fg, false); }); -test('faceBoxNonDefaults: any style attr differing flags the style box once', () => { - assert.equal(faceBoxNonDefaults({ bold: true }, { bold: false }).style, true); - assert.equal(faceBoxNonDefaults({ strike: true }, {}).style, true); - assert.equal(faceBoxNonDefaults({ bold: true }, { bold: true }).style, false); +test('faceBoxNonDefaults: an in-row style attr differing flags the style box once', () => { + assert.equal(faceBoxNonDefaults({ weight: 'bold' }, { weight: null }).style, true); + assert.equal(faceBoxNonDefaults({ slant: 'italic' }, {}).style, true); + assert.equal(faceBoxNonDefaults({ strike: { color: null } }, {}).style, true); + // underline lives in the expander now, so it does not flag the in-row style box + assert.equal(faceBoxNonDefaults({ underline: { style: 'line', color: null } }, {}).style, false); + assert.equal(faceBoxNonDefaults({ weight: 'bold' }, { weight: 'bold' }).style, false); +}); + +test('overflowNonDefault: Normal — flags an expander attr that differs from default', () => { + assert.equal(overflowNonDefault({ family: 'Iosevka' }, {}, false), true); + assert.equal(overflowNonDefault({ underline: { style: 'wave', color: null } }, {}, false), true); + assert.equal(overflowNonDefault({ inverse: true }, {}, false), true); + assert.equal(overflowNonDefault({ 'distant-fg': '#222222' }, {}, false), true); +}); + +test('overflowNonDefault: Boundary — matching attrs and in-row attrs do not flag', () => { + // identical overflow attrs -> no flag + const f = { family: 'Iosevka', overline: { color: '#abc' }, inverse: true }; + assert.equal(overflowNonDefault(f, f, false), false); + // weight/slant/strike are in-row, not the expander's concern + assert.equal(overflowNonDefault({ weight: 'bold', slant: 'italic', strike: { color: null } }, {}, false), false); +}); + +test('overflowNonDefault: Boundary — inherit/height only count when shown in the expander', () => { + // packages keep inherit/height inline (showInheritHeight false) -> not flagged here + assert.equal(overflowNonDefault({ inherit: 'shadow', height: 1.4 }, {}, false), false); + // ui/syntax expose them in the expander (showInheritHeight true) -> flagged + assert.equal(overflowNonDefault({ inherit: 'shadow' }, {}, true), true); + assert.equal(overflowNonDefault({ height: 1.4 }, {}, true), true); }); test('faceBoxNonDefaults: inherit and box differences are flagged', () => { assert.equal(faceBoxNonDefaults({ inherit: 'bold' }, { inherit: null }).inherit, true); @@ -895,3 +998,176 @@ test('stepViewIndex: a single option or empty list stays put', () => { assert.equal(stepViewIndex(3, 0, -1), 3); assert.equal(stepViewIndex(0, 0, 1), 0); }); + +// --- face CSS rendering helpers (promoted from app.js into app-core) ---------- + +test('cssWeight: Normal — each weight name maps to its CSS number', () => { + assert.equal(cssWeight('light'), 300); + assert.equal(cssWeight('normal'), 400); + assert.equal(cssWeight('medium'), 500); + assert.equal(cssWeight('semibold'), 600); + assert.equal(cssWeight('bold'), 700); + assert.equal(cssWeight('heavy'), 900); +}); +test('cssWeight: Boundary — null/undefined/empty fall back to "normal"', () => { + assert.equal(cssWeight(null), 'normal'); + assert.equal(cssWeight(undefined), 'normal'); + assert.equal(cssWeight(''), 'normal'); +}); +test('cssWeight: Error — unknown name or a number falls back to "normal"', () => { + assert.equal(cssWeight('ultrablack'), 'normal'); + assert.equal(cssWeight(700), 'normal'); +}); + +test('faceDecoration: Normal — underline, strike, or both', () => { + assert.equal(faceDecoration({underline:{style:'line',color:null}}), 'underline'); + assert.equal(faceDecoration({strike:{color:null}}), 'line-through'); + assert.equal(faceDecoration({underline:{style:'line'}, strike:{color:null}}), + 'underline line-through'); +}); +test('faceDecoration: Boundary — neither set yields "none"', () => { + assert.equal(faceDecoration({}), 'none'); + assert.equal(faceDecoration({underline:null, strike:null}), 'none'); +}); +test('faceDecoration: Error — falsy underline/strike are ignored', () => { + assert.equal(faceDecoration({underline:false, strike:false}), 'none'); +}); + +test('boxCss: Normal — line box uses the box color', () => { + assert.equal(boxCss({style:'line', color:'#aabbcc'}), 'inset 0 0 0 1px #aabbcc'); +}); +test('boxCss: Normal — pressed is released with the relief edges swapped', () => { + const rel = boxCss({style:'released', width:1, color:'#808080'}); + const pre = boxCss({style:'pressed', width:1, color:'#808080'}); + assert.match(rel, /^inset 1px 1px 0 \S+,inset -1px -1px 0 \S+$/); + assert.notEqual(rel, pre); + const [, ra, rz] = rel.match(/inset 1px 1px 0 (\S+?),inset -1px -1px 0 (\S+)/); + const [, pa, pz] = pre.match(/inset 1px 1px 0 (\S+?),inset -1px -1px 0 (\S+)/); + assert.equal(pa, rz); + assert.equal(pz, ra); +}); +test('boxCss: Boundary — width respected; missing color uses currentColor', () => { + assert.equal(boxCss({style:'line', width:3, color:'#123456'}), 'inset 0 0 0 3px #123456'); + assert.equal(boxCss({style:'line'}), 'inset 0 0 0 1px currentColor'); +}); +test('boxCss: Boundary — released/pressed with no color and no bg use the fallback', () => { + assert.equal(boxCss({style:'released'}), + 'inset 1px 1px 0 #ffffff33,inset -1px -1px 0 #00000066'); + assert.equal(boxCss({style:'pressed'}), + 'inset 1px 1px 0 #00000066,inset -1px -1px 0 #ffffff33'); +}); +test('boxCss: Error — null or styleless box yields the empty string', () => { + assert.equal(boxCss(null), ''); + assert.equal(boxCss({}), ''); + assert.equal(boxCss({color:'#ffffff'}), ''); +}); + +test('faceCss: Normal — minimal face is color plus defaults', () => { + assert.equal(faceCss({}, '#111111', null, {}), + 'color:#111111;font-weight:normal;font-style:normal;text-decoration:none'); +}); +test('faceCss: Normal — background, weight, slant, decoration reflected', () => { + assert.equal( + faceCss({weight:'bold', slant:'italic', underline:{style:'line'}}, '#111', '#222', {}), + 'color:#111;background:#222;font-weight:700;font-style:italic;text-decoration:underline'); +}); +test('faceCss: Boundary — noBg suppresses background; null bg omits it', () => { + assert.equal(faceCss({}, '#111', '#222', {noBg:true}), + 'color:#111;font-weight:normal;font-style:normal;text-decoration:none'); + assert.equal(faceCss({}, '#111', null, {}), + 'color:#111;font-weight:normal;font-style:normal;text-decoration:none'); +}); +test('faceCss: Boundary — font-size precedes box-shadow', () => { + assert.equal( + faceCss({box:{style:'line',color:'#abcabc'}}, '#111', null, {fontSize:1.15, boxBg:'#000'}), + 'color:#111;font-weight:normal;font-style:normal;text-decoration:none;font-size:1.15em;box-shadow:inset 0 0 0 1px #abcabc'); +}); +test('faceCss: Error — opts omitted still works', () => { + assert.equal(faceCss({}, '#111', null), + 'color:#111;font-weight:normal;font-style:normal;text-decoration:none'); +}); + +// --- defensive / fallback branches ------------------------------------------- + +test('migrateLegacyFace: Boundary — null/undefined input yields an empty object', () => { + assert.deepEqual(migrateLegacyFace(null), {}); + assert.deepEqual(migrateLegacyFace(undefined), {}); +}); + +test('normalizePkgFace: Normal — source falls back through arg, d.source, then "user"', () => { + assert.equal(normalizePkgFace({}, 'default').source, 'default'); // arg wins + assert.equal(normalizePkgFace({source: 'cleared'}).source, 'cleared'); // d.source + assert.equal(normalizePkgFace({}).source, 'user'); // default +}); + +test('mergePackagesInto: Boundary — null packages is a no-op', () => { + const map = {existing: {f: {fg: '#111'}}}; + mergePackagesInto(map, null); + assert.deepEqual(Object.keys(map), ['existing']); +}); +test('mergePackagesInto: Normal — a new app key is created', () => { + const map = {}; + mergePackagesInto(map, {newapp: {'face-a': {fg: '#112233', source: 'user'}}}); + assert.ok(map.newapp && map.newapp['face-a']); + assert.equal(map.newapp['face-a'].fg, '#112233'); +}); + +test('boxCss: Boundary — released with no color but a bg shades from the bg', () => { + const fromBg = boxCss({style: 'released'}, '#808080'); + // not the translucent no-bg fallback, and a real two-edge relief + assert.notEqual(fromBg, 'inset 1px 1px 0 #ffffff33,inset -1px -1px 0 #00000066'); + assert.match(fromBg, /^inset 1px 1px 0 \S+,inset -1px -1px 0 \S+$/); +}); + +test('composeHoverTitle: Normal — docstring sits on top of existing base text', () => { + assert.equal(composeHoverTitle('A face doc.', 'mode-line'), + 'A face doc.\n\nmode-line'); +}); +test('composeHoverTitle: Boundary — doc only (no base) returns the doc', () => { + assert.equal(composeHoverTitle('A face doc.', ''), 'A face doc.'); + assert.equal(composeHoverTitle('A face doc.', null), 'A face doc.'); +}); +test('composeHoverTitle: Boundary — base only (no doc) returns the base unchanged', () => { + assert.equal(composeHoverTitle('', 'mode-line'), 'mode-line'); + assert.equal(composeHoverTitle(undefined, 'mode-line'), 'mode-line'); +}); +test('composeHoverTitle: Error — neither doc nor base returns empty string', () => { + assert.equal(composeHoverTitle(null, null), ''); + assert.equal(composeHoverTitle(undefined, ''), ''); +}); + +// --- clampHeight: coerce a height-field value to null (unset) or an in-range number --- +test('clampHeight: bounds are the agreed Emacs-floor / studio-ceiling pair', () => { + assert.equal(HEIGHT_MIN, 0.1); + assert.equal(HEIGHT_MAX, 2.0); +}); +test('clampHeight: Normal — an in-range value passes through unchanged', () => { + assert.equal(clampHeight('1.2'), 1.2); + assert.equal(clampHeight('0.5'), 0.5); + assert.equal(clampHeight(1.0), 1.0); +}); +test('clampHeight: Boundary — the exact min and max are kept', () => { + assert.equal(clampHeight('0.1'), 0.1); + assert.equal(clampHeight('2.0'), 2.0); + assert.equal(clampHeight(0.1), 0.1); +}); +test('clampHeight: Boundary — out-of-range snaps to the nearer bound', () => { + assert.equal(clampHeight('5'), 2.0); // above max + assert.equal(clampHeight('0.05'), 0.1); // below the Emacs floor + assert.equal(clampHeight('0'), 0.1); // zero is not unset; it clamps up + assert.equal(clampHeight('-3'), 0.1); // negative clamps up +}); +test('clampHeight: Boundary — blank or whitespace is unset (null)', () => { + assert.equal(clampHeight(''), null); + assert.equal(clampHeight(' '), null); + assert.equal(clampHeight(null), null); + assert.equal(clampHeight(undefined), null); +}); +test('clampHeight: Error — non-numeric text is unset (null), not NaN', () => { + assert.equal(clampHeight('abc'), null); + assert.equal(clampHeight('1.2x'), 1.2); // parseFloat reads the leading number +}); +test('clampHeight: caller may override the bounds', () => { + assert.equal(clampHeight('5', 0.1, 3.0), 3.0); + assert.equal(clampHeight('0.2', 0.5, 3.0), 0.5); +}); diff --git a/scripts/theme-studio/test-app-util.mjs b/scripts/theme-studio/test-app-util.mjs index 37cf0889b..057f55f8d 100644 --- a/scripts/theme-studio/test-app-util.mjs +++ b/scripts/theme-studio/test-app-util.mjs @@ -84,12 +84,10 @@ test('textOn: Boundary — straddles the ~0.179 luminance crossover', () => { // Inline-integrity: the page must carry app-util.js's body (sans import/export) // verbatim — the same strip generate.py applies. Requires `python3 generate.py`. -const stripModule = (s) => - s.split('\n').filter((l) => !(l.startsWith('export') || l.startsWith('import'))) - .join('\n').replace(/\s+$/, ''); +import { stripInlinedBody } from './inline-strip.mjs'; test('inline-integrity: theme-studio.html contains the app-util.js body verbatim', () => { - const body = stripModule(readFileSync(here + 'app-util.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'app-util.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing the app-util.js body verbatim'); }); diff --git a/scripts/theme-studio/test-colormath.mjs b/scripts/theme-studio/test-colormath.mjs index 992d35bcc..a1ec9264e 100644 --- a/scripts/theme-studio/test-colormath.mjs +++ b/scripts/theme-studio/test-colormath.mjs @@ -13,14 +13,13 @@ import { srgb2oklab, oklab2oklch, oklch2oklab, oklch2hex, apca, deltaE, hex2rgb, rl, contrast, rating, hsv2rgb, rgb2hsv, rgb2hex, oklab2lrgb, inGamut, lrgb2hex, planeCell, paletteWarnings, - reliefColors, + reliefColors, isPureEndpointHex, } from './colormath.js'; const close = (a, b, eps = 0.005) => Math.abs(a - b) <= eps; const here = fileURLToPath(new URL('.', import.meta.url)); -// Same export-strip generate.py applies before inlining (drop `export` lines, rstrip). -const stripExports = (s) => - s.split('\n').filter((l) => !l.startsWith('export')).join('\n').replace(/\s+$/, ''); +// Same strip generate.py applies before inlining (drop export/import lines, rstrip). +import { stripInlinedBody } from './inline-strip.mjs'; test('srgb2oklab achromatic anchors', () => { const w = srgb2oklab('#ffffff'); @@ -266,7 +265,36 @@ test('reliefColors: malformed hex returns null pair (Error)', () => { // body (sans exports) verbatim, so the inlined copy and the tested module cannot // drift. Requires `python3 generate.py` to have run first. test('inline-integrity: theme-studio.html contains the colormath.js body verbatim', () => { - const body = stripExports(readFileSync(here + 'colormath.js', 'utf8')); + const body = stripInlinedBody(readFileSync(here + 'colormath.js', 'utf8')); const html = readFileSync(here + 'theme-studio.html', 'utf8'); assert.ok(html.includes(body), 'generated page is missing the colormath.js body verbatim'); }); + +// --- apca contrast branches + isPureEndpointHex ------------------------------ + +test('apca: Boundary — equal luminance returns 0 (below the delta-Y floor)', () => { + assert.equal(apca('#808080', '#808080'), 0); +}); +test('apca: Normal — dark text on light background is positive (Ybg > Ytxt)', () => { + assert.ok(apca('#000000', '#ffffff') > 0); +}); +test('apca: Normal — light text on dark background is negative (else branch)', () => { + assert.ok(apca('#ffffff', '#000000') < 0); +}); +test('apca: Boundary — near-equal colors below the floor clamp to 0', () => { + assert.equal(apca('#808080', '#828282'), 0); +}); + +test('isPureEndpointHex: Normal — pure black and white are endpoints', () => { + assert.equal(isPureEndpointHex('#ffffff'), true); + assert.equal(isPureEndpointHex('#000000'), true); + assert.equal(isPureEndpointHex('#FFFFFF'), true); +}); +test('isPureEndpointHex: Boundary — any other color is not an endpoint', () => { + assert.equal(isPureEndpointHex('#010101'), false); + assert.equal(isPureEndpointHex('#123456'), false); +}); +test('isPureEndpointHex: Error — null/empty is not an endpoint', () => { + assert.equal(isPureEndpointHex(null), false); + assert.equal(isPureEndpointHex(''), false); +}); diff --git a/scripts/theme-studio/test-face-docs-dump.el b/scripts/theme-studio/test-face-docs-dump.el new file mode 100644 index 000000000..c77417708 --- /dev/null +++ b/scripts/theme-studio/test-face-docs-dump.el @@ -0,0 +1,78 @@ +;;; test-face-docs-dump.el --- ERT tests for face-docs-dump.el -*- lexical-binding: t -*- + +;;; Commentary: +;; Tests the pure docstring-extraction helper (`face-docs--first-line') and the +;; syntax-category resolution (`face-docs--syntax-map') in face-docs-dump.el, the +;; asset generator behind theme-studio's element hovers. The faces map is a +;; thin `face-list' walk over `face-docs--first-line', so testing the helper and +;; the syntax resolution covers the logic that can actually be wrong. +;; +;; Self-locating: loads face-docs-dump.el and build-theme.el (for the +;; category->face map) from this file's own directory, so the runner only needs +;; to `-l' this file. + +;;; Code: + +(require 'ert) + +(let ((dir (file-name-directory + (or load-file-name buffer-file-name default-directory)))) + (load (expand-file-name "face-docs-dump.el" dir) nil t) + (load (expand-file-name "build-theme.el" dir) nil t)) + +;;; --- face-docs--first-line --- + +(ert-deftest test-face-docs-first-line-normal-multiline () + "Normal: returns the first line of a multi-line docstring." + (should (equal (face-docs--first-line "First line.\nSecond line.") + "First line."))) + +(ert-deftest test-face-docs-first-line-single-line () + "Normal: a single-line docstring returns unchanged." + (should (equal (face-docs--first-line "Just one.") "Just one."))) + +(ert-deftest test-face-docs-first-line-skips-leading-blank-lines () + "Boundary: leading blank lines are skipped to the first real line, trimmed." + (should (equal (face-docs--first-line "\n\n Real line.\nrest") + "Real line."))) + +(ert-deftest test-face-docs-first-line-collapses-internal-whitespace () + "Boundary: runs of spaces and tabs inside the line collapse to one space." + (should (equal (face-docs--first-line "A B\tC") "A B C"))) + +(ert-deftest test-face-docs-first-line-empty-is-nil () + "Boundary: an empty string yields nil." + (should (null (face-docs--first-line "")))) + +(ert-deftest test-face-docs-first-line-whitespace-only-is-nil () + "Boundary: a blank/whitespace-only docstring yields nil." + (should (null (face-docs--first-line " \n\t "))) + (should (null (face-docs--first-line " ")))) + +(ert-deftest test-face-docs-first-line-non-string-is-nil () + "Error: nil, a number, or the :null sentinel yields nil." + (should (null (face-docs--first-line nil))) + (should (null (face-docs--first-line 42))) + (should (null (face-docs--first-line :null)))) + +;;; --- face-docs--syntax-map --- + +(ert-deftest test-face-docs-syntax-map-resolves-category-to-face-doc () + "Normal: kw resolves to font-lock-keyword-face's first docstring line." + (let ((m (face-docs--syntax-map))) + (should (stringp (gethash "kw" m))) + (should (string-match-p "keyword" (downcase (gethash "kw" m)))))) + +(ert-deftest test-face-docs-syntax-map-bg-and-p-are-default () + "Boundary: bg and p resolve to the default face's docstring." + (let ((m (face-docs--syntax-map)) + (def (face-docs--first-line (face-documentation 'default)))) + (should (equal (gethash "bg" m) def)) + (should (equal (gethash "p" m) def)))) + +(ert-deftest test-face-docs-syntax-map-omits-faceless-category () + "Boundary: dec (Emacs has no dedicated decorator face) is absent." + (should (null (gethash "dec" (face-docs--syntax-map))))) + +(provide 'test-face-docs-dump) +;;; test-face-docs-dump.el ends here diff --git a/scripts/theme-studio/test-palette-generator-core.mjs b/scripts/theme-studio/test-palette-generator-core.mjs new file mode 100644 index 000000000..d3d725957 --- /dev/null +++ b/scripts/theme-studio/test-palette-generator-core.mjs @@ -0,0 +1,78 @@ +// Unit tests for the palette generator planner (palette-generator-core.js). +// Only planPaletteGenerator and entriesForGeneratedColumn are exported, so the +// internal scheme / vibe / source-mode / intent logic is exercised by driving +// the planner across each of those input dimensions. +// Run: node --test scripts/theme-studio/ + +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { planPaletteGenerator, entriesForGeneratedColumn } from './palette-generator-core.js'; + +const GROUND = { bg: '#0d0b0a', fg: '#f0fef0' }; +const PAL = [['#0d0b0a', 'bg'], ['#f0fef0', 'fg'], ['#67809c', 'blue'], ['#e8bd30', 'gold']]; +const rng = () => 0.42; // deterministic, so failures repeat + +test('planPaletteGenerator: Normal — every scheme produces a valid plan', () => { + for (const scheme of ['random', 'analogous', 'triadic', 'manual']) { + const plan = planPaletteGenerator(PAL, GROUND, { scheme, accentCount: 4, spanCount: 0, rng }); + assert.equal(plan.scheme, scheme); + assert.ok(Array.isArray(plan.columns), `${scheme} columns`); + assert.equal(typeof plan.summary.generated, 'number'); + } +}); + +test('planPaletteGenerator: Normal — every vibe biases hues without error', () => { + for (const vibe of ['warm', 'cool', 'earthy', 'muted', 'pastel', 'deep', + 'jewel', 'neon', 'strange', 'balanced']) { + const plan = planPaletteGenerator(PAL, GROUND, + { scheme: 'analogous', vibe, accentCount: 5, spanCount: 0, rng }); + assert.equal(plan.vibe, vibe); + assert.ok(Array.isArray(plan.columns), `${vibe} columns`); + } +}); + +test('planPaletteGenerator: Normal — every source mode resolves', () => { + for (const sourceMode of ['bg-fg', 'palette', 'none', 'selected']) { + const plan = planPaletteGenerator(PAL, GROUND, + { sourceMode, selectedHex: '#9b5fd0', scheme: 'analogous', accentCount: 3, spanCount: 0, rng }); + assert.ok(['bg-fg', 'palette', 'none', 'selected'].includes(plan.sourceMode)); + assert.ok(Array.isArray(plan.columns)); + } +}); + +test('planPaletteGenerator: Boundary — selected source with no valid hex falls back to bg-fg', () => { + const plan = planPaletteGenerator(PAL, GROUND, + { sourceMode: 'selected', scheme: 'analogous', accentCount: 2, spanCount: 0, rng }); + assert.equal(plan.sourceMode, 'bg-fg'); +}); + +test('planPaletteGenerator: Normal — fill-gaps and fill-hue-gaps intents produce plans', () => { + for (const intent of ['fill-gaps', 'fill-hue-gaps']) { + const plan = planPaletteGenerator(PAL, GROUND, { intent, accentCount: 4, spanCount: 0, rng }); + assert.equal(plan.intent, intent); + assert.ok(Array.isArray(plan.columns)); + } +}); + +test('planPaletteGenerator: Boundary — an empty palette still plans', () => { + const plan = planPaletteGenerator([], { bg: '#000000', fg: '#ffffff' }, + { scheme: 'analogous', accentCount: 3, spanCount: 0, rng }); + assert.ok(Array.isArray(plan.columns)); + assert.equal(typeof plan.summary.generated, 'number'); +}); + +test('planPaletteGenerator: Boundary — spanCount expands a column into members', () => { + const plan = planPaletteGenerator(PAL, GROUND, + { scheme: 'analogous', accentCount: 2, spanCount: 2, rng }); + if (plan.columns.length) assert.ok(plan.columns[0].members.length >= 1); +}); + +test('entriesForGeneratedColumn: Normal — maps a planned column to palette entries', () => { + const plan = planPaletteGenerator(PAL, GROUND, + { scheme: 'analogous', accentCount: 1, spanCount: 0, rng }); + if (plan.columns.length) { + const entries = entriesForGeneratedColumn(plan.columns[0]); + assert.ok(Array.isArray(entries) && entries.length >= 1); + assert.ok(typeof entries[0][0] === 'string' && entries[0][0].startsWith('#')); + } +}); diff --git a/scripts/theme-studio/test_generate.py b/scripts/theme-studio/test_generate.py index ed2ce74ba..974fca68a 100644 --- a/scripts/theme-studio/test_generate.py +++ b/scripts/theme-studio/test_generate.py @@ -10,6 +10,7 @@ Run: python3 -m unittest test_generate (from scripts/theme-studio/) """ import os import io +import json import tempfile import runpy import unittest @@ -82,38 +83,36 @@ class AssembledPage(unittest.TestCase): "PALETTE_ACTIONS_J", "BROWSER_GATES_J", "COLORMATH_J", "SAMPLES_J", "PALETTE_J", "CATS_J", "UIFACES_J", "UIMAP_J", "APPS_J", "SYNTAX_J", "MAP_J", - "COLOR_NAMES_J", + "COLOR_NAMES_J", "FACE_DOCS_J", "SYNTAX_DOCS_J", ] def test_every_placeholder_is_substituted(self): for token in self.PLACEHOLDERS: self.assertNotIn(token, generate.HTML, f"{token} left unsubstituted") - def test_page_carries_the_colormath_body_verbatim(self): - # Python-side inline-integrity: the same guarantee the JS test asserts, but - # checked at the point the page is built rather than after a round-trip. - self.assertIn(generate.COLORMATH_BODY, generate.HTML) - - def test_page_carries_the_app_core_body_verbatim(self): - # app-core.js inlines verbatim (no data placeholders), so the inlined copy - # and the unit-tested module cannot drift. - self.assertIn(generate.APP_CORE_BODY, generate.HTML) - - def test_page_carries_the_app_util_body_verbatim(self): - # app-util.js inlines verbatim after its import line is stripped. - self.assertIn(generate.APP_UTIL_BODY, generate.HTML) - - def test_page_carries_palette_generator_core_verbatim(self): - self.assertIn(generate.PALETTE_GENERATOR_CORE_BODY, generate.HTML) - - def test_page_carries_palette_generator_ui_verbatim(self): - self.assertIn(generate.PALETTE_GENERATOR_UI_BODY, generate.HTML) - - def test_page_carries_palette_actions_verbatim(self): - self.assertIn(generate.PALETTE_ACTIONS_BODY, generate.HTML) - - def test_page_carries_browser_gates_verbatim(self): - self.assertIn(generate.BROWSER_GATES_BODY, generate.HTML) + def test_face_docs_maps_embed_a_known_docstring(self): + # The face/syntax docstring maps inline so element hovers can show them. + # default is always present; its first line is stable across Emacs builds. + self.assertIn("Basic default face.", generate.FACE_DOCS["default"]) + self.assertIn(json.dumps(generate.FACE_DOCS), generate.HTML) + + def test_syntax_docs_resolve_categories_to_face_docstrings(self): + # The syntax table is keyed by category (kw, doc, ...); each resolves to + # its font-lock face's docstring via build-theme's canonical map. + self.assertIn("keyword", generate.SYNTAX_DOCS["kw"].lower()) + self.assertIn(json.dumps(generate.SYNTAX_DOCS), generate.HTML) + + def test_page_carries_each_inlined_body_verbatim(self): + # Python-side inline-integrity: every verbatim-inlined module (no data + # placeholders, exports/imports stripped) must appear in the page byte for + # byte, so the inlined copy and the unit-tested module cannot drift. Checked + # at build time rather than after a round-trip. app-util.js's import line is + # already stripped in APP_UTIL_BODY. + for name in ("COLORMATH_BODY", "APP_CORE_BODY", "APP_UTIL_BODY", + "PALETTE_GENERATOR_CORE_BODY", "PALETTE_GENERATOR_UI_BODY", + "PALETTE_ACTIONS_BODY", "BROWSER_GATES_BODY"): + with self.subTest(body=name): + self.assertIn(getattr(generate, name), generate.HTML) def test_app_util_inlined_body_has_no_import_line(self): # The `import rl` line must be gone, or the page <script> is invalid. @@ -164,6 +163,20 @@ class LanguageSamples(unittest.TestCase): self.assertIn("@import", text) self.assertIn("error.MissingColor", text) + def test_expanded_language_set_is_registered_and_renders(self): + # Every added language is selectable and renders a non-trivial sample that + # exercises keywords and carries a comment. + added = ["Racket", "Scheme", "Haskell", "OCaml", "Scala", "Kotlin", + "Swift", "Lua", "Ruby", "Perl", "R", "Erlang", "SQL", "PHP", + "Ada", "Fortran", "MATLAB", "Assembly"] + for lang in added: + self.assertIn(lang, generate.SAMPLES, f"{lang} not in the language selector") + tokens = self._tokens(lang) + cats = {k for k, _ in tokens} + self.assertGreater(len(tokens), 40, f"{lang} sample is too short") + self.assertIn("kw", cats, f"{lang} sample has no keywords") + self.assertIn("cmd", cats, f"{lang} sample has no comment") + class FacesHelper(unittest.TestCase): def test_strips_prefix_and_derives_label_and_merges_seed(self): @@ -192,27 +205,54 @@ class FacesHelper(unittest.TestCase): class FaceSpecDefaults(unittest.TestCase): def test_ui_face_spec_fills_style_fields(self): + # The legacy "bold" migrates to weight "bold" through face_spec. self.assertEqual(ui_face_spec({"bg": "#ffffff", "bold": True}), { "fg": None, "bg": "#ffffff", - "bold": True, - "italic": False, - "underline": False, - "strike": False, + "distant-fg": None, + "family": None, + "weight": "bold", + "slant": None, + "underline": None, + "strike": None, + "overline": None, "box": None, + "inverse": False, + "extend": False, + "inherit": None, + "height": None, }) + def test_ui_face_spec_carries_inherit_and_height(self): + # inherit/height are no longer package-only; a ui face can set them. + spec = ui_face_spec({"inherit": "shadow", "height": 1.3}) + self.assertEqual(spec["inherit"], "shadow") + self.assertEqual(spec["height"], 1.3) + + def test_face_spec_migrates_legacy_style_booleans(self): + spec = ui_face_spec({"italic": True, "underline": True, "strike": True}) + self.assertEqual(spec["slant"], "italic") + self.assertEqual(spec["underline"], {"style": "line", "color": None}) + self.assertEqual(spec["strike"], {"color": None}) + self.assertNotIn("bold", spec) + self.assertNotIn("italic", spec) + def test_package_face_spec_fills_structure_fields(self): self.assertEqual(package_face_spec({"inherit": "base", "height": 1.2}), { "fg": None, "bg": None, - "bold": False, - "italic": False, - "underline": False, - "strike": False, + "distant-fg": None, + "family": None, + "weight": None, + "slant": None, + "underline": None, + "strike": None, + "overline": None, + "box": None, + "inverse": False, + "extend": False, "inherit": "base", "height": 1.2, - "box": None, }) def test_generated_color_names_are_base_columns_when_legacy(self): @@ -240,6 +280,19 @@ class GeneratorStateHelpers(unittest.TestCase): self.assertTrue(uimap["link"]["underline"]) self.assertEqual(uimap["mode-line"]["box"], {"style": "released", "width": 1, "color": None}) + def test_mode_line_highlight_defaults_to_raised_box(self): + # The face is absent from the snapshot, so it must get the raised box in + # both the with-snapshot and no-snapshot branches. + raised = {"style": "released", "width": 1, "color": None} + self.assertEqual(generate.UIMAP["mode-line-highlight"]["box"], raised) + no_snapshot = generate.build_uimap(generate.UI_FACES, DefaultFaces(None)) + self.assertEqual(no_snapshot["mode-line-highlight"]["box"], raised) + + def test_hover_box_default_yields_to_existing_box(self): + uimap = {"mode-line-highlight": ui_face_spec({"box": {"style": "line", "width": 2, "color": "#abcdef"}})} + generate.apply_hover_box_default(uimap) + self.assertEqual(uimap["mode-line-highlight"]["box"], {"style": "line", "width": 2, "color": "#abcdef"}) + def test_build_syntax_uses_map_and_style_fallbacks_without_defaults_snapshot(self): syntax = generate.build_syntax( {"kw": [None, True]}, @@ -249,8 +302,8 @@ class GeneratorStateHelpers(unittest.TestCase): DefaultFaces(None), ) self.assertEqual(syntax["kw"]["fg"], "#d3d3d3") - self.assertTrue(syntax["kw"]["bold"]) - self.assertFalse(syntax["kw"]["italic"]) + self.assertEqual(syntax["kw"]["weight"], "bold") + self.assertIsNone(syntax["kw"]["slant"]) def test_builtin_fallback_styles_fill_known_emacs_styles(self): uimap = { @@ -262,12 +315,13 @@ class GeneratorStateHelpers(unittest.TestCase): ) } generate.apply_builtin_fallback_styles(uimap) - self.assertTrue(uimap["link"]["underline"]) - self.assertTrue(uimap["lazy-highlight"]["underline"]) - self.assertTrue(uimap["show-paren-match"]["underline"]) - self.assertTrue(uimap["error"]["bold"]) - self.assertTrue(uimap["warning"]["bold"]) - self.assertTrue(uimap["success"]["bold"]) + line_underline = {"style": "line", "color": None} + self.assertEqual(uimap["link"]["underline"], line_underline) + self.assertEqual(uimap["lazy-highlight"]["underline"], line_underline) + self.assertEqual(uimap["show-paren-match"]["underline"], line_underline) + self.assertEqual(uimap["error"]["weight"], "bold") + self.assertEqual(uimap["warning"]["weight"], "bold") + self.assertEqual(uimap["success"]["weight"], "bold") self.assertEqual(uimap["mode-line"]["box"], {"style": "released", "width": 1, "color": None}) self.assertEqual(uimap["mode-line-inactive"]["box"], {"style": "released", "width": 1, "color": None}) @@ -303,7 +357,7 @@ class GeneratorStateHelpers(unittest.TestCase): } }, syntax, color_map) self.assertEqual(syntax["kw"]["fg"], "#222222") - self.assertTrue(syntax["kw"]["bold"]) + self.assertEqual(syntax["kw"]["weight"], "bold") self.assertEqual(color_map["kw"], "#222222") self.assertNotIn("unknown", syntax) @@ -380,6 +434,16 @@ class DefaultFaceAdapter(unittest.TestCase): }, "effectiveGuiLight": {}, }, + "rich": { + "chosenGuiLight": { + "distantForeground": "black", + "distantForegroundHex": "#000000", + "overline": "t", + "inverseVideo": "t", + "extend": "t", + }, + "effectiveGuiLight": {}, + }, } }) @@ -387,13 +451,26 @@ class DefaultFaceAdapter(unittest.TestCase): self.assertEqual(self.defaults.seed("sample", effective=False), { "fg": "#333333", "bg": "#ffffff", - "bold": True, - "italic": True, - "underline": True, + "weight": "bold", + "slant": "italic", + "underline": {"style": "line", "color": None}, "inherit": "parent", "box": {"style": "released", "width": 2, "color": None}, }) + def test_seed_emits_the_additive_attrs_when_the_snapshot_has_them(self): + self.assertEqual(self.defaults.seed("rich", effective=False), { + "distant-fg": "#000000", + "overline": {"color": None}, + "inverse": True, + "extend": True, + }) + + def test_seed_omits_additive_attrs_when_the_snapshot_lacks_them(self): + seeded = self.defaults.seed("sample", effective=False) + for key in ("distant-fg", "overline", "inverse", "extend"): + self.assertNotIn(key, seeded) + def test_color_reads_effective_hex_by_default(self): self.assertEqual(self.defaults.color("sample"), "#000000") @@ -513,11 +590,11 @@ class GeneratedDefaults(unittest.TestCase): def test_syntax_defaults_capture_font_lock_styles(self): self.assertEqual(generate.MAP["kw"], "#d3d3d3") - self.assertTrue(generate.SYNTAX["kw"]["bold"]) - self.assertFalse(generate.SYNTAX["kw"]["italic"]) + self.assertEqual(generate.SYNTAX["kw"]["weight"], "bold") + self.assertIsNone(generate.SYNTAX["kw"]["slant"]) self.assertEqual(generate.MAP["str"], "#696969") - self.assertFalse(generate.SYNTAX["str"]["bold"]) - self.assertTrue(generate.SYNTAX["str"]["italic"]) + self.assertIsNone(generate.SYNTAX["str"]["weight"]) + self.assertEqual(generate.SYNTAX["str"]["slant"], "italic") if __name__ == "__main__": diff --git a/scripts/theme-studio/theme-studio.html b/scripts/theme-studio/theme-studio.html index 8b8a5f75c..4896a2387 100644 --- a/scripts/theme-studio/theme-studio.html +++ b/scripts/theme-studio/theme-studio.html @@ -6,8 +6,8 @@ .wrap{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:14px;padding-bottom:10px} .col{flex:0 0 auto;width:460px} pre{background:#0d0b0a;border:1px solid #252321;border-radius:8px;padding:14px 16px;font-size:12pt;overflow:auto;white-space:pre} - table.leg{border-collapse:collapse} table.leg td{padding:4px 12px;vertical-align:middle} - table.leg th{cursor:pointer;color:#b4b1a2;text-align:left;padding:4px 12px;user-select:none;font-weight:normal} + table.leg{border-collapse:collapse} table.leg td{padding:4px 8px;vertical-align:middle} + table.leg th{cursor:pointer;color:#b4b1a2;text-align:left;padding:4px 8px;user-select:none;font-weight:normal} #legtable th:nth-child(3),#legtable th:nth-child(4), #legtable td:nth-child(3),#legtable td:nth-child(4), #uitable th:nth-child(3),#uitable th:nth-child(4), @@ -21,8 +21,18 @@ .boxbtn{width:17px;height:15px;padding:0;border:1px solid #3a3a3a;border-radius:3px;background:#1f1c19;color:#cdced1;font:11px monospace;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center} .boxbtn.on{background:#3a3320;border-color:#e8bd30;color:#e8bd30} .boxbtn:disabled{opacity:.3;cursor:default} - .stylecluster{display:grid;grid-template-columns:repeat(2,1fr);gap:2px;width:max-content} - .stylecluster .sbtn{margin:0} + .stylecluster{display:flex;flex-wrap:wrap;align-items:center;gap:4px;width:max-content;max-width:210px} + .exptoggle{width:18px;height:18px;padding:0;border:1px solid #3a3a3a;border-radius:3px;background:#1f1c19;color:#8a9496;font:12px monospace;line-height:1;cursor:pointer;vertical-align:middle} + .exptoggle.on{background:#3a3320;border-color:#e8bd30;color:#e8bd30} + .exptoggle.exp-nd{border-color:#e8bd30;color:#e8bd30} + .exptoggle:disabled{opacity:.3;cursor:default} + tr.detailrow>td{background:#15120f;border-top:1px solid #2a2a2a;padding:8px 14px} + .detailedit{display:flex;flex-wrap:wrap;align-items:center;gap:14px} + .detailfield{display:flex;align-items:center;gap:5px;font:11px monospace;color:#b4b1a2} + .detailfield>span{white-space:nowrap} + input.detailinput{width:120px;padding:3px 5px;font:11px monospace;background:#1f1c19;color:#cdced1;border:1px solid #3a3a3a;border-radius:4px} + select.detailsel{width:130px;font:10pt monospace} + input.detailcheck{width:15px;height:15px;cursor:pointer} table.leg th:hover{color:#e8bd30} select.chip{appearance:none;border:1px solid #00000060;border-radius:5px;padding:5px 10px;font:bold 14px monospace;width:160px;cursor:pointer} /* Prev/next arrows flanking the view dropdown: step the selection without reopening it. @@ -43,6 +53,14 @@ .cdd.compact.is-default{border-color:#8f7810;box-shadow:inset 0 0 0 1px #8f7810} .cddsw{display:inline-block;width:13px;height:13px;border-radius:3px;border:1px solid #0007;flex:none} .cdd.compact .cddsw{width:18px;height:18px} + .cdd.enumdd{width:auto;min-width:60px;max-width:96px;justify-content:center;background:#161412;color:#cdced1;font:13px monospace;padding:5px 8px} + .cdd.enumdd.is-default{color:#8a8a82} + .cdd.enumdd.locked{cursor:default;opacity:.85;box-shadow:inset 0 0 0 2px #e8bd3088} + .enumpop{display:flex;flex-direction:column;gap:2px;min-width:96px} + .enumopt{text-align:left;font:13px monospace;color:#cdced1;background:#161412;border:1px solid #3a3a3a;border-radius:4px;padding:4px 10px;cursor:pointer} + .enumopt:hover{background:#252321} + .enumopt.sel{outline:1px solid #e8bd30;outline-offset:1px} + .enumdef{color:#9a9a92} .cddpop{position:fixed;z-index:200;background:#161412;border:1px solid #3a3a3a;border-radius:6px;box-shadow:0 12px 34px #000c;max-height:70vh;overflow:auto;padding:8px} .cddghead{display:flex;align-items:center;gap:8px;margin-bottom:7px} .cddgdef{font:bold 11px monospace;color:#cdced1;background:#161412;border:1px solid #3a3a3a;border-radius:4px;padding:3px 10px;cursor:pointer} @@ -61,7 +79,6 @@ .boxctl .cstepbtn{width:18px} .legctl{margin:0 0 8px;display:flex;gap:8px;align-items:center} .cat{color:#b4b1a2} .ex{font-size:17px} - .crerr{display:inline-block;margin-left:8px;padding:0 4px;border-radius:3px;background:#2b130e;color:#cb6b4d;border:1px solid #7b3324;font:9pt monospace;vertical-align:middle} .paltoggle{align-self:flex-start;width:22px;height:22px;padding:0;border:1px solid #3a3a3a;border-radius:4px;background:#1f1c19;color:#e8bd30;font:12px monospace;line-height:1;cursor:pointer;margin-right:6px} /* Barber-pole flag: a ring of two alternating contrasting colors, drawn with a masked repeating gradient so it overlays without shifting layout. Distinct @@ -231,11 +248,11 @@ <div id="view-code" class="viewblock"> <div class="cols"> <section class="pane"> - <div class="legctl"><button id="syntaxlocktoggle" class="fbtn" onclick="toggleAllLocks('syntax')" title="lock or unlock every syntax row">lock all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlocked()" title="erase, preserving locked rows">erase</button></div> - <table class="leg" id="legtable"><thead><tr><th onclick="srtTable('legbody',0)">elements △</th><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',2)">fg △</th><th onclick="srtTable('legbody',3)">bg △</th><th>style</th><th title="face :box (border)">box</th><th title="WCAG contrast of this color on the background">contrast</th><th>example</th></tr></thead><tbody id="legbody"></tbody></table> + <div class="legctl"><button id="syntaxlocktoggle" class="fbtn" onclick="toggleAllLocks('syntax')" title="lock or unlock every syntax row">lock all</button><button id="syntaxexpandall" class="fbtn" onclick="toggleAllExpanded('syntaxexpandall')" title="expand or collapse every row's detail">▶ expand all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlocked()" title="erase, preserving locked rows">erase</button></div> + <table class="leg" id="legtable"><thead><tr><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',1)">elements △</th><th onclick="srtTable('legbody',2)">fg △</th><th onclick="srtTable('legbody',3)">bg △</th><th>style</th><th title="face :box (border)">box</th><th title="WCAG contrast of this color on the background">contrast</th><th>example</th></tr></thead><tbody id="legbody"></tbody></table> </section> <section class="pane grow"> - <div class="langbar"><label style="color:#b4b1a2">language</label><select id="langsel" class="chip" style="width:auto;font:bold 10pt monospace" onchange="renderCode();buildPkgPreview()"></select></div> + <div class="langbar"><label style="color:#b4b1a2">language</label><button id="langprev" class="viewnav" title="previous in the list" onclick="stepLang(-1)">‹</button><select id="langsel" class="chip" style="width:auto;font:bold 10pt monospace" onchange="renderCode();buildPkgPreview()"></select><button id="langnext" class="viewnav" title="next in the list" onclick="stepLang(1)">›</button></div> <pre id="codepre"></pre> </section> </div> @@ -243,8 +260,8 @@ <div id="view-ui" class="viewblock" style="display:none"> <div class="cols stretch"> <section class="pane"> - <div class="legctl"><button id="uilocktoggle" class="fbtn" onclick="toggleAllLocks('ui')" title="lock or unlock every UI face row">lock all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlockedUI()" title="erase, preserving locked rows">erase</button></div> - <table class="leg" id="uitable"><thead><tr><th onclick="srtTable('uibody',0)">face △</th><th title="lock a decided face"></th><th onclick="srtTable('uibody',2)" title="foreground">fg △</th><th onclick="srtTable('uibody',3)" title="background">bg △</th><th>style</th><th onclick="srtTable('uibody',5)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast △</th><th>preview</th><th title="face :box (border)">box</th></tr></thead><tbody id="uibody"></tbody></table> + <div class="legctl"><button id="uilocktoggle" class="fbtn" onclick="toggleAllLocks('ui')" title="lock or unlock every UI face row">lock all</button><button id="uiexpandall" class="fbtn" onclick="toggleAllExpanded('uiexpandall')" title="expand or collapse every row's detail">▶ expand all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlockedUI()" title="erase, preserving locked rows">erase</button></div> + <table class="leg" id="uitable"><thead><tr><th title="lock a decided face"></th><th onclick="srtTable('uibody',1)">face △</th><th onclick="srtTable('uibody',2)" title="foreground">fg △</th><th onclick="srtTable('uibody',3)" title="background">bg △</th><th>style</th><th title="face :box (border)">box</th><th onclick="srtTable('uibody',6)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast △</th><th>preview</th></tr></thead><tbody id="uibody"></tbody></table> </section> <section class="pane grow" style="display:flex;flex-direction:column"> <div class="langbar"><label style="color:#b4b1a2">live buffer preview</label></div> @@ -256,12 +273,12 @@ <div class="pkgbar"> <label style="color:#b4b1a2">filter</label><input id="pkgfilter" type="text" placeholder="face name" oninput="buildPkgTable()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:160px"> <button onclick="resetApp()" title="reset to captured defaults, preserving locked rows">↻ reset</button> - <button id="pkglocktoggle" class="fbtn" onclick="toggleAllLocks('pkg')" title="lock or unlock every face row in the current package">lock all</button> + <button id="pkglocktoggle" class="fbtn" onclick="toggleAllLocks('pkg')" title="lock or unlock every face row in the current package">lock all</button><button id="pkgexpandall" class="fbtn" onclick="toggleAllExpanded('pkgexpandall')" title="expand or collapse every row's detail">▶ expand all</button> <button class="fbtn" onclick="clearUnlockedPkg()" title="erase, preserving locked rows">erase</button> </div> <div class="cols stretch"> <section class="pane"> - <table class="leg" id="pkgtable"><thead><tr><th onclick="srtTable('pkgbody',0)">face △</th><th title="lock a decided face"></th><th onclick="srtTable('pkgbody',2)">fg △</th><th onclick="srtTable('pkgbody',3)">bg △</th><th>style</th><th onclick="srtTable('pkgbody',5)">contrast △</th><th onclick="srtTable('pkgbody',6)">inherit △</th><th onclick="srtTable('pkgbody',7)">size △</th><th title="face :box (border)">box</th></tr></thead><tbody id="pkgbody"></tbody></table> + <table class="leg" id="pkgtable"><thead><tr><th title="lock a decided face"></th><th onclick="srtTable('pkgbody',1)">face △</th><th onclick="srtTable('pkgbody',2)">fg △</th><th onclick="srtTable('pkgbody',3)">bg △</th><th>style</th><th title="face :box (border)">box</th><th onclick="srtTable('pkgbody',6)">contrast △</th></tr></thead><tbody id="pkgbody"></tbody></table> </section> <section class="pane grow" style="display:flex;flex-direction:column"> <div class="langbar"><label id="pkgprevlabel" style="color:#b4b1a2">preview</label></div> @@ -270,13 +287,14 @@ </div> </div> <script> -const SAMPLES={"Elisp": [[["cmd", ";;"], ["cm", " cache.el"]], [["punc", "("], ["kw", "require"], ["p", " "], ["con", "'cl-lib"], ["punc", ")"]], [], [["punc", "("], ["kw", "defvar"], ["p", " "], ["var", "cache--tbl"], ["p", " "], ["punc", "("], ["fnc", "make-hash-table"], ["p", " "], ["con", ":test"], ["p", " "], ["con", "'equal"], ["punc", "))"]], [["p", " "], ["doc", "\"Memo table.\")"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-get"], ["p", " "], ["punc", "("], ["var", "key"], ["punc", ")"]], [["p", " "], ["doc", "\"Return cached value for KEY.\""]], [["p", " "], ["punc", "("], ["kw", "or"], ["p", " "], ["punc", "("], ["bi", "gethash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "v"], ["p", " "], ["punc", "("], ["fnc", "compute"], ["p", " "], ["var", "key"], ["p", " "], ["num", "42"], ["punc", "))) "]], [["p", " "], ["punc", "("], ["fnc", "puthash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "v"], ["p", " "], ["var", "cache--tbl"], ["punc", ") "], ["var", "v"], ["punc", "))))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-clear"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Empty the memo table.\""]], [["p", " "], ["punc", "("], ["kw", "interactive"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "clrhash"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "message"], ["p", " "], ["str", "\"cleared"], ["esc", "\\n"], ["str", "\""], ["punc", "))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-keys"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Return all keys.\""]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "acc"], ["p", " "], ["con", "nil"], ["punc", "))"]], [["p", " "], ["punc", "("], ["fnc", "maphash"], ["p", " "], ["punc", "("], ["kw", "lambda"], ["p", " "], ["punc", "("], ["var", "k"], ["p", " "], ["var", "_v"], ["punc", ")"], ["p", " "], ["punc", "("], ["fnc", "push"], ["p", " "], ["var", "k"], ["p", " "], ["var", "acc"], ["punc", "))"]], [["p", " "], ["var", "cache--tbl"], ["punc", ")"], ["p", " "], ["var", "acc"], ["punc", "))"]], [], [["punc", "("], ["kw", "provide"], ["p", " "], ["con", "'cache"], ["punc", ")"]]], "Go": [[["cmd", "//"], ["cm", " queue.go"]], [["kw", "package"], ["p", " "], ["var", "main"]], [], [["kw", "import"], ["p", " "], ["str", "\"fmt\""]], [], [["kw", "const"], ["p", " "], ["con", "MaxItems"], ["p", " "], ["op", "="], ["p", " "], ["num", "100"]], [], [["kw", "type"], ["p", " "], ["ty", "Order"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "ID"], ["p", " "], ["ty", "int"]], [["p", " "], ["prop", "Name"], ["p", " "], ["ty", "string"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["punc", "("], ["var", "q"], ["p", " "], ["op", "*"], ["ty", "Queue"], ["punc", ")"], ["p", " "], ["fnd", "Push"], ["punc", "("], ["var", "o"], ["p", " "], ["op", "*"], ["ty", "Order"], ["punc", ")"], ["p", " "], ["ty", "error"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " reject nil"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "nil"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["p", " "], ["fnc", "fmt.Errorf"], ["punc", "("], ["str", "\"nil"], ["esc", "\\n"], ["str", "\""], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["p", " "], ["var", "q"], ["op", "."], ["prop", "items"], ["p", " "], ["op", "="], ["p", " "], ["bi", "append"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "items"], ["punc", ","], ["p", " "], ["var", "o"], ["punc", ")"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "nil"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["fnc", "fmt.Println"], ["punc", "("], ["op", "&"], ["ty", "Queue"], ["punc", "{}"], ["punc", ")"]], [["punc", "}"]]], "Python": [[["cmd", "#"], ["cm", " theme.py"]], [["kw", "from"], ["p", " "], ["var", "dataclasses"], ["p", " "], ["kw", "import"], ["p", " "], ["var", "dataclass"], ["punc", ","], ["p", " "], ["var", "field"]], [], [["con", "DEFAULT_PORT"], ["op", ":"], ["p", " "], ["ty", "int"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"]], [["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["var", "re"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "r\"#[0-9a-f]{6}\""], ["punc", ")"]], [], [["dec", "@dataclass"]], [["kw", "class"], ["p", " "], ["ty", "Theme"], ["op", ":"]], [["p", " "], ["doc", "\"\"\"A color theme.\"\"\""]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "dict"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "field"], ["punc", "("], ["prop", "default_factory"], ["op", "="], ["ty", "dict"], ["punc", ")"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "|"], ["p", " "], ["con", "None"], ["op", ":"]], [["p", " "], ["cmd", "#"], ["cm", " fallback to none"]], [["p", " "], ["var", "v"], ["p", " "], ["op", "="], ["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "get"], ["punc", "("], ["var", "key"], ["punc", ","], ["p", " "], ["str", "\""], ["esc", "\\t"], ["str", "none\""], ["punc", ")"]], [["p", " "], ["kw", "if"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "v"], ["punc", ")"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"], ["op", ":"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "v"]], [], [["p", " "], ["dec", "@property"]], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "size"], ["punc", "("], ["var", "self"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "int"], ["op", ":"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "self"], ["op", "."], ["prop", "colors"], ["punc", ")"]], [], [["var", "theme"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["punc", "("], ["str", "\"dupre\""], ["punc", ")"]], [["fnc", "print"], ["punc", "("], ["var", "theme"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"]]], "TypeScript": [[["cmd", "//"], ["cm", " orders.ts"]], [["kw", "import"], ["p", " "], ["punc", "{"], ["p", " "], ["ty", "Order"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "from"], ["p", " "], ["str", "\"./types\""]], [], [["kw", "export"], ["p", " "], ["kw", "interface"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "max"], ["op", ":"], ["p", " "], ["ty", "number"], ["punc", ";"]], [["p", " "], ["prop", "items"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", "[];"]], [["punc", "}"]], [], [["dec", "@Injectable"], ["punc", "()"]], [["kw", "export"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "OrderQueue"], ["p", " "], ["kw", "implements"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["prop", "re"], ["p", " "], ["op", "="], ["p", " "], ["re", "/^#[0-9a-f]{6}$/i"], ["punc", ";"]], [], [["p", " "], ["fnd", "push"], ["punc", "("], ["var", "o"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "boolean"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "==="], ["p", " "], ["con", "null"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "false"], ["punc", ";"]], [["p", " "], ["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["str", "`id "], ["punc", "${"], ["var", "o"], ["op", "."], ["prop", "id"], ["punc", "}"], ["esc", "\\n"], ["str", "`"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "true"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "const"], ["p", " "], ["con", "LIMIT"], ["op", ":"], ["p", " "], ["ty", "number"], ["p", " "], ["op", "="], ["p", " "], ["num", "50"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "q"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "OrderQueue"], ["punc", "()"], ["punc", ";"]], [["var", "q"], ["op", "."], ["fnd", "push"], ["punc", "("], ["punc", "{"], ["p", " "], ["prop", "id"], ["op", ":"], ["p", " "], ["num", "1"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "as"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["punc", ";"]], [["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "max"], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "cap"], ["p", " "], ["op", "="], ["p", " "], ["var", "Math"], ["op", "."], ["bi", "max"], ["punc", "("], ["con", "LIMIT"], ["punc", ","], ["p", " "], ["num", "0"], ["punc", ")"], ["punc", ";"]]], "Java": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["kw", "package"], ["p", " "], ["var", "com"], ["op", "."], ["var", "dupre"], ["punc", ";"]], [["kw", "import"], ["p", " "], ["var", "java"], ["op", "."], ["var", "util"], ["op", "."], ["var", "regex"], ["op", "."], ["ty", "Pattern"], ["punc", ";"]], [], [["dec", "@Deprecated"]], [["kw", "public"], ["p", " "], ["kw", "final"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "String"], ["p", " "], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "Pattern"], ["p", " "], ["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Pattern"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "\"#[0-9a-f]{6}\""], ["punc", ")"], ["punc", ";"]], [], [["p", " "], ["dec", "@Override"]], [["p", " "], ["kw", "public"], ["p", " "], ["ty", "String"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["ty", "String"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " fall back to null"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "isEmpty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "null"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "strip"], ["punc", "("], ["punc", ")"], ["op", "+"], ["str", "\""], ["esc", "\\t"], ["str", "\""], ["punc", ";"]], [["p", " "], ["punc", "}"]], [], [["p", " "], ["kw", "public"], ["p", " "], ["kw", "static"], ["p", " "], ["ty", "void"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "String"], ["punc", "[]"], ["p", " "], ["var", "args"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "var"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "Theme"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["ty", "System"], ["op", "."], ["prop", "out"], ["op", "."], ["fnc", "println"], ["punc", "("], ["var", "t"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]]], "C": [[["cmd", "/**"], ["doc", " Order queue. */"]], [["pp", "#include"], ["p", " "], ["str", "<stdio.h>"]], [["pp", "#include"], ["p", " "], ["str", "<stdlib.h>"]], [["pp", "#define"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["num", "8080"]], [], [["kw", "typedef"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "int"], ["p", " "], ["prop", "id"], ["punc", ";"]], [["p", " "], ["kw", "const"], ["p", " "], ["ty", "char"], ["p", " "], ["op", "*"], ["prop", "name"], ["punc", ";"]], [["punc", "}"], ["p", " "], ["ty", "Order"], ["punc", ";"]], [], [["cmd", "//"], ["cm", " returns -1 on null input"]], [["ty", "int"], ["p", " "], ["fnd", "push"], ["punc", "("], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "o"], ["punc", ")"], ["p", " "], ["dec", "__attribute__"], ["punc", "(("], ["dec", "nonnull"], ["punc", "))"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "NULL"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["num", "-1"], ["punc", ";"]], [["p", " "], ["fnc", "printf"], ["punc", "("], ["str", "\"id=%d"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "o"], ["op", "->"], ["prop", "id"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "void"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "Order"], ["p", " "], ["var", "o"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"], ["p", " "], ["op", "."], ["prop", "id"], ["p", " "], ["op", "="], ["p", " "], ["num", "1"], ["punc", ","], ["p", " "], ["op", "."], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "p2"], ["p", " "], ["op", "="], ["p", " "], ["bi", "malloc"], ["punc", "("], ["bi", "sizeof"], ["punc", "("], ["ty", "Order"], ["punc", "))"], ["punc", ";"]], [["p", " "], ["fnc", "push"], ["punc", "("], ["op", "&"], ["var", "o"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["bi", "free"], ["punc", "("], ["var", "p2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "C++": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["pp", "#include"], ["p", " "], ["str", "<string>"]], [["pp", "#include"], ["p", " "], ["str", "<regex>"]], [["pp", "#pragma"], ["p", " "], ["pp", "once"]], [], [["kw", "namespace"], ["p", " "], ["var", "dupre"], ["p", " "], ["punc", "{"]], [], [["kw", "template"], ["op", "<"], ["kw", "typename"], ["p", " "], ["ty", "T"], ["op", ">"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["kw", "public"], ["op", ":"]], [["p", " "], ["kw", "static"], ["p", " "], ["kw", "constexpr"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX"], ["p", " "], ["op", "="], ["p", " "], ["num", "0x20"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["p", " "], ["prop", "name_"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [], [["p", " "], ["dec", "[[nodiscard]]"], ["p", " "], ["ty", "T"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["kw", "const"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["op", "&"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["kw", "const"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " validate against a hex pattern"]], [["p", " "], ["kw", "static"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "regex"], ["p", " "], ["var", "re"], ["punc", "("], ["re", "R\"(#[0-9a-f]{6})\""], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "empty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "nullptr"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["ty", "T"], ["punc", "{"], ["var", "key"], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "auto"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "{}"], ["punc", ";"]], [["p", " "], ["bi", "static_cast"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "("], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "size"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["fnc", "printf"], ["punc", "("], ["str", "\"%s"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "c_str"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "Rust": [[["cmd", "//"], ["cm", " theme.rs"]], [["dec", "#![allow(dead_code)]"]], [["kw", "use"], ["p", " "], ["var", "std"], ["op", "::"], ["var", "fmt"], ["punc", ";"]], [], [["dec", "#[derive"], ["punc", "("], ["dec", "Debug"], ["punc", ","], ["p", " "], ["dec", "Clone"], ["punc", ")]"]], [["kw", "pub"], ["p", " "], ["kw", "trait"], ["p", " "], ["ty", "Theme"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["con", "NAME"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'static"], ["p", " "], ["ty", "str"], ["punc", ";"]], [["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Option"], ["op", "<"], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["op", ">"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "pub"], ["p", " "], ["kw", "struct"], ["p", " "], ["ty", "Palette"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "pub"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ","]], [["p", " "], ["kw", "pub"], ["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "Vec"], ["op", "<"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ","], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["op", ">"], ["punc", ","]], [["punc", "}"]], [], [["kw", "impl"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["ty", "Theme"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["kw", "for"], ["p", " "], ["ty", "Palette"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["con", "NAME"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'static"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Option"], ["op", "<"], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "is_empty"], ["punc", "()"], ["p", " "], ["punc", "{"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"], ["punc", ";"], ["p", " "], ["punc", "}"]], [["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "iter"], ["punc", "()"], ["op", "."], ["fnc", "find"], ["punc", "("], ["op", "|"], ["punc", "("], ["var", "k"], ["punc", ","], ["p", " "], ["var", "_"], ["punc", ")"], ["op", "|"], ["p", " "], ["op", "*"], ["var", "k"], ["p", " "], ["op", "=="], ["p", " "], ["var", "key"], ["punc", ")"], ["op", "."], ["fnc", "map"], ["punc", "("], ["op", "|"], ["punc", "("], ["var", "_"], ["punc", ","], ["p", " "], ["var", "v"], ["punc", ")"], ["op", "|"], ["p", " "], ["op", "*"], ["var", "v"], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "fn"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "let"], ["p", " "], ["var", "palette"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Palette"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["str", "\"dupre\""], ["punc", ","], ["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["bi", "vec!"], ["punc", "["], ["punc", "("], ["str", "\"bg\""], ["punc", ","], ["p", " "], ["str", "\"#0d0b0a\""], ["punc", ")"], ["punc", "]"], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["bi", "println!"], ["punc", "("], ["str", "\"{:?}\""], ["punc", ","], ["p", " "], ["var", "palette"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["punc", "}"]]], "Zig": [[["cmd", "//"], ["cm", " theme.zig"]], [["kw", "const"], ["p", " "], ["var", "std"], ["p", " "], ["op", "="], ["p", " "], ["bi", "@import"], ["punc", "("], ["str", "\"std\""], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["ty", "Allocator"], ["p", " "], ["op", "="], ["p", " "], ["var", "std"], ["op", "."], ["var", "mem"], ["op", "."], ["ty", "Allocator"], ["punc", ";"]], [], [["kw", "pub"], ["p", " "], ["kw", "const"], ["p", " "], ["ty", "Theme"], ["p", " "], ["op", "="], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ","]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "Color"], ["punc", ","]], [], [["p", " "], ["kw", "pub"], ["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "init"], ["punc", "("], ["var", "alloc"], ["op", ":"], ["p", " "], ["op", "*"], ["ty", "Allocator"], ["punc", ")"], ["p", " "], ["op", "!"], ["bi", "@This"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["var", "colors"], ["p", " "], ["op", "="], ["p", " "], ["kw", "try"], ["p", " "], ["var", "alloc"], ["op", "."], ["fnc", "alloc"], ["punc", "("], ["ty", "Color"], ["punc", ","], ["p", " "], ["num", "2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["var", "colors"], ["punc", "["], ["num", "0"], ["punc", "]"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Color"], ["punc", "{"], ["p", " "], ["prop", ".name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"bg\""], ["punc", ","], ["p", " "], ["prop", ".hex"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"#0d0b0a\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "@This"], ["punc", "()"], ["punc", "{"], ["p", " "], ["prop", ".name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ","], ["p", " "], ["prop", ".colors"], ["p", " "], ["op", "="], ["p", " "], ["var", "colors"], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["kw", "const"], ["p", " "], ["ty", "Color"], ["p", " "], ["op", "="], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ","], ["p", " "], ["prop", "hex"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["p", " "], ["punc", "}"], ["punc", ";"]], [], [["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "theme"], ["op", ":"], ["p", " "], ["ty", "Theme"], ["punc", ","], ["p", " "], ["kw", "comptime"], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", ":"], ["num", "0"], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ")"], ["p", " "], ["op", "!"], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "inline"], ["p", " "], ["kw", "for"], ["p", " "], ["punc", "("], ["var", "theme"], ["op", "."], ["prop", "colors"], ["punc", ")"], ["p", " "], ["op", "|"], ["var", "color"], ["op", "|"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "std"], ["op", "."], ["var", "mem"], ["op", "."], ["fnc", "eql"], ["punc", "("], ["ty", "u8"], ["punc", ","], ["p", " "], ["var", "color"], ["op", "."], ["prop", "name"], ["punc", ","], ["p", " "], ["var", "key"], ["punc", ")"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["var", "color"], ["op", "."], ["prop", "hex"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "error.MissingColor"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "test"], ["p", " "], ["str", "\"resolve bg\""], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "var"], ["p", " "], ["var", "arena"], ["p", " "], ["op", "="], ["p", " "], ["var", "std"], ["op", "."], ["var", "heap"], ["op", "."], ["ty", "ArenaAllocator"], ["op", "."], ["fnc", "init"], ["punc", "("], ["var", "std"], ["op", "."], ["var", "testing"], ["op", "."], ["prop", "allocator"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "defer"], ["p", " "], ["var", "arena"], ["op", "."], ["fnc", "deinit"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["kw", "try"], ["p", " "], ["var", "std"], ["op", "."], ["var", "testing"], ["op", "."], ["fnc", "expectEqualStrings"], ["punc", "("], ["str", "\"#0d0b0a\""], ["punc", ","], ["p", " "], ["kw", "try"], ["p", " "], ["fnc", "resolve"], ["punc", "("], ["kw", "try"], ["p", " "], ["ty", "Theme"], ["op", "."], ["fnc", "init"], ["punc", "("], ["op", "&"], ["var", "arena"], ["op", "."], ["prop", "allocator"], ["punc", ")"], ["punc", ","], ["p", " "], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["punc", "}"]]], "Shell": [[["cmd", "#!"], ["cm", "/bin/bash"]], [["cmd", "#"], ["cm", " deploy.sh"]], [["bi", "set"], ["p", " "], ["op", "-"], ["var", "euo"], ["p", " "], ["var", "pipefail"]], [], [["var", "PORT"], ["op", "="], ["num", "8080"]], [["var", "NAME"], ["op", "="], ["str", "\"dupre\""]], [], [["fnd", "deploy"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "local"], ["p", " "], ["var", "target"], ["op", "="], ["str", "\"$1\""]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "[["], ["p", " "], ["op", "-z"], ["p", " "], ["str", "\"$target\""], ["p", " "], ["punc", "]]"], ["punc", ";"], ["p", " "], ["kw", "then"]], [["p", " "], ["bi", "echo"], ["p", " "], ["str", "\"no target\""]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "fi"]], [["p", " "], ["fnc", "rsync"], ["p", " "], ["op", "-az"], ["p", " "], ["str", "\"$NAME\""], ["p", " "], ["str", "\"$target\""]], [["punc", "}"]], [], [["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "for"], ["p", " "], ["var", "host"], ["p", " "], ["kw", "in"], ["p", " "], ["str", "\"$@\""], ["punc", ";"], ["p", " "], ["kw", "do"]], [["p", " "], ["fnc", "deploy"], ["p", " "], ["str", "\"$host\""], ["p", " "], ["op", "||"], ["p", " "], ["bi", "exit"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "done"]], [["p", " "], ["bi", "echo"], ["p", " "], ["op", "-e"], ["p", " "], ["str", "\"all done"], ["esc", "\\n"], ["str", "\""]], [["punc", "}"]], [], [["fnc", "main"], ["p", " "], ["str", "\"$@\""]]]}, CATS=[["bg", "bg (ground)", "Aa Bb 123"], ["p", "fg", "other / whitespace"], ["kw", "keyword", "class def if return"], ["bi", "builtin", "len echo printf"], ["pp", "preprocessor", "#include #define"], ["fnd", "function \u00b7 def", "resolve push"], ["fnc", "function \u00b7 call", "printf rsync get"], ["dec", "decorator \u2192 type", "@dataclass"], ["ty", "type / class", "int str Order Queue"], ["prop", "property / field", "id name items"], ["con", "constant", "None nil NULL true"], ["num", "number", "8080 100 -1"], ["str", "string", "\"dupre\" \"fmt\""], ["esc", "escape", "\\n \\t"], ["re", "regexp", "/^#[0-9a-f]+/"], ["doc", "docstring", "\"\"\"...\"\"\""], ["cm", "comment", "# reject nil"], ["cmd", "comment delim", "# // ;;"], ["var", "variable / use", "value key self"], ["op", "operator", ": = -> =="], ["punc", "punctuation", "{ } ( ) ;"]], UI_FACES=[["cursor", "cursor", "Aa|"], ["region", "region (selection)", "selected text"], ["hl-line", "hl-line (current line)", "current line"], ["highlight", "highlight", "hover"], ["mode-line", "mode-line", "status active"], ["mode-line-inactive", "mode-line-inactive", "status idle"], ["fringe", "fringe", "| |"], ["line-number", "line-number", " 42"], ["line-number-current-line", "line-number-current-line", "> 42"], ["minibuffer-prompt", "minibuffer-prompt", "M-x "], ["isearch", "isearch (match)", "match"], ["lazy-highlight", "lazy-highlight", "other match"], ["isearch-fail", "isearch-fail", "no match"], ["show-paren-match", "show-paren-match", "( )"], ["show-paren-mismatch", "show-paren-mismatch", ") ("], ["link", "link", "https://"], ["error", "error", "error!"], ["warning", "warning", "warning"], ["success", "success", "ok"], ["vertical-border", "vertical-border", "|"]], APPS={"org-mode": {"label": "org-mode", "preview": "org", "faces": [["org-document-title", "document title", {}], ["org-document-info", "document info", {}], ["org-document-info-keyword", "document info keyword", {}], ["org-level-1", "level 1", {}], ["org-level-2", "level 2", {}], ["org-level-3", "level 3", {}], ["org-level-4", "level 4", {}], ["org-level-5", "level 5", {}], ["org-level-6", "level 6", {}], ["org-level-7", "level 7", {}], ["org-level-8", "level 8", {}], ["org-headline-todo", "headline todo", {}], ["org-headline-done", "headline done", {}], ["org-todo", "todo", {}], ["org-done", "done", {}], ["org-priority", "priority", {}], ["org-tag", "tag", {}], ["org-tag-group", "tag group", {}], ["org-special-keyword", "special keyword", {}], ["org-drawer", "drawer", {}], ["org-property-value", "property value", {}], ["org-checkbox", "checkbox", {}], ["org-checkbox-statistics-todo", "checkbox statistics todo", {}], ["org-checkbox-statistics-done", "checkbox statistics done", {}], ["org-warning", "warning", {}], ["org-link", "link", {}], ["org-footnote", "footnote", {}], ["org-date", "date", {}], ["org-sexp-date", "sexp date", {}], ["org-date-selected", "date selected", {}], ["org-target", "target", {}], ["org-macro", "macro", {}], ["org-cite", "cite", {}], ["org-cite-key", "cite key", {}], ["org-block", "block", {}], ["org-block-begin-line", "block begin line", {}], ["org-block-end-line", "block end line", {}], ["org-code", "code", {}], ["org-verbatim", "verbatim", {}], ["org-inline-src-block", "inline src block", {}], ["org-quote", "quote", {}], ["org-verse", "verse", {}], ["org-latex-and-related", "latex and related", {}], ["org-table", "table", {}], ["org-table-header", "table header", {}], ["org-table-row", "table row", {}], ["org-formula", "formula", {}], ["org-column", "column", {}], ["org-column-title", "column title", {}], ["org-list-dt", "list dt", {}], ["org-meta-line", "meta line", {}], ["org-ellipsis", "ellipsis", {}], ["org-hide", "hide", {}], ["org-indent", "indent", {}], ["org-archived", "archived", {}], ["org-default", "default", {}], ["org-dispatcher-highlight", "dispatcher highlight", {}], ["org-agenda-structure", "agenda structure", {}], ["org-agenda-structure-secondary", "agenda structure secondary", {}], ["org-agenda-structure-filter", "agenda structure filter", {}], ["org-agenda-date", "agenda date", {}], ["org-agenda-date-today", "agenda date today", {}], ["org-agenda-date-weekend", "agenda date weekend", {}], ["org-agenda-date-weekend-today", "agenda date weekend today", {}], ["org-agenda-current-time", "agenda current time", {}], ["org-agenda-done", "agenda done", {}], ["org-agenda-dimmed-todo-face", "agenda dimmed todo", {}], ["org-agenda-calendar-event", "agenda calendar event", {}], ["org-agenda-calendar-sexp", "agenda calendar sexp", {}], ["org-agenda-calendar-daterange", "agenda calendar daterange", {}], ["org-agenda-diary", "agenda diary", {}], ["org-agenda-clocking", "agenda clocking", {}], ["org-agenda-column-dateline", "agenda column dateline", {}], ["org-agenda-restriction-lock", "agenda restriction lock", {}], ["org-agenda-filter-category", "agenda filter category", {}], ["org-agenda-filter-effort", "agenda filter effort", {}], ["org-agenda-filter-regexp", "agenda filter regexp", {}], ["org-agenda-filter-tags", "agenda filter tags", {}], ["org-scheduled", "scheduled", {}], ["org-scheduled-today", "scheduled today", {}], ["org-scheduled-previously", "scheduled previously", {}], ["org-upcoming-deadline", "upcoming deadline", {}], ["org-upcoming-distant-deadline", "upcoming distant deadline", {}], ["org-imminent-deadline", "imminent deadline", {}], ["org-time-grid", "time grid", {}], ["org-clock-overlay", "clock overlay", {}], ["org-mode-line-clock", "mode line clock", {}], ["org-mode-line-clock-overrun", "mode line clock overrun", {}]]}, "magit": {"label": "magit", "preview": "magit", "faces": [["magit-section-heading", "section heading", {}], ["magit-section-secondary-heading", "section secondary heading", {}], ["magit-section-heading-selection", "section heading selection", {}], ["magit-section-highlight", "section highlight", {}], ["magit-section-child-count", "section child count", {}], ["magit-diff-added", "diff added", {}], ["magit-diff-added-highlight", "diff added highlight", {}], ["magit-diff-removed", "diff removed", {}], ["magit-diff-removed-highlight", "diff removed highlight", {}], ["magit-diff-context", "diff context", {}], ["magit-diff-context-highlight", "diff context highlight", {}], ["magit-diff-file-heading", "diff file heading", {}], ["magit-diff-file-heading-highlight", "diff file heading highlight", {}], ["magit-diff-file-heading-selection", "diff file heading selection", {}], ["magit-diff-hunk-heading", "diff hunk heading", {}], ["magit-diff-hunk-heading-highlight", "diff hunk heading highlight", {}], ["magit-diff-hunk-heading-selection", "diff hunk heading selection", {}], ["magit-diff-hunk-region", "diff hunk region", {}], ["magit-diff-lines-heading", "diff lines heading", {}], ["magit-diff-lines-boundary", "diff lines boundary", {}], ["magit-diff-base", "diff base", {}], ["magit-diff-base-highlight", "diff base highlight", {}], ["magit-diff-our", "diff our", {}], ["magit-diff-our-highlight", "diff our highlight", {}], ["magit-diff-their", "diff their", {}], ["magit-diff-their-highlight", "diff their highlight", {}], ["magit-diff-conflict-heading", "diff conflict heading", {}], ["magit-diff-conflict-heading-highlight", "diff conflict heading highlight", {}], ["magit-diff-revision-summary", "diff revision summary", {}], ["magit-diff-revision-summary-highlight", "diff revision summary highlight", {}], ["magit-diff-whitespace-warning", "diff whitespace warning", {}], ["magit-diffstat-added", "diffstat added", {}], ["magit-diffstat-removed", "diffstat removed", {}], ["magit-branch-current", "branch current", {}], ["magit-branch-local", "branch local", {}], ["magit-branch-remote", "branch remote", {}], ["magit-branch-remote-head", "branch remote head", {}], ["magit-branch-upstream", "branch upstream", {}], ["magit-branch-warning", "branch warning", {}], ["magit-head", "head", {}], ["magit-tag", "tag", {}], ["magit-hash", "hash", {}], ["magit-filename", "filename", {}], ["magit-dimmed", "dimmed", {}], ["magit-keyword", "keyword", {}], ["magit-keyword-squash", "keyword squash", {}], ["magit-refname", "refname", {}], ["magit-refname-stash", "refname stash", {}], ["magit-refname-wip", "refname wip", {}], ["magit-refname-pullreq", "refname pullreq", {}], ["magit-log-author", "log author", {}], ["magit-log-date", "log date", {}], ["magit-log-graph", "log graph", {}], ["magit-header-line", "header line", {}], ["magit-header-line-key", "header line key", {}], ["magit-header-line-log-select", "header line log select", {}], ["magit-process-ok", "process ok", {}], ["magit-process-ng", "process ng", {}], ["magit-mode-line-process", "mode line process", {}], ["magit-mode-line-process-error", "mode line process error", {}], ["magit-bisect-good", "bisect good", {}], ["magit-bisect-bad", "bisect bad", {}], ["magit-bisect-skip", "bisect skip", {}], ["magit-blame-heading", "blame heading", {}], ["magit-blame-highlight", "blame highlight", {}], ["magit-blame-hash", "blame hash", {}], ["magit-blame-name", "blame name", {}], ["magit-blame-date", "blame date", {}], ["magit-blame-summary", "blame summary", {}], ["magit-blame-dimmed", "blame dimmed", {}], ["magit-blame-margin", "blame margin", {}], ["magit-cherry-equivalent", "cherry equivalent", {}], ["magit-cherry-unmatched", "cherry unmatched", {}], ["magit-signature-good", "signature good", {}], ["magit-signature-bad", "signature bad", {}], ["magit-signature-untrusted", "signature untrusted", {}], ["magit-signature-expired", "signature expired", {}], ["magit-signature-expired-key", "signature expired key", {}], ["magit-signature-revoked", "signature revoked", {}], ["magit-signature-error", "signature error", {}], ["magit-reflog-commit", "reflog commit", {}], ["magit-reflog-amend", "reflog amend", {}], ["magit-reflog-merge", "reflog merge", {}], ["magit-reflog-checkout", "reflog checkout", {}], ["magit-reflog-reset", "reflog reset", {}], ["magit-reflog-rebase", "reflog rebase", {}], ["magit-reflog-cherry-pick", "reflog cherry pick", {}], ["magit-reflog-remote", "reflog remote", {}], ["magit-reflog-other", "reflog other", {}], ["magit-sequence-pick", "sequence pick", {}], ["magit-sequence-stop", "sequence stop", {}], ["magit-sequence-part", "sequence part", {}], ["magit-sequence-head", "sequence head", {}], ["magit-sequence-drop", "sequence drop", {}], ["magit-sequence-done", "sequence done", {}], ["magit-sequence-onto", "sequence onto", {}], ["magit-sequence-exec", "sequence exec", {}], ["magit-left-margin", "left margin", {}], ["git-commit-comment-action", "git commit comment action", {}], ["git-commit-comment-branch-local", "git commit comment branch local", {}], ["git-commit-comment-branch-remote", "git commit comment branch remote", {}], ["git-commit-comment-detached", "git commit comment detached", {}], ["git-commit-comment-file", "git commit comment file", {}], ["git-commit-comment-heading", "git commit comment heading", {}], ["git-commit-keyword", "git commit keyword", {}], ["git-commit-nonempty-second-line", "git commit nonempty second line", {}], ["git-commit-overlong-summary", "git commit overlong summary", {}], ["git-commit-summary", "git commit summary", {}], ["git-commit-trailer-token", "git commit trailer token", {}], ["git-commit-trailer-value", "git commit trailer value", {}]]}, "elfeed": {"label": "elfeed", "preview": "elfeed", "faces": [["elfeed-search-date-face", "search date", {"fg": "#aaa"}], ["elfeed-search-title-face", "search title", {"fg": "#000"}], ["elfeed-search-unread-title-face", "search unread title", {"bold": true}], ["elfeed-search-feed-face", "search feed", {"fg": "#aa0"}], ["elfeed-search-tag-face", "search tag", {"fg": "#070"}], ["elfeed-search-unread-count-face", "search unread count", {"fg": "#000"}], ["elfeed-search-filter-face", "search filter", {"inherit": "mode-line-buffer-id"}], ["elfeed-search-last-update-face", "search last update", {}], ["elfeed-log-date-face", "log date", {"inherit": "font-lock-type-face"}], ["elfeed-log-error-level-face", "log error level", {"fg": "#ff0000"}], ["elfeed-log-warn-level-face", "log warn level", {"fg": "#daa520"}], ["elfeed-log-info-level-face", "log info level", {"fg": "#00bfff"}], ["elfeed-log-debug-level-face", "log debug level", {"fg": "#ee00ee"}]]}, "mu4e": {"label": "mu4e", "preview": "mu4e", "faces": [["mu4e-title-face", "title", {}], ["mu4e-context-face", "context", {}], ["mu4e-modeline-face", "modeline", {}], ["mu4e-ok-face", "ok", {}], ["mu4e-warning-face", "warning", {}], ["mu4e-header-title-face", "header title", {}], ["mu4e-header-key-face", "header key", {}], ["mu4e-header-value-face", "header value", {}], ["mu4e-header-face", "header", {}], ["mu4e-header-highlight-face", "header highlight", {}], ["mu4e-header-marks-face", "header marks", {}], ["mu4e-unread-face", "unread", {}], ["mu4e-flagged-face", "flagged", {}], ["mu4e-replied-face", "replied", {}], ["mu4e-forwarded-face", "forwarded", {}], ["mu4e-draft-face", "draft", {}], ["mu4e-trashed-face", "trashed", {}], ["mu4e-related-face", "related", {}], ["mu4e-contact-face", "contact", {}], ["mu4e-special-header-value-face", "special header value", {}], ["mu4e-url-number-face", "url number", {}], ["mu4e-link-face", "link", {}], ["mu4e-footer-face", "footer", {}], ["mu4e-region-code", "region code", {}], ["mu4e-system-face", "system", {}], ["mu4e-highlight-face", "highlight", {}], ["mu4e-compose-separator-face", "compose separator", {}]]}, "gnus": {"label": "gnus (mu4e article view)", "preview": "gnus", "faces": [["gnus-header-name", "header name", {}], ["gnus-header-from", "header from", {}], ["gnus-header-subject", "header subject", {}], ["gnus-header-content", "header content", {}], ["gnus-header-newsgroups", "header newsgroups", {}], ["gnus-cite-1", "cite 1", {}], ["gnus-cite-2", "cite 2", {}], ["gnus-cite-3", "cite 3", {}], ["gnus-cite-4", "cite 4", {}], ["gnus-cite-5", "cite 5", {}], ["gnus-cite-6", "cite 6", {}], ["gnus-cite-7", "cite 7", {}], ["gnus-cite-8", "cite 8", {}], ["gnus-cite-9", "cite 9", {}], ["gnus-cite-10", "cite 10", {}], ["gnus-cite-11", "cite 11", {}], ["gnus-cite-attribution", "cite attribution", {}], ["gnus-signature", "signature", {}], ["gnus-button", "button", {}], ["gnus-emphasis-bold", "emphasis bold", {}], ["gnus-emphasis-italic", "emphasis italic", {}], ["gnus-emphasis-underline", "emphasis underline", {}], ["gnus-emphasis-strikethru", "emphasis strikethru", {}], ["gnus-emphasis-highlight-words", "emphasis highlight words", {}]]}, "org-faces": {"label": "org-faces", "preview": "orgfaces", "faces": [["org-faces-todo", "todo", {}], ["org-faces-project", "project", {}], ["org-faces-doing", "doing", {}], ["org-faces-waiting", "waiting", {}], ["org-faces-verify", "verify", {}], ["org-faces-stalled", "stalled", {}], ["org-faces-delegated", "delegated", {}], ["org-faces-failed", "failed", {}], ["org-faces-done", "done", {}], ["org-faces-cancelled", "cancelled", {}], ["org-faces-priority-a", "priority a", {}], ["org-faces-priority-b", "priority b", {}], ["org-faces-priority-c", "priority c", {}], ["org-faces-priority-d", "priority d", {}], ["org-faces-todo-dim", "todo dim", {}], ["org-faces-project-dim", "project dim", {}], ["org-faces-doing-dim", "doing dim", {}], ["org-faces-waiting-dim", "waiting dim", {}], ["org-faces-verify-dim", "verify dim", {}], ["org-faces-stalled-dim", "stalled dim", {}], ["org-faces-delegated-dim", "delegated dim", {}], ["org-faces-failed-dim", "failed dim", {}], ["org-faces-done-dim", "done dim", {}], ["org-faces-cancelled-dim", "cancelled dim", {}], ["org-faces-priority-a-dim", "priority a dim", {}], ["org-faces-priority-b-dim", "priority b dim", {}], ["org-faces-priority-c-dim", "priority c dim", {}], ["org-faces-priority-d-dim", "priority d dim", {}]]}, "ghostel": {"label": "ghostel", "preview": "ghostel", "faces": [["ghostel-default", "default", {"inherit": "default"}], ["ghostel-fake-cursor", "fake cursor", {"box": {"style": "line", "width": 1, "color": null}}], ["ghostel-fake-cursor-box", "fake cursor box", {"inherit": "cursor"}], ["ghostel-color-black", "color black", {"inherit": "ansi-color-black"}], ["ghostel-color-red", "color red", {"inherit": "ansi-color-red"}], ["ghostel-color-green", "color green", {"inherit": "ansi-color-green"}], ["ghostel-color-yellow", "color yellow", {"inherit": "ansi-color-yellow"}], ["ghostel-color-blue", "color blue", {"inherit": "ansi-color-blue"}], ["ghostel-color-magenta", "color magenta", {"inherit": "ansi-color-magenta"}], ["ghostel-color-cyan", "color cyan", {"inherit": "ansi-color-cyan"}], ["ghostel-color-white", "color white", {"inherit": "ansi-color-white"}], ["ghostel-color-bright-black", "color bright black", {"inherit": "ansi-color-bright-black"}], ["ghostel-color-bright-red", "color bright red", {"inherit": "ansi-color-bright-red"}], ["ghostel-color-bright-green", "color bright green", {"inherit": "ansi-color-bright-green"}], ["ghostel-color-bright-yellow", "color bright yellow", {"inherit": "ansi-color-bright-yellow"}], ["ghostel-color-bright-blue", "color bright blue", {"inherit": "ansi-color-bright-blue"}], ["ghostel-color-bright-magenta", "color bright magenta", {"inherit": "ansi-color-bright-magenta"}], ["ghostel-color-bright-cyan", "color bright cyan", {"inherit": "ansi-color-bright-cyan"}], ["ghostel-color-bright-white", "color bright white", {"inherit": "ansi-color-bright-white"}]]}, "auto-dim-other-buffers": {"label": "auto-dim", "preview": "autodim", "faces": [["auto-dim-other-buffers", "auto dim other buffers", {}], ["auto-dim-other-buffers-hide", "hide", {}]]}, "dashboard": {"label": "dashboard", "preview": "dashboard", "faces": [["dashboard-banner-logo-title", "banner logo title", {"inherit": "default"}], ["dashboard-text-banner", "text banner", {"inherit": "font-lock-keyword-face"}], ["dashboard-heading", "heading", {"inherit": "font-lock-keyword-face"}], ["dashboard-items-face", "items", {"inherit": "widget-button"}], ["dashboard-navigator", "navigator", {"inherit": "font-lock-keyword-face"}], ["dashboard-no-items-face", "no items", {"inherit": "widget-button"}], ["dashboard-footer-face", "footer", {"inherit": "font-lock-doc-face"}], ["dashboard-footer-icon-face", "footer icon", {"inherit": "dashboard-footer-face"}]]}, "lsp-mode": {"label": "lsp-mode", "preview": "lsp", "faces": [["lsp-signature-face", "signature", {}], ["lsp-signature-highlight-function-argument", "signature highlight function argument", {}], ["lsp-signature-posframe", "signature posframe", {}], ["lsp-face-highlight-read", "face highlight read", {}], ["lsp-face-highlight-write", "face highlight write", {}], ["lsp-face-highlight-textual", "face highlight textual", {}], ["lsp-face-rename", "face rename", {}], ["lsp-rename-placeholder-face", "rename placeholder", {}], ["lsp-inlay-hint-face", "inlay hint", {}], ["lsp-inlay-hint-parameter-face", "inlay hint parameter", {}], ["lsp-inlay-hint-type-face", "inlay hint type", {}], ["lsp-details-face", "details", {}], ["lsp-installation-buffer-face", "installation buffer", {}], ["lsp-installation-finished-buffer-face", "installation finished buffer", {}]]}, "git-gutter": {"label": "git-gutter", "preview": "gitgutter", "faces": [["git-gutter:added", "added", {"fg": "#00ff00", "bold": true, "inherit": "default"}], ["git-gutter:modified", "modified", {"fg": "#ff00ff", "bold": true, "inherit": "default"}], ["git-gutter:deleted", "deleted", {"fg": "#ff0000", "bold": true, "inherit": "default"}], ["git-gutter:unchanged", "unchanged", {"bg": "#ffff00", "inherit": "default"}], ["git-gutter:separator", "separator", {"fg": "#00ffff", "bold": true, "inherit": "default"}]]}, "flycheck": {"label": "flycheck", "preview": "flycheck", "faces": [["flycheck-error", "error", {"underline": true}], ["flycheck-warning", "warning", {"underline": true}], ["flycheck-info", "info", {"underline": true}], ["flycheck-fringe-error", "fringe error", {"inherit": "error"}], ["flycheck-fringe-warning", "fringe warning", {"inherit": "warning"}], ["flycheck-fringe-info", "fringe info", {"inherit": "success"}], ["flycheck-delimited-error", "delimited error", {}], ["flycheck-error-delimiter", "error delimiter", {}], ["flycheck-error-list-error", "error list error", {"inherit": "error"}], ["flycheck-error-list-warning", "error list warning", {"inherit": "warning"}], ["flycheck-error-list-info", "error list info", {"inherit": "success"}], ["flycheck-error-list-error-message", "error list error message", {}], ["flycheck-error-list-checker-name", "error list checker name", {"inherit": "font-lock-function-name-face"}], ["flycheck-error-list-column-number", "error list column number", {}], ["flycheck-error-list-line-number", "error list line number", {}], ["flycheck-error-list-filename", "error list filename", {"inherit": "mode-line-buffer-id"}], ["flycheck-error-list-id", "error list id", {"inherit": "font-lock-type-face"}], ["flycheck-error-list-id-with-explainer", "error list id with explainer", {"inherit": "flycheck-error-list-id", "box": {"style": "released", "width": 1, "color": null}}], ["flycheck-error-list-highlight", "error list highlight", {"bold": true}], ["flycheck-verify-select-checker", "verify select checker", {"box": {"style": "released", "width": 1, "color": null}}]]}, "dired": {"label": "dired", "preview": "dired", "faces": [["dired-header", "header", {}], ["dired-directory", "directory", {}], ["dired-symlink", "symlink", {}], ["dired-broken-symlink", "broken symlink", {}], ["dired-special", "special", {}], ["dired-set-id", "set id", {}], ["dired-perm-write", "perm write", {}], ["dired-mark", "mark", {}], ["dired-marked", "marked", {}], ["dired-flagged", "flagged", {}], ["dired-ignored", "ignored", {}], ["dired-warning", "warning", {}]]}, "dirvish": {"label": "dirvish", "preview": "dirvish", "faces": [["dirvish-inactive", "inactive", {"inherit": "shadow"}], ["dirvish-free-space", "free space", {"inherit": "font-lock-constant-face"}], ["dirvish-hl-line", "hl line", {"inherit": "highlight"}], ["dirvish-hl-line-inactive", "hl line inactive", {"inherit": "region"}], ["dirvish-file-modes", "file modes", {"fg": "#6b6b6b"}], ["dirvish-file-link-number", "file link number", {"inherit": "font-lock-constant-face"}], ["dirvish-file-user-id", "file user id", {"inherit": "font-lock-preprocessor-face"}], ["dirvish-file-group-id", "file group id", {"inherit": "dirvish-file-user-id"}], ["dirvish-file-size", "file size", {"underline": true, "inherit": "completions-annotations"}], ["dirvish-file-time", "file time", {"fg": "#979797"}], ["dirvish-file-inode-number", "file inode number", {"inherit": "dirvish-file-link-number"}], ["dirvish-file-device-number", "file device number", {"inherit": "dirvish-file-link-number"}], ["dirvish-subtree-guide", "subtree guide", {"bg": "unspecified", "underline": true, "inherit": "dired-ignored"}], ["dirvish-subtree-state", "subtree state", {"bg": "unspecified", "underline": true, "inherit": "dired-ignored"}], ["dirvish-collapse-dir-face", "collapse dir", {"inherit": "dired-directory"}], ["dirvish-collapse-empty-dir-face", "collapse empty dir", {"inherit": "shadow"}], ["dirvish-collapse-file-face", "collapse file", {"inherit": "default"}], ["dirvish-emerge-group-title", "emerge group title", {"inherit": "dired-ignored"}], ["dirvish-media-info-heading", "media info heading", {"inherit": ["dired-header", "bold"]}], ["dirvish-media-info-property-key", "media info property key", {"inherit": ["italic"]}], ["dirvish-narrow-match-face-0", "narrow match 0", {"fg": "#223fbf", "bold": true}], ["dirvish-narrow-match-face-1", "narrow match 1", {"fg": "#8f0075", "bold": true}], ["dirvish-narrow-match-face-2", "narrow match 2", {"fg": "#145a00", "bold": true}], ["dirvish-narrow-match-face-3", "narrow match 3", {"fg": "#804000", "bold": true}], ["dirvish-narrow-split", "narrow split", {"inherit": "font-lock-negation-char-face"}], ["dirvish-proc-running", "proc running", {"inherit": "warning"}], ["dirvish-proc-finished", "proc finished", {"inherit": "success"}], ["dirvish-proc-failed", "proc failed", {"inherit": "error"}], ["dirvish-git-commit-message-face", "git commit message", {"bg": "unspecified", "underline": true, "inherit": "dired-ignored"}], ["dirvish-vc-added-state", "vc added state", {"inherit": "vc-locally-added-state"}], ["dirvish-vc-edited-state", "vc edited state", {"inherit": "vc-edited-state"}], ["dirvish-vc-removed-state", "vc removed state", {"inherit": "vc-removed-state"}], ["dirvish-vc-conflict-state", "vc conflict state", {"inherit": "vc-conflict-state"}], ["dirvish-vc-locked-state", "vc locked state", {"inherit": "vc-locked-state"}], ["dirvish-vc-missing-state", "vc missing state", {"inherit": "vc-missing-state"}], ["dirvish-vc-needs-merge-face", "vc needs merge", {"bg": "#efcbcf"}], ["dirvish-vc-needs-update-state", "vc needs update state", {"inherit": "vc-needs-update-state"}], ["dirvish-vc-unregistered-face", "vc unregistered", {"inherit": "font-lock-constant-face"}]]}, "calibredb": {"label": "calibredb", "preview": "calibredb", "faces": [["calibredb-search-header-library-name-face", "search header library name", {}], ["calibredb-search-header-library-path-face", "search header library path", {}], ["calibredb-search-header-total-face", "search header total", {}], ["calibredb-search-header-filter-face", "search header filter", {}], ["calibredb-search-header-sort-face", "search header sort", {}], ["calibredb-search-header-highlight-face", "search header highlight", {}], ["calibredb-id-face", "id", {}], ["calibredb-title-face", "title", {}], ["calibredb-author-face", "author", {}], ["calibredb-format-face", "format", {}], ["calibredb-size-face", "size", {}], ["calibredb-tag-face", "tag", {}], ["calibredb-date-face", "date", {}], ["calibredb-mark-face", "mark", {}], ["calibredb-series-face", "series", {}], ["calibredb-publisher-face", "publisher", {}], ["calibredb-pubdate-face", "pubdate", {}], ["calibredb-language-face", "language", {}], ["calibredb-comment-face", "comment", {}], ["calibredb-archive-face", "archive", {}], ["calibredb-favorite-face", "favorite", {}], ["calibredb-file-face", "file", {}], ["calibredb-ids-face", "ids", {}], ["calibredb-highlight-face", "highlight", {}], ["calibredb-current-page-button-face", "current page button", {}], ["calibredb-mouse-face", "mouse", {}], ["calibredb-title-detailed-view-face", "title detailed view", {}], ["calibredb-edit-annotation-header-title-face", "edit annotation header title", {}]]}, "erc": {"label": "erc", "preview": "erc", "faces": [["erc-header-line", "header line", {}], ["erc-timestamp-face", "timestamp", {}], ["erc-notice-face", "notice", {}], ["erc-default-face", "default", {}], ["erc-current-nick-face", "current nick", {}], ["erc-my-nick-face", "my nick", {}], ["erc-my-nick-prefix-face", "my nick prefix", {}], ["erc-nick-default-face", "nick default", {}], ["erc-nick-prefix-face", "nick prefix", {}], ["erc-button-nick-default-face", "button nick default", {}], ["erc-nick-msg-face", "nick msg", {}], ["erc-direct-msg-face", "direct msg", {}], ["erc-action-face", "action", {}], ["erc-keyword-face", "keyword", {}], ["erc-pal-face", "pal", {}], ["erc-fool-face", "fool", {}], ["erc-dangerous-host-face", "dangerous host", {}], ["erc-error-face", "error", {}], ["erc-input-face", "input", {}], ["erc-prompt-face", "prompt", {}], ["erc-command-indicator-face", "command indicator", {}], ["erc-information", "information", {}], ["erc-button", "button", {}], ["erc-bold-face", "bold", {}], ["erc-italic-face", "italic", {}], ["erc-underline-face", "underline", {}], ["erc-inverse-face", "inverse", {}], ["erc-spoiler-face", "spoiler", {}], ["erc-fill-wrap-merge-indicator-face", "fill wrap merge indicator", {}], ["erc-keep-place-indicator-arrow", "keep place indicator arrow", {}], ["erc-keep-place-indicator-line", "keep place indicator line", {}]]}, "org-drill": {"label": "org-drill", "preview": "orgdrill", "faces": [["org-drill-hidden-cloze-face", "hidden cloze", {}], ["org-drill-visible-cloze-face", "visible cloze", {}], ["org-drill-visible-cloze-hint-face", "visible cloze hint", {}]]}, "org-noter": {"label": "org-noter", "preview": "orgnoter", "faces": [["org-noter-notes-exist-face", "notes exist", {}], ["org-noter-no-notes-exist-face", "no notes exist", {}]]}, "signel": {"label": "signel", "preview": "signel", "faces": [["signel-timestamp-face", "timestamp", {}], ["signel-my-msg-face", "my msg", {}], ["signel-other-msg-face", "other msg", {}], ["signel-error-face", "error", {}]]}, "pearl": {"label": "pearl", "preview": "pearl", "faces": [["pearl-preamble-summary", "preamble summary", {}], ["pearl-editable-comment", "editable comment", {}], ["pearl-readonly-comment", "readonly comment", {}], ["pearl-modified-highlight", "modified highlight", {}], ["pearl-modified-local", "modified local", {}], ["pearl-modified-unknown", "modified unknown", {}]]}, "slack": {"label": "slack", "preview": "slack", "faces": [["slack-room-info-title-face", "room info title", {}], ["slack-room-info-title-room-name-face", "room info title room name", {}], ["slack-room-info-section-title-face", "room info section title", {}], ["slack-room-info-section-label-face", "room info section label", {}], ["slack-room-unread-face", "room unread", {}], ["slack-message-output-header", "message output header", {}], ["slack-message-output-text", "message output text", {}], ["slack-message-output-reaction", "message output reaction", {}], ["slack-message-output-reaction-pressed", "message output reaction pressed", {}], ["slack-message-deleted-face", "message deleted", {}], ["slack-new-message-marker-face", "new message marker", {}], ["slack-all-thread-buffer-thread-header-face", "all thread buffer thread header", {}], ["slack-message-mention-face", "message mention", {}], ["slack-message-mention-me-face", "message mention me", {}], ["slack-message-mention-keyword-face", "message mention keyword", {}], ["slack-channel-button-face", "channel button", {}], ["slack-mrkdwn-bold-face", "mrkdwn bold", {}], ["slack-mrkdwn-italic-face", "mrkdwn italic", {}], ["slack-mrkdwn-code-face", "mrkdwn code", {}], ["slack-mrkdwn-code-block-face", "mrkdwn code block", {}], ["slack-mrkdwn-strike-face", "mrkdwn strike", {}], ["slack-mrkdwn-blockquote-face", "mrkdwn blockquote", {}], ["slack-mrkdwn-list-face", "mrkdwn list", {}], ["slack-attachment-header", "attachment header", {}], ["slack-attachment-footer", "attachment footer", {}], ["slack-attachment-pad", "attachment pad", {}], ["slack-attachment-field-title", "attachment field title", {}], ["slack-message-attachment-preview-header-face", "message attachment preview header", {}], ["slack-preview-face", "preview", {}], ["slack-block-highlight-source-overlay-face", "block highlight source overlay", {}], ["slack-message-action-face", "message action", {}], ["slack-message-action-primary-face", "message action primary", {}], ["slack-message-action-danger-face", "message action danger", {}], ["slack-button-block-element-face", "button block element", {}], ["slack-button-primary-block-element-face", "button primary block element", {}], ["slack-button-danger-block-element-face", "button danger block element", {}], ["slack-select-block-element-face", "select block element", {}], ["slack-overflow-block-element-face", "overflow block element", {}], ["slack-date-picker-block-element-face", "date picker block element", {}], ["slack-dialog-title-face", "dialog title", {}], ["slack-dialog-element-label-face", "dialog element label", {}], ["slack-dialog-element-hint-face", "dialog element hint", {}], ["slack-dialog-element-placeholder-face", "dialog element placeholder", {}], ["slack-dialog-element-error-face", "dialog element error", {}], ["slack-dialog-submit-button-face", "dialog submit button", {}], ["slack-dialog-cancel-button-face", "dialog cancel button", {}], ["slack-dialog-select-element-input-face", "dialog select element input", {}], ["slack-user-active-face", "user active", {}], ["slack-user-dnd-face", "user dnd", {}], ["slack-user-profile-header-face", "user profile header", {}], ["slack-user-profile-property-name-face", "user profile property name", {}], ["slack-profile-image-face", "profile image", {}], ["slack-search-result-message-header-face", "search result message header", {}], ["slack-search-result-message-username-face", "search result message username", {}], ["slack-modeline-has-unreads-face", "modeline has unreads", {}], ["slack-modeline-channel-has-unreads-face", "modeline channel has unreads", {}], ["slack-modeline-thread-has-unreads-face", "modeline thread has unreads", {}]]}, "telega": {"label": "telega", "preview": "telega", "faces": [["telega-root-heading", "root heading", {}], ["telega-tracking", "tracking", {}], ["telega-unread-unmuted-modeline", "unread unmuted modeline", {}], ["telega-username", "username", {}], ["telega-user-online-status", "user online status", {}], ["telega-user-non-online-status", "user non online status", {}], ["telega-secret-title", "secret title", {}], ["telega-contact-birthdays-today", "contact birthdays today", {}], ["telega-muted-count", "muted count", {}], ["telega-unmuted-count", "unmuted count", {}], ["telega-mention-count", "mention count", {}], ["telega-has-chatbuf-brackets", "has chatbuf brackets", {}], ["telega-delim-face", "delim", {}], ["telega-shadow", "shadow", {}], ["telega-link", "link", {}], ["telega-blue", "blue", {}], ["telega-red", "red", {}], ["telega-msg-heading", "msg heading", {}], ["telega-msg-user-title", "msg user title", {}], ["telega-msg-self-title", "msg self title", {}], ["telega-msg-deleted", "msg deleted", {}], ["telega-msg-sponsored", "msg sponsored", {}], ["telega-msg-inline-reply", "msg inline reply", {}], ["telega-msg-inline-forward", "msg inline forward", {}], ["telega-msg-inline-other", "msg inline other", {}], ["telega-entity-type-bold", "entity type bold", {}], ["telega-entity-type-italic", "entity type italic", {}], ["telega-entity-type-underline", "entity type underline", {}], ["telega-entity-type-strikethrough", "entity type strikethrough", {}], ["telega-entity-type-code", "entity type code", {}], ["telega-entity-type-pre", "entity type pre", {}], ["telega-entity-type-blockquote", "entity type blockquote", {}], ["telega-entity-type-mention", "entity type mention", {}], ["telega-entity-type-hashtag", "entity type hashtag", {}], ["telega-entity-type-cashtag", "entity type cashtag", {}], ["telega-entity-type-botcommand", "entity type botcommand", {}], ["telega-entity-type-texturl", "entity type texturl", {}], ["telega-entity-type-spoiler", "entity type spoiler", {}], ["telega-reaction", "reaction", {}], ["telega-reaction-chosen", "reaction chosen", {}], ["telega-reaction-paid", "reaction paid", {}], ["telega-reaction-paid-chosen", "reaction paid chosen", {}], ["telega-highlight-text-face", "highlight text", {}], ["telega-button-highlight", "button highlight", {}], ["telega-chat-prompt", "chat prompt", {}], ["telega-chat-prompt-aux", "chat prompt aux", {}], ["telega-chat-input-attachment", "chat input attachment", {}], ["telega-topic-button", "topic button", {}], ["telega-filter-active", "filter active", {}], ["telega-filter-button-active", "filter button active", {}], ["telega-filter-button-inactive", "filter button inactive", {}], ["telega-checklist-stats-done", "checklist stats done", {}], ["telega-checklist-stats-todo", "checklist stats todo", {}], ["telega-box-button", "box button", {}], ["telega-box-button-active", "box button active", {}], ["telega-box-button-default-active", "box button default active", {}], ["telega-box-button-default-passive", "box button default passive", {}], ["telega-box-button-primary-active", "box button primary active", {}], ["telega-box-button-primary-passive", "box button primary passive", {}], ["telega-box-button-success-active", "box button success active", {}], ["telega-box-button-success-passive", "box button success passive", {}], ["telega-box-button-danger-active", "box button danger active", {}], ["telega-box-button-danger-passive", "box button danger passive", {}], ["telega-box-button-ui-active", "box button ui active", {}], ["telega-box-button-ui-passive", "box button ui passive", {}], ["telega-box-button2-active", "box button2 active", {}], ["telega-box-button2-passive", "box button2 passive", {}], ["telega-box-button2-white-foreground", "box button2 white foreground", {}], ["telega-describe-item-title", "describe item title", {}], ["telega-describe-section-title", "describe section title", {}], ["telega-describe-subsection-title", "describe subsection title", {}], ["telega-enckey-00", "enckey 00", {}], ["telega-enckey-01", "enckey 01", {}], ["telega-enckey-10", "enckey 10", {}], ["telega-enckey-11", "enckey 11", {}], ["telega-palette-builtin-blue", "palette builtin blue", {}], ["telega-palette-builtin-green", "palette builtin green", {}], ["telega-palette-builtin-orange", "palette builtin orange", {}], ["telega-palette-builtin-purple", "palette builtin purple", {}], ["telega-webpage-title", "webpage title", {}], ["telega-webpage-subtitle", "webpage subtitle", {}], ["telega-webpage-header", "webpage header", {}], ["telega-webpage-subheader", "webpage subheader", {}], ["telega-webpage-outline", "webpage outline", {}], ["telega-webpage-fixed", "webpage fixed", {}], ["telega-webpage-preformatted", "webpage preformatted", {}], ["telega-webpage-marked", "webpage marked", {}], ["telega-webpage-strike-through", "webpage strike through", {}], ["telega-webpage-chat-link", "webpage chat link", {}], ["telega-link-preview-sitename", "link preview sitename", {}], ["telega-link-preview-title", "link preview title", {}]]}, "shr": {"label": "shr (HTML: nov/eww/mail)", "preview": "shr", "faces": [["shr-h1", "h1", {}], ["shr-h2", "h2", {}], ["shr-h3", "h3", {}], ["shr-h4", "h4", {}], ["shr-h5", "h5", {}], ["shr-h6", "h6", {}], ["shr-text", "text", {}], ["shr-link", "link", {}], ["shr-selected-link", "selected link", {}], ["shr-code", "code", {}], ["shr-mark", "mark", {}], ["shr-strike-through", "strike through", {}], ["shr-sup", "sup", {}], ["shr-abbreviation", "abbreviation", {}], ["shr-sliced-image", "sliced image", {}]]}, "2048-game": {"label": "2048-game", "preview": "generic", "faces": [["twentyfortyeight-face-1024", "twentyfortyeight 1024", {"fg": "#000000", "bg": "#ffd700"}], ["twentyfortyeight-face-128", "twentyfortyeight 128", {"fg": "#ffffff", "bg": "#8b0000"}], ["twentyfortyeight-face-16", "twentyfortyeight 16", {"fg": "#000000", "bg": "#ffa500"}], ["twentyfortyeight-face-2", "twentyfortyeight 2", {"fg": "#000000", "bg": "#f0e68c"}], ["twentyfortyeight-face-2048", "twentyfortyeight 2048", {"fg": "#000000", "bg": "#ffff00"}], ["twentyfortyeight-face-256", "twentyfortyeight 256", {"fg": "#ffffff", "bg": "#8b008b"}], ["twentyfortyeight-face-32", "twentyfortyeight 32", {"fg": "#000000", "bg": "#ff4500"}], ["twentyfortyeight-face-4", "twentyfortyeight 4", {"fg": "#000000", "bg": "#deb887"}], ["twentyfortyeight-face-512", "twentyfortyeight 512", {"fg": "#000000", "bg": "#ff00ff"}], ["twentyfortyeight-face-64", "twentyfortyeight 64", {"fg": "#ffffff", "bg": "#b22222"}], ["twentyfortyeight-face-8", "twentyfortyeight 8", {"fg": "#000000", "bg": "#cd8500"}]]}, "alert": {"label": "alert", "preview": "generic", "faces": [["alert-high-face", "high", {"fg": "#ff8c00", "bold": true}], ["alert-low-face", "low", {"fg": "#00008b"}], ["alert-moderate-face", "moderate", {"fg": "#ffd700", "bold": true}], ["alert-normal-face", "normal", {}], ["alert-trivial-face", "trivial", {"fg": "#9400d3"}], ["alert-urgent-face", "urgent", {"fg": "#ff0000", "bold": true}]]}, "all-the-icons": {"label": "all-the-icons", "preview": "generic", "faces": [["all-the-icons-blue", "blue", {"fg": "#6a9fb5"}], ["all-the-icons-blue-alt", "blue alt", {"fg": "#2188b6"}], ["all-the-icons-cyan", "cyan", {"fg": "#75b5aa"}], ["all-the-icons-cyan-alt", "cyan alt", {"fg": "#0595bd"}], ["all-the-icons-dblue", "dblue", {"fg": "#446674"}], ["all-the-icons-dcyan", "dcyan", {"fg": "#48746d"}], ["all-the-icons-dgreen", "dgreen", {"fg": "#6d8143"}], ["all-the-icons-dmaroon", "dmaroon", {"fg": "#72584b"}], ["all-the-icons-dorange", "dorange", {"fg": "#915b2d"}], ["all-the-icons-dpink", "dpink", {"fg": "#7e5d5f"}], ["all-the-icons-dpurple", "dpurple", {"fg": "#694863"}], ["all-the-icons-dred", "dred", {"fg": "#843031"}], ["all-the-icons-dsilver", "dsilver", {"fg": "#838484"}], ["all-the-icons-dyellow", "dyellow", {"fg": "#b48d56"}], ["all-the-icons-green", "green", {"fg": "#90a959"}], ["all-the-icons-lblue", "lblue", {"fg": "#677174"}], ["all-the-icons-lcyan", "lcyan", {"fg": "#2c7d6e"}], ["all-the-icons-lgreen", "lgreen", {"fg": "#3d6837"}], ["all-the-icons-lmaroon", "lmaroon", {"fg": "#ce7a4e"}], ["all-the-icons-lorange", "lorange", {"fg": "#ffa500"}], ["all-the-icons-lpink", "lpink", {"fg": "#ff505b"}], ["all-the-icons-lpurple", "lpurple", {"fg": "#e69dd6"}], ["all-the-icons-lred", "lred", {"fg": "#eb595a"}], ["all-the-icons-lsilver", "lsilver", {"fg": "#7f7869"}], ["all-the-icons-lyellow", "lyellow", {"fg": "#ff9300"}], ["all-the-icons-maroon", "maroon", {"fg": "#8f5536"}], ["all-the-icons-orange", "orange", {"fg": "#d4843e"}], ["all-the-icons-pink", "pink", {"fg": "#fc505b"}], ["all-the-icons-purple", "purple", {"fg": "#68295b"}], ["all-the-icons-purple-alt", "purple alt", {"fg": "#5d54e1"}], ["all-the-icons-red", "red", {"fg": "#ac4142"}], ["all-the-icons-red-alt", "red alt", {"fg": "#843031"}], ["all-the-icons-silver", "silver", {"fg": "#716e68"}], ["all-the-icons-yellow", "yellow", {"fg": "#ffcc0e"}]]}, "company": {"label": "company", "preview": "generic", "faces": [["company-echo", "echo", {}], ["company-echo-common", "echo common", {"fg": "#8b1a1a"}], ["company-preview", "preview", {"inherit": ["company-tooltip-selection", "company-tooltip"]}], ["company-preview-common", "preview common", {"inherit": "company-tooltip-common-selection"}], ["company-preview-search", "preview search", {"inherit": "company-tooltip-common-selection"}], ["company-tooltip", "tooltip", {"fg": "#000000", "bg": "#fff8dc"}], ["company-tooltip-annotation", "tooltip annotation", {"fg": "#8b1a1a"}], ["company-tooltip-annotation-selection", "tooltip annotation selection", {"inherit": "company-tooltip-annotation"}], ["company-tooltip-common", "tooltip common", {"fg": "#8b0000"}], ["company-tooltip-common-selection", "tooltip common selection", {"inherit": "company-tooltip-common"}], ["company-tooltip-deprecated", "tooltip deprecated", {"strike": true}], ["company-tooltip-mouse", "tooltip mouse", {"inherit": "highlight"}], ["company-tooltip-quick-access", "tooltip quick access", {"inherit": "company-tooltip-annotation"}], ["company-tooltip-quick-access-selection", "tooltip quick access selection", {"inherit": "company-tooltip-annotation-selection"}], ["company-tooltip-scrollbar-thumb", "tooltip scrollbar thumb", {"bg": "#cd5c5c"}], ["company-tooltip-scrollbar-track", "tooltip scrollbar track", {"bg": "#f5deb3"}], ["company-tooltip-search", "tooltip search", {"inherit": "highlight"}], ["company-tooltip-search-selection", "tooltip search selection", {"inherit": "highlight"}], ["company-tooltip-selection", "tooltip selection", {"bg": "#add8e6"}]]}, "company-box": {"label": "company-box", "preview": "generic", "faces": [["company-box-annotation", "annotation", {}], ["company-box-background", "background", {}], ["company-box-candidate", "candidate", {}], ["company-box-numbers", "numbers", {}], ["company-box-scrollbar", "scrollbar", {}], ["company-box-selection", "selection", {}]]}, "consult": {"label": "consult", "preview": "generic", "faces": [["consult-async-failed", "async failed", {"inherit": "error"}], ["consult-async-finished", "async finished", {"inherit": "success"}], ["consult-async-running", "async running", {"inherit": "consult-narrow-indicator"}], ["consult-async-split", "async split", {"inherit": "font-lock-negation-char-face"}], ["consult-bookmark", "bookmark", {"inherit": "font-lock-constant-face"}], ["consult-buffer", "buffer", {}], ["consult-file", "file", {"inherit": "font-lock-function-name-face"}], ["consult-grep-context", "grep context", {"inherit": "shadow"}], ["consult-help", "help", {"inherit": "shadow"}], ["consult-highlight-mark", "highlight mark", {"inherit": "consult-highlight-match"}], ["consult-highlight-match", "highlight match", {"inherit": "match"}], ["consult-key", "key", {"inherit": "font-lock-keyword-face"}], ["consult-line-number", "line number", {"inherit": "consult-key"}], ["consult-line-number-prefix", "line number prefix", {"inherit": "line-number"}], ["consult-line-number-wrapped", "line number wrapped", {"inherit": "font-lock-warning-face"}], ["consult-narrow-indicator", "narrow indicator", {"inherit": "warning"}], ["consult-preview-insertion", "preview insertion", {"inherit": "region"}], ["consult-preview-line", "preview line", {"inherit": "consult-preview-insertion"}], ["consult-preview-match", "preview match", {"inherit": "isearch"}], ["consult-separator", "separator", {"fg": "#ccc"}]]}, "embark": {"label": "embark", "preview": "generic", "faces": [["embark-collect-annotation", "collect annotation", {"inherit": "completions-annotations"}], ["embark-collect-candidate", "collect candidate", {"inherit": "default"}], ["embark-collect-group-separator", "collect group separator", {"strike": true, "inherit": "shadow"}], ["embark-collect-group-title", "collect group title", {"italic": true, "inherit": "shadow"}], ["embark-keybinding", "keybinding", {"inherit": "success"}], ["embark-keybinding-repeat", "keybinding repeat", {"inherit": "font-lock-builtin-face"}], ["embark-keymap", "keymap", {"italic": true}], ["embark-selected", "selected", {"inherit": "match"}], ["embark-target", "target", {"inherit": "highlight"}], ["embark-verbose-indicator-documentation", "verbose indicator documentation", {"inherit": "completions-annotations"}], ["embark-verbose-indicator-shadowed", "verbose indicator shadowed", {"inherit": "shadow"}], ["embark-verbose-indicator-title", "verbose indicator title", {"bold": true, "height": 1.1}]]}, "emms": {"label": "emms", "preview": "generic", "faces": [["emms-browser-album-face", "browser album", {}], ["emms-browser-albumartist-face", "browser albumartist", {}], ["emms-browser-artist-face", "browser artist", {}], ["emms-browser-composer-face", "browser composer", {}], ["emms-browser-performer-face", "browser performer", {}], ["emms-browser-track-face", "browser track", {}], ["emms-browser-year/genre-face", "browser year/genre", {}], ["emms-metaplaylist-mode-current-face", "metaplaylist mode current", {"fg": "#ffffff", "bg": "#cd0000"}], ["emms-metaplaylist-mode-face", "metaplaylist mode", {"fg": "#cd0000"}], ["emms-playlist-selected-face", "playlist selected", {"fg": "#ffffff", "bg": "#0000cd"}], ["emms-playlist-track-face", "playlist track", {"fg": "#0000ff"}]]}, "flyspell-correct": {"label": "flyspell-correct", "preview": "generic", "faces": [["flyspell-correct-highlight-face", "highlight", {"inherit": "isearch"}]]}, "highlight-indent-guides": {"label": "highlight-indent-guides", "preview": "generic", "faces": [["highlight-indent-guides-character-face", "character", {}], ["highlight-indent-guides-even-face", "even", {}], ["highlight-indent-guides-odd-face", "odd", {}], ["highlight-indent-guides-stack-character-face", "stack character", {}], ["highlight-indent-guides-stack-even-face", "stack even", {}], ["highlight-indent-guides-stack-odd-face", "stack odd", {}], ["highlight-indent-guides-top-character-face", "top character", {}], ["highlight-indent-guides-top-even-face", "top even", {}], ["highlight-indent-guides-top-odd-face", "top odd", {}]]}, "hl-todo": {"label": "hl-todo", "preview": "generic", "faces": [["hl-todo", "hl todo", {"fg": "#cc9393", "bold": true}], ["hl-todo-flymake-type", "flymake type", {"inherit": "font-lock-keyword-face"}]]}, "json-mode": {"label": "json-mode", "preview": "generic", "faces": [["json-mode-object-name-face", "object name", {"inherit": "font-lock-variable-name-face"}]]}, "llama": {"label": "llama", "preview": "generic", "faces": [["llama-##-macro", "## macro", {"inherit": "font-lock-function-call-face"}], ["llama-deleted-argument", "deleted argument", {"box": {"style": "line", "width": 1, "color": "#ff0000"}}], ["llama-llama-macro", "llama macro", {"inherit": "font-lock-keyword-face"}], ["llama-mandatory-argument", "mandatory argument", {"inherit": "font-lock-variable-use-face"}], ["llama-optional-argument", "optional argument", {"inherit": "font-lock-type-face"}]]}, "lv": {"label": "lv", "preview": "generic", "faces": [["lv-separator", "separator", {"bg": "#cccccc"}]]}, "magit-section": {"label": "magit-section", "preview": "generic", "faces": [["magit-left-margin", "magit left margin", {}], ["magit-section-child-count", "child count", {}], ["magit-section-heading", "heading", {}], ["magit-section-heading-selection", "heading selection", {}], ["magit-section-highlight", "highlight", {}], ["magit-section-secondary-heading", "secondary heading", {}]]}, "malyon": {"label": "malyon", "preview": "generic", "faces": [["malyon-face-bold", "face bold", {"inherit": "bold"}], ["malyon-face-error", "face error", {"inherit": "error"}], ["malyon-face-italic", "face italic", {"inherit": "italic"}], ["malyon-face-plain", "face plain", {"inherit": "default"}], ["malyon-face-reverse", "face reverse", {"inherit": "default"}]]}, "marginalia": {"label": "marginalia", "preview": "generic", "faces": [["marginalia-archive", "archive", {"inherit": "warning"}], ["marginalia-char", "char", {"inherit": "marginalia-key"}], ["marginalia-date", "date", {"inherit": "marginalia-key"}], ["marginalia-documentation", "documentation", {"inherit": "completions-annotations"}], ["marginalia-file-name", "file name", {"inherit": "marginalia-documentation"}], ["marginalia-file-owner", "file owner", {"inherit": "font-lock-preprocessor-face"}], ["marginalia-file-priv-dir", "file priv dir", {"inherit": "font-lock-keyword-face"}], ["marginalia-file-priv-exec", "file priv exec", {"inherit": "font-lock-function-name-face"}], ["marginalia-file-priv-link", "file priv link", {"inherit": "font-lock-keyword-face"}], ["marginalia-file-priv-no", "file priv no", {"inherit": "shadow"}], ["marginalia-file-priv-other", "file priv other", {"inherit": "font-lock-constant-face"}], ["marginalia-file-priv-rare", "file priv rare", {"inherit": "font-lock-variable-name-face"}], ["marginalia-file-priv-read", "file priv read", {"inherit": "font-lock-type-face"}], ["marginalia-file-priv-write", "file priv write", {"inherit": "font-lock-builtin-face"}], ["marginalia-function", "function", {"inherit": "font-lock-function-name-face"}], ["marginalia-installed", "installed", {"inherit": "success"}], ["marginalia-key", "key", {"inherit": "font-lock-keyword-face"}], ["marginalia-lighter", "lighter", {"inherit": "marginalia-size"}], ["marginalia-list", "list", {"inherit": "font-lock-constant-face"}], ["marginalia-mode", "mode", {"inherit": "marginalia-key"}], ["marginalia-modified", "modified", {"inherit": "font-lock-negation-char-face"}], ["marginalia-null", "null", {"inherit": "font-lock-comment-face"}], ["marginalia-number", "number", {"inherit": "font-lock-constant-face"}], ["marginalia-off", "off", {"inherit": "error"}], ["marginalia-on", "on", {"inherit": "success"}], ["marginalia-size", "size", {"inherit": "marginalia-number"}], ["marginalia-string", "string", {"inherit": "font-lock-string-face"}], ["marginalia-symbol", "symbol", {"inherit": "font-lock-type-face"}], ["marginalia-true", "true", {"inherit": "font-lock-builtin-face"}], ["marginalia-type", "type", {"inherit": "marginalia-key"}], ["marginalia-value", "value", {"inherit": "marginalia-key"}], ["marginalia-version", "version", {"inherit": "marginalia-number"}]]}, "markdown-mode": {"label": "markdown-mode", "preview": "markdown", "faces": [["markdown-blockquote-face", "markdown blockquote", {"inherit": "font-lock-doc-face"}], ["markdown-bold-face", "markdown bold", {"inherit": "bold"}], ["markdown-code-face", "markdown code", {"inherit": "fixed-pitch"}], ["markdown-comment-face", "markdown comment", {"inherit": "font-lock-comment-face"}], ["markdown-footnote-marker-face", "markdown footnote marker", {"inherit": "markdown-markup-face"}], ["markdown-footnote-text-face", "markdown footnote text", {"inherit": "font-lock-comment-face"}], ["markdown-gfm-checkbox-face", "markdown gfm checkbox", {"inherit": "font-lock-builtin-face"}], ["markdown-header-delimiter-face", "markdown header delimiter", {"inherit": "markdown-markup-face"}], ["markdown-header-face", "markdown header", {"bold": true, "inherit": ["font-lock-function-name-face"]}], ["markdown-header-face-1", "markdown header 1", {"inherit": "markdown-header-face"}], ["markdown-header-face-2", "markdown header 2", {"inherit": "markdown-header-face"}], ["markdown-header-face-3", "markdown header 3", {"inherit": "markdown-header-face"}], ["markdown-header-face-4", "markdown header 4", {"inherit": "markdown-header-face"}], ["markdown-header-face-5", "markdown header 5", {"inherit": "markdown-header-face"}], ["markdown-header-face-6", "markdown header 6", {"inherit": "markdown-header-face"}], ["markdown-header-rule-face", "markdown header rule", {"inherit": "markdown-markup-face"}], ["markdown-highlight-face", "markdown highlight", {"inherit": "highlight"}], ["markdown-highlighting-face", "markdown highlighting", {"fg": "#000000", "bg": "#ffff00"}], ["markdown-hr-face", "markdown hr", {"inherit": "markdown-markup-face"}], ["markdown-html-attr-name-face", "markdown html attr name", {"inherit": "font-lock-variable-name-face"}], ["markdown-html-attr-value-face", "markdown html attr value", {"inherit": "font-lock-string-face"}], ["markdown-html-entity-face", "markdown html entity", {"inherit": "font-lock-variable-name-face"}], ["markdown-html-tag-delimiter-face", "markdown html tag delimiter", {"inherit": "markdown-markup-face"}], ["markdown-html-tag-name-face", "markdown html tag name", {"inherit": "font-lock-type-face"}], ["markdown-inline-code-face", "markdown inline code", {"inherit": ["markdown-code-face", "font-lock-constant-face"]}], ["markdown-italic-face", "markdown italic", {"inherit": "italic"}], ["markdown-language-info-face", "markdown language info", {"inherit": "font-lock-string-face"}], ["markdown-language-keyword-face", "markdown language keyword", {"inherit": "font-lock-type-face"}], ["markdown-line-break-face", "markdown line break", {"underline": true, "inherit": "font-lock-constant-face"}], ["markdown-link-face", "markdown link", {"inherit": "link"}], ["markdown-link-title-face", "markdown link title", {"inherit": "font-lock-comment-face"}], ["markdown-list-face", "markdown list", {"inherit": "markdown-markup-face"}], ["markdown-markup-face", "markdown markup", {"inherit": "shadow"}], ["markdown-math-face", "markdown math", {"inherit": "font-lock-string-face"}], ["markdown-metadata-key-face", "markdown metadata key", {"inherit": "font-lock-variable-name-face"}], ["markdown-metadata-value-face", "markdown metadata value", {"inherit": "font-lock-string-face"}], ["markdown-missing-link-face", "markdown missing link", {"inherit": "font-lock-warning-face"}], ["markdown-plain-url-face", "markdown plain url", {"inherit": "markdown-link-face"}], ["markdown-pre-face", "markdown pre", {"inherit": ["markdown-code-face", "font-lock-constant-face"]}], ["markdown-reference-face", "markdown reference", {"inherit": "markdown-markup-face"}], ["markdown-strike-through-face", "markdown strike through", {"strike": true}], ["markdown-table-face", "markdown table", {"inherit": ["markdown-code-face"]}], ["markdown-url-face", "markdown url", {"inherit": "font-lock-string-face"}]]}, "nerd-icons": {"label": "nerd-icons", "preview": "generic", "faces": [["nerd-icons-blue", "blue", {"fg": "#6a9fb5"}], ["nerd-icons-blue-alt", "blue alt", {"fg": "#2188b6"}], ["nerd-icons-cyan", "cyan", {"fg": "#75b5aa"}], ["nerd-icons-cyan-alt", "cyan alt", {"fg": "#0595bd"}], ["nerd-icons-dblue", "dblue", {"fg": "#446674"}], ["nerd-icons-dcyan", "dcyan", {"fg": "#48746d"}], ["nerd-icons-dgreen", "dgreen", {"fg": "#6d8143"}], ["nerd-icons-dmaroon", "dmaroon", {"fg": "#72584b"}], ["nerd-icons-dorange", "dorange", {"fg": "#915b2d"}], ["nerd-icons-dpink", "dpink", {"fg": "#7e5d5f"}], ["nerd-icons-dpurple", "dpurple", {"fg": "#694863"}], ["nerd-icons-dred", "dred", {"fg": "#843031"}], ["nerd-icons-dsilver", "dsilver", {"fg": "#838484"}], ["nerd-icons-dyellow", "dyellow", {"fg": "#b48d56"}], ["nerd-icons-green", "green", {"fg": "#90a959"}], ["nerd-icons-lblue", "lblue", {"fg": "#677174"}], ["nerd-icons-lcyan", "lcyan", {"fg": "#2c7d6e"}], ["nerd-icons-lgreen", "lgreen", {"fg": "#3d6837"}], ["nerd-icons-lmaroon", "lmaroon", {"fg": "#ce7a4e"}], ["nerd-icons-lorange", "lorange", {"fg": "#ffa500"}], ["nerd-icons-lpink", "lpink", {"fg": "#ff505b"}], ["nerd-icons-lpurple", "lpurple", {"fg": "#e69dd6"}], ["nerd-icons-lred", "lred", {"fg": "#eb595a"}], ["nerd-icons-lsilver", "lsilver", {"fg": "#7f7869"}], ["nerd-icons-lyellow", "lyellow", {"fg": "#ff9300"}], ["nerd-icons-maroon", "maroon", {"fg": "#8f5536"}], ["nerd-icons-orange", "orange", {"fg": "#d4843e"}], ["nerd-icons-pink", "pink", {"fg": "#fc505b"}], ["nerd-icons-purple", "purple", {"fg": "#68295b"}], ["nerd-icons-purple-alt", "purple alt", {"fg": "#5d54e1"}], ["nerd-icons-red", "red", {"fg": "#ac4142"}], ["nerd-icons-red-alt", "red alt", {"fg": "#843031"}], ["nerd-icons-silver", "silver", {"fg": "#716e68"}], ["nerd-icons-yellow", "yellow", {"fg": "#ffcc0e"}]]}, "nerd-icons-completion": {"label": "nerd-icons-completion", "preview": "generic", "faces": [["nerd-icons-completion-dir-face", "dir", {}]]}, "orderless": {"label": "orderless", "preview": "generic", "faces": [["orderless-match-face-0", "match 0", {"fg": "#223fbf", "bold": true}], ["orderless-match-face-1", "match 1", {"fg": "#8f0075", "bold": true}], ["orderless-match-face-2", "match 2", {"fg": "#145a00", "bold": true}], ["orderless-match-face-3", "match 3", {"fg": "#804000", "bold": true}]]}, "org-roam": {"label": "org-roam", "preview": "generic", "faces": [["org-roam-dailies-calendar-note", "dailies calendar note", {}], ["org-roam-dim", "dim", {}], ["org-roam-header-line", "header line", {}], ["org-roam-olp", "olp", {}], ["org-roam-preview-heading", "preview heading", {}], ["org-roam-preview-heading-highlight", "preview heading highlight", {}], ["org-roam-preview-heading-selection", "preview heading selection", {}], ["org-roam-preview-region", "preview region", {}], ["org-roam-title", "title", {}]]}, "org-superstar": {"label": "org-superstar", "preview": "generic", "faces": [["org-superstar-first", "first", {"inherit": "org-warning"}], ["org-superstar-header-bullet", "header bullet", {}], ["org-superstar-item", "item", {"inherit": "default"}], ["org-superstar-leading", "leading", {"fg": "#bebebe", "inherit": "default"}]]}, "prescient": {"label": "prescient", "preview": "generic", "faces": [["prescient-primary-highlight", "primary highlight", {"bold": true}], ["prescient-secondary-highlight", "secondary highlight", {"underline": true, "inherit": "prescient-primary-highlight"}]]}, "rainbow-delimiters": {"label": "rainbow-delimiters", "preview": "generic", "faces": [["rainbow-delimiters-base-error-face", "base error", {"fg": "#88090b", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-base-face", "base", {"inherit": "unspecified"}], ["rainbow-delimiters-depth-1-face", "depth 1", {"fg": "#707183", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-2-face", "depth 2", {"fg": "#7388d6", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-3-face", "depth 3", {"fg": "#909183", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-4-face", "depth 4", {"fg": "#709870", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-5-face", "depth 5", {"fg": "#907373", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-6-face", "depth 6", {"fg": "#6276ba", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-7-face", "depth 7", {"fg": "#858580", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-8-face", "depth 8", {"fg": "#80a880", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-9-face", "depth 9", {"fg": "#887070", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-mismatched-face", "mismatched", {"inherit": "rainbow-delimiters-unmatched-face"}], ["rainbow-delimiters-unmatched-face", "unmatched", {"inherit": "rainbow-delimiters-base-error-face"}]]}, "symbol-overlay": {"label": "symbol-overlay", "preview": "generic", "faces": [["symbol-overlay-default-face", "default", {"inherit": "highlight"}], ["symbol-overlay-face-1", "face 1", {"fg": "#000000", "bg": "#1e90ff"}], ["symbol-overlay-face-2", "face 2", {"fg": "#000000", "bg": "#ff69b4"}], ["symbol-overlay-face-3", "face 3", {"fg": "#000000", "bg": "#ffff00"}], ["symbol-overlay-face-4", "face 4", {"fg": "#000000", "bg": "#da70d6"}], ["symbol-overlay-face-5", "face 5", {"fg": "#000000", "bg": "#ff0000"}], ["symbol-overlay-face-6", "face 6", {"fg": "#000000", "bg": "#fa8072"}], ["symbol-overlay-face-7", "face 7", {"fg": "#000000", "bg": "#00ff7f"}], ["symbol-overlay-face-8", "face 8", {"fg": "#000000", "bg": "#40e0d0"}]]}, "tmr": {"label": "tmr", "preview": "generic", "faces": [["tmr-description", "description", {"inherit": "bold"}], ["tmr-duration", "duration", {}], ["tmr-end-time", "end time", {"inherit": "error"}], ["tmr-finished", "finished", {"inherit": "error"}], ["tmr-is-acknowledged", "is acknowledged", {"inherit": "success"}], ["tmr-must-be-acknowledged", "must be acknowledged", {"inherit": "warning"}], ["tmr-start-time", "start time", {"inherit": "success"}], ["tmr-tabulated-acknowledgement", "tabulated acknowledgement", {"inherit": "bold"}], ["tmr-tabulated-description", "tabulated description", {"inherit": "font-lock-doc-face"}], ["tmr-tabulated-end-time", "tabulated end time", {"fg": "#800040"}], ["tmr-tabulated-remaining-time", "tabulated remaining time", {"fg": "#603f00"}], ["tmr-tabulated-start-time", "tabulated start time", {"fg": "#004476"}]]}, "transient": {"label": "transient", "preview": "generic", "faces": [["transient-active-infix", "active infix", {"inherit": "highlight"}], ["transient-argument", "argument", {"bold": true, "inherit": "font-lock-string-face"}], ["transient-delimiter", "delimiter", {"inherit": "shadow"}], ["transient-disabled-suffix", "disabled suffix", {"fg": "#000000", "bg": "#ff0000", "bold": true}], ["transient-enabled-suffix", "enabled suffix", {"fg": "#000000", "bg": "#00ff00", "bold": true}], ["transient-heading", "heading", {"inherit": "font-lock-keyword-face"}], ["transient-higher-level", "higher level", {"box": {"style": "line", "width": 1, "color": "grey60"}}], ["transient-inactive-argument", "inactive argument", {"inherit": "shadow"}], ["transient-inactive-value", "inactive value", {"inherit": "shadow"}], ["transient-inapt-argument", "inapt argument", {"bold": true, "inherit": "shadow"}], ["transient-inapt-suffix", "inapt suffix", {"italic": true, "inherit": "shadow"}], ["transient-key", "key", {"inherit": "font-lock-builtin-face"}], ["transient-key-exit", "key exit", {"fg": "#aa2222", "inherit": "transient-key"}], ["transient-key-noop", "key noop", {"fg": "#cccccc", "inherit": "transient-key"}], ["transient-key-recurse", "key recurse", {"fg": "#2266ff", "inherit": "transient-key"}], ["transient-key-return", "key return", {"fg": "#aaaa11", "inherit": "transient-key"}], ["transient-key-stack", "key stack", {"fg": "#dd4488", "inherit": "transient-key"}], ["transient-key-stay", "key stay", {"fg": "#22aa22", "inherit": "transient-key"}], ["transient-mismatched-key", "mismatched key", {"box": {"style": "line", "width": 1, "color": "#ff00ff"}}], ["transient-nonstandard-key", "nonstandard key", {"box": {"style": "line", "width": 1, "color": "#00ffff"}}], ["transient-unreachable", "unreachable", {"inherit": "shadow"}], ["transient-unreachable-key", "unreachable key", {"inherit": ["shadow", "transient-key"]}], ["transient-value", "value", {"bold": true, "inherit": "font-lock-string-face"}]]}, "vertico": {"label": "vertico", "preview": "generic", "faces": [["vertico-current", "current", {"inherit": "highlight"}], ["vertico-group-separator", "group separator", {"strike": true, "inherit": "vertico-group-title"}], ["vertico-group-title", "group title", {"italic": true, "inherit": "shadow"}], ["vertico-multiline", "multiline", {"inherit": "shadow"}]]}, "web-mode": {"label": "web-mode", "preview": "generic", "faces": [["web-mode-annotation-face", "annotation", {"inherit": "web-mode-comment-face"}], ["web-mode-annotation-html-face", "annotation html", {"italic": true, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-tag-face", "annotation tag", {"underline": true, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-type-face", "annotation type", {"bold": true, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-value-face", "annotation value", {"italic": true, "inherit": "web-mode-annotation-face"}], ["web-mode-block-attr-name-face", "block attr name", {"fg": "#8fbc8f"}], ["web-mode-block-attr-value-face", "block attr value", {"fg": "#5f9ea0"}], ["web-mode-block-comment-face", "block comment", {"inherit": "web-mode-comment-face"}], ["web-mode-block-control-face", "block control", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-block-delimiter-face", "block delimiter", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-block-face", "block", {"bg": "#ffffe0"}], ["web-mode-block-string-face", "block string", {"inherit": "web-mode-string-face"}], ["web-mode-bold-face", "bold", {"bold": true}], ["web-mode-builtin-face", "builtin", {"inherit": "font-lock-builtin-face"}], ["web-mode-comment-face", "comment", {"inherit": "font-lock-comment-face"}], ["web-mode-comment-keyword-face", "comment keyword", {"bold": true}], ["web-mode-constant-face", "constant", {"inherit": "font-lock-constant-face"}], ["web-mode-css-at-rule-face", "css at rule", {"inherit": "font-lock-constant-face"}], ["web-mode-css-color-face", "css color", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-comment-face", "css comment", {"inherit": "web-mode-comment-face"}], ["web-mode-css-function-face", "css function", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-priority-face", "css priority", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-property-name-face", "css property name", {"inherit": "font-lock-variable-name-face"}], ["web-mode-css-pseudo-class-face", "css pseudo class", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-selector-class-face", "css selector class", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-selector-face", "css selector", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-selector-tag-face", "css selector tag", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-string-face", "css string", {"inherit": "web-mode-string-face"}], ["web-mode-css-variable-face", "css variable", {"italic": true, "inherit": "web-mode-variable-name-face"}], ["web-mode-current-column-highlight-face", "current column highlight", {"bg": "#3e3c36"}], ["web-mode-current-element-highlight-face", "current element highlight", {"fg": "#ffffff", "bg": "#000000"}], ["web-mode-doctype-face", "doctype", {"fg": "#bebebe"}], ["web-mode-error-face", "error", {"bg": "#ff0000"}], ["web-mode-filter-face", "filter", {"inherit": "font-lock-function-name-face"}], ["web-mode-folded-face", "folded", {"underline": true}], ["web-mode-function-call-face", "function call", {"inherit": "font-lock-function-name-face"}], ["web-mode-function-name-face", "function name", {"inherit": "font-lock-function-name-face"}], ["web-mode-html-attr-custom-face", "html attr custom", {"inherit": "web-mode-html-attr-name-face"}], ["web-mode-html-attr-engine-face", "html attr engine", {"inherit": "web-mode-block-delimiter-face"}], ["web-mode-html-attr-equal-face", "html attr equal", {"inherit": "web-mode-html-attr-name-face"}], ["web-mode-html-attr-name-face", "html attr name", {"fg": "#8b8989"}], ["web-mode-html-attr-value-face", "html attr value", {"inherit": "font-lock-string-face"}], ["web-mode-html-entity-face", "html entity", {"italic": true}], ["web-mode-html-tag-bracket-face", "html tag bracket", {"fg": "#242424"}], ["web-mode-html-tag-custom-face", "html tag custom", {"inherit": "web-mode-html-tag-face"}], ["web-mode-html-tag-face", "html tag", {"fg": "#8b8989"}], ["web-mode-html-tag-namespaced-face", "html tag namespaced", {"inherit": "web-mode-block-control-face"}], ["web-mode-html-tag-unclosed-face", "html tag unclosed", {"underline": true, "inherit": "web-mode-html-tag-face"}], ["web-mode-inlay-face", "inlay", {"bg": "#ffffe0"}], ["web-mode-interpolate-color1-face", "interpolate color1", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color2-face", "interpolate color2", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color3-face", "interpolate color3", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color4-face", "interpolate color4", {"inherit": "web-mode-string-face"}], ["web-mode-italic-face", "italic", {"italic": true}], ["web-mode-javascript-comment-face", "javascript comment", {"inherit": "web-mode-comment-face"}], ["web-mode-javascript-string-face", "javascript string", {"inherit": "web-mode-string-face"}], ["web-mode-json-comment-face", "json comment", {"inherit": "web-mode-comment-face"}], ["web-mode-json-context-face", "json context", {"fg": "#cd69c9"}], ["web-mode-json-key-face", "json key", {"fg": "#dda0dd"}], ["web-mode-json-string-face", "json string", {"inherit": "web-mode-string-face"}], ["web-mode-jsx-depth-1-face", "jsx depth 1", {"bg": "#000053"}], ["web-mode-jsx-depth-2-face", "jsx depth 2", {"bg": "#001970"}], ["web-mode-jsx-depth-3-face", "jsx depth 3", {"bg": "#002984"}], ["web-mode-jsx-depth-4-face", "jsx depth 4", {"bg": "#49599a"}], ["web-mode-jsx-depth-5-face", "jsx depth 5", {"bg": "#9499b7"}], ["web-mode-keyword-face", "keyword", {"inherit": "font-lock-keyword-face"}], ["web-mode-param-name-face", "param name", {"fg": "#cdc9c9"}], ["web-mode-part-comment-face", "part comment", {"inherit": "web-mode-comment-face"}], ["web-mode-part-face", "part", {"inherit": "web-mode-block-face"}], ["web-mode-part-string-face", "part string", {"inherit": "web-mode-string-face"}], ["web-mode-preprocessor-face", "preprocessor", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-script-face", "script", {"inherit": "web-mode-part-face"}], ["web-mode-sql-keyword-face", "sql keyword", {"bold": true, "italic": true}], ["web-mode-string-face", "string", {"inherit": "font-lock-string-face"}], ["web-mode-style-face", "style", {"inherit": "web-mode-part-face"}], ["web-mode-symbol-face", "symbol", {"fg": "#eeb422"}], ["web-mode-type-face", "type", {"inherit": "font-lock-type-face"}], ["web-mode-underline-face", "underline", {"underline": true}], ["web-mode-variable-name-face", "variable name", {"inherit": "font-lock-variable-name-face"}], ["web-mode-warning-face", "warning", {"inherit": "font-lock-warning-face"}], ["web-mode-whitespace-face", "whitespace", {"bg": "#68228b"}]]}, "yasnippet": {"label": "yasnippet", "preview": "generic", "faces": [["yas--field-debug-face", "yas field debug", {}], ["yas-field-highlight-face", "yas field highlight", {"inherit": "region"}]]}}; +const SAMPLES={"Elisp": [[["cmd", ";;"], ["cm", " cache.el"]], [["punc", "("], ["kw", "require"], ["p", " "], ["con", "'cl-lib"], ["punc", ")"]], [], [["punc", "("], ["kw", "defvar"], ["p", " "], ["var", "cache--tbl"], ["p", " "], ["punc", "("], ["fnc", "make-hash-table"], ["p", " "], ["con", ":test"], ["p", " "], ["con", "'equal"], ["punc", "))"]], [["p", " "], ["doc", "\"Memo table.\")"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-get"], ["p", " "], ["punc", "("], ["var", "key"], ["punc", ")"]], [["p", " "], ["doc", "\"Return cached value for KEY.\""]], [["p", " "], ["punc", "("], ["kw", "or"], ["p", " "], ["punc", "("], ["bi", "gethash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "v"], ["p", " "], ["punc", "("], ["fnc", "compute"], ["p", " "], ["var", "key"], ["p", " "], ["num", "42"], ["punc", "))) "]], [["p", " "], ["punc", "("], ["fnc", "puthash"], ["p", " "], ["var", "key"], ["p", " "], ["var", "v"], ["p", " "], ["var", "cache--tbl"], ["punc", ") "], ["var", "v"], ["punc", "))))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-clear"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Empty the memo table.\""]], [["p", " "], ["punc", "("], ["kw", "interactive"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "clrhash"], ["p", " "], ["var", "cache--tbl"], ["punc", ")"]], [["p", " "], ["punc", "("], ["fnc", "message"], ["p", " "], ["str", "\"cleared"], ["esc", "\\n"], ["str", "\""], ["punc", "))"]], [], [["punc", "("], ["kw", "defun"], ["p", " "], ["fnd", "cache-keys"], ["p", " "], ["punc", "()"]], [["p", " "], ["doc", "\"Return all keys.\""]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["punc", "(("], ["var", "acc"], ["p", " "], ["con", "nil"], ["punc", "))"]], [["p", " "], ["punc", "("], ["fnc", "maphash"], ["p", " "], ["punc", "("], ["kw", "lambda"], ["p", " "], ["punc", "("], ["var", "k"], ["p", " "], ["var", "_v"], ["punc", ")"], ["p", " "], ["punc", "("], ["fnc", "push"], ["p", " "], ["var", "k"], ["p", " "], ["var", "acc"], ["punc", "))"]], [["p", " "], ["var", "cache--tbl"], ["punc", ")"], ["p", " "], ["var", "acc"], ["punc", "))"]], [], [["punc", "("], ["kw", "provide"], ["p", " "], ["con", "'cache"], ["punc", ")"]]], "Go": [[["cmd", "//"], ["cm", " queue.go"]], [["kw", "package"], ["p", " "], ["var", "main"]], [], [["kw", "import"], ["p", " "], ["str", "\"fmt\""]], [], [["kw", "const"], ["p", " "], ["con", "MaxItems"], ["p", " "], ["op", "="], ["p", " "], ["num", "100"]], [], [["kw", "type"], ["p", " "], ["ty", "Order"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "ID"], ["p", " "], ["ty", "int"]], [["p", " "], ["prop", "Name"], ["p", " "], ["ty", "string"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["punc", "("], ["var", "q"], ["p", " "], ["op", "*"], ["ty", "Queue"], ["punc", ")"], ["p", " "], ["fnd", "Push"], ["punc", "("], ["var", "o"], ["p", " "], ["op", "*"], ["ty", "Order"], ["punc", ")"], ["p", " "], ["ty", "error"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " reject nil"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "nil"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["p", " "], ["fnc", "fmt.Errorf"], ["punc", "("], ["str", "\"nil"], ["esc", "\\n"], ["str", "\""], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["p", " "], ["var", "q"], ["op", "."], ["prop", "items"], ["p", " "], ["op", "="], ["p", " "], ["bi", "append"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "items"], ["punc", ","], ["p", " "], ["var", "o"], ["punc", ")"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "nil"]], [["punc", "}"]], [], [["kw", "func"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["fnc", "fmt.Println"], ["punc", "("], ["op", "&"], ["ty", "Queue"], ["punc", "{}"], ["punc", ")"]], [["punc", "}"]]], "Python": [[["cmd", "#"], ["cm", " theme.py"]], [["kw", "from"], ["p", " "], ["var", "dataclasses"], ["p", " "], ["kw", "import"], ["p", " "], ["var", "dataclass"], ["punc", ","], ["p", " "], ["var", "field"]], [], [["con", "DEFAULT_PORT"], ["op", ":"], ["p", " "], ["ty", "int"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"]], [["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["var", "re"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "r\"#[0-9a-f]{6}\""], ["punc", ")"]], [], [["dec", "@dataclass"]], [["kw", "class"], ["p", " "], ["ty", "Theme"], ["op", ":"]], [["p", " "], ["doc", "\"\"\"A color theme.\"\"\""]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "dict"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "field"], ["punc", "("], ["prop", "default_factory"], ["op", "="], ["ty", "dict"], ["punc", ")"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "|"], ["p", " "], ["con", "None"], ["op", ":"]], [["p", " "], ["cmd", "#"], ["cm", " fallback to none"]], [["p", " "], ["var", "v"], ["p", " "], ["op", "="], ["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "get"], ["punc", "("], ["var", "key"], ["punc", ","], ["p", " "], ["str", "\""], ["esc", "\\t"], ["str", "none\""], ["punc", ")"]], [["p", " "], ["kw", "if"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "v"], ["punc", ")"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"], ["op", ":"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "v"]], [], [["p", " "], ["dec", "@property"]], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "size"], ["punc", "("], ["var", "self"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "int"], ["op", ":"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "len"], ["punc", "("], ["var", "self"], ["op", "."], ["prop", "colors"], ["punc", ")"]], [], [["var", "theme"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["punc", "("], ["str", "\"dupre\""], ["punc", ")"]], [["fnc", "print"], ["punc", "("], ["var", "theme"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"]]], "TypeScript": [[["cmd", "//"], ["cm", " orders.ts"]], [["kw", "import"], ["p", " "], ["punc", "{"], ["p", " "], ["ty", "Order"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "from"], ["p", " "], ["str", "\"./types\""]], [], [["kw", "export"], ["p", " "], ["kw", "interface"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "max"], ["op", ":"], ["p", " "], ["ty", "number"], ["punc", ";"]], [["p", " "], ["prop", "items"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", "[];"]], [["punc", "}"]], [], [["dec", "@Injectable"], ["punc", "()"]], [["kw", "export"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "OrderQueue"], ["p", " "], ["kw", "implements"], ["p", " "], ["ty", "Queue"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["prop", "re"], ["p", " "], ["op", "="], ["p", " "], ["re", "/^#[0-9a-f]{6}$/i"], ["punc", ";"]], [], [["p", " "], ["fnd", "push"], ["punc", "("], ["var", "o"], ["op", ":"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "boolean"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "==="], ["p", " "], ["con", "null"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "false"], ["punc", ";"]], [["p", " "], ["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["str", "`id "], ["punc", "${"], ["var", "o"], ["op", "."], ["prop", "id"], ["punc", "}"], ["esc", "\\n"], ["str", "`"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "true"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "const"], ["p", " "], ["con", "LIMIT"], ["op", ":"], ["p", " "], ["ty", "number"], ["p", " "], ["op", "="], ["p", " "], ["num", "50"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "q"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "OrderQueue"], ["punc", "()"], ["punc", ";"]], [["var", "q"], ["op", "."], ["fnd", "push"], ["punc", "("], ["punc", "{"], ["p", " "], ["prop", "id"], ["op", ":"], ["p", " "], ["num", "1"], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "as"], ["p", " "], ["ty", "Order"], ["punc", ")"], ["punc", ";"]], [["var", "console"], ["op", "."], ["fnc", "log"], ["punc", "("], ["var", "q"], ["op", "."], ["prop", "max"], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["var", "cap"], ["p", " "], ["op", "="], ["p", " "], ["var", "Math"], ["op", "."], ["bi", "max"], ["punc", "("], ["con", "LIMIT"], ["punc", ","], ["p", " "], ["num", "0"], ["punc", ")"], ["punc", ";"]]], "Java": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["kw", "package"], ["p", " "], ["var", "com"], ["op", "."], ["var", "dupre"], ["punc", ";"]], [["kw", "import"], ["p", " "], ["var", "java"], ["op", "."], ["var", "util"], ["op", "."], ["var", "regex"], ["op", "."], ["ty", "Pattern"], ["punc", ";"]], [], [["dec", "@Deprecated"]], [["kw", "public"], ["p", " "], ["kw", "final"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["op", "="], ["p", " "], ["num", "8080"], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "String"], ["p", " "], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "static"], ["p", " "], ["kw", "final"], ["p", " "], ["ty", "Pattern"], ["p", " "], ["con", "HEX"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Pattern"], ["op", "."], ["fnc", "compile"], ["punc", "("], ["re", "\"#[0-9a-f]{6}\""], ["punc", ")"], ["punc", ";"]], [], [["p", " "], ["dec", "@Override"]], [["p", " "], ["kw", "public"], ["p", " "], ["ty", "String"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["ty", "String"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " fall back to null"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "isEmpty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "null"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "strip"], ["punc", "("], ["punc", ")"], ["op", "+"], ["str", "\""], ["esc", "\\t"], ["str", "\""], ["punc", ";"]], [["p", " "], ["punc", "}"]], [], [["p", " "], ["kw", "public"], ["p", " "], ["kw", "static"], ["p", " "], ["ty", "void"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "String"], ["punc", "[]"], ["p", " "], ["var", "args"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "var"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["kw", "new"], ["p", " "], ["ty", "Theme"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["ty", "System"], ["op", "."], ["prop", "out"], ["op", "."], ["fnc", "println"], ["punc", "("], ["var", "t"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]]], "C": [[["cmd", "/**"], ["doc", " Order queue. */"]], [["pp", "#include"], ["p", " "], ["str", "<stdio.h>"]], [["pp", "#include"], ["p", " "], ["str", "<stdlib.h>"]], [["pp", "#define"], ["p", " "], ["con", "MAX_PORT"], ["p", " "], ["num", "8080"]], [], [["kw", "typedef"], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "int"], ["p", " "], ["prop", "id"], ["punc", ";"]], [["p", " "], ["kw", "const"], ["p", " "], ["ty", "char"], ["p", " "], ["op", "*"], ["prop", "name"], ["punc", ";"]], [["punc", "}"], ["p", " "], ["ty", "Order"], ["punc", ";"]], [], [["cmd", "//"], ["cm", " returns -1 on null input"]], [["ty", "int"], ["p", " "], ["fnd", "push"], ["punc", "("], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "o"], ["punc", ")"], ["p", " "], ["dec", "__attribute__"], ["punc", "(("], ["dec", "nonnull"], ["punc", "))"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "o"], ["p", " "], ["op", "=="], ["p", " "], ["con", "NULL"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["num", "-1"], ["punc", ";"]], [["p", " "], ["fnc", "printf"], ["punc", "("], ["str", "\"id=%d"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "o"], ["op", "->"], ["prop", "id"], ["punc", ");"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "("], ["ty", "void"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["ty", "Order"], ["p", " "], ["var", "o"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"], ["p", " "], ["op", "."], ["prop", "id"], ["p", " "], ["op", "="], ["p", " "], ["num", "1"], ["punc", ","], ["p", " "], ["op", "."], ["prop", "name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["ty", "Order"], ["p", " "], ["op", "*"], ["var", "p2"], ["p", " "], ["op", "="], ["p", " "], ["bi", "malloc"], ["punc", "("], ["bi", "sizeof"], ["punc", "("], ["ty", "Order"], ["punc", "))"], ["punc", ";"]], [["p", " "], ["fnc", "push"], ["punc", "("], ["op", "&"], ["var", "o"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["bi", "free"], ["punc", "("], ["var", "p2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "C++": [[["cmd", "/**"], ["doc", " A color theme. */"]], [["pp", "#include"], ["p", " "], ["str", "<string>"]], [["pp", "#include"], ["p", " "], ["str", "<regex>"]], [["pp", "#pragma"], ["p", " "], ["pp", "once"]], [], [["kw", "namespace"], ["p", " "], ["var", "dupre"], ["p", " "], ["punc", "{"]], [], [["kw", "template"], ["op", "<"], ["kw", "typename"], ["p", " "], ["ty", "T"], ["op", ">"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Theme"], ["p", " "], ["punc", "{"]], [["kw", "public"], ["op", ":"]], [["p", " "], ["kw", "static"], ["p", " "], ["kw", "constexpr"], ["p", " "], ["ty", "int"], ["p", " "], ["con", "MAX"], ["p", " "], ["op", "="], ["p", " "], ["num", "0x20"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["p", " "], ["prop", "name_"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [], [["p", " "], ["dec", "[[nodiscard]]"], ["p", " "], ["ty", "T"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["kw", "const"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "string"], ["op", "&"], ["p", " "], ["var", "key"], ["punc", ")"], ["p", " "], ["kw", "const"], ["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "//"], ["cm", " validate against a hex pattern"]], [["p", " "], ["kw", "static"], ["p", " "], ["ty", "std"], ["op", "::"], ["ty", "regex"], ["p", " "], ["var", "re"], ["punc", "("], ["re", "R\"(#[0-9a-f]{6})\""], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "key"], ["op", "."], ["fnc", "empty"], ["punc", "()"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "nullptr"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["ty", "T"], ["punc", "{"], ["var", "key"], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["ty", "int"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "auto"], ["p", " "], ["var", "t"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Theme"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "{}"], ["punc", ";"]], [["p", " "], ["bi", "static_cast"], ["op", "<"], ["ty", "int"], ["op", ">"], ["punc", "("], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "size"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["ty", "std"], ["op", "::"], ["fnc", "printf"], ["punc", "("], ["str", "\"%s"], ["esc", "\\n"], ["str", "\""], ["punc", ","], ["p", " "], ["var", "t"], ["op", "."], ["prop", "name_"], ["op", "."], ["fnc", "c_str"], ["punc", "())"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0"], ["punc", ";"]], [["punc", "}"]]], "Rust": [[["cmd", "//"], ["cm", " theme.rs"]], [["dec", "#![allow(dead_code)]"]], [["kw", "use"], ["p", " "], ["var", "std"], ["op", "::"], ["var", "fmt"], ["punc", ";"]], [], [["dec", "#[derive"], ["punc", "("], ["dec", "Debug"], ["punc", ","], ["p", " "], ["dec", "Clone"], ["punc", ")]"]], [["kw", "pub"], ["p", " "], ["kw", "trait"], ["p", " "], ["ty", "Theme"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["con", "NAME"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'static"], ["p", " "], ["ty", "str"], ["punc", ";"]], [["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Option"], ["op", "<"], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["op", ">"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "pub"], ["p", " "], ["kw", "struct"], ["p", " "], ["ty", "Palette"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "pub"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ","]], [["p", " "], ["kw", "pub"], ["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["ty", "Vec"], ["op", "<"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ","], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["op", ">"], ["punc", ","]], [["punc", "}"]], [], [["kw", "impl"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["ty", "Theme"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["kw", "for"], ["p", " "], ["ty", "Palette"], ["op", "<"], ["var", "'a"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["con", "NAME"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'static"], ["p", " "], ["ty", "str"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ";"]], [["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["op", "&"], ["var", "'a"], ["p", " "], ["var", "self"], ["punc", ","], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Option"], ["op", "<"], ["op", "&"], ["var", "'a"], ["p", " "], ["ty", "str"], ["op", ">"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "key"], ["op", "."], ["fnc", "is_empty"], ["punc", "()"], ["p", " "], ["punc", "{"], ["p", " "], ["kw", "return"], ["p", " "], ["con", "None"], ["punc", ";"], ["p", " "], ["punc", "}"]], [["p", " "], ["var", "self"], ["op", "."], ["prop", "colors"], ["op", "."], ["fnc", "iter"], ["punc", "()"], ["op", "."], ["fnc", "find"], ["punc", "("], ["op", "|"], ["punc", "("], ["var", "k"], ["punc", ","], ["p", " "], ["var", "_"], ["punc", ")"], ["op", "|"], ["p", " "], ["op", "*"], ["var", "k"], ["p", " "], ["op", "=="], ["p", " "], ["var", "key"], ["punc", ")"], ["op", "."], ["fnc", "map"], ["punc", "("], ["op", "|"], ["punc", "("], ["var", "_"], ["punc", ","], ["p", " "], ["var", "v"], ["punc", ")"], ["op", "|"], ["p", " "], ["op", "*"], ["var", "v"], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "fn"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "let"], ["p", " "], ["var", "palette"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Palette"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["str", "\"dupre\""], ["punc", ","], ["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["bi", "vec!"], ["punc", "["], ["punc", "("], ["str", "\"bg\""], ["punc", ","], ["p", " "], ["str", "\"#0d0b0a\""], ["punc", ")"], ["punc", "]"], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["bi", "println!"], ["punc", "("], ["str", "\"{:?}\""], ["punc", ","], ["p", " "], ["var", "palette"], ["op", "."], ["fnc", "resolve"], ["punc", "("], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["punc", "}"]]], "Zig": [[["cmd", "//"], ["cm", " theme.zig"]], [["kw", "const"], ["p", " "], ["var", "std"], ["p", " "], ["op", "="], ["p", " "], ["bi", "@import"], ["punc", "("], ["str", "\"std\""], ["punc", ")"], ["punc", ";"]], [["kw", "const"], ["p", " "], ["ty", "Allocator"], ["p", " "], ["op", "="], ["p", " "], ["var", "std"], ["op", "."], ["var", "mem"], ["op", "."], ["ty", "Allocator"], ["punc", ";"]], [], [["kw", "pub"], ["p", " "], ["kw", "const"], ["p", " "], ["ty", "Theme"], ["p", " "], ["op", "="], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"]], [["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ","]], [["p", " "], ["prop", "colors"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "Color"], ["punc", ","]], [], [["p", " "], ["kw", "pub"], ["p", " "], ["kw", "fn"], ["p", " "], ["fnd", "init"], ["punc", "("], ["var", "alloc"], ["op", ":"], ["p", " "], ["op", "*"], ["ty", "Allocator"], ["punc", ")"], ["p", " "], ["op", "!"], ["bi", "@This"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "const"], ["p", " "], ["var", "colors"], ["p", " "], ["op", "="], ["p", " "], ["kw", "try"], ["p", " "], ["var", "alloc"], ["op", "."], ["fnc", "alloc"], ["punc", "("], ["ty", "Color"], ["punc", ","], ["p", " "], ["num", "2"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["var", "colors"], ["punc", "["], ["num", "0"], ["punc", "]"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Color"], ["punc", "{"], ["p", " "], ["prop", ".name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"bg\""], ["punc", ","], ["p", " "], ["prop", ".hex"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"#0d0b0a\""], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["bi", "@This"], ["punc", "()"], ["punc", "{"], ["p", " "], ["prop", ".name"], ["p", " "], ["op", "="], ["p", " "], ["str", "\"dupre\""], ["punc", ","], ["p", " "], ["prop", ".colors"], ["p", " "], ["op", "="], ["p", " "], ["var", "colors"], ["p", " "], ["punc", "}"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"], ["punc", ";"]], [], [["kw", "const"], ["p", " "], ["ty", "Color"], ["p", " "], ["op", "="], ["p", " "], ["kw", "struct"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ","], ["p", " "], ["prop", "hex"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["p", " "], ["punc", "}"], ["punc", ";"]], [], [["kw", "fn"], ["p", " "], ["fnd", "resolve"], ["punc", "("], ["var", "theme"], ["op", ":"], ["p", " "], ["ty", "Theme"], ["punc", ","], ["p", " "], ["kw", "comptime"], ["p", " "], ["var", "key"], ["op", ":"], ["p", " "], ["punc", "["], ["punc", ":"], ["num", "0"], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["punc", ")"], ["p", " "], ["op", "!"], ["punc", "["], ["punc", "]"], ["kw", "const"], ["p", " "], ["ty", "u8"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "inline"], ["p", " "], ["kw", "for"], ["p", " "], ["punc", "("], ["var", "theme"], ["op", "."], ["prop", "colors"], ["punc", ")"], ["p", " "], ["op", "|"], ["var", "color"], ["op", "|"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "std"], ["op", "."], ["var", "mem"], ["op", "."], ["fnc", "eql"], ["punc", "("], ["ty", "u8"], ["punc", ","], ["p", " "], ["var", "color"], ["op", "."], ["prop", "name"], ["punc", ","], ["p", " "], ["var", "key"], ["punc", ")"], ["punc", ")"], ["p", " "], ["kw", "return"], ["p", " "], ["var", "color"], ["op", "."], ["prop", "hex"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "error.MissingColor"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "test"], ["p", " "], ["str", "\"resolve bg\""], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "var"], ["p", " "], ["var", "arena"], ["p", " "], ["op", "="], ["p", " "], ["var", "std"], ["op", "."], ["var", "heap"], ["op", "."], ["ty", "ArenaAllocator"], ["op", "."], ["fnc", "init"], ["punc", "("], ["var", "std"], ["op", "."], ["var", "testing"], ["op", "."], ["prop", "allocator"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "defer"], ["p", " "], ["var", "arena"], ["op", "."], ["fnc", "deinit"], ["punc", "()"], ["punc", ";"]], [["p", " "], ["kw", "try"], ["p", " "], ["var", "std"], ["op", "."], ["var", "testing"], ["op", "."], ["fnc", "expectEqualStrings"], ["punc", "("], ["str", "\"#0d0b0a\""], ["punc", ","], ["p", " "], ["kw", "try"], ["p", " "], ["fnc", "resolve"], ["punc", "("], ["kw", "try"], ["p", " "], ["ty", "Theme"], ["op", "."], ["fnc", "init"], ["punc", "("], ["op", "&"], ["var", "arena"], ["op", "."], ["prop", "allocator"], ["punc", ")"], ["punc", ","], ["p", " "], ["str", "\"bg\""], ["punc", "))"], ["punc", ";"]], [["punc", "}"]]], "Shell": [[["cmd", "#!"], ["cm", "/bin/bash"]], [["cmd", "#"], ["cm", " deploy.sh"]], [["bi", "set"], ["p", " "], ["op", "-"], ["var", "euo"], ["p", " "], ["var", "pipefail"]], [], [["var", "PORT"], ["op", "="], ["num", "8080"]], [["var", "NAME"], ["op", "="], ["str", "\"dupre\""]], [], [["fnd", "deploy"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "local"], ["p", " "], ["var", "target"], ["op", "="], ["str", "\"$1\""]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "[["], ["p", " "], ["op", "-z"], ["p", " "], ["str", "\"$target\""], ["p", " "], ["punc", "]]"], ["punc", ";"], ["p", " "], ["kw", "then"]], [["p", " "], ["bi", "echo"], ["p", " "], ["str", "\"no target\""]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "fi"]], [["p", " "], ["fnc", "rsync"], ["p", " "], ["op", "-az"], ["p", " "], ["str", "\"$NAME\""], ["p", " "], ["str", "\"$target\""]], [["punc", "}"]], [], [["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "for"], ["p", " "], ["var", "host"], ["p", " "], ["kw", "in"], ["p", " "], ["str", "\"$@\""], ["punc", ";"], ["p", " "], ["kw", "do"]], [["p", " "], ["fnc", "deploy"], ["p", " "], ["str", "\"$host\""], ["p", " "], ["op", "||"], ["p", " "], ["bi", "exit"], ["p", " "], ["num", "1"]], [["p", " "], ["kw", "done"]], [["p", " "], ["bi", "echo"], ["p", " "], ["op", "-e"], ["p", " "], ["str", "\"all done"], ["esc", "\\n"], ["str", "\""]], [["punc", "}"]], [], [["fnc", "main"], ["p", " "], ["str", "\"$@\""]]], "Racket": [[["pp", "#lang"], ["p", " "], ["pp", "racket"]], [], [["cmd", ";;"], ["p", " "], ["cm", "Compute Fibonacci numbers with memoization"]], [["punc", "("], ["kw", "require"], ["p", " "], ["var", "racket/list"], ["punc", ")"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["punc", "("], ["fnd", "fib"], ["p", " "], ["var", "n"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "cond"], ["p", " "]], [["p", " "], ["punc", "[("], ["bi", "<"], ["p", " "], ["var", "n"], ["p", " "], ["num", "2"], ["punc", ")"], ["p", " "], ["var", "n"], ["punc", "]"]], [["p", " "], ["punc", "["], ["con", "else"], ["p", " "]], [["p", " "], ["punc", "("], ["bi", "+"], ["p", " "], ["punc", "("], ["fnc", "fib"], ["p", " "], ["punc", "("], ["bi", "-"], ["p", " "], ["var", "n"], ["p", " "], ["num", "1"], ["punc", "))"], ["p", " "]], [["p", " "], ["punc", "("], ["fnc", "fib"], ["p", " "], ["punc", "("], ["bi", "-"], ["p", " "], ["var", "n"], ["p", " "], ["num", "2"], ["punc", ")))])]"]], [], [["cmd", ";;"], ["p", " "], ["cm", "A point struct with two fields"]], [["punc", "("], ["kw", "struct"], ["p", " "], ["ty", "point"], ["p", " "], ["punc", "("], ["prop", "x"], ["p", " "], ["prop", "y"], ["punc", ")"], ["p", " "], ["con", "#:transparent"], ["punc", ")"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["var", "origin"], ["p", " "], ["punc", "("], ["fnc", "point"], ["p", " "], ["num", "0"], ["p", " "], ["num", "0"], ["punc", "))"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["var", "nums"], ["p", " "], ["punc", "("], ["kw", "quote"], ["p", " "], ["punc", "("], ["num", "1"], ["p", " "], ["num", "2"], ["p", " "], ["num", "3"], ["p", " "], ["num", "4"], ["p", " "], ["num", "5"], ["punc", "))"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["var", "squared"], ["p", " "]], [["p", " "], ["punc", "("], ["bi", "map"], ["p", " "], ["punc", "("], ["kw", "lambda"], ["p", " "], ["punc", "("], ["var", "x"], ["punc", ")"], ["p", " "], ["punc", "("], ["bi", "*"], ["p", " "], ["var", "x"], ["p", " "], ["var", "x"], ["punc", "))"], ["p", " "], ["var", "nums"], ["punc", "))"]], [], [["punc", "("], ["bi", "printf"], ["p", " "], ["str", "\"squares: ~a\\n\""], ["p", " "], ["var", "squared"], ["punc", ")"]], [["punc", "("], ["bi", "displayln"], ["p", " "], ["punc", "("], ["fnc", "first"], ["p", " "], ["var", "squared"], ["punc", "))"]]], "Scheme": [[["cmd", ";;"], ["p", " "], ["cm", "Tail-recursive factorial in Scheme"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["punc", "("], ["fnd", "factorial"], ["p", " "], ["var", "n"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "let"], ["p", " "], ["fnd", "loop"], ["p", " "], ["punc", "(["], ["var", "acc"], ["p", " "], ["num", "1"], ["punc", "]"], ["p", " "], ["punc", "["], ["var", "i"], ["p", " "], ["var", "n"], ["punc", "])"]], [["p", " "], ["punc", "("], ["kw", "if"], ["p", " "], ["punc", "("], ["bi", "="], ["p", " "], ["var", "i"], ["p", " "], ["num", "0"], ["punc", ")"]], [["p", " "], ["var", "acc"], ["p", " "]], [["p", " "], ["punc", "("], ["fnc", "loop"], ["p", " "], ["punc", "("], ["bi", "*"], ["p", " "], ["var", "acc"], ["p", " "], ["var", "i"], ["punc", ")"], ["p", " "], ["punc", "("], ["bi", "-"], ["p", " "], ["var", "i"], ["p", " "], ["num", "1"], ["punc", "))))"]], [], [["cmd", ";;"], ["p", " "], ["cm", "Higher-order map over a quoted list"]], [["punc", "("], ["kw", "define"], ["p", " "], ["var", "primes"], ["p", " "], ["punc", "("], ["kw", "quote"], ["p", " "], ["punc", "("], ["num", "2"], ["p", " "], ["num", "3"], ["p", " "], ["num", "5"], ["p", " "], ["num", "7"], ["p", " "], ["num", "11"], ["punc", "))"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["punc", "("], ["fnd", "double"], ["p", " "], ["var", "x"], ["punc", ")"]], [["p", " "], ["punc", "("], ["bi", "*"], ["p", " "], ["var", "x"], ["p", " "], ["num", "2"], ["punc", ")"]], [], [["punc", "("], ["kw", "define"], ["p", " "], ["var", "doubled"], ["p", " "], ["punc", "("], ["bi", "map"], ["p", " "], ["var", "double"], ["p", " "], ["var", "primes"], ["punc", "))"]], [], [["cmd", ";;"], ["p", " "], ["cm", "Predicate using cond and recursion"]], [["punc", "("], ["kw", "define"], ["p", " "], ["punc", "("], ["fnd", "member?"], ["p", " "], ["var", "x"], ["p", " "], ["var", "lst"], ["punc", ")"]], [["p", " "], ["punc", "("], ["kw", "cond"], ["p", " "]], [["p", " "], ["punc", "[("], ["bi", "null?"], ["p", " "], ["var", "lst"], ["punc", ")"], ["p", " "], ["con", "#f"], ["punc", "]"]], [["p", " "], ["punc", "[("], ["bi", "equal?"], ["p", " "], ["punc", "("], ["bi", "car"], ["p", " "], ["var", "lst"], ["punc", ")"], ["p", " "], ["var", "x"], ["punc", ")"], ["p", " "], ["con", "#t"], ["punc", "]"]], [["p", " "], ["punc", "["], ["con", "else"], ["p", " "], ["punc", "("], ["fnc", "member?"], ["p", " "], ["var", "x"], ["p", " "], ["punc", "("], ["bi", "cdr"], ["p", " "], ["var", "lst"], ["punc", "))]"], ["punc", ")"]], [], [["punc", "("], ["bi", "display"], ["p", " "], ["punc", "("], ["fnc", "member?"], ["p", " "], ["num", "5"], ["p", " "], ["var", "primes"], ["punc", "))"]], [["punc", "("], ["bi", "newline"], ["punc", ")"]]], "Haskell": [[["cmd", "-- |"], ["cm", " Compute statistics over a stream of samples."]], [["pp", "{-# LANGUAGE ScopedTypeVariables #-}"]], [["kw", "module"], ["p", " "], ["ty", "Stats"], ["p", " "], ["punc", "("], ["var", "mean"], ["punc", ","], ["p", " "], ["var", "variance"], ["punc", ")"], ["p", " "], ["kw", "where"]], [], [["kw", "import"], ["p", " "], ["kw", "qualified"], ["p", " "], ["ty", "Data.List"], ["p", " "], ["kw", "as"], ["p", " "], ["ty", "L"]], [], [["cmd", "-- |"], ["cm", " A labelled measurement."]], [["kw", "data"], ["p", " "], ["ty", "Sample"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Sample"]], [["p", " "], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "label"], ["p", " "], ["op", "::"], ["p", " "], ["ty", "String"]], [["p", " "], ["p", " "], ["punc", ","], ["p", " "], ["prop", "value"], ["p", " "], ["op", "::"], ["p", " "], ["ty", "Double"]], [["p", " "], ["p", " "], ["punc", "}"], ["p", " "], ["kw", "deriving"], ["p", " "], ["punc", "("], ["ty", "Show"], ["punc", ","], ["p", " "], ["ty", "Eq"], ["punc", ")"]], [], [["cmd", "-- |"], ["cm", " Arithmetic mean; returns 0 for an empty list."]], [["fnd", "mean"], ["p", " "], ["op", "::"], ["p", " "], ["punc", "["], ["ty", "Double"], ["punc", "]"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Double"]], [["fnd", "mean"], ["p", " "], ["con", "[]"], ["p", " "], ["op", "="], ["p", " "], ["num", "0"]], [["fnd", "mean"], ["p", " "], ["var", "xs"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "sum"], ["p", " "], ["var", "xs"], ["p", " "], ["op", "/"], ["p", " "], ["fnc", "fromIntegral"], ["p", " "], ["punc", "("], ["fnc", "length"], ["p", " "], ["var", "xs"], ["punc", ")"]], [], [["fnd", "variance"], ["p", " "], ["op", "::"], ["p", " "], ["punc", "["], ["ty", "Double"], ["punc", "]"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Double"]], [["fnd", "variance"], ["p", " "], ["var", "xs"], ["p", " "], ["op", "="], ["p", " "], ["kw", "let"], ["p", " "], ["var", "m"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "mean"], ["p", " "], ["var", "xs"]], [["p", " "], ["kw", "in"], ["p", " "], ["fnc", "mean"], ["p", " "], ["punc", "["], ["p", " "], ["punc", "("], ["var", "x"], ["p", " "], ["op", "-"], ["p", " "], ["var", "m"], ["punc", ")"], ["p", " "], ["op", "^"], ["p", " "], ["num", "2"], ["p", " "], ["op", "|"], ["p", " "], ["var", "x"], ["p", " "], ["op", "<-"], ["p", " "], ["var", "xs"], ["p", " "], ["punc", "]"]], [], [["cmd", "-- |"], ["cm", " Demo entry point."]], [["fnd", "main"], ["p", " "], ["op", "::"], ["p", " "], ["ty", "IO"], ["p", " "], ["punc", "("], ["punc", ")"]], [["fnd", "main"], ["p", " "], ["op", "="], ["p", " "], ["kw", "do"]], [["p", " "], ["kw", "let"], ["p", " "], ["var", "samples"], ["p", " "], ["op", "="], ["p", " "], ["punc", "["], ["num", "1.0"], ["punc", ","], ["p", " "], ["num", "2.5"], ["punc", ","], ["p", " "], ["num", "3.5"], ["punc", "]"]], [["p", " "], ["fnc", "putStrLn"], ["p", " "], ["punc", "("], ["str", "\"mean = \""], ["p", " "], ["op", "++"], ["p", " "], ["fnc", "show"], ["p", " "], ["punc", "("], ["fnc", "mean"], ["p", " "], ["var", "samples"], ["punc", "))"]]], "OCaml": [[["cmd", "(*"], ["cm", " Simple expression evaluator with variant types. "], ["cmd", "*)"]], [], [["kw", "type"], ["p", " "], ["ty", "expr"], ["p", " "], ["op", "="]], [["p", " "], ["p", " "], ["op", "|"], ["p", " "], ["ty", "Num"], ["p", " "], ["kw", "of"], ["p", " "], ["ty", "float"]], [["p", " "], ["p", " "], ["op", "|"], ["p", " "], ["ty", "Var"], ["p", " "], ["kw", "of"], ["p", " "], ["ty", "string"]], [["p", " "], ["p", " "], ["op", "|"], ["p", " "], ["ty", "Add"], ["p", " "], ["kw", "of"], ["p", " "], ["ty", "expr"], ["p", " "], ["op", "*"], ["p", " "], ["ty", "expr"]], [["p", " "], ["p", " "], ["op", "|"], ["p", " "], ["ty", "Mul"], ["p", " "], ["kw", "of"], ["p", " "], ["ty", "expr"], ["p", " "], ["op", "*"], ["p", " "], ["ty", "expr"]], [], [["cmd", "(**"], ["cm", " Evaluate [e] under environment [env]. "], ["cmd", "*)"]], [["kw", "let"], ["p", " "], ["kw", "rec"], ["p", " "], ["fnd", "eval"], ["p", " "], ["var", "env"], ["p", " "], ["var", "e"], ["p", " "], ["op", "="]], [["p", " "], ["kw", "match"], ["p", " "], ["var", "e"], ["p", " "], ["kw", "with"]], [["p", " "], ["op", "|"], ["p", " "], ["ty", "Num"], ["p", " "], ["var", "n"], ["p", " "], ["op", "->"], ["p", " "], ["var", "n"]], [["p", " "], ["op", "|"], ["p", " "], ["ty", "Var"], ["p", " "], ["var", "x"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "List"], ["punc", "."], ["fnc", "assoc"], ["p", " "], ["var", "x"], ["p", " "], ["var", "env"]], [["p", " "], ["op", "|"], ["p", " "], ["ty", "Add"], ["p", " "], ["punc", "("], ["var", "a"], ["punc", ","], ["p", " "], ["var", "b"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["fnc", "eval"], ["p", " "], ["var", "env"], ["p", " "], ["var", "a"], ["p", " "], ["op", "+."], ["p", " "], ["fnc", "eval"], ["p", " "], ["var", "env"], ["p", " "], ["var", "b"]], [["p", " "], ["op", "|"], ["p", " "], ["ty", "Mul"], ["p", " "], ["punc", "("], ["var", "a"], ["punc", ","], ["p", " "], ["var", "b"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["fnc", "eval"], ["p", " "], ["var", "env"], ["p", " "], ["var", "a"], ["p", " "], ["op", "*."], ["p", " "], ["fnc", "eval"], ["p", " "], ["var", "env"], ["p", " "], ["var", "b"]], [], [["kw", "let"], ["p", " "], ["punc", "()"], ["p", " "], ["op", "="], ["p", " "], ["kw", "let"], ["p", " "], ["var", "env"], ["p", " "], ["op", "="], ["p", " "], ["punc", "["], ["p", " "], ["punc", "("], ["str", "\"x\""], ["punc", ","], ["p", " "], ["num", "3.0"], ["punc", ")"], ["p", " "], ["punc", "]"], ["p", " "], ["kw", "in"]], [["p", " "], ["kw", "let"], ["p", " "], ["var", "e"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Add"], ["p", " "], ["punc", "("], ["ty", "Var"], ["p", " "], ["str", "\"x\""], ["punc", ","], ["p", " "], ["ty", "Num"], ["p", " "], ["num", "4.0"], ["punc", ")"], ["p", " "], ["kw", "in"]], [["p", " "], ["ty", "Printf"], ["punc", "."], ["fnc", "printf"], ["p", " "], ["str", "\"result = %g\\n\""], ["p", " "], ["punc", "("], ["fnc", "eval"], ["p", " "], ["var", "env"], ["p", " "], ["var", "e"], ["punc", ")"]]], "Scala": [[["cmd", "//"], ["cm", " Geometry helpers for 2D shapes"]], [["kw", "package"], ["p", " "], ["var", "geometry"]], [], [["kw", "import"], ["p", " "], ["var", "scala"], ["op", "."], ["var", "math"], ["op", "."], ["fnc", "sqrt"]], [], [["dec", "@inline"], ["p", " "], ["kw", "final"], ["p", " "], ["kw", "case"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "Point"], ["punc", "("], ["kw", "val"], ["p", " "], ["prop", "x"], ["op", ":"], ["p", " "], ["ty", "Double"], ["punc", ","], ["p", " "], ["kw", "val"], ["p", " "], ["prop", "y"], ["op", ":"], ["p", " "], ["ty", "Double"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "distanceTo"], ["punc", "("], ["var", "that"], ["op", ":"], ["p", " "], ["ty", "Point"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "Double"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "dx"], ["p", " "], ["op", "="], ["p", " "], ["var", "x"], ["p", " "], ["op", "-"], ["p", " "], ["var", "that"], ["op", "."], ["prop", "x"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "dy"], ["p", " "], ["op", "="], ["p", " "], ["var", "y"], ["p", " "], ["op", "-"], ["p", " "], ["var", "that"], ["op", "."], ["prop", "y"]], [["p", " "], ["fnc", "sqrt"], ["punc", "("], ["var", "dx"], ["p", " "], ["op", "*"], ["p", " "], ["var", "dx"], ["p", " "], ["op", "+"], ["p", " "], ["var", "dy"], ["p", " "], ["op", "*"], ["p", " "], ["var", "dy"], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "object"], ["p", " "], ["ty", "Geometry"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "origin"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Point"], ["punc", "("], ["num", "0.0"], ["punc", ","], ["p", " "], ["num", "0.0"], ["punc", ")"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "pts"], ["p", " "], ["op", "="], ["p", " "], ["ty", "List"], ["punc", "("], ["ty", "Point"], ["punc", "("], ["num", "3.0"], ["punc", ","], ["p", " "], ["num", "4.0"], ["punc", "),"], ["p", " "], ["ty", "Point"], ["punc", "("], ["num", "1.0"], ["punc", ","], ["p", " "], ["num", "2.0"], ["punc", "))"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "dists"], ["p", " "], ["op", "="], ["p", " "], ["kw", "for"], ["p", " "], ["punc", "("], ["var", "p"], ["p", " "], ["op", "<-"], ["p", " "], ["var", "pts"], ["punc", ")"], ["p", " "], ["kw", "yield"], ["p", " "], ["var", "origin"], ["op", "."], ["fnc", "distanceTo"], ["punc", "("], ["var", "p"], ["punc", ")"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "main"], ["punc", "("], ["var", "args"], ["op", ":"], ["p", " "], ["ty", "Array"], ["punc", "["], ["ty", "String"], ["punc", "]"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "Unit"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"]], [["p", " "], ["var", "dists"], ["op", "."], ["fnc", "foreach"], ["punc", "("], ["var", "d"], ["p", " "], ["op", "=>"], ["p", " "], ["fnc", "println"], ["punc", "("], ["str", "s\"dist = $d\""], ["punc", ")"], ["punc", ")"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "ok"], ["p", " "], ["op", "="], ["p", " "], ["var", "dists"], ["op", "."], ["fnc", "nonEmpty"], ["p", " "], ["op", "&&"], ["p", " "], ["con", "true"]], [["p", " "], ["punc", "}"]], [["punc", "}"]]], "Kotlin": [[["cmd", "//"], ["cm", " User repository with a simple cache"]], [["kw", "package"], ["p", " "], ["var", "com"], ["op", "."], ["var", "example"], ["op", "."], ["var", "data"]], [], [["kw", "import"], ["p", " "], ["var", "kotlin"], ["op", "."], ["var", "collections"], ["op", "."], ["var", "mutableMapOf"]], [], [["kw", "data"], ["p", " "], ["kw", "class"], ["p", " "], ["ty", "User"], ["punc", "("], ["kw", "val"], ["p", " "], ["prop", "id"], ["op", ":"], ["p", " "], ["ty", "Int"], ["punc", ","], ["p", " "], ["kw", "val"], ["p", " "], ["prop", "name"], ["op", ":"], ["p", " "], ["ty", "String"], ["punc", ")"]], [], [["kw", "class"], ["p", " "], ["ty", "UserRepo"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "private"], ["p", " "], ["kw", "val"], ["p", " "], ["var", "cache"], ["p", " "], ["op", "="], ["p", " "], ["bi", "mutableMapOf"], ["punc", "<"], ["ty", "Int"], ["punc", ","], ["p", " "], ["ty", "User"], ["punc", ">"], ["punc", "()"]], [], [["p", " "], ["dec", "@JvmStatic"], ["p", " "]], [["p", " "], ["kw", "fun"], ["p", " "], ["fnd", "findById"], ["punc", "("], ["var", "id"], ["op", ":"], ["p", " "], ["ty", "Int"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "User"], ["op", "?"], ["p", " "], ["op", "="], ["p", " "], ["var", "cache"], ["punc", "["], ["var", "id"], ["punc", "]"]], [], [["p", " "], ["kw", "fun"], ["p", " "], ["fnd", "save"], ["punc", "("], ["var", "user"], ["op", ":"], ["p", " "], ["ty", "User"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["var", "cache"], ["punc", "["], ["var", "user"], ["op", "."], ["prop", "id"], ["punc", "]"], ["p", " "], ["op", "="], ["p", " "], ["var", "user"]], [["p", " "], ["bi", "println"], ["punc", "("], ["str", "\"saved "], ["esc", "\\n"], ["str", "\""], ["p", " "], ["op", "+"], ["p", " "], ["var", "user"], ["op", "."], ["prop", "name"], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "fun"], ["p", " "], ["fnd", "main"], ["punc", "()"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "repo"], ["p", " "], ["op", "="], ["p", " "], ["ty", "UserRepo"], ["punc", "()"]], [["p", " "], ["var", "repo"], ["op", "."], ["fnc", "save"], ["punc", "("], ["ty", "User"], ["punc", "("], ["num", "1"], ["punc", ","], ["p", " "], ["str", "\"Ada\""], ["punc", "))"]], [["p", " "], ["kw", "val"], ["p", " "], ["var", "found"], ["p", " "], ["op", "="], ["p", " "], ["var", "repo"], ["op", "."], ["fnc", "findById"], ["punc", "("], ["num", "1"], ["punc", ")"], ["p", " "], ["op", "?:"], ["p", " "], ["kw", "return"]], [["p", " "], ["bi", "println"], ["punc", "("], ["var", "found"], ["punc", ")"]], [["punc", "}"]]], "Swift": [[["cmd", "//"], ["cm", " Account model with balance guard"]], [["kw", "import"], ["p", " "], ["ty", "Foundation"]], [], [["dec", "@frozen"], ["p", " "]], [["kw", "struct"], ["p", " "], ["ty", "Account"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "let"], ["p", " "], ["prop", "id"], ["op", ":"], ["p", " "], ["ty", "Int"]], [["p", " "], ["kw", "var"], ["p", " "], ["prop", "balance"], ["op", ":"], ["p", " "], ["ty", "Double"], ["p", " "], ["op", "="], ["p", " "], ["num", "0.0"]], [], [["p", " "], ["kw", "func"], ["p", " "], ["fnd", "withdraw"], ["punc", "("], ["var", "amount"], ["op", ":"], ["p", " "], ["ty", "Double"], ["punc", ")"], ["p", " "], ["op", "->"], ["p", " "], ["ty", "Bool"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "guard"], ["p", " "], ["var", "amount"], ["p", " "], ["op", "<="], ["p", " "], ["prop", "balance"], ["p", " "], ["kw", "else"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "false"]], [["p", " "], ["punc", "}"]], [["p", " "], ["prop", "balance"], ["p", " "], ["op", "-="], ["p", " "], ["var", "amount"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "true"]], [["p", " "], ["punc", "}"]], [["punc", "}"]], [], [["kw", "let"], ["p", " "], ["var", "acct"], ["p", " "], ["op", "="], ["p", " "], ["ty", "Account"], ["punc", "("], ["var", "id"], ["op", ":"], ["p", " "], ["num", "7"], ["punc", ","], ["p", " "], ["var", "balance"], ["op", ":"], ["p", " "], ["num", "100.0"], ["punc", ")"]], [["kw", "var"], ["p", " "], ["var", "copy"], ["p", " "], ["op", "="], ["p", " "], ["var", "acct"]], [["kw", "let"], ["p", " "], ["var", "ok"], ["p", " "], ["op", "="], ["p", " "], ["var", "copy"], ["op", "."], ["fnc", "withdraw"], ["punc", "("], ["var", "amount"], ["op", ":"], ["p", " "], ["num", "30.0"], ["punc", ")"]], [["bi", "print"], ["punc", "("], ["str", "\"acct ok=\""], ["punc", ","], ["p", " "], ["var", "ok"], ["punc", ")"]]], "Lua": [[["cmd", "--"], ["cm", " Account module: balances and transfers"]], [["kw", "local"], ["p", " "], ["ty", "Account"], ["op", "="], ["punc", "{}"]], [["ty", "Account"], ["punc", "."], ["prop", "__index"], ["op", "="], ["ty", "Account"]], [], [["kw", "local"], ["p", " "], ["var", "rates"], ["op", "="], ["p", " "], ["punc", "{"], ["str", "\"usd\""], ["op", "="], ["num", "1.0"], ["punc", ","], ["p", " "], ["str", "\"eur\""], ["op", "="], ["num", "0.92"], ["punc", "}"]], [], [["kw", "function"], ["p", " "], ["ty", "Account"], ["op", "."], ["fnd", "new"], ["punc", "("], ["var", "name"], ["punc", ","], ["p", " "], ["var", "balance"], ["punc", ")"]], [["p", " "], ["kw", "local"], ["p", " "], ["var", "self"], ["op", "="], ["p", " "], ["fnc", "setmetatable"], ["punc", "("], ["punc", "{}"], ["punc", ","], ["p", " "], ["ty", "Account"], ["punc", ")"]], [["p", " "], ["var", "self"], ["punc", "."], ["prop", "name"], ["op", "="], ["var", "name"]], [["p", " "], ["var", "self"], ["punc", "."], ["prop", "balance"], ["op", "="], ["p", " "], ["var", "balance"], ["p", " "], ["kw", "or"], ["p", " "], ["num", "0"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "self"]], [["kw", "end"]], [], [["kw", "function"], ["p", " "], ["ty", "Account"], ["op", ":"], ["fnd", "report"], ["punc", "()"]], [["p", " "], ["kw", "for"], ["p", " "], ["var", "code"], ["punc", ","], ["p", " "], ["var", "rate"], ["p", " "], ["kw", "in"], ["p", " "], ["bi", "pairs"], ["punc", "("], ["var", "rates"], ["punc", ")"], ["p", " "], ["kw", "do"]], [["p", " "], ["bi", "print"], ["punc", "("], ["var", "code"], ["punc", ","], ["p", " "], ["var", "self"], ["punc", "."], ["prop", "balance"], ["p", " "], ["op", "*"], ["p", " "], ["var", "rate"], ["punc", ")"]], [["p", " "], ["kw", "end"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "self"], ["punc", "."], ["prop", "balance"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"], ["p", " "], ["kw", "then"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "nil"]], [["p", " "], ["kw", "end"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "true"]], [["kw", "end"]]], "Ruby": [[["cmd", "#"], ["cm", " Inventory tracker with tagged items"]], [["kw", "class"], ["p", " "], ["ty", "Inventory"]], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "initialize"], ["punc", "("], ["var", "items"], ["p", " "], ["op", "="], ["p", " "], ["punc", "[]"], ["punc", ")"]], [["p", " "], ["var", "@items"], ["p", " "], ["op", "="], ["p", " "], ["var", "items"]], [["p", " "], ["var", "@tags"], ["p", " "], ["op", "="], ["p", " "], ["punc", "{"], ["prop", "sku:"], ["p", " "], ["con", "nil"], ["punc", "}"]], [["p", " "], ["kw", "end"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "add"], ["punc", "("], ["var", "name"], ["punc", ","], ["p", " "], ["var", "price"], ["punc", ")"]], [["p", " "], ["kw", "return"], ["p", " "], ["con", "false"], ["p", " "], ["kw", "unless"], ["p", " "], ["var", "name"], ["p", " "], ["op", "=~"], ["p", " "], ["re", "/\\A\\w+\\z/"]], [["p", " "], ["var", "@items"], ["p", " "], ["op", "<<"], ["p", " "], ["punc", "{"], ["p", " "], ["prop", "name:"], ["p", " "], ["var", "name"], ["punc", ","], ["p", " "], ["prop", "price:"], ["p", " "], ["var", "price"], ["p", " "], ["punc", "}"]], [["p", " "], ["kw", "end"]], [], [["p", " "], ["kw", "def"], ["p", " "], ["fnd", "total"], ["punc", "("], ["var", "tax"], ["p", " "], ["op", "="], ["p", " "], ["num", "0.08"], ["punc", ")"]], [["p", " "], ["var", "sum"], ["p", " "], ["op", "="], ["p", " "], ["num", "0"]], [["p", " "], ["var", "@items"], ["punc", "."], ["fnc", "each"], ["p", " "], ["kw", "do"], ["p", " "], ["punc", "|"], ["var", "item"], ["punc", "|"]], [["p", " "], ["var", "sum"], ["p", " "], ["op", "+="], ["p", " "], ["var", "item"], ["punc", "["], ["prop", ":price"], ["punc", "]"]], [["p", " "], ["kw", "end"]], [["p", " "], ["bi", "printf"], ["punc", "("], ["str", "\"total: %.2f\\n\""], ["punc", ","], ["p", " "], ["var", "sum"], ["p", " "], ["op", "*"], ["p", " "], ["punc", "("], ["num", "1"], ["p", " "], ["op", "+"], ["p", " "], ["var", "tax"], ["punc", "))"]], [["p", " "], ["kw", "end"]], [["kw", "end"]]], "Perl": [[["cmd", "#"], ["cm", "!/usr/bin/perl"]], [["kw", "use"], ["p", " "], ["pp", "strict"], ["punc", ";"]], [["kw", "use"], ["p", " "], ["pp", "warnings"], ["punc", ";"]], [], [["cmd", "#"], ["cm", " Parse a config line into a hash"]], [["kw", "sub"], ["p", " "], ["fnd", "parse_config"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "my"], ["p", " "], ["punc", "("], ["var", "$line"], ["punc", ")"], ["p", " "], ["op", "="], ["p", " "], ["var", "@_"], ["punc", ";"]], [["p", " "], ["kw", "my"], ["p", " "], ["var", "%conf"], ["p", " "], ["op", "="], ["p", " "], ["punc", "()"], ["punc", ";"]], [], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "$line"], ["p", " "], ["op", "=~"], ["p", " "], ["re", "/^(\\w+)\\s*=\\s*(.+)$/"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["var", "$conf"], ["punc", "{"], ["var", "$1"], ["punc", "}"], ["p", " "], ["op", "="], ["p", " "], ["var", "$2"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [], [["p", " "], ["kw", "return"], ["p", " "], ["op", "\\"], ["var", "%conf"], ["punc", ";"]], [["punc", "}"]], [], [["kw", "my"], ["p", " "], ["var", "$ref"], ["p", " "], ["op", "="], ["p", " "], ["fnc", "parse_config"], ["punc", "("], ["str", "\"host = localhost\""], ["punc", ")"], ["punc", ";"]], [["kw", "my"], ["p", " "], ["var", "@keys"], ["p", " "], ["op", "="], ["p", " "], ["bi", "keys"], ["p", " "], ["var", "%$ref"], ["punc", ";"]], [["bi", "print"], ["p", " "], ["var", "@keys"], ["punc", ";"]]], "R": [[["cmd", "#"], ["cm", " Summarize sales by region and fit a model"]], [["var", "library"], ["punc", "("], ["bi", "dplyr"], ["punc", ")"]], [], [["var", "sales"], ["p", " "], ["op", "<-"], ["p", " "], ["fnc", "read.csv"], ["punc", "("], ["str", "\"sales.csv\""], ["punc", ","], ["p", " "], ["prop", "stringsAsFactors"], ["p", " "], ["op", "="], ["p", " "], ["con", "FALSE"], ["punc", ")"]], [["var", "regions"], ["p", " "], ["op", "<-"], ["p", " "], ["bi", "c"], ["punc", "("], ["str", "\"North\""], ["punc", ","], ["p", " "], ["str", "\"South\""], ["punc", ","], ["p", " "], ["str", "\"East\""], ["punc", ","], ["p", " "], ["str", "\"West\""], ["punc", ")"]], [], [["cmd", "#"], ["cm", " Compute mean revenue per region"]], [["fnd", "summarize_region"], ["p", " "], ["op", "<-"], ["p", " "], ["kw", "function"], ["punc", "("], ["var", "df"], ["punc", ","], ["p", " "], ["var", "reg"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["var", "subset"], ["p", " "], ["op", "<-"], ["p", " "], ["var", "df"], ["punc", "["], ["var", "df"], ["op", "$"], ["prop", "region"], ["p", " "], ["op", "=="], ["p", " "], ["var", "reg"], ["punc", ","], ["p", " "], ["punc", "]"]], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["fnc", "nrow"], ["punc", "("], ["var", "subset"], ["punc", ")"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["punc", "("], ["con", "NA"], ["punc", ")"]], [["p", " "], ["punc", "}"]], [["p", " "], ["fnc", "mean"], ["punc", "("], ["var", "subset"], ["op", "$"], ["prop", "revenue"], ["punc", ","], ["p", " "], ["prop", "na.rm"], ["p", " "], ["op", "="], ["p", " "], ["con", "TRUE"], ["punc", ")"]], [["punc", "}"]], [], [["var", "means"], ["p", " "], ["op", "<-"], ["p", " "], ["fnc", "sapply"], ["punc", "("], ["var", "regions"], ["punc", ","], ["p", " "], ["kw", "function"], ["punc", "("], ["var", "r"], ["punc", ")"], ["p", " "], ["fnc", "summarize_region"], ["punc", "("], ["var", "sales"], ["punc", ","], ["p", " "], ["var", "r"], ["punc", ")"], ["punc", ")"]], [["var", "sales"], ["p", " "], ["op", "%>%"], ["p", " "], ["fnc", "filter"], ["punc", "("], ["prop", "revenue"], ["p", " "], ["op", ">"], ["p", " "], ["num", "1000"], ["punc", ")"], ["p", " "], ["op", "%>%"], ["p", " "], ["fnc", "head"], ["punc", "("], ["num", "5"], ["punc", ")"]], [], [["var", "model"], ["p", " "], ["op", "<-"], ["p", " "], ["fnc", "lm"], ["punc", "("], ["prop", "revenue"], ["p", " "], ["op", "~"], ["p", " "], ["prop", "units"], ["p", " "], ["op", "+"], ["p", " "], ["prop", "region"], ["punc", ","], ["p", " "], ["prop", "data"], ["p", " "], ["op", "="], ["p", " "], ["var", "sales"], ["punc", ")"]], [["fnc", "print"], ["punc", "("], ["fnc", "summary"], ["punc", "("], ["var", "model"], ["punc", ")"], ["punc", ")"]]], "Erlang": [[["cmd", "%"], ["cm", " Bank account server with pattern matching"]], [["pp", "-module"], ["punc", "("], ["ty", "bank"], ["punc", ")."]], [["pp", "-export"], ["punc", "(["], ["fnc", "start"], ["op", "/"], ["num", "0"], ["punc", ","], ["p", " "], ["fnc", "balance"], ["op", "/"], ["num", "1"], ["punc", "])"], ["punc", "."]], [], [["fnd", "start"], ["punc", "()"], ["p", " "], ["op", "->"]], [["p", " "], ["fnc", "spawn"], ["punc", "("], ["kw", "fun"], ["punc", "()"], ["p", " "], ["op", "->"], ["p", " "], ["fnc", "loop"], ["punc", "("], ["num", "0"], ["punc", ")"], ["p", " "], ["kw", "end"], ["punc", ")."]], [], [["fnd", "loop"], ["punc", "("], ["var", "Balance"], ["punc", ")"], ["p", " "], ["op", "->"]], [["p", " "], ["kw", "receive"]], [["p", " "], ["punc", "{"], ["con", "deposit"], ["punc", ","], ["p", " "], ["var", "Amount"], ["punc", "}"], ["p", " "], ["kw", "when"], ["p", " "], ["var", "Amount"], ["p", " "], ["op", ">"], ["p", " "], ["num", "0"], ["p", " "], ["op", "->"]], [["p", " "], ["fnc", "loop"], ["punc", "("], ["var", "Balance"], ["p", " "], ["op", "+"], ["p", " "], ["var", "Amount"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["punc", "{"], ["con", "withdraw"], ["punc", ","], ["p", " "], ["var", "Amount"], ["punc", "}"], ["p", " "], ["op", "->"]], [["p", " "], ["fnc", "loop"], ["punc", "("], ["var", "Balance"], ["p", " "], ["op", "-"], ["p", " "], ["var", "Amount"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["punc", "{"], ["con", "balance"], ["punc", ","], ["p", " "], ["var", "From"], ["punc", "}"], ["p", " "], ["op", "->"]], [["p", " "], ["var", "From"], ["p", " "], ["op", "!"], ["p", " "], ["punc", "{"], ["con", "ok"], ["punc", ","], ["p", " "], ["var", "Balance"], ["punc", "}"], ["punc", ","], ["p", " "], ["fnc", "loop"], ["punc", "("], ["var", "Balance"], ["punc", ")"]], [["p", " "], ["kw", "end"], ["punc", "."]], [], [["fnd", "balance"], ["punc", "("], ["var", "Pid"], ["punc", ")"], ["p", " "], ["op", "->"]], [["p", " "], ["var", "Pid"], ["p", " "], ["op", "!"], ["p", " "], ["punc", "{"], ["con", "balance"], ["punc", ","], ["p", " "], ["fnc", "self"], ["punc", "()"], ["punc", "}"], ["punc", ","], ["p", " "], ["kw", "receive"], ["p", " "], ["punc", "{"], ["con", "ok"], ["punc", ","], ["p", " "], ["var", "B"], ["punc", "}"], ["p", " "], ["op", "->"], ["p", " "], ["var", "B"], ["p", " "], ["kw", "end"], ["punc", "."]]], "SQL": [[["cmd", "-- "], ["cm", "Monthly revenue by active customer"]], [["kw", "SELECT"], ["p", " "], ["prop", "c.id"], ["punc", ","], ["p", " "], ["prop", "c.name"], ["punc", ","]], [["p", " "], ["bi", "COUNT"], ["punc", "("], ["prop", "o.id"], ["punc", ")"], ["p", " "], ["kw", "AS"], ["p", " "], ["var", "order_count"], ["punc", ","]], [["p", " "], ["bi", "COALESCE"], ["punc", "("], ["bi", "SUM"], ["punc", "("], ["prop", "o.total"], ["punc", "),"], ["p", " "], ["num", "0"], ["punc", ")"], ["p", " "], ["kw", "AS"], ["p", " "], ["var", "revenue"]], [["kw", "FROM"], ["p", " "], ["prop", "customers"], ["p", " "], ["var", "c"]], [["kw", "JOIN"], ["p", " "], ["prop", "orders"], ["p", " "], ["var", "o"], ["p", " "], ["kw", "ON"], ["p", " "], ["prop", "o.customer_id"], ["p", " "], ["op", "="], ["p", " "], ["prop", "c.id"]], [["kw", "WHERE"], ["p", " "], ["prop", "c.active"], ["p", " "], ["op", "="], ["p", " "], ["con", "TRUE"]], [["p", " "], ["kw", "AND"], ["p", " "], ["prop", "o.created_at"], ["p", " "], ["op", ">="], ["p", " "], ["str", "'2024-01-01'"]], [["p", " "], ["kw", "AND"], ["p", " "], ["prop", "o.status"], ["p", " "], ["op", "<>"], ["p", " "], ["con", "NULL"]], [["kw", "GROUP BY"], ["p", " "], ["prop", "c.id"], ["punc", ","], ["p", " "], ["prop", "c.name"]], [["kw", "HAVING"], ["p", " "], ["bi", "COUNT"], ["punc", "("], ["prop", "o.id"], ["punc", ")"], ["p", " "], ["op", ">"], ["p", " "], ["num", "5"]], [["kw", "ORDER BY"], ["p", " "], ["var", "revenue"], ["p", " "], ["kw", "DESC"]], [["kw", "LIMIT"], ["p", " "], ["num", "25"], ["punc", ";"]], [], [["cmd", "-- "], ["cm", "Flag stale accounts for review"]], [["kw", "UPDATE"], ["p", " "], ["prop", "customers"]], [["kw", "SET"], ["p", " "], ["prop", "status"], ["p", " "], ["op", "="], ["p", " "], ["str", "'dormant'"]], [["kw", "WHERE"], ["p", " "], ["prop", "last_login"], ["p", " "], ["op", "<"], ["p", " "], ["bi", "CURRENT_DATE"], ["p", " "], ["op", "-"], ["p", " "], ["kw", "INTERVAL"], ["p", " "], ["str", "'90 days'"]], [["p", " "], ["kw", "AND"], ["p", " "], ["prop", "active"], ["p", " "], ["op", "="], ["p", " "], ["con", "FALSE"], ["punc", ";"]]], "PHP": [[["pp", "<?php"]], [["kw", "namespace"], ["p", " "], ["ty", "App\\Service"], ["punc", ";"]], [], [["cmd", "/** "], ["doc", "Computes invoice totals. */"]], [["dec", "#[Service]"]], [["kw", "class"], ["p", " "], ["ty", "InvoiceCalculator"]], [["punc", "{"]], [["p", " "], ["kw", "public"], ["p", " "], ["ty", "float"], ["p", " "], ["var", "$taxRate"], ["p", " "], ["op", "="], ["p", " "], ["num", "0.0825"], ["punc", ";"]], [], [["p", " "], ["kw", "public"], ["p", " "], ["kw", "function"], ["p", " "], ["fnd", "total"], ["punc", "("], ["kw", "array"], ["p", " "], ["var", "$items"], ["punc", ")"], ["op", ":"], ["p", " "], ["ty", "float"]], [["p", " "], ["punc", "{"]], [["p", " "], ["cmd", "// "], ["cm", "sum each line item"]], [["p", " "], ["var", "$prices"], ["p", " "], ["op", "="], ["p", " "], ["bi", "array_map"], ["punc", "("], ["kw", "fn"], ["punc", "("], ["var", "$i"], ["punc", ")"], ["p", " "], ["op", "=>"], ["p", " "], ["var", "$i"], ["op", "["], ["str", "'price'"], ["op", "]"], ["punc", ","], ["p", " "], ["var", "$items"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["var", "$subtotal"], ["p", " "], ["op", "="], ["p", " "], ["bi", "array_sum"], ["punc", "("], ["var", "$prices"], ["punc", ")"], ["punc", ";"]], [], [["p", " "], ["kw", "if"], ["p", " "], ["punc", "("], ["var", "$subtotal"], ["p", " "], ["op", "==="], ["p", " "], ["num", "0"], ["punc", ")"], ["p", " "], ["punc", "{"]], [["p", " "], ["kw", "return"], ["p", " "], ["num", "0.0"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [], [["p", " "], ["var", "$total"], ["p", " "], ["op", "="], ["p", " "], ["var", "$subtotal"], ["p", " "], ["op", "*"], ["p", " "], ["punc", "("], ["num", "1"], ["p", " "], ["op", "+"], ["p", " "], ["var", "$this"], ["op", "->"], ["prop", "taxRate"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["fnc", "printf"], ["punc", "("], ["str", "\"Total: %.2f\\n\""], ["punc", ","], ["p", " "], ["var", "$total"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "return"], ["p", " "], ["var", "$total"], ["punc", ";"]], [["p", " "], ["punc", "}"]], [["punc", "}"]]], "Ada": [[["cmd", "-- "], ["cm", "Compute factorial and print the result"]], [["pp", "with"], ["p", " "], ["var", "Ada.Text_IO"], ["punc", ";"]], [["pp", "use"], ["p", " "], ["var", "Ada.Text_IO"], ["punc", ";"]], [], [["kw", "procedure"], ["p", " "], ["fnd", "Factorial_Demo"], ["p", " "], ["kw", "is"]], [["p", " "], ["var", "N"], ["p", " "], ["punc", ":"], ["p", " "], ["ty", "Integer"], ["p", " "], ["op", ":="], ["p", " "], ["num", "5"], ["punc", ";"]], [["p", " "], ["var", "Result"], ["p", " "], ["punc", ":"], ["p", " "], ["ty", "Integer"], ["p", " "], ["op", ":="], ["p", " "], ["num", "1"], ["punc", ";"]], [["kw", "begin"]], [["p", " "], ["kw", "for"], ["p", " "], ["var", "I"], ["p", " "], ["kw", "in"], ["p", " "], ["num", "1"], ["p", " "], ["op", ".."], ["p", " "], ["var", "N"], ["p", " "], ["kw", "loop"]], [["p", " "], ["var", "Result"], ["p", " "], ["op", ":="], ["p", " "], ["var", "Result"], ["p", " "], ["op", "*"], ["p", " "], ["var", "I"], ["punc", ";"]], [["p", " "], ["kw", "end"], ["p", " "], ["kw", "loop"], ["punc", ";"]], [], [["p", " "], ["kw", "if"], ["p", " "], ["var", "Result"], ["p", " "], ["op", ">"], ["p", " "], ["num", "0"], ["p", " "], ["kw", "then"]], [["p", " "], ["bi", "Put_Line"], ["punc", "("], ["str", "\"Factorial = \""], ["p", " "], ["op", "&"], ["p", " "], ["var", "Integer"], ["punc", "'"], ["var", "Image"], ["punc", "("], ["var", "Result"], ["punc", "))"], ["punc", ";"]], [["p", " "], ["kw", "end"], ["p", " "], ["kw", "if"], ["punc", ";"]], [["kw", "end"], ["p", " "], ["fnd", "Factorial_Demo"], ["punc", ";"]]], "Fortran": [[["cmd", "! "], ["cm", "Sum the elements of an array"]], [["kw", "program"], ["p", " "], ["fnd", "array_sum"]], [["p", " "], ["kw", "implicit none"]], [["p", " "], ["ty", "integer"], ["p", " "], ["punc", "::"], ["p", " "], ["var", "i"], ["punc", ","], ["p", " "], ["var", "n"]], [["p", " "], ["ty", "real"], ["punc", "("], ["var", "kind"], ["op", "="], ["num", "8"], ["punc", ")"], ["p", " "], ["punc", "::"], ["p", " "], ["var", "total"]], [["p", " "], ["ty", "real"], ["punc", "("], ["var", "kind"], ["op", "="], ["num", "8"], ["punc", ")"], ["punc", ","], ["p", " "], ["kw", "dimension"], ["punc", "("], ["num", "5"], ["punc", ")"], ["p", " "], ["punc", "::"], ["p", " "], ["var", "a"]], [], [["p", " "], ["var", "n"], ["p", " "], ["op", "="], ["p", " "], ["num", "5"]], [["p", " "], ["var", "total"], ["p", " "], ["op", "="], ["p", " "], ["num", "0.0"]], [["p", " "], ["var", "a"], ["p", " "], ["op", "="], ["p", " "], ["punc", "["], ["num", "1.0"], ["punc", ","], ["p", " "], ["num", "2.0"], ["punc", ","], ["p", " "], ["num", "3.0"], ["punc", ","], ["p", " "], ["num", "4.0"], ["punc", ","], ["p", " "], ["num", "5.0"], ["punc", "]"]], [], [["p", " "], ["kw", "do"], ["p", " "], ["var", "i"], ["p", " "], ["op", "="], ["p", " "], ["num", "1"], ["punc", ","], ["p", " "], ["var", "n"]], [["p", " "], ["var", "total"], ["p", " "], ["op", "="], ["p", " "], ["var", "total"], ["p", " "], ["op", "+"], ["p", " "], ["var", "a"], ["punc", "("], ["var", "i"], ["punc", ")"]], [["p", " "], ["kw", "end do"]], [], [["p", " "], ["bi", "print"], ["p", " "], ["op", "*"], ["punc", ","], ["p", " "], ["str", "\"Sum = \""], ["punc", ","], ["p", " "], ["var", "total"]], [["kw", "end program"], ["p", " "], ["fnd", "array_sum"]]], "MATLAB": [[["cmd", "% "], ["cm", "Normalize a vector and report its length"]], [["kw", "function"], ["p", " "], ["var", "out"], ["p", " "], ["op", "="], ["p", " "], ["fnd", "normalize_vec"], ["punc", "("], ["var", "v"], ["punc", ")"]], [["p", " "], ["var", "n"], ["p", " "], ["op", "="], ["p", " "], ["bi", "length"], ["punc", "("], ["var", "v"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["var", "acc"], ["p", " "], ["op", "="], ["p", " "], ["num", "0"], ["punc", ";"]], [], [["p", " "], ["kw", "for"], ["p", " "], ["var", "i"], ["p", " "], ["op", "="], ["p", " "], ["num", "1"], ["op", ":"], ["var", "n"]], [["p", " "], ["var", "acc"], ["p", " "], ["op", "="], ["p", " "], ["var", "acc"], ["p", " "], ["op", "+"], ["p", " "], ["var", "v"], ["punc", "("], ["var", "i"], ["punc", ")"], ["op", "^"], ["num", "2"], ["punc", ";"]], [["p", " "], ["kw", "end"]], [], [["p", " "], ["var", "mag"], ["p", " "], ["op", "="], ["p", " "], ["bi", "sqrt"], ["punc", "("], ["var", "acc"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "if"], ["p", " "], ["var", "mag"], ["p", " "], ["op", "=="], ["p", " "], ["num", "0"]], [["p", " "], ["var", "out"], ["p", " "], ["op", "="], ["p", " "], ["bi", "zeros"], ["punc", "("], ["bi", "size"], ["punc", "("], ["var", "v"], ["punc", ")"], ["punc", ")"], ["punc", ";"]], [["p", " "], ["kw", "else"]], [["p", " "], ["var", "out"], ["p", " "], ["op", "="], ["p", " "], ["var", "v"], ["p", " "], ["op", "/"], ["p", " "], ["var", "mag"], ["punc", ";"]], [["p", " "], ["kw", "end"]], [], [["p", " "], ["bi", "disp"], ["punc", "("], ["str", "\"vector length:\""], ["punc", ")"], ["punc", ";"]], [["p", " "], ["bi", "disp"], ["punc", "("], ["var", "n"], ["punc", ")"], ["punc", ";"]], [["kw", "end"]]], "Assembly": [[["cmd", ";"], ["cm", " print a greeting via the write syscall"]], [["pp", "section"], ["p", " "], ["pp", ".data"]], [["p", " "], ["var", "msg"], ["p", " "], ["pp", "db"], ["p", " "], ["str", "\"Hello, world!\""], ["punc", ","], ["p", " "], ["num", "0xA"]], [["p", " "], ["con", "msglen"], ["p", " "], ["pp", "equ"], ["p", " "], ["var", "$"], ["p", " "], ["op", "-"], ["p", " "], ["var", "msg"]], [], [["pp", "section"], ["p", " "], ["pp", ".text"]], [["p", " "], ["bi", "global"], ["p", " "], ["fnc", "_start"]], [], [["fnd", "_start"], ["punc", ":"]], [["p", " "], ["kw", "mov"], ["p", " "], ["var", "rax"], ["punc", ","], ["p", " "], ["num", "1"], ["p", " "], ["cmd", ";"], ["cm", " sys_write"]], [["p", " "], ["kw", "mov"], ["p", " "], ["var", "rdi"], ["punc", ","], ["p", " "], ["num", "1"], ["p", " "], ["cmd", ";"], ["cm", " stdout"]], [["p", " "], ["kw", "lea"], ["p", " "], ["var", "rsi"], ["punc", ","], ["p", " "], ["punc", "["], ["var", "rel"], ["p", " "], ["var", "msg"], ["punc", "]"]], [["p", " "], ["kw", "mov"], ["p", " "], ["var", "rdx"], ["punc", ","], ["p", " "], ["con", "msglen"]], [["p", " "], ["kw", "syscall"]], [], [["p", " "], ["kw", "mov"], ["p", " "], ["var", "rax"], ["punc", ","], ["p", " "], ["num", "60"], ["p", " "], ["cmd", ";"], ["cm", " sys_exit"]], [["p", " "], ["kw", "xor"], ["p", " "], ["var", "rdi"], ["punc", ","], ["p", " "], ["var", "rdi"], ["p", " "], ["cmd", ";"], ["cm", " status 0"]], [["p", " "], ["kw", "syscall"]]]}, CATS=[["bg", "bg (ground)", "Aa Bb 123"], ["p", "fg", "other / whitespace"], ["kw", "keyword", "class def if return"], ["bi", "builtin", "len echo printf"], ["pp", "preprocessor", "#include #define"], ["fnd", "function \u00b7 def", "resolve push"], ["fnc", "function \u00b7 call", "printf rsync get"], ["dec", "decorator \u2192 type", "@dataclass"], ["ty", "type / class", "int str Order Queue"], ["prop", "property / field", "id name items"], ["con", "constant", "None nil NULL true"], ["num", "number", "8080 100 -1"], ["str", "string", "\"dupre\" \"fmt\""], ["esc", "escape", "\\n \\t"], ["re", "regexp", "/^#[0-9a-f]+/"], ["doc", "docstring", "\"\"\"...\"\"\""], ["cm", "comment", "# reject nil"], ["cmd", "comment delim", "# // ;;"], ["var", "variable / use", "value key self"], ["op", "operator", ": = -> =="], ["punc", "punctuation", "{ } ( ) ;"]], UI_FACES=[["cursor", "cursor", "Aa|"], ["region", "region (selection)", "selected text"], ["hl-line", "hl-line (current line)", "current line"], ["highlight", "highlight", "hover"], ["mode-line", "mode-line", "status active"], ["mode-line-highlight", "mode-line-highlight (hover)", "git:main"], ["mode-line-inactive", "mode-line-inactive", "status idle"], ["fringe", "fringe", "| |"], ["line-number", "line-number", " 42"], ["line-number-current-line", "line-number-current-line", "> 42"], ["minibuffer-prompt", "minibuffer-prompt", "M-x "], ["isearch", "isearch (match)", "match"], ["lazy-highlight", "lazy-highlight", "other match"], ["isearch-fail", "isearch-fail", "no match"], ["show-paren-match", "show-paren-match", "( )"], ["show-paren-mismatch", "show-paren-mismatch", ") ("], ["link", "link", "https://"], ["error", "error", "error!"], ["warning", "warning", "warning"], ["success", "success", "ok"], ["vertical-border", "vertical-border", "|"]], APPS={"org-mode": {"label": "org-mode", "preview": "org", "faces": [["org-document-title", "document title", {}], ["org-document-info", "document info", {}], ["org-document-info-keyword", "document info keyword", {}], ["org-level-1", "level 1", {}], ["org-level-2", "level 2", {}], ["org-level-3", "level 3", {}], ["org-level-4", "level 4", {}], ["org-level-5", "level 5", {}], ["org-level-6", "level 6", {}], ["org-level-7", "level 7", {}], ["org-level-8", "level 8", {}], ["org-headline-todo", "headline todo", {}], ["org-headline-done", "headline done", {}], ["org-todo", "todo", {}], ["org-done", "done", {}], ["org-priority", "priority", {}], ["org-tag", "tag", {}], ["org-tag-group", "tag group", {}], ["org-special-keyword", "special keyword", {}], ["org-drawer", "drawer", {}], ["org-property-value", "property value", {}], ["org-checkbox", "checkbox", {}], ["org-checkbox-statistics-todo", "checkbox statistics todo", {}], ["org-checkbox-statistics-done", "checkbox statistics done", {}], ["org-warning", "warning", {}], ["org-link", "link", {}], ["org-footnote", "footnote", {}], ["org-date", "date", {}], ["org-sexp-date", "sexp date", {}], ["org-date-selected", "date selected", {}], ["org-target", "target", {}], ["org-macro", "macro", {}], ["org-cite", "cite", {}], ["org-cite-key", "cite key", {}], ["org-block", "block", {}], ["org-block-begin-line", "block begin line", {}], ["org-block-end-line", "block end line", {}], ["org-code", "code", {}], ["org-verbatim", "verbatim", {}], ["org-inline-src-block", "inline src block", {}], ["org-quote", "quote", {}], ["org-verse", "verse", {}], ["org-latex-and-related", "latex and related", {}], ["org-table", "table", {}], ["org-table-header", "table header", {}], ["org-table-row", "table row", {}], ["org-formula", "formula", {}], ["org-column", "column", {}], ["org-column-title", "column title", {}], ["org-list-dt", "list dt", {}], ["org-meta-line", "meta line", {}], ["org-ellipsis", "ellipsis", {}], ["org-hide", "hide", {}], ["org-indent", "indent", {}], ["org-archived", "archived", {}], ["org-default", "default", {}], ["org-dispatcher-highlight", "dispatcher highlight", {}], ["org-agenda-structure", "agenda structure", {}], ["org-agenda-structure-secondary", "agenda structure secondary", {}], ["org-agenda-structure-filter", "agenda structure filter", {}], ["org-agenda-date", "agenda date", {}], ["org-agenda-date-today", "agenda date today", {}], ["org-agenda-date-weekend", "agenda date weekend", {}], ["org-agenda-date-weekend-today", "agenda date weekend today", {}], ["org-agenda-current-time", "agenda current time", {}], ["org-agenda-done", "agenda done", {}], ["org-agenda-dimmed-todo-face", "agenda dimmed todo", {}], ["org-agenda-calendar-event", "agenda calendar event", {}], ["org-agenda-calendar-sexp", "agenda calendar sexp", {}], ["org-agenda-calendar-daterange", "agenda calendar daterange", {}], ["org-agenda-diary", "agenda diary", {}], ["org-agenda-clocking", "agenda clocking", {}], ["org-agenda-column-dateline", "agenda column dateline", {}], ["org-agenda-restriction-lock", "agenda restriction lock", {}], ["org-agenda-filter-category", "agenda filter category", {}], ["org-agenda-filter-effort", "agenda filter effort", {}], ["org-agenda-filter-regexp", "agenda filter regexp", {}], ["org-agenda-filter-tags", "agenda filter tags", {}], ["org-scheduled", "scheduled", {}], ["org-scheduled-today", "scheduled today", {}], ["org-scheduled-previously", "scheduled previously", {}], ["org-upcoming-deadline", "upcoming deadline", {}], ["org-upcoming-distant-deadline", "upcoming distant deadline", {}], ["org-imminent-deadline", "imminent deadline", {}], ["org-time-grid", "time grid", {}], ["org-clock-overlay", "clock overlay", {}], ["org-mode-line-clock", "mode line clock", {}], ["org-mode-line-clock-overrun", "mode line clock overrun", {}]]}, "magit": {"label": "magit", "preview": "magit", "faces": [["magit-section-heading", "section heading", {"fg": "#8b6508", "weight": "bold", "extend": true}], ["magit-section-secondary-heading", "section secondary heading", {"weight": "bold", "extend": true}], ["magit-section-heading-selection", "section heading selection", {"fg": "#8b4c39", "extend": true}], ["magit-section-highlight", "section highlight", {"bg": "#f2f2f2", "extend": true}], ["magit-section-child-count", "section child count", {}], ["magit-diff-added", "diff added", {"fg": "#22aa22", "bg": "#ddffdd", "extend": true}], ["magit-diff-added-highlight", "diff added highlight", {"fg": "#22aa22", "bg": "#cceecc", "extend": true}], ["magit-diff-removed", "diff removed", {"fg": "#aa2222", "bg": "#ffdddd", "extend": true}], ["magit-diff-removed-highlight", "diff removed highlight", {"fg": "#aa2222", "bg": "#eecccc", "extend": true}], ["magit-diff-context", "diff context", {"fg": "#7f7f7f", "extend": true}], ["magit-diff-context-highlight", "diff context highlight", {"fg": "#7f7f7f", "bg": "#f2f2f2", "extend": true}], ["magit-diff-file-heading", "diff file heading", {"weight": "bold", "extend": true}], ["magit-diff-file-heading-highlight", "diff file heading highlight", {"extend": true, "inherit": "magit-section-highlight"}], ["magit-diff-file-heading-selection", "diff file heading selection", {"fg": "#8b4c39", "extend": true, "inherit": "magit-diff-file-heading-highlight"}], ["magit-diff-hunk-heading", "diff hunk heading", {"fg": "#333333", "bg": "#e5e5e5", "extend": true}], ["magit-diff-hunk-heading-highlight", "diff hunk heading highlight", {"fg": "#333333", "bg": "#cccccc", "extend": true}], ["magit-diff-hunk-heading-selection", "diff hunk heading selection", {"fg": "#8b4c39", "extend": true, "inherit": "magit-diff-hunk-heading-highlight"}], ["magit-diff-hunk-region", "diff hunk region", {"inherit": "bold"}], ["magit-diff-lines-heading", "diff lines heading", {"bg": "#cd8162", "extend": true, "inherit": "magit-diff-hunk-heading-highlight"}], ["magit-diff-lines-boundary", "diff lines boundary", {"extend": true, "inherit": "magit-diff-lines-heading"}], ["magit-diff-base", "diff base", {"fg": "#aaaa11", "bg": "#ffffcc", "extend": true}], ["magit-diff-base-highlight", "diff base highlight", {"fg": "#aaaa11", "bg": "#eeeebb", "extend": true}], ["magit-diff-our", "diff our", {"inherit": "magit-diff-removed"}], ["magit-diff-our-highlight", "diff our highlight", {"inherit": "magit-diff-removed-highlight"}], ["magit-diff-their", "diff their", {"inherit": "magit-diff-added"}], ["magit-diff-their-highlight", "diff their highlight", {"inherit": "magit-diff-added-highlight"}], ["magit-diff-conflict-heading", "diff conflict heading", {"inherit": "magit-diff-hunk-heading"}], ["magit-diff-conflict-heading-highlight", "diff conflict heading highlight", {"inherit": "magit-diff-hunk-heading-highlight"}], ["magit-diff-revision-summary", "diff revision summary", {"inherit": "magit-diff-hunk-heading"}], ["magit-diff-revision-summary-highlight", "diff revision summary highlight", {"inherit": "magit-diff-hunk-heading-highlight"}], ["magit-diff-whitespace-warning", "diff whitespace warning", {"inherit": "trailing-whitespace"}], ["magit-diffstat-added", "diffstat added", {"fg": "#22aa22"}], ["magit-diffstat-removed", "diffstat removed", {"fg": "#aa2222"}], ["magit-branch-current", "branch current", {"inherit": "magit-branch-local"}], ["magit-branch-local", "branch local", {"fg": "#4a708b"}], ["magit-branch-remote", "branch remote", {"fg": "#6e8b3d"}], ["magit-branch-remote-head", "branch remote head", {"inherit": "magit-branch-remote"}], ["magit-branch-upstream", "branch upstream", {"slant": "italic"}], ["magit-branch-warning", "branch warning", {"inherit": "warning"}], ["magit-head", "head", {"inherit": "magit-branch-local"}], ["magit-tag", "tag", {"fg": "#8b6914"}], ["magit-hash", "hash", {"fg": "#999999"}], ["magit-filename", "filename", {}], ["magit-dimmed", "dimmed", {"fg": "#7f7f7f"}], ["magit-keyword", "keyword", {"inherit": "font-lock-string-face"}], ["magit-keyword-squash", "keyword squash", {"inherit": "font-lock-warning-face"}], ["magit-refname", "refname", {"fg": "#4d4d4d"}], ["magit-refname-stash", "refname stash", {"inherit": "magit-refname"}], ["magit-refname-wip", "refname wip", {"inherit": "magit-refname"}], ["magit-refname-pullreq", "refname pullreq", {"inherit": "magit-refname"}], ["magit-log-author", "log author", {"fg": "#b22222"}], ["magit-log-date", "log date", {"fg": "#4d4d4d"}], ["magit-log-graph", "log graph", {"fg": "#4d4d4d"}], ["magit-header-line", "header line", {"inherit": "magit-section-heading"}], ["magit-header-line-key", "header line key", {"inherit": "font-lock-builtin-face"}], ["magit-header-line-log-select", "header line log select", {"inherit": "bold"}], ["magit-process-ok", "process ok", {"fg": "#00ff00", "inherit": "magit-section-heading"}], ["magit-process-ng", "process ng", {"fg": "#ff0000", "inherit": "magit-section-heading"}], ["magit-mode-line-process", "mode line process", {"inherit": "mode-line-emphasis"}], ["magit-mode-line-process-error", "mode line process error", {"inherit": "error"}], ["magit-bisect-good", "bisect good", {"fg": "#556b2f"}], ["magit-bisect-bad", "bisect bad", {"fg": "#8b3a3a"}], ["magit-bisect-skip", "bisect skip", {"fg": "#b8860b"}], ["magit-blame-heading", "blame heading", {"extend": true, "inherit": "magit-blame-highlight"}], ["magit-blame-highlight", "blame highlight", {"fg": "#000000", "bg": "#cccccc", "extend": true}], ["magit-blame-hash", "blame hash", {}], ["magit-blame-name", "blame name", {}], ["magit-blame-date", "blame date", {}], ["magit-blame-summary", "blame summary", {}], ["magit-blame-dimmed", "blame dimmed", {"inherit": "magit-dimmed"}], ["magit-blame-margin", "blame margin", {"inherit": "magit-blame-highlight"}], ["magit-cherry-equivalent", "cherry equivalent", {"fg": "#ff00ff"}], ["magit-cherry-unmatched", "cherry unmatched", {"fg": "#00ffff"}], ["magit-signature-good", "signature good", {"fg": "#00ff00"}], ["magit-signature-bad", "signature bad", {"fg": "#ff0000", "weight": "bold"}], ["magit-signature-untrusted", "signature untrusted", {"fg": "#66cdaa"}], ["magit-signature-expired", "signature expired", {"fg": "#ffa500"}], ["magit-signature-expired-key", "signature expired key", {"inherit": "magit-signature-expired"}], ["magit-signature-revoked", "signature revoked", {"fg": "#d02090"}], ["magit-signature-error", "signature error", {"fg": "#add8e6"}], ["magit-reflog-commit", "reflog commit", {"fg": "#00ff00"}], ["magit-reflog-amend", "reflog amend", {"fg": "#ff00ff"}], ["magit-reflog-merge", "reflog merge", {"fg": "#00ff00"}], ["magit-reflog-checkout", "reflog checkout", {"fg": "#0000ff"}], ["magit-reflog-reset", "reflog reset", {"fg": "#ff0000"}], ["magit-reflog-rebase", "reflog rebase", {"fg": "#ff00ff"}], ["magit-reflog-cherry-pick", "reflog cherry pick", {"fg": "#00ff00"}], ["magit-reflog-remote", "reflog remote", {"fg": "#00ffff"}], ["magit-reflog-other", "reflog other", {"fg": "#00ffff"}], ["magit-sequence-pick", "sequence pick", {"inherit": "default"}], ["magit-sequence-stop", "sequence stop", {"fg": "#6e8b3d"}], ["magit-sequence-part", "sequence part", {"fg": "#8b6914"}], ["magit-sequence-head", "sequence head", {"fg": "#4a708b"}], ["magit-sequence-drop", "sequence drop", {"fg": "#cd5c5c"}], ["magit-sequence-done", "sequence done", {"inherit": "magit-hash"}], ["magit-sequence-onto", "sequence onto", {"inherit": "magit-sequence-done"}], ["magit-sequence-exec", "sequence exec", {"inherit": "magit-hash"}], ["magit-left-margin", "left margin", {"inherit": "default"}], ["git-commit-comment-action", "git commit comment action", {"inherit": "bold"}], ["git-commit-comment-branch-local", "git commit comment branch local", {"inherit": "magit-branch-local"}], ["git-commit-comment-branch-remote", "git commit comment branch remote", {"inherit": "magit-branch-remote"}], ["git-commit-comment-detached", "git commit comment detached", {"inherit": "git-commit-comment-branch-local"}], ["git-commit-comment-file", "git commit comment file", {"inherit": "git-commit-trailer-value"}], ["git-commit-comment-heading", "git commit comment heading", {"inherit": "git-commit-trailer-token"}], ["git-commit-keyword", "git commit keyword", {"inherit": "font-lock-string-face"}], ["git-commit-nonempty-second-line", "git commit nonempty second line", {"inherit": "font-lock-warning-face"}], ["git-commit-overlong-summary", "git commit overlong summary", {"inherit": "font-lock-warning-face"}], ["git-commit-summary", "git commit summary", {"inherit": "font-lock-type-face"}], ["git-commit-trailer-token", "git commit trailer token", {"inherit": "font-lock-keyword-face"}], ["git-commit-trailer-value", "git commit trailer value", {"inherit": "font-lock-string-face"}]]}, "elfeed": {"label": "elfeed", "preview": "elfeed", "faces": [["elfeed-search-date-face", "search date", {"fg": "#aaa"}], ["elfeed-search-title-face", "search title", {"fg": "#000"}], ["elfeed-search-unread-title-face", "search unread title", {"weight": "bold"}], ["elfeed-search-feed-face", "search feed", {"fg": "#aa0"}], ["elfeed-search-tag-face", "search tag", {"fg": "#070"}], ["elfeed-search-unread-count-face", "search unread count", {"fg": "#000"}], ["elfeed-search-filter-face", "search filter", {"inherit": "mode-line-buffer-id"}], ["elfeed-search-last-update-face", "search last update", {}], ["elfeed-log-date-face", "log date", {"inherit": "font-lock-type-face"}], ["elfeed-log-error-level-face", "log error level", {"fg": "#ff0000"}], ["elfeed-log-warn-level-face", "log warn level", {"fg": "#daa520"}], ["elfeed-log-info-level-face", "log info level", {"fg": "#00bfff"}], ["elfeed-log-debug-level-face", "log debug level", {"fg": "#ee00ee"}]]}, "mu4e": {"label": "mu4e", "preview": "mu4e", "faces": [["mu4e-title-face", "title", {}], ["mu4e-context-face", "context", {}], ["mu4e-modeline-face", "modeline", {}], ["mu4e-ok-face", "ok", {}], ["mu4e-warning-face", "warning", {}], ["mu4e-header-title-face", "header title", {}], ["mu4e-header-key-face", "header key", {}], ["mu4e-header-value-face", "header value", {}], ["mu4e-header-face", "header", {}], ["mu4e-header-highlight-face", "header highlight", {}], ["mu4e-header-marks-face", "header marks", {}], ["mu4e-unread-face", "unread", {}], ["mu4e-flagged-face", "flagged", {}], ["mu4e-replied-face", "replied", {}], ["mu4e-forwarded-face", "forwarded", {}], ["mu4e-draft-face", "draft", {}], ["mu4e-trashed-face", "trashed", {}], ["mu4e-related-face", "related", {}], ["mu4e-contact-face", "contact", {}], ["mu4e-special-header-value-face", "special header value", {}], ["mu4e-url-number-face", "url number", {}], ["mu4e-link-face", "link", {}], ["mu4e-footer-face", "footer", {}], ["mu4e-region-code", "region code", {}], ["mu4e-system-face", "system", {}], ["mu4e-highlight-face", "highlight", {}], ["mu4e-compose-separator-face", "compose separator", {}]]}, "gnus": {"label": "gnus (mu4e article view)", "preview": "gnus", "faces": [["gnus-header-name", "header name", {}], ["gnus-header-from", "header from", {}], ["gnus-header-subject", "header subject", {}], ["gnus-header-content", "header content", {}], ["gnus-header-newsgroups", "header newsgroups", {}], ["gnus-cite-1", "cite 1", {}], ["gnus-cite-2", "cite 2", {}], ["gnus-cite-3", "cite 3", {}], ["gnus-cite-4", "cite 4", {}], ["gnus-cite-5", "cite 5", {}], ["gnus-cite-6", "cite 6", {}], ["gnus-cite-7", "cite 7", {}], ["gnus-cite-8", "cite 8", {}], ["gnus-cite-9", "cite 9", {}], ["gnus-cite-10", "cite 10", {}], ["gnus-cite-11", "cite 11", {}], ["gnus-cite-attribution", "cite attribution", {}], ["gnus-signature", "signature", {}], ["gnus-button", "button", {}], ["gnus-emphasis-bold", "emphasis bold", {}], ["gnus-emphasis-italic", "emphasis italic", {}], ["gnus-emphasis-underline", "emphasis underline", {}], ["gnus-emphasis-strikethru", "emphasis strikethru", {}], ["gnus-emphasis-highlight-words", "emphasis highlight words", {}]]}, "org-faces": {"label": "org-faces", "preview": "orgfaces", "faces": [["org-faces-todo", "todo", {}], ["org-faces-project", "project", {}], ["org-faces-doing", "doing", {}], ["org-faces-waiting", "waiting", {}], ["org-faces-verify", "verify", {}], ["org-faces-stalled", "stalled", {}], ["org-faces-delegated", "delegated", {}], ["org-faces-failed", "failed", {}], ["org-faces-done", "done", {}], ["org-faces-cancelled", "cancelled", {}], ["org-faces-priority-a", "priority a", {}], ["org-faces-priority-b", "priority b", {}], ["org-faces-priority-c", "priority c", {}], ["org-faces-priority-d", "priority d", {}], ["org-faces-todo-dim", "todo dim", {}], ["org-faces-project-dim", "project dim", {}], ["org-faces-doing-dim", "doing dim", {}], ["org-faces-waiting-dim", "waiting dim", {}], ["org-faces-verify-dim", "verify dim", {}], ["org-faces-stalled-dim", "stalled dim", {}], ["org-faces-delegated-dim", "delegated dim", {}], ["org-faces-failed-dim", "failed dim", {}], ["org-faces-done-dim", "done dim", {}], ["org-faces-cancelled-dim", "cancelled dim", {}], ["org-faces-priority-a-dim", "priority a dim", {}], ["org-faces-priority-b-dim", "priority b dim", {}], ["org-faces-priority-c-dim", "priority c dim", {}], ["org-faces-priority-d-dim", "priority d dim", {}]]}, "ghostel": {"label": "ghostel", "preview": "ghostel", "faces": [["ghostel-default", "default", {"inherit": "default"}], ["ghostel-fake-cursor", "fake cursor", {"box": {"style": "line", "width": 1, "color": null}}], ["ghostel-fake-cursor-box", "fake cursor box", {"inherit": "cursor"}], ["ghostel-color-black", "color black", {"inherit": "ansi-color-black"}], ["ghostel-color-red", "color red", {"inherit": "ansi-color-red"}], ["ghostel-color-green", "color green", {"inherit": "ansi-color-green"}], ["ghostel-color-yellow", "color yellow", {"inherit": "ansi-color-yellow"}], ["ghostel-color-blue", "color blue", {"inherit": "ansi-color-blue"}], ["ghostel-color-magenta", "color magenta", {"inherit": "ansi-color-magenta"}], ["ghostel-color-cyan", "color cyan", {"inherit": "ansi-color-cyan"}], ["ghostel-color-white", "color white", {"inherit": "ansi-color-white"}], ["ghostel-color-bright-black", "color bright black", {"inherit": "ansi-color-bright-black"}], ["ghostel-color-bright-red", "color bright red", {"inherit": "ansi-color-bright-red"}], ["ghostel-color-bright-green", "color bright green", {"inherit": "ansi-color-bright-green"}], ["ghostel-color-bright-yellow", "color bright yellow", {"inherit": "ansi-color-bright-yellow"}], ["ghostel-color-bright-blue", "color bright blue", {"inherit": "ansi-color-bright-blue"}], ["ghostel-color-bright-magenta", "color bright magenta", {"inherit": "ansi-color-bright-magenta"}], ["ghostel-color-bright-cyan", "color bright cyan", {"inherit": "ansi-color-bright-cyan"}], ["ghostel-color-bright-white", "color bright white", {"inherit": "ansi-color-bright-white"}]]}, "ansi-color": {"label": "ansi-color (vterm/eshell/compilation/ghostel)", "preview": "ansicolor", "faces": [["ansi-color-black", "black", {}], ["ansi-color-red", "red", {}], ["ansi-color-green", "green", {}], ["ansi-color-yellow", "yellow", {}], ["ansi-color-blue", "blue", {}], ["ansi-color-magenta", "magenta", {}], ["ansi-color-cyan", "cyan", {}], ["ansi-color-white", "white", {}], ["ansi-color-bright-black", "bright black", {}], ["ansi-color-bright-red", "bright red", {}], ["ansi-color-bright-green", "bright green", {}], ["ansi-color-bright-yellow", "bright yellow", {}], ["ansi-color-bright-blue", "bright blue", {}], ["ansi-color-bright-magenta", "bright magenta", {}], ["ansi-color-bright-cyan", "bright cyan", {}], ["ansi-color-bright-white", "bright white", {}]]}, "auto-dim-other-buffers": {"label": "auto-dim", "preview": "autodim", "faces": [["auto-dim-other-buffers", "auto dim other buffers", {}], ["auto-dim-other-buffers-hide", "hide", {}]]}, "dashboard": {"label": "dashboard", "preview": "dashboard", "faces": [["dashboard-banner-logo-title", "banner logo title", {"inherit": "default"}], ["dashboard-text-banner", "text banner", {"inherit": "font-lock-keyword-face"}], ["dashboard-heading", "heading", {"inherit": "font-lock-keyword-face"}], ["dashboard-items-face", "items", {"inherit": "widget-button"}], ["dashboard-navigator", "navigator", {"inherit": "font-lock-keyword-face"}], ["dashboard-no-items-face", "no items", {"inherit": "widget-button"}], ["dashboard-footer-face", "footer", {"inherit": "font-lock-doc-face"}], ["dashboard-footer-icon-face", "footer icon", {"inherit": "dashboard-footer-face"}]]}, "lsp-mode": {"label": "lsp-mode", "preview": "lsp", "faces": [["lsp-signature-face", "signature", {"inherit": "lsp-details-face"}], ["lsp-signature-highlight-function-argument", "signature highlight function argument", {"inherit": "eldoc-highlight-function-argument"}], ["lsp-signature-posframe", "signature posframe", {"inherit": "tooltip"}], ["lsp-face-highlight-read", "face highlight read", {"underline": {"style": "line", "color": null}, "inherit": "highlight"}], ["lsp-face-highlight-write", "face highlight write", {"weight": "bold", "inherit": "highlight"}], ["lsp-face-highlight-textual", "face highlight textual", {"inherit": "highlight"}], ["lsp-face-rename", "face rename", {"underline": {"style": "line", "color": null}}], ["lsp-rename-placeholder-face", "rename placeholder", {"inherit": "font-lock-variable-name-face"}], ["lsp-inlay-hint-face", "inlay hint", {"inherit": "font-lock-comment-face"}], ["lsp-inlay-hint-parameter-face", "inlay hint parameter", {"inherit": "lsp-inlay-hint-face"}], ["lsp-inlay-hint-type-face", "inlay hint type", {"inherit": "lsp-inlay-hint-face"}], ["lsp-details-face", "details", {"inherit": "shadow", "height": 0.8}], ["lsp-installation-buffer-face", "installation buffer", {"fg": "#00ff00"}], ["lsp-installation-finished-buffer-face", "installation finished buffer", {"fg": "#ffa500"}]]}, "git-gutter": {"label": "git-gutter", "preview": "gitgutter", "faces": [["git-gutter:added", "added", {"fg": "#00ff00", "weight": "bold", "inherit": "default"}], ["git-gutter:modified", "modified", {"fg": "#ff00ff", "weight": "bold", "inherit": "default"}], ["git-gutter:deleted", "deleted", {"fg": "#ff0000", "weight": "bold", "inherit": "default"}], ["git-gutter:unchanged", "unchanged", {"bg": "#ffff00", "inherit": "default"}], ["git-gutter:separator", "separator", {"fg": "#00ffff", "weight": "bold", "inherit": "default"}]]}, "flycheck": {"label": "flycheck", "preview": "flycheck", "faces": [["flycheck-error", "error", {"underline": {"style": "line", "color": null}}], ["flycheck-warning", "warning", {"underline": {"style": "line", "color": null}}], ["flycheck-info", "info", {"underline": {"style": "line", "color": null}}], ["flycheck-fringe-error", "fringe error", {"inherit": "error"}], ["flycheck-fringe-warning", "fringe warning", {"inherit": "warning"}], ["flycheck-fringe-info", "fringe info", {"inherit": "success"}], ["flycheck-delimited-error", "delimited error", {}], ["flycheck-error-delimiter", "error delimiter", {}], ["flycheck-error-list-error", "error list error", {"inherit": "error"}], ["flycheck-error-list-warning", "error list warning", {"inherit": "warning"}], ["flycheck-error-list-info", "error list info", {"inherit": "success"}], ["flycheck-error-list-error-message", "error list error message", {}], ["flycheck-error-list-checker-name", "error list checker name", {"inherit": "font-lock-function-name-face"}], ["flycheck-error-list-column-number", "error list column number", {}], ["flycheck-error-list-line-number", "error list line number", {}], ["flycheck-error-list-filename", "error list filename", {"inherit": "mode-line-buffer-id"}], ["flycheck-error-list-id", "error list id", {"inherit": "font-lock-type-face"}], ["flycheck-error-list-id-with-explainer", "error list id with explainer", {"box": {"style": "released", "width": 1, "color": null}, "inherit": "flycheck-error-list-id"}], ["flycheck-error-list-highlight", "error list highlight", {"weight": "bold"}], ["flycheck-verify-select-checker", "verify select checker", {"box": {"style": "released", "width": 1, "color": null}}]]}, "dired": {"label": "dired", "preview": "dired", "faces": [["dired-header", "header", {}], ["dired-directory", "directory", {}], ["dired-symlink", "symlink", {}], ["dired-broken-symlink", "broken symlink", {}], ["dired-special", "special", {}], ["dired-set-id", "set id", {}], ["dired-perm-write", "perm write", {}], ["dired-mark", "mark", {}], ["dired-marked", "marked", {}], ["dired-flagged", "flagged", {}], ["dired-ignored", "ignored", {}], ["dired-warning", "warning", {}]]}, "dirvish": {"label": "dirvish", "preview": "dirvish", "faces": [["dirvish-inactive", "inactive", {"inherit": "shadow"}], ["dirvish-free-space", "free space", {"inherit": "font-lock-constant-face"}], ["dirvish-hl-line", "hl line", {"extend": true, "inherit": "highlight"}], ["dirvish-hl-line-inactive", "hl line inactive", {"extend": true, "inherit": "region"}], ["dirvish-file-modes", "file modes", {"fg": "#6b6b6b"}], ["dirvish-file-link-number", "file link number", {"inherit": "font-lock-constant-face"}], ["dirvish-file-user-id", "file user id", {"inherit": "font-lock-preprocessor-face"}], ["dirvish-file-group-id", "file group id", {"inherit": "dirvish-file-user-id"}], ["dirvish-file-size", "file size", {"underline": {"style": "line", "color": null}, "inherit": "completions-annotations"}], ["dirvish-file-time", "file time", {"fg": "#979797"}], ["dirvish-file-inode-number", "file inode number", {"inherit": "dirvish-file-link-number"}], ["dirvish-file-device-number", "file device number", {"inherit": "dirvish-file-link-number"}], ["dirvish-subtree-guide", "subtree guide", {"bg": "unspecified", "underline": {"style": "line", "color": null}, "inherit": "dired-ignored"}], ["dirvish-subtree-state", "subtree state", {"bg": "unspecified", "underline": {"style": "line", "color": null}, "inherit": "dired-ignored"}], ["dirvish-collapse-dir-face", "collapse dir", {"inherit": "dired-directory"}], ["dirvish-collapse-empty-dir-face", "collapse empty dir", {"inherit": "shadow"}], ["dirvish-collapse-file-face", "collapse file", {"inherit": "default"}], ["dirvish-emerge-group-title", "emerge group title", {"inherit": "dired-ignored"}], ["dirvish-media-info-heading", "media info heading", {"inherit": ["dired-header", "bold"]}], ["dirvish-media-info-property-key", "media info property key", {"inherit": ["italic"]}], ["dirvish-narrow-match-face-0", "narrow match 0", {"fg": "#223fbf", "weight": "bold"}], ["dirvish-narrow-match-face-1", "narrow match 1", {"fg": "#8f0075", "weight": "bold"}], ["dirvish-narrow-match-face-2", "narrow match 2", {"fg": "#145a00", "weight": "bold"}], ["dirvish-narrow-match-face-3", "narrow match 3", {"fg": "#804000", "weight": "bold"}], ["dirvish-narrow-split", "narrow split", {"inherit": "font-lock-negation-char-face"}], ["dirvish-proc-running", "proc running", {"inherit": "warning"}], ["dirvish-proc-finished", "proc finished", {"inherit": "success"}], ["dirvish-proc-failed", "proc failed", {"inherit": "error"}], ["dirvish-git-commit-message-face", "git commit message", {"bg": "unspecified", "underline": {"style": "line", "color": null}, "inherit": "dired-ignored"}], ["dirvish-vc-added-state", "vc added state", {"inherit": "vc-locally-added-state"}], ["dirvish-vc-edited-state", "vc edited state", {"inherit": "vc-edited-state"}], ["dirvish-vc-removed-state", "vc removed state", {"inherit": "vc-removed-state"}], ["dirvish-vc-conflict-state", "vc conflict state", {"inherit": "vc-conflict-state"}], ["dirvish-vc-locked-state", "vc locked state", {"inherit": "vc-locked-state"}], ["dirvish-vc-missing-state", "vc missing state", {"inherit": "vc-missing-state"}], ["dirvish-vc-needs-merge-face", "vc needs merge", {"bg": "#efcbcf"}], ["dirvish-vc-needs-update-state", "vc needs update state", {"inherit": "vc-needs-update-state"}], ["dirvish-vc-unregistered-face", "vc unregistered", {"inherit": "font-lock-constant-face"}]]}, "calibredb": {"label": "calibredb", "preview": "calibredb", "faces": [["calibredb-search-header-library-name-face", "search header library name", {}], ["calibredb-search-header-library-path-face", "search header library path", {}], ["calibredb-search-header-total-face", "search header total", {}], ["calibredb-search-header-filter-face", "search header filter", {}], ["calibredb-search-header-sort-face", "search header sort", {}], ["calibredb-search-header-highlight-face", "search header highlight", {}], ["calibredb-id-face", "id", {}], ["calibredb-title-face", "title", {}], ["calibredb-author-face", "author", {}], ["calibredb-format-face", "format", {}], ["calibredb-size-face", "size", {}], ["calibredb-tag-face", "tag", {}], ["calibredb-date-face", "date", {}], ["calibredb-mark-face", "mark", {}], ["calibredb-series-face", "series", {}], ["calibredb-publisher-face", "publisher", {}], ["calibredb-pubdate-face", "pubdate", {}], ["calibredb-language-face", "language", {}], ["calibredb-comment-face", "comment", {}], ["calibredb-archive-face", "archive", {}], ["calibredb-favorite-face", "favorite", {}], ["calibredb-file-face", "file", {}], ["calibredb-ids-face", "ids", {}], ["calibredb-highlight-face", "highlight", {}], ["calibredb-current-page-button-face", "current page button", {}], ["calibredb-mouse-face", "mouse", {}], ["calibredb-title-detailed-view-face", "title detailed view", {}], ["calibredb-edit-annotation-header-title-face", "edit annotation header title", {}]]}, "erc": {"label": "erc", "preview": "erc", "faces": [["erc-header-line", "header line", {}], ["erc-timestamp-face", "timestamp", {}], ["erc-notice-face", "notice", {}], ["erc-default-face", "default", {}], ["erc-current-nick-face", "current nick", {}], ["erc-my-nick-face", "my nick", {}], ["erc-my-nick-prefix-face", "my nick prefix", {}], ["erc-nick-default-face", "nick default", {}], ["erc-nick-prefix-face", "nick prefix", {}], ["erc-button-nick-default-face", "button nick default", {}], ["erc-nick-msg-face", "nick msg", {}], ["erc-direct-msg-face", "direct msg", {}], ["erc-action-face", "action", {}], ["erc-keyword-face", "keyword", {}], ["erc-pal-face", "pal", {}], ["erc-fool-face", "fool", {}], ["erc-dangerous-host-face", "dangerous host", {}], ["erc-error-face", "error", {}], ["erc-input-face", "input", {}], ["erc-prompt-face", "prompt", {}], ["erc-command-indicator-face", "command indicator", {}], ["erc-information", "information", {}], ["erc-button", "button", {}], ["erc-bold-face", "bold", {}], ["erc-italic-face", "italic", {}], ["erc-underline-face", "underline", {}], ["erc-inverse-face", "inverse", {}], ["erc-spoiler-face", "spoiler", {}], ["erc-fill-wrap-merge-indicator-face", "fill wrap merge indicator", {}], ["erc-keep-place-indicator-arrow", "keep place indicator arrow", {}], ["erc-keep-place-indicator-line", "keep place indicator line", {}]]}, "org-drill": {"label": "org-drill", "preview": "orgdrill", "faces": [["org-drill-hidden-cloze-face", "hidden cloze", {}], ["org-drill-visible-cloze-face", "visible cloze", {}], ["org-drill-visible-cloze-hint-face", "visible cloze hint", {}]]}, "org-noter": {"label": "org-noter", "preview": "orgnoter", "faces": [["org-noter-notes-exist-face", "notes exist", {}], ["org-noter-no-notes-exist-face", "no notes exist", {}]]}, "signel": {"label": "signel", "preview": "signel", "faces": [["signel-timestamp-face", "timestamp", {}], ["signel-my-msg-face", "my msg", {}], ["signel-other-msg-face", "other msg", {}], ["signel-error-face", "error", {}]]}, "pearl": {"label": "pearl", "preview": "pearl", "faces": [["pearl-preamble-summary", "preamble summary", {}], ["pearl-editable-comment", "editable comment", {}], ["pearl-readonly-comment", "readonly comment", {}], ["pearl-modified-highlight", "modified highlight", {}], ["pearl-modified-local", "modified local", {}], ["pearl-modified-unknown", "modified unknown", {}]]}, "slack": {"label": "slack", "preview": "slack", "faces": [["slack-room-info-title-face", "room info title", {}], ["slack-room-info-title-room-name-face", "room info title room name", {}], ["slack-room-info-section-title-face", "room info section title", {}], ["slack-room-info-section-label-face", "room info section label", {}], ["slack-room-unread-face", "room unread", {}], ["slack-message-output-header", "message output header", {}], ["slack-message-output-text", "message output text", {}], ["slack-message-output-reaction", "message output reaction", {}], ["slack-message-output-reaction-pressed", "message output reaction pressed", {}], ["slack-message-deleted-face", "message deleted", {}], ["slack-new-message-marker-face", "new message marker", {}], ["slack-all-thread-buffer-thread-header-face", "all thread buffer thread header", {}], ["slack-message-mention-face", "message mention", {}], ["slack-message-mention-me-face", "message mention me", {}], ["slack-message-mention-keyword-face", "message mention keyword", {}], ["slack-channel-button-face", "channel button", {}], ["slack-mrkdwn-bold-face", "mrkdwn bold", {}], ["slack-mrkdwn-italic-face", "mrkdwn italic", {}], ["slack-mrkdwn-code-face", "mrkdwn code", {}], ["slack-mrkdwn-code-block-face", "mrkdwn code block", {}], ["slack-mrkdwn-strike-face", "mrkdwn strike", {}], ["slack-mrkdwn-blockquote-face", "mrkdwn blockquote", {}], ["slack-mrkdwn-list-face", "mrkdwn list", {}], ["slack-attachment-header", "attachment header", {}], ["slack-attachment-footer", "attachment footer", {}], ["slack-attachment-pad", "attachment pad", {}], ["slack-attachment-field-title", "attachment field title", {}], ["slack-message-attachment-preview-header-face", "message attachment preview header", {}], ["slack-preview-face", "preview", {}], ["slack-block-highlight-source-overlay-face", "block highlight source overlay", {}], ["slack-message-action-face", "message action", {}], ["slack-message-action-primary-face", "message action primary", {}], ["slack-message-action-danger-face", "message action danger", {}], ["slack-button-block-element-face", "button block element", {}], ["slack-button-primary-block-element-face", "button primary block element", {}], ["slack-button-danger-block-element-face", "button danger block element", {}], ["slack-select-block-element-face", "select block element", {}], ["slack-overflow-block-element-face", "overflow block element", {}], ["slack-date-picker-block-element-face", "date picker block element", {}], ["slack-dialog-title-face", "dialog title", {}], ["slack-dialog-element-label-face", "dialog element label", {}], ["slack-dialog-element-hint-face", "dialog element hint", {}], ["slack-dialog-element-placeholder-face", "dialog element placeholder", {}], ["slack-dialog-element-error-face", "dialog element error", {}], ["slack-dialog-submit-button-face", "dialog submit button", {}], ["slack-dialog-cancel-button-face", "dialog cancel button", {}], ["slack-dialog-select-element-input-face", "dialog select element input", {}], ["slack-user-active-face", "user active", {}], ["slack-user-dnd-face", "user dnd", {}], ["slack-user-profile-header-face", "user profile header", {}], ["slack-user-profile-property-name-face", "user profile property name", {}], ["slack-profile-image-face", "profile image", {}], ["slack-search-result-message-header-face", "search result message header", {}], ["slack-search-result-message-username-face", "search result message username", {}], ["slack-modeline-has-unreads-face", "modeline has unreads", {}], ["slack-modeline-channel-has-unreads-face", "modeline channel has unreads", {}], ["slack-modeline-thread-has-unreads-face", "modeline thread has unreads", {}]]}, "telega": {"label": "telega", "preview": "telega", "faces": [["telega-root-heading", "root heading", {}], ["telega-tracking", "tracking", {}], ["telega-unread-unmuted-modeline", "unread unmuted modeline", {}], ["telega-username", "username", {}], ["telega-user-online-status", "user online status", {}], ["telega-user-non-online-status", "user non online status", {}], ["telega-secret-title", "secret title", {}], ["telega-contact-birthdays-today", "contact birthdays today", {}], ["telega-muted-count", "muted count", {}], ["telega-unmuted-count", "unmuted count", {}], ["telega-mention-count", "mention count", {}], ["telega-has-chatbuf-brackets", "has chatbuf brackets", {}], ["telega-delim-face", "delim", {}], ["telega-shadow", "shadow", {}], ["telega-link", "link", {}], ["telega-blue", "blue", {}], ["telega-red", "red", {}], ["telega-msg-heading", "msg heading", {}], ["telega-msg-user-title", "msg user title", {}], ["telega-msg-self-title", "msg self title", {}], ["telega-msg-deleted", "msg deleted", {}], ["telega-msg-sponsored", "msg sponsored", {}], ["telega-msg-inline-reply", "msg inline reply", {}], ["telega-msg-inline-forward", "msg inline forward", {}], ["telega-msg-inline-other", "msg inline other", {}], ["telega-entity-type-bold", "entity type bold", {}], ["telega-entity-type-italic", "entity type italic", {}], ["telega-entity-type-underline", "entity type underline", {}], ["telega-entity-type-strikethrough", "entity type strikethrough", {}], ["telega-entity-type-code", "entity type code", {}], ["telega-entity-type-pre", "entity type pre", {}], ["telega-entity-type-blockquote", "entity type blockquote", {}], ["telega-entity-type-mention", "entity type mention", {}], ["telega-entity-type-hashtag", "entity type hashtag", {}], ["telega-entity-type-cashtag", "entity type cashtag", {}], ["telega-entity-type-botcommand", "entity type botcommand", {}], ["telega-entity-type-texturl", "entity type texturl", {}], ["telega-entity-type-spoiler", "entity type spoiler", {}], ["telega-reaction", "reaction", {}], ["telega-reaction-chosen", "reaction chosen", {}], ["telega-reaction-paid", "reaction paid", {}], ["telega-reaction-paid-chosen", "reaction paid chosen", {}], ["telega-highlight-text-face", "highlight text", {}], ["telega-button-highlight", "button highlight", {}], ["telega-chat-prompt", "chat prompt", {}], ["telega-chat-prompt-aux", "chat prompt aux", {}], ["telega-chat-input-attachment", "chat input attachment", {}], ["telega-topic-button", "topic button", {}], ["telega-filter-active", "filter active", {}], ["telega-filter-button-active", "filter button active", {}], ["telega-filter-button-inactive", "filter button inactive", {}], ["telega-checklist-stats-done", "checklist stats done", {}], ["telega-checklist-stats-todo", "checklist stats todo", {}], ["telega-box-button", "box button", {}], ["telega-box-button-active", "box button active", {}], ["telega-box-button-default-active", "box button default active", {}], ["telega-box-button-default-passive", "box button default passive", {}], ["telega-box-button-primary-active", "box button primary active", {}], ["telega-box-button-primary-passive", "box button primary passive", {}], ["telega-box-button-success-active", "box button success active", {}], ["telega-box-button-success-passive", "box button success passive", {}], ["telega-box-button-danger-active", "box button danger active", {}], ["telega-box-button-danger-passive", "box button danger passive", {}], ["telega-box-button-ui-active", "box button ui active", {}], ["telega-box-button-ui-passive", "box button ui passive", {}], ["telega-box-button2-active", "box button2 active", {}], ["telega-box-button2-passive", "box button2 passive", {}], ["telega-box-button2-white-foreground", "box button2 white foreground", {}], ["telega-describe-item-title", "describe item title", {}], ["telega-describe-section-title", "describe section title", {}], ["telega-describe-subsection-title", "describe subsection title", {}], ["telega-enckey-00", "enckey 00", {}], ["telega-enckey-01", "enckey 01", {}], ["telega-enckey-10", "enckey 10", {}], ["telega-enckey-11", "enckey 11", {}], ["telega-palette-builtin-blue", "palette builtin blue", {}], ["telega-palette-builtin-green", "palette builtin green", {}], ["telega-palette-builtin-orange", "palette builtin orange", {}], ["telega-palette-builtin-purple", "palette builtin purple", {}], ["telega-webpage-title", "webpage title", {}], ["telega-webpage-subtitle", "webpage subtitle", {}], ["telega-webpage-header", "webpage header", {}], ["telega-webpage-subheader", "webpage subheader", {}], ["telega-webpage-outline", "webpage outline", {}], ["telega-webpage-fixed", "webpage fixed", {}], ["telega-webpage-preformatted", "webpage preformatted", {}], ["telega-webpage-marked", "webpage marked", {}], ["telega-webpage-strike-through", "webpage strike through", {}], ["telega-webpage-chat-link", "webpage chat link", {}], ["telega-link-preview-sitename", "link preview sitename", {}], ["telega-link-preview-title", "link preview title", {}]]}, "shr": {"label": "shr (HTML: nov/eww/mail)", "preview": "shr", "faces": [["shr-h1", "h1", {}], ["shr-h2", "h2", {}], ["shr-h3", "h3", {}], ["shr-h4", "h4", {}], ["shr-h5", "h5", {}], ["shr-h6", "h6", {}], ["shr-text", "text", {}], ["shr-link", "link", {}], ["shr-selected-link", "selected link", {}], ["shr-code", "code", {}], ["shr-mark", "mark", {}], ["shr-strike-through", "strike through", {}], ["shr-sup", "sup", {}], ["shr-abbreviation", "abbreviation", {}], ["shr-sliced-image", "sliced image", {}]]}, "2048-game": {"label": "2048-game", "preview": "generic", "faces": [["twentyfortyeight-face-1024", "twentyfortyeight 1024", {"fg": "#000000", "bg": "#ffd700"}], ["twentyfortyeight-face-128", "twentyfortyeight 128", {"fg": "#ffffff", "bg": "#8b0000"}], ["twentyfortyeight-face-16", "twentyfortyeight 16", {"fg": "#000000", "bg": "#ffa500"}], ["twentyfortyeight-face-2", "twentyfortyeight 2", {"fg": "#000000", "bg": "#f0e68c"}], ["twentyfortyeight-face-2048", "twentyfortyeight 2048", {"fg": "#000000", "bg": "#ffff00"}], ["twentyfortyeight-face-256", "twentyfortyeight 256", {"fg": "#ffffff", "bg": "#8b008b"}], ["twentyfortyeight-face-32", "twentyfortyeight 32", {"fg": "#000000", "bg": "#ff4500"}], ["twentyfortyeight-face-4", "twentyfortyeight 4", {"fg": "#000000", "bg": "#deb887"}], ["twentyfortyeight-face-512", "twentyfortyeight 512", {"fg": "#000000", "bg": "#ff00ff"}], ["twentyfortyeight-face-64", "twentyfortyeight 64", {"fg": "#ffffff", "bg": "#b22222"}], ["twentyfortyeight-face-8", "twentyfortyeight 8", {"fg": "#000000", "bg": "#cd8500"}]]}, "alert": {"label": "alert", "preview": "generic", "faces": [["alert-high-face", "high", {"fg": "#ff8c00", "weight": "bold"}], ["alert-low-face", "low", {"fg": "#00008b"}], ["alert-moderate-face", "moderate", {"fg": "#ffd700", "weight": "bold"}], ["alert-normal-face", "normal", {}], ["alert-trivial-face", "trivial", {"fg": "#9400d3"}], ["alert-urgent-face", "urgent", {"fg": "#ff0000", "weight": "bold"}]]}, "all-the-icons": {"label": "all-the-icons", "preview": "generic", "faces": [["all-the-icons-blue", "blue", {"fg": "#6a9fb5"}], ["all-the-icons-blue-alt", "blue alt", {"fg": "#2188b6"}], ["all-the-icons-cyan", "cyan", {"fg": "#75b5aa"}], ["all-the-icons-cyan-alt", "cyan alt", {"fg": "#0595bd"}], ["all-the-icons-dblue", "dblue", {"fg": "#446674"}], ["all-the-icons-dcyan", "dcyan", {"fg": "#48746d"}], ["all-the-icons-dgreen", "dgreen", {"fg": "#6d8143"}], ["all-the-icons-dmaroon", "dmaroon", {"fg": "#72584b"}], ["all-the-icons-dorange", "dorange", {"fg": "#915b2d"}], ["all-the-icons-dpink", "dpink", {"fg": "#7e5d5f"}], ["all-the-icons-dpurple", "dpurple", {"fg": "#694863"}], ["all-the-icons-dred", "dred", {"fg": "#843031"}], ["all-the-icons-dsilver", "dsilver", {"fg": "#838484"}], ["all-the-icons-dyellow", "dyellow", {"fg": "#b48d56"}], ["all-the-icons-green", "green", {"fg": "#90a959"}], ["all-the-icons-lblue", "lblue", {"fg": "#677174"}], ["all-the-icons-lcyan", "lcyan", {"fg": "#2c7d6e"}], ["all-the-icons-lgreen", "lgreen", {"fg": "#3d6837"}], ["all-the-icons-lmaroon", "lmaroon", {"fg": "#ce7a4e"}], ["all-the-icons-lorange", "lorange", {"fg": "#ffa500"}], ["all-the-icons-lpink", "lpink", {"fg": "#ff505b"}], ["all-the-icons-lpurple", "lpurple", {"fg": "#e69dd6"}], ["all-the-icons-lred", "lred", {"fg": "#eb595a"}], ["all-the-icons-lsilver", "lsilver", {"fg": "#7f7869"}], ["all-the-icons-lyellow", "lyellow", {"fg": "#ff9300"}], ["all-the-icons-maroon", "maroon", {"fg": "#8f5536"}], ["all-the-icons-orange", "orange", {"fg": "#d4843e"}], ["all-the-icons-pink", "pink", {"fg": "#fc505b"}], ["all-the-icons-purple", "purple", {"fg": "#68295b"}], ["all-the-icons-purple-alt", "purple alt", {"fg": "#5d54e1"}], ["all-the-icons-red", "red", {"fg": "#ac4142"}], ["all-the-icons-red-alt", "red alt", {"fg": "#843031"}], ["all-the-icons-silver", "silver", {"fg": "#716e68"}], ["all-the-icons-yellow", "yellow", {"fg": "#ffcc0e"}]]}, "company": {"label": "company", "preview": "generic", "faces": [["company-echo", "echo", {}], ["company-echo-common", "echo common", {"fg": "#8b1a1a"}], ["company-preview", "preview", {"inherit": ["company-tooltip-selection", "company-tooltip"]}], ["company-preview-common", "preview common", {"inherit": "company-tooltip-common-selection"}], ["company-preview-search", "preview search", {"inherit": "company-tooltip-common-selection"}], ["company-tooltip", "tooltip", {"fg": "#000000", "bg": "#fff8dc"}], ["company-tooltip-annotation", "tooltip annotation", {"fg": "#8b1a1a"}], ["company-tooltip-annotation-selection", "tooltip annotation selection", {"inherit": "company-tooltip-annotation"}], ["company-tooltip-common", "tooltip common", {"fg": "#8b0000"}], ["company-tooltip-common-selection", "tooltip common selection", {"inherit": "company-tooltip-common"}], ["company-tooltip-deprecated", "tooltip deprecated", {"strike": {"color": null}}], ["company-tooltip-mouse", "tooltip mouse", {"inherit": "highlight"}], ["company-tooltip-quick-access", "tooltip quick access", {"inherit": "company-tooltip-annotation"}], ["company-tooltip-quick-access-selection", "tooltip quick access selection", {"inherit": "company-tooltip-annotation-selection"}], ["company-tooltip-scrollbar-thumb", "tooltip scrollbar thumb", {"bg": "#cd5c5c"}], ["company-tooltip-scrollbar-track", "tooltip scrollbar track", {"bg": "#f5deb3"}], ["company-tooltip-search", "tooltip search", {"inherit": "highlight"}], ["company-tooltip-search-selection", "tooltip search selection", {"inherit": "highlight"}], ["company-tooltip-selection", "tooltip selection", {"bg": "#add8e6"}]]}, "company-box": {"label": "company-box", "preview": "generic", "faces": [["company-box-annotation", "annotation", {"inherit": "company-tooltip-annotation"}], ["company-box-background", "background", {"inherit": "company-tooltip"}], ["company-box-candidate", "candidate", {"fg": "#000000"}], ["company-box-numbers", "numbers", {"inherit": "company-box-candidate"}], ["company-box-scrollbar", "scrollbar", {"inherit": "company-tooltip-selection"}], ["company-box-selection", "selection", {"extend": true, "inherit": "company-tooltip-selection"}]]}, "consult": {"label": "consult", "preview": "generic", "faces": [["consult-async-failed", "async failed", {"inherit": "error"}], ["consult-async-finished", "async finished", {"inherit": "success"}], ["consult-async-running", "async running", {"inherit": "consult-narrow-indicator"}], ["consult-async-split", "async split", {"inherit": "font-lock-negation-char-face"}], ["consult-bookmark", "bookmark", {"inherit": "font-lock-constant-face"}], ["consult-buffer", "buffer", {}], ["consult-file", "file", {"inherit": "font-lock-function-name-face"}], ["consult-grep-context", "grep context", {"inherit": "shadow"}], ["consult-help", "help", {"inherit": "shadow"}], ["consult-highlight-mark", "highlight mark", {"inherit": "consult-highlight-match"}], ["consult-highlight-match", "highlight match", {"inherit": "match"}], ["consult-key", "key", {"inherit": "font-lock-keyword-face"}], ["consult-line-number", "line number", {"inherit": "consult-key"}], ["consult-line-number-prefix", "line number prefix", {"inherit": "line-number"}], ["consult-line-number-wrapped", "line number wrapped", {"inherit": "warning"}], ["consult-narrow-indicator", "narrow indicator", {"inherit": "warning"}], ["consult-preview-insertion", "preview insertion", {"inherit": "region"}], ["consult-preview-line", "preview line", {"extend": true, "inherit": "consult-preview-insertion"}], ["consult-preview-match", "preview match", {"inherit": "isearch"}], ["consult-separator", "separator", {}]]}, "embark": {"label": "embark", "preview": "generic", "faces": [["embark-collect-annotation", "collect annotation", {"inherit": "completions-annotations"}], ["embark-collect-candidate", "collect candidate", {"inherit": "default"}], ["embark-collect-group-separator", "collect group separator", {"slant": "italic", "strike": {"color": null}, "inherit": "shadow"}], ["embark-collect-group-title", "collect group title", {"slant": "italic", "inherit": "shadow"}], ["embark-keybinding", "keybinding", {"inherit": "success"}], ["embark-keybinding-repeat", "keybinding repeat", {"inherit": "font-lock-builtin-face"}], ["embark-keymap", "keymap", {"slant": "italic"}], ["embark-selected", "selected", {"inherit": "match"}], ["embark-target", "target", {"inherit": "highlight"}], ["embark-verbose-indicator-documentation", "verbose indicator documentation", {"inherit": "completions-annotations"}], ["embark-verbose-indicator-shadowed", "verbose indicator shadowed", {"inherit": "shadow"}], ["embark-verbose-indicator-title", "verbose indicator title", {"weight": "bold", "height": 1.1}]]}, "emms": {"label": "emms", "preview": "generic", "faces": [["emms-browser-album-face", "browser album", {}], ["emms-browser-albumartist-face", "browser albumartist", {}], ["emms-browser-artist-face", "browser artist", {}], ["emms-browser-composer-face", "browser composer", {}], ["emms-browser-performer-face", "browser performer", {}], ["emms-browser-track-face", "browser track", {}], ["emms-browser-year/genre-face", "browser year/genre", {}], ["emms-metaplaylist-mode-current-face", "metaplaylist mode current", {"fg": "#ffffff", "bg": "#cd0000"}], ["emms-metaplaylist-mode-face", "metaplaylist mode", {"fg": "#cd0000"}], ["emms-playlist-selected-face", "playlist selected", {"fg": "#ffffff", "bg": "#0000cd"}], ["emms-playlist-track-face", "playlist track", {"fg": "#0000ff"}]]}, "flyspell-correct": {"label": "flyspell-correct", "preview": "generic", "faces": [["flyspell-correct-highlight-face", "highlight", {"inherit": "isearch"}]]}, "highlight-indent-guides": {"label": "highlight-indent-guides", "preview": "generic", "faces": [["highlight-indent-guides-character-face", "character", {}], ["highlight-indent-guides-even-face", "even", {}], ["highlight-indent-guides-odd-face", "odd", {}], ["highlight-indent-guides-stack-character-face", "stack character", {}], ["highlight-indent-guides-stack-even-face", "stack even", {}], ["highlight-indent-guides-stack-odd-face", "stack odd", {}], ["highlight-indent-guides-top-character-face", "top character", {}], ["highlight-indent-guides-top-even-face", "top even", {}], ["highlight-indent-guides-top-odd-face", "top odd", {}]]}, "hl-todo": {"label": "hl-todo", "preview": "generic", "faces": [["hl-todo", "hl todo", {"fg": "#cc9393", "weight": "bold"}], ["hl-todo-flymake-type", "flymake type", {"inherit": "font-lock-keyword-face"}]]}, "json-mode": {"label": "json-mode", "preview": "generic", "faces": [["json-mode-object-name-face", "object name", {}]]}, "llama": {"label": "llama", "preview": "generic", "faces": [["llama-##-macro", "## macro", {"inherit": "font-lock-function-call-face"}], ["llama-deleted-argument", "deleted argument", {"box": {"style": "line", "width": 1, "color": "#ff0000"}}], ["llama-llama-macro", "llama macro", {"inherit": "font-lock-keyword-face"}], ["llama-mandatory-argument", "mandatory argument", {"inherit": "font-lock-variable-use-face"}], ["llama-optional-argument", "optional argument", {"inherit": "font-lock-type-face"}]]}, "lv": {"label": "lv", "preview": "generic", "faces": [["lv-separator", "separator", {"bg": "#cccccc"}]]}, "magit-section": {"label": "magit-section", "preview": "generic", "faces": [["magit-left-margin", "magit left margin", {"inherit": "default"}], ["magit-section-child-count", "child count", {}], ["magit-section-heading", "heading", {"fg": "#8b6508", "weight": "bold", "extend": true}], ["magit-section-heading-selection", "heading selection", {"fg": "#8b4c39", "extend": true}], ["magit-section-highlight", "highlight", {"bg": "#f2f2f2", "extend": true}], ["magit-section-secondary-heading", "secondary heading", {"weight": "bold", "extend": true}]]}, "malyon": {"label": "malyon", "preview": "generic", "faces": [["malyon-face-bold", "face bold", {"inherit": "bold"}], ["malyon-face-error", "face error", {"inherit": "error"}], ["malyon-face-italic", "face italic", {"inherit": "italic"}], ["malyon-face-plain", "face plain", {"inherit": "default"}], ["malyon-face-reverse", "face reverse", {"inverse": true, "inherit": "default"}]]}, "marginalia": {"label": "marginalia", "preview": "generic", "faces": [["marginalia-archive", "archive", {"inherit": "warning"}], ["marginalia-char", "char", {"inherit": "marginalia-key"}], ["marginalia-date", "date", {"inherit": "marginalia-key"}], ["marginalia-documentation", "documentation", {"inherit": "completions-annotations"}], ["marginalia-file-name", "file name", {"inherit": "marginalia-documentation"}], ["marginalia-file-owner", "file owner", {"inherit": "font-lock-preprocessor-face"}], ["marginalia-file-priv-dir", "file priv dir", {"inherit": "font-lock-keyword-face"}], ["marginalia-file-priv-exec", "file priv exec", {"inherit": "font-lock-function-name-face"}], ["marginalia-file-priv-link", "file priv link", {"inherit": "font-lock-keyword-face"}], ["marginalia-file-priv-no", "file priv no", {"inherit": "shadow"}], ["marginalia-file-priv-other", "file priv other", {"inherit": "font-lock-constant-face"}], ["marginalia-file-priv-rare", "file priv rare", {"inherit": "font-lock-variable-name-face"}], ["marginalia-file-priv-read", "file priv read", {"inherit": "font-lock-type-face"}], ["marginalia-file-priv-write", "file priv write", {"inherit": "font-lock-builtin-face"}], ["marginalia-function", "function", {"inherit": "font-lock-function-name-face"}], ["marginalia-installed", "installed", {"inherit": "success"}], ["marginalia-key", "key", {"inherit": "font-lock-keyword-face"}], ["marginalia-lighter", "lighter", {"inherit": "marginalia-size"}], ["marginalia-list", "list", {"inherit": "font-lock-constant-face"}], ["marginalia-mode", "mode", {"inherit": "marginalia-key"}], ["marginalia-modified", "modified", {"inherit": "font-lock-negation-char-face"}], ["marginalia-null", "null", {"inherit": "font-lock-comment-face"}], ["marginalia-number", "number", {"inherit": "font-lock-constant-face"}], ["marginalia-off", "off", {"inherit": "error"}], ["marginalia-on", "on", {"inherit": "success"}], ["marginalia-size", "size", {"inherit": "marginalia-number"}], ["marginalia-string", "string", {"inherit": "font-lock-string-face"}], ["marginalia-symbol", "symbol", {"inherit": "font-lock-type-face"}], ["marginalia-true", "true", {"inherit": "font-lock-builtin-face"}], ["marginalia-type", "type", {"inherit": "marginalia-key"}], ["marginalia-value", "value", {"inherit": "marginalia-key"}], ["marginalia-version", "version", {"inherit": "marginalia-number"}]]}, "markdown-mode": {"label": "markdown-mode", "preview": "markdown", "faces": [["markdown-blockquote-face", "markdown blockquote", {"inherit": "font-lock-doc-face"}], ["markdown-bold-face", "markdown bold", {"inherit": "bold"}], ["markdown-code-face", "markdown code", {"inherit": "fixed-pitch"}], ["markdown-comment-face", "markdown comment", {"inherit": "font-lock-comment-face"}], ["markdown-footnote-marker-face", "markdown footnote marker", {"inherit": "markdown-markup-face"}], ["markdown-footnote-text-face", "markdown footnote text", {"inherit": "font-lock-comment-face"}], ["markdown-gfm-checkbox-face", "markdown gfm checkbox", {"inherit": "font-lock-builtin-face"}], ["markdown-header-delimiter-face", "markdown header delimiter", {"inherit": "markdown-markup-face"}], ["markdown-header-face", "markdown header", {"weight": "bold", "inherit": ["font-lock-function-name-face"]}], ["markdown-header-face-1", "markdown header 1", {"inherit": "markdown-header-face"}], ["markdown-header-face-2", "markdown header 2", {"inherit": "markdown-header-face"}], ["markdown-header-face-3", "markdown header 3", {"inherit": "markdown-header-face"}], ["markdown-header-face-4", "markdown header 4", {"inherit": "markdown-header-face"}], ["markdown-header-face-5", "markdown header 5", {"inherit": "markdown-header-face"}], ["markdown-header-face-6", "markdown header 6", {"inherit": "markdown-header-face"}], ["markdown-header-rule-face", "markdown header rule", {"inherit": "markdown-markup-face"}], ["markdown-highlight-face", "markdown highlight", {"inherit": "highlight"}], ["markdown-highlighting-face", "markdown highlighting", {"fg": "#000000", "bg": "#ffff00"}], ["markdown-hr-face", "markdown hr", {"inherit": "markdown-markup-face"}], ["markdown-html-attr-name-face", "markdown html attr name", {"inherit": "font-lock-variable-name-face"}], ["markdown-html-attr-value-face", "markdown html attr value", {"inherit": "font-lock-string-face"}], ["markdown-html-entity-face", "markdown html entity", {"inherit": "font-lock-variable-name-face"}], ["markdown-html-tag-delimiter-face", "markdown html tag delimiter", {"inherit": "markdown-markup-face"}], ["markdown-html-tag-name-face", "markdown html tag name", {"inherit": "font-lock-type-face"}], ["markdown-inline-code-face", "markdown inline code", {"inherit": ["markdown-code-face", "font-lock-constant-face"]}], ["markdown-italic-face", "markdown italic", {"inherit": "italic"}], ["markdown-language-info-face", "markdown language info", {"inherit": "font-lock-string-face"}], ["markdown-language-keyword-face", "markdown language keyword", {"inherit": "font-lock-type-face"}], ["markdown-line-break-face", "markdown line break", {"underline": {"style": "line", "color": null}, "inherit": "font-lock-constant-face"}], ["markdown-link-face", "markdown link", {"inherit": "link"}], ["markdown-link-title-face", "markdown link title", {"inherit": "font-lock-comment-face"}], ["markdown-list-face", "markdown list", {"inherit": "markdown-markup-face"}], ["markdown-markup-face", "markdown markup", {"inherit": "shadow"}], ["markdown-math-face", "markdown math", {"inherit": "font-lock-string-face"}], ["markdown-metadata-key-face", "markdown metadata key", {"inherit": "font-lock-variable-name-face"}], ["markdown-metadata-value-face", "markdown metadata value", {"inherit": "font-lock-string-face"}], ["markdown-missing-link-face", "markdown missing link", {"inherit": "font-lock-warning-face"}], ["markdown-plain-url-face", "markdown plain url", {"inherit": "markdown-link-face"}], ["markdown-pre-face", "markdown pre", {"inherit": ["markdown-code-face", "font-lock-constant-face"]}], ["markdown-reference-face", "markdown reference", {"inherit": "markdown-markup-face"}], ["markdown-strike-through-face", "markdown strike through", {"strike": {"color": null}}], ["markdown-table-face", "markdown table", {"inherit": ["markdown-code-face"]}], ["markdown-url-face", "markdown url", {"inherit": "font-lock-string-face"}]]}, "nerd-icons": {"label": "nerd-icons", "preview": "generic", "faces": [["nerd-icons-blue", "blue", {"fg": "#6a9fb5"}], ["nerd-icons-blue-alt", "blue alt", {"fg": "#2188b6"}], ["nerd-icons-cyan", "cyan", {"fg": "#75b5aa"}], ["nerd-icons-cyan-alt", "cyan alt", {"fg": "#0595bd"}], ["nerd-icons-dblue", "dblue", {"fg": "#446674"}], ["nerd-icons-dcyan", "dcyan", {"fg": "#48746d"}], ["nerd-icons-dgreen", "dgreen", {"fg": "#6d8143"}], ["nerd-icons-dmaroon", "dmaroon", {"fg": "#72584b"}], ["nerd-icons-dorange", "dorange", {"fg": "#915b2d"}], ["nerd-icons-dpink", "dpink", {"fg": "#7e5d5f"}], ["nerd-icons-dpurple", "dpurple", {"fg": "#694863"}], ["nerd-icons-dred", "dred", {"fg": "#843031"}], ["nerd-icons-dsilver", "dsilver", {"fg": "#838484"}], ["nerd-icons-dyellow", "dyellow", {"fg": "#b48d56"}], ["nerd-icons-green", "green", {"fg": "#90a959"}], ["nerd-icons-lblue", "lblue", {"fg": "#677174"}], ["nerd-icons-lcyan", "lcyan", {"fg": "#2c7d6e"}], ["nerd-icons-lgreen", "lgreen", {"fg": "#3d6837"}], ["nerd-icons-lmaroon", "lmaroon", {"fg": "#ce7a4e"}], ["nerd-icons-lorange", "lorange", {"fg": "#ffa500"}], ["nerd-icons-lpink", "lpink", {"fg": "#ff505b"}], ["nerd-icons-lpurple", "lpurple", {"fg": "#e69dd6"}], ["nerd-icons-lred", "lred", {"fg": "#eb595a"}], ["nerd-icons-lsilver", "lsilver", {"fg": "#7f7869"}], ["nerd-icons-lyellow", "lyellow", {"fg": "#ff9300"}], ["nerd-icons-maroon", "maroon", {"fg": "#8f5536"}], ["nerd-icons-orange", "orange", {"fg": "#d4843e"}], ["nerd-icons-pink", "pink", {"fg": "#fc505b"}], ["nerd-icons-purple", "purple", {"fg": "#68295b"}], ["nerd-icons-purple-alt", "purple alt", {"fg": "#5d54e1"}], ["nerd-icons-red", "red", {"fg": "#ac4142"}], ["nerd-icons-red-alt", "red alt", {"fg": "#843031"}], ["nerd-icons-silver", "silver", {"fg": "#716e68"}], ["nerd-icons-yellow", "yellow", {"fg": "#ffcc0e"}]]}, "nerd-icons-completion": {"label": "nerd-icons-completion", "preview": "generic", "faces": [["nerd-icons-completion-dir-face", "dir", {}]]}, "orderless": {"label": "orderless", "preview": "generic", "faces": [["orderless-match-face-0", "match 0", {"fg": "#223fbf", "weight": "bold"}], ["orderless-match-face-1", "match 1", {"fg": "#8f0075", "weight": "bold"}], ["orderless-match-face-2", "match 2", {"fg": "#145a00", "weight": "bold"}], ["orderless-match-face-3", "match 3", {"fg": "#804000", "weight": "bold"}]]}, "org-roam": {"label": "org-roam", "preview": "generic", "faces": [["org-roam-dailies-calendar-note", "dailies calendar note", {"underline": {"style": "line", "color": null}, "inherit": ["org-link"]}], ["org-roam-dim", "dim", {"fg": "#999999"}], ["org-roam-header-line", "header line", {"fg": "#8b6508", "weight": "bold", "extend": true}], ["org-roam-olp", "olp", {"fg": "#999999"}], ["org-roam-preview-heading", "preview heading", {"fg": "#4d4d4d", "bg": "#cccccc", "extend": true}], ["org-roam-preview-heading-highlight", "preview heading highlight", {"fg": "#4d4d4d", "bg": "#bfbfbf", "extend": true}], ["org-roam-preview-heading-selection", "preview heading selection", {"fg": "#8b4c39", "extend": true, "inherit": "org-roam-preview-heading-highlight"}], ["org-roam-preview-region", "preview region", {"inherit": "bold"}], ["org-roam-title", "title", {"weight": "bold"}]]}, "org-superstar": {"label": "org-superstar", "preview": "generic", "faces": [["org-superstar-first", "first", {"inherit": "org-warning"}], ["org-superstar-header-bullet", "header bullet", {}], ["org-superstar-item", "item", {"inherit": "default"}], ["org-superstar-leading", "leading", {"fg": "#bebebe", "inherit": "default"}]]}, "prescient": {"label": "prescient", "preview": "generic", "faces": [["prescient-primary-highlight", "primary highlight", {"weight": "bold"}], ["prescient-secondary-highlight", "secondary highlight", {"underline": {"style": "line", "color": null}, "inherit": "prescient-primary-highlight"}]]}, "rainbow-delimiters": {"label": "rainbow-delimiters", "preview": "generic", "faces": [["rainbow-delimiters-base-error-face", "base error", {"fg": "#88090b", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-base-face", "base", {"inherit": "unspecified"}], ["rainbow-delimiters-depth-1-face", "depth 1", {"fg": "#707183", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-2-face", "depth 2", {"fg": "#7388d6", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-3-face", "depth 3", {"fg": "#909183", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-4-face", "depth 4", {"fg": "#709870", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-5-face", "depth 5", {"fg": "#907373", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-6-face", "depth 6", {"fg": "#6276ba", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-7-face", "depth 7", {"fg": "#858580", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-8-face", "depth 8", {"fg": "#80a880", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-depth-9-face", "depth 9", {"fg": "#887070", "inherit": "rainbow-delimiters-base-face"}], ["rainbow-delimiters-mismatched-face", "mismatched", {"inherit": "rainbow-delimiters-unmatched-face"}], ["rainbow-delimiters-unmatched-face", "unmatched", {"inherit": "rainbow-delimiters-base-error-face"}]]}, "symbol-overlay": {"label": "symbol-overlay", "preview": "generic", "faces": [["symbol-overlay-default-face", "default", {"inherit": "highlight"}], ["symbol-overlay-face-1", "face 1", {"fg": "#000000", "bg": "#1e90ff"}], ["symbol-overlay-face-2", "face 2", {"fg": "#000000", "bg": "#ff69b4"}], ["symbol-overlay-face-3", "face 3", {"fg": "#000000", "bg": "#ffff00"}], ["symbol-overlay-face-4", "face 4", {"fg": "#000000", "bg": "#da70d6"}], ["symbol-overlay-face-5", "face 5", {"fg": "#000000", "bg": "#ff0000"}], ["symbol-overlay-face-6", "face 6", {"fg": "#000000", "bg": "#fa8072"}], ["symbol-overlay-face-7", "face 7", {"fg": "#000000", "bg": "#00ff7f"}], ["symbol-overlay-face-8", "face 8", {"fg": "#000000", "bg": "#40e0d0"}]]}, "tmr": {"label": "tmr", "preview": "generic", "faces": [["tmr-description", "description", {"inherit": "bold"}], ["tmr-duration", "duration", {}], ["tmr-end-time", "end time", {"inherit": "error"}], ["tmr-finished", "finished", {"inherit": "error"}], ["tmr-is-acknowledged", "is acknowledged", {"inherit": "success"}], ["tmr-must-be-acknowledged", "must be acknowledged", {"inherit": "warning"}], ["tmr-start-time", "start time", {"inherit": "success"}], ["tmr-tabulated-acknowledgement", "tabulated acknowledgement", {"inherit": "bold"}], ["tmr-tabulated-description", "tabulated description", {"inherit": "font-lock-doc-face"}], ["tmr-tabulated-end-time", "tabulated end time", {"fg": "#800040"}], ["tmr-tabulated-remaining-time", "tabulated remaining time", {"fg": "#603f00"}], ["tmr-tabulated-start-time", "tabulated start time", {"fg": "#004476"}]]}, "transient": {"label": "transient", "preview": "generic", "faces": [["transient-active-infix", "active infix", {"inherit": "highlight"}], ["transient-argument", "argument", {"weight": "bold", "inherit": "font-lock-string-face"}], ["transient-delimiter", "delimiter", {"inherit": "shadow"}], ["transient-disabled-suffix", "disabled suffix", {"fg": "#000000", "bg": "#ff0000", "weight": "bold"}], ["transient-enabled-suffix", "enabled suffix", {"fg": "#000000", "bg": "#00ff00", "weight": "bold"}], ["transient-heading", "heading", {"inherit": "font-lock-keyword-face"}], ["transient-higher-level", "higher level", {"box": {"style": "line", "width": 1, "color": "#999999"}}], ["transient-inactive-argument", "inactive argument", {"inherit": "shadow"}], ["transient-inactive-value", "inactive value", {"inherit": "shadow"}], ["transient-inapt-argument", "inapt argument", {"weight": "bold", "inherit": "shadow"}], ["transient-inapt-suffix", "inapt suffix", {"slant": "italic", "inherit": "shadow"}], ["transient-key", "key", {"inherit": "font-lock-builtin-face"}], ["transient-key-exit", "key exit", {"fg": "#aa2222", "inherit": "transient-key"}], ["transient-key-noop", "key noop", {"fg": "#cccccc", "inherit": "transient-key"}], ["transient-key-recurse", "key recurse", {"fg": "#2266ff", "inherit": "transient-key"}], ["transient-key-return", "key return", {"fg": "#aaaa11", "inherit": "transient-key"}], ["transient-key-stack", "key stack", {"fg": "#dd4488", "inherit": "transient-key"}], ["transient-key-stay", "key stay", {"fg": "#22aa22", "inherit": "transient-key"}], ["transient-mismatched-key", "mismatched key", {"box": {"style": "line", "width": 1, "color": "#ff00ff"}}], ["transient-nonstandard-key", "nonstandard key", {"box": {"style": "line", "width": 1, "color": "#00ffff"}}], ["transient-unreachable", "unreachable", {"inherit": "shadow"}], ["transient-unreachable-key", "unreachable key", {"inherit": ["shadow", "transient-key"]}], ["transient-value", "value", {"weight": "bold", "inherit": "font-lock-string-face"}]]}, "vertico": {"label": "vertico", "preview": "generic", "faces": [["vertico-current", "current", {"extend": true, "inherit": "highlight"}], ["vertico-group-separator", "group separator", {"strike": {"color": null}, "inherit": "vertico-group-title"}], ["vertico-group-title", "group title", {"slant": "italic", "inherit": "shadow"}], ["vertico-multiline", "multiline", {"inherit": "shadow"}]]}, "web-mode": {"label": "web-mode", "preview": "generic", "faces": [["web-mode-annotation-face", "annotation", {"inherit": "web-mode-comment-face"}], ["web-mode-annotation-html-face", "annotation html", {"slant": "italic", "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-tag-face", "annotation tag", {"underline": {"style": "line", "color": null}, "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-type-face", "annotation type", {"weight": "bold", "inherit": "web-mode-annotation-face"}], ["web-mode-annotation-value-face", "annotation value", {"slant": "italic", "inherit": "web-mode-annotation-face"}], ["web-mode-block-attr-name-face", "block attr name", {"fg": "#8fbc8f"}], ["web-mode-block-attr-value-face", "block attr value", {"fg": "#5f9ea0"}], ["web-mode-block-comment-face", "block comment", {"inherit": "web-mode-comment-face"}], ["web-mode-block-control-face", "block control", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-block-delimiter-face", "block delimiter", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-block-face", "block", {"bg": "#ffffe0"}], ["web-mode-block-string-face", "block string", {"inherit": "web-mode-string-face"}], ["web-mode-bold-face", "bold", {"weight": "bold"}], ["web-mode-builtin-face", "builtin", {"inherit": "font-lock-builtin-face"}], ["web-mode-comment-face", "comment", {"inherit": "font-lock-comment-face"}], ["web-mode-comment-keyword-face", "comment keyword", {"weight": "bold"}], ["web-mode-constant-face", "constant", {"inherit": "font-lock-constant-face"}], ["web-mode-css-at-rule-face", "css at rule", {"inherit": "font-lock-constant-face"}], ["web-mode-css-color-face", "css color", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-comment-face", "css comment", {"inherit": "web-mode-comment-face"}], ["web-mode-css-function-face", "css function", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-priority-face", "css priority", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-property-name-face", "css property name", {"inherit": "font-lock-variable-name-face"}], ["web-mode-css-pseudo-class-face", "css pseudo class", {"inherit": "font-lock-builtin-face"}], ["web-mode-css-selector-class-face", "css selector class", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-selector-face", "css selector", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-selector-tag-face", "css selector tag", {"inherit": "font-lock-keyword-face"}], ["web-mode-css-string-face", "css string", {"inherit": "web-mode-string-face"}], ["web-mode-css-variable-face", "css variable", {"slant": "italic", "inherit": "web-mode-variable-name-face"}], ["web-mode-current-column-highlight-face", "current column highlight", {"bg": "#3e3c36"}], ["web-mode-current-element-highlight-face", "current element highlight", {"fg": "#ffffff", "bg": "#000000"}], ["web-mode-doctype-face", "doctype", {"fg": "#bebebe"}], ["web-mode-error-face", "error", {"bg": "#ff0000"}], ["web-mode-filter-face", "filter", {"inherit": "font-lock-function-name-face"}], ["web-mode-folded-face", "folded", {"underline": {"style": "line", "color": null}}], ["web-mode-function-call-face", "function call", {"inherit": "font-lock-function-name-face"}], ["web-mode-function-name-face", "function name", {"inherit": "font-lock-function-name-face"}], ["web-mode-html-attr-custom-face", "html attr custom", {"inherit": "web-mode-html-attr-name-face"}], ["web-mode-html-attr-engine-face", "html attr engine", {"inherit": "web-mode-block-delimiter-face"}], ["web-mode-html-attr-equal-face", "html attr equal", {"inherit": "web-mode-html-attr-name-face"}], ["web-mode-html-attr-name-face", "html attr name", {"fg": "#8b8989"}], ["web-mode-html-attr-value-face", "html attr value", {"inherit": "font-lock-string-face"}], ["web-mode-html-entity-face", "html entity", {"slant": "italic"}], ["web-mode-html-tag-bracket-face", "html tag bracket", {"fg": "#242424"}], ["web-mode-html-tag-custom-face", "html tag custom", {"inherit": "web-mode-html-tag-face"}], ["web-mode-html-tag-face", "html tag", {"fg": "#8b8989"}], ["web-mode-html-tag-namespaced-face", "html tag namespaced", {"inherit": "web-mode-block-control-face"}], ["web-mode-html-tag-unclosed-face", "html tag unclosed", {"underline": {"style": "line", "color": null}, "inherit": "web-mode-html-tag-face"}], ["web-mode-inlay-face", "inlay", {"bg": "#ffffe0"}], ["web-mode-interpolate-color1-face", "interpolate color1", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color2-face", "interpolate color2", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color3-face", "interpolate color3", {"inherit": "web-mode-string-face"}], ["web-mode-interpolate-color4-face", "interpolate color4", {"inherit": "web-mode-string-face"}], ["web-mode-italic-face", "italic", {"slant": "italic"}], ["web-mode-javascript-comment-face", "javascript comment", {"inherit": "web-mode-comment-face"}], ["web-mode-javascript-string-face", "javascript string", {"inherit": "web-mode-string-face"}], ["web-mode-json-comment-face", "json comment", {"inherit": "web-mode-comment-face"}], ["web-mode-json-context-face", "json context", {"fg": "#cd69c9"}], ["web-mode-json-key-face", "json key", {"fg": "#dda0dd"}], ["web-mode-json-string-face", "json string", {"inherit": "web-mode-string-face"}], ["web-mode-jsx-depth-1-face", "jsx depth 1", {"bg": "#000053"}], ["web-mode-jsx-depth-2-face", "jsx depth 2", {"bg": "#001970"}], ["web-mode-jsx-depth-3-face", "jsx depth 3", {"bg": "#002984"}], ["web-mode-jsx-depth-4-face", "jsx depth 4", {"bg": "#49599a"}], ["web-mode-jsx-depth-5-face", "jsx depth 5", {"bg": "#9499b7"}], ["web-mode-keyword-face", "keyword", {"inherit": "font-lock-keyword-face"}], ["web-mode-param-name-face", "param name", {"fg": "#cdc9c9"}], ["web-mode-part-comment-face", "part comment", {"inherit": "web-mode-comment-face"}], ["web-mode-part-face", "part", {"inherit": "web-mode-block-face"}], ["web-mode-part-string-face", "part string", {"inherit": "web-mode-string-face"}], ["web-mode-preprocessor-face", "preprocessor", {"inherit": "font-lock-preprocessor-face"}], ["web-mode-script-face", "script", {"inherit": "web-mode-part-face"}], ["web-mode-sql-keyword-face", "sql keyword", {"weight": "bold", "slant": "italic"}], ["web-mode-string-face", "string", {"inherit": "font-lock-string-face"}], ["web-mode-style-face", "style", {"inherit": "web-mode-part-face"}], ["web-mode-symbol-face", "symbol", {"fg": "#eeb422"}], ["web-mode-type-face", "type", {"inherit": "font-lock-type-face"}], ["web-mode-underline-face", "underline", {"underline": {"style": "line", "color": null}}], ["web-mode-variable-name-face", "variable name", {"inherit": "font-lock-variable-name-face"}], ["web-mode-warning-face", "warning", {"inherit": "font-lock-warning-face"}], ["web-mode-whitespace-face", "whitespace", {"bg": "#68228b"}]]}, "yasnippet": {"label": "yasnippet", "preview": "generic", "faces": [["yas--field-debug-face", "yas field debug", {}], ["yas-field-highlight-face", "yas field highlight", {"inherit": "region"}]]}}; const COLOR_NAMES=[["alice-blue", "#f0f8ff"], ["antique-white", "#faebd7"], ["aquamarine", "#7fffd4"], ["azure", "#f0ffff"], ["beige", "#f5f5dc"], ["bisque", "#ffe4c4"], ["black", "#000000"], ["blanched-almond", "#ffebcd"], ["blue", "#0000ff"], ["blue-violet", "#8a2be2"], ["brown", "#a52a2a"], ["burlywood", "#deb887"], ["cadet-blue", "#5f9ea0"], ["chartreuse", "#7fff00"], ["chocolate", "#d2691e"], ["coral", "#ff7f50"], ["cornflower-blue", "#6495ed"], ["cornsilk", "#fff8dc"], ["cyan", "#00ffff"], ["dark-blue", "#00008b"], ["dark-cyan", "#008b8b"], ["dark-goldenrod", "#b8860b"], ["dark-green", "#006400"], ["dark-grey", "#a9a9a9"], ["dark-khaki", "#bdb76b"], ["dark-magenta", "#8b008b"], ["dark-olive", "#556b2f"], ["dark-orange", "#ff8c00"], ["dark-orchid", "#9932cc"], ["dark-red", "#8b0000"], ["dark-salmon", "#e9967a"], ["dark-sea", "#8fbc8f"], ["dark-slate", "#2f4f4f"], ["dark-slate", "#483d8b"], ["dark-turquoise", "#00ced1"], ["dark-violet", "#9400d3"], ["deep-pink", "#ff1493"], ["deep-sky", "#00bfff"], ["dim-gray", "#696969"], ["dodger-blue", "#1e90ff"], ["firebrick", "#b22222"], ["floral-white", "#fffaf0"], ["forest-green", "#228b22"], ["gainsboro", "#dcdcdc"], ["ghost-white", "#f8f8ff"], ["gold", "#ffd700"], ["goldenrod", "#daa520"], ["gray", "#bebebe"], ["green", "#00ff00"], ["green-yellow", "#adff2f"], ["honeydew", "#f0fff0"], ["hot-pink", "#ff69b4"], ["indian-red", "#cd5c5c"], ["ivory", "#fffff0"], ["khaki", "#f0e68c"], ["lavender", "#e6e6fa"], ["lavender-blush", "#fff0f5"], ["lawn-green", "#7cfc00"], ["lemon-chiffon", "#fffacd"], ["light-blue", "#add8e6"], ["light-coral", "#f08080"], ["light-cyan", "#e0ffff"], ["light-goldenrod", "#eedd82"], ["light-goldenrod", "#fafad2"], ["light-green", "#90ee90"], ["light-grey", "#d3d3d3"], ["light-pink", "#ffb6c1"], ["light-salmon", "#ffa07a"], ["light-sea", "#20b2aa"], ["light-sky", "#87cefa"], ["light-slate", "#778899"], ["light-slate", "#8470ff"], ["light-steel", "#b0c4de"], ["light-yellow", "#ffffe0"], ["lime-green", "#32cd32"], ["linen", "#faf0e6"], ["magenta", "#ff00ff"], ["maroon", "#b03060"], ["medium-aquamarine", "#66cdaa"], ["medium-blue", "#0000cd"], ["medium-orchid", "#ba55d3"], ["medium-purple", "#9370db"], ["medium-sea", "#3cb371"], ["medium-slate", "#7b68ee"], ["medium-spring", "#00fa9a"], ["medium-turquoise", "#48d1cc"], ["medium-violet", "#c71585"], ["midnight-blue", "#191970"], ["mint-cream", "#f5fffa"], ["misty-rose", "#ffe4e1"], ["moccasin", "#ffe4b5"], ["navajo-white", "#ffdead"], ["navy", "#000080"], ["old-lace", "#fdf5e6"], ["olive-drab", "#6b8e23"], ["orange", "#ffa500"], ["orange-red", "#ff4500"], ["orchid", "#da70d6"], ["pale-goldenrod", "#eee8aa"], ["pale-green", "#98fb98"], ["pale-turquoise", "#afeeee"], ["pale-violet", "#db7093"], ["papaya-whip", "#ffefd5"], ["peach-puff", "#ffdab9"], ["peru", "#cd853f"], ["pink", "#ffc0cb"], ["plum", "#dda0dd"], ["powder-blue", "#b0e0e6"], ["purple", "#a020f0"], ["red", "#ff0000"], ["rosy-brown", "#bc8f8f"], ["royal-blue", "#4169e1"], ["saddle-brown", "#8b4513"], ["salmon", "#fa8072"], ["sandy-brown", "#f4a460"], ["sea-green", "#2e8b57"], ["seashell", "#fff5ee"], ["sienna", "#a0522d"], ["sky-blue", "#87ceeb"], ["slate-blue", "#6a5acd"], ["slate-gray", "#708090"], ["snow", "#fffafa"], ["spring-green", "#00ff7f"], ["steel-blue", "#4682b4"], ["tan", "#d2b48c"], ["thistle", "#d8bfd8"], ["tomato", "#ff6347"], ["turquoise", "#40e0d0"], ["violet", "#ee82ee"], ["violet-red", "#d02090"], ["wheat", "#f5deb3"], ["white", "#ffffff"], ["white-smoke", "#f5f5f5"], ["yellow", "#ffff00"], ["yellow-green", "#9acd32"]]; -let MAP={"kw": "#d3d3d3", "bi": "#d3d3d3", "pp": "#d3d3d3", "fnd": "#0000ff", "fnc": "#0000ff", "dec": "", "ty": "#e5e5e5", "prop": "#e5e5e5", "con": "#d3d3d3", "num": "#000000", "esc": "#000000", "str": "#696969", "re": "#696969", "doc": "#696969", "cm": "#696969", "cmd": "#696969", "var": "#e5e5e5", "op": "#000000", "punc": "#000000", "p": "#000000", "bg": "#ffffff"}, PALETTE=[["#ffffff", "bg", "ground"], ["#000000", "fg", "ground"], ["#d3d3d3", "lightgray", "lightgray"], ["#0000ff", "blue1", "blue"], ["#e5e5e5", "gray90", "gray"], ["#696969", "dimgray", "dimgray"], ["#eedc82", "lightgoldenrod2", "lightgoldenrod"], ["#b4eeb4", "darkseagreen2", "darkseagreen"], ["#bfbfbf", "grey75", "grey"], ["#333333", "grey20", "grey"], ["#f2f2f2", "grey95", "grey"], ["#ff00ff", "magenta", "magenta"], ["#b0e2ff", "lightskyblue1", "lightskyblue"], ["#cd00cd", "magenta3", "magenta"], ["#afeeee", "paleturquoise", "paleturquoise"], ["#ffc1c1", "rosybrown1", "rosybrown"], ["#40e0d0", "turquoise", "turquoise"], ["#a020f0", "purple", "purple"], ["#3a5fcd", "royalblue3", "royalblue"], ["#ff0000", "red", "red"], ["#ff8c00", "dark-orange", "dark-orange"], ["#228b22", "forestgreen", "forestgreen"], ["#aaa", "color-22", "color-22"], ["#000", "color-23", "color-23"], ["#aa0", "color-24", "color-24"], ["#070", "color-25", "color-25"], ["#daa520", "goldenrod", "goldenrod"], ["#00bfff", "deep-sky-blue", "deep-sky-blue"], ["#ee00ee", "magenta2", "magenta"], ["#00ff00", "green", "green"], ["#ffff00", "yellow", "yellow"], ["#00ffff", "cyan", "cyan"], ["#6b6b6b", "color-32", "color-32"], ["#979797", "color-33", "color-33"], ["unspecified", "color-34", "color-34"], ["#223fbf", "color-35", "color-35"], ["#8f0075", "color-36", "color-36"], ["#145a00", "color-37", "color-37"], ["#804000", "color-38", "color-38"], ["#efcbcf", "color-39", "color-39"], ["#ffd700", "gold", "gold"], ["#8b0000", "darkred", "darkred"], ["#ffa500", "orange", "orange"], ["#f0e68c", "khaki", "khaki"], ["#8b008b", "dark-magenta", "dark-magenta"], ["#ff4500", "orange-red", "orange-red"], ["#deb887", "burlywood", "burlywood"], ["#b22222", "firebrick", "firebrick"], ["#cd8500", "orange3", "orange"], ["#00008b", "dark-blue", "dark-blue"], ["#9400d3", "dark-violet", "dark-violet"], ["#6a9fb5", "color-51", "color-51"], ["#2188b6", "color-52", "color-52"], ["#75b5aa", "color-53", "color-53"], ["#0595bd", "color-54", "color-54"], ["#446674", "color-55", "color-55"], ["#48746d", "color-56", "color-56"], ["#6d8143", "color-57", "color-57"], ["#72584b", "color-58", "color-58"], ["#915b2d", "color-59", "color-59"], ["#7e5d5f", "color-60", "color-60"], ["#694863", "color-61", "color-61"], ["#843031", "color-62", "color-62"], ["#838484", "color-63", "color-63"], ["#b48d56", "color-64", "color-64"], ["#90a959", "color-65", "color-65"], ["#677174", "color-66", "color-66"], ["#2c7d6e", "color-67", "color-67"], ["#3d6837", "color-68", "color-68"], ["#ce7a4e", "color-69", "color-69"], ["#ff505b", "color-70", "color-70"], ["#e69dd6", "color-71", "color-71"], ["#eb595a", "color-72", "color-72"], ["#7f7869", "color-73", "color-73"], ["#ff9300", "color-74", "color-74"], ["#8f5536", "color-75", "color-75"], ["#d4843e", "color-76", "color-76"], ["#fc505b", "color-77", "color-77"], ["#68295b", "color-78", "color-78"], ["#5d54e1", "color-79", "color-79"], ["#ac4142", "color-80", "color-80"], ["#716e68", "color-81", "color-81"], ["#ffcc0e", "color-82", "color-82"], ["#8b1a1a", "firebrick4", "firebrick"], ["#fff8dc", "cornsilk", "cornsilk"], ["#cd5c5c", "indian-red", "indian-red"], ["#f5deb3", "wheat", "wheat"], ["#add8e6", "light-blue", "light-blue"], ["#ccc", "color-88", "color-88"], ["#cd0000", "red3", "red"], ["#0000cd", "blue3", "blue"], ["#cc9393", "color-91", "color-91"], ["#cccccc", "grey80", "grey"], ["#bebebe", "gray", "gray"], ["#88090b", "color-94", "color-94"], ["#707183", "color-95", "color-95"], ["#7388d6", "color-96", "color-96"], ["#909183", "color-97", "color-97"], ["#709870", "color-98", "color-98"], ["#907373", "color-99", "color-99"], ["#6276ba", "color-100", "color-100"], ["#858580", "color-101", "color-101"], ["#80a880", "color-102", "color-102"], ["#887070", "color-103", "color-103"], ["#1e90ff", "dodger-blue", "dodger-blue"], ["#ff69b4", "hot-pink", "hot-pink"], ["#da70d6", "orchid", "orchid"], ["#fa8072", "salmon", "salmon"], ["#00ff7f", "spring-green", "spring-green"], ["#800040", "color-109", "color-109"], ["#603f00", "color-110", "color-110"], ["#004476", "color-111", "color-111"], ["grey60", "color-112", "color-112"], ["#aa2222", "color-113", "color-113"], ["#2266ff", "color-114", "color-114"], ["#aaaa11", "color-115", "color-115"], ["#dd4488", "color-116", "color-116"], ["#22aa22", "color-117", "color-117"], ["#8fbc8f", "color-118", "color-118"], ["#5f9ea0", "color-119", "color-119"], ["#ffffe0", "lightyellow1", "lightyellow"], ["#3e3c36", "color-121", "color-121"], ["#8b8989", "snow4", "snow"], ["#242424", "grey14", "grey"], ["#cd69c9", "orchid3", "orchid"], ["#dda0dd", "plum", "plum"], ["#000053", "color-126", "color-126"], ["#001970", "color-127", "color-127"], ["#002984", "color-128", "color-128"], ["#49599a", "color-129", "color-129"], ["#9499b7", "color-130", "color-130"], ["#cdc9c9", "snow3", "snow"], ["#eeb422", "goldenrod2", "goldenrod"], ["#68228b", "darkorchid4", "darkorchid"]], SYNTAX={"kw": {"fg": "#d3d3d3", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "bi": {"fg": "#d3d3d3", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "pp": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-builtin-face"}, "fnd": {"fg": "#0000ff", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "fnc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-function-name-face"}, "dec": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "ty": {"fg": "#e5e5e5", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "prop": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-variable-name-face"}, "con": {"fg": "#d3d3d3", "bg": null, "bold": true, "italic": false, "underline": true, "strike": false, "box": null}, "num": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "esc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-regexp-grouping-backslash"}, "str": {"fg": "#696969", "bg": null, "bold": false, "italic": true, "underline": false, "strike": false, "box": null}, "re": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-string-face"}, "doc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-string-face"}, "cm": {"fg": "#696969", "bg": null, "bold": true, "italic": true, "underline": false, "strike": false, "box": null}, "cmd": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "font-lock-comment-face"}, "var": {"fg": "#e5e5e5", "bg": null, "bold": true, "italic": true, "underline": false, "strike": false, "box": null}, "op": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "punc": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "p": {"fg": "#000000", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "bg": {"fg": "#ffffff", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}}, UIMAP={"cursor": {"fg": null, "bg": "#000000", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "region": {"fg": null, "bg": "#eedc82", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "hl-line": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "highlight"}, "highlight": {"fg": null, "bg": "#b4eeb4", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "mode-line": {"fg": "#000000", "bg": "#bfbfbf", "bold": false, "italic": false, "underline": false, "strike": false, "box": {"style": "released", "width": 1, "color": null}}, "mode-line-inactive": {"fg": "#333333", "bg": "#e5e5e5", "bold": false, "italic": false, "underline": false, "strike": false, "box": {"style": "line", "width": 1, "color": "#bfbfbf"}, "inherit": "mode-line"}, "fringe": {"fg": null, "bg": "#f2f2f2", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "line-number": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": ["shadow", "default"]}, "line-number-current-line": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null, "inherit": "line-number"}, "minibuffer-prompt": {"fg": "#ff00ff", "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "isearch": {"fg": "#b0e2ff", "bg": "#cd00cd", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "lazy-highlight": {"fg": null, "bg": "#afeeee", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "isearch-fail": {"fg": null, "bg": "#ffc1c1", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "show-paren-match": {"fg": null, "bg": "#40e0d0", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "show-paren-mismatch": {"fg": "#ffffff", "bg": "#a020f0", "bold": false, "italic": false, "underline": false, "strike": false, "box": null}, "link": {"fg": "#3a5fcd", "bg": null, "bold": false, "italic": false, "underline": true, "strike": false, "box": null}, "error": {"fg": "#ff0000", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "warning": {"fg": "#ff8c00", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "success": {"fg": "#228b22", "bg": null, "bold": true, "italic": false, "underline": false, "strike": false, "box": null}, "vertical-border": {"fg": null, "bg": null, "bold": false, "italic": false, "underline": false, "strike": false, "box": null}}; +const FACE_DOCS={"flyspell-duplicate": "Flyspell face for words that appear twice in a row.", "flyspell-incorrect": "Flyspell face for misspelled words.", "hl-line": "Default face for highlighting the current line in Hl-Line mode.", "ghostel-default": "Base face used to derive ghostel terminal default fg/bg colors.", "ghostel-fake-cursor-box": "Face for the solid hint cursor drawn for box-style cursors.", "ghostel-fake-cursor": "Face for the hollow hint cursor drawn in copy and Emacs modes.", "ghostel-color-bright-white": "Face used to render bright white color code.", "ghostel-color-bright-cyan": "Face used to render bright cyan color code.", "ghostel-color-bright-magenta": "Face used to render bright magenta color code.", "ghostel-color-bright-blue": "Face used to render bright blue color code.", "ghostel-color-bright-yellow": "Face used to render bright yellow color code.", "ghostel-color-bright-green": "Face used to render bright green color code.", "ghostel-color-bright-red": "Face used to render bright red color code.", "ghostel-color-bright-black": "Face used to render bright black color code.", "ghostel-color-white": "Face used to render white color code.", "ghostel-color-cyan": "Face used to render cyan color code.", "ghostel-color-magenta": "Face used to render magenta color code.", "ghostel-color-blue": "Face used to render blue color code.", "ghostel-color-yellow": "Face used to render yellow color code.", "ghostel-color-green": "Face used to render green color code.", "ghostel-color-red": "Face used to render red color code.", "ghostel-color-black": "Face used to render black color code.", "apropos-misc-button": "Button face indicating a miscellaneous object type in Apropos.", "apropos-user-option-button": "Button face indicating a user option in Apropos.", "apropos-variable-button": "Button face indicating a variable in Apropos.", "apropos-function-button": "Button face indicating a function, macro, or command in Apropos.", "apropos-button": "Face for buttons that indicate a face in Apropos.", "apropos-property": "Face for property name in Apropos output, or nil for none.", "apropos-keybinding": "Face for lists of keybinding in Apropos output.", "apropos-symbol": "Face for the symbol name in Apropos output.", "hl-todo-flymake-type": "Face used for the Flymake diagnostics type \u2018hl-todo-flymake\u2019.", "hl-todo": "Base face used to highlight TODO and similar keywords.", "org-roam-dailies-calendar-note": "Face for dates with a daily-note in the calendar.", "org-roam-dim": "Face for the dimmer part of the widgets.", "org-roam-preview-region": "Face used by \u2018org-roam-highlight-preview-region-using-face\u2019.", "org-roam-preview-heading-selection": "Face for selected preview headings.", "org-roam-preview-heading-highlight": "Face for current preview headings.", "org-roam-preview-heading": "Face for preview headings.", "org-roam-olp": "Face for the OLP of the node.", "org-roam-title": "Face for Org-roam titles.", "org-roam-header-line": "Face for the \u2018header-line\u2019 in some Org-roam modes.", "malyon-face-reverse": "Face for reverse-video text.", "malyon-face-italic": "Italic face for game text.", "malyon-face-error": "Face for game errors.", "malyon-face-bold": "Bold face for game text.", "malyon-face-plain": "Basic face for game text.", "twentyfortyeight-face-2048": "Face for the tile 2048.", "twentyfortyeight-face-1024": "Face for the tile 1024.", "twentyfortyeight-face-512": "Face for the tile 512.", "twentyfortyeight-face-256": "Face for the tile 256.", "twentyfortyeight-face-128": "Face for the tile 128.", "twentyfortyeight-face-64": "Face for the tile 64.", "twentyfortyeight-face-32": "Face for the tile 32.", "twentyfortyeight-face-16": "Face for the tile 16.", "twentyfortyeight-face-8": "Face for the tile 8.", "twentyfortyeight-face-4": "Face for the tile 4.", "twentyfortyeight-face-2": "Face for the tile 2.", "tmr-mode-line-urgent": "Face for timers that will expire in the next 30 seconds.", "tmr-mode-line-soon": "Face for timers that will expire in the next 2 minutes.", "tmr-mode-line-active": "Face for active timers in the mode-line.", "tmr-tabulated-description": "Description of timer in the \u2018tmr-tabulated-view\u2019.", "tmr-tabulated-acknowledgement": "Acknowledgement indicator in the \u2018tmr-tabulated-view\u2019.", "tmr-tabulated-paused": "Face for styling the description of a paused timer.", "tmr-tabulated-remaining-time": "Remaining time in the \u2018tmr-tabulated-view\u2019.", "tmr-tabulated-end-time": "End time in the \u2018tmr-tabulated-view\u2019.", "tmr-tabulated-start-time": "Start time in the \u2018tmr-tabulated-view\u2019.", "tmr-paused": "Face for styling the description of a paused timer.", "tmr-finished": "Face for styling the description of a finished timer.", "tmr-must-be-acknowledged": "Face for styling the acknowledgment confirmation.", "tmr-is-acknowledged": "Face for styling the acknowledgment confirmation.", "tmr-end-time": "Face for styling the start time of a timer.", "tmr-start-time": "Face for styling the start time of a timer.", "tmr-description": "Face for styling the description of a timer.", "tmr-duration": "Face for styling the duration of a timer.", "magit-blame-date": "Face used for dates when blaming.", "magit-blame-name": "Face used for author and committer names when blaming.", "magit-blame-hash": "Face used for commit hashes when blaming.", "magit-blame-summary": "Face used for commit summaries when blaming.", "magit-blame-heading": "Face used for blame headings by default when blaming.", "magit-blame-dimmed": "Face used for the blame margin in some cases when blaming.", "magit-blame-margin": "Face used for the blame margin by default when blaming.", "magit-blame-highlight": "Face used for highlighting when blaming.", "magit-reflog-other": "Face for other commands in reflogs.", "magit-reflog-remote": "Face for pull and clone commands in reflogs.", "magit-reflog-cherry-pick": "Face for cherry-pick commands in reflogs.", "magit-reflog-rebase": "Face for rebase commands in reflogs.", "magit-reflog-reset": "Face for reset commands in reflogs.", "magit-reflog-checkout": "Face for checkout commands in reflogs.", "magit-reflog-merge": "Face for merge, checkout and branch commands in reflogs.", "magit-reflog-amend": "Face for amend commands in reflogs.", "magit-reflog-commit": "Face for commit commands in reflogs.", "magit-bisect-bad": "Face for bad bisect revisions.", "magit-bisect-skip": "Face for skipped bisect revisions.", "magit-bisect-good": "Face for good bisect revisions.", "magit-sequence-exec": "Face used in sequence sections.", "magit-sequence-onto": "Face used in sequence sections.", "magit-sequence-done": "Face used in sequence sections.", "magit-sequence-drop": "Face used in sequence sections.", "magit-sequence-head": "Face used in sequence sections.", "magit-sequence-part": "Face used in sequence sections.", "magit-sequence-stop": "Face used in sequence sections.", "magit-sequence-pick": "Face used in sequence sections.", "magit-filename": "Face for filenames.", "magit-cherry-equivalent": "Face for equivalent cherry commits.", "magit-cherry-unmatched": "Face for unmatched cherry commits.", "magit-signature-error": "Face for signatures that cannot be checked (e.g., missing key).", "magit-signature-revoked": "Face for signatures made by a revoked key.", "magit-signature-expired-key": "Face for signatures made by an expired key.", "magit-signature-expired": "Face for signatures that have expired.", "magit-signature-untrusted": "Face for good untrusted signatures.", "magit-signature-bad": "Face for bad signatures.", "magit-signature-good": "Face for good signatures.", "magit-keyword-squash": "Face for squash! and similar keywords in commit messages.", "magit-keyword": "Face for parts of commit messages inside brackets.", "magit-refname-pullreq": "Face for pullreq refnames.", "magit-refname-wip": "Face for wip refnames.", "magit-refname-stash": "Face for stash refnames.", "magit-refname": "Face for refnames without a dedicated face.", "magit-head": "Face for the symbolic ref \u2018HEAD\u2019.", "magit-branch-warning": "Face for warning about (missing) branch.", "magit-branch-upstream": "Face for upstream branch.", "magit-branch-current": "Face for current branch.", "magit-branch-local": "Face for local branches.", "magit-branch-remote-head": "Face for current branch.", "magit-branch-remote": "Face for remote branch head labels shown in log buffer.", "magit-tag": "Face for tag labels shown in log buffer.", "magit-hash": "Face for the commit object name in the log output.", "magit-dimmed": "Face for text that shouldn\u2019t stand out.", "magit-header-line-key": "Face for keys in the \u2018header-line\u2019.", "magit-header-line": "Face for the \u2018header-line\u2019 in some Magit modes.", "magit-header-line-log-select": "Face for the \u2018header-line\u2019 in \u2018magit-log-select-mode\u2019.", "magit-log-date": "Face for the date part of the log output.", "magit-log-author": "Face for the author part of the log output.", "magit-log-graph": "Face for the graph part of the log output.", "magit-diffstat-removed": "Face for removal indicator in diffstat.", "magit-diffstat-added": "Face for addition indicator in diffstat.", "magit-diff-whitespace-warning": "Face for highlighting whitespace errors added lines.", "magit-diff-context-highlight": "Face for lines in the current context in a diff.", "magit-diff-their-highlight": "Face for lines in a diff for their side in a conflict.", "magit-diff-base-highlight": "Face for lines in a diff for the base side in a conflict.", "magit-diff-our-highlight": "Face for lines in a diff for our side in a conflict.", "magit-diff-removed-highlight": "Face for lines in a diff that have been removed.", "magit-diff-added-highlight": "Face for lines in a diff that have been added.", "magit-diff-context": "Face for lines in a diff that are unchanged.", "magit-diff-their": "Face for lines in a diff for their side in a conflict.", "magit-diff-base": "Face for lines in a diff for the base side in a conflict.", "magit-diff-our": "Face for lines in a diff for our side in a conflict.", "magit-diff-removed": "Face for lines in a diff that have been removed.", "magit-diff-added": "Face for lines in a diff that have been added.", "magit-diff-conflict-heading": "Face for conflict markers.", "magit-diff-lines-boundary": "Face for boundary of marked lines in diff hunk.", "magit-diff-lines-heading": "Face for diff hunk heading when lines are marked.", "magit-diff-revision-summary-highlight": "Face for highlighted commit message summaries.", "magit-diff-revision-summary": "Face for commit message summaries.", "magit-diff-conflict-heading-highlight": "Face for conflict markers.", "magit-diff-hunk-region": "Face used by \u2018magit-diff-highlight-hunk-region-using-face\u2019.", "magit-diff-hunk-heading-selection": "Face for selected diff hunk headings.", "magit-diff-hunk-heading-highlight": "Face for current diff hunk headings.", "magit-diff-hunk-heading": "Face for diff hunk headings.", "magit-diff-file-heading-selection": "Face for selected diff file headings.", "magit-diff-file-heading-highlight": "Face for current diff file headings.", "magit-diff-file-heading": "Face for diff file headings.", "smerge-refined-added": "Face used for added characters shown by \u2018smerge-refine\u2019.", "smerge-refined-removed": "Face used for removed characters shown by \u2018smerge-refine\u2019.", "smerge-refined-changed": "Face used for char-based changes shown by \u2018smerge-refine\u2019.", "smerge-markers": "Face for the conflict markers.", "smerge-base": "Face for the base code.", "smerge-lower": "Face for the \u2018lower\u2019 version of a conflict.", "smerge-upper": "Face for the \u2018upper\u2019 version of a conflict.", "git-commit-comment-action": "Face used for actions in commit message comments.", "git-commit-comment-file": "Face used for file names in commit message comments.", "git-commit-comment-heading": "Face used for headings in commit message comments.", "git-commit-comment-detached": "Face used for detached \u2018HEAD\u2019 in commit message comments.", "git-commit-comment-branch-remote": "Face used for names of remote branches in commit message comments.", "git-commit-comment-branch-local": "Face used for names of local branches in commit message comments.", "git-commit-trailer-value": "Face used for Git trailer values in commit messages.", "git-commit-trailer-token": "Face used for Git trailer tokens in commit messages.", "git-commit-keyword": "Face used for keywords in commit messages.", "git-commit-nonempty-second-line": "Face used for non-whitespace on the second line of commit messages.", "git-commit-overlong-summary": "Face used for the tail of overlong commit message summaries.", "git-commit-summary": "Face used for the summary in commit messages.", "log-edit-unknown-header": "Face for unknown headers in \u2018log-edit-mode\u2019 buffers.", "log-edit-header": "Face for the headers in \u2018log-edit-mode\u2019 buffers.", "log-edit-headers-separator": "Face for the separator line in \u2018log-edit-mode\u2019 buffers.", "log-edit-summary": "Face for the summary in \u2018log-edit-mode\u2019 buffers.", "change-log-acknowledgment": "Face for highlighting acknowledgments.", "change-log-function": "Face for highlighting items of the form \u2018<....>\u2019.", "change-log-conditionals": "Face for highlighting conditionals of the form \u2018[...]\u2019.", "change-log-list": "Face for highlighting parenthesized lists of functions or variables.", "change-log-file": "Face for highlighting file names.", "change-log-email": "Face for highlighting author email addresses.", "change-log-name": "Face for highlighting author names.", "change-log-date": "Face used to highlight dates in date lines.", "magit-mode-line-process-error": "Face for \u2018mode-line-process\u2019 error status.", "magit-mode-line-process": "Face for \u2018mode-line-process\u2019 status when Git is running for side-effects.", "magit-process-ng": "Face for non-zero exit-status.", "magit-process-ok": "Face for zero exit-status.", "which-func": "Face used to highlight mode line function names.", "magit-left-margin": "Face used for the left margin.", "magit-section-child-count": "Face used for child counts at the end of some section headings.", "magit-section-heading-selection": "Face for selected section headings.", "magit-section-secondary-heading": "Face for section headings of some secondary headings.", "magit-section-heading": "Face for section headings.", "magit-section-highlight": "Face for highlighting the current section.", "llama-deleted-argument": "Face used for deleted arguments \u2018_%1\u2019...\u2018_%9\u2019, \u2018_&1\u2019...\u2018_&9\u2019 and \u2018_&*\u2019.", "llama-optional-argument": "Face used for optional arguments \u2018&1\u2019 through \u2018&9\u2019, \u2018&\u2019 and \u2018&*\u2019.", "llama-mandatory-argument": "Face used for mandatory arguments \u2018%1\u2019 through \u2018%9\u2019 and \u2018%\u2019.", "llama-llama-macro": "Face used for the name of the \u2018llama\u2019 macro.", "llama-##-macro": "Face used for the name of the \u2018##\u2019 macro.", "table-cell": "Face used for table cell contents.", "which-key-docstring-face": "Face for docstrings.", "which-key-special-key-face": "Face for special keys (SPC, TAB, RET).", "which-key-group-description-face": "Face for the key description when it is a group or prefix.", "which-key-highlighted-command-face": "Default face for highlighted command descriptions.", "which-key-local-map-description-face": "Face for the key description when it is found in \u2018current-local-map\u2019.", "which-key-command-description-face": "Face for the key description when it is a command.", "which-key-note-face": "Face for notes or hints occasionally provided.", "which-key-separator-face": "Face for the separator (default separator is an arrow).", "which-key-key-face": "Face for which-key keys.", "org-superstar-first": "Face used to display the first bullet of an inline task.", "org-superstar-ordered-item": "Face used to display ordered list item bullets.", "org-superstar-item": "Face used to display prettified item bullets.", "org-superstar-header-bullet": "Face containing distinguishing features headline bullets.", "org-superstar-leading": "Face used to display prettified leading stars in a headline.", "org-indent": "Face for outline indentation.", "company-box-numbers": "company-box-numbers is an alias for the face `company-tooltip'.", "company-box-scrollbar": "Face used for the scrollbar.", "company-box-background": "company-box-background is an alias for the face `company-tooltip'.", "company-box-selection": "company-box-selection is an alias for the face `company-tooltip-selection'.", "company-box-annotation": "company-box-annotation is an alias for the face `company-tooltip-annotation'.", "company-box-candidate": "company-box-candidate is an alias for the face `company-tooltip'.", "makefile-makepp-perl": "Face to use for additionally highlighting Perl code in Font-Lock mode.", "makefile-shell": "Face to use for additionally highlighting Shell commands in Font-Lock mode.", "makefile-targets": "Face to use for additionally highlighting rule targets in Font-Lock mode.", "makefile-space": "Face to use for highlighting leading spaces in Font-Lock mode.", "grep-heading": "Face of headings when \u2018grep-use-headings\u2019 is non-nil.", "ibuffer-locked-buffer": "Face used for locked buffers in Ibuffer.", "org-drill-hidden-cloze-face": "The face used to hide the contents of cloze phrases.", "org-drill-visible-cloze-hint-face": "The face used to hide the contents of cloze phrases.", "org-drill-visible-cloze-face": "The face used to hide the contents of cloze phrases.", "alert-trivial-face": "Trivial alert face.", "alert-low-face": "Low alert face.", "alert-normal-face": "Normal alert face.", "alert-moderate-face": "Moderate alert face.", "alert-high-face": "High alert face.", "alert-urgent-face": "Urgent alert face.", "org-faces-priority-d-dim": "Dimmed [#D] priority cookie for non-selected windows.", "org-faces-priority-c-dim": "Dimmed [#C] priority cookie for non-selected windows.", "org-faces-priority-b-dim": "Dimmed [#B] priority cookie for non-selected windows.", "org-faces-priority-a-dim": "Dimmed [#A] priority cookie for non-selected windows.", "org-faces-cancelled-dim": "Dimmed CANCELLED keyword for non-selected windows.", "org-faces-done-dim": "Dimmed DONE keyword for non-selected windows.", "org-faces-failed-dim": "Dimmed FAILED keyword for non-selected windows.", "org-faces-delegated-dim": "Dimmed DELEGATED keyword for non-selected windows.", "org-faces-stalled-dim": "Dimmed STALLED keyword for non-selected windows.", "org-faces-verify-dim": "Dimmed VERIFY keyword for non-selected windows.", "org-faces-waiting-dim": "Dimmed WAITING keyword for non-selected windows.", "org-faces-doing-dim": "Dimmed DOING keyword for non-selected windows.", "org-faces-project-dim": "Dimmed PROJECT keyword for non-selected windows.", "org-faces-todo-dim": "Dimmed TODO keyword for non-selected windows.", "org-faces-priority-d": "Face for the [#D] priority cookie.", "org-faces-priority-c": "Face for the [#C] priority cookie.", "org-faces-priority-b": "Face for the [#B] priority cookie.", "org-faces-priority-a": "Face for the [#A] priority cookie.", "org-faces-cancelled": "Face for the CANCELLED keyword.", "org-faces-done": "Face for the DONE keyword.", "org-faces-failed": "Face for the FAILED keyword.", "org-faces-delegated": "Face for the DELEGATED keyword.", "org-faces-stalled": "Face for the STALLED keyword.", "org-faces-verify": "Face for the VERIFY keyword.", "org-faces-waiting": "Face for the WAITING keyword.", "org-faces-doing": "Face for the DOING keyword.", "org-faces-project": "Face for the PROJECT keyword.", "org-faces-todo": "Face for the TODO keyword.", "eww-valid-certificate": "Face for web pages with valid certificates.", "eww-invalid-certificate": "Face for web pages with invalid certificates.", "eww-form-textarea": "Face for eww textarea inputs.", "eww-form-text": "Face for eww text inputs.", "eww-form-select": "Face for eww buffer buttons.", "eww-form-checkbox": "Face for eww buffer buttons.", "eww-form-file": "Face for eww buffer buttons.", "eww-form-submit": "Face for eww buffer buttons.", "gnus-header-content": "Face used for displaying header content.", "gnus-header-name": "Face used for displaying header names.", "gnus-header-newsgroups": "Face used for displaying newsgroups headers.", "gnus-header-subject": "Face used for displaying subject headers.", "gnus-header-from": "Face used for displaying from headers.", "gnus-header": "Base face used for all Gnus header faces.", "gnus-signature": "Face used for highlighting a signature in the article buffer.", "gnus-button": "Face used for highlighting a button in the article buffer.", "gnus-emphasis-highlight-words": "Face used for displaying highlighted words.", "gnus-emphasis-strikethru": "Face used for displaying strike-through text (-word-).", "gnus-emphasis-underline-bold-italic": "Face used for displaying underlined bold italic emphasized text.", "gnus-emphasis-bold-italic": "Face used for displaying bold italic emphasized text (/*word*/).", "gnus-emphasis-underline-italic": "Face used for displaying underlined italic emphasized text (_/word/_).", "gnus-emphasis-underline-bold": "Face used for displaying underlined bold emphasized text (_*word*_).", "gnus-emphasis-underline": "Face used for displaying underlined emphasized text (_word_).", "gnus-emphasis-italic": "Face used for displaying italic emphasized text (/word/).", "gnus-emphasis-bold": "Face used for displaying strong emphasized text (*word*).", "mm-uu-extract": "Face for extracted buffers.", "shr-sliced-image": "Face used for sliced images.", "shr-mark": "Face used for <mark> elements.", "shr-code": "Face used for rendering <code> blocks.", "shr-h6": "Face for <h6> elements.", "shr-h5": "Face for <h5> elements.", "shr-h4": "Face for <h4> elements.", "shr-h3": "Face for <h3> elements.", "shr-h2": "Face for <h2> elements.", "shr-h1": "Face for <h1> elements.", "shr-sup": "Face for <sup> and <sub> elements.", "shr-abbreviation": "Face for <abbr> elements.", "shr-selected-link": "Temporary face for externally visited link elements.", "shr-link": "Face for link elements.", "shr-strike-through": "Face for <s> elements.", "shr-text": "Face used for rendering text.", "message-signature-separator": "Face used for displaying the signature separator.", "message-mml": "Face used for displaying MML.", "message-cited-text-4": "Face used for displaying 4th-level cited text.", "message-cited-text-3": "Face used for displaying 3rd-level cited text.", "message-cited-text-2": "Face used for displaying 2nd-level cited text.", "message-cited-text-1": "Face used for displaying 1st-level cited text.", "message-separator": "Face used for displaying the separator.", "message-header-xheader": "Face used for displaying X-Header headers.", "message-header-name": "Face used for displaying header names.", "message-header-other": "Face used for displaying other headers.", "message-header-newsgroups": "Face used for displaying Newsgroups headers.", "message-header-subject": "Face used for displaying Subject headers.", "message-header-cc": "Face used for displaying Cc headers.", "message-header-to": "Face used for displaying To headers.", "gnus-splash": "Face for the splash screen.", "gnus-summary-low-read": "Face used for low interest read articles.", "gnus-summary-high-read": "Face used for high interest read articles.", "gnus-summary-normal-read": "Face used for normal interest read articles.", "gnus-summary-low-unread": "Face used for low interest unread articles.", "gnus-summary-high-unread": "Face used for high interest unread articles.", "gnus-summary-normal-unread": "Face used for normal interest unread articles.", "gnus-summary-low-undownloaded": "Face used for low interest uncached articles.", "gnus-summary-high-undownloaded": "Face used for high interest uncached articles.", "gnus-summary-normal-undownloaded": "Face used for normal interest uncached articles.", "gnus-summary-low-ancient": "Face used for low interest ancient articles.", "gnus-summary-high-ancient": "Face used for high interest ancient articles.", "gnus-summary-normal-ancient": "Face used for normal interest ancient articles.", "gnus-summary-low-ticked": "Face used for low interest ticked articles.", "gnus-summary-high-ticked": "Face used for high interest ticked articles.", "gnus-summary-normal-ticked": "Face used for normal interest ticked articles.", "gnus-summary-cancelled": "Face used for canceled articles.", "gnus-summary-selected": "Face used for selected articles.", "gnus-group-mail-low": "Low level mailgroup face.", "gnus-group-mail-low-empty": "Low level empty mailgroup face.", "gnus-group-mail-3": "Level 3 mailgroup face.", "gnus-group-mail-3-empty": "Level 3 empty mailgroup face.", "gnus-group-mail-2": "Level 2 mailgroup face.", "gnus-group-mail-2-empty": "Level 2 empty mailgroup face.", "gnus-group-mail-1": "Level 1 mailgroup face.", "gnus-group-mail-1-empty": "Level 1 empty mailgroup face.", "gnus-group-news-low": "Low level newsgroup face.", "gnus-group-news-low-empty": "Low level empty newsgroup face.", "gnus-group-news-6": "Level 6 newsgroup face.", "gnus-group-news-6-empty": "Level 6 empty newsgroup face.", "gnus-group-news-5": "Level 5 newsgroup face.", "gnus-group-news-5-empty": "Level 5 empty newsgroup face.", "gnus-group-news-4": "Level 4 newsgroup face.", "gnus-group-news-4-empty": "Level 4 empty newsgroup face.", "gnus-group-news-3": "Level 3 newsgroup face.", "gnus-group-news-3-empty": "Level 3 empty newsgroup face.", "gnus-group-news-2": "Level 2 newsgroup face.", "gnus-group-news-2-empty": "Level 2 empty newsgroup face.", "gnus-group-news-1": "Level 1 newsgroup face.", "gnus-group-news-1-empty": "Level 1 empty newsgroup face.", "doc-view-svg-face": "Face used for SVG images.", "sh-escaped-newline": "Face used for (non-escaped) backslash at end of a line in Shell-script mode.", "sh-quoted-exec": "Face to show quoted execs like `blabla`.", "sh-heredoc": "Face to show a here-document.", "org-mode-line-clock-overrun": "Face used for clock display for overrun tasks in mode line.", "org-mode-line-clock": "Face used for clock display in mode line.", "org-tag-group": "Face for group tags.", "org-macro": "Face for macros.", "org-latex-and-related": "Face used to highlight LaTeX data, entities and sub/superscript.", "org-agenda-calendar-sexp": "Face used to show events computed from a S-expression.", "org-agenda-calendar-event": "Face used to show events and appointments in the agenda.", "org-agenda-calendar-daterange": "Face used to show entries with a date range in the agenda.", "org-agenda-diary": "Face used for agenda entries that come from the Emacs diary.", "org-agenda-current-time": "Face used to show the current time in the time grid.", "org-time-grid": "Face used for time grids.", "org-agenda-filter-regexp": "Face for regexp(s) in the mode-line when filtering the agenda.", "org-agenda-filter-effort": "Face for effort in the mode-line when filtering the agenda.", "org-agenda-filter-category": "Face for categories in the mode-line when filtering the agenda.", "org-agenda-filter-tags": "Face for tag(s) in the mode-line when filtering the agenda.", "org-agenda-restriction-lock": "Face for showing the agenda restriction lock.", "org-upcoming-distant-deadline": "Face for items scheduled previously, not done, and have a distant deadline.", "org-upcoming-deadline": "Face for items scheduled previously, and not yet done.", "org-imminent-deadline": "Face for current deadlines in the agenda.", "org-scheduled-previously": "Face for items scheduled previously, and not yet done.", "org-agenda-dimmed-todo-face": "Face used to dim blocked tasks in the agenda.", "org-scheduled-today": "Face for items scheduled for a certain day.", "org-scheduled": "Face for items scheduled for a certain day.", "org-agenda-date-weekend": "Face used in agenda for weekend days.", "org-agenda-clocking": "Face marking the current clock item in the agenda.", "org-agenda-date-weekend-today": "Face used in agenda for today during weekends.", "org-agenda-date-today": "Face used in agenda for today.", "org-agenda-date": "Face used in agenda for normal days.", "org-agenda-structure-filter": "Face used for the current type of task filter in the agenda.", "org-agenda-structure-secondary": "Face used for secondary information in agenda block headers.", "org-agenda-structure": "Face used in agenda for captions and dates.", "org-clock-overlay": "Basic face for displaying the secondary selection.", "org-verse": "Face for #+BEGIN_VERSE ... #+END_VERSE blocks.", "org-quote": "Face for #+BEGIN_QUOTE ... #+END_QUOTE blocks.", "org-verbatim": "Face for fixed-with text like code snippets.", "org-inline-src-block": "Face used for inline source blocks as a whole.", "org-block-end-line": "Face used for the line delimiting the end of source blocks.", "org-block-begin-line": "Face used for the line delimiting the begin of source blocks.", "org-block": "Face used for text inside various blocks.", "org-document-info-keyword": "Face for document information keywords.", "org-document-info": "Face for document information such as the author and date.", "org-document-title": "Face for document title, i.e. that which follows the #+TITLE: keyword.", "org-meta-line": "Face for meta lines starting with \"#+\".", "org-code": "Face for fixed-width text like code snippets.", "org-formula": "Face for formulas.", "org-table-header": "Face for table header.", "org-table-row": "Face used to fontify whole table rows (including newlines and indentation).", "org-table": "Face used for tables.", "org-checkbox-statistics-done": "Face used for finished checkbox statistics.", "org-checkbox-statistics-todo": "Face used for unfinished checkbox statistics.", "org-checkbox": "Face for checkboxes.", "org-priority": "Face used for priority cookies.", "org-headline-done": "Face used to indicate that a headline is DONE.", "org-headline-todo": "Face used to indicate that a headline is marked as TODO.", "org-agenda-done": "Face used in agenda, to indicate lines switched to DONE.", "org-done": "Face used for todo keywords that indicate DONE items.", "org-todo": "Face for TODO keywords.", "org-list-dt": "Default face for definition terms in lists.", "org-tag": "Default face for tags.", "org-sexp-date": "Face for diary-like sexp date specifications.", "org-date-selected": "Face for highlighting the calendar day when using \u2018org-read-date\u2019.", "org-date": "Face for date/time stamps.", "org-target": "Face for link targets.", "org-ellipsis": "Face for the ellipsis in folded text.", "org-footnote": "Face for footnotes.", "org-link": "Face for links.", "org-cite-key": "Face for citation keys.", "org-cite": "Face for citations.", "org-archived": "Face for headline with the ARCHIVE tag.", "org-warning": "Face for deadlines and TODO keywords.", "org-agenda-column-dateline": "Face used in agenda column view for datelines with summaries.", "org-column-title": "Face for column display of entry properties.", "org-column": "Face for column display of entry properties.", "org-property-value": "Face used for the value of a property.", "org-drawer": "Face used for drawers.", "org-special-keyword": "Face used for special keywords.", "org-level-8": "Face used for level 8 headlines.", "org-level-7": "Face used for level 7 headlines.", "org-level-6": "Face used for level 6 headlines.", "org-level-5": "Face used for level 5 headlines.", "org-level-4": "Face used for level 4 headlines.", "org-level-3": "Face used for level 3 headlines.", "org-level-2": "Face used for level 2 headlines.", "org-level-1": "Face used for level 1 headlines.", "org-dispatcher-highlight": "Face for highlighted keys in the dispatcher.", "org-hide": "Face used to hide leading stars in headlines.", "org-default": "Face used for default text.", "calendar-month-header": "Face used for month headers in the calendar.", "calendar-weekend-header": "Face used for weekend column headers in the calendar.", "calendar-weekday-header": "Face used for weekday column headers in the calendar.", "holiday": "Face for indicating in the calendar dates that have holidays.", "diary": "Face for highlighting diary entries.", "calendar-today": "Face for indicating today\u2019s date in the calendar.", "lsp-inlay-hint-parameter-face": "Face for inlay parameter hints (e.g. function parameter names at", "lsp-inlay-hint-type-face": "Face for inlay type hints (e.g. inferred variable types).", "lsp-inlay-hint-face": "The face to use for the JavaScript inlays.", "lsp-installation-buffer-face": "Face used for installation buffers still in progress.", "lsp-installation-finished-buffer-face": "Face used for finished installation buffers.", "lsp-signature-face": "Used to display signatures in \u2018imenu\u2019, ....", "lsp-details-face": "Used to display additional information throughout \u2018lsp\u2019.", "lsp-rename-placeholder-face": "Face used to display the rename placeholder in.", "lsp-face-rename": "Face used to highlight the identifier being renamed.", "lsp-signature-highlight-function-argument": "The face to use to highlight function arguments in signatures.", "lsp-signature-posframe": "Background and foreground for \u2018lsp-signature-posframe\u2019.", "lsp-face-highlight-write": "Face used for highlighting symbols being written to.", "lsp-face-highlight-read": "Face used for highlighting symbols being read.", "lsp-face-highlight-textual": "Face used for textual occurrences of symbols.", "diff-refine-added": "Face used for added characters shown by \u2018diff-refine-hunk\u2019.", "diff-refine-removed": "Face used for removed characters shown by \u2018diff-refine-hunk\u2019.", "diff-refine-changed": "Face used for char-based changes shown by \u2018diff-refine-hunk\u2019.", "diff-error": "\u2018diff-mode\u2019 face for error messages from diff.", "diff-nonexistent": "\u2018diff-mode\u2019 face used to highlight nonexistent files in recursive diffs.", "diff-context": "\u2018diff-mode\u2019 face used to highlight context and other side-information.", "diff-function": "\u2018diff-mode\u2019 face used to highlight function names produced by \"diff -p\".", "diff-indicator-changed": "\u2018diff-mode\u2019 face used to highlight indicator of changed lines.", "diff-indicator-added": "\u2018diff-mode\u2019 face used to highlight indicator of added lines (+, >).", "diff-indicator-removed": "\u2018diff-mode\u2019 face used to highlight indicator of removed lines (-, <).", "diff-changed": "\u2018diff-mode\u2019 face used to highlight changed lines.", "diff-changed-unspecified": "\u2018diff-mode\u2019 face used to highlight changed lines.", "diff-added": "\u2018diff-mode\u2019 face used to highlight added lines.", "diff-removed": "\u2018diff-mode\u2019 face used to highlight removed lines.", "diff-hunk-header": "\u2018diff-mode\u2019 face used to highlight hunk header lines.", "diff-index": "\u2018diff-mode\u2019 face used to highlight index header lines.", "diff-file-header": "\u2018diff-mode\u2019 face used to highlight file header lines.", "diff-header": "\u2018diff-mode\u2019 face inherited by hunk and index header faces.", "vc-git-log-edit-summary-max-warning": "Face for Git commit summary lines beyond the maximum length.", "vc-git-log-edit-summary-target-warning": "Face for Git commit summary lines beyond the target length.", "xref-match": "Face used to highlight matches in the xref buffer.", "xref-line-number": "Face for displaying line numbers in the xref buffer.", "xref-file-header": "Face used to highlight file header in the xref buffer.", "edit-indirect-edited-region": "Face used to highlight an indirectly edited region.", "markdown-header-face-6": "Face for level 6 headers.", "markdown-header-face-5": "Face for level 5 headers.", "markdown-header-face-4": "Face for level 4 headers.", "markdown-header-face-3": "Face for level 3 headers.", "markdown-header-face-2": "Face for level 2 headers.", "markdown-header-face-1": "Face for level 1 headers.", "markdown-header-face": "Base face for headers.", "markdown-highlighting-face": "Face for highlighting.", "markdown-html-entity-face": "Face for HTML entities.", "markdown-html-attr-value-face": "Face for HTML attribute values.", "markdown-html-attr-name-face": "Face for HTML attribute names.", "markdown-html-tag-delimiter-face": "Face for HTML tag delimiters.", "markdown-html-tag-name-face": "Face for HTML tag names.", "markdown-hr-face": "Face for horizontal rules.", "markdown-highlight-face": "Face for mouse highlighting.", "markdown-gfm-checkbox-face": "Face for GFM checkboxes.", "markdown-metadata-value-face": "Face for metadata values.", "markdown-metadata-key-face": "Face for metadata keys.", "markdown-math-face": "Face for LaTeX expressions.", "markdown-comment-face": "Face for HTML comments.", "markdown-line-break-face": "Face for hard line breaks.", "markdown-link-title-face": "Face for reference link titles.", "markdown-plain-url-face": "Face for URLs that are also links.", "markdown-url-face": "Face for URLs that are part of markup.", "markdown-footnote-text-face": "Face for footnote text.", "markdown-footnote-marker-face": "Face for footnote markers.", "markdown-reference-face": "Face for link references.", "markdown-missing-link-face": "Face for the link text if the link points to a missing file.", "markdown-link-face": "Face for link text, ie the alias portion of a link.", "markdown-language-info-face": "Face for programming language info strings.", "markdown-language-keyword-face": "Face for programming language identifiers.", "markdown-table-face": "Face for tables.", "markdown-pre-face": "Face for preformatted text.", "markdown-inline-code-face": "Face for inline code.", "markdown-code-face": "Face for inline code, pre blocks, and fenced code blocks.", "markdown-blockquote-face": "Face for blockquote sections.", "markdown-list-face": "Face for list item markers.", "markdown-header-delimiter-face": "Base face for headers hash delimiter.", "markdown-header-rule-face": "Base face for headers rules.", "markdown-markup-face": "Face for markup elements.", "markdown-strike-through-face": "Face for strike-through text.", "markdown-bold-face": "Face for bold text.", "markdown-italic-face": "Face for italic text.", "outline-8": "Level 8.", "outline-7": "Level 7.", "outline-6": "Level 6.", "outline-5": "Level 5.", "outline-4": "Level 4.", "outline-3": "Level 3.", "outline-2": "Level 2.", "outline-1": "Level 1.", "lv-separator": "Face used to draw line between the lv window and the echo area.", "compilation-column-number": "Face for displaying column numbers in compiler messages.", "compilation-line-number": "Face for displaying line numbers in compiler messages.", "compilation-mode-line-exit": "Face for Compilation mode\u2019s \"exit\" mode line indicator.", "compilation-mode-line-run": "Face for Compilation mode\u2019s \"running\" mode line indicator.", "compilation-mode-line-fail": "Face for Compilation mode\u2019s \"error\" mode line indicator.", "compilation-info": "Face used to highlight compiler information.", "compilation-warning": "Face used to highlight compiler warnings.", "compilation-error": "Face used to highlight compiler errors.", "breakpoint-disabled": "Face for disabled breakpoint icon in fringe.", "breakpoint-enabled": "Face for enabled breakpoint icon in fringe.", "gud-highlight-current-line-face": "Face for highlighting the source code line being executed.", "ert-test-result-unexpected": "Face used for unexpected results in the ERT results buffer.", "ert-test-result-expected": "Face used for expected results in the ERT results buffer.", "yas--field-debug-face": "The face used for debugging some overlays normally hidden", "yas-field-highlight-face": "The face used to highlight the currently active field of a snippet", "treesit-explorer-field-name": "Face for field names in tree-sitter explorer.", "treesit-explorer-anonymous-node": "Face for anonymous nodes in tree-sitter explorer.", "dirvish-vc-needs-update-state": "Face used for \u2018needs-update\u2019 vc state in the Dirvish buffer.", "dirvish-vc-locked-state": "Face used for \u2018locked\u2019 vc state in the Dirvish buffer.", "dirvish-vc-conflict-state": "Face used for \u2018conflict\u2019 vc state in the Dirvish buffer.", "dirvish-vc-missing-state": "Face used for \u2018missing\u2019 vc state in the Dirvish buffer.", "dirvish-vc-removed-state": "Face used for \u2018removed\u2019 vc state in the Dirvish buffer.", "dirvish-vc-added-state": "Face used for \u2018added\u2019 vc state in the Dirvish buffer.", "dirvish-vc-edited-state": "Face used for \u2018edited\u2019 vc state in the Dirvish buffer.", "dirvish-git-commit-message-face": "Face for commit message overlays.", "dirvish-vc-unregistered-face": "Face used for \u2018unregistered\u2019 vc state in the Dirvish buffer.", "dirvish-vc-needs-merge-face": "Face used for \u2018needs-merge\u2019 vc state in the Dirvish buffer.", "shell-highlight-undef-alias-face": "Face used for shell command aliases.", "shell-highlight-undef-undefined-face": "Face used for non-existent shell commands.", "shell-highlight-undef-defined-face": "Face used for existing shell commands.", "dirvish-collapse-file-face": "Face used for files in \u2018collapse\u2019 attribute.", "dirvish-collapse-empty-dir-face": "Face used for empty directories in \u2018collapse\u2019 attribute.", "dirvish-collapse-dir-face": "Face used for directories in \u2018collapse\u2019 attribute.", "dirvish-narrow-split": "Face used to highlight punctuation character.", "dirvish-narrow-match-face-3": "Face for matches of components numbered 3 mod 4.", "dirvish-narrow-match-face-2": "Face for matches of components numbered 2 mod 4.", "dirvish-narrow-match-face-1": "Face for matches of components numbered 1 mod 4.", "dirvish-narrow-match-face-0": "Face for matches of components numbered 0 mod 4.", "dirvish-subtree-guide": "Face used for \u2018expanded-state\u2019 attribute.", "dirvish-subtree-state": "Face used for \u2018expanded-state\u2019 attribute.", "dirvish-emerge-group-title": "Face used for emerge group title.", "dirvish-proc-failed": "Face used if asynchronous process has failed.", "dirvish-proc-finished": "Face used if asynchronous process has finished.", "dirvish-proc-running": "Face used if asynchronous process is running.", "dirvish-inactive": "Face used for mode-line segments in unfocused Dirvish windows.", "dirvish-hl-line-inactive": "Face used for Dirvish line highlighting in unfocused Dirvish windows.", "dirvish-hl-line": "Face used for Dirvish line highlighting in focused Dirvish window.", "dashboard-footer-icon-face": "Face used for icon in footer.", "dashboard-footer-face": "Face used for footer text.", "dashboard-no-items-face": "Face used for no items.", "dashboard-items-face": "Face used for items.", "dashboard-heading": "Face used for widget headings.", "dashboard-navigator": "Face used for the navigator.", "dashboard-banner-logo-title": "Face used for the banner title.", "dashboard-text-banner": "Face used for text banners.", "rectangle-preview": "The face to use for the \u2018string-rectangle\u2019 preview.", "transient-mismatched-key": "Face optionally used to highlight keys without a short-argument.", "transient-nonstandard-key": "Face optionally used to highlight keys conflicting with short-argument.", "transient-unreachable-key": "Face used for keys unreachable from the current prefix sequence.", "transient-key-exit": "Face used for keys of suffixes that exit the menu.", "transient-key-stack": "Face used for keys of sub-menus that exit the parent menu.", "transient-key-recurse": "Face used for keys of sub-menus whose suffixes return to the parent menu.", "transient-key-return": "Face used for keys of suffixes that return to the parent menu.", "transient-key-noop": "Face used for keys of suffixes that currently cannot be invoked.", "transient-key-stay": "Face used for keys of suffixes that don\u2019t exit the menu.", "transient-key": "Face used for keys.", "transient-delimiter": "Face used for delimiters and separators.", "transient-higher-level": "Face optionally used to highlight suffixes on higher levels.", "transient-disabled-suffix": "Face used for disabled levels while editing suffix levels.", "transient-enabled-suffix": "Face used for enabled levels while editing suffix levels.", "transient-active-infix": "Face used for the infix for which the value is being read.", "transient-inapt-suffix": "Face used for suffixes that are inapt at this time.", "transient-unreachable": "Face used for suffixes unreachable from the current prefix sequence.", "transient-inactive-value": "Face used for inactive values.", "transient-value": "Face used for values.", "transient-inapt-argument": "Face used for inapt arguments with a (currently ignored) value.", "transient-inactive-argument": "Face used for inactive arguments.", "transient-argument": "Face used for enabled arguments.", "transient-heading": "Face used for headings.", "image-dired-thumb-flagged": "Face for images flagged for deletion in thumbnail buffer.", "image-dired-thumb-mark": "Face for marked images in thumbnail buffer.", "image-dired-thumb-header-image-count": "Face for the image count in the header line of the thumbnail buffer.", "image-dired-thumb-header-file-size": "Face for the file size in the header line of the thumbnail buffer.", "image-dired-thumb-header-directory-name": "Face for the directory name in the header line of the thumbnail buffer.", "image-dired-thumb-header-file-name": "Face for the file name in the header line of the thumbnail buffer.", "erc-keyword-face": "ERC face for your keywords.", "erc-fool-face": "ERC face for fools on the channel.", "erc-pal-face": "ERC face for your pals.", "erc-dangerous-host-face": "ERC face for people on dangerous hosts.", "erc-current-nick-face": "ERC face for occurrences of your current nickname.", "bg:erc-color-face15": "ERC face.", "bg:erc-color-face14": "ERC face.", "bg:erc-color-face13": "ERC face.", "bg:erc-color-face12": "ERC face.", "bg:erc-color-face11": "ERC face.", "bg:erc-color-face10": "ERC face.", "bg:erc-color-face9": "ERC face.", "bg:erc-color-face8": "ERC face.", "bg:erc-color-face7": "ERC face.", "bg:erc-color-face6": "ERC face.", "bg:erc-color-face5": "ERC face.", "bg:erc-color-face4": "ERC face.", "bg:erc-color-face3": "ERC face.", "bg:erc-color-face2": "ERC face.", "bg:erc-color-face1": "ERC face.", "bg:erc-color-face0": "ERC face.", "fg:erc-color-face15": "ERC face.", "fg:erc-color-face14": "ERC face.", "fg:erc-color-face13": "ERC face.", "fg:erc-color-face12": "ERC face.", "fg:erc-color-face11": "ERC face.", "fg:erc-color-face10": "ERC face.", "fg:erc-color-face9": "ERC face.", "fg:erc-color-face8": "ERC face.", "fg:erc-color-face7": "ERC face.", "fg:erc-color-face6": "ERC face.", "fg:erc-color-face5": "ERC face.", "fg:erc-color-face4": "ERC face.", "fg:erc-color-face3": "ERC face.", "fg:erc-color-face2": "ERC face.", "fg:erc-color-face1": "ERC face.", "fg:erc-color-face0": "ERC face.", "erc-underline-face": "ERC underline face.", "erc-spoiler-face": "ERC spoiler face.", "erc-inverse-face": "ERC inverse face.", "erc-italic-face": "ERC italic face.", "erc-bold-face": "ERC bold face.", "erc-command-indicator-face": "Face for echoed command lines, including the prompt.", "erc-keep-place-indicator-arrow": "Face for arrow value of option \u2018erc-keep-place-indicator-style\u2019.", "erc-keep-place-indicator-line": "Face for option \u2018erc-keep-place-indicator-style\u2019.", "comint-highlight-prompt": "Face to use to highlight prompts.", "comint-highlight-input": "Face to use to highlight user input.", "ansi-color-bright-white": "Face used to render bright white color code.", "ansi-color-bright-cyan": "Face used to render bright cyan color code.", "ansi-color-bright-magenta": "Face used to render bright magenta color code.", "ansi-color-bright-blue": "Face used to render bright blue color code.", "ansi-color-bright-yellow": "Face used to render bright yellow color code.", "ansi-color-bright-green": "Face used to render bright green color code.", "ansi-color-bright-red": "Face used to render bright red color code.", "ansi-color-bright-black": "Face used to render bright black color code.", "ansi-color-white": "Face used to render white color code.", "ansi-color-cyan": "Face used to render cyan color code.", "ansi-color-magenta": "Face used to render magenta color code.", "ansi-color-blue": "Face used to render blue color code.", "ansi-color-yellow": "Face used to render yellow color code.", "ansi-color-green": "Face used to render green color code.", "ansi-color-red": "Face used to render red color code.", "ansi-color-black": "Face used to render black color code.", "ansi-color-inverse": "Face used to render inverted video text.", "ansi-color-fast-blink": "Face used to render rapidly blinking text.", "ansi-color-slow-blink": "Face used to render slowly blinking text.", "ansi-color-underline": "Face used to render underlined text.", "ansi-color-italic": "Face used to render italic text.", "ansi-color-faint": "Face used to render faint text.", "ansi-color-bold": "Face used to render bold text.", "erc-button-nick-default-face": "Default face for a buttonized nickname.", "erc-button": "ERC button face.", "erc-fill-wrap-merge-indicator-face": "ERC \u2018fill-wrap\u2019 merge-indicator face.", "erc-timestamp-face": "ERC timestamp face.", "erc-nick-msg-face": "ERC nickname face for private messages.", "erc-nick-default-face": "ERC nickname default face.", "erc-my-nick-face": "ERC face for your current nickname in messages sent by you.", "erc-information": "Face for local administrative messages of low to moderate importance.", "erc-error-face": "ERC face for errors.", "erc-action-face": "ERC face for actions generated by /ME.", "erc-notice-face": "ERC face for notices.", "erc-prompt-face": "ERC face for the prompt.", "erc-input-face": "ERC face used for your input.", "erc-header-line": "ERC face used for the header line.", "erc-direct-msg-face": "ERC face used for messages you receive in the main erc buffer.", "erc-my-nick-prefix-face": "ERC face used for my user mode prefix.", "erc-nick-prefix-face": "ERC face used for user mode prefix.", "erc-default-face": "ERC default face.", "prescient-secondary-highlight": "Additional face used to highlight parts of candidates.", "prescient-primary-highlight": "Face used to highlight the parts of candidates that match the input.", "company-echo-common": "Face used for the common part of completions in the echo area.", "company-echo": "Face used for completions in the echo area.", "company-preview-search": "Face used for the search string in the completion preview.", "company-preview-common": "Face used for the common part of the completion preview.", "company-preview": "Face used for the completion preview.", "company-tooltip-scrollbar-track": "Face used for the tooltip scrollbar track (trough).", "company-tooltip-scrollbar-thumb": "Face used for the tooltip scrollbar thumb (bar).", "company-tooltip-quick-access-selection": "Face used for the selected quick-access hints shown in the tooltip.", "company-tooltip-quick-access": "Face used for the quick-access hints shown in the tooltip.", "company-tooltip-annotation-selection": "Face used for the selected completion annotation in the tooltip.", "company-tooltip-annotation": "Face used for the completion annotation in the tooltip.", "company-tooltip-common-selection": "Face used for the selected common completion in the tooltip.", "company-tooltip-common": "Face used for the common completion in the tooltip.", "company-tooltip-mouse": "Face used for the tooltip item under the mouse.", "company-tooltip-search-selection": "Face used for the search string inside the selection in the tooltip.", "company-tooltip-search": "Face used for the search string in the tooltip.", "company-tooltip-deprecated": "Face used for the deprecated items.", "company-tooltip-selection": "Face used for the selection in the tooltip.", "company-tooltip": "Face used for the tooltip.", "embark-selected": "Face for selected candidates.", "embark-collect-annotation": "Face for annotations in Embark Collect.", "embark-collect-group-separator": "Face for group titles in Embark Collect buffers.", "embark-collect-group-title": "Face for group titles in Embark Collect buffers.", "embark-collect-candidate": "Face for candidates in Embark Collect buffers.", "embark-verbose-indicator-shadowed": "Face used by the verbose action indicator for the shadowed targets.", "embark-verbose-indicator-title": "Face used by the verbose action indicator for the title.", "embark-verbose-indicator-documentation": "Face used by the verbose action indicator to display binding descriptions.", "embark-target": "Face used to highlight the target at point during \u2018embark-act\u2019.", "embark-keymap": "Face used to display keymaps.", "embark-keybinding": "Face used to display key bindings.", "embark-keybinding-repeat": "Face used to indicate keybindings as repeatable.", "ffap": "Face used to highlight the current buffer substring.", "orderless-match-face-3": "Face for matches of components numbered 3 mod 4.", "orderless-match-face-2": "Face for matches of components numbered 2 mod 4.", "orderless-match-face-1": "Face for matches of components numbered 1 mod 4.", "orderless-match-face-0": "Face for matches of components numbered 0 mod 4.", "consult-line-number-wrapped": "Face used to highlight line number prefixes after wrap around.", "consult-line-number-prefix": "Face used to highlight line number prefixes.", "consult-buffer": "Face used to highlight buffers in \u2018consult-buffer\u2019.", "consult-bookmark": "Face used to highlight bookmarks in \u2018consult-buffer\u2019.", "consult-grep-context": "Face used to highlight grep context in \u2018consult-grep\u2019.", "consult-file": "Face used to highlight files in \u2018consult-buffer\u2019.", "consult-line-number": "Face used to highlight location line in \u2018consult-global-mark\u2019.", "consult-key": "Face used to highlight keys, e.g., in \u2018consult-register\u2019.", "consult-help": "Face used to highlight help, e.g., in \u2018consult-register-store\u2019.", "consult-async-option": "Face used to highlight asynchronous command options.", "consult-async-split": "Face used to highlight punctuation character.", "consult-async-failed": "Face used if asynchronous process has failed.", "consult-async-finished": "Face used if asynchronous process has finished.", "consult-async-running": "Face used if asynchronous process is running.", "consult-narrow-indicator": "Face used for the narrowing indicator.", "consult-preview-insertion": "Face used for previews of text to be inserted.", "consult-preview-match": "Face used for match previews, e.g., in \u2018consult-line\u2019.", "consult-highlight-mark": "Face used for mark positions in completion candidates.", "consult-highlight-match": "Face used to highlight matches in the completion candidates.", "consult-preview-line": "Face used for line previews.", "nerd-icons-completion-dir-face": "Face for the directory icon.", "marginalia-file-priv-rare": "Face used to highlight a rare file privilege attribute.", "marginalia-file-priv-other": "Face used to highlight some other file privilege attribute.", "marginalia-file-priv-exec": "Face used to highlight the exec file privilege attribute.", "marginalia-file-priv-write": "Face used to highlight the write file privilege attribute.", "marginalia-file-priv-read": "Face used to highlight the read file privilege attribute.", "marginalia-file-priv-link": "Face used to highlight the link file privilege attribute.", "marginalia-file-priv-dir": "Face used to highlight the dir file privilege attribute.", "marginalia-file-priv-no": "Face used to highlight the no file privilege attribute.", "marginalia-file-owner": "Face used to highlight file owner and group names.", "marginalia-file-name": "Face used to highlight file names.", "marginalia-modified": "Face used to highlight buffer modification indicators.", "marginalia-string": "Face used to highlight string values.", "marginalia-number": "Face used to highlight numeric values.", "marginalia-size": "Face used to highlight sizes.", "marginalia-installed": "Face used to highlight the status of packages.", "marginalia-archive": "Face used to highlight package archives.", "marginalia-version": "Face used to highlight package versions.", "marginalia-date": "Face used to highlight dates.", "marginalia-mode": "Face used to highlight buffer major modes.", "marginalia-list": "Face used to highlight list expressions.", "marginalia-symbol": "Face used to highlight general symbols.", "marginalia-function": "Face used to highlight function symbols.", "marginalia-true": "Face used to highlight true variable values.", "marginalia-null": "Face used to highlight null or unbound variable values.", "marginalia-value": "Face used to highlight general variable values.", "marginalia-documentation": "Face used to highlight documentation strings.", "marginalia-off": "Face used to signal disabled modes.", "marginalia-on": "Face used to signal enabled modes.", "marginalia-lighter": "Face used to highlight minor mode lighters.", "marginalia-char": "Face used to highlight character annotations.", "marginalia-type": "Face used to highlight types.", "marginalia-key": "Face used to highlight keys.", "vertico-current": "Face used to highlight the currently selected candidate.", "vertico-group-separator": "Face used for the separator lines of the candidate groups.", "vertico-group-title": "Face used for the title text of the candidate group headlines.", "vertico-multiline": "Face used to highlight multiline replacement characters.", "nerd-icons-dsilver": "Face for dsilver icons.", "nerd-icons-lsilver": "Face for lsilver icons.", "nerd-icons-silver": "Face for silver icons.", "nerd-icons-dpink": "Face for dpink icons.", "nerd-icons-lpink": "Face for lpink icons.", "nerd-icons-pink": "Face for pink icons.", "nerd-icons-dcyan": "Face for dcyan icons.", "nerd-icons-lcyan": "Face for lcyan icons.", "nerd-icons-cyan-alt": "Face for cyan icons.", "nerd-icons-cyan": "Face for cyan icons.", "nerd-icons-dorange": "Face for dorange icons.", "nerd-icons-lorange": "Face for lorange icons.", "nerd-icons-orange": "Face for orange icons.", "nerd-icons-dpurple": "Face for dpurple icons.", "nerd-icons-lpurple": "Face for lpurple icons.", "nerd-icons-purple-alt": "Face for purple icons.", "nerd-icons-purple": "Face for purple icons.", "nerd-icons-dmaroon": "Face for dmaroon icons.", "nerd-icons-lmaroon": "Face for lmaroon icons.", "nerd-icons-maroon": "Face for maroon icons.", "nerd-icons-dblue": "Face for dblue icons.", "nerd-icons-lblue": "Face for lblue icons.", "nerd-icons-blue-alt": "Face for blue icons.", "nerd-icons-blue": "Face for blue icons.", "nerd-icons-dyellow": "Face for dyellow icons.", "nerd-icons-lyellow": "Face for lyellow icons.", "nerd-icons-yellow": "Face for yellow icons.", "nerd-icons-dgreen": "Face for dgreen icons.", "nerd-icons-lgreen": "Face for lgreen icons.", "nerd-icons-green": "Face for green icons.", "nerd-icons-red-alt": "Face for dred icons.", "nerd-icons-dred": "Face for dred icons.", "nerd-icons-lred": "Face for lred icons.", "nerd-icons-red": "Face for red icons.", "all-the-icons-dsilver": "Face for dsilver icons", "all-the-icons-lsilver": "Face for lsilver icons", "all-the-icons-silver": "Face for silver icons", "all-the-icons-dpink": "Face for dpink icons", "all-the-icons-lpink": "Face for lpink icons", "all-the-icons-pink": "Face for pink icons", "all-the-icons-dcyan": "Face for dcyan icons", "all-the-icons-lcyan": "Face for lcyan icons", "all-the-icons-cyan-alt": "Face for cyan icons", "all-the-icons-cyan": "Face for cyan icons", "all-the-icons-dorange": "Face for dorange icons", "all-the-icons-lorange": "Face for lorange icons", "all-the-icons-orange": "Face for orange icons", "all-the-icons-dpurple": "Face for dpurple icons", "all-the-icons-lpurple": "Face for lpurple icons", "all-the-icons-purple-alt": "Face for purple icons", "all-the-icons-purple": "Face for purple icons", "all-the-icons-dmaroon": "Face for dmaroon icons", "all-the-icons-lmaroon": "Face for lmaroon icons", "all-the-icons-maroon": "Face for maroon icons", "all-the-icons-dblue": "Face for dblue icons", "all-the-icons-lblue": "Face for lblue icons", "all-the-icons-blue-alt": "Face for blue icons", "all-the-icons-blue": "Face for blue icons", "all-the-icons-dyellow": "Face for dyellow icons", "all-the-icons-lyellow": "Face for lyellow icons", "all-the-icons-yellow": "Face for yellow icons", "all-the-icons-dgreen": "Face for dgreen icons", "all-the-icons-lgreen": "Face for lgreen icons", "all-the-icons-green": "Face for green icons", "all-the-icons-red-alt": "Face for dred icons", "all-the-icons-dred": "Face for dred icons", "all-the-icons-lred": "Face for lred icons", "all-the-icons-red": "Face for red icons", "adob--hack": "A hack to make fringe refresh work. Do not use.", "auto-dim-other-buffers-hide": "Face with a (presumably) dimmed background and matching foreground.", "auto-dim-other-buffers": "Face with a (presumably) dimmed background for non-selected window.", "epa-field-body": "Face for the body of the attribute field.", "epa-field-name": "Face for the name of the attribute field.", "epa-mark": "Face used for displaying the high validity.", "epa-string": "Face used for displaying the string.", "epa-validity-disabled": "Face used for displaying the disabled validity.", "epa-validity-low": "Face used for displaying the low validity.", "epa-validity-medium": "Face for medium validity EPA information.", "epa-validity-high": "Face for high validity EPA information.", "mm-command-output": "Face used for displaying output from commands.", "edmacro-label": "Face used for labels in \u2018edit-kbd-macro\u2019.", "kmacro-menu-marked": "Face used for keyboard macros marked for duplication.", "kmacro-menu-flagged": "Face used for keyboard macros flagged for deletion.", "kmacro-menu-mark": "Face used for the Keyboard Macro Menu marks.", "custom-group-subtitle": "Face for the \"Subgroups:\" subtitle in Custom buffers.", "custom-group-tag": "Face for low level group tags.", "custom-group-tag-1": "Face for group tags.", "custom-face-tag": "Face used for face tags.", "custom-visibility": "Face for the \u2018custom-visibility\u2019 widget.", "custom-variable-button": "Face used for pushable variable tags.", "custom-variable-tag": "Face used for unpushable variable tags.", "custom-variable-obsolete": "Face used for obsolete variables.", "custom-comment-tag": "Face used for the comment tag on variables or faces.", "custom-comment": "Face used for comments on variables or faces.", "custom-link": "Face for links in customization buffers.", "custom-state": "Face used for State descriptions in the customize buffer.", "custom-documentation": "Face used for documentation strings in customization buffers.", "custom-button-pressed-unraised": "Face for pressed custom buttons if \u2018custom-raised-buttons\u2019 is nil.", "custom-button-pressed": "Face for pressed custom buttons if \u2018custom-raised-buttons\u2019 is non-nil.", "custom-button-unraised": "Face for custom buffer buttons if \u2018custom-raised-buttons\u2019 is nil.", "custom-button-mouse": "Mouse face for custom buffer buttons if \u2018custom-raised-buttons\u2019 is non-nil.", "custom-button": "Face for custom buffer buttons if \u2018custom-raised-buttons\u2019 is non-nil.", "custom-saved": "Face used when the customize item has been saved.", "custom-themed": "Face used when the customize item has been set by a theme.", "custom-changed": "Face used when the customize item has been changed.", "custom-set": "Face used when the customize item has been set.", "custom-modified": "Face used when the customize item has been modified.", "custom-rogue": "Face used when the customize item is not defined for customization.", "custom-invalid": "Face used when the customize item is invalid.", "widget-button-pressed": "Face used for pressed buttons.", "widget-unselected": "Face used for unselected widgets.", "widget-inactive": "Face used for inactive widgets.", "widget-single-line-field": "Face used for editable fields spanning only a single line.", "widget-field": "Face used for editable fields.", "widget-button": "Face used for widget buttons.", "widget-documentation": "Face used for documentation text.", "bookmark-face": "Face used to highlight current line.", "bookmark-menu-bookmark": "Face used to highlight bookmark names in bookmark menu buffers.", "dired-ignored": "Face used for files suffixed with \u2018completion-ignored-extensions\u2019.", "dired-special": "Face used for sockets, pipes, block devices and char devices.", "dired-broken-symlink": "Face used for broken symbolic links.", "dired-symlink": "Face used for symbolic links.", "dired-directory": "Face used for subdirectories.", "dired-set-id": "Face used to highlight permissions of suid and guid files.", "dired-perm-write": "Face used to highlight permissions of group- and world-writable files.", "dired-warning": "Face used to highlight a part of a buffer that needs user attention.", "dired-flagged": "Face used for files flagged for deletion.", "dired-marked": "Face used for marked files.", "dired-mark": "Face used for Dired marks.", "dired-header": "Face used for directory headers.", "Info-quoted": "Face used for quoted elements.", "info-index-match": "Face used to highlight matches in an index entry.", "info-header-node": "Face for Info nodes in a node header.", "info-header-xref": "Face for Info cross-references in a node header.", "info-xref-visited": "Face for visited Info cross-references.", "info-xref": "Face for unvisited Info cross-references.", "info-menu-star": "Face used to emphasize \u2018*\u2019 in an Info menu.", "info-menu-header": "Face for headers in Info menus.", "info-title-4": "Face for info titles at level 4.", "info-title-3": "Face for info titles at level 3.", "info-title-2": "Face for info titles at level 2.", "info-title-1": "Face for info titles at level 1.", "info-node": "Face for Info node names.", "package-status-avail-obso": "Face used on the status and version of avail-obso packages.", "package-status-incompat": "Face used on the status and version of incompat packages.", "package-status-unsigned": "Face used on the status and version of unsigned packages.", "package-status-dependency": "Face used on the status and version of dependency packages.", "package-status-from-source": "Face used on the status and version of installed packages.", "package-status-installed": "Face used on the status and version of installed packages.", "package-status-disabled": "Face used on the status and version of disabled packages.", "package-status-held": "Face used on the status and version of held packages.", "package-status-new": "Face used on the status and version of new packages.", "package-status-available": "Face used on the status and version of available packages.", "package-status-external": "Face used on the status and version of external packages.", "package-status-built-in": "Face used on the status and version of built-in packages.", "package-description": "Face used on package description summaries in the package menu.", "package-name": "Face used on package names in the package menu.", "package-help-section-name": "Face used on section names in package description buffers.", "browse-url-button": "Face for \u2018browse-url\u2019 buttons (i.e., links).", "icon-button": "Face for buttons.", "icon": "Face for buttons.", "tooltip": "Face for tooltips.", "eldoc-highlight-function-argument": "Face used for the argument at point in a function\u2019s argument list.", "elisp-shorthand-font-lock-face": "Face for highlighting shorthands in Emacs Lisp.", "vc-ignored-state": "Face for VC modeline state when the file is registered, but ignored.", "vc-edited-state": "Face for VC modeline state when the file is edited.", "vc-missing-state": "Face for VC modeline state when the file is missing from the file system.", "vc-removed-state": "Face for VC modeline state when the file was removed from the VC system.", "vc-conflict-state": "Face for VC modeline state when the file contains merge conflicts.", "vc-locally-added-state": "Face for VC modeline state when the file is locally added.", "vc-locked-state": "Face for VC modeline state when the file locked.", "vc-needs-update-state": "Face for VC modeline state when the file needs update.", "vc-up-to-date-state": "Face for VC modeline state when the file is up to date.", "vc-state-base": "Base face for VC state indicator.", "buffer-menu-buffer": "Face for buffer names in the Buffer Menu.", "tabulated-list-fake-header": "Face used on fake header lines.", "match": "Face used to highlight matches permanently.", "query-replace": "Face for highlighting query replacement matches.", "tab-bar-tab-ungrouped": "Tab bar face for ungrouped tab when tab groups are used.", "tab-bar-tab-group-inactive": "Tab bar face for inactive group tab.", "tab-bar-tab-group-current": "Tab bar face for current group tab.", "tab-bar-tab-inactive": "Tab bar face for non-selected tab.", "tab-bar-tab": "Tab bar face for selected tab.", "file-name-shadow": "Face used by \u2018file-name-shadow-mode\u2019 for the shadow.", "isearch-group-2": "Face for highlighting Isearch the even group matches.", "isearch-group-1": "Face for highlighting Isearch the odd group matches.", "lazy-highlight": "Face for lazy highlighting of matches other than the current one.", "isearch-fail": "Face for highlighting failed part in Isearch echo-area message.", "isearch": "Face for highlighting Isearch matches.", "mouse-drag-and-drop-region": "Face to highlight original text during dragging.", "font-lock-misc-punctuation-face": "Font Lock mode face used to highlight miscellaneous punctuation.", "font-lock-delimiter-face": "Font Lock mode face used to highlight delimiters.", "font-lock-bracket-face": "Font Lock mode face used to highlight brackets, braces, and parens.", "font-lock-punctuation-face": "Font Lock mode face used to highlight punctuation characters.", "font-lock-property-use-face": "Font Lock mode face used to highlight property references.", "font-lock-property-name-face": "Font Lock mode face used to highlight properties of an object.", "font-lock-operator-face": "Font Lock mode face used to highlight operators.", "font-lock-number-face": "Font Lock mode face used to highlight numbers.", "font-lock-escape-face": "Font Lock mode face used to highlight escape sequences in strings.", "font-lock-regexp-grouping-construct": "Font Lock mode face used to highlight grouping constructs in Lisp regexps.", "font-lock-regexp-grouping-backslash": "Font Lock mode face for backslashes in Lisp regexp grouping constructs.", "font-lock-regexp-face": "Font Lock mode face used to highlight regexp literals.", "font-lock-preprocessor-face": "Font Lock mode face used to highlight preprocessor directives.", "font-lock-negation-char-face": "Font Lock mode face used to highlight easy to overlook negation.", "font-lock-warning-face": "Font Lock mode face used to highlight warnings.", "font-lock-constant-face": "Font Lock mode face used to highlight constants and labels.", "font-lock-type-face": "Font Lock mode face used to highlight type and class names.", "font-lock-variable-use-face": "Font Lock mode face used to highlight variable references.", "font-lock-variable-name-face": "Font Lock mode face used to highlight variable names.", "font-lock-function-call-face": "Font Lock mode face used to highlight function calls.", "font-lock-function-name-face": "Font Lock mode face used to highlight function names.", "font-lock-builtin-face": "Font Lock mode face used to highlight builtins.", "font-lock-keyword-face": "Font Lock mode face used to highlight keywords.", "font-lock-doc-markup-face": "Font Lock mode face used to highlight embedded documentation mark-up.", "font-lock-doc-face": "Font Lock mode face used to highlight documentation embedded in program code.", "font-lock-string-face": "Font Lock mode face used to highlight strings.", "font-lock-comment-delimiter-face": "Font Lock mode face used to highlight comment delimiters.", "font-lock-comment-face": "Font Lock mode face used to highlight comments.", "completions-common-part": "Face for the parts of completions which matched the pattern.", "completions-first-difference": "Face for the first character after point in completions.", "completions-highlight": "Default face for highlighting the current completion candidate.", "completions-annotations": "Face to use for annotations in the *Completions* buffer.", "completions-group-separator": "Face used for the separator lines between the candidate groups.", "completions-group-title": "Face used for the title text of the candidate group headlines.", "blink-matching-paren-offscreen": "Face for showing in the echo area matched open paren that is off-screen.", "separator-line": "Face for separator lines.", "next-error-message": "Face used to highlight the current error message in the \u2018next-error\u2019 buffer.", "next-error": "Face used to highlight next error locus.", "confusingly-reordered": "Face for highlighting text that was bidi-reordered in confusing ways.", "help-for-help-header": "Face used for headers in the \u2018help-for-help\u2019 buffer.", "abbrev-table-name": "Face used for displaying the abbrev table name in \u2018edit-abbrevs-mode\u2019.", "button": "Default face used for buttons.", "show-paren-mismatch": "Face used for a mismatching paren.", "show-paren-match-expression": "Face used for a matching paren when highlighting the whole expression.", "show-paren-match": "Face used for a matching paren.", "tty-menu-selected-face": "Face for displaying the currently selected item in TTY menus.", "tty-menu-disabled-face": "Face for displaying disabled items in TTY menus.", "tty-menu-enabled-face": "Face for displaying enabled items in TTY menus.", "read-multiple-choice-face": "Face for the symbol name in \u2018read-multiple-choice\u2019 output.", "success": "Basic face used to indicate successful operation.", "warning": "Basic face used to highlight warnings.", "error": "Basic face used to highlight errors and to denote failure.", "glyphless-char": "Face for displaying non-graphic characters (e.g. U+202A (LRE)).", "help-key-binding": "Face for keybindings in *Help* buffers.", "help-argument-name": "Face to highlight argument names in *Help* buffers.", "menu": "Basic face for the font and colors of the menu bar and popup menus.", "tab-line": "Tab line face.", "tab-bar": "Tab bar face.", "tool-bar": "Basic tool-bar face.", "mouse": "Basic face for the mouse color under X.", "cursor": "Basic face for the cursor color under X.", "border": "Basic face for the frame border under X.", "scroll-bar": "Basic face for the scroll bar colors under X.", "fringe": "Basic face for the fringes to the left and right of windows under X.", "minibuffer-prompt": "Face for minibuffer prompts.", "child-frame-border": "Basic face for the internal border of child frames.", "internal-border": "Basic face for the internal border.", "window-divider-last-pixel": "Basic face for last pixel line/column of window dividers.", "window-divider-first-pixel": "Basic face for first pixel line/column of window dividers.", "window-divider": "Basic face for window dividers.", "vertical-border": "Face used for vertical window dividers on ttys.", "header-line-highlight": "Basic header line face for highlighting.", "header-line": "Basic header-line face.", "mode-line-buffer-id": "Face used for buffer identification parts of the mode line.", "mode-line-emphasis": "Face used to emphasize certain mode line features.", "mode-line-highlight": "Basic mode line face for highlighting.", "mode-line-inactive": "Basic mode line face for non-selected windows.", "mode-line-active": "Face for the selected mode line.", "mode-line": "Face for the mode lines as well as header lines.", "nobreak-hyphen": "Face for displaying nobreak hyphens.", "nobreak-space": "Face for displaying nobreak space.", "homoglyph": "Face for lookalike characters.", "escape-glyph": "Face for characters displayed as sequences using \u2018^\u2019 or \u2018\\\u2019.", "fill-column-indicator": "Face for displaying fill column indicator.", "line-number-minor-tick": "Face for highlighting \"minor ticks\" (as in a ruler).", "line-number-major-tick": "Face for highlighting \"major ticks\" (as in a ruler).", "line-number-current-line": "Face for displaying the current line number.", "line-number": "Face for displaying line numbers.", "trailing-whitespace": "Basic face for highlighting trailing whitespace.", "secondary-selection": "Basic face for displaying the secondary selection.", "region": "Basic face for highlighting the region.", "highlight": "Basic face for highlighting.", "link-visited": "Basic face for visited links.", "link": "Basic face for unvisited links.", "shadow": "Basic face for shadowed text.", "variable-pitch-text": "The proportional face used for longer texts.", "variable-pitch": "The basic variable-pitch face.", "fixed-pitch-serif": "The basic fixed-pitch face with serifs.", "fixed-pitch": "The basic fixed-pitch face.", "underline": "Basic underlined face.", "bold-italic": "Basic bold-italic face.", "italic": "Basic italic face.", "bold": "Basic bold face.", "default": "Basic default face."}, SYNTAX_DOCS={"bg": "Basic default face.", "p": "Basic default face.", "kw": "Font Lock mode face used to highlight keywords.", "bi": "Font Lock mode face used to highlight builtins.", "pp": "Font Lock mode face used to highlight preprocessor directives.", "fnd": "Font Lock mode face used to highlight function names.", "fnc": "Font Lock mode face used to highlight function calls.", "ty": "Font Lock mode face used to highlight type and class names.", "prop": "Font Lock mode face used to highlight properties of an object.", "con": "Font Lock mode face used to highlight constants and labels.", "num": "Font Lock mode face used to highlight numbers.", "str": "Font Lock mode face used to highlight strings.", "esc": "Font Lock mode face used to highlight escape sequences in strings.", "re": "Font Lock mode face used to highlight regexp literals.", "doc": "Font Lock mode face used to highlight documentation embedded in program code.", "cm": "Font Lock mode face used to highlight comments.", "cmd": "Font Lock mode face used to highlight comment delimiters.", "var": "Font Lock mode face used to highlight variable names.", "op": "Font Lock mode face used to highlight operators.", "punc": "Font Lock mode face used to highlight punctuation characters."}; // face/category -> docstring first line, for element hovers +let MAP={"kw": "#d3d3d3", "bi": "#d3d3d3", "pp": "#d3d3d3", "fnd": "#0000ff", "fnc": "#0000ff", "dec": "", "ty": "#e5e5e5", "prop": "#e5e5e5", "con": "#d3d3d3", "num": "#000000", "esc": "#000000", "str": "#696969", "re": "#696969", "doc": "#696969", "cm": "#696969", "cmd": "#696969", "var": "#e5e5e5", "op": "#000000", "punc": "#000000", "p": "#000000", "bg": "#ffffff"}, PALETTE=[["#ffffff", "bg", "ground"], ["#000000", "fg", "ground"], ["#d3d3d3", "lightgray", "lightgray"], ["#0000ff", "blue1", "blue"], ["#e5e5e5", "gray90", "gray"], ["#696969", "dimgray", "dimgray"], ["#eedc82", "lightgoldenrod2", "lightgoldenrod"], ["#b4eeb4", "darkseagreen2", "darkseagreen"], ["#bfbfbf", "grey75", "grey"], ["#333333", "grey20", "grey"], ["#f2f2f2", "grey95", "grey"], ["#ff00ff", "magenta", "magenta"], ["#b0e2ff", "lightskyblue1", "lightskyblue"], ["#cd00cd", "magenta3", "magenta"], ["#afeeee", "paleturquoise", "paleturquoise"], ["#ffc1c1", "rosybrown1", "rosybrown"], ["#40e0d0", "turquoise", "turquoise"], ["#a020f0", "purple", "purple"], ["#3a5fcd", "royalblue3", "royalblue"], ["#ff0000", "red", "red"], ["#ff8c00", "dark-orange", "dark-orange"], ["#228b22", "forestgreen", "forestgreen"], ["#8b6508", "darkgoldenrod4", "darkgoldenrod"], ["#8b4c39", "salmon4", "salmon"], ["#22aa22", "color-24", "color-24"], ["#ddffdd", "color-25", "color-25"], ["#cceecc", "color-26", "color-26"], ["#aa2222", "color-27", "color-27"], ["#ffdddd", "color-28", "color-28"], ["#eecccc", "color-29", "color-29"], ["#7f7f7f", "grey50", "grey"], ["#cccccc", "grey80", "grey"], ["#cd8162", "lightsalmon3", "lightsalmon"], ["#aaaa11", "color-33", "color-33"], ["#ffffcc", "color-34", "color-34"], ["#eeeebb", "color-35", "color-35"], ["#4a708b", "skyblue4", "skyblue"], ["#6e8b3d", "darkolivegreen4", "darkolivegreen"], ["#8b6914", "goldenrod4", "goldenrod"], ["#999999", "grey60", "grey"], ["#4d4d4d", "grey30", "grey"], ["#b22222", "firebrick", "firebrick"], ["#00ff00", "green", "green"], ["#556b2f", "darkolivegreen", "darkolivegreen"], ["#8b3a3a", "indianred4", "indianred"], ["#b8860b", "darkgoldenrod", "darkgoldenrod"], ["#00ffff", "cyan", "cyan"], ["#66cdaa", "medium-aquamarine", "medium-aquamarine"], ["#ffa500", "orange", "orange"], ["#d02090", "violet-red", "violet-red"], ["#add8e6", "light-blue", "light-blue"], ["#cd5c5c", "indian-red", "indian-red"], ["#aaa", "color-52", "color-52"], ["#000", "color-53", "color-53"], ["#aa0", "color-54", "color-54"], ["#070", "color-55", "color-55"], ["#daa520", "goldenrod", "goldenrod"], ["#00bfff", "deep-sky-blue", "deep-sky-blue"], ["#ee00ee", "magenta2", "magenta"], ["#ffff00", "yellow", "yellow"], ["#6b6b6b", "color-60", "color-60"], ["#979797", "color-61", "color-61"], ["unspecified", "color-62", "color-62"], ["#223fbf", "color-63", "color-63"], ["#8f0075", "color-64", "color-64"], ["#145a00", "color-65", "color-65"], ["#804000", "color-66", "color-66"], ["#efcbcf", "color-67", "color-67"], ["#ffd700", "gold", "gold"], ["#8b0000", "darkred", "darkred"], ["#f0e68c", "khaki", "khaki"], ["#8b008b", "dark-magenta", "dark-magenta"], ["#ff4500", "orange-red", "orange-red"], ["#deb887", "burlywood", "burlywood"], ["#cd8500", "orange3", "orange"], ["#00008b", "dark-blue", "dark-blue"], ["#9400d3", "dark-violet", "dark-violet"], ["#6a9fb5", "color-77", "color-77"], ["#2188b6", "color-78", "color-78"], ["#75b5aa", "color-79", "color-79"], ["#0595bd", "color-80", "color-80"], ["#446674", "color-81", "color-81"], ["#48746d", "color-82", "color-82"], ["#6d8143", "color-83", "color-83"], ["#72584b", "color-84", "color-84"], ["#915b2d", "color-85", "color-85"], ["#7e5d5f", "color-86", "color-86"], ["#694863", "color-87", "color-87"], ["#843031", "color-88", "color-88"], ["#838484", "color-89", "color-89"], ["#b48d56", "color-90", "color-90"], ["#90a959", "color-91", "color-91"], ["#677174", "color-92", "color-92"], ["#2c7d6e", "color-93", "color-93"], ["#3d6837", "color-94", "color-94"], ["#ce7a4e", "color-95", "color-95"], ["#ff505b", "color-96", "color-96"], ["#e69dd6", "color-97", "color-97"], ["#eb595a", "color-98", "color-98"], ["#7f7869", "color-99", "color-99"], ["#ff9300", "color-100", "color-100"], ["#8f5536", "color-101", "color-101"], ["#d4843e", "color-102", "color-102"], ["#fc505b", "color-103", "color-103"], ["#68295b", "color-104", "color-104"], ["#5d54e1", "color-105", "color-105"], ["#ac4142", "color-106", "color-106"], ["#716e68", "color-107", "color-107"], ["#ffcc0e", "color-108", "color-108"], ["#8b1a1a", "firebrick4", "firebrick"], ["#fff8dc", "cornsilk", "cornsilk"], ["#f5deb3", "wheat", "wheat"], ["#cd0000", "red3", "red"], ["#0000cd", "blue3", "blue"], ["#cc9393", "color-114", "color-114"], ["#bebebe", "gray", "gray"], ["#88090b", "color-116", "color-116"], ["#707183", "color-117", "color-117"], ["#7388d6", "color-118", "color-118"], ["#909183", "color-119", "color-119"], ["#709870", "color-120", "color-120"], ["#907373", "color-121", "color-121"], ["#6276ba", "color-122", "color-122"], ["#858580", "color-123", "color-123"], ["#80a880", "color-124", "color-124"], ["#887070", "color-125", "color-125"], ["#1e90ff", "dodger-blue", "dodger-blue"], ["#ff69b4", "hot-pink", "hot-pink"], ["#da70d6", "orchid", "orchid"], ["#fa8072", "salmon", "salmon"], ["#00ff7f", "spring-green", "spring-green"], ["#800040", "color-131", "color-131"], ["#603f00", "color-132", "color-132"], ["#004476", "color-133", "color-133"], ["#2266ff", "color-134", "color-134"], ["#dd4488", "color-135", "color-135"], ["#8fbc8f", "color-136", "color-136"], ["#5f9ea0", "color-137", "color-137"], ["#ffffe0", "lightyellow1", "lightyellow"], ["#3e3c36", "color-139", "color-139"], ["#8b8989", "snow4", "snow"], ["#242424", "grey14", "grey"], ["#cd69c9", "orchid3", "orchid"], ["#dda0dd", "plum", "plum"], ["#000053", "color-144", "color-144"], ["#001970", "color-145", "color-145"], ["#002984", "color-146", "color-146"], ["#49599a", "color-147", "color-147"], ["#9499b7", "color-148", "color-148"], ["#cdc9c9", "snow3", "snow"], ["#eeb422", "goldenrod2", "goldenrod"], ["#68228b", "darkorchid4", "darkorchid"]], SYNTAX={"kw": {"fg": "#d3d3d3", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "bi": {"fg": "#d3d3d3", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "pp": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-builtin-face", "height": null}, "fnd": {"fg": "#0000ff", "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "fnc": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-function-name-face", "height": null}, "dec": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "ty": {"fg": "#e5e5e5", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "prop": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-variable-name-face", "height": null}, "con": {"fg": "#d3d3d3", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": {"style": "line", "color": null}, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "num": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "esc": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-regexp-grouping-backslash", "height": null}, "str": {"fg": "#696969", "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": "italic", "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "re": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-string-face", "height": null}, "doc": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-string-face", "height": null}, "cm": {"fg": "#696969", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": "italic", "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "cmd": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "font-lock-comment-face", "height": null}, "var": {"fg": "#e5e5e5", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": "italic", "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "op": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "punc": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "p": {"fg": "#000000", "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "bg": {"fg": "#ffffff", "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}}, UIMAP={"cursor": {"fg": null, "bg": "#000000", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "region": {"fg": null, "bg": "#eedc82", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": true, "inherit": null, "height": null}, "hl-line": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": true, "inherit": "highlight", "height": null}, "highlight": {"fg": null, "bg": "#b4eeb4", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "mode-line": {"fg": "#000000", "bg": "#bfbfbf", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": {"style": "released", "width": 1, "color": null}, "inverse": false, "extend": false, "inherit": null, "height": null}, "mode-line-highlight": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": {"style": "released", "width": 1, "color": null}, "inverse": false, "extend": false, "inherit": null, "height": null}, "mode-line-inactive": {"fg": "#333333", "bg": "#e5e5e5", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": {"style": "line", "width": 1, "color": "#bfbfbf"}, "inverse": false, "extend": false, "inherit": "mode-line", "height": null}, "fringe": {"fg": null, "bg": "#f2f2f2", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "line-number": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": ["shadow", "default"], "height": null}, "line-number-current-line": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": "line-number", "height": null}, "minibuffer-prompt": {"fg": "#ff00ff", "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "isearch": {"fg": "#b0e2ff", "bg": "#cd00cd", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "lazy-highlight": {"fg": null, "bg": "#afeeee", "distant-fg": "#000000", "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "isearch-fail": {"fg": null, "bg": "#ffc1c1", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "show-paren-match": {"fg": null, "bg": "#40e0d0", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "show-paren-mismatch": {"fg": "#ffffff", "bg": "#a020f0", "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "link": {"fg": "#3a5fcd", "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": {"style": "line", "color": null}, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "error": {"fg": "#ff0000", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "warning": {"fg": "#ff8c00", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "success": {"fg": "#228b22", "bg": null, "distant-fg": null, "family": null, "weight": "bold", "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}, "vertical-border": {"fg": null, "bg": null, "distant-fg": null, "family": null, "weight": null, "slant": null, "underline": null, "strike": null, "overline": null, "box": null, "inverse": false, "extend": false, "inherit": null, "height": null}}; let LOCKED=new Set([]); // rows whose choice is decided (controls disabled, skipped by erase/reset batch actions) const DELTAE_MIN=0.02; // OKLab ΔE below this = colors too close to tell apart (perceptual-metrics spec) const DEFAULT_UIMAP=JSON.parse(JSON.stringify(UIMAP)); -function syntaxBlank(k){return {fg:MAP[k]||null,bg:null,bold:false,italic:false,underline:false,strike:false,box:null};} +function syntaxBlank(k){return {fg:MAP[k]||null,bg:null,'distant-fg':null,family:null,weight:null,slant:null,underline:null,strike:null,overline:null,box:null,inverse:false,extend:false,inherit:null,height:null};} function syncSyntaxCache(k){const s=SYNTAX[k]||syntaxBlank(k);MAP[k]=s.fg||'';} function syncAllSyntaxCache(){CATS.forEach(c=>syncSyntaxCache(c[0]));} function syncSyntaxFromCache(){CATS.forEach(c=>{const k=c[0];syntaxFace(k).fg=MAP[k]||null;});} @@ -512,6 +530,11 @@ function reliefColors(bgHex) { }; return { hl: one(1.2, 0x8000), sh: one(0.6, 0x4000) }; } + +// OKLCH of a hex, and the pure black/white endpoint test. Shared by app-core +// and palette-generator-core (both previously kept their own identical copies). +function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} +function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';} // Pure package-model + dropdown logic, inlined verbatim from app-core.js. The // wrappers above (pname/seedPkgmap/ddList/pkgEffFg/pkgEffBg) delegate here. // Pure app logic — the package-face model and the dropdown option list — with no @@ -528,17 +551,103 @@ function reliefColors(bgHex) { // Resolve a palette name (or a raw #hex) to a hex; null when the name is unknown. function nameToHex(n,palette){if(!n)return null;if(/^#/.test(n))return n;const p=palette.find(p=>p[1]===n);return p?p[0]:null;} +// Convert a face dict's legacy boolean style fields to the new shape: bold -> +// weight "bold", italic -> slant "italic", underline true -> {style:line,color}, +// strike true -> {color}. An explicit weight/slant already set wins over the +// legacy flag. Faces already in the new shape pass through, so this is safe on +// any input. Mirrors migrate_legacy in face_specs.py; keep the two in step. +function migrateLegacyFace(d){ + const out=Object.assign({},d||{}); + if('bold' in out){const b=out.bold;delete out.bold;if(b&&out.weight==null)out.weight='bold';} + if('italic' in out){const i=out.italic;delete out.italic;if(i&&out.slant==null)out.slant='italic';} + if('underline' in out){if(out.underline===true)out.underline={style:'line',color:null};else if(out.underline===false)out.underline=null;} + if('strike' in out){if(out.strike===true)out.strike={color:null};else if(out.strike===false)out.strike=null;} + return out; +} + +// --- face CSS rendering ------------------------------------------------------ +// Pure builders for the face preview/inline CSS strings. app.js's syntaxStyle / +// uiCss / ofs / udeco wrappers differ only in how they resolve fg/bg and whether +// they add a font-size; they all delegate here. cssWeight maps the curated weight +// names to numeric CSS weights; faceDecoration is the underline/strike value. +function cssWeight(w){const M={light:300,normal:400,medium:500,semibold:600,bold:700,heavy:900};return w&&M[w]!=null?M[w]:'normal';} +function faceDecoration(face){return ((face.underline?'underline ':'')+(face.strike?'line-through':'')).trim()||'none';} +// A face's :box, rendered as an inset box-shadow (no layout shift). Returns the +// box-shadow VALUE (or '' for no box). 'line' is a flat border in the box color +// (or the face's own color when unset); 'released'/'pressed' are the 3D button +// styles Emacs draws, derived from explicit box color when set, otherwise BG so +// they read on any color (reliefColors is ported from xterm.c). +function boxCss(b,bg){if(!b||!b.style)return '';const w=b.width||1; + if(b.style==='released'||b.style==='pressed'){ + const r=(b.color||bg)?reliefColors(b.color||bg):{hl:null,sh:null}; + const hl=r.hl||'#ffffff33',sh=r.sh||'#00000066'; + const [a,z]=b.style==='released'?[hl,sh]:[sh,hl]; + return `inset ${w}px ${w}px 0 ${a},inset -${w}px -${w}px 0 ${z}`;} + return `inset 0 0 0 ${w}px ${b.color||'currentColor'}`;} +// CSS declaration string for FACE with already-resolved FG/BG. opts: noBg +// (never emit background), fontSize (em number for height), boxBg (background +// handed to the relief shading). Declaration order matches the strings the four +// callers previously assembled by hand, so the rendered output is unchanged. +function faceCss(face,fg,bg,opts){ + opts=opts||{}; + const parts=['color:'+fg]; + if(bg&&!opts.noBg)parts.push('background:'+bg); + parts.push('font-weight:'+cssWeight(face.weight), + 'font-style:'+(face.slant||'normal'), + 'text-decoration:'+faceDecoration(face)); + if(opts.fontSize!=null)parts.push('font-size:'+opts.fontSize+'em'); + const bx=boxCss(face.box,opts.boxBg); + if(bx)parts.push('box-shadow:'+bx); + return parts.join(';'); +} + +// Single source of truth for the per-face attribute model. One row per +// attribute drives both normalizePkgFace (defaulting + palette resolution) and +// packagesForExport (which attrs serialize and when). Adding a face attribute +// is one row here, not an edit in four hand-kept lists. +// def : value when unset +// resolve : fg/bg/distant-fg run through the palette name->hex resolver +// coerce : 'bool' -> !!v ; 'height' -> v||1 ; default -> v ?? def +// emit : export rule -- 'always' | 'truthy' | 'non-one' | 'bool' +// A hoisted function rather than a const: the inlined page calls normalizePkgFace +// at top level (seedPkgmap) before this point in source order, and a const would +// be in its temporal dead zone there; a function declaration is hoisted. +function faceAttrs(){return [ + {k:'fg', def:null, resolve:true, emit:'always'}, + {k:'bg', def:null, resolve:true, emit:'always'}, + {k:'distant-fg', def:null, resolve:true, emit:'truthy'}, + {k:'family', def:null, emit:'truthy'}, + {k:'weight', def:null, emit:'truthy'}, + {k:'slant', def:null, emit:'truthy'}, + {k:'underline', def:null, emit:'truthy'}, + {k:'strike', def:null, emit:'truthy'}, + {k:'overline', def:null, emit:'truthy'}, + {k:'inherit', def:null, emit:'always'}, + {k:'height', def:1, coerce:'height', emit:'non-one'}, + {k:'box', def:null, emit:'truthy'}, + {k:'inverse', def:false, coerce:'bool', emit:'bool'}, + {k:'extend', def:false, coerce:'bool', emit:'bool'}, +];} + function normalizePkgFace(d,source,palette){ - d=d||{}; + d=migrateLegacyFace(d||{}); const resolve=(v)=>palette?nameToHex(v,palette):v; - return {fg:resolve(d.fg)??null,bg:resolve(d.bg)??null,bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit??null,height:d.height||1,box:d.box??null,source:source||d.source||'user'}; + const out={}; + for(const a of faceAttrs()){ + let v=a.resolve?resolve(d[a.k]):d[a.k]; + out[a.k]=a.coerce==='bool'?!!v:a.coerce==='height'?(v||1):(v??a.def); + } + out.source=source||d.source||'user'; + return out; } + // Seed the package-face map from the app inventory's per-face defaults. function buildPkgmap(apps,palette){const m={};for(const app in apps){m[app]={};for(const row of apps[app].faces){m[app][row[0]]=normalizePkgFace(row[2],'default',palette);}}return m;} // The package faces worth exporting (anything seeded or user-touched), trimmed. -function packagesForExport(map){const out={};for(const app in map){const faces={};for(const face in map[app]){const f=map[app][face];if(f.source==='default'||f.source==='user'||f.source==='cleared'){const o={fg:f.fg,bg:f.bg,bold:f.bold,italic:f.italic,underline:!!f.underline,strike:!!f.strike,inherit:f.inherit,source:f.source};if(f.height&&f.height!==1)o.height=f.height;if(f.box)o.box=f.box;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;} +// Driven by FACE_ATTRS: each attribute's `emit` rule decides whether it lands. +function packagesForExport(map){const out={};for(const app in map){const faces={};for(const face in map[app]){const f=map[app][face];if(f.source==='default'||f.source==='user'||f.source==='cleared'){const o={};for(const a of faceAttrs()){const v=f[a.k];if(a.emit==='always')o[a.k]=v;else if(a.emit==='truthy'){if(v)o[a.k]=v;}else if(a.emit==='non-one'){if(v&&v!==1)o[a.k]=v;}else if(a.emit==='bool'){if(v)o[a.k]=true;}}o.source=f.source;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;} // Merge an imported package block into a face map, filling missing fields. function mergePackagesInto(map,pkgs){if(!pkgs)return;for(const app in pkgs){if(!map[app])map[app]={};for(const face in pkgs[app]){const f=pkgs[app][face]||{};map[app][face]=normalizePkgFace(f,f.source||'user');}}} @@ -560,16 +669,16 @@ const SYNTAX_INHERIT={cmd:'cm',doc:'str',prop:'var',fnc:'fnd'}; // theme's default foreground (the chain's floor). `dec` (decorator) is pinned to // `ty`: Emacs has no decorator face and renders decorators with // font-lock-type-face, so a dec color set in the studio would never reach Emacs. +// Walk an inherit chain from START, returning the first truthy valueFn(key) or +// null. nextFn(key) gives the parent key; a seen-set guards against a cycle. +function walkInheritChain(start,nextFn,valueFn){ + let k=start;const seen={}; + while(k&&!seen[k]){seen[k]=1;const v=valueFn(k);if(v)return v;k=nextFn(k);} + return null; +} function resolveSyntaxFg(cat,syntax,defaultFg){ - let k=(cat==='dec')?'ty':cat; - const seen={}; - while(k&&!seen[k]){ - seen[k]=1; - const fg=syntax[k]&&syntax[k].fg; - if(fg)return fg; - k=SYNTAX_INHERIT[k]; - } - return defaultFg; + const start=(cat==='dec')?'ty':cat; + return walkInheritChain(start,k=>SYNTAX_INHERIT[k],k=>syntax[k]&&syntax[k].fg)||defaultFg; } // Emacs built-in inherit chains for the ui faces whose parent is also a studio ui @@ -581,26 +690,7 @@ const UI_INHERIT={'mode-line-inactive':'mode-line','line-number-current-line':'l // nothing up the chain is set. The caller applies its own floor (default fg, // ground, or transparent), since that floor differs per attribute and face. function resolveUiAttr(face,attr,uimap){ - let f=face; - const seen={}; - while(f&&!seen[f]){ - seen[f]=1; - const v=uimap[f]&&uimap[f][attr]; - if(v)return v; - f=UI_INHERIT[f]; - } - return null; -} - -// Text color for a swatch-dropdown popup row. A row showing a real palette color -// sits on the popup's own fixed background, so its name/hex text must inherit the -// popup foreground (return '' to use the CSS color). Coloring it for contrast -// against the swatch instead picks near-black text for a mid/dark swatch, which -// is unreadable on the dark popup. Only the "default" row, filled solid with -// SHOWN, uses a contrast color computed against that fill. -function dropdownRowTextColor(hex,shown,textOnFn){ - if(hex)return ''; - return shown?textOnFn(shown):''; + return walkInheritChain(face,f=>UI_INHERIT[f],f=>uimap[f]&&uimap[f][attr]); } // Turn a theme name into a safe filename slug: collapse runs of disallowed @@ -668,9 +758,7 @@ function lMax(hue,chroma,fgSet,target){ // the editable truth; these pure functions group it, regenerate a ramp, and plan // assignment re-point across a regenerate. -function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} function isReservedGroundLikeName(name){return /^(bg|fg)(?:[-_+].+|\d.*)$/i.test(name||'');} -function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';} function interpOklabHex(a,b,t,offset){ const lab={L:a.L+(b.L-a.L)*t,a:a.a+(b.a-a.a)*t,b:a.b+(b.b-a.b)*t}; const lrgb=oklab2lrgb(lab.L,lab.a,lab.b); @@ -950,12 +1038,59 @@ function faceBoxNonDefaults(cur,def){ return { fg: !eq(cur.fg,def.fg), bg: !eq(cur.bg,def.bg), - style: ['bold','italic','underline','strike'].some(a=>!!cur[a]!==!!def[a]), + style: ['weight','slant','strike'].some(a=>JSON.stringify(cur[a]??null)!==JSON.stringify(def[a]??null)), inherit: !eq(cur.inherit,def.inherit), height: (cur.height||1)!==(def.height||1), box: JSON.stringify(cur.box??null)!==JSON.stringify(def.box??null), }; } + +// True when the per-row expander hides at least one attribute that differs from +// the face's default, so the collapsed toggle can flag it. Covers exactly the +// attributes the expander holds: distant-fg, family, underline, overline, +// inverse, extend, and (for ui/syntax) inherit + height. The in-row controls +// (fg/bg/weight/slant/strike/box) have their own cell markers and are excluded. +function overflowNonDefault(cur,def,showInheritHeight){ + cur=cur||{}; def=def||{}; + const eq=(a,b)=>JSON.stringify(a??null)===JSON.stringify(b??null); + if(['distant-fg','family','underline','overline'].some(a=>!eq(cur[a],def[a])))return true; + if((!!cur.inverse)!==(!!def.inverse))return true; + if((!!cur.extend)!==(!!def.extend))return true; + if(showInheritHeight){ + if(!eq(cur.inherit,def.inherit))return true; + if((cur.height||1)!==(def.height||1))return true; + } + return false; +} + +// Height bounds for a face :height scaling factor. 0.1 is Emacs's own floor (a +// smaller value errors out) and doubles as the modeline-shrink-to-nothing value; +// 2.0 is the studio's chosen ceiling. The number input's min/max attributes only +// guard its stepper arrows — typed or pasted values bypass them — so every height +// edit is coerced through clampHeight instead. +const HEIGHT_MIN=0.1, HEIGHT_MAX=2.0; +// Coerce a height-field value to either null (unset → inherit the default height) +// or a number clamped into [min,max]. Blank/whitespace/non-numeric → null; any +// number, including 0, a negative, or an over-max value, snaps into range. +function clampHeight(raw,min=HEIGHT_MIN,max=HEIGHT_MAX){ + if(raw===null||raw===undefined)return null; + const s=(''+raw).trim(); + if(s==='')return null; + const n=parseFloat(s); + if(!isFinite(n))return null; + return n<min?min:n>max?max:n; +} + +// Compose an element-hover tooltip: the face's docstring on top, the existing +// hover text (e.g. the bare face name) below it, separated by a blank line. A +// missing doc or base collapses to whichever is present; missing both yields ''. +// Keyed lookups (FACE_DOCS[face], SYNTAX_DOCS[kind]) supply DOC; BASE is +// whatever title the element carried before. +function composeHoverTitle(doc,base){ + doc=doc||''; base=base||''; + if(doc&&base)return doc+'\n\n'+base; + return doc||base; +} // Pure color/UI-boundary helpers (normHex, ratingColor, textOn), inlined from // app-util.js. textOn uses rl from the colormath core above. // Pure color/UI-boundary helpers: hex-input parsing, the contrast-rating status @@ -990,8 +1125,6 @@ function contrastTitle(r){ // from app-core.js, but owns candidate hue selection, naming, contrast filtering, // and conversion from preview columns to palette entries. -function oklchOf(hex){return oklab2oklch(srgb2oklab(hex));} -function isPureEndpointHex(hex){const h=(hex||'').toLowerCase();return h==='#ffffff'||h==='#000000';} function generatedExistingNames(palette){ return new Set((palette||[]).map(p=>(p&&p[1]||'').toLowerCase()).filter(Boolean)); } @@ -1012,7 +1145,7 @@ function uniqueGeneratedName(base,used){ function hueOfHex(hex,fallback){ const h=typeof hex==='string'?normHex(hex):null; if(!h)return fallback; - const lch=oklab2oklch(srgb2oklab(h)); + const lch=oklchOf(h); return Number.isFinite(lch.H)?lch.H:fallback; } function generatorSourceHue(palette,ground,cfg){ @@ -1128,16 +1261,14 @@ function randomChroma(rng){ } function vibeChroma(vibe,rng){ const rnd=typeof rng==='function'?rng:Math.random; - if(vibe==='muted')return 0.045+rnd()*0.035; - if(vibe==='pastel')return 0.035+rnd()*0.045; - if(vibe==='deep')return 0.085+rnd()*0.055; - if(vibe==='jewel')return 0.12+rnd()*0.075; - if(vibe==='earthy')return 0.055+rnd()*0.04; - if(vibe==='warm'||vibe==='cool')return 0.08+rnd()*0.06; - if(vibe==='neon')return 0.18+rnd()*0.09; - if(vibe==='strange')return 0.145+rnd()*0.095; - if(vibe==='balanced')return 0.075+rnd()*0.045; - return 0.12+rnd()*0.07; + // [base, range]: chroma is base + rnd()*range. Table, not an if-ladder, so a + // vibe is one row to read or tune. The default covers unknown vibes. + const t={muted:[0.045,0.035],pastel:[0.035,0.045],deep:[0.085,0.055], + jewel:[0.12,0.075],earthy:[0.055,0.04],warm:[0.08,0.06], + cool:[0.08,0.06],neon:[0.18,0.09],strange:[0.145,0.095], + balanced:[0.075,0.045]}; + const [base,range]=t[vibe]||[0.12,0.07]; + return base+rnd()*range; } function accentCandidateForHue(hue,ground,cfg){ const C=cfg&&cfg.vibe?vibeChroma(cfg.vibe,cfg.rng):(cfg&&cfg.scheme==='random'?randomChroma(cfg.rng):generatorChroma(cfg&&cfg.chromaMode)), target=generatorTarget(cfg&&cfg.contrastMode), bg=ground&&ground.bg; @@ -1414,7 +1545,7 @@ function effBg(v){return v||MAP['bg'];} // fg:MAP['p']} repeated across app.js, palette-actions.js, and the browser gates. function groundPair(){return {bg:MAP['bg'],fg:MAP['p']};} function cid(l){return l.replace(/\W/g,'');} -function buildLangSel(){const s=document.getElementById('langsel');s.innerHTML='';for(const lang in SAMPLES){const o=document.createElement('option');o.value=lang;o.textContent=lang;s.appendChild(o);}} +function buildLangSel(){const s=document.getElementById('langsel');s.innerHTML='';for(const lang of Object.keys(SAMPLES).sort((a,b)=>a.localeCompare(b))){const o=document.createElement('option');o.value=lang;o.textContent=lang;s.appendChild(o);}if(SAMPLES['Elisp'])s.value='Elisp';} function renderCode(){ const lang=document.getElementById('langsel').value;let html=''; for(const line of SAMPLES[lang]){ @@ -1505,15 +1636,155 @@ function mkLockCell(lockKey,els){ else{el.dataset.locked=on?'1':'';el.classList.toggle('locked',on);if(el.syncLocked)el.syncLocked();}});} lk.onclick=()=>{LOCKED.has(lockKey)?LOCKED.delete(lockKey):LOCKED.add(lockKey);paint();updateLockToggles();}; paint();td.appendChild(lk);return td;} -// B/I/U/S style buttons shared by the UI and package tables. isOn(attr) reads the -// current state of an attribute, onToggle(attr) flips it and repaints. Returns -// the button list so the caller appends them and hands them to mkLockCell. -function mkStyleButtons(isOn,onToggle){ - return ['bold','italic','underline','strike'].map(at=>{ - const b=document.createElement('button');b.className='sbtn'+(isOn(at)?' on':'');b.textContent='a'; - b.style.fontWeight=at==='bold'?'bold':'normal';b.style.fontStyle=at==='italic'?'italic':'normal'; - b.style.textDecoration=at==='underline'?'underline':at==='strike'?'line-through':'none';b.title=at; - b.onclick=()=>{onToggle(at);b.classList.toggle('on',!!isOn(at));};return b;});} +// The in-row style controls, shared by the syntax / UI / package tables: a weight +// selector, a slant selector, and box-like underline and strike controls. Each +// edit mutates the face object and calls onChange to repaint. Returns the control +// elements so the caller lays them out and hands them to mkLockCell. +const WEIGHT_OPTS=[['light','light'],['normal','normal'],['medium','medium'],['semibold','semibold'],['bold','bold'],['heavy','heavy']]; +const SLANT_OPTS=[['normal','normal'],['italic','italic'],['oblique','oblique']]; +// A compact custom dropdown for an enum attribute (weight / slant), themed like +// the color dropdown. The trigger shows the current value drawn in its own weight +// or slant; the popup lists each option drawn with the attribute applied, so the +// choice previews itself. opts.styleFor(value) returns the preview style props +// ({fontWeight} / {fontStyle}); opts.placeholder is the unset-state label. +function mkEnumDropdown(options,get,set,opts={}){ + const t=document.createElement('div');t.className='cdd enumdd';t.tabIndex=0; + const styleFor=opts.styleFor||(()=>({})); + const labelOf=v=>{const o=options.find(p=>p[0]===v);return o?o[1]:'';}; + function applyPreview(el,v){el.style.fontWeight='';el.style.fontStyle='';const s=styleFor(v);if(s.fontWeight)el.style.fontWeight=s.fontWeight;if(s.fontStyle)el.style.fontStyle=s.fontStyle;} + function paint(){const v=get()||'';t.dataset.val=v;t.classList.toggle('is-default',!v); + t.textContent=v?labelOf(v):(opts.placeholder||'set');applyPreview(t,v);t.title=opts.title||'';} + paint(); + t.onclick=(e)=>{e.stopPropagation();if(t.dataset.locked==='1')return;if(_ddPop){closeColorDropdown();return;} + const pop=document.createElement('div');pop.className='cddpop enumpop';const cur=get()||''; + const pick=v=>{set(v||null);paint();closeColorDropdown();}; + const def=document.createElement('button');def.type='button'; + def.className='enumopt enumdef'+(cur===''?' sel':'');def.textContent='default'; + def.title='clear — use the default';def.onclick=ev=>{ev.stopPropagation();pick('');};pop.appendChild(def); + for(const [v,label] of options){const b=document.createElement('button');b.type='button'; + b.className='enumopt'+(v===cur?' sel':'');b.textContent=label;applyPreview(b,v); + b.onclick=ev=>{ev.stopPropagation();pick(v);};pop.appendChild(b);} + document.body.appendChild(pop);const r=t.getBoundingClientRect(); + pop.style.left=r.left+'px';pop.style.minWidth=r.width+'px';pop.style.top=(r.bottom+2)+'px'; + const ph=pop.getBoundingClientRect().height; + if(r.bottom+ph>window.innerHeight-6)pop.style.top=Math.max(6,r.top-ph-2)+'px'; + _ddPop=pop;}; + t.setValue=()=>paint();t.syncLocked=()=>paint(); + return t;} +// Underline control: none / line / wave glyph buttons plus a color swatch shown +// while a style is active. Mirrors mkBoxControl; get()/set() read and write the +// underline object ({style,color}) or null. +function mkLineStyleControl(states,get,set,opts={}){const wrap=document.createElement('div');wrap.className='boxctl'; + const cluster=document.createElement('div');cluster.className='boxcluster';const btns={}; + states.forEach(([v,title,glyph])=>{const b=document.createElement('button');b.className='boxbtn';b.dataset.style=v;b.textContent=glyph;b.title=title; + b.onclick=()=>{const cur=get();set(v?(opts.toState?opts.toState(v,cur):Object.assign({color:(cur&&cur.color)||null},opts.styled?{style:v}:{})):null);paint();}; + cluster.appendChild(b);btns[v]=b;}); + const dd=mkColorDropdown(ddList((get()&&get().color)||''),(get()&&get().color)||'',h=>{const cur=get();if(!cur)return;set(Object.assign({},cur,{color:h||null}));paint();},{compact:true,defaultHex:opts.defaultHex}); + function paint(){const cur=get(),active=opts.styled?(cur&&cur.style?cur.style:''):(cur?'on':''); + for(const v in btns)btns[v].classList.toggle('on',v===active); + dd.style.display=active?'':'none';dd.setValue(cur&&cur.color?cur.color:''); + const locked=wrap.dataset.locked==='1';for(const v in btns)btns[v].disabled=locked; + const ddoff=locked||!active;dd.dataset.locked=ddoff?'1':'';dd.classList.toggle('locked',ddoff);if(dd.syncLocked)dd.syncLocked();} + wrap.syncLocked=()=>paint();wrap.append(cluster,dd);paint();return wrap;} +function mkUnderlineControl(get,set,opts={}){ + return mkLineStyleControl([['','no underline',''],['line','underline','_'],['wave','wavy underline','~']],get,set,Object.assign({styled:true},opts));} +function mkStrikeControl(get,set,opts={}){ + return mkLineStyleControl([['','no strike',''],['on','strike-through','S']],get,set,Object.assign({styled:false},opts));} +// In-row style controls: weight + slant selectors and a strike control. The +// underline control lives in the per-row expander (it carries the wave/color +// detail), keeping the row compact. +function mkStyleControls(face,onChange,opts={}){ + const w=mkEnumDropdown(WEIGHT_OPTS,()=>face.weight,v=>{face.weight=v;onChange();},{placeholder:'weight',title:'font weight',styleFor:v=>({fontWeight:cssWeight(v)})}); + const s=mkEnumDropdown(SLANT_OPTS,()=>face.slant,v=>{face.slant=v;onChange();},{placeholder:'slant',title:'font slant',styleFor:v=>({fontStyle:v||'normal'})}); + const k=mkStrikeControl(()=>face.strike,v=>{face.strike=v;onChange();},opts); + return [w,s,k];} +function mkOverlineControl(get,set,opts={}){ + return mkLineStyleControl([['','no overline',''],['on','overline','O']],get,set,Object.assign({styled:false},opts));} +function mkCheck(get,set){const c=document.createElement('input');c.type='checkbox';c.className='detailcheck';c.checked=!!get();c.onchange=()=>set(c.checked);return c;} +// The per-row attribute editor revealed by the expander: distant-fg, family, +// overline, inverse, extend, and (for ui/syntax, where inherit/height have no +// inline column) inherit + height. Each control mutates FACE and calls onChange. +// Returns the element plus the interactive controls so the row's lock cell can +// disable them. opts.inheritOptions and opts.showInheritHeight gate the last two. +// Hover help for each expander field, so the detail labels explain themselves the +// way the table-header labels do. Keyed by the label text passed to add(). +const DETAIL_HOVERS={ + 'distant fg':'foreground swapped in when the text sits on a background too close to its own color to read (Emacs :distant-foreground)', + 'family':'font family for this face; blank inherits the default (Emacs :family)', + 'underline':'underline style and color (Emacs :underline)', + 'overline':'a line drawn above the text (Emacs :overline)', + 'inverse':'swap the foreground and background (Emacs :inverse-video)', + 'extend':'extend the background past the end of the line to the window edge (Emacs :extend)', + 'inherit':'base face this one inherits unset attributes from (Emacs :inherit)', + 'height':'text size as a scaling factor of the inherited height, 0.1 to 2.0 (Emacs :height)' +}; +function mkDetailEditor(face,onChange,opts={}){ + const wrap=document.createElement('div');wrap.className='detailedit';const locks=[]; + const add=(label,el)=>{const g=document.createElement('label');g.className='detailfield';g.title=DETAIL_HOVERS[label]||'';const s=document.createElement('span');s.textContent=label;g.append(s,el);wrap.appendChild(g);locks.push(el);}; + const df=mkColorDropdown(ddList(face['distant-fg']||''),face['distant-fg']||'',h=>{face['distant-fg']=h||null;onChange();},{compact:true,defaultHex:opts.defaultHex}); + add('distant fg',df); + const fam=document.createElement('input');fam.type='text';fam.className='detailinput';fam.placeholder='font family';fam.value=face.family||'';fam.onchange=()=>{face.family=fam.value.trim()||null;onChange();}; + add('family',fam); + add('underline',mkUnderlineControl(()=>face.underline,v=>{face.underline=v;onChange();},opts)); + add('overline',mkOverlineControl(()=>face.overline,v=>{face.overline=v;onChange();},opts)); + add('inverse',mkCheck(()=>face.inverse,v=>{face.inverse=v;onChange();})); + add('extend',mkCheck(()=>face.extend,v=>{face.extend=v;onChange();})); + if(opts.showInheritHeight){ + const isel=document.createElement('select');isel.className='chip detailsel'; + (opts.inheritOptions||['']).forEach(o=>{const op=document.createElement('option');op.value=o;op.textContent=o||'— none —';isel.appendChild(op);}); + isel.value=face.inherit||'';isel.onchange=()=>{face.inherit=isel.value||null;onChange();};add('inherit',isel); + const hin=document.createElement('input');hin.type='number';hin.min=''+HEIGHT_MIN;hin.max=''+HEIGHT_MAX;hin.step='0.05';hin.className='hstep';hin.value=face.height||1;hin.onchange=()=>{const raw=hin.value,h=clampHeight(raw);face.height=h;hin.value=h==null?1:h;if(h!=null&&parseFloat(raw)!==h)notify('height clamped to '+h+' (allowed '+HEIGHT_MIN+'–'+HEIGHT_MAX+')',false);onChange();};add('height',hin); + } + return {el:wrap,locks};} +// Wire a per-row expander: a toggle button plus a hidden detail row (colspan +// across the table) holding mkDetailEditor. The caller drops the button into a +// cell, adds the returned locks to the row's lock cell, and inserts detailRow +// right after the main row. +// Which rows have their detail expanded, keyed by the row's element/face key. +// Held outside the DOM so a table rebuild (a package edit rebuilds the whole +// table) re-opens the rows that were open, instead of collapsing them under the +// user — editing a value in an open expander must not close it. +let EXPANDED=new Set(); +function mkExpander(face,colspan,onChange,opts={}){ + const detail=document.createElement('tr');detail.className='detailrow';detail.style.display='none'; + if(opts.expandKey&&EXPANDED.has(opts.expandKey))detail.style.display=''; + const btn=document.createElement('button');btn.className='exptoggle'; + // The disclosure triangle shows the row's state: ▶ collapsed, ▼ expanded. + const setGlyph=()=>{const open=detail.style.display!=='none';btn.textContent=open?'▼':'▶';btn.classList.toggle('on',open);}; + // Flag the toggle when collapsed and at least one hidden attribute differs from + // the default, so a non-default attribute is never invisible. ndCheck re-runs + // after every edit (for tiers whose onChange does not rebuild the row). + const ndCheck=opts.ndCheck||(()=>false); + const refreshNd=()=>{const nd=ndCheck();btn.classList.toggle('exp-nd',nd);btn.title=nd?'more attributes (some differ from default)':'more attributes';}; + const wrapped=()=>{onChange();refreshNd();}; + const td=document.createElement('td');td.colSpan=colspan;const {el,locks}=mkDetailEditor(face,wrapped,opts);td.appendChild(el);detail.appendChild(td); + btn.onclick=()=>{const willOpen=detail.style.display==='none';detail.style.display=willOpen?'':'none'; + if(opts.expandKey){willOpen?EXPANDED.add(opts.expandKey):EXPANDED.delete(opts.expandKey);} + setGlyph();syncExpandAllBtns();}; + refreshNd();setGlyph(); + return {btn,detail,locks};} +// Expand/collapse every row in a table at once, then sync the per-row triangles. +function setAllExpanded(tableId,expand){ + const tb=document.getElementById(tableId);if(!tb)return; + tb.querySelectorAll('tr.detailrow').forEach(d=>{d.style.display=expand?'':'none';const k=d.dataset.detailFor;if(k){expand?EXPANDED.add(k):EXPANDED.delete(k);}}); + tb.querySelectorAll('.exptoggle').forEach(b=>{b.textContent=expand?'▼':'▶';b.classList.toggle('on',expand);}); +} +// The header-level expand/collapse-all toggle for a table. Its label and triangle +// track the aggregate: any row open -> ▼ collapse all; all closed -> ▶ expand all. +const EXPALL_TABLE={syntaxexpandall:'legbody',uiexpandall:'uibody',pkgexpandall:'pkgbody'}; +function syncExpandAllBtns(){ + for(const id in EXPALL_TABLE){const btn=document.getElementById(id);const tb=document.getElementById(EXPALL_TABLE[id]);if(!btn||!tb)continue; + const anyOpen=[...tb.querySelectorAll('tr.detailrow')].some(d=>d.style.display!=='none'); + btn.textContent=anyOpen?'▼ collapse all':'▶ expand all';} +} +function toggleAllExpanded(id){ + const tableId=EXPALL_TABLE[id],tb=document.getElementById(tableId);if(!tb)return; + const anyOpen=[...tb.querySelectorAll('tr.detailrow')].some(d=>d.style.display!=='none'); + setAllExpanded(tableId,!anyOpen);syncExpandAllBtns(); +} +// Column count for a table's detail-row colspan, read from its header so the +// expander never hardcodes a width that drifts when a column is added. +function tableColCount(tableId){const h=document.querySelector('#'+tableId+' thead tr');return h?h.cells.length:1;} // Apply a batch action to every editable row in a tier. keyFn maps a row entry to // its lock key, or null to skip the row entirely (syntax bg and the default fg); // resetFn does the actual clearing. Locked rows are left untouched. @@ -1538,7 +1809,7 @@ function updateLockToggle(tier){ const ids={syntax:'syntaxlocktoggle',ui:'uilocktoggle',pkg:'pkglocktoggle'},b=document.getElementById(ids[tier]);if(!b)return; b.textContent=lockToggleLabel(tierLockKeys(tier),LOCKED); } -function updateLockToggles(){updateLockToggle('syntax');updateLockToggle('ui');updateLockToggle('pkg');} +function updateLockToggles(){updateLockToggle('syntax');updateLockToggle('ui');updateLockToggle('pkg');updateViewLockIndicators();} function toggleAllLocks(tier){ const all=areAllLocked(tierLockKeys(tier),LOCKED); LOCKED=toggleLockSet(tierLockKeys(tier),LOCKED); @@ -1577,22 +1848,25 @@ function buildTable(){ const crTd=document.createElement('td');crTd.style.whiteSpace='nowrap';crTd.style.fontSize='10pt'; function rowFg(){return kind==='bg'?MAP['p']:effFg(syntaxFace(kind).fg);} function rowBg(){return syntaxFace(kind).bg||MAP['bg'];} - function styleEx(){const s=syntaxFace(kind);exTd.style.color=rowFg();exTd.style.background=rowBg();exTd.style.fontWeight=s.bold?'bold':'normal';exTd.style.fontStyle=s.italic?'italic':'normal';exTd.style.textDecoration=(s.underline?'underline ':'')+(s.strike?'line-through':'')||'none';exTd.style.boxShadow=boxCss(s.box,rowBg());} + function styleEx(){const s=syntaxFace(kind);exTd.style.color=rowFg();exTd.style.background=rowBg();exTd.style.fontWeight=cssWeight(s.weight);exTd.style.fontStyle=s.slant||'normal';exTd.style.textDecoration=(s.underline?'underline ':'')+(s.strike?'line-through':'')||'none';exTd.style.boxShadow=boxCss(s.box,rowBg());} function styleCr(){const r=contrast(rowFg(),rowBg());crTd.innerHTML=crHtml(r);} const dd=mkColorDropdown(list,cur,(hex)=>{const s=syntaxFace(kind);s.fg=hex||null;syncSyntaxCache(kind);styleEx();styleCr();renderCode();if(kind==='bg'||kind==='p'){applyGround();buildTable();buildPkgTable();buildPkgPreview();}repaintCovered();},{compact:true,defaultHex:rowFg()}); const bgd=mkColorDropdown(ddList(sf.bg||''),sf.bg||'',hex=>{const s=syntaxFace(kind);s.bg=hex||null;styleEx();styleCr();renderCode();repaintCovered();},{compact:true,defaultHex:rowBg()}); styleEx();styleCr(); const stTd=document.createElement('td'); - const stBtns=mkStyleButtons(at=>syntaxFace(kind)[at],at=>{const s=syntaxFace(kind);s[at]=!s[at];styleEx();renderCode();}); - const stCluster=document.createElement('div');stCluster.className='stylecluster';stBtns.forEach(b=>stCluster.appendChild(b));stTd.appendChild(stCluster); + const stCtls=mkStyleControls(syntaxFace(kind),()=>{styleEx();renderCode();},{defaultHex:rowFg()}); + const stCluster=document.createElement('div');stCluster.className='stylecluster';stCtls.forEach(c=>stCluster.appendChild(c));stTd.appendChild(stCluster); const c0=document.createElement('td');c0.appendChild(dd); const cB=document.createElement('td');cB.appendChild(bgd); const cX=document.createElement('td');const boxCtl=mkBoxControl(()=>syntaxFace(kind).box,b=>{syntaxFace(kind).box=b;styleEx();renderCode();},{compact:true});cX.appendChild(boxCtl); - const lkTd=mkLockCell(kind,[dd,bgd,...stBtns,boxCtl]); - const c2=document.createElement('td');c2.className='cat';c2.textContent=label;c2.style.cursor='pointer';c2.title='flash this category in the code';c2.onclick=()=>flashTokens(kind); - tr.appendChild(c2);tr.appendChild(lkTd);tr.appendChild(c0);tr.appendChild(cB);tr.appendChild(stTd);tr.appendChild(cX);tr.appendChild(crTd);tr.appendChild(exTd); - tb.appendChild(tr);} - updateLockToggle('syntax'); + const exp=mkExpander(syntaxFace(kind),tableColCount('legtable'),()=>{styleEx();renderCode();},{expandKey:kind,showInheritHeight:true,inheritOptions:[''].concat(BASE_INHERITS),defaultHex:rowFg(),ndCheck:()=>overflowNonDefault(syntaxFace(kind),DEFAULT_SYNTAX[kind],true)}); + exp.detail.dataset.detailFor=kind; + const lkTd=mkLockCell(kind,[dd,bgd,...stCtls,boxCtl,...exp.locks]); + const c2=document.createElement('td');c2.className='cat';c2.title=composeHoverTitle(SYNTAX_DOCS[kind],c2.title);c2.appendChild(exp.btn); + const c2lbl=document.createElement('span');c2lbl.textContent=' '+label;c2lbl.style.cursor='pointer';c2lbl.title='flash this category in the code';c2lbl.onclick=()=>flashTokens(kind);c2.appendChild(c2lbl); + tr.appendChild(lkTd);tr.appendChild(c2);tr.appendChild(c0);tr.appendChild(cB);tr.appendChild(stTd);tr.appendChild(cX);tr.appendChild(crTd);tr.appendChild(exTd); + tb.appendChild(tr);tb.appendChild(exp.detail);} + updateLockToggle('syntax');syncExpandAllBtns(); } function clearPalette(){ normalizePalette(); @@ -1977,12 +2251,23 @@ function exportObj(){normalizePalette();const o={name:themeName(),palette:PALETT function exportState(){const t=document.getElementById('export');t.value=JSON.stringify(exportObj(),null,1);t.style.display='block';t.focus();t.select();} function toggleJSON(){const t=document.getElementById('export'),b=document.getElementById('jsonbtn');if(t.style.display==='block'){t.style.display='none';b.textContent='show';}else{exportState();b.textContent='hide';}} function updateTitle(){const n=document.getElementById('themename').value.trim();document.getElementById('pagetitle').textContent=(n||'Untitled')+': theme';} -function exportTheme(){const blob=new Blob([JSON.stringify(exportObj(),null,1)],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=fileSlug()+'.json';a.click();} +// Export the theme JSON. Prefer the File System Access API (showSaveFilePicker) +// so re-exporting overwrites the chosen file in place -- a blob download routes +// through the browser's downloads folder, which uniquifies a re-save as +// "name (1).json" rather than replacing it. Fall back to the blob download where +// the API is absent (mirrors importTheme's showOpenFilePicker/fileinput fallback). +async function exportTheme(){ + const data=JSON.stringify(exportObj(),null,1); + if(!window.showSaveFilePicker){const blob=new Blob([data],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=fileSlug()+'.json';a.click();return;} + try{const h=await window.showSaveFilePicker({suggestedName:fileSlug()+'.json',types:[{description:'theme JSON',accept:{'application/json':['.json']}}]}); + const w=await h.createWritable();await w.write(data);await w.close(); + notify('saved "'+fileSlug()+'.json"',false); + }catch(e){if(e&&e.name!=='AbortError')notify('export failed: '+e.message,true);}} function applyImported(text){const d=JSON.parse(text);lastGone={};if(d.name)document.getElementById('themename').value=d.name;if(d.palette)PALETTE=d.palette.map(normalizePaletteEntry); if(!d.syntax)throw new Error('theme JSON is missing syntax; convert older files first'); - SYNTAX={};CATS.forEach(c=>{const k=c[0];SYNTAX[k]=Object.assign(syntaxBlank(k),d.syntax[k]||{});});syncAllSyntaxCache(); + SYNTAX={};CATS.forEach(c=>{const k=c[0];SYNTAX[k]=Object.assign(syntaxBlank(k),migrateLegacyFace(d.syntax[k]||{}));});syncAllSyntaxCache(); LOCKED=new Set(d.locks||[]); - if(d.ui)Object.assign(UIMAP,d.ui); + if(d.ui)for(const k in d.ui)UIMAP[k]=Object.assign(uiFaceBlank(),migrateLegacyFace(d.ui[k])); PKGMAP=seedPkgmap();if(d.packages)mergePackagesInto(PKGMAP,d.packages); refreshPaletteState({pkgPreview:true});updateTitle();} function importFile(ev){const f=ev.target.files[0];if(!f)return;const r=new FileReader(); @@ -2000,45 +2285,27 @@ async function importTheme(){ // against the new ground for faces without their own bg). function applyGround(){document.querySelectorAll('pre').forEach(p=>p.style.background=MAP['bg']);UI_FACES.forEach(([f])=>{if(document.getElementById('uiprev-'+f))paintUI(f);});} function uf(f){return UIMAP[f]||{};} -function udeco(o){return `font-weight:${o.bold?'bold':'normal'};font-style:${o.italic?'italic':'normal'};text-decoration:${(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none'}`;} -// A face's :box, rendered as an inset box-shadow (no layout shift). Returns the -// box-shadow VALUE (or '' for no box). 'line' is a flat border in the box color -// (or the face's own color when unset); 'released'/'pressed' are the 3D button -// styles Emacs draws, derived from explicit box color when set, otherwise the -// background so they read on any color. -function boxCss(b,bg){if(!b||!b.style)return '';const w=b.width||1; - if(b.style==='released'||b.style==='pressed'){ - // Emacs derives the 3D edges from a base color (reliefColors, ported from - // xterm.c); the translucent pair is only the no-color fallback. - const r=(b.color||bg)?reliefColors(b.color||bg):{hl:null,sh:null}; - const hl=r.hl||'#ffffff33',sh=r.sh||'#00000066'; - const [a,z]=b.style==='released'?[hl,sh]:[sh,hl]; - return `inset ${w}px ${w}px 0 ${a},inset -${w}px -${w}px 0 ${z}`;} - return `inset 0 0 0 ${w}px ${b.color||'currentColor'}`;} -function syntaxStyle(k){const s=syntaxFace(k),fg=(k==='bg'?MAP['p']:resolveSyntaxFg(k,SYNTAX,MAP['p'])),bg=s.bg||null,dec=(s.underline?'underline ':'')+(s.strike?'line-through':''), - bx=boxCss(s.box,bg||MAP['bg']); - return `color:${fg};${bg?'background:'+bg+';':''}font-weight:${s.bold?'bold':'normal'};font-style:${s.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'}${bx?';box-shadow:'+bx:''}`;} +// Map a weight name to a CSS font-weight for the live previews. The named +// weights light/medium/semibold/heavy aren't CSS keywords, so resolve to the +// numeric scale; an unset weight renders normal. +// cssWeight, boxCss, faceDecoration, and faceCss live in app-core.js now. +// udeco keeps its own (untrimmed) decoration form, so it stays here. +function udeco(o){return 'font-weight:'+cssWeight(o.weight)+';font-style:'+(o.slant||'normal')+';text-decoration:'+((o.underline?'underline ':'')+(o.strike?'line-through':'')||'none');} +function syntaxStyle(k){const s=syntaxFace(k),fg=(k==='bg'?MAP['p']:resolveSyntaxFg(k,SYNTAX,MAP['p'])),bg=s.bg||null;return faceCss(s,fg,bg,{boxBg:bg||MAP['bg']});} // The per-row box control: none / line / raised / pressed plus optional line // color. get()/set() read and write the face's box object (null = no box). // Box control: a 2x2 cluster of radio buttons for the four box styles (no box / // line / pressed / raised), plus a compact color swatch shown only while a box // style is active. Replaces the old wide select+swatch to reclaim column width. -function mkBoxControl(get,set,opts={}){const wrap=document.createElement('div');wrap.className='boxctl'; - const cluster=document.createElement('div');cluster.className='boxcluster'; - const states=[['','no box',''],['line','line box','□'],['pressed','pressed','▼'],['released','raised','▲']]; - const btns={}; - states.forEach(([v,title,glyph])=>{const b=document.createElement('button');b.className='boxbtn';b.dataset.style=v;b.textContent=glyph;b.title=title; - b.onclick=()=>{const cur=get();set(v?{style:v,width:(cur&&cur.width)||1,color:(cur&&cur.color)||null}:null);paint();}; - cluster.appendChild(b);btns[v]=b;}); - const dd=mkColorDropdown(ddList((get()&&get().color)||''),(get()&&get().color)||'',h=>{const cur=get();if(!cur)return;set(Object.assign({},cur,{color:h||null}));paint();},{compact:true,defaultHex:opts.defaultHex}); - function paint(){const cur=get(),style=cur&&cur.style?cur.style:''; - for(const v in btns)btns[v].classList.toggle('on',v===style); - dd.style.display=style?'':'none';dd.setValue(cur&&cur.color?cur.color:''); - const locked=wrap.dataset.locked==='1'; - for(const v in btns)btns[v].disabled=locked; - const ddoff=locked||!style;dd.dataset.locked=ddoff?'1':'';dd.classList.toggle('locked',ddoff);if(dd.syncLocked)dd.syncLocked();} - wrap.syncLocked=()=>paint(); - wrap.append(cluster,dd);paint();return wrap;} +// Box control: a 2x2 cluster of the four box styles (no box / line / pressed / +// raised) plus a compact color swatch shown while a style is active. Shares the +// cluster/dropdown/paint machinery with mkLineStyleControl; it differs only in +// that its state object carries `width`, so it passes a toState builder. +function mkBoxControl(get,set,opts={}){ + return mkLineStyleControl( + [['','no box',''],['line','line box','□'],['pressed','pressed','▼'],['released','raised','▲']], + get,set, + Object.assign({styled:true,toState:(v,cur)=>({style:v,width:(cur&&cur.width)||1,color:(cur&&cur.color)||null})},opts));} function flashRow(tr){if(!tr)return;tr.scrollIntoView({block:'center',behavior:'smooth'});tr.classList.remove('flash');void tr.offsetWidth;tr.classList.add('flash');} function flashEl(el){if(!el)return;el.scrollIntoView({block:'nearest',inline:'nearest',behavior:'smooth'});el.classList.remove('flashtok');void el.offsetWidth;el.classList.add('flashtok');} // Flash every matching element but scroll only the first into view, so a face @@ -2051,14 +2318,12 @@ function flashUiPreview(f){const sp=document.querySelectorAll(`#mockframe [data- function flashPkg(f){flashRow(document.querySelector(`#pkgbody tr[data-face="${f}"]`));} function flashPkgPreview(f){const sp=document.querySelectorAll(`#pkgpreview [data-face="${f}"]`);if(sp.length){flashEls(sp);return;}const row=document.querySelector(`#pkgbody tr[data-face="${f}"]`);if(row)flashEl(row.querySelector('.cat'));} function mockSpan(k,t){return `<span data-k="${k}" style="${syntaxStyle(k)}">${esc(t)}</span>`;} -function uiCss(o,fgv,bgv,opts={}){const fg=fgv===undefined?effFg(o.fg):fgv,bg=bgv===undefined?o.bg:bgv,dec=(o.underline?'underline ':'')+(o.strike?'line-through':''), - bx=boxCss(o.box,bg||MAP['bg']); - return `color:${fg};${bg&&!opts.noBg?'background:'+bg+';':''}font-weight:${o.bold?'bold':'normal'};font-style:${o.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'}${bx?';box-shadow:'+bx:''}`;} +function uiCss(o,fgv,bgv,opts={}){const fg=fgv===undefined?effFg(o.fg):fgv,bg=bgv===undefined?o.bg:bgv;return faceCss(o,fg,bg,{noBg:opts.noBg,boxBg:bg||MAP['bg']});} function syncMockHeight(){const t=document.getElementById('uitable'),m=document.getElementById('mockframe');if(!t||!m)return;const lb=m.previousElementSibling,lbh=lb?lb.getBoundingClientRect().height+10:30;m.style.height=Math.max(t.getBoundingClientRect().height-lbh,220)+'px';} function buildMockFrame(){ const fr=document.getElementById('mockframe');if(!fr)return; const bg=MAP['bg'],fg=MAP['p']; - const ln=uf('line-number'),lnc=uf('line-number-current-line'),hl=uf('hl-line'),hil=uf('highlight'),reg=uf('region'),isr=uf('isearch'),isf=uf('isearch-fail'),laz=uf('lazy-highlight'),par=uf('show-paren-match'),parx=uf('show-paren-mismatch'),cur=uf('cursor'),ml=uf('mode-line'),mli=uf('mode-line-inactive'),mb=uf('minibuffer-prompt'),frng=uf('fringe'),vb=uf('vertical-border'),lnk=uf('link'),err=uf('error'),wrn=uf('warning'),suc=uf('success'); + const ln=uf('line-number'),lnc=uf('line-number-current-line'),hl=uf('hl-line'),hil=uf('highlight'),reg=uf('region'),isr=uf('isearch'),isf=uf('isearch-fail'),laz=uf('lazy-highlight'),par=uf('show-paren-match'),parx=uf('show-paren-mismatch'),cur=uf('cursor'),ml=uf('mode-line'),mli=uf('mode-line-inactive'),mlh=uf('mode-line-highlight'),mb=uf('minibuffer-prompt'),frng=uf('fringe'),vb=uf('vertical-border'),lnk=uf('link'),err=uf('error'),wrn=uf('warning'),suc=uf('success'); const lines=[ {t:[['cmd',';; '],['cm','init.el - your config']]}, {t:[['punc','('],['kw','require'],['p',' '],['con',"'cl-lib"],['punc',')']]}, @@ -2119,7 +2384,8 @@ function buildMockFrame(){ buf+=`<div class="ln" ${rowFace?'data-face="hl-line" ':''}style="${rowStyle}"><span class="fr" data-face="fringe" style="${uiCss(frng,frng.fg||fg,frng.bg||bg)};text-align:center;font-size:10px;overflow:hidden" title="fringe">${L.cont?'↪':''}</span><span class="num" data-face="${nFace}" style="${uiCss(isc?lnc:ln,nFg,nBg)}">${i+1}</span><span class="cd">${cd||' '}</span></div>`; }); let html=`<div class="mbuf" style="background:${bg}"><div class="mbuftext">${buf}</div><div class="vborder" data-face="vertical-border" title="vertical-border" style="background:${vb.fg||vb.bg||'#2f343a'}"></div></div>`; - html+=`<div class="bar" data-face="mode-line" style="${uiCss(ml,ml.fg||bg,ml.bg||fg)}"> init.el (Emacs Lisp) L5 git:main </div>`; + const mlhStyle=uiCss(mlh,mlh.fg||ml.fg||bg,mlh.bg||ml.bg||fg); + html+=`<div class="bar" data-face="mode-line" style="${uiCss(ml,ml.fg||bg,ml.bg||fg)}"> init.el (Emacs Lisp) L5 <span data-face="mode-line-highlight" title="mode-line-highlight (hover)" style="${mlhStyle}">git:main</span> </div>`; html+=`<div class="bar" data-face="mode-line-inactive" style="${uiCss(mli,resolveUiAttr('mode-line-inactive','fg',UIMAP)||fg,resolveUiAttr('mode-line-inactive','bg',UIMAP)||bg)}"> *Messages* (Fundamental)</div>`; html+=`<div class="echo" style="color:${fg}"><span data-face="minibuffer-prompt" style="${uiCss(mb,mb.fg||fg,mb.bg||null)}">I-search:</span> count <span data-face="isearch-fail" style="${uiCss(isf,isf.fg||fg,isf.bg||'transparent')}">zzz [no match]</span></div>`; html+=`<div class="echo"><span data-face="link" style="${uiCss(lnk,lnk.fg||fg,lnk.bg||null)}">https://gnu.org</span> <span data-face="error" style="${uiCss(err,err.fg||fg,err.bg||null)}">error</span> <span data-face="warning" style="${uiCss(wrn,wrn.fg||fg,wrn.bg||null)}">warning</span> <span data-face="success" style="${uiCss(suc,suc.fg||fg,suc.bg||null)}">ok</span></div>`; @@ -2132,21 +2398,33 @@ function buildMockFrame(){ function uiSelect(face,attr){const cur=UIMAP[face][attr]||''; return mkColorDropdown(ddList(cur),cur,h=>{UIMAP[face][attr]=h||null;paintUI(face);buildMockFrame();},{compact:true,defaultHex:attr==='fg'?effFg(null):effBg(null)});} const BASE_INHERITS=['fixed-pitch','variable-pitch','default','link','bold','italic','shadow']; -function uiFaceBlank(){return {fg:null,bg:null,bold:false,italic:false,underline:false,strike:false};} -function seedFace(d){return normalizePkgFace({fg:pname(d.fg),bg:pname(d.bg),bold:d.bold,italic:d.italic,underline:d.underline,strike:d.strike,inherit:d.inherit,height:d.height,box:d.box},'default');} +function uiFaceBlank(){return {fg:null,bg:null,'distant-fg':null,family:null,weight:null,slant:null,underline:null,strike:null,overline:null,box:null,inverse:false,extend:false,inherit:null,height:null};} +function seedFace(d){return normalizePkgFace({fg:pname(d.fg),bg:pname(d.bg),'distant-fg':pname(d['distant-fg']),family:d.family,weight:d.weight,slant:d.slant,bold:d.bold,italic:d.italic,underline:d.underline,strike:d.strike,overline:d.overline,inherit:d.inherit,height:d.height,box:d.box,inverse:d.inverse,extend:d.extend},'default');} function curApp(){const s=document.getElementById('viewsel');const v=s&&s.value;return (v&&v[0]!=='@')?v:Object.keys(APPS)[0];} function pkgEffFg(app,face,seen){return effResolve(PKGMAP,app,face,'fg',seen);} function pkgEffBg(app,face,seen){return effResolve(PKGMAP,app,face,'bg',seen);} // One dropdown drives the whole assignment panel: two editor entries (@code, // @ui) then a non-selectable "package faces" optgroup holding every app, // alphabetically by label. onViewChange shows exactly one of the three view blocks. +// Lock keys for one view value (@code / @ui / a package app), so the view +// dropdown can flag a view whose every element is locked. +function viewLockKeys(v){ + if(v==='@code')return syntaxLockKeys(); + if(v==='@ui')return uiLockKeys(); + return (APPS[v]?APPS[v].faces:[]).map(f=>'pkg:'+v+':'+f[0]); +} +// Prefix a lock glyph on every view whose elements are all locked; leave the rest +// bare. The base label rides in dataset.label so re-running never stacks glyphs. +function updateViewLockIndicators(){const s=document.getElementById('viewsel');if(!s)return; + for(const o of s.querySelectorAll('option')){const base=o.dataset.label||o.textContent; + o.textContent=(areAllLocked(viewLockKeys(o.value),LOCKED)?'🔒 ':'')+base;}} function buildViewSel(){const s=document.getElementById('viewsel');if(!s)return;s.innerHTML=''; - const mk=(v,t)=>{const o=document.createElement('option');o.value=v;o.textContent=t;return o;}; + const mk=(v,t)=>{const o=document.createElement('option');o.value=v;o.dataset.label=t;o.textContent=t;return o;}; s.appendChild(mk('@code','color/code assignments')); s.appendChild(mk('@ui','ui faces')); const og=document.createElement('optgroup');og.label='package faces'; for(const app of appViewKeysSorted(APPS))og.appendChild(mk(app,APPS[app].label)); - s.appendChild(og);} + s.appendChild(og);updateViewLockIndicators();} // The ‹ › buttons flanking the dropdown step the selection by DIR and re-render // the view (faces table + preview), so you can walk the list without reopening it. function stepView(dir){ @@ -2154,6 +2432,13 @@ function stepView(dir){ const i=stepViewIndex(s.selectedIndex,s.options.length,dir); if(i!==s.selectedIndex){s.selectedIndex=i;onViewChange();} } +// The ‹ › buttons flanking the language dropdown step the selection by DIR and +// re-render the code sample + package preview, mirroring the view-dropdown nav. +function stepLang(dir){ + const s=document.getElementById('langsel');if(!s)return; + const i=stepViewIndex(s.selectedIndex,s.options.length,dir); + if(i!==s.selectedIndex){s.selectedIndex=i;renderCode();buildPkgPreview();} +} function onViewChange(){const s=document.getElementById('viewsel');const v=(s&&s.value)||'@code'; const show=(id,on)=>{const e=document.getElementById(id);if(e)e.style.display=on?'':'none';}; show('view-code',v==='@code');show('view-ui',v==='@ui');show('view-pkg',v[0]!=='@'); @@ -2171,29 +2456,36 @@ function buildPkgTable(){ const f=PKGMAP[app][face],tr=document.createElement('tr');tr.dataset.face=face; const def=normalizePkgFace(row[2]||{},'default',PALETTE); const nd=faceBoxNonDefaults( - {fg:nameToHex(f.fg,PALETTE),bg:nameToHex(f.bg,PALETTE),bold:f.bold,italic:f.italic,underline:f.underline,strike:f.strike,inherit:f.inherit,height:f.height,box:f.box}, - {fg:nameToHex(def.fg,PALETTE),bg:nameToHex(def.bg,PALETTE),bold:def.bold,italic:def.italic,underline:def.underline,strike:def.strike,inherit:def.inherit,height:def.height,box:def.box}); - const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.title=face;c0.style.cursor='pointer';c0.onclick=()=>flashPkgPreview(face); + {fg:nameToHex(f.fg,PALETTE),bg:nameToHex(f.bg,PALETTE),weight:f.weight,slant:f.slant,underline:f.underline,strike:f.strike,inherit:f.inherit,height:f.height,box:f.box}, + {fg:nameToHex(def.fg,PALETTE),bg:nameToHex(def.bg,PALETTE),weight:def.weight,slant:def.slant,underline:def.underline,strike:def.strike,inherit:def.inherit,height:def.height,box:def.box}); + const exp=mkExpander(f,tableColCount('pkgtable'),()=>{f.source='user';pkgChanged();},{expandKey:face,showInheritHeight:true,inheritOptions:inh,defaultHex:effFg(pkgEffFg(app,face)),ndCheck:()=>overflowNonDefault(f,def,true)}); + exp.detail.dataset.detailFor=face; + const c0=document.createElement('td');c0.className='cat';c0.title=composeHoverTitle(FACE_DOCS[face],face);c0.appendChild(exp.btn); + const c0lbl=document.createElement('span');c0lbl.textContent=' '+label;c0lbl.style.cursor='pointer';c0lbl.onclick=()=>flashPkgPreview(face);c0.appendChild(c0lbl); const fgd=mkColorDropdown(ddList(f.fg||''),f.fg||'',h=>{f.fg=h||null;f.source='user';pkgChanged();},{compact:true,defaultHex:effFg(pkgEffFg(app,face))}), bgd=mkColorDropdown(ddList(f.bg||''),f.bg||'',h=>{f.bg=h||null;f.source='user';pkgChanged();},{compact:true,defaultHex:effBg(pkgEffBg(app,face))}); const cf=document.createElement('td');cf.appendChild(fgd); const cb=document.createElement('td');cb.appendChild(bgd); const cw=document.createElement('td'); - const pkBtns=mkStyleButtons(at=>f[at],at=>{f[at]=!f[at];f.source='user';pkgChanged();}); - const pkCluster=document.createElement('div');pkCluster.className='stylecluster';pkBtns.forEach(b=>pkCluster.appendChild(b));cw.appendChild(pkCluster); - const ci=document.createElement('td');const isel=document.createElement('select');isel.className='chip';isel.style.cssText='width:150px;font:10pt monospace';inh.forEach(o=>{const op=document.createElement('option');op.value=o;op.textContent=o||'— none —';isel.appendChild(op);});isel.value=f.inherit||'';isel.onchange=()=>{f.inherit=isel.value||null;f.source='user';pkgChanged();};ci.appendChild(isel); - const ch=document.createElement('td');const hin=document.createElement('input');hin.type='number';hin.min='0.8';hin.max='2.5';hin.step='0.05';hin.value=f.height||1;hin.className='hstep';hin.onchange=()=>{f.height=parseFloat(hin.value)||1;f.source='user';pkgChanged();};ch.appendChild(hin); + const pkCtls=mkStyleControls(f,()=>{f.source='user';pkgChanged();},{defaultHex:effFg(pkgEffFg(app,face))}); + const pkCluster=document.createElement('div');pkCluster.className='stylecluster';pkCtls.forEach(c=>pkCluster.appendChild(c));cw.appendChild(pkCluster); const cc=document.createElement('td');cc.style.fontSize='10pt';cc.style.whiteSpace='nowrap';const efg=effFg(pkgEffFg(app,face)),ebg=effBg(pkgEffBg(app,face)),r=contrast(efg,ebg);cc.innerHTML=crHtml(r); const cx=document.createElement('td');const boxCtl=mkBoxControl(()=>f.box,b=>{f.box=b;f.source='user';pkgChanged();},{compact:true});cx.appendChild(boxCtl); - const cL=mkLockCell('pkg:'+app+':'+face,[fgd,bgd,...pkBtns,isel,hin,boxCtl]); + const cL=mkLockCell('pkg:'+app+':'+face,[fgd,bgd,...pkCtls,boxCtl,...exp.locks]); if(nd.fg)cf.classList.add('nd');if(nd.bg)cb.classList.add('nd');if(nd.style)cw.classList.add('nd'); - if(nd.inherit)ci.classList.add('nd');if(nd.height)ch.classList.add('nd');if(nd.box)cx.classList.add('nd'); - tr.append(c0,cL,cf,cb,cw,cc,ci,ch,cx);tb.appendChild(tr); + if(nd.box)cx.classList.add('nd'); + tr.append(cL,c0,cf,cb,cw,cx,cc);tb.appendChild(tr);tb.appendChild(exp.detail); } applyTableSort('pkgbody'); - updateLockToggle('pkg'); -} -function ofs(app,face){const f=PKGMAP[app][face]||{},fg=effFg(pkgEffFg(app,face)),bg=pkgEffBg(app,face);const dec=(f.underline?'underline ':'')+(f.strike?'line-through':'');const bx=boxCss(f.box,bg||MAP['bg']);return `color:${fg};${bg?'background:'+bg+';':''}font-weight:${f.bold?'bold':'normal'};font-style:${f.italic?'italic':'normal'};text-decoration:${dec.trim()||'none'};font-size:${(f.height||1)}em${bx?';box-shadow:'+bx:''}`;} + updateLockToggle('pkg');syncExpandAllBtns(); +} +// The per-package preview renderers live in previews.js, spliced here so the +// PACKAGE_PREVIEWS registry below can reference them. +// previews.js -- the bespoke per-package preview renderers, extracted from +// app.js. Pure preview HTML builders (ofs/os/previewLines + renderXxxPreview); +// they reference shared globals (PKGMAP, MAP, faceCss, effFg, ...) and are +// inlined into the page's single script element via the PREVIEWS_J token in app.js. +function ofs(app,face){const f=PKGMAP[app][face]||{},fg=effFg(pkgEffFg(app,face)),bg=pkgEffBg(app,face);return faceCss(f,fg,bg,{fontSize:(f.height||1),boxBg:bg||MAP['bg']});} function os(app,face,txt){return `<span data-face="${face}" style="${ofs(app,face)}">${txt}</span>`;} // Shared wrapper for the line-based package previews: a monospace pre block. // Each renderer builds its own L array of os(...) lines and returns previewLines(L). @@ -2652,6 +2944,7 @@ function renderMarkdownPreview(){const a='markdown-mode',L=[]; L.push(os(a,'markdown-html-tag-delimiter-face','<')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','>')+'Ctrl-C'+os(a,'markdown-html-tag-delimiter-face','</')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','>')); L.push(os(a,'markdown-footnote-marker-face','[^1]:')+' '+os(a,'markdown-footnote-text-face','the footnote text.')); return previewLines(L);} + const PACKAGE_PREVIEWS={ autodim:renderAutodimPreview,markdown:renderMarkdownPreview, org:renderOrgPreview,magit:renderMagitPreview,elfeed:renderElfeedPreview,ghostel:renderGhostelPreview, @@ -2704,38 +2997,37 @@ function worstCellHtml(face){ const report=coveredContrastReport(face); if(report===null)return null; if(report.empty)return '<span title="this overlay has no syntax foreground set yet">no fg set</span>'; - return `<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1))}">${report.worst.ratio.toFixed(1)} ${report.worst.verdict}</span>`; + return `<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1))}">${report.worst.ratio.toFixed(1)}</span>`; } // Repaint every covered overlay face (their floors depend on the syntax palette, // so a syntax-color edit has to refresh them even though it doesn't rebuild the table). function repaintCovered(){COVERED_FACES.forEach(f=>{if(UIMAP[f]&&document.getElementById('uicr-'+f))paintUI(f);});} -function paintUI(face){const pv=document.getElementById('uiprev-'+face);if(!pv)return;const o=UIMAP[face];pv.style.color=effFg(o.fg);pv.style.background=effBg(o.bg);pv.style.fontWeight=o.bold?'bold':'normal';pv.style.fontStyle=o.italic?'italic':'normal';pv.style.textDecoration=(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none';pv.style.boxShadow=boxCss(o.box,effBg(o.bg)); +function paintUI(face){const pv=document.getElementById('uiprev-'+face);if(!pv)return;const o=UIMAP[face];pv.style.color=effFg(o.fg);pv.style.background=effBg(o.bg);pv.style.fontWeight=cssWeight(o.weight);pv.style.fontStyle=o.slant||'normal';pv.style.textDecoration=(o.underline?'underline ':'')+(o.strike?'line-through':'')||'none';pv.style.boxShadow=boxCss(o.box,effBg(o.bg)); const report=coveredContrastReport(face); - pv.querySelectorAll('.crerr').forEach(e=>e.remove()); pv.title=''; - if(report&&report.failures&&report.failures.length){ - const badge=document.createElement('span');badge.className='crerr';badge.textContent=report.worst.ratio.toFixed(1)+' FAIL';badge.title=failureTitle(report);pv.title=badge.title;pv.appendChild(badge); - } - const cr=document.getElementById('uicr-'+face);if(cr){cr.title='';if(report!==null){if(report.empty){cr.title='this overlay has no syntax foreground set yet';cr.innerHTML='<span title="this overlay has no syntax foreground set yet">no fg set</span>';}else{const title=failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1);cr.title=title;cr.innerHTML=`<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(title)}">${report.worst.ratio.toFixed(1)} ${report.worst.verdict}</span>`;}}else{const efg=effFg(o.fg),ebg=effBg(o.bg),r=contrast(efg,ebg);cr.innerHTML=crHtml(r);}}} + const cr=document.getElementById('uicr-'+face);if(cr){cr.title='';if(report!==null){if(report.empty){cr.title='this overlay has no syntax foreground set yet';cr.innerHTML='<span title="this overlay has no syntax foreground set yet">no fg set</span>';}else{const title=failureTitle(report)||'all covered text clears '+WORST_TARGET.toFixed(1);cr.title=title;cr.innerHTML=`<span style="color:${ratingColor(report.worst.ratio)}" title="${esc(title)}">${report.worst.ratio.toFixed(1)}</span>`;}}else{const efg=effFg(o.fg),ebg=effBg(o.bg),r=contrast(efg,ebg);cr.innerHTML=crHtml(r);}}} function buildUITable(){ const tb=document.getElementById('uibody');tb.innerHTML=''; for(const [face,label,ex] of UI_FACES){ const tr=document.createElement('tr');tr.dataset.face=face; - const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.style.cursor='pointer';c0.title='flash this face in the live preview';c0.onclick=()=>flashUiPreview(face); + const exp=mkExpander(UIMAP[face],tableColCount('uitable'),()=>{paintUI(face);buildMockFrame();},{expandKey:face,showInheritHeight:true,inheritOptions:[''].concat(BASE_INHERITS),defaultHex:effFg(UIMAP[face].fg),ndCheck:()=>overflowNonDefault(UIMAP[face],DEFAULT_UIMAP[face],true)}); + exp.detail.dataset.detailFor=face; + const c0=document.createElement('td');c0.className='cat';c0.title=composeHoverTitle(FACE_DOCS[face],c0.title);c0.appendChild(exp.btn); + const c0lbl=document.createElement('span');c0lbl.textContent=' '+label;c0lbl.style.cursor='pointer';c0lbl.title='flash this face in the live preview';c0lbl.onclick=()=>flashUiPreview(face);c0.appendChild(c0lbl); const fgSel=uiSelect(face,'fg'),bgSel=uiSelect(face,'bg'); const cF=document.createElement('td');cF.appendChild(fgSel); const cB=document.createElement('td');cB.appendChild(bgSel); const cS=document.createElement('td'); - const stBtns=mkStyleButtons(at=>UIMAP[face][at],at=>{UIMAP[face][at]=!UIMAP[face][at];paintUI(face);buildMockFrame();}); - const uiCluster=document.createElement('div');uiCluster.className='stylecluster';stBtns.forEach(b=>uiCluster.appendChild(b));cS.appendChild(uiCluster); + const stCtls=mkStyleControls(UIMAP[face],()=>{paintUI(face);buildMockFrame();},{defaultHex:effFg(UIMAP[face].fg)}); + const uiCluster=document.createElement('div');uiCluster.className='stylecluster';stCtls.forEach(c=>uiCluster.appendChild(c));cS.appendChild(uiCluster); const cC=document.createElement('td');cC.id='uicr-'+face;cC.style.whiteSpace='nowrap';cC.style.fontSize='10pt'; const cP=document.createElement('td');cP.className='ex';cP.id='uiprev-'+face;cP.textContent=ex;cP.style.padding='4px 10px';cP.style.borderRadius='4px'; const cX=document.createElement('td');const boxCtl=mkBoxControl(()=>UIMAP[face].box,b=>{UIMAP[face].box=b;paintUI(face);buildMockFrame();},{compact:true});cX.appendChild(boxCtl); - const cL=mkLockCell('ui:'+face,[fgSel,bgSel,...stBtns,boxCtl]); - tr.appendChild(c0);tr.appendChild(cL);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cC);tr.appendChild(cP);tr.appendChild(cX);tb.appendChild(tr);paintUI(face); + const cL=mkLockCell('ui:'+face,[fgSel,bgSel,...stCtls,boxCtl,...exp.locks]); + tr.appendChild(cL);tr.appendChild(c0);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cX);tr.appendChild(cC);tr.appendChild(cP);tb.appendChild(tr);tb.appendChild(exp.detail);paintUI(face); } applyTableSort('uibody'); - updateLockToggle('ui'); + updateLockToggle('ui');syncExpandAllBtns(); } // Generic header-click sort, shared by all three tables. Reads a swatch // dropdown's value, a select value, a numeric input, or cell text (numeric when @@ -2745,7 +3037,13 @@ function buildUITable(){ let tableSort={}; function cellVal(td){if(!td)return '';const dd=td.querySelector('.cdd');if(dd)return (dd.dataset.val||'').toLowerCase();const s=td.querySelector('select');if(s)return s.value.toLowerCase();const i=td.querySelector('input');if(i)return parseFloat(i.value)||0;const t=td.innerText.trim();const n=parseFloat(t);return (!isNaN(n)&&/^[-\d.]/.test(t))?n:t.toLowerCase();} function srtTable(tbId,col){tableSort[tbId]={col,asc:!(tableSort[tbId]&&tableSort[tbId].col===col&&tableSort[tbId].asc)};applyTableSort(tbId);} -function applyTableSort(tbId){const s=tableSort[tbId];if(!s)return;const tb=document.getElementById(tbId);if(!tb)return;const dir=s.asc?1:-1;const r=[...tb.rows];r.sort((a,b)=>{const x=cellVal(a.cells[s.col]),y=cellVal(b.cells[s.col]);return ((typeof x==='number'&&typeof y==='number')?x-y:(x<y?-1:x>y?1:0))*dir;});r.forEach(x=>tb.appendChild(x));} +function applyTableSort(tbId){const s=tableSort[tbId];if(!s)return;const tb=document.getElementById(tbId);if(!tb)return;const dir=s.asc?1:-1; + // Sort only the main rows; each expander detail row rides along right after its + // parent (matched by data-detail-for) so a sort never separates the pair. + const details={};[...tb.rows].forEach(x=>{if(x.classList.contains('detailrow'))details[x.dataset.detailFor]=x;}); + const mains=[...tb.rows].filter(x=>!x.classList.contains('detailrow')); + mains.sort((a,b)=>{const x=cellVal(a.cells[s.col]),y=cellVal(b.cells[s.col]);return ((typeof x==='number'&&typeof y==='number')?x-y:(x<y?-1:x>y?1:0))*dir;}); + mains.forEach(x=>{tb.appendChild(x);const key=x.dataset.face||x.dataset.kind;if(key&&details[key])tb.appendChild(details[key]);});} function initApp(){ paletteShowFull=false; // open collapsed to base colors; the arrow expands the spans buildLangSel();buildViewSel();renderPalette();rebuildColorTables();renderCode();applyGround(); @@ -2755,10 +3053,59 @@ function initApp(){ } initApp(); addEventListener('resize',()=>{syncMockHeight();syncPkgHeight();}); +// Shared gate harness. Each call site keeps its literal location.hash==='#NAMEtest' +// check (run-tests.sh greps it); gate() owns the ok/notes/A setup and the verdict +// postamble. Note format standardized to ' fails=note1,note2'. +function gate(id, body){ + const name=id.toUpperCase(); + let ok=true;const notes=[]; + const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; + body(A); + const verdict=name+' '+(ok?'PASS':'FAIL'); + document.title=verdict; + const d=document.createElement('div');d.id=id; + d.textContent=verdict+(notes.length?' fails='+notes.join(','):''); + document.body.appendChild(d); +} +function withSavedState(keys, body){ + // Snapshot the named studio globals, run BODY, then restore them in a finally + // so opening the studio at a #gate hash doesn't leave its state mutated for + // interactive use. Each key maps to a [get, set, clone] triple over the live + // let-binding. Scope the keys to what the gate actually touches. + // JSON clone (not structuredClone): the studio data objects carry values + // structuredClone throws on, and a JSON round-trip of the data is exactly what + // the gates' own local saves already use. + const jc=x=>JSON.parse(JSON.stringify(x)); + const reg={ + PALETTE:[()=>PALETTE, v=>{PALETTE=v;}, jc], + MAP:[()=>MAP, v=>{MAP=v;}, jc], + SYNTAX:[()=>SYNTAX, v=>{SYNTAX=v;}, jc], + UIMAP:[()=>UIMAP, v=>{UIMAP=v;}, jc], + PKGMAP:[()=>PKGMAP, v=>{PKGMAP=v;}, jc], + LOCKED:[()=>LOCKED, v=>{LOCKED.clear();for(const k of v)LOCKED.add(k);}, s=>new Set(s)], + }; + const snap=keys.map(k=>[k, reg[k][2](reg[k][0]())]); + try{ body(); } + finally{ for(const [k,v] of snap) reg[k][1](v); } +} +// Shared preview-face validator for the #mdtest / #mupreviewtest / #gnustest +// gates: render HTML into a detached div, then assert it exercises at least +// MINCOUNT data-faces, that every data-face is a real face of the package +// (drawn from FACES, the app's face rows), and that each face in REQUIRED is +// present. A is the gate's assertion collector; NAME labels the failure note. +function assertPreviewFaces(A, html, faces, minCount, name, required){ + const box=document.createElement('div');box.innerHTML=html; + const valid=new Set((faces||[]).map(r=>r[0])); + const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); + A(used.length>=minCount,'preview exercises many faces ('+used.length+')'); + const bad=used.filter(f=>!valid.has(f)); + A(bad.length===0,'every data-face is a real '+name+' face; bad='+bad.join(',')); + for(const f of required) A(used.includes(f),'preview includes '+f); +} // Phase-1 self-test (open with #selftest): seed -> export -> import -> compare. function pkgSelftest(){ const seeded=seedPkgmap(); - seeded['org-mode']['org-level-2']={fg:'#e8bd30',bg:null,bold:false,italic:false,inherit:'org-level-1',height:1.2,source:'user'}; + seeded['org-mode']['org-level-2']={fg:'#e8bd30',bg:null,weight:null,slant:null,inherit:'org-level-1',height:1.2,source:'user'}; const exp=packagesForExport(seeded); const round=seedPkgmap();mergePackagesInto(round,exp); const roundtrip=JSON.stringify(exp)===JSON.stringify(packagesForExport(round)); @@ -2766,11 +3113,11 @@ function pkgSelftest(){ const l2=exp['org-mode']['org-level-2']; const inherited=l2.inherit==='org-level-1'&&l2.source==='user'; const height=l2.height===1.2 && !('height' in (exp['org-mode']['org-todo'])); - const sc=seedPkgmap();sc['org-mode']['org-todo']={fg:null,bg:null,bold:false,italic:false,inherit:null,height:1,source:'cleared'}; + const sc=seedPkgmap();sc['org-mode']['org-todo']={fg:null,bg:null,weight:null,slant:null,inherit:null,height:1,source:'cleared'}; const cleared='org-todo' in packagesForExport(sc)['org-mode']; const su=seedPkgmap();mergePackagesInto(su,{'zzz-pkg':{'zzz-face':{fg:'#112233',source:'user'}}}); const unknown=!!(su['zzz-pkg']&&su['zzz-pkg']['zzz-face'].fg==='#112233'); - PKGMAP['__cyc']={a:{fg:null,bg:null,bold:false,italic:false,inherit:'b',height:1,source:'user'},b:{fg:null,bg:null,bold:false,italic:false,inherit:'a',height:1,source:'user'}}; + PKGMAP['__cyc']={a:{fg:null,bg:null,weight:null,slant:null,inherit:'b',height:1,source:'user'},b:{fg:null,bg:null,weight:null,slant:null,inherit:'a',height:1,source:'user'}}; let cyc=true;try{pkgEffFg('__cyc','a');}catch(e){cyc=false;}delete PKGMAP['__cyc']; const verdict=(roundtrip&&oldjson&&inherited&&height&&cleared&&unknown&&cyc)?'PASS':'FAIL'; document.title='SELFTEST '+verdict; @@ -2781,7 +3128,7 @@ if(location.hash==='#selftest')pkgSelftest(); // preserve, across all three tiers. (1) Locking a row disables its controls via // the shared mkLockCell. (2) reset/erase batch actions update editable rows but // leave locked rows (syntax bare-kind, ui:, pkg: keys) untouched. -if(location.hash==='#locktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#locktest')gate('locktest',A=>withSavedState(['PALETTE','MAP','SYNTAX','UIMAP','PKGMAP','LOCKED'],()=>{ const cssRgb=h=>{const [r,g,b]=hex2rgb(h);return 'rgb('+r+', '+g+', '+b+')';}; LOCKED.clear();buildTable(); {const k=CATS.map(c=>c[0]).filter(k=>k!=='bg'&&k!=='p')[0]; @@ -2851,48 +3198,46 @@ if(location.hash==='#locktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c if(filter&&faces.length>1){filter.value=faces[0];buildPkgTable();const b=document.getElementById('pkglocktoggle');b.click(); A(faces.every(face=>LOCKED.has('pkg:'+app+':'+face)),'pkg lock-all covers the whole package even when filtered'); filter.value='';buildPkgTable();}} - document.title='LOCKTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='locktest';d.textContent='LOCKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + })); // Sort gate (open with #sorttest): all three tables now share srtTable/cellVal. // Verifies the syntax table (which used to have its own srt) sorts by color // value and by element name, that a repeat click reverses, and that the UI and // package tables still sort. Guards the unified sort for the later stages. -if(location.hash==='#sorttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; - const ddVals=tb=>[...document.querySelectorAll('#'+tb+' tr')].map(tr=>{const dd=tr.cells[2].querySelector('.cdd');return dd?(dd.dataset.val||''):'';}); - const txtVals=tb=>[...document.querySelectorAll('#'+tb+' tr')].map(tr=>tr.cells[0].innerText.trim().toLowerCase()); +if(location.hash==='#sorttest')gate('sorttest',A=>{ + const ddVals=tb=>[...document.querySelectorAll('#'+tb+' tr:not(.detailrow)')].map(tr=>{const dd=tr.cells[2].querySelector('.cdd');return dd?(dd.dataset.val||''):'';}); + const txtVals=tb=>[...document.querySelectorAll('#'+tb+' tr:not(.detailrow)')].map(tr=>tr.cells[1].innerText.trim().toLowerCase()); const asc=a=>a.every((v,i)=>i===0||a[i-1]<=v),desc=a=>a.every((v,i)=>i===0||a[i-1]>=v); buildTable(); srtTable('legbody',2);A(asc(ddVals('legbody')),'legbody-color-asc'); srtTable('legbody',2);A(desc(ddVals('legbody')),'legbody-color-desc'); - srtTable('legbody',0);A(asc(txtVals('legbody')),'legbody-elements-asc'); - buildUITable();srtTable('uibody',0);A(asc(txtVals('uibody')),'uibody-face-asc'); + srtTable('legbody',1);A(asc(txtVals('legbody')),'legbody-elements-asc'); + buildUITable();srtTable('uibody',1);A(asc(txtVals('uibody')),'uibody-face-asc'); buildPkgTable();srtTable('pkgbody',2);A(asc(ddVals('pkgbody')),'pkgbody-fg-asc'); - document.title='SORTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='sorttest';d.textContent='SORTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Live-buffer rendering gate (open with #mocktest): pins the face-faithfulness // fixes so they cannot silently regress — overlay faces keep syntax colors and // honor their styles, the cursor sits on a glyph, line numbers honor weight, the // fringe shows its foreground indicator, and the mode-line carries its box. -if(location.hash==='#mocktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#mocktest')gate('mocktest',A=>withSavedState(['UIMAP','PKGMAP'],()=>{ const Q=s=>document.querySelector('#mockframe '+s); buildMockFrame(); A(Q('[data-face="highlight"] [data-k]'),'highlight-keeps-token-colors'); A(Q('[data-face="region"] [data-k]'),'region-keeps-token-colors'); const curCell=Q('[data-face="cursor"]'); A(curCell&&curCell.textContent.trim().length===1,'cursor-on-glyph'); - UIMAP['cursor']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false,box:null};buildMockFrame(); + UIMAP['cursor']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null,box:null};buildMockFrame(); const curStyled=Q('[data-face="cursor"]'),curSt=curStyled&&curStyled.getAttribute('style')||''; A(curSt.includes('#112233')&&curSt.includes('#aabbcc'),'cursor preview honors fg and bg: '+curSt); - UIMAP['hl-line']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false,box:null};buildMockFrame(); + UIMAP['hl-line']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null,box:null};buildMockFrame(); const hlStyled=Q('[data-face="hl-line"]'),hlSt=hlStyled&&hlStyled.getAttribute('style')||''; A(hlSt.includes('#112233')&&hlSt.includes('#aabbcc'),'hl-line preview honors fg and bg: '+hlSt); - UIMAP['link']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:true,strike:false,box:null};buildMockFrame(); + UIMAP['link']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:{style:'line',color:null},strike:null,box:null};buildMockFrame(); const linkStyled=Q('[data-face="link"]'),linkSt=linkStyled&&linkStyled.getAttribute('style')||''; A(linkSt.includes('#112233')&&linkSt.includes('#aabbcc'),'inline UI face preview honors fg and bg: '+linkSt); const missing=UI_FACES.map(f=>f[0]).filter(f=>!Q('[data-face="'+f+'"]')); A(missing.length===0,'all UI faces are represented in live buffer preview: '+missing.join(',')); buildTable();buildUITable();buildPkgTable(); - [['#legbody tr[data-kind="kw"]',5],['#uibody tr[data-face="mode-line"]',7],['#pkgbody tr',8]].forEach(([sel,idx])=>{ + [['#legbody tr[data-kind="kw"]',5],['#uibody tr[data-face="mode-line"]',5],['#pkgbody tr',5]].forEach(([sel,idx])=>{ const cell=document.querySelector(sel)?.cells[idx],ctl=cell&&cell.querySelector('.boxctl'); A(cell&&ctl&&ctl.getBoundingClientRect().width<=cell.getBoundingClientRect().width,'box control fits its table cell for '+sel); }); @@ -2907,28 +3252,27 @@ if(location.hash==='#mocktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c const ch=parseFloat(getComputedStyle(textBox).fontSize)*0.65; A(br.left-tr.right<=ch*4.8,'vertical-border-near-text'); }else A(false,'vertical-border-layout-elements-present'); - UIMAP['line-number-current-line'].bold=true;buildMockFrame(); + UIMAP['line-number-current-line'].weight='bold';buildMockFrame(); const curNum=Q('[data-face="line-number-current-line"]'); - A(curNum&&/font-weight:\s*bold/.test(curNum.getAttribute('style')||''),'line-number-honors-weight'); - UIMAP['region'].bold=false;buildUITable(); - const uiBold=[...document.querySelectorAll('#uibody tr')].find(r=>r.dataset.face==='region').querySelector('.sbtn[title="bold"]'); - A(uiBold&&!uiBold.classList.contains('on'),'ui style button starts off when model is false'); - uiBold.click(); - A(uiBold.classList.contains('on')&&UIMAP['region'].bold===true,'ui style button visual state turns on with model'); - uiBold.click(); - A(!uiBold.classList.contains('on')&&UIMAP['region'].bold===false,'ui style button visual state turns off with model'); - const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].bold=false;buildPkgTable(); - const pkgBtn=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"] .sbtn[title="bold"]'); - A(pkgBtn()&&!pkgBtn().classList.contains('on'),'pkg style button starts off when model is false'); - pkgBtn().click(); - A(pkgBtn()&&pkgBtn().classList.contains('on')&&PKGMAP[app][face].bold===true,'pkg style button visual state turns on after rebuild'); - document.title='MOCKTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='mocktest';d.textContent='MOCKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + A(curNum&&/font-weight:\s*700/.test(curNum.getAttribute('style')||''),'line-number-honors-weight'); + UIMAP['region'].weight=null;UIMAP['region'].slant=null;UIMAP['region'].underline=null;buildUITable(); + const regionRow=[...document.querySelectorAll('#uibody tr')].find(r=>r.dataset.face==='region'); + const pickEnum=(dd,label)=>{dd.click();const o=[..._ddPop.querySelectorAll('.enumopt')].find(b=>b.textContent===label);if(o)o.click();}; + const uiWeight=regionRow.querySelector('.enumdd'); + A(uiWeight&&uiWeight.dataset.val==='','ui weight dropdown starts empty when model is unset'); + pickEnum(uiWeight,'bold'); + A(UIMAP['region'].weight==='bold','ui weight dropdown writes the model'); + const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].weight=null;buildPkgTable(); + const pkgWeight=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"] .enumdd'); + A(pkgWeight()&&pkgWeight().dataset.val==='','pkg weight dropdown starts empty when model is unset'); + pickEnum(pkgWeight(),'heavy'); + A(PKGMAP[app][face].weight==='heavy'&&PKGMAP[app][face].source==='user','pkg weight dropdown writes the model and marks the face edited'); + })); // Palette-generator gate (open with #generatortest): previewing is non-mutating, // clicking a generated tile loads the existing selector, adding creates a normal // singleton base column, and appending a preview column commits all span members // under one stable column id. -if(location.hash==='#generatortest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#generatortest')gate('generatortest',A=>{ const before=JSON.stringify(PALETTE); A(document.getElementById('genaccents').value==='5','default accent count is 5'); A(document.getElementById('gensource').value==='palette','default generator source is palette'); @@ -2978,12 +3322,11 @@ if(location.hash==='#generatortest'){let ok=true;const notes=[];const A=(c,n)=>{ GEN_PROPOSAL={summary:{generated:1,rejected:0,minContrast:null},columns:[{name:'medium-aquamarine',members:[{name:'medium-aquamarine',hex:'#66cdaa',offset:0,columnId:'medium-aquamarine'}]}]}; renderGeneratorPreview(); A(document.querySelector('#genpreview .genchip .gn').textContent==='medium aquamarine','generated tile names display spaces instead of hyphens'); - document.title='GENERATORTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='generatortest';d.textContent='GENERATORTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Auto-dim gate (open with #autodimtest): the bespoke split preview shows the // selected language in both panes -- the left in real syntax colors, the right // collapsed to the single auto-dim-other-buffers face -- and tracks the langsel. -if(location.hash==='#autodimtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#autodimtest')gate('autodimtest',A=>{ const langs=Object.keys(SAMPLES),ls=document.getElementById('langsel'); ls.value=langs[0]; const box=document.createElement('div');box.innerHTML=renderAutodimPreview(); @@ -2997,8 +3340,7 @@ if(location.hash==='#autodimtest'){let ok=true;const notes=[];const A=(c,n)=>{if if(langs.length>1){const t1=box.textContent;ls.value=langs[1]; const box2=document.createElement('div');box2.innerHTML=renderAutodimPreview(); A(box2.textContent!==t1,'preview tracks the language selector');ls.value=langs[0];} - document.title='AUTODIMTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='autodimtest';d.textContent='AUTODIMTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); if(location.hash.startsWith('#pick')){openPicker();const m=location.hash.slice(5);if(m){const b=document.querySelector('.pmode button[data-m="'+m+'"]');if(b)b.click();}} if(location.hash==='#cursortest'){document.getElementById('newhexstr').value='#67809c';openPicker();const sc=document.getElementById('svcur'),hc=document.getElementById('huecur');const L=parseFloat(sc.style.left||'0'),T=parseFloat(sc.style.top||'0'),H=parseFloat(hc.style.top||'0');const ok=L>1&&T>1&&H>1;document.title='CURSORTEST '+(ok?'PASS':'FAIL');const d=document.createElement('div');d.id='cursortest';d.textContent='CURSORTEST '+(ok?'PASS':'FAIL')+' left='+sc.style.left+' top='+sc.style.top+' hue='+hc.style.top;document.body.appendChild(d);} if(location.hash.startsWith('#app')){const ap=location.hash.slice(4),s=document.getElementById('appsel');if(s&&ap){s.value=ap;pkgChanged();}} @@ -3049,25 +3391,23 @@ if(location.hash==='#readouttest'){const hex='#67809c';document.getElementById(' // Worst-case readout gate (open with #contrasttest): a covered overlay face shows // the floor over its foreground set and names the limiting foreground, an // out-of-scope face keeps the single-pair readout, and an empty set reads "no fg set". -if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#contrasttest')gate('contrasttest',A=>{ const saveMAP=Object.assign({},MAP),saveUI=JSON.parse(JSON.stringify(UIMAP)); CATS.forEach(c=>{if(c[0]!=='bg'&&c[0]!=='p')setSyntaxFg(c[0],'');}); setSyntaxFg('p','#f0fef0');setSyntaxFg('kw','#67809c');setSyntaxFg('str','#a3b18a');setSyntaxFg('bg','#000000'); - UIMAP['region']={fg:null,bg:'#202830',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#202830',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const cell=document.getElementById('uicr-region'); - A(cell&&/^\d+\.\d (PASS|FAIL)$/.test(cell.textContent.trim()),'region shows compact worst-case readout: '+(cell&&cell.textContent)); + A(cell&&/^\d+\.\d$/.test(cell.textContent.trim()),'region shows a bare worst-case number (no PASS/FAIL word): '+(cell&&cell.textContent)); A(cell&&!cell.textContent.includes('#67809c'),'compact readout omits limiting fg details: '+(cell&&cell.textContent)); A(cell&&cell.title.includes('kw (keyword) #67809c'),'hover names failing keyword blue: '+(cell&&cell.title)); - const badge=document.querySelector('#uiprev-region .crerr'); - A(badge&&badge.textContent.trim()===cell.textContent.trim(),'region preview shows failing contrast badge: '+(badge&&badge.textContent)); - A(badge&&badge.title.includes('kw (keyword) #67809c'),'preview badge hover carries failures: '+(badge&&badge.title)); - const firstFail=badge&&badge.title.split('\n')[1]; - A(firstFail&&firstFail.includes('kw (keyword) #67809c'),'failures are sorted from worst first: '+firstFail); + A(!document.querySelector('#uiprev-region .crerr'),'region preview no longer carries a failing-contrast badge'); + const firstFail=cell.title.split('\n')[1]; + A(firstFail&&firstFail.includes('kw (keyword) #67809c'),'failures are sorted from worst first (in the cell hover): '+firstFail); const fl=floor('#202830',fgSetForFace('region').set); A(fl.limitingHex==='#67809c','floor limiting is blue, got '+fl.limitingHex); A(Math.abs(fl.ratio-contrast('#67809c','#202830'))<1e-9,'floor ratio matches blue-on-bg'); - UIMAP['region']={fg:'#f0fef0',bg:'#202830',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:'#f0fef0',bg:'#202830',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const pairCell=document.getElementById('uicr-region'),pairWant=contrast('#f0fef0','#202830'); A(pairCell&&Math.abs(parseFloat(pairCell.textContent)-pairWant)<0.06,'region with explicit fg rates its own fg/bg pair: got '+(pairCell&&pairCell.textContent.trim())+' want '+pairWant.toFixed(1)); @@ -3076,23 +3416,23 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i const ml=document.getElementById('uicr-mode-line'); A(worstCellHtml('mode-line')===null,'mode-line is out of scope (single-pair)'); A(ml&&/^\d/.test(ml.textContent.trim()),'mode-line cell is a numeric ratio: '+(ml&&ml.textContent)); - UIMAP['region']={fg:null,bg:'#202830',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#202830',weight:null,slant:null,underline:null,strike:null}; setSyntaxFg('p','');CATS.forEach(c=>{if(c[0]!=='bg')setSyntaxFg(c[0],'');});buildUITable(); const empty=document.getElementById('uicr-region'); A(empty&&empty.textContent.trim()==='no fg set','empty set reads the no-set message: '+(empty&&empty.textContent)); // A two-color face (own fg AND own bg) rates its own pair, never the ground bg. - UIMAP['mode-line']={fg:'#112233',bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false}; + UIMAP['mode-line']={fg:'#112233',bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const two=document.getElementById('uicr-mode-line'),twoWant=contrast('#112233','#aabbcc'); A(two&&Math.abs(parseFloat(two.textContent)-twoWant)<0.06,'ui two-color face rates own fg-on-bg: got '+(two&&two.textContent.trim())+' want '+twoWant.toFixed(1)); const tApp=Object.keys(APPS)[0],tFace=APPS[tApp].faces[0][0],savePF=JSON.parse(JSON.stringify(PKGMAP[tApp][tFace])); Object.assign(PKGMAP[tApp][tFace],{fg:'#112233',bg:'#aabbcc',inherit:null});buildPkgTable(); - const prow=document.querySelector('#pkgbody tr[data-face="'+tFace+'"]'),pcell=prow&&prow.children[5]; + const prow=document.querySelector('#pkgbody tr[data-face="'+tFace+'"]'),pcell=prow&&prow.children[6]; A(pcell&&Math.abs(parseFloat(pcell.textContent)-twoWant)<0.06,'pkg two-color face rates own fg-on-bg: got '+(pcell&&pcell.textContent.trim())+' want '+twoWant.toFixed(1)); PKGMAP[tApp][tFace]=savePF;buildPkgTable(); // A ground-bg change must not clobber a face's own preview bg, must leave a // two-color ratio alone, and must re-rate a ground-dependent face's cell. - UIMAP['fringe']={fg:'#ddeeff',bg:null,bold:false,italic:false,underline:false,strike:false}; + UIMAP['fringe']={fg:'#ddeeff',bg:null,weight:null,slant:null,underline:null,strike:null}; buildUITable(); setSyntaxFg('bg','#440000');applyGround(); const pv=document.getElementById('uiprev-mode-line'); @@ -3103,7 +3443,7 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i A(frc&&Math.abs(parseFloat(frc.textContent)-frWant)<0.06,'ground change re-rates a ground-dependent face: got '+(frc&&frc.textContent.trim())+' want '+frWant.toFixed(1)); // A default-fg (p) change through the real syntax dropdown re-rates a face // whose fg falls back to it. Drives the DOM so the handler wiring is pinned. - UIMAP['fringe']={fg:null,bg:'#aabbcc',bold:false,italic:false,underline:false,strike:false}; + UIMAP['fringe']={fg:null,bg:'#aabbcc',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const pLocked=LOCKED.has('p');if(pLocked){LOCKED.delete('p');buildTable();} const pdd=document.querySelector('#legbody tr[data-kind="p"] .cdd'); @@ -3116,14 +3456,13 @@ if(location.hash==='#contrasttest'){let ok=true;const notes=[];const A=(c,n)=>{i }else A(false,'syntax table has a p row with a dropdown'); if(pLocked){LOCKED.add('p');buildTable();} for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();applyGround(); - document.title='CONTRASTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='contrasttest';d.textContent='CONTRASTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Bevel gate (open with #beveltest): released/pressed boxes derive their // highlight and shadow from the face's effective bg per Emacs's relief // algorithm, and pressed draws the shadow edge first. -if(location.hash==='#beveltest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#beveltest')gate('beveltest',A=>{ const saveUI=JSON.parse(JSON.stringify(UIMAP)),saveP=PALETTE.slice(),savePK=JSON.parse(JSON.stringify(PKGMAP)); - UIMAP['mode-line']={fg:'#d8dee9',bg:'#30343c',bold:false,italic:false,underline:false,strike:false,box:{style:'released',width:1,color:null}}; + UIMAP['mode-line']={fg:'#d8dee9',bg:'#30343c',weight:null,slant:null,underline:null,strike:null,box:{style:'released',width:1,color:null}}; buildUITable(); const pv=document.getElementById('uiprev-mode-line'); const bs=pv&&pv.style.boxShadow; @@ -3139,22 +3478,21 @@ if(location.hash==='#beveltest'){let ok=true;const notes=[];const A=(c,n)=>{if(! A(bs3&&bs3.includes('rgb(255, 42, 42)')&&bs3.includes('rgb(143, 0, 0)'),'released style derives relief from explicit box color: '+bs3); PALETTE=[['#ff0000','red','red'],['#30343c','slate','slate']]; buildUITable(); - const mlrow=document.querySelector('#uibody tr[data-face="mode-line"]'),boxCell=mlrow&&mlrow.cells[7],lineBtn=boxCell&&boxCell.querySelector('.boxbtn[data-style="line"]'),boxDd=boxCell&&boxCell.querySelector('.cdd'); + const mlrow=document.querySelector('#uibody tr[data-face="mode-line"]'),boxCell=mlrow&&mlrow.cells[5],lineBtn=boxCell&&boxCell.querySelector('.boxbtn[data-style="line"]'),boxDd=boxCell&&boxCell.querySelector('.cdd'); if(lineBtn&&boxDd){lineBtn.click();boxDd.click();const redRow=[...document.querySelectorAll('.cddpop .cddgc')].find(c=>(c.dataset.name||'').includes('red'));if(redRow)redRow.click();} A(UIMAP['mode-line'].box&&UIMAP['mode-line'].box.color==='#ff0000','UI box color dropdown writes box.color'); const app=curApp(),face=APPS[app].faces[0][0];PKGMAP[app][face].box={style:'line',width:1,color:null};buildPkgTable(); - const prow=document.querySelector('#pkgbody tr[data-face="'+face+'"]'),pbox=prow&&prow.cells[8],pdd=pbox&&pbox.querySelector('.cdd'); + const prow=document.querySelector('#pkgbody tr[data-face="'+face+'"]'),pbox=prow&&prow.cells[5],pdd=pbox&&pbox.querySelector('.cdd'); if(pdd){pdd.click();const redRow=[...document.querySelectorAll('.cddpop .cddgc')].find(c=>(c.dataset.name||'').includes('red'));if(redRow)redRow.click();} A(PKGMAP[app][face].box&&PKGMAP[app][face].box.color==='#ff0000','package box color dropdown writes box.color'); PALETTE=saveP;PKGMAP=savePK;for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveUI);buildUITable();buildPkgTable(); - document.title='BEVELTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='beveltest';d.textContent='BEVELTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Gallery gate (open with #gallerytest): the color dropdown opens a 2D grid in // the palette-panel shape. Driven on a throwaway dropdown so no real face state // is mutated. Covers: grid opens, every palette color has a cell, a cell click // fires onPick + updates the trigger, the pick highlights on reopen, the default // chip clears. -if(location.hash==='#gallerytest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#gallerytest')gate('gallerytest',A=>withSavedState(['MAP','SYNTAX'],()=>{ let picked='__none__'; const dd=mkColorDropdown(ddList(''),'',(hex)=>{picked=hex;},{}); document.body.appendChild(dd); @@ -3178,11 +3516,10 @@ if(location.hash==='#gallerytest'){let ok=true;const notes=[];const A=(c,n)=>{if trig.click();const defc=document.querySelector('.cddpop.cddgrid .cddgdef');if(defc)defc.click(); A(picked==='','the default chip clears the assignment: '+JSON.stringify(picked)); dd.remove();closeColorDropdown(); - document.title='GALLERYTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='gallerytest';d.textContent='GALLERYTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + })); // Preview-link gate (open with #previewlinktest): known bespoke-preview face // mappings stay wired to the face that Emacs actually uses. -if(location.hash==='#previewlinktest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#previewlinktest')gate('previewlinktest',A=>{ const box=document.createElement('div'); box.innerHTML=renderOrgPreview(); const headline=[...box.querySelectorAll('[data-face="org-headline-todo"]')].find(e=>e.textContent.includes('Heading three')); @@ -3197,11 +3534,10 @@ if(location.hash==='#previewlinktest'){let ok=true;const notes=[];const A=(c,n)= const bob=[...box.querySelectorAll('[data-face="erc-default-face"]')].some(e=>e.textContent.includes('hi craig')); A(own,'erc own sent message uses erc-input-face'); A(bob,'erc remote message uses erc-default-face'); - document.title='PREVIEWLINKTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='previewlinktest';d.textContent='PREVIEWLINKTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Safe-lightness gate (open with #safetest): the OKLCH picker shades the unsafe // lightness band for a selected covered face and hides it when no face is selected. -if(location.hash==='#safetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#safetest')gate('safetest',A=>withSavedState(['MAP','SYNTAX'],()=>{ const saveMAP=Object.assign({},MAP); setSyntaxFg('p','#f0fef0');setSyntaxFg('kw','#67809c');setSyntaxFg('bg','#000000'); document.getElementById('newhexstr').value='#202830';openPicker();setPkModel('oklch'); @@ -3213,11 +3549,10 @@ if(location.hash==='#safetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c A(band&&band.style.display==='none','safe band hidden when no face is selected'); for(const k in MAP)delete MAP[k];Object.assign(MAP,saveMAP);syncSyntaxFromCache(); setPkModel('hsv');closePicker(); - document.title='SAFETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='safetest';d.textContent='SAFETEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + })); // Gone-rebind gate (open with #healtest): deleting a named color then recreating // the name re-points face references stranded on the old hex to the new color. -if(location.hash==='#healtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#healtest')gate('healtest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),savePK=JSON.parse(JSON.stringify(PKGMAP)),saveG=Object.assign({},lastGone),saveSel=selectedIdx; PALETTE=[['#0d0b0a','ground'],['#cdced1','fg'],['#67809c','blue']];setSyntaxFg('kw','#67809c');lastGone={};selectedIdx=null;renderPalette();buildTable(); const blue=[...document.querySelectorAll('#pals .pchip')].find(c=>c.querySelector('.nm')&&c.querySelector('.nm').value==='blue'); @@ -3230,12 +3565,11 @@ if(location.hash==='#healtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c A(!('blue' in lastGone),'heal consumed the gone entry'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);PKGMAP=savePK;lastGone=saveG;selectedIdx=saveSel; renderPalette();buildTable();buildUITable();if(document.getElementById('pkgbody'))buildPkgTable(); - document.title='HEALTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='healtest';d.textContent='HEALTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Column-strip gate (open with #columntest): the palette renders as a pinned // ground column plus structural columns, chips keep their controls, and renaming // a color leaves it in the same strip because the column id is stable. -if(location.hash==='#columntest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#columntest')gate('columntest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveG=Object.assign({},lastGone),saveSel=selectedIdx; setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0'); PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg'],['#c0402a','red'],['#3a6ea5','blue'],['#808080','gray']];selectedIdx=null;renderPalette(); @@ -3318,13 +3652,12 @@ if(location.hash==='#columntest'){let ok=true;const notes=[];const A=(c,n)=>{if( A(lastGone['blue']==='#3a6ea5'&&lastGone['blue+1']==='#92acc2','clear palette records removed names for recovery'); A(selectedIdx===null,'clear palette clears selected color'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();lastGone=saveG;selectedIdx=saveSel;renderPalette(); - document.title='COLUMNTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='columntest';d.textContent='COLUMNTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Count-control gate (open with #counttest): the per-column count regenerates the // column — count up adds symmetric steps, count down drops the extremes, a // reference to a surviving step follows the new hex, a reference to a removed step // is left on its old (now-gone) hex. -if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#counttest')gate('counttest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),saveSel=selectedIdx; paletteShowFull=true; // this gate asserts span tiles, so render the full palette setSyntaxFg('bg','#204060');setSyntaxFg('p','#f0fef0'); @@ -3351,8 +3684,8 @@ if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(! regenColumn('#67809c',2,{ground:groundPair()}).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)])); const innerOld=regenColumn('#67809c',2,{ground:groundPair()}).members.find(m=>m.offset===1).hex; // survives a count change const outerOld=regenColumn('#67809c',2,{ground:groundPair()}).members.find(m=>m.offset===2).hex; // dropped on count-down - UIMAP['region']={fg:null,bg:innerOld,bold:false,italic:false,underline:false,strike:false}; - UIMAP['highlight']={fg:null,bg:outerOld,bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:innerOld,weight:null,slant:null,underline:null,strike:null}; + UIMAP['highlight']={fg:null,bg:outerOld,weight:null,slant:null,underline:null,strike:null}; selectedIdx=null;renderPalette(); const blueSpanInput=document.querySelector('#pals .fstrip[data-column="blue"] .fcount input'); A(blueSpanInput&&blueSpanInput.max==='8','normal column span control allows up to 8 per side'); @@ -3370,17 +3703,16 @@ if(location.hash==='#counttest'){let ok=true;const notes=[];const A=(c,n)=>{if(! const lo=_lum(MAP['bg']),hi=_lum(MAP['p']),blue=PALETTE.filter(p=>p[2]==='blue').map(p=>_lum(p[0])); A(blue.length&&blue.every(L=>L>=lo-1e-6&&L<=hi+1e-6),'generated span stays within the bg/fg bounds');} PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette(); - document.title='COUNTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='counttest';d.textContent='COUNTTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Base-edit + ground-edit gate (open with #baseedittest): editing a column base // recolors the whole column at the same count and references follow; editing a // ground swatch writes the bg/fg assignment. -if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#baseedittest')gate('baseedittest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)),saveSel=selectedIdx; setSyntaxFg('bg','#0d0b0a');setSyntaxFg('p','#f0fef0'); PALETTE=[['#0d0b0a','ground'],['#f0fef0','fg']]; regenColumn('#67809c',2,{ground:groundPair()}).members.forEach(m=>PALETTE.push([m.hex,m.offset===0?'blue':'blue'+(m.offset>0?'+'+m.offset:m.offset)])); - UIMAP['region']={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#67809c',weight:null,slant:null,underline:null,strike:null}; renderPalette();buildUITable(); selectedIdx=PALETTE.findIndex(p=>p[0].toLowerCase()==='#67809c'); document.getElementById('newhexstr').value='#3a8a8a';document.getElementById('newname').value='teal'; @@ -3406,11 +3738,10 @@ if(location.hash==='#baseedittest'){let ok=true;const notes=[];const A=(c,n)=>{i A(!PALETTE.some(p=>/^fg[+-]\d+$/.test(p[1])),'editing fg does not generate fg span tiles from a same-hex normal column'); A(PALETTE.find(p=>p[1]==='fg')[2]==='ground','editing fg preserves the ground column id'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);selectedIdx=saveSel;renderPalette(); - document.title='BASEEDITTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='baseedittest';d.textContent='BASEEDITTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // Round-trip gate (open with #roundtriptest): export stays a flat palette with // stable column ids, and import does not need color-derived column reconstruction. -if(location.hash==='#roundtriptest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#roundtriptest')gate('roundtriptest',A=>{ const stable=o=>Array.isArray(o)?o.map(stable):(o&&typeof o==='object'?Object.fromEntries(Object.keys(o).sort().map(k=>[k,stable(o[k])])):o); const diff=(a,b,p='')=>{if(JSON.stringify(a)===JSON.stringify(b))return '';if(typeof a!==typeof b||!a||!b||typeof a!=='object')return p+': '+JSON.stringify(a)+' != '+JSON.stringify(b); const ks=[...new Set([...Object.keys(a),...Object.keys(b)])].sort();for(const k of ks){const d=diff(a[k],b[k],p?p+'.'+k:k);if(d)return d;}return p;}; @@ -3428,13 +3759,12 @@ if(location.hash==='#roundtriptest'){let ok=true;const notes=[];const A=(c,n)=>{ A(obj.palette.some(e=>e[1]==='renamed-blue'&&e[2]==='blue'),'renamed color keeps its stable column id through export/import'); A(obj.locks&&obj.locks.includes('kw')&&obj.locks.includes('ui:region'),'lock state survives export/import'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();LOCKED=saveL; - document.title='ROUNDTRIPTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='roundtriptest';d.textContent='ROUNDTRIPTEST '+(ok?'PASS':'FAIL')+(notes.length?' | '+notes.join(' ; '):'');document.body.appendChild(d);} + }); // View-selector gate (open with #viewtest): the assignment panel is driven by a // single #viewsel dropdown -- two editor entries (@code, @ui) then a "package // faces" optgroup of every app, alphabetically by label -- and switching it // shows exactly one of the three view blocks. -if(location.hash==='#viewtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#viewtest')gate('viewtest',A=>{ const sel=document.getElementById('viewsel'); A(!!sel,'viewsel-exists'); if(sel){ @@ -3454,13 +3784,13 @@ if(location.hash==='#viewtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c A(curApp()===firstApp,'curApp-returns-selected-app'); A(!document.querySelector('#pkgbody .sbtn[title="reset to default"]'),'no-per-row-reset-button'); } - document.title='VIEWTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='viewtest';d.textContent='VIEWTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Non-default-marker gate (open with #ndtest): a per-face setting cell gets the // .nd corner flag only when its value differs from the face's seed default. Cell -// order in a pkg row: 0 label, 1 lock, 2 fg, 3 bg, 4 style, 5 contrast, 6 inherit, -// 7 size, 8 box. -if(location.hash==='#ndtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +// order in a pkg row: 0 lock, 1 label, 2 fg, 3 bg, 4 style, 5 box, 6 contrast. +// inherit + height live in the row expander, so a non-default height flags the +// expander toggle (exp-nd) rather than an inline cell. +if(location.hash==='#ndtest')gate('ndtest',A=>withSavedState(['PKGMAP','LOCKED'],()=>{ LOCKED.clear(); const app=curApp(),row=APPS[app].faces[0],face=row[0]; PKGMAP[app][face]=seedFace(row[2]||{});buildPkgTable(); @@ -3468,29 +3798,27 @@ if(location.hash==='#ndtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ A(tr0&&![...tr0.cells].some(c=>c.classList.contains('nd')),'default-face-has-no-marker'); PKGMAP[app][face].height=1.7;PKGMAP[app][face].source='user';buildPkgTable(); const tr1=document.querySelector('#pkgbody tr[data-face="'+face+'"]'); - A(tr1.cells[7].classList.contains('nd'),'nondefault-height-marks-size-box'); + A(tr1.querySelector('.exptoggle').classList.contains('exp-nd'),'nondefault-height-flags-expander'); A(!tr1.cells[4].classList.contains('nd'),'unchanged-style-box-stays-unmarked'); - PKGMAP[app][face].height=(row[2]&&row[2].height)||1;PKGMAP[app][face].bold=!((row[2]&&row[2].bold));buildPkgTable(); + PKGMAP[app][face].height=(row[2]&&row[2].height)||1;PKGMAP[app][face].weight=seedFace(row[2]||{}).weight==='bold'?null:'bold';buildPkgTable(); const tr2=document.querySelector('#pkgbody tr[data-face="'+face+'"]'); - A(tr2.cells[4].classList.contains('nd'),'toggled-bold-marks-style-box'); - A(!tr2.cells[7].classList.contains('nd'),'restored-height-unmarks-size-box'); + A(tr2.cells[4].classList.contains('nd'),'toggled-weight-marks-style-box'); + A(!tr2.querySelector('.exptoggle').classList.contains('exp-nd'),'restored-height-unflags-expander'); PKGMAP[app][face]=seedFace(row[2]||{});buildPkgTable(); - document.title='NDTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='ndtest';d.textContent='NDTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + })); // Contrast-cell gate (open with #crtest): the per-face contrast column shows a // bare colored number (no PASS/FAIL word); the WCAG verdict lives in the hover. -if(location.hash==='#crtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#crtest')gate('crtest',A=>{ const app=curApp(),face=APPS[app].faces[0][0];buildPkgTable(); - const cell=document.querySelector('#pkgbody tr[data-face="'+face+'"]').cells[5]; + const cell=document.querySelector('#pkgbody tr[data-face="'+face+'"]').cells[6]; const span=cell&&cell.querySelector('span'); A(span&&/^\d+\.\d$/.test(span.textContent.trim()),'contrast cell is a bare number: '+(span&&span.textContent)); A(span&&!/PASS|FAIL/.test(span.textContent),'no PASS/FAIL word in the contrast cell'); A(span&&span.title&&/(passes|fails) WCAG/i.test(span.title),'contrast cell carries a WCAG hover: '+(span&&span.title)); - document.title='CRTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='crtest';d.textContent='CRTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // View-nav gate (open with #navtest): the prev/next arrows flanking the view // dropdown step the selection (clamped, no wrap) and re-render the view. -if(location.hash==='#navtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#navtest')gate('navtest',A=>{ const sel=document.getElementById('viewsel'),prev=document.getElementById('viewprev'),next=document.getElementById('viewnext'); A(!!prev&&!!next,'nav arrows exist'); if(sel&&prev&&next){ @@ -3504,57 +3832,35 @@ if(location.hash==='#navtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c) sel.selectedIndex=2;onViewChange(); A(sel.options[2]&&sel.options[2].value[0]!=='@'&&vis('view-pkg'),'stepping to a package shows the pkg view'); } - document.title='NAVTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='navtest';d.textContent='NAVTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Markdown-preview gate (open with #mdtest): markdown-mode has a dedicated README // renderer, and every data-face it emits is a real markdown-mode face. -if(location.hash==='#mdtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#mdtest')gate('mdtest',A=>{ A(APPS['markdown-mode']&&APPS['markdown-mode'].preview==='markdown','markdown-mode wired to the markdown preview'); A(!!PACKAGE_PREVIEWS['markdown'],'markdown renderer registered'); if(PACKAGE_PREVIEWS['markdown']&&APPS['markdown-mode']){ - const box=document.createElement('div');box.innerHTML=PACKAGE_PREVIEWS['markdown'](); - const valid=new Set(APPS['markdown-mode'].faces.map(r=>r[0])); - const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); - A(used.length>=15,'preview exercises many faces ('+used.length+')'); - const bad=used.filter(f=>!valid.has(f)); - A(bad.length===0,'every data-face is a real markdown face; bad='+bad.join(',')); - for(const f of ['markdown-header-face-1','markdown-bold-face','markdown-inline-code-face','markdown-blockquote-face','markdown-gfm-checkbox-face','markdown-table-face']) - A(used.includes(f),'preview includes '+f); + assertPreviewFaces(A, PACKAGE_PREVIEWS['markdown'](), APPS['markdown-mode'].faces, 15, 'markdown', + ['markdown-header-face-1','markdown-bold-face','markdown-inline-code-face','markdown-blockquote-face','markdown-gfm-checkbox-face','markdown-table-face']); } - document.title='MDTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='mdtest';d.textContent='MDTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // mu4e-preview gate (open with #mupreviewtest): the mu4e preview is a realistic // headers list + message view, and every data-face it emits is a real mu4e face. -if(location.hash==='#mupreviewtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; - const box=document.createElement('div');box.innerHTML=renderMu4ePreview(); - const valid=new Set((APPS['mu4e']&&APPS['mu4e'].faces||[]).map(r=>r[0])); - const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); - A(used.length>=20,'preview exercises many faces ('+used.length+')'); - const bad=used.filter(f=>!valid.has(f)); - A(bad.length===0,'every data-face is a real mu4e face; bad='+bad.join(',')); - for(const f of ['mu4e-unread-face','mu4e-flagged-face','mu4e-replied-face','mu4e-draft-face','mu4e-trashed-face','mu4e-header-highlight-face','mu4e-header-marks-face','mu4e-contact-face','mu4e-compose-separator-face']) - A(used.includes(f),'preview includes '+f); - document.title='MUPREVIEWTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='mupreviewtest';d.textContent='MUPREVIEWTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} +if(location.hash==='#mupreviewtest')gate('mupreviewtest',A=>{ + assertPreviewFaces(A, renderMu4ePreview(), APPS['mu4e']&&APPS['mu4e'].faces, 20, 'mu4e', + ['mu4e-unread-face','mu4e-flagged-face','mu4e-replied-face','mu4e-draft-face','mu4e-trashed-face','mu4e-header-highlight-face','mu4e-header-marks-face','mu4e-contact-face','mu4e-compose-separator-face']); + }); // gnus-preview gate (open with #gnustest): gnus is its own view package (it drives // the mu4e article view), and every data-face its preview emits is a real gnus face. -if(location.hash==='#gnustest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#gnustest')gate('gnustest',A=>{ A(!!APPS['gnus'],'gnus is a registered view package'); A(APPS['gnus']&&APPS['gnus'].preview==='gnus','gnus uses the gnus preview renderer'); - const box=document.createElement('div');box.innerHTML=renderGnusPreview(); - const valid=new Set((APPS['gnus']&&APPS['gnus'].faces||[]).map(r=>r[0])); - const used=[...box.querySelectorAll('[data-face]')].map(e=>e.dataset.face); - A(used.length>=20,'preview exercises many faces ('+used.length+')'); - const bad=used.filter(f=>!valid.has(f)); - A(bad.length===0,'every data-face is a real gnus face; bad='+bad.join(',')); - for(const f of ['gnus-header-name','gnus-header-from','gnus-header-subject','gnus-cite-1','gnus-cite-attribution','gnus-signature','gnus-button','gnus-emphasis-highlight-words']) - A(used.includes(f),'preview includes '+f); - document.title='GNUSTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='gnustest';d.textContent='GNUSTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + assertPreviewFaces(A, renderGnusPreview(), APPS['gnus']&&APPS['gnus'].faces, 20, 'gnus', + ['gnus-header-name','gnus-header-from','gnus-header-subject','gnus-cite-1','gnus-cite-attribution','gnus-signature','gnus-button','gnus-emphasis-highlight-words']); + }); // picker-distinct gate (open with #pickertest): the color picker panel must stand // out from the page background. It carries a highlighted gold accent border, and its // background is meaningfully lighter than the body so the two are easy to tell apart. -if(location.hash==='#pickertest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#pickertest')gate('pickertest',A=>{ const pk=document.getElementById('picker');A(!!pk,'picker element exists'); if(pk){const cs=getComputedStyle(pk),body=getComputedStyle(document.body); const bc=(cs.borderTopColor.match(/\d+/g)||[]).slice(0,3).map(Number); @@ -3564,15 +3870,14 @@ if(location.hash==='#pickertest'){let ok=true;const notes=[];const A=(c,n)=>{if( const lift=pkbg.map((c,i)=>c-bdbg[i]); A(lift.every(d=>d>=12),'picker background is clearly lighter than the page (per-channel lift '+lift.join(',')+')'); } - document.title='PICKERTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='pickertest';d.textContent='PICKERTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Box-cluster gate (open with #boxtest): the box control is a 2x2 cluster of // four radio buttons (none / line / pressed / raised); the color swatch shows // only while a box style is active. -if(location.hash==='#boxtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#boxtest')gate('boxtest',A=>{ LOCKED.clear();const f=UI_FACES[0][0];const saveBox=UIMAP[f].box; UIMAP[f].box=null;buildUITable(); - const cell=document.querySelector('#uibody tr[data-face="'+f+'"]').cells[7]; + const cell=document.querySelector('#uibody tr[data-face="'+f+'"]').cells[5]; A(!!cell.querySelector('.boxcluster'),'box-cluster-present'); A(cell.querySelectorAll('.boxbtn').length===4,'four-box-buttons'); const dd=cell.querySelector('.cstep'); @@ -3585,30 +3890,185 @@ if(location.hash==='#boxtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c) A(UIMAP[f].box===null,'blank-click-clears-box'); A(dd.style.display==='none','color-hidden-again-after-clear'); UIMAP[f].box=saveBox;buildUITable(); - document.title='BOXTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='boxtest';d.textContent='BOXTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} -// Style-cluster gate (open with #styletest): the B/I/U/S style buttons sit in a -// 2x2 cluster (multi-toggle), mirroring the box cluster's square layout. -if(location.hash==='#styletest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; + }); +// Style-cluster gate (open with #styletest): the style cell holds a weight +// selector, a slant selector, and box-like underline and strike controls. +if(location.hash==='#styletest')gate('styletest',A=>{ buildUITable();const f=UI_FACES[0][0]; const cell=document.querySelector('#uibody tr[data-face="'+f+'"]').cells[4]; const cluster=cell.querySelector('.stylecluster'); A(!!cluster,'style-cluster-present'); - A(cluster&&cluster.querySelectorAll('.sbtn').length===4,'four-style-buttons-in-cluster'); - document.title='STYLETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='styletest';d.textContent='STYLETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + const dds=cluster?cluster.querySelectorAll('.enumdd'):[]; + A(dds.length===2,'weight-and-slant-custom-dropdowns-present'); + dds[0]&&dds[0].click(); + const wopts=_ddPop?[..._ddPop.querySelectorAll('.enumopt')]:[]; + A(wopts.some(b=>b.textContent==='semibold'),'weight-dropdown-spells-out-the-curated-range: '+wopts.map(b=>b.textContent).join(',')); + const wbold=wopts.find(b=>b.textContent==='bold'); + A(wbold&&wbold.style.fontWeight==='700','weight-options-preview-their-own-weight: bold renders 700, got '+(wbold&&wbold.style.fontWeight)); + closeColorDropdown(); + dds[1]&&dds[1].click(); + const sopts=_ddPop?[..._ddPop.querySelectorAll('.enumopt')]:[]; + A(sopts.some(b=>b.textContent==='oblique'),'slant-dropdown-offers-oblique: '+sopts.map(b=>b.textContent).join(',')); + const sital=sopts.find(b=>b.textContent==='italic'); + A(sital&&sital.style.fontStyle==='italic','slant-options-preview-their-own-slant: italic renders italic'); + closeColorDropdown(); + A(cluster&&cluster.querySelectorAll('.boxctl').length===1,'strike-control-in-row-underline-moved-to-expander'); + }); +// Expander gate (open with #expandtest): the per-row "more" toggle reveals a +// detail row with the overflow attribute editor, and its controls write the model. +if(location.hash==='#expandtest')gate('expandtest',A=>{ + buildUITable(); + const row=document.querySelector('#uibody tr[data-face="region"]'); + const detail=document.querySelector('#uibody tr.detailrow[data-detail-for="region"]'); + A(!!detail,'detail-row-present'); + A(detail&&detail.style.display==='none','detail-row-hidden-by-default'); + const btn=row.querySelector('.exptoggle'); + A(!!btn,'expander-toggle-present'); + btn&&btn.click(); + A(detail&&detail.style.display!=='none','toggle-reveals-detail-row'); + const ed=detail&&detail.querySelector('.detailedit'); + A(ed&&ed.querySelectorAll('.detailfield').length>=6,'detail-editor-has-the-overflow-fields'); + // ui faces also expose inherit + height in the expander + A(ed&&ed.querySelector('select.detailsel'),'ui-expander-offers-inherit'); + A(ed&&ed.querySelector('input.hstep'),'ui-expander-offers-height'); + // underline moved into the expander; its wave style writes a styled object + const uiUnder=ed&&ed.querySelector('.boxctl .boxbtn[data-style="wave"]'); + A(!!uiUnder,'underline-control-in-expander'); + uiUnder&&uiUnder.click(); + A(UIMAP['region'].underline&&UIMAP['region'].underline.style==='wave','underline-control-writes-a-wavy-object'); + // family text input writes the model + const fam=ed&&ed.querySelector('input.detailinput'); + if(fam){fam.value='Iosevka';fam.dispatchEvent(new Event('change'));} + A(UIMAP['region'].family==='Iosevka','family-input-writes-the-model'); + // inverse checkbox writes the model + const inv=ed&&ed.querySelector('input.detailcheck'); + if(inv){inv.checked=true;inv.dispatchEvent(new Event('change'));} + A(UIMAP['region'].inverse===true,'inverse-checkbox-writes-the-model'); + // a hidden non-default attribute flags the collapsed toggle (reset region to its + // default first, since the edits above left several overflow attrs changed) + UIMAP['region']=JSON.parse(JSON.stringify(DEFAULT_UIMAP['region']));buildUITable(); + const cleanbtn=document.querySelector('#uibody tr[data-face="region"] .exptoggle'); + A(cleanbtn&&!cleanbtn.classList.contains('exp-nd'),'toggle-unflagged-when-overflow-matches-default'); + UIMAP['region']=JSON.parse(JSON.stringify(DEFAULT_UIMAP['region']));UIMAP['region'].overline={color:null};buildUITable(); + const ndbtn=document.querySelector('#uibody tr[data-face="region"] .exptoggle'); + A(ndbtn&&ndbtn.classList.contains('exp-nd'),'collapsed-toggle-flags-a-hidden-non-default-attr'); + // package expander now exposes inherit + height (folded out of inline columns) + buildPkgTable();const pface=APPS[curApp()].faces[0][0]; + const pdetail=document.querySelector('#pkgbody tr.detailrow[data-detail-for="'+pface+'"]'); + A(pdetail&&pdetail.querySelector('select.detailsel'),'package-expander-offers-inherit'); + }); +// Height-clamp gate (open with #heighttest): the expander height field coerces a +// typed value into [HEIGHT_MIN,HEIGHT_MAX] and writes the clamped number back, so +// an out-of-range type/paste can't reach the model. Guards the fact that an +// <input type=number> min/max only constrain its steppers, never typed text. +if(location.hash==='#heighttest')gate('heighttest',A=>{ + const face=UI_FACES[0][0],save=JSON.parse(JSON.stringify(UIMAP[face])); + buildUITable(); + const hin=()=>document.querySelector('#uibody tr.detailrow[data-detail-for="'+face+'"] .hstep'); + const typeHeight=(v)=>{const h=hin();h.value=v;h.dispatchEvent(new Event('change'));}; + typeHeight('5'); + A(UIMAP[face].height===HEIGHT_MAX,'above-max-clamps-to-ceiling: '+UIMAP[face].height); + A(hin().value===''+HEIGHT_MAX,'field-shows-the-clamped-ceiling: '+hin().value); + typeHeight('0.05'); + A(UIMAP[face].height===HEIGHT_MIN,'below-floor-clamps-to-floor: '+UIMAP[face].height); + typeHeight('1.2'); + A(UIMAP[face].height===1.2,'in-range-value-passes-through: '+UIMAP[face].height); + typeHeight(''); + A(UIMAP[face].height===null,'blank-unsets-to-null: '+UIMAP[face].height); + UIMAP[face]=save;buildUITable(); + }); +// Language-dropdown gate (open with #langtest): the language list is sorted +// alphabetically with Elisp pinned as the default selection, and the ‹ › arrows +// step the selection (clamped, no wrap). +if(location.hash==='#langtest')gate('langtest',A=>{ + buildLangSel(); + const s=document.getElementById('langsel'); + const labels=[...s.options].map(o=>o.value); + const sorted=[...labels].sort((a,b)=>a.localeCompare(b)); + A(JSON.stringify(labels)===JSON.stringify(sorted),'languages are alphabetical: '+labels.join(',')); + A(s.value==='Elisp','Elisp is the default selection: '+s.value); + s.selectedIndex=0;stepLang(-1); + A(s.selectedIndex===0,'prev clamps at the first language'); + stepLang(1); + A(s.selectedIndex===1,'next steps forward one'); + s.selectedIndex=s.options.length-1;stepLang(1); + A(s.selectedIndex===s.options.length-1,'next clamps at the last language'); + }); +// View-lock-indicator gate (open with #viewlocktest): the view dropdown prefixes a +// lock glyph on a view whose every element is locked, and clears it otherwise. +if(location.hash==='#viewlocktest')gate('viewlocktest',A=>withSavedState(['LOCKED'],()=>{ + LOCKED.clear();updateViewLockIndicators(); + const s=document.getElementById('viewsel'),codeOpt=()=>[...s.options].find(o=>o.value==='@code'); + A(codeOpt()&&!codeOpt().textContent.startsWith('🔒'),'unlocked view shows no lock glyph: '+(codeOpt()&&codeOpt().textContent)); + syntaxLockKeys().forEach(k=>LOCKED.add(k));updateViewLockIndicators(); + A(codeOpt()&&codeOpt().textContent.startsWith('🔒'),'fully-locked view shows the lock glyph: '+(codeOpt()&&codeOpt().textContent)); + A(codeOpt()&&codeOpt().textContent.includes('color/code assignments'),'glyph prefixes the base label, not replaces it'); + LOCKED.delete(syntaxLockKeys()[0]);updateViewLockIndicators(); + A(codeOpt()&&!codeOpt().textContent.startsWith('🔒'),'unlocking one element clears the glyph'); + LOCKED.clear();updateViewLockIndicators(); + })); +// Detail-hover gate (open with #detailhovertest): every label in the expander +// detail row carries an explanatory hover, the way the table-header labels do. +if(location.hash==='#detailhovertest')gate('detailhovertest',A=>{ + buildUITable(); + const f=UI_FACES[0][0],detail=document.querySelector('#uibody tr.detailrow[data-detail-for="'+f+'"]'); + const fields=detail?[...detail.querySelectorAll('.detailfield')]:[]; + A(fields.length>0,'detail row has fields'); + A(fields.every(g=>g.title&&g.title.length>0),'every detail field has a hover: '+fields.map(g=>g.querySelector('span').textContent+(g.title?'+':'-')).join(' ')); + const inh=fields.find(g=>g.querySelector('span').textContent==='inherit'); + A(inh&&/inherit/i.test(inh.title),'inherit field hover mentions inheritance: '+(inh&&inh.title)); + }); +// Expand/collapse-all gate (open with #expandalltest): the header toggle opens or +// closes every row's detail at once, the per-row triangles track state (▶ closed, +// ▼ open), and the header button's label follows the aggregate. +if(location.hash==='#expandalltest')gate('expandalltest',A=>{ + buildUITable(); + const tb=document.getElementById('uibody'),btn=document.getElementById('uiexpandall'); + const details=()=>[...tb.querySelectorAll('tr.detailrow')]; + const open=()=>details().filter(d=>d.style.display!=='none').length; + const firstTog=()=>tb.querySelector('.exptoggle'); + A(firstTog()&&firstTog().textContent==='▶','row toggle starts collapsed (▶): '+(firstTog()&&firstTog().textContent)); + A(btn&&btn.textContent.indexOf('▶')===0&&/expand all/.test(btn.textContent),'button starts ▶ expand all: '+(btn&&btn.textContent)); + toggleAllExpanded('uiexpandall'); + A(open()===details().length&&open()>0,'expand all opens every row: '+open()+'/'+details().length); + A(firstTog().textContent==='▼','row toggles flip to ▼ after expand all'); + A(btn.textContent.indexOf('▼')===0&&/collapse all/.test(btn.textContent),'button flips to ▼ collapse all: '+btn.textContent); + toggleAllExpanded('uiexpandall'); + A(open()===0,'collapse all closes every row'); + A(firstTog().textContent==='▶','row toggles return to ▶ after collapse all'); + firstTog().click(); + A(open()===1,'a single row toggle opens just that row'); + A(btn.textContent.indexOf('▼')===0,'button reflects a single open row as ▼ collapse all'); + }); +// Expander-persistence gate (open with #expandpersisttest): a package edit rebuilds +// the whole table, so an open expander must reopen instead of collapsing under the +// user. Editing a value inside the open expander must not close the row. +if(location.hash==='#expandpersisttest')gate('expandpersisttest',A=>withSavedState(['PKGMAP'],()=>{ + EXPANDED.clear(); + const app=curApp(),face=APPS[app].faces[0][0];buildPkgTable(); + const row=()=>document.querySelector('#pkgbody tr[data-face="'+face+'"]'); + const detail=()=>document.querySelector('#pkgbody tr.detailrow[data-detail-for="'+face+'"]'); + A(detail()&&detail().style.display==='none','expander starts collapsed'); + row().querySelector('.exptoggle').click(); + A(detail()&&detail().style.display!=='none','expander opens on toggle'); + const hin=detail().querySelector('.hstep');hin.value='1.4';hin.dispatchEvent(new Event('change')); + A(detail()&&detail().style.display!=='none','expander stays open after an in-expander edit rebuilds the row'); + A(PKGMAP[app][face].height===1.4,'the in-expander edit still wrote the model'); + row().querySelector('.exptoggle').click();buildPkgTable(); + A(detail()&&detail().style.display==='none','a collapsed expander stays collapsed across a rebuild'); + EXPANDED.clear();buildPkgTable(); + })); // Palette default-state gate (open with #paldefaulttest): the studio opens with // the palette collapsed to base colors so the span tints don't crowd the first // view. initApp() ran at page load, so the live toggle reflects the opening state. -if(location.hash==='#paldefaulttest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#paldefaulttest')gate('paldefaulttest',A=>{ const tg=document.getElementById('paltoggle'); A(!!tg,'palette toggle present after boot'); A(tg&&tg.textContent==='▶','palette opens collapsed to base colors (arrow shows right-pointing ▶)'); - document.title='PALDEFAULTTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='paldefaulttest';d.textContent='PALDEFAULTTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Palette display-toggle gate (open with #paltoggletest): the arrow control // collapses each column to its base color and expands back to full spans. -if(location.hash==='#paltoggletest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#paltoggletest')gate('paltoggletest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP); paletteShowFull=true; // start expanded so the first click collapses to base-only setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); @@ -3625,16 +4085,15 @@ if(location.hash==='#paltoggletest'){let ok=true;const notes=[];const A=(c,n)=>{ document.getElementById('paltoggle').click(); A(blueChips()===5,'toggling-back-restores-spans'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);syncSyntaxFromCache();renderPalette(); - document.title='PALTOGGLETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='paltoggletest';d.textContent='PALTOGGLETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Unused-tile gate (open with #unusedtest): a palette color referenced nowhere // in the theme gets the .unused flag; a column with no used members gets // .unused-col; referenced colors stay unflagged. -if(location.hash==='#unusedtest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#unusedtest')gate('unusedtest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveSyn=JSON.parse(JSON.stringify(SYNTAX)),saveU=JSON.parse(JSON.stringify(UIMAP)); setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); PALETTE=[['#101010','bg','ground'],['#f0f0f0','fg','ground'],['#67809c','blue','blue'],['#123456','teal','teal']]; - for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,bold:false,italic:false,underline:false,strike:false}; + for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,weight:null,slant:null,underline:null,strike:null}; setSyntaxFg('kw','#67809c'); renderPalette(); const tealStrip=document.querySelector('#pals .fstrip[data-column="teal"]'); @@ -3646,39 +4105,68 @@ if(location.hash==='#unusedtest'){let ok=true;const notes=[];const A=(c,n)=>{if( A(tealStrip&&tealStrip.classList.contains('unused-col'),'all-unused-column-flagged'); A(blueStrip&&!blueStrip.classList.contains('unused-col'),'used-column-not-flagged'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const k in SYNTAX)delete SYNTAX[k];Object.assign(SYNTAX,saveSyn);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);syncSyntaxFromCache();renderPalette(); - document.title='UNUSEDTEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='unusedtest';d.textContent='UNUSEDTEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Gone-assignment gate (open with #gonetest): a swatch whose assigned color is // no longer in the palette gets the .gone flag; an assignment to a present color // does not. -if(location.hash==='#gonetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#gonetest')gate('gonetest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)); setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); PALETTE=[['#101010','bg','ground'],['#f0f0f0','fg','ground'],['#67809c','blue','blue']]; - UIMAP['region']={fg:null,bg:'#deadbe',bold:false,italic:false,underline:false,strike:false}; - UIMAP['highlight']={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false}; + UIMAP['region']={fg:null,bg:'#deadbe',weight:null,slant:null,underline:null,strike:null}; + UIMAP['highlight']={fg:null,bg:'#67809c',weight:null,slant:null,underline:null,strike:null}; buildUITable(); const goneDd=document.querySelector('#uibody tr[data-face="region"]').cells[3].querySelector('.cdd'); const okDd=document.querySelector('#uibody tr[data-face="highlight"]').cells[3].querySelector('.cdd'); A(goneDd&&goneDd.classList.contains('gone'),'assignment-to-missing-color-flagged'); A(okDd&&!okDd.classList.contains('gone'),'assignment-to-present-color-not-flagged'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);syncSyntaxFromCache();buildUITable(); - document.title='GONETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='gonetest';d.textContent='GONETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); // Tile-usage-hover gate (open with #usagetest): a tile's title lists the // "view area > element" pairings that use its color, under the name/hex line. -if(location.hash==='#usagetest'){let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; +if(location.hash==='#usagetest')gate('usagetest',A=>{ const saveP=PALETTE.slice(),saveM=Object.assign({},MAP),saveU=JSON.parse(JSON.stringify(UIMAP)); setSyntaxFg('bg','#101010');setSyntaxFg('p','#f0f0f0'); PALETTE=[['#101010','bg','ground'],['#f0f0f0','fg','ground'],['#67809c','blue','blue']]; const f0=UI_FACES[0][0],f0label=UI_FACES[0][1]||f0; - for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,bold:false,italic:false,underline:false,strike:false}; - UIMAP[f0]={fg:null,bg:'#67809c',bold:false,italic:false,underline:false,strike:false}; + for(const f in UIMAP)UIMAP[f]={fg:null,bg:null,weight:null,slant:null,underline:null,strike:null}; + UIMAP[f0]={fg:null,bg:'#67809c',weight:null,slant:null,underline:null,strike:null}; renderPalette(); const blueChip=document.querySelector('#pals .fstrip[data-column="blue"] .pchip'); A(blueChip&&blueChip.title.includes('ui faces > '+f0label),'hover-title-lists-ui-face-usage'); A(blueChip&&blueChip.title.split('\n').length>1,'usage-list-on-its-own-line-under-current-info'); PALETTE=saveP;for(const k in MAP)delete MAP[k];Object.assign(MAP,saveM);for(const f in UIMAP)delete UIMAP[f];Object.assign(UIMAP,saveU);syncSyntaxFromCache();renderPalette(); - document.title='USAGETEST '+(ok?'PASS':'FAIL'); - const d=document.createElement('div');d.id='usagetest';d.textContent='USAGETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);} + }); +// Element-docstring hovers (open with #hovertest): each table's category cell +// carries the face's Emacs docstring on top of its prior hover text, and the +// existing label-span hints are left intact (added in addition, not replaced). +if(location.hash==='#hovertest')gate('hovertest',A=>{ + buildTable();buildUITable();buildPkgTable(); + const synCell=document.querySelector('#legbody tr[data-kind="kw"] .cat'); + A(synCell&&synCell.title===SYNTAX_DOCS['kw'],'syntax cat cell shows the category face docstring: '+(synCell&&synCell.title)); + const synLbl=document.querySelector('#legbody tr[data-kind="kw"] .cat span'); + A(synLbl&&synLbl.title==='flash this category in the code','syntax label-span hint left intact'); + const uiCell=document.querySelector('#uibody tr[data-face="mode-line"] .cat'); + A(uiCell&&uiCell.title===FACE_DOCS['mode-line'],'ui cat cell shows the face docstring: '+(uiCell&&uiCell.title)); + const app=curApp(),docFace=APPS[app].faces.map(r=>r[0]).find(f=>FACE_DOCS[f]); + A(docFace,'a package face with a docstring exists to test'); + if(docFace){const pkgCell=document.querySelector('#pkgbody tr[data-face="'+docFace+'"] .cat'); + A(pkgCell&&pkgCell.title===FACE_DOCS[docFace]+'\n\n'+docFace,'package cat cell shows docstring on top of the face name: '+(pkgCell&&JSON.stringify(pkgCell.title)));} + }); +// Export via the File System Access API (open with #savetest): exportTheme writes +// the theme JSON straight to the picked file handle and closes it, so re-exporting +// overwrites in place instead of the browser uniquifying to "name (1).json". +if(location.hash==='#savetest'){(async()=>{let ok=true;const notes=[];const A=(c,n)=>{if(!c){ok=false;notes.push(n);}}; + let written='',closed=false,pickerArgs=null; + const orig=window.showSaveFilePicker; + window.showSaveFilePicker=async(opts)=>{pickerArgs=opts;return {name:'WIP.json',createWritable:async()=>({write:async d=>{written+=d;},close:async()=>{closed=true;}})};}; + try{ + await exportTheme(); + A(written===JSON.stringify(exportObj(),null,1),'export writes the theme JSON to the picked file'); + A(closed,'writable stream is closed so the file is committed'); + A(pickerArgs&&/\.json$/.test(pickerArgs.suggestedName||''),'picker suggests a .json name: '+(pickerArgs&&pickerArgs.suggestedName)); + }catch(e){A(false,'exportTheme threw: '+e.message);} + finally{window.showSaveFilePicker=orig;} + document.title='SAVETEST '+(ok?'PASS':'FAIL'); + const d=document.createElement('div');d.id='savetest';d.textContent='SAVETEST '+(ok?'PASS':'FAIL')+(notes.length?' fails='+notes.join(','):'');document.body.appendChild(d);})();} </script> diff --git a/scripts/theme-studio/theme-studio.template.html b/scripts/theme-studio/theme-studio.template.html index 5f41eb66d..a6f50beb7 100644 --- a/scripts/theme-studio/theme-studio.template.html +++ b/scripts/theme-studio/theme-studio.template.html @@ -62,11 +62,11 @@ STYLES_CSS</style> <div id="view-code" class="viewblock"> <div class="cols"> <section class="pane"> - <div class="legctl"><button id="syntaxlocktoggle" class="fbtn" onclick="toggleAllLocks('syntax')" title="lock or unlock every syntax row">lock all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlocked()" title="erase, preserving locked rows">erase</button></div> - <table class="leg" id="legtable"><thead><tr><th onclick="srtTable('legbody',0)">elements △</th><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',2)">fg △</th><th onclick="srtTable('legbody',3)">bg △</th><th>style</th><th title="face :box (border)">box</th><th title="WCAG contrast of this color on the background">contrast</th><th>example</th></tr></thead><tbody id="legbody"></tbody></table> + <div class="legctl"><button id="syntaxlocktoggle" class="fbtn" onclick="toggleAllLocks('syntax')" title="lock or unlock every syntax row">lock all</button><button id="syntaxexpandall" class="fbtn" onclick="toggleAllExpanded('syntaxexpandall')" title="expand or collapse every row's detail">▶ expand all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlocked()" title="erase, preserving locked rows">erase</button></div> + <table class="leg" id="legtable"><thead><tr><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',1)">elements △</th><th onclick="srtTable('legbody',2)">fg △</th><th onclick="srtTable('legbody',3)">bg △</th><th>style</th><th title="face :box (border)">box</th><th title="WCAG contrast of this color on the background">contrast</th><th>example</th></tr></thead><tbody id="legbody"></tbody></table> </section> <section class="pane grow"> - <div class="langbar"><label style="color:#b4b1a2">language</label><select id="langsel" class="chip" style="width:auto;font:bold 10pt monospace" onchange="renderCode();buildPkgPreview()"></select></div> + <div class="langbar"><label style="color:#b4b1a2">language</label><button id="langprev" class="viewnav" title="previous in the list" onclick="stepLang(-1)">‹</button><select id="langsel" class="chip" style="width:auto;font:bold 10pt monospace" onchange="renderCode();buildPkgPreview()"></select><button id="langnext" class="viewnav" title="next in the list" onclick="stepLang(1)">›</button></div> <pre id="codepre"></pre> </section> </div> @@ -74,8 +74,8 @@ STYLES_CSS</style> <div id="view-ui" class="viewblock" style="display:none"> <div class="cols stretch"> <section class="pane"> - <div class="legctl"><button id="uilocktoggle" class="fbtn" onclick="toggleAllLocks('ui')" title="lock or unlock every UI face row">lock all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlockedUI()" title="erase, preserving locked rows">erase</button></div> - <table class="leg" id="uitable"><thead><tr><th onclick="srtTable('uibody',0)">face △</th><th title="lock a decided face"></th><th onclick="srtTable('uibody',2)" title="foreground">fg △</th><th onclick="srtTable('uibody',3)" title="background">bg △</th><th>style</th><th onclick="srtTable('uibody',5)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast △</th><th>preview</th><th title="face :box (border)">box</th></tr></thead><tbody id="uibody"></tbody></table> + <div class="legctl"><button id="uilocktoggle" class="fbtn" onclick="toggleAllLocks('ui')" title="lock or unlock every UI face row">lock all</button><button id="uiexpandall" class="fbtn" onclick="toggleAllExpanded('uiexpandall')" title="expand or collapse every row's detail">▶ expand all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">↻ reset</button><button class="fbtn" onclick="clearUnlockedUI()" title="erase, preserving locked rows">erase</button></div> + <table class="leg" id="uitable"><thead><tr><th title="lock a decided face"></th><th onclick="srtTable('uibody',1)">face △</th><th onclick="srtTable('uibody',2)" title="foreground">fg △</th><th onclick="srtTable('uibody',3)" title="background">bg △</th><th>style</th><th title="face :box (border)">box</th><th onclick="srtTable('uibody',6)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast △</th><th>preview</th></tr></thead><tbody id="uibody"></tbody></table> </section> <section class="pane grow" style="display:flex;flex-direction:column"> <div class="langbar"><label style="color:#b4b1a2">live buffer preview</label></div> @@ -87,12 +87,12 @@ STYLES_CSS</style> <div class="pkgbar"> <label style="color:#b4b1a2">filter</label><input id="pkgfilter" type="text" placeholder="face name" oninput="buildPkgTable()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:160px"> <button onclick="resetApp()" title="reset to captured defaults, preserving locked rows">↻ reset</button> - <button id="pkglocktoggle" class="fbtn" onclick="toggleAllLocks('pkg')" title="lock or unlock every face row in the current package">lock all</button> + <button id="pkglocktoggle" class="fbtn" onclick="toggleAllLocks('pkg')" title="lock or unlock every face row in the current package">lock all</button><button id="pkgexpandall" class="fbtn" onclick="toggleAllExpanded('pkgexpandall')" title="expand or collapse every row's detail">▶ expand all</button> <button class="fbtn" onclick="clearUnlockedPkg()" title="erase, preserving locked rows">erase</button> </div> <div class="cols stretch"> <section class="pane"> - <table class="leg" id="pkgtable"><thead><tr><th onclick="srtTable('pkgbody',0)">face △</th><th title="lock a decided face"></th><th onclick="srtTable('pkgbody',2)">fg △</th><th onclick="srtTable('pkgbody',3)">bg △</th><th>style</th><th onclick="srtTable('pkgbody',5)">contrast △</th><th onclick="srtTable('pkgbody',6)">inherit △</th><th onclick="srtTable('pkgbody',7)">size △</th><th title="face :box (border)">box</th></tr></thead><tbody id="pkgbody"></tbody></table> + <table class="leg" id="pkgtable"><thead><tr><th title="lock a decided face"></th><th onclick="srtTable('pkgbody',1)">face △</th><th onclick="srtTable('pkgbody',2)">fg △</th><th onclick="srtTable('pkgbody',3)">bg △</th><th>style</th><th title="face :box (border)">box</th><th onclick="srtTable('pkgbody',6)">contrast △</th></tr></thead><tbody id="pkgbody"></tbody></table> </section> <section class="pane grow" style="display:flex;flex-direction:column"> <div class="langbar"><label id="pkgprevlabel" style="color:#b4b1a2">preview</label></div> |
