aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-selector
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/theme-selector')
-rw-r--r--scripts/theme-selector/README.md166
-rw-r--r--scripts/theme-selector/build-inventory.el31
-rw-r--r--scripts/theme-selector/build-theme.el244
-rw-r--r--scripts/theme-selector/generate.py1116
-rw-r--r--scripts/theme-selector/package-inventory.json723
-rw-r--r--scripts/theme-selector/samples.py269
-rw-r--r--scripts/theme-selector/theme-selector.html738
7 files changed, 0 insertions, 3287 deletions
diff --git a/scripts/theme-selector/README.md b/scripts/theme-selector/README.md
deleted file mode 100644
index 8f63383c..00000000
--- a/scripts/theme-selector/README.md
+++ /dev/null
@@ -1,166 +0,0 @@
-# theme-selector
-
-A self-contained tool for designing Emacs color themes by eye. One generated
-HTML page drives the whole theme: a palette, the syntax (font-lock /
-tree-sitter) layer, the built-in UI faces with a live mock-frame preview, and
-package-specific faces (org, magit, elfeed, plus every other installed package).
-Reassign colors against the palette, judge legibility with live WCAG-contrast
-readouts, then export a `theme.json` that a build step turns into
-`themes/<name>-*.el`.
-
-## Run
-
-```bash
-python3 generate.py # writes theme-selector.html beside this script
-```
-
-Then open it in Chrome (Firefox had color-rendering flakiness during design):
-
-```bash
-WAYLAND_DISPLAY=wayland-1 google-chrome-stable theme-selector.html
-```
-
-During color work, disable Hyprland inactive-window dimming so colors read true:
-
-```bash
-hyprctl keyword decoration:dim_inactive false
-```
-
-## Files
-
-- `generate.py` — emits the HTML+JS, and embeds the package data. Edit here to
- change layout or behavior.
-- `samples.py` — the six language code samples and the default syntax
- category→color map (`COLS`). `generate.py` reads the part before the `cols=`
- marker.
-- `package-inventory.json` — generated map of every installed package to the
- faces it defines (see Package faces below). A committed data artifact.
-- `build-inventory.el` — refreshes `package-inventory.json` from a running
- Emacs.
-- `theme-selector.html` — generated output. Regenerate; don't hand-edit.
-
-## What it captures
-
-Three tiers of faces, plus the palette:
-
-- **Palette** — named colors. Add by hex or with the in-page color picker
- (saturation/value square, hue slider, palette reuse chips, live contrast
- readout, and an any / AA+ / AAA legibility mask). Remove, rename, reorder with
- arrows or drag. The colors serving as background and foreground are locked.
-- **Syntax** — every font-lock / tree-sitter category (keyword, string,
- function, type, comment, and the rest), each with normal/bold/italic and a
- contrast rating. Click a category to flash its tokens in the code; click a
- token to flash its row.
-- **UI faces** — cursor, region, mode-line, fringe, line numbers, isearch, paren
- match, link, error/warning/success, and the rest, foreground and background
- per face, shown in a live mock Emacs buffer.
-- **Package faces** — per-package face tables with a live preview (below).
-
-## Package faces
-
-Pick an application from the dropdown to edit its faces. Each row has a
-foreground and background dropdown, bold/italic toggles, an `inherit` dropdown
-(base faces like `fixed-pitch`/`link` plus the app's own faces), a relative
-height stepper, a contrast readout, and a per-face reset. There's a per-app
-reset and a text filter for the large sets.
-
-Twenty applications have bespoke previews that exercise nearly all of their
-faces: org-mode (a document plus an agenda view), magit (a status buffer plus
-blame, reflog, sequence, bisect, and signature rows), elfeed (a search list and
-log), ghostel (a mock terminal with the 16 ANSI colors), mu4e (a headers list,
-message view, and compose stub), dashboard, lsp-mode (signatures, inlay hints,
-symbol highlights, rename), git-gutter, flycheck (a diagnostic line plus an
-error-list buffer), dired, dirvish (attribute columns, vc states, media, proc,
-narrow), calibredb (a library listing and detail view), erc (an IRC channel),
-org-drill (a cloze flashcard), org-noter, signel (a Signal chat), pearl (a
-ticket), slack (a channel with mrkdwn, attachments, blocks, and dialogs), and
-telega (chat entities, reactions, buttons, and webpage rendering), and shr (the
-built-in HTML renderer behind nov, eww, elfeed's article view, and HTML mail, so
-theming it themes all of them). Every other installed package is reachable too, with an editable
-table and a generic preview (each face name in its own colors), so any package
-can be themed. Clicking a face row flashes that face in the preview, and clicking
-a preview element flashes its row.
-
-**Inheritance** is modeled, not flattened: a face's effective color is resolved
-through its `inherit` chain and shown in the table and preview; setting an
-explicit color overrides it. `height` is a float multiplier off the base font
-and is read directly off the face (not cascaded through `inherit`, since Emacs
-multiplies float heights along a chain). The base monospace family is *not* the
-theme's job — it lives in `modules/font-config.el`; the tool owns only relative
-size and the `fixed-pitch` inherit relationships.
-
-### Refreshing the package inventory
-
-The reachable packages come from `package-inventory.json`. Regenerate it from a
-running Emacs (so it reflects what's actually installed), then rebuild the HTML:
-
-```bash
-emacsclient -e '(load "/home/cjennings/.emacs.d/scripts/theme-selector/build-inventory.el")'
-python3 generate.py
-```
-
-`build-inventory.el` groups each face by the package whose file defines it; it
-depends on the target Emacs having those packages loaded. Built-in faces are
-skipped (they're covered by the syntax and UI tiers).
-
-## theme.json contract
-
-The export (and what a build step consumes):
-
-```json
-{
- "name": "dupre",
- "palette": [["#67809c", "blue"], ["#e8bd30", "gold"]],
- "assignments": {"kw": "#67809c", "str": "#5d9b86", "bg": "#000000", "p": "#ffffff"},
- "bold": ["kw", "fnd"],
- "italic": [],
- "ui": {"region": {"fg": null, "bg": "#264364"}, "cursor": {"fg": null, "bg": "#a9b2bb"}},
- "packages": {
- "org-mode": {
- "org-level-1": {"fg": "#67809c", "bg": null, "bold": true, "italic": false,
- "underline": false, "strike": false,
- "inherit": null, "height": 1.3, "source": "default"}
- }
- }
-}
-```
-
-- `assignments` maps syntax category keys to hexes; `bg` is the `default` face
- background, `p` the foreground.
-- `ui` and `packages` faces carry `fg`/`bg` (hex or `null`), `bold`, `italic`,
- `underline`, `strike`, and for package faces `inherit` (a face name or
- `null`), `height` (a float, omitted at 1.0), and `source` (`"default"` seeded,
- `"user"` edited, `"cleared"`). The converter writes `underline` as
- `:underline t` and `strike` as `:strike-through t`.
-- The theme name is both the `name` field and the download filename. Import a
- `theme.json` to start from a prior theme; a file with no `packages` key still
- loads.
-
-`export` always downloads a fresh file; `save` (shown once a name is entered)
-writes the same file in place via the File System Access API.
-
-## Build step — `build-theme.el`
-
-`build-theme.el` converts a `theme.json` into a single self-contained
-`themes/<name>-theme.el` deftheme. JSON in, valid Emacs faces out, across all
-four tiers: `default` from `assignments.bg`/`.p`, the syntax categories mapped
-to their font-lock / tree-sitter faces (with the `bold`/`italic` sets applied),
-the UI faces passed through, and the package faces with `:inherit`/`:height`
-and weight/slant written.
-
-```bash
-emacs --batch -l scripts/theme-selector/build-theme.el \
- --eval '(build-theme/convert-file "scripts/theme-selector/dupre-revised.json" "themes")'
-```
-
-Output is a flat generated deftheme, not the palette/faces/theme trio the
-original dupre ships — a `theme.json` carries resolved per-face hex, not dupre's
-semantic-mapping layer, so a flat deftheme is the faithful output and never
-clobbers the curated dupre files.
-
-One mapping limitation: the `dec` (decorator) syntax key has no independent
-Emacs face. Emacs renders decorators with `font-lock-type-face`, which the `ty`
-key already owns, so `dec` is omitted from the output and decorators follow the
-type color (as they do in stock Emacs). Tests live in
-`tests/test-build-theme.el` (Normal / Boundary / Error, plus a WCAG-contrast
-assertion on the round-tripped result).
diff --git a/scripts/theme-selector/build-inventory.el b/scripts/theme-selector/build-inventory.el
deleted file mode 100644
index 52e14baa..00000000
--- a/scripts/theme-selector/build-inventory.el
+++ /dev/null
@@ -1,31 +0,0 @@
-;;; build-inventory.el --- emit package->faces inventory for theme-selector -*- lexical-binding: t -*-
-;;; Commentary:
-;; Loaded into a running Emacs (emacsclient -e '(load ".../build-inventory.el")')
-;; to write package-inventory.json next to itself: a JSON object mapping each
-;; installed (elpa/straight) package to the faces it defines, grouped by the
-;; package that owns the face's definition file. Built-in faces are skipped.
-;; generate.py embeds the JSON so the theme-selector dropdown can reach every
-;; installed package (tier-3 phase 6, the "theme every package" path).
-;;; Code:
-
-(require 'json)
-
-(let ((h (make-hash-table :test 'equal)))
- (dolist (f (face-list))
- (let* ((file (ignore-errors (symbol-file f 'defface)))
- (pkg (and (stringp file)
- (string-match "/\\(?:elpa\\|straight/build\\|site-lisp\\)/\\([a-zA-Z0-9._-]+?\\)-[0-9][^/]*/" file)
- (match-string 1 file))))
- (when pkg (push (symbol-name f) (gethash pkg h)))))
- (let (al)
- (maphash (lambda (k v) (push (cons (intern k) (sort v #'string<)) al)) h)
- (setq al (sort al (lambda (a b) (string< (symbol-name (car a)) (symbol-name (car b))))))
- (with-temp-file (expand-file-name
- "package-inventory.json"
- (file-name-directory (or load-file-name buffer-file-name
- "~/.emacs.d/scripts/theme-selector/")))
- (let ((json-encoding-pretty-print t))
- (insert (json-encode al) "\n")))))
-
-(provide 'build-inventory)
-;;; build-inventory.el ends here
diff --git a/scripts/theme-selector/build-theme.el b/scripts/theme-selector/build-theme.el
deleted file mode 100644
index fe080c0d..00000000
--- a/scripts/theme-selector/build-theme.el
+++ /dev/null
@@ -1,244 +0,0 @@
-;;; build-theme.el --- Convert a theme-selector theme.json into a deftheme -*- lexical-binding: t -*-
-
-;; Author: Craig Jennings <c@cjennings.net>
-
-;;; Commentary:
-
-;; The last link in the theme-selector pipeline: turn a theme.json exported by
-;; the tool (see scripts/theme-selector/README.md and
-;; docs/design/theme-selector-package-faces-spec.org) into a single,
-;; self-contained, loadable Emacs deftheme written to themes/<name>-theme.el.
-;;
-;; Four tiers come out of the JSON:
-;; - default -- background from assignments.bg, foreground from .p
-;; - syntax -- assignments.<cat> -> font-lock / tree-sitter faces, with
-;; the bold / italic category sets applied
-;; - ui -- the ui keys are already real face names; fg/bg passthrough
-;; - packages -- per-package face specs with :inherit / :height / weight /
-;; slant
-;;
-;; Usage (from a shell or a running Emacs):
-;;
-;; emacsclient -e '(progn (load ".../build-theme.el")
-;; (build-theme/convert-file ".../dupre-revised.json"))'
-;;
-;; or in batch:
-;;
-;; emacs --batch -l build-theme.el \
-;; --eval '(build-theme/convert-file "dupre-revised.json" "themes")'
-;;
-;; The output is a flat generated deftheme, not the hand-authored
-;; palette/faces/theme trio that the original dupre theme ships -- a theme.json
-;; carries resolved per-face hex, not dupre's semantic-mapping layer, so a flat
-;; deftheme is the faithful output and never clobbers the curated dupre files.
-
-;;; Code:
-
-(require 'json)
-(require 'subr-x)
-
-(defconst build-theme/--syntax-face-map
- '((kw . (font-lock-keyword-face))
- (bi . (font-lock-builtin-face))
- (pp . (font-lock-preprocessor-face))
- (fnd . (font-lock-function-name-face))
- (fnc . (font-lock-function-call-face))
- (ty . (font-lock-type-face))
- (prop . (font-lock-property-name-face font-lock-property-use-face))
- (con . (font-lock-constant-face))
- (num . (font-lock-number-face))
- (str . (font-lock-string-face))
- (esc . (font-lock-escape-face))
- (re . (font-lock-regexp-face))
- (doc . (font-lock-doc-face))
- (cm . (font-lock-comment-face))
- (cmd . (font-lock-comment-delimiter-face))
- (var . (font-lock-variable-name-face font-lock-variable-use-face))
- (op . (font-lock-operator-face))
- (punc . (font-lock-punctuation-face font-lock-bracket-face
- font-lock-delimiter-face font-lock-misc-punctuation-face)))
- "Map each theme.json syntax-category key to the font-lock faces it colors.
-A category may fan out to several faces (e.g. punc covers bracket and
-delimiter too). The dec (decorator) key is deliberately absent: Emacs has
-no dedicated decorator face -- it renders decorators with
-`font-lock-type-face', which the ty key already owns -- so coloring dec
-independently is not possible without clobbering types.")
-
-;;; ---------------------------------------------------------------------------
-;;; Pure helpers
-
-(defun build-theme/--hex-p (s)
- "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/--attrs (inherit fg bg bold italic underline strike height)
- "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. Only set attributes are written, so a
-fully-nil face yields an empty plist."
- (let (plist)
- (when (and height (numberp height) (/= height 1.0))
- (setq plist (list :height height)))
- (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)))
- plist))
-
-(defun build-theme/--face-spec (face attrs)
- "Wrap FACE and its ATTRS plist as a `custom-theme-set-faces' spec.
-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
-
-(defun build-theme/--default-spec (assignments)
- "Build the `default' face spec from ASSIGNMENTS bg / p."
- (let ((bg (build-theme/--obj-get assignments 'bg))
- (fg (build-theme/--obj-get assignments 'p)))
- (build-theme/--face-spec 'default (build-theme/--attrs nil fg bg nil nil nil nil nil))))
-
-(defun build-theme/--syntax-face-specs (assignments bold italic)
- "Build syntax-tier face specs from ASSIGNMENTS plus the BOLD and ITALIC sets.
-BOLD and ITALIC are lists of category-key symbols. Each category fans out to
-the font-lock faces in `build-theme/--syntax-face-map'."
- (let (specs)
- (dolist (pair build-theme/--syntax-face-map)
- (let* ((cat (car pair))
- (faces (cdr pair))
- (hex (build-theme/--obj-get assignments cat)))
- (when hex
- (let ((attrs (build-theme/--attrs nil hex nil
- (memq cat bold) (memq cat italic) nil nil nil)))
- (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})."
- (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)))
- (when-let ((spec (build-theme/--face-spec face attrs)))
- (push spec specs))))
- (nreverse specs)))
-
-(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))))
- (when-let ((spec (build-theme/--face-spec face attrs)))
- (push spec specs)))))
- (nreverse specs)))
-
-(defun build-theme/--all-specs (data)
- "Build the full ordered face-spec list from parsed theme.json DATA."
- (let ((assignments (build-theme/--obj-get data 'assignments))
- (bold (mapcar #'intern (build-theme/--obj-get data 'bold)))
- (italic (mapcar #'intern (build-theme/--obj-get data 'italic)))
- (ui (build-theme/--obj-get data 'ui))
- (packages (build-theme/--obj-get data 'packages)))
- (delq nil
- (append
- (list (build-theme/--default-spec assignments))
- (build-theme/--syntax-face-specs assignments bold italic)
- (build-theme/--ui-face-specs ui)
- (build-theme/--package-face-specs packages)))))
-
-;;; ---------------------------------------------------------------------------
-;;; Rendering
-
-(defun build-theme/--render (name specs)
- "Render a deftheme file body for theme NAME from face SPECS, as a string."
- (concat
- (format ";;; %s-theme.el --- Generated by theme-selector -*- lexical-binding: t -*-\n" name)
- "\n;;; Commentary:\n"
- (format ";; Generated from %s.json by scripts/theme-selector/build-theme.el.\n" name)
- ";; Do not hand-edit; re-run the converter.\n"
- "\n;;; Code:\n\n"
- (format "(deftheme %s\n \"Generated by theme-selector.\")\n\n" name)
- (format "(custom-theme-set-faces\n '%s\n" name)
- ;; Each spec is quoted: custom-theme-set-faces is a function, so an
- ;; unquoted (face ((t ...))) would be evaluated as a call. Specs hold
- ;; only literal strings, symbols, and numbers, so a plain quote suffices.
- (mapconcat (lambda (spec) (concat " '" (prin1-to-string spec))) specs "\n")
- ")\n\n"
- (format "(provide-theme '%s)\n" name)
- (format ";;; %s-theme.el ends here\n" name)))
-
-(defun build-theme/--parse (json-file)
- "Parse JSON-FILE into an alist, with null/false as nil and arrays as lists.
-Signal a `file-missing' error when JSON-FILE does not exist."
- (unless (file-readable-p json-file)
- (signal 'file-missing (list "Cannot read theme.json" json-file)))
- (with-temp-buffer
- (insert-file-contents json-file)
- (goto-char (point-min))
- (json-parse-buffer :object-type 'alist :array-type 'list
- :null-object nil :false-object nil)))
-
-;;; ---------------------------------------------------------------------------
-;;; Entry point
-
-(defun build-theme/convert-file (json-file &optional out-dir)
- "Convert JSON-FILE (a theme.json export) into a deftheme file.
-Write themes/<name>-theme.el, where <name> is the JSON name field, into
-OUT-DIR (default: the themes/ directory of this repo). Return the written
-path."
- (let* ((data (build-theme/--parse json-file))
- (name (build-theme/--obj-get data 'name))
- (specs (build-theme/--all-specs data))
- (dir (or out-dir
- (expand-file-name
- "../../themes"
- (file-name-directory (or load-file-name buffer-file-name
- default-directory)))))
- (out (expand-file-name (format "%s-theme.el" name) dir)))
- (unless (and (stringp name) (string-match-p "\\`[a-zA-Z][a-zA-Z0-9-]*\\'" name))
- (error "Invalid theme name in %s: %S" json-file name))
- (make-directory dir t)
- (with-temp-file out
- (insert (build-theme/--render name specs)))
- out))
-
-(provide 'build-theme)
-;;; build-theme.el ends here
diff --git a/scripts/theme-selector/generate.py b/scripts/theme-selector/generate.py
deleted file mode 100644
index 8e76c174..00000000
--- a/scripts/theme-selector/generate.py
+++ /dev/null
@@ -1,1116 +0,0 @@
-import json, os
-HERE=os.path.dirname(os.path.abspath(__file__))
-ns={}
-src=open(os.path.join(HERE,'samples.py')).read()
-exec(src[:src.index('cols=')], ns)
-SAMPLES={"Elisp":ns['ELS'],"Go":ns['GOS'],"Python":ns['PYS'],"TypeScript":ns['TSS'],"Java":ns['JAS'],"C":ns['CS'],"C++":ns['CPS'],"Shell":ns['SHS']}
-COLS=ns['COLS']
-MAP={k:v[0] for k,v in COLS.items()}; BOLD={k:v[1] for k,v in COLS.items()}; MAP['str']='#5d9b86'; MAP['bg']='#000000'
-PALETTE=[["#67809c","blue"],["#e8bd30","gold"],["#9b5fd0","regal"],["#2ba178","emerald"],["#5d9b86","sage"],
- ["#cb6b4d","terracotta"],["#be9e74","tan"],["#ffffff","white"],["#a9b2bb","silver"],["#838d97","steel"],
- ["#5e6770","pewter"],["#2f343a","gunmetal"],["#264364","navy"],["#000000","ground"],["#1a1714","bg-dim"]]
-CATS=[["bg","background (ground)","Aa Bb 123"],["p","fg · default text","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","@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","|"]]
-UIMAP={"cursor":{"fg":None,"bg":"#a9b2bb"},"region":{"fg":None,"bg":"#264364"},
- "hl-line":{"fg":None,"bg":"#1a1714"},"highlight":{"fg":None,"bg":"#2f343a"},
- "mode-line":{"fg":"#cdced1","bg":"#2f343a"},"mode-line-inactive":{"fg":"#838d97","bg":"#1a1714"},
- "fringe":{"fg":None,"bg":"#0d0b0a"},"line-number":{"fg":"#5e6770","bg":None},
- "line-number-current-line":{"fg":"#e8bd30","bg":"#1a1714"},"minibuffer-prompt":{"fg":"#67809c","bg":None},
- "isearch":{"fg":"#0d0b0a","bg":"#e8bd30"},"lazy-highlight":{"fg":"#0d0b0a","bg":"#838d97"},
- "isearch-fail":{"fg":"#cb6b4d","bg":None},"show-paren-match":{"fg":None,"bg":"#264364"},
- "show-paren-mismatch":{"fg":"#0d0b0a","bg":"#cb6b4d"},"link":{"fg":"#67809c","bg":None},
- "error":{"fg":"#cb6b4d","bg":None},"warning":{"fg":"#e8bd30","bg":None},
- "success":{"fg":"#5d9b86","bg":None},"vertical-border":{"fg":"#2f343a","bg":None}}
-# link is underlined by default (matches the built-in link face).
-UIMAP["link"]["underline"]=True
-# Tier-3 package faces (Phase 2): complete own-defface sets for org/magit/elfeed,
-# built from face-name lists + a curated seed-color map. Prominent faces are
-# seeded; the long tail seeds to the default foreground for the user to tune.
-ORG_FACES=("org-document-title org-document-info org-document-info-keyword "
- "org-level-1 org-level-2 org-level-3 org-level-4 org-level-5 org-level-6 org-level-7 org-level-8 "
- "org-headline-todo org-headline-done org-todo org-done org-priority org-tag org-tag-group "
- "org-special-keyword org-drawer org-property-value org-checkbox org-checkbox-statistics-todo "
- "org-checkbox-statistics-done org-warning org-link org-footnote org-date org-sexp-date "
- "org-date-selected org-target org-macro org-cite org-cite-key org-block org-block-begin-line "
- "org-block-end-line org-code org-verbatim org-inline-src-block org-quote org-verse "
- "org-latex-and-related org-table org-table-header org-table-row org-formula org-column "
- "org-column-title org-list-dt org-meta-line org-ellipsis org-hide org-indent org-archived "
- "org-default org-dispatcher-highlight org-agenda-structure org-agenda-structure-secondary "
- "org-agenda-structure-filter org-agenda-date org-agenda-date-today org-agenda-date-weekend "
- "org-agenda-date-weekend-today org-agenda-current-time org-agenda-done org-agenda-dimmed-todo-face "
- "org-agenda-calendar-event org-agenda-calendar-sexp org-agenda-calendar-daterange org-agenda-diary "
- "org-agenda-clocking org-agenda-column-dateline org-agenda-restriction-lock org-agenda-filter-category "
- "org-agenda-filter-effort org-agenda-filter-regexp org-agenda-filter-tags org-scheduled "
- "org-scheduled-today org-scheduled-previously org-upcoming-deadline org-upcoming-distant-deadline "
- "org-imminent-deadline org-time-grid org-clock-overlay org-mode-line-clock org-mode-line-clock-overrun").split()
-MAGIT_FACES=("magit-section-heading magit-section-secondary-heading magit-section-heading-selection "
- "magit-section-highlight magit-section-child-count magit-diff-added magit-diff-added-highlight "
- "magit-diff-removed magit-diff-removed-highlight magit-diff-context magit-diff-context-highlight "
- "magit-diff-file-heading magit-diff-file-heading-highlight magit-diff-file-heading-selection "
- "magit-diff-hunk-heading magit-diff-hunk-heading-highlight magit-diff-hunk-heading-selection "
- "magit-diff-hunk-region magit-diff-lines-heading magit-diff-lines-boundary magit-diff-base "
- "magit-diff-base-highlight magit-diff-our magit-diff-our-highlight magit-diff-their "
- "magit-diff-their-highlight magit-diff-conflict-heading magit-diff-conflict-heading-highlight "
- "magit-diff-revision-summary magit-diff-revision-summary-highlight magit-diff-whitespace-warning "
- "magit-diffstat-added magit-diffstat-removed magit-branch-current magit-branch-local "
- "magit-branch-remote magit-branch-remote-head magit-branch-upstream magit-branch-warning "
- "magit-head magit-tag magit-hash magit-filename magit-dimmed magit-keyword magit-keyword-squash "
- "magit-refname magit-refname-stash magit-refname-wip magit-refname-pullreq magit-log-author "
- "magit-log-date magit-log-graph magit-header-line magit-header-line-key magit-header-line-log-select "
- "magit-process-ok magit-process-ng magit-mode-line-process magit-mode-line-process-error "
- "magit-bisect-good magit-bisect-bad magit-bisect-skip magit-blame-heading magit-blame-highlight "
- "magit-blame-hash magit-blame-name magit-blame-date magit-blame-summary magit-blame-dimmed "
- "magit-blame-margin magit-cherry-equivalent magit-cherry-unmatched magit-signature-good "
- "magit-signature-bad magit-signature-untrusted magit-signature-expired magit-signature-expired-key "
- "magit-signature-revoked magit-signature-error magit-reflog-commit magit-reflog-amend "
- "magit-reflog-merge magit-reflog-checkout magit-reflog-reset magit-reflog-rebase "
- "magit-reflog-cherry-pick magit-reflog-remote magit-reflog-other magit-sequence-pick "
- "magit-sequence-stop magit-sequence-part magit-sequence-head magit-sequence-drop magit-sequence-done "
- "magit-sequence-onto magit-sequence-exec magit-left-margin").split()
-ELFEED_FACES=("elfeed-search-date-face elfeed-search-title-face elfeed-search-unread-title-face "
- "elfeed-search-feed-face elfeed-search-tag-face elfeed-search-unread-count-face "
- "elfeed-search-filter-face elfeed-search-last-update-face elfeed-log-date-face "
- "elfeed-log-error-level-face elfeed-log-warn-level-face elfeed-log-info-level-face "
- "elfeed-log-debug-level-face").split()
-ORG_SEED={
- "org-document-title":{"fg":"gold","bold":True,"height":1.5},"org-document-info":{"fg":"steel"},
- "org-document-info-keyword":{"fg":"pewter","inherit":"fixed-pitch"},
- "org-level-1":{"fg":"blue","bold":True,"height":1.3},"org-level-2":{"fg":"gold","height":1.2},
- "org-level-3":{"fg":"regal","height":1.15},"org-level-4":{"fg":"emerald","height":1.1},
- "org-level-5":{"fg":"terracotta"},"org-level-6":{"fg":"tan"},"org-level-7":{"fg":"sage"},"org-level-8":{"fg":"steel"},
- "org-headline-done":{"fg":"pewter"},"org-todo":{"fg":"terracotta","bold":True},"org-done":{"fg":"sage","bold":True},
- "org-priority":{"fg":"gold","bold":True},"org-tag":{"fg":"tan"},"org-tag-group":{"fg":"tan"},
- "org-special-keyword":{"fg":"pewter"},"org-drawer":{"fg":"pewter"},"org-property-value":{"fg":"steel"},
- "org-checkbox":{"fg":"gold","inherit":"fixed-pitch"},"org-checkbox-statistics-todo":{"fg":"terracotta"},
- "org-checkbox-statistics-done":{"fg":"sage"},"org-warning":{"fg":"terracotta","bold":True},
- "org-link":{"fg":"blue"},"org-footnote":{"fg":"blue"},"org-date":{"fg":"steel","inherit":"fixed-pitch"},
- "org-sexp-date":{"fg":"steel"},"org-date-selected":{"fg":"ground","bg":"gold"},"org-target":{"fg":"regal"},
- "org-macro":{"fg":"regal"},"org-cite":{"fg":"blue"},"org-cite-key":{"fg":"blue"},
- "org-block":{"fg":"white","bg":"bg-dim","inherit":"fixed-pitch"},
- "org-block-begin-line":{"fg":"pewter","bg":"bg-dim","inherit":"fixed-pitch"},
- "org-block-end-line":{"fg":"pewter","bg":"bg-dim","inherit":"fixed-pitch"},
- "org-code":{"fg":"terracotta","inherit":"fixed-pitch"},"org-verbatim":{"fg":"steel","inherit":"fixed-pitch"},
- "org-inline-src-block":{"fg":"terracotta","inherit":"fixed-pitch"},"org-quote":{"fg":"silver","italic":True},
- "org-verse":{"fg":"silver","italic":True},"org-latex-and-related":{"fg":"gold"},
- "org-table":{"fg":"steel","inherit":"fixed-pitch"},"org-table-header":{"fg":"white","bold":True,"bg":"gunmetal"},
- "org-formula":{"fg":"terracotta"},"org-column":{"bg":"gunmetal"},"org-column-title":{"fg":"white","bold":True,"bg":"gunmetal"},
- "org-list-dt":{"fg":"gold","bold":True},"org-meta-line":{"fg":"pewter","inherit":"fixed-pitch"},
- "org-ellipsis":{"fg":"pewter"},"org-hide":{"fg":"ground"},"org-indent":{"fg":"ground"},
- "org-archived":{"fg":"pewter"},"org-dispatcher-highlight":{"fg":"gold","bold":True,"bg":"navy"},
- "org-agenda-structure":{"fg":"blue","bold":True,"height":1.1},"org-agenda-structure-secondary":{"fg":"blue"},
- "org-agenda-structure-filter":{"fg":"terracotta","bold":True},"org-agenda-date":{"fg":"steel","height":1.05},
- "org-agenda-date-today":{"fg":"gold","bold":True,"height":1.05},"org-agenda-date-weekend":{"fg":"steel","bold":True},
- "org-agenda-date-weekend-today":{"fg":"gold","bold":True},"org-agenda-current-time":{"fg":"gold"},
- "org-agenda-done":{"fg":"sage"},"org-agenda-dimmed-todo-face":{"fg":"pewter"},
- "org-agenda-calendar-event":{"fg":"white"},"org-agenda-calendar-sexp":{"fg":"steel"},
- "org-agenda-calendar-daterange":{"fg":"steel"},"org-agenda-diary":{"fg":"sage"},
- "org-agenda-clocking":{"bg":"navy"},"org-agenda-column-dateline":{"bg":"gunmetal"},
- "org-agenda-restriction-lock":{"bg":"terracotta"},"org-agenda-filter-category":{"fg":"gold","bold":True},
- "org-agenda-filter-effort":{"fg":"gold","bold":True},"org-agenda-filter-regexp":{"fg":"gold","bold":True},
- "org-agenda-filter-tags":{"fg":"gold","bold":True},"org-scheduled":{"fg":"sage"},
- "org-scheduled-today":{"fg":"sage","bold":True},"org-scheduled-previously":{"fg":"terracotta"},
- "org-upcoming-deadline":{"fg":"gold"},"org-upcoming-distant-deadline":{"fg":"tan"},
- "org-imminent-deadline":{"fg":"terracotta","bold":True},"org-time-grid":{"fg":"tan"},
- "org-clock-overlay":{"bg":"navy"},"org-mode-line-clock":{"fg":"steel"},"org-mode-line-clock-overrun":{"fg":"terracotta","bold":True}}
-MAGIT_SEED={
- "magit-section-heading":{"fg":"gold","bold":True},"magit-section-secondary-heading":{"fg":"tan","bold":True},
- "magit-section-heading-selection":{"fg":"gold","bg":"navy"},"magit-section-highlight":{"bg":"bg-dim"},
- "magit-section-child-count":{"fg":"pewter"},"magit-diff-added":{"fg":"sage"},
- "magit-diff-added-highlight":{"fg":"sage","bg":"bg-dim"},"magit-diff-removed":{"fg":"terracotta"},
- "magit-diff-removed-highlight":{"fg":"terracotta","bg":"bg-dim"},"magit-diff-context":{"fg":"pewter"},
- "magit-diff-context-highlight":{"fg":"silver","bg":"bg-dim"},"magit-diff-file-heading":{"fg":"white","bold":True},
- "magit-diff-file-heading-highlight":{"fg":"white","bold":True,"bg":"bg-dim"},
- "magit-diff-hunk-heading":{"fg":"steel","bg":"gunmetal"},"magit-diff-hunk-heading-highlight":{"fg":"white","bg":"gunmetal"},
- "magit-diffstat-added":{"fg":"sage"},"magit-diffstat-removed":{"fg":"terracotta"},
- "magit-branch-current":{"fg":"blue","bold":True},"magit-branch-local":{"fg":"blue"},
- "magit-branch-remote":{"fg":"sage"},"magit-branch-remote-head":{"fg":"sage","bold":True},
- "magit-head":{"fg":"blue","bold":True},"magit-tag":{"fg":"gold"},"magit-hash":{"fg":"pewter"},
- "magit-filename":{"fg":"steel"},"magit-dimmed":{"fg":"pewter"},"magit-keyword":{"fg":"regal"},
- "magit-keyword-squash":{"fg":"terracotta"},"magit-refname":{"fg":"pewter"},"magit-log-author":{"fg":"tan"},
- "magit-log-date":{"fg":"steel"},"magit-log-graph":{"fg":"pewter"},
- "magit-header-line":{"fg":"white","bold":True,"bg":"gunmetal"},"magit-process-ok":{"fg":"sage","bold":True},
- "magit-process-ng":{"fg":"terracotta","bold":True},"magit-mode-line-process":{"fg":"sage"},
- "magit-mode-line-process-error":{"fg":"terracotta"},"magit-bisect-good":{"fg":"sage"},
- "magit-bisect-bad":{"fg":"terracotta"},"magit-bisect-skip":{"fg":"gold"},
- "magit-blame-heading":{"fg":"steel","bg":"gunmetal"},"magit-blame-hash":{"fg":"pewter"},
- "magit-blame-name":{"fg":"tan"},"magit-blame-date":{"fg":"steel"},"magit-cherry-equivalent":{"fg":"regal"},
- "magit-cherry-unmatched":{"fg":"sage"},"magit-signature-good":{"fg":"sage"},
- "magit-signature-bad":{"fg":"terracotta","bold":True},"magit-signature-untrusted":{"fg":"gold"},
- "magit-signature-expired":{"fg":"tan"},"magit-diff-whitespace-warning":{"bg":"terracotta"},
- "magit-reflog-commit":{"fg":"sage"},"magit-reflog-amend":{"fg":"regal"},"magit-reflog-merge":{"fg":"sage"},
- "magit-reflog-checkout":{"fg":"blue"},"magit-reflog-reset":{"fg":"terracotta"},"magit-reflog-rebase":{"fg":"regal"},
- "magit-reflog-cherry-pick":{"fg":"sage"},"magit-reflog-remote":{"fg":"steel"},"magit-reflog-other":{"fg":"steel"},
- "magit-sequence-pick":{"fg":"white"},"magit-sequence-stop":{"fg":"terracotta"},"magit-sequence-done":{"fg":"pewter"},
- "magit-sequence-head":{"fg":"blue"}}
-ELFEED_SEED={
- "elfeed-search-date-face":{"fg":"steel"},"elfeed-search-title-face":{"fg":"silver"},
- "elfeed-search-unread-title-face":{"fg":"white","bold":True},"elfeed-search-feed-face":{"fg":"sage"},
- "elfeed-search-tag-face":{"fg":"tan"},"elfeed-search-unread-count-face":{"fg":"gold"},
- "elfeed-search-filter-face":{"fg":"blue","bold":True},"elfeed-search-last-update-face":{"fg":"pewter"},
- "elfeed-log-date-face":{"fg":"steel"},"elfeed-log-error-level-face":{"fg":"terracotta","bold":True},
- "elfeed-log-warn-level-face":{"fg":"gold"},"elfeed-log-info-level-face":{"fg":"sage"},
- "elfeed-log-debug-level-face":{"fg":"pewter"}}
-# ghostel (terminal): the 16 ANSI colors plus default and the fake cursor.
-GHOSTEL_FACES=("ghostel-default ghostel-fake-cursor ghostel-fake-cursor-box "
- "ghostel-color-black ghostel-color-red ghostel-color-green ghostel-color-yellow "
- "ghostel-color-blue ghostel-color-magenta ghostel-color-cyan ghostel-color-white "
- "ghostel-color-bright-black ghostel-color-bright-red ghostel-color-bright-green ghostel-color-bright-yellow "
- "ghostel-color-bright-blue ghostel-color-bright-magenta ghostel-color-bright-cyan ghostel-color-bright-white").split()
-GHOSTEL_SEED={
- "ghostel-default":{"fg":"#cdced1"},"ghostel-fake-cursor":{"fg":"#000000","bg":"silver"},"ghostel-fake-cursor-box":{"fg":"silver"},
- "ghostel-color-black":{"fg":"pewter"},"ghostel-color-red":{"fg":"terracotta"},"ghostel-color-green":{"fg":"emerald"},"ghostel-color-yellow":{"fg":"gold"},
- "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"}}
-DASHBOARD_FACES=("dashboard-banner-logo-title dashboard-text-banner dashboard-heading "
- "dashboard-items-face dashboard-navigator dashboard-no-items-face dashboard-footer-face dashboard-footer-icon-face").split()
-DASHBOARD_SEED={
- "dashboard-banner-logo-title":{"fg":"gold","bold":True},"dashboard-text-banner":{"fg":"steel"},"dashboard-heading":{"fg":"blue","bold":True},
- "dashboard-items-face":{"fg":"#cdced1"},"dashboard-navigator":{"fg":"blue"},"dashboard-no-items-face":{"fg":"pewter"},
- "dashboard-footer-face":{"fg":"tan"},"dashboard-footer-icon-face":{"fg":"gold"}}
-# mu4e is not in the generated inventory (not loaded when it was built), so its
-# face list is curated from the set the dupre theme already themes.
-MU4E_FACES=("mu4e-title-face mu4e-context-face mu4e-modeline-face mu4e-ok-face mu4e-warning-face "
- "mu4e-header-title-face mu4e-header-key-face mu4e-header-value-face mu4e-header-face mu4e-header-highlight-face mu4e-header-marks-face "
- "mu4e-unread-face mu4e-flagged-face mu4e-replied-face mu4e-forwarded-face mu4e-draft-face mu4e-trashed-face mu4e-moved-face mu4e-related-face "
- "mu4e-contact-face mu4e-special-header-value-face mu4e-attach-number-face mu4e-url-number-face mu4e-link-face "
- "mu4e-cited-1-face mu4e-cited-2-face mu4e-cited-3-face mu4e-cited-4-face mu4e-cited-5-face mu4e-cited-6-face mu4e-cited-7-face "
- "mu4e-footer-face mu4e-region-code mu4e-system-face mu4e-highlight-face mu4e-compose-header-face mu4e-compose-separator-face").split()
-MU4E_SEED={
- "mu4e-title-face":{"fg":"blue","bold":True},"mu4e-context-face":{"fg":"blue","bold":True},"mu4e-modeline-face":{"fg":"silver"},"mu4e-ok-face":{"fg":"sage","bold":True},"mu4e-warning-face":{"fg":"gold","bold":True},
- "mu4e-header-title-face":{"fg":"blue","bold":True},"mu4e-header-key-face":{"fg":"blue","bold":True},"mu4e-header-value-face":{"fg":"silver"},"mu4e-header-face":{"fg":"#cdced1"},"mu4e-header-highlight-face":{"bg":"gunmetal"},"mu4e-header-marks-face":{"fg":"gold"},
- "mu4e-unread-face":{"fg":"white","bold":True},"mu4e-flagged-face":{"fg":"gold"},"mu4e-replied-face":{"fg":"silver"},"mu4e-forwarded-face":{"fg":"silver"},"mu4e-draft-face":{"fg":"steel","italic":True},"mu4e-trashed-face":{"fg":"pewter","strike":True},"mu4e-moved-face":{"fg":"steel","italic":True},"mu4e-related-face":{"fg":"steel","italic":True},
- "mu4e-contact-face":{"fg":"#cdced1"},"mu4e-special-header-value-face":{"fg":"silver"},"mu4e-attach-number-face":{"fg":"blue","bold":True},"mu4e-url-number-face":{"fg":"blue","bold":True},"mu4e-link-face":{"fg":"blue","underline":True},
- "mu4e-cited-1-face":{"fg":"silver"},"mu4e-cited-2-face":{"fg":"steel"},"mu4e-cited-3-face":{"fg":"sage"},"mu4e-cited-4-face":{"fg":"pewter"},"mu4e-cited-5-face":{"fg":"tan"},"mu4e-cited-6-face":{"fg":"terracotta"},"mu4e-cited-7-face":{"fg":"regal"},
- "mu4e-footer-face":{"fg":"pewter"},"mu4e-region-code":{"bg":"bg-dim"},"mu4e-system-face":{"fg":"pewter","italic":True},"mu4e-highlight-face":{"fg":"gold","bold":True},"mu4e-compose-header-face":{"fg":"blue","bold":True},"mu4e-compose-separator-face":{"fg":"pewter"}}
-LSP_FACES=("lsp-signature-face lsp-signature-highlight-function-argument lsp-signature-posframe "
- "lsp-face-highlight-read lsp-face-highlight-write lsp-face-highlight-textual lsp-face-rename lsp-rename-placeholder-face "
- "lsp-inlay-hint-face lsp-inlay-hint-parameter-face lsp-inlay-hint-type-face lsp-details-face "
- "lsp-installation-buffer-face lsp-installation-finished-buffer-face").split()
-LSP_SEED={
- "lsp-signature-face":{"fg":"silver"},"lsp-signature-highlight-function-argument":{"fg":"gold","bold":True},"lsp-signature-posframe":{"bg":"bg-dim"},
- "lsp-face-highlight-read":{"bg":"navy"},"lsp-face-highlight-write":{"bg":"#3d2f4a"},"lsp-face-highlight-textual":{"bg":"gunmetal"},
- "lsp-face-rename":{"bg":"gunmetal","bold":True},"lsp-rename-placeholder-face":{"fg":"gold","bold":True},
- "lsp-inlay-hint-face":{"fg":"pewter","italic":True},"lsp-inlay-hint-parameter-face":{"fg":"steel","italic":True},"lsp-inlay-hint-type-face":{"fg":"sage","italic":True},
- "lsp-details-face":{"fg":"pewter","italic":True},"lsp-installation-buffer-face":{"fg":"blue"},"lsp-installation-finished-buffer-face":{"fg":"sage"}}
-GITGUTTER_FACES=("git-gutter:added git-gutter:modified git-gutter:deleted git-gutter:unchanged git-gutter:separator").split()
-GITGUTTER_SEED={
- "git-gutter:added":{"fg":"emerald"},"git-gutter:modified":{"fg":"gold"},"git-gutter:deleted":{"fg":"terracotta"},
- "git-gutter:unchanged":{"fg":"pewter"},"git-gutter:separator":{"fg":"steel"}}
-FLYCHECK_FACES=("flycheck-error flycheck-warning flycheck-info flycheck-fringe-error flycheck-fringe-warning flycheck-fringe-info "
- "flycheck-delimited-error flycheck-error-delimiter flycheck-error-list-error flycheck-error-list-warning flycheck-error-list-info "
- "flycheck-error-list-error-message flycheck-error-list-checker-name flycheck-error-list-column-number flycheck-error-list-line-number "
- "flycheck-error-list-filename flycheck-error-list-id flycheck-error-list-id-with-explainer flycheck-error-list-highlight flycheck-verify-select-checker").split()
-FLYCHECK_SEED={
- "flycheck-error":{"fg":"terracotta"},"flycheck-warning":{"fg":"gold"},"flycheck-info":{"fg":"blue"},
- "flycheck-fringe-error":{"fg":"terracotta"},"flycheck-fringe-warning":{"fg":"gold"},"flycheck-fringe-info":{"fg":"blue"},
- "flycheck-delimited-error":{"fg":"terracotta"},"flycheck-error-delimiter":{"fg":"terracotta"},
- "flycheck-error-list-error":{"fg":"terracotta"},"flycheck-error-list-warning":{"fg":"gold"},"flycheck-error-list-info":{"fg":"blue"},
- "flycheck-error-list-error-message":{"fg":"#cdced1"},"flycheck-error-list-checker-name":{"fg":"steel"},
- "flycheck-error-list-column-number":{"fg":"pewter"},"flycheck-error-list-line-number":{"fg":"pewter"},"flycheck-error-list-filename":{"fg":"blue"},
- "flycheck-error-list-id":{"fg":"steel"},"flycheck-error-list-id-with-explainer":{"fg":"steel","bold":True},
- "flycheck-error-list-highlight":{"bg":"gunmetal"},"flycheck-verify-select-checker":{"fg":"gold"}}
-DIRED_FACES=("dired-header dired-directory dired-symlink dired-broken-symlink dired-special dired-set-id "
- "dired-perm-write dired-mark dired-marked dired-flagged dired-ignored dired-warning").split()
-DIRED_SEED={
- "dired-header":{"fg":"blue","bold":True},"dired-directory":{"fg":"blue","bold":True},"dired-symlink":{"fg":"sage"},
- "dired-broken-symlink":{"fg":"#de4949","bold":True},"dired-special":{"fg":"regal"},"dired-set-id":{"fg":"terracotta"},
- "dired-perm-write":{"fg":"silver"},"dired-mark":{"fg":"gold"},"dired-marked":{"fg":"gold","bold":True},
- "dired-flagged":{"fg":"terracotta","bold":True},"dired-ignored":{"fg":"pewter"},"dired-warning":{"fg":"gold","bold":True}}
-DIRVISH_FACES=("dirvish-inactive dirvish-free-space dirvish-hl-line dirvish-hl-line-inactive "
- "dirvish-file-modes dirvish-file-link-number dirvish-file-user-id dirvish-file-group-id dirvish-file-size dirvish-file-time "
- "dirvish-file-inode-number dirvish-file-device-number dirvish-subtree-guide dirvish-subtree-state "
- "dirvish-collapse-dir-face dirvish-collapse-empty-dir-face dirvish-collapse-file-face dirvish-emerge-group-title "
- "dirvish-media-info-heading dirvish-media-info-property-key dirvish-narrow-match-face-0 dirvish-narrow-match-face-1 "
- "dirvish-narrow-match-face-2 dirvish-narrow-match-face-3 dirvish-narrow-split dirvish-proc-running dirvish-proc-finished "
- "dirvish-proc-failed dirvish-git-commit-message-face dirvish-vc-added-state dirvish-vc-edited-state dirvish-vc-removed-state "
- "dirvish-vc-conflict-state dirvish-vc-locked-state dirvish-vc-missing-state dirvish-vc-needs-merge-face "
- "dirvish-vc-needs-update-state dirvish-vc-unregistered-face").split()
-DIRVISH_SEED={
- "dirvish-inactive":{"fg":"pewter"},"dirvish-free-space":{"fg":"sage"},"dirvish-hl-line":{"bg":"gunmetal"},"dirvish-hl-line-inactive":{"bg":"bg-dim"},
- "dirvish-file-modes":{"fg":"steel"},"dirvish-file-link-number":{"fg":"pewter"},"dirvish-file-user-id":{"fg":"blue"},"dirvish-file-group-id":{"fg":"steel"},
- "dirvish-file-size":{"fg":"sage"},"dirvish-file-time":{"fg":"pewter"},"dirvish-file-inode-number":{"fg":"pewter"},"dirvish-file-device-number":{"fg":"pewter"},
- "dirvish-subtree-guide":{"fg":"pewter"},"dirvish-subtree-state":{"fg":"steel"},"dirvish-collapse-dir-face":{"fg":"blue"},
- "dirvish-collapse-empty-dir-face":{"fg":"pewter"},"dirvish-collapse-file-face":{"fg":"silver"},"dirvish-emerge-group-title":{"fg":"gold","bold":True},
- "dirvish-media-info-heading":{"fg":"blue","bold":True},"dirvish-media-info-property-key":{"fg":"steel"},
- "dirvish-narrow-match-face-0":{"fg":"gold","bold":True},"dirvish-narrow-match-face-1":{"fg":"blue","bold":True},
- "dirvish-narrow-match-face-2":{"fg":"emerald","bold":True},"dirvish-narrow-match-face-3":{"fg":"regal","bold":True},"dirvish-narrow-split":{"fg":"pewter"},
- "dirvish-proc-running":{"fg":"gold"},"dirvish-proc-finished":{"fg":"sage"},"dirvish-proc-failed":{"fg":"terracotta"},
- "dirvish-git-commit-message-face":{"fg":"tan","italic":True},"dirvish-vc-added-state":{"fg":"sage"},"dirvish-vc-edited-state":{"fg":"gold"},
- "dirvish-vc-removed-state":{"fg":"terracotta"},"dirvish-vc-conflict-state":{"fg":"terracotta","bold":True},"dirvish-vc-locked-state":{"fg":"blue"},
- "dirvish-vc-missing-state":{"fg":"terracotta"},"dirvish-vc-needs-merge-face":{"fg":"gold"},"dirvish-vc-needs-update-state":{"fg":"gold"},
- "dirvish-vc-unregistered-face":{"fg":"pewter"}}
-ORGDRILL_FACES=("org-drill-hidden-cloze-face org-drill-visible-cloze-face org-drill-visible-cloze-hint-face").split()
-ORGDRILL_SEED={"org-drill-hidden-cloze-face":{"fg":"#000000","bg":"steel"},"org-drill-visible-cloze-face":{"fg":"gold","bold":True},"org-drill-visible-cloze-hint-face":{"fg":"pewter","italic":True}}
-ORGNOTER_FACES=("org-noter-notes-exist-face org-noter-no-notes-exist-face").split()
-ORGNOTER_SEED={"org-noter-notes-exist-face":{"fg":"sage"},"org-noter-no-notes-exist-face":{"fg":"pewter"}}
-SIGNEL_FACES=("signel-timestamp-face signel-my-msg-face signel-other-msg-face signel-error-face").split()
-SIGNEL_SEED={"signel-timestamp-face":{"fg":"pewter"},"signel-my-msg-face":{"fg":"blue"},"signel-other-msg-face":{"fg":"silver"},"signel-error-face":{"fg":"terracotta","bold":True}}
-PEARL_FACES=("pearl-preamble-summary pearl-editable-comment pearl-readonly-comment pearl-modified-highlight pearl-modified-local pearl-modified-unknown").split()
-PEARL_SEED={"pearl-preamble-summary":{"fg":"blue","bold":True},"pearl-editable-comment":{"fg":"silver"},"pearl-readonly-comment":{"fg":"pewter","italic":True},"pearl-modified-highlight":{"bg":"navy"},"pearl-modified-local":{"fg":"gold"},"pearl-modified-unknown":{"fg":"pewter"}}
-CALIBREDB_FACES=("calibredb-search-header-library-name-face calibredb-search-header-library-path-face calibredb-search-header-total-face calibredb-search-header-filter-face calibredb-search-header-sort-face calibredb-search-header-highlight-face "
- "calibredb-id-face calibredb-title-face calibredb-author-face calibredb-format-face calibredb-size-face calibredb-tag-face calibredb-date-face calibredb-mark-face calibredb-series-face calibredb-publisher-face calibredb-pubdate-face "
- "calibredb-language-face calibredb-comment-face calibredb-archive-face calibredb-favorite-face calibredb-file-face calibredb-ids-face calibredb-highlight-face calibredb-current-page-button-face calibredb-mouse-face "
- "calibredb-title-detailed-view-face calibredb-edit-annotation-header-title-face").split()
-CALIBREDB_SEED={
- "calibredb-search-header-library-name-face":{"fg":"blue","bold":True},"calibredb-search-header-library-path-face":{"fg":"pewter"},"calibredb-search-header-total-face":{"fg":"sage"},"calibredb-search-header-filter-face":{"fg":"gold"},"calibredb-search-header-sort-face":{"fg":"steel"},"calibredb-search-header-highlight-face":{"fg":"gold","bold":True},
- "calibredb-id-face":{"fg":"pewter"},"calibredb-title-face":{"fg":"blue","bold":True},"calibredb-author-face":{"fg":"sage"},"calibredb-format-face":{"fg":"steel"},"calibredb-size-face":{"fg":"pewter"},"calibredb-tag-face":{"fg":"tan"},"calibredb-date-face":{"fg":"pewter"},"calibredb-mark-face":{"fg":"gold","bold":True},"calibredb-series-face":{"fg":"regal"},"calibredb-publisher-face":{"fg":"steel"},"calibredb-pubdate-face":{"fg":"pewter"},
- "calibredb-language-face":{"fg":"steel"},"calibredb-comment-face":{"fg":"silver","italic":True},"calibredb-archive-face":{"fg":"pewter"},"calibredb-favorite-face":{"fg":"gold"},"calibredb-file-face":{"fg":"blue"},"calibredb-ids-face":{"fg":"pewter"},"calibredb-highlight-face":{"fg":"gold","bold":True},"calibredb-current-page-button-face":{"fg":"blue","bold":True},"calibredb-mouse-face":{"bg":"gunmetal"},
- "calibredb-title-detailed-view-face":{"fg":"gold","bold":True},"calibredb-edit-annotation-header-title-face":{"fg":"blue","bold":True}}
-ERC_FACES=("erc-header-line erc-timestamp-face erc-notice-face erc-default-face erc-current-nick-face erc-my-nick-face erc-my-nick-prefix-face erc-nick-default-face erc-nick-prefix-face erc-button-nick-default-face "
- "erc-nick-msg-face erc-direct-msg-face erc-action-face erc-keyword-face erc-pal-face erc-fool-face erc-dangerous-host-face erc-error-face erc-input-face erc-prompt-face erc-command-indicator-face erc-information "
- "erc-button erc-bold-face erc-italic-face erc-underline-face erc-inverse-face erc-spoiler-face erc-fill-wrap-merge-indicator-face erc-keep-place-indicator-arrow erc-keep-place-indicator-line").split()
-ERC_SEED={
- "erc-header-line":{"fg":"white","bg":"gunmetal","bold":True},"erc-timestamp-face":{"fg":"pewter"},"erc-notice-face":{"fg":"steel"},"erc-default-face":{"fg":"#cdced1"},"erc-current-nick-face":{"fg":"gold","bold":True},"erc-my-nick-face":{"fg":"gold","bold":True},"erc-my-nick-prefix-face":{"fg":"gold"},"erc-nick-default-face":{"fg":"blue"},"erc-nick-prefix-face":{"fg":"sage"},"erc-button-nick-default-face":{"fg":"blue"},
- "erc-nick-msg-face":{"fg":"regal"},"erc-direct-msg-face":{"fg":"regal"},"erc-action-face":{"fg":"sage","italic":True},"erc-keyword-face":{"fg":"gold","bold":True},"erc-pal-face":{"fg":"emerald"},"erc-fool-face":{"fg":"pewter"},"erc-dangerous-host-face":{"fg":"terracotta","bold":True},"erc-error-face":{"fg":"terracotta","bold":True},"erc-input-face":{"fg":"silver"},"erc-prompt-face":{"fg":"blue","bold":True},"erc-command-indicator-face":{"fg":"steel","bold":True},"erc-information":{"fg":"steel"},
- "erc-button":{"fg":"blue"},"erc-bold-face":{"bold":True},"erc-italic-face":{"italic":True},"erc-underline-face":{"fg":"silver","underline":True},"erc-inverse-face":{"fg":"#000000","bg":"silver"},"erc-spoiler-face":{"fg":"#000000","bg":"gunmetal"},"erc-fill-wrap-merge-indicator-face":{"fg":"pewter"},"erc-keep-place-indicator-arrow":{"fg":"gold"},"erc-keep-place-indicator-line":{"bg":"bg-dim"}}
-SLACK_FACES=("slack-room-info-title-face slack-room-info-title-room-name-face slack-room-info-section-title-face slack-room-info-section-label-face slack-room-unread-face "
- "slack-message-output-header slack-message-output-text slack-message-output-reaction slack-message-output-reaction-pressed slack-message-deleted-face slack-new-message-marker-face slack-all-thread-buffer-thread-header-face "
- "slack-message-mention-face slack-message-mention-me-face slack-message-mention-keyword-face slack-channel-button-face "
- "slack-mrkdwn-bold-face slack-mrkdwn-italic-face slack-mrkdwn-code-face slack-mrkdwn-code-block-face slack-mrkdwn-strike-face slack-mrkdwn-blockquote-face slack-mrkdwn-list-face "
- "slack-attachment-header slack-attachment-footer slack-attachment-pad slack-attachment-field-title slack-message-attachment-preview-header-face slack-preview-face slack-block-highlight-source-overlay-face "
- "slack-message-action-face slack-message-action-primary-face slack-message-action-danger-face "
- "slack-button-block-element-face slack-button-primary-block-element-face slack-button-danger-block-element-face slack-select-block-element-face slack-overflow-block-element-face slack-date-picker-block-element-face "
- "slack-dialog-title-face slack-dialog-element-label-face slack-dialog-element-hint-face slack-dialog-element-placeholder-face slack-dialog-element-error-face slack-dialog-submit-button-face slack-dialog-cancel-button-face slack-dialog-select-element-input-face "
- "slack-user-active-face slack-user-dnd-face slack-user-profile-header-face slack-user-profile-property-name-face slack-profile-image-face "
- "slack-search-result-message-header-face slack-search-result-message-username-face "
- "slack-modeline-has-unreads-face slack-modeline-channel-has-unreads-face slack-modeline-thread-has-unreads-face").split()
-SLACK_SEED={
- "slack-room-info-title-face":{"fg":"blue","bold":True},"slack-room-info-title-room-name-face":{"fg":"gold","bold":True},"slack-room-info-section-title-face":{"fg":"blue","bold":True},"slack-room-info-section-label-face":{"fg":"steel"},"slack-room-unread-face":{"fg":"white","bold":True},
- "slack-message-output-header":{"fg":"blue","bold":True},"slack-message-output-text":{"fg":"#cdced1"},"slack-message-output-reaction":{"fg":"steel"},"slack-message-output-reaction-pressed":{"fg":"gold","bold":True},"slack-message-deleted-face":{"fg":"pewter","italic":True},"slack-new-message-marker-face":{"fg":"terracotta","bold":True},"slack-all-thread-buffer-thread-header-face":{"fg":"blue","bold":True},
- "slack-message-mention-face":{"fg":"blue"},"slack-message-mention-me-face":{"fg":"gold","bg":"navy","bold":True},"slack-message-mention-keyword-face":{"fg":"gold","bold":True},"slack-channel-button-face":{"fg":"blue"},
- "slack-mrkdwn-bold-face":{"bold":True},"slack-mrkdwn-italic-face":{"italic":True},"slack-mrkdwn-code-face":{"fg":"terracotta"},"slack-mrkdwn-code-block-face":{"fg":"terracotta","bg":"bg-dim"},"slack-mrkdwn-strike-face":{"fg":"pewter","strike":True},"slack-mrkdwn-blockquote-face":{"fg":"silver","italic":True},"slack-mrkdwn-list-face":{"fg":"silver"},
- "slack-attachment-header":{"fg":"blue","bold":True},"slack-attachment-footer":{"fg":"pewter"},"slack-attachment-pad":{"fg":"pewter"},"slack-attachment-field-title":{"fg":"steel","bold":True},"slack-message-attachment-preview-header-face":{"fg":"blue"},"slack-preview-face":{"fg":"silver"},"slack-block-highlight-source-overlay-face":{"bg":"bg-dim"},
- "slack-message-action-face":{"fg":"blue"},"slack-message-action-primary-face":{"fg":"sage"},"slack-message-action-danger-face":{"fg":"terracotta"},
- "slack-button-block-element-face":{"fg":"silver"},"slack-button-primary-block-element-face":{"fg":"sage","bold":True},"slack-button-danger-block-element-face":{"fg":"terracotta","bold":True},"slack-select-block-element-face":{"fg":"blue"},"slack-overflow-block-element-face":{"fg":"steel"},"slack-date-picker-block-element-face":{"fg":"blue"},
- "slack-dialog-title-face":{"fg":"blue","bold":True},"slack-dialog-element-label-face":{"fg":"steel"},"slack-dialog-element-hint-face":{"fg":"pewter","italic":True},"slack-dialog-element-placeholder-face":{"fg":"pewter"},"slack-dialog-element-error-face":{"fg":"terracotta"},"slack-dialog-submit-button-face":{"fg":"sage","bold":True},"slack-dialog-cancel-button-face":{"fg":"silver"},"slack-dialog-select-element-input-face":{"fg":"silver"},
- "slack-user-active-face":{"fg":"sage"},"slack-user-dnd-face":{"fg":"terracotta"},"slack-user-profile-header-face":{"fg":"blue","bold":True},"slack-user-profile-property-name-face":{"fg":"steel"},"slack-profile-image-face":{"fg":"pewter"},
- "slack-search-result-message-header-face":{"fg":"blue"},"slack-search-result-message-username-face":{"fg":"gold","bold":True},
- "slack-modeline-has-unreads-face":{"fg":"gold"},"slack-modeline-channel-has-unreads-face":{"fg":"gold","bold":True},"slack-modeline-thread-has-unreads-face":{"fg":"gold"}}
-TELEGA_FACES=("telega-root-heading telega-tracking telega-unread-unmuted-modeline telega-username telega-user-online-status telega-user-non-online-status telega-secret-title telega-contact-birthdays-today "
- "telega-muted-count telega-unmuted-count telega-mention-count telega-has-chatbuf-brackets telega-delim-face telega-shadow telega-link telega-blue telega-red "
- "telega-msg-heading telega-msg-user-title telega-msg-self-title telega-msg-deleted telega-msg-sponsored telega-msg-inline-reply telega-msg-inline-forward telega-msg-inline-other "
- "telega-entity-type-bold telega-entity-type-italic telega-entity-type-underline telega-entity-type-strikethrough telega-entity-type-code telega-entity-type-pre telega-entity-type-blockquote telega-entity-type-mention telega-entity-type-hashtag telega-entity-type-cashtag telega-entity-type-botcommand telega-entity-type-texturl telega-entity-type-spoiler "
- "telega-reaction telega-reaction-chosen telega-reaction-paid telega-reaction-paid-chosen telega-highlight-text-face telega-button-highlight "
- "telega-chat-prompt telega-chat-prompt-aux telega-chat-input-attachment telega-topic-button telega-filter-active telega-filter-button-active telega-filter-button-inactive telega-checklist-stats-done telega-checklist-stats-todo "
- "telega-box-button telega-box-button-active telega-box-button-default-active telega-box-button-default-passive telega-box-button-primary-active telega-box-button-primary-passive telega-box-button-success-active telega-box-button-success-passive telega-box-button-danger-active telega-box-button-danger-passive telega-box-button-ui-active telega-box-button-ui-passive telega-box-button2-active telega-box-button2-passive telega-box-button2-white-foreground "
- "telega-describe-item-title telega-describe-section-title telega-describe-subsection-title telega-enckey-00 telega-enckey-01 telega-enckey-10 telega-enckey-11 "
- "telega-palette-builtin-blue telega-palette-builtin-green telega-palette-builtin-orange telega-palette-builtin-purple "
- "telega-webpage-title telega-webpage-subtitle telega-webpage-header telega-webpage-subheader telega-webpage-outline telega-webpage-fixed telega-webpage-preformatted telega-webpage-marked telega-webpage-strike-through telega-webpage-chat-link telega-link-preview-sitename telega-link-preview-title").split()
-TELEGA_SEED={
- "telega-root-heading":{"fg":"blue","bold":True},"telega-tracking":{"fg":"gold"},"telega-unread-unmuted-modeline":{"fg":"gold","bold":True},"telega-username":{"fg":"blue"},"telega-user-online-status":{"fg":"sage"},"telega-user-non-online-status":{"fg":"pewter"},"telega-secret-title":{"fg":"sage"},"telega-contact-birthdays-today":{"fg":"gold"},
- "telega-muted-count":{"fg":"pewter"},"telega-unmuted-count":{"fg":"gold","bold":True},"telega-mention-count":{"fg":"gold","bold":True},"telega-has-chatbuf-brackets":{"fg":"steel"},"telega-delim-face":{"fg":"pewter"},"telega-shadow":{"fg":"pewter"},"telega-link":{"fg":"blue"},"telega-blue":{"fg":"blue"},"telega-red":{"fg":"terracotta"},
- "telega-msg-heading":{"fg":"steel"},"telega-msg-user-title":{"fg":"blue","bold":True},"telega-msg-self-title":{"fg":"gold","bold":True},"telega-msg-deleted":{"fg":"pewter","italic":True},"telega-msg-sponsored":{"fg":"pewter","italic":True},"telega-msg-inline-reply":{"fg":"steel"},"telega-msg-inline-forward":{"fg":"sage"},"telega-msg-inline-other":{"fg":"pewter"},
- "telega-entity-type-bold":{"bold":True},"telega-entity-type-italic":{"italic":True},"telega-entity-type-underline":{"fg":"silver","underline":True},"telega-entity-type-strikethrough":{"fg":"pewter","strike":True},"telega-entity-type-code":{"fg":"terracotta"},"telega-entity-type-pre":{"fg":"terracotta","bg":"bg-dim"},"telega-entity-type-blockquote":{"fg":"silver","italic":True},"telega-entity-type-mention":{"fg":"blue"},"telega-entity-type-hashtag":{"fg":"blue"},"telega-entity-type-cashtag":{"fg":"sage"},"telega-entity-type-botcommand":{"fg":"sage"},"telega-entity-type-texturl":{"fg":"blue"},"telega-entity-type-spoiler":{"fg":"gunmetal","bg":"gunmetal"},
- "telega-reaction":{"fg":"steel"},"telega-reaction-chosen":{"fg":"gold","bold":True},"telega-reaction-paid":{"fg":"gold"},"telega-reaction-paid-chosen":{"fg":"gold","bold":True},"telega-highlight-text-face":{"fg":"#000000","bg":"gold"},"telega-button-highlight":{"fg":"gold","bold":True},
- "telega-chat-prompt":{"fg":"blue","bold":True},"telega-chat-prompt-aux":{"fg":"steel"},"telega-chat-input-attachment":{"fg":"sage"},"telega-topic-button":{"fg":"blue"},"telega-filter-active":{"fg":"gold","bold":True},"telega-filter-button-active":{"fg":"#000000","bg":"gold"},"telega-filter-button-inactive":{"fg":"steel"},"telega-checklist-stats-done":{"fg":"sage"},"telega-checklist-stats-todo":{"fg":"steel"},
- "telega-box-button":{"fg":"blue"},"telega-box-button-active":{"fg":"#000000","bg":"blue"},"telega-box-button-default-active":{"fg":"#000000","bg":"silver"},"telega-box-button-default-passive":{"fg":"steel"},"telega-box-button-primary-active":{"fg":"#000000","bg":"blue"},"telega-box-button-primary-passive":{"fg":"blue"},"telega-box-button-success-active":{"fg":"#000000","bg":"emerald"},"telega-box-button-success-passive":{"fg":"sage"},"telega-box-button-danger-active":{"fg":"#000000","bg":"terracotta"},"telega-box-button-danger-passive":{"fg":"terracotta"},"telega-box-button-ui-active":{"fg":"#000000","bg":"gold"},"telega-box-button-ui-passive":{"fg":"gold"},"telega-box-button2-active":{"fg":"#000000","bg":"blue"},"telega-box-button2-passive":{"fg":"steel"},"telega-box-button2-white-foreground":{"fg":"white"},
- "telega-describe-item-title":{"fg":"steel","bold":True},"telega-describe-section-title":{"fg":"blue","bold":True},"telega-describe-subsection-title":{"fg":"blue"},"telega-enckey-00":{"fg":"pewter"},"telega-enckey-01":{"fg":"sage"},"telega-enckey-10":{"fg":"gold"},"telega-enckey-11":{"fg":"blue"},
- "telega-palette-builtin-blue":{"fg":"blue"},"telega-palette-builtin-green":{"fg":"emerald"},"telega-palette-builtin-orange":{"fg":"terracotta"},"telega-palette-builtin-purple":{"fg":"regal"},
- "telega-webpage-title":{"fg":"blue","bold":True},"telega-webpage-subtitle":{"fg":"steel"},"telega-webpage-header":{"fg":"gold","bold":True},"telega-webpage-subheader":{"fg":"gold"},"telega-webpage-outline":{"fg":"pewter"},"telega-webpage-fixed":{"fg":"terracotta"},"telega-webpage-preformatted":{"fg":"terracotta","bg":"bg-dim"},"telega-webpage-marked":{"fg":"#000000","bg":"gold"},"telega-webpage-strike-through":{"fg":"pewter","strike":True},"telega-webpage-chat-link":{"fg":"blue"},"telega-link-preview-sitename":{"fg":"steel"},"telega-link-preview-title":{"fg":"blue","bold":True}}
-# shr is built-in (not in the inventory). It is the HTML renderer behind nov
-# (EPUB), eww, elfeed article view, and HTML mail, so theming it themes them all.
-SHR_FACES=("shr-h1 shr-h2 shr-h3 shr-h4 shr-h5 shr-h6 shr-text shr-link shr-selected-link "
- "shr-code shr-mark shr-strike-through shr-sup shr-abbreviation shr-sliced-image").split()
-SHR_SEED={
- "shr-h1":{"fg":"gold","bold":True,"height":1.4},"shr-h2":{"fg":"blue","bold":True,"height":1.2},"shr-h3":{"fg":"blue","bold":True},"shr-h4":{"fg":"silver","bold":True},"shr-h5":{"fg":"steel","bold":True},"shr-h6":{"fg":"pewter","bold":True},
- "shr-text":{"fg":"#cdced1"},"shr-link":{"fg":"blue","underline":True},"shr-selected-link":{"fg":"gold","bold":True,"underline":True},"shr-code":{"fg":"terracotta","bg":"bg-dim"},"shr-mark":{"fg":"#000000","bg":"gold"},"shr-strike-through":{"fg":"pewter","strike":True},"shr-sup":{"fg":"steel"},"shr-abbreviation":{"fg":"steel","italic":True},"shr-sliced-image":{"fg":"pewter"}}
-def _faces(names,prefix,seed):
- out=[]
- for f in names:
- lbl=(f[len(prefix):] if f.startswith(prefix) else f).replace("-face","").replace("-"," ")
- out.append([f,lbl,seed.get(f,{})])
- return out
-APPS={"org-mode":{"label":"org-mode","preview":"org","faces":_faces(ORG_FACES,"org-",ORG_SEED)},
- "magit":{"label":"magit","preview":"magit","faces":_faces(MAGIT_FACES,"magit-",MAGIT_SEED)},
- "elfeed":{"label":"elfeed","preview":"elfeed","faces":_faces(ELFEED_FACES,"elfeed-",ELFEED_SEED)},
- "mu4e":{"label":"mu4e","preview":"mu4e","faces":_faces(MU4E_FACES,"mu4e-",MU4E_SEED)},
- "ghostel":{"label":"ghostel","preview":"ghostel","faces":_faces(GHOSTEL_FACES,"ghostel-",GHOSTEL_SEED)},
- "dashboard":{"label":"dashboard","preview":"dashboard","faces":_faces(DASHBOARD_FACES,"dashboard-",DASHBOARD_SEED)},
- "lsp-mode":{"label":"lsp-mode","preview":"lsp","faces":_faces(LSP_FACES,"lsp-",LSP_SEED)},
- "git-gutter":{"label":"git-gutter","preview":"gitgutter","faces":_faces(GITGUTTER_FACES,"git-gutter:",GITGUTTER_SEED)},
- "flycheck":{"label":"flycheck","preview":"flycheck","faces":_faces(FLYCHECK_FACES,"flycheck-",FLYCHECK_SEED)},
- "dired":{"label":"dired","preview":"dired","faces":_faces(DIRED_FACES,"dired-",DIRED_SEED)},
- "dirvish":{"label":"dirvish","preview":"dirvish","faces":_faces(DIRVISH_FACES,"dirvish-",DIRVISH_SEED)},
- "calibredb":{"label":"calibredb","preview":"calibredb","faces":_faces(CALIBREDB_FACES,"calibredb-",CALIBREDB_SEED)},
- "erc":{"label":"erc","preview":"erc","faces":_faces(ERC_FACES,"erc-",ERC_SEED)},
- "org-drill":{"label":"org-drill","preview":"orgdrill","faces":_faces(ORGDRILL_FACES,"org-drill-",ORGDRILL_SEED)},
- "org-noter":{"label":"org-noter","preview":"orgnoter","faces":_faces(ORGNOTER_FACES,"org-noter-",ORGNOTER_SEED)},
- "signel":{"label":"signel","preview":"signel","faces":_faces(SIGNEL_FACES,"signel-",SIGNEL_SEED)},
- "pearl":{"label":"pearl","preview":"pearl","faces":_faces(PEARL_FACES,"pearl-",PEARL_SEED)},
- "slack":{"label":"slack","preview":"slack","faces":_faces(SLACK_FACES,"slack-",SLACK_SEED)},
- "telega":{"label":"telega","preview":"telega","faces":_faces(TELEGA_FACES,"telega-",TELEGA_SEED)},
- "shr":{"label":"shr (HTML: nov/eww/mail)","preview":"shr","faces":_faces(SHR_FACES,"shr-",SHR_SEED)}}
-# 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")
-if os.path.exists(_inv_path):
- _INV=json.load(open(_inv_path))
- _BESPOKE={"magit","elfeed","org","org-mode","mu4e","ghostel","dashboard","lsp-mode","git-gutter","flycheck","dired","dirvish","calibredb","erc","org-drill","org-noter","signel","pearl","slack","telega","shr"}
- for _pkg in sorted(_INV):
- if _pkg in _BESPOKE or _pkg in APPS: continue
- APPS[_pkg]={"label":_pkg,"preview":"generic","faces":[
- [f,(f[len(_pkg)+1:] if f.startswith(_pkg+"-") else f).replace("-face","").replace("-"," "),{}]
- for f in _INV[_pkg]]}
-HTML = """<!doctype html><meta charset=utf-8><title>theme-selector</title>
-<style>
- body{background:#0d0b0a;color:#cdced1;font:15px/1.55 monospace;margin:20px}
- h1{font-size:22px;font-weight:normal;color:#e8bd30;margin:26px 0 10px;border-bottom:1px solid #252321;padding-bottom:6px}
- h2{font-size:10pt;color:#8a9496;font-weight:normal;margin:0 0 4px}
- .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 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}
- .cat{color:#b4b1a2} .ex{font-size:17px}
- .sbtn{width:26px;height:24px;border:1px solid #3a3a3a;border-radius:3px;background:#eaeaea;color:#111;cursor:pointer;font-size:15px;margin-right:2px;padding:0}
- .sbtn.on{background:#0d0b0a;color:#cdced1;border-color:#8a9496}
- .pals{display:flex;gap:8px;flex-wrap:wrap}
- .pchip{width:128px;height:58px;border-radius:6px;border:1px solid #555;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:grab}
- .pchip.drag{opacity:.4} .pchip.sel{outline:3px solid #e8bd30;outline-offset:2px} .pchip.over{outline:2px dashed #e8bd30;outline-offset:1px} .pchip input.nm{background:transparent;border:none;text-align:center;font:bold 10pt monospace;width:108px;outline:none}
- .pchip .mv{position:absolute;bottom:-1px;background:none;border:none;cursor:pointer;font-size:22px;line-height:1;font-weight:bold;opacity:.5;padding:0 5px} .pchip .mv:hover{opacity:1} .pchip .mv.l{left:0} .pchip .mv.r{right:0}
- .pchip .hx{font-size:10pt;opacity:.8} .pchip .rm{position:absolute;top:2px;right:5px;background:none;border:none;cursor:pointer;font-size:14px;font-weight:bold;opacity:.7}
- .pchip .lock{position:absolute;top:3px;right:5px;font-size:10px;opacity:.6}
- .palctl{margin-top:12px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
- .palctl input[type=text]{background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace}
- .palctl input[type=text]::placeholder{color:#b4b1a2;opacity:1}
- .palctl{position:relative}
- .swatch{width:128px;height:58px;border:1px solid #555;border-radius:6px;cursor:pointer;background:#888}
- .picker{display:none;position:absolute;top:66px;left:0;z-index:60;background:#161412;border:1px solid #3a3a3a;border-radius:8px;padding:12px;box-shadow:0 10px 30px #000b;width:470px}
- .picker .prow{display:flex;gap:10px}
- .sv{position:relative;width:400px;height:320px;border-radius:4px;cursor:crosshair}
- .svmask{position:absolute;inset:0;pointer-events:none;border-radius:4px}
- .pmode{margin:2px 2px 8px;font:10pt monospace;color:#b4b1a2;display:flex;gap:6px;align-items:center}
- .pmode button{background:#252321;color:#cdced1;border:1px solid #3a3a3a;border-radius:4px;padding:2px 9px;font:10pt monospace;cursor:pointer}
- .pmode button.on{background:#e8bd30;color:#000;border-color:#e8bd30}
- .svcur{position:absolute;width:16px;height:16px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #0008;pointer-events:none}
- .hue{position:relative;width:34px;height:320px;border-radius:4px;cursor:ns-resize;background:linear-gradient(to bottom,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)}
- .huecur{position:absolute;left:-2px;right:-2px;height:4px;background:#fff;border:1px solid #0008;transform:translateY(-50%);pointer-events:none}
- .pinfo{display:flex;justify-content:space-between;margin:10px 2px 8px;font:12pt monospace;color:#cdced1}
- .pkchips{display:flex;flex-wrap:wrap;gap:5px} .pkchips .pc{width:28px;height:28px;border-radius:3px;border:1px solid #555;cursor:pointer}
- .palctl button,.filebar button,.fbtn{background:#252321;color:#e8bd30;border:1px solid #3a3a3a;border-radius:4px;padding:6px 12px;font:10pt monospace;cursor:pointer}
- #palmsg{font:10pt monospace;opacity:0;transition:opacity .35s;margin-left:6px}
- #export{width:100%;height:180px;margin-top:10px;background:#0d0b0a;color:#a4ac64;border:1px solid #252321;border-radius:6px;font:10pt monospace;padding:10px}
- .filebar{margin:6px 0 0;display:flex;gap:8px;align-items:center}
- #pagetitle{font-size:30px;color:#cdced1;font-weight:normal;border:none;margin:4px 0 18px;padding:0}
- .cols{display:flex;gap:28px;align-items:flex-start} .cols.stretch{align-items:stretch}
- .pane{min-width:0} .pane.grow{flex:1} .pane.saveload{flex:0 0 auto;margin-left:auto}
- .pane h1{margin-top:0}
- .filebar.end{justify-content:flex-end} .langbar{margin-bottom:10px;display:flex;gap:8px;align-items:center}
- .pkgbar{margin:0 0 10px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
- .pkgbar button{background:#252321;color:#e8bd30;border:1px solid #3a3a3a;border-radius:4px;padding:6px 12px;font:10pt monospace;cursor:pointer}
- .hstep{background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:3px 4px;font:10pt monospace;width:56px}
- #pkgbody td{padding:3px 8px}
- #codepre{width:100%;box-sizing:border-box}
- .mock{border:1px solid #252321;border-radius:8px;overflow:hidden;font:12pt/1.7 monospace;display:flex;flex-direction:column}
- .mock .mbuf{flex:1} .mock .ln{display:flex;align-items:stretch;white-space:pre}
- .mock .fr{width:14px;flex:0 0 auto;border-right:1px solid #ffffff14} .mock .num{width:36px;flex:0 0 auto;text-align:right;padding-right:10px}
- .mock .cd{flex:1;padding-left:8px} .mock .bar,.mock .echo{padding:4px 10px;white-space:pre}
- #codepre [data-k],.mock [data-k],.mock [data-face]{cursor:pointer}
- @keyframes flashcell{0%,55%{background:#e8bd3066}100%{background:transparent}}
- tr.flash td{animation:flashcell 1.1s ease-out}
- @keyframes flashtok{0%,55%{background:#e8bd30aa;color:#000}100%{background:transparent}}
- #codepre .flashtok,.ex.flashtok{animation:flashtok 1.1s ease-out;border-radius:2px}
-</style>
-<h1 id="pagetitle">Untitled: theme</h1>
-<div class="cols">
- <section class="pane grow">
- <h1>palette</h1>
- <div class="pals" id="pals"></div>
- <div class="palctl">
- <div id="swatch" class="swatch" title="open color picker"></div>
- <input type="text" id="newhexstr" placeholder="#rrggbb" value="#888888" oninput="syncHex()" onkeydown="if(event.key==='Enter')applyEdit()" style="width:110px">
- <input type="text" id="newname" placeholder="name" onkeydown="if(event.key==='Enter')applyEdit()">
- <button onclick="addColor()">+ add color</button>
- <button onclick="updateColor()">&#8635; update selected</button>
- <span id="palmsg"></span>
- <div id="picker" class="picker">
- <div class="prow">
- <div id="sv" class="sv"><canvas id="svmask" class="svmask"></canvas><div id="svcur" class="svcur"></div></div>
- <div id="hue" class="hue"><div id="huecur" class="huecur"></div></div>
- </div>
- <div class="pinfo"><span id="pkhex">#888888</span><span id="pkcon"></span></div>
- <div class="pmode">limit <button data-m="any" class="on">any</button><button data-m="aa">AA+</button><button data-m="aaa">AAA</button></div>
- <div id="pkchips" class="pkchips"></div>
- </div>
- </div>
- </section>
- <section class="pane saveload">
- <h1>export, import, and save</h1>
- <div class="filebar end">
- <label style="color:#b4b1a2">theme name</label><input type="text" id="themename" value="" placeholder="untitled" oninput="updateTitle()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:200px">
- </div>
- <div class="filebar end">
- <button id="savebtn" onclick="saveTheme()" style="display:none">&#128190; save</button>
- <button onclick="exportTheme()">&#11015; export</button>
- <button class="fbtn" onclick="importTheme()">&#11014; import</button><input type="file" id="fileinput" accept=".json" onchange="importFile(event)" style="display:none">
- <button id="jsonbtn" onclick="toggleJSON()">show</button>
- </div>
- <textarea id="export" style="display:none" readonly></textarea>
- </section>
-</div>
-<h1>code/color assignments</h1>
-<div class="cols">
- <section class="pane">
- <table class="leg" id="legtable"><thead><tr><th onclick="srt(1)">elements &#9651;</th><th onclick="srt(0)">color &#9651;</th><th>style</th><th>example</th><th title="WCAG contrast of this color on the background">contrast</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()"></select></div>
- <pre id="codepre"></pre>
- </section>
-</div>
-<h1>ui faces</h1>
-<div class="cols stretch">
- <section class="pane">
- <table class="leg" id="uitable"><thead><tr><th onclick="srtTable('uibody',0)">face &#9651;</th><th onclick="srtTable('uibody',1)">foreground &#9651;</th><th onclick="srtTable('uibody',2)">background &#9651;</th><th>style</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>
- <div id="mockframe" class="mock"></div>
- </section>
-</div>
-<h1>package faces</h1>
-<div class="pkgbar">
- <label style="color:#b4b1a2">application</label><select id="appsel" class="chip" style="width:auto;font:bold 10pt monospace"></select>
- <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()">&#8635; reset all</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 onclick="srtTable('pkgbody',1)">fg &#9651;</th><th onclick="srtTable('pkgbody',2)">bg &#9651;</th><th>style</th><th onclick="srtTable('pkgbody',4)">inherit &#9651;</th><th onclick="srtTable('pkgbody',5)">size &#9651;</th><th onclick="srtTable('pkgbody',6)">contrast &#9651;</th><th></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>
- <div id="pkgpreview" class="mock" style="overflow:auto"></div>
- </section>
-</div>
-<script>
-const SAMPLES=SAMPLES_J, CATS=CATS_J, UI_FACES=UIFACES_J, APPS=APPS_J;
-let MAP=MAP_J, PALETTE=PALETTE_J, BOLD=BOLD_J, ITALIC={}, UIMAP=UIMAP_J;
-// --- tier-3 package faces: pure state helpers (Phase 1) ---
-function pname(n){if(!n)return null;if(/^#/.test(n))return n;const p=PALETTE.find(p=>p[1]===n);return p?p[0]:null;}
-function seedPkgmap(){const m={};for(const app in APPS){m[app]={};for(const row of APPS[app].faces){const face=row[0],d=row[2]||{};m[app][face]={fg:pname(d.fg),bg:pname(d.bg),bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit||null,height:d.height||1,source:'default'};}}return m;}
-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;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;}
-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]={fg:f.fg??null,bg:f.bg??null,bold:!!f.bold,italic:!!f.italic,underline:!!f.underline,strike:!!f.strike,inherit:f.inherit??null,height:f.height||1,source:f.source||'user'};}}}
-let PKGMAP=seedPkgmap();
-function esc(t){return t.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}
-function lin(c){c/=255;return c<=0.03928?c/12.92:Math.pow((c+0.055)/1.055,2.4);}
-function rl(h){return 0.2126*lin(parseInt(h.substr(1,2),16))+0.7152*lin(parseInt(h.substr(3,2),16))+0.0722*lin(parseInt(h.substr(5,2),16));}
-function textOn(h){const L=rl(h);return ((L+0.05)/0.05)>(1.05/(L+0.05))?'#000':'#fff';}
-function contrast(a,b){const L1=rl(a),L2=rl(b),hi=Math.max(L1,L2),lo=Math.min(L1,L2);return (hi+0.05)/(lo+0.05);}
-function rating(r){return r>=7?'AAA':r>=4.5?'AA':'FAIL';}
-function ratingColor(r){return r>=7?'#5d9b86':r>=4.5?'#a9b2bb':'#cb6b4d';}
-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 renderCode(){
- const lang=document.getElementById('langsel').value;let html='';
- for(const line of SAMPLES[lang]){
- if(line.length===0){html+='\\n';continue;}
- for(const [k,t] of line){const c=MAP[k]||'#cdced1';const w=BOLD[k]?'bold':'normal';const s=ITALIC[k]?'italic':'normal';
- html+=`<span data-k="${k}" style="color:${c};font-weight:${w};font-style:${s}">${esc(t)}</span>`;}
- html+='\\n';}
- const cp=document.getElementById('codepre');cp.innerHTML=html;
- cp.onclick=(e)=>{const s=e.target.closest('[data-k]');if(s)flashAssign(s.dataset.k);};
- buildMockFrame();
-}
-function buildTable(){
- const tb=document.getElementById('legbody');tb.innerHTML='';
- for(const [kind,label,ex] of CATS){
- const tr=document.createElement('tr');tr.dataset.kind=kind;
- const sel=document.createElement('select');sel.className='chip';
- const cur=MAP[kind];const have=PALETTE.some(p=>p[0]===cur);
- const list=have?PALETTE:[[cur,'(gone) '+cur],...PALETTE];
- for(const [hex,name] of list){const o=document.createElement('option');o.value=hex;o.textContent=name+' '+hex;o.style.background=hex;o.style.color=textOn(hex);sel.appendChild(o);}
- sel.value=cur;
- const exTd=document.createElement('td');exTd.className='ex';exTd.textContent=ex;
- const crTd=document.createElement('td');crTd.style.whiteSpace='nowrap';crTd.style.fontSize='10pt';
- function styleChip(){sel.style.background=sel.value;sel.style.color=textOn(sel.value);}
- function styleEx(){exTd.style.color=(kind==='bg'?MAP['p']:MAP[kind]);exTd.style.background=MAP['bg'];exTd.style.fontWeight=BOLD[kind]?'bold':'normal';exTd.style.fontStyle=ITALIC[kind]?'italic':'normal';}
- function styleCr(){const r=contrast((kind==='bg'?MAP['p']:MAP[kind]),MAP['bg']);crTd.innerHTML=`<span style="color:${ratingColor(r)}">${r.toFixed(1)} ${rating(r)}</span>`;}
- styleChip();styleEx();styleCr();
- sel.onchange=()=>{MAP[kind]=sel.value;styleChip();styleEx();styleCr();renderCode();if(kind==='bg'){applyGround();buildTable();}};
- // style buttons
- const stTd=document.createElement('td');
- if(kind!=='bg'){const defs=[['B','a','bold'],['I','a','italic']];
- const btns={};
- defs.forEach(([id,ch,mode])=>{const b=document.createElement('button');b.className='sbtn';b.style.fontWeight=mode==='bold'?'bold':'normal';b.style.fontStyle=mode==='italic'?'italic':'normal';b.textContent=ch;
- b.onclick=()=>{if(mode==='bold'){BOLD[kind]=!BOLD[kind];}else{ITALIC[kind]=!ITALIC[kind];}refresh();renderCode();styleEx();};
- btns[mode]=b;stTd.appendChild(b);});
- function refresh(){btns.bold.classList.toggle('on',!!BOLD[kind]);btns.italic.classList.toggle('on',!!ITALIC[kind]);}
- refresh();}
- const c0=document.createElement('td');c0.appendChild(sel);
- 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(c0);tr.appendChild(stTd);tr.appendChild(exTd);tr.appendChild(crTd);
- tb.appendChild(tr);}
-}
-let dragFrom=null,selectedIdx=null;
-function renderPalette(){
- const p=document.getElementById('pals');p.innerHTML='';
- PALETTE.forEach((pc,i)=>{const [hex,name]=pc;const tc=textOn(hex);
- const locked=(hex===MAP['bg']||hex===MAP['p']);
- const d=document.createElement('div');d.className='pchip'+(i===selectedIdx?' sel':'');d.style.background=hex;d.draggable=true;
- const lft=i>0?`<button class="mv l" title="move left" style="color:${tc}">&#8249;</button>`:'';
- const rgt=i<PALETTE.length-1?`<button class="mv r" title="move right" style="color:${tc}">&#8250;</button>`:'';
- const rm=locked?`<span class="lock" title="${hex===MAP['bg']?'background':'foreground'} — can't remove" style="color:${tc}">&#128274;</span>`:`<button class="rm" title="remove" style="color:${tc}">×</button>`;
- d.innerHTML=`${rm}${lft}${rgt}<input class="nm" value="${name}" style="color:${tc}"><div class="hx" style="color:${tc}">${hex}</div>`;
- if(!locked)d.querySelector('.rm').onclick=(e)=>{e.stopPropagation();PALETTE.splice(i,1);if(selectedIdx===i)selectedIdx=null;renderPalette();buildTable();buildUITable();};
- if(lft)d.querySelector('.mv.l').onclick=(e)=>{e.stopPropagation();moveColor(i,-1);};
- if(rgt)d.querySelector('.mv.r').onclick=(e)=>{e.stopPropagation();moveColor(i,1);};
- d.querySelector('.nm').onchange=(e)=>{PALETTE[i][1]=e.target.value;buildTable();buildUITable();};
- d.onclick=(e)=>{if(e.target.closest('.rm')||e.target.closest('.nm')||e.target.closest('.mv'))return;selectColor(i);};
- d.ondragstart=()=>{dragFrom=i;d.classList.add('drag');};
- d.ondragend=()=>{d.classList.remove('drag');document.querySelectorAll('.pchip.over').forEach(x=>x.classList.remove('over'));};
- d.ondragover=(e)=>{e.preventDefault();if(dragFrom!==null&&dragFrom!==i)d.classList.add('over');};
- d.ondragleave=()=>d.classList.remove('over');
- d.ondrop=(e)=>{e.preventDefault();d.classList.remove('over');if(dragFrom===null||dragFrom===i)return;const m=PALETTE.splice(dragFrom,1)[0];PALETTE.splice(i,0,m);dragFrom=null;selectedIdx=null;renderPalette();buildTable();buildUITable();};
- p.appendChild(d);});
- buildUITable();if(document.getElementById('pkgbody'))buildPkgTable();
-}
-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);}
-function applyEdit(){if(selectedIdx!==null)updateColor();else addColor();}
-function moveColor(i,dir){const j=i+dir;if(j<0||j>=PALETTE.length)return;const t=PALETTE[i];PALETTE[i]=PALETTE[j];PALETTE[j]=t;if(selectedIdx===i)selectedIdx=j;else if(selectedIdx===j)selectedIdx=i;renderPalette();buildTable();buildUITable();}
-function selectColor(i){selectedIdx=i;const [hex,name]=PALETTE[i];setHex(hex);document.getElementById('newname').value=name;renderPalette();notify('editing "'+name+'" — change the value, then Enter (or Update selected) to save',false);}
-function updateColor(){
- if(selectedIdx===null){notify('click a palette color to select it first',true);return;}
- const i=selectedIdx,oldHex=PALETTE[i][0];
- const newHex=curHex();
- const newName=(document.getElementById('newname').value.trim())||PALETTE[i][1];
- if(PALETTE.some((p,j)=>j!==i&&p[1].toLowerCase()===newName.toLowerCase())){notify('another color is already named "'+newName+'" — names must be unique',true);return;}
- PALETTE[i]=[newHex,newName];
- for(const k in MAP){if(MAP[k]===oldHex)MAP[k]=newHex;}
- for(const f in UIMAP){if(UIMAP[f].fg===oldHex)UIMAP[f].fg=newHex;if(UIMAP[f].bg===oldHex)UIMAP[f].bg=newHex;}
- for(const ap in PKGMAP)for(const fc in PKGMAP[ap]){const o=PKGMAP[ap][fc];if(o.fg===oldHex)o.fg=newHex;if(o.bg===oldHex)o.bg=newHex;}
- closePicker();renderPalette();buildTable();buildUITable();renderCode();applyGround();notify('updated "'+newName+'"',false);
-}
-function normHex(s){s=s.trim();if(/^[0-9a-fA-F]{6}$/.test(s))s='#'+s;return /^#[0-9a-fA-F]{6}$/.test(s)?s.toLowerCase():null;}
-function curHex(){return normHex(document.getElementById('newhexstr').value)||'#888888';}
-function hsv2rgb(h,s,v){h=(h%360+360)%360/360;const i=Math.floor(h*6),f=h*6-i,p=v*(1-s),q=v*(1-f*s),t=v*(1-(1-f)*s);let r,g,b;switch(((i%6)+6)%6){case 0:[r,g,b]=[v,t,p];break;case 1:[r,g,b]=[q,v,p];break;case 2:[r,g,b]=[p,v,t];break;case 3:[r,g,b]=[p,q,v];break;case 4:[r,g,b]=[t,p,v];break;default:[r,g,b]=[v,p,q];}return[Math.round(r*255),Math.round(g*255),Math.round(b*255)];}
-function rgb2hsv(r,g,b){r/=255;g/=255;b/=255;const mx=Math.max(r,g,b),mn=Math.min(r,g,b),d=mx-mn;let h=0;if(d){if(mx===r)h=((g-b)/d+6)%6;else if(mx===g)h=(b-r)/d+2;else h=(r-g)/d+4;h*=60;}return[h,mx?d/mx:0,mx];}
-function hex2rgb(h){return[parseInt(h.substr(1,2),16),parseInt(h.substr(3,2),16),parseInt(h.substr(5,2),16)];}
-function rgb2hex(r,g,b){return '#'+[r,g,b].map(x=>Math.max(0,Math.min(255,x)).toString(16).padStart(2,'0')).join('');}
-let pkH=0,pkS=0,pkV=0.5,pickerOn=false;
-let pkMode='any';
-function pkThresh(){return pkMode==='aa'?4.5:pkMode==='aaa'?7:0;}
-function drawMask(){const cv=document.getElementById('svmask');if(!cv)return;const sv=document.getElementById('sv'),w=cv.width=sv.clientWidth,h=cv.height=sv.clientHeight,ctx=cv.getContext('2d');ctx.clearRect(0,0,w,h);const T=pkThresh();if(!T)return;ctx.fillStyle='rgba(8,7,6,0.66)';const step=4;for(let x=0;x<w;x+=step){const S=x/w;for(let y=0;y<h;y+=step){const V=1-y/h,[r,g,b]=hsv2rgb(pkH,S,V);if(contrast(rgb2hex(r,g,b),MAP['bg'])<T)ctx.fillRect(x,y,step,step);}}}
-function paintPicker(){const sv=document.getElementById('sv');if(!sv)return;sv.style.background=`linear-gradient(to top,#000,rgba(0,0,0,0)),linear-gradient(to right,#fff,rgba(255,255,255,0)),hsl(${pkH},100%,50%)`;const w=sv.clientWidth,h=sv.clientHeight,hh=document.getElementById('hue').clientHeight;document.getElementById('svcur').style.left=(pkS*w)+'px';document.getElementById('svcur').style.top=((1-pkV)*h)+'px';document.getElementById('huecur').style.top=((pkH/360)*hh)+'px';drawMask();}
-function pkReadout(h){const e=document.getElementById('pkhex');if(e)e.textContent=h;const c=document.getElementById('pkcon');if(c){const r=contrast(h,MAP['bg']);c.textContent=r.toFixed(1)+' '+rating(r);c.style.color=ratingColor(r);}}
-function syncHex(){const v=normHex(document.getElementById('newhexstr').value);if(!v)return;document.getElementById('swatch').style.background=v;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(v));if(pickerOn)paintPicker();pkReadout(v);}
-function setHex(h){h=normHex(h)||h;document.getElementById('newhexstr').value=h;document.getElementById('swatch').style.background=h;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(h));if(pickerOn)paintPicker();pkReadout(h);}
-function pkSet(){const hex=rgb2hex(...hsv2rgb(pkH,pkS,pkV));document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex;paintPicker();pkReadout(hex);}
-function buildPkChips(){const c=document.getElementById('pkchips');if(!c)return;c.innerHTML='';const T=pkThresh();PALETTE.forEach(([hex,name])=>{const s=document.createElement('div');s.className='pc';s.style.background=hex;s.title=name+' '+hex;const ok=!T||contrast(hex,MAP['bg'])>=T;if(!ok){s.style.opacity='0.22';s.title+=' (below '+pkMode.toUpperCase()+')';}s.onclick=()=>{if(ok)setHex(hex);};c.appendChild(s);});}
-function openPicker(){pickerOn=true;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(curHex()));buildPkChips();paintPicker();pkReadout(curHex());document.getElementById('picker').style.display='block';setTimeout(()=>document.addEventListener('pointerdown',pkOutside),0);}
-function closePicker(){if(!pickerOn)return;pickerOn=false;const p=document.getElementById('picker');if(p)p.style.display='none';document.removeEventListener('pointerdown',pkOutside);}
-function pkOutside(e){if(!e.target.closest('#picker')&&!e.target.closest('#swatch'))closePicker();}
-function pkDrag(el,fn){el.addEventListener('pointerdown',e=>{e.preventDefault();fn(e);const mv=ev=>fn(ev),up=()=>{document.removeEventListener('pointermove',mv);document.removeEventListener('pointerup',up);};document.addEventListener('pointermove',mv);document.addEventListener('pointerup',up);});}
-function initPicker(){const sw=document.getElementById('swatch');if(!sw)return;sw.style.background=curHex();sw.onclick=()=>pickerOn?closePicker():openPicker();
- pkDrag(document.getElementById('sv'),e=>{const r=document.getElementById('sv').getBoundingClientRect();pkS=Math.max(0,Math.min(1,(e.clientX-r.left)/r.width));pkV=1-Math.max(0,Math.min(1,(e.clientY-r.top)/r.height));pkSet();});
- pkDrag(document.getElementById('hue'),e=>{const r=document.getElementById('hue').getBoundingClientRect();pkH=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height))*360;pkSet();});
- document.querySelectorAll('.pmode button').forEach(b=>b.onclick=()=>{pkMode=b.dataset.m;document.querySelectorAll('.pmode button').forEach(x=>x.classList.toggle('on',x===b));drawMask();buildPkChips();});}
-function addColor(){const h=curHex();const name=document.getElementById('newname').value.trim();
- if(!name){notify('name the color before adding it',true);return;}
- if(PALETTE.some(p=>p[1].toLowerCase()===name.toLowerCase())){notify('a color named "'+name+'" already exists — select it and use Update selected to change its value',true);return;}
- PALETTE.push([h,name]);document.getElementById('newname').value='';selectedIdx=null;closePicker();renderPalette();buildTable();notify('added "'+name+'"',false);}
-function themeName(){return (document.getElementById('themename').value||'theme').trim()||'theme';}
-function fileSlug(){return themeName().replace(/[^A-Za-z0-9._-]+/g,'-').replace(/^-+|-+$/g,'')||'theme';}
-function exportObj(){const a={};CATS.forEach(c=>a[c[0]]=MAP[c[0]]);const o={name:themeName(),palette:PALETTE,assignments:a,bold:Object.keys(BOLD).filter(k=>BOLD[k]),italic:Object.keys(ITALIC).filter(k=>ITALIC[k]),ui:UIMAP};const pk=packagesForExport(PKGMAP);if(Object.keys(pk).length)o.packages=pk;return o;}
-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';const sb=document.getElementById('savebtn');if(sb){sb.style.display=n||fileHandle?'':'none';sb.title=fileHandle?'overwrite the imported/saved file':'choose where to save';}}
-let fileHandle=null;
-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();}
-async function saveTheme(){const data=JSON.stringify(exportObj(),null,1);
- if(!window.showSaveFilePicker){exportTheme();notify('saved via download (browser has no Save-File support)',false);return;}
- try{if(!fileHandle)fileHandle=await window.showSaveFilePicker({suggestedName:fileSlug()+'.json',types:[{description:'theme JSON',accept:{'application/json':['.json']}}]});
- const w=await fileHandle.createWritable();await w.write(data);await w.close();notify('saved "'+themeName()+'"',false);updateTitle();
- }catch(e){if(e&&e.name!=='AbortError')notify('save failed: '+e.message,true);}}
-function applyImported(text){const d=JSON.parse(text);if(d.name)document.getElementById('themename').value=d.name;if(d.palette)PALETTE=d.palette;if(d.assignments)Object.assign(MAP,d.assignments);
- BOLD={};(d.bold||[]).forEach(k=>BOLD[k]=true);ITALIC={};(d.italic||[]).forEach(k=>ITALIC[k]=true);
- if(d.ui)Object.assign(UIMAP,d.ui);
- PKGMAP=seedPkgmap();if(d.packages)mergePackagesInto(PKGMAP,d.packages);
- renderPalette();buildTable();buildUITable();buildPkgTable();buildPkgPreview();renderCode();applyGround();updateTitle();}
-// File-input fallback (no File System Access API): no writable handle, so save still prompts.
-function importFile(ev){const f=ev.target.files[0];if(!f)return;const r=new FileReader();
- r.onload=()=>{try{applyImported(r.result);fileHandle=null;updateTitle();}catch(e){alert('bad theme file: '+e.message);}};
- r.readAsText(f);ev.target.value='';}
-// Preferred import: keep the file handle so a later save overwrites the same file.
-async function importTheme(){
- if(!window.showOpenFilePicker){const fi=document.getElementById('fileinput');if(fi)fi.click();return;}
- try{const [h]=await window.showOpenFilePicker({types:[{description:'theme JSON',accept:{'application/json':['.json']}}]});
- const file=await h.getFile();applyImported(await file.text());fileHandle=h;updateTitle();
- notify('imported "'+(themeName()||file.name)+'" — save now overwrites it',false);
- }catch(e){if(e&&e.name!=='AbortError')notify('import failed: '+e.message,true);}}
-function applyGround(){document.querySelectorAll('pre').forEach(p=>p.style.background=MAP['bg']);document.querySelectorAll('.ex').forEach(e=>e.style.background=MAP['bg']);}
-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'}`;}
-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.classList.remove('flashtok');void el.offsetWidth;el.classList.add('flashtok');}
-function flashTokens(kind){const sp=document.querySelectorAll('#codepre [data-k="'+kind+'"]');if(sp.length){sp.forEach(flashEl);return;}const row=document.querySelector('#legbody tr[data-kind="'+kind+'"]');if(row)flashEl(row.querySelector('.ex'));}
-function flashAssign(k){flashRow(document.querySelector(`#legbody tr[data-kind="${k}"]`));}
-function flashUi(f){flashRow(document.querySelector(`#uibody tr[data-face="${f}"]`));}
-function flashUiPreview(f){const sp=document.querySelectorAll(`#mockframe [data-face="${f}"]`);if(sp.length){sp.forEach(flashEl);return;}const cell=document.getElementById('uiprev-'+f);if(cell)flashEl(cell);}
-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){sp.forEach(flashEl);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="color:${MAP[k]||MAP['p']};font-weight:${BOLD[k]?'bold':'normal'};font-style:${ITALIC[k]?'italic':'normal'}">${esc(t)}</span>`;}
-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 lines=[
- {t:[['cmd',';; '],['cm','init.el - your config']]},
- {t:[['punc','('],['kw','require'],['p',' '],['con',"'cl-lib"],['punc',')']]},
- {t:[]},
- {t:[['punc','('],['kw','defun'],['p',' '],['fnd','cj/greet'],['p',' '],['punc','('],['var','name'],['punc',')']]},
- {t:[['p',' '],['punc','('],['fnc','message'],['p',' '],['str','"hi %s"'],['p',' '],['var','name'],['punc','))']],cur:1},
- {t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','count'],['p',' '],['num','42'],['punc',')']],region:1},
- {plain:' (if (> count 0)',match:1},
- {plain:' (setq total (+ total count))',hl:1},
- {t:[['p',' '],['punc','('],['fnc','process'],['p',' '],['var','items'],['punc',')']]},
- {plain:' (cl-incf count)',lazy:1},
- {t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','done'],['p',' '],['con','t'],['punc',')']],paren:1},
- {plain:' (oops nested))',mismatch:1}
- ];
- let buf='';
- lines.forEach((L,i)=>{
- const isc=L.cur;
- const nFg=isc?(lnc.fg||fg):(ln.fg||fg), nBg=isc?(lnc.bg||'transparent'):(ln.bg||'transparent');
- const rowBg=isc?(hl.bg||'transparent'):'transparent';
- let cd;
- if(L.plain){
- if(L.match)cd=`<span data-face="isearch" style="color:${isr.fg||fg};background:${isr.bg||'transparent'}">${esc(L.plain)}</span>`;
- else if(L.lazy)cd=`<span data-face="lazy-highlight" style="color:${laz.fg||fg};background:${laz.bg||'transparent'}">${esc(L.plain)}</span>`;
- else if(L.hl)cd=`<span data-face="highlight" style="background:${hil.bg||'transparent'};color:${hil.fg||fg}">${esc(L.plain)}</span>`;
- else if(L.mismatch)cd=esc(L.plain.slice(0,-1))+`<span data-face="show-paren-mismatch" style="background:${parx.bg||'transparent'};color:${parx.fg||fg};font-weight:bold">${esc(L.plain.slice(-1))}</span>`;
- else cd=esc(L.plain);
- } else if(L.paren){cd=L.t.map(([k,t],j)=>j===L.t.length-1?`<span data-face="show-paren-match" style="background:${par.bg||'transparent'};color:${par.fg||MAP[k]||fg};font-weight:bold">${esc(t)}</span>`:mockSpan(k,t)).join('');}
- else{cd=L.t.map(([k,t])=>mockSpan(k,t)).join('');if(L.region)cd=`<span data-face="region" style="background:${reg.bg||'transparent'}">${cd}</span>`;}
- if(isc)cd+=`<span data-face="cursor" style="background:${cur.bg||fg};color:${bg}"> </span>`;
- const nFace=isc?'line-number-current-line':'line-number';
- buf+=`<div class="ln" style="background:${rowBg}"><span class="fr" data-face="fringe" style="background:${frng.bg||bg}"></span><span class="num" data-face="${nFace}" style="color:${nFg};background:${nBg}">${i+1}</span><span class="cd">${cd||'&nbsp;'}</span></div>`;
- });
- let html=`<div class="mbuf" style="display:flex;background:${bg}"><div style="flex:1;min-width:0">${buf}</div><div data-face="vertical-border" title="vertical-border" style="width:3px;flex:0 0 auto;background:${vb.fg||vb.bg||'#2f343a'}"></div></div>`;
- html+=`<div class="bar" data-face="mode-line" style="background:${ml.bg||fg};color:${ml.fg||bg};${udeco(ml)}"> init.el (Emacs Lisp) L5 git:main </div>`;
- html+=`<div class="bar" data-face="mode-line-inactive" style="background:${mli.bg||bg};color:${mli.fg||fg};${udeco(mli)}"> *Messages* (Fundamental) </div>`;
- html+=`<div class="echo" style="color:${fg}"><span data-face="minibuffer-prompt" style="color:${mb.fg||fg};${udeco(mb)}">I-search:</span> count <span data-face="isearch-fail" style="color:${isf.fg||fg};background:${isf.bg||'transparent'};${udeco(isf)}">zzz [no match]</span></div>`;
- html+=`<div class="echo"><span data-face="link" style="color:${lnk.fg||fg};${udeco(lnk)}">https://gnu.org</span> <span data-face="error" style="color:${err.fg||fg};${udeco(err)}">error</span> <span data-face="warning" style="color:${wrn.fg||fg};${udeco(wrn)}">warning</span> <span data-face="success" style="color:${suc.fg||fg};${udeco(suc)}">ok</span></div>`;
- fr.innerHTML=html;fr.style.background=bg;fr.style.color=fg;
- fr.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u){flashUi(u.dataset.face);return;}const k=e.target.closest('[data-k]');if(k)flashAssign(k.dataset.k);};
-}
-function colorDropdown(value,onpick){
- const sel=document.createElement('select');sel.className='chip';
- const none=document.createElement('option');none.value='';none.textContent='— none —';none.style.background='#161412';none.style.color='#b4b1a2';sel.appendChild(none);
- for(const [hex,name] of PALETTE){const o=document.createElement('option');o.value=hex;o.textContent=name+' '+hex;o.style.background=hex;o.style.color=textOn(hex);sel.appendChild(o);}
- sel.value=value||'';
- function style(){if(sel.value){sel.style.background=sel.value;sel.style.color=textOn(sel.value);}else{sel.style.background='#161412';sel.style.color='#b4b1a2';}}
- style();
- sel.onchange=()=>{style();onpick(sel.value||null);};
- return sel;
-}
-function uiSelect(face,attr){return colorDropdown(UIMAP[face][attr],v=>{UIMAP[face][attr]=v;paintUI(face);buildMockFrame();});}
-const BASE_INHERITS=['fixed-pitch','variable-pitch','default','link','bold','italic','shadow'];
-function seedFace(d){return {fg:pname(d.fg),bg:pname(d.bg),bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit||null,height:d.height||1,source:'default'};}
-function curApp(){const s=document.getElementById('appsel');return s&&s.value?s.value:Object.keys(APPS)[0];}
-function pkgEffFg(app,face,seen){seen=seen||{};const f=PKGMAP[app]&&PKGMAP[app][face];if(!f||seen[face])return null;seen[face]=1;if(f.fg)return f.fg;if(f.inherit&&PKGMAP[app][f.inherit])return pkgEffFg(app,f.inherit,seen);return null;}
-function pkgEffBg(app,face,seen){seen=seen||{};const f=PKGMAP[app]&&PKGMAP[app][face];if(!f||seen[face])return null;seen[face]=1;if(f.bg)return f.bg;if(f.inherit&&PKGMAP[app][f.inherit])return pkgEffBg(app,f.inherit,seen);return null;}
-function buildAppSel(){const s=document.getElementById('appsel');if(!s)return;s.innerHTML='';for(const app in APPS){const o=document.createElement('option');o.value=app;o.textContent=APPS[app].label;s.appendChild(o);}s.onchange=pkgChanged;}
-function pkgChanged(){buildPkgTable();buildPkgPreview();syncPkgHeight();}
-function buildPkgTable(){
- const app=curApp(),tb=document.getElementById('pkgbody');if(!tb)return;tb.innerHTML='';
- const flt=(document.getElementById('pkgfilter').value||'').trim().toLowerCase();
- const inh=[''].concat(BASE_INHERITS).concat(APPS[app].faces.map(r=>r[0]));
- for(const [face,label,def] of APPS[app].faces){
- if(flt&&!(face.toLowerCase().includes(flt)||label.toLowerCase().includes(flt)))continue;
- const f=PKGMAP[app][face],tr=document.createElement('tr');tr.dataset.face=face;
- const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.title=face;c0.style.cursor='pointer';c0.onclick=()=>flashPkgPreview(face);
- const cf=document.createElement('td');cf.appendChild(colorDropdown(f.fg,v=>{f.fg=v;f.source='user';pkgChanged();}));
- const cb=document.createElement('td');cb.appendChild(colorDropdown(f.bg,v=>{f.bg=v;f.source='user';pkgChanged();}));
- const cw=document.createElement('td');[['B','bold'],['I','italic'],['U','underline'],['S','strike']].forEach(([ch,at])=>{const b=document.createElement('button');b.className='sbtn'+(f[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=()=>{f[at]=!f[at];f.source='user';pkgChanged();};cw.appendChild(b);});
- 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 cc=document.createElement('td');cc.style.fontSize='10pt';cc.style.whiteSpace='nowrap';const efg=pkgEffFg(app,face)||MAP['p'],ebg=pkgEffBg(app,face)||MAP['bg'],r=contrast(efg,ebg);cc.innerHTML=`<span style="color:${ratingColor(r)}">${r.toFixed(1)} ${rating(r)}</span>`;
- const cr=document.createElement('td');const rb=document.createElement('button');rb.className='sbtn';rb.textContent='↺';rb.title='reset to default';rb.onclick=()=>{PKGMAP[app][face]=seedFace(def);pkgChanged();};cr.appendChild(rb);
- tr.append(c0,cf,cb,cw,ci,ch,cc,cr);tb.appendChild(tr);
- }
- applyTableSort('pkgbody');
-}
-function ofs(app,face){const f=PKGMAP[app][face]||{},fg=pkgEffFg(app,face)||MAP['p'],bg=pkgEffBg(app,face);const dec=(f.underline?'underline ':'')+(f.strike?'line-through':'');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`;}
-function os(app,face,txt){return `<span data-face="${face}" style="${ofs(app,face)}">${txt}</span>`;}
-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-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;
-}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-function renderDashboardPreview(){const a='dashboard',L=[];
- L.push(os(a,'dashboard-text-banner',' ___ _ __ ___ __ _ ___ ___'));
- L.push(os(a,'dashboard-banner-logo-title',' Welcome back, Craig'));
- L.push('');
- L.push(os(a,'dashboard-heading','Recent Files'));
- L.push(' '+os(a,'dashboard-items-face','init.el'));
- L.push(' '+os(a,'dashboard-items-face','notes.org'));
- L.push(os(a,'dashboard-heading','Bookmarks'));
- L.push(' '+os(a,'dashboard-no-items-face','-- no items --'));
- L.push('');
- L.push(os(a,'dashboard-navigator','[ Projects ] [ Recent ] [ Agenda ]'));
- L.push(os(a,'dashboard-footer-icon-face','*')+' '+os(a,'dashboard-footer-face','Happy hacking, Craig!'));
- return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-function renderMu4ePreview(){const a='mu4e',L=[];
- 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 retry')+' '+os(a,'mu4e-modeline-face','12/340'));
- L.push('');
- L.push(os(a,'mu4e-header-title-face','Date Flags From Subject'));
- L.push(os(a,'mu4e-header-value-face','2026-06-08')+' '+os(a,'mu4e-header-marks-face','N')+' '+os(a,'mu4e-unread-face','Alice')+' '+os(a,'mu4e-unread-face','Unread message'));
- L.push(os(a,'mu4e-header-value-face','2026-06-07')+' '+os(a,'mu4e-header-marks-face','R')+' '+os(a,'mu4e-header-face','Bob')+' '+os(a,'mu4e-replied-face','Replied thread'));
- L.push(os(a,'mu4e-header-value-face','2026-06-06')+' '+os(a,'mu4e-header-marks-face','F')+' '+os(a,'mu4e-header-face','Carol')+' '+os(a,'mu4e-forwarded-face','Forwarded note'));
- L.push(os(a,'mu4e-header-value-face','2026-06-05')+' '+os(a,'mu4e-header-marks-face','D')+' '+os(a,'mu4e-draft-face','(draft)')+' '+os(a,'mu4e-draft-face','Draft in progress'));
- L.push(os(a,'mu4e-header-value-face','2026-06-04')+' '+os(a,'mu4e-header-marks-face','T')+' '+os(a,'mu4e-trashed-face','Dan')+' '+os(a,'mu4e-moved-face','Trashed and moved'));
- L.push(os(a,'mu4e-header-highlight-face','2026-06-03 ! Eve Flagged ')+os(a,'mu4e-flagged-face','important')+os(a,'mu4e-related-face',' (related)'));
- L.push('');
- L.push(os(a,'mu4e-header-key-face','From:')+' '+os(a,'mu4e-contact-face','Alice &lt;alice@example.com&gt;'));
- L.push(os(a,'mu4e-header-key-face','To:')+' '+os(a,'mu4e-special-header-value-face','craig, list@gnu.org'));
- L.push(os(a,'mu4e-header-key-face','Attach:')+' '+os(a,'mu4e-attach-number-face','[1]')+' report.pdf link '+os(a,'mu4e-url-number-face','[2]')+' '+os(a,'mu4e-link-face','https://gnu.org'));
- L.push('');
- L.push(' body with a '+os(a,'mu4e-highlight-face','search hit')+' and '+os(a,'mu4e-region-code','code region')+'.');
- L.push(' '+os(a,'mu4e-cited-1-face','&gt; level 1')+' '+os(a,'mu4e-cited-2-face','&gt;&gt; 2')+' '+os(a,'mu4e-cited-3-face','&gt;&gt;&gt; 3')+' '+os(a,'mu4e-cited-4-face','&gt; 4')+' '+os(a,'mu4e-cited-5-face','&gt; 5')+' '+os(a,'mu4e-cited-6-face','&gt; 6')+' '+os(a,'mu4e-cited-7-face','&gt; 7'));
- L.push(' '+os(a,'mu4e-system-face','*** system message ***')+' '+os(a,'mu4e-footer-face','-- sent with mu4e'));
- L.push('');
- L.push(os(a,'mu4e-compose-header-face','Subject:')+' new mail');
- L.push(os(a,'mu4e-compose-separator-face','--text follows this line--'));
- return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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-delimited-error','[')+os(a,'flycheck-error-delimiter','err')+os(a,'flycheck-delimited-error',']'));
- 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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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-default-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-input-face','hi craig, see ')+os(a,'erc-button','this link')+os(a,'erc-input-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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','Alice: yes! see you at 7'));
- L.push(os(a,'signel-error-face','(failed to send -- retrying)'));
- return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-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','Alice')+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','Alice')+' '+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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\\n')}</div>`;}
-function genericPreview(app){let h='<div style="padding:10px 14px;font:12pt/1.8 monospace">';for(const [face,label,def] of APPS[app].faces){const f=PKGMAP[app][face],efg=pkgEffFg(app,face)||MAP['p'],ebg=pkgEffBg(app,face);h+=`<div data-face="${face}" style="color:${efg};${ebg?'background:'+ebg+';':''}font-weight:${f.bold?'bold':'normal'};font-style:${f.italic?'italic':'normal'};font-size:${(f.height||1)}em">${esc(label)}</div>`;}return h+'</div>';}
-function buildPkgPreview(){const app=curApp(),p=document.getElementById('pkgpreview');if(!p)return;const pv=APPS[app].preview;const bespoke=['org','magit','elfeed','ghostel','dashboard','mu4e','lsp','gitgutter','flycheck','dired','dirvish','calibredb','erc','orgdrill','orgnoter','signel','pearl','slack','telega','shr'].includes(pv);p.innerHTML=pv==='org'?renderOrgPreview():pv==='magit'?renderMagitPreview():pv==='elfeed'?renderElfeedPreview():pv==='ghostel'?renderGhostelPreview():pv==='dashboard'?renderDashboardPreview():pv==='mu4e'?renderMu4ePreview():pv==='lsp'?renderLspPreview():pv==='gitgutter'?renderGitGutterPreview():pv==='flycheck'?renderFlycheckPreview():pv==='dired'?renderDiredPreview():pv==='dirvish'?renderDirvishPreview():pv==='calibredb'?renderCalibredbPreview():pv==='erc'?renderErcPreview():pv==='orgdrill'?renderOrgdrillPreview():pv==='orgnoter'?renderOrgnoterPreview():pv==='signel'?renderSignelPreview():pv==='pearl'?renderPearlPreview():pv==='slack'?renderSlackPreview():pv==='telega'?renderTelegaPreview():pv==='shr'?renderShrPreview():genericPreview(app);p.style.background=MAP['bg'];p.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u)flashPkg(u.dataset.face);};const lbl=document.getElementById('pkgprevlabel');if(lbl)lbl.textContent=bespoke?(APPS[app].label+' preview'):'preview (generic — face names in their own colors)';}
-function resetApp(){const app=curApp();PKGMAP[app]={};for(const [face,label,d] of APPS[app].faces)PKGMAP[app][face]=seedFace(d);pkgChanged();}
-function syncPkgHeight(){const t=document.getElementById('pkgtable'),m=document.getElementById('pkgpreview');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 paintUI(face){const pv=document.getElementById('uiprev-'+face);if(!pv)return;const o=UIMAP[face];pv.style.color=o.fg||MAP['p'];pv.style.background=o.bg||MAP['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';}
-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 cF=document.createElement('td');cF.appendChild(uiSelect(face,'fg'));
- const cB=document.createElement('td');cB.appendChild(uiSelect(face,'bg'));
- const cS=document.createElement('td');[['B','bold'],['I','italic'],['U','underline'],['S','strike']].forEach(([ch,at])=>{const b=document.createElement('button');b.className='sbtn'+(UIMAP[face][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=()=>{UIMAP[face][at]=!UIMAP[face][at];paintUI(face);buildMockFrame();};cS.appendChild(b);});
- const cP=document.createElement('td');cP.className='ex';cP.id='uiprev-'+face;cP.textContent=ex;cP.style.padding='4px 10px';cP.style.borderRadius='4px';
- tr.appendChild(c0);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cP);tb.appendChild(tr);paintUI(face);
- }
- applyTableSort('uibody');
-}
-let D={};
-function srt(c){const tb=document.getElementById('legbody');const r=[...tb.rows];D[c]=!D[c];
- r.sort((a,b)=>{const x=(c===0?a.querySelector('select').value:a.cells[0].innerText).toLowerCase(),
- y=(c===0?b.querySelector('select').value:b.cells[0].innerText).toLowerCase();
- return (x<y?-1:x>y?1:0)*(D[c]?1:-1);});r.forEach(x=>tb.appendChild(x));}
-// Generic header-click sort for the package and UI tables. Reads a select
-// value, a numeric input, or cell text (numeric when the text leads with a
-// number, e.g. contrast or size). The sort is remembered per table and
-// re-applied after a rebuild so editing a face does not reset it.
-let tableSort={};
-function cellVal(td){if(!td)return '';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));}
-buildLangSel();buildAppSel();renderPalette();buildTable();buildUITable();renderCode();applyGround();updateTitle();initPicker();buildPkgTable();buildPkgPreview();syncMockHeight();syncPkgHeight();
-addEventListener('resize',()=>{syncMockHeight();syncPkgHeight();});
-// 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'};
- const exp=packagesForExport(seeded);
- const round=seedPkgmap();mergePackagesInto(round,exp);
- const roundtrip=JSON.stringify(exp)===JSON.stringify(packagesForExport(round));
- let oldjson=true;try{const m=seedPkgmap();mergePackagesInto(m,undefined);oldjson=!!(m['org-mode']&&m['org-mode']['org-todo'].source==='default');}catch(e){oldjson=false;}
- 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 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'}};
- 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;
- const d=document.createElement('div');d.id='selftest';d.textContent='SELFTEST '+verdict+' roundtrip='+roundtrip+' oldjson='+oldjson+' inherit='+inherited+' height='+height+' cleared='+cleared+' unknown='+unknown+' cycle='+cyc;document.body.appendChild(d);
-}
-if(location.hash==='#selftest')pkgSelftest();
-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.startsWith('#app')){const ap=location.hash.slice(4),s=document.getElementById('appsel');if(s&&ap){s.value=ap;pkgChanged();}}
-</script>"""
-HTML=(HTML.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("BOLD_J",json.dumps(BOLD)).replace("MAP_J",json.dumps(MAP)))
-OUT=os.path.join(HERE,'theme-selector.html')
-open(OUT,"w").write(HTML)
-print("wrote",OUT)
diff --git a/scripts/theme-selector/package-inventory.json b/scripts/theme-selector/package-inventory.json
deleted file mode 100644
index 18fd7aa2..00000000
--- a/scripts/theme-selector/package-inventory.json
+++ /dev/null
@@ -1,723 +0,0 @@
-{
- "2048-game": [
- "twentyfortyeight-face-1024",
- "twentyfortyeight-face-128",
- "twentyfortyeight-face-16",
- "twentyfortyeight-face-2",
- "twentyfortyeight-face-2048",
- "twentyfortyeight-face-256",
- "twentyfortyeight-face-32",
- "twentyfortyeight-face-4",
- "twentyfortyeight-face-512",
- "twentyfortyeight-face-64",
- "twentyfortyeight-face-8"
- ],
- "alert": [
- "alert-high-face",
- "alert-low-face",
- "alert-moderate-face",
- "alert-normal-face",
- "alert-trivial-face",
- "alert-urgent-face"
- ],
- "all-the-icons": [
- "all-the-icons-blue",
- "all-the-icons-blue-alt",
- "all-the-icons-cyan",
- "all-the-icons-cyan-alt",
- "all-the-icons-dblue",
- "all-the-icons-dcyan",
- "all-the-icons-dgreen",
- "all-the-icons-dmaroon",
- "all-the-icons-dorange",
- "all-the-icons-dpink",
- "all-the-icons-dpurple",
- "all-the-icons-dred",
- "all-the-icons-dsilver",
- "all-the-icons-dyellow",
- "all-the-icons-green",
- "all-the-icons-lblue",
- "all-the-icons-lcyan",
- "all-the-icons-lgreen",
- "all-the-icons-lmaroon",
- "all-the-icons-lorange",
- "all-the-icons-lpink",
- "all-the-icons-lpurple",
- "all-the-icons-lred",
- "all-the-icons-lsilver",
- "all-the-icons-lyellow",
- "all-the-icons-maroon",
- "all-the-icons-orange",
- "all-the-icons-pink",
- "all-the-icons-purple",
- "all-the-icons-purple-alt",
- "all-the-icons-red",
- "all-the-icons-red-alt",
- "all-the-icons-silver",
- "all-the-icons-yellow"
- ],
- "company": [
- "company-echo",
- "company-echo-common",
- "company-preview",
- "company-preview-common",
- "company-preview-search",
- "company-tooltip",
- "company-tooltip-annotation",
- "company-tooltip-annotation-selection",
- "company-tooltip-common",
- "company-tooltip-common-selection",
- "company-tooltip-deprecated",
- "company-tooltip-mouse",
- "company-tooltip-quick-access",
- "company-tooltip-quick-access-selection",
- "company-tooltip-scrollbar-thumb",
- "company-tooltip-scrollbar-track",
- "company-tooltip-search",
- "company-tooltip-search-selection",
- "company-tooltip-selection"
- ],
- "company-box": [
- "company-box-annotation",
- "company-box-background",
- "company-box-candidate",
- "company-box-numbers",
- "company-box-scrollbar",
- "company-box-selection"
- ],
- "consult": [
- "consult-async-failed",
- "consult-async-finished",
- "consult-async-running",
- "consult-async-split",
- "consult-bookmark",
- "consult-buffer",
- "consult-file",
- "consult-grep-context",
- "consult-help",
- "consult-highlight-mark",
- "consult-highlight-match",
- "consult-key",
- "consult-line-number",
- "consult-line-number-prefix",
- "consult-line-number-wrapped",
- "consult-narrow-indicator",
- "consult-preview-insertion",
- "consult-preview-line",
- "consult-preview-match",
- "consult-separator"
- ],
- "dashboard": [
- "dashboard-banner-logo-title",
- "dashboard-footer-face",
- "dashboard-footer-icon-face",
- "dashboard-heading",
- "dashboard-items-face",
- "dashboard-navigator",
- "dashboard-no-items-face",
- "dashboard-text-banner"
- ],
- "dirvish": [
- "dirvish-collapse-dir-face",
- "dirvish-collapse-empty-dir-face",
- "dirvish-collapse-file-face",
- "dirvish-emerge-group-title",
- "dirvish-file-device-number",
- "dirvish-file-group-id",
- "dirvish-file-inode-number",
- "dirvish-file-link-number",
- "dirvish-file-modes",
- "dirvish-file-size",
- "dirvish-file-time",
- "dirvish-file-user-id",
- "dirvish-free-space",
- "dirvish-git-commit-message-face",
- "dirvish-hl-line",
- "dirvish-hl-line-inactive",
- "dirvish-inactive",
- "dirvish-media-info-heading",
- "dirvish-media-info-property-key",
- "dirvish-narrow-match-face-0",
- "dirvish-narrow-match-face-1",
- "dirvish-narrow-match-face-2",
- "dirvish-narrow-match-face-3",
- "dirvish-narrow-split",
- "dirvish-proc-failed",
- "dirvish-proc-finished",
- "dirvish-proc-running",
- "dirvish-subtree-guide",
- "dirvish-subtree-state",
- "dirvish-vc-added-state",
- "dirvish-vc-conflict-state",
- "dirvish-vc-edited-state",
- "dirvish-vc-locked-state",
- "dirvish-vc-missing-state",
- "dirvish-vc-needs-merge-face",
- "dirvish-vc-needs-update-state",
- "dirvish-vc-removed-state",
- "dirvish-vc-unregistered-face"
- ],
- "elfeed": [
- "elfeed-log-date-face",
- "elfeed-log-debug-level-face",
- "elfeed-log-error-level-face",
- "elfeed-log-info-level-face",
- "elfeed-log-warn-level-face",
- "elfeed-search-date-face",
- "elfeed-search-feed-face",
- "elfeed-search-filter-face",
- "elfeed-search-last-update-face",
- "elfeed-search-tag-face",
- "elfeed-search-title-face",
- "elfeed-search-unread-count-face",
- "elfeed-search-unread-title-face"
- ],
- "embark": [
- "embark-collect-annotation",
- "embark-collect-candidate",
- "embark-collect-group-separator",
- "embark-collect-group-title",
- "embark-keybinding",
- "embark-keybinding-repeat",
- "embark-keymap",
- "embark-selected",
- "embark-target",
- "embark-verbose-indicator-documentation",
- "embark-verbose-indicator-shadowed",
- "embark-verbose-indicator-title"
- ],
- "emms": [
- "emms-browser-album-face",
- "emms-browser-albumartist-face",
- "emms-browser-artist-face",
- "emms-browser-composer-face",
- "emms-browser-performer-face",
- "emms-browser-track-face",
- "emms-browser-year/genre-face",
- "emms-metaplaylist-mode-current-face",
- "emms-metaplaylist-mode-face",
- "emms-playlist-selected-face",
- "emms-playlist-track-face"
- ],
- "flycheck": [
- "flycheck-delimited-error",
- "flycheck-error",
- "flycheck-error-delimiter",
- "flycheck-error-list-checker-name",
- "flycheck-error-list-column-number",
- "flycheck-error-list-error",
- "flycheck-error-list-error-message",
- "flycheck-error-list-filename",
- "flycheck-error-list-highlight",
- "flycheck-error-list-id",
- "flycheck-error-list-id-with-explainer",
- "flycheck-error-list-info",
- "flycheck-error-list-line-number",
- "flycheck-error-list-warning",
- "flycheck-fringe-error",
- "flycheck-fringe-info",
- "flycheck-fringe-warning",
- "flycheck-info",
- "flycheck-verify-select-checker",
- "flycheck-warning"
- ],
- "flyspell-correct": [
- "flyspell-correct-highlight-face"
- ],
- "ghostel": [
- "ghostel-color-black",
- "ghostel-color-blue",
- "ghostel-color-bright-black",
- "ghostel-color-bright-blue",
- "ghostel-color-bright-cyan",
- "ghostel-color-bright-green",
- "ghostel-color-bright-magenta",
- "ghostel-color-bright-red",
- "ghostel-color-bright-white",
- "ghostel-color-bright-yellow",
- "ghostel-color-cyan",
- "ghostel-color-green",
- "ghostel-color-magenta",
- "ghostel-color-red",
- "ghostel-color-white",
- "ghostel-color-yellow",
- "ghostel-default",
- "ghostel-fake-cursor",
- "ghostel-fake-cursor-box"
- ],
- "git-gutter": [
- "git-gutter:added",
- "git-gutter:deleted",
- "git-gutter:modified",
- "git-gutter:separator",
- "git-gutter:unchanged"
- ],
- "highlight-indent-guides": [
- "highlight-indent-guides-character-face",
- "highlight-indent-guides-even-face",
- "highlight-indent-guides-odd-face",
- "highlight-indent-guides-stack-character-face",
- "highlight-indent-guides-stack-even-face",
- "highlight-indent-guides-stack-odd-face",
- "highlight-indent-guides-top-character-face",
- "highlight-indent-guides-top-even-face",
- "highlight-indent-guides-top-odd-face"
- ],
- "hl-todo": [
- "hl-todo",
- "hl-todo-flymake-type"
- ],
- "json-mode": [
- "json-mode-object-name-face"
- ],
- "llama": [
- "llama-##-macro",
- "llama-deleted-argument",
- "llama-llama-macro",
- "llama-mandatory-argument",
- "llama-optional-argument"
- ],
- "lsp-mode": [
- "lsp-details-face",
- "lsp-face-highlight-read",
- "lsp-face-highlight-textual",
- "lsp-face-highlight-write",
- "lsp-face-rename",
- "lsp-inlay-hint-face",
- "lsp-inlay-hint-parameter-face",
- "lsp-inlay-hint-type-face",
- "lsp-installation-buffer-face",
- "lsp-installation-finished-buffer-face",
- "lsp-rename-placeholder-face",
- "lsp-signature-face",
- "lsp-signature-highlight-function-argument",
- "lsp-signature-posframe"
- ],
- "lv": [
- "lv-separator"
- ],
- "magit": [
- "git-commit-comment-action",
- "git-commit-comment-branch-local",
- "git-commit-comment-branch-remote",
- "git-commit-comment-detached",
- "git-commit-comment-file",
- "git-commit-comment-heading",
- "git-commit-keyword",
- "git-commit-nonempty-second-line",
- "git-commit-overlong-summary",
- "git-commit-summary",
- "git-commit-trailer-token",
- "git-commit-trailer-value",
- "magit-bisect-bad",
- "magit-bisect-good",
- "magit-bisect-skip",
- "magit-blame-date",
- "magit-blame-dimmed",
- "magit-blame-hash",
- "magit-blame-heading",
- "magit-blame-highlight",
- "magit-blame-margin",
- "magit-blame-name",
- "magit-blame-summary",
- "magit-branch-current",
- "magit-branch-local",
- "magit-branch-remote",
- "magit-branch-remote-head",
- "magit-branch-upstream",
- "magit-branch-warning",
- "magit-cherry-equivalent",
- "magit-cherry-unmatched",
- "magit-diff-added",
- "magit-diff-added-highlight",
- "magit-diff-base",
- "magit-diff-base-highlight",
- "magit-diff-conflict-heading",
- "magit-diff-conflict-heading-highlight",
- "magit-diff-context",
- "magit-diff-context-highlight",
- "magit-diff-file-heading",
- "magit-diff-file-heading-highlight",
- "magit-diff-file-heading-selection",
- "magit-diff-hunk-heading",
- "magit-diff-hunk-heading-highlight",
- "magit-diff-hunk-heading-selection",
- "magit-diff-hunk-region",
- "magit-diff-lines-boundary",
- "magit-diff-lines-heading",
- "magit-diff-our",
- "magit-diff-our-highlight",
- "magit-diff-removed",
- "magit-diff-removed-highlight",
- "magit-diff-revision-summary",
- "magit-diff-revision-summary-highlight",
- "magit-diff-their",
- "magit-diff-their-highlight",
- "magit-diff-whitespace-warning",
- "magit-diffstat-added",
- "magit-diffstat-removed",
- "magit-dimmed",
- "magit-filename",
- "magit-hash",
- "magit-head",
- "magit-header-line",
- "magit-header-line-key",
- "magit-header-line-log-select",
- "magit-keyword",
- "magit-keyword-squash",
- "magit-log-author",
- "magit-log-date",
- "magit-log-graph",
- "magit-mode-line-process",
- "magit-mode-line-process-error",
- "magit-process-ng",
- "magit-process-ok",
- "magit-reflog-amend",
- "magit-reflog-checkout",
- "magit-reflog-cherry-pick",
- "magit-reflog-commit",
- "magit-reflog-merge",
- "magit-reflog-other",
- "magit-reflog-rebase",
- "magit-reflog-remote",
- "magit-reflog-reset",
- "magit-refname",
- "magit-refname-pullreq",
- "magit-refname-stash",
- "magit-refname-wip",
- "magit-sequence-done",
- "magit-sequence-drop",
- "magit-sequence-exec",
- "magit-sequence-head",
- "magit-sequence-onto",
- "magit-sequence-part",
- "magit-sequence-pick",
- "magit-sequence-stop",
- "magit-signature-bad",
- "magit-signature-error",
- "magit-signature-expired",
- "magit-signature-expired-key",
- "magit-signature-good",
- "magit-signature-revoked",
- "magit-signature-untrusted",
- "magit-tag"
- ],
- "magit-section": [
- "magit-left-margin",
- "magit-section-child-count",
- "magit-section-heading",
- "magit-section-heading-selection",
- "magit-section-highlight",
- "magit-section-secondary-heading"
- ],
- "malyon": [
- "malyon-face-bold",
- "malyon-face-error",
- "malyon-face-italic",
- "malyon-face-plain",
- "malyon-face-reverse"
- ],
- "marginalia": [
- "marginalia-archive",
- "marginalia-char",
- "marginalia-date",
- "marginalia-documentation",
- "marginalia-file-name",
- "marginalia-file-owner",
- "marginalia-file-priv-dir",
- "marginalia-file-priv-exec",
- "marginalia-file-priv-link",
- "marginalia-file-priv-no",
- "marginalia-file-priv-other",
- "marginalia-file-priv-rare",
- "marginalia-file-priv-read",
- "marginalia-file-priv-write",
- "marginalia-function",
- "marginalia-installed",
- "marginalia-key",
- "marginalia-lighter",
- "marginalia-list",
- "marginalia-mode",
- "marginalia-modified",
- "marginalia-null",
- "marginalia-number",
- "marginalia-off",
- "marginalia-on",
- "marginalia-size",
- "marginalia-string",
- "marginalia-symbol",
- "marginalia-true",
- "marginalia-type",
- "marginalia-value",
- "marginalia-version"
- ],
- "markdown-mode": [
- "markdown-blockquote-face",
- "markdown-bold-face",
- "markdown-code-face",
- "markdown-comment-face",
- "markdown-footnote-marker-face",
- "markdown-footnote-text-face",
- "markdown-gfm-checkbox-face",
- "markdown-header-delimiter-face",
- "markdown-header-face",
- "markdown-header-face-1",
- "markdown-header-face-2",
- "markdown-header-face-3",
- "markdown-header-face-4",
- "markdown-header-face-5",
- "markdown-header-face-6",
- "markdown-header-rule-face",
- "markdown-highlight-face",
- "markdown-highlighting-face",
- "markdown-hr-face",
- "markdown-html-attr-name-face",
- "markdown-html-attr-value-face",
- "markdown-html-entity-face",
- "markdown-html-tag-delimiter-face",
- "markdown-html-tag-name-face",
- "markdown-inline-code-face",
- "markdown-italic-face",
- "markdown-language-info-face",
- "markdown-language-keyword-face",
- "markdown-line-break-face",
- "markdown-link-face",
- "markdown-link-title-face",
- "markdown-list-face",
- "markdown-markup-face",
- "markdown-math-face",
- "markdown-metadata-key-face",
- "markdown-metadata-value-face",
- "markdown-missing-link-face",
- "markdown-plain-url-face",
- "markdown-pre-face",
- "markdown-reference-face",
- "markdown-strike-through-face",
- "markdown-table-face",
- "markdown-url-face"
- ],
- "nerd-icons": [
- "nerd-icons-blue",
- "nerd-icons-blue-alt",
- "nerd-icons-cyan",
- "nerd-icons-cyan-alt",
- "nerd-icons-dblue",
- "nerd-icons-dcyan",
- "nerd-icons-dgreen",
- "nerd-icons-dmaroon",
- "nerd-icons-dorange",
- "nerd-icons-dpink",
- "nerd-icons-dpurple",
- "nerd-icons-dred",
- "nerd-icons-dsilver",
- "nerd-icons-dyellow",
- "nerd-icons-green",
- "nerd-icons-lblue",
- "nerd-icons-lcyan",
- "nerd-icons-lgreen",
- "nerd-icons-lmaroon",
- "nerd-icons-lorange",
- "nerd-icons-lpink",
- "nerd-icons-lpurple",
- "nerd-icons-lred",
- "nerd-icons-lsilver",
- "nerd-icons-lyellow",
- "nerd-icons-maroon",
- "nerd-icons-orange",
- "nerd-icons-pink",
- "nerd-icons-purple",
- "nerd-icons-purple-alt",
- "nerd-icons-red",
- "nerd-icons-red-alt",
- "nerd-icons-silver",
- "nerd-icons-yellow"
- ],
- "nerd-icons-completion": [
- "nerd-icons-completion-dir-face"
- ],
- "orderless": [
- "orderless-match-face-0",
- "orderless-match-face-1",
- "orderless-match-face-2",
- "orderless-match-face-3"
- ],
- "org-roam": [
- "org-roam-dailies-calendar-note",
- "org-roam-dim",
- "org-roam-header-line",
- "org-roam-olp",
- "org-roam-preview-heading",
- "org-roam-preview-heading-highlight",
- "org-roam-preview-heading-selection",
- "org-roam-preview-region",
- "org-roam-title"
- ],
- "org-superstar": [
- "org-superstar-first",
- "org-superstar-header-bullet",
- "org-superstar-item",
- "org-superstar-leading"
- ],
- "prescient": [
- "prescient-primary-highlight",
- "prescient-secondary-highlight"
- ],
- "rainbow-delimiters": [
- "rainbow-delimiters-base-error-face",
- "rainbow-delimiters-base-face",
- "rainbow-delimiters-depth-1-face",
- "rainbow-delimiters-depth-2-face",
- "rainbow-delimiters-depth-3-face",
- "rainbow-delimiters-depth-4-face",
- "rainbow-delimiters-depth-5-face",
- "rainbow-delimiters-depth-6-face",
- "rainbow-delimiters-depth-7-face",
- "rainbow-delimiters-depth-8-face",
- "rainbow-delimiters-depth-9-face",
- "rainbow-delimiters-mismatched-face",
- "rainbow-delimiters-unmatched-face"
- ],
- "symbol-overlay": [
- "symbol-overlay-default-face",
- "symbol-overlay-face-1",
- "symbol-overlay-face-2",
- "symbol-overlay-face-3",
- "symbol-overlay-face-4",
- "symbol-overlay-face-5",
- "symbol-overlay-face-6",
- "symbol-overlay-face-7",
- "symbol-overlay-face-8"
- ],
- "tmr": [
- "tmr-description",
- "tmr-duration",
- "tmr-end-time",
- "tmr-finished",
- "tmr-is-acknowledged",
- "tmr-must-be-acknowledged",
- "tmr-start-time",
- "tmr-tabulated-acknowledgement",
- "tmr-tabulated-description",
- "tmr-tabulated-end-time",
- "tmr-tabulated-remaining-time",
- "tmr-tabulated-start-time"
- ],
- "transient": [
- "transient-active-infix",
- "transient-argument",
- "transient-delimiter",
- "transient-disabled-suffix",
- "transient-enabled-suffix",
- "transient-heading",
- "transient-higher-level",
- "transient-inactive-argument",
- "transient-inactive-value",
- "transient-inapt-argument",
- "transient-inapt-suffix",
- "transient-key",
- "transient-key-exit",
- "transient-key-noop",
- "transient-key-recurse",
- "transient-key-return",
- "transient-key-stack",
- "transient-key-stay",
- "transient-mismatched-key",
- "transient-nonstandard-key",
- "transient-unreachable",
- "transient-unreachable-key",
- "transient-value"
- ],
- "vertico": [
- "vertico-current",
- "vertico-group-separator",
- "vertico-group-title",
- "vertico-multiline"
- ],
- "web-mode": [
- "web-mode-annotation-face",
- "web-mode-annotation-html-face",
- "web-mode-annotation-tag-face",
- "web-mode-annotation-type-face",
- "web-mode-annotation-value-face",
- "web-mode-block-attr-name-face",
- "web-mode-block-attr-value-face",
- "web-mode-block-comment-face",
- "web-mode-block-control-face",
- "web-mode-block-delimiter-face",
- "web-mode-block-face",
- "web-mode-block-string-face",
- "web-mode-bold-face",
- "web-mode-builtin-face",
- "web-mode-comment-face",
- "web-mode-comment-keyword-face",
- "web-mode-constant-face",
- "web-mode-css-at-rule-face",
- "web-mode-css-color-face",
- "web-mode-css-comment-face",
- "web-mode-css-function-face",
- "web-mode-css-priority-face",
- "web-mode-css-property-name-face",
- "web-mode-css-pseudo-class-face",
- "web-mode-css-selector-class-face",
- "web-mode-css-selector-face",
- "web-mode-css-selector-tag-face",
- "web-mode-css-string-face",
- "web-mode-css-variable-face",
- "web-mode-current-column-highlight-face",
- "web-mode-current-element-highlight-face",
- "web-mode-doctype-face",
- "web-mode-error-face",
- "web-mode-filter-face",
- "web-mode-folded-face",
- "web-mode-function-call-face",
- "web-mode-function-name-face",
- "web-mode-html-attr-custom-face",
- "web-mode-html-attr-engine-face",
- "web-mode-html-attr-equal-face",
- "web-mode-html-attr-name-face",
- "web-mode-html-attr-value-face",
- "web-mode-html-entity-face",
- "web-mode-html-tag-bracket-face",
- "web-mode-html-tag-custom-face",
- "web-mode-html-tag-face",
- "web-mode-html-tag-namespaced-face",
- "web-mode-html-tag-unclosed-face",
- "web-mode-inlay-face",
- "web-mode-interpolate-color1-face",
- "web-mode-interpolate-color2-face",
- "web-mode-interpolate-color3-face",
- "web-mode-interpolate-color4-face",
- "web-mode-italic-face",
- "web-mode-javascript-comment-face",
- "web-mode-javascript-string-face",
- "web-mode-json-comment-face",
- "web-mode-json-context-face",
- "web-mode-json-key-face",
- "web-mode-json-string-face",
- "web-mode-jsx-depth-1-face",
- "web-mode-jsx-depth-2-face",
- "web-mode-jsx-depth-3-face",
- "web-mode-jsx-depth-4-face",
- "web-mode-jsx-depth-5-face",
- "web-mode-keyword-face",
- "web-mode-param-name-face",
- "web-mode-part-comment-face",
- "web-mode-part-face",
- "web-mode-part-string-face",
- "web-mode-preprocessor-face",
- "web-mode-script-face",
- "web-mode-sql-keyword-face",
- "web-mode-string-face",
- "web-mode-style-face",
- "web-mode-symbol-face",
- "web-mode-type-face",
- "web-mode-underline-face",
- "web-mode-variable-name-face",
- "web-mode-warning-face",
- "web-mode-whitespace-face"
- ],
- "yasnippet": [
- "yas--field-debug-face",
- "yas-field-highlight-face"
- ]
-}
diff --git a/scripts/theme-selector/samples.py b/scripts/theme-selector/samples.py
deleted file mode 100644
index e487cc5e..00000000
--- a/scripts/theme-selector/samples.py
+++ /dev/null
@@ -1,269 +0,0 @@
-GROUND="#0d0b0a"
-COLS={
- 'kw':("#67809c",True),'bi':("#67809c",False),'pp':("#67809c",False),
- 'fnd':("#a9b2bb",True),'fnc':("#a9b2bb",False),'dec':("#e8bd30",False),
- 'ty':("#9b5fd0",False),'prop':("#838d97",False),
- 'con':("#cb6b4d",False),'num':("#cb6b4d",False),'esc':("#cb6b4d",False),
- 'str':("#2ba178",False),'re':("#5d9b86",False),'doc':("#5d9b86",False),
- 'cm':("#be9e74",False),'cmd':("#a9b2bb",False),
- 'var':("#e8bd30",False),'op':("#a9b2bb",False),'punc':("#a9b2bb",False),'p':("#ffffff",False),
-}
-NAMES={"#67809c":"blue","#e8bd30":"gold","#9b5fd0":"regal","#2ba178":"emerald","#cb6b4d":"terracotta","#be9e74":"tan","#5d9b86":"sage","#cdced1":"white","#a9b2bb":"silver","#838d97":"steel","#5e6770":"pewter","#2f343a":"gunmetal","#264364":"navy"}
-def esc(t): return t.replace("&","&amp;").replace("<","&lt;").replace(">","&gt;")
-def span(k,t):
- c,b=COLS[k]; w=";font-weight:bold" if b else ""
- return f'<span style="color:{c}{w}">{esc(t)}</span>'
-def render(lines): return "\n".join("".join(span(k,t) for k,t in ln) or "&nbsp;" for ln in lines)
-
-PYS=[
- [('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','))')],
-]
-ELS=[
- [('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',')')],
-]
-GOS=[
- [('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','}')],
-]
-TSS=[
- [('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',';')],
-]
-
-CS=[
- [('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','}')],
-]
-CPS=[
- [('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','}')],
-]
-JAS=[
- [('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','}')],
-]
-SHS=[
- [('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','"$@"')],
-]
-
-cols="".join(f'<div class="col"><h2>{n}</h2><pre>{render(s)}</pre></div>' for n,s in [("Elisp",ELS),("Go",GOS),("Python",PYS),("TypeScript",TSS),("Java",JAS),("C",CS),("C++",CPS),("Shell",SHS)])
-legend_rows=[
- ("keyword (bold)","kw","class def if return import"),("builtin","bi","len range print"),
- ("function — definition (bold)","fnd","resolve cache-get push"),("function — call","fnc","get append fmt.Errorf"),
- ("decorator / attribute","dec","@dataclass @Injectable"),("type / class","ty","str dict Order Queue boolean"),
- ("property / field / key","prop","name colors items id re"),("constant","con","None nil true MaxItems :test"),
- ("number","num","8080 100 42 0"),("string","str",'"dupre" "fmt" `id`'),("escape","esc",r'\t \n'),
- ("regexp","re",'/^#[0-9a-f]{6}$/i'),("docstring","doc",'"""..." "Memo table."'),
- ("comment","cm","# reject nil // fallback"),("comment delimiter","cmd","# // ;; /*"),
- ("variable / use","var","v key self q console"),("operator","op",": = -> | == === . *"),
- ("punctuation / bracket","punc","{ } ( ) [ ] , ;"),
-]
-def lrow(label,k,ex):
- c,b=COLS[k]
- return f'<tr><td class="sw" style="background:{c}"></td><td class="nm">{NAMES.get(c,"")}</td><td class="hx">{c}</td><td class="cat">{label}</td><td class="ex" style="color:{c}{";font-weight:bold" if b else ""}">{esc(ex)}</td></tr>'
-legend="".join(lrow(l,k,e) for l,k,e in legend_rows)
-def grp(title,items):
- sw="".join(f'<div class="m"><div class="psw" style="background:{h}"></div><div class="lb">{n}<br>{h}</div></div>' for n,h in items)
- return f'<div class="g"><div class="gt">{title}</div><div class="ramp">{sw}</div></div>'
-palette=(grp("ground / foreground",[("ground","#0d0b0a"),("bg-dim","#1a1714"),("fg","#cdced1")])
- + grp("syntax hues",[("blue · keyword","#67809c"),("gold · variable","#e8bd30"),("regal · type","#9b5fd0"),("emerald · string","#2ba178"),("terracotta · const/num","#cb6b4d"),("tan · comment","#be9e74")])
- + grp("metallic greyscale (structural)",[("gunmetal","#2f343a"),("metal","#474e56"),("pewter","#5e6770"),("steel · property","#838d97"),("silver · fn/op/punct","#a9b2bb"),("bright · fg","#cdced1")])
- + grp("special green + fills",[("muted emerald · doc/regexp","#5d9b86"),("navy fill","#264364"),("gunmetal fill","#2f343a")]))
-html=f'''<!doctype html><meta charset=utf-8><title>dupre revision — canonical</title>
-<style>body{{background:{GROUND};color:#cdced1;font:15px/1.55 monospace;margin:20px}}
- h1{{font-size:22px;font-weight:normal;color:#e8bd30;margin:26px 0 10px;border-bottom:1px solid #252321;padding-bottom:6px}}
- h2{{font-size:13px;color:#8a9496;font-weight:normal;margin:0 0 4px}}
- .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:19px;overflow:auto}}
- table.leg{{border-collapse:collapse}} table.leg td{{padding:3px 10px;vertical-align:middle}} table.leg th{{cursor:pointer;color:#b4b1a2;text-align:left;padding:3px 10px;user-select:none;font-weight:normal}} table.leg th:hover{{color:#e8bd30}}
- .sw{{width:26px;height:16px;border-radius:3px;border:1px solid #00000060}} .nm{{color:#c0c5ca;font-size:12px}} .hx{{color:#969385;font-size:11px}} .cat{{color:#b4b1a2}} .ex{{font-size:18px}}
- .g{{margin:4px 0 10px}} .gt{{color:#8a9496;font-size:12px;margin-bottom:4px}}
- .ramp{{display:flex;gap:8px;flex-wrap:wrap}} .m{{text-align:center}} .psw{{width:120px;height:30px;border-radius:5px;border:1px solid #00000060}} .lb{{font-size:10px;color:#969385;margin-top:3px}}</style>
-<h1>code samples</h1>
-<div class="wrap">{cols}</div>
-<h1>color &rarr; tree-sitter category assignment &mdash; click a header to sort</h1>
-<table class="leg" id="legtable"><thead><tr><th></th><th onclick="srt(1)">color &#9651;</th><th onclick="srt(2)">hex &#9651;</th><th onclick="srt(3)">category &#9651;</th><th>example</th></tr></thead><tbody>{legend}</tbody></table>
-<h1>palette</h1>
-{palette}\n<script>let D={{}};function srt(c){{const t=document.querySelector("#legtable tbody");const r=[...t.rows];D[c]=!D[c];r.sort((a,b)=>{{const x=a.cells[c].innerText.trim().toLowerCase(),y=b.cells[c].innerText.trim().toLowerCase();return (x<y?-1:x>y?1:0)*(D[c]?1:-1)}});r.forEach(x=>t.appendChild(x))}}</script>'''
-open("/tmp/dupre-canon.html","w").write(html)
-print("wrote /tmp/dupre-canon.html")
diff --git a/scripts/theme-selector/theme-selector.html b/scripts/theme-selector/theme-selector.html
deleted file mode 100644
index 30279c74..00000000
--- a/scripts/theme-selector/theme-selector.html
+++ /dev/null
@@ -1,738 +0,0 @@
-<!doctype html><meta charset=utf-8><title>theme-selector</title>
-<style>
- body{background:#0d0b0a;color:#cdced1;font:15px/1.55 monospace;margin:20px}
- h1{font-size:22px;font-weight:normal;color:#e8bd30;margin:26px 0 10px;border-bottom:1px solid #252321;padding-bottom:6px}
- h2{font-size:10pt;color:#8a9496;font-weight:normal;margin:0 0 4px}
- .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 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}
- .cat{color:#b4b1a2} .ex{font-size:17px}
- .sbtn{width:26px;height:24px;border:1px solid #3a3a3a;border-radius:3px;background:#eaeaea;color:#111;cursor:pointer;font-size:15px;margin-right:2px;padding:0}
- .sbtn.on{background:#0d0b0a;color:#cdced1;border-color:#8a9496}
- .pals{display:flex;gap:8px;flex-wrap:wrap}
- .pchip{width:128px;height:58px;border-radius:6px;border:1px solid #555;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:grab}
- .pchip.drag{opacity:.4} .pchip.sel{outline:3px solid #e8bd30;outline-offset:2px} .pchip.over{outline:2px dashed #e8bd30;outline-offset:1px} .pchip input.nm{background:transparent;border:none;text-align:center;font:bold 10pt monospace;width:108px;outline:none}
- .pchip .mv{position:absolute;bottom:-1px;background:none;border:none;cursor:pointer;font-size:22px;line-height:1;font-weight:bold;opacity:.5;padding:0 5px} .pchip .mv:hover{opacity:1} .pchip .mv.l{left:0} .pchip .mv.r{right:0}
- .pchip .hx{font-size:10pt;opacity:.8} .pchip .rm{position:absolute;top:2px;right:5px;background:none;border:none;cursor:pointer;font-size:14px;font-weight:bold;opacity:.7}
- .pchip .lock{position:absolute;top:3px;right:5px;font-size:10px;opacity:.6}
- .palctl{margin-top:12px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
- .palctl input[type=text]{background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace}
- .palctl input[type=text]::placeholder{color:#b4b1a2;opacity:1}
- .palctl{position:relative}
- .swatch{width:128px;height:58px;border:1px solid #555;border-radius:6px;cursor:pointer;background:#888}
- .picker{display:none;position:absolute;top:66px;left:0;z-index:60;background:#161412;border:1px solid #3a3a3a;border-radius:8px;padding:12px;box-shadow:0 10px 30px #000b;width:470px}
- .picker .prow{display:flex;gap:10px}
- .sv{position:relative;width:400px;height:320px;border-radius:4px;cursor:crosshair}
- .svmask{position:absolute;inset:0;pointer-events:none;border-radius:4px}
- .pmode{margin:2px 2px 8px;font:10pt monospace;color:#b4b1a2;display:flex;gap:6px;align-items:center}
- .pmode button{background:#252321;color:#cdced1;border:1px solid #3a3a3a;border-radius:4px;padding:2px 9px;font:10pt monospace;cursor:pointer}
- .pmode button.on{background:#e8bd30;color:#000;border-color:#e8bd30}
- .svcur{position:absolute;width:16px;height:16px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #0008;pointer-events:none}
- .hue{position:relative;width:34px;height:320px;border-radius:4px;cursor:ns-resize;background:linear-gradient(to bottom,#f00,#ff0,#0f0,#0ff,#00f,#f0f,#f00)}
- .huecur{position:absolute;left:-2px;right:-2px;height:4px;background:#fff;border:1px solid #0008;transform:translateY(-50%);pointer-events:none}
- .pinfo{display:flex;justify-content:space-between;margin:10px 2px 8px;font:12pt monospace;color:#cdced1}
- .pkchips{display:flex;flex-wrap:wrap;gap:5px} .pkchips .pc{width:28px;height:28px;border-radius:3px;border:1px solid #555;cursor:pointer}
- .palctl button,.filebar button,.fbtn{background:#252321;color:#e8bd30;border:1px solid #3a3a3a;border-radius:4px;padding:6px 12px;font:10pt monospace;cursor:pointer}
- #palmsg{font:10pt monospace;opacity:0;transition:opacity .35s;margin-left:6px}
- #export{width:100%;height:180px;margin-top:10px;background:#0d0b0a;color:#a4ac64;border:1px solid #252321;border-radius:6px;font:10pt monospace;padding:10px}
- .filebar{margin:6px 0 0;display:flex;gap:8px;align-items:center}
- #pagetitle{font-size:30px;color:#cdced1;font-weight:normal;border:none;margin:4px 0 18px;padding:0}
- .cols{display:flex;gap:28px;align-items:flex-start} .cols.stretch{align-items:stretch}
- .pane{min-width:0} .pane.grow{flex:1} .pane.saveload{flex:0 0 auto;margin-left:auto}
- .pane h1{margin-top:0}
- .filebar.end{justify-content:flex-end} .langbar{margin-bottom:10px;display:flex;gap:8px;align-items:center}
- .pkgbar{margin:0 0 10px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
- .pkgbar button{background:#252321;color:#e8bd30;border:1px solid #3a3a3a;border-radius:4px;padding:6px 12px;font:10pt monospace;cursor:pointer}
- .hstep{background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:3px 4px;font:10pt monospace;width:56px}
- #pkgbody td{padding:3px 8px}
- #codepre{width:100%;box-sizing:border-box}
- .mock{border:1px solid #252321;border-radius:8px;overflow:hidden;font:12pt/1.7 monospace;display:flex;flex-direction:column}
- .mock .mbuf{flex:1} .mock .ln{display:flex;align-items:stretch;white-space:pre}
- .mock .fr{width:14px;flex:0 0 auto;border-right:1px solid #ffffff14} .mock .num{width:36px;flex:0 0 auto;text-align:right;padding-right:10px}
- .mock .cd{flex:1;padding-left:8px} .mock .bar,.mock .echo{padding:4px 10px;white-space:pre}
- #codepre [data-k],.mock [data-k],.mock [data-face]{cursor:pointer}
- @keyframes flashcell{0%,55%{background:#e8bd3066}100%{background:transparent}}
- tr.flash td{animation:flashcell 1.1s ease-out}
- @keyframes flashtok{0%,55%{background:#e8bd30aa;color:#000}100%{background:transparent}}
- #codepre .flashtok,.ex.flashtok{animation:flashtok 1.1s ease-out;border-radius:2px}
-</style>
-<h1 id="pagetitle">Untitled: theme</h1>
-<div class="cols">
- <section class="pane grow">
- <h1>palette</h1>
- <div class="pals" id="pals"></div>
- <div class="palctl">
- <div id="swatch" class="swatch" title="open color picker"></div>
- <input type="text" id="newhexstr" placeholder="#rrggbb" value="#888888" oninput="syncHex()" onkeydown="if(event.key==='Enter')applyEdit()" style="width:110px">
- <input type="text" id="newname" placeholder="name" onkeydown="if(event.key==='Enter')applyEdit()">
- <button onclick="addColor()">+ add color</button>
- <button onclick="updateColor()">&#8635; update selected</button>
- <span id="palmsg"></span>
- <div id="picker" class="picker">
- <div class="prow">
- <div id="sv" class="sv"><canvas id="svmask" class="svmask"></canvas><div id="svcur" class="svcur"></div></div>
- <div id="hue" class="hue"><div id="huecur" class="huecur"></div></div>
- </div>
- <div class="pinfo"><span id="pkhex">#888888</span><span id="pkcon"></span></div>
- <div class="pmode">limit <button data-m="any" class="on">any</button><button data-m="aa">AA+</button><button data-m="aaa">AAA</button></div>
- <div id="pkchips" class="pkchips"></div>
- </div>
- </div>
- </section>
- <section class="pane saveload">
- <h1>export, import, and save</h1>
- <div class="filebar end">
- <label style="color:#b4b1a2">theme name</label><input type="text" id="themename" value="" placeholder="untitled" oninput="updateTitle()" style="background:#161412;border:1px solid #252321;color:#cdced1;border-radius:4px;padding:5px 8px;font:10pt monospace;width:200px">
- </div>
- <div class="filebar end">
- <button id="savebtn" onclick="saveTheme()" style="display:none">&#128190; save</button>
- <button onclick="exportTheme()">&#11015; export</button>
- <button class="fbtn" onclick="importTheme()">&#11014; import</button><input type="file" id="fileinput" accept=".json" onchange="importFile(event)" style="display:none">
- <button id="jsonbtn" onclick="toggleJSON()">show</button>
- </div>
- <textarea id="export" style="display:none" readonly></textarea>
- </section>
-</div>
-<h1>code/color assignments</h1>
-<div class="cols">
- <section class="pane">
- <table class="leg" id="legtable"><thead><tr><th onclick="srt(1)">elements &#9651;</th><th onclick="srt(0)">color &#9651;</th><th>style</th><th>example</th><th title="WCAG contrast of this color on the background">contrast</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()"></select></div>
- <pre id="codepre"></pre>
- </section>
-</div>
-<h1>ui faces</h1>
-<div class="cols stretch">
- <section class="pane">
- <table class="leg" id="uitable"><thead><tr><th onclick="srtTable('uibody',0)">face &#9651;</th><th onclick="srtTable('uibody',1)">foreground &#9651;</th><th onclick="srtTable('uibody',2)">background &#9651;</th><th>style</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>
- <div id="mockframe" class="mock"></div>
- </section>
-</div>
-<h1>package faces</h1>
-<div class="pkgbar">
- <label style="color:#b4b1a2">application</label><select id="appsel" class="chip" style="width:auto;font:bold 10pt monospace"></select>
- <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()">&#8635; reset all</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 onclick="srtTable('pkgbody',1)">fg &#9651;</th><th onclick="srtTable('pkgbody',2)">bg &#9651;</th><th>style</th><th onclick="srtTable('pkgbody',4)">inherit &#9651;</th><th onclick="srtTable('pkgbody',5)">size &#9651;</th><th onclick="srtTable('pkgbody',6)">contrast &#9651;</th><th></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>
- <div id="pkgpreview" class="mock" style="overflow:auto"></div>
- </section>
-</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", "}"]]], "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", "background (ground)", "Aa Bb 123"], ["p", "fg \u00b7 default text", "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", "@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", {"fg": "gold", "bold": true, "height": 1.5}], ["org-document-info", "document info", {"fg": "steel"}], ["org-document-info-keyword", "document info keyword", {"fg": "pewter", "inherit": "fixed-pitch"}], ["org-level-1", "level 1", {"fg": "blue", "bold": true, "height": 1.3}], ["org-level-2", "level 2", {"fg": "gold", "height": 1.2}], ["org-level-3", "level 3", {"fg": "regal", "height": 1.15}], ["org-level-4", "level 4", {"fg": "emerald", "height": 1.1}], ["org-level-5", "level 5", {"fg": "terracotta"}], ["org-level-6", "level 6", {"fg": "tan"}], ["org-level-7", "level 7", {"fg": "sage"}], ["org-level-8", "level 8", {"fg": "steel"}], ["org-headline-todo", "headline todo", {}], ["org-headline-done", "headline done", {"fg": "pewter"}], ["org-todo", "todo", {"fg": "terracotta", "bold": true}], ["org-done", "done", {"fg": "sage", "bold": true}], ["org-priority", "priority", {"fg": "gold", "bold": true}], ["org-tag", "tag", {"fg": "tan"}], ["org-tag-group", "tag group", {"fg": "tan"}], ["org-special-keyword", "special keyword", {"fg": "pewter"}], ["org-drawer", "drawer", {"fg": "pewter"}], ["org-property-value", "property value", {"fg": "steel"}], ["org-checkbox", "checkbox", {"fg": "gold", "inherit": "fixed-pitch"}], ["org-checkbox-statistics-todo", "checkbox statistics todo", {"fg": "terracotta"}], ["org-checkbox-statistics-done", "checkbox statistics done", {"fg": "sage"}], ["org-warning", "warning", {"fg": "terracotta", "bold": true}], ["org-link", "link", {"fg": "blue"}], ["org-footnote", "footnote", {"fg": "blue"}], ["org-date", "date", {"fg": "steel", "inherit": "fixed-pitch"}], ["org-sexp-date", "sexp date", {"fg": "steel"}], ["org-date-selected", "date selected", {"fg": "ground", "bg": "gold"}], ["org-target", "target", {"fg": "regal"}], ["org-macro", "macro", {"fg": "regal"}], ["org-cite", "cite", {"fg": "blue"}], ["org-cite-key", "cite key", {"fg": "blue"}], ["org-block", "block", {"fg": "white", "bg": "bg-dim", "inherit": "fixed-pitch"}], ["org-block-begin-line", "block begin line", {"fg": "pewter", "bg": "bg-dim", "inherit": "fixed-pitch"}], ["org-block-end-line", "block end line", {"fg": "pewter", "bg": "bg-dim", "inherit": "fixed-pitch"}], ["org-code", "code", {"fg": "terracotta", "inherit": "fixed-pitch"}], ["org-verbatim", "verbatim", {"fg": "steel", "inherit": "fixed-pitch"}], ["org-inline-src-block", "inline src block", {"fg": "terracotta", "inherit": "fixed-pitch"}], ["org-quote", "quote", {"fg": "silver", "italic": true}], ["org-verse", "verse", {"fg": "silver", "italic": true}], ["org-latex-and-related", "latex and related", {"fg": "gold"}], ["org-table", "table", {"fg": "steel", "inherit": "fixed-pitch"}], ["org-table-header", "table header", {"fg": "white", "bold": true, "bg": "gunmetal"}], ["org-table-row", "table row", {}], ["org-formula", "formula", {"fg": "terracotta"}], ["org-column", "column", {"bg": "gunmetal"}], ["org-column-title", "column title", {"fg": "white", "bold": true, "bg": "gunmetal"}], ["org-list-dt", "list dt", {"fg": "gold", "bold": true}], ["org-meta-line", "meta line", {"fg": "pewter", "inherit": "fixed-pitch"}], ["org-ellipsis", "ellipsis", {"fg": "pewter"}], ["org-hide", "hide", {"fg": "ground"}], ["org-indent", "indent", {"fg": "ground"}], ["org-archived", "archived", {"fg": "pewter"}], ["org-default", "default", {}], ["org-dispatcher-highlight", "dispatcher highlight", {"fg": "gold", "bold": true, "bg": "navy"}], ["org-agenda-structure", "agenda structure", {"fg": "blue", "bold": true, "height": 1.1}], ["org-agenda-structure-secondary", "agenda structure secondary", {"fg": "blue"}], ["org-agenda-structure-filter", "agenda structure filter", {"fg": "terracotta", "bold": true}], ["org-agenda-date", "agenda date", {"fg": "steel", "height": 1.05}], ["org-agenda-date-today", "agenda date today", {"fg": "gold", "bold": true, "height": 1.05}], ["org-agenda-date-weekend", "agenda date weekend", {"fg": "steel", "bold": true}], ["org-agenda-date-weekend-today", "agenda date weekend today", {"fg": "gold", "bold": true}], ["org-agenda-current-time", "agenda current time", {"fg": "gold"}], ["org-agenda-done", "agenda done", {"fg": "sage"}], ["org-agenda-dimmed-todo-face", "agenda dimmed todo", {"fg": "pewter"}], ["org-agenda-calendar-event", "agenda calendar event", {"fg": "white"}], ["org-agenda-calendar-sexp", "agenda calendar sexp", {"fg": "steel"}], ["org-agenda-calendar-daterange", "agenda calendar daterange", {"fg": "steel"}], ["org-agenda-diary", "agenda diary", {"fg": "sage"}], ["org-agenda-clocking", "agenda clocking", {"bg": "navy"}], ["org-agenda-column-dateline", "agenda column dateline", {"bg": "gunmetal"}], ["org-agenda-restriction-lock", "agenda restriction lock", {"bg": "terracotta"}], ["org-agenda-filter-category", "agenda filter category", {"fg": "gold", "bold": true}], ["org-agenda-filter-effort", "agenda filter effort", {"fg": "gold", "bold": true}], ["org-agenda-filter-regexp", "agenda filter regexp", {"fg": "gold", "bold": true}], ["org-agenda-filter-tags", "agenda filter tags", {"fg": "gold", "bold": true}], ["org-scheduled", "scheduled", {"fg": "sage"}], ["org-scheduled-today", "scheduled today", {"fg": "sage", "bold": true}], ["org-scheduled-previously", "scheduled previously", {"fg": "terracotta"}], ["org-upcoming-deadline", "upcoming deadline", {"fg": "gold"}], ["org-upcoming-distant-deadline", "upcoming distant deadline", {"fg": "tan"}], ["org-imminent-deadline", "imminent deadline", {"fg": "terracotta", "bold": true}], ["org-time-grid", "time grid", {"fg": "tan"}], ["org-clock-overlay", "clock overlay", {"bg": "navy"}], ["org-mode-line-clock", "mode line clock", {"fg": "steel"}], ["org-mode-line-clock-overrun", "mode line clock overrun", {"fg": "terracotta", "bold": true}]]}, "magit": {"label": "magit", "preview": "magit", "faces": [["magit-section-heading", "section heading", {"fg": "gold", "bold": true}], ["magit-section-secondary-heading", "section secondary heading", {"fg": "tan", "bold": true}], ["magit-section-heading-selection", "section heading selection", {"fg": "gold", "bg": "navy"}], ["magit-section-highlight", "section highlight", {"bg": "bg-dim"}], ["magit-section-child-count", "section child count", {"fg": "pewter"}], ["magit-diff-added", "diff added", {"fg": "sage"}], ["magit-diff-added-highlight", "diff added highlight", {"fg": "sage", "bg": "bg-dim"}], ["magit-diff-removed", "diff removed", {"fg": "terracotta"}], ["magit-diff-removed-highlight", "diff removed highlight", {"fg": "terracotta", "bg": "bg-dim"}], ["magit-diff-context", "diff context", {"fg": "pewter"}], ["magit-diff-context-highlight", "diff context highlight", {"fg": "silver", "bg": "bg-dim"}], ["magit-diff-file-heading", "diff file heading", {"fg": "white", "bold": true}], ["magit-diff-file-heading-highlight", "diff file heading highlight", {"fg": "white", "bold": true, "bg": "bg-dim"}], ["magit-diff-file-heading-selection", "diff file heading selection", {}], ["magit-diff-hunk-heading", "diff hunk heading", {"fg": "steel", "bg": "gunmetal"}], ["magit-diff-hunk-heading-highlight", "diff hunk heading highlight", {"fg": "white", "bg": "gunmetal"}], ["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", {"bg": "terracotta"}], ["magit-diffstat-added", "diffstat added", {"fg": "sage"}], ["magit-diffstat-removed", "diffstat removed", {"fg": "terracotta"}], ["magit-branch-current", "branch current", {"fg": "blue", "bold": true}], ["magit-branch-local", "branch local", {"fg": "blue"}], ["magit-branch-remote", "branch remote", {"fg": "sage"}], ["magit-branch-remote-head", "branch remote head", {"fg": "sage", "bold": true}], ["magit-branch-upstream", "branch upstream", {}], ["magit-branch-warning", "branch warning", {}], ["magit-head", "head", {"fg": "blue", "bold": true}], ["magit-tag", "tag", {"fg": "gold"}], ["magit-hash", "hash", {"fg": "pewter"}], ["magit-filename", "filename", {"fg": "steel"}], ["magit-dimmed", "dimmed", {"fg": "pewter"}], ["magit-keyword", "keyword", {"fg": "regal"}], ["magit-keyword-squash", "keyword squash", {"fg": "terracotta"}], ["magit-refname", "refname", {"fg": "pewter"}], ["magit-refname-stash", "refname stash", {}], ["magit-refname-wip", "refname wip", {}], ["magit-refname-pullreq", "refname pullreq", {}], ["magit-log-author", "log author", {"fg": "tan"}], ["magit-log-date", "log date", {"fg": "steel"}], ["magit-log-graph", "log graph", {"fg": "pewter"}], ["magit-header-line", "header line", {"fg": "white", "bold": true, "bg": "gunmetal"}], ["magit-header-line-key", "header line key", {}], ["magit-header-line-log-select", "header line log select", {}], ["magit-process-ok", "process ok", {"fg": "sage", "bold": true}], ["magit-process-ng", "process ng", {"fg": "terracotta", "bold": true}], ["magit-mode-line-process", "mode line process", {"fg": "sage"}], ["magit-mode-line-process-error", "mode line process error", {"fg": "terracotta"}], ["magit-bisect-good", "bisect good", {"fg": "sage"}], ["magit-bisect-bad", "bisect bad", {"fg": "terracotta"}], ["magit-bisect-skip", "bisect skip", {"fg": "gold"}], ["magit-blame-heading", "blame heading", {"fg": "steel", "bg": "gunmetal"}], ["magit-blame-highlight", "blame highlight", {}], ["magit-blame-hash", "blame hash", {"fg": "pewter"}], ["magit-blame-name", "blame name", {"fg": "tan"}], ["magit-blame-date", "blame date", {"fg": "steel"}], ["magit-blame-summary", "blame summary", {}], ["magit-blame-dimmed", "blame dimmed", {}], ["magit-blame-margin", "blame margin", {}], ["magit-cherry-equivalent", "cherry equivalent", {"fg": "regal"}], ["magit-cherry-unmatched", "cherry unmatched", {"fg": "sage"}], ["magit-signature-good", "signature good", {"fg": "sage"}], ["magit-signature-bad", "signature bad", {"fg": "terracotta", "bold": true}], ["magit-signature-untrusted", "signature untrusted", {"fg": "gold"}], ["magit-signature-expired", "signature expired", {"fg": "tan"}], ["magit-signature-expired-key", "signature expired key", {}], ["magit-signature-revoked", "signature revoked", {}], ["magit-signature-error", "signature error", {}], ["magit-reflog-commit", "reflog commit", {"fg": "sage"}], ["magit-reflog-amend", "reflog amend", {"fg": "regal"}], ["magit-reflog-merge", "reflog merge", {"fg": "sage"}], ["magit-reflog-checkout", "reflog checkout", {"fg": "blue"}], ["magit-reflog-reset", "reflog reset", {"fg": "terracotta"}], ["magit-reflog-rebase", "reflog rebase", {"fg": "regal"}], ["magit-reflog-cherry-pick", "reflog cherry pick", {"fg": "sage"}], ["magit-reflog-remote", "reflog remote", {"fg": "steel"}], ["magit-reflog-other", "reflog other", {"fg": "steel"}], ["magit-sequence-pick", "sequence pick", {"fg": "white"}], ["magit-sequence-stop", "sequence stop", {"fg": "terracotta"}], ["magit-sequence-part", "sequence part", {}], ["magit-sequence-head", "sequence head", {"fg": "blue"}], ["magit-sequence-drop", "sequence drop", {}], ["magit-sequence-done", "sequence done", {"fg": "pewter"}], ["magit-sequence-onto", "sequence onto", {}], ["magit-sequence-exec", "sequence exec", {}], ["magit-left-margin", "left margin", {}]]}, "elfeed": {"label": "elfeed", "preview": "elfeed", "faces": [["elfeed-search-date-face", "search date", {"fg": "steel"}], ["elfeed-search-title-face", "search title", {"fg": "silver"}], ["elfeed-search-unread-title-face", "search unread title", {"fg": "white", "bold": true}], ["elfeed-search-feed-face", "search feed", {"fg": "sage"}], ["elfeed-search-tag-face", "search tag", {"fg": "tan"}], ["elfeed-search-unread-count-face", "search unread count", {"fg": "gold"}], ["elfeed-search-filter-face", "search filter", {"fg": "blue", "bold": true}], ["elfeed-search-last-update-face", "search last update", {"fg": "pewter"}], ["elfeed-log-date-face", "log date", {"fg": "steel"}], ["elfeed-log-error-level-face", "log error level", {"fg": "terracotta", "bold": true}], ["elfeed-log-warn-level-face", "log warn level", {"fg": "gold"}], ["elfeed-log-info-level-face", "log info level", {"fg": "sage"}], ["elfeed-log-debug-level-face", "log debug level", {"fg": "pewter"}]]}, "mu4e": {"label": "mu4e", "preview": "mu4e", "faces": [["mu4e-title-face", "title", {"fg": "blue", "bold": true}], ["mu4e-context-face", "context", {"fg": "blue", "bold": true}], ["mu4e-modeline-face", "modeline", {"fg": "silver"}], ["mu4e-ok-face", "ok", {"fg": "sage", "bold": true}], ["mu4e-warning-face", "warning", {"fg": "gold", "bold": true}], ["mu4e-header-title-face", "header title", {"fg": "blue", "bold": true}], ["mu4e-header-key-face", "header key", {"fg": "blue", "bold": true}], ["mu4e-header-value-face", "header value", {"fg": "silver"}], ["mu4e-header-face", "header", {"fg": "#cdced1"}], ["mu4e-header-highlight-face", "header highlight", {"bg": "gunmetal"}], ["mu4e-header-marks-face", "header marks", {"fg": "gold"}], ["mu4e-unread-face", "unread", {"fg": "white", "bold": true}], ["mu4e-flagged-face", "flagged", {"fg": "gold"}], ["mu4e-replied-face", "replied", {"fg": "silver"}], ["mu4e-forwarded-face", "forwarded", {"fg": "silver"}], ["mu4e-draft-face", "draft", {"fg": "steel", "italic": true}], ["mu4e-trashed-face", "trashed", {"fg": "pewter", "strike": true}], ["mu4e-moved-face", "moved", {"fg": "steel", "italic": true}], ["mu4e-related-face", "related", {"fg": "steel", "italic": true}], ["mu4e-contact-face", "contact", {"fg": "#cdced1"}], ["mu4e-special-header-value-face", "special header value", {"fg": "silver"}], ["mu4e-attach-number-face", "attach number", {"fg": "blue", "bold": true}], ["mu4e-url-number-face", "url number", {"fg": "blue", "bold": true}], ["mu4e-link-face", "link", {"fg": "blue", "underline": true}], ["mu4e-cited-1-face", "cited 1", {"fg": "silver"}], ["mu4e-cited-2-face", "cited 2", {"fg": "steel"}], ["mu4e-cited-3-face", "cited 3", {"fg": "sage"}], ["mu4e-cited-4-face", "cited 4", {"fg": "pewter"}], ["mu4e-cited-5-face", "cited 5", {"fg": "tan"}], ["mu4e-cited-6-face", "cited 6", {"fg": "terracotta"}], ["mu4e-cited-7-face", "cited 7", {"fg": "regal"}], ["mu4e-footer-face", "footer", {"fg": "pewter"}], ["mu4e-region-code", "region code", {"bg": "bg-dim"}], ["mu4e-system-face", "system", {"fg": "pewter", "italic": true}], ["mu4e-highlight-face", "highlight", {"fg": "gold", "bold": true}], ["mu4e-compose-header-face", "compose header", {"fg": "blue", "bold": true}], ["mu4e-compose-separator-face", "compose separator", {"fg": "pewter"}]]}, "ghostel": {"label": "ghostel", "preview": "ghostel", "faces": [["ghostel-default", "default", {"fg": "#cdced1"}], ["ghostel-fake-cursor", "fake cursor", {"fg": "#000000", "bg": "silver"}], ["ghostel-fake-cursor-box", "fake cursor box", {"fg": "silver"}], ["ghostel-color-black", "color black", {"fg": "pewter"}], ["ghostel-color-red", "color red", {"fg": "terracotta"}], ["ghostel-color-green", "color green", {"fg": "emerald"}], ["ghostel-color-yellow", "color yellow", {"fg": "gold"}], ["ghostel-color-blue", "color blue", {"fg": "blue"}], ["ghostel-color-magenta", "color magenta", {"fg": "regal"}], ["ghostel-color-cyan", "color cyan", {"fg": "sage"}], ["ghostel-color-white", "color white", {"fg": "silver"}], ["ghostel-color-bright-black", "color bright black", {"fg": "steel"}], ["ghostel-color-bright-red", "color bright red", {"fg": "#de4949"}], ["ghostel-color-bright-green", "color bright green", {"fg": "#84b068"}], ["ghostel-color-bright-yellow", "color bright yellow", {"fg": "#eed376"}], ["ghostel-color-bright-blue", "color bright blue", {"fg": "#7a9abe"}], ["ghostel-color-bright-magenta", "color bright magenta", {"fg": "#b07fd0"}], ["ghostel-color-bright-cyan", "color bright cyan", {"fg": "#7fc0a8"}], ["ghostel-color-bright-white", "color bright white", {"fg": "white"}]]}, "dashboard": {"label": "dashboard", "preview": "dashboard", "faces": [["dashboard-banner-logo-title", "banner logo title", {"fg": "gold", "bold": true}], ["dashboard-text-banner", "text banner", {"fg": "steel"}], ["dashboard-heading", "heading", {"fg": "blue", "bold": true}], ["dashboard-items-face", "items", {"fg": "#cdced1"}], ["dashboard-navigator", "navigator", {"fg": "blue"}], ["dashboard-no-items-face", "no items", {"fg": "pewter"}], ["dashboard-footer-face", "footer", {"fg": "tan"}], ["dashboard-footer-icon-face", "footer icon", {"fg": "gold"}]]}, "lsp-mode": {"label": "lsp-mode", "preview": "lsp", "faces": [["lsp-signature-face", "signature", {"fg": "silver"}], ["lsp-signature-highlight-function-argument", "signature highlight function argument", {"fg": "gold", "bold": true}], ["lsp-signature-posframe", "signature posframe", {"bg": "bg-dim"}], ["lsp-face-highlight-read", "face highlight read", {"bg": "navy"}], ["lsp-face-highlight-write", "face highlight write", {"bg": "#3d2f4a"}], ["lsp-face-highlight-textual", "face highlight textual", {"bg": "gunmetal"}], ["lsp-face-rename", "face rename", {"bg": "gunmetal", "bold": true}], ["lsp-rename-placeholder-face", "rename placeholder", {"fg": "gold", "bold": true}], ["lsp-inlay-hint-face", "inlay hint", {"fg": "pewter", "italic": true}], ["lsp-inlay-hint-parameter-face", "inlay hint parameter", {"fg": "steel", "italic": true}], ["lsp-inlay-hint-type-face", "inlay hint type", {"fg": "sage", "italic": true}], ["lsp-details-face", "details", {"fg": "pewter", "italic": true}], ["lsp-installation-buffer-face", "installation buffer", {"fg": "blue"}], ["lsp-installation-finished-buffer-face", "installation finished buffer", {"fg": "sage"}]]}, "git-gutter": {"label": "git-gutter", "preview": "gitgutter", "faces": [["git-gutter:added", "added", {"fg": "emerald"}], ["git-gutter:modified", "modified", {"fg": "gold"}], ["git-gutter:deleted", "deleted", {"fg": "terracotta"}], ["git-gutter:unchanged", "unchanged", {"fg": "pewter"}], ["git-gutter:separator", "separator", {"fg": "steel"}]]}, "flycheck": {"label": "flycheck", "preview": "flycheck", "faces": [["flycheck-error", "error", {"fg": "terracotta"}], ["flycheck-warning", "warning", {"fg": "gold"}], ["flycheck-info", "info", {"fg": "blue"}], ["flycheck-fringe-error", "fringe error", {"fg": "terracotta"}], ["flycheck-fringe-warning", "fringe warning", {"fg": "gold"}], ["flycheck-fringe-info", "fringe info", {"fg": "blue"}], ["flycheck-delimited-error", "delimited error", {"fg": "terracotta"}], ["flycheck-error-delimiter", "error delimiter", {"fg": "terracotta"}], ["flycheck-error-list-error", "error list error", {"fg": "terracotta"}], ["flycheck-error-list-warning", "error list warning", {"fg": "gold"}], ["flycheck-error-list-info", "error list info", {"fg": "blue"}], ["flycheck-error-list-error-message", "error list error message", {"fg": "#cdced1"}], ["flycheck-error-list-checker-name", "error list checker name", {"fg": "steel"}], ["flycheck-error-list-column-number", "error list column number", {"fg": "pewter"}], ["flycheck-error-list-line-number", "error list line number", {"fg": "pewter"}], ["flycheck-error-list-filename", "error list filename", {"fg": "blue"}], ["flycheck-error-list-id", "error list id", {"fg": "steel"}], ["flycheck-error-list-id-with-explainer", "error list id with explainer", {"fg": "steel", "bold": true}], ["flycheck-error-list-highlight", "error list highlight", {"bg": "gunmetal"}], ["flycheck-verify-select-checker", "verify select checker", {"fg": "gold"}]]}, "dired": {"label": "dired", "preview": "dired", "faces": [["dired-header", "header", {"fg": "blue", "bold": true}], ["dired-directory", "directory", {"fg": "blue", "bold": true}], ["dired-symlink", "symlink", {"fg": "sage"}], ["dired-broken-symlink", "broken symlink", {"fg": "#de4949", "bold": true}], ["dired-special", "special", {"fg": "regal"}], ["dired-set-id", "set id", {"fg": "terracotta"}], ["dired-perm-write", "perm write", {"fg": "silver"}], ["dired-mark", "mark", {"fg": "gold"}], ["dired-marked", "marked", {"fg": "gold", "bold": true}], ["dired-flagged", "flagged", {"fg": "terracotta", "bold": true}], ["dired-ignored", "ignored", {"fg": "pewter"}], ["dired-warning", "warning", {"fg": "gold", "bold": true}]]}, "dirvish": {"label": "dirvish", "preview": "dirvish", "faces": [["dirvish-inactive", "inactive", {"fg": "pewter"}], ["dirvish-free-space", "free space", {"fg": "sage"}], ["dirvish-hl-line", "hl line", {"bg": "gunmetal"}], ["dirvish-hl-line-inactive", "hl line inactive", {"bg": "bg-dim"}], ["dirvish-file-modes", "file modes", {"fg": "steel"}], ["dirvish-file-link-number", "file link number", {"fg": "pewter"}], ["dirvish-file-user-id", "file user id", {"fg": "blue"}], ["dirvish-file-group-id", "file group id", {"fg": "steel"}], ["dirvish-file-size", "file size", {"fg": "sage"}], ["dirvish-file-time", "file time", {"fg": "pewter"}], ["dirvish-file-inode-number", "file inode number", {"fg": "pewter"}], ["dirvish-file-device-number", "file device number", {"fg": "pewter"}], ["dirvish-subtree-guide", "subtree guide", {"fg": "pewter"}], ["dirvish-subtree-state", "subtree state", {"fg": "steel"}], ["dirvish-collapse-dir-face", "collapse dir", {"fg": "blue"}], ["dirvish-collapse-empty-dir-face", "collapse empty dir", {"fg": "pewter"}], ["dirvish-collapse-file-face", "collapse file", {"fg": "silver"}], ["dirvish-emerge-group-title", "emerge group title", {"fg": "gold", "bold": true}], ["dirvish-media-info-heading", "media info heading", {"fg": "blue", "bold": true}], ["dirvish-media-info-property-key", "media info property key", {"fg": "steel"}], ["dirvish-narrow-match-face-0", "narrow match 0", {"fg": "gold", "bold": true}], ["dirvish-narrow-match-face-1", "narrow match 1", {"fg": "blue", "bold": true}], ["dirvish-narrow-match-face-2", "narrow match 2", {"fg": "emerald", "bold": true}], ["dirvish-narrow-match-face-3", "narrow match 3", {"fg": "regal", "bold": true}], ["dirvish-narrow-split", "narrow split", {"fg": "pewter"}], ["dirvish-proc-running", "proc running", {"fg": "gold"}], ["dirvish-proc-finished", "proc finished", {"fg": "sage"}], ["dirvish-proc-failed", "proc failed", {"fg": "terracotta"}], ["dirvish-git-commit-message-face", "git commit message", {"fg": "tan", "italic": true}], ["dirvish-vc-added-state", "vc added state", {"fg": "sage"}], ["dirvish-vc-edited-state", "vc edited state", {"fg": "gold"}], ["dirvish-vc-removed-state", "vc removed state", {"fg": "terracotta"}], ["dirvish-vc-conflict-state", "vc conflict state", {"fg": "terracotta", "bold": true}], ["dirvish-vc-locked-state", "vc locked state", {"fg": "blue"}], ["dirvish-vc-missing-state", "vc missing state", {"fg": "terracotta"}], ["dirvish-vc-needs-merge-face", "vc needs merge", {"fg": "gold"}], ["dirvish-vc-needs-update-state", "vc needs update state", {"fg": "gold"}], ["dirvish-vc-unregistered-face", "vc unregistered", {"fg": "pewter"}]]}, "calibredb": {"label": "calibredb", "preview": "calibredb", "faces": [["calibredb-search-header-library-name-face", "search header library name", {"fg": "blue", "bold": true}], ["calibredb-search-header-library-path-face", "search header library path", {"fg": "pewter"}], ["calibredb-search-header-total-face", "search header total", {"fg": "sage"}], ["calibredb-search-header-filter-face", "search header filter", {"fg": "gold"}], ["calibredb-search-header-sort-face", "search header sort", {"fg": "steel"}], ["calibredb-search-header-highlight-face", "search header highlight", {"fg": "gold", "bold": true}], ["calibredb-id-face", "id", {"fg": "pewter"}], ["calibredb-title-face", "title", {"fg": "blue", "bold": true}], ["calibredb-author-face", "author", {"fg": "sage"}], ["calibredb-format-face", "format", {"fg": "steel"}], ["calibredb-size-face", "size", {"fg": "pewter"}], ["calibredb-tag-face", "tag", {"fg": "tan"}], ["calibredb-date-face", "date", {"fg": "pewter"}], ["calibredb-mark-face", "mark", {"fg": "gold", "bold": true}], ["calibredb-series-face", "series", {"fg": "regal"}], ["calibredb-publisher-face", "publisher", {"fg": "steel"}], ["calibredb-pubdate-face", "pubdate", {"fg": "pewter"}], ["calibredb-language-face", "language", {"fg": "steel"}], ["calibredb-comment-face", "comment", {"fg": "silver", "italic": true}], ["calibredb-archive-face", "archive", {"fg": "pewter"}], ["calibredb-favorite-face", "favorite", {"fg": "gold"}], ["calibredb-file-face", "file", {"fg": "blue"}], ["calibredb-ids-face", "ids", {"fg": "pewter"}], ["calibredb-highlight-face", "highlight", {"fg": "gold", "bold": true}], ["calibredb-current-page-button-face", "current page button", {"fg": "blue", "bold": true}], ["calibredb-mouse-face", "mouse", {"bg": "gunmetal"}], ["calibredb-title-detailed-view-face", "title detailed view", {"fg": "gold", "bold": true}], ["calibredb-edit-annotation-header-title-face", "edit annotation header title", {"fg": "blue", "bold": true}]]}, "erc": {"label": "erc", "preview": "erc", "faces": [["erc-header-line", "header line", {"fg": "white", "bg": "gunmetal", "bold": true}], ["erc-timestamp-face", "timestamp", {"fg": "pewter"}], ["erc-notice-face", "notice", {"fg": "steel"}], ["erc-default-face", "default", {"fg": "#cdced1"}], ["erc-current-nick-face", "current nick", {"fg": "gold", "bold": true}], ["erc-my-nick-face", "my nick", {"fg": "gold", "bold": true}], ["erc-my-nick-prefix-face", "my nick prefix", {"fg": "gold"}], ["erc-nick-default-face", "nick default", {"fg": "blue"}], ["erc-nick-prefix-face", "nick prefix", {"fg": "sage"}], ["erc-button-nick-default-face", "button nick default", {"fg": "blue"}], ["erc-nick-msg-face", "nick msg", {"fg": "regal"}], ["erc-direct-msg-face", "direct msg", {"fg": "regal"}], ["erc-action-face", "action", {"fg": "sage", "italic": true}], ["erc-keyword-face", "keyword", {"fg": "gold", "bold": true}], ["erc-pal-face", "pal", {"fg": "emerald"}], ["erc-fool-face", "fool", {"fg": "pewter"}], ["erc-dangerous-host-face", "dangerous host", {"fg": "terracotta", "bold": true}], ["erc-error-face", "error", {"fg": "terracotta", "bold": true}], ["erc-input-face", "input", {"fg": "silver"}], ["erc-prompt-face", "prompt", {"fg": "blue", "bold": true}], ["erc-command-indicator-face", "command indicator", {"fg": "steel", "bold": true}], ["erc-information", "information", {"fg": "steel"}], ["erc-button", "button", {"fg": "blue"}], ["erc-bold-face", "bold", {"bold": true}], ["erc-italic-face", "italic", {"italic": true}], ["erc-underline-face", "underline", {"fg": "silver", "underline": true}], ["erc-inverse-face", "inverse", {"fg": "#000000", "bg": "silver"}], ["erc-spoiler-face", "spoiler", {"fg": "#000000", "bg": "gunmetal"}], ["erc-fill-wrap-merge-indicator-face", "fill wrap merge indicator", {"fg": "pewter"}], ["erc-keep-place-indicator-arrow", "keep place indicator arrow", {"fg": "gold"}], ["erc-keep-place-indicator-line", "keep place indicator line", {"bg": "bg-dim"}]]}, "org-drill": {"label": "org-drill", "preview": "orgdrill", "faces": [["org-drill-hidden-cloze-face", "hidden cloze", {"fg": "#000000", "bg": "steel"}], ["org-drill-visible-cloze-face", "visible cloze", {"fg": "gold", "bold": true}], ["org-drill-visible-cloze-hint-face", "visible cloze hint", {"fg": "pewter", "italic": true}]]}, "org-noter": {"label": "org-noter", "preview": "orgnoter", "faces": [["org-noter-notes-exist-face", "notes exist", {"fg": "sage"}], ["org-noter-no-notes-exist-face", "no notes exist", {"fg": "pewter"}]]}, "signel": {"label": "signel", "preview": "signel", "faces": [["signel-timestamp-face", "timestamp", {"fg": "pewter"}], ["signel-my-msg-face", "my msg", {"fg": "blue"}], ["signel-other-msg-face", "other msg", {"fg": "silver"}], ["signel-error-face", "error", {"fg": "terracotta", "bold": true}]]}, "pearl": {"label": "pearl", "preview": "pearl", "faces": [["pearl-preamble-summary", "preamble summary", {"fg": "blue", "bold": true}], ["pearl-editable-comment", "editable comment", {"fg": "silver"}], ["pearl-readonly-comment", "readonly comment", {"fg": "pewter", "italic": true}], ["pearl-modified-highlight", "modified highlight", {"bg": "navy"}], ["pearl-modified-local", "modified local", {"fg": "gold"}], ["pearl-modified-unknown", "modified unknown", {"fg": "pewter"}]]}, "slack": {"label": "slack", "preview": "slack", "faces": [["slack-room-info-title-face", "room info title", {"fg": "blue", "bold": true}], ["slack-room-info-title-room-name-face", "room info title room name", {"fg": "gold", "bold": true}], ["slack-room-info-section-title-face", "room info section title", {"fg": "blue", "bold": true}], ["slack-room-info-section-label-face", "room info section label", {"fg": "steel"}], ["slack-room-unread-face", "room unread", {"fg": "white", "bold": true}], ["slack-message-output-header", "message output header", {"fg": "blue", "bold": true}], ["slack-message-output-text", "message output text", {"fg": "#cdced1"}], ["slack-message-output-reaction", "message output reaction", {"fg": "steel"}], ["slack-message-output-reaction-pressed", "message output reaction pressed", {"fg": "gold", "bold": true}], ["slack-message-deleted-face", "message deleted", {"fg": "pewter", "italic": true}], ["slack-new-message-marker-face", "new message marker", {"fg": "terracotta", "bold": true}], ["slack-all-thread-buffer-thread-header-face", "all thread buffer thread header", {"fg": "blue", "bold": true}], ["slack-message-mention-face", "message mention", {"fg": "blue"}], ["slack-message-mention-me-face", "message mention me", {"fg": "gold", "bg": "navy", "bold": true}], ["slack-message-mention-keyword-face", "message mention keyword", {"fg": "gold", "bold": true}], ["slack-channel-button-face", "channel button", {"fg": "blue"}], ["slack-mrkdwn-bold-face", "mrkdwn bold", {"bold": true}], ["slack-mrkdwn-italic-face", "mrkdwn italic", {"italic": true}], ["slack-mrkdwn-code-face", "mrkdwn code", {"fg": "terracotta"}], ["slack-mrkdwn-code-block-face", "mrkdwn code block", {"fg": "terracotta", "bg": "bg-dim"}], ["slack-mrkdwn-strike-face", "mrkdwn strike", {"fg": "pewter", "strike": true}], ["slack-mrkdwn-blockquote-face", "mrkdwn blockquote", {"fg": "silver", "italic": true}], ["slack-mrkdwn-list-face", "mrkdwn list", {"fg": "silver"}], ["slack-attachment-header", "attachment header", {"fg": "blue", "bold": true}], ["slack-attachment-footer", "attachment footer", {"fg": "pewter"}], ["slack-attachment-pad", "attachment pad", {"fg": "pewter"}], ["slack-attachment-field-title", "attachment field title", {"fg": "steel", "bold": true}], ["slack-message-attachment-preview-header-face", "message attachment preview header", {"fg": "blue"}], ["slack-preview-face", "preview", {"fg": "silver"}], ["slack-block-highlight-source-overlay-face", "block highlight source overlay", {"bg": "bg-dim"}], ["slack-message-action-face", "message action", {"fg": "blue"}], ["slack-message-action-primary-face", "message action primary", {"fg": "sage"}], ["slack-message-action-danger-face", "message action danger", {"fg": "terracotta"}], ["slack-button-block-element-face", "button block element", {"fg": "silver"}], ["slack-button-primary-block-element-face", "button primary block element", {"fg": "sage", "bold": true}], ["slack-button-danger-block-element-face", "button danger block element", {"fg": "terracotta", "bold": true}], ["slack-select-block-element-face", "select block element", {"fg": "blue"}], ["slack-overflow-block-element-face", "overflow block element", {"fg": "steel"}], ["slack-date-picker-block-element-face", "date picker block element", {"fg": "blue"}], ["slack-dialog-title-face", "dialog title", {"fg": "blue", "bold": true}], ["slack-dialog-element-label-face", "dialog element label", {"fg": "steel"}], ["slack-dialog-element-hint-face", "dialog element hint", {"fg": "pewter", "italic": true}], ["slack-dialog-element-placeholder-face", "dialog element placeholder", {"fg": "pewter"}], ["slack-dialog-element-error-face", "dialog element error", {"fg": "terracotta"}], ["slack-dialog-submit-button-face", "dialog submit button", {"fg": "sage", "bold": true}], ["slack-dialog-cancel-button-face", "dialog cancel button", {"fg": "silver"}], ["slack-dialog-select-element-input-face", "dialog select element input", {"fg": "silver"}], ["slack-user-active-face", "user active", {"fg": "sage"}], ["slack-user-dnd-face", "user dnd", {"fg": "terracotta"}], ["slack-user-profile-header-face", "user profile header", {"fg": "blue", "bold": true}], ["slack-user-profile-property-name-face", "user profile property name", {"fg": "steel"}], ["slack-profile-image-face", "profile image", {"fg": "pewter"}], ["slack-search-result-message-header-face", "search result message header", {"fg": "blue"}], ["slack-search-result-message-username-face", "search result message username", {"fg": "gold", "bold": true}], ["slack-modeline-has-unreads-face", "modeline has unreads", {"fg": "gold"}], ["slack-modeline-channel-has-unreads-face", "modeline channel has unreads", {"fg": "gold", "bold": true}], ["slack-modeline-thread-has-unreads-face", "modeline thread has unreads", {"fg": "gold"}]]}, "telega": {"label": "telega", "preview": "telega", "faces": [["telega-root-heading", "root heading", {"fg": "blue", "bold": true}], ["telega-tracking", "tracking", {"fg": "gold"}], ["telega-unread-unmuted-modeline", "unread unmuted modeline", {"fg": "gold", "bold": true}], ["telega-username", "username", {"fg": "blue"}], ["telega-user-online-status", "user online status", {"fg": "sage"}], ["telega-user-non-online-status", "user non online status", {"fg": "pewter"}], ["telega-secret-title", "secret title", {"fg": "sage"}], ["telega-contact-birthdays-today", "contact birthdays today", {"fg": "gold"}], ["telega-muted-count", "muted count", {"fg": "pewter"}], ["telega-unmuted-count", "unmuted count", {"fg": "gold", "bold": true}], ["telega-mention-count", "mention count", {"fg": "gold", "bold": true}], ["telega-has-chatbuf-brackets", "has chatbuf brackets", {"fg": "steel"}], ["telega-delim-face", "delim", {"fg": "pewter"}], ["telega-shadow", "shadow", {"fg": "pewter"}], ["telega-link", "link", {"fg": "blue"}], ["telega-blue", "blue", {"fg": "blue"}], ["telega-red", "red", {"fg": "terracotta"}], ["telega-msg-heading", "msg heading", {"fg": "steel"}], ["telega-msg-user-title", "msg user title", {"fg": "blue", "bold": true}], ["telega-msg-self-title", "msg self title", {"fg": "gold", "bold": true}], ["telega-msg-deleted", "msg deleted", {"fg": "pewter", "italic": true}], ["telega-msg-sponsored", "msg sponsored", {"fg": "pewter", "italic": true}], ["telega-msg-inline-reply", "msg inline reply", {"fg": "steel"}], ["telega-msg-inline-forward", "msg inline forward", {"fg": "sage"}], ["telega-msg-inline-other", "msg inline other", {"fg": "pewter"}], ["telega-entity-type-bold", "entity type bold", {"bold": true}], ["telega-entity-type-italic", "entity type italic", {"italic": true}], ["telega-entity-type-underline", "entity type underline", {"fg": "silver", "underline": true}], ["telega-entity-type-strikethrough", "entity type strikethrough", {"fg": "pewter", "strike": true}], ["telega-entity-type-code", "entity type code", {"fg": "terracotta"}], ["telega-entity-type-pre", "entity type pre", {"fg": "terracotta", "bg": "bg-dim"}], ["telega-entity-type-blockquote", "entity type blockquote", {"fg": "silver", "italic": true}], ["telega-entity-type-mention", "entity type mention", {"fg": "blue"}], ["telega-entity-type-hashtag", "entity type hashtag", {"fg": "blue"}], ["telega-entity-type-cashtag", "entity type cashtag", {"fg": "sage"}], ["telega-entity-type-botcommand", "entity type botcommand", {"fg": "sage"}], ["telega-entity-type-texturl", "entity type texturl", {"fg": "blue"}], ["telega-entity-type-spoiler", "entity type spoiler", {"fg": "gunmetal", "bg": "gunmetal"}], ["telega-reaction", "reaction", {"fg": "steel"}], ["telega-reaction-chosen", "reaction chosen", {"fg": "gold", "bold": true}], ["telega-reaction-paid", "reaction paid", {"fg": "gold"}], ["telega-reaction-paid-chosen", "reaction paid chosen", {"fg": "gold", "bold": true}], ["telega-highlight-text-face", "highlight text", {"fg": "#000000", "bg": "gold"}], ["telega-button-highlight", "button highlight", {"fg": "gold", "bold": true}], ["telega-chat-prompt", "chat prompt", {"fg": "blue", "bold": true}], ["telega-chat-prompt-aux", "chat prompt aux", {"fg": "steel"}], ["telega-chat-input-attachment", "chat input attachment", {"fg": "sage"}], ["telega-topic-button", "topic button", {"fg": "blue"}], ["telega-filter-active", "filter active", {"fg": "gold", "bold": true}], ["telega-filter-button-active", "filter button active", {"fg": "#000000", "bg": "gold"}], ["telega-filter-button-inactive", "filter button inactive", {"fg": "steel"}], ["telega-checklist-stats-done", "checklist stats done", {"fg": "sage"}], ["telega-checklist-stats-todo", "checklist stats todo", {"fg": "steel"}], ["telega-box-button", "box button", {"fg": "blue"}], ["telega-box-button-active", "box button active", {"fg": "#000000", "bg": "blue"}], ["telega-box-button-default-active", "box button default active", {"fg": "#000000", "bg": "silver"}], ["telega-box-button-default-passive", "box button default passive", {"fg": "steel"}], ["telega-box-button-primary-active", "box button primary active", {"fg": "#000000", "bg": "blue"}], ["telega-box-button-primary-passive", "box button primary passive", {"fg": "blue"}], ["telega-box-button-success-active", "box button success active", {"fg": "#000000", "bg": "emerald"}], ["telega-box-button-success-passive", "box button success passive", {"fg": "sage"}], ["telega-box-button-danger-active", "box button danger active", {"fg": "#000000", "bg": "terracotta"}], ["telega-box-button-danger-passive", "box button danger passive", {"fg": "terracotta"}], ["telega-box-button-ui-active", "box button ui active", {"fg": "#000000", "bg": "gold"}], ["telega-box-button-ui-passive", "box button ui passive", {"fg": "gold"}], ["telega-box-button2-active", "box button2 active", {"fg": "#000000", "bg": "blue"}], ["telega-box-button2-passive", "box button2 passive", {"fg": "steel"}], ["telega-box-button2-white-foreground", "box button2 white foreground", {"fg": "white"}], ["telega-describe-item-title", "describe item title", {"fg": "steel", "bold": true}], ["telega-describe-section-title", "describe section title", {"fg": "blue", "bold": true}], ["telega-describe-subsection-title", "describe subsection title", {"fg": "blue"}], ["telega-enckey-00", "enckey 00", {"fg": "pewter"}], ["telega-enckey-01", "enckey 01", {"fg": "sage"}], ["telega-enckey-10", "enckey 10", {"fg": "gold"}], ["telega-enckey-11", "enckey 11", {"fg": "blue"}], ["telega-palette-builtin-blue", "palette builtin blue", {"fg": "blue"}], ["telega-palette-builtin-green", "palette builtin green", {"fg": "emerald"}], ["telega-palette-builtin-orange", "palette builtin orange", {"fg": "terracotta"}], ["telega-palette-builtin-purple", "palette builtin purple", {"fg": "regal"}], ["telega-webpage-title", "webpage title", {"fg": "blue", "bold": true}], ["telega-webpage-subtitle", "webpage subtitle", {"fg": "steel"}], ["telega-webpage-header", "webpage header", {"fg": "gold", "bold": true}], ["telega-webpage-subheader", "webpage subheader", {"fg": "gold"}], ["telega-webpage-outline", "webpage outline", {"fg": "pewter"}], ["telega-webpage-fixed", "webpage fixed", {"fg": "terracotta"}], ["telega-webpage-preformatted", "webpage preformatted", {"fg": "terracotta", "bg": "bg-dim"}], ["telega-webpage-marked", "webpage marked", {"fg": "#000000", "bg": "gold"}], ["telega-webpage-strike-through", "webpage strike through", {"fg": "pewter", "strike": true}], ["telega-webpage-chat-link", "webpage chat link", {"fg": "blue"}], ["telega-link-preview-sitename", "link preview sitename", {"fg": "steel"}], ["telega-link-preview-title", "link preview title", {"fg": "blue", "bold": true}]]}, "shr": {"label": "shr (HTML: nov/eww/mail)", "preview": "shr", "faces": [["shr-h1", "h1", {"fg": "gold", "bold": true, "height": 1.4}], ["shr-h2", "h2", {"fg": "blue", "bold": true, "height": 1.2}], ["shr-h3", "h3", {"fg": "blue", "bold": true}], ["shr-h4", "h4", {"fg": "silver", "bold": true}], ["shr-h5", "h5", {"fg": "steel", "bold": true}], ["shr-h6", "h6", {"fg": "pewter", "bold": true}], ["shr-text", "text", {"fg": "#cdced1"}], ["shr-link", "link", {"fg": "blue", "underline": true}], ["shr-selected-link", "selected link", {"fg": "gold", "bold": true, "underline": true}], ["shr-code", "code", {"fg": "terracotta", "bg": "bg-dim"}], ["shr-mark", "mark", {"fg": "#000000", "bg": "gold"}], ["shr-strike-through", "strike through", {"fg": "pewter", "strike": true}], ["shr-sup", "sup", {"fg": "steel"}], ["shr-abbreviation", "abbreviation", {"fg": "steel", "italic": true}], ["shr-sliced-image", "sliced image", {"fg": "pewter"}]]}, "2048-game": {"label": "2048-game", "preview": "generic", "faces": [["twentyfortyeight-face-1024", "twentyfortyeight 1024", {}], ["twentyfortyeight-face-128", "twentyfortyeight 128", {}], ["twentyfortyeight-face-16", "twentyfortyeight 16", {}], ["twentyfortyeight-face-2", "twentyfortyeight 2", {}], ["twentyfortyeight-face-2048", "twentyfortyeight 2048", {}], ["twentyfortyeight-face-256", "twentyfortyeight 256", {}], ["twentyfortyeight-face-32", "twentyfortyeight 32", {}], ["twentyfortyeight-face-4", "twentyfortyeight 4", {}], ["twentyfortyeight-face-512", "twentyfortyeight 512", {}], ["twentyfortyeight-face-64", "twentyfortyeight 64", {}], ["twentyfortyeight-face-8", "twentyfortyeight 8", {}]]}, "alert": {"label": "alert", "preview": "generic", "faces": [["alert-high-face", "high", {}], ["alert-low-face", "low", {}], ["alert-moderate-face", "moderate", {}], ["alert-normal-face", "normal", {}], ["alert-trivial-face", "trivial", {}], ["alert-urgent-face", "urgent", {}]]}, "all-the-icons": {"label": "all-the-icons", "preview": "generic", "faces": [["all-the-icons-blue", "blue", {}], ["all-the-icons-blue-alt", "blue alt", {}], ["all-the-icons-cyan", "cyan", {}], ["all-the-icons-cyan-alt", "cyan alt", {}], ["all-the-icons-dblue", "dblue", {}], ["all-the-icons-dcyan", "dcyan", {}], ["all-the-icons-dgreen", "dgreen", {}], ["all-the-icons-dmaroon", "dmaroon", {}], ["all-the-icons-dorange", "dorange", {}], ["all-the-icons-dpink", "dpink", {}], ["all-the-icons-dpurple", "dpurple", {}], ["all-the-icons-dred", "dred", {}], ["all-the-icons-dsilver", "dsilver", {}], ["all-the-icons-dyellow", "dyellow", {}], ["all-the-icons-green", "green", {}], ["all-the-icons-lblue", "lblue", {}], ["all-the-icons-lcyan", "lcyan", {}], ["all-the-icons-lgreen", "lgreen", {}], ["all-the-icons-lmaroon", "lmaroon", {}], ["all-the-icons-lorange", "lorange", {}], ["all-the-icons-lpink", "lpink", {}], ["all-the-icons-lpurple", "lpurple", {}], ["all-the-icons-lred", "lred", {}], ["all-the-icons-lsilver", "lsilver", {}], ["all-the-icons-lyellow", "lyellow", {}], ["all-the-icons-maroon", "maroon", {}], ["all-the-icons-orange", "orange", {}], ["all-the-icons-pink", "pink", {}], ["all-the-icons-purple", "purple", {}], ["all-the-icons-purple-alt", "purple alt", {}], ["all-the-icons-red", "red", {}], ["all-the-icons-red-alt", "red alt", {}], ["all-the-icons-silver", "silver", {}], ["all-the-icons-yellow", "yellow", {}]]}, "company": {"label": "company", "preview": "generic", "faces": [["company-echo", "echo", {}], ["company-echo-common", "echo common", {}], ["company-preview", "preview", {}], ["company-preview-common", "preview common", {}], ["company-preview-search", "preview search", {}], ["company-tooltip", "tooltip", {}], ["company-tooltip-annotation", "tooltip annotation", {}], ["company-tooltip-annotation-selection", "tooltip annotation selection", {}], ["company-tooltip-common", "tooltip common", {}], ["company-tooltip-common-selection", "tooltip common selection", {}], ["company-tooltip-deprecated", "tooltip deprecated", {}], ["company-tooltip-mouse", "tooltip mouse", {}], ["company-tooltip-quick-access", "tooltip quick access", {}], ["company-tooltip-quick-access-selection", "tooltip quick access selection", {}], ["company-tooltip-scrollbar-thumb", "tooltip scrollbar thumb", {}], ["company-tooltip-scrollbar-track", "tooltip scrollbar track", {}], ["company-tooltip-search", "tooltip search", {}], ["company-tooltip-search-selection", "tooltip search selection", {}], ["company-tooltip-selection", "tooltip selection", {}]]}, "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", {}], ["consult-async-finished", "async finished", {}], ["consult-async-running", "async running", {}], ["consult-async-split", "async split", {}], ["consult-bookmark", "bookmark", {}], ["consult-buffer", "buffer", {}], ["consult-file", "file", {}], ["consult-grep-context", "grep context", {}], ["consult-help", "help", {}], ["consult-highlight-mark", "highlight mark", {}], ["consult-highlight-match", "highlight match", {}], ["consult-key", "key", {}], ["consult-line-number", "line number", {}], ["consult-line-number-prefix", "line number prefix", {}], ["consult-line-number-wrapped", "line number wrapped", {}], ["consult-narrow-indicator", "narrow indicator", {}], ["consult-preview-insertion", "preview insertion", {}], ["consult-preview-line", "preview line", {}], ["consult-preview-match", "preview match", {}], ["consult-separator", "separator", {}]]}, "embark": {"label": "embark", "preview": "generic", "faces": [["embark-collect-annotation", "collect annotation", {}], ["embark-collect-candidate", "collect candidate", {}], ["embark-collect-group-separator", "collect group separator", {}], ["embark-collect-group-title", "collect group title", {}], ["embark-keybinding", "keybinding", {}], ["embark-keybinding-repeat", "keybinding repeat", {}], ["embark-keymap", "keymap", {}], ["embark-selected", "selected", {}], ["embark-target", "target", {}], ["embark-verbose-indicator-documentation", "verbose indicator documentation", {}], ["embark-verbose-indicator-shadowed", "verbose indicator shadowed", {}], ["embark-verbose-indicator-title", "verbose indicator title", {}]]}, "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", {}], ["emms-metaplaylist-mode-face", "metaplaylist mode", {}], ["emms-playlist-selected-face", "playlist selected", {}], ["emms-playlist-track-face", "playlist track", {}]]}, "flyspell-correct": {"label": "flyspell-correct", "preview": "generic", "faces": [["flyspell-correct-highlight-face", "highlight", {}]]}, "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", {}], ["hl-todo-flymake-type", "flymake type", {}]]}, "json-mode": {"label": "json-mode", "preview": "generic", "faces": [["json-mode-object-name-face", "object name", {}]]}, "llama": {"label": "llama", "preview": "generic", "faces": [["llama-##-macro", "## macro", {}], ["llama-deleted-argument", "deleted argument", {}], ["llama-llama-macro", "llama macro", {}], ["llama-mandatory-argument", "mandatory argument", {}], ["llama-optional-argument", "optional argument", {}]]}, "lv": {"label": "lv", "preview": "generic", "faces": [["lv-separator", "separator", {}]]}, "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", {}], ["malyon-face-error", "face error", {}], ["malyon-face-italic", "face italic", {}], ["malyon-face-plain", "face plain", {}], ["malyon-face-reverse", "face reverse", {}]]}, "marginalia": {"label": "marginalia", "preview": "generic", "faces": [["marginalia-archive", "archive", {}], ["marginalia-char", "char", {}], ["marginalia-date", "date", {}], ["marginalia-documentation", "documentation", {}], ["marginalia-file-name", "file name", {}], ["marginalia-file-owner", "file owner", {}], ["marginalia-file-priv-dir", "file priv dir", {}], ["marginalia-file-priv-exec", "file priv exec", {}], ["marginalia-file-priv-link", "file priv link", {}], ["marginalia-file-priv-no", "file priv no", {}], ["marginalia-file-priv-other", "file priv other", {}], ["marginalia-file-priv-rare", "file priv rare", {}], ["marginalia-file-priv-read", "file priv read", {}], ["marginalia-file-priv-write", "file priv write", {}], ["marginalia-function", "function", {}], ["marginalia-installed", "installed", {}], ["marginalia-key", "key", {}], ["marginalia-lighter", "lighter", {}], ["marginalia-list", "list", {}], ["marginalia-mode", "mode", {}], ["marginalia-modified", "modified", {}], ["marginalia-null", "null", {}], ["marginalia-number", "number", {}], ["marginalia-off", "off", {}], ["marginalia-on", "on", {}], ["marginalia-size", "size", {}], ["marginalia-string", "string", {}], ["marginalia-symbol", "symbol", {}], ["marginalia-true", "true", {}], ["marginalia-type", "type", {}], ["marginalia-value", "value", {}], ["marginalia-version", "version", {}]]}, "markdown-mode": {"label": "markdown-mode", "preview": "generic", "faces": [["markdown-blockquote-face", "markdown blockquote", {}], ["markdown-bold-face", "markdown bold", {}], ["markdown-code-face", "markdown code", {}], ["markdown-comment-face", "markdown comment", {}], ["markdown-footnote-marker-face", "markdown footnote marker", {}], ["markdown-footnote-text-face", "markdown footnote text", {}], ["markdown-gfm-checkbox-face", "markdown gfm checkbox", {}], ["markdown-header-delimiter-face", "markdown header delimiter", {}], ["markdown-header-face", "markdown header", {}], ["markdown-header-face-1", "markdown header 1", {}], ["markdown-header-face-2", "markdown header 2", {}], ["markdown-header-face-3", "markdown header 3", {}], ["markdown-header-face-4", "markdown header 4", {}], ["markdown-header-face-5", "markdown header 5", {}], ["markdown-header-face-6", "markdown header 6", {}], ["markdown-header-rule-face", "markdown header rule", {}], ["markdown-highlight-face", "markdown highlight", {}], ["markdown-highlighting-face", "markdown highlighting", {}], ["markdown-hr-face", "markdown hr", {}], ["markdown-html-attr-name-face", "markdown html attr name", {}], ["markdown-html-attr-value-face", "markdown html attr value", {}], ["markdown-html-entity-face", "markdown html entity", {}], ["markdown-html-tag-delimiter-face", "markdown html tag delimiter", {}], ["markdown-html-tag-name-face", "markdown html tag name", {}], ["markdown-inline-code-face", "markdown inline code", {}], ["markdown-italic-face", "markdown italic", {}], ["markdown-language-info-face", "markdown language info", {}], ["markdown-language-keyword-face", "markdown language keyword", {}], ["markdown-line-break-face", "markdown line break", {}], ["markdown-link-face", "markdown link", {}], ["markdown-link-title-face", "markdown link title", {}], ["markdown-list-face", "markdown list", {}], ["markdown-markup-face", "markdown markup", {}], ["markdown-math-face", "markdown math", {}], ["markdown-metadata-key-face", "markdown metadata key", {}], ["markdown-metadata-value-face", "markdown metadata value", {}], ["markdown-missing-link-face", "markdown missing link", {}], ["markdown-plain-url-face", "markdown plain url", {}], ["markdown-pre-face", "markdown pre", {}], ["markdown-reference-face", "markdown reference", {}], ["markdown-strike-through-face", "markdown strike through", {}], ["markdown-table-face", "markdown table", {}], ["markdown-url-face", "markdown url", {}]]}, "nerd-icons": {"label": "nerd-icons", "preview": "generic", "faces": [["nerd-icons-blue", "blue", {}], ["nerd-icons-blue-alt", "blue alt", {}], ["nerd-icons-cyan", "cyan", {}], ["nerd-icons-cyan-alt", "cyan alt", {}], ["nerd-icons-dblue", "dblue", {}], ["nerd-icons-dcyan", "dcyan", {}], ["nerd-icons-dgreen", "dgreen", {}], ["nerd-icons-dmaroon", "dmaroon", {}], ["nerd-icons-dorange", "dorange", {}], ["nerd-icons-dpink", "dpink", {}], ["nerd-icons-dpurple", "dpurple", {}], ["nerd-icons-dred", "dred", {}], ["nerd-icons-dsilver", "dsilver", {}], ["nerd-icons-dyellow", "dyellow", {}], ["nerd-icons-green", "green", {}], ["nerd-icons-lblue", "lblue", {}], ["nerd-icons-lcyan", "lcyan", {}], ["nerd-icons-lgreen", "lgreen", {}], ["nerd-icons-lmaroon", "lmaroon", {}], ["nerd-icons-lorange", "lorange", {}], ["nerd-icons-lpink", "lpink", {}], ["nerd-icons-lpurple", "lpurple", {}], ["nerd-icons-lred", "lred", {}], ["nerd-icons-lsilver", "lsilver", {}], ["nerd-icons-lyellow", "lyellow", {}], ["nerd-icons-maroon", "maroon", {}], ["nerd-icons-orange", "orange", {}], ["nerd-icons-pink", "pink", {}], ["nerd-icons-purple", "purple", {}], ["nerd-icons-purple-alt", "purple alt", {}], ["nerd-icons-red", "red", {}], ["nerd-icons-red-alt", "red alt", {}], ["nerd-icons-silver", "silver", {}], ["nerd-icons-yellow", "yellow", {}]]}, "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", {}], ["orderless-match-face-1", "match 1", {}], ["orderless-match-face-2", "match 2", {}], ["orderless-match-face-3", "match 3", {}]]}, "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", {}], ["org-superstar-header-bullet", "header bullet", {}], ["org-superstar-item", "item", {}], ["org-superstar-leading", "leading", {}]]}, "prescient": {"label": "prescient", "preview": "generic", "faces": [["prescient-primary-highlight", "primary highlight", {}], ["prescient-secondary-highlight", "secondary highlight", {}]]}, "rainbow-delimiters": {"label": "rainbow-delimiters", "preview": "generic", "faces": [["rainbow-delimiters-base-error-face", "base error", {}], ["rainbow-delimiters-base-face", "base", {}], ["rainbow-delimiters-depth-1-face", "depth 1", {}], ["rainbow-delimiters-depth-2-face", "depth 2", {}], ["rainbow-delimiters-depth-3-face", "depth 3", {}], ["rainbow-delimiters-depth-4-face", "depth 4", {}], ["rainbow-delimiters-depth-5-face", "depth 5", {}], ["rainbow-delimiters-depth-6-face", "depth 6", {}], ["rainbow-delimiters-depth-7-face", "depth 7", {}], ["rainbow-delimiters-depth-8-face", "depth 8", {}], ["rainbow-delimiters-depth-9-face", "depth 9", {}], ["rainbow-delimiters-mismatched-face", "mismatched", {}], ["rainbow-delimiters-unmatched-face", "unmatched", {}]]}, "symbol-overlay": {"label": "symbol-overlay", "preview": "generic", "faces": [["symbol-overlay-default-face", "default", {}], ["symbol-overlay-face-1", "face 1", {}], ["symbol-overlay-face-2", "face 2", {}], ["symbol-overlay-face-3", "face 3", {}], ["symbol-overlay-face-4", "face 4", {}], ["symbol-overlay-face-5", "face 5", {}], ["symbol-overlay-face-6", "face 6", {}], ["symbol-overlay-face-7", "face 7", {}], ["symbol-overlay-face-8", "face 8", {}]]}, "tmr": {"label": "tmr", "preview": "generic", "faces": [["tmr-description", "description", {}], ["tmr-duration", "duration", {}], ["tmr-end-time", "end time", {}], ["tmr-finished", "finished", {}], ["tmr-is-acknowledged", "is acknowledged", {}], ["tmr-must-be-acknowledged", "must be acknowledged", {}], ["tmr-start-time", "start time", {}], ["tmr-tabulated-acknowledgement", "tabulated acknowledgement", {}], ["tmr-tabulated-description", "tabulated description", {}], ["tmr-tabulated-end-time", "tabulated end time", {}], ["tmr-tabulated-remaining-time", "tabulated remaining time", {}], ["tmr-tabulated-start-time", "tabulated start time", {}]]}, "transient": {"label": "transient", "preview": "generic", "faces": [["transient-active-infix", "active infix", {}], ["transient-argument", "argument", {}], ["transient-delimiter", "delimiter", {}], ["transient-disabled-suffix", "disabled suffix", {}], ["transient-enabled-suffix", "enabled suffix", {}], ["transient-heading", "heading", {}], ["transient-higher-level", "higher level", {}], ["transient-inactive-argument", "inactive argument", {}], ["transient-inactive-value", "inactive value", {}], ["transient-inapt-argument", "inapt argument", {}], ["transient-inapt-suffix", "inapt suffix", {}], ["transient-key", "key", {}], ["transient-key-exit", "key exit", {}], ["transient-key-noop", "key noop", {}], ["transient-key-recurse", "key recurse", {}], ["transient-key-return", "key return", {}], ["transient-key-stack", "key stack", {}], ["transient-key-stay", "key stay", {}], ["transient-mismatched-key", "mismatched key", {}], ["transient-nonstandard-key", "nonstandard key", {}], ["transient-unreachable", "unreachable", {}], ["transient-unreachable-key", "unreachable key", {}], ["transient-value", "value", {}]]}, "vertico": {"label": "vertico", "preview": "generic", "faces": [["vertico-current", "current", {}], ["vertico-group-separator", "group separator", {}], ["vertico-group-title", "group title", {}], ["vertico-multiline", "multiline", {}]]}, "web-mode": {"label": "web-mode", "preview": "generic", "faces": [["web-mode-annotation-face", "annotation", {}], ["web-mode-annotation-html-face", "annotation html", {}], ["web-mode-annotation-tag-face", "annotation tag", {}], ["web-mode-annotation-type-face", "annotation type", {}], ["web-mode-annotation-value-face", "annotation value", {}], ["web-mode-block-attr-name-face", "block attr name", {}], ["web-mode-block-attr-value-face", "block attr value", {}], ["web-mode-block-comment-face", "block comment", {}], ["web-mode-block-control-face", "block control", {}], ["web-mode-block-delimiter-face", "block delimiter", {}], ["web-mode-block-face", "block", {}], ["web-mode-block-string-face", "block string", {}], ["web-mode-bold-face", "bold", {}], ["web-mode-builtin-face", "builtin", {}], ["web-mode-comment-face", "comment", {}], ["web-mode-comment-keyword-face", "comment keyword", {}], ["web-mode-constant-face", "constant", {}], ["web-mode-css-at-rule-face", "css at rule", {}], ["web-mode-css-color-face", "css color", {}], ["web-mode-css-comment-face", "css comment", {}], ["web-mode-css-function-face", "css function", {}], ["web-mode-css-priority-face", "css priority", {}], ["web-mode-css-property-name-face", "css property name", {}], ["web-mode-css-pseudo-class-face", "css pseudo class", {}], ["web-mode-css-selector-class-face", "css selector class", {}], ["web-mode-css-selector-face", "css selector", {}], ["web-mode-css-selector-tag-face", "css selector tag", {}], ["web-mode-css-string-face", "css string", {}], ["web-mode-css-variable-face", "css variable", {}], ["web-mode-current-column-highlight-face", "current column highlight", {}], ["web-mode-current-element-highlight-face", "current element highlight", {}], ["web-mode-doctype-face", "doctype", {}], ["web-mode-error-face", "error", {}], ["web-mode-filter-face", "filter", {}], ["web-mode-folded-face", "folded", {}], ["web-mode-function-call-face", "function call", {}], ["web-mode-function-name-face", "function name", {}], ["web-mode-html-attr-custom-face", "html attr custom", {}], ["web-mode-html-attr-engine-face", "html attr engine", {}], ["web-mode-html-attr-equal-face", "html attr equal", {}], ["web-mode-html-attr-name-face", "html attr name", {}], ["web-mode-html-attr-value-face", "html attr value", {}], ["web-mode-html-entity-face", "html entity", {}], ["web-mode-html-tag-bracket-face", "html tag bracket", {}], ["web-mode-html-tag-custom-face", "html tag custom", {}], ["web-mode-html-tag-face", "html tag", {}], ["web-mode-html-tag-namespaced-face", "html tag namespaced", {}], ["web-mode-html-tag-unclosed-face", "html tag unclosed", {}], ["web-mode-inlay-face", "inlay", {}], ["web-mode-interpolate-color1-face", "interpolate color1", {}], ["web-mode-interpolate-color2-face", "interpolate color2", {}], ["web-mode-interpolate-color3-face", "interpolate color3", {}], ["web-mode-interpolate-color4-face", "interpolate color4", {}], ["web-mode-italic-face", "italic", {}], ["web-mode-javascript-comment-face", "javascript comment", {}], ["web-mode-javascript-string-face", "javascript string", {}], ["web-mode-json-comment-face", "json comment", {}], ["web-mode-json-context-face", "json context", {}], ["web-mode-json-key-face", "json key", {}], ["web-mode-json-string-face", "json string", {}], ["web-mode-jsx-depth-1-face", "jsx depth 1", {}], ["web-mode-jsx-depth-2-face", "jsx depth 2", {}], ["web-mode-jsx-depth-3-face", "jsx depth 3", {}], ["web-mode-jsx-depth-4-face", "jsx depth 4", {}], ["web-mode-jsx-depth-5-face", "jsx depth 5", {}], ["web-mode-keyword-face", "keyword", {}], ["web-mode-param-name-face", "param name", {}], ["web-mode-part-comment-face", "part comment", {}], ["web-mode-part-face", "part", {}], ["web-mode-part-string-face", "part string", {}], ["web-mode-preprocessor-face", "preprocessor", {}], ["web-mode-script-face", "script", {}], ["web-mode-sql-keyword-face", "sql keyword", {}], ["web-mode-string-face", "string", {}], ["web-mode-style-face", "style", {}], ["web-mode-symbol-face", "symbol", {}], ["web-mode-type-face", "type", {}], ["web-mode-underline-face", "underline", {}], ["web-mode-variable-name-face", "variable name", {}], ["web-mode-warning-face", "warning", {}], ["web-mode-whitespace-face", "whitespace", {}]]}, "yasnippet": {"label": "yasnippet", "preview": "generic", "faces": [["yas--field-debug-face", "yas field debug", {}], ["yas-field-highlight-face", "yas field highlight", {}]]}};
-let MAP={"kw": "#67809c", "bi": "#67809c", "pp": "#67809c", "fnd": "#a9b2bb", "fnc": "#a9b2bb", "dec": "#e8bd30", "ty": "#9b5fd0", "prop": "#838d97", "con": "#cb6b4d", "num": "#cb6b4d", "esc": "#cb6b4d", "str": "#5d9b86", "re": "#5d9b86", "doc": "#5d9b86", "cm": "#be9e74", "cmd": "#a9b2bb", "var": "#e8bd30", "op": "#a9b2bb", "punc": "#a9b2bb", "p": "#ffffff", "bg": "#000000"}, PALETTE=[["#67809c", "blue"], ["#e8bd30", "gold"], ["#9b5fd0", "regal"], ["#2ba178", "emerald"], ["#5d9b86", "sage"], ["#cb6b4d", "terracotta"], ["#be9e74", "tan"], ["#ffffff", "white"], ["#a9b2bb", "silver"], ["#838d97", "steel"], ["#5e6770", "pewter"], ["#2f343a", "gunmetal"], ["#264364", "navy"], ["#000000", "ground"], ["#1a1714", "bg-dim"]], BOLD={"kw": true, "bi": false, "pp": false, "fnd": true, "fnc": false, "dec": false, "ty": false, "prop": false, "con": false, "num": false, "esc": false, "str": false, "re": false, "doc": false, "cm": false, "cmd": false, "var": false, "op": false, "punc": false, "p": false}, ITALIC={}, UIMAP={"cursor": {"fg": null, "bg": "#a9b2bb"}, "region": {"fg": null, "bg": "#264364"}, "hl-line": {"fg": null, "bg": "#1a1714"}, "highlight": {"fg": null, "bg": "#2f343a"}, "mode-line": {"fg": "#cdced1", "bg": "#2f343a"}, "mode-line-inactive": {"fg": "#838d97", "bg": "#1a1714"}, "fringe": {"fg": null, "bg": "#0d0b0a"}, "line-number": {"fg": "#5e6770", "bg": null}, "line-number-current-line": {"fg": "#e8bd30", "bg": "#1a1714"}, "minibuffer-prompt": {"fg": "#67809c", "bg": null}, "isearch": {"fg": "#0d0b0a", "bg": "#e8bd30"}, "lazy-highlight": {"fg": "#0d0b0a", "bg": "#838d97"}, "isearch-fail": {"fg": "#cb6b4d", "bg": null}, "show-paren-match": {"fg": null, "bg": "#264364"}, "show-paren-mismatch": {"fg": "#0d0b0a", "bg": "#cb6b4d"}, "link": {"fg": "#67809c", "bg": null, "underline": true}, "error": {"fg": "#cb6b4d", "bg": null}, "warning": {"fg": "#e8bd30", "bg": null}, "success": {"fg": "#5d9b86", "bg": null}, "vertical-border": {"fg": "#2f343a", "bg": null}};
-// --- tier-3 package faces: pure state helpers (Phase 1) ---
-function pname(n){if(!n)return null;if(/^#/.test(n))return n;const p=PALETTE.find(p=>p[1]===n);return p?p[0]:null;}
-function seedPkgmap(){const m={};for(const app in APPS){m[app]={};for(const row of APPS[app].faces){const face=row[0],d=row[2]||{};m[app][face]={fg:pname(d.fg),bg:pname(d.bg),bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit||null,height:d.height||1,source:'default'};}}return m;}
-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;faces[face]=o;}}if(Object.keys(faces).length)out[app]=faces;}return out;}
-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]={fg:f.fg??null,bg:f.bg??null,bold:!!f.bold,italic:!!f.italic,underline:!!f.underline,strike:!!f.strike,inherit:f.inherit??null,height:f.height||1,source:f.source||'user'};}}}
-let PKGMAP=seedPkgmap();
-function esc(t){return t.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}
-function lin(c){c/=255;return c<=0.03928?c/12.92:Math.pow((c+0.055)/1.055,2.4);}
-function rl(h){return 0.2126*lin(parseInt(h.substr(1,2),16))+0.7152*lin(parseInt(h.substr(3,2),16))+0.0722*lin(parseInt(h.substr(5,2),16));}
-function textOn(h){const L=rl(h);return ((L+0.05)/0.05)>(1.05/(L+0.05))?'#000':'#fff';}
-function contrast(a,b){const L1=rl(a),L2=rl(b),hi=Math.max(L1,L2),lo=Math.min(L1,L2);return (hi+0.05)/(lo+0.05);}
-function rating(r){return r>=7?'AAA':r>=4.5?'AA':'FAIL';}
-function ratingColor(r){return r>=7?'#5d9b86':r>=4.5?'#a9b2bb':'#cb6b4d';}
-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 renderCode(){
- const lang=document.getElementById('langsel').value;let html='';
- for(const line of SAMPLES[lang]){
- if(line.length===0){html+='\n';continue;}
- for(const [k,t] of line){const c=MAP[k]||'#cdced1';const w=BOLD[k]?'bold':'normal';const s=ITALIC[k]?'italic':'normal';
- html+=`<span data-k="${k}" style="color:${c};font-weight:${w};font-style:${s}">${esc(t)}</span>`;}
- html+='\n';}
- const cp=document.getElementById('codepre');cp.innerHTML=html;
- cp.onclick=(e)=>{const s=e.target.closest('[data-k]');if(s)flashAssign(s.dataset.k);};
- buildMockFrame();
-}
-function buildTable(){
- const tb=document.getElementById('legbody');tb.innerHTML='';
- for(const [kind,label,ex] of CATS){
- const tr=document.createElement('tr');tr.dataset.kind=kind;
- const sel=document.createElement('select');sel.className='chip';
- const cur=MAP[kind];const have=PALETTE.some(p=>p[0]===cur);
- const list=have?PALETTE:[[cur,'(gone) '+cur],...PALETTE];
- for(const [hex,name] of list){const o=document.createElement('option');o.value=hex;o.textContent=name+' '+hex;o.style.background=hex;o.style.color=textOn(hex);sel.appendChild(o);}
- sel.value=cur;
- const exTd=document.createElement('td');exTd.className='ex';exTd.textContent=ex;
- const crTd=document.createElement('td');crTd.style.whiteSpace='nowrap';crTd.style.fontSize='10pt';
- function styleChip(){sel.style.background=sel.value;sel.style.color=textOn(sel.value);}
- function styleEx(){exTd.style.color=(kind==='bg'?MAP['p']:MAP[kind]);exTd.style.background=MAP['bg'];exTd.style.fontWeight=BOLD[kind]?'bold':'normal';exTd.style.fontStyle=ITALIC[kind]?'italic':'normal';}
- function styleCr(){const r=contrast((kind==='bg'?MAP['p']:MAP[kind]),MAP['bg']);crTd.innerHTML=`<span style="color:${ratingColor(r)}">${r.toFixed(1)} ${rating(r)}</span>`;}
- styleChip();styleEx();styleCr();
- sel.onchange=()=>{MAP[kind]=sel.value;styleChip();styleEx();styleCr();renderCode();if(kind==='bg'){applyGround();buildTable();}};
- // style buttons
- const stTd=document.createElement('td');
- if(kind!=='bg'){const defs=[['B','a','bold'],['I','a','italic']];
- const btns={};
- defs.forEach(([id,ch,mode])=>{const b=document.createElement('button');b.className='sbtn';b.style.fontWeight=mode==='bold'?'bold':'normal';b.style.fontStyle=mode==='italic'?'italic':'normal';b.textContent=ch;
- b.onclick=()=>{if(mode==='bold'){BOLD[kind]=!BOLD[kind];}else{ITALIC[kind]=!ITALIC[kind];}refresh();renderCode();styleEx();};
- btns[mode]=b;stTd.appendChild(b);});
- function refresh(){btns.bold.classList.toggle('on',!!BOLD[kind]);btns.italic.classList.toggle('on',!!ITALIC[kind]);}
- refresh();}
- const c0=document.createElement('td');c0.appendChild(sel);
- 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(c0);tr.appendChild(stTd);tr.appendChild(exTd);tr.appendChild(crTd);
- tb.appendChild(tr);}
-}
-let dragFrom=null,selectedIdx=null;
-function renderPalette(){
- const p=document.getElementById('pals');p.innerHTML='';
- PALETTE.forEach((pc,i)=>{const [hex,name]=pc;const tc=textOn(hex);
- const locked=(hex===MAP['bg']||hex===MAP['p']);
- const d=document.createElement('div');d.className='pchip'+(i===selectedIdx?' sel':'');d.style.background=hex;d.draggable=true;
- const lft=i>0?`<button class="mv l" title="move left" style="color:${tc}">&#8249;</button>`:'';
- const rgt=i<PALETTE.length-1?`<button class="mv r" title="move right" style="color:${tc}">&#8250;</button>`:'';
- const rm=locked?`<span class="lock" title="${hex===MAP['bg']?'background':'foreground'} — can't remove" style="color:${tc}">&#128274;</span>`:`<button class="rm" title="remove" style="color:${tc}">×</button>`;
- d.innerHTML=`${rm}${lft}${rgt}<input class="nm" value="${name}" style="color:${tc}"><div class="hx" style="color:${tc}">${hex}</div>`;
- if(!locked)d.querySelector('.rm').onclick=(e)=>{e.stopPropagation();PALETTE.splice(i,1);if(selectedIdx===i)selectedIdx=null;renderPalette();buildTable();buildUITable();};
- if(lft)d.querySelector('.mv.l').onclick=(e)=>{e.stopPropagation();moveColor(i,-1);};
- if(rgt)d.querySelector('.mv.r').onclick=(e)=>{e.stopPropagation();moveColor(i,1);};
- d.querySelector('.nm').onchange=(e)=>{PALETTE[i][1]=e.target.value;buildTable();buildUITable();};
- d.onclick=(e)=>{if(e.target.closest('.rm')||e.target.closest('.nm')||e.target.closest('.mv'))return;selectColor(i);};
- d.ondragstart=()=>{dragFrom=i;d.classList.add('drag');};
- d.ondragend=()=>{d.classList.remove('drag');document.querySelectorAll('.pchip.over').forEach(x=>x.classList.remove('over'));};
- d.ondragover=(e)=>{e.preventDefault();if(dragFrom!==null&&dragFrom!==i)d.classList.add('over');};
- d.ondragleave=()=>d.classList.remove('over');
- d.ondrop=(e)=>{e.preventDefault();d.classList.remove('over');if(dragFrom===null||dragFrom===i)return;const m=PALETTE.splice(dragFrom,1)[0];PALETTE.splice(i,0,m);dragFrom=null;selectedIdx=null;renderPalette();buildTable();buildUITable();};
- p.appendChild(d);});
- buildUITable();if(document.getElementById('pkgbody'))buildPkgTable();
-}
-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);}
-function applyEdit(){if(selectedIdx!==null)updateColor();else addColor();}
-function moveColor(i,dir){const j=i+dir;if(j<0||j>=PALETTE.length)return;const t=PALETTE[i];PALETTE[i]=PALETTE[j];PALETTE[j]=t;if(selectedIdx===i)selectedIdx=j;else if(selectedIdx===j)selectedIdx=i;renderPalette();buildTable();buildUITable();}
-function selectColor(i){selectedIdx=i;const [hex,name]=PALETTE[i];setHex(hex);document.getElementById('newname').value=name;renderPalette();notify('editing "'+name+'" — change the value, then Enter (or Update selected) to save',false);}
-function updateColor(){
- if(selectedIdx===null){notify('click a palette color to select it first',true);return;}
- const i=selectedIdx,oldHex=PALETTE[i][0];
- const newHex=curHex();
- const newName=(document.getElementById('newname').value.trim())||PALETTE[i][1];
- if(PALETTE.some((p,j)=>j!==i&&p[1].toLowerCase()===newName.toLowerCase())){notify('another color is already named "'+newName+'" — names must be unique',true);return;}
- PALETTE[i]=[newHex,newName];
- for(const k in MAP){if(MAP[k]===oldHex)MAP[k]=newHex;}
- for(const f in UIMAP){if(UIMAP[f].fg===oldHex)UIMAP[f].fg=newHex;if(UIMAP[f].bg===oldHex)UIMAP[f].bg=newHex;}
- for(const ap in PKGMAP)for(const fc in PKGMAP[ap]){const o=PKGMAP[ap][fc];if(o.fg===oldHex)o.fg=newHex;if(o.bg===oldHex)o.bg=newHex;}
- closePicker();renderPalette();buildTable();buildUITable();renderCode();applyGround();notify('updated "'+newName+'"',false);
-}
-function normHex(s){s=s.trim();if(/^[0-9a-fA-F]{6}$/.test(s))s='#'+s;return /^#[0-9a-fA-F]{6}$/.test(s)?s.toLowerCase():null;}
-function curHex(){return normHex(document.getElementById('newhexstr').value)||'#888888';}
-function hsv2rgb(h,s,v){h=(h%360+360)%360/360;const i=Math.floor(h*6),f=h*6-i,p=v*(1-s),q=v*(1-f*s),t=v*(1-(1-f)*s);let r,g,b;switch(((i%6)+6)%6){case 0:[r,g,b]=[v,t,p];break;case 1:[r,g,b]=[q,v,p];break;case 2:[r,g,b]=[p,v,t];break;case 3:[r,g,b]=[p,q,v];break;case 4:[r,g,b]=[t,p,v];break;default:[r,g,b]=[v,p,q];}return[Math.round(r*255),Math.round(g*255),Math.round(b*255)];}
-function rgb2hsv(r,g,b){r/=255;g/=255;b/=255;const mx=Math.max(r,g,b),mn=Math.min(r,g,b),d=mx-mn;let h=0;if(d){if(mx===r)h=((g-b)/d+6)%6;else if(mx===g)h=(b-r)/d+2;else h=(r-g)/d+4;h*=60;}return[h,mx?d/mx:0,mx];}
-function hex2rgb(h){return[parseInt(h.substr(1,2),16),parseInt(h.substr(3,2),16),parseInt(h.substr(5,2),16)];}
-function rgb2hex(r,g,b){return '#'+[r,g,b].map(x=>Math.max(0,Math.min(255,x)).toString(16).padStart(2,'0')).join('');}
-let pkH=0,pkS=0,pkV=0.5,pickerOn=false;
-let pkMode='any';
-function pkThresh(){return pkMode==='aa'?4.5:pkMode==='aaa'?7:0;}
-function drawMask(){const cv=document.getElementById('svmask');if(!cv)return;const sv=document.getElementById('sv'),w=cv.width=sv.clientWidth,h=cv.height=sv.clientHeight,ctx=cv.getContext('2d');ctx.clearRect(0,0,w,h);const T=pkThresh();if(!T)return;ctx.fillStyle='rgba(8,7,6,0.66)';const step=4;for(let x=0;x<w;x+=step){const S=x/w;for(let y=0;y<h;y+=step){const V=1-y/h,[r,g,b]=hsv2rgb(pkH,S,V);if(contrast(rgb2hex(r,g,b),MAP['bg'])<T)ctx.fillRect(x,y,step,step);}}}
-function paintPicker(){const sv=document.getElementById('sv');if(!sv)return;sv.style.background=`linear-gradient(to top,#000,rgba(0,0,0,0)),linear-gradient(to right,#fff,rgba(255,255,255,0)),hsl(${pkH},100%,50%)`;const w=sv.clientWidth,h=sv.clientHeight,hh=document.getElementById('hue').clientHeight;document.getElementById('svcur').style.left=(pkS*w)+'px';document.getElementById('svcur').style.top=((1-pkV)*h)+'px';document.getElementById('huecur').style.top=((pkH/360)*hh)+'px';drawMask();}
-function pkReadout(h){const e=document.getElementById('pkhex');if(e)e.textContent=h;const c=document.getElementById('pkcon');if(c){const r=contrast(h,MAP['bg']);c.textContent=r.toFixed(1)+' '+rating(r);c.style.color=ratingColor(r);}}
-function syncHex(){const v=normHex(document.getElementById('newhexstr').value);if(!v)return;document.getElementById('swatch').style.background=v;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(v));if(pickerOn)paintPicker();pkReadout(v);}
-function setHex(h){h=normHex(h)||h;document.getElementById('newhexstr').value=h;document.getElementById('swatch').style.background=h;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(h));if(pickerOn)paintPicker();pkReadout(h);}
-function pkSet(){const hex=rgb2hex(...hsv2rgb(pkH,pkS,pkV));document.getElementById('newhexstr').value=hex;document.getElementById('swatch').style.background=hex;paintPicker();pkReadout(hex);}
-function buildPkChips(){const c=document.getElementById('pkchips');if(!c)return;c.innerHTML='';const T=pkThresh();PALETTE.forEach(([hex,name])=>{const s=document.createElement('div');s.className='pc';s.style.background=hex;s.title=name+' '+hex;const ok=!T||contrast(hex,MAP['bg'])>=T;if(!ok){s.style.opacity='0.22';s.title+=' (below '+pkMode.toUpperCase()+')';}s.onclick=()=>{if(ok)setHex(hex);};c.appendChild(s);});}
-function openPicker(){pickerOn=true;[pkH,pkS,pkV]=rgb2hsv(...hex2rgb(curHex()));buildPkChips();paintPicker();pkReadout(curHex());document.getElementById('picker').style.display='block';setTimeout(()=>document.addEventListener('pointerdown',pkOutside),0);}
-function closePicker(){if(!pickerOn)return;pickerOn=false;const p=document.getElementById('picker');if(p)p.style.display='none';document.removeEventListener('pointerdown',pkOutside);}
-function pkOutside(e){if(!e.target.closest('#picker')&&!e.target.closest('#swatch'))closePicker();}
-function pkDrag(el,fn){el.addEventListener('pointerdown',e=>{e.preventDefault();fn(e);const mv=ev=>fn(ev),up=()=>{document.removeEventListener('pointermove',mv);document.removeEventListener('pointerup',up);};document.addEventListener('pointermove',mv);document.addEventListener('pointerup',up);});}
-function initPicker(){const sw=document.getElementById('swatch');if(!sw)return;sw.style.background=curHex();sw.onclick=()=>pickerOn?closePicker():openPicker();
- pkDrag(document.getElementById('sv'),e=>{const r=document.getElementById('sv').getBoundingClientRect();pkS=Math.max(0,Math.min(1,(e.clientX-r.left)/r.width));pkV=1-Math.max(0,Math.min(1,(e.clientY-r.top)/r.height));pkSet();});
- pkDrag(document.getElementById('hue'),e=>{const r=document.getElementById('hue').getBoundingClientRect();pkH=Math.max(0,Math.min(1,(e.clientY-r.top)/r.height))*360;pkSet();});
- document.querySelectorAll('.pmode button').forEach(b=>b.onclick=()=>{pkMode=b.dataset.m;document.querySelectorAll('.pmode button').forEach(x=>x.classList.toggle('on',x===b));drawMask();buildPkChips();});}
-function addColor(){const h=curHex();const name=document.getElementById('newname').value.trim();
- if(!name){notify('name the color before adding it',true);return;}
- if(PALETTE.some(p=>p[1].toLowerCase()===name.toLowerCase())){notify('a color named "'+name+'" already exists — select it and use Update selected to change its value',true);return;}
- PALETTE.push([h,name]);document.getElementById('newname').value='';selectedIdx=null;closePicker();renderPalette();buildTable();notify('added "'+name+'"',false);}
-function themeName(){return (document.getElementById('themename').value||'theme').trim()||'theme';}
-function fileSlug(){return themeName().replace(/[^A-Za-z0-9._-]+/g,'-').replace(/^-+|-+$/g,'')||'theme';}
-function exportObj(){const a={};CATS.forEach(c=>a[c[0]]=MAP[c[0]]);const o={name:themeName(),palette:PALETTE,assignments:a,bold:Object.keys(BOLD).filter(k=>BOLD[k]),italic:Object.keys(ITALIC).filter(k=>ITALIC[k]),ui:UIMAP};const pk=packagesForExport(PKGMAP);if(Object.keys(pk).length)o.packages=pk;return o;}
-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';const sb=document.getElementById('savebtn');if(sb){sb.style.display=n||fileHandle?'':'none';sb.title=fileHandle?'overwrite the imported/saved file':'choose where to save';}}
-let fileHandle=null;
-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();}
-async function saveTheme(){const data=JSON.stringify(exportObj(),null,1);
- if(!window.showSaveFilePicker){exportTheme();notify('saved via download (browser has no Save-File support)',false);return;}
- try{if(!fileHandle)fileHandle=await window.showSaveFilePicker({suggestedName:fileSlug()+'.json',types:[{description:'theme JSON',accept:{'application/json':['.json']}}]});
- const w=await fileHandle.createWritable();await w.write(data);await w.close();notify('saved "'+themeName()+'"',false);updateTitle();
- }catch(e){if(e&&e.name!=='AbortError')notify('save failed: '+e.message,true);}}
-function applyImported(text){const d=JSON.parse(text);if(d.name)document.getElementById('themename').value=d.name;if(d.palette)PALETTE=d.palette;if(d.assignments)Object.assign(MAP,d.assignments);
- BOLD={};(d.bold||[]).forEach(k=>BOLD[k]=true);ITALIC={};(d.italic||[]).forEach(k=>ITALIC[k]=true);
- if(d.ui)Object.assign(UIMAP,d.ui);
- PKGMAP=seedPkgmap();if(d.packages)mergePackagesInto(PKGMAP,d.packages);
- renderPalette();buildTable();buildUITable();buildPkgTable();buildPkgPreview();renderCode();applyGround();updateTitle();}
-// File-input fallback (no File System Access API): no writable handle, so save still prompts.
-function importFile(ev){const f=ev.target.files[0];if(!f)return;const r=new FileReader();
- r.onload=()=>{try{applyImported(r.result);fileHandle=null;updateTitle();}catch(e){alert('bad theme file: '+e.message);}};
- r.readAsText(f);ev.target.value='';}
-// Preferred import: keep the file handle so a later save overwrites the same file.
-async function importTheme(){
- if(!window.showOpenFilePicker){const fi=document.getElementById('fileinput');if(fi)fi.click();return;}
- try{const [h]=await window.showOpenFilePicker({types:[{description:'theme JSON',accept:{'application/json':['.json']}}]});
- const file=await h.getFile();applyImported(await file.text());fileHandle=h;updateTitle();
- notify('imported "'+(themeName()||file.name)+'" — save now overwrites it',false);
- }catch(e){if(e&&e.name!=='AbortError')notify('import failed: '+e.message,true);}}
-function applyGround(){document.querySelectorAll('pre').forEach(p=>p.style.background=MAP['bg']);document.querySelectorAll('.ex').forEach(e=>e.style.background=MAP['bg']);}
-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'}`;}
-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.classList.remove('flashtok');void el.offsetWidth;el.classList.add('flashtok');}
-function flashTokens(kind){const sp=document.querySelectorAll('#codepre [data-k="'+kind+'"]');if(sp.length){sp.forEach(flashEl);return;}const row=document.querySelector('#legbody tr[data-kind="'+kind+'"]');if(row)flashEl(row.querySelector('.ex'));}
-function flashAssign(k){flashRow(document.querySelector(`#legbody tr[data-kind="${k}"]`));}
-function flashUi(f){flashRow(document.querySelector(`#uibody tr[data-face="${f}"]`));}
-function flashUiPreview(f){const sp=document.querySelectorAll(`#mockframe [data-face="${f}"]`);if(sp.length){sp.forEach(flashEl);return;}const cell=document.getElementById('uiprev-'+f);if(cell)flashEl(cell);}
-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){sp.forEach(flashEl);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="color:${MAP[k]||MAP['p']};font-weight:${BOLD[k]?'bold':'normal'};font-style:${ITALIC[k]?'italic':'normal'}">${esc(t)}</span>`;}
-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 lines=[
- {t:[['cmd',';; '],['cm','init.el - your config']]},
- {t:[['punc','('],['kw','require'],['p',' '],['con',"'cl-lib"],['punc',')']]},
- {t:[]},
- {t:[['punc','('],['kw','defun'],['p',' '],['fnd','cj/greet'],['p',' '],['punc','('],['var','name'],['punc',')']]},
- {t:[['p',' '],['punc','('],['fnc','message'],['p',' '],['str','"hi %s"'],['p',' '],['var','name'],['punc','))']],cur:1},
- {t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','count'],['p',' '],['num','42'],['punc',')']],region:1},
- {plain:' (if (> count 0)',match:1},
- {plain:' (setq total (+ total count))',hl:1},
- {t:[['p',' '],['punc','('],['fnc','process'],['p',' '],['var','items'],['punc',')']]},
- {plain:' (cl-incf count)',lazy:1},
- {t:[['p',' '],['punc','('],['kw','setq'],['p',' '],['var','done'],['p',' '],['con','t'],['punc',')']],paren:1},
- {plain:' (oops nested))',mismatch:1}
- ];
- let buf='';
- lines.forEach((L,i)=>{
- const isc=L.cur;
- const nFg=isc?(lnc.fg||fg):(ln.fg||fg), nBg=isc?(lnc.bg||'transparent'):(ln.bg||'transparent');
- const rowBg=isc?(hl.bg||'transparent'):'transparent';
- let cd;
- if(L.plain){
- if(L.match)cd=`<span data-face="isearch" style="color:${isr.fg||fg};background:${isr.bg||'transparent'}">${esc(L.plain)}</span>`;
- else if(L.lazy)cd=`<span data-face="lazy-highlight" style="color:${laz.fg||fg};background:${laz.bg||'transparent'}">${esc(L.plain)}</span>`;
- else if(L.hl)cd=`<span data-face="highlight" style="background:${hil.bg||'transparent'};color:${hil.fg||fg}">${esc(L.plain)}</span>`;
- else if(L.mismatch)cd=esc(L.plain.slice(0,-1))+`<span data-face="show-paren-mismatch" style="background:${parx.bg||'transparent'};color:${parx.fg||fg};font-weight:bold">${esc(L.plain.slice(-1))}</span>`;
- else cd=esc(L.plain);
- } else if(L.paren){cd=L.t.map(([k,t],j)=>j===L.t.length-1?`<span data-face="show-paren-match" style="background:${par.bg||'transparent'};color:${par.fg||MAP[k]||fg};font-weight:bold">${esc(t)}</span>`:mockSpan(k,t)).join('');}
- else{cd=L.t.map(([k,t])=>mockSpan(k,t)).join('');if(L.region)cd=`<span data-face="region" style="background:${reg.bg||'transparent'}">${cd}</span>`;}
- if(isc)cd+=`<span data-face="cursor" style="background:${cur.bg||fg};color:${bg}"> </span>`;
- const nFace=isc?'line-number-current-line':'line-number';
- buf+=`<div class="ln" style="background:${rowBg}"><span class="fr" data-face="fringe" style="background:${frng.bg||bg}"></span><span class="num" data-face="${nFace}" style="color:${nFg};background:${nBg}">${i+1}</span><span class="cd">${cd||'&nbsp;'}</span></div>`;
- });
- let html=`<div class="mbuf" style="display:flex;background:${bg}"><div style="flex:1;min-width:0">${buf}</div><div data-face="vertical-border" title="vertical-border" style="width:3px;flex:0 0 auto;background:${vb.fg||vb.bg||'#2f343a'}"></div></div>`;
- html+=`<div class="bar" data-face="mode-line" style="background:${ml.bg||fg};color:${ml.fg||bg};${udeco(ml)}"> init.el (Emacs Lisp) L5 git:main </div>`;
- html+=`<div class="bar" data-face="mode-line-inactive" style="background:${mli.bg||bg};color:${mli.fg||fg};${udeco(mli)}"> *Messages* (Fundamental) </div>`;
- html+=`<div class="echo" style="color:${fg}"><span data-face="minibuffer-prompt" style="color:${mb.fg||fg};${udeco(mb)}">I-search:</span> count <span data-face="isearch-fail" style="color:${isf.fg||fg};background:${isf.bg||'transparent'};${udeco(isf)}">zzz [no match]</span></div>`;
- html+=`<div class="echo"><span data-face="link" style="color:${lnk.fg||fg};${udeco(lnk)}">https://gnu.org</span> <span data-face="error" style="color:${err.fg||fg};${udeco(err)}">error</span> <span data-face="warning" style="color:${wrn.fg||fg};${udeco(wrn)}">warning</span> <span data-face="success" style="color:${suc.fg||fg};${udeco(suc)}">ok</span></div>`;
- fr.innerHTML=html;fr.style.background=bg;fr.style.color=fg;
- fr.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u){flashUi(u.dataset.face);return;}const k=e.target.closest('[data-k]');if(k)flashAssign(k.dataset.k);};
-}
-function colorDropdown(value,onpick){
- const sel=document.createElement('select');sel.className='chip';
- const none=document.createElement('option');none.value='';none.textContent='— none —';none.style.background='#161412';none.style.color='#b4b1a2';sel.appendChild(none);
- for(const [hex,name] of PALETTE){const o=document.createElement('option');o.value=hex;o.textContent=name+' '+hex;o.style.background=hex;o.style.color=textOn(hex);sel.appendChild(o);}
- sel.value=value||'';
- function style(){if(sel.value){sel.style.background=sel.value;sel.style.color=textOn(sel.value);}else{sel.style.background='#161412';sel.style.color='#b4b1a2';}}
- style();
- sel.onchange=()=>{style();onpick(sel.value||null);};
- return sel;
-}
-function uiSelect(face,attr){return colorDropdown(UIMAP[face][attr],v=>{UIMAP[face][attr]=v;paintUI(face);buildMockFrame();});}
-const BASE_INHERITS=['fixed-pitch','variable-pitch','default','link','bold','italic','shadow'];
-function seedFace(d){return {fg:pname(d.fg),bg:pname(d.bg),bold:!!d.bold,italic:!!d.italic,underline:!!d.underline,strike:!!d.strike,inherit:d.inherit||null,height:d.height||1,source:'default'};}
-function curApp(){const s=document.getElementById('appsel');return s&&s.value?s.value:Object.keys(APPS)[0];}
-function pkgEffFg(app,face,seen){seen=seen||{};const f=PKGMAP[app]&&PKGMAP[app][face];if(!f||seen[face])return null;seen[face]=1;if(f.fg)return f.fg;if(f.inherit&&PKGMAP[app][f.inherit])return pkgEffFg(app,f.inherit,seen);return null;}
-function pkgEffBg(app,face,seen){seen=seen||{};const f=PKGMAP[app]&&PKGMAP[app][face];if(!f||seen[face])return null;seen[face]=1;if(f.bg)return f.bg;if(f.inherit&&PKGMAP[app][f.inherit])return pkgEffBg(app,f.inherit,seen);return null;}
-function buildAppSel(){const s=document.getElementById('appsel');if(!s)return;s.innerHTML='';for(const app in APPS){const o=document.createElement('option');o.value=app;o.textContent=APPS[app].label;s.appendChild(o);}s.onchange=pkgChanged;}
-function pkgChanged(){buildPkgTable();buildPkgPreview();syncPkgHeight();}
-function buildPkgTable(){
- const app=curApp(),tb=document.getElementById('pkgbody');if(!tb)return;tb.innerHTML='';
- const flt=(document.getElementById('pkgfilter').value||'').trim().toLowerCase();
- const inh=[''].concat(BASE_INHERITS).concat(APPS[app].faces.map(r=>r[0]));
- for(const [face,label,def] of APPS[app].faces){
- if(flt&&!(face.toLowerCase().includes(flt)||label.toLowerCase().includes(flt)))continue;
- const f=PKGMAP[app][face],tr=document.createElement('tr');tr.dataset.face=face;
- const c0=document.createElement('td');c0.className='cat';c0.textContent=label;c0.title=face;c0.style.cursor='pointer';c0.onclick=()=>flashPkgPreview(face);
- const cf=document.createElement('td');cf.appendChild(colorDropdown(f.fg,v=>{f.fg=v;f.source='user';pkgChanged();}));
- const cb=document.createElement('td');cb.appendChild(colorDropdown(f.bg,v=>{f.bg=v;f.source='user';pkgChanged();}));
- const cw=document.createElement('td');[['B','bold'],['I','italic'],['U','underline'],['S','strike']].forEach(([ch,at])=>{const b=document.createElement('button');b.className='sbtn'+(f[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=()=>{f[at]=!f[at];f.source='user';pkgChanged();};cw.appendChild(b);});
- 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 cc=document.createElement('td');cc.style.fontSize='10pt';cc.style.whiteSpace='nowrap';const efg=pkgEffFg(app,face)||MAP['p'],ebg=pkgEffBg(app,face)||MAP['bg'],r=contrast(efg,ebg);cc.innerHTML=`<span style="color:${ratingColor(r)}">${r.toFixed(1)} ${rating(r)}</span>`;
- const cr=document.createElement('td');const rb=document.createElement('button');rb.className='sbtn';rb.textContent='↺';rb.title='reset to default';rb.onclick=()=>{PKGMAP[app][face]=seedFace(def);pkgChanged();};cr.appendChild(rb);
- tr.append(c0,cf,cb,cw,ci,ch,cc,cr);tb.appendChild(tr);
- }
- applyTableSort('pkgbody');
-}
-function ofs(app,face){const f=PKGMAP[app][face]||{},fg=pkgEffFg(app,face)||MAP['p'],bg=pkgEffBg(app,face);const dec=(f.underline?'underline ':'')+(f.strike?'line-through':'');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`;}
-function os(app,face,txt){return `<span data-face="${face}" style="${ofs(app,face)}">${txt}</span>`;}
-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-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;
-}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-function renderDashboardPreview(){const a='dashboard',L=[];
- L.push(os(a,'dashboard-text-banner',' ___ _ __ ___ __ _ ___ ___'));
- L.push(os(a,'dashboard-banner-logo-title',' Welcome back, Craig'));
- L.push('');
- L.push(os(a,'dashboard-heading','Recent Files'));
- L.push(' '+os(a,'dashboard-items-face','init.el'));
- L.push(' '+os(a,'dashboard-items-face','notes.org'));
- L.push(os(a,'dashboard-heading','Bookmarks'));
- L.push(' '+os(a,'dashboard-no-items-face','-- no items --'));
- L.push('');
- L.push(os(a,'dashboard-navigator','[ Projects ] [ Recent ] [ Agenda ]'));
- L.push(os(a,'dashboard-footer-icon-face','*')+' '+os(a,'dashboard-footer-face','Happy hacking, Craig!'));
- return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-function renderMu4ePreview(){const a='mu4e',L=[];
- 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 retry')+' '+os(a,'mu4e-modeline-face','12/340'));
- L.push('');
- L.push(os(a,'mu4e-header-title-face','Date Flags From Subject'));
- L.push(os(a,'mu4e-header-value-face','2026-06-08')+' '+os(a,'mu4e-header-marks-face','N')+' '+os(a,'mu4e-unread-face','Alice')+' '+os(a,'mu4e-unread-face','Unread message'));
- L.push(os(a,'mu4e-header-value-face','2026-06-07')+' '+os(a,'mu4e-header-marks-face','R')+' '+os(a,'mu4e-header-face','Bob')+' '+os(a,'mu4e-replied-face','Replied thread'));
- L.push(os(a,'mu4e-header-value-face','2026-06-06')+' '+os(a,'mu4e-header-marks-face','F')+' '+os(a,'mu4e-header-face','Carol')+' '+os(a,'mu4e-forwarded-face','Forwarded note'));
- L.push(os(a,'mu4e-header-value-face','2026-06-05')+' '+os(a,'mu4e-header-marks-face','D')+' '+os(a,'mu4e-draft-face','(draft)')+' '+os(a,'mu4e-draft-face','Draft in progress'));
- L.push(os(a,'mu4e-header-value-face','2026-06-04')+' '+os(a,'mu4e-header-marks-face','T')+' '+os(a,'mu4e-trashed-face','Dan')+' '+os(a,'mu4e-moved-face','Trashed and moved'));
- L.push(os(a,'mu4e-header-highlight-face','2026-06-03 ! Eve Flagged ')+os(a,'mu4e-flagged-face','important')+os(a,'mu4e-related-face',' (related)'));
- L.push('');
- L.push(os(a,'mu4e-header-key-face','From:')+' '+os(a,'mu4e-contact-face','Alice &lt;alice@example.com&gt;'));
- L.push(os(a,'mu4e-header-key-face','To:')+' '+os(a,'mu4e-special-header-value-face','craig, list@gnu.org'));
- L.push(os(a,'mu4e-header-key-face','Attach:')+' '+os(a,'mu4e-attach-number-face','[1]')+' report.pdf link '+os(a,'mu4e-url-number-face','[2]')+' '+os(a,'mu4e-link-face','https://gnu.org'));
- L.push('');
- L.push(' body with a '+os(a,'mu4e-highlight-face','search hit')+' and '+os(a,'mu4e-region-code','code region')+'.');
- L.push(' '+os(a,'mu4e-cited-1-face','&gt; level 1')+' '+os(a,'mu4e-cited-2-face','&gt;&gt; 2')+' '+os(a,'mu4e-cited-3-face','&gt;&gt;&gt; 3')+' '+os(a,'mu4e-cited-4-face','&gt; 4')+' '+os(a,'mu4e-cited-5-face','&gt; 5')+' '+os(a,'mu4e-cited-6-face','&gt; 6')+' '+os(a,'mu4e-cited-7-face','&gt; 7'));
- L.push(' '+os(a,'mu4e-system-face','*** system message ***')+' '+os(a,'mu4e-footer-face','-- sent with mu4e'));
- L.push('');
- L.push(os(a,'mu4e-compose-header-face','Subject:')+' new mail');
- L.push(os(a,'mu4e-compose-separator-face','--text follows this line--'));
- return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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-delimited-error','[')+os(a,'flycheck-error-delimiter','err')+os(a,'flycheck-delimited-error',']'));
- 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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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-default-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-input-face','hi craig, see ')+os(a,'erc-button','this link')+os(a,'erc-input-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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','Alice: yes! see you at 7'));
- L.push(os(a,'signel-error-face','(failed to send -- retrying)'));
- return `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-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','Alice')+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','Alice')+' '+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 `<div style="padding:12px 16px;font:12pt/1.7 monospace;white-space:pre">${L.join('\n')}</div>`;}
-function genericPreview(app){let h='<div style="padding:10px 14px;font:12pt/1.8 monospace">';for(const [face,label,def] of APPS[app].faces){const f=PKGMAP[app][face],efg=pkgEffFg(app,face)||MAP['p'],ebg=pkgEffBg(app,face);h+=`<div data-face="${face}" style="color:${efg};${ebg?'background:'+ebg+';':''}font-weight:${f.bold?'bold':'normal'};font-style:${f.italic?'italic':'normal'};font-size:${(f.height||1)}em">${esc(label)}</div>`;}return h+'</div>';}
-function buildPkgPreview(){const app=curApp(),p=document.getElementById('pkgpreview');if(!p)return;const pv=APPS[app].preview;const bespoke=['org','magit','elfeed','ghostel','dashboard','mu4e','lsp','gitgutter','flycheck','dired','dirvish','calibredb','erc','orgdrill','orgnoter','signel','pearl','slack','telega','shr'].includes(pv);p.innerHTML=pv==='org'?renderOrgPreview():pv==='magit'?renderMagitPreview():pv==='elfeed'?renderElfeedPreview():pv==='ghostel'?renderGhostelPreview():pv==='dashboard'?renderDashboardPreview():pv==='mu4e'?renderMu4ePreview():pv==='lsp'?renderLspPreview():pv==='gitgutter'?renderGitGutterPreview():pv==='flycheck'?renderFlycheckPreview():pv==='dired'?renderDiredPreview():pv==='dirvish'?renderDirvishPreview():pv==='calibredb'?renderCalibredbPreview():pv==='erc'?renderErcPreview():pv==='orgdrill'?renderOrgdrillPreview():pv==='orgnoter'?renderOrgnoterPreview():pv==='signel'?renderSignelPreview():pv==='pearl'?renderPearlPreview():pv==='slack'?renderSlackPreview():pv==='telega'?renderTelegaPreview():pv==='shr'?renderShrPreview():genericPreview(app);p.style.background=MAP['bg'];p.onclick=(e)=>{const u=e.target.closest('[data-face]');if(u)flashPkg(u.dataset.face);};const lbl=document.getElementById('pkgprevlabel');if(lbl)lbl.textContent=bespoke?(APPS[app].label+' preview'):'preview (generic — face names in their own colors)';}
-function resetApp(){const app=curApp();PKGMAP[app]={};for(const [face,label,d] of APPS[app].faces)PKGMAP[app][face]=seedFace(d);pkgChanged();}
-function syncPkgHeight(){const t=document.getElementById('pkgtable'),m=document.getElementById('pkgpreview');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 paintUI(face){const pv=document.getElementById('uiprev-'+face);if(!pv)return;const o=UIMAP[face];pv.style.color=o.fg||MAP['p'];pv.style.background=o.bg||MAP['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';}
-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 cF=document.createElement('td');cF.appendChild(uiSelect(face,'fg'));
- const cB=document.createElement('td');cB.appendChild(uiSelect(face,'bg'));
- const cS=document.createElement('td');[['B','bold'],['I','italic'],['U','underline'],['S','strike']].forEach(([ch,at])=>{const b=document.createElement('button');b.className='sbtn'+(UIMAP[face][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=()=>{UIMAP[face][at]=!UIMAP[face][at];paintUI(face);buildMockFrame();};cS.appendChild(b);});
- const cP=document.createElement('td');cP.className='ex';cP.id='uiprev-'+face;cP.textContent=ex;cP.style.padding='4px 10px';cP.style.borderRadius='4px';
- tr.appendChild(c0);tr.appendChild(cF);tr.appendChild(cB);tr.appendChild(cS);tr.appendChild(cP);tb.appendChild(tr);paintUI(face);
- }
- applyTableSort('uibody');
-}
-let D={};
-function srt(c){const tb=document.getElementById('legbody');const r=[...tb.rows];D[c]=!D[c];
- r.sort((a,b)=>{const x=(c===0?a.querySelector('select').value:a.cells[0].innerText).toLowerCase(),
- y=(c===0?b.querySelector('select').value:b.cells[0].innerText).toLowerCase();
- return (x<y?-1:x>y?1:0)*(D[c]?1:-1);});r.forEach(x=>tb.appendChild(x));}
-// Generic header-click sort for the package and UI tables. Reads a select
-// value, a numeric input, or cell text (numeric when the text leads with a
-// number, e.g. contrast or size). The sort is remembered per table and
-// re-applied after a rebuild so editing a face does not reset it.
-let tableSort={};
-function cellVal(td){if(!td)return '';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));}
-buildLangSel();buildAppSel();renderPalette();buildTable();buildUITable();renderCode();applyGround();updateTitle();initPicker();buildPkgTable();buildPkgPreview();syncMockHeight();syncPkgHeight();
-addEventListener('resize',()=>{syncMockHeight();syncPkgHeight();});
-// 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'};
- const exp=packagesForExport(seeded);
- const round=seedPkgmap();mergePackagesInto(round,exp);
- const roundtrip=JSON.stringify(exp)===JSON.stringify(packagesForExport(round));
- let oldjson=true;try{const m=seedPkgmap();mergePackagesInto(m,undefined);oldjson=!!(m['org-mode']&&m['org-mode']['org-todo'].source==='default');}catch(e){oldjson=false;}
- 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 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'}};
- 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;
- const d=document.createElement('div');d.id='selftest';d.textContent='SELFTEST '+verdict+' roundtrip='+roundtrip+' oldjson='+oldjson+' inherit='+inherited+' height='+height+' cleared='+cleared+' unknown='+unknown+' cycle='+cyc;document.body.appendChild(d);
-}
-if(location.hash==='#selftest')pkgSelftest();
-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.startsWith('#app')){const ap=location.hash.slice(4),s=document.getElementById('appsel');if(s&&ap){s.value=ap;pkgChanged();}}
-</script> \ No newline at end of file