aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/theme-studio/Makefile20
-rw-r--r--scripts/theme-studio/WIP.json8454
-rw-r--r--scripts/theme-studio/app-core.js186
-rw-r--r--scripts/theme-studio/app.js805
-rw-r--r--scripts/theme-studio/app_inventory.py33
-rw-r--r--scripts/theme-studio/browser-gates.js538
-rw-r--r--scripts/theme-studio/build-theme.el167
-rw-r--r--scripts/theme-studio/capture-default-faces.py115
-rw-r--r--scripts/theme-studio/colormath.js7
-rw-r--r--scripts/theme-studio/daneel-palette.scss67
-rw-r--r--scripts/theme-studio/default_faces.py92
-rw-r--r--scripts/theme-studio/emacs-default-faces.json7023
-rw-r--r--scripts/theme-studio/face-coverage-dump.el51
-rw-r--r--scripts/theme-studio/face-coverage.org2715
-rw-r--r--scripts/theme-studio/face-docs-dump.el77
-rw-r--r--scripts/theme-studio/face-docs.json1
-rw-r--r--scripts/theme-studio/face_coverage.py369
-rw-r--r--scripts/theme-studio/face_data.py46
-rw-r--r--scripts/theme-studio/face_specs.py87
-rw-r--r--scripts/theme-studio/generate.py241
-rw-r--r--scripts/theme-studio/inline-strip.mjs15
-rw-r--r--scripts/theme-studio/palette-generator-core.js24
-rw-r--r--scripts/theme-studio/previews.js463
-rwxr-xr-xscripts/theme-studio/run-tests.sh16
-rw-r--r--scripts/theme-studio/samples.py413
-rw-r--r--scripts/theme-studio/styles.css27
-rw-r--r--scripts/theme-studio/test-app-core.mjs354
-rw-r--r--scripts/theme-studio/test-app-util.mjs6
-rw-r--r--scripts/theme-studio/test-colormath.mjs38
-rw-r--r--scripts/theme-studio/test-face-docs-dump.el78
-rw-r--r--scripts/theme-studio/test-palette-generator-core.mjs78
-rw-r--r--scripts/theme-studio/test_generate.py179
-rw-r--r--scripts/theme-studio/theme-studio.html1146
-rw-r--r--scripts/theme-studio/theme-studio.template.html14
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?'&#8618;':''}</span><span class="num" data-face="${nFace}" style="${uiCss(isc?lnc:ln,nFg,nBg)}">${i+1}</span><span class="cd">${cd||'&nbsp;'}</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','&lt;2026-06-08 Sun&gt;')+' '+os(a,'org-special-keyword','DEADLINE:')+' '+os(a,'org-date','&lt;2026-06-12 Thu&gt;'));
- 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','&lt;&lt;target&gt;&gt;')+', 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','&lt;%%(diary-float 6 5 2)&gt;')+'.');
- 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 &lt;christine@example.com&gt;'));
- 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 &lt;christine@example.com&gt;'));
- 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]')+' &lt;'+os(a,'erc-my-nick-prefix-face','@')+os(a,'erc-my-nick-face','craig')+'&gt; '+os(a,'erc-input-face','hello everyone'));
- L.push(os(a,'erc-timestamp-face','[10:25]')+' &lt;'+os(a,'erc-nick-prefix-face','+')+os(a,'erc-nick-default-face','bob')+'&gt; '+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','&lt;friend&gt;')+' '+os(a,'erc-fool-face','&lt;troll&gt;')+' '+os(a,'erc-dangerous-host-face','&lt;bad@host&gt;'));
- L.push(os(a,'erc-timestamp-face','[10:27]')+' '+os(a,'erc-direct-msg-face','(DM)')+' &lt;'+os(a,'erc-nick-msg-face','bob')+'&gt; 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','&gt;')+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&gt;')+' '+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','&gt; add a comment (editable)'));
- L.push(' '+os(a,'pearl-readonly-comment','&gt; 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','&gt; 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','&gt; 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','&gt;')+' '+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','&lt;!-- a one-line tagline --&gt;'));
- 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','&lt;')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','&gt;')+'Ctrl-C'+os(a,'markdown-html-tag-delimiter-face','&lt;/')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','&gt;'));
- 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','&lt;2026-06-08 Sun&gt;')+' '+os(a,'org-special-keyword','DEADLINE:')+' '+os(a,'org-date','&lt;2026-06-12 Thu&gt;'));
+ 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','&lt;&lt;target&gt;&gt;')+', 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','&lt;%%(diary-float 6 5 2)&gt;')+'.');
+ 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 &lt;christine@example.com&gt;'));
+ 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 &lt;christine@example.com&gt;'));
+ 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]')+' &lt;'+os(a,'erc-my-nick-prefix-face','@')+os(a,'erc-my-nick-face','craig')+'&gt; '+os(a,'erc-input-face','hello everyone'));
+ L.push(os(a,'erc-timestamp-face','[10:25]')+' &lt;'+os(a,'erc-nick-prefix-face','+')+os(a,'erc-nick-default-face','bob')+'&gt; '+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','&lt;friend&gt;')+' '+os(a,'erc-fool-face','&lt;troll&gt;')+' '+os(a,'erc-dangerous-host-face','&lt;bad@host&gt;'));
+ L.push(os(a,'erc-timestamp-face','[10:27]')+' '+os(a,'erc-direct-msg-face','(DM)')+' &lt;'+os(a,'erc-nick-msg-face','bob')+'&gt; 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','&gt;')+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&gt;')+' '+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','&gt; add a comment (editable)'));
+ L.push(' '+os(a,'pearl-readonly-comment','&gt; 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','&gt; 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','&gt; 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','&gt;')+' '+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','&lt;!-- a one-line tagline --&gt;'));
+ 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','&lt;')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','&gt;')+'Ctrl-C'+os(a,'markdown-html-tag-delimiter-face','&lt;/')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','&gt;'));
+ 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">&#8635; 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 &#9651;</th><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',2)">fg &#9651;</th><th onclick="srtTable('legbody',3)">bg &#9651;</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">&#9654; expand all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">&#8635; 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 &#9651;</th><th onclick="srtTable('legbody',2)">fg &#9651;</th><th onclick="srtTable('legbody',3)">bg &#9651;</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)">&lsaquo;</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)">&rsaquo;</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">&#8635; 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 &#9651;</th><th title="lock a decided face"></th><th onclick="srtTable('uibody',2)" title="foreground">fg &#9651;</th><th onclick="srtTable('uibody',3)" title="background">bg &#9651;</th><th>style</th><th onclick="srtTable('uibody',5)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast &#9651;</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">&#9654; expand all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">&#8635; 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 &#9651;</th><th onclick="srtTable('uibody',2)" title="foreground">fg &#9651;</th><th onclick="srtTable('uibody',3)" title="background">bg &#9651;</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 &#9651;</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">&#8635; 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">&#9654; 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 &#9651;</th><th title="lock a decided face"></th><th onclick="srtTable('pkgbody',2)">fg &#9651;</th><th onclick="srtTable('pkgbody',3)">bg &#9651;</th><th>style</th><th onclick="srtTable('pkgbody',5)">contrast &#9651;</th><th onclick="srtTable('pkgbody',6)">inherit &#9651;</th><th onclick="srtTable('pkgbody',7)">size &#9651;</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 &#9651;</th><th onclick="srtTable('pkgbody',2)">fg &#9651;</th><th onclick="srtTable('pkgbody',3)">bg &#9651;</th><th>style</th><th title="face :box (border)">box</th><th onclick="srtTable('pkgbody',6)">contrast &#9651;</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?'&#8618;':''}</span><span class="num" data-face="${nFace}" style="${uiCss(isc?lnc:ln,nFg,nBg)}">${i+1}</span><span class="cd">${cd||'&nbsp;'}</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','&lt;')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','&gt;')+'Ctrl-C'+os(a,'markdown-html-tag-delimiter-face','&lt;/')+os(a,'markdown-html-tag-name-face','kbd')+os(a,'markdown-html-tag-delimiter-face','&gt;'));
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">&#8635; 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 &#9651;</th><th title="lock a decided element↔color association"></th><th onclick="srtTable('legbody',2)">fg &#9651;</th><th onclick="srtTable('legbody',3)">bg &#9651;</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">&#9654; expand all</button><button class="fbtn" onclick="resetUnlocked()" title="reset to captured defaults, preserving locked rows">&#8635; 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 &#9651;</th><th onclick="srtTable('legbody',2)">fg &#9651;</th><th onclick="srtTable('legbody',3)">bg &#9651;</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)">&lsaquo;</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)">&rsaquo;</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">&#8635; 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 &#9651;</th><th title="lock a decided face"></th><th onclick="srtTable('uibody',2)" title="foreground">fg &#9651;</th><th onclick="srtTable('uibody',3)" title="background">bg &#9651;</th><th>style</th><th onclick="srtTable('uibody',5)" title="WCAG contrast: this face's foreground on its background (or the ground)">contrast &#9651;</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">&#9654; expand all</button><button class="fbtn" onclick="resetUnlockedUI()" title="reset to captured defaults, preserving locked rows">&#8635; 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 &#9651;</th><th onclick="srtTable('uibody',2)" title="foreground">fg &#9651;</th><th onclick="srtTable('uibody',3)" title="background">bg &#9651;</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 &#9651;</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">&#8635; 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">&#9654; 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 &#9651;</th><th title="lock a decided face"></th><th onclick="srtTable('pkgbody',2)">fg &#9651;</th><th onclick="srtTable('pkgbody',3)">bg &#9651;</th><th>style</th><th onclick="srtTable('pkgbody',5)">contrast &#9651;</th><th onclick="srtTable('pkgbody',6)">inherit &#9651;</th><th onclick="srtTable('pkgbody',7)">size &#9651;</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 &#9651;</th><th onclick="srtTable('pkgbody',2)">fg &#9651;</th><th onclick="srtTable('pkgbody',3)">bg &#9651;</th><th>style</th><th title="face :box (border)">box</th><th onclick="srtTable('pkgbody',6)">contrast &#9651;</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>